summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-05-22 22:10:19 +0800
committer魏曹先生 <1992414357@qq.com>2026-06-17 21:02:05 +0800
commit5a5a07c7fad31641d032a743e4e87ffb58ade17d (patch)
treeb6fbd33e8de82e5f9d9e6b99e3cb2102e47fe3ee
Initial commitmain
-rw-r--r--.cargo/config.toml7
-rw-r--r--.gitignore1
-rw-r--r--Cargo.lock71
-rw-r--r--Cargo.toml21
-rw-r--r--LICENSE21
-rw-r--r--rola-cli/Cargo.toml8
-rw-r--r--rola-cli/src/main.rs3
-rw-r--r--rola-desktop/App.axaml15
-rw-r--r--rola-desktop/App.axaml.cs47
-rw-r--r--rola-desktop/Assets/avalonia-logo.icobin0 -> 175875 bytes
-rw-r--r--rola-desktop/Program.cs21
-rw-r--r--rola-desktop/ViewLocator.cs31
-rw-r--r--rola-desktop/ViewModels/MainWindowViewModel.cs6
-rw-r--r--rola-desktop/ViewModels/ViewModelBase.cs7
-rw-r--r--rola-desktop/Views/MainWindow.axaml20
-rw-r--r--rola-desktop/Views/MainWindow.axaml.cs11
-rw-r--r--rola-desktop/app.manifest18
-rw-r--r--rola-desktop/obj/project.assets.json1556
-rw-r--r--rola-desktop/obj/project.nuget.cache38
-rw-r--r--rola-desktop/obj/rola-desktop.csproj.nuget.dgspec.json95
-rw-r--r--rola-desktop/obj/rola-desktop.csproj.nuget.g.props24
-rw-r--r--rola-desktop/obj/rola-desktop.csproj.nuget.g.targets10
-rw-r--r--rola-desktop/rola-desktop.csproj28
-rw-r--r--rola-utils/functions/Cargo.toml8
-rw-r--r--rola-utils/functions/src/levenshtein_distance.rs117
-rw-r--r--rola-utils/functions/src/lib.rs2
-rw-r--r--rola-utils/macros/Cargo.toml14
-rw-r--r--rola-utils/macros/src/lib.rs1
-rw-r--r--rola-vcs/Cargo.toml9
-rw-r--r--rola-vcs/internal_macros/Cargo.toml14
-rw-r--r--rola-vcs/internal_macros/src/constants.rs115
-rw-r--r--rola-vcs/internal_macros/src/lib.rs39
-rw-r--r--rola-vcs/src/abstracts.rs2
-rw-r--r--rola-vcs/src/abstracts/dir_pointer.rs88
-rw-r--r--rola-vcs/src/bucket.rs18
-rw-r--r--rola-vcs/src/err.rs105
-rw-r--r--rola-vcs/src/err/io.rs10
-rw-r--r--rola-vcs/src/lib.rs24
-rw-r--r--rola-vcs/src/tools.rs1
-rw-r--r--rola-vcs/src/tools/dir_search.rs54
-rw-r--r--rola-vcs/src/workdraft.rs150
41 files changed, 2830 insertions, 0 deletions
diff --git a/.cargo/config.toml b/.cargo/config.toml
new file mode 100644
index 0000000..11eebcf
--- /dev/null
+++ b/.cargo/config.toml
@@ -0,0 +1,7 @@
+[build]
+target-dir = "./.temp/target"
+
+[env]
+
+[alias]
+rola-doc = "doc --workspace --no-deps --open"
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e0fdece
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+.temp
diff --git a/Cargo.lock b/Cargo.lock
new file mode 100644
index 0000000..ab047c4
--- /dev/null
+++ b/Cargo.lock
@@ -0,0 +1,71 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 4
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.106"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "rola-cli"
+version = "0.1.0"
+
+[[package]]
+name = "rorolala"
+version = "0.1.0"
+dependencies = [
+ "rorolala_internal_macros",
+]
+
+[[package]]
+name = "rorolala_internal_macros"
+version = "0.1.0"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "shared_functions"
+version = "0.1.0"
+
+[[package]]
+name = "shared_macros"
+version = "0.1.0"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.117"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644
index 0000000..09644cc
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,21 @@
+[workspace]
+resolver = "2"
+members = [
+ "rola-cli",
+ "rola-vcs",
+ "rola-vcs/internal_macros",
+ "rola-utils/functions",
+ "rola-utils/macros",
+]
+
+[workspace.package]
+version = "0.1.0"
+edition = "2024"
+authors = ["RoroLalaVCS", "Weicao-CatilGrass <catil_grass@qq.com>"]
+license = "MIT"
+
+[workspace.dependencies]
+rorolala = { path = "rola-vcs" }
+rorolala_internal_macros = { path = "rola-vcs/internal_macros" }
+shared_functions = { path = "rola-utils/functions" }
+shared_macros = { path = "rola-utils/macros" }
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..96889a1
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2026 RoroLala VCS
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/rola-cli/Cargo.toml b/rola-cli/Cargo.toml
new file mode 100644
index 0000000..433b351
--- /dev/null
+++ b/rola-cli/Cargo.toml
@@ -0,0 +1,8 @@
+[package]
+name = "rola-cli"
+version.workspace = true
+edition.workspace = true
+authors.workspace = true
+license.workspace = true
+
+[dependencies]
diff --git a/rola-cli/src/main.rs b/rola-cli/src/main.rs
new file mode 100644
index 0000000..e7a11a9
--- /dev/null
+++ b/rola-cli/src/main.rs
@@ -0,0 +1,3 @@
+fn main() {
+ println!("Hello, world!");
+}
diff --git a/rola-desktop/App.axaml b/rola-desktop/App.axaml
new file mode 100644
index 0000000..bd879fe
--- /dev/null
+++ b/rola-desktop/App.axaml
@@ -0,0 +1,15 @@
+<Application xmlns="https://github.com/avaloniaui"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ x:Class="rola_desktop.App"
+ xmlns:local="using:rola_desktop"
+ RequestedThemeVariant="Default">
+ <!-- "Default" ThemeVariant follows system theme variant. "Dark" or "Light" are other available options. -->
+
+ <Application.DataTemplates>
+ <local:ViewLocator/>
+ </Application.DataTemplates>
+
+ <Application.Styles>
+ <FluentTheme />
+ </Application.Styles>
+</Application> \ No newline at end of file
diff --git a/rola-desktop/App.axaml.cs b/rola-desktop/App.axaml.cs
new file mode 100644
index 0000000..6b665bc
--- /dev/null
+++ b/rola-desktop/App.axaml.cs
@@ -0,0 +1,47 @@
+using Avalonia;
+using Avalonia.Controls.ApplicationLifetimes;
+using Avalonia.Data.Core;
+using Avalonia.Data.Core.Plugins;
+using System.Linq;
+using Avalonia.Markup.Xaml;
+using rola_desktop.ViewModels;
+using rola_desktop.Views;
+
+namespace rola_desktop;
+
+public partial class App : Application
+{
+ public override void Initialize()
+ {
+ AvaloniaXamlLoader.Load(this);
+ }
+
+ public override void OnFrameworkInitializationCompleted()
+ {
+ if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
+ {
+ // Avoid duplicate validations from both Avalonia and the CommunityToolkit.
+ // More info: https://docs.avaloniaui.net/docs/guides/development-guides/data-validation#manage-validationplugins
+ DisableAvaloniaDataAnnotationValidation();
+ desktop.MainWindow = new MainWindow
+ {
+ DataContext = new MainWindowViewModel(),
+ };
+ }
+
+ base.OnFrameworkInitializationCompleted();
+ }
+
+ private void DisableAvaloniaDataAnnotationValidation()
+ {
+ // Get an array of plugins to remove
+ var dataValidationPluginsToRemove =
+ BindingPlugins.DataValidators.OfType<DataAnnotationsValidationPlugin>().ToArray();
+
+ // remove each entry found
+ foreach (var plugin in dataValidationPluginsToRemove)
+ {
+ BindingPlugins.DataValidators.Remove(plugin);
+ }
+ }
+} \ No newline at end of file
diff --git a/rola-desktop/Assets/avalonia-logo.ico b/rola-desktop/Assets/avalonia-logo.ico
new file mode 100644
index 0000000..f7da8bb
--- /dev/null
+++ b/rola-desktop/Assets/avalonia-logo.ico
Binary files differ
diff --git a/rola-desktop/Program.cs b/rola-desktop/Program.cs
new file mode 100644
index 0000000..30e9ca6
--- /dev/null
+++ b/rola-desktop/Program.cs
@@ -0,0 +1,21 @@
+using Avalonia;
+using System;
+
+namespace rola_desktop;
+
+sealed class Program
+{
+ // Initialization code. Don't use any Avalonia, third-party APIs or any
+ // SynchronizationContext-reliant code before AppMain is called: things aren't initialized
+ // yet and stuff might break.
+ [STAThread]
+ public static void Main(string[] args) => BuildAvaloniaApp()
+ .StartWithClassicDesktopLifetime(args);
+
+ // Avalonia configuration, don't remove; also used by visual designer.
+ public static AppBuilder BuildAvaloniaApp()
+ => AppBuilder.Configure<App>()
+ .UsePlatformDetect()
+ .WithInterFont()
+ .LogToTrace();
+}
diff --git a/rola-desktop/ViewLocator.cs b/rola-desktop/ViewLocator.cs
new file mode 100644
index 0000000..eec4713
--- /dev/null
+++ b/rola-desktop/ViewLocator.cs
@@ -0,0 +1,31 @@
+using System;
+using Avalonia.Controls;
+using Avalonia.Controls.Templates;
+using rola_desktop.ViewModels;
+
+namespace rola_desktop;
+
+public class ViewLocator : IDataTemplate
+{
+
+ public Control? Build(object? param)
+ {
+ if (param is null)
+ return null;
+
+ var name = param.GetType().FullName!.Replace("ViewModel", "View", StringComparison.Ordinal);
+ var type = Type.GetType(name);
+
+ if (type != null)
+ {
+ return (Control)Activator.CreateInstance(type)!;
+ }
+
+ return new TextBlock { Text = "Not Found: " + name };
+ }
+
+ public bool Match(object? data)
+ {
+ return data is ViewModelBase;
+ }
+}
diff --git a/rola-desktop/ViewModels/MainWindowViewModel.cs b/rola-desktop/ViewModels/MainWindowViewModel.cs
new file mode 100644
index 0000000..2db588d
--- /dev/null
+++ b/rola-desktop/ViewModels/MainWindowViewModel.cs
@@ -0,0 +1,6 @@
+namespace rola_desktop.ViewModels;
+
+public partial class MainWindowViewModel : ViewModelBase
+{
+ public string Greeting { get; } = "Welcome to Avalonia!";
+}
diff --git a/rola-desktop/ViewModels/ViewModelBase.cs b/rola-desktop/ViewModels/ViewModelBase.cs
new file mode 100644
index 0000000..f0aa7f1
--- /dev/null
+++ b/rola-desktop/ViewModels/ViewModelBase.cs
@@ -0,0 +1,7 @@
+using CommunityToolkit.Mvvm.ComponentModel;
+
+namespace rola_desktop.ViewModels;
+
+public class ViewModelBase : ObservableObject
+{
+}
diff --git a/rola-desktop/Views/MainWindow.axaml b/rola-desktop/Views/MainWindow.axaml
new file mode 100644
index 0000000..6ed88af
--- /dev/null
+++ b/rola-desktop/Views/MainWindow.axaml
@@ -0,0 +1,20 @@
+<Window xmlns="https://github.com/avaloniaui"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:vm="using:rola_desktop.ViewModels"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
+ x:Class="rola_desktop.Views.MainWindow"
+ x:DataType="vm:MainWindowViewModel"
+ Icon="/Assets/avalonia-logo.ico"
+ Title="rola_desktop">
+
+ <Design.DataContext>
+ <!-- This only sets the DataContext for the previewer in an IDE,
+ to set the actual DataContext for runtime, set the DataContext property in code (look at App.axaml.cs) -->
+ <vm:MainWindowViewModel/>
+ </Design.DataContext>
+
+ <TextBlock Text="{Binding Greeting}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
+
+</Window>
diff --git a/rola-desktop/Views/MainWindow.axaml.cs b/rola-desktop/Views/MainWindow.axaml.cs
new file mode 100644
index 0000000..14f9599
--- /dev/null
+++ b/rola-desktop/Views/MainWindow.axaml.cs
@@ -0,0 +1,11 @@
+using Avalonia.Controls;
+
+namespace rola_desktop.Views;
+
+public partial class MainWindow : Window
+{
+ public MainWindow()
+ {
+ InitializeComponent();
+ }
+} \ No newline at end of file
diff --git a/rola-desktop/app.manifest b/rola-desktop/app.manifest
new file mode 100644
index 0000000..6454463
--- /dev/null
+++ b/rola-desktop/app.manifest
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
+ <!-- This manifest is used on Windows only.
+ Don't remove it as it might cause problems with window transparency and embedded controls.
+ For more details visit https://learn.microsoft.com/en-us/windows/win32/sbscs/application-manifests -->
+ <assemblyIdentity version="1.0.0.0" name="rola_desktop.Desktop"/>
+
+ <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
+ <application>
+ <!-- A list of the Windows versions that this application has been tested on
+ and is designed to work with. Uncomment the appropriate elements
+ and Windows will automatically select the most compatible environment. -->
+
+ <!-- Windows 10 -->
+ <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
+ </application>
+ </compatibility>
+</assembly>
diff --git a/rola-desktop/obj/project.assets.json b/rola-desktop/obj/project.assets.json
new file mode 100644
index 0000000..c853354
--- /dev/null
+++ b/rola-desktop/obj/project.assets.json
@@ -0,0 +1,1556 @@
+{
+ "version": 3,
+ "targets": {
+ "net9.0": {
+ "Avalonia/11.3.2": {
+ "type": "package",
+ "dependencies": {
+ "Avalonia.BuildServices": "0.0.31",
+ "Avalonia.Remote.Protocol": "11.3.2",
+ "MicroCom.Runtime": "0.11.0"
+ },
+ "compile": {
+ "ref/net8.0/Avalonia.Base.dll": {
+ "related": ".xml"
+ },
+ "ref/net8.0/Avalonia.Controls.dll": {
+ "related": ".xml"
+ },
+ "ref/net8.0/Avalonia.DesignerSupport.dll": {
+ "related": ".xml"
+ },
+ "ref/net8.0/Avalonia.Dialogs.dll": {
+ "related": ".xml"
+ },
+ "ref/net8.0/Avalonia.Markup.Xaml.dll": {
+ "related": ".xml"
+ },
+ "ref/net8.0/Avalonia.Markup.dll": {
+ "related": ".Xaml.xml;.xml"
+ },
+ "ref/net8.0/Avalonia.Metal.dll": {
+ "related": ".xml"
+ },
+ "ref/net8.0/Avalonia.MicroCom.dll": {
+ "related": ".xml"
+ },
+ "ref/net8.0/Avalonia.OpenGL.dll": {
+ "related": ".xml"
+ },
+ "ref/net8.0/Avalonia.Vulkan.dll": {
+ "related": ".xml"
+ },
+ "ref/net8.0/Avalonia.dll": {
+ "related": ".Base.xml;.Controls.xml;.DesignerSupport.xml;.Dialogs.xml;.Markup.Xaml.xml;.Markup.xml;.Metal.xml;.MicroCom.xml;.OpenGL.xml;.Vulkan.xml;.xml"
+ }
+ },
+ "runtime": {
+ "lib/net8.0/Avalonia.Base.dll": {
+ "related": ".xml"
+ },
+ "lib/net8.0/Avalonia.Controls.dll": {
+ "related": ".xml"
+ },
+ "lib/net8.0/Avalonia.DesignerSupport.dll": {
+ "related": ".xml"
+ },
+ "lib/net8.0/Avalonia.Dialogs.dll": {
+ "related": ".xml"
+ },
+ "lib/net8.0/Avalonia.Markup.Xaml.dll": {
+ "related": ".xml"
+ },
+ "lib/net8.0/Avalonia.Markup.dll": {
+ "related": ".Xaml.xml;.xml"
+ },
+ "lib/net8.0/Avalonia.Metal.dll": {
+ "related": ".xml"
+ },
+ "lib/net8.0/Avalonia.MicroCom.dll": {
+ "related": ".xml"
+ },
+ "lib/net8.0/Avalonia.OpenGL.dll": {
+ "related": ".xml"
+ },
+ "lib/net8.0/Avalonia.Vulkan.dll": {
+ "related": ".xml"
+ },
+ "lib/net8.0/Avalonia.dll": {
+ "related": ".Base.xml;.Controls.xml;.DesignerSupport.xml;.Dialogs.xml;.Markup.Xaml.xml;.Markup.xml;.Metal.xml;.MicroCom.xml;.OpenGL.xml;.Vulkan.xml;.xml"
+ }
+ },
+ "build": {
+ "buildTransitive/Avalonia.props": {},
+ "buildTransitive/Avalonia.targets": {}
+ }
+ },
+ "Avalonia.Angle.Windows.Natives/2.1.25547.20250602": {
+ "type": "package",
+ "runtimeTargets": {
+ "runtimes/win-arm64/native/av_libglesv2.dll": {
+ "assetType": "native",
+ "rid": "win-arm64"
+ },
+ "runtimes/win-x64/native/av_libglesv2.dll": {
+ "assetType": "native",
+ "rid": "win-x64"
+ },
+ "runtimes/win-x86/native/av_libglesv2.dll": {
+ "assetType": "native",
+ "rid": "win-x86"
+ }
+ }
+ },
+ "Avalonia.BuildServices/0.0.31": {
+ "type": "package",
+ "build": {
+ "buildTransitive/Avalonia.BuildServices.targets": {}
+ }
+ },
+ "Avalonia.Controls.ColorPicker/11.3.2": {
+ "type": "package",
+ "dependencies": {
+ "Avalonia": "11.3.2",
+ "Avalonia.Remote.Protocol": "11.3.2"
+ },
+ "compile": {
+ "lib/net8.0/Avalonia.Controls.ColorPicker.dll": {
+ "related": ".xml"
+ }
+ },
+ "runtime": {
+ "lib/net8.0/Avalonia.Controls.ColorPicker.dll": {
+ "related": ".xml"
+ }
+ }
+ },
+ "Avalonia.Desktop/11.3.2": {
+ "type": "package",
+ "dependencies": {
+ "Avalonia": "11.3.2",
+ "Avalonia.Native": "11.3.2",
+ "Avalonia.Skia": "11.3.2",
+ "Avalonia.Win32": "11.3.2",
+ "Avalonia.X11": "11.3.2"
+ },
+ "compile": {
+ "lib/net8.0/Avalonia.Desktop.dll": {
+ "related": ".xml"
+ }
+ },
+ "runtime": {
+ "lib/net8.0/Avalonia.Desktop.dll": {
+ "related": ".xml"
+ }
+ }
+ },
+ "Avalonia.Diagnostics/11.3.2": {
+ "type": "package",
+ "dependencies": {
+ "Avalonia": "11.3.2",
+ "Avalonia.Controls.ColorPicker": "11.3.2",
+ "Avalonia.Themes.Simple": "11.3.2"
+ },
+ "compile": {
+ "lib/net8.0/Avalonia.Diagnostics.dll": {
+ "related": ".xml"
+ }
+ },
+ "runtime": {
+ "lib/net8.0/Avalonia.Diagnostics.dll": {
+ "related": ".xml"
+ }
+ }
+ },
+ "Avalonia.Fonts.Inter/11.3.2": {
+ "type": "package",
+ "dependencies": {
+ "Avalonia": "11.3.2"
+ },
+ "compile": {
+ "lib/net8.0/Avalonia.Fonts.Inter.dll": {
+ "related": ".xml"
+ }
+ },
+ "runtime": {
+ "lib/net8.0/Avalonia.Fonts.Inter.dll": {
+ "related": ".xml"
+ }
+ }
+ },
+ "Avalonia.FreeDesktop/11.3.2": {
+ "type": "package",
+ "dependencies": {
+ "Avalonia": "11.3.2",
+ "Tmds.DBus.Protocol": "0.21.2"
+ },
+ "compile": {
+ "lib/net8.0/Avalonia.FreeDesktop.dll": {
+ "related": ".xml"
+ }
+ },
+ "runtime": {
+ "lib/net8.0/Avalonia.FreeDesktop.dll": {
+ "related": ".xml"
+ }
+ }
+ },
+ "Avalonia.Native/11.3.2": {
+ "type": "package",
+ "dependencies": {
+ "Avalonia": "11.3.2"
+ },
+ "compile": {
+ "lib/net8.0/Avalonia.Native.dll": {
+ "related": ".xml"
+ }
+ },
+ "runtime": {
+ "lib/net8.0/Avalonia.Native.dll": {
+ "related": ".xml"
+ }
+ },
+ "runtimeTargets": {
+ "runtimes/osx/native/libAvaloniaNative.dylib": {
+ "assetType": "native",
+ "rid": "osx"
+ }
+ }
+ },
+ "Avalonia.Remote.Protocol/11.3.2": {
+ "type": "package",
+ "compile": {
+ "lib/net8.0/Avalonia.Remote.Protocol.dll": {
+ "related": ".xml"
+ }
+ },
+ "runtime": {
+ "lib/net8.0/Avalonia.Remote.Protocol.dll": {
+ "related": ".xml"
+ }
+ }
+ },
+ "Avalonia.Skia/11.3.2": {
+ "type": "package",
+ "dependencies": {
+ "Avalonia": "11.3.2",
+ "HarfBuzzSharp": "8.3.1.1",
+ "HarfBuzzSharp.NativeAssets.Linux": "8.3.1.1",
+ "HarfBuzzSharp.NativeAssets.WebAssembly": "8.3.1.1",
+ "SkiaSharp": "2.88.9",
+ "SkiaSharp.NativeAssets.Linux": "2.88.9",
+ "SkiaSharp.NativeAssets.WebAssembly": "2.88.9"
+ },
+ "compile": {
+ "lib/net8.0/Avalonia.Skia.dll": {
+ "related": ".xml"
+ }
+ },
+ "runtime": {
+ "lib/net8.0/Avalonia.Skia.dll": {
+ "related": ".xml"
+ }
+ }
+ },
+ "Avalonia.Themes.Fluent/11.3.2": {
+ "type": "package",
+ "dependencies": {
+ "Avalonia": "11.3.2"
+ },
+ "compile": {
+ "lib/net8.0/Avalonia.Themes.Fluent.dll": {
+ "related": ".xml"
+ }
+ },
+ "runtime": {
+ "lib/net8.0/Avalonia.Themes.Fluent.dll": {
+ "related": ".xml"
+ }
+ }
+ },
+ "Avalonia.Themes.Simple/11.3.2": {
+ "type": "package",
+ "dependencies": {
+ "Avalonia": "11.3.2"
+ },
+ "compile": {
+ "lib/net8.0/Avalonia.Themes.Simple.dll": {
+ "related": ".xml"
+ }
+ },
+ "runtime": {
+ "lib/net8.0/Avalonia.Themes.Simple.dll": {
+ "related": ".xml"
+ }
+ }
+ },
+ "Avalonia.Win32/11.3.2": {
+ "type": "package",
+ "dependencies": {
+ "Avalonia": "11.3.2",
+ "Avalonia.Angle.Windows.Natives": "2.1.25547.20250602"
+ },
+ "compile": {
+ "lib/net8.0/Avalonia.Win32.Automation.dll": {
+ "related": ".xml"
+ },
+ "lib/net8.0/Avalonia.Win32.dll": {
+ "related": ".Automation.xml;.xml"
+ }
+ },
+ "runtime": {
+ "lib/net8.0/Avalonia.Win32.Automation.dll": {
+ "related": ".xml"
+ },
+ "lib/net8.0/Avalonia.Win32.dll": {
+ "related": ".Automation.xml;.xml"
+ }
+ }
+ },
+ "Avalonia.X11/11.3.2": {
+ "type": "package",
+ "dependencies": {
+ "Avalonia": "11.3.2",
+ "Avalonia.FreeDesktop": "11.3.2",
+ "Avalonia.Skia": "11.3.2"
+ },
+ "compile": {
+ "lib/net8.0/Avalonia.X11.dll": {
+ "related": ".xml"
+ }
+ },
+ "runtime": {
+ "lib/net8.0/Avalonia.X11.dll": {
+ "related": ".xml"
+ }
+ }
+ },
+ "CommunityToolkit.Mvvm/8.2.1": {
+ "type": "package",
+ "compile": {
+ "lib/net6.0/CommunityToolkit.Mvvm.dll": {
+ "related": ".pdb;.xml"
+ }
+ },
+ "runtime": {
+ "lib/net6.0/CommunityToolkit.Mvvm.dll": {
+ "related": ".pdb;.xml"
+ }
+ },
+ "build": {
+ "buildTransitive/netstandard2.1/CommunityToolkit.Mvvm.targets": {}
+ }
+ },
+ "HarfBuzzSharp/8.3.1.1": {
+ "type": "package",
+ "dependencies": {
+ "HarfBuzzSharp.NativeAssets.Win32": "8.3.1.1",
+ "HarfBuzzSharp.NativeAssets.macOS": "8.3.1.1"
+ },
+ "compile": {
+ "lib/net8.0/HarfBuzzSharp.dll": {
+ "related": ".pdb"
+ }
+ },
+ "runtime": {
+ "lib/net8.0/HarfBuzzSharp.dll": {
+ "related": ".pdb"
+ }
+ }
+ },
+ "HarfBuzzSharp.NativeAssets.Linux/8.3.1.1": {
+ "type": "package",
+ "compile": {
+ "lib/net8.0/_._": {}
+ },
+ "runtime": {
+ "lib/net8.0/_._": {}
+ },
+ "runtimeTargets": {
+ "runtimes/linux-arm/native/libHarfBuzzSharp.so": {
+ "assetType": "native",
+ "rid": "linux-arm"
+ },
+ "runtimes/linux-arm64/native/libHarfBuzzSharp.so": {
+ "assetType": "native",
+ "rid": "linux-arm64"
+ },
+ "runtimes/linux-loongarch64/native/libHarfBuzzSharp.so": {
+ "assetType": "native",
+ "rid": "linux-loongarch64"
+ },
+ "runtimes/linux-musl-arm/native/libHarfBuzzSharp.so": {
+ "assetType": "native",
+ "rid": "linux-musl-arm"
+ },
+ "runtimes/linux-musl-arm64/native/libHarfBuzzSharp.so": {
+ "assetType": "native",
+ "rid": "linux-musl-arm64"
+ },
+ "runtimes/linux-musl-loongarch64/native/libHarfBuzzSharp.so": {
+ "assetType": "native",
+ "rid": "linux-musl-loongarch64"
+ },
+ "runtimes/linux-musl-riscv64/native/libHarfBuzzSharp.so": {
+ "assetType": "native",
+ "rid": "linux-musl-riscv64"
+ },
+ "runtimes/linux-musl-x64/native/libHarfBuzzSharp.so": {
+ "assetType": "native",
+ "rid": "linux-musl-x64"
+ },
+ "runtimes/linux-riscv64/native/libHarfBuzzSharp.so": {
+ "assetType": "native",
+ "rid": "linux-riscv64"
+ },
+ "runtimes/linux-x64/native/libHarfBuzzSharp.so": {
+ "assetType": "native",
+ "rid": "linux-x64"
+ },
+ "runtimes/linux-x86/native/libHarfBuzzSharp.so": {
+ "assetType": "native",
+ "rid": "linux-x86"
+ }
+ }
+ },
+ "HarfBuzzSharp.NativeAssets.macOS/8.3.1.1": {
+ "type": "package",
+ "compile": {
+ "lib/net8.0/_._": {}
+ },
+ "runtime": {
+ "lib/net8.0/_._": {}
+ },
+ "runtimeTargets": {
+ "runtimes/osx/native/libHarfBuzzSharp.dylib": {
+ "assetType": "native",
+ "rid": "osx"
+ }
+ }
+ },
+ "HarfBuzzSharp.NativeAssets.WebAssembly/8.3.1.1": {
+ "type": "package",
+ "compile": {
+ "lib/net8.0/_._": {}
+ },
+ "runtime": {
+ "lib/net8.0/_._": {}
+ },
+ "build": {
+ "buildTransitive/netstandard1.0/HarfBuzzSharp.NativeAssets.WebAssembly.props": {},
+ "buildTransitive/netstandard1.0/HarfBuzzSharp.NativeAssets.WebAssembly.targets": {}
+ }
+ },
+ "HarfBuzzSharp.NativeAssets.Win32/8.3.1.1": {
+ "type": "package",
+ "compile": {
+ "lib/net8.0/_._": {}
+ },
+ "runtime": {
+ "lib/net8.0/_._": {}
+ },
+ "runtimeTargets": {
+ "runtimes/win-arm64/native/libHarfBuzzSharp.dll": {
+ "assetType": "native",
+ "rid": "win-arm64"
+ },
+ "runtimes/win-x64/native/libHarfBuzzSharp.dll": {
+ "assetType": "native",
+ "rid": "win-x64"
+ },
+ "runtimes/win-x86/native/libHarfBuzzSharp.dll": {
+ "assetType": "native",
+ "rid": "win-x86"
+ }
+ }
+ },
+ "MicroCom.Runtime/0.11.0": {
+ "type": "package",
+ "compile": {
+ "lib/net5.0/MicroCom.Runtime.dll": {}
+ },
+ "runtime": {
+ "lib/net5.0/MicroCom.Runtime.dll": {}
+ }
+ },
+ "SkiaSharp/2.88.9": {
+ "type": "package",
+ "dependencies": {
+ "SkiaSharp.NativeAssets.Win32": "2.88.9",
+ "SkiaSharp.NativeAssets.macOS": "2.88.9"
+ },
+ "compile": {
+ "lib/net6.0/SkiaSharp.dll": {
+ "related": ".pdb;.xml"
+ }
+ },
+ "runtime": {
+ "lib/net6.0/SkiaSharp.dll": {
+ "related": ".pdb;.xml"
+ }
+ }
+ },
+ "SkiaSharp.NativeAssets.Linux/2.88.9": {
+ "type": "package",
+ "dependencies": {
+ "SkiaSharp": "2.88.9"
+ },
+ "compile": {
+ "lib/net6.0/_._": {}
+ },
+ "runtime": {
+ "lib/net6.0/_._": {}
+ },
+ "runtimeTargets": {
+ "runtimes/linux-arm/native/libSkiaSharp.so": {
+ "assetType": "native",
+ "rid": "linux-arm"
+ },
+ "runtimes/linux-arm64/native/libSkiaSharp.so": {
+ "assetType": "native",
+ "rid": "linux-arm64"
+ },
+ "runtimes/linux-musl-x64/native/libSkiaSharp.so": {
+ "assetType": "native",
+ "rid": "linux-musl-x64"
+ },
+ "runtimes/linux-x64/native/libSkiaSharp.so": {
+ "assetType": "native",
+ "rid": "linux-x64"
+ }
+ }
+ },
+ "SkiaSharp.NativeAssets.macOS/2.88.9": {
+ "type": "package",
+ "compile": {
+ "lib/net6.0/_._": {}
+ },
+ "runtime": {
+ "lib/net6.0/_._": {}
+ },
+ "runtimeTargets": {
+ "runtimes/osx/native/libSkiaSharp.dylib": {
+ "assetType": "native",
+ "rid": "osx"
+ }
+ }
+ },
+ "SkiaSharp.NativeAssets.WebAssembly/2.88.9": {
+ "type": "package",
+ "compile": {
+ "lib/netstandard1.0/_._": {}
+ },
+ "runtime": {
+ "lib/netstandard1.0/_._": {}
+ },
+ "build": {
+ "buildTransitive/netstandard1.0/SkiaSharp.NativeAssets.WebAssembly.props": {},
+ "buildTransitive/netstandard1.0/SkiaSharp.NativeAssets.WebAssembly.targets": {}
+ }
+ },
+ "SkiaSharp.NativeAssets.Win32/2.88.9": {
+ "type": "package",
+ "compile": {
+ "lib/net6.0/_._": {}
+ },
+ "runtime": {
+ "lib/net6.0/_._": {}
+ },
+ "runtimeTargets": {
+ "runtimes/win-arm64/native/libSkiaSharp.dll": {
+ "assetType": "native",
+ "rid": "win-arm64"
+ },
+ "runtimes/win-x64/native/libSkiaSharp.dll": {
+ "assetType": "native",
+ "rid": "win-x64"
+ },
+ "runtimes/win-x86/native/libSkiaSharp.dll": {
+ "assetType": "native",
+ "rid": "win-x86"
+ }
+ }
+ },
+ "System.IO.Pipelines/8.0.0": {
+ "type": "package",
+ "compile": {
+ "lib/net8.0/System.IO.Pipelines.dll": {
+ "related": ".xml"
+ }
+ },
+ "runtime": {
+ "lib/net8.0/System.IO.Pipelines.dll": {
+ "related": ".xml"
+ }
+ },
+ "build": {
+ "buildTransitive/net6.0/_._": {}
+ }
+ },
+ "Tmds.DBus.Protocol/0.21.2": {
+ "type": "package",
+ "dependencies": {
+ "System.IO.Pipelines": "8.0.0"
+ },
+ "compile": {
+ "lib/net8.0/Tmds.DBus.Protocol.dll": {}
+ },
+ "runtime": {
+ "lib/net8.0/Tmds.DBus.Protocol.dll": {}
+ }
+ }
+ }
+ },
+ "libraries": {
+ "Avalonia/11.3.2": {
+ "sha512": "3w1v4/wEpHFq6WWVNyyrne2Jyz5bdQvnK3AW36rCto42L+AtdbnO/SG2SIqJ7ObXJl+Y3LXz2XDGx9Blzqduow==",
+ "type": "package",
+ "path": "avalonia/11.3.2",
+ "hasTools": true,
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "Icon.png",
+ "analyzers/dotnet/cs/Avalonia.Analyzers.dll",
+ "analyzers/dotnet/cs/Avalonia.Generators.dll",
+ "avalonia.11.3.2.nupkg.sha512",
+ "avalonia.nuspec",
+ "build/Avalonia.Generators.props",
+ "build/Avalonia.props",
+ "build/Avalonia.targets",
+ "build/AvaloniaBuildTasks.props",
+ "build/AvaloniaBuildTasks.targets",
+ "build/AvaloniaItemSchema.xaml",
+ "build/AvaloniaPrivateApis.targets",
+ "build/AvaloniaRules.Project.xml",
+ "build/AvaloniaSingleProject.targets",
+ "build/AvaloniaVersion.props",
+ "buildTransitive/Avalonia.Generators.props",
+ "buildTransitive/Avalonia.props",
+ "buildTransitive/Avalonia.targets",
+ "buildTransitive/AvaloniaBuildTasks.props",
+ "buildTransitive/AvaloniaBuildTasks.targets",
+ "buildTransitive/AvaloniaItemSchema.xaml",
+ "buildTransitive/AvaloniaPrivateApis.targets",
+ "buildTransitive/AvaloniaRules.Project.xml",
+ "buildTransitive/AvaloniaSingleProject.targets",
+ "lib/net6.0/Avalonia.Base.dll",
+ "lib/net6.0/Avalonia.Base.xml",
+ "lib/net6.0/Avalonia.Controls.dll",
+ "lib/net6.0/Avalonia.Controls.xml",
+ "lib/net6.0/Avalonia.DesignerSupport.dll",
+ "lib/net6.0/Avalonia.DesignerSupport.xml",
+ "lib/net6.0/Avalonia.Dialogs.dll",
+ "lib/net6.0/Avalonia.Dialogs.xml",
+ "lib/net6.0/Avalonia.Markup.Xaml.dll",
+ "lib/net6.0/Avalonia.Markup.Xaml.xml",
+ "lib/net6.0/Avalonia.Markup.dll",
+ "lib/net6.0/Avalonia.Markup.xml",
+ "lib/net6.0/Avalonia.Metal.dll",
+ "lib/net6.0/Avalonia.Metal.xml",
+ "lib/net6.0/Avalonia.MicroCom.dll",
+ "lib/net6.0/Avalonia.MicroCom.xml",
+ "lib/net6.0/Avalonia.OpenGL.dll",
+ "lib/net6.0/Avalonia.OpenGL.xml",
+ "lib/net6.0/Avalonia.Vulkan.dll",
+ "lib/net6.0/Avalonia.Vulkan.xml",
+ "lib/net6.0/Avalonia.dll",
+ "lib/net6.0/Avalonia.xml",
+ "lib/net8.0/Avalonia.Base.dll",
+ "lib/net8.0/Avalonia.Base.xml",
+ "lib/net8.0/Avalonia.Controls.dll",
+ "lib/net8.0/Avalonia.Controls.xml",
+ "lib/net8.0/Avalonia.DesignerSupport.dll",
+ "lib/net8.0/Avalonia.DesignerSupport.xml",
+ "lib/net8.0/Avalonia.Dialogs.dll",
+ "lib/net8.0/Avalonia.Dialogs.xml",
+ "lib/net8.0/Avalonia.Markup.Xaml.dll",
+ "lib/net8.0/Avalonia.Markup.Xaml.xml",
+ "lib/net8.0/Avalonia.Markup.dll",
+ "lib/net8.0/Avalonia.Markup.xml",
+ "lib/net8.0/Avalonia.Metal.dll",
+ "lib/net8.0/Avalonia.Metal.xml",
+ "lib/net8.0/Avalonia.MicroCom.dll",
+ "lib/net8.0/Avalonia.MicroCom.xml",
+ "lib/net8.0/Avalonia.OpenGL.dll",
+ "lib/net8.0/Avalonia.OpenGL.xml",
+ "lib/net8.0/Avalonia.Vulkan.dll",
+ "lib/net8.0/Avalonia.Vulkan.xml",
+ "lib/net8.0/Avalonia.dll",
+ "lib/net8.0/Avalonia.xml",
+ "lib/netstandard2.0/Avalonia.Base.dll",
+ "lib/netstandard2.0/Avalonia.Base.xml",
+ "lib/netstandard2.0/Avalonia.Controls.dll",
+ "lib/netstandard2.0/Avalonia.Controls.xml",
+ "lib/netstandard2.0/Avalonia.DesignerSupport.dll",
+ "lib/netstandard2.0/Avalonia.DesignerSupport.xml",
+ "lib/netstandard2.0/Avalonia.Dialogs.dll",
+ "lib/netstandard2.0/Avalonia.Dialogs.xml",
+ "lib/netstandard2.0/Avalonia.Markup.Xaml.dll",
+ "lib/netstandard2.0/Avalonia.Markup.Xaml.xml",
+ "lib/netstandard2.0/Avalonia.Markup.dll",
+ "lib/netstandard2.0/Avalonia.Markup.xml",
+ "lib/netstandard2.0/Avalonia.Metal.dll",
+ "lib/netstandard2.0/Avalonia.Metal.xml",
+ "lib/netstandard2.0/Avalonia.MicroCom.dll",
+ "lib/netstandard2.0/Avalonia.MicroCom.xml",
+ "lib/netstandard2.0/Avalonia.OpenGL.dll",
+ "lib/netstandard2.0/Avalonia.OpenGL.xml",
+ "lib/netstandard2.0/Avalonia.Vulkan.dll",
+ "lib/netstandard2.0/Avalonia.Vulkan.xml",
+ "lib/netstandard2.0/Avalonia.dll",
+ "lib/netstandard2.0/Avalonia.xml",
+ "ref/net6.0/Avalonia.Base.dll",
+ "ref/net6.0/Avalonia.Base.xml",
+ "ref/net6.0/Avalonia.Controls.dll",
+ "ref/net6.0/Avalonia.Controls.xml",
+ "ref/net6.0/Avalonia.DesignerSupport.dll",
+ "ref/net6.0/Avalonia.DesignerSupport.xml",
+ "ref/net6.0/Avalonia.Dialogs.dll",
+ "ref/net6.0/Avalonia.Dialogs.xml",
+ "ref/net6.0/Avalonia.Markup.Xaml.dll",
+ "ref/net6.0/Avalonia.Markup.Xaml.xml",
+ "ref/net6.0/Avalonia.Markup.dll",
+ "ref/net6.0/Avalonia.Markup.xml",
+ "ref/net6.0/Avalonia.Metal.dll",
+ "ref/net6.0/Avalonia.Metal.xml",
+ "ref/net6.0/Avalonia.MicroCom.dll",
+ "ref/net6.0/Avalonia.MicroCom.xml",
+ "ref/net6.0/Avalonia.OpenGL.dll",
+ "ref/net6.0/Avalonia.OpenGL.xml",
+ "ref/net6.0/Avalonia.Vulkan.dll",
+ "ref/net6.0/Avalonia.Vulkan.xml",
+ "ref/net6.0/Avalonia.dll",
+ "ref/net6.0/Avalonia.xml",
+ "ref/net8.0/Avalonia.Base.dll",
+ "ref/net8.0/Avalonia.Base.xml",
+ "ref/net8.0/Avalonia.Controls.dll",
+ "ref/net8.0/Avalonia.Controls.xml",
+ "ref/net8.0/Avalonia.DesignerSupport.dll",
+ "ref/net8.0/Avalonia.DesignerSupport.xml",
+ "ref/net8.0/Avalonia.Dialogs.dll",
+ "ref/net8.0/Avalonia.Dialogs.xml",
+ "ref/net8.0/Avalonia.Markup.Xaml.dll",
+ "ref/net8.0/Avalonia.Markup.Xaml.xml",
+ "ref/net8.0/Avalonia.Markup.dll",
+ "ref/net8.0/Avalonia.Markup.xml",
+ "ref/net8.0/Avalonia.Metal.dll",
+ "ref/net8.0/Avalonia.Metal.xml",
+ "ref/net8.0/Avalonia.MicroCom.dll",
+ "ref/net8.0/Avalonia.MicroCom.xml",
+ "ref/net8.0/Avalonia.OpenGL.dll",
+ "ref/net8.0/Avalonia.OpenGL.xml",
+ "ref/net8.0/Avalonia.Vulkan.dll",
+ "ref/net8.0/Avalonia.Vulkan.xml",
+ "ref/net8.0/Avalonia.dll",
+ "ref/net8.0/Avalonia.xml",
+ "ref/netstandard2.0/Avalonia.Base.dll",
+ "ref/netstandard2.0/Avalonia.Base.xml",
+ "ref/netstandard2.0/Avalonia.Controls.dll",
+ "ref/netstandard2.0/Avalonia.Controls.xml",
+ "ref/netstandard2.0/Avalonia.DesignerSupport.dll",
+ "ref/netstandard2.0/Avalonia.DesignerSupport.xml",
+ "ref/netstandard2.0/Avalonia.Dialogs.dll",
+ "ref/netstandard2.0/Avalonia.Dialogs.xml",
+ "ref/netstandard2.0/Avalonia.Markup.Xaml.dll",
+ "ref/netstandard2.0/Avalonia.Markup.Xaml.xml",
+ "ref/netstandard2.0/Avalonia.Markup.dll",
+ "ref/netstandard2.0/Avalonia.Markup.xml",
+ "ref/netstandard2.0/Avalonia.Metal.dll",
+ "ref/netstandard2.0/Avalonia.Metal.xml",
+ "ref/netstandard2.0/Avalonia.MicroCom.dll",
+ "ref/netstandard2.0/Avalonia.MicroCom.xml",
+ "ref/netstandard2.0/Avalonia.OpenGL.dll",
+ "ref/netstandard2.0/Avalonia.OpenGL.xml",
+ "ref/netstandard2.0/Avalonia.Vulkan.dll",
+ "ref/netstandard2.0/Avalonia.Vulkan.xml",
+ "ref/netstandard2.0/Avalonia.dll",
+ "ref/netstandard2.0/Avalonia.xml",
+ "tools/net461/designer/Avalonia.Designer.HostApp.exe",
+ "tools/netstandard2.0/Avalonia.Build.Tasks.dll",
+ "tools/netstandard2.0/designer/Avalonia.Designer.HostApp.dll"
+ ]
+ },
+ "Avalonia.Angle.Windows.Natives/2.1.25547.20250602": {
+ "sha512": "ZL0VLc4s9rvNNFt19Pxm5UNAkmKNylugAwJPX9ulXZ6JWs/l6XZihPWWTyezaoNOVyEPU8YbURtW7XMAtqXH5A==",
+ "type": "package",
+ "path": "avalonia.angle.windows.natives/2.1.25547.20250602",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "Icon.png",
+ "LICENSE",
+ "avalonia.angle.windows.natives.2.1.25547.20250602.nupkg.sha512",
+ "avalonia.angle.windows.natives.nuspec",
+ "runtimes/win-arm64/native/av_libglesv2.dll",
+ "runtimes/win-x64/native/av_libglesv2.dll",
+ "runtimes/win-x86/native/av_libglesv2.dll"
+ ]
+ },
+ "Avalonia.BuildServices/0.0.31": {
+ "sha512": "KmCN6Hc+45q4OnF10ge450yVUvWuxU6bdQiyKqiSvrHKpahNrEdk0kG6Ip6GHk2SKOCttGQuA206JVdkldEENg==",
+ "type": "package",
+ "path": "avalonia.buildservices/0.0.31",
+ "hasTools": true,
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "Icon.png",
+ "avalonia.buildservices.0.0.31.nupkg.sha512",
+ "avalonia.buildservices.nuspec",
+ "build/Avalonia.BuildServices.targets",
+ "buildTransitive/Avalonia.BuildServices.targets",
+ "tools/netstandard2.0/Avalonia.BuildServices.Collector.dll",
+ "tools/netstandard2.0/Avalonia.BuildServices.dll",
+ "tools/netstandard2.0/runtimeconfig.json"
+ ]
+ },
+ "Avalonia.Controls.ColorPicker/11.3.2": {
+ "sha512": "K72rpZb6nSDuKZtcj1cfIAqpTkduff3Ng3+O22MxKhmmRDcFO0GAz7kwEArbtJTC4SNlSezaCyx6XMdNvaMcPA==",
+ "type": "package",
+ "path": "avalonia.controls.colorpicker/11.3.2",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "Icon.png",
+ "avalonia.controls.colorpicker.11.3.2.nupkg.sha512",
+ "avalonia.controls.colorpicker.nuspec",
+ "lib/net6.0/Avalonia.Controls.ColorPicker.dll",
+ "lib/net6.0/Avalonia.Controls.ColorPicker.xml",
+ "lib/net8.0/Avalonia.Controls.ColorPicker.dll",
+ "lib/net8.0/Avalonia.Controls.ColorPicker.xml",
+ "lib/netstandard2.0/Avalonia.Controls.ColorPicker.dll",
+ "lib/netstandard2.0/Avalonia.Controls.ColorPicker.xml"
+ ]
+ },
+ "Avalonia.Desktop/11.3.2": {
+ "sha512": "b2ZPZ60UN0Uib3ZxFrf+ixYiJTBFaXrpQAcXTSUKTDw0nAU29sbfjvdtpBkBd6+idWpNtI+GhOjf0Mw0v1ncQg==",
+ "type": "package",
+ "path": "avalonia.desktop/11.3.2",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "Icon.png",
+ "avalonia.desktop.11.3.2.nupkg.sha512",
+ "avalonia.desktop.nuspec",
+ "lib/net6.0/Avalonia.Desktop.dll",
+ "lib/net6.0/Avalonia.Desktop.xml",
+ "lib/net8.0/Avalonia.Desktop.dll",
+ "lib/net8.0/Avalonia.Desktop.xml",
+ "lib/netstandard2.0/Avalonia.Desktop.dll",
+ "lib/netstandard2.0/Avalonia.Desktop.xml"
+ ]
+ },
+ "Avalonia.Diagnostics/11.3.2": {
+ "sha512": "3f4+uGJTrBCY9mxMy7690s8WKqyF4I29VFEUSASV5nVX6kyv/d1+OHBNd0GMyuyPOf+eEEA1ylNSHhRCw3jsvw==",
+ "type": "package",
+ "path": "avalonia.diagnostics/11.3.2",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "Icon.png",
+ "avalonia.diagnostics.11.3.2.nupkg.sha512",
+ "avalonia.diagnostics.nuspec",
+ "lib/net6.0/Avalonia.Diagnostics.dll",
+ "lib/net6.0/Avalonia.Diagnostics.xml",
+ "lib/net8.0/Avalonia.Diagnostics.dll",
+ "lib/net8.0/Avalonia.Diagnostics.xml",
+ "lib/netstandard2.0/Avalonia.Diagnostics.dll",
+ "lib/netstandard2.0/Avalonia.Diagnostics.xml"
+ ]
+ },
+ "Avalonia.Fonts.Inter/11.3.2": {
+ "sha512": "gOijv2Tu8w6XurxYWSC4OdFycYbDooZfTcETXEx45syl710wpG+0aEHNFGlQyyOqqxGQHFbqxxwX6GxumD8b/g==",
+ "type": "package",
+ "path": "avalonia.fonts.inter/11.3.2",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "Icon.png",
+ "avalonia.fonts.inter.11.3.2.nupkg.sha512",
+ "avalonia.fonts.inter.nuspec",
+ "lib/net6.0/Avalonia.Fonts.Inter.dll",
+ "lib/net6.0/Avalonia.Fonts.Inter.xml",
+ "lib/net8.0/Avalonia.Fonts.Inter.dll",
+ "lib/net8.0/Avalonia.Fonts.Inter.xml",
+ "lib/netstandard2.0/Avalonia.Fonts.Inter.dll",
+ "lib/netstandard2.0/Avalonia.Fonts.Inter.xml"
+ ]
+ },
+ "Avalonia.FreeDesktop/11.3.2": {
+ "sha512": "8laGOvPM83kB4xUqXGIRxN61Q5Ux/97URL7CU2Dizh4Nm7Ydj9+urKLTylk6dxWG7kZlo4e4k9G2aVUPkxTBGA==",
+ "type": "package",
+ "path": "avalonia.freedesktop/11.3.2",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "Icon.png",
+ "avalonia.freedesktop.11.3.2.nupkg.sha512",
+ "avalonia.freedesktop.nuspec",
+ "lib/net6.0/Avalonia.FreeDesktop.dll",
+ "lib/net6.0/Avalonia.FreeDesktop.xml",
+ "lib/net8.0/Avalonia.FreeDesktop.dll",
+ "lib/net8.0/Avalonia.FreeDesktop.xml",
+ "lib/netstandard2.0/Avalonia.FreeDesktop.dll",
+ "lib/netstandard2.0/Avalonia.FreeDesktop.xml"
+ ]
+ },
+ "Avalonia.Native/11.3.2": {
+ "sha512": "dv3PVUcClxeDlNSoBjTdNuRYXdbzT3BgtpjEX/fv3pVreKfbh39wWQ+n4ecGh0FUKIlcj0X8BEaQ83t5eRsLnA==",
+ "type": "package",
+ "path": "avalonia.native/11.3.2",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "Icon.png",
+ "avalonia.native.11.3.2.nupkg.sha512",
+ "avalonia.native.nuspec",
+ "lib/net6.0/Avalonia.Native.dll",
+ "lib/net6.0/Avalonia.Native.xml",
+ "lib/net8.0/Avalonia.Native.dll",
+ "lib/net8.0/Avalonia.Native.xml",
+ "lib/netstandard2.0/Avalonia.Native.dll",
+ "lib/netstandard2.0/Avalonia.Native.xml",
+ "runtimes/osx/native/libAvaloniaNative.dylib"
+ ]
+ },
+ "Avalonia.Remote.Protocol/11.3.2": {
+ "sha512": "my6aXePR+N7tl3xDKdYNH2ZFZWUSNmyeU37HIgYJX2fQ4IOBv7SeaWBEd1F/qVsIbOlYxaqE7qOPfeFFtdYq/A==",
+ "type": "package",
+ "path": "avalonia.remote.protocol/11.3.2",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "Icon.png",
+ "avalonia.remote.protocol.11.3.2.nupkg.sha512",
+ "avalonia.remote.protocol.nuspec",
+ "lib/net6.0/Avalonia.Remote.Protocol.dll",
+ "lib/net6.0/Avalonia.Remote.Protocol.xml",
+ "lib/net8.0/Avalonia.Remote.Protocol.dll",
+ "lib/net8.0/Avalonia.Remote.Protocol.xml",
+ "lib/netstandard2.0/Avalonia.Remote.Protocol.dll",
+ "lib/netstandard2.0/Avalonia.Remote.Protocol.xml"
+ ]
+ },
+ "Avalonia.Skia/11.3.2": {
+ "sha512": "PJIPSqkWbQpKyWPMEIDAWYQaJ8xpJASg2H75sGWCkthLj+mCG/DZxdHI6UsDAcxKu/ppSRkX88RGo117bRYfFg==",
+ "type": "package",
+ "path": "avalonia.skia/11.3.2",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "Icon.png",
+ "avalonia.skia.11.3.2.nupkg.sha512",
+ "avalonia.skia.nuspec",
+ "lib/net6.0/Avalonia.Skia.dll",
+ "lib/net6.0/Avalonia.Skia.xml",
+ "lib/net8.0/Avalonia.Skia.dll",
+ "lib/net8.0/Avalonia.Skia.xml",
+ "lib/netstandard2.0/Avalonia.Skia.dll",
+ "lib/netstandard2.0/Avalonia.Skia.xml"
+ ]
+ },
+ "Avalonia.Themes.Fluent/11.3.2": {
+ "sha512": "aRCCmFSumpHJOxsXbdUUc/AaJ/O1HLggfvSxtXYm84QCutuP4OCqgxP9Pka1hb1+2e/TQxfNqM/6KRKPt4SaRg==",
+ "type": "package",
+ "path": "avalonia.themes.fluent/11.3.2",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "Icon.png",
+ "avalonia.themes.fluent.11.3.2.nupkg.sha512",
+ "avalonia.themes.fluent.nuspec",
+ "lib/net6.0/Avalonia.Themes.Fluent.dll",
+ "lib/net6.0/Avalonia.Themes.Fluent.xml",
+ "lib/net8.0/Avalonia.Themes.Fluent.dll",
+ "lib/net8.0/Avalonia.Themes.Fluent.xml",
+ "lib/netstandard2.0/Avalonia.Themes.Fluent.dll",
+ "lib/netstandard2.0/Avalonia.Themes.Fluent.xml"
+ ]
+ },
+ "Avalonia.Themes.Simple/11.3.2": {
+ "sha512": "0TnR6vVS5qStClhG0T9i5Q7jSlZxqrpBxzBb7HPzNqe8dkNfM6VTN38J82sggvZAVddqSc3XRrB+VgheChxKQw==",
+ "type": "package",
+ "path": "avalonia.themes.simple/11.3.2",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "Icon.png",
+ "avalonia.themes.simple.11.3.2.nupkg.sha512",
+ "avalonia.themes.simple.nuspec",
+ "lib/net6.0/Avalonia.Themes.Simple.dll",
+ "lib/net6.0/Avalonia.Themes.Simple.xml",
+ "lib/net8.0/Avalonia.Themes.Simple.dll",
+ "lib/net8.0/Avalonia.Themes.Simple.xml",
+ "lib/netstandard2.0/Avalonia.Themes.Simple.dll",
+ "lib/netstandard2.0/Avalonia.Themes.Simple.xml"
+ ]
+ },
+ "Avalonia.Win32/11.3.2": {
+ "sha512": "CpM6zBwDwMFKw9/iyj0d8jxXKLZena/HFblS9Oc7BmLH8qxe8icr7ZBI5rElebrxDA5O590dAtfWdtOvB1/AZQ==",
+ "type": "package",
+ "path": "avalonia.win32/11.3.2",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "Icon.png",
+ "avalonia.win32.11.3.2.nupkg.sha512",
+ "avalonia.win32.nuspec",
+ "lib/net6.0/Avalonia.Win32.Automation.dll",
+ "lib/net6.0/Avalonia.Win32.Automation.xml",
+ "lib/net6.0/Avalonia.Win32.dll",
+ "lib/net6.0/Avalonia.Win32.xml",
+ "lib/net8.0/Avalonia.Win32.Automation.dll",
+ "lib/net8.0/Avalonia.Win32.Automation.xml",
+ "lib/net8.0/Avalonia.Win32.dll",
+ "lib/net8.0/Avalonia.Win32.xml",
+ "lib/netstandard2.0/Avalonia.Win32.Automation.dll",
+ "lib/netstandard2.0/Avalonia.Win32.Automation.xml",
+ "lib/netstandard2.0/Avalonia.Win32.dll",
+ "lib/netstandard2.0/Avalonia.Win32.xml"
+ ]
+ },
+ "Avalonia.X11/11.3.2": {
+ "sha512": "MEMXOIaAr6jMtl9BhJ8sj7Vz+z19dWfcryWksV35LsolQhQmjmzJPVcCppdnvm5HxkohUXB1qN1RqWN1cqRwBQ==",
+ "type": "package",
+ "path": "avalonia.x11/11.3.2",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "Icon.png",
+ "avalonia.x11.11.3.2.nupkg.sha512",
+ "avalonia.x11.nuspec",
+ "lib/net6.0/Avalonia.X11.dll",
+ "lib/net6.0/Avalonia.X11.xml",
+ "lib/net8.0/Avalonia.X11.dll",
+ "lib/net8.0/Avalonia.X11.xml",
+ "lib/netstandard2.0/Avalonia.X11.dll",
+ "lib/netstandard2.0/Avalonia.X11.xml"
+ ]
+ },
+ "CommunityToolkit.Mvvm/8.2.1": {
+ "sha512": "I24ofWVEdplxYjUez9/bljv/qb8r8Ccj6cvYXHexNBegLaD3iDy3QrzAAOYVMmfGWIXxlU1ZtECQNfU07+6hXQ==",
+ "type": "package",
+ "path": "communitytoolkit.mvvm/8.2.1",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "Icon.png",
+ "License.md",
+ "ThirdPartyNotices.txt",
+ "analyzers/dotnet/roslyn4.0/cs/CommunityToolkit.Mvvm.CodeFixers.dll",
+ "analyzers/dotnet/roslyn4.0/cs/CommunityToolkit.Mvvm.SourceGenerators.dll",
+ "analyzers/dotnet/roslyn4.3/cs/CommunityToolkit.Mvvm.CodeFixers.dll",
+ "analyzers/dotnet/roslyn4.3/cs/CommunityToolkit.Mvvm.SourceGenerators.dll",
+ "build/netstandard2.0/CommunityToolkit.Mvvm.targets",
+ "build/netstandard2.1/CommunityToolkit.Mvvm.targets",
+ "buildTransitive/netstandard2.0/CommunityToolkit.Mvvm.targets",
+ "buildTransitive/netstandard2.1/CommunityToolkit.Mvvm.targets",
+ "communitytoolkit.mvvm.8.2.1.nupkg.sha512",
+ "communitytoolkit.mvvm.nuspec",
+ "lib/net6.0/CommunityToolkit.Mvvm.dll",
+ "lib/net6.0/CommunityToolkit.Mvvm.pdb",
+ "lib/net6.0/CommunityToolkit.Mvvm.xml",
+ "lib/netstandard2.0/CommunityToolkit.Mvvm.dll",
+ "lib/netstandard2.0/CommunityToolkit.Mvvm.pdb",
+ "lib/netstandard2.0/CommunityToolkit.Mvvm.xml",
+ "lib/netstandard2.1/CommunityToolkit.Mvvm.dll",
+ "lib/netstandard2.1/CommunityToolkit.Mvvm.pdb",
+ "lib/netstandard2.1/CommunityToolkit.Mvvm.xml"
+ ]
+ },
+ "HarfBuzzSharp/8.3.1.1": {
+ "sha512": "tLZN66oe/uiRPTZfrCU4i8ScVGwqHNh5MHrXj0yVf4l7Mz0FhTGnQ71RGySROTmdognAs0JtluHkL41pIabWuQ==",
+ "type": "package",
+ "path": "harfbuzzsharp/8.3.1.1",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "LICENSE.txt",
+ "README.md",
+ "harfbuzzsharp.8.3.1.1.nupkg.sha512",
+ "harfbuzzsharp.nuspec",
+ "icon.png",
+ "lib/net462/HarfBuzzSharp.dll",
+ "lib/net462/HarfBuzzSharp.pdb",
+ "lib/net6.0/HarfBuzzSharp.dll",
+ "lib/net6.0/HarfBuzzSharp.pdb",
+ "lib/net8.0-android34.0/HarfBuzzSharp.dll",
+ "lib/net8.0-android34.0/HarfBuzzSharp.pdb",
+ "lib/net8.0-android34.0/HarfBuzzSharp.xml",
+ "lib/net8.0-ios17.0/HarfBuzzSharp.dll",
+ "lib/net8.0-ios17.0/HarfBuzzSharp.pdb",
+ "lib/net8.0-maccatalyst17.0/HarfBuzzSharp.dll",
+ "lib/net8.0-maccatalyst17.0/HarfBuzzSharp.pdb",
+ "lib/net8.0-macos14.0/HarfBuzzSharp.dll",
+ "lib/net8.0-macos14.0/HarfBuzzSharp.pdb",
+ "lib/net8.0-tizen7.0/HarfBuzzSharp.dll",
+ "lib/net8.0-tizen7.0/HarfBuzzSharp.pdb",
+ "lib/net8.0-tvos17.0/HarfBuzzSharp.dll",
+ "lib/net8.0-tvos17.0/HarfBuzzSharp.pdb",
+ "lib/net8.0-windows10.0.19041/HarfBuzzSharp.dll",
+ "lib/net8.0-windows10.0.19041/HarfBuzzSharp.pdb",
+ "lib/net8.0/HarfBuzzSharp.dll",
+ "lib/net8.0/HarfBuzzSharp.pdb",
+ "lib/netstandard2.0/HarfBuzzSharp.dll",
+ "lib/netstandard2.0/HarfBuzzSharp.pdb",
+ "lib/netstandard2.1/HarfBuzzSharp.dll",
+ "lib/netstandard2.1/HarfBuzzSharp.pdb"
+ ]
+ },
+ "HarfBuzzSharp.NativeAssets.Linux/8.3.1.1": {
+ "sha512": "3EZ1mpIiKWRLL5hUYA82ZHteeDIVaEA/Z0rA/wU6tjx6crcAkJnBPwDXZugBSfo8+J3EznvRJf49uMsqYfKrHg==",
+ "type": "package",
+ "path": "harfbuzzsharp.nativeassets.linux/8.3.1.1",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "LICENSE.txt",
+ "README.md",
+ "THIRD-PARTY-NOTICES.txt",
+ "buildTransitive/net462/HarfBuzzSharp.NativeAssets.Linux.targets",
+ "harfbuzzsharp.nativeassets.linux.8.3.1.1.nupkg.sha512",
+ "harfbuzzsharp.nativeassets.linux.nuspec",
+ "icon.png",
+ "lib/net462/_._",
+ "lib/net6.0/_._",
+ "lib/net8.0/_._",
+ "lib/netstandard2.0/_._",
+ "lib/netstandard2.1/_._",
+ "runtimes/linux-arm/native/libHarfBuzzSharp.so",
+ "runtimes/linux-arm64/native/libHarfBuzzSharp.so",
+ "runtimes/linux-loongarch64/native/libHarfBuzzSharp.so",
+ "runtimes/linux-musl-arm/native/libHarfBuzzSharp.so",
+ "runtimes/linux-musl-arm64/native/libHarfBuzzSharp.so",
+ "runtimes/linux-musl-loongarch64/native/libHarfBuzzSharp.so",
+ "runtimes/linux-musl-riscv64/native/libHarfBuzzSharp.so",
+ "runtimes/linux-musl-x64/native/libHarfBuzzSharp.so",
+ "runtimes/linux-riscv64/native/libHarfBuzzSharp.so",
+ "runtimes/linux-x64/native/libHarfBuzzSharp.so",
+ "runtimes/linux-x86/native/libHarfBuzzSharp.so"
+ ]
+ },
+ "HarfBuzzSharp.NativeAssets.macOS/8.3.1.1": {
+ "sha512": "jbtCsgftcaFLCA13tVKo5iWdElJScrulLTKJre36O4YQTIlwDtPPqhRZNk+Y0vv4D1gxbscasGRucUDfS44ofQ==",
+ "type": "package",
+ "path": "harfbuzzsharp.nativeassets.macos/8.3.1.1",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "LICENSE.txt",
+ "README.md",
+ "THIRD-PARTY-NOTICES.txt",
+ "buildTransitive/net462/HarfBuzzSharp.NativeAssets.macOS.targets",
+ "buildTransitive/net8.0-macos14.0/HarfBuzzSharp.NativeAssets.macOS.targets",
+ "harfbuzzsharp.nativeassets.macos.8.3.1.1.nupkg.sha512",
+ "harfbuzzsharp.nativeassets.macos.nuspec",
+ "icon.png",
+ "lib/net462/_._",
+ "lib/net6.0/_._",
+ "lib/net8.0-macos14.0/_._",
+ "lib/net8.0/_._",
+ "lib/netstandard2.0/_._",
+ "lib/netstandard2.1/_._",
+ "runtimes/osx/native/libHarfBuzzSharp.dylib"
+ ]
+ },
+ "HarfBuzzSharp.NativeAssets.WebAssembly/8.3.1.1": {
+ "sha512": "loJweK2u/mH/3C2zBa0ggJlITIszOkK64HLAZB7FUT670dTg965whLFYHDQo69NmC4+d9UN0icLC9VHidXaVCA==",
+ "type": "package",
+ "path": "harfbuzzsharp.nativeassets.webassembly/8.3.1.1",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "LICENSE.txt",
+ "README.md",
+ "THIRD-PARTY-NOTICES.txt",
+ "buildTransitive/netstandard1.0/HarfBuzzSharp.NativeAssets.WebAssembly.props",
+ "buildTransitive/netstandard1.0/HarfBuzzSharp.NativeAssets.WebAssembly.targets",
+ "buildTransitive/netstandard1.0/libHarfBuzzSharp.a/2.0.23/libHarfBuzzSharp.a",
+ "buildTransitive/netstandard1.0/libHarfBuzzSharp.a/2.0.6/libHarfBuzzSharp.a",
+ "buildTransitive/netstandard1.0/libHarfBuzzSharp.a/3.1.12/mt,simd/libHarfBuzzSharp.a",
+ "buildTransitive/netstandard1.0/libHarfBuzzSharp.a/3.1.12/mt/libHarfBuzzSharp.a",
+ "buildTransitive/netstandard1.0/libHarfBuzzSharp.a/3.1.12/st,simd/libHarfBuzzSharp.a",
+ "buildTransitive/netstandard1.0/libHarfBuzzSharp.a/3.1.12/st/libHarfBuzzSharp.a",
+ "buildTransitive/netstandard1.0/libHarfBuzzSharp.a/3.1.34/mt,simd/libHarfBuzzSharp.a",
+ "buildTransitive/netstandard1.0/libHarfBuzzSharp.a/3.1.34/mt/libHarfBuzzSharp.a",
+ "buildTransitive/netstandard1.0/libHarfBuzzSharp.a/3.1.34/st,simd/libHarfBuzzSharp.a",
+ "buildTransitive/netstandard1.0/libHarfBuzzSharp.a/3.1.34/st/libHarfBuzzSharp.a",
+ "buildTransitive/netstandard1.0/libHarfBuzzSharp.a/3.1.56/mt,simd/libHarfBuzzSharp.a",
+ "buildTransitive/netstandard1.0/libHarfBuzzSharp.a/3.1.56/mt/libHarfBuzzSharp.a",
+ "buildTransitive/netstandard1.0/libHarfBuzzSharp.a/3.1.56/st,simd/libHarfBuzzSharp.a",
+ "buildTransitive/netstandard1.0/libHarfBuzzSharp.a/3.1.56/st/libHarfBuzzSharp.a",
+ "buildTransitive/netstandard1.0/libHarfBuzzSharp.a/3.1.7/libHarfBuzzSharp.a",
+ "harfbuzzsharp.nativeassets.webassembly.8.3.1.1.nupkg.sha512",
+ "harfbuzzsharp.nativeassets.webassembly.nuspec",
+ "icon.png",
+ "lib/net462/_._",
+ "lib/net6.0/_._",
+ "lib/net8.0/_._",
+ "lib/netstandard2.0/_._",
+ "lib/netstandard2.1/_._"
+ ]
+ },
+ "HarfBuzzSharp.NativeAssets.Win32/8.3.1.1": {
+ "sha512": "UsJtQsfAJoFDZrXc4hCUfRPMqccfKZ0iumJ/upcUjz/cmsTgVFGNEL5yaJWmkqsuFYdMWbj/En5/kS4PFl9hBA==",
+ "type": "package",
+ "path": "harfbuzzsharp.nativeassets.win32/8.3.1.1",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "LICENSE.txt",
+ "README.md",
+ "THIRD-PARTY-NOTICES.txt",
+ "buildTransitive/net462/HarfBuzzSharp.NativeAssets.Win32.targets",
+ "harfbuzzsharp.nativeassets.win32.8.3.1.1.nupkg.sha512",
+ "harfbuzzsharp.nativeassets.win32.nuspec",
+ "icon.png",
+ "lib/net462/_._",
+ "lib/net6.0-windows10.0.19041/_._",
+ "lib/net6.0/_._",
+ "lib/net8.0-windows10.0.19041/_._",
+ "lib/net8.0/_._",
+ "lib/netstandard2.0/_._",
+ "lib/netstandard2.1/_._",
+ "runtimes/win-arm64/native/libHarfBuzzSharp.dll",
+ "runtimes/win-x64/native/libHarfBuzzSharp.dll",
+ "runtimes/win-x86/native/libHarfBuzzSharp.dll"
+ ]
+ },
+ "MicroCom.Runtime/0.11.0": {
+ "sha512": "MEnrZ3UIiH40hjzMDsxrTyi8dtqB5ziv3iBeeU4bXsL/7NLSal9F1lZKpK+tfBRnUoDSdtcW3KufE4yhATOMCA==",
+ "type": "package",
+ "path": "microcom.runtime/0.11.0",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "lib/net5.0/MicroCom.Runtime.dll",
+ "lib/netstandard2.0/MicroCom.Runtime.dll",
+ "microcom.runtime.0.11.0.nupkg.sha512",
+ "microcom.runtime.nuspec"
+ ]
+ },
+ "SkiaSharp/2.88.9": {
+ "sha512": "3MD5VHjXXieSHCleRLuaTXmL2pD0mB7CcOB1x2kA1I4bhptf4e3R27iM93264ZYuAq6mkUyX5XbcxnZvMJYc1Q==",
+ "type": "package",
+ "path": "skiasharp/2.88.9",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "LICENSE.txt",
+ "THIRD-PARTY-NOTICES.txt",
+ "interactive-extensions/dotnet/SkiaSharp.DotNet.Interactive.dll",
+ "lib/monoandroid1.0/SkiaSharp.dll",
+ "lib/monoandroid1.0/SkiaSharp.pdb",
+ "lib/monoandroid1.0/SkiaSharp.xml",
+ "lib/net462/SkiaSharp.dll",
+ "lib/net462/SkiaSharp.pdb",
+ "lib/net462/SkiaSharp.xml",
+ "lib/net6.0-android30.0/SkiaSharp.dll",
+ "lib/net6.0-android30.0/SkiaSharp.pdb",
+ "lib/net6.0-android30.0/SkiaSharp.xml",
+ "lib/net6.0-ios13.6/SkiaSharp.dll",
+ "lib/net6.0-ios13.6/SkiaSharp.pdb",
+ "lib/net6.0-ios13.6/SkiaSharp.xml",
+ "lib/net6.0-maccatalyst13.5/SkiaSharp.dll",
+ "lib/net6.0-maccatalyst13.5/SkiaSharp.pdb",
+ "lib/net6.0-maccatalyst13.5/SkiaSharp.xml",
+ "lib/net6.0-macos10.15/SkiaSharp.dll",
+ "lib/net6.0-macos10.15/SkiaSharp.pdb",
+ "lib/net6.0-macos10.15/SkiaSharp.xml",
+ "lib/net6.0-tizen7.0/SkiaSharp.dll",
+ "lib/net6.0-tizen7.0/SkiaSharp.pdb",
+ "lib/net6.0-tizen7.0/SkiaSharp.xml",
+ "lib/net6.0-tvos13.4/SkiaSharp.dll",
+ "lib/net6.0-tvos13.4/SkiaSharp.pdb",
+ "lib/net6.0-tvos13.4/SkiaSharp.xml",
+ "lib/net6.0/SkiaSharp.dll",
+ "lib/net6.0/SkiaSharp.pdb",
+ "lib/net6.0/SkiaSharp.xml",
+ "lib/netcoreapp3.1/SkiaSharp.dll",
+ "lib/netcoreapp3.1/SkiaSharp.pdb",
+ "lib/netcoreapp3.1/SkiaSharp.xml",
+ "lib/netstandard1.3/SkiaSharp.dll",
+ "lib/netstandard1.3/SkiaSharp.pdb",
+ "lib/netstandard1.3/SkiaSharp.xml",
+ "lib/netstandard2.0/SkiaSharp.dll",
+ "lib/netstandard2.0/SkiaSharp.pdb",
+ "lib/netstandard2.0/SkiaSharp.xml",
+ "lib/netstandard2.1/SkiaSharp.dll",
+ "lib/netstandard2.1/SkiaSharp.pdb",
+ "lib/netstandard2.1/SkiaSharp.xml",
+ "lib/tizen40/SkiaSharp.dll",
+ "lib/tizen40/SkiaSharp.pdb",
+ "lib/tizen40/SkiaSharp.xml",
+ "lib/uap10.0.10240/SkiaSharp.dll",
+ "lib/uap10.0.10240/SkiaSharp.pdb",
+ "lib/uap10.0.10240/SkiaSharp.xml",
+ "lib/uap10.0.16299/SkiaSharp.dll",
+ "lib/uap10.0.16299/SkiaSharp.pdb",
+ "lib/uap10.0.16299/SkiaSharp.xml",
+ "lib/xamarinios1.0/SkiaSharp.dll",
+ "lib/xamarinios1.0/SkiaSharp.pdb",
+ "lib/xamarinios1.0/SkiaSharp.xml",
+ "lib/xamarinmac2.0/SkiaSharp.dll",
+ "lib/xamarinmac2.0/SkiaSharp.pdb",
+ "lib/xamarinmac2.0/SkiaSharp.xml",
+ "lib/xamarintvos1.0/SkiaSharp.dll",
+ "lib/xamarintvos1.0/SkiaSharp.pdb",
+ "lib/xamarintvos1.0/SkiaSharp.xml",
+ "lib/xamarinwatchos1.0/SkiaSharp.dll",
+ "lib/xamarinwatchos1.0/SkiaSharp.pdb",
+ "lib/xamarinwatchos1.0/SkiaSharp.xml",
+ "skiasharp.2.88.9.nupkg.sha512",
+ "skiasharp.nuspec"
+ ]
+ },
+ "SkiaSharp.NativeAssets.Linux/2.88.9": {
+ "sha512": "cWSaJKVPWAaT/WIn9c8T5uT/l4ETwHxNJTkEOtNKjphNo8AW6TF9O32aRkxqw3l8GUdUo66Bu7EiqtFh/XG0Zg==",
+ "type": "package",
+ "path": "skiasharp.nativeassets.linux/2.88.9",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "LICENSE.txt",
+ "THIRD-PARTY-NOTICES.txt",
+ "build/net462/SkiaSharp.NativeAssets.Linux.targets",
+ "buildTransitive/net462/SkiaSharp.NativeAssets.Linux.targets",
+ "lib/net462/_._",
+ "lib/net6.0/_._",
+ "lib/netcoreapp3.1/_._",
+ "lib/netstandard1.3/_._",
+ "runtimes/linux-arm/native/libSkiaSharp.so",
+ "runtimes/linux-arm64/native/libSkiaSharp.so",
+ "runtimes/linux-musl-x64/native/libSkiaSharp.so",
+ "runtimes/linux-x64/native/libSkiaSharp.so",
+ "skiasharp.nativeassets.linux.2.88.9.nupkg.sha512",
+ "skiasharp.nativeassets.linux.nuspec"
+ ]
+ },
+ "SkiaSharp.NativeAssets.macOS/2.88.9": {
+ "sha512": "Nv5spmKc4505Ep7oUoJ5vp3KweFpeNqxpyGDWyeEPTX2uR6S6syXIm3gj75dM0YJz7NPvcix48mR5laqs8dPuA==",
+ "type": "package",
+ "path": "skiasharp.nativeassets.macos/2.88.9",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "LICENSE.txt",
+ "THIRD-PARTY-NOTICES.txt",
+ "build/net462/SkiaSharp.NativeAssets.macOS.targets",
+ "build/net6.0-macos10.15/SkiaSharp.NativeAssets.macOS.targets",
+ "build/xamarinmac2.0/SkiaSharp.NativeAssets.macOS.targets",
+ "buildTransitive/net462/SkiaSharp.NativeAssets.macOS.targets",
+ "buildTransitive/net6.0-macos10.15/SkiaSharp.NativeAssets.macOS.targets",
+ "buildTransitive/xamarinmac2.0/SkiaSharp.NativeAssets.macOS.targets",
+ "lib/net462/_._",
+ "lib/net6.0-macos10.15/_._",
+ "lib/net6.0/_._",
+ "lib/netcoreapp3.1/_._",
+ "lib/netstandard1.3/_._",
+ "lib/xamarinmac2.0/_._",
+ "runtimes/osx/native/libSkiaSharp.dylib",
+ "skiasharp.nativeassets.macos.2.88.9.nupkg.sha512",
+ "skiasharp.nativeassets.macos.nuspec"
+ ]
+ },
+ "SkiaSharp.NativeAssets.WebAssembly/2.88.9": {
+ "sha512": "kt06RccBHSnAs2wDYdBSfsjIDbY3EpsOVqnlDgKdgvyuRA8ZFDaHRdWNx1VHjGgYzmnFCGiTJBnXFl5BqGwGnA==",
+ "type": "package",
+ "path": "skiasharp.nativeassets.webassembly/2.88.9",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "LICENSE.txt",
+ "THIRD-PARTY-NOTICES.txt",
+ "build/netstandard1.0/SkiaSharp.NativeAssets.WebAssembly.props",
+ "build/netstandard1.0/SkiaSharp.NativeAssets.WebAssembly.targets",
+ "build/netstandard1.0/libSkiaSharp.a/2.0.23/libSkiaSharp.a",
+ "build/netstandard1.0/libSkiaSharp.a/2.0.6/libSkiaSharp.a",
+ "build/netstandard1.0/libSkiaSharp.a/3.1.12/mt,simd/libSkiaSharp.a",
+ "build/netstandard1.0/libSkiaSharp.a/3.1.12/mt/libSkiaSharp.a",
+ "build/netstandard1.0/libSkiaSharp.a/3.1.12/simd/libSkiaSharp.a",
+ "build/netstandard1.0/libSkiaSharp.a/3.1.12/st/libSkiaSharp.a",
+ "build/netstandard1.0/libSkiaSharp.a/3.1.34/mt/libSkiaSharp.a",
+ "build/netstandard1.0/libSkiaSharp.a/3.1.34/simd,mt/libSkiaSharp.a",
+ "build/netstandard1.0/libSkiaSharp.a/3.1.34/simd,st/libSkiaSharp.a",
+ "build/netstandard1.0/libSkiaSharp.a/3.1.34/st/libSkiaSharp.a",
+ "build/netstandard1.0/libSkiaSharp.a/3.1.56/mt/libSkiaSharp.a",
+ "build/netstandard1.0/libSkiaSharp.a/3.1.56/simd,mt/libSkiaSharp.a",
+ "build/netstandard1.0/libSkiaSharp.a/3.1.56/simd,st/libSkiaSharp.a",
+ "build/netstandard1.0/libSkiaSharp.a/3.1.56/st/libSkiaSharp.a",
+ "build/netstandard1.0/libSkiaSharp.a/3.1.7/libSkiaSharp.a",
+ "buildTransitive/netstandard1.0/SkiaSharp.NativeAssets.WebAssembly.props",
+ "buildTransitive/netstandard1.0/SkiaSharp.NativeAssets.WebAssembly.targets",
+ "lib/netstandard1.0/_._",
+ "skiasharp.nativeassets.webassembly.2.88.9.nupkg.sha512",
+ "skiasharp.nativeassets.webassembly.nuspec"
+ ]
+ },
+ "SkiaSharp.NativeAssets.Win32/2.88.9": {
+ "sha512": "wb2kYgU7iy84nQLYZwMeJXixvK++GoIuECjU4ECaUKNuflyRlJKyiRhN1MAHswvlvzuvkrjRWlK0Za6+kYQK7w==",
+ "type": "package",
+ "path": "skiasharp.nativeassets.win32/2.88.9",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "LICENSE.txt",
+ "THIRD-PARTY-NOTICES.txt",
+ "build/net462/SkiaSharp.NativeAssets.Win32.targets",
+ "buildTransitive/net462/SkiaSharp.NativeAssets.Win32.targets",
+ "lib/net462/_._",
+ "lib/net6.0/_._",
+ "lib/netcoreapp3.1/_._",
+ "lib/netstandard1.3/_._",
+ "runtimes/win-arm64/native/libSkiaSharp.dll",
+ "runtimes/win-x64/native/libSkiaSharp.dll",
+ "runtimes/win-x86/native/libSkiaSharp.dll",
+ "skiasharp.nativeassets.win32.2.88.9.nupkg.sha512",
+ "skiasharp.nativeassets.win32.nuspec"
+ ]
+ },
+ "System.IO.Pipelines/8.0.0": {
+ "sha512": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==",
+ "type": "package",
+ "path": "system.io.pipelines/8.0.0",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "Icon.png",
+ "LICENSE.TXT",
+ "THIRD-PARTY-NOTICES.TXT",
+ "buildTransitive/net461/System.IO.Pipelines.targets",
+ "buildTransitive/net462/_._",
+ "buildTransitive/net6.0/_._",
+ "buildTransitive/netcoreapp2.0/System.IO.Pipelines.targets",
+ "lib/net462/System.IO.Pipelines.dll",
+ "lib/net462/System.IO.Pipelines.xml",
+ "lib/net6.0/System.IO.Pipelines.dll",
+ "lib/net6.0/System.IO.Pipelines.xml",
+ "lib/net7.0/System.IO.Pipelines.dll",
+ "lib/net7.0/System.IO.Pipelines.xml",
+ "lib/net8.0/System.IO.Pipelines.dll",
+ "lib/net8.0/System.IO.Pipelines.xml",
+ "lib/netstandard2.0/System.IO.Pipelines.dll",
+ "lib/netstandard2.0/System.IO.Pipelines.xml",
+ "system.io.pipelines.8.0.0.nupkg.sha512",
+ "system.io.pipelines.nuspec",
+ "useSharedDesignerContext.txt"
+ ]
+ },
+ "Tmds.DBus.Protocol/0.21.2": {
+ "sha512": "ScSMrUrrw8px4kK1Glh0fZv/HQUlg1078bNXNPfRPKQ3WbRzV9HpsydYEOgSoMK5LWICMf2bMwIFH0pGjxjcMA==",
+ "type": "package",
+ "path": "tmds.dbus.protocol/0.21.2",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "lib/net6.0/Tmds.DBus.Protocol.dll",
+ "lib/net8.0/Tmds.DBus.Protocol.dll",
+ "lib/netstandard2.0/Tmds.DBus.Protocol.dll",
+ "lib/netstandard2.1/Tmds.DBus.Protocol.dll",
+ "tmds.dbus.protocol.0.21.2.nupkg.sha512",
+ "tmds.dbus.protocol.nuspec"
+ ]
+ }
+ },
+ "projectFileDependencyGroups": {
+ "net9.0": [
+ "Avalonia >= 11.3.2",
+ "Avalonia.Desktop >= 11.3.2",
+ "Avalonia.Diagnostics >= 11.3.2",
+ "Avalonia.Fonts.Inter >= 11.3.2",
+ "Avalonia.Themes.Fluent >= 11.3.2",
+ "CommunityToolkit.Mvvm >= 8.2.1"
+ ]
+ },
+ "packageFolders": {
+ "C:\\Users\\CatilGrass\\.nuget\\packages\\": {}
+ },
+ "project": {
+ "version": "1.0.0",
+ "restore": {
+ "projectUniqueName": "D:\\rorolala-vcs\\rola-desktop\\rola-desktop.csproj",
+ "projectName": "rola-desktop",
+ "projectPath": "D:\\rorolala-vcs\\rola-desktop\\rola-desktop.csproj",
+ "packagesPath": "C:\\Users\\CatilGrass\\.nuget\\packages\\",
+ "outputPath": "D:\\rorolala-vcs\\rola-desktop\\obj\\",
+ "projectStyle": "PackageReference",
+ "configFilePaths": [
+ "C:\\Users\\CatilGrass\\AppData\\Roaming\\NuGet\\NuGet.Config",
+ "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
+ ],
+ "originalTargetFrameworks": [
+ "net9.0"
+ ],
+ "sources": {
+ "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
+ "https://api.nuget.org/v3/index.json": {}
+ },
+ "frameworks": {
+ "net9.0": {
+ "targetAlias": "net9.0",
+ "projectReferences": {}
+ }
+ },
+ "warningProperties": {
+ "warnAsError": [
+ "NU1605"
+ ]
+ },
+ "restoreAuditProperties": {
+ "enableAudit": "true",
+ "auditLevel": "low",
+ "auditMode": "direct"
+ },
+ "SdkAnalysisLevel": "9.0.300"
+ },
+ "frameworks": {
+ "net9.0": {
+ "targetAlias": "net9.0",
+ "dependencies": {
+ "Avalonia": {
+ "target": "Package",
+ "version": "[11.3.2, )"
+ },
+ "Avalonia.Desktop": {
+ "target": "Package",
+ "version": "[11.3.2, )"
+ },
+ "Avalonia.Diagnostics": {
+ "target": "Package",
+ "version": "[11.3.2, )"
+ },
+ "Avalonia.Fonts.Inter": {
+ "target": "Package",
+ "version": "[11.3.2, )"
+ },
+ "Avalonia.Themes.Fluent": {
+ "target": "Package",
+ "version": "[11.3.2, )"
+ },
+ "CommunityToolkit.Mvvm": {
+ "target": "Package",
+ "version": "[8.2.1, )"
+ }
+ },
+ "imports": [
+ "net461",
+ "net462",
+ "net47",
+ "net471",
+ "net472",
+ "net48",
+ "net481"
+ ],
+ "assetTargetFallback": true,
+ "warn": true,
+ "frameworkReferences": {
+ "Microsoft.NETCore.App": {
+ "privateAssets": "all"
+ }
+ },
+ "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.303/PortableRuntimeIdentifierGraph.json"
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/rola-desktop/obj/project.nuget.cache b/rola-desktop/obj/project.nuget.cache
new file mode 100644
index 0000000..6082b1f
--- /dev/null
+++ b/rola-desktop/obj/project.nuget.cache
@@ -0,0 +1,38 @@
+{
+ "version": 2,
+ "dgSpecHash": "S8+NG6iu9uA=",
+ "success": true,
+ "projectFilePath": "D:\\rorolala-vcs\\rola-desktop\\rola-desktop.csproj",
+ "expectedPackageFiles": [
+ "C:\\Users\\CatilGrass\\.nuget\\packages\\avalonia\\11.3.2\\avalonia.11.3.2.nupkg.sha512",
+ "C:\\Users\\CatilGrass\\.nuget\\packages\\avalonia.angle.windows.natives\\2.1.25547.20250602\\avalonia.angle.windows.natives.2.1.25547.20250602.nupkg.sha512",
+ "C:\\Users\\CatilGrass\\.nuget\\packages\\avalonia.buildservices\\0.0.31\\avalonia.buildservices.0.0.31.nupkg.sha512",
+ "C:\\Users\\CatilGrass\\.nuget\\packages\\avalonia.controls.colorpicker\\11.3.2\\avalonia.controls.colorpicker.11.3.2.nupkg.sha512",
+ "C:\\Users\\CatilGrass\\.nuget\\packages\\avalonia.desktop\\11.3.2\\avalonia.desktop.11.3.2.nupkg.sha512",
+ "C:\\Users\\CatilGrass\\.nuget\\packages\\avalonia.diagnostics\\11.3.2\\avalonia.diagnostics.11.3.2.nupkg.sha512",
+ "C:\\Users\\CatilGrass\\.nuget\\packages\\avalonia.fonts.inter\\11.3.2\\avalonia.fonts.inter.11.3.2.nupkg.sha512",
+ "C:\\Users\\CatilGrass\\.nuget\\packages\\avalonia.freedesktop\\11.3.2\\avalonia.freedesktop.11.3.2.nupkg.sha512",
+ "C:\\Users\\CatilGrass\\.nuget\\packages\\avalonia.native\\11.3.2\\avalonia.native.11.3.2.nupkg.sha512",
+ "C:\\Users\\CatilGrass\\.nuget\\packages\\avalonia.remote.protocol\\11.3.2\\avalonia.remote.protocol.11.3.2.nupkg.sha512",
+ "C:\\Users\\CatilGrass\\.nuget\\packages\\avalonia.skia\\11.3.2\\avalonia.skia.11.3.2.nupkg.sha512",
+ "C:\\Users\\CatilGrass\\.nuget\\packages\\avalonia.themes.fluent\\11.3.2\\avalonia.themes.fluent.11.3.2.nupkg.sha512",
+ "C:\\Users\\CatilGrass\\.nuget\\packages\\avalonia.themes.simple\\11.3.2\\avalonia.themes.simple.11.3.2.nupkg.sha512",
+ "C:\\Users\\CatilGrass\\.nuget\\packages\\avalonia.win32\\11.3.2\\avalonia.win32.11.3.2.nupkg.sha512",
+ "C:\\Users\\CatilGrass\\.nuget\\packages\\avalonia.x11\\11.3.2\\avalonia.x11.11.3.2.nupkg.sha512",
+ "C:\\Users\\CatilGrass\\.nuget\\packages\\communitytoolkit.mvvm\\8.2.1\\communitytoolkit.mvvm.8.2.1.nupkg.sha512",
+ "C:\\Users\\CatilGrass\\.nuget\\packages\\harfbuzzsharp\\8.3.1.1\\harfbuzzsharp.8.3.1.1.nupkg.sha512",
+ "C:\\Users\\CatilGrass\\.nuget\\packages\\harfbuzzsharp.nativeassets.linux\\8.3.1.1\\harfbuzzsharp.nativeassets.linux.8.3.1.1.nupkg.sha512",
+ "C:\\Users\\CatilGrass\\.nuget\\packages\\harfbuzzsharp.nativeassets.macos\\8.3.1.1\\harfbuzzsharp.nativeassets.macos.8.3.1.1.nupkg.sha512",
+ "C:\\Users\\CatilGrass\\.nuget\\packages\\harfbuzzsharp.nativeassets.webassembly\\8.3.1.1\\harfbuzzsharp.nativeassets.webassembly.8.3.1.1.nupkg.sha512",
+ "C:\\Users\\CatilGrass\\.nuget\\packages\\harfbuzzsharp.nativeassets.win32\\8.3.1.1\\harfbuzzsharp.nativeassets.win32.8.3.1.1.nupkg.sha512",
+ "C:\\Users\\CatilGrass\\.nuget\\packages\\microcom.runtime\\0.11.0\\microcom.runtime.0.11.0.nupkg.sha512",
+ "C:\\Users\\CatilGrass\\.nuget\\packages\\skiasharp\\2.88.9\\skiasharp.2.88.9.nupkg.sha512",
+ "C:\\Users\\CatilGrass\\.nuget\\packages\\skiasharp.nativeassets.linux\\2.88.9\\skiasharp.nativeassets.linux.2.88.9.nupkg.sha512",
+ "C:\\Users\\CatilGrass\\.nuget\\packages\\skiasharp.nativeassets.macos\\2.88.9\\skiasharp.nativeassets.macos.2.88.9.nupkg.sha512",
+ "C:\\Users\\CatilGrass\\.nuget\\packages\\skiasharp.nativeassets.webassembly\\2.88.9\\skiasharp.nativeassets.webassembly.2.88.9.nupkg.sha512",
+ "C:\\Users\\CatilGrass\\.nuget\\packages\\skiasharp.nativeassets.win32\\2.88.9\\skiasharp.nativeassets.win32.2.88.9.nupkg.sha512",
+ "C:\\Users\\CatilGrass\\.nuget\\packages\\system.io.pipelines\\8.0.0\\system.io.pipelines.8.0.0.nupkg.sha512",
+ "C:\\Users\\CatilGrass\\.nuget\\packages\\tmds.dbus.protocol\\0.21.2\\tmds.dbus.protocol.0.21.2.nupkg.sha512"
+ ],
+ "logs": []
+} \ No newline at end of file
diff --git a/rola-desktop/obj/rola-desktop.csproj.nuget.dgspec.json b/rola-desktop/obj/rola-desktop.csproj.nuget.dgspec.json
new file mode 100644
index 0000000..a198228
--- /dev/null
+++ b/rola-desktop/obj/rola-desktop.csproj.nuget.dgspec.json
@@ -0,0 +1,95 @@
+{
+ "format": 1,
+ "restore": {
+ "D:\\rorolala-vcs\\rola-desktop\\rola-desktop.csproj": {}
+ },
+ "projects": {
+ "D:\\rorolala-vcs\\rola-desktop\\rola-desktop.csproj": {
+ "version": "1.0.0",
+ "restore": {
+ "projectUniqueName": "D:\\rorolala-vcs\\rola-desktop\\rola-desktop.csproj",
+ "projectName": "rola-desktop",
+ "projectPath": "D:\\rorolala-vcs\\rola-desktop\\rola-desktop.csproj",
+ "packagesPath": "C:\\Users\\CatilGrass\\.nuget\\packages\\",
+ "outputPath": "D:\\rorolala-vcs\\rola-desktop\\obj\\",
+ "projectStyle": "PackageReference",
+ "configFilePaths": [
+ "C:\\Users\\CatilGrass\\AppData\\Roaming\\NuGet\\NuGet.Config",
+ "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
+ ],
+ "originalTargetFrameworks": [
+ "net9.0"
+ ],
+ "sources": {
+ "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
+ "https://api.nuget.org/v3/index.json": {}
+ },
+ "frameworks": {
+ "net9.0": {
+ "targetAlias": "net9.0",
+ "projectReferences": {}
+ }
+ },
+ "warningProperties": {
+ "warnAsError": [
+ "NU1605"
+ ]
+ },
+ "restoreAuditProperties": {
+ "enableAudit": "true",
+ "auditLevel": "low",
+ "auditMode": "direct"
+ },
+ "SdkAnalysisLevel": "9.0.300"
+ },
+ "frameworks": {
+ "net9.0": {
+ "targetAlias": "net9.0",
+ "dependencies": {
+ "Avalonia": {
+ "target": "Package",
+ "version": "[11.3.2, )"
+ },
+ "Avalonia.Desktop": {
+ "target": "Package",
+ "version": "[11.3.2, )"
+ },
+ "Avalonia.Diagnostics": {
+ "target": "Package",
+ "version": "[11.3.2, )"
+ },
+ "Avalonia.Fonts.Inter": {
+ "target": "Package",
+ "version": "[11.3.2, )"
+ },
+ "Avalonia.Themes.Fluent": {
+ "target": "Package",
+ "version": "[11.3.2, )"
+ },
+ "CommunityToolkit.Mvvm": {
+ "target": "Package",
+ "version": "[8.2.1, )"
+ }
+ },
+ "imports": [
+ "net461",
+ "net462",
+ "net47",
+ "net471",
+ "net472",
+ "net48",
+ "net481"
+ ],
+ "assetTargetFallback": true,
+ "warn": true,
+ "frameworkReferences": {
+ "Microsoft.NETCore.App": {
+ "privateAssets": "all"
+ }
+ },
+ "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.303/PortableRuntimeIdentifierGraph.json"
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/rola-desktop/obj/rola-desktop.csproj.nuget.g.props b/rola-desktop/obj/rola-desktop.csproj.nuget.g.props
new file mode 100644
index 0000000..f8f7537
--- /dev/null
+++ b/rola-desktop/obj/rola-desktop.csproj.nuget.g.props
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
+ <RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
+ <RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
+ <ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
+ <NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
+ <NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\CatilGrass\.nuget\packages\</NuGetPackageFolders>
+ <NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
+ <NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.14.0</NuGetToolVersion>
+ </PropertyGroup>
+ <ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
+ <SourceRoot Include="C:\Users\CatilGrass\.nuget\packages\" />
+ </ItemGroup>
+ <ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
+ <Import Project="$(NuGetPackageRoot)skiasharp.nativeassets.webassembly\2.88.9\buildTransitive\netstandard1.0\SkiaSharp.NativeAssets.WebAssembly.props" Condition="Exists('$(NuGetPackageRoot)skiasharp.nativeassets.webassembly\2.88.9\buildTransitive\netstandard1.0\SkiaSharp.NativeAssets.WebAssembly.props')" />
+ <Import Project="$(NuGetPackageRoot)harfbuzzsharp.nativeassets.webassembly\8.3.1.1\buildTransitive\netstandard1.0\HarfBuzzSharp.NativeAssets.WebAssembly.props" Condition="Exists('$(NuGetPackageRoot)harfbuzzsharp.nativeassets.webassembly\8.3.1.1\buildTransitive\netstandard1.0\HarfBuzzSharp.NativeAssets.WebAssembly.props')" />
+ <Import Project="$(NuGetPackageRoot)avalonia\11.3.2\buildTransitive\Avalonia.props" Condition="Exists('$(NuGetPackageRoot)avalonia\11.3.2\buildTransitive\Avalonia.props')" />
+ </ImportGroup>
+ <PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
+ <PkgAvalonia_BuildServices Condition=" '$(PkgAvalonia_BuildServices)' == '' ">C:\Users\CatilGrass\.nuget\packages\avalonia.buildservices\0.0.31</PkgAvalonia_BuildServices>
+ <PkgAvalonia Condition=" '$(PkgAvalonia)' == '' ">C:\Users\CatilGrass\.nuget\packages\avalonia\11.3.2</PkgAvalonia>
+ </PropertyGroup>
+</Project> \ No newline at end of file
diff --git a/rola-desktop/obj/rola-desktop.csproj.nuget.g.targets b/rola-desktop/obj/rola-desktop.csproj.nuget.g.targets
new file mode 100644
index 0000000..8eca98f
--- /dev/null
+++ b/rola-desktop/obj/rola-desktop.csproj.nuget.g.targets
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
+ <Import Project="$(NuGetPackageRoot)skiasharp.nativeassets.webassembly\2.88.9\buildTransitive\netstandard1.0\SkiaSharp.NativeAssets.WebAssembly.targets" Condition="Exists('$(NuGetPackageRoot)skiasharp.nativeassets.webassembly\2.88.9\buildTransitive\netstandard1.0\SkiaSharp.NativeAssets.WebAssembly.targets')" />
+ <Import Project="$(NuGetPackageRoot)harfbuzzsharp.nativeassets.webassembly\8.3.1.1\buildTransitive\netstandard1.0\HarfBuzzSharp.NativeAssets.WebAssembly.targets" Condition="Exists('$(NuGetPackageRoot)harfbuzzsharp.nativeassets.webassembly\8.3.1.1\buildTransitive\netstandard1.0\HarfBuzzSharp.NativeAssets.WebAssembly.targets')" />
+ <Import Project="$(NuGetPackageRoot)communitytoolkit.mvvm\8.2.1\buildTransitive\netstandard2.1\CommunityToolkit.Mvvm.targets" Condition="Exists('$(NuGetPackageRoot)communitytoolkit.mvvm\8.2.1\buildTransitive\netstandard2.1\CommunityToolkit.Mvvm.targets')" />
+ <Import Project="$(NuGetPackageRoot)avalonia.buildservices\0.0.31\buildTransitive\Avalonia.BuildServices.targets" Condition="Exists('$(NuGetPackageRoot)avalonia.buildservices\0.0.31\buildTransitive\Avalonia.BuildServices.targets')" />
+ <Import Project="$(NuGetPackageRoot)avalonia\11.3.2\buildTransitive\Avalonia.targets" Condition="Exists('$(NuGetPackageRoot)avalonia\11.3.2\buildTransitive\Avalonia.targets')" />
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/rola-desktop/rola-desktop.csproj b/rola-desktop/rola-desktop.csproj
new file mode 100644
index 0000000..a1155d6
--- /dev/null
+++ b/rola-desktop/rola-desktop.csproj
@@ -0,0 +1,28 @@
+<Project Sdk="Microsoft.NET.Sdk">
+ <PropertyGroup>
+ <OutputType>WinExe</OutputType>
+ <TargetFramework>net9.0</TargetFramework>
+ <Nullable>enable</Nullable>
+ <BuiltInComInteropSupport>true</BuiltInComInteropSupport>
+ <ApplicationManifest>app.manifest</ApplicationManifest>
+ <AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <Folder Include="Models\" />
+ <AvaloniaResource Include="Assets\**" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <PackageReference Include="Avalonia" Version="11.3.2" />
+ <PackageReference Include="Avalonia.Desktop" Version="11.3.2" />
+ <PackageReference Include="Avalonia.Themes.Fluent" Version="11.3.2" />
+ <PackageReference Include="Avalonia.Fonts.Inter" Version="11.3.2" />
+ <!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
+ <PackageReference Include="Avalonia.Diagnostics" Version="11.3.2">
+ <IncludeAssets Condition="'$(Configuration)' != 'Debug'">None</IncludeAssets>
+ <PrivateAssets Condition="'$(Configuration)' != 'Debug'">All</PrivateAssets>
+ </PackageReference>
+ <PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.1" />
+ </ItemGroup>
+</Project>
diff --git a/rola-utils/functions/Cargo.toml b/rola-utils/functions/Cargo.toml
new file mode 100644
index 0000000..dd482c4
--- /dev/null
+++ b/rola-utils/functions/Cargo.toml
@@ -0,0 +1,8 @@
+[package]
+name = "shared_functions"
+version.workspace = true
+edition.workspace = true
+authors.workspace = true
+license.workspace = true
+
+[dependencies]
diff --git a/rola-utils/functions/src/levenshtein_distance.rs b/rola-utils/functions/src/levenshtein_distance.rs
new file mode 100644
index 0000000..7b8be6c
--- /dev/null
+++ b/rola-utils/functions/src/levenshtein_distance.rs
@@ -0,0 +1,117 @@
+pub struct LevenshteinDistance;
+
+impl LevenshteinDistance {
+ pub fn filter_similar<'a>(str: &str, slice: &[&'a str], threshold: usize) -> Vec<&'a str> {
+ slice
+ .iter()
+ .filter(|s| levenshtein_distance(str, s) <= threshold)
+ .copied()
+ .collect()
+ }
+
+ pub fn compare(a: impl AsRef<str>, b: impl AsRef<str>) -> usize {
+ let a = a.as_ref();
+ let b = b.as_ref();
+ levenshtein_distance(a, b)
+ }
+}
+
+fn levenshtein_distance(a: &str, b: &str) -> usize {
+ let a_chars: Vec<char> = a.chars().collect();
+ let b_chars: Vec<char> = b.chars().collect();
+ let m = a_chars.len();
+ let n = b_chars.len();
+ if m == 0 {
+ return n;
+ }
+ if n == 0 {
+ return m;
+ }
+
+ let mut prev: Vec<usize> = (0..=n).collect();
+ let mut curr = vec![0; n + 1];
+ for (i, ca) in a_chars.iter().enumerate() {
+ curr[0] = i + 1;
+ for (j, cb) in b_chars.iter().enumerate() {
+ let cost = if ca == cb { 0 } else { 1 };
+ let del = prev[j + 1] + 1;
+ let ins = curr[j] + 1;
+ let rep = prev[j] + cost;
+ curr[j + 1] = del.min(ins).min(rep);
+ }
+ std::mem::swap(&mut prev, &mut curr);
+ }
+ prev[n]
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test_levenshtein_distance_identical_strings() {
+ assert_eq!(LevenshteinDistance::compare("hello", "hello"), 0);
+ }
+
+ #[test]
+ fn test_levenshtein_distance_completely_different() {
+ let dist = LevenshteinDistance::compare("abc", "xyz");
+ assert_eq!(dist, 3);
+ }
+
+ #[test]
+ fn test_levenshtein_distance_one_insertion() {
+ assert_eq!(LevenshteinDistance::compare("cat", "cats"), 1);
+ }
+
+ #[test]
+ fn test_levenshtein_distance_one_deletion() {
+ assert_eq!(LevenshteinDistance::compare("dogs", "dog"), 1);
+ }
+
+ #[test]
+ fn test_levenshtein_distance_one_substitution() {
+ assert_eq!(LevenshteinDistance::compare("cat", "cut"), 1);
+ }
+
+ #[test]
+ fn test_levenshtein_distance_empty_strings() {
+ assert_eq!(LevenshteinDistance::compare("", ""), 0);
+ }
+
+ #[test]
+ fn test_levenshtein_distance_empty_vs_nonempty() {
+ assert_eq!(LevenshteinDistance::compare("", "abc"), 3);
+ assert_eq!(LevenshteinDistance::compare("xyz", ""), 3);
+ }
+
+ #[test]
+ fn test_levenshtein_distance_unicode() {
+ // Chinese characters
+ assert_eq!(LevenshteinDistance::compare("你好", "你好"), 0);
+ assert_eq!(LevenshteinDistance::compare("你好", "您好"), 1);
+ assert_eq!(LevenshteinDistance::compare("你好", "您不好"), 2);
+ }
+
+ #[test]
+ fn test_filter_similar_exact_threshold() {
+ let words = vec!["cat", "cart", "ca", "cats", "cut"];
+ let result = LevenshteinDistance::filter_similar("cat", &words, 2);
+ // cat -> cat: 0, cat -> cart: 1, cat -> ca: 1, cat -> cats: 1, cat -> cut: 1
+ assert_eq!(result.len(), 5);
+ }
+
+ #[test]
+ fn test_filter_similar_empty_slice() {
+ let words: Vec<&str> = vec![];
+ let result = LevenshteinDistance::filter_similar("hello", &words, 3);
+ assert!(result.is_empty());
+ }
+
+ #[test]
+ fn test_filter_similar_threshold_zero() {
+ let words = vec!["hello", "hallo", "hello!"];
+ let result = LevenshteinDistance::filter_similar("hello", &words, 0);
+ assert_eq!(result, vec!["hello"]);
+ }
+}
diff --git a/rola-utils/functions/src/lib.rs b/rola-utils/functions/src/lib.rs
new file mode 100644
index 0000000..ff2ee7e
--- /dev/null
+++ b/rola-utils/functions/src/lib.rs
@@ -0,0 +1,2 @@
+mod levenshtein_distance;
+pub use levenshtein_distance::*;
diff --git a/rola-utils/macros/Cargo.toml b/rola-utils/macros/Cargo.toml
new file mode 100644
index 0000000..f750afa
--- /dev/null
+++ b/rola-utils/macros/Cargo.toml
@@ -0,0 +1,14 @@
+[package]
+name = "shared_macros"
+version.workspace = true
+edition.workspace = true
+authors.workspace = true
+license.workspace = true
+
+[lib]
+proc-macro = true
+
+[dependencies]
+syn = { version = "2.0", features = ["full", "visit-mut"] }
+quote = "1.0"
+proc-macro2 = "1.0"
diff --git a/rola-utils/macros/src/lib.rs b/rola-utils/macros/src/lib.rs
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/rola-utils/macros/src/lib.rs
@@ -0,0 +1 @@
+
diff --git a/rola-vcs/Cargo.toml b/rola-vcs/Cargo.toml
new file mode 100644
index 0000000..6fec629
--- /dev/null
+++ b/rola-vcs/Cargo.toml
@@ -0,0 +1,9 @@
+[package]
+name = "rorolala"
+version.workspace = true
+authors.workspace = true
+license.workspace = true
+edition.workspace = true
+
+[dependencies]
+rorolala_internal_macros.workspace = true
diff --git a/rola-vcs/internal_macros/Cargo.toml b/rola-vcs/internal_macros/Cargo.toml
new file mode 100644
index 0000000..0d6f641
--- /dev/null
+++ b/rola-vcs/internal_macros/Cargo.toml
@@ -0,0 +1,14 @@
+[package]
+name = "rorolala_internal_macros"
+version.workspace = true
+authors.workspace = true
+license.workspace = true
+edition.workspace = true
+
+[lib]
+proc-macro = true
+
+[dependencies]
+syn = { version = "2", features = ["full"] }
+quote = "1"
+proc-macro2 = "1"
diff --git a/rola-vcs/internal_macros/src/constants.rs b/rola-vcs/internal_macros/src/constants.rs
new file mode 100644
index 0000000..2e76bfe
--- /dev/null
+++ b/rola-vcs/internal_macros/src/constants.rs
@@ -0,0 +1,115 @@
+use proc_macro::TokenStream;
+use quote::{format_ident, quote};
+use syn::{Expr, Item, ItemConst, ItemMod, Lit, parse_macro_input, parse_quote};
+
+/// Entry point called from lib.rs.
+pub fn expand(_attr: TokenStream, item: TokenStream) -> TokenStream {
+ let mut input_mod = parse_macro_input!(item as ItemMod);
+
+ let (_, items) = match &mut input_mod.content {
+ Some(content) => content,
+ None => panic!("#[constants] can only be applied to a module with a body"),
+ };
+
+ let mut new_items: Vec<Item> = Vec::with_capacity(items.len());
+
+ for item in items.iter() {
+ if let Item::Const(const_item) = item {
+ let func = transform_const(const_item);
+ new_items.push(func);
+ } else {
+ new_items.push(item.clone());
+ }
+ }
+
+ let mod_ident = &input_mod.ident;
+ let vis = &input_mod.vis;
+
+ let output = quote! {
+ #[allow(non_snake_case)]
+ #vis mod #mod_ident {
+ #(#new_items)*
+ }
+ };
+
+ output.into()
+}
+
+/// Transforms a single `const` item into a function.
+fn transform_const(const_item: &ItemConst) -> Item {
+ let name = &const_item.ident;
+ let attrs = &const_item.attrs;
+
+ // Extract the string literal value from the const
+ let value_str = match &*const_item.expr {
+ Expr::Lit(expr_lit) => match &expr_lit.lit {
+ Lit::Str(lit_str) => lit_str.value(),
+ _ => panic!(
+ "#[constants] only supports `&str` literals, \
+ but `{name}` has a non-string literal"
+ ),
+ },
+ _ => panic!(
+ "#[constants] only supports literal expressions, \
+ but `{name}` has a non-literal expression"
+ ),
+ };
+
+ let placeholders = extract_placeholders(&value_str);
+
+ if placeholders.is_empty() {
+ parse_quote! {
+ #(#attrs)*
+ pub fn #name() -> String {
+ #value_str.to_string()
+ }
+ }
+ } else {
+ let params: Vec<_> = placeholders
+ .iter()
+ .map(|p| {
+ let ident = format_ident!("{p}");
+ quote! { #ident: impl ::core::convert::AsRef<str> }
+ })
+ .collect();
+
+ let format_args: Vec<_> = placeholders
+ .iter()
+ .map(|p| {
+ let ident = format_ident!("{p}");
+ quote! { #ident = #ident.as_ref() }
+ })
+ .collect();
+
+ parse_quote! {
+ #(#attrs)*
+ pub fn #name(#(#params),*) -> String {
+ ::std::format!(#value_str, #(#format_args),*)
+ }
+ }
+ }
+}
+
+/// Extracts all `{name}` placeholder identifiers from a format string.
+fn extract_placeholders(s: &str) -> Vec<String> {
+ let mut placeholders = Vec::new();
+ let mut chars = s.char_indices().peekable();
+
+ while let Some((_, c)) = chars.next() {
+ if c == '{' {
+ let mut name = String::new();
+ for (_, c) in &mut chars {
+ if c == '}' {
+ break;
+ }
+ name.push(c);
+ }
+ let trimmed = name.trim().to_string();
+ if !trimmed.is_empty() {
+ placeholders.push(trimmed);
+ }
+ }
+ }
+
+ placeholders
+}
diff --git a/rola-vcs/internal_macros/src/lib.rs b/rola-vcs/internal_macros/src/lib.rs
new file mode 100644
index 0000000..f6c3cb7
--- /dev/null
+++ b/rola-vcs/internal_macros/src/lib.rs
@@ -0,0 +1,39 @@
+mod constants;
+
+use proc_macro::TokenStream;
+
+/// Transforms `pub const` items in a module into equivalent functions.
+///
+/// Constants without `{param}` placeholders become `fn NAME() -> String`.
+/// Constants with `{param}` placeholders become `fn NAME(param: impl AsRef<str>) -> String`,
+/// using `format!()` to fill in the placeholders.
+///
+/// The entire module is annotated with `#[allow(non_snake_case)]`.
+///
+/// # Example
+///
+/// ```ignore
+/// #[rorolala_internal_macros::constants]
+/// pub mod paths {
+/// pub const ROLA_DRAFT_DIR: &str = ".rola";
+/// pub const ROLA_BINDED_BUCKET_FILE: &str = ".rola/BIND/{bucket}";
+/// }
+/// ```
+///
+/// expands to:
+///
+/// ```ignore
+/// #[allow(non_snake_case)]
+/// pub mod paths {
+/// pub fn ROLA_DRAFT_DIR() -> String {
+/// ".rola".to_string()
+/// }
+/// pub fn ROLA_BINDED_BUCKET_FILE(bucket: impl AsRef<str>) -> String {
+/// format!(".rola/BIND/{bucket}", bucket = bucket.as_ref())
+/// }
+/// }
+/// ```
+#[proc_macro_attribute]
+pub fn constants(attr: TokenStream, item: TokenStream) -> TokenStream {
+ constants::expand(attr, item)
+}
diff --git a/rola-vcs/src/abstracts.rs b/rola-vcs/src/abstracts.rs
new file mode 100644
index 0000000..e707ec3
--- /dev/null
+++ b/rola-vcs/src/abstracts.rs
@@ -0,0 +1,2 @@
+mod dir_pointer;
+pub use dir_pointer::*;
diff --git a/rola-vcs/src/abstracts/dir_pointer.rs b/rola-vcs/src/abstracts/dir_pointer.rs
new file mode 100644
index 0000000..0e59960
--- /dev/null
+++ b/rola-vcs/src/abstracts/dir_pointer.rs
@@ -0,0 +1,88 @@
+use std::{
+ borrow::Borrow,
+ ops::{Deref, DerefMut},
+ path::PathBuf,
+};
+
+/// Directory Pointer Data
+pub trait DirPtrData {
+ /// Fix the given path
+ ///
+ /// Returns Some(path): use the fixed path
+ /// Returns None: path cannot be fixed, this pointer is invalid
+ #[doc(hidden)]
+ fn fix(raw_path: PathBuf) -> Option<PathBuf>;
+}
+
+#[derive(Debug, Default, Clone)]
+pub struct DirPtr<Data: DirPtrData> {
+ /// Whether the current directory pointer is valid
+ valid: bool,
+
+ /// Data for the directory pointer
+ data: Data,
+
+ /// Path to the directory
+ path: PathBuf,
+}
+
+impl<Data: DirPtrData> DirPtr<Data> {
+ /// Get a reference to the directory pointer's path
+ pub fn path_ref(&self) -> &PathBuf {
+ &self.path
+ }
+
+ /// Get the directory pointer's path
+ pub fn path(&self) -> PathBuf {
+ self.path.clone()
+ }
+
+ /// Returns whether the directory pointer is valid
+ pub fn is_valid(&self) -> bool {
+ self.valid
+ }
+}
+
+impl<Data: DirPtrData + Default> DirPtr<Data> {
+ /// Create a new directory pointer with the given path and default data
+ pub fn new(path: impl Into<PathBuf>) -> Self {
+ let path = path.into();
+ let fixed = Data::fix(path.clone());
+ Self {
+ valid: fixed.is_some(),
+ data: Data::default(),
+ path: fixed.unwrap_or(path),
+ }
+ }
+}
+
+impl<Data: DirPtrData> AsRef<DirPtr<Data>> for DirPtr<Data> {
+ fn as_ref(&self) -> &DirPtr<Data> {
+ self
+ }
+}
+
+impl<Data: DirPtrData> Deref for DirPtr<Data> {
+ type Target = Data;
+
+ fn deref(&self) -> &Self::Target {
+ &self.data
+ }
+}
+
+impl<Data: DirPtrData> DerefMut for DirPtr<Data> {
+ fn deref_mut(&mut self) -> &mut Self::Target {
+ &mut self.data
+ }
+}
+
+impl<Data: DirPtrData> Borrow<Data> for DirPtr<Data> {
+ fn borrow(&self) -> &Data {
+ &self.data
+ }
+}
+
+/// Create a new directory pointer with the given path and default data
+pub fn dir_ptr<Data: DirPtrData + Default>(path: impl Into<PathBuf>) -> DirPtr<Data> {
+ DirPtr::new(path)
+}
diff --git a/rola-vcs/src/bucket.rs b/rola-vcs/src/bucket.rs
new file mode 100644
index 0000000..40de6f8
--- /dev/null
+++ b/rola-vcs/src/bucket.rs
@@ -0,0 +1,18 @@
+//! Bucket - Rorolala Storage Unit
+
+use crate::{
+ DirPtrData, DirSearchPattern, bucket::constants::ROLA_BUCKET_CONFIG_FILE, dir_search_prev,
+};
+
+pub mod constants {
+ /// The name of the bucket config file
+ pub const ROLA_BUCKET_CONFIG_FILE: &str = "rorolala.toml";
+}
+
+pub struct Bucket;
+
+impl DirPtrData for Bucket {
+ fn fix(raw_path: std::path::PathBuf) -> Option<std::path::PathBuf> {
+ dir_search_prev(raw_path, DirSearchPattern::File(ROLA_BUCKET_CONFIG_FILE))
+ }
+}
diff --git a/rola-vcs/src/err.rs b/rola-vcs/src/err.rs
new file mode 100644
index 0000000..71e0a34
--- /dev/null
+++ b/rola-vcs/src/err.rs
@@ -0,0 +1,105 @@
+//! Error
+//!
+//! This module is used to create and log Rorolala standard errors
+
+use std::{
+ fmt::{Display, Formatter},
+ io::Error as IoError,
+};
+
+mod io;
+
+/// Rorolala standard error
+#[derive(Default)]
+pub struct RolaError {
+ pub module: RolaModule,
+ pub data: RolaErrorData,
+ pub message: String,
+}
+
+/// Rorolala module, used to locate the source of an error
+#[derive(Debug, Eq, Default)]
+#[repr(u8)]
+pub enum RolaModule {
+ #[default]
+ Empty,
+
+ Bucket,
+ Workdraft,
+}
+
+/// Error data
+#[derive(Debug, Default)]
+pub enum RolaErrorData {
+ #[default]
+ Empty,
+
+ /// IO error
+ IO(IoError),
+}
+
+impl RolaError {
+ /// Create a new RolaError
+ pub fn new(module: RolaModule, data: RolaErrorData, message: String) -> Self {
+ Self {
+ module,
+ data,
+ message,
+ }
+ }
+
+ /// Create an empty RolaError
+ pub fn empty() -> Self {
+ Self {
+ module: RolaModule::Empty,
+ data: RolaErrorData::Empty,
+ message: String::new(),
+ }
+ }
+
+ /// Set the module
+ pub fn with_module(mut self, module: RolaModule) -> Self {
+ self.module = module;
+ self
+ }
+
+ /// Set the message
+ pub fn with_message(mut self, message: String) -> Self {
+ self.message = message;
+ self
+ }
+
+ /// Set the error data
+ pub fn with_data(mut self, data: RolaErrorData) -> Self {
+ self.data = data;
+ self
+ }
+}
+
+impl Display for RolaError {
+ fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
+ write!(f, "{}", self.message)
+ }
+}
+
+impl PartialEq for RolaError {
+ fn eq(&self, other: &Self) -> bool {
+ self.message == other.message && self.module == other.module
+ }
+}
+
+impl Display for RolaModule {
+ fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
+ write!(f, "{:?}", self)
+ }
+}
+
+impl PartialEq for RolaModule {
+ fn eq(&self, other: &Self) -> bool {
+ matches!(
+ (self, other),
+ (RolaModule::Bucket, RolaModule::Bucket)
+ | (RolaModule::Workdraft, RolaModule::Workdraft)
+ )
+ }
+}
diff --git a/rola-vcs/src/err/io.rs b/rola-vcs/src/err/io.rs
new file mode 100644
index 0000000..8dd4c1a
--- /dev/null
+++ b/rola-vcs/src/err/io.rs
@@ -0,0 +1,10 @@
+use crate::{RolaError, RolaErrorData, RolaModule};
+
+impl From<(RolaModule, std::io::Error)> for RolaError {
+ fn from(val: (RolaModule, std::io::Error)) -> Self {
+ let (module, io_err) = val;
+ let message = io_err.to_string();
+ let data = RolaErrorData::IO(io_err);
+ RolaError::new(module, data, message)
+ }
+}
diff --git a/rola-vcs/src/lib.rs b/rola-vcs/src/lib.rs
new file mode 100644
index 0000000..7672ff9
--- /dev/null
+++ b/rola-vcs/src/lib.rs
@@ -0,0 +1,24 @@
+#![allow(dead_code)]
+
+mod bucket;
+
+mod abstracts;
+pub use abstracts::*;
+
+mod workdraft;
+pub use workdraft::*;
+
+mod tools;
+pub use tools::*;
+
+mod err;
+pub use err::*;
+
+#[doc(hidden)]
+#[macro_export]
+macro_rules! include_mod {
+ ($module:ident) => {
+ mod $module;
+ pub use $module::*;
+ };
+}
diff --git a/rola-vcs/src/tools.rs b/rola-vcs/src/tools.rs
new file mode 100644
index 0000000..43b4e33
--- /dev/null
+++ b/rola-vcs/src/tools.rs
@@ -0,0 +1 @@
+crate::include_mod!(dir_search);
diff --git a/rola-vcs/src/tools/dir_search.rs b/rola-vcs/src/tools/dir_search.rs
new file mode 100644
index 0000000..3d32c70
--- /dev/null
+++ b/rola-vcs/src/tools/dir_search.rs
@@ -0,0 +1,54 @@
+use std::path::PathBuf;
+
+pub enum DirSearchPattern<'a> {
+ File(&'a str),
+ Dir(&'a str),
+}
+
+/// Searches upward from the given path towards parent directories.
+/// If any ancestor directory contains a file or directory matching the pattern,
+/// returns that ancestor directory's path.
+pub fn dir_search_prev(path: impl Into<PathBuf>, pattern: DirSearchPattern) -> Option<PathBuf> {
+ let mut current: PathBuf = path.into();
+ // Canonicalize the path if possible to ensure absolute traversal
+ if let Ok(canonical) = current.canonicalize() {
+ current = canonical;
+ } else {
+ // If canonicalization fails (e.g. path does not exist yet),
+ // try to make it absolute using current dir
+ if current.is_relative()
+ && let Ok(cwd) = std::env::current_dir() {
+ current = cwd.join(&current);
+ }
+ }
+
+ loop {
+ // Check if the current directory exists and is a directory
+ if current.is_dir() {
+ let has_match = match &pattern {
+ DirSearchPattern::File(name) => {
+ let mut entry = current.clone();
+ entry.push(name);
+ entry.is_file()
+ }
+ DirSearchPattern::Dir(name) => {
+ let mut entry = current.clone();
+ entry.push(name);
+ entry.is_dir()
+ }
+ };
+
+ if has_match {
+ return Some(current);
+ }
+ }
+
+ // Try to go to the parent directory
+ if !current.pop() {
+ // pop() returns false when there's no parent
+ break;
+ }
+ }
+
+ None
+}
diff --git a/rola-vcs/src/workdraft.rs b/rola-vcs/src/workdraft.rs
new file mode 100644
index 0000000..45bb418
--- /dev/null
+++ b/rola-vcs/src/workdraft.rs
@@ -0,0 +1,150 @@
+//! Work Draft
+//!
+//! Work Draft is the local workspace of `Rorolala`, used to store files being modified
+
+use std::path::PathBuf;
+
+use crate::{
+ DirPtrData, DirSearchPattern, RolaError, RolaModule, dir_search_prev,
+ workdraft::constants::ROLA_DRAFT_DIR,
+};
+
+#[rorolala_internal_macros::constants]
+pub mod constants {
+ /// The name of the workdraft directory
+ pub const ROLA_DRAFT_DIR: &str = ".rola";
+
+ /// The name of the directory containing bucket bindings
+ pub const ROLA_BINDED_BUCKETS_DIR: &str = ".rola/BIND/";
+
+ /// The name of the bind file
+ pub const ROLA_BINDED_BUCKET_FILE: &str = ".rola/BIND/{bucket}";
+}
+
+/// Work Draft Pointer
+///
+/// This struct is used to point to an operable local work draft directory on disk
+#[derive(Debug, Default, Clone)]
+pub struct WorkDraft;
+
+impl DirPtrData for WorkDraft {
+ fn fix(raw_path: PathBuf) -> Option<PathBuf> {
+ let draft_dir = ROLA_DRAFT_DIR();
+ dir_search_prev(raw_path, DirSearchPattern::Dir(&draft_dir))
+ }
+}
+
+impl WorkDraft {
+ /// Creates a new work draft directory at the given path
+ pub fn create(path: PathBuf) -> Result<(), RolaError> {
+ let dir = path.join(ROLA_DRAFT_DIR());
+ std::fs::create_dir_all(dir).map_err(|e| RolaError::from((RolaModule::Workdraft, e)))?;
+ Ok(())
+ }
+}
+
+/// Module for managing workdraft bucket bindings
+pub mod bucket_bind_mgr {
+ use std::path::PathBuf;
+
+ use crate::{
+ DirPtr, RolaError, RolaModule, WorkDraft, constants::ROLA_BINDED_BUCKETS_DIR,
+ workdraft::constants::ROLA_BINDED_BUCKET_FILE,
+ };
+
+ impl DirPtr<WorkDraft> {
+ /// Returns the path to the bind file for this work draft
+ pub fn bind_bucket_path(&self, bucket: impl AsRef<str>) -> PathBuf {
+ self.path().join(ROLA_BINDED_BUCKET_FILE(bucket))
+ }
+
+ /// Returns the path to the bind file for this work draft
+ pub fn bind_bucket(&self, bucket: impl AsRef<str>) -> Result<String, RolaError> {
+ let bucket_path = self.bind_bucket_path(bucket);
+ let parent = bucket_path.parent().ok_or_else(|| -> RolaError {
+ RolaError::from((
+ RolaModule::Workdraft,
+ std::io::Error::new(
+ std::io::ErrorKind::InvalidInput,
+ format!("Invalid bucket path: {}", bucket_path.to_string_lossy()),
+ ),
+ ))
+ })?;
+
+ if !parent.exists() {
+ std::fs::create_dir_all(parent)
+ .map_err(|e| RolaError::from((RolaModule::Workdraft, e)))?;
+ }
+
+ match std::fs::read_to_string(bucket_path) {
+ Ok(str) => Ok(str),
+ Err(err) => Err(RolaError::from((RolaModule::Workdraft, err))),
+ }
+ }
+
+ /// Binds the work draft to the specified bucket
+ pub fn bind_bucket_to(&self, bucket: &str) -> Result<(), RolaError> {
+ let bucket_path = self.bind_bucket_path(bucket);
+ let parent = bucket_path.parent().ok_or_else(|| -> RolaError {
+ RolaError::from((
+ RolaModule::Workdraft,
+ std::io::Error::new(std::io::ErrorKind::InvalidInput, "invalid bucket path"),
+ ))
+ })?;
+ if !parent.exists() {
+ std::fs::create_dir_all(parent)
+ .map_err(|e| RolaError::from((RolaModule::Workdraft, e)))?;
+ }
+ std::fs::write(&bucket_path, bucket)
+ .map_err(|e| RolaError::from((RolaModule::Workdraft, e)))?;
+ Ok(())
+ }
+
+ /// Returns all bound bucket names for this work draft
+ pub fn binded_buckets(&self) -> Result<Vec<String>, RolaError> {
+ let bind_dir = self.path().join(ROLA_BINDED_BUCKETS_DIR());
+ if !bind_dir.exists() {
+ return Ok(Vec::new());
+ }
+
+ let mut buckets = Vec::new();
+ let entries = std::fs::read_dir(&bind_dir)
+ .map_err(|e| RolaError::from((RolaModule::Workdraft, e)))?;
+
+ for entry in entries {
+ let entry = entry.map_err(|e| RolaError::from((RolaModule::Workdraft, e)))?;
+ let path = entry.path();
+
+ if path.is_file() {
+ // Read the file content which contains the bucket name
+ if let Ok(content) = std::fs::read_to_string(&path) {
+ let bucket = content.trim().to_string();
+ if !bucket.is_empty() {
+ buckets.push(bucket);
+ }
+ }
+ }
+ }
+
+ Ok(buckets)
+ }
+
+ /// Removes the binding for the specified bucket
+ pub fn unbind_bucket(&self, bucket: impl AsRef<str>) -> Result<(), RolaError> {
+ let bucket_path = self.bind_bucket_path(bucket);
+ if bucket_path.exists() {
+ std::fs::remove_file(&bucket_path)
+ .map_err(|e| RolaError::from((RolaModule::Workdraft, e)))?;
+ }
+ Ok(())
+ }
+
+ /// Removes bindings for all specified buckets
+ pub fn unbind_buckets(&self, buckets: &[impl AsRef<str>]) -> Result<(), RolaError> {
+ for bucket in buckets {
+ self.unbind_bucket(bucket)?;
+ }
+ Ok(())
+ }
+ }
+}