├── Russkyc.UI.Avalonia.Gallery.Browser ├── Properties │ ├── AssemblyInfo.cs │ └── launchSettings.json ├── wwwroot │ ├── favicon.ico │ ├── main.js │ ├── app.css │ └── index.html ├── runtimeconfig.template.json ├── Program.cs └── Russkyc.UI.Avalonia.Gallery.Browser.csproj ├── Russkyc.UI.Avalonia ├── PackageIcon.png ├── Converters │ └── FocusBorderRadiusConverter.cs ├── Controls │ ├── ItemsControl.axaml │ ├── GridSplitter.axaml │ ├── PopupRoot.axaml │ ├── ScrollViewer.axaml │ ├── Border.axaml │ ├── DataValidationErrors.axaml │ ├── ListBox.axaml │ ├── ToggleSwitch.axaml │ ├── Button.axaml │ ├── ToggleButton.axaml │ └── ComboBox.axaml ├── Russkyc.UI.Avalonia.csproj ├── README.md ├── Controls.axaml ├── Themes │ └── Zinc.axaml └── Base.axaml ├── .github ├── FUNDING.yml ├── workflows │ └── deploy-web.yml └── resources │ └── images │ └── nuget-button.svg ├── Russkyc.UI.Avalonia.Gallery ├── Assets │ └── avalonia-logo.ico ├── ViewModels │ ├── ViewModelBase.cs │ └── MainViewModel.cs ├── Views │ ├── MainView.axaml.cs │ ├── MainWindow.axaml.cs │ ├── Pages │ │ ├── ThemingView.axaml.cs │ │ ├── IntroductionView.axaml.cs │ │ ├── ExamplesView.axaml.cs │ │ ├── ExamplesView.axaml │ │ ├── ThemingView.axaml │ │ ├── ToggleButtonView.axaml.cs │ │ ├── ButtonView.axaml.cs │ │ ├── TextBoxView.axaml.cs │ │ ├── CardView.axaml.cs │ │ ├── ToggleSwitchView.axaml.cs │ │ ├── PillView.axaml.cs │ │ ├── ListBoxView.axaml.cs │ │ ├── RadioButtonView.axaml.cs │ │ ├── InstallationView.axaml.cs │ │ ├── IntroductionView.axaml │ │ ├── ToggleButtonView.axaml │ │ ├── ToggleSwitchView.axaml │ │ ├── ButtonView.axaml │ │ ├── PillView.axaml │ │ ├── InstallationView.axaml │ │ ├── ListBoxView.axaml │ │ ├── TextBoxView.axaml │ │ ├── RadioButtonView.axaml │ │ ├── ComboBoxView.axaml.cs │ │ ├── CardView.axaml │ │ └── ComboBoxView.axaml │ ├── Sidebar.axaml.cs │ ├── MainWindow.axaml │ ├── MainView.axaml │ └── Sidebar.axaml ├── App.axaml ├── Russkyc.UI.Avalonia.Gallery.csproj └── App.axaml.cs ├── Russkyc.UI.Avalonia.Gallery.Desktop ├── Program.cs ├── app.manifest └── Russkyc.UI.Avalonia.Gallery.Desktop.csproj ├── LICENSE.md ├── Directory.Packages.props ├── Russkyc.UI.Avalonia.sln ├── .gitignore └── README.md /Russkyc.UI.Avalonia.Gallery.Browser/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | [assembly: System.Runtime.Versioning.SupportedOSPlatform("browser")] -------------------------------------------------------------------------------- /Russkyc.UI.Avalonia/PackageIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russkyc/russkyc-ui-avalonia/HEAD/Russkyc.UI.Avalonia/PackageIcon.png -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: russkyc 4 | patreon: russkyc 5 | custom: ["https://paypal.me/jrcmo"] -------------------------------------------------------------------------------- /Russkyc.UI.Avalonia.Gallery/Assets/avalonia-logo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russkyc/russkyc-ui-avalonia/HEAD/Russkyc.UI.Avalonia.Gallery/Assets/avalonia-logo.ico -------------------------------------------------------------------------------- /Russkyc.UI.Avalonia.Gallery.Browser/wwwroot/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/russkyc/russkyc-ui-avalonia/HEAD/Russkyc.UI.Avalonia.Gallery.Browser/wwwroot/favicon.ico -------------------------------------------------------------------------------- /Russkyc.UI.Avalonia.Gallery/ViewModels/ViewModelBase.cs: -------------------------------------------------------------------------------- 1 | using CommunityToolkit.Mvvm.ComponentModel; 2 | 3 | namespace Russkyc.UI.Avalonia.Gallery.ViewModels; 4 | 5 | public class ViewModelBase : ObservableObject 6 | { 7 | } -------------------------------------------------------------------------------- /Russkyc.UI.Avalonia.Gallery.Browser/runtimeconfig.template.json: -------------------------------------------------------------------------------- 1 | { 2 | "wasmHostProperties": { 3 | "perHostConfig": [ 4 | { 5 | "name": "browser", 6 | "host": "browser" 7 | } 8 | ] 9 | } 10 | } -------------------------------------------------------------------------------- /Russkyc.UI.Avalonia.Gallery/Views/MainView.axaml.cs: -------------------------------------------------------------------------------- 1 | using Avalonia.Controls; 2 | 3 | namespace Russkyc.UI.Avalonia.Gallery.Views; 4 | 5 | public partial class MainView : UserControl 6 | { 7 | public MainView() 8 | { 9 | InitializeComponent(); 10 | } 11 | } -------------------------------------------------------------------------------- /Russkyc.UI.Avalonia.Gallery/Views/MainWindow.axaml.cs: -------------------------------------------------------------------------------- 1 | using Avalonia.Controls; 2 | 3 | namespace Russkyc.UI.Avalonia.Gallery.Views; 4 | 5 | public partial class MainWindow : Window 6 | { 7 | public MainWindow() 8 | { 9 | InitializeComponent(); 10 | } 11 | } -------------------------------------------------------------------------------- /Russkyc.UI.Avalonia.Gallery/Views/Pages/ThemingView.axaml.cs: -------------------------------------------------------------------------------- 1 | using Avalonia.Controls; 2 | 3 | namespace Russkyc.UI.Avalonia.Gallery.Views.Pages; 4 | 5 | public partial class ThemingView : UserControl 6 | { 7 | public ThemingView() 8 | { 9 | InitializeComponent(); 10 | } 11 | } -------------------------------------------------------------------------------- /Russkyc.UI.Avalonia.Gallery/Views/Pages/IntroductionView.axaml.cs: -------------------------------------------------------------------------------- 1 | using Avalonia.Controls; 2 | 3 | namespace Russkyc.UI.Avalonia.Gallery.Views.Pages; 4 | 5 | public partial class IntroductionView : UserControl 6 | { 7 | public IntroductionView() 8 | { 9 | InitializeComponent(); 10 | } 11 | } -------------------------------------------------------------------------------- /Russkyc.UI.Avalonia.Gallery/Views/Sidebar.axaml.cs: -------------------------------------------------------------------------------- 1 | using Avalonia; 2 | using Avalonia.Controls; 3 | using Avalonia.Markup.Xaml; 4 | 5 | namespace Russkyc.UI.Avalonia.Gallery.Views; 6 | 7 | public partial class Sidebar : UserControl 8 | { 9 | public Sidebar() 10 | { 11 | InitializeComponent(); 12 | } 13 | } -------------------------------------------------------------------------------- /Russkyc.UI.Avalonia.Gallery/Views/Pages/ExamplesView.axaml.cs: -------------------------------------------------------------------------------- 1 | using Avalonia; 2 | using Avalonia.Controls; 3 | using Avalonia.Markup.Xaml; 4 | 5 | namespace Russkyc.UI.Avalonia.Gallery.Views.Pages; 6 | 7 | public partial class ExamplesView : UserControl 8 | { 9 | public ExamplesView() 10 | { 11 | InitializeComponent(); 12 | } 13 | } -------------------------------------------------------------------------------- /Russkyc.UI.Avalonia.Gallery/ViewModels/MainViewModel.cs: -------------------------------------------------------------------------------- 1 | using CommunityToolkit.Mvvm.ComponentModel; 2 | using CommunityToolkit.Mvvm.Input; 3 | 4 | namespace Russkyc.UI.Avalonia.Gallery.ViewModels; 5 | 6 | public partial class MainViewModel : ViewModelBase 7 | { 8 | [ObservableProperty] 9 | private object _activePage; 10 | 11 | [RelayCommand] 12 | void OpenPage(object page) 13 | { 14 | ActivePage = page; 15 | } 16 | } -------------------------------------------------------------------------------- /Russkyc.UI.Avalonia.Gallery.Browser/Program.cs: -------------------------------------------------------------------------------- 1 | using System.Runtime.Versioning; 2 | using System.Threading.Tasks; 3 | using Avalonia; 4 | using Avalonia.Browser; 5 | using Russkyc.UI.Avalonia.Gallery; 6 | 7 | internal sealed partial class Program 8 | { 9 | private static Task Main(string[] args) => BuildAvaloniaApp() 10 | .WithInterFont() 11 | .StartBrowserAppAsync("out"); 12 | 13 | public static AppBuilder BuildAvaloniaApp() 14 | => AppBuilder.Configure(); 15 | } -------------------------------------------------------------------------------- /Russkyc.UI.Avalonia.Gallery.Browser/wwwroot/main.js: -------------------------------------------------------------------------------- 1 | import { dotnet } from './_framework/dotnet.js' 2 | 3 | const is_browser = typeof window != "undefined"; 4 | if (!is_browser) throw new Error(`Expected to be running in a browser`); 5 | 6 | const dotnetRuntime = await dotnet 7 | .withDiagnosticTracing(false) 8 | .withApplicationArgumentsFromQuery() 9 | .create(); 10 | 11 | const config = dotnetRuntime.getConfig(); 12 | 13 | await dotnetRuntime.runMain(config.mainAssemblyName, [globalThis.location.href]); 14 | -------------------------------------------------------------------------------- /Russkyc.UI.Avalonia.Gallery/Views/Pages/ExamplesView.axaml: -------------------------------------------------------------------------------- 1 | 10 | Welcome to Avalonia! 11 | 12 | -------------------------------------------------------------------------------- /Russkyc.UI.Avalonia.Gallery/Views/Pages/ThemingView.axaml: -------------------------------------------------------------------------------- 1 | 10 | Welcome to Avalonia! 11 | 12 | -------------------------------------------------------------------------------- /Russkyc.UI.Avalonia.Gallery.Browser/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "profiles": { 3 | "Russkyc.UI.Avalonia.Gallery.Browser": { 4 | "commandName": "Project", 5 | "launchBrowser": true, 6 | "environmentVariables": { 7 | "ASPNETCORE_ENVIRONMENT": "Development" 8 | }, 9 | "applicationUrl": "https://localhost:7169;http://localhost:5235", 10 | "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}" 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Russkyc.UI.Avalonia.Gallery/Views/MainWindow.axaml: -------------------------------------------------------------------------------- 1 | 16 | 17 | -------------------------------------------------------------------------------- /Russkyc.UI.Avalonia.Gallery.Browser/Russkyc.UI.Avalonia.Gallery.Browser.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | net8.0-browser 4 | Exe 5 | true 6 | enable 7 | 8 | 9 | 10 | true 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /Russkyc.UI.Avalonia.Gallery.Desktop/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Avalonia; 3 | 4 | namespace Russkyc.UI.Avalonia.Gallery.Desktop; 5 | 6 | sealed class Program 7 | { 8 | // Initialization code. Don't use any Avalonia, third-party APIs or any 9 | // SynchronizationContext-reliant code before AppMain is called: things aren't initialized 10 | // yet and stuff might break. 11 | [STAThread] 12 | public static void Main(string[] args) => BuildAvaloniaApp() 13 | .StartWithClassicDesktopLifetime(args); 14 | 15 | // Avalonia configuration, don't remove; also used by visual designer. 16 | public static AppBuilder BuildAvaloniaApp() 17 | => AppBuilder.Configure() 18 | .UsePlatformDetect() 19 | .WithInterFont() 20 | .LogToTrace(); 21 | } -------------------------------------------------------------------------------- /Russkyc.UI.Avalonia.Gallery.Browser/wwwroot/app.css: -------------------------------------------------------------------------------- 1 | /* HTML styles for the splash screen */ 2 | .avalonia-splash { 3 | position: absolute; 4 | height: 100%; 5 | width: 100%; 6 | font-family: 'Outfit', sans-serif; 7 | justify-content: center; 8 | align-items: center; 9 | display: flex; 10 | pointer-events: none; 11 | } 12 | 13 | html, body { 14 | background: white; 15 | } 16 | 17 | .avalonia-splash a { 18 | color: #101010; 19 | } 20 | 21 | .avalonia-splash h4 { 22 | font-weight: 400; 23 | } 24 | 25 | .avalonia-splash { 26 | background: white; 27 | color: black; 28 | display: flex; 29 | flex-direction: column; 30 | flex-wrap: nowrap; 31 | } 32 | 33 | .avalonia-splash.splash-close { 34 | transition: opacity 200ms, display 200ms; 35 | display: none; 36 | opacity: 0; 37 | } 38 | -------------------------------------------------------------------------------- /Russkyc.UI.Avalonia/Converters/FocusBorderRadiusConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Globalization; 3 | using Avalonia; 4 | using Avalonia.Data.Converters; 5 | 6 | namespace Russkyc.UI.Avalonia.Converters; 7 | 8 | public class FocusBorderRadiusConverter : IValueConverter 9 | { 10 | public static FocusBorderRadiusConverter Instance => new(); 11 | public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) 12 | { 13 | if (value is not CornerRadius thickness) return null; 14 | var padding = 2; 15 | return new CornerRadius(thickness.TopLeft+padding, thickness.TopRight+padding, thickness.BottomRight+padding, thickness.BottomLeft+padding); 16 | } 17 | 18 | public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) 19 | { 20 | return null; 21 | } 22 | } -------------------------------------------------------------------------------- /Russkyc.UI.Avalonia/Controls/ItemsControl.axaml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 11 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /Russkyc.UI.Avalonia.Gallery.Desktop/app.manifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /Russkyc.UI.Avalonia.Gallery/App.axaml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 John Russell Camo (russkyc) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Directory.Packages.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | true 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /Russkyc.UI.Avalonia.Gallery/Views/Pages/ToggleButtonView.axaml.cs: -------------------------------------------------------------------------------- 1 | using Avalonia.Controls; 2 | 3 | namespace Russkyc.UI.Avalonia.Gallery.Views.Pages; 4 | 5 | public partial class ToggleButtonView : UserControl 6 | { 7 | public ToggleButtonView() 8 | { 9 | InitializeComponent(); 10 | CodeBlock.Text = """ 11 | 15 | 16 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | """; 26 | } 27 | } -------------------------------------------------------------------------------- /Russkyc.UI.Avalonia.Gallery/Views/Pages/ButtonView.axaml.cs: -------------------------------------------------------------------------------- 1 | using Avalonia.Controls; 2 | 3 | namespace Russkyc.UI.Avalonia.Gallery.Views.Pages; 4 | 5 | public partial class ButtonView : UserControl 6 | { 7 | public ButtonView() 8 | { 9 | InitializeComponent(); 10 | CodeBlock.Text = """ 11 | 15 | 16 | 19 | 20 |