{"id":49350859,"url":"https://github.com/Onebeld/PleasantUI","last_synced_at":"2026-05-13T21:00:34.782Z","repository":{"id":159811972,"uuid":"634860228","full_name":"Onebeld/PleasantUI","owner":"Onebeld","description":"Graphical user interface library for Avalonia with its own controls","archived":false,"fork":false,"pushed_at":"2026-04-11T07:13:05.000Z","size":6330,"stargazers_count":43,"open_issues_count":0,"forks_count":3,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-04-11T08:28:01.000Z","etag":null,"topics":["avalonia","avaloniaui","c-sharp","control","controls","csharp","design","dotnet","interface","library","netstandard","nuget","pleasant","style","styled-components","styles","theme","ui","user-interface","xaml"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Onebeld.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":null,"patreon":"onebeld","open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"lfx_crowdfunding":null,"custom":["https://boosty.to/onebeld"]}},"created_at":"2023-05-01T11:52:50.000Z","updated_at":"2026-04-11T06:57:32.000Z","dependencies_parsed_at":"2023-06-09T07:00:33.542Z","dependency_job_id":"bb041883-067e-4949-83fb-ea016cf39775","html_url":"https://github.com/Onebeld/PleasantUI","commit_stats":{"total_commits":73,"total_committers":1,"mean_commits":73.0,"dds":0.0,"last_synced_commit":"77d50b2de5f9faf58d5f63c4ea33d3c6d54b8058"},"previous_names":[],"tags_count":31,"template":false,"template_full_name":null,"purl":"pkg:github/Onebeld/PleasantUI","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Onebeld%2FPleasantUI","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Onebeld%2FPleasantUI/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Onebeld%2FPleasantUI/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Onebeld%2FPleasantUI/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Onebeld","download_url":"https://codeload.github.com/Onebeld/PleasantUI/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Onebeld%2FPleasantUI/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32999522,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-13T13:14:54.681Z","status":"ssl_error","status_checked_at":"2026-05-13T13:14:51.610Z","response_time":115,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["avalonia","avaloniaui","c-sharp","control","controls","csharp","design","dotnet","interface","library","netstandard","nuget","pleasant","style","styled-components","styles","theme","ui","user-interface","xaml"],"created_at":"2026-04-27T10:00:28.328Z","updated_at":"2026-05-13T21:00:34.776Z","avatar_url":"https://github.com/Onebeld.png","language":"C#","funding_links":["https://patreon.com/onebeld","https://boosty.to/onebeld"],"categories":["Libraries \u0026 Extensions"],"sub_categories":["Controls"],"readme":"![GitHub License](https://img.shields.io/github/license/onebeld/PleasantUI?style=flat-square)\n![GitHub repo size](https://img.shields.io/github/repo-size/onebeld/PleasantUI?style=flat-square)\n![Nuget](https://img.shields.io/nuget/dt/PleasantUI?style=flat-square\u0026logo=nuget)\n![GitHub release (with filter)](https://img.shields.io/github/v/release/onebeld/PleasantUI?style=flat-square)\n\n\u003cimg align=\"center\" src=\"https://i.imgur.com/Sr3crB8.png\"\u003e\n\n![Imgur](https://i.imgur.com/7HXbYEo.png)\n\n# PleasantUI\n\n\u003e **Repositories:** [Original (Onebeld)](https://github.com/Onebeld/PleasantUI) · [Fork (ghudulf)](https://github.com/ghudulf/PleasantUI)\n\nPleasantUI is a cross-platform UI theme and control library for [Avalonia](https://github.com/AvaloniaUI/Avalonia), inspired by Microsoft Fluent Design and the WinUI/UWP visual language. It completely re-styles every standard Avalonia control and adds a suite of custom controls, a multi-theme engine with custom theme support, a reactive localization system, and a custom window chrome — all AOT-compatible with no `rd.xml` required.\n\nThe project has been in active development since 2021, originally as part of the [Regul](https://github.com/Onebeld/Regul) and [Regul Save Cleaner](https://github.com/Onebeld/RegulSaveCleaner) projects.\n\n## ✨ Features\n\n### Complete Fluent-style control theming\n\nEvery standard Avalonia control gets a full Fluent Design makeover — rounded corners, layered fill colors, smooth pointer-over and pressed transitions, and accent color integration:\n\n| Control | Control | Control |\n|---|---|---|\n| Button (+ AppBar, Accent, Danger variants) | CheckBox | RadioButton |\n| ToggleButton / ToggleSwitch | RepeatButton / ButtonSpinner | Slider |\n| TextBox / AutoCompleteBox | NumericUpDown | ComboBox / DropDownButton |\n| Calendar / CalendarDatePicker / TimePicker | DataGrid | ListBox / TreeView |\n| Expander | TabControl / TabItem | ScrollBar / ScrollViewer |\n| ProgressBar | Menu / ContextMenu | ToolTip |\n| Carousel | Separator | NotificationCard |\n\n### Custom Pleasant controls\n\nControls built from scratch that go beyond what Avalonia ships:\n\n| Control                                 | Description                                                                                                                                                                                   | Demo                                      |\n|-----------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------|\n| `PleasantWindow`                        | Custom window chrome with a Fluent title bar, subtitle, custom icon/title content, optional blur, content-extends-into-titlebar, and macOS caption override                                   | None                                      |\n| `NavigationView` / `NavigationViewItem` | Collapsible side navigation panel, similar to WinUI NavigationView                                                                                                                            | None                                      |\n| `PleasantTabView` / `PleasantTabItem`   | Chromium-style tab strip with add/close buttons and scrollable tab bar                                                                                                                        | None                                      |\n| `ContentDialog`                         | Modal overlay dialog with bottom button panel and smooth scroll content area                                                                                                                  | None                                      |\n| `PleasantSnackbar`                      | Temporary non-intrusive notification bar                                                                                                                                                      | ![Imgur](https://i.imgur.com/tAppDaS.gif) |\n| `ProgressRing`                          | Circular progress indicator — both determinate and indeterminate with animated arc                                                                                                            | ![Imgur](https://i.imgur.com/htsqFUE.gif) |\n| `OptionsDisplayItem`                    | Settings-style row with header, description, icon, action button slot, navigation chevron, and expandable content                                                                             | ![Imgur](https://i.imgur.com/ro1lGRN.png) |\n| `InformationBlock`                      | Compact pill-shaped label combining an icon and a value                                                                                                                                       | ![Imgur](https://i.imgur.com/SX0BZ2k.png) |\n| `MarkedTextBox` / `MarkedNumericUpDown` | Input controls with inline label/unit markers                                                                                                                                                 | None                                      |\n| `RippleEffect`                          | Material-style ripple click feedback                                                                                                                                                          | ![Imgur](https://i.imgur.com/2WtIPvj.gif) |\n| `SmoothScrollViewer`                    | ScrollViewer with inertia gesture support                                                                                                                                                     | None                                      |\n| `PleasantMiniWindow`                    | Lightweight floating window                                                                                                                                                                   | None                                      |\n| `Timeline`                              | Displays a list of events in chronological order along a vertical axis. Supports four layout modes, custom icons, and five severity types.                                                    | ![Imgur](https://i.imgur.com/DGP3nDR.png) |\n| `InstallWizard`                         | A multi-step installation wizard with a sidebar step list, progress bar, and Back / Next / Cancel navigation.                                                                                 | ![Imgur](https://i.imgur.com/bbgKH3L.png) |\n| `PleasantMenu`                          | A customizable flyout menu with a title, optional info badges, a grid of large icon buttons, and a footer bar with small utility buttons.                                                     | ![Imgur](https://i.imgur.com/kGYM2fL.png) |\n| `PathPicker`                            | Combines a read-only TextBox with a browse button. Supports OpenFile, SaveFile, and OpenFolder modes, optional multi-select, file-type filters, and two-way binding on the selected path text. | ![Imgur](https://i.imgur.com/qYyeQDd.png) |\n| `PopConfirm`                            | Wraps any trigger control and shows a small popup with a header, body, and Confirm / Cancel buttons before executing a command.                                                               | ![Imgur](https://i.imgur.com/D8VEQ8J.png) |\n\n### Theme engine\n\n- Built-in themes: **Light**, **Dark**, **Mint**, **Strawberry**, **Ice**, **Sunny**, **Spruce**, **Cherry**, **Cave**, **Lunar**\n- **System** mode — follows the OS light/dark preference automatically\n- **Custom themes** — create, edit, export, import, and persist your own color palettes via the built-in `ThemeEditorWindow`\n- Accent color follows the OS accent or can be overridden per-user; light/dark variants and gradient pairs are generated automatically\n- Settings are persisted to disk automatically on desktop; mobile apps can save manually\n\n### Localization system\n\n- `Localizer` singleton backed by .NET `ResourceManager` — add any number of `.resx` resource files\n- `{Localize Key}` AXAML markup extension binds reactively — switching language updates every bound string instantly without reloading views\n- `Localizer.TrDefault(key, fallback)` for safe lookups that fall back to a raw string instead of an error message\n- `LocalizationChanged` event for view models and code-behind to react to language switches\n\n## Packages\n\n| Package | Description |\n|---|---|\n| `PleasantUI` | Core theme, all control styles, Pleasant controls, theme engine, localization |\n| `PleasantUI.ToolKit` | `MessageBox`, `ThemeEditorWindow`, color picker utilities |\n| `PleasantUI.MaterialIcons` | Material Design icon geometry library for use with `PathIcon` |\n| `PleasantUI.DataGrid` | Fluent-styled DataGrid extension |\n\n## 📖 Documentation\n\nDetailed reference docs for each control are in the [`docs/`](docs/) folder:\n\n| Doc | Controls |\n|---|---|\n| [PleasantWindow](docs/PleasantWindow.md) | `PleasantWindow`, `IPleasantSplashScreen` |\n| [PleasantMiniWindow](docs/PleasantMiniWindow.md) | `PleasantMiniWindow` |\n| [PleasantTitleBar](docs/PleasantTitleBar.md) | `PleasantTitleBar` |\n| [PleasantCaptionButtons](docs/PleasantCaptionButtons.md) | `PleasantCaptionButtons` |\n| [NavigationView](docs/NavigationView.md) | `NavigationView`, `NavigationViewItem` |\n| [PleasantTabView](docs/PleasantTabView.md) | `PleasantTabView`, `PleasantTabItem` |\n| [ContentDialog](docs/ContentDialog.md) | `ContentDialog` |\n| [MessageBox](docs/MessageBox.md) | `MessageBox` (ToolKit) |\n| [PleasantDialog](docs/PleasantDialog.md) | `PleasantDialog` (ToolKit) |\n| [CrashReportDialog](docs/CrashReportDialog.md) | `CrashReportDialog` |\n| [StepDialog](docs/StepDialog.md) | `StepDialog` |\n| [PleasantSnackbar](docs/PleasantSnackbar.md) | `PleasantSnackbar` |\n| [ProgressRing](docs/ProgressRing.md) | `ProgressRing` |\n| [OptionsDisplayItem](docs/OptionsDisplayItem.md) | `OptionsDisplayItem` |\n| [InformationBlock](docs/InformationBlock.md) | `InformationBlock` |\n| [Timeline](docs/Timeline.md) | `Timeline`, `TimelineItem` |\n| [InstallWizard](docs/InstallWizard.md) | `InstallWizard`, `WizardStep` |\n| [PathPicker](docs/PathPicker.md) | `PathPicker` |\n| [PopConfirm](docs/PopConfirm.md) | `PopConfirm` |\n| [PleasantMenu](docs/PleasantMenu.md) | `PleasantMenu`, `PleasantMenuItem`, `PleasantMenuFooterItem` |\n| [PleasantMenuFlyout](docs/PleasantMenuFlyout.md) | `PleasantMenuFlyout` |\n| [PleasantFlyout](docs/PleasantFlyout.md) | `PleasantFlyout` |\n| [PinCode](docs/PinCode.md) | `PinCode` |\n| [SelectionList](docs/SelectionList.md) | `SelectionList`, `SelectionListItem` |\n| [RippleEffect](docs/RippleEffect.md) | `RippleEffect` |\n| [SmoothScrollViewer](docs/SmoothScrollViewer.md) | `SmoothScrollViewer` |\n| [MarkedInputs](docs/MarkedInputs.md) | `MarkedTextBox`, `MarkedNumericUpDown` |\n| [MarkedTextBox](docs/MarkedTextBox.md) | `MarkedTextBox` |\n| [MarkedNumericUpDown](docs/MarkedNumericUpDown.md) | `MarkedNumericUpDown` |\n| [PleasantDatePicker](docs/PleasantDatePicker.md) | `PleasantDatePicker` |\n| [PleasantBorder](docs/PleasantBorder.md) | `PleasantBorder` |\n| [BackdropBlurBorder](docs/BackdropBlurBorder.md) | `BackdropBlurBorder` |\n| [ShadowBorder](docs/ShadowBorder.md) | `ShadowBorder` |\n| [PleasantTrayPopup](docs/PleasantTrayPopup.md) | `PleasantTrayPopup`, `StatusItem` |\n| [DataGrid](docs/DataGrid.md) | `PleasantUI.DataGrid` package |\n| [PropertyGrid](docs/PropertyGrid.md) | `PropertyGrid`, `PropertyRow` |\n| [CommandBar](docs/CommandBar.md) | `CommandBar`, `CommandBarButton`, `CommandBarToggleButton` |\n| [BreadcrumbBar](docs/BreadcrumbBar.md) | `BreadcrumbBar`, `BreadcrumbBarItem` |\n| [PleasantDrawer](docs/PleasantDrawer.md) | `PleasantDrawer` |\n| [DashboardCard](docs/DashboardCard.md) | `DashboardCard` |\n| [DownloadPanel](docs/DownloadPanel.md) | `DownloadPanel` |\n| [LogViewerPanel](docs/LogViewerPanel.md) | `LogViewerPanel` |\n| [TerminalPanel](docs/TerminalPanel.md) | `TerminalPanel` |\n| [TreeViewPanel](docs/TreeViewPanel.md) | `TreeViewPanel`, `TreeViewSection` |\n| [ItemListPanel](docs/ItemListPanel.md) | `ItemListPanel` |\n| [VirtualizingWrapPanel](docs/VirtualizingWrapPanel.md) | `VirtualizingWrapPanel` |\n| [PleasantView](docs/PleasantView.md) | `PleasantView` |\n| [PleasantSplashScreen](docs/PleasantSplashScreen.md) | `PleasantSplashScreen` |\n| [ModalWindowHost](docs/ModalWindowHost.md) | `ModalWindowHost` |\n| [ThemePreviewVariantScope](docs/ThemePreviewVariantScope.md) | `ThemePreviewVariantScope` |\n| [Localization](docs/Localization.md) | `Localizer`, `{Localize}` markup extension |\n| [Theme Engine](docs/ThemeEngine.md) | `PleasantTheme`, custom themes, color tokens |\n\n## 🚀 Getting Started\n\n### Install\n\n**Package List (Avalonia 12)**\n\nPublished on NuGet:\n\n```xml\n\u003cPackageReference Include=\"PleasantUI\" Version=\"5.2.0\" /\u003e\n\u003cPackageReference Include=\"PleasantUI.DataGrid\" Version=\"5.2.0\" /\u003e\n\u003cPackageReference Include=\"PleasantUI.MaterialIcons\" Version=\"5.2.0\" /\u003e\n\u003cPackageReference Include=\"PleasantUI.ToolKit\" Version=\"5.2.0\" /\u003e\n```\n\n\n### Add the theme\n\nIn your `App.axaml`, add `PleasantTheme` to your styles:\n\n```xml\n\u003cApplication xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             x:Class=\"YourApp.App\"\u003e\n    \u003cApplication.Styles\u003e\n        \u003cPleasantTheme /\u003e\n    \u003c/Application.Styles\u003e\n\u003c/Application\u003e\n```\n\n### Initialize correctly\n\nMake sure `AvaloniaXamlLoader.Load(this)` is called in `Initialize()`:\n\n```csharp\npublic partial class App : Application\n{\n    public override void Initialize()\n    {\n        AvaloniaXamlLoader.Load(this); // required\n    }\n\n    public override void OnFrameworkInitializationCompleted()\n    {\n        if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)\n        {\n            desktop.MainWindow = new MainWindow\n            {\n                DataContext = new MainWindowViewModel(),\n            };\n        }\n\n        base.OnFrameworkInitializationCompleted();\n    }\n}\n```\n\n### Use PleasantWindow\n\nReplace `Window` with `PleasantWindow` to get the custom Fluent title bar:\n\n```csharp\nusing PleasantUI.Controls;\n\npublic partial class MainWindow : PleasantWindow\n{\n    public MainWindow() =\u003e InitializeComponent();\n}\n```\n\n```xml\n\u003cPleasantWindow xmlns=\"https://github.com/avaloniaui\"\n                xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n                xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n                xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n                mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n                x:Class=\"YourApp.Views.MainWindow\"\n                Title=\"Avalonia Application\"\u003e\n\u003c/PleasantWindow\u003e\n```\n\nKey `PleasantWindow` properties:\n\n| Property | Type | Description |\n|---|---|---|\n| `TitleBarType` | `Classic` / `ClassicExtended` | Title bar layout style |\n| `ExtendsContentIntoTitleBar` | `bool` | Lets content render behind the title bar |\n| `Subtitle` | `string` | Secondary text shown next to the title |\n| `DisplayIcon` | `object` | Custom icon content in the title bar |\n| `DisplayTitle` | `object` | Custom title content (e.g. a `PathIcon`) |\n| `EnableBlur` | `bool` | Acrylic/blur window background |\n| `CaptionButtons` | enum | Which caption buttons to show |\n| `LeftTitleBarContent` | `object` | Content injected left of the title |\n\n## 🌍 Localization\n\nRegister your `.resx` resource managers in your `Application` constructor:\n\n```csharp\npublic App()\n{\n    Localizer.AddRes(new ResourceManager(typeof(Properties.Localizations.App)));\n    Localizer.ChangeLang(\"en\");\n}\n```\n\nUse `{Localize Key}` in AXAML — updates live when the language changes:\n\n```xml\n\u003cTextBlock Text=\"{Localize WelcomeMessage}\" /\u003e\n\u003cButton Content=\"{Localize SaveButton}\" /\u003e\n```\n\nSwitch language at runtime:\n\n```csharp\nLocalizer.ChangeLang(\"ru\");\n```\n\nSafe lookup with fallback in code-behind:\n\n```csharp\nstring title = Localizer.TrDefault(\"DialogTitle\", \"Confirm\");\n```\n\n## 🔲 Button variants\n\n```xml\n\u003cButton Content=\"Default\" /\u003e\n\u003cButton Theme=\"{DynamicResource AccentButtonTheme}\" Content=\"Accent\" /\u003e\n\u003cButton Theme=\"{DynamicResource DangerButtonTheme}\" Content=\"Danger\" /\u003e\n\u003cButton Theme=\"{DynamicResource AppBarButtonTheme}\" Content=\"AppBar\" /\u003e\n```\n\n## 📃 OptionsDisplayItem\n\n```xml\n\u003c!-- Navigation row --\u003e\n\u003cOptionsDisplayItem Header=\"Account\"\n                    Description=\"Manage your account\"\n                    Icon=\"{x:Static MaterialIcons.AccountOutline}\"\n                    Navigates=\"True\" /\u003e\n\n\u003c!-- Row with action control --\u003e\n\u003cOptionsDisplayItem Header=\"Dark mode\"\n                    Icon=\"{x:Static MaterialIcons.WeatherNight}\"\u003e\n    \u003cOptionsDisplayItem.ActionButton\u003e\n        \u003cToggleSwitch /\u003e\n    \u003c/OptionsDisplayItem.ActionButton\u003e\n\u003c/OptionsDisplayItem\u003e\n\n\u003c!-- Expandable row --\u003e\n\u003cOptionsDisplayItem Header=\"Advanced\" Expands=\"True\"\u003e\n    \u003cOptionsDisplayItem.Content\u003e\n        \u003cStackPanel\u003e\n            \u003cCheckBox Content=\"Enable feature X\" /\u003e\n        \u003c/StackPanel\u003e\n    \u003c/OptionsDisplayItem.Content\u003e\n\u003c/OptionsDisplayItem\u003e\n```\n\n## 🖼️ Screenshots\n\n[Regul Save Cleaner](https://github.com/Onebeld/RegulSaveCleaner)\n\n![image](https://github.com/Onebeld/PleasantUI/assets/44552715/72544683-228f-4d1d-9465-e0401828bd5d)\n\n[OlibKey](https://github.com/Onebeld/OlibKey)\n\n![image](https://github.com/Onebeld/OlibKey/assets/44552715/c6f78465-0e3a-4757-ba03-903e93ec3e04)\n\n## ❤️ Credits\n\n- [Avalonia](https://github.com/AvaloniaUI/Avalonia)\n- Some controls inspired by PieroCastillo's [Aura.UI](https://github.com/PieroCastillo/Aura.UI)\n- [ProgressRing](https://github.com/ymg2006/FluentAvalonia.ProgressRing) by ymg2006\n- Built with [JetBrains Rider](https://www.jetbrains.com/rider/)\n\n\u003cimg src=\"https://i.imgur.com/IvbDwuz.png\" width=\"360\" align=\"right\"/\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FOnebeld%2FPleasantUI","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FOnebeld%2FPleasantUI","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FOnebeld%2FPleasantUI/lists"}