diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 637220298..2117c2ac6 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1 +1 @@ -github: [lepoco] \ No newline at end of file +# github: [lepoco] diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index e68acbff2..000000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: '' -labels: bug -assignees: pomianowski - ---- - -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Desktop (please complete the following information):** - - OS: [e.g. Windows 10] - - .NET: [e.g. net5.0-windows10.0.17763.0] - - Version: [e.g. 1.0.4-prerelease45] - -**Additional context** -Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml new file mode 100644 index 000000000..1b9d5f489 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -0,0 +1,49 @@ +name: Bug report +description: Create a report to help us improve +title: "Bug title" +labels: [bug] +body: + - type: textarea + validations: + required: true + attributes: + label: Describe the bug + description: A clear and concise description of what the bug is + - type: textarea + validations: + required: true + attributes: + label: To Reproduce + description: Steps to reproduce the behavior + - type: textarea + validations: + required: true + attributes: + label: Expected behavior + description: A clear and concise description of what you expected to happen + - type: textarea + attributes: + label: Screenshots + description: If applicable, add screenshots to help explain your problem + - type: textarea + validations: + required: true + attributes: + label: OS version + description: Which OS versions did you see the issue on? + - type: textarea + validations: + required: true + attributes: + label: .NET version + description: Which .NET versions did you see the issue on? + - type: textarea + validations: + required: true + attributes: + label: WPF-UI NuGet version + description: Which WPF-UI NuGet versions did you see the issue on? + - type: textarea + attributes: + label: Additional context + description: Add any other context about the problem here \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index 94047437e..000000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: '' -labels: enhancement -assignees: pomianowski - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml new file mode 100644 index 000000000..38358df4c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -0,0 +1,25 @@ +name: Feature request +description: Suggest an idea for the wpfui +title: "Feature request title" +labels: [enhancement] +body: + - type: textarea + validations: + required: true + attributes: + label: Is your feature request related to a problem? Please describe + description: A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + - type: textarea + validations: + required: true + attributes: + label: Describe the solution you'd like + description: A clear and concise description of what you want to happen + - type: textarea + attributes: + label: Describe alternatives you've considered + description: A clear and concise description of any alternative solutions or features you've considered + - type: textarea + attributes: + label: Additional context + description: Add any other context or screenshots about the feature request here \ No newline at end of file diff --git a/.github/labeler.yml b/.github/labeler.yml new file mode 100644 index 000000000..56acb887f --- /dev/null +++ b/.github/labeler.yml @@ -0,0 +1,29 @@ +--- +PR: + - "*" + +github_actions: + - .github/workflows/* + +documentation: + - docs/* + +update: + - src/Directory.Build.props + +controls: + - src/Wpf.Ui/Controls/* + +styles: + - src/Wpf.Ui/Styles/* + +icons: + - src/Wpf.Ui/Fonts/FluentSystemIcons-Filled.ttf + - src/Wpf.Ui/Fonts/FluentSystemIcons-Regular.ttf + +dependencies: + - src/Packages.props + - branding/package.json + +NuGet: + - src/Packages.props diff --git a/.github/labels.yml b/.github/labels.yml new file mode 100644 index 000000000..396124380 --- /dev/null +++ b/.github/labels.yml @@ -0,0 +1,73 @@ +--- +- name: "icons" + color: "86CBEC" + description: "Fonts and icons updates" +- name: "animations" + color: "233C4F" + description: "Topic is related to animations" +- name: "bug" + color: "d73a4a" + description: "Something isn't working" +- name: "controls" + color: "26CB0A" + description: "Changes to the appearance or logic of custom controls." +- name: "dependencies" + color: "0366d6" + description: "Pull requests that update a dependency file" +- name: "documentation" + color: "0075ca" + description: "Improvements or additions to documentation" +- name: "duplicate" + color: "cfd3d7" + description: "This issue or pull request already exists" +- name: "enhancement" + color: "a2eeef" + description: "New feature or request" +- name: "github_actions" + color: "000000" + description: "Pull requests that update GitHub Actions code" +- name: "good_first_issue" + color: "7057ff" + description: "Good for newcomers" +- name: "help_wanted" + color: "008672" + description: "Extra attention is needed" +- name: "invalid" + color: "e4e669" + description: "This doesn't seem right" +- name: "more_info_needed" + color: "B60205" + description: "More information is needed to solve the problem." +- name: "MVVM_DI" + color: "536317" + description: "Issues related to MVVM and Dependency Injection." +- name: "navigation" + color: "C2AAA3" + description: "Changes to navigation related controls." +- name: ".NET" + color: "7121c6" + description: "Pull requests that update .NET code." +- name: "NuGet" + color: "004880" + description: "Update of the NuGet package." +- name: "performance" + color: "D93F0B" + description: "Performance improvements." +- name: "PR" + color: "666666" + description: "Pull request." +- name: "question" + color: "d876e3" + description: "Further information is requested." +- name: "styles" + color: "bfd4f2" + description: "Updates to the appearance of the controls." +- name: "themes" + color: "080AA0" + description: "Updates to the appearance of the themes." +- name: "update" + color: "1D76DB" + description: "Pull Request containing the update." +- name: "wontfix" + color: "ffffff" + description: "This will not be worked on." diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 43831545b..8f2ecd4a9 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -2,7 +2,7 @@ name: DotNet Main on: push: - branches: [ main ] + branches: [main] workflow_dispatch: diff --git a/.github/workflows/DV.yml b/.github/workflows/DV.yml index dad667703..c383d047e 100644 --- a/.github/workflows/DV.yml +++ b/.github/workflows/DV.yml @@ -2,9 +2,9 @@ name: DotNet Development on: pull_request: - branches: [ development ] + branches: [development] push: - branches: [ development ] + branches: [development] workflow_dispatch: @@ -16,12 +16,12 @@ jobs: - uses: microsoft/setup-msbuild@v1.1 with: msbuild-architecture: x64 - - uses: nuget/setup-nuget@v1.0.6 + - uses: nuget/setup-nuget@v1.0.7 with: - nuget-version: 'latest' + nuget-version: "latest" - name: NuGet restore - run: nuget restore src/Wpf.Ui.sln + run: nuget restore src/Wpf.Ui.Demo.sln - name: Build run: msbuild src/Wpf.Ui.sln -p:Configuration=Release -m diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml new file mode 100644 index 000000000..356bbb911 --- /dev/null +++ b/.github/workflows/labeler.yml @@ -0,0 +1,14 @@ +name: "Pull Request Labeler" +on: + - pull_request_target + +jobs: + triage: + permissions: + contents: read + pull-requests: write + runs-on: ubuntu-latest + steps: + - uses: actions/labeler@v4 + with: + repo-token: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml index e36042e4e..5207ea059 100644 --- a/.github/workflows/lock.yml +++ b/.github/workflows/lock.yml @@ -17,4 +17,4 @@ jobs: exclude-any-issue-labels: "keep-unlocked, status:awaiting response" add-issue-labels: "locked-due-to-inactivity" issue-comment: "" - issue-lock-reason: "resolved" \ No newline at end of file + issue-lock-reason: "resolved" diff --git a/README.md b/README.md index e6458b18c..aeaa6d385 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,19 @@ A simple way to make your application written in WPF keep up with modern design [![GitHub license](https://img.shields.io/github/license/lepoco/wpfui)](https://github.com/lepoco/wpfui/blob/master/LICENSE) [![Nuget](https://img.shields.io/nuget/v/WPF-UI)](https://www.nuget.org/packages/WPF-UI/) [![Nuget](https://img.shields.io/nuget/dt/WPF-UI?label=nuget-downloads)](https://www.nuget.org/packages/WPF-UI/) [![VS 2022 Downloads](https://img.shields.io/visual-studio-marketplace/i/lepo.WPF-UI?label=vs-2022-downloads)](https://marketplace.visualstudio.com/items?itemName=lepo.WPF-UI) [![Size](https://img.shields.io/github/repo-size/lepoco/wpfui)](https://github.com/lepoco/wpfui) [![Sponsors](https://img.shields.io/github/sponsors/lepoco)](https://github.com/sponsors/lepoco) +![ua](https://user-images.githubusercontent.com/13592821/184498735-d296feb8-0f9b-45df-bc0d-b7f0b6f580ed.png) + +### Deliver humanitarian aid directly to Ukraine. + +https://bank.gov.ua/en/about/humanitarian-aid-to-ukraine + +### Refugees in Poland + +Many forms of support for refugees from Ukraine and organizations supporting them are available on the Polish government website +https://pomagamukrainie.gov.pl/chce-pomoc/prywatnie/pomoc-finansowa + +![ua](https://user-images.githubusercontent.com/13592821/184498735-d296feb8-0f9b-45df-bc0d-b7f0b6f580ed.png) + ## 🚀 Getting started For a starter guide see our [documentation](https://wpfui.lepo.co/documentation/). @@ -68,59 +81,9 @@ Radiograph is a computer hardware monitoring app that uses **WPF UI**. [](https://www.microsoft.com/en-us/p/radiograph/9nh1p86h06cg?activetab=pivot:overviewtab) -## 🛠️ Custom controls - -| Control | Namespace | Description | -| ----------------------- | ------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **UiWindow** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/UiWindow.cs) | WPF window with additional features. | -| **UiPage** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/UiPage.cs) | WPF page with additional features. | -| **Anchor** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/Anchor.cs) | Creates a hyperlink to web pages, files or anything else a URL can address. | -| **Arc** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/Arc.cs) | Draws a symmetrical arc with rounded edges. | -| **AutoSuggestBox** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/AutoSuggestBox.cs) | Represents a text control that makes suggestions to users as they enter text using a keyboard. | -| **Badge** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/Badge.cs) | Used to highlight an item, attract attention or flag status. | -| **Breadcrumb** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/Breadcrumb.cs) | Automatic display of the page title from the navigation in the application. | -| **Button** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/Button.cs) | Custom button with additional parameters like an icon. | -| **Card** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/Card.cs) | Simple card compatible with the theme for displaying other elements. | -| **CardAction** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/CardAction.cs) | Inherited from the Button interactive card styled according to Fluent Design. | -| **CardControl** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/CardControl.cs) | Inherited from the Button control which displays an additional control on the right side of the card. | -| **CardExpander** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/CardExpander.cs) | Inherited from the ContentControl control which can hide the collapsable content. | -| **CodeBlock** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/CodeBlock.cs) | Formats syntax and display a fragment of the source code. | -| **Dialog** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/Dialog.cs) | Displays a large card with a slightly transparent background and two action buttons. | -| **FontIcon** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/FontIcon.cs) | Represents a text element containing an icon glyph with selectable font family. | -| **Hyperlink** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/Hyperlink.cs) | Button that opens a URL in a web browser. | -| **SymbolIcon** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/SymbolIcon.cs) | Represents a text element containing an icon glyph. | -| **MessageBox** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/MessageBox.cs) | Custom window to display notifications outside the application. | -| **Navigation** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/Navigation.cs) | Navigation styled as UWP apps. | -| **NavigationHeader** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/NavigationHeader.cs) | Header for the navigation. | -| **NavigationSeparator** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/NavigationSeparator.cs) | Separator for the navigation. | -| **NavigationItem** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/NavigationItem.cs) | Element of the navigation. | -| **NavigationStore** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/NavigationStore.cs) | Navigation styled as Windows 11 Store app | -| **NavigationFluent** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/NavigationFluent.cs) | Navigation styled as Windows 11 Settings app. | -| **NavigationCompact** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/NavigationCompact.cs) | Compact navigation styled as Windows 11 Task Manager app. | -| **NotifyIcon** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/NotifyIcon.cs) | Icon with menu in the tray. | -| **NumberBox** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/NumberBox.cs) | Text field for entering numbers with the possibility of setting a mask. | -| **ProgressRing** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/ProgressRing.cs) | Rotating loading ring like in Windows 11. | -| **ThumbRate** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/ThumbRate.cs) | Buttons to leave positive or negative ratings. | -| **Rating** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/Rating.cs) | Stars to display the rating. | -| **Snackbar** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/Snackbar.cs) | Animated card with a notification displayed at the bottom of the application. | -| **ToggleSwitch** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/ToggleSwitch.cs) | Use ToggleSwitch to present users with two mutally exclusive options (like on/off). | -| **TextBox** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/TextBox.cs) | Text field for with placeholders and icons. | -| **TitleBar** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/TitleBar.cs) | A set of buttons that can replace the default window navigation, giving it a new, modern look with implemented [NotifyIcon](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Tray/NotifyIcon.cs). | - -## 🧩 Custom classes and tools - -| Class | Namespace | Description | -| -------------- | -------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | -| **Theme** | [Wpf.Ui.Appearance](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Appearance/Theme.cs) | Allows to manage available color themes from the library. | -| **Background** | [Wpf.Ui.Appearance](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Appearance/Background.cs) | Allows to add background effects like Mica or Acrylic. | -| **Accent** | [Wpf.Ui.Appearance](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Appearance/Accent.cs) | Allows to change the application color accents. | -| **Watcher** | [Wpf.Ui.Appearance](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Appearance/Watcher.cs) | Listens for changes in system parameters, then switches theme with **Appearance.Theme.Set**. | -| **Progress** | [Wpf.Ui.Taskbar](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Taskbar/Progress.cs) | Allows to change the status of the displayed notification in the application icon on the TaskBar. | -| **NotifyIcon** | [Wpf.Ui.Tray](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Tray/NotifyIcon.cs) | Allows to create an icon and a menu in the tray. | - ## 📖 Documentation -Documentation can be found at https://wpfui.lepo.co/. We also have a [tutorial](https://wpfui.lepo.co/documentation/tutorial) over there for newcomers. +Documentation can be found at https://wpfui.lepo.co/. We also have a [tutorial](https://wpfui.lepo.co/tutorial/) over there for newcomers. ## 🚧 Development @@ -132,42 +95,29 @@ First, your application needs to load custom styles, add in the **MyApp\App.xaml ```xml - + ``` -Now, you can customize your views, for example by adding a non-standard look to the main window and navigation buttons +Now you can create fantastic apps, e.g. with one button: ```xml + ... + xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"> - - - - - - - - - - - - - - - - - + ``` diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 000000000..eb998bf79 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,13 @@ +# Security Policy + +## Supported Versions + +At the moment, the only supported version of the **WPF UI** is the newest one. You can find it on _NuGet_. +https://www.nuget.org/packages/wpf-ui/ + +## Reporting a Vulnerability + +Security issues and bugs should be reported privately, by emailing support (at) lepo.co +lepo.co does not offer Bug Bounty for the **WPF UI** library. + +Please do not open issues for anything you think might have a security implication. diff --git a/branding/package.json b/branding/package.json index e43a87c6f..5b0827c6a 100644 --- a/branding/package.json +++ b/branding/package.json @@ -3,6 +3,6 @@ "name": "wpf-ui", "version": "1.1.0", "dependencies": { - "@fluentui/react-icons": "2.0.176" + "@fluentui/react-icons": "2.0.182" } } \ No newline at end of file diff --git a/build.cmd b/build.cmd new file mode 100644 index 000000000..242094145 --- /dev/null +++ b/build.cmd @@ -0,0 +1,4 @@ +@echo off +powershell -ExecutionPolicy ByPass -NoProfile -command "& """%~dp0scripts\build_demo.ps1"""" +@REM powershell -ExecutionPolicy ByPass -NoProfile -command "& """%~dp0scripts\build_extension.ps1"""" +exit /b %ErrorLevel% \ No newline at end of file diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 000000000..4378419e7 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,9 @@ +############### +# folder # +############### +/**/DROP/ +/**/TEMP/ +/**/packages/ +/**/bin/ +/**/obj/ +_site diff --git a/docs/BACKGROUND.md b/docs/BACKGROUND.md deleted file mode 100644 index fea922242..000000000 --- a/docs/BACKGROUND.md +++ /dev/null @@ -1,57 +0,0 @@ -# Backgrounds -With the help of WPF UI, you can take advantage of the new backgrounds available for Windows 11. -All you need to do is register your `Window` in the [Background](https://github.com/lepoco/wpfui/blob/main/WPFUI/Appearance/Background.cs) class before initialization. - -```cpp -namespace MyApp -{ - public partial class MainWindow : Window - { - public MainWindow() - { - Wpf.Ui.Appearance.Background.Apply( - this, // Window class - Wpf.Ui.Appearance.BackgroundType.Mica // Background type - ); - - InitializeComponent(); - } - } -} -``` - -```xml - - -``` - -### Available backgrounds -For the premiere edition of Windows 11, only the `Mica` background is available. -For later editions `Auto`, `Tabbed`, and `Acrylic` are also available. - -### Automatic change -The background can be changed automatically when changing the colors or the theme of the operating system using the [Watcher](https://github.com/lepoco/wpfui/blob/main/WPFUI/Appearance/Watcher.cs) class. -```cpp -namespace MyApp -{ - public partial class MainWindow : Window - { - public MainWindow() - { - InitializeComponent(); - - Loaded += (sender, args) => - { - Wpf.Ui.Appearance.Watcher.Watch( - this, // Window class - BackgroundType.Mica, // Background type - true // Whether to change accents automatically - ); - }; - } - } -} -``` diff --git a/docs/COLORS.md b/docs/COLORS.md deleted file mode 100644 index f5f428af7..000000000 --- a/docs/COLORS.md +++ /dev/null @@ -1,161 +0,0 @@ -# Colors -WPF UI uses three kinds of colors. Theme colors, system accents and palette. -Based on the colors of the themes, the [Brushes](https://github.com/lepoco/wpfui/blob/main/WPFUI/Styles/Assets/Brushes.xaml) are created. - -### Palette -The palette colors are available in the [Palette](https://github.com/lepoco/wpfui/blob/main/WPFUI/Styles/Assets/Palette.xaml) dictionary and are automatically added together with [Wpf.Ui.xaml](https://github.com/lepoco/wpfui/blob/main/WPFUI/Styles/Wpf.Ui.xaml). -```xml -#333333 -#F44336 -#E91E63 -#9C27B0 -#673AB7 -#3F51B5 -#2196F3 -#03A9F4 -#00BCD4 -#009688 -#4CAF50 -#8BC34A -#CDDC39 -#FFEB3B -#FFC107 -#FF9800 -#FF5722 -#795548 -#9E9E9E -#607D8B -``` - -### System Accents -System accents are saved in the [Accent](https://github.com/lepoco/wpfui/blob/main/WPFUI/Styles/Assets/Accent.xaml) dictionary by default. -```xml -#3379d9 -#559ce4 -#80b9ee -#add8ff -``` - -You can change system accents on the fly with the [Accent](https://github.com/lepoco/wpfui/blob/main/WPFUI/Appearance/Accent.cs) class. -```cpp -Wpf.Ui.Appearance.Accent.Apply( - SystemParameters.WindowGlassColor,// Base system accent - Wpf.Ui.Appearance.ThemeType.Light, // Theme type - true // Whether GlassColor is used -) -``` -```cpp -Wpf.Ui.Appearance.Accent.ApplySystemAccent(); -``` - -### Theme Colors -Each theme contains a collection of colors, e.g. a [Dark](https://github.com/lepoco/wpfui/blob/main/WPFUI/Styles/Theme/Dark.xaml) theme contains: -```xml -#202020 - -#FFFFFF -#C5FFFFFF -#87FFFFFF -#5DFFFFFF -#E4000000 - -#5DFFFFFF -#FFFFFF -#000000 -#80000000 -#87FFFFFF - -#0FFFFFFF -#15FFFFFF -#08FFFFFF -#0BFFFFFF -#00FFFFFF -#B31E1E1E - -#8BFFFFFF -#3FFFFFFF - -#454545 - -#00FFFFFF -#0FFFFFFF -#0AFFFFFF -#00FFFFFF - -#00FFFFFF -#19000000 -#0BFFFFFF -#12FFFFFF -#00FFFFFF - -#B31C1C1C -#1A1A1A -#131313 -#1E1E1E - -#28FFFFFF - -#12FFFFFF -#18FFFFFF -#14FFFFFF -#23000000 -#37000000 -#33000000 - -#6B000000 - -#19000000 -#1C1C1C - -#151515 - -#8BFFFFFF -#28FFFFFF - -#66757575 -#33000000 -#0F000000 - -#15FFFFFF - -#FFFFFF -#B3000000 - -#0DFFFFFF -#08FFFFFF - -#4D000000 - -#4C3A3A3A -#0DFFFFFF -#09FFFFFF -#09FFFFFF - -#202020 -#1C1C1C -#282828 -#2C2C2C -#00202020 - -#6CCB5F -#FCE100 -#FF99A4 -#8BFFFFFF -#9D9D9D -#08FFFFFF -#393D1B -#433519 -#442726 -#08FFFFFF -#2E2E2E -#2E2E2E -``` - -Theme colors can be changed with [Theme](https://github.com/lepoco/wpfui/blob/main/WPFUI/Appearance/Theme.cs) class. -```cpp -Wpf.Ui.Appearance.Theme.Set( - Wpf.Ui.Appearance.ThemeType.Light, // Theme type - Wpf.Ui.Appearance.BackgroundType.Mica, // Background type - true // Whether to be change accents automatically -); -``` \ No newline at end of file diff --git a/docs/CONTRIBUTE.md b/docs/CONTRIBUTE.md deleted file mode 100644 index 8bd99fdd5..000000000 --- a/docs/CONTRIBUTE.md +++ /dev/null @@ -1 +0,0 @@ -# Contribute \ No newline at end of file diff --git a/docs/CONTROLS.md b/docs/CONTROLS.md deleted file mode 100644 index 08917b929..000000000 --- a/docs/CONTROLS.md +++ /dev/null @@ -1,51 +0,0 @@ -# Controls -**WPF UI** has two kinds of controls. Default WPF ones, which styles have been overridden, and custom proprietary controls like `ProgressRing`. - -### Access to custom controls -In order for your `Window`, `Page`, or `UserControl` to use custom **WPF UI** controls, you need to add `wpfui` namespace. -```xml - - - -``` - -## 🛠️ Custom controls -| Control | Namespace | Description | -| --- | --- | --- | -| **UiWindow** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/UiWindow.cs) | WPF window with additional features. | -| **UiPage** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/UiPage.cs) | WPF page with additional features. | -| **Anchor** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/Anchor.cs) | Creates a hyperlink to web pages, files or anything else a URL can address. | -| **Arc** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/Arc.cs) | Draws a symmetrical arc with rounded edges. | -| **AutoSuggestBox** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/AutoSuggestBox.cs) | Represents a text control that makes suggestions to users as they enter text using a keyboard. | -| **Badge** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/Badge.cs) | Used to highlight an item, attract attention or flag status. | -| **Breadcrumb** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/Breadcrumb.cs) | Automatic display of the page title from the navigation in the application. | -| **Button** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/Button.cs) | Custom button with additional parameters like an icon. | -| **Card** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/Card.cs) | Simple card compatible with the theme for displaying other elements. | -| **CardAction** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/CardAction.cs) | Inherited from the Button interactive card styled according to Fluent Design. | -| **CardControl** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/CardControl.cs) | Inherited from the Button control which displays an additional control on the right side of the card. | -| **CardExpander** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/CardExpander.cs) | Inherited from the ContentControl control which can hide the collapsable content. | -| **CodeBlock** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/CodeBlock.cs) | Formats syntax and display a fragment of the source code. | -| **Dialog** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/Dialog.cs) | Displays a large card with a slightly transparent background and two action buttons. | -| **FontIcon** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/FontIcon.cs) | Represents a text element containing an icon glyph with selectable font family. | -| **Hyperlink** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/Hyperlink.cs) | Button that opens a URL in a web browser. | -| **SymbolIcon** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/SymbolIcon.cs) | Represents a text element containing an icon glyph. | -| **MessageBox** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/MessageBox.cs) | Custom window to display notifications outside the application. | -| **Navigation** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/Navigation.cs) | Navigation styled as UWP apps. | -| **NavigationHeader** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/NavigationHeader.cs) | Header for the navigation. | -| **NavigationSeparator** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/NavigationSeparator.cs) | Separator for the navigation. | -| **NavigationItem** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/NavigationItem.cs) | Element of the navigation. | -| **NavigationStore** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/NavigationStore.cs) | Navigation styled as Windows 11 Store app | -| **NavigationFluent** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/NavigationFluent.cs) | Navigation styled as Windows 11 Settings app. | -| **NavigationCompact** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/NavigationCompact.cs) | Compact navigation styled as Windows 11 Task Manager app. | -| **NotifyIcon** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/NotifyIcon.cs) | Icon with menu in the tray. | -| **NumberBox** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/NumberBox.cs) | Text field for entering numbers with the possibility of setting a mask. | -| **ProgressRing** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/ProgressRing.cs) | Rotating loading ring like in Windows 11. | -| **ThumbRate** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/ThumbRate.cs) | Buttons to leave positive or negative ratings. | -| **Rating** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/Rating.cs) | Stars to display the rating. | -| **Snackbar** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/Snackbar.cs) | Animated card with a notification displayed at the bottom of the application. | -| **ToggleSwitch** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/ToggleSwitch.cs) | Use ToggleSwitch to present users with two mutally exclusive options (like on/off). | -| **TextBox** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/TextBox.cs) | Text field for with placeholders and icons. | -| **TitleBar** | [Wpf.Ui.Controls](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/TitleBar.cs) | A set of buttons that can replace the default window navigation, giving it a new, modern look with implemented [NotifyIcon](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Tray/NotifyIcon.cs). | \ No newline at end of file diff --git a/docs/DATA.md b/docs/DATA.md deleted file mode 100644 index e5a6f103c..000000000 --- a/docs/DATA.md +++ /dev/null @@ -1,117 +0,0 @@ -# Data -There is often a need to display datasets. We can use default controls like `ListView` or `ItemsControl`, but **WPF UI** also provides controls like `VirtualizingItemsControl` or `VirtualizingWrapPanel` which allow you to display thousands of controls without slowing down your application. - -## ListView -```xml - -``` - -## ListBox -```xml - -``` - -## TreeView -```xml - - - - - - - - - - - - - - - - - - - - - - - - -``` - -## DataGrid -```xml - - - - - - - - - - -``` - -## VirtualizingWrapPanel -```xml - - - - - - - - - - - - - - -``` - -## VirtualizingItemsControl -```xml - - - - - - - -``` \ No newline at end of file diff --git a/docs/INPUT.md b/docs/INPUT.md deleted file mode 100644 index 7120198c6..000000000 --- a/docs/INPUT.md +++ /dev/null @@ -1,402 +0,0 @@ -# Forms - -**WPF UI** modifies the styles of the default text-editing controls and provides some new ones. - -# TextBox - -`TextBox` enables you to display or edit unformatted text. - -### Implementation - -```cpp -class System.Windows.Controls.TextBox -``` - -## Exposes - -```cpp -// Gets or sets the displayed / edited text. -TextBox.Text = "Hello World"; -``` - -### How to use - -```xml - -``` - -# ui:TextBox - -`ui:TextBox` enables you to display or edit unformatted text. Additionally, it has parameters such as icon or placeholder. - -### Implementation - -```cpp -class Wpf.Ui.Controls.TextBox -``` - -## Exposes - -```cpp -// Gets or sets the displayed / edited text. -TextBox.Text = "Hello World"; -``` - -```cpp -// Gets or sets text displayed if the parameter Text is empty. -TextBox.PlaceholderText = "Hello World"; -``` - -```cpp -// Gets or sets a value determining whether to display the placeholder. -TextBox.PlaceholderEnabled = true; -``` - -```cpp -// Gets or sets a value determining whether to enable the clear button. -TextBox.ClearButtonEnabled = true; -``` - -```cpp -// Gets or sets displayed icon. -TextBox.Icon = SymbolRegular.Fluent24; -``` - -```cpp -// Defines whether or not the SymbolFilled should be used. -TextBox.IconFilled = false; -``` - -```cpp -// Foreground of the icon. -TextBox.IconForeground = Brushes.White; -``` - -```cpp -// Defines which side the icon should be placed on. -TextBox.IconPlacement = ElementPlacement.Left; -``` - -### How to use - -```xml - -``` - -# PasswordBox - -`PasswordBox` represents a control designed for entering and handling passwords. - -### Implementation - -```cpp -class System.Windows.Controls.PasswordBox -``` - -## Exposes - -```cpp -// Gets or sets the password. -PasswordBox.Password = "Secret"; -``` - -```cpp -// Gets or sets the maximum length for passwords to be handled by this PasswordBox. -PasswordBox.MaxLength = 64; -``` - -```cpp -// Gets or sets the masking character for the PasswordBox. -PasswordBox.PasswordChar = '#'; -``` - -### How to use - -```xml - -``` - -# ui:PasswordBox - -`ui:PasswordBox` represents a control designed for entering and handling passwords. Additionally, it has parameters such as icon or placeholder. - -### Implementation - -```cpp -class Wpf.Ui.Controls.PasswordBox -``` - -## Exposes - -```cpp -// Gets or sets the password. -PasswordBox.Password = "Secret"; -``` - -```cpp -// Gets or sets the maximum length for passwords to be handled by this PasswordBox. -PasswordBox.MaxLength = 64; -``` - -```cpp -// Gets or sets character used to mask the password. -PasswordBox.PasswordChar = '*'; -``` - -```cpp -// Gets or sets a value deciding whether to display the reveal password button. -PasswordBox.RevealButtonEnabled = true; -``` - -```cpp -// Gets or sets text displayed if the parameter Text is empty. -PasswordBox.PlaceholderText = "Hello World"; -``` - -```cpp -// Gets or sets a value determining whether to display the placeholder. -PasswordBox.PlaceholderEnabled = true; -``` - -```cpp -// Gets or sets a value determining whether to enable the clear button. -PasswordBox.ClearButtonEnabled = true; -``` - -```cpp -// Gets or sets displayed icon. -PasswordBox.Icon = SymbolRegular.Fluent24; -``` - -```cpp -// Defines whether or not the SymbolFilled should be used. -PasswordBox.IconFilled = false; -``` - -```cpp -// Foreground of the icon. -PasswordBox.IconForeground = Brushes.White; -``` - -```cpp -// Defines which side the icon should be placed on. -PasswordBox.IconPlacement = ElementPlacement.Left; -``` - -### How to use - -```xml - -``` - -# ui:NumberBox - -`ui:NumberBox` is a control adapted to entering numerical values. Additionally, it has parameters such as icon or placeholder. - -### Implementation - -```cpp -class Wpf.Ui.Controls.NumberBox -``` - -## Exposes - -```cpp -// Gets or sets current numeric value. -NumberBox.Value = 10.0; -``` - -```cpp -// Gets or sets value by which the given number will be increased or decreased after pressing the button. -NumberBox.Step = 10.0; -``` - -```cpp -// Maximum allowable value. -NumberBox.Max = 100.0; -``` - -```cpp -// Minimum allowable value. -NumberBox.Max = 0.0; -``` - -```cpp -// Number of decimal places. -NumberBox.DecimalPlaces = 2; -``` - -```cpp -// Gets or sets numbers pattern. -NumberBox.Mask = ""; -``` - -```cpp -// Gets or sets value determining whether to display the button controls. -NumberBox.SpinButtonsEnabled = true; -``` - -```cpp -// Gets or sets value which determines whether only integers can be entered. -NumberBox.IntegersOnly = false; -``` - -```cpp -// Gets or sets text displayed if the parameter Text is empty. -NumberBox.PlaceholderText = "Hello World"; -``` - -```cpp -// Gets or sets a value determining whether to display the placeholder. -NumberBox.PlaceholderEnabled = true; -``` - -```cpp -// Gets or sets a value determining whether to enable the clear button. -NumberBox.ClearButtonEnabled = true; -``` - -```cpp -// Gets or sets displayed icon. -NumberBox.Icon = SymbolRegular.Fluent24; -``` - -```cpp -// Defines whether or not the SymbolFilled should be used. -NumberBox.IconFilled = false; -``` - -```cpp -// Foreground of the icon. -NumberBox.IconForeground = Brushes.White; -``` - -```cpp -// Defines which side the icon should be placed on. -NumberBox.IconPlacement = ElementPlacement.Left; -``` - -```cpp -// Event occurs when a value is incremented by button or arrow key. -NumberBox.Incremented += OnNumberBoxIncremented; -``` - -```cpp -// Event occurs when a value is decremented by button or arrow key. -NumberBox.Decremented += OnNumberBoxDecremented; -``` - -### How to use - -```xml - -``` - -# ui:AutoSuggestBox - -`ui:AutoSuggestBox` represents a text control that makes suggestions to users as they enter text. Additionally, it has parameters such as icon or placeholder. - -### Implementation - -```cpp -class Wpf.Ui.Controls.AutoSuggestBox -``` - -## Exposes - -```cpp -// ItemsSource specifies a collection used to generate the list of suggestions. -AutoSuggestBox.ItemsSource = new List{"One", "Two"}; -``` - -```cpp -// Gets or sets the displayed / edited text. -AutoSuggestBox.Text = "Hello World"; -``` - -```cpp -// Gets or sets text displayed if the parameter Text is empty. -AutoSuggestBox.PlaceholderText = "Hello World"; -``` - -```cpp -// Gets or sets a value determining whether to display the placeholder. -AutoSuggestBox.PlaceholderEnabled = true; -``` - -```cpp -// Gets or sets a value determining whether to enable the clear button. -AutoSuggestBox.ClearButtonEnabled = true; -``` - -```cpp -// Gets or sets displayed icon. -AutoSuggestBox.Icon = SymbolRegular.Fluent24; -``` - -```cpp -// Defines whether or not the SymbolFilled should be used. -AutoSuggestBox.IconFilled = false; -``` - -```cpp -// Foreground of the icon. -AutoSuggestBox.IconForeground = Brushes.White; -``` - -```cpp -// Defines which side the icon should be placed on. -AutoSuggestBox.IconPlacement = ElementPlacement.Left; -``` - -### How to use - -```xml - -``` diff --git a/docs/MENU.md b/docs/MENU.md deleted file mode 100644 index 793c71fb1..000000000 --- a/docs/MENU.md +++ /dev/null @@ -1,57 +0,0 @@ -# Menus -**WPF UI** mainly modifies the styles of already added navigation related controls in WPF. The exceptions are, for example, the `MenuItem`, which has a `SymbolIcon` parameter added to it. - -## Menu -An interesting menu, you can create, for example, this way. -```xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -``` -As you can see, in some places we use the native `MenuItem` control, and in some places we use `wpfui: MenuItem`. You can mix them with each other freely. \ No newline at end of file diff --git a/docs/PAGES.md b/docs/PAGES.md deleted file mode 100644 index 8812fa83a..000000000 --- a/docs/PAGES.md +++ /dev/null @@ -1,33 +0,0 @@ -# Pages -Pages are controls that you display inside a `Frame` control using one of the available navigation methods. -[You can read more here](https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.page) - -**WPF UI** provides you with several modifiers for the `Page` control that can help you manage your application. - -## Add a custom style -The custom `UiPage` style changes the background, text color and some basic parameters according to your chosen theme. - -```xml - - -``` - -You can also use an other style, `UiPageScrollable`, which automatically adds a scrollbar if the page content is too long. -```xml - - -``` \ No newline at end of file diff --git a/docs/SERVICES.md b/docs/SERVICES.md deleted file mode 100644 index 76d36387d..000000000 --- a/docs/SERVICES.md +++ /dev/null @@ -1,60 +0,0 @@ -# Services -**WPF UI** tries to support ***Dependency Injection*** (DI) and ***Model-View-ViewModel*** (MVVM) patterns. -If you use [CommunityToolkit](https://github.com/CommunityToolkit/dotnet) or [Microsoft.Toolkit.Mvvm](https://docs.microsoft.com/en-us/windows/communitytoolkit/mvvm/introduction) in your application, the services listed below may be useful for you. - -## Getting started -**MVVM** -Model–view–viewmodel (MVVM) is a software architectural pattern that facilitates the separation of the development of the graphical user interface (the view) – be it via a markup language or GUI code – from the development of the business logic or back-end logic (the model) so that the view is not dependent on any specific model platform.[^1] - -**DI** -In software engineering, dependency injection is a design pattern in which an object receives other objects that it depends on. A form of inversion of control, dependency injection aims to separate the concerns of constructing objects and using them, leading to loosely coupled programs.[^2] - -**Sources in WPF UI** -The classes and interfaces created for MVVM and DI are in the namespace: -```cpp -namespace Wpf.Ui.Mvvm.Services; -``` - -# DialogService -`DialogService` is responsible for managing the display of the `Dialog` control. - -### Contract -```cpp -interface Wpf.Ui.Mvvm.Contracts.IDialogService -``` - -### Implementation -```cpp -class Wpf.Ui.Mvvm.Services.DialogService -``` - -## Exposes -```cpp -// Sets the IDialogControl -IDialogService.SetDialogControl(IDialogControl dialog); -``` -```cpp -// Provides direct access to the IDialogControl -IDialogService.GetDialogControl(); -``` - -### How to use -```cpp -// Services registration in your service management class -private static void ConfigureServices(HostBuilderContext context, IServiceCollection services) -{ - services.AddSingleton(); -} - -// Pointing to an existing control somewhere in your Window or Page. -public Container(IDialogService dialogService) -{ - dialogService.SetDialogControl(MyDialogControlName); -} -``` - - - -[^1]: Model–view–viewmodel https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel - -[^2]: Dependency injection https://en.wikipedia.org/wiki/Dependency_injection \ No newline at end of file diff --git a/docs/TRAY.md b/docs/TRAY.md deleted file mode 100644 index dbb75f327..000000000 --- a/docs/TRAY.md +++ /dev/null @@ -1,57 +0,0 @@ -# Tray -**WPF UI** implements Tray icon its own way using native Windows features. -You can create such an icon in several ways, but we particularly recommend pinning it to the `Titlebar` control inside your main `Window`. Thanks to this, you will have access to all functionalities. - -```xml - - - - - - - - - - - -``` - -## NotifyIcon -The `NotifyIcon` control can be placed inside one of your XAML files, or simply created in code. -It has several properties. - -`TooltipText` is the text that will be displayed when you hover your mouse over the icon. -```cpp -NotifyIcon.TooltipText = "Hello World"; -``` - -`FocusOnLeftClick` automatically restores your `Window` if it is minimized, and drags it over all other applications. -```cpp -NotifyIcon.FocusOnLeftClick = true; -``` - -`MenuOnRightClick` automatically opens the menu you set on right-click. -```cpp -NotifyIcon.MenuOnRightClick = true; -``` - -`Icon` is an `ImageSource`, e.g. in the form of a PNG that will be used as an icon. It should be added as the `Resource` of your application. -```cpp -NotifyIcon.Icon = "pack://application:,,,/Assets/Wpf.Ui.png"; -``` - -`Menu` is the `ContextMenu` that will appear in the tray after right-click. -```cpp -NotifyIcon.Menu = new ContextMenu(); -``` - -`MenuFontSize` is a `Double` number that defines the size of the text in the menu. -```cpp -NotifyIcon.MenuFontSize = 14d; -``` \ No newline at end of file diff --git a/docs/TUTORIAL.md b/docs/TUTORIAL.md deleted file mode 100644 index 24f4ca773..000000000 --- a/docs/TUTORIAL.md +++ /dev/null @@ -1,225 +0,0 @@ -# Tutorial - -**WPF UI** is a library built for [WPF](https://docs.microsoft.com/en-us/visualstudio/designers/getting-started-with-wpf) and the [C#](https://docs.microsoft.com/en-us/dotnet/csharp/) language. To be able to work with them comfortably, you will need [Visual Studio Community Edition](https://visualstudio.microsoft.com/vs/community/) _(NOT VISUAL STUDIO CODE)_. - -- [Visual Studio 2022](https://visualstudio.microsoft.com/vs/community/) -- .NET desktop development package _(via VS2022 installer)_ - -## Get a package - -The first thing you need to do is install the WPF UI via the package manager. -To do so, in your new WPF project, right-click on **Dependencies** and **Manage NuGet Packages** - -Type **WPF-UI** in the search and when the correct result appears - click **Install**. - -![image](https://user-images.githubusercontent.com/13592821/158079885-7715b552-bbc6-4574-bac9-92ecb7b161d8.png) - -## Adding dictionaries - -[XAML](https://docs.microsoft.com/en-us/dotnet/desktop/wpf/xaml/?view=netdesktop-6.0), and hence WPF, operate on resource dictionaries. These are HTML-like files that describe the appearance and various aspects of the [controls](https://wpfui.lepo.co/documentation/controls). -**WPF UI** adds its own sets of these files to tell the application how the controls should look like. - -There should be a file called `App.xaml` in your new application. Add new dictionaries to it using **WPF UI** `Resources` class: - -```xml - - - - - - - - - - -``` - -You can choose a color theme here, -`Light` or `Dark`. - -## The main window - -At the design stage, we decided not to create ready-made [Window](https://docs.microsoft.com/en-us/dotnet/api/system.windows.window?view=windowsdesktop-6.0) templates, so you can design everything, including [TitleBar](https://github.com/lepoco/wpfui/blob/main/WPFUI/Controls/TitleBar.cs), to your liking. This takes a little more work at the beginning, but allows you to have more control over application look. - -First, let's modify MainWindow.xaml - -```xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -``` - -Things have changed a bit, so let's go over what is what. - -#### WPF UI Namespace - -This line tells the interpreter that we will be using the **WPF UI** controls under the **ui:** abbreviation - -```xml - -``` - -#### Pages Namespace - -This line informs that in the given directory there are files of our pages. They will be displayed by the navigation. - -```xml - -``` - -#### Style - -This line will make the window of our application slightly change. Necessary effects required for the correct display of the custom controls will be added. - -```xml - -``` - -#### Navigation - -The `ui:NavigationStore` control is responsible managing the displayed pages. The [Page](https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.page) is displayed inside the [Frame](https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.frame). -As you can see in the example above, the navigation indicates which Frame will display pages. - -```xml - - - -``` - -### Bradcrumb - -Breadcrumb is a small navigation aid, it automatically displays the title of the currently used [Page](https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.page) based on its name given in the navigation. As you can see in the example above, Breadcrumb has indicated which navigation it should use - -```xml - - - -``` - -### TitleBar - -The [TitleBar](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/TitleBar.cs) includes minimize, maximize, and close buttons, and lets you drag the application across the desktop by grabbing at its top bar. -`TitleBar` is a powerful control and allows you to control aspects such as the [Tray](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Tray/NotifyIcon.cs) icon/menu or [SnapLayout](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Controls/SnapLayout.cs). - -```xml - - - - - - - - - - - -``` diff --git a/docs/WINDOWS.md b/docs/WINDOWS.md deleted file mode 100644 index 58d21d9d7..000000000 --- a/docs/WINDOWS.md +++ /dev/null @@ -1,86 +0,0 @@ -# Windows -Before we cover non-standard `Window` behavior, we need to understand how the window works, well... in Windows. -In hidden code layers WPF uses WINAPI to create a native system window. Then, inside it, we can create the content of our application. Each such native window has a number of additional properties that can be modified, like border, minimize button or icon. The window also receives WM (Windows Messages) such as keystrokes or mouse movements. These can also be manually processed to achieve specific effects. - -## Default `Window` with transparency -The classic Window control in WPF allows us to set parameters such as size, transparency or name. You can [read more about it here](https://docs.microsoft.com/en-us/dotnet/api/system.windows.window). While transparency matters in the context of Acrylic effect, Mica does not really need it for the entire window, but only for its content. -Therefore, if we want to get the cool effect of a fully custom window, we should remove the default titlebar and make the background of our content presenter transparent. - -One way to do this is to use `WindowChrome`. And then setting the background of our `Window` control to transparent. -```xml - - - -``` -Additionally, a few parameters related to margins need to be modified, so if you want an easy window effect without the default titlebar, you can use the preset style. -```xml - - -``` -As you can see, the above `Window` does not set a transparent background. The reason for this is that if the application is run on Windows 10 and not 11, the background will be just black. Therefore, it is worth using a ready-made function in the **WPF UI** which is Background.Apply. -```cpp -public partial class MyWindow : Window -{ - public MyWindow() - { - InitializeComponent(); - - Wpf.Ui.Appearance.Background.Apply(this, Wpf.Ui.Appearance.BackgroundType.Mica); - } -} -``` -The above function will check if the used OS is version 11 or higher and will remove the `Window` background automatically. - -## Custom `UiWindow` control -In **WPF UI**, you'll find a `UiWindow` control. It has custom styles immediately, but by default it does not use `WindowChrome`. Many of its functions can be forced manually. - -For example, you can remove the default menu -```cpp -public partial class MyWindow : Wpf.Ui.Controls.UiWindow -{ - public MyWindow() - { - InitializeComponent(); - - RemoveTitlebar(); - } -} -``` - -Or choose a background for Windows 11 (this method is just a shortcut to Background.Apply). -```cpp -public partial class MyWindow : Wpf.Ui.Controls.UiWindow -{ - public MyWindow() - { - InitializeComponent(); - - ApplyBackdrop(Wpf.Ui.Appearance.BackgroundType.Mica); - } -} -``` - -~~~ -**NOTE** -The `UiWindow` control is under development and experimental, please check branch development to stay up to date. -~~~ - -## Known limitations -You must remember that **WPF UI** is designed for single-window, non-fullscreen applications. If your application has special needs and behaviors, don't use the `Style="{DynamicResource UiWindow}"` and create your own. You can also play with the `UiWindow` control to achieve the desired effect. - -Known issues include: - - Strange window behavior on Windows 7. - - Problems with maximization. - - Problems with multi-window applications. \ No newline at end of file diff --git a/docs/build.ps1 b/docs/build.ps1 new file mode 100644 index 000000000..ea0b8bccb --- /dev/null +++ b/docs/build.ps1 @@ -0,0 +1 @@ +docfx .\docfx.json --serve \ No newline at end of file diff --git a/docs/docfx.json b/docs/docfx.json new file mode 100644 index 000000000..2329f8dd4 --- /dev/null +++ b/docs/docfx.json @@ -0,0 +1,63 @@ +{ + "metadata": [ + { + "src": [ + { + "files": ["*.csproj"], + "exclude": ["**/bin/**", "**/obj/**"], + "src": "../src/Wpf.Ui" + } + ], + "dest": "documentation", + "properties": { + "TargetFramework": "net6.0" + }, + "disableGitFeatures": false, + "disableDefaultFilter": false + } + ], + "build": { + "content": [ + { + "files": ["tutorial/**.md", "tutorial/**/toc.yml", "toc.yml", "*.md"] + }, + { + "files": ["documentation/**.yml", "documentation/index.md"] + } + ], + "resource": [ + { + "files": ["images/**", "manifest.webmanifest", "robots.txt"] + } + ], + "overwrite": [ + { + "exclude": ["obj/**", "_site/**"] + } + ], + "dest": "_site", + "globalMetadata": { + "_appTitle": "WPF UI", + "_appName": "WPF UI", + "_appFaviconPath": "images/favicon.ico", + "_appLogoPath": "images/wpfui.png", + "_appFooter": "", + "_description": "A simple way to make your application written in WPF keep up with modern design trends.", + "_copyrightFooter": "", + "_enableSearch": false, + "_disableSideFilter": false, + "_enableNewTab": true, + "_disableContribution": false, + "_disableBreadcrumb": false + }, + "globalMetadataFiles": [], + "fileMetadataFiles": [], + "template": ["default", "templates/singulinkfx"], + "postProcessors": [], + "markdownEngineName": "markdig", + "noLangKeyword": false, + "keepFileLink": false, + "cleanupCacheHistory": false, + "disableGitFeatures": false + } +} diff --git a/docs/documentation/.gitignore b/docs/documentation/.gitignore new file mode 100644 index 000000000..e8079a3be --- /dev/null +++ b/docs/documentation/.gitignore @@ -0,0 +1,5 @@ +############### +# temp file # +############### +*.yml +.manifest diff --git a/docs/README.md b/docs/documentation/index.md similarity index 98% rename from docs/README.md rename to docs/documentation/index.md index 7445fe8cf..c9a3f60e4 100644 --- a/docs/README.md +++ b/docs/documentation/index.md @@ -8,7 +8,7 @@ By default, the library is created for `.NET 6`. If you want to know more about ### 🚀 Getting started Before you start playing around with **WPF UI**, we recommend that you familiarize yourself [with the WPF basics](https://docs.microsoft.com/en-us/dotnet/desktop/wpf/get-started/create-app-visual-studio?view=netdesktop-6.0). -When you know more or less what and how, [see our tutorial](https://wpfui.lepo.co/documentation/tutorial). +When you know more or less what and how, [see our tutorial](https://wpfui.lepo.co/tutorial/tutorial.html). ### Windows Presentation Foundation diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/applicationIcon.ico b/docs/images/favicon.ico similarity index 100% rename from src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/applicationIcon.ico rename to docs/images/favicon.ico diff --git a/docs/images/icon-192x192.png b/docs/images/icon-192x192.png new file mode 100644 index 000000000..e0bbb5a3b Binary files /dev/null and b/docs/images/icon-192x192.png differ diff --git a/docs/images/icon-256x256.png b/docs/images/icon-256x256.png new file mode 100644 index 000000000..ae017fbf0 Binary files /dev/null and b/docs/images/icon-256x256.png differ diff --git a/docs/images/icon-384x384.png b/docs/images/icon-384x384.png new file mode 100644 index 000000000..247f1052b Binary files /dev/null and b/docs/images/icon-384x384.png differ diff --git a/docs/images/icon-512x512.png b/docs/images/icon-512x512.png new file mode 100644 index 000000000..583a9cc5a Binary files /dev/null and b/docs/images/icon-512x512.png differ diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/Assets/applicationIcon-1024.png b/docs/images/wpfui.png similarity index 100% rename from src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/Assets/applicationIcon-1024.png rename to docs/images/wpfui.png diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 000000000..cb51cd454 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,157 @@ +
+ WPF UI banner image +
+ +# WPF UI + +[Created with ❤ in Poland by lepo.co](https://dev.lepo.co/) +A simple way to make your application written in WPF keep up with modern design trends. Library changes the base elements like `Page`, `ToggleButton` or `List`, and also includes additional controls like `Navigation`, `NumberBox`, `Dialog` or `Snackbar`. + +[![GitHub license](https://img.shields.io/github/license/lepoco/wpfui)](https://github.com/lepoco/wpfui/blob/master/LICENSE) [![Nuget](https://img.shields.io/nuget/v/WPF-UI)](https://www.nuget.org/packages/WPF-UI/) [![Nuget](https://img.shields.io/nuget/dt/WPF-UI?label=nuget-downloads)](https://www.nuget.org/packages/WPF-UI/) [![VS 2022 Downloads](https://img.shields.io/visual-studio-marketplace/i/lepo.WPF-UI?label=vs-2022-downloads)](https://marketplace.visualstudio.com/items?itemName=lepo.WPF-UI) [![Size](https://img.shields.io/github/repo-size/lepoco/wpfui)](https://github.com/lepoco/wpfui) [![Sponsors](https://img.shields.io/github/sponsors/lepoco)](https://github.com/sponsors/lepoco) + +![ua](https://user-images.githubusercontent.com/13592821/184498735-d296feb8-0f9b-45df-bc0d-b7f0b6f580ed.png) + +### Deliver humanitarian aid directly to Ukraine. + +https://bank.gov.ua/en/about/humanitarian-aid-to-ukraine + +### Refugees in Poland + +Many forms of support for refugees from Ukraine and organizations supporting them are available on the Polish government website +https://pomagamukrainie.gov.pl/chce-pomoc/prywatnie/pomoc-finansowa + +![ua](https://user-images.githubusercontent.com/13592821/184498735-d296feb8-0f9b-45df-bc0d-b7f0b6f580ed.png) + +## 🚀 Getting started + +For a starter guide see our [documentation](https://wpfui.lepo.co/documentation/). + +**WPF UI** is delivered via **NuGet** package manager. You can find the package here: +https://www.nuget.org/packages/wpf-ui/ + +**Visual Studio** +The plugin for **Visual Studio 2022** let you easily create new projects using **WPF UI**. +https://marketplace.visualstudio.com/items?itemName=lepo.wpf-ui + +## 📁 What's included? + +| Name | Framework | +| ----------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Wpf.Ui**
Library that allows you to use all features in your own application | [![NET6](https://img.shields.io/badge/.NET-6.0-red)](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/WPFUI.csproj) [![NET5](https://img.shields.io/badge/.NET-5.0-blue)](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/WPFUI.csproj)
[![NETCore3](https://img.shields.io/badge/.NET%20Core-3.1-brightgreen)](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/WPFUI.csproj)
[![NETFramework48](https://img.shields.io/badge/.NET%20Framework-4.8-orange)](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/WPFUI.csproj)
[![NETFramework47](https://img.shields.io/badge/.NET%20Framework-4.7-orange)](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/WPFUI.csproj)
[![NETFramework461](https://img.shields.io/badge/.NET%20Framework-4.6.1-orange)](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/WPFUI.csproj) | +| **Wpf.Ui.Demo**
An MVVM application written in WPF .NET 6 where you can test the features. | [![NET6win](https://img.shields.io/badge/.NET-6.0--windows-red)](https://github.com/lepoco/wpfui/blob/main/WPFUI.Demo/WPFUI.Demo.csproj) | +| **Wpf.Ui.SimpleDemo**
Simple .NET 6 application with navigation. | [![NET6win](https://img.shields.io/badge/.NET-6.0--windows-red)](https://github.com/lepoco/wpfui/blob/main/WPFUI.Demo/WPFUI.Demo.csproj) | +| **Wpf.Ui.FontMapper**
Console app for generating Fluent System Icons enums. | [![NET6win](https://img.shields.io/badge/.NET-6.0-yellow)](https://github.com/lepoco/wpfui/blob/main/WPFUI.Demo/WPFUI.Demo.csproj) | +| **Wpf.Ui.Extension**
Project for Visual Studio 2022 extension. | [![NET6win](https://img.shields.io/badge/MS%20Build-blue)](https://github.com/lepoco/wpfui/blob/main/WPFUI.Demo/WPFUI.Demo.csproj) | + +## 🏭 Branches + +| Branch | Status | +| ---------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| [**WPF UI - Main**](https://github.com/lepoco/wpfui/tree/main) | [![Build status](https://img.shields.io/github/workflow/status/lepoco/wpfui/DotNet%20Main/main)](https://github.com/lepoco/wpfui/actions/workflows/CI.yml) | +| [**WPF UI - Development**](https://github.com/lepoco/wpfui/tree/development) | [![Build status](https://img.shields.io/github/workflow/status/lepoco/wpfui/DotNet%20Development/development)](https://github.com/lepoco/wpfui/actions/workflows/DV.yml) | + +## 📷 Screenshots + +![Demo App Sample](https://user-images.githubusercontent.com/13592821/166259110-0fb98120-fe34-4e6d-ab92-9f72ad7113c3.png) + +![Text Editor Sample](https://user-images.githubusercontent.com/13592821/165918838-a65cbb86-4fc4-4efb-adb7-e39027fb661f.png) + +![Store App Sample](https://user-images.githubusercontent.com/13592821/165918914-6948fb42-1ee1-4c36-870e-65bb8ffe3c8a.png) + +## 🏗️ Works with Visual Studio Designer + +![VS2022 Designer Preview](https://user-images.githubusercontent.com/13592821/165919228-0aa3a36c-fb37-4198-835e-53488845226c.png) + +## 🏁 Virtualized panels for displaying thousands controls + +![WPF UI virtualized wrap panels](https://user-images.githubusercontent.com/13592821/167254364-bc7d1106-2740-4337-907c-0e0f1ce4c320.png) + +## ❤️ Custom Tray icon and menu in pure WPF + +![WPF UI Tray menu in WPF](https://user-images.githubusercontent.com/13592821/166259470-2d48a88e-47ce-4f8f-8f07-c9b110de64a5.png) + +## ⚓ Custom Windows 11 SnapLayout available for TitleBar. + +![WPF UI Snap Layout for WPF](https://user-images.githubusercontent.com/13592821/166259869-e60d37e4-ded4-46bf-80d9-f92c47266f34.png) + +## 🚧 Development + +If you want to propose a new functionality or submit a bugfix, create a [Pull Request](https://github.com/lepoco/wpfui/compare/development...development) for the branch [development](https://github.com/lepoco/wpfui/tree/development). + +## 📐 How to use? + +First, your application needs to load custom styles, add in the **MyApp\App.xaml** file: + +```xml + + + + + + + + + + +``` + +Now, you can customize your views, for example by adding a non-standard look to the main window and navigation buttons + +```xml + + + + + + + + + + + +``` + +## Special thanks + +Crafting apps for .NET without the creators of tools like ReSharper or XAML Styler would never be such a fantastic adventure. + +- [🔗 JetBrains ReSharper](https://www.jetbrains.com/resharper/) +- [🔗 XAML Styler](https://github.com/Xavalon/XamlStyler) + +## Microsoft Property + +Design of the interface, choice of colors and the appearance of the controls were inspired by projects made by Microsoft for Windows 11. +The Wpf.Ui.Demo app includes icons from Shell32 for Windows 11. These icons are the legal property of Microsoft and you may not use them in your own app without permission. They are used here as an example of creating tools for Microsoft systems. + +## Segoe Fluent Icons + +**WPF UI** uses Fluent System Icons. Although this font was also created by Microsoft, it does not contain all the icons for Windows 11. If you need the missing icons, add Segoe Fluent Icons to your application. +According to the EULA of Segoe Fluent Icons we cannot ship a copy of it with this dll. Segoe Fluent Icons is installed by default on Windows 11, but if you want these icons in an application for Windows 10 and below, you must manually add the font to your application's resources. +[https://docs.microsoft.com/en-us/windows/apps/design/style/segoe-fluent-icons-font](https://docs.microsoft.com/en-us/windows/apps/design/style/segoe-fluent-icons-font) +[https://docs.microsoft.com/en-us/windows/apps/design/downloads/#fonts](https://docs.microsoft.com/en-us/windows/apps/design/downloads/#fonts) + +In the app dictionaries, you can add an alternate path to the font + +```XML +pack://application:,,,/;component/Fonts/#Segoe Fluent Icons +``` + +## Compilation + +Use Visual Studio 2022 and invoke the .sln. + +Visual Studio +**WPF UI** is an Open Source project. You are entitled to download and use the freely available Visual Studio Community Edition to build, run or develop for WPF UI. As per the Visual Studio Community Edition license, this applies regardless of whether you are an individual or a corporate user. + +## Code of Conduct + +This project has adopted the code of conduct defined by the Contributor Covenant to clarify expected behavior in our community. + +## License + +**WPF UI** is free and open source software licensed under **MIT License**. You can use it in private and commercial projects. +Keep in mind that you must include a copy of the license in your project. diff --git a/docs/manifest.webmanifest b/docs/manifest.webmanifest new file mode 100644 index 000000000..f17140314 --- /dev/null +++ b/docs/manifest.webmanifest @@ -0,0 +1,32 @@ +{ + "theme_color": "#1f1f23", + "background_color": "#1f1f23", + "display": "standalone", + "scope": "/", + "start_url": "/", + "name": "WPF UI", + "short_name": "WPF UI", + "description": "A simple way to make your application written in WPF keep up with modern design trends.", + "icons": [ + { + "src": "images/icon-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "images/icon-256x256.png", + "sizes": "256x256", + "type": "image/png" + }, + { + "src": "images/icon-384x384.png", + "sizes": "384x384", + "type": "image/png" + }, + { + "src": "images/icon-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ] +} \ No newline at end of file diff --git a/docs/react-docs.json b/docs/react-docs.json deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/robots.txt b/docs/robots.txt new file mode 100644 index 000000000..eb0536286 --- /dev/null +++ b/docs/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: diff --git a/docs/templates/LICENSE b/docs/templates/LICENSE new file mode 100644 index 000000000..efe0437de --- /dev/null +++ b/docs/templates/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Singulink + +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. \ No newline at end of file diff --git a/docs/templates/singulinkfx/layout/_master.tmpl b/docs/templates/singulinkfx/layout/_master.tmpl new file mode 100644 index 000000000..c17e535c9 --- /dev/null +++ b/docs/templates/singulinkfx/layout/_master.tmpl @@ -0,0 +1,63 @@ +{{!Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. See LICENSE file in the project root for full license information.}} +{{!include(/^styles/.*/)}} +{{!include(/^fonts/.*/)}} +{{!include(favicon.ico)}} +{{!include(logo.svg)}} +{{!include(search-stopwords.json)}} + + + + {{>partials/head}} + + +
+ + + + + {{>partials/logo}} +
+ +
+
+ +
+
+ {{>partials/navbar}} +
+ {{^_disableToc}} + {{>partials/toc}} + {{/_disableToc}} +
+ {{>partials/footer}} +
+ +
+ {{#_enableSearch}} + {{>partials/searchResults}} + {{/_enableSearch}} + +
+ {{^_disableBreadcrumb}} + {{>partials/breadcrumb}} + {{/_disableBreadcrumb}} + +
+ {{!body}} +
+
+ +
+ Documentation created with DocFX + and SingulinkFX theme +
+ Copyright © Leszek Pomianowski | lepo.co and WPF UI Contributors. All rights reserved. +
+
+
+ + {{>partials/scripts}} + + diff --git a/docs/templates/singulinkfx/partials/footer.tmpl.partial b/docs/templates/singulinkfx/partials/footer.tmpl.partial new file mode 100644 index 000000000..1b92deef2 --- /dev/null +++ b/docs/templates/singulinkfx/partials/footer.tmpl.partial @@ -0,0 +1,3 @@ +
+ Created with ❤ in Poland
by lepo.co +
\ No newline at end of file diff --git a/docs/templates/singulinkfx/partials/head.tmpl.partial b/docs/templates/singulinkfx/partials/head.tmpl.partial new file mode 100644 index 000000000..16408b12f --- /dev/null +++ b/docs/templates/singulinkfx/partials/head.tmpl.partial @@ -0,0 +1,39 @@ +{{!Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. See LICENSE file in the project root for full license information.}} + + + + + {{#title}}{{title}}{{/title}}{{^title}}{{>partials/title}}{{/title}} {{#_appTitle}}| {{_appTitle}} {{/_appTitle}} + + + + {{#_description}}{{/_description}} + + + + + + + + {{#_appTitle}}{{/_appTitle}} + {{#_description}}{{/_description}} + + + + + + + {{#_description}}{{/_description}} + + + + + + + + + + {{#_noindex}}{{/_noindex}} + {{#_enableSearch}}{{/_enableSearch}} + {{#_enableNewTab}}{{/_enableNewTab}} + \ No newline at end of file diff --git a/docs/templates/singulinkfx/partials/li.tmpl.partial b/docs/templates/singulinkfx/partials/li.tmpl.partial new file mode 100644 index 000000000..2c8a3d0e7 --- /dev/null +++ b/docs/templates/singulinkfx/partials/li.tmpl.partial @@ -0,0 +1,31 @@ +{{!Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. See LICENSE file in the project root for full license information.}} + +
    + {{#items}} + {{^dropdown}} +
  • + {{^leaf}} + + {{/leaf}} + {{#topicHref}} + {{name}} + {{/topicHref}} + {{^topicHref}} + {{{name}}} + {{/topicHref}} + + {{^leaf}} + {{>partials/li}} + {{/leaf}} +
  • + {{/dropdown}} + {{#dropdown}} +
  • + {{name}} +
      + {{>partials/dd-li}} +
    +
  • + {{/dropdown}} + {{/items}} +
diff --git a/docs/templates/singulinkfx/partials/logo.tmpl.partial b/docs/templates/singulinkfx/partials/logo.tmpl.partial new file mode 100644 index 000000000..738ab5b6f --- /dev/null +++ b/docs/templates/singulinkfx/partials/logo.tmpl.partial @@ -0,0 +1,6 @@ +{{!Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. See LICENSE file in the project root for full license information.}} + + + {{_appName}} + {{_appName}} + \ No newline at end of file diff --git a/docs/templates/singulinkfx/partials/namespace.tmpl.partial b/docs/templates/singulinkfx/partials/namespace.tmpl.partial new file mode 100644 index 000000000..42d64e69b --- /dev/null +++ b/docs/templates/singulinkfx/partials/namespace.tmpl.partial @@ -0,0 +1,13 @@ +{{!Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. See LICENSE file in the project root for full license information.}} + +

{{>partials/title}}

+
{{{summary}}}
+
{{{conceptual}}}
+
{{{remarks}}}
+{{#children}} +

{{>partials/namespaceSubtitle}}

+ {{#children}} +
+
{{{summary}}}
+ {{/children}} +{{/children}} diff --git a/docs/templates/singulinkfx/partials/navbar.tmpl.partial b/docs/templates/singulinkfx/partials/navbar.tmpl.partial new file mode 100644 index 000000000..cfddfd830 --- /dev/null +++ b/docs/templates/singulinkfx/partials/navbar.tmpl.partial @@ -0,0 +1,19 @@ +{{!Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. See LICENSE file in the project root for full license information.}} + +
+
+ {{>partials/logo}} +
+ + {{#_enableSearch}} +
+
+ + +
+
+ {{/_enableSearch}} + +
+
+
\ No newline at end of file diff --git a/docs/templates/singulinkfx/partials/scripts.tmpl.partial b/docs/templates/singulinkfx/partials/scripts.tmpl.partial new file mode 100644 index 000000000..90fb7d576 --- /dev/null +++ b/docs/templates/singulinkfx/partials/scripts.tmpl.partial @@ -0,0 +1,12 @@ +{{!Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. See LICENSE file in the project root for full license information.}} + + + + + + + + + + + \ No newline at end of file diff --git a/docs/templates/singulinkfx/partials/searchResults.tmpl.partial b/docs/templates/singulinkfx/partials/searchResults.tmpl.partial new file mode 100644 index 000000000..9f08c90e3 --- /dev/null +++ b/docs/templates/singulinkfx/partials/searchResults.tmpl.partial @@ -0,0 +1,9 @@ +{{!Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. See LICENSE file in the project root for full license information.}} + +
+

{{__global.searchResults}}

+
+

+
+
    +
    \ No newline at end of file diff --git a/docs/templates/singulinkfx/partials/toc.tmpl.partial b/docs/templates/singulinkfx/partials/toc.tmpl.partial new file mode 100644 index 000000000..c660966b6 --- /dev/null +++ b/docs/templates/singulinkfx/partials/toc.tmpl.partial @@ -0,0 +1,5 @@ +{{!Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. See LICENSE file in the project root for full license information.}} + +
    +
    +
    diff --git a/docs/templates/singulinkfx/styles/down-arrow.svg b/docs/templates/singulinkfx/styles/down-arrow.svg new file mode 100644 index 000000000..e086126a2 --- /dev/null +++ b/docs/templates/singulinkfx/styles/down-arrow.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/templates/singulinkfx/styles/jquery.twbsPagination.js b/docs/templates/singulinkfx/styles/jquery.twbsPagination.js new file mode 100644 index 000000000..332c01c62 --- /dev/null +++ b/docs/templates/singulinkfx/styles/jquery.twbsPagination.js @@ -0,0 +1,317 @@ +/*! + * jQuery pagination plugin v1.4.1 + * http://esimakin.github.io/twbs-pagination/ + * + * Copyright 2014-2016, Eugene Simakin + * Released under Apache 2.0 license + * http://apache.org/licenses/LICENSE-2.0.html + */ +(function ($, window, document, undefined) { + + 'use strict'; + + var old = $.fn.twbsPagination; + + // PROTOTYPE AND CONSTRUCTOR + + var TwbsPagination = function (element, options) { + this.$element = $(element); + this.options = $.extend({}, $.fn.twbsPagination.defaults, options); + + if (this.options.startPage < 1 || this.options.startPage > this.options.totalPages) { + throw new Error('Start page option is incorrect'); + } + + this.options.totalPages = parseInt(this.options.totalPages); + if (isNaN(this.options.totalPages)) { + throw new Error('Total pages option is not correct!'); + } + + this.options.visiblePages = parseInt(this.options.visiblePages); + if (isNaN(this.options.visiblePages)) { + throw new Error('Visible pages option is not correct!'); + } + + if (this.options.onPageClick instanceof Function) { + this.$element.first().on('page', this.options.onPageClick); + } + + // hide if only one page exists + if (this.options.hideOnlyOnePage && this.options.totalPages == 1) { + this.$element.trigger('page', 1); + return this; + } + + if (this.options.totalPages < this.options.visiblePages) { + this.options.visiblePages = this.options.totalPages; + } + + if (this.options.href) { + this.options.startPage = this.getPageFromQueryString(); + if (!this.options.startPage) { + this.options.startPage = 1; + } + } + + var tagName = (typeof this.$element.prop === 'function') ? + this.$element.prop('tagName') : this.$element.attr('tagName'); + + if (tagName === 'UL') { + this.$listContainer = this.$element; + } else { + this.$listContainer = $('
      '); + } + + this.$listContainer.addClass(this.options.paginationClass); + + if (tagName !== 'UL') { + this.$element.append(this.$listContainer); + } + + if (this.options.initiateStartPageClick) { + this.show(this.options.startPage); + } else { + this.render(this.getPages(this.options.startPage)); + this.setupEvents(); + } + + return this; + }; + + TwbsPagination.prototype = { + + constructor: TwbsPagination, + + destroy: function () { + this.$element.empty(); + this.$element.removeData('twbs-pagination'); + this.$element.off('page'); + + return this; + }, + + show: function (page) { + if (page < 1 || page > this.options.totalPages) { + throw new Error('Page is incorrect.'); + } + this.currentPage = page; + + this.render(this.getPages(page)); + this.setupEvents(); + + this.$element.trigger('page', page); + + return this; + }, + + buildListItems: function (pages) { + var listItems = []; + + if (this.options.first) { + listItems.push(this.buildItem('first', 1)); + } + + if (this.options.prev) { + var prev = pages.currentPage > 1 ? pages.currentPage - 1 : this.options.loop ? this.options.totalPages : 1; + listItems.push(this.buildItem('prev', prev)); + } + + for (var i = 0; i < pages.numeric.length; i++) { + listItems.push(this.buildItem('page', pages.numeric[i])); + } + + if (this.options.next) { + var next = pages.currentPage < this.options.totalPages ? pages.currentPage + 1 : this.options.loop ? 1 : this.options.totalPages; + listItems.push(this.buildItem('next', next)); + } + + if (this.options.last) { + listItems.push(this.buildItem('last', this.options.totalPages)); + } + + return listItems; + }, + + buildItem: function (type, page) { + var $itemContainer = $('
    • '), + $itemContent = $(''), + itemText = this.options[type] ? this.makeText(this.options[type], page) : page; + + $itemContainer.addClass(this.options[type + 'Class']); + $itemContainer.data('page', page); + $itemContainer.data('page-type', type); + $itemContainer.append($itemContent.attr('href', this.makeHref(page)).addClass(this.options.anchorClass).html(itemText)); + + return $itemContainer; + }, + + getPages: function (currentPage) { + var pages = []; + + var half = Math.floor(this.options.visiblePages / 2); + var start = currentPage - half + 1 - this.options.visiblePages % 2; + var end = currentPage + half; + + // handle boundary case + if (start <= 0) { + start = 1; + end = this.options.visiblePages; + } + if (end > this.options.totalPages) { + start = this.options.totalPages - this.options.visiblePages + 1; + end = this.options.totalPages; + } + + var itPage = start; + while (itPage <= end) { + pages.push(itPage); + itPage++; + } + + return {"currentPage": currentPage, "numeric": pages}; + }, + + render: function (pages) { + var _this = this; + this.$listContainer.children().remove(); + var items = this.buildListItems(pages); + jQuery.each(items, function(key, item){ + _this.$listContainer.append(item); + }); + + this.$listContainer.children().each(function () { + var $this = $(this), + pageType = $this.data('page-type'); + + switch (pageType) { + case 'page': + if ($this.data('page') === pages.currentPage) { + $this.addClass(_this.options.activeClass); + } + break; + case 'first': + $this.toggleClass(_this.options.disabledClass, pages.currentPage === 1); + break; + case 'last': + $this.toggleClass(_this.options.disabledClass, pages.currentPage === _this.options.totalPages); + break; + case 'prev': + $this.toggleClass(_this.options.disabledClass, !_this.options.loop && pages.currentPage === 1); + break; + case 'next': + $this.toggleClass(_this.options.disabledClass, + !_this.options.loop && pages.currentPage === _this.options.totalPages); + break; + default: + break; + } + + }); + }, + + setupEvents: function () { + var _this = this; + this.$listContainer.off('click').on('click', 'li', function (evt) { + var $this = $(this); + if ($this.hasClass(_this.options.disabledClass) || $this.hasClass(_this.options.activeClass)) { + return false; + } + // Prevent click event if href is not set. + !_this.options.href && evt.preventDefault(); + _this.show(parseInt($this.data('page'))); + }); + }, + + makeHref: function (page) { + return this.options.href ? this.generateQueryString(page) : "#"; + }, + + makeText: function (text, page) { + return text.replace(this.options.pageVariable, page) + .replace(this.options.totalPagesVariable, this.options.totalPages) + }, + getPageFromQueryString: function (searchStr) { + var search = this.getSearchString(searchStr), + regex = new RegExp(this.options.pageVariable + '(=([^&#]*)|&|#|$)'), + page = regex.exec(search); + if (!page || !page[2]) { + return null; + } + page = decodeURIComponent(page[2]); + page = parseInt(page); + if (isNaN(page)) { + return null; + } + return page; + }, + generateQueryString: function (pageNumber, searchStr) { + var search = this.getSearchString(searchStr), + regex = new RegExp(this.options.pageVariable + '=*[^&#]*'); + if (!search) return ''; + return '?' + search.replace(regex, this.options.pageVariable + '=' + pageNumber); + + }, + getSearchString: function (searchStr) { + var search = searchStr || window.location.search; + if (search === '') { + return null; + } + if (search.indexOf('?') === 0) search = search.substr(1); + return search; + } + + }; + + // PLUGIN DEFINITION + + $.fn.twbsPagination = function (option) { + var args = Array.prototype.slice.call(arguments, 1); + var methodReturn; + + var $this = $(this); + var data = $this.data('twbs-pagination'); + var options = typeof option === 'object' ? option : {}; + + if (!data) $this.data('twbs-pagination', (data = new TwbsPagination(this, options) )); + if (typeof option === 'string') methodReturn = data[ option ].apply(data, args); + + return ( methodReturn === undefined ) ? $this : methodReturn; + }; + + $.fn.twbsPagination.defaults = { + totalPages: 1, + startPage: 1, + visiblePages: 5, + initiateStartPageClick: true, + hideOnlyOnePage: false, + href: false, + pageVariable: '{{page}}', + totalPagesVariable: '{{total_pages}}', + page: null, + first: 'First', + prev: 'Previous', + next: 'Next', + last: 'Last', + loop: false, + onPageClick: null, + paginationClass: 'pagination', + nextClass: 'page-item next', + prevClass: 'page-item prev', + lastClass: 'page-item last', + firstClass: 'page-item first', + pageClass: 'page-item', + activeClass: 'active', + disabledClass: 'disabled', + anchorClass: 'page-link' + }; + + $.fn.twbsPagination.Constructor = TwbsPagination; + + $.fn.twbsPagination.noConflict = function () { + $.fn.twbsPagination = old; + return this; + }; + + $.fn.twbsPagination.version = "1.4.1"; + +})(window.jQuery, window, document); diff --git a/docs/templates/singulinkfx/styles/main.js b/docs/templates/singulinkfx/styles/main.js new file mode 100644 index 000000000..712815855 --- /dev/null +++ b/docs/templates/singulinkfx/styles/main.js @@ -0,0 +1,67 @@ +// Created by robdmoore | Rob Moore (MakerX) +// https://github.com/dotnet/docfx/issues/5103#issuecomment-658849100= + +$(function () { + var copyToClipboard = function (text) { + // Create a textblock and assign the text and add to document + var el = document.createElement("textarea"); + el.value = text; + document.body.appendChild(el); + el.style.display = "block"; + + // select the entire textblock + if (window.document.documentMode) el.setSelectionRange(0, el.value.length); + else el.select(); + + // copy to clipboard + document.execCommand("copy"); + + // clean up element + document.body.removeChild(el); + }; + + $("code.hljs").each(function () { + var $this = $(this); + var language = /lang-(.+?)(\s|$)/ + .exec($this.attr("class"))[1] + .toUpperCase(); + + if (language === "CS" || language == "CSHARP") { + language = "C#"; + } + + if (language === "XML") { + language = "XAML"; + } + + if (language === "JS") { + language = "JavaScript"; + } + + var $codeHeader = $( + '
      ' + + ' ' + + language + + "" + + ' " + + "
      " + ); + $this.closest("pre").before($codeHeader); + $codeHeader.find("button").click(function () { + copyToClipboard($this.closest("pre").text()); + var successAlert = $(this).find(".successful-copy-alert"); + successAlert.removeClass("is-transparent"); + setTimeout(function () { + successAlert.addClass("is-transparent"); + }, 2000); + }); + }); +}); diff --git a/docs/templates/singulinkfx/styles/singulink.js b/docs/templates/singulinkfx/styles/singulink.js new file mode 100644 index 000000000..c2c0b4c45 --- /dev/null +++ b/docs/templates/singulinkfx/styles/singulink.js @@ -0,0 +1,38 @@ +// Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. See LICENSE file in the project root for full license information. + +function toggleMenu() { + + var sidebar = document.getElementById("sidebar"); + var blackout = document.getElementById("blackout"); + + if (sidebar.style.left === "0px") + { + sidebar.style.left = "-" + sidebar.offsetWidth + "px"; + blackout.classList.remove("showThat"); + blackout.classList.add("hideThat"); + } + else + { + sidebar.style.left = "0px"; + blackout.classList.remove("hideThat"); + blackout.classList.add("showThat"); + } +} + +$(function() { + $('table').each(function(a, tbl) { + var currentTableRows = $(tbl).find('tbody tr').length; + $(tbl).find('th').each(function(i) { + var remove = 0; + var currentTable = $(this).parents('table'); + + var tds = currentTable.find('tr td:nth-child(' + (i + 1) + ')'); + tds.each(function(j) { if ($(this).text().trim() === '') remove++; }); + + if (remove == currentTableRows) { + $(this).hide(); + tds.hide(); + } + }); + }); +}); \ No newline at end of file diff --git a/docs/templates/singulinkfx/styles/url.min.js b/docs/templates/singulinkfx/styles/url.min.js new file mode 100644 index 000000000..8057e0aa0 --- /dev/null +++ b/docs/templates/singulinkfx/styles/url.min.js @@ -0,0 +1 @@ +/*! url - v1.8.6 - 2013-11-22 */window.url=function(){function a(a){return!isNaN(parseFloat(a))&&isFinite(a)}return function(b,c){var d=c||window.location.toString();if(!b)return d;b=b.toString(),"//"===d.substring(0,2)?d="http:"+d:1===d.split("://").length&&(d="http://"+d),c=d.split("/");var e={auth:""},f=c[2].split("@");1===f.length?f=f[0].split(":"):(e.auth=f[0],f=f[1].split(":")),e.protocol=c[0],e.hostname=f[0],e.port=f[1]||("https"===e.protocol.split(":")[0].toLowerCase()?"443":"80"),e.pathname=(c.length>3?"/":"")+c.slice(3,c.length).join("/").split("?")[0].split("#")[0];var g=e.pathname;"/"===g.charAt(g.length-1)&&(g=g.substring(0,g.length-1));var h=e.hostname,i=h.split("."),j=g.split("/");if("hostname"===b)return h;if("domain"===b)return/^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/.test(h)?h:i.slice(-2).join(".");if("sub"===b)return i.slice(0,i.length-2).join(".");if("port"===b)return e.port;if("protocol"===b)return e.protocol.split(":")[0];if("auth"===b)return e.auth;if("user"===b)return e.auth.split(":")[0];if("pass"===b)return e.auth.split(":")[1]||"";if("path"===b)return e.pathname;if("."===b.charAt(0)){if(b=b.substring(1),a(b))return b=parseInt(b,10),i[0>b?i.length+b:b-1]||""}else{if(a(b))return b=parseInt(b,10),j[0>b?j.length+b:b]||"";if("file"===b)return j.slice(-1)[0];if("filename"===b)return j.slice(-1)[0].split(".")[0];if("fileext"===b)return j.slice(-1)[0].split(".")[1]||"";if("?"===b.charAt(0)||"#"===b.charAt(0)){var k=d,l=null;if("?"===b.charAt(0)?k=(k.split("?")[1]||"").split("#")[0]:"#"===b.charAt(0)&&(k=k.split("#")[1]||""),!b.charAt(1))return k;b=b.substring(1),k=k.split("&");for(var m=0,n=k.length;n>m;m++)if(l=k[m].split("="),l[0]===b)return l[1]||"";return null}}return""}}(),"undefined"!=typeof jQuery&&jQuery.extend({url:function(a,b){return window.url(a,b)}}); \ No newline at end of file diff --git a/docs/templates/singulinkfx/styles/wpfui.css b/docs/templates/singulinkfx/styles/wpfui.css new file mode 100644 index 000000000..50ab100b1 --- /dev/null +++ b/docs/templates/singulinkfx/styles/wpfui.css @@ -0,0 +1,1324 @@ +/* Theme Configuration Options */ + +:root { + /* General */ + + --base-font-size: 16px; + --smalldevice-base-font-size: 14px; /* Base font size for devices < 1024px */ + + --main-bg-color: #1f1f23; + --footer-bg-color: rgba(0, 0, 0, 0.4); + --separator-color: #42474f; + + --table-strip-bg-color: #151515; + --table-header-bg-color: black; + --table-header-color: hsla(0, 0%, 100%, 0.8); + --table-header-border-color: #040405; + + /* Text */ + + --appname-color: white; + + --h1-color: white; + --h2-color: #f2f2f2; + --h3-color: #e3e3e3; + --h4-color: #ffffff; + --h5-color: #e0e0e0; + + --text-color: #e1e1e1; + --link-color: #00b0f4; + --link-hover-color: #2ec4ff; + + /* Mobile Topbar */ + + --topbar-bg-color: #18191c; + + /* Button */ + + --button-color: #747f8d; + + /* Sidebar */ + + --sidebar-width: 400px; + --sidebar-bg-color: #292b30; + + --search-color: #bdbdbd; + --search-bg-color: #1b1e21; + --search-searchicon-color: #e3e3e3; + --search-border-color: black; + + --sidebar-item-color: white; + --sidebar-active-item-color: #00b0f4; + --sidebar-level1-item-bg-color: #222429; + --sidebar-level1-item-hover-bg-color: #1d1f22; + + --toc-filter-color: #bdbdbd; + --toc-filter-bg-color: #1b1e21; + --toc-filter-filtericon-color: #e3e3e3; + --toc-filter-clearicon-color: #e68585; + --toc-filter-border-color: black; + + /* Scrollbars */ + + --scrollbar-bg-color: transparent; + --scrollbar-thumb-bg-color: rgba(0, 0, 0, 0.4); + --scrollbar-thumb-border-color: transparent; + + /* Alerts and Blocks */ + + --alert-info-border-color: rgba(114, 137, 218, 0.5); + --alert-info-bg-color: rgba(114, 137, 218, 0.1); + + --alert-warning-border-color: rgba(250, 166, 26, 0.5); + --alert-warning-bg-color: rgba(250, 166, 26, 0.1); + + --alert-danger-border-color: rgba(240, 71, 71, 0.5); + --alert-danger-bg-color: rgba(240, 71, 71, 0.1); + + --alert-tip-border-color: rgba(255, 255, 255, 0.5); + --alert-tip-bg-color: rgba(255, 255, 255, 0.1); + + --blockquote-border-color: rgba(255, 255, 255, 0.5); + --blockquote-bg-color: rgba(255, 255, 255, 0.1); + + --breadcrumb-bg-color: #2f3136; + + /* Inline Code */ + + --ref-bg-color: black; + --ref-color: #89d4f1; + + /* Code Blocks */ + + --code-bg-color: #151515; + --code-color: #d6deeb; + --code-keyword-color: #569cd6; + --code-comment-color: #57a64a; + --code-macro-color: #beb7ff; + --code-string-color: #d69d85; + --code-string-escape-color: #ffd68f; + --code-field-color: #c8c8c8; + --code-function-color: #dcdcaa; + --code-control-color: #d8a0df; + --code-class-color: #4ec9b0; + --code-number-color: #b5cea8; + --code-params-color: #9a9a9a; + --code-breakpoint-color: #8c2f2f; +} + +/* Code Block Overrides */ + +pre, +legend { + --scrollbar-thumb-bg-color: #333; +} + +/* Discord Style */ + +::-webkit-scrollbar { + width: 10px; +} + +::-webkit-scrollbar-track { + background: var(--scrollbar-bg-color); +} + +::-webkit-scrollbar-thumb { + background: var(--scrollbar-thumb-bg-color); + border-color: var(--scrollbar-thumb-border-color); + border-radius: 5px; +} + +::marker { + unicode-bidi: isolate; + font-variant-numeric: tabular-nums; + text-transform: none; + text-indent: 0px !important; + text-align: start !important; + text-align-last: start !important; +} + +*, +:after, +:before { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +html, +body { + padding: 0; + margin: 0; + font: 15px/150% "Roboto", sans-serif; + overflow: hidden; + color: var(--text-color); + background-color: var(--main-bg-color); + + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; +} + +img { + max-width: 100%; +} + +ul > li, +ol > li { + display: list-item; +} + +h1, +h2, +h3, +h4, +h5 { + color: var(--link-active-color); + position: relative; +} + +h1, +h2 { + margin-block-start: 2em; +} + +h3 { + margin-block-start: 1em; + font-weight: 300; + font-size: 1.5em; + color: var(--h3-color); + margin-block-start: 3em; +} + +h4 { + opacity: 1; + color: var(--h4-color); + font-size: large; + border-bottom: 2px solid var(--separator-color); + margin: 20px 0 0 0; +} + +h5 { + margin-block-end: 0.8em; + margin-block-start: 1em; + font-size: 0.85em; + font-weight: 500; + color: var(--h5-color); +} + +h6 { + font-size: 0.75em; + margin: 0; +} + +p { + font-weight: 400; +} + +ul { + position: relative; +} + +ul, +ol { + padding-inline-start: 3em; +} + +ul.level1 { + list-style-type: none; + padding-inline-start: 0; +} + +ul.level2, +ul.level3 { + padding-inline-start: 1em; + list-style-type: none; + font-size: 0.9em; +} + +a { + color: var(--link-color); + text-decoration: none; + transition: color 0.25s; +} + +a:focus, +a:hover { + color: var(--link-hover-color); + text-decoration: underline; +} + +a.anchorjs-link:hover { + text-decoration: none; +} + +a.active, +a:active { + color: var(--link-active-color); +} + +.body-content { + display: flex; + flex-direction: row; + height: 100%; + overflow-x: hidden; + overflow-y: hidden; +} + +.page-title { + margin-block-start: 0; +} + +nav { + width: 300px; + transition: left 0.5s ease-out; + position: fixed; + left: -350px; + top: 40px; + bottom: 0; + background-color: var(--sidebar-bg-color); + overflow-y: auto; + + display: flex; + flex-direction: column; + + z-index: 1000; +} + +h1:first-child { + margin-block-start: 1.1em; + margin-top: 1.1em; +} + +.sidebar { + padding: 32px 17px 32px 32px; + flex: 1; +} + +.sidebar-item { + font-size: 1em; + font-weight: 400; + display: block; + padding: 4px 16px; + color: var(--sidebar-item-color); +} + +.sidebar-item.large, +#navbar .sidebar-item { + padding: 8px 16px; +} + +a.sidebar-item:hover, +a.sidebar-item:focus { + color: var(--link-active-color); + text-decoration: none; +} + +a.sidebar-item.active { + color: var(--link-active-color); +} + +ul.level1 > li > a.sidebar-item { + background-color: transparent; + border-radius: 4px; +} + +#toc ul.level1 > li > a.sidebar-item.active { + background-color: var(--link-active-bg-color); +} + +.sidebar-item-separator { + height: 2px; + width: 100%; + background-color: var(--separator-color); + margin: 2em 0; + opacity: 0.8; +} + +span.sidebar-item { + font-weight: 700; + text-transform: uppercase; + font-size: 0.8em; + color: var(--text-color); + margin-block-start: 1.25em; +} + +.main-panel { + background-color: var(--main-bg-color); + flex: 1; + overflow-y: auto; + padding: 20px 40px; +} + +.top-navbar { + display: flex; + flex-direction: row; + align-items: center; + padding: 0 40px; + height: 40px; + background-color: var(--topbar-bg-color); +} + +.burger-icon { + margin-right: 1em; + color: var(--button-color); +} + +.burger-icon:hover, +.burger-icon:focus { + color: var(--link-active-color); +} + +.burger-icon.active, +.burger-icon:active { + color: var(--link-active-color); +} + +.brand { + display: flex; + align-items: center; + justify-content: start; +} + +.logomark { + height: 28px; +} + +.brand-title { + padding: 0 0.5em; + font-size: 0.9em; + color: var(--link-active-color); +} + +.footer { + background-color: var(--footer-bg-color); + padding: 20px; + margin: 0 20px 20px 20px; + border-radius: 8px; + color: var(--link-active-color); +} + +.footer > h4 { + margin-block-start: 0; +} + +.blackout { + display: block; + visibility: hidden; + position: absolute; + z-index: 100; + top: 40px; + bottom: 0; + left: 0; + right: 0; + background-color: var(--footer-bg-color); +} + +@keyframes showThat { + 0% { + opacity: 0; + visibility: hidden; + } + 1% { + opacity: 0; + visibility: visible; + } + 100% { + opacity: 1; + visibility: visible; + } +} + +@keyframes hideThat { + 0% { + opacity: 1; + visibility: visible; + } + 99% { + opacity: 0; + visibility: visible; + } + 100% { + opacity: 0; + visibility: hidden; + } +} + +.showThat { + animation: showThat 0.5s forwards; +} + +.hideThat { + animation: hideThat 0.5s forwards; +} + +@media (min-width: 1024px) { + nav { + position: relative; + left: 0 !important; + top: 0; + bottom: 0; + } + + .top-navbar { + display: none; + } + + .blackout { + display: none; + } +} + +/* Table */ + +.table-responsive { + overflow-x: auto; + margin-bottom: 64px; +} + +table { + background-color: var(--code-bg-color); + border-collapse: collapse; + width: 100%; + table-layout: auto; +} + +table.table-striped tbody tr:nth-child(2n) { + background-color: var(--table-strip-bg-color); +} + +table thead { + background: var(--table-header-bg-color); +} + +table th { + color: var(--table-header-color); + text-transform: uppercase; + font-size: 12px; + line-height: 15px; + border-bottom: 1px solid var(--table-header-border-color); + padding: 8px; +} + +.table-condensed th { + text-align: left; +} + +table td { + padding: 8px; + font-weight: 300; +} + +table td > p { + margin: 0; +} + +/* Alerts */ +.alert { + border-radius: 4px; + padding: 8px; + margin: 25px 0; +} + +.alert > h5 { + text-transform: uppercase; + margin: 0 0 5px 0; + letter-spacing: 1px; +} + +.alert > p { + margin: 0; + font-weight: 300; + font-size: 13px; +} + +.alert.alert-info { + border: 2px solid var(--alert-info-border-color); + background: var(--alert-info-bg-color); +} + +.alert.alert-warning { + border: 2px solid var(--alert-warning-border-color); + background: var(--alert-warning-bg-color); +} + +.alert.alert-danger { + border: 2px solid var(--alert-danger-border-color); + background: var(--alert-danger-bg-color); +} + +.TIP.alert.alert-info { + border: 2px solid var(--alert-tip-border-color); + background: var(--alert-tip-bg-color); +} + +blockquote { + margin: 8px 0; + border-left: 4px solid var(--blockquote-border-color); + padding: 8px; + background: var(--blockquote-bg-color); + border-radius: 4px; +} + +blockquote > p { + margin: 0; + font-style: italic; + font-size: 13px; +} + +/* Breadcrumb */ + +#breadcrumb { + padding: 8px 16px; + background: var(--breadcrumb-bg-color); + border-radius: 4px; + margin-bottom: 30px; +} + +#breadcrumb:empty { + display: none; +} + +ul.breadcrumb { + display: flex; + flex-direction: row; + margin: 0; +} + +ul.breadcrumb > li { + margin-right: 6px; +} + +ul.breadcrumb > li::before { + content: "/"; + margin-right: 5px; +} + +ul.breadcrumb > li:first-child::before { + content: ""; + margin: 0; +} + +/* Code */ + +legend, +pre { + display: block; + background-color: var(--code-bg-color); + padding: 16px; + border-radius: 0 0 4px 4px; +} + +code { + background-color: var(--code-bg-color); + padding: 2px 4px; + border-radius: 4px; +} + +.hljs { + background: transparent; +} + +/* DocFX related */ + +.small { + font-size: 0.9em; +} + +.pull-right { + float: right; +} + +.hide { + display: none; +} + +@media (max-width: 1023.98px) { + .mobile-hide { + display: none; + } +} + +li { + display: block; + position: relative; +} + +.expand-stub { + cursor: pointer; + position: absolute; + width: 20px; + height: 20px; + left: -10px; +} + +ul.level1 > li > .expand-stub { + display: none; +} + +.toc .nav > li > .expand-stub::before, +.toc .nav > li.active > .expand-stub::before { + content: " "; + position: absolute; + transform: rotate(-90deg); + width: 10px; + height: 10px; + top: 5px; + left: 5px; + background-repeat: no-repeat; + background: url(down-arrow.svg); +} + +.toc .nav > li.active > .expand-stub::before, +.toc .nav > li.in > .expand-stub::before, +.toc .nav > li.in.active > .expand-stub::before, +.toc .nav > li.filtered > .expand-stub::before { + transform: none; +} + +li > ul { + display: none; +} + +li.in > ul { + display: block; +} + +ul.level2 > li > a.sidebar-item, +ul.level3 > li > a.sidebar-item { + font-weight: 500; + font-size: 0.95em; + padding: 0; + margin: 2px 16px; +} + +ul.level2 > li > a.sidebar-item { + color: var(--sidebar-item-2nd-color); +} + +ul.level3 > li > a.sidebar-item { + color: var(--sidebar-item-3rd-color); +} + +ul.level2 > li > a.sidebar-item:hover, +ul.level2 > li > a.sidebar-item:focus, +ul.level3 > li > a.sidebar-item:hover, +ul.level3 > li > a.sidebar-item:focus { + color: var(--link-active-color); + text-decoration: underline; +} + +ul.level2 > li > a.sidebar-item.active, +ul.level3 > li > a.sidebar-item.active { + color: var(--link-active-color); +} + +.inheritance .level0:before, +.inheritance .level1:before, +.inheritance .level2:before, +.inheritance .level3:before, +.inheritance .level4:before, +.inheritance .level5:before { + content: "↳"; + margin-right: 5px; +} + +.inheritance .level0 { + margin-left: 0em; +} + +.inheritance .level1 { + margin-left: 1em; +} + +.inheritance .level2 { + margin-left: 2em; +} + +.inheritance .level3 { + margin-left: 3em; +} + +.inheritance .level4 { + margin-left: 4em; +} + +.inheritance .level5 { + margin-left: 5em; +} + +body { + font-size: var(--base-font-size); +} + +@media (max-width: 1024px) { + body { + font-size: var(--smalldevice-base-font-size); + } +} + +/* Headings */ + +h1, +h2, +h3, +h4, +h5 { + line-height: initial; +} + +h1, +h1:first-child { + font-size: 2.25em; + letter-spacing: 0.5px; + color: var(--h1-color); + margin-block-start: 1em; + margin-block-end: -0.05em; +} + +.article h1 { + margin-block-end: -0.2em; +} + +h2 { + font-size: 2.1em; + color: var(--h2-color); +} + +.article h2 { + margin-block-start: 1.3em; + padding-bottom: 6px; + border-bottom: 1px solid var(--separator-color); +} + +h3 { + font-size: 1.95em; + font-weight: 500; + margin-block-start: 1.7em; +} + +.article h3 { + font-size: 1.85em; + font-weight: 500; + margin-block-start: 1.2em; + margin-block-end: 0.9em; +} + +h4 { + font-size: 1.8em; + font-weight: 400; + margin-block-start: 2em; + padding-bottom: 10px; +} + +.article h4 { + font-size: 1.5em; + font-weight: 300; + margin-block-start: 1em; + margin-block-end: 1em; + padding-bottom: 0; + border-bottom: none; +} + +h5 { + font-size: 1.1em; +} + +.article h5 { + font-size: 1.13em; + font-weight: 400; + text-decoration: underline; + margin-block-start: 1.5em; + margin-block-end: 1em; +} + +a.brand:hover { + text-decoration: none; +} + +a.brand .brand-title { + font-size: 1.4em; + font-weight: 500; + letter-spacing: 0.5px; + color: var(--appname-color); + margin-top: 1px; + padding: 0 0 0 0.4em; +} + +@media (min-width: 1024px) { + a.brand .brand-title { + font-size: 1.55em; + } +} + +a.brand .logomark { + height: 35px; +} + +/* Top bar */ + +.top-navbar { + height: 60px; + padding: 0 0 0 10px; +} + +.burger-icon { + margin-right: 10px; +} + +/* Side Bar */ + +.sidebar { + padding: 25px 17px 32px 17px; +} + +.blackout { + top: 60px; +} + +@media (max-width: 1023.98px) { + .navbar-nav { + margin-top: 0; + } +} + +nav { + width: 94%; + max-width: var(--sidebar-width); + left: calc(var(--sidebar-width) * -1); +} + +@media (max-width: 1023.98px) { + nav { + top: 60px; + } +} + +nav ul { + list-style-type: none; +} + +nav .nav a, +nav .nav a:hover { + text-decoration: none; + cursor: pointer; + display: block; +} + +nav a.sidebar-item { + padding: 4px 0 4px 10px; + cursor: pointer; +} + +nav a:focus, +nav a.sidebar-item:hover, +nav a.sidebar-item:focus { + text-decoration: underline; +} + +nav a, +nav a:hover, +nav a:focus { + color: var(--sidebar-item-color) !important; +} + +nav a.active, +nav a.active:hover, +nav a.active:focus { + color: var(--sidebar-active-item-color) !important; +} + +.sidebar-item-separator { + margin: 20px 0; +} + +#toc ul li a { + padding: 0 0 0 10px; +} + +.search { + background: var(--search-bg-color); + border: 1px solid var(--search-border-color); + border-radius: 5px; + position: relative; + margin-block-start: 25px; +} + +@media (max-width: 1023.98px) { + .search { + margin-block-start: 0; + margin-block-end: 15px; + } +} + +.search > input { + font-size: 0.95em; + color: var(--search-color); + border: 0; + background: none; + padding: 11px 30px 10px 37px; + width: 100%; +} + +.search > input:focus { + outline: 0; +} + +.search > .search-icon { + font-size: 1.2em; + color: var(--search-searchicon-color); + position: absolute; + top: 9px; + left: 9px; +} + +.toc-filter { + background: var(--toc-filter-bg-color); + border: 1px solid var(--toc-filter-border-color); + border-radius: 5px; + position: relative; +} + +.toc-filter > input { + font-size: 0.95em; + color: var(--toc-filter-color); + border: 0; + background: none; + padding: 11px 30px 10px 37px; + width: 100%; +} + +.toc-filter > input:focus { + outline: 0; +} + +.toc-filter > .filter-icon { + font-size: 1.2em; + color: var(--toc-filter-filtericon-color); + position: absolute; + top: 9px; + left: 9px; +} + +.toc-filter > .clear-icon { + color: var(--toc-filter-clearicon-color); + position: absolute; + top: 9px; + right: 9px; + cursor: pointer; +} + +.toc .nav > li > .expand-stub::before, +.toc .nav > li.active > .expand-stub::before { + width: 8px; + height: 8px; + top: 6px; + left: 6px; +} + +#toc ul.level2 { + margin-bottom: 20px; +} + +#toc ul.level1 > li > a { + font-weight: 500; + margin-bottom: 10px; + padding: 5px 10px; +} + +#toc ul.level1 > li > a, +#toc ul.level1 > li > a.active { + background-color: var(--sidebar-level1-item-bg-color) !important; + border-radius: 2px; +} + +#toc ul.level1 > li > a:hover, +#toc ul.level1 > li > a.active:hover, +#toc ul.level1 > li > a:focus, +#toc ul.level1 > li > a.active:focus { + background-color: var(--sidebar-level1-item-hover-bg-color) !important; + text-decoration: none; +} + +ul.level2 { + padding-inline-start: 0.7em; +} + +ul.level2 .expand-stub { + top: 1px; +} + +ul.level2 > li > a, +ul.level2 > li > a.sidebar-item { + font-weight: 400; + color: var(--sidebar-item-color); + margin: 4px 0 4px; +} + +ul.level3 { + padding-inline-start: 1em; +} + +ul.level3 > li > a, +ul.level3 > li > a.sidebar-item { + font-size: 1.05em; + color: var(--sidebar-item-color); + margin: 4px 0; +} + +ul.level4 { + padding-inline-start: 0; + margin-bottom: 12px; +} + +ul.level4 > li > a, +ul.level4 > li > a.sidebar-item { + font-size: 1.05em; + color: var(--sidebar-item-color); + margin: 5px 0 5px 10px; +} + +/* Breadcrumbs */ + +.subnav.navbar { + margin: 0 -15px; +} + +#breadcrumb { + overflow: scroll; + margin-bottom: 0; +} + +#breadcrumb::-webkit-scrollbar { + display: none; +} + +#breadcrumb a { + white-space: nowrap; +} + +#breadcrumb wbr { + display: none; +} + +/* Search Results */ + +#search-results h1 { + margin-block-start: 0.5em; +} + +#search-results .item-title { + font-size: 1.3em; + margin-top: 1.5em; +} + +#search-results .item-href { + font-size: 0.85em; +} + +#search-results .item-brief { + margin-top: 0.7em; +} + +#search-results ul.pagination { + text-align: center; + padding: 10px 0 0 0; + margin-block-start: 40px; + border-top: 1px solid var(--separator-color); +} + +#search-results ul.pagination > li { + display: inline-block; + margin: 0 10px; +} + +#search-results ul.pagination > li.disabled a, +#search-results ul.pagination > li.disabled a:hover { + color: var(--text-color); + cursor: txt; + text-decoration: none; +} + +/* Content */ + +.main-panel { + margin-bottom: 60px; + padding: 20px; +} + +@media (min-width: 1024px) { + .main-panel { + margin-bottom: 0; + padding: 20px 40px; + } +} + +.pull-right { + margin-top: 70px; + /* Fix unclickable links */ + position: relative; + z-index: 1; +} + +.divider { + margin-left: 4px; +} + +article ul li, +article ol li { + margin-bottom: 10px; +} + +legend, +pre { + padding: 6px; +} + +.hljs { + color: var(--code-color); +} + +.hljs::-webkit-scrollbar { + height: 6px; +} + +.hljs-keyword, +.hljs-title, +.hljs-built_in { + font-style: normal; +} + +p .xref, +code { + background-color: var(--ref-bg-color); + color: var(--ref-color); + padding: 2px 3px; + font-family: monospace; + font-size: 0.95em; + border-radius: 6px; +} + +span.parametername { + font-family: monospace; +} + +.table { + width: auto; +} + +.table-responsive { + margin-bottom: 0; +} + +table th { + font-size: 14px; + padding: 9px 10px; +} + +table td p { + font-weight: 300; +} + +table td { + padding: 6px 10px; +} + +.footer { + text-align: center; + color: var(--text-color); + padding: 8px; + font-size: 12px; + line-height: 13px; +} + +.footer a:hover, +.footer a:focus { + text-decoration: underline; +} + +.copyright-footer { + font-size: 0.85em; + font-weight: bold; + text-align: left; + margin-block-start: 30px; +} + +.code-header { + box-sizing: content-box; + background-color: #242424; + color: var(--code-color); + display: flex; + flex-direction: row; + border-radius: 4px 4px 0 0; + margin-top: 16px; + min-height: 30px; +} + +.tabGroup section[role="tabpanel"] .code-header { + margin-left: -16px; + margin-right: -16px; +} + +.tabGroup section[role="tabpanel"] .code-header:first-child { + margin-top: -16px; +} + +.code-header > .language { + padding: 4px 16px; + flex-grow: 1; + text-transform: uppercase; + line-height: 26px; +} + +.code-header > .action { + position: relative; + padding: 4px 16px; + border-radius: 0 4px 0 0; + background-color: transparent; + border: 0 solid #444444; + border-left-width: 1px; + color: var(--code-color); + cursor: pointer; + display: flex; + align-items: center; + line-height: normal; +} + +.code-header .glyphicon { + margin-right: 0.25em; +} + +.code-header > .action:hover { + background-color: #444444; +} + +.code-header + pre { + margin-top: 0; +} + +.code-header > .action .successful-copy-alert { + justify-content: center; + align-items: center; + border-radius: 0 4px 0 0; + right: 0; + left: 0; + bottom: 0; + top: 0; + position: absolute; + display: flex; + background-color: #128712; + outline-color: #fff; + color: #fff; +} + +.code-header > .action .successful-copy-alert.is-transparent { + opacity: 0; + transition: 500ms opacity ease-in-out; +} + +.content.wrap#_content { + max-width: 960px; +} diff --git a/docs/templates/singulinkfx/styles/wpfui.min.css b/docs/templates/singulinkfx/styles/wpfui.min.css new file mode 100644 index 000000000..0c2fe8315 --- /dev/null +++ b/docs/templates/singulinkfx/styles/wpfui.min.css @@ -0,0 +1 @@ +#breadcrumb,#navbar .sidebar-item,.sidebar-item.large{padding:8px 16px}code,legend,pre,table{background-color:var(--code-bg-color)}h1,h2,h3,h4,h5,li,ul{position:relative}nav ul,ul.level1,ul.level2,ul.level3{list-style-type:none}.alert>h5,.code-header>.language,span.sidebar-item,table th{text-transform:uppercase}.blackout,body,html{right:0;left:0;bottom:0;position:absolute}:root{--base-font-size:16px;--smalldevice-base-font-size:14px;--main-bg-color:#1f1f23;--footer-bg-color:rgba(0, 0, 0, 0.4);--separator-color:#42474f;--table-strip-bg-color:#151515;--table-header-bg-color:black;--table-header-color:hsla(0, 0%, 100%, 0.8);--table-header-border-color:#040405;--appname-color:white;--h1-color:white;--h2-color:#f2f2f2;--h3-color:#e3e3e3;--h4-color:#ffffff;--h5-color:#e0e0e0;--text-color:#e1e1e1;--link-color:#00b0f4;--link-hover-color:#2ec4ff;--topbar-bg-color:#18191c;--button-color:#747f8d;--sidebar-width:400px;--sidebar-bg-color:#292b30;--search-color:#bdbdbd;--search-bg-color:#1b1e21;--search-searchicon-color:#e3e3e3;--search-border-color:black;--sidebar-item-color:white;--sidebar-active-item-color:#00b0f4;--sidebar-level1-item-bg-color:#222429;--sidebar-level1-item-hover-bg-color:#1d1f22;--toc-filter-color:#bdbdbd;--toc-filter-bg-color:#1b1e21;--toc-filter-filtericon-color:#e3e3e3;--toc-filter-clearicon-color:#e68585;--toc-filter-border-color:black;--scrollbar-bg-color:transparent;--scrollbar-thumb-bg-color:rgba(0, 0, 0, 0.4);--scrollbar-thumb-border-color:transparent;--alert-info-border-color:rgba(114, 137, 218, 0.5);--alert-info-bg-color:rgba(114, 137, 218, 0.1);--alert-warning-border-color:rgba(250, 166, 26, 0.5);--alert-warning-bg-color:rgba(250, 166, 26, 0.1);--alert-danger-border-color:rgba(240, 71, 71, 0.5);--alert-danger-bg-color:rgba(240, 71, 71, 0.1);--alert-tip-border-color:rgba(255, 255, 255, 0.5);--alert-tip-bg-color:rgba(255, 255, 255, 0.1);--blockquote-border-color:rgba(255, 255, 255, 0.5);--blockquote-bg-color:rgba(255, 255, 255, 0.1);--breadcrumb-bg-color:#2f3136;--ref-bg-color:black;--ref-color:#89d4f1;--code-bg-color:#151515;--code-color:#d6deeb;--code-keyword-color:#569cd6;--code-comment-color:#57a64a;--code-macro-color:#beb7ff;--code-string-color:#d69d85;--code-string-escape-color:#ffd68f;--code-field-color:#c8c8c8;--code-function-color:#dcdcaa;--code-control-color:#d8a0df;--code-class-color:#4ec9b0;--code-number-color:#b5cea8;--code-params-color:#9a9a9a;--code-breakpoint-color:#8c2f2f}::-webkit-scrollbar{width:10px}::-webkit-scrollbar-track{background:var(--scrollbar-bg-color)}::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb-bg-color);border-color:var(--scrollbar-thumb-border-color);border-radius:5px}::marker{unicode-bidi:isolate;font-variant-numeric:tabular-nums;text-transform:none;text-indent:0!important;text-align:start!important;text-align-last:start!important}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body,html{padding:0;margin:0;font:15px/150% Roboto,sans-serif;overflow:hidden;color:var(--text-color);background-color:var(--main-bg-color);top:0}code,p .xref,span.parametername{font-family:monospace}img{max-width:100%}ol>li,ul>li{display:list-item}h1,h2,h3,h4,h5{color:var(--link-active-color);line-height:initial}h1,h2{margin-block-start:2em}h5{margin-block-end:0.8em;margin-block-start:1em;font-weight:500;color:var(--h5-color)}h6,table td>p{margin:0}.sidebar-item,p{font-weight:400}h6{font-size:.75em}ol,ul{padding-inline-start:3em}ul.level1{padding-inline-start:0}ul.level2,ul.level3{padding-inline-start:1em;font-size:.9em}a{color:var(--link-color);text-decoration:none;transition:color .25s}a:focus,a:hover{color:var(--link-hover-color);text-decoration:underline}a.anchorjs-link:hover,a.brand:hover{text-decoration:none}.burger-icon.active,.burger-icon:active,.burger-icon:focus,.burger-icon:hover,a.active,a.sidebar-item.active,a:active,ul.level2>li>a.sidebar-item.active,ul.level3>li>a.sidebar-item.active{color:var(--link-active-color)}.body-content{display:flex;flex-direction:row;height:100%;overflow-x:hidden;overflow-y:hidden}.main-panel,nav{overflow-y:auto}.footer>h4,.page-title{margin-block-start:0}nav{transition:left .5s ease-out;position:fixed;left:-350px;top:40px;bottom:0;background-color:var(--sidebar-bg-color);display:flex;flex-direction:column;z-index:1000}h1:first-child{margin-block-start:1.1em;margin-top:1.1em}.sidebar{flex:1}.sidebar-item{font-size:1em;display:block;padding:4px 16px;color:var(--sidebar-item-color)}.brand-title,.small{font-size:.9em}a.sidebar-item:focus,a.sidebar-item:hover{color:var(--link-active-color);text-decoration:none}ul.level1>li>a.sidebar-item{background-color:transparent;border-radius:4px}#toc ul.level1>li>a.sidebar-item.active{background-color:var(--link-active-bg-color)}.sidebar-item-separator{height:2px;width:100%;background-color:var(--separator-color);opacity:.8}span.sidebar-item{font-weight:700;font-size:.8em;color:var(--text-color);margin-block-start:1.25em}.main-panel{background-color:var(--main-bg-color);flex:1}.top-navbar,ul.breadcrumb{display:flex;flex-direction:row}.top-navbar{align-items:center;background-color:var(--topbar-bg-color)}.blackout,.footer{background-color:var(--footer-bg-color)}.burger-icon{color:var(--button-color)}.brand-title,.footer{color:var(--link-active-color)}.brand{display:flex;align-items:center;justify-content:start}.logomark{height:28px}.brand-title{padding:0 .5em}.footer{margin:0 20px 20px;border-radius:8px}.blackout{display:block;visibility:hidden;z-index:100;top:60px}#breadcrumb wbr,#breadcrumb:empty,.hide,li>ul,ul.level1>li>.expand-stub{display:none}@keyframes showThat{0%{opacity:0;visibility:hidden}1%{opacity:0;visibility:visible}100%{opacity:1;visibility:visible}}@keyframes hideThat{0%{opacity:1;visibility:visible}99%{opacity:0;visibility:visible}100%{opacity:0;visibility:hidden}}.showThat{animation:.5s forwards showThat}.hideThat{animation:.5s forwards hideThat}table{border-collapse:collapse;width:100%;table-layout:auto}table.table-striped tbody tr:nth-child(2n){background-color:var(--table-strip-bg-color)}table thead{background:var(--table-header-bg-color)}.table-condensed th{text-align:left}table td{font-weight:300;padding:6px 10px}.alert{border-radius:4px;padding:8px;margin:25px 0}#toc ul li a,.top-navbar{padding:0 0 0 10px}.alert>h5{margin:0 0 5px;letter-spacing:1px}.alert>p{margin:0;font-weight:300;font-size:13px}.alert.alert-info{border:2px solid var(--alert-info-border-color);background:var(--alert-info-bg-color)}.alert.alert-warning{border:2px solid var(--alert-warning-border-color);background:var(--alert-warning-bg-color)}.alert.alert-danger{border:2px solid var(--alert-danger-border-color);background:var(--alert-danger-bg-color)}.TIP.alert.alert-info{border:2px solid var(--alert-tip-border-color);background:var(--alert-tip-bg-color)}blockquote{margin:8px 0;border-left:4px solid var(--blockquote-border-color);padding:8px;background:var(--blockquote-bg-color);border-radius:4px}blockquote>p{margin:0;font-style:italic;font-size:13px}#breadcrumb{background:var(--breadcrumb-bg-color);border-radius:4px;overflow:scroll;margin-bottom:0}legend,li,li.in>ul,pre{display:block}ul.breadcrumb{margin:0}h1,h1:first-child,h3{margin-block-start:1em}ul.breadcrumb>li{margin-right:6px}ul.breadcrumb>li::before{content:"/";margin-right:5px}ul.breadcrumb>li:first-child::before{content:"";margin:0}legend,pre{--scrollbar-thumb-bg-color:#333;border-radius:0 0 4px 4px;padding:6px}.hljs{background:0 0;color:var(--code-color)}.expand-stub{cursor:pointer;position:absolute;width:20px;height:20px;left:-10px}.toc .nav>li.active>.expand-stub::before,.toc .nav>li>.expand-stub::before{content:" ";position:absolute;transform:rotate(-90deg);background:url(down-arrow.svg);width:8px;height:8px;top:6px;left:6px}.toc .nav>li.active>.expand-stub::before,.toc .nav>li.filtered>.expand-stub::before,.toc .nav>li.in.active>.expand-stub::before,.toc .nav>li.in>.expand-stub::before{transform:none}ul.level2>li>a.sidebar-item,ul.level3>li>a.sidebar-item{font-weight:500;font-size:.95em;padding:0;margin:2px 16px}ul.level2>li>a.sidebar-item{color:var(--sidebar-item-2nd-color)}ul.level3>li>a.sidebar-item{color:var(--sidebar-item-3rd-color)}ul.level2>li>a.sidebar-item:focus,ul.level2>li>a.sidebar-item:hover,ul.level3>li>a.sidebar-item:focus,ul.level3>li>a.sidebar-item:hover{color:var(--link-active-color);text-decoration:underline}.inheritance .level0:before,.inheritance .level1:before,.inheritance .level2:before,.inheritance .level3:before,.inheritance .level4:before,.inheritance .level5:before{content:"↳";margin-right:5px}.inheritance .level0{margin-left:0}.inheritance .level1{margin-left:1em}.inheritance .level2{margin-left:2em}.inheritance .level3{margin-left:3em}.inheritance .level4{margin-left:4em}.inheritance .level5{margin-left:5em}body{font-size:var(--base-font-size)}@media (max-width:1024px){body{font-size:var(--smalldevice-base-font-size)}}h1,h1:first-child{font-size:2.25em;letter-spacing:.5px;color:var(--h1-color);margin-block-end:-0.05em}.article h1{margin-block-end:-0.2em}h2{font-size:2.1em;color:var(--h2-color)}.article h2{margin-block-start:1.3em;padding-bottom:6px;border-bottom:1px solid var(--separator-color)}h3{color:var(--h3-color);margin-block-start:3em;font-size:1.95em;font-weight:500;margin-block-start:1.7em}.article h3{font-size:1.85em;font-weight:500;margin-block-start:1.2em;margin-block-end:0.9em}.article h4,table td p{font-weight:300}h4{opacity:1;color:var(--h4-color);border-bottom:2px solid var(--separator-color);margin:20px 0 0;font-size:1.8em;font-weight:400;margin-block-start:2em;padding-bottom:10px}.article h4{font-size:1.5em;margin-block-start:1em;margin-block-end:1em;padding-bottom:0;border-bottom:none}.search>input,.toc-filter>input{background:0 0;padding:11px 30px 10px 37px;width:100%}h5{font-size:1.1em}.article h5{font-size:1.13em;font-weight:400;text-decoration:underline;margin-block-start:1.5em;margin-block-end:1em}a.brand .brand-title{font-size:1.4em;font-weight:500;letter-spacing:.5px;color:var(--appname-color);margin-top:1px;padding:0 0 0 .4em}@media (min-width:1024px){nav{position:relative;left:0!important;top:0;bottom:0}.blackout,.top-navbar{display:none}a.brand .brand-title{font-size:1.55em}}a.brand .logomark{height:35px}.top-navbar{height:60px}.burger-icon{margin-right:10px}.sidebar{padding:25px 17px 32px}nav{width:94%;max-width:var(--sidebar-width);left:calc(var(--sidebar-width) * -1)}nav .nav a,nav .nav a:hover{text-decoration:none;cursor:pointer;display:block}nav a.sidebar-item{padding:4px 0 4px 10px;cursor:pointer}.footer a:focus,.footer a:hover,nav a.sidebar-item:focus,nav a.sidebar-item:hover,nav a:focus{text-decoration:underline}nav a,nav a:focus,nav a:hover{color:var(--sidebar-item-color)!important}nav a.active,nav a.active:focus,nav a.active:hover{color:var(--sidebar-active-item-color)!important}.sidebar-item-separator{margin:20px 0}.search{background:var(--search-bg-color);border:1px solid var(--search-border-color);border-radius:5px;position:relative;margin-block-start:25px}@media (max-width:1023.98px){.mobile-hide{display:none}.navbar-nav{margin-top:0}nav{top:60px}.search{margin-block-start:0;margin-block-end:15px}}.search>input{font-size:.95em;color:var(--search-color);border:0}.search>input:focus,.toc-filter>input:focus{outline:0}.search>.search-icon{font-size:1.2em;color:var(--search-searchicon-color);position:absolute;top:9px;left:9px}.toc-filter{background:var(--toc-filter-bg-color);border:1px solid var(--toc-filter-border-color);border-radius:5px;position:relative}.toc-filter>input{font-size:.95em;color:var(--toc-filter-color);border:0}.toc-filter>.filter-icon{font-size:1.2em;color:var(--toc-filter-filtericon-color);position:absolute;top:9px;left:9px}.toc-filter>.clear-icon{color:var(--toc-filter-clearicon-color);position:absolute;top:9px;right:9px;cursor:pointer}#toc ul.level2{margin-bottom:20px}#toc ul.level1>li>a{font-weight:500;margin-bottom:10px;padding:5px 10px}#toc ul.level1>li>a,#toc ul.level1>li>a.active{background-color:var(--sidebar-level1-item-bg-color)!important;border-radius:2px}#toc ul.level1>li>a.active:focus,#toc ul.level1>li>a.active:hover,#toc ul.level1>li>a:focus,#toc ul.level1>li>a:hover{background-color:var(--sidebar-level1-item-hover-bg-color)!important;text-decoration:none}ul.level2{padding-inline-start:0.7em}ul.level2 .expand-stub{top:1px}ul.level2>li>a,ul.level2>li>a.sidebar-item{font-weight:400;color:var(--sidebar-item-color);margin:4px 0}ul.level3{padding-inline-start:1em}ul.level3>li>a,ul.level3>li>a.sidebar-item{font-size:1.05em;color:var(--sidebar-item-color);margin:4px 0}ul.level4{padding-inline-start:0;margin-bottom:12px}ul.level4>li>a,ul.level4>li>a.sidebar-item{font-size:1.05em;color:var(--sidebar-item-color);margin:5px 0 5px 10px}.subnav.navbar{margin:0 -15px}#breadcrumb::-webkit-scrollbar{display:none}#breadcrumb a{white-space:nowrap}#search-results h1{margin-block-start:0.5em}#search-results .item-title{font-size:1.3em;margin-top:1.5em}#search-results .item-href{font-size:.85em}#search-results .item-brief{margin-top:.7em}#search-results ul.pagination{text-align:center;padding:10px 0 0;margin-block-start:40px;border-top:1px solid var(--separator-color)}#search-results ul.pagination>li{display:inline-block;margin:0 10px}#search-results ul.pagination>li.disabled a,#search-results ul.pagination>li.disabled a:hover{color:var(--text-color);cursor:txt;text-decoration:none}.main-panel{margin-bottom:60px;padding:20px}@media (min-width:1024px){.main-panel{margin-bottom:0;padding:20px 40px}}.pull-right{float:right;margin-top:70px;position:relative;z-index:1}.divider{margin-left:4px}article ol li,article ul li{margin-bottom:10px}.hljs::-webkit-scrollbar{height:6px}.hljs-built_in,.hljs-keyword,.hljs-title{font-style:normal}code,p .xref{background-color:var(--ref-bg-color);color:var(--ref-color);padding:2px 3px;font-size:.95em;border-radius:6px}.table{width:auto}.table-responsive{overflow-x:auto;margin-bottom:0}table th{color:var(--table-header-color);line-height:15px;border-bottom:1px solid var(--table-header-border-color);font-size:14px;padding:9px 10px}.footer{text-align:center;color:var(--text-color);padding:8px;font-size:12px;line-height:13px}.code-header,.code-header>.action{color:var(--code-color);display:flex}.copyright-footer{font-size:.85em;font-weight:700;text-align:left;margin-block-start:30px}.code-header{box-sizing:content-box;background-color:#242424;flex-direction:row;border-radius:4px 4px 0 0;margin-top:16px;min-height:30px}.tabGroup section[role=tabpanel] .code-header{margin-left:-16px;margin-right:-16px}.tabGroup section[role=tabpanel] .code-header:first-child{margin-top:-16px}.code-header>.language{padding:4px 16px;flex-grow:1;line-height:26px}.code-header>.action{position:relative;padding:4px 16px;border-radius:0 4px 0 0;background-color:transparent;border:0 solid #444;border-left-width:1px;cursor:pointer;align-items:center;line-height:normal}.code-header .glyphicon{margin-right:.25em}.code-header>.action:hover{background-color:#444}.code-header+pre{margin-top:0}.code-header>.action .successful-copy-alert{justify-content:center;align-items:center;border-radius:0 4px 0 0;right:0;left:0;bottom:0;top:0;position:absolute;display:flex;background-color:#128712;outline-color:#fff;color:#fff}.code-header>.action .successful-copy-alert.is-transparent{opacity:0;transition:opacity .5s ease-in-out}.content.wrap#_content{max-width:960px} \ No newline at end of file diff --git a/docs/templates/singulinkfx/toc.html.tmpl b/docs/templates/singulinkfx/toc.html.tmpl new file mode 100644 index 000000000..6549e62e7 --- /dev/null +++ b/docs/templates/singulinkfx/toc.html.tmpl @@ -0,0 +1,22 @@ +{{!Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. See LICENSE file in the project root for full license information.}} + +
      +
      + {{^_disableSideFilter}} +
      +
      + + + +
      +
      + {{/_disableSideFilter}} +
      +
      + {{^leaf}} + {{>partials/li}} + {{/leaf}} +
      +
      +
      +
      \ No newline at end of file diff --git a/docs/toc.yml b/docs/toc.yml new file mode 100644 index 000000000..458707d9c --- /dev/null +++ b/docs/toc.yml @@ -0,0 +1,8 @@ +- name: Home + href: / +- name: Tutorial + href: tutorial/ + homepage: tutorial/index.md +- name: Documentation + href: documentation/ + homepage: documentation/index.md diff --git a/docs/tutorial/extension.md b/docs/tutorial/extension.md new file mode 100644 index 000000000..7772b9adc --- /dev/null +++ b/docs/tutorial/extension.md @@ -0,0 +1,40 @@ +# Visual Studio 2022 Extension for WPF UI + +Visual Studio allows you to add extensions that can be installed in several ways: + +- Build them locally and then install the `.vsix` package. +- Download the extension from the internet and install the `.vsix` file. +- Install the extension using the search in _Visual Studio_. + +In this tutorial, we'll cover the last way, if you want to know more, check out [**Manage extensions for Visual Studio**](https://learn.microsoft.com/en-us/visualstudio/ide/finding-and-using-visual-studio-extensions?view=vs-2022). + +In any case, if you want to download a plugin and install it manually, or leave your review, you can find it in the Visual Studio Marketplace: +https://marketplace.visualstudio.com/items?itemName=lepo.wpf-ui + +> [!NOTE] +> The source code for **WPF UI** _Visual Studio 2022_ extension is public and you can [check it out here](https://github.com/lepoco/wpfui/tree/development/src/Wpf.Ui.Extension/Wpf.Ui.Extension). + +## How to? + +1. Install Visual Studio 2022 from [Visual Studio 2022 downloads](https://visualstudio.microsoft.com/downloads/). +2. After installation, open Visual Studio +3. Expand the _Extensions_ tab in the menu and then click _Manage Extensions_ + ![Extensions tab in Visual Studio](https://user-images.githubusercontent.com/13592821/192057892-39ae96f8-ba25-4fb8-a081-0b8d530f79bf.png) +4. In the _Online_ tab, use the search engine to enter _WPF-UI_ in it, then click _Download_ + ![Online tab in Extension Manager for Visual Studio](https://user-images.githubusercontent.com/13592821/192058027-44929773-548d-4ae1-a6e4-e922c04e82e8.png) +5. After downloading, restart _Visual Studio_ +6. After restarting, you will see a window asking you to confirm the installation. + ![Confirm Visual Studio Installation](https://user-images.githubusercontent.com/13592821/192058231-c5587473-a44d-4046-a6ad-8cd0a3cdc9df.png) +7. Once installed, you can restart _Visual Studio_ and click _Create new project_ + ![Create new project](https://user-images.githubusercontent.com/13592821/192058452-f1f9005c-4d40-482a-96fb-5dccbafb4102.png) +8. In the top right corner, you can select the **WPF UI** project type + ![Project type filter](https://user-images.githubusercontent.com/13592821/192058531-186b0eba-14c0-4761-9781-dd8880e2763a.png) +9. In the top right corner, you can select the project type **WPF UI** + +## Done! + +After creating a project, you can familiarize yourself with its structure and proceed to further steps. + +- [WPF UI - Getting started](/tutorial/getting-started.html) +- [Introduction to the MVVM Toolkit](https://learn.microsoft.com/en-us/windows/communitytoolkit/mvvm/introduction) +- [.NET Generic Host in ASP.NET Core](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-6.0) diff --git a/docs/tutorial/getting-started.md b/docs/tutorial/getting-started.md new file mode 100644 index 000000000..c22b1cc85 --- /dev/null +++ b/docs/tutorial/getting-started.md @@ -0,0 +1,80 @@ +# Getting started + +## Adding dictionaries + +[XAML](https://docs.microsoft.com/en-us/dotnet/desktop/wpf/xaml/?view=netdesktop-6.0), and hence WPF, operate on resource dictionaries. These are HTML-like files that describe the appearance and various aspects of the [controls](https://wpfui.lepo.co/documentation/controls). +**WPF UI** adds its own sets of these files to tell the application how the controls should look like. + +There should be a file called `App.xaml` in your new application. Add new dictionaries to it using **WPF UI** `ControlsDictionary` and `ThemesDictionary` classes: + +```xml + + + + + + + + + + + +``` + +You can choose a color theme here, +`Light` or `Dark`. + +## The main window + +There should be a `MainWindow.xaml` file in your newly created application. +It contains the arrangement of the controls used and their parameters. + +```xml + + + + + +``` + +You can add a new namespace to this window to tell the interpreter that you will be using controls from somewhere, like the **WPF UI** library. + +```xml + +``` + +## Adding controls + +To add a new control from the **WPF UI** library, you just need to enter its class name, prefixing it with the `ui:` prefix: + +```xml + + + + + +``` + +# Well... + +That's it when it comes to the basics, information about individual controls can be found in [documentation](https://wpfui.lepo.co/documentation/), rules for building a WPF application can be found in the [official Microsoft documentation](https://learn.microsoft.com/en-us/dotnet/desktop/wpf/controls/styles-templates-overview?view=netdesktop-6.0). You can check out [**how to build MVVM applications** here](https://learn.microsoft.com/en-us/windows/communitytoolkit/mvvm/puttingthingstogether). +If you think this documentation sucks, [help improve it here](https://github.com/lepoco/wpfui/tree/development/docs/tutorial). diff --git a/docs/ICONS.md b/docs/tutorial/icons.md similarity index 79% rename from docs/ICONS.md rename to docs/tutorial/icons.md index d61157703..a9d9aa9d9 100644 --- a/docs/ICONS.md +++ b/docs/tutorial/icons.md @@ -1,48 +1,61 @@ # Icons + **WPF UI** uses [Fluent UI System Icons](https://github.com/microsoft/fluentui-system-icons), a collection of familiar, friendly and modern icons from Microsoft. ## Getting started + Icons are displayed by using the font that comes with the library. All glyphs are mapped to the [SymbolRegular](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Common/SymbolRegular.cs) and [SymbolFilled](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Common/SymbolFilled.cs) enums. -Icon controls and fonts will be automatically added to your application if you add `Resources` in the **App.xaml** file: +Icon controls and fonts will be automatically added to your application if you add `ControlsDictionary` in the **App.xaml** file: + ```xml - + + ``` +> [!NOTE] +> You can find out how the Control Dictionary works here + # SymbolIcon -`SymbolIcon` is a control responsible for rendering icons. +`SymbolIcon` is a control responsible for rendering icons. ### Implementation -```cpp + +```csharp class Wpf.Ui.Controls.SymbolIcon ``` ## Exposes -```cpp + +```csharp // Gets or sets displayed symbol SymbolIcon.Symbol = SymbolRegular.Empty; ``` -```cpp + +```csharp // Defines whether or not we should use the SymbolFilled SymbolIcon.Filled = false; ``` -```cpp + +```csharp // Icon foreground SymbolIcon.Foreground = Brushes.White; ``` -```cpp + +```csharp // Icon size SymbolIcon.FontSize = 16; ``` ### How to use + ```xml ``` - ## Segoe Fluent Icons + Not all icons available in WinUi 3 are in **Fluent UI System Icons**. Some of them require the **Segoe Fluent Icons** font. According to the EULA of Segoe Fluent Icons we cannot ship a copy of it with this dll. Segoe Fluent Icons is installed by default on Windows 11, but if you want these icons in an application for Windows 10 and below, you must manually add the font to your application's resources. [https://docs.microsoft.com/en-us/windows/apps/design/style/segoe-fluent-icons-font](https://docs.microsoft.com/en-us/windows/apps/design/style/segoe-fluent-icons-font) [https://docs.microsoft.com/en-us/windows/apps/design/downloads/#fonts](https://docs.microsoft.com/en-us/windows/apps/design/downloads/#fonts) In the `App.xaml` dictionaries, you can add an alternate path to the font -```XML -pack://application:,,,/;component/Fonts/#Segoe Fluent Icons -``` \ No newline at end of file + +```xml + + + + + + pack://application:,,,/;component/Fonts/#Segoe Fluent Icons + + +``` diff --git a/docs/tutorial/index.md b/docs/tutorial/index.md new file mode 100644 index 000000000..7dfe2bb1a --- /dev/null +++ b/docs/tutorial/index.md @@ -0,0 +1,34 @@ +# Tutorial + +**WPF UI** is a library built for [Windows Presentation Foundation (WPF)](https://docs.microsoft.com/en-us/visualstudio/designers/getting-started-with-wpf) and the [C#](https://docs.microsoft.com/en-us/dotnet/csharp/) language. +To be able to work with them comfortably, you will need: + +- [Visual Studio 2022 Community Edition](https://visualstudio.microsoft.com/vs/community/) +- .NET desktop development + _(Additional workload in Visual Studio)_ + +![NET development package](https://user-images.githubusercontent.com/13592821/191967842-118b8dc2-fb33-49c1-b9a9-162669b6e110.png) + +> [!NOTE] +> Visual Studio 2022 and Visual Studio Code are two different programs. If you want to create WPF apps, it's possible to compile them in Visual Studio Code, however for comfortable work we recommend [Visual Studio 2022](https://visualstudio.microsoft.com/vs/community/) or [JetBrains Rider](https://www.jetbrains.com/rider/). + +## Installation + +You can install **WPF UI**, the library for the Windows Presentation Foundation framework, in several ways. + +- Directly specify the `Wpf.Ui.dll` file in your application's project file (`.csproj`). +- Copy the library source code into your application codebase. +- Use the **NuGet** package manager. + +We recommend using the **NuGet** package manager, it allows you to easily install and update your application dependencies. +More information on how to install **WPF UI** using **NuGet** [can be found here](/tutorial/nuget.html). + +## Extension for Visual Studio + +Creators of **WPF UI** have prepared a special plugin that will automatically create a project based on **WPF UI**, Dependency Injection and MVVM, thanks to which you will quickly and easily start a new apps. + +[Learn more about the WPF UI plug-in for Visual Studio 2022](/tutorial/extension.html) + +## Getting started + +Once you have chosen how to install **WPF UI**, you can move on to creating your first app, more on this in [Getting Started](/tutorial/getting-started.html). diff --git a/docs/NAVIGATION.md b/docs/tutorial/navigation.md similarity index 56% rename from docs/NAVIGATION.md rename to docs/tutorial/navigation.md index 5ca92618c..3b73fe8de 100644 --- a/docs/NAVIGATION.md +++ b/docs/tutorial/navigation.md @@ -1,114 +1,115 @@ # Navigation + **WPF UI** implements a variety of navigation related controls. You can use them to conveniently manage the pages of your application. ## Basics + The `Navigation` control stores information about the currently displayed pages and provides methods related to navigation. You can create it in your XAML files or in code. -After the navigation is rendered, it will automatically navigate to the first page added to `Items`. +After the navigation is rendered, it will automatically navigate to the first page added to `Items` _(if the SelectedPageIndex is set above -1)_. You can navigate manually using the Navigate method. -```cpp + +```csharp RootNavigation.Navigate("dashboard"); +RootNavigation.Navigate(typeof(MyDashboardClass)); ``` + The Navigate method uses `PageTag` parameter of the `NavigationItem` to detect what page you want to navigate to. If you don't define it, it will be added automatically. -If `Content` of the `NavigationItem` is **HomePage**, the automatically generated tag will be **homepage**. - -Additionally, you can choose whether the instance you are navigating to should be recreated and pass the view context. -```cpp -RootNavigation.Navigate( - "dashboard", // Tag of the Navigationitem - false, // Do you want to reset the page instance? - _myData // Some object, preferably an ObservableCollection that contains your page data -); -``` +If `Content` of the `NavigationItem` is **HomePage** string, the automatically generated tag will be **homepage**. + +You can also navigate using an index like an array. +`Items` and `Footer` are treated as one array. So if you have two `NavigationItem` in `Items` and another two in the `Footer` then `RootNavigation.Navigate(2)`, will navigate to the third index (counting from zero), which is first item in the `Footer`. -You can also navigate using an index like an array. -```cpp -// 1, which is index 1, which is the second NavigationItem added to Items -RootNavigation.Navigate(1); +```csharp +// 2, which is index 2 (third element), which is the third NavigationItem added to Items and Footer +RootNavigation.Navigate(2); ``` ## NavigationStore + It is similar to the navigation from the Windows Store. ```xml - - - + + - - - + + + PageType="{x:Type pages:Settings}" /> - - - + +
      ``` ## NavigationCompact + It is similar to the navigation from the Windows 11 Task Manager. ```xml - - - + - - - + + + PageType="{x:Type pages:Settings}" /> - - - + + ``` ## NavigationFluent + It is similar to the navigation from the Windows 11 Settings app. ```xml - - - + - - - + + - - - -``` \ No newline at end of file + + +``` diff --git a/docs/tutorial/nuget.md b/docs/tutorial/nuget.md new file mode 100644 index 000000000..64ba20cc7 --- /dev/null +++ b/docs/tutorial/nuget.md @@ -0,0 +1,31 @@ +# NuGet package for WPF UI + +## What's NuGet? + +An essential tool for any modern development platform is a mechanism through which developers can create, share, and consume useful code. Often such code is bundled into "packages" that contain compiled code (as DLLs) along with other content needed in the projects that consume these packages. + +- [Read more here](https://learn.microsoft.com/en-us/nuget/what-is-nuget) +- [How to install NuGet packages](https://learn.microsoft.com/en-us/nuget/consume-packages/overview-and-workflow#ways-to-install-a-nuget-package=) +- [Install and manage packages in Visual Studio using the NuGet Package Manager](https://learn.microsoft.com/en-us/nuget/consume-packages/install-use-packages-visual-studio) + +## How to install **WPF UI** in Visual Studio using the NuGet Package Manager? + +### 1. Create new WPF project + +![New project in Visual Studio](https://user-images.githubusercontent.com/13592821/192056284-0efcefa6-990e-4ef6-ab44-5746e4bf66ed.png) + +### 2. Open _Manage NuGet Packages_ window via solution explorer + +![Manage NuGet Packages](https://user-images.githubusercontent.com/13592821/192056354-4f5a46c1-d02f-4c7b-8822-c8cd6f105ed1.png) + +### 3. In the _Browse_ tab, enter "**WPF-UI**" + +![Browse tab in NuGet](https://user-images.githubusercontent.com/13592821/192056603-d9c48b4d-b9f1-485a-80cf-9fd27d8e55d7.png) + +### 4. Install **WPF-UI** package + +![Package installed](https://user-images.githubusercontent.com/13592821/192056761-186336dd-3aed-450c-b036-bbfdc6b73e74.png) + +# Done! + +Package installed, to learn more, go to the [**Getting started**](/tutorial/getting-started.html) page. diff --git a/docs/THEMES.md b/docs/tutorial/themes.md similarity index 63% rename from docs/THEMES.md rename to docs/tutorial/themes.md index c498b5d87..4fa255169 100644 --- a/docs/THEMES.md +++ b/docs/tutorial/themes.md @@ -1,19 +1,24 @@ # Themes + **WPF UI** supports themes. You set the default theme in `App.xaml`, with the help of an automatic resources importer. + ```xml - + + ``` -Or, you can add WPF UI resources manually. +Or, you can add **WPF UI** resources manually. + ```xml @@ -28,35 +33,38 @@ Or, you can add WPF UI resources manually. ``` ### Change on the fly + If you want to change the theme while the application is running, you can call the static `Apply` method of the `Theme` class. -```cpp + +```csharp Wpf.Ui.Appearance.Theme.Apply( Wpf.Ui.Appearance.ThemeType.Light, // Theme type Wpf.Ui.Appearance.BackgroundType.Mica, // Background type - true // Whether to change accents automatically + true // Whether to change accents automatically ); ``` ### Automatic change -The theme can be changed automatically when the operating system changes its background or accent using the [Watcher](https://github.com/lepoco/wpfui/blob/main/WPFUI/Appearance/Watcher.cs) class. -```cpp -namespace MyApp + +The theme can be changed automatically when the operating system changes its background or accent using the [Watcher](https://github.com/lepoco/wpfui/blob/main/src/Wpf.Ui/Appearance/Watcher.cs) class. + +```csharp +namespace MyApp; + +public partial class MainWindow : Window { - public partial class MainWindow : Window - { public MainWindow() { - InitializeComponent(); - - Loaded += (sender, args) => - { - Wpf.Ui.Appearance.Watcher.Watch( - this, // Window class - Wpf.Ui.Appearance.BackgroundType.Mica, // Background type - true // Whether to change accents automatically - ); - }; + InitializeComponent(); + + Loaded += (sender, args) => + { + Wpf.Ui.Appearance.Watcher.Watch( + this, // Window class + Wpf.Ui.Appearance.BackgroundType.Mica, // Background type + true // Whether to change accents automatically + ); + }; } - } } ``` diff --git a/docs/tutorial/toc.yml b/docs/tutorial/toc.yml new file mode 100644 index 000000000..6df83c82a --- /dev/null +++ b/docs/tutorial/toc.yml @@ -0,0 +1,12 @@ +- name: NuGet Package + href: nuget.md +- name: Visual Studio Extension + href: extension.md +- name: Getting started + href: getting-started.md +- name: Themes + href: themes.md +- name: Icons + href: icons.md +- name: Navigation + href: Navigation.md diff --git a/scripts/build_demo.ps1 b/scripts/build_demo.ps1 new file mode 100644 index 000000000..537322dac --- /dev/null +++ b/scripts/build_demo.ps1 @@ -0,0 +1 @@ +. $PSScriptRoot\dotnet_build.ps1 -restore -build -solution Wpf.Ui.Demo.sln \ No newline at end of file diff --git a/scripts/build_extension.ps1 b/scripts/build_extension.ps1 new file mode 100644 index 000000000..c1cc56708 --- /dev/null +++ b/scripts/build_extension.ps1 @@ -0,0 +1 @@ +. $PSScriptRoot\msbuild_build.ps1 -restore -build -solution Wpf.Ui.Extension.sln \ No newline at end of file diff --git a/scripts/build_library.ps1 b/scripts/build_library.ps1 new file mode 100644 index 000000000..bb7aa2fb8 --- /dev/null +++ b/scripts/build_library.ps1 @@ -0,0 +1 @@ +. $PSScriptRoot\dotnet_build.ps1 -restore -build -solution Wpf.Ui.sln \ No newline at end of file diff --git a/scripts/dotnet_build.ps1 b/scripts/dotnet_build.ps1 new file mode 100644 index 000000000..f69f70b51 --- /dev/null +++ b/scripts/dotnet_build.ps1 @@ -0,0 +1,127 @@ +# Copyright 2022 Leszek Pomianowski and WPF UI Contributors + +[CmdletBinding(PositionalBinding = $false)] +Param( + [string][Alias('c')]$configuration = "Release", + [string][Alias('v')]$verbosity = "minimal", + [string][Alias('p')]$platform = "AnyCPU", + [string][Alias('s')]$solution = "", + [switch][Alias('r')]$restore, + [switch][Alias('b')]$build, + [switch] $nologo, + [switch] $help, + [Parameter(ValueFromRemainingArguments = $true)][String[]]$properties +) + +$Script:BuildPath = "" + +function Invoke-Help { + Write-Host "Common settings:" + Write-Host " -configuration Build configuration: 'Debug' or 'Release' (short: -c)" + Write-Host " -platform Platform configuration: 'x86', 'x64' or any valid Platform value to pass to msbuild" + Write-Host " -verbosity Msbuild verbosity: q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic] (short: -v)" + Write-Host " -nologo Doesn't display the startup banner or the copyright message" + Write-Host " -help Print help and exit" + Write-Host "" + + Write-Host "Actions:" + Write-Host " -restore Restore dependencies (short: -r)" + Write-Host " -build Build solution (short: -b)" + Write-Host "" +} + +function Invoke-Hello { + if ($nologo) { + return + } + + $TextInfo = (Get-Culture).TextInfo + + Write-Host " -------------------" -ForegroundColor Cyan + Write-Host "| " -NoNewline -ForegroundColor Cyan + Write-Host " WPF UI" -NoNewline -ForegroundColor White + Write-Host " | "-ForegroundColor Cyan + Write-Host "| " -NoNewline -ForegroundColor Cyan + Write-Host " lepo.co 2021-$(Get-Date -UFormat "%Y")" -NoNewline -ForegroundColor Gray + Write-Host " | " -ForegroundColor Cyan + Write-Host " ------------------ - " -ForegroundColor Cyan + Write-Host "" + Write-Host "Solution: " -NoNewline + Write-Host "$($Script:Solution)" -ForegroundColor Cyan + Write-Host "Platform: " -NoNewline + Write-Host "$($TextInfo.ToTitleCase($platform))" -ForegroundColor Cyan + Write-Host "Configuration: " -NoNewline + Write-Host "$($TextInfo.ToTitleCase($configuration))" -ForegroundColor Cyan + Write-Host "Verbosity: " -NoNewline + Write-Host "$($TextInfo.ToTitleCase($verbosity))" -ForegroundColor Cyan + Write-Host "" +} + +function Invoke-ExitWithExitCode([int] $exitCode) { + if ($ci -and $prepareMachine) { + Stop-Processes + } + + exit $exitCode +} + +function Initialize-Script { + + if ((Test-Path "$($PSScriptRoot)\..\src\$($solution)") -eq $False) { + Write-Host "Solution $($PSScriptRoot)\..\src\$($solution) not found" -ForegroundColor Red + Invoke-ExitWithExitCode 1 + } + + $Script:BuildPath = (Resolve-Path -Path "$($PSScriptRoot)\..\src\$($solution)").ToString() +} + +function Initialize-Toolset { + +} + +function Invoke-Restore { + if (-not $restore) { + return + } + + dotnet restore $Script:BuildPath --verbosity $verbosity + + if ($lastExitCode -ne 0) { + Write-Host "Restore failed" -ForegroundColor Red + + Invoke-ExitWithExitCode $LastExitCode + } +} + +function Invoke-Build { + if (-not $build) { + return + } + + dotnet build $Script:BuildPath --configuration $configuration --verbosity $verbosity --no-restore --nologo + + if ($lastExitCode -ne 0) { + Write-Host "Build failed" -ForegroundColor Red + Invoke-ExitWithExitCode $LastExitCode + } +} + +if ($help) { + Invoke-Help + + exit 0 +} + +[timespan]$execTime = Measure-Command { + Invoke-Hello | Out-Default + Initialize-Script | Out-Default + Initialize-Toolset | Out-Default + Invoke-Restore | Out-Default + Invoke-Build | Out-Default +} + +Write-Host "Finished in " -NoNewline +Write-Host "$($execTime.Minutes) min $($execTime.Seconds),$($execTime.Milliseconds) s." -ForegroundColor Cyan + +Write-Host "Finished at " -NoNewline +Write-Host "$(Get-Date -UFormat "%d.%m.%Y %R")" -ForegroundColor Cyan \ No newline at end of file diff --git a/scripts/msbuild_build.ps1 b/scripts/msbuild_build.ps1 new file mode 100644 index 000000000..b1fc458e8 --- /dev/null +++ b/scripts/msbuild_build.ps1 @@ -0,0 +1,158 @@ +# Copyright 2022 Leszek Pomianowski and WPF UI Contributors + +[CmdletBinding(PositionalBinding = $false)] +Param( + [string][Alias('c')]$configuration = "Release", + [string][Alias('v')]$verbosity = "minimal", + [string][Alias('p')]$platform = "AnyCPU", + [string][Alias('s')]$solution = "", + [switch][Alias('r')]$restore, + [switch][Alias('b')]$build, + [switch] $nologo, + [switch] $help, + [Parameter(ValueFromRemainingArguments = $true)][String[]]$properties +) + +$Script:BuildPath = "" +$Script:VsPath = "" + +function Invoke-Help { + Write-Host "Common settings:" + Write-Host " -configuration Build configuration: 'Debug' or 'Release' (short: -c)" + Write-Host " -platform Platform configuration: 'x86', 'x64' or any valid Platform value to pass to msbuild" + Write-Host " -verbosity Msbuild verbosity: q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic] (short: -v)" + Write-Host " -nologo Doesn't display the startup banner or the copyright message" + Write-Host " -help Print help and exit" + Write-Host "" + + Write-Host "Actions:" + Write-Host " -restore Restore dependencies (short: -r)" + Write-Host " -build Build solution (short: -b)" + Write-Host "" +} + +function Invoke-Hello { + if ($nologo) { + return + } + + $TextInfo = (Get-Culture).TextInfo + + Write-Host " -------------------" -ForegroundColor Cyan + Write-Host "| " -NoNewline -ForegroundColor Cyan + Write-Host " WPF UI" -NoNewline -ForegroundColor White + Write-Host " | "-ForegroundColor Cyan + Write-Host "| " -NoNewline -ForegroundColor Cyan + Write-Host " lepo.co 2021-$(Get-Date -UFormat "%Y")" -NoNewline -ForegroundColor Gray + Write-Host " | " -ForegroundColor Cyan + Write-Host " ------------------ - " -ForegroundColor Cyan + Write-Host "" + Write-Host "Solution: " -NoNewline + Write-Host "$($Script:Solution)" -ForegroundColor Cyan + Write-Host "Platform: " -NoNewline + Write-Host "$($TextInfo.ToTitleCase($platform))" -ForegroundColor Cyan + Write-Host "Configuration: " -NoNewline + Write-Host "$($TextInfo.ToTitleCase($configuration))" -ForegroundColor Cyan + Write-Host "Verbosity: " -NoNewline + Write-Host "$($TextInfo.ToTitleCase($verbosity))" -ForegroundColor Cyan + Write-Host "" +} + +function Invoke-ExitWithExitCode([int] $exitCode) { + if ($ci -and $prepareMachine) { + Stop-Processes + } + + exit $exitCode +} + +function Initialize-Script { + + if ((Test-Path "$($PSScriptRoot)\..\src\$($solution)") -eq $False) { + Write-Host "Solution $($PSScriptRoot)\..\src\$($solution) not found" -ForegroundColor Red + Invoke-ExitWithExitCode 1 + } + + $Script:BuildPath = (Resolve-Path -Path "$($PSScriptRoot)\..\src\$($solution)").ToString() +} + +function Initialize-VisualStudio { + + if ((Test-Path "C:\Program Files\Microsoft Visual Studio\2022\Community\Msbuild\Current\Bin") -ne $False) { + $Script:VsPath = "C:\Program Files\Microsoft Visual Studio\2022\Community\Msbuild\Current\Bin\"; + } + elseif ((Test-Path "C:\Program Files\Microsoft Visual Studio\2022\Preview\Msbuild\Current\Bin") -ne $False) { + $Script:VsPath = "C:\Program Files\Microsoft Visual Studio\2022\Preview\Msbuild\Current\Bin\"; + } + elseif ((Test-Path "C:\Program Files\Microsoft Visual Studio\2022\Professional\Msbuild\Current\Bin") -ne $False) { + $Script:VsPath = "C:\Program Files\Microsoft Visual Studio\2022\Professional\Msbuild\Current\Bin\"; + } + elseif ((Test-Path "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Msbuild\Current\Bin") -ne $False) { + $Script:VsPath = "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Msbuild\Current\Bin\"; + } + elseif ((Test-Path "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Msbuild\Current\Bin") -ne $False) { + $Script:VsPath = "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Msbuild\Current\Bin\"; + } + elseif ((Test-Path "C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\Msbuild\Current\Bin") -ne $False) { + $Script:VsPath = "C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\Msbuild\Current\Bin\"; + } + elseif ((Test-Path "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Msbuild\Current\Bin") -ne $False) { + $Script:VsPath = "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Msbuild\Current\Bin\"; + } + elseif ((Test-Path "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Msbuild\Current\Bin") -ne $False) { + $Script:VsPath = "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Msbuild\Current\Bin\"; + } + else { + Write-Host "Visual Studio 2022 or 2019 not found." -ForegroundColor Red + Invoke-ExitWithExitCode 1 + } +} + +function Invoke-Build { + if (-not $build) { + return + } + + $msBuild = "$($Script:VsPath)MSBuild.exe" + + if ($platform.ToLower() -eq "anycpu") { + $platform = "Any CPU" + } + + if ($restore) { + & $msBuild $Script:BuildPath ` + /target:Clean ` + /target:Build ` + /p:Configuration=$configuration ` + /p:Platform="$($platform)" ` + --verbosity:$verbosity ` + --restore + } + else { + & $msBuild $Script:BuildPath ` + /target:Clean ` + /target:Build ` + /p:Configuration=$configuration ` + /p:Platform="$($platform)" ` + --verbosity:$verbosity + } +} + +if ($help) { + Invoke-Help + + exit 0 +} + +[timespan]$execTime = Measure-Command { + Invoke-Hello | Out-Default + Initialize-Script | Out-Default + Initialize-VisualStudio | Out-Default + Invoke-Build | Out-Default +} + +Write-Host "Finished in " -NoNewline +Write-Host "$($execTime.Minutes) min $($execTime.Seconds),$($execTime.Milliseconds) s." -ForegroundColor Cyan + +Write-Host "Finished at " -NoNewline +Write-Host "$(Get-Date -UFormat "%d.%m.%Y %R")" -ForegroundColor Cyan \ No newline at end of file diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 9427cb0ad..45c2ed19d 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 2.0.2 + 2.0.3 10.0 true diff --git a/src/Packages.props b/src/Packages.props index f2ca092b9..2fb5e3b83 100644 --- a/src/Packages.props +++ b/src/Packages.props @@ -1,11 +1,12 @@ - + + \ No newline at end of file diff --git a/src/Wpf.Ui.Demo.sln b/src/Wpf.Ui.Demo.sln new file mode 100644 index 000000000..f803f7a25 --- /dev/null +++ b/src/Wpf.Ui.Demo.sln @@ -0,0 +1,64 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.1.32407.343 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui", "Wpf.Ui\Wpf.Ui.csproj", "{1ADC87D1-8963-4100-845A-18477824718E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui.Demo", "Wpf.Ui.DEMO\Wpf.Ui.Demo.csproj", "{A78FB614-E888-4D5C-92D3-690567958B90}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui.SimpleDemo", "Wpf.Ui.SimpleDemo\Wpf.Ui.SimpleDemo.csproj", "{7BFB5593-8C6F-4DF7-AA82-522936F74265}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{21DB16AA-40BB-428B-AFE8-DEF4E3F0DC49}" + ProjectSection(SolutionItems) = preProject + Directory.Build.props = Directory.Build.props + ..\LICENSE = ..\LICENSE + Packages.props = Packages.props + ..\README.md = ..\README.md + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Library", "Library", "{BA330FCF-7C4C-4B06-A124-C33BB701B174}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1ADC87D1-8963-4100-845A-18477824718E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1ADC87D1-8963-4100-845A-18477824718E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1ADC87D1-8963-4100-845A-18477824718E}.Debug|x86.ActiveCfg = Debug|Any CPU + {1ADC87D1-8963-4100-845A-18477824718E}.Debug|x86.Build.0 = Debug|Any CPU + {1ADC87D1-8963-4100-845A-18477824718E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1ADC87D1-8963-4100-845A-18477824718E}.Release|Any CPU.Build.0 = Release|Any CPU + {1ADC87D1-8963-4100-845A-18477824718E}.Release|x86.ActiveCfg = Release|Any CPU + {1ADC87D1-8963-4100-845A-18477824718E}.Release|x86.Build.0 = Release|Any CPU + {A78FB614-E888-4D5C-92D3-690567958B90}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A78FB614-E888-4D5C-92D3-690567958B90}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A78FB614-E888-4D5C-92D3-690567958B90}.Debug|x86.ActiveCfg = Debug|Any CPU + {A78FB614-E888-4D5C-92D3-690567958B90}.Debug|x86.Build.0 = Debug|Any CPU + {A78FB614-E888-4D5C-92D3-690567958B90}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A78FB614-E888-4D5C-92D3-690567958B90}.Release|Any CPU.Build.0 = Release|Any CPU + {A78FB614-E888-4D5C-92D3-690567958B90}.Release|x86.ActiveCfg = Release|Any CPU + {A78FB614-E888-4D5C-92D3-690567958B90}.Release|x86.Build.0 = Release|Any CPU + {7BFB5593-8C6F-4DF7-AA82-522936F74265}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7BFB5593-8C6F-4DF7-AA82-522936F74265}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7BFB5593-8C6F-4DF7-AA82-522936F74265}.Debug|x86.ActiveCfg = Debug|Any CPU + {7BFB5593-8C6F-4DF7-AA82-522936F74265}.Debug|x86.Build.0 = Debug|Any CPU + {7BFB5593-8C6F-4DF7-AA82-522936F74265}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7BFB5593-8C6F-4DF7-AA82-522936F74265}.Release|Any CPU.Build.0 = Release|Any CPU + {7BFB5593-8C6F-4DF7-AA82-522936F74265}.Release|x86.ActiveCfg = Release|Any CPU + {7BFB5593-8C6F-4DF7-AA82-522936F74265}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {1ADC87D1-8963-4100-845A-18477824718E} = {BA330FCF-7C4C-4B06-A124-C33BB701B174} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {234CB3F9-5ADC-433F-BDBD-CB8EA59EB518} + EndGlobalSection +EndGlobal diff --git a/src/Wpf.Ui.Demo/App.xaml b/src/Wpf.Ui.Demo/App.xaml index eb03b10a7..e1796ae8f 100644 --- a/src/Wpf.Ui.Demo/App.xaml +++ b/src/Wpf.Ui.Demo/App.xaml @@ -9,8 +9,8 @@ - + diff --git a/src/Wpf.Ui.Demo/Models/Data/Customer.cs b/src/Wpf.Ui.Demo/Models/Data/Customer.cs index 0247bc57c..2a101d2ab 100644 --- a/src/Wpf.Ui.Demo/Models/Data/Customer.cs +++ b/src/Wpf.Ui.Demo/Models/Data/Customer.cs @@ -10,6 +10,7 @@ public class Customer public string FirstName { get; set; } public string LastName { get; set; } public string Email { get; set; } + public string MailTo { get; set; } public bool IsMember { get; set; } public OrderStatus Status { get; set; } } diff --git a/src/Wpf.Ui.Demo/ViewModels/ButtonsViewModel.cs b/src/Wpf.Ui.Demo/ViewModels/ButtonsViewModel.cs index 877d7fb81..41b416dbb 100644 --- a/src/Wpf.Ui.Demo/ViewModels/ButtonsViewModel.cs +++ b/src/Wpf.Ui.Demo/ViewModels/ButtonsViewModel.cs @@ -4,8 +4,8 @@ // All Rights Reserved. using System.Windows.Input; -using Microsoft.Toolkit.Mvvm.ComponentModel; -using Microsoft.Toolkit.Mvvm.Input; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; using Wpf.Ui.Mvvm.Contracts; namespace Wpf.Ui.Demo.ViewModels; diff --git a/src/Wpf.Ui.Demo/ViewModels/ColorsViewModel.cs b/src/Wpf.Ui.Demo/ViewModels/ColorsViewModel.cs index 2f2063717..ff987567a 100644 --- a/src/Wpf.Ui.Demo/ViewModels/ColorsViewModel.cs +++ b/src/Wpf.Ui.Demo/ViewModels/ColorsViewModel.cs @@ -9,8 +9,8 @@ using System.Windows; using System.Windows.Input; using System.Windows.Media; -using Microsoft.Toolkit.Mvvm.ComponentModel; -using Microsoft.Toolkit.Mvvm.Input; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; using Wpf.Ui.Appearance; using Wpf.Ui.Common.Interfaces; using Wpf.Ui.Demo.Models.Colors; diff --git a/src/Wpf.Ui.Demo/ViewModels/ContainerViewModel.cs b/src/Wpf.Ui.Demo/ViewModels/ContainerViewModel.cs index 238880e57..6011e7f75 100644 --- a/src/Wpf.Ui.Demo/ViewModels/ContainerViewModel.cs +++ b/src/Wpf.Ui.Demo/ViewModels/ContainerViewModel.cs @@ -3,7 +3,7 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using Microsoft.Toolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.ComponentModel; namespace Wpf.Ui.Demo.ViewModels; diff --git a/src/Wpf.Ui.Demo/ViewModels/DashboardViewModel.cs b/src/Wpf.Ui.Demo/ViewModels/DashboardViewModel.cs index 038786190..2bffccc18 100644 --- a/src/Wpf.Ui.Demo/ViewModels/DashboardViewModel.cs +++ b/src/Wpf.Ui.Demo/ViewModels/DashboardViewModel.cs @@ -4,8 +4,8 @@ // All Rights Reserved. using System.Windows.Input; -using Microsoft.Toolkit.Mvvm.ComponentModel; -using Microsoft.Toolkit.Mvvm.Input; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; using Wpf.Ui.Common.Interfaces; using Wpf.Ui.Demo.Services.Contracts; using Wpf.Ui.Mvvm.Contracts; diff --git a/src/Wpf.Ui.Demo/ViewModels/DataViewModel.cs b/src/Wpf.Ui.Demo/ViewModels/DataViewModel.cs index 2cbd7cc13..9d11756d3 100644 --- a/src/Wpf.Ui.Demo/ViewModels/DataViewModel.cs +++ b/src/Wpf.Ui.Demo/ViewModels/DataViewModel.cs @@ -6,7 +6,7 @@ using System; using System.Collections.Generic; using System.Windows.Media; -using Microsoft.Toolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.ComponentModel; using Wpf.Ui.Common.Interfaces; using Wpf.Ui.Demo.Models.Data; @@ -65,6 +65,7 @@ private void InitializeData() new() { Email = "john.doe@example.com", + MailTo = "mailto:john.doe@example.com", FirstName = "John", LastName = "Doe", IsMember = true, @@ -73,6 +74,7 @@ private void InitializeData() new() { Email = "chloe.clarkson@example.com", + MailTo = "mailto:chloe.clarkson@example.com", FirstName = "Chloe", LastName = "Clarkson", IsMember = true, @@ -81,6 +83,7 @@ private void InitializeData() new() { Email = "eric.brown@example.com", + MailTo = "mailto:eric.brown@example.com", FirstName = "Eric", LastName = "Brown", IsMember = false, @@ -89,6 +92,7 @@ private void InitializeData() new() { Email = "john.doe@example.com", + MailTo = "mailto:john.doe@example.com", FirstName = "John", LastName = "Doe", IsMember = true, @@ -97,6 +101,7 @@ private void InitializeData() new() { Email = "chloe.clarkson@example.com", + MailTo = "mailto:chloe.clarkson@example.com", FirstName = "Chloe", LastName = "Clarkson", IsMember = true, @@ -105,6 +110,7 @@ private void InitializeData() new() { Email = "eric.brown@example.com", + MailTo = "mailto:eric.brown@example.com", FirstName = "Eric", LastName = "Brown", IsMember = false, diff --git a/src/Wpf.Ui.Demo/ViewModels/DebugViewModel.cs b/src/Wpf.Ui.Demo/ViewModels/DebugViewModel.cs index efcee24e6..482365f7c 100644 --- a/src/Wpf.Ui.Demo/ViewModels/DebugViewModel.cs +++ b/src/Wpf.Ui.Demo/ViewModels/DebugViewModel.cs @@ -4,7 +4,7 @@ // All Rights Reserved. using System.Collections.Generic; -using Microsoft.Toolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.ComponentModel; using Wpf.Ui.Common.Interfaces; namespace Wpf.Ui.Demo.ViewModels; diff --git a/src/Wpf.Ui.Demo/ViewModels/ExperimentalViewModel.cs b/src/Wpf.Ui.Demo/ViewModels/ExperimentalViewModel.cs index 1ef4fe0a0..998f41a72 100644 --- a/src/Wpf.Ui.Demo/ViewModels/ExperimentalViewModel.cs +++ b/src/Wpf.Ui.Demo/ViewModels/ExperimentalViewModel.cs @@ -4,7 +4,7 @@ // All Rights Reserved. using System; -using Microsoft.Toolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.ComponentModel; using Wpf.Ui.Common.Interfaces; using Wpf.Ui.Mvvm.Contracts; diff --git a/src/Wpf.Ui.Demo/ViewModels/IconsViewModel.cs b/src/Wpf.Ui.Demo/ViewModels/IconsViewModel.cs index 700c6b26b..2af24de74 100644 --- a/src/Wpf.Ui.Demo/ViewModels/IconsViewModel.cs +++ b/src/Wpf.Ui.Demo/ViewModels/IconsViewModel.cs @@ -8,8 +8,8 @@ using System.Linq; using System.Threading.Tasks; using System.Windows.Input; -using Microsoft.Toolkit.Mvvm.ComponentModel; -using Microsoft.Toolkit.Mvvm.Input; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; using Wpf.Ui.Common.Interfaces; using Wpf.Ui.Demo.Models.Icons; diff --git a/src/Wpf.Ui.Demo/ViewModels/InputViewModel.cs b/src/Wpf.Ui.Demo/ViewModels/InputViewModel.cs index 0a3346ce3..77d2c7659 100644 --- a/src/Wpf.Ui.Demo/ViewModels/InputViewModel.cs +++ b/src/Wpf.Ui.Demo/ViewModels/InputViewModel.cs @@ -4,7 +4,7 @@ // All Rights Reserved. using System.Collections.Generic; -using Microsoft.Toolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.ComponentModel; using Wpf.Ui.Common.Interfaces; namespace Wpf.Ui.Demo.ViewModels; diff --git a/src/Wpf.Ui.Demo/ViewModels/TaskManagerViewModel.cs b/src/Wpf.Ui.Demo/ViewModels/TaskManagerViewModel.cs index 704a58691..6efb0bf5f 100644 --- a/src/Wpf.Ui.Demo/ViewModels/TaskManagerViewModel.cs +++ b/src/Wpf.Ui.Demo/ViewModels/TaskManagerViewModel.cs @@ -4,7 +4,7 @@ // All Rights Reserved. using System.Collections.ObjectModel; -using Microsoft.Toolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.ComponentModel; using Wpf.Ui.Common; using Wpf.Ui.Controls; using Wpf.Ui.Controls.Interfaces; diff --git a/src/Wpf.Ui.Demo/Views/Container.xaml b/src/Wpf.Ui.Demo/Views/Container.xaml index 55ec6d9ea..aaf32c924 100644 --- a/src/Wpf.Ui.Demo/Views/Container.xaml +++ b/src/Wpf.Ui.Demo/Views/Container.xaml @@ -199,6 +199,7 @@ Icon="pack://application:,,,/Resources/wpfui.png" MinimizeToTray="False" ShowHelp="False" + ShowClose="True" ShowMaximize="True" ShowMinimize="True" UseSnapLayout="True"> diff --git a/src/Wpf.Ui.Demo/Views/Pages/Controls.xaml b/src/Wpf.Ui.Demo/Views/Pages/Controls.xaml index 5c26caeb9..79a2927d7 100644 --- a/src/Wpf.Ui.Demo/Views/Pages/Controls.xaml +++ b/src/Wpf.Ui.Demo/Views/Pages/Controls.xaml @@ -248,14 +248,70 @@ + + + + + + + + + + + + + + + <ui:SymbolIcon Symbol="Fluent24"/> + + + + <ui:FontIcon Glyph="" /> + + + + + - + + + + + - @@ -317,5 +373,10 @@ <ui:Badge Appearance="Secondary" Content="Secondary" /> + diff --git a/src/Wpf.Ui.Demo/Views/Pages/Controls.xaml.cs b/src/Wpf.Ui.Demo/Views/Pages/Controls.xaml.cs index c61a7f4d0..b81f4a8a8 100644 --- a/src/Wpf.Ui.Demo/Views/Pages/Controls.xaml.cs +++ b/src/Wpf.Ui.Demo/Views/Pages/Controls.xaml.cs @@ -81,7 +81,7 @@ private static void DialogControlOnButtonRightClick(object sender, RoutedEventAr private void OpenSnackbar() { - _snackbarService.Show("The cake is a lie!", "The cake is a lie...", SymbolRegular.FoodCake24); + _snackbarService.Show("The cake is a lie!", "The cake is a lie...", SymbolRegular.FoodCake24, ControlAppearance.Primary); } private void OpenMessageBox() diff --git a/src/Wpf.Ui.Demo/Views/Pages/Dashboard.xaml b/src/Wpf.Ui.Demo/Views/Pages/Dashboard.xaml index 02fabc94a..801073358 100644 --- a/src/Wpf.Ui.Demo/Views/Pages/Dashboard.xaml +++ b/src/Wpf.Ui.Demo/Views/Pages/Dashboard.xaml @@ -97,7 +97,8 @@ Margin="0,0,4,0" Command="{Binding ViewModel.NavigateCommand}" CommandParameter="navigate_to_input" - Icon="TextParagraph24"> + Icon="TextParagraph24" + IsChevronVisible="True"> <ListView ItemsSource="{Binding ListBoxItemCollection}" SelectedIndex="0"/> @@ -125,7 +125,7 @@ @@ -136,6 +136,34 @@ <DataGrid ItemsSource="{Binding ListBoxItemCollection}" AutoGenerateColumns="False"/> + + + + + + + + + + + + + + <DataGrid ItemsSource="{Binding ListBoxItemCollection}" AutoGenerateColumns="False"/> + + + + + + + + + + + + + + + + diff --git a/src/Wpf.Ui.Demo/Views/Pages/ExperimentalDashboard.xaml.cs b/src/Wpf.Ui.Demo/Views/Pages/ExperimentalDashboard.xaml.cs index 7462c0251..e1fd83569 100644 --- a/src/Wpf.Ui.Demo/Views/Pages/ExperimentalDashboard.xaml.cs +++ b/src/Wpf.Ui.Demo/Views/Pages/ExperimentalDashboard.xaml.cs @@ -96,4 +96,9 @@ private void TaskbarStateComboBox_OnSelectionChanged(object sender, SelectionCha break; } } + + private void ButtonShowFlyoutOnClick(object sender, RoutedEventArgs e) + { + MyTestFlyout.Show(); + } } diff --git a/src/Wpf.Ui.Demo/Views/Pages/Input.xaml b/src/Wpf.Ui.Demo/Views/Pages/Input.xaml index 111a3034a..45bf46a69 100644 --- a/src/Wpf.Ui.Demo/Views/Pages/Input.xaml +++ b/src/Wpf.Ui.Demo/Views/Pages/Input.xaml @@ -371,12 +371,14 @@ Grid.Column="2" Margin="0,0,0,8" Content="ThreeState CheckBox" - IsChecked="True" + IsChecked="{x:Null}" IsThreeState="True" /> + IsChecked="True" + IsEnabled="False" + IsThreeState="True" /> <CheckBox IsChecked="True" /> diff --git a/src/Wpf.Ui.Demo/Views/Windows/ExperimentalWindow.xaml.cs b/src/Wpf.Ui.Demo/Views/Windows/ExperimentalWindow.xaml.cs index 1b5600c21..9e6b6d692 100644 --- a/src/Wpf.Ui.Demo/Views/Windows/ExperimentalWindow.xaml.cs +++ b/src/Wpf.Ui.Demo/Views/Windows/ExperimentalWindow.xaml.cs @@ -12,6 +12,7 @@ using Wpf.Ui.Common; using Wpf.Ui.Controls; using Wpf.Ui.Controls.Interfaces; +using Wpf.Ui.Controls.Navigation; using Wpf.Ui.Demo.ViewModels; using Wpf.Ui.Mvvm.Contracts; diff --git a/src/Wpf.Ui.Demo/Views/Windows/SettingsWindow.xaml b/src/Wpf.Ui.Demo/Views/Windows/SettingsWindow.xaml index 85a0d6c2b..815d61196 100644 --- a/src/Wpf.Ui.Demo/Views/Windows/SettingsWindow.xaml +++ b/src/Wpf.Ui.Demo/Views/Windows/SettingsWindow.xaml @@ -175,5 +175,10 @@ + +
      diff --git a/src/Wpf.Ui.Demo/Wpf.Ui.Demo.csproj b/src/Wpf.Ui.Demo/Wpf.Ui.Demo.csproj index 1bce75532..69a60789f 100644 --- a/src/Wpf.Ui.Demo/Wpf.Ui.Demo.csproj +++ b/src/Wpf.Ui.Demo/Wpf.Ui.Demo.csproj @@ -15,7 +15,7 @@ - + diff --git a/src/Wpf.Ui.Extension.sln b/src/Wpf.Ui.Extension.sln index b57b37a89..b179930ed 100644 --- a/src/Wpf.Ui.Extension.sln +++ b/src/Wpf.Ui.Extension.sln @@ -5,13 +5,13 @@ VisualStudioVersion = 17.2.32505.173 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wpf.Ui.Extension", "Wpf.Ui.Extension\Wpf.Ui.Extension\Wpf.Ui.Extension.csproj", "{1298D974-9D81-4A93-9374-EA6A0E723DEB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WPFUI_StoreNavTemplate", "Wpf.Ui.Extension\Templates\WPFUI_StoreNav\WPFUI_StoreNavTemplate.csproj", "{4B5253B4-E818-4330-A5B5-E25140C28DC6}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wpf.Ui.Mvvm.CompactNavigation.Template", "Wpf.Ui.Extension\Templates\Wpf.Ui.Mvvm.CompactNavigation\Wpf.Ui.Mvvm.CompactNavigation.Template.csproj", "{14D7431C-6CFF-4191-BB88-2B8D5F323A30}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WPFUI_TaskNavTemplate", "Wpf.Ui.Extension\Templates\WPFUI_TaskNav\WPFUI_TaskNavTemplate.csproj", "{14D7431C-6CFF-4191-BB88-2B8D5F323A30}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wpf.Ui.Mvvm.FluentNavigation.Template", "Wpf.Ui.Extension\Templates\Wpf.Ui.Mvvm.FluentNavigation\Wpf.Ui.Mvvm.FluentNavigation.Template.csproj", "{08BE0726-8E3D-4624-AC9E-07816A14E906}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WPFUI_FluentNavTemplate", "Wpf.Ui.Extension\Templates\WPFUI_FluentNav\WPFUI_FluentNavTemplate.csproj", "{08BE0726-8E3D-4624-AC9E-07816A14E906}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wpf.Ui.Mvvm.StoreNavigation.Template", "Wpf.Ui.Extension\Templates\Wpf.Ui.Mvvm.StoreNavigation\Wpf.Ui.Mvvm.StoreNavigation.Template.csproj", "{5F5E2630-513E-4A8D-BB64-0F6F574DD739}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WPFUI_StoreNav_MVVMTemplate", "Wpf.Ui.Extension\Templates\WPFUI_StoreNav_MVVM\WPFUI_StoreNav_MVVMTemplate.csproj", "{5F5E2630-513E-4A8D-BB64-0F6F574DD739}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Templates", "Templates", "{EE91A195-315B-4172-AA08-BBBD596EDEBF}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -29,14 +29,6 @@ Global {1298D974-9D81-4A93-9374-EA6A0E723DEB}.Release|Any CPU.Build.0 = Release|Any CPU {1298D974-9D81-4A93-9374-EA6A0E723DEB}.Release|x86.ActiveCfg = Release|x86 {1298D974-9D81-4A93-9374-EA6A0E723DEB}.Release|x86.Build.0 = Release|x86 - {4B5253B4-E818-4330-A5B5-E25140C28DC6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4B5253B4-E818-4330-A5B5-E25140C28DC6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4B5253B4-E818-4330-A5B5-E25140C28DC6}.Debug|x86.ActiveCfg = Debug|x86 - {4B5253B4-E818-4330-A5B5-E25140C28DC6}.Debug|x86.Build.0 = Debug|x86 - {4B5253B4-E818-4330-A5B5-E25140C28DC6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4B5253B4-E818-4330-A5B5-E25140C28DC6}.Release|Any CPU.Build.0 = Release|Any CPU - {4B5253B4-E818-4330-A5B5-E25140C28DC6}.Release|x86.ActiveCfg = Release|x86 - {4B5253B4-E818-4330-A5B5-E25140C28DC6}.Release|x86.Build.0 = Release|x86 {14D7431C-6CFF-4191-BB88-2B8D5F323A30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {14D7431C-6CFF-4191-BB88-2B8D5F323A30}.Debug|Any CPU.Build.0 = Debug|Any CPU {14D7431C-6CFF-4191-BB88-2B8D5F323A30}.Debug|x86.ActiveCfg = Debug|x86 @@ -65,6 +57,11 @@ Global GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {14D7431C-6CFF-4191-BB88-2B8D5F323A30} = {EE91A195-315B-4172-AA08-BBBD596EDEBF} + {08BE0726-8E3D-4624-AC9E-07816A14E906} = {EE91A195-315B-4172-AA08-BBBD596EDEBF} + {5F5E2630-513E-4A8D-BB64-0F6F574DD739} = {EE91A195-315B-4172-AA08-BBBD596EDEBF} + EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {8F55C6F2-1DAD-420E-868C-9B0140D01E7F} EndGlobalSection diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/App.xaml.cs b/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/App.xaml.cs deleted file mode 100644 index 771c48a4e..000000000 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/App.xaml.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Windows; - -namespace $safeprojectname$; - -/// -/// Interaction logic for App.xaml -/// -public partial class App : Application -{ -} diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/ViewModels/ContainerViewModel.cs b/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/ViewModels/ContainerViewModel.cs deleted file mode 100644 index 7cbd4db3a..000000000 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/ViewModels/ContainerViewModel.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; - -namespace $safeprojectname$.ViewModels -{ - public class ContainerViewModel : Wpf.Ui.Mvvm.ViewModelBase - { - private bool _isInitialized = false; - - public string ApplicationTitle - { - get => GetValueOrDefault(String.Empty); - set => SetValue(value); - } - - public ContainerViewModel() - { - if(!_isInitialized) - InitializeViewModel(); - } - - private void InitializeViewModel() - { - ApplicationTitle = "WPF UI - $safeprojectname$"; - - _isInitialized = true; - } - } -} diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/ViewModels/DashboardViewModel.cs b/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/ViewModels/DashboardViewModel.cs deleted file mode 100644 index 23e93fdc9..000000000 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/ViewModels/DashboardViewModel.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; - -namespace $safeprojectname$.ViewModels -{ - public class DashboardViewModel : Wpf.Ui.Mvvm.ViewModelBase - { - private bool _isInitialized = false; - - public string PrimaryButtonText - { - get => GetValueOrDefault(String.Empty); - set => SetValue(value); - } - - public DashboardViewModel() - { - if (!_isInitialized) - InitializeViewModel(); - } - - private void InitializeViewModel() - { - PrimaryButtonText = "Hello World"; - - _isInitialized = true; - } - } -} diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/Views/Container.xaml.cs b/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/Views/Container.xaml.cs deleted file mode 100644 index fcb405d92..000000000 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/Views/Container.xaml.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Windows; - -namespace $safeprojectname$.Views -{ - /// - /// Interaction logic for Container.xaml - /// - public partial class Container : Wpf.Ui.Controls.UiWindow - { - public ViewModels.ContainerViewModel ViewModel - { - get; - } - - public Container() - { - ViewModel = new ViewModels.ContainerViewModel(); - DataContext = this; - - InitializeComponent(); - } - } -} \ No newline at end of file diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/Views/Pages/DashboardPage.xaml b/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/Views/Pages/DashboardPage.xaml deleted file mode 100644 index 39ac759ca..000000000 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/Views/Pages/DashboardPage.xaml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/App.xaml.cs b/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/App.xaml.cs deleted file mode 100644 index e03706dff..000000000 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/App.xaml.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Windows; - -namespace $safeprojectname$ -{ - /// - /// Interaction logic for App.xaml - /// - public partial class App : Application - { - private void OnStartup(object sender, StartupEventArgs e) - { - Wpf.Ui.Appearance.Accent.ApplySystemAccent(); - } - } -} \ No newline at end of file diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/ViewModels/ContainerViewModel.cs b/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/ViewModels/ContainerViewModel.cs deleted file mode 100644 index 7cbd4db3a..000000000 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/ViewModels/ContainerViewModel.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; - -namespace $safeprojectname$.ViewModels -{ - public class ContainerViewModel : Wpf.Ui.Mvvm.ViewModelBase - { - private bool _isInitialized = false; - - public string ApplicationTitle - { - get => GetValueOrDefault(String.Empty); - set => SetValue(value); - } - - public ContainerViewModel() - { - if(!_isInitialized) - InitializeViewModel(); - } - - private void InitializeViewModel() - { - ApplicationTitle = "WPF UI - $safeprojectname$"; - - _isInitialized = true; - } - } -} diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/ViewModels/DashboardViewModel.cs b/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/ViewModels/DashboardViewModel.cs deleted file mode 100644 index 23e93fdc9..000000000 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/ViewModels/DashboardViewModel.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; - -namespace $safeprojectname$.ViewModels -{ - public class DashboardViewModel : Wpf.Ui.Mvvm.ViewModelBase - { - private bool _isInitialized = false; - - public string PrimaryButtonText - { - get => GetValueOrDefault(String.Empty); - set => SetValue(value); - } - - public DashboardViewModel() - { - if (!_isInitialized) - InitializeViewModel(); - } - - private void InitializeViewModel() - { - PrimaryButtonText = "Hello World"; - - _isInitialized = true; - } - } -} diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/Views/Container.xaml.cs b/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/Views/Container.xaml.cs deleted file mode 100644 index fcb405d92..000000000 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/Views/Container.xaml.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Windows; - -namespace $safeprojectname$.Views -{ - /// - /// Interaction logic for Container.xaml - /// - public partial class Container : Wpf.Ui.Controls.UiWindow - { - public ViewModels.ContainerViewModel ViewModel - { - get; - } - - public Container() - { - ViewModel = new ViewModels.ContainerViewModel(); - DataContext = this; - - InitializeComponent(); - } - } -} \ No newline at end of file diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/Views/Pages/DashboardPage.xaml b/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/Views/Pages/DashboardPage.xaml deleted file mode 100644 index 405e33e33..000000000 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/Views/Pages/DashboardPage.xaml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/WPFUI_StoreNav.csproj b/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/WPFUI_StoreNav.csproj deleted file mode 100644 index d7521fcb3..000000000 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/WPFUI_StoreNav.csproj +++ /dev/null @@ -1,31 +0,0 @@ - - - - WinExe - net6.0-windows - enable - 10.0 - true - app.manifest - applicationIcon.ico - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/WPFUI_StoreNav.vstemplate b/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/WPFUI_StoreNav.vstemplate deleted file mode 100644 index 6dbd9a793..000000000 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/WPFUI_StoreNav.vstemplate +++ /dev/null @@ -1,51 +0,0 @@ - - - WPF UI - MS Store Navigation - Template for creating WPF UI project with MS Store navigation and Mica background. - CSharp - - 1000 - true - UiDesktopApp - true - Enabled - true - true - __TemplateIcon.png - csharp - XAML - Windows - Desktop - WPF UI - MVVM - __PreviewImage.png - - - - - applicationIcon-256.png - applicationIcon-1024.png - - - ContainerViewModel.cs - DashboardViewModel.cs - SettingsViewModel.cs - - - - DashboardPage.xaml - DashboardPage.xaml.cs - SettingsPage.xaml - SettingsPage.xaml.cs - - Container.xaml - Container.xaml.cs - - app.manifest - applicationIcon.ico - App.xaml - App.xaml.cs - AssemblyInfo.cs - - - \ No newline at end of file diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/WPFUI_StoreNavTemplate.csproj b/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/WPFUI_StoreNavTemplate.csproj deleted file mode 100644 index 9f38ff0b6..000000000 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/WPFUI_StoreNavTemplate.csproj +++ /dev/null @@ -1,72 +0,0 @@ - - - - 17.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - - 15.0 - - - - - Debug - AnyCPU - {82b43b9b-a64c-4715-b499-d71e9ca2bd60};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - {4B5253B4-E818-4330-A5B5-E25140C28DC6} - Library - Properties - WPFUI_StoreNav - WPFUI_StoreNav - v4.8 - false - false - false - false - false - false - false - false - false - false - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - WPFUI_StoreNav - - - 1045 - - - - - - \ No newline at end of file diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/App.xaml.cs b/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/App.xaml.cs deleted file mode 100644 index 771c48a4e..000000000 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/App.xaml.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Windows; - -namespace $safeprojectname$; - -/// -/// Interaction logic for App.xaml -/// -public partial class App : Application -{ -} diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/ViewModels/ContainerViewModel.cs b/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/ViewModels/ContainerViewModel.cs deleted file mode 100644 index 620410273..000000000 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/ViewModels/ContainerViewModel.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; - -namespace $safeprojectname$.ViewModels -{ - public class ContainerViewModel : Wpf.Ui.Mvvm.ViewModelBase - { - private bool _isInitialized = false; - - public string ApplicationTitle - { - get => GetValueOrDefault(String.Empty); - set => SetValue(value); - } - - public ContainerViewModel() - { - if(!_isInitialized) - InitializeViewModel(); - } - - private void InitializeViewModel() - { - ApplicationTitle = "WPF UI - DemoApp3"; - - _isInitialized = true; - } - } -} diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/ViewModels/DashboardViewModel.cs b/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/ViewModels/DashboardViewModel.cs deleted file mode 100644 index 23e93fdc9..000000000 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/ViewModels/DashboardViewModel.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; - -namespace $safeprojectname$.ViewModels -{ - public class DashboardViewModel : Wpf.Ui.Mvvm.ViewModelBase - { - private bool _isInitialized = false; - - public string PrimaryButtonText - { - get => GetValueOrDefault(String.Empty); - set => SetValue(value); - } - - public DashboardViewModel() - { - if (!_isInitialized) - InitializeViewModel(); - } - - private void InitializeViewModel() - { - PrimaryButtonText = "Hello World"; - - _isInitialized = true; - } - } -} diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/ViewModels/SettingsViewModel.cs b/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/ViewModels/SettingsViewModel.cs deleted file mode 100644 index 396efd840..000000000 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/ViewModels/SettingsViewModel.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Windows; - -namespace $safeprojectname$.ViewModels -{ - public class SettingsViewModel : Wpf.Ui.Mvvm.ViewModelBase - { - private bool _isInitialized = false; - - public string AppVersion - { - get => GetValueOrDefault(String.Empty); - set => SetValue(value); - } - - public Wpf.Ui.Appearance.ThemeType CurrentTheme - { - get => GetStructOrDefault(Wpf.Ui.Appearance.ThemeType.Unknown); - set => SetValue(value); - } - - public SettingsViewModel() - { - if (!_isInitialized) - InitializeViewModel(); - } - - private void InitializeViewModel() - { - CurrentTheme = Wpf.Ui.Appearance.Theme.GetAppTheme(); - AppVersion = $"$safeprojectname$ - {GetAssemblyVersion()}"; - - _isInitialized = true; - } - - private string GetAssemblyVersion() - { - return System.Reflection.Assembly.GetExecutingAssembly().GetName().Version?.ToString() ?? String.Empty; - } - } -} diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/Views/Container.xaml b/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/Views/Container.xaml deleted file mode 100644 index 3fefe8522..000000000 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/Views/Container.xaml +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/Views/Container.xaml.cs b/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/Views/Container.xaml.cs deleted file mode 100644 index d90d1a94b..000000000 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/Views/Container.xaml.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System.Windows; - -namespace $safeprojectname$.Views; - -/// -/// Interaction logic for Container.xaml -/// -public partial class Container : Wpf.Ui.Controls.UiWindow -{ - public Container() - { - InitializeComponent(); - - Wpf.Ui.Appearance.Accent.ApplySystemAccent(); - } -} diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/Views/Pages/Dashboard.xaml b/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/Views/Pages/Dashboard.xaml deleted file mode 100644 index 6deb2fd7a..000000000 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/Views/Pages/Dashboard.xaml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/Views/Pages/Dashboard.xaml.cs b/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/Views/Pages/Dashboard.xaml.cs deleted file mode 100644 index 38db07708..000000000 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/Views/Pages/Dashboard.xaml.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Windows.Controls; - -namespace $safeprojectname$.Views.Pages; - -/// -/// Interaction logic for Dashboard.xaml -/// -public partial class Dashboard : Wpf.Ui.Controls.UiPage -{ - public Dashboard() - { - InitializeComponent(); - } -} diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/Views/Pages/Settings.xaml b/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/Views/Pages/Settings.xaml deleted file mode 100644 index eb3723c77..000000000 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/Views/Pages/Settings.xaml +++ /dev/null @@ -1,15 +0,0 @@ - - - - diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/Views/Pages/Settings.xaml.cs b/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/Views/Pages/Settings.xaml.cs deleted file mode 100644 index 97411be6d..000000000 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/Views/Pages/Settings.xaml.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Windows.Controls; - -namespace $safeprojectname$.Views.Pages; - -/// -/// Interaction logic for Settings.xaml -/// -public partial class Settings : Wpf.Ui.Controls.UiPage -{ - public Settings() - { - InitializeComponent(); - } -} diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/WPFUI_StoreNav_MVVM.vstemplate b/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/WPFUI_StoreNav_MVVM.vstemplate deleted file mode 100644 index e9580a87c..000000000 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/WPFUI_StoreNav_MVVM.vstemplate +++ /dev/null @@ -1,51 +0,0 @@ - - - WPF UI - MS Store Navigation (MVVM | DI) - Template for creating WPF UI project with MVVM pattern, Dependency Injection, MS Store navigation and Mica background. - CSharp - - 1000 - true - UiDesktopApp - true - Enabled - true - true - __TemplateIcon.png - csharp - XAML - Windows - Desktop - WPF UI - MVVM - __PreviewImage.png - - - - - applicationIcon-256.png - applicationIcon-1024.png - - - ContainerViewModel.cs - DashboardViewModel.cs - SettingsViewModel.cs - - - - Dashboard.xaml - Dashboard.xaml.cs - Settings.xaml - Settings.xaml.cs - - Container.xaml - Container.xaml.cs - - app.manifest - applicationIcon.ico - App.xaml - App.xaml.cs - AssemblyInfo.cs - - - \ No newline at end of file diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/App.xaml b/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/App.xaml deleted file mode 100644 index 241390e99..000000000 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/App.xaml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/App.xaml.cs b/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/App.xaml.cs deleted file mode 100644 index e03706dff..000000000 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/App.xaml.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Windows; - -namespace $safeprojectname$ -{ - /// - /// Interaction logic for App.xaml - /// - public partial class App : Application - { - private void OnStartup(object sender, StartupEventArgs e) - { - Wpf.Ui.Appearance.Accent.ApplySystemAccent(); - } - } -} \ No newline at end of file diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/AssemblyInfo.cs b/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/AssemblyInfo.cs deleted file mode 100644 index 8b5504ecf..000000000 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/AssemblyInfo.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Windows; - -[assembly: ThemeInfo( - ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located - //(used if a resource is not found in the page, - // or application resource dictionaries) - ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located - //(used if a resource is not found in the page, - // app, or any theme specific resource dictionaries) -)] diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/Assets/applicationIcon-256.png b/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/Assets/applicationIcon-256.png deleted file mode 100644 index 6b5cf5d5a..000000000 Binary files a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/Assets/applicationIcon-256.png and /dev/null differ diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/ViewModels/ContainerViewModel.cs b/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/ViewModels/ContainerViewModel.cs deleted file mode 100644 index 7cbd4db3a..000000000 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/ViewModels/ContainerViewModel.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; - -namespace $safeprojectname$.ViewModels -{ - public class ContainerViewModel : Wpf.Ui.Mvvm.ViewModelBase - { - private bool _isInitialized = false; - - public string ApplicationTitle - { - get => GetValueOrDefault(String.Empty); - set => SetValue(value); - } - - public ContainerViewModel() - { - if(!_isInitialized) - InitializeViewModel(); - } - - private void InitializeViewModel() - { - ApplicationTitle = "WPF UI - $safeprojectname$"; - - _isInitialized = true; - } - } -} diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/ViewModels/DashboardViewModel.cs b/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/ViewModels/DashboardViewModel.cs deleted file mode 100644 index 23e93fdc9..000000000 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/ViewModels/DashboardViewModel.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; - -namespace $safeprojectname$.ViewModels -{ - public class DashboardViewModel : Wpf.Ui.Mvvm.ViewModelBase - { - private bool _isInitialized = false; - - public string PrimaryButtonText - { - get => GetValueOrDefault(String.Empty); - set => SetValue(value); - } - - public DashboardViewModel() - { - if (!_isInitialized) - InitializeViewModel(); - } - - private void InitializeViewModel() - { - PrimaryButtonText = "Hello World"; - - _isInitialized = true; - } - } -} diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/Views/Container.xaml.cs b/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/Views/Container.xaml.cs deleted file mode 100644 index fcb405d92..000000000 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/Views/Container.xaml.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Windows; - -namespace $safeprojectname$.Views -{ - /// - /// Interaction logic for Container.xaml - /// - public partial class Container : Wpf.Ui.Controls.UiWindow - { - public ViewModels.ContainerViewModel ViewModel - { - get; - } - - public Container() - { - ViewModel = new ViewModels.ContainerViewModel(); - DataContext = this; - - InitializeComponent(); - } - } -} \ No newline at end of file diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/Views/Pages/DashboardPage.xaml b/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/Views/Pages/DashboardPage.xaml deleted file mode 100644 index 405e33e33..000000000 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/Views/Pages/DashboardPage.xaml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/__PreviewImage.png b/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/__PreviewImage.png deleted file mode 100644 index df0280fd7..000000000 Binary files a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/__PreviewImage.png and /dev/null differ diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/__TemplateIcon.png b/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/__TemplateIcon.png deleted file mode 100644 index b70c4ed59..000000000 Binary files a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/__TemplateIcon.png and /dev/null differ diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/app.manifest b/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/app.manifest deleted file mode 100644 index 10f7ad534..000000000 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/app.manifest +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PerMonitor - true/PM - true - - - - - - - - - - diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/App.xaml b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/App.xaml similarity index 69% rename from src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/App.xaml rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/App.xaml index 5290998a0..ed1ed0c52 100644 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/App.xaml +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/App.xaml @@ -2,13 +2,15 @@ x:Class="$safeprojectname$.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" - xmlns:local="clr-namespace:$safeprojectname$" xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml" - StartupUri="Views/Container.xaml"> + DispatcherUnhandledException="OnDispatcherUnhandledException" + Exit="OnExit" + Startup="OnStartup"> - + + diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/App.xaml.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/App.xaml.cs new file mode 100644 index 000000000..1ea92fd2f --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/App.xaml.cs @@ -0,0 +1,98 @@ +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using System.IO; +using System.Reflection; +using System.Windows; +using System.Windows.Threading; +using Wpf.Ui.Mvvm.Contracts; +using Wpf.Ui.Mvvm.Services; +using $safeprojectname$.Models; +using $safeprojectname$.Services; + +namespace $safeprojectname$ +{ + /// + /// Interaction logic for App.xaml + /// + public partial class App + { + // The.NET Generic Host provides dependency injection, configuration, logging, and other services. + // https://docs.microsoft.com/dotnet/core/extensions/generic-host + // https://docs.microsoft.com/dotnet/core/extensions/dependency-injection + // https://docs.microsoft.com/dotnet/core/extensions/configuration + // https://docs.microsoft.com/dotnet/core/extensions/logging + private static readonly IHost _host = Host + .CreateDefaultBuilder() + .ConfigureAppConfiguration(c => { c.SetBasePath(Path.GetDirectoryName(Assembly.GetEntryAssembly()!.Location)); }) + .ConfigureServices((context, services) => + { + // App Host + services.AddHostedService(); + + // Page resolver service + services.AddSingleton(); + + // Theme manipulation + services.AddSingleton(); + + // TaskBar manipulation + services.AddSingleton(); + + // Service containing navigation, same as INavigationWindow... but without window + services.AddSingleton(); + + // Main window container with navigation + services.AddScoped(); + services.AddScoped(); + + // Views and ViewModels + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + + // Configuration + services.Configure(context.Configuration.GetSection(nameof(AppConfig))); + }).Build(); + + /// + /// Gets registered service. + /// + /// Type of the service to get. + /// Instance of the service or . + public static T GetService() + where T : class + { + return _host.Services.GetService(typeof(T)) as T; + } + + /// + /// Occurs when the application is loading. + /// + private async void OnStartup(object sender, StartupEventArgs e) + { + await _host.StartAsync(); + } + + /// + /// Occurs when the application is closing. + /// + private async void OnExit(object sender, ExitEventArgs e) + { + await _host.StopAsync(); + + _host.Dispose(); + } + + /// + /// Occurs when an exception is thrown by an application but not handled. + /// + private void OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) + { + // For more info see https://docs.microsoft.com/en-us/dotnet/api/system.windows.application.dispatcherunhandledexception?view=windowsdesktop-6.0 + } + } +} \ No newline at end of file diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/AssemblyInfo.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/AssemblyInfo.cs similarity index 100% rename from src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/AssemblyInfo.cs rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/AssemblyInfo.cs diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/Assets/applicationIcon-1024.png b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Assets/applicationIcon-1024.png similarity index 100% rename from src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/Assets/applicationIcon-1024.png rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Assets/applicationIcon-1024.png diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/Assets/applicationIcon-256.png b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Assets/applicationIcon-256.png similarity index 100% rename from src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/Assets/applicationIcon-256.png rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Assets/applicationIcon-256.png diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/Helpers/EnumToBooleanConverter.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Helpers/EnumToBooleanConverter.cs similarity index 100% rename from src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/Helpers/EnumToBooleanConverter.cs rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Helpers/EnumToBooleanConverter.cs diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Models/AppConfig.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Models/AppConfig.cs new file mode 100644 index 000000000..de05a5c07 --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Models/AppConfig.cs @@ -0,0 +1,9 @@ +namespace $safeprojectname$.Models +{ + public class AppConfig + { + public string ConfigurationsFolder { get; set; } + + public string AppPropertiesFileName { get; set; } + } +} diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Models/DataColor.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Models/DataColor.cs new file mode 100644 index 000000000..37d424944 --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Models/DataColor.cs @@ -0,0 +1,9 @@ +using System.Windows.Media; + +namespace $safeprojectname$.Models +{ + public struct DataColor + { + public Brush Color { get; set; } + } +} diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Services/ApplicationHostService.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Services/ApplicationHostService.cs new file mode 100644 index 000000000..63538aee9 --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Services/ApplicationHostService.cs @@ -0,0 +1,61 @@ +using Microsoft.Extensions.Hosting; +using System; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using System.Windows; +using Wpf.Ui.Mvvm.Contracts; +using $safeprojectname$.Views; + +namespace $safeprojectname$.Services +{ + /// + /// Managed host of the application. + /// + public class ApplicationHostService : IHostedService + { + private readonly IServiceProvider _serviceProvider; + private INavigationWindow _navigationWindow; + + public ApplicationHostService(IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + } + + /// + /// Triggered when the application host is ready to start the service. + /// + /// Indicates that the start process has been aborted. + public async Task StartAsync(CancellationToken cancellationToken) + { + await HandleActivationAsync(); + } + + /// + /// Triggered when the application host is performing a graceful shutdown. + /// + /// Indicates that the shutdown process should no longer be graceful. + public async Task StopAsync(CancellationToken cancellationToken) + { + await Task.CompletedTask; + } + + /// + /// Creates main window during activation. + /// + private async Task HandleActivationAsync() + { + await Task.CompletedTask; + + if (!Application.Current.Windows.OfType().Any()) + { + _navigationWindow = (_serviceProvider.GetService(typeof(INavigationWindow)) as INavigationWindow)!; + _navigationWindow!.ShowWindow(); + + _navigationWindow.Navigate(typeof(Views.Pages.DashboardPage)); + } + + await Task.CompletedTask; + } + } +} diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Services/PageService.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Services/PageService.cs new file mode 100644 index 000000000..0e5761d80 --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Services/PageService.cs @@ -0,0 +1,43 @@ +using System; +using System.Windows; +using Wpf.Ui.Mvvm.Contracts; + +namespace $safeprojectname$.Services +{ + /// + /// Service that provides pages for navigation. + /// + public class PageService : IPageService + { + /// + /// Service which provides the instances of pages. + /// + private readonly IServiceProvider _serviceProvider; + + /// + /// Creates new instance and attaches the . + /// + public PageService(IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + } + + /// + public T? GetPage() where T : class + { + if (!typeof(FrameworkElement).IsAssignableFrom(typeof(T))) + throw new InvalidOperationException("The page should be a WPF control."); + + return (T?)_serviceProvider.GetService(typeof(T)); + } + + /// + public FrameworkElement? GetPage(Type pageType) + { + if (!typeof(FrameworkElement).IsAssignableFrom(pageType)) + throw new InvalidOperationException("The page should be a WPF control."); + + return _serviceProvider.GetService(pageType) as FrameworkElement; + } + } +} diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/ViewModels/ContainerViewModel.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/ViewModels/ContainerViewModel.cs new file mode 100644 index 000000000..211cdff42 --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/ViewModels/ContainerViewModel.cs @@ -0,0 +1,78 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using System; +using System.Collections.ObjectModel; +using Wpf.Ui.Common; +using Wpf.Ui.Controls; +using Wpf.Ui.Controls.Interfaces; +using Wpf.Ui.Mvvm.Contracts; + +namespace $safeprojectname$.ViewModels +{ + public partial class ContainerViewModel : ObservableObject + { + private bool _isInitialized = false; + + [ObservableProperty] + private string _applicationTitle = String.Empty; + + [ObservableProperty] + private ObservableCollection _navigationItems = new(); + + [ObservableProperty] + private ObservableCollection _navigationFooter = new(); + + [ObservableProperty] + private ObservableCollection _trayMenuItems = new(); + + public ContainerViewModel(INavigationService navigationService) + { + if (!_isInitialized) + InitializeViewModel(); + } + + private void InitializeViewModel() + { + ApplicationTitle = "WPF UI - $safeprojectname$"; + + NavigationItems = new ObservableCollection + { + new NavigationItem() + { + Content = "Home", + PageTag = "dashboard", + Icon = SymbolRegular.Home24, + PageType = typeof(Views.Pages.DashboardPage) + }, + new NavigationItem() + { + Content = "Data", + PageTag = "data", + Icon = SymbolRegular.DataHistogram24, + PageType = typeof(Views.Pages.DataPage) + } + }; + + NavigationFooter = new ObservableCollection + { + new NavigationItem() + { + Content = "Settings", + PageTag = "settings", + Icon = SymbolRegular.Settings24, + PageType = typeof(Views.Pages.SettingsPage) + } + }; + + TrayMenuItems = new ObservableCollection + { + new MenuItem + { + Header = "Home", + Tag = "tray_home" + } + }; + + _isInitialized = true; + } + } +} diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/ViewModels/DashboardViewModel.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/ViewModels/DashboardViewModel.cs new file mode 100644 index 000000000..624d7a325 --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/ViewModels/DashboardViewModel.cs @@ -0,0 +1,26 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using Wpf.Ui.Common.Interfaces; + +namespace $safeprojectname$.ViewModels +{ + public partial class DashboardViewModel : ObservableObject, INavigationAware + { + [ObservableProperty] + private int _counter = 0; + + public void OnNavigatedTo() + { + } + + public void OnNavigatedFrom() + { + } + + [RelayCommand] + private void OnCounterIncrement() + { + Counter++; + } + } +} diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/ViewModels/DataViewModel.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/ViewModels/DataViewModel.cs new file mode 100644 index 000000000..6ec2854ae --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/ViewModels/DataViewModel.cs @@ -0,0 +1,47 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using System; +using System.Collections.Generic; +using System.Windows.Media; +using Wpf.Ui.Common.Interfaces; +using $safeprojectname$.Models; + +namespace $safeprojectname$.ViewModels +{ + public partial class DataViewModel : ObservableObject, INavigationAware + { + private bool _isInitialized = false; + + [ObservableProperty] + private IEnumerable _colors; + + public void OnNavigatedTo() + { + if (!_isInitialized) + InitializeViewModel(); + } + + public void OnNavigatedFrom() + { + } + + private void InitializeViewModel() + { + var random = new Random(); + var colorCollection = new List(); + + for (int i = 0; i < 8192; i++) + colorCollection.Add(new DataColor + { + Color = new SolidColorBrush(Color.FromArgb( + (byte)200, + (byte)random.Next(0, 250), + (byte)random.Next(0, 250), + (byte)random.Next(0, 250))) + }); + + Colors = colorCollection; + + _isInitialized = true; + } + } +} diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/ViewModels/SettingsViewModel.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/ViewModels/SettingsViewModel.cs similarity index 63% rename from src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/ViewModels/SettingsViewModel.cs rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/ViewModels/SettingsViewModel.cs index d608797e2..c316392e4 100644 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/ViewModels/SettingsViewModel.cs +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/ViewModels/SettingsViewModel.cs @@ -1,38 +1,48 @@ -using System; -using System.Windows; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using System; +using System.Windows.Input; +using Wpf.Ui.Common.Interfaces; namespace $safeprojectname$.ViewModels { - public class SettingsViewModel : Wpf.Ui.Mvvm.ViewModelBase + public partial class SettingsViewModel : ObservableObject, INavigationAware { private bool _isInitialized = false; - public string AppVersion + [ObservableProperty] + private string _appVersion = String.Empty; + + [ObservableProperty] + private Wpf.Ui.Appearance.ThemeType _currentTheme = Wpf.Ui.Appearance.ThemeType.Unknown; + + public void OnNavigatedTo() { - get => GetValueOrDefault(String.Empty); - set => SetValue(value); + if (!_isInitialized) + InitializeViewModel(); } - public Wpf.Ui.Appearance.ThemeType CurrentTheme + public void OnNavigatedFrom() { - get => GetStructOrDefault(Wpf.Ui.Appearance.ThemeType.Unknown); - set => SetValue(value); } - public SettingsViewModel() + private void InitializeViewModel() { - if (!_isInitialized) - InitializeViewModel(); + CurrentTheme = Wpf.Ui.Appearance.Theme.GetAppTheme(); + AppVersion = $"$safeprojectname$ - {GetAssemblyVersion()}"; + + _isInitialized = true; } - protected override void OnViewCommand(object? parameter = null) + private string GetAssemblyVersion() { - base.OnViewCommand(parameter); - - if (parameter == null || parameter is not String parameterString) - return; + return System.Reflection.Assembly.GetExecutingAssembly().GetName().Version?.ToString() ?? String.Empty; + } - switch (parameterString) + [RelayCommand] + private void OnChangeTheme(string parameter) + { + switch (parameter) { case "theme_light": if (CurrentTheme == Wpf.Ui.Appearance.ThemeType.Light) @@ -43,7 +53,7 @@ protected override void OnViewCommand(object? parameter = null) break; - case "theme_dark": + default: if (CurrentTheme == Wpf.Ui.Appearance.ThemeType.Dark) break; @@ -53,18 +63,5 @@ protected override void OnViewCommand(object? parameter = null) break; } } - - private void InitializeViewModel() - { - CurrentTheme = Wpf.Ui.Appearance.Theme.GetAppTheme(); - AppVersion = $"$safeprojectname$ - {GetAssemblyVersion()}"; - - _isInitialized = true; - } - - private string GetAssemblyVersion() - { - return System.Reflection.Assembly.GetExecutingAssembly().GetName().Version?.ToString() ?? String.Empty; - } } } diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/Views/Container.xaml b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Views/Container.xaml similarity index 69% rename from src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/Views/Container.xaml rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Views/Container.xaml index d97f795e0..82ee88d81 100644 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/Views/Container.xaml +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Views/Container.xaml @@ -10,7 +10,8 @@ Title="{Binding ViewModel.ApplicationTitle, Mode=OneWay}" Width="1100" Height="650" - d:DataContext="{d:DesignInstance local:Container, IsDesignTimeCreatable=True}" + d:DataContext="{d:DesignInstance local:Container, + IsDesignTimeCreatable=True}" ExtendsContentIntoTitleBar="True" WindowBackdropType="Mica" WindowCornerPreference="Round" @@ -25,41 +26,25 @@ - - - - - - - + Footer="{Binding ViewModel.NavigationFooter, Mode=TwoWay}" + Frame="{Binding ElementName=RootFrame, Mode=OneWay}" + Items="{Binding ViewModel.NavigationItems, Mode=TwoWay}" /> + Margin="42,0,0,0" + Icon="pack://application:,,,/Assets/applicationIcon-256.png"> - - - + @@ -75,16 +60,14 @@ - + + Navigation="{Binding ElementName=RootNavigation, Mode=OneWay}" /> diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Views/Container.xaml.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Views/Container.xaml.cs new file mode 100644 index 000000000..75567ef32 --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Views/Container.xaml.cs @@ -0,0 +1,63 @@ +using System; +using System.Windows; +using System.Windows.Controls; +using Wpf.Ui.Controls.Interfaces; +using Wpf.Ui.Mvvm.Contracts; + +namespace $safeprojectname$.Views +{ + /// + /// Interaction logic for Container.xaml + /// + public partial class Container : INavigationWindow + { + public ViewModels.ContainerViewModel ViewModel + { + get; + } + + public Container(ViewModels.ContainerViewModel viewModel, IPageService pageService, INavigationService navigationService) + { + ViewModel = viewModel; + DataContext = this; + + InitializeComponent(); + SetPageService(pageService); + + navigationService.SetNavigationControl(RootNavigation); + } + + #region INavigationWindow methods + + public Frame GetFrame() + => RootFrame; + + public INavigation GetNavigation() + => RootNavigation; + + public bool Navigate(Type pageType) + => RootNavigation.Navigate(pageType); + + public void SetPageService(IPageService pageService) + => RootNavigation.PageService = pageService; + + public void ShowWindow() + => Show(); + + public void CloseWindow() + => Close(); + + #endregion INavigationWindow methods + + /// + /// Raises the closed event. + /// + protected override void OnClosed(EventArgs e) + { + base.OnClosed(e); + + // Make sure that closing this window will begin the process of closing the application. + Application.Current.Shutdown(); + } + } +} \ No newline at end of file diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Views/Pages/DashboardPage.xaml b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Views/Pages/DashboardPage.xaml new file mode 100644 index 000000000..55bfa56b0 --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Views/Pages/DashboardPage.xaml @@ -0,0 +1,18 @@ + + + + + + + + + + + + diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/Views/Pages/DashboardPage.xaml.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Views/Pages/DashboardPage.xaml.cs similarity index 56% rename from src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/Views/Pages/DashboardPage.xaml.cs rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Views/Pages/DashboardPage.xaml.cs index 03299b19a..b4163fce2 100644 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/Views/Pages/DashboardPage.xaml.cs +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Views/Pages/DashboardPage.xaml.cs @@ -1,21 +1,20 @@ -using System.Windows.Controls; +using Wpf.Ui.Common.Interfaces; namespace $safeprojectname$.Views.Pages { /// /// Interaction logic for DashboardPage.xaml /// - public partial class DashboardPage : Wpf.Ui.Controls.UiPage + public partial class DashboardPage : INavigableView { public ViewModels.DashboardViewModel ViewModel { get; } - public DashboardPage() + public DashboardPage(ViewModels.DashboardViewModel viewModel) { - ViewModel = new ViewModels.DashboardViewModel(); - DataContext = this; + ViewModel = viewModel; InitializeComponent(); } diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Views/Pages/DataPage.xaml b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Views/Pages/DataPage.xaml new file mode 100644 index 000000000..94a8fd29a --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Views/Pages/DataPage.xaml @@ -0,0 +1,39 @@ + + + + + + + + + + + + diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Views/Pages/DataPage.xaml.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Views/Pages/DataPage.xaml.cs new file mode 100644 index 000000000..07d60a737 --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Views/Pages/DataPage.xaml.cs @@ -0,0 +1,22 @@ +using Wpf.Ui.Common.Interfaces; + +namespace $safeprojectname$.Views.Pages +{ + /// + /// Interaction logic for DataView.xaml + /// + public partial class DataPage : INavigableView + { + public ViewModels.DataViewModel ViewModel + { + get; + } + + public DataPage(ViewModels.DataViewModel viewModel) + { + ViewModel = viewModel; + + InitializeComponent(); + } + } +} diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/Views/Pages/SettingsPage.xaml b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Views/Pages/SettingsPage.xaml similarity index 66% rename from src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/Views/Pages/SettingsPage.xaml rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Views/Pages/SettingsPage.xaml index 1d4c9e640..25b61ddfb 100644 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/Views/Pages/SettingsPage.xaml +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Views/Pages/SettingsPage.xaml @@ -3,39 +3,47 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:helpers="clr-namespace:$safeprojectname$.Helpers" xmlns:local="clr-namespace:$safeprojectname$.Views.Pages" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - xmlns:helpers="clr-namespace:$safeprojectname$.Helpers" xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml" Title="SettingsPage" - Foreground="{DynamicResource TextFillColorPrimaryBrush}" - d:DataContext="{d:DesignInstance local:SettingsPage, IsDesignTimeCreatable=True}" + d:DataContext="{d:DesignInstance local:SettingsPage, + IsDesignTimeCreatable=False}" d:DesignHeight="450" d:DesignWidth="800" + Foreground="{DynamicResource TextFillColorPrimaryBrush}" mc:Ignorable="d"> - - + + + Content="Light" + GroupName="themeSelect" + IsChecked="{Binding ViewModel.CurrentTheme, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter=Light, Mode=OneWay}" /> + Content="Dark" + GroupName="themeSelect" + IsChecked="{Binding ViewModel.CurrentTheme, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter=Dark, Mode=OneWay}" /> - - + + diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/Views/Pages/SettingsPage.xaml.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Views/Pages/SettingsPage.xaml.cs similarity index 56% rename from src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/Views/Pages/SettingsPage.xaml.cs rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Views/Pages/SettingsPage.xaml.cs index 5aef0f104..54c312f4e 100644 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/Views/Pages/SettingsPage.xaml.cs +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Views/Pages/SettingsPage.xaml.cs @@ -1,21 +1,20 @@ -using System.Windows.Controls; +using Wpf.Ui.Common.Interfaces; namespace $safeprojectname$.Views.Pages { /// /// Interaction logic for SettingsPage.xaml /// - public partial class SettingsPage : Wpf.Ui.Controls.UiPage + public partial class SettingsPage : INavigableView { public ViewModels.SettingsViewModel ViewModel { get; } - public SettingsPage() + public SettingsPage(ViewModels.SettingsViewModel viewModel) { - ViewModel = new ViewModels.SettingsViewModel(); - DataContext = this; + ViewModel = viewModel; InitializeComponent(); } diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/WPFUI_TaskNavTemplate.csproj b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Wpf.Ui.Mvvm.CompactNavigation.Template.csproj similarity index 90% rename from src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/WPFUI_TaskNavTemplate.csproj rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Wpf.Ui.Mvvm.CompactNavigation.Template.csproj index 5a7aeecb2..fd8c1252a 100644 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/WPFUI_TaskNavTemplate.csproj +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Wpf.Ui.Mvvm.CompactNavigation.Template.csproj @@ -18,8 +18,8 @@ {14D7431C-6CFF-4191-BB88-2B8D5F323A30} Library Properties - WPFUI_TaskNav - WPFUI_TaskNav + Wpf.Ui.Mvvm.CompactNavigation + Wpf.Ui.Mvvm.CompactNavigation v4.8 false false @@ -50,11 +50,11 @@ 4 - + - - WPFUI_TaskNav + + Wpf.Ui.Mvvm.CompactNavigation diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/WPFUI_StoreNav_MVVM.csproj b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Wpf.Ui.Mvvm.CompactNavigation.csproj similarity index 86% rename from src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/WPFUI_StoreNav_MVVM.csproj rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Wpf.Ui.Mvvm.CompactNavigation.csproj index 280ca6e04..d2e0fc374 100644 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/WPFUI_StoreNav_MVVM.csproj +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Wpf.Ui.Mvvm.CompactNavigation.csproj @@ -15,9 +15,9 @@ - + - + diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/WPFUI_StoreNav.pl-PL.vstemplate b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Wpf.Ui.Mvvm.CompactNavigation.vstemplate similarity index 68% rename from src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/WPFUI_StoreNav.pl-PL.vstemplate rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Wpf.Ui.Mvvm.CompactNavigation.vstemplate index 64a530c9a..9a8649bb6 100644 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/WPFUI_StoreNav.pl-PL.vstemplate +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/Wpf.Ui.Mvvm.CompactNavigation.vstemplate @@ -1,7 +1,8 @@ - + - WPF UI - MS Store Navigation - Template for creating WPF UI project with MS Store navigation and Mica background. + WPF UI - Compact Navigation (MVVM | DI) + Template for creating WPF UI project with MVVM pattern, Dependency Injection, Compact navigation and Mica background. CSharp 1000 @@ -17,10 +18,11 @@ Windows Desktop WPF UI + MVVM __PreviewImage.png - + applicationIcon-256.png applicationIcon-1024.png @@ -28,15 +30,26 @@ EnumToBooleanConverter.cs + + AppConfig.cs + DataColor.cs + + + ApplicationHostService.cs + PageService.cs + ContainerViewModel.cs DashboardViewModel.cs + DataViewModel.cs SettingsViewModel.cs DashboardPage.xaml DashboardPage.xaml.cs + DataPage.xaml + DataPage.xaml.cs SettingsPage.xaml SettingsPage.xaml.cs diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/__PreviewImage.png b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/__PreviewImage.png similarity index 100% rename from src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/__PreviewImage.png rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/__PreviewImage.png diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/__TemplateIcon.png b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/__TemplateIcon.png similarity index 100% rename from src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/__TemplateIcon.png rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/__TemplateIcon.png diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/app.manifest b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/app.manifest similarity index 100% rename from src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/app.manifest rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/app.manifest diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/applicationIcon.ico b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/applicationIcon.ico similarity index 100% rename from src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/applicationIcon.ico rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.CompactNavigation/applicationIcon.ico diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/App.xaml b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/App.xaml similarity index 69% rename from src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/App.xaml rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/App.xaml index 5290998a0..ed1ed0c52 100644 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/App.xaml +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/App.xaml @@ -2,13 +2,15 @@ x:Class="$safeprojectname$.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" - xmlns:local="clr-namespace:$safeprojectname$" xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml" - StartupUri="Views/Container.xaml"> + DispatcherUnhandledException="OnDispatcherUnhandledException" + Exit="OnExit" + Startup="OnStartup"> - + + diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/App.xaml.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/App.xaml.cs new file mode 100644 index 000000000..1ea92fd2f --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/App.xaml.cs @@ -0,0 +1,98 @@ +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using System.IO; +using System.Reflection; +using System.Windows; +using System.Windows.Threading; +using Wpf.Ui.Mvvm.Contracts; +using Wpf.Ui.Mvvm.Services; +using $safeprojectname$.Models; +using $safeprojectname$.Services; + +namespace $safeprojectname$ +{ + /// + /// Interaction logic for App.xaml + /// + public partial class App + { + // The.NET Generic Host provides dependency injection, configuration, logging, and other services. + // https://docs.microsoft.com/dotnet/core/extensions/generic-host + // https://docs.microsoft.com/dotnet/core/extensions/dependency-injection + // https://docs.microsoft.com/dotnet/core/extensions/configuration + // https://docs.microsoft.com/dotnet/core/extensions/logging + private static readonly IHost _host = Host + .CreateDefaultBuilder() + .ConfigureAppConfiguration(c => { c.SetBasePath(Path.GetDirectoryName(Assembly.GetEntryAssembly()!.Location)); }) + .ConfigureServices((context, services) => + { + // App Host + services.AddHostedService(); + + // Page resolver service + services.AddSingleton(); + + // Theme manipulation + services.AddSingleton(); + + // TaskBar manipulation + services.AddSingleton(); + + // Service containing navigation, same as INavigationWindow... but without window + services.AddSingleton(); + + // Main window container with navigation + services.AddScoped(); + services.AddScoped(); + + // Views and ViewModels + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + + // Configuration + services.Configure(context.Configuration.GetSection(nameof(AppConfig))); + }).Build(); + + /// + /// Gets registered service. + /// + /// Type of the service to get. + /// Instance of the service or . + public static T GetService() + where T : class + { + return _host.Services.GetService(typeof(T)) as T; + } + + /// + /// Occurs when the application is loading. + /// + private async void OnStartup(object sender, StartupEventArgs e) + { + await _host.StartAsync(); + } + + /// + /// Occurs when the application is closing. + /// + private async void OnExit(object sender, ExitEventArgs e) + { + await _host.StopAsync(); + + _host.Dispose(); + } + + /// + /// Occurs when an exception is thrown by an application but not handled. + /// + private void OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) + { + // For more info see https://docs.microsoft.com/en-us/dotnet/api/system.windows.application.dispatcherunhandledexception?view=windowsdesktop-6.0 + } + } +} \ No newline at end of file diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/AssemblyInfo.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/AssemblyInfo.cs similarity index 100% rename from src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/AssemblyInfo.cs rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/AssemblyInfo.cs diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/Assets/applicationIcon-1024.png b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Assets/applicationIcon-1024.png similarity index 100% rename from src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/Assets/applicationIcon-1024.png rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Assets/applicationIcon-1024.png diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/Assets/applicationIcon-256.png b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Assets/applicationIcon-256.png similarity index 100% rename from src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/Assets/applicationIcon-256.png rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Assets/applicationIcon-256.png diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/Helpers/EnumToBooleanConverter.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Helpers/EnumToBooleanConverter.cs similarity index 100% rename from src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/Helpers/EnumToBooleanConverter.cs rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Helpers/EnumToBooleanConverter.cs diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Models/AppConfig.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Models/AppConfig.cs new file mode 100644 index 000000000..de05a5c07 --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Models/AppConfig.cs @@ -0,0 +1,9 @@ +namespace $safeprojectname$.Models +{ + public class AppConfig + { + public string ConfigurationsFolder { get; set; } + + public string AppPropertiesFileName { get; set; } + } +} diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Models/DataColor.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Models/DataColor.cs new file mode 100644 index 000000000..37d424944 --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Models/DataColor.cs @@ -0,0 +1,9 @@ +using System.Windows.Media; + +namespace $safeprojectname$.Models +{ + public struct DataColor + { + public Brush Color { get; set; } + } +} diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Services/ApplicationHostService.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Services/ApplicationHostService.cs new file mode 100644 index 000000000..63538aee9 --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Services/ApplicationHostService.cs @@ -0,0 +1,61 @@ +using Microsoft.Extensions.Hosting; +using System; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using System.Windows; +using Wpf.Ui.Mvvm.Contracts; +using $safeprojectname$.Views; + +namespace $safeprojectname$.Services +{ + /// + /// Managed host of the application. + /// + public class ApplicationHostService : IHostedService + { + private readonly IServiceProvider _serviceProvider; + private INavigationWindow _navigationWindow; + + public ApplicationHostService(IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + } + + /// + /// Triggered when the application host is ready to start the service. + /// + /// Indicates that the start process has been aborted. + public async Task StartAsync(CancellationToken cancellationToken) + { + await HandleActivationAsync(); + } + + /// + /// Triggered when the application host is performing a graceful shutdown. + /// + /// Indicates that the shutdown process should no longer be graceful. + public async Task StopAsync(CancellationToken cancellationToken) + { + await Task.CompletedTask; + } + + /// + /// Creates main window during activation. + /// + private async Task HandleActivationAsync() + { + await Task.CompletedTask; + + if (!Application.Current.Windows.OfType().Any()) + { + _navigationWindow = (_serviceProvider.GetService(typeof(INavigationWindow)) as INavigationWindow)!; + _navigationWindow!.ShowWindow(); + + _navigationWindow.Navigate(typeof(Views.Pages.DashboardPage)); + } + + await Task.CompletedTask; + } + } +} diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Services/PageService.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Services/PageService.cs new file mode 100644 index 000000000..0e5761d80 --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Services/PageService.cs @@ -0,0 +1,43 @@ +using System; +using System.Windows; +using Wpf.Ui.Mvvm.Contracts; + +namespace $safeprojectname$.Services +{ + /// + /// Service that provides pages for navigation. + /// + public class PageService : IPageService + { + /// + /// Service which provides the instances of pages. + /// + private readonly IServiceProvider _serviceProvider; + + /// + /// Creates new instance and attaches the . + /// + public PageService(IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + } + + /// + public T? GetPage() where T : class + { + if (!typeof(FrameworkElement).IsAssignableFrom(typeof(T))) + throw new InvalidOperationException("The page should be a WPF control."); + + return (T?)_serviceProvider.GetService(typeof(T)); + } + + /// + public FrameworkElement? GetPage(Type pageType) + { + if (!typeof(FrameworkElement).IsAssignableFrom(pageType)) + throw new InvalidOperationException("The page should be a WPF control."); + + return _serviceProvider.GetService(pageType) as FrameworkElement; + } + } +} diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/ViewModels/ContainerViewModel.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/ViewModels/ContainerViewModel.cs new file mode 100644 index 000000000..211cdff42 --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/ViewModels/ContainerViewModel.cs @@ -0,0 +1,78 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using System; +using System.Collections.ObjectModel; +using Wpf.Ui.Common; +using Wpf.Ui.Controls; +using Wpf.Ui.Controls.Interfaces; +using Wpf.Ui.Mvvm.Contracts; + +namespace $safeprojectname$.ViewModels +{ + public partial class ContainerViewModel : ObservableObject + { + private bool _isInitialized = false; + + [ObservableProperty] + private string _applicationTitle = String.Empty; + + [ObservableProperty] + private ObservableCollection _navigationItems = new(); + + [ObservableProperty] + private ObservableCollection _navigationFooter = new(); + + [ObservableProperty] + private ObservableCollection _trayMenuItems = new(); + + public ContainerViewModel(INavigationService navigationService) + { + if (!_isInitialized) + InitializeViewModel(); + } + + private void InitializeViewModel() + { + ApplicationTitle = "WPF UI - $safeprojectname$"; + + NavigationItems = new ObservableCollection + { + new NavigationItem() + { + Content = "Home", + PageTag = "dashboard", + Icon = SymbolRegular.Home24, + PageType = typeof(Views.Pages.DashboardPage) + }, + new NavigationItem() + { + Content = "Data", + PageTag = "data", + Icon = SymbolRegular.DataHistogram24, + PageType = typeof(Views.Pages.DataPage) + } + }; + + NavigationFooter = new ObservableCollection + { + new NavigationItem() + { + Content = "Settings", + PageTag = "settings", + Icon = SymbolRegular.Settings24, + PageType = typeof(Views.Pages.SettingsPage) + } + }; + + TrayMenuItems = new ObservableCollection + { + new MenuItem + { + Header = "Home", + Tag = "tray_home" + } + }; + + _isInitialized = true; + } + } +} diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/ViewModels/DashboardViewModel.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/ViewModels/DashboardViewModel.cs new file mode 100644 index 000000000..624d7a325 --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/ViewModels/DashboardViewModel.cs @@ -0,0 +1,26 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using Wpf.Ui.Common.Interfaces; + +namespace $safeprojectname$.ViewModels +{ + public partial class DashboardViewModel : ObservableObject, INavigationAware + { + [ObservableProperty] + private int _counter = 0; + + public void OnNavigatedTo() + { + } + + public void OnNavigatedFrom() + { + } + + [RelayCommand] + private void OnCounterIncrement() + { + Counter++; + } + } +} diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/ViewModels/DataViewModel.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/ViewModels/DataViewModel.cs new file mode 100644 index 000000000..6ec2854ae --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/ViewModels/DataViewModel.cs @@ -0,0 +1,47 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using System; +using System.Collections.Generic; +using System.Windows.Media; +using Wpf.Ui.Common.Interfaces; +using $safeprojectname$.Models; + +namespace $safeprojectname$.ViewModels +{ + public partial class DataViewModel : ObservableObject, INavigationAware + { + private bool _isInitialized = false; + + [ObservableProperty] + private IEnumerable _colors; + + public void OnNavigatedTo() + { + if (!_isInitialized) + InitializeViewModel(); + } + + public void OnNavigatedFrom() + { + } + + private void InitializeViewModel() + { + var random = new Random(); + var colorCollection = new List(); + + for (int i = 0; i < 8192; i++) + colorCollection.Add(new DataColor + { + Color = new SolidColorBrush(Color.FromArgb( + (byte)200, + (byte)random.Next(0, 250), + (byte)random.Next(0, 250), + (byte)random.Next(0, 250))) + }); + + Colors = colorCollection; + + _isInitialized = true; + } + } +} diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/ViewModels/SettingsViewModel.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/ViewModels/SettingsViewModel.cs similarity index 63% rename from src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/ViewModels/SettingsViewModel.cs rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/ViewModels/SettingsViewModel.cs index d608797e2..c316392e4 100644 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/ViewModels/SettingsViewModel.cs +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/ViewModels/SettingsViewModel.cs @@ -1,38 +1,48 @@ -using System; -using System.Windows; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using System; +using System.Windows.Input; +using Wpf.Ui.Common.Interfaces; namespace $safeprojectname$.ViewModels { - public class SettingsViewModel : Wpf.Ui.Mvvm.ViewModelBase + public partial class SettingsViewModel : ObservableObject, INavigationAware { private bool _isInitialized = false; - public string AppVersion + [ObservableProperty] + private string _appVersion = String.Empty; + + [ObservableProperty] + private Wpf.Ui.Appearance.ThemeType _currentTheme = Wpf.Ui.Appearance.ThemeType.Unknown; + + public void OnNavigatedTo() { - get => GetValueOrDefault(String.Empty); - set => SetValue(value); + if (!_isInitialized) + InitializeViewModel(); } - public Wpf.Ui.Appearance.ThemeType CurrentTheme + public void OnNavigatedFrom() { - get => GetStructOrDefault(Wpf.Ui.Appearance.ThemeType.Unknown); - set => SetValue(value); } - public SettingsViewModel() + private void InitializeViewModel() { - if (!_isInitialized) - InitializeViewModel(); + CurrentTheme = Wpf.Ui.Appearance.Theme.GetAppTheme(); + AppVersion = $"$safeprojectname$ - {GetAssemblyVersion()}"; + + _isInitialized = true; } - protected override void OnViewCommand(object? parameter = null) + private string GetAssemblyVersion() { - base.OnViewCommand(parameter); - - if (parameter == null || parameter is not String parameterString) - return; + return System.Reflection.Assembly.GetExecutingAssembly().GetName().Version?.ToString() ?? String.Empty; + } - switch (parameterString) + [RelayCommand] + private void OnChangeTheme(string parameter) + { + switch (parameter) { case "theme_light": if (CurrentTheme == Wpf.Ui.Appearance.ThemeType.Light) @@ -43,7 +53,7 @@ protected override void OnViewCommand(object? parameter = null) break; - case "theme_dark": + default: if (CurrentTheme == Wpf.Ui.Appearance.ThemeType.Dark) break; @@ -53,18 +63,5 @@ protected override void OnViewCommand(object? parameter = null) break; } } - - private void InitializeViewModel() - { - CurrentTheme = Wpf.Ui.Appearance.Theme.GetAppTheme(); - AppVersion = $"$safeprojectname$ - {GetAssemblyVersion()}"; - - _isInitialized = true; - } - - private string GetAssemblyVersion() - { - return System.Reflection.Assembly.GetExecutingAssembly().GetName().Version?.ToString() ?? String.Empty; - } } } diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/Views/Container.xaml b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Views/Container.xaml similarity index 76% rename from src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/Views/Container.xaml rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Views/Container.xaml index 128a2229b..b6361840f 100644 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/Views/Container.xaml +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Views/Container.xaml @@ -10,7 +10,8 @@ Title="{Binding ViewModel.ApplicationTitle, Mode=OneWay}" Width="1100" Height="650" - d:DataContext="{d:DesignInstance local:Container, IsDesignTimeCreatable=True}" + d:DataContext="{d:DesignInstance local:Container, + IsDesignTimeCreatable=True}" ExtendsContentIntoTitleBar="True" WindowBackdropType="Mica" WindowCornerPreference="Round" @@ -39,7 +40,7 @@ - + - - - - - - + Footer="{Binding ViewModel.NavigationFooter, Mode=TwoWay}" + Frame="{Binding ElementName=RootFrame, Mode=OneWay}" + Items="{Binding ViewModel.NavigationItems, Mode=TwoWay}" /> @@ -84,14 +68,14 @@ + Margin="0" /> + Navigation="{Binding ElementName=RootNavigation, Mode=OneWay}" /> @@ -107,8 +91,8 @@ diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Views/Container.xaml.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Views/Container.xaml.cs new file mode 100644 index 000000000..75567ef32 --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Views/Container.xaml.cs @@ -0,0 +1,63 @@ +using System; +using System.Windows; +using System.Windows.Controls; +using Wpf.Ui.Controls.Interfaces; +using Wpf.Ui.Mvvm.Contracts; + +namespace $safeprojectname$.Views +{ + /// + /// Interaction logic for Container.xaml + /// + public partial class Container : INavigationWindow + { + public ViewModels.ContainerViewModel ViewModel + { + get; + } + + public Container(ViewModels.ContainerViewModel viewModel, IPageService pageService, INavigationService navigationService) + { + ViewModel = viewModel; + DataContext = this; + + InitializeComponent(); + SetPageService(pageService); + + navigationService.SetNavigationControl(RootNavigation); + } + + #region INavigationWindow methods + + public Frame GetFrame() + => RootFrame; + + public INavigation GetNavigation() + => RootNavigation; + + public bool Navigate(Type pageType) + => RootNavigation.Navigate(pageType); + + public void SetPageService(IPageService pageService) + => RootNavigation.PageService = pageService; + + public void ShowWindow() + => Show(); + + public void CloseWindow() + => Close(); + + #endregion INavigationWindow methods + + /// + /// Raises the closed event. + /// + protected override void OnClosed(EventArgs e) + { + base.OnClosed(e); + + // Make sure that closing this window will begin the process of closing the application. + Application.Current.Shutdown(); + } + } +} \ No newline at end of file diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Views/Pages/DashboardPage.xaml b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Views/Pages/DashboardPage.xaml new file mode 100644 index 000000000..c37dce8c6 --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Views/Pages/DashboardPage.xaml @@ -0,0 +1,18 @@ + + + + + + + + + + + + diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/Views/Pages/DashboardPage.xaml.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Views/Pages/DashboardPage.xaml.cs similarity index 56% rename from src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/Views/Pages/DashboardPage.xaml.cs rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Views/Pages/DashboardPage.xaml.cs index 03299b19a..b4163fce2 100644 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/Views/Pages/DashboardPage.xaml.cs +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Views/Pages/DashboardPage.xaml.cs @@ -1,21 +1,20 @@ -using System.Windows.Controls; +using Wpf.Ui.Common.Interfaces; namespace $safeprojectname$.Views.Pages { /// /// Interaction logic for DashboardPage.xaml /// - public partial class DashboardPage : Wpf.Ui.Controls.UiPage + public partial class DashboardPage : INavigableView { public ViewModels.DashboardViewModel ViewModel { get; } - public DashboardPage() + public DashboardPage(ViewModels.DashboardViewModel viewModel) { - ViewModel = new ViewModels.DashboardViewModel(); - DataContext = this; + ViewModel = viewModel; InitializeComponent(); } diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Views/Pages/DataPage.xaml b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Views/Pages/DataPage.xaml new file mode 100644 index 000000000..fc6475f8d --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Views/Pages/DataPage.xaml @@ -0,0 +1,39 @@ + + + + + + + + + + + + diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Views/Pages/DataPage.xaml.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Views/Pages/DataPage.xaml.cs new file mode 100644 index 000000000..07d60a737 --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Views/Pages/DataPage.xaml.cs @@ -0,0 +1,22 @@ +using Wpf.Ui.Common.Interfaces; + +namespace $safeprojectname$.Views.Pages +{ + /// + /// Interaction logic for DataView.xaml + /// + public partial class DataPage : INavigableView + { + public ViewModels.DataViewModel ViewModel + { + get; + } + + public DataPage(ViewModels.DataViewModel viewModel) + { + ViewModel = viewModel; + + InitializeComponent(); + } + } +} diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/Views/Pages/SettingsPage.xaml b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Views/Pages/SettingsPage.xaml similarity index 64% rename from src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/Views/Pages/SettingsPage.xaml rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Views/Pages/SettingsPage.xaml index 4b4e9d875..c8b733e63 100644 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/Views/Pages/SettingsPage.xaml +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Views/Pages/SettingsPage.xaml @@ -3,38 +3,47 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:helpers="clr-namespace:$safeprojectname$.Helpers" xmlns:local="clr-namespace:$safeprojectname$.Views.Pages" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - xmlns:helpers="clr-namespace:$safeprojectname$.Helpers" xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml" Title="SettingsPage" - Foreground="{DynamicResource TextFillColorPrimaryBrush}" - d:DataContext="{d:DesignInstance local:SettingsPage, IsDesignTimeCreatable=True}" + d:DataContext="{d:DesignInstance local:SettingsPage, + IsDesignTimeCreatable=False}" d:DesignHeight="450" d:DesignWidth="800" + Foreground="{DynamicResource TextFillColorPrimaryBrush}" mc:Ignorable="d"> - - - + + + - + + Content="Dark" + GroupName="themeSelect" + IsChecked="{Binding ViewModel.CurrentTheme, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter=Dark, Mode=OneWay}" /> - - + + diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/Views/Pages/SettingsPage.xaml.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Views/Pages/SettingsPage.xaml.cs similarity index 56% rename from src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/Views/Pages/SettingsPage.xaml.cs rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Views/Pages/SettingsPage.xaml.cs index 5aef0f104..54c312f4e 100644 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/Views/Pages/SettingsPage.xaml.cs +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Views/Pages/SettingsPage.xaml.cs @@ -1,21 +1,20 @@ -using System.Windows.Controls; +using Wpf.Ui.Common.Interfaces; namespace $safeprojectname$.Views.Pages { /// /// Interaction logic for SettingsPage.xaml /// - public partial class SettingsPage : Wpf.Ui.Controls.UiPage + public partial class SettingsPage : INavigableView { public ViewModels.SettingsViewModel ViewModel { get; } - public SettingsPage() + public SettingsPage(ViewModels.SettingsViewModel viewModel) { - ViewModel = new ViewModels.SettingsViewModel(); - DataContext = this; + ViewModel = viewModel; InitializeComponent(); } diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/WPFUI_FluentNavTemplate.csproj b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Wpf.Ui.Mvvm.FluentNavigation.Template.csproj similarity index 90% rename from src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/WPFUI_FluentNavTemplate.csproj rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Wpf.Ui.Mvvm.FluentNavigation.Template.csproj index 5007693c8..04532fd2f 100644 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/WPFUI_FluentNavTemplate.csproj +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Wpf.Ui.Mvvm.FluentNavigation.Template.csproj @@ -18,8 +18,8 @@ {08BE0726-8E3D-4624-AC9E-07816A14E906} Library Properties - WPFUI_FluentNav - WPFUI_FluentNav + Wpf.Ui.Mvvm.FluentNavigation + Wpf.Ui.Mvvm.FluentNavigation v4.8 false false @@ -50,11 +50,11 @@ 4 - + - - WPFUI_FluentNav + + Wpf.Ui.Mvvm.FluentNavigation diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/WPFUI_TaskNav.csproj b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Wpf.Ui.Mvvm.FluentNavigation.csproj similarity index 78% rename from src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/WPFUI_TaskNav.csproj rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Wpf.Ui.Mvvm.FluentNavigation.csproj index d7521fcb3..d2e0fc374 100644 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/WPFUI_TaskNav.csproj +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Wpf.Ui.Mvvm.FluentNavigation.csproj @@ -15,7 +15,9 @@ - + + + diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/WPFUI_TaskNav.vstemplate b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Wpf.Ui.Mvvm.FluentNavigation.vstemplate similarity index 69% rename from src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/WPFUI_TaskNav.vstemplate rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Wpf.Ui.Mvvm.FluentNavigation.vstemplate index c34f2d222..d4a295c36 100644 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/WPFUI_TaskNav.vstemplate +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/Wpf.Ui.Mvvm.FluentNavigation.vstemplate @@ -1,7 +1,8 @@ - + - WPF UI - Compact Navigation - Template for creating WPF UI project with Compact navigation and Mica background. + WPF UI - Fluent Navigation (MVVM | DI) + Template for creating WPF UI project with MVVM pattern, Dependency Injection, Fluent navigation and Mica background. CSharp 1000 @@ -21,7 +22,7 @@ __PreviewImage.png - + applicationIcon-256.png applicationIcon-1024.png @@ -29,15 +30,26 @@ EnumToBooleanConverter.cs + + AppConfig.cs + DataColor.cs + + + ApplicationHostService.cs + PageService.cs + ContainerViewModel.cs DashboardViewModel.cs + DataViewModel.cs SettingsViewModel.cs DashboardPage.xaml DashboardPage.xaml.cs + DataPage.xaml + DataPage.xaml.cs SettingsPage.xaml SettingsPage.xaml.cs diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/__PreviewImage.png b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/__PreviewImage.png similarity index 100% rename from src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/__PreviewImage.png rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/__PreviewImage.png diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/__TemplateIcon.png b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/__TemplateIcon.png similarity index 100% rename from src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/__TemplateIcon.png rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/__TemplateIcon.png diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/app.manifest b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/app.manifest similarity index 100% rename from src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/app.manifest rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/app.manifest diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/applicationIcon.ico b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/applicationIcon.ico similarity index 100% rename from src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/applicationIcon.ico rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.FluentNavigation/applicationIcon.ico diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/App.xaml b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/App.xaml similarity index 69% rename from src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/App.xaml rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/App.xaml index 241390e99..ed1ed0c52 100644 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/App.xaml +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/App.xaml @@ -2,14 +2,15 @@ x:Class="$safeprojectname$.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" - xmlns:local="clr-namespace:$safeprojectname$" - Startup="OnStartup" xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml" - StartupUri="Views/Container.xaml"> + DispatcherUnhandledException="OnDispatcherUnhandledException" + Exit="OnExit" + Startup="OnStartup"> - + + diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/App.xaml.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/App.xaml.cs new file mode 100644 index 000000000..1ea92fd2f --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/App.xaml.cs @@ -0,0 +1,98 @@ +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using System.IO; +using System.Reflection; +using System.Windows; +using System.Windows.Threading; +using Wpf.Ui.Mvvm.Contracts; +using Wpf.Ui.Mvvm.Services; +using $safeprojectname$.Models; +using $safeprojectname$.Services; + +namespace $safeprojectname$ +{ + /// + /// Interaction logic for App.xaml + /// + public partial class App + { + // The.NET Generic Host provides dependency injection, configuration, logging, and other services. + // https://docs.microsoft.com/dotnet/core/extensions/generic-host + // https://docs.microsoft.com/dotnet/core/extensions/dependency-injection + // https://docs.microsoft.com/dotnet/core/extensions/configuration + // https://docs.microsoft.com/dotnet/core/extensions/logging + private static readonly IHost _host = Host + .CreateDefaultBuilder() + .ConfigureAppConfiguration(c => { c.SetBasePath(Path.GetDirectoryName(Assembly.GetEntryAssembly()!.Location)); }) + .ConfigureServices((context, services) => + { + // App Host + services.AddHostedService(); + + // Page resolver service + services.AddSingleton(); + + // Theme manipulation + services.AddSingleton(); + + // TaskBar manipulation + services.AddSingleton(); + + // Service containing navigation, same as INavigationWindow... but without window + services.AddSingleton(); + + // Main window container with navigation + services.AddScoped(); + services.AddScoped(); + + // Views and ViewModels + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + + // Configuration + services.Configure(context.Configuration.GetSection(nameof(AppConfig))); + }).Build(); + + /// + /// Gets registered service. + /// + /// Type of the service to get. + /// Instance of the service or . + public static T GetService() + where T : class + { + return _host.Services.GetService(typeof(T)) as T; + } + + /// + /// Occurs when the application is loading. + /// + private async void OnStartup(object sender, StartupEventArgs e) + { + await _host.StartAsync(); + } + + /// + /// Occurs when the application is closing. + /// + private async void OnExit(object sender, ExitEventArgs e) + { + await _host.StopAsync(); + + _host.Dispose(); + } + + /// + /// Occurs when an exception is thrown by an application but not handled. + /// + private void OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) + { + // For more info see https://docs.microsoft.com/en-us/dotnet/api/system.windows.application.dispatcherunhandledexception?view=windowsdesktop-6.0 + } + } +} \ No newline at end of file diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/AssemblyInfo.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/AssemblyInfo.cs similarity index 100% rename from src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/AssemblyInfo.cs rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/AssemblyInfo.cs diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/Assets/applicationIcon-1024.png b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Assets/applicationIcon-1024.png similarity index 100% rename from src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/Assets/applicationIcon-1024.png rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Assets/applicationIcon-1024.png diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/Assets/applicationIcon-256.png b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Assets/applicationIcon-256.png similarity index 100% rename from src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/Assets/applicationIcon-256.png rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Assets/applicationIcon-256.png diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/Helpers/EnumToBooleanConverter.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Helpers/EnumToBooleanConverter.cs similarity index 100% rename from src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/Helpers/EnumToBooleanConverter.cs rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Helpers/EnumToBooleanConverter.cs diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Models/AppConfig.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Models/AppConfig.cs new file mode 100644 index 000000000..de05a5c07 --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Models/AppConfig.cs @@ -0,0 +1,9 @@ +namespace $safeprojectname$.Models +{ + public class AppConfig + { + public string ConfigurationsFolder { get; set; } + + public string AppPropertiesFileName { get; set; } + } +} diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Models/DataColor.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Models/DataColor.cs new file mode 100644 index 000000000..37d424944 --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Models/DataColor.cs @@ -0,0 +1,9 @@ +using System.Windows.Media; + +namespace $safeprojectname$.Models +{ + public struct DataColor + { + public Brush Color { get; set; } + } +} diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Services/ApplicationHostService.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Services/ApplicationHostService.cs new file mode 100644 index 000000000..63538aee9 --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Services/ApplicationHostService.cs @@ -0,0 +1,61 @@ +using Microsoft.Extensions.Hosting; +using System; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using System.Windows; +using Wpf.Ui.Mvvm.Contracts; +using $safeprojectname$.Views; + +namespace $safeprojectname$.Services +{ + /// + /// Managed host of the application. + /// + public class ApplicationHostService : IHostedService + { + private readonly IServiceProvider _serviceProvider; + private INavigationWindow _navigationWindow; + + public ApplicationHostService(IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + } + + /// + /// Triggered when the application host is ready to start the service. + /// + /// Indicates that the start process has been aborted. + public async Task StartAsync(CancellationToken cancellationToken) + { + await HandleActivationAsync(); + } + + /// + /// Triggered when the application host is performing a graceful shutdown. + /// + /// Indicates that the shutdown process should no longer be graceful. + public async Task StopAsync(CancellationToken cancellationToken) + { + await Task.CompletedTask; + } + + /// + /// Creates main window during activation. + /// + private async Task HandleActivationAsync() + { + await Task.CompletedTask; + + if (!Application.Current.Windows.OfType().Any()) + { + _navigationWindow = (_serviceProvider.GetService(typeof(INavigationWindow)) as INavigationWindow)!; + _navigationWindow!.ShowWindow(); + + _navigationWindow.Navigate(typeof(Views.Pages.DashboardPage)); + } + + await Task.CompletedTask; + } + } +} diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Services/PageService.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Services/PageService.cs new file mode 100644 index 000000000..0e5761d80 --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Services/PageService.cs @@ -0,0 +1,43 @@ +using System; +using System.Windows; +using Wpf.Ui.Mvvm.Contracts; + +namespace $safeprojectname$.Services +{ + /// + /// Service that provides pages for navigation. + /// + public class PageService : IPageService + { + /// + /// Service which provides the instances of pages. + /// + private readonly IServiceProvider _serviceProvider; + + /// + /// Creates new instance and attaches the . + /// + public PageService(IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + } + + /// + public T? GetPage() where T : class + { + if (!typeof(FrameworkElement).IsAssignableFrom(typeof(T))) + throw new InvalidOperationException("The page should be a WPF control."); + + return (T?)_serviceProvider.GetService(typeof(T)); + } + + /// + public FrameworkElement? GetPage(Type pageType) + { + if (!typeof(FrameworkElement).IsAssignableFrom(pageType)) + throw new InvalidOperationException("The page should be a WPF control."); + + return _serviceProvider.GetService(pageType) as FrameworkElement; + } + } +} diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/ViewModels/ContainerViewModel.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/ViewModels/ContainerViewModel.cs new file mode 100644 index 000000000..211cdff42 --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/ViewModels/ContainerViewModel.cs @@ -0,0 +1,78 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using System; +using System.Collections.ObjectModel; +using Wpf.Ui.Common; +using Wpf.Ui.Controls; +using Wpf.Ui.Controls.Interfaces; +using Wpf.Ui.Mvvm.Contracts; + +namespace $safeprojectname$.ViewModels +{ + public partial class ContainerViewModel : ObservableObject + { + private bool _isInitialized = false; + + [ObservableProperty] + private string _applicationTitle = String.Empty; + + [ObservableProperty] + private ObservableCollection _navigationItems = new(); + + [ObservableProperty] + private ObservableCollection _navigationFooter = new(); + + [ObservableProperty] + private ObservableCollection _trayMenuItems = new(); + + public ContainerViewModel(INavigationService navigationService) + { + if (!_isInitialized) + InitializeViewModel(); + } + + private void InitializeViewModel() + { + ApplicationTitle = "WPF UI - $safeprojectname$"; + + NavigationItems = new ObservableCollection + { + new NavigationItem() + { + Content = "Home", + PageTag = "dashboard", + Icon = SymbolRegular.Home24, + PageType = typeof(Views.Pages.DashboardPage) + }, + new NavigationItem() + { + Content = "Data", + PageTag = "data", + Icon = SymbolRegular.DataHistogram24, + PageType = typeof(Views.Pages.DataPage) + } + }; + + NavigationFooter = new ObservableCollection + { + new NavigationItem() + { + Content = "Settings", + PageTag = "settings", + Icon = SymbolRegular.Settings24, + PageType = typeof(Views.Pages.SettingsPage) + } + }; + + TrayMenuItems = new ObservableCollection + { + new MenuItem + { + Header = "Home", + Tag = "tray_home" + } + }; + + _isInitialized = true; + } + } +} diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/ViewModels/DashboardViewModel.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/ViewModels/DashboardViewModel.cs new file mode 100644 index 000000000..624d7a325 --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/ViewModels/DashboardViewModel.cs @@ -0,0 +1,26 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using Wpf.Ui.Common.Interfaces; + +namespace $safeprojectname$.ViewModels +{ + public partial class DashboardViewModel : ObservableObject, INavigationAware + { + [ObservableProperty] + private int _counter = 0; + + public void OnNavigatedTo() + { + } + + public void OnNavigatedFrom() + { + } + + [RelayCommand] + private void OnCounterIncrement() + { + Counter++; + } + } +} diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/ViewModels/DataViewModel.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/ViewModels/DataViewModel.cs new file mode 100644 index 000000000..6ec2854ae --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/ViewModels/DataViewModel.cs @@ -0,0 +1,47 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using System; +using System.Collections.Generic; +using System.Windows.Media; +using Wpf.Ui.Common.Interfaces; +using $safeprojectname$.Models; + +namespace $safeprojectname$.ViewModels +{ + public partial class DataViewModel : ObservableObject, INavigationAware + { + private bool _isInitialized = false; + + [ObservableProperty] + private IEnumerable _colors; + + public void OnNavigatedTo() + { + if (!_isInitialized) + InitializeViewModel(); + } + + public void OnNavigatedFrom() + { + } + + private void InitializeViewModel() + { + var random = new Random(); + var colorCollection = new List(); + + for (int i = 0; i < 8192; i++) + colorCollection.Add(new DataColor + { + Color = new SolidColorBrush(Color.FromArgb( + (byte)200, + (byte)random.Next(0, 250), + (byte)random.Next(0, 250), + (byte)random.Next(0, 250))) + }); + + Colors = colorCollection; + + _isInitialized = true; + } + } +} diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/ViewModels/SettingsViewModel.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/ViewModels/SettingsViewModel.cs similarity index 63% rename from src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/ViewModels/SettingsViewModel.cs rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/ViewModels/SettingsViewModel.cs index d608797e2..c316392e4 100644 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/ViewModels/SettingsViewModel.cs +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/ViewModels/SettingsViewModel.cs @@ -1,38 +1,48 @@ -using System; -using System.Windows; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using System; +using System.Windows.Input; +using Wpf.Ui.Common.Interfaces; namespace $safeprojectname$.ViewModels { - public class SettingsViewModel : Wpf.Ui.Mvvm.ViewModelBase + public partial class SettingsViewModel : ObservableObject, INavigationAware { private bool _isInitialized = false; - public string AppVersion + [ObservableProperty] + private string _appVersion = String.Empty; + + [ObservableProperty] + private Wpf.Ui.Appearance.ThemeType _currentTheme = Wpf.Ui.Appearance.ThemeType.Unknown; + + public void OnNavigatedTo() { - get => GetValueOrDefault(String.Empty); - set => SetValue(value); + if (!_isInitialized) + InitializeViewModel(); } - public Wpf.Ui.Appearance.ThemeType CurrentTheme + public void OnNavigatedFrom() { - get => GetStructOrDefault(Wpf.Ui.Appearance.ThemeType.Unknown); - set => SetValue(value); } - public SettingsViewModel() + private void InitializeViewModel() { - if (!_isInitialized) - InitializeViewModel(); + CurrentTheme = Wpf.Ui.Appearance.Theme.GetAppTheme(); + AppVersion = $"$safeprojectname$ - {GetAssemblyVersion()}"; + + _isInitialized = true; } - protected override void OnViewCommand(object? parameter = null) + private string GetAssemblyVersion() { - base.OnViewCommand(parameter); - - if (parameter == null || parameter is not String parameterString) - return; + return System.Reflection.Assembly.GetExecutingAssembly().GetName().Version?.ToString() ?? String.Empty; + } - switch (parameterString) + [RelayCommand] + private void OnChangeTheme(string parameter) + { + switch (parameter) { case "theme_light": if (CurrentTheme == Wpf.Ui.Appearance.ThemeType.Light) @@ -43,7 +53,7 @@ protected override void OnViewCommand(object? parameter = null) break; - case "theme_dark": + default: if (CurrentTheme == Wpf.Ui.Appearance.ThemeType.Dark) break; @@ -53,18 +63,5 @@ protected override void OnViewCommand(object? parameter = null) break; } } - - private void InitializeViewModel() - { - CurrentTheme = Wpf.Ui.Appearance.Theme.GetAppTheme(); - AppVersion = $"$safeprojectname$ - {GetAssemblyVersion()}"; - - _isInitialized = true; - } - - private string GetAssemblyVersion() - { - return System.Reflection.Assembly.GetExecutingAssembly().GetName().Version?.ToString() ?? String.Empty; - } } } diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/Views/Container.xaml b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Views/Container.xaml similarity index 80% rename from src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/Views/Container.xaml rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Views/Container.xaml index a51cec166..4fef2b4aa 100644 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/Views/Container.xaml +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Views/Container.xaml @@ -10,7 +10,8 @@ Title="{Binding ViewModel.ApplicationTitle, Mode=OneWay}" Width="1100" Height="650" - d:DataContext="{d:DesignInstance local:Container, IsDesignTimeCreatable=True}" + d:DataContext="{d:DesignInstance local:Container, + IsDesignTimeCreatable=True}" ExtendsContentIntoTitleBar="True" WindowBackdropType="Mica" WindowCornerPreference="Round" @@ -36,22 +37,9 @@ x:Name="RootNavigation" Grid.Column="0" Margin="6,0,6,0" - Frame="{Binding ElementName=RootFrame}" - SelectedPageIndex="0"> - - - - - - - + Footer="{Binding ViewModel.NavigationFooter, Mode=TwoWay}" + Frame="{Binding ElementName=RootFrame, Mode=OneWay}" + Items="{Binding ViewModel.NavigationItems, Mode=TwoWay}" /> + Navigation="{Binding ElementName=RootNavigation, Mode=OneWay}" /> @@ -86,8 +74,8 @@ diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Views/Container.xaml.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Views/Container.xaml.cs new file mode 100644 index 000000000..75567ef32 --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Views/Container.xaml.cs @@ -0,0 +1,63 @@ +using System; +using System.Windows; +using System.Windows.Controls; +using Wpf.Ui.Controls.Interfaces; +using Wpf.Ui.Mvvm.Contracts; + +namespace $safeprojectname$.Views +{ + /// + /// Interaction logic for Container.xaml + /// + public partial class Container : INavigationWindow + { + public ViewModels.ContainerViewModel ViewModel + { + get; + } + + public Container(ViewModels.ContainerViewModel viewModel, IPageService pageService, INavigationService navigationService) + { + ViewModel = viewModel; + DataContext = this; + + InitializeComponent(); + SetPageService(pageService); + + navigationService.SetNavigationControl(RootNavigation); + } + + #region INavigationWindow methods + + public Frame GetFrame() + => RootFrame; + + public INavigation GetNavigation() + => RootNavigation; + + public bool Navigate(Type pageType) + => RootNavigation.Navigate(pageType); + + public void SetPageService(IPageService pageService) + => RootNavigation.PageService = pageService; + + public void ShowWindow() + => Show(); + + public void CloseWindow() + => Close(); + + #endregion INavigationWindow methods + + /// + /// Raises the closed event. + /// + protected override void OnClosed(EventArgs e) + { + base.OnClosed(e); + + // Make sure that closing this window will begin the process of closing the application. + Application.Current.Shutdown(); + } + } +} \ No newline at end of file diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Views/Pages/DashboardPage.xaml b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Views/Pages/DashboardPage.xaml new file mode 100644 index 000000000..55bfa56b0 --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Views/Pages/DashboardPage.xaml @@ -0,0 +1,18 @@ + + + + + + + + + + + + diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/Views/Pages/DashboardPage.xaml.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Views/Pages/DashboardPage.xaml.cs similarity index 56% rename from src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/Views/Pages/DashboardPage.xaml.cs rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Views/Pages/DashboardPage.xaml.cs index 03299b19a..b4163fce2 100644 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/Views/Pages/DashboardPage.xaml.cs +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Views/Pages/DashboardPage.xaml.cs @@ -1,21 +1,20 @@ -using System.Windows.Controls; +using Wpf.Ui.Common.Interfaces; namespace $safeprojectname$.Views.Pages { /// /// Interaction logic for DashboardPage.xaml /// - public partial class DashboardPage : Wpf.Ui.Controls.UiPage + public partial class DashboardPage : INavigableView { public ViewModels.DashboardViewModel ViewModel { get; } - public DashboardPage() + public DashboardPage(ViewModels.DashboardViewModel viewModel) { - ViewModel = new ViewModels.DashboardViewModel(); - DataContext = this; + ViewModel = viewModel; InitializeComponent(); } diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Views/Pages/DataPage.xaml b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Views/Pages/DataPage.xaml new file mode 100644 index 000000000..94a8fd29a --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Views/Pages/DataPage.xaml @@ -0,0 +1,39 @@ + + + + + + + + + + + + diff --git a/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Views/Pages/DataPage.xaml.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Views/Pages/DataPage.xaml.cs new file mode 100644 index 000000000..07d60a737 --- /dev/null +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Views/Pages/DataPage.xaml.cs @@ -0,0 +1,22 @@ +using Wpf.Ui.Common.Interfaces; + +namespace $safeprojectname$.Views.Pages +{ + /// + /// Interaction logic for DataView.xaml + /// + public partial class DataPage : INavigableView + { + public ViewModels.DataViewModel ViewModel + { + get; + } + + public DataPage(ViewModels.DataViewModel viewModel) + { + ViewModel = viewModel; + + InitializeComponent(); + } + } +} diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/Views/Pages/SettingsPage.xaml b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Views/Pages/SettingsPage.xaml similarity index 65% rename from src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/Views/Pages/SettingsPage.xaml rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Views/Pages/SettingsPage.xaml index b61613931..25b61ddfb 100644 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/Views/Pages/SettingsPage.xaml +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Views/Pages/SettingsPage.xaml @@ -3,38 +3,47 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:helpers="clr-namespace:$safeprojectname$.Helpers" xmlns:local="clr-namespace:$safeprojectname$.Views.Pages" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - xmlns:helpers="clr-namespace:$safeprojectname$.Helpers" xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml" Title="SettingsPage" - Foreground="{DynamicResource TextFillColorPrimaryBrush}" - d:DataContext="{d:DesignInstance local:SettingsPage, IsDesignTimeCreatable=True}" + d:DataContext="{d:DesignInstance local:SettingsPage, + IsDesignTimeCreatable=False}" d:DesignHeight="450" d:DesignWidth="800" + Foreground="{DynamicResource TextFillColorPrimaryBrush}" mc:Ignorable="d"> - - + + - + + Content="Dark" + GroupName="themeSelect" + IsChecked="{Binding ViewModel.CurrentTheme, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter=Dark, Mode=OneWay}" /> - - + + diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/Views/Pages/SettingsPage.xaml.cs b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Views/Pages/SettingsPage.xaml.cs similarity index 56% rename from src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/Views/Pages/SettingsPage.xaml.cs rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Views/Pages/SettingsPage.xaml.cs index 5aef0f104..54c312f4e 100644 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav/Views/Pages/SettingsPage.xaml.cs +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Views/Pages/SettingsPage.xaml.cs @@ -1,21 +1,20 @@ -using System.Windows.Controls; +using Wpf.Ui.Common.Interfaces; namespace $safeprojectname$.Views.Pages { /// /// Interaction logic for SettingsPage.xaml /// - public partial class SettingsPage : Wpf.Ui.Controls.UiPage + public partial class SettingsPage : INavigableView { public ViewModels.SettingsViewModel ViewModel { get; } - public SettingsPage() + public SettingsPage(ViewModels.SettingsViewModel viewModel) { - ViewModel = new ViewModels.SettingsViewModel(); - DataContext = this; + ViewModel = viewModel; InitializeComponent(); } diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/WPFUI_StoreNav_MVVMTemplate.csproj b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Wpf.Ui.Mvvm.StoreNavigation.Template.csproj similarity index 91% rename from src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/WPFUI_StoreNav_MVVMTemplate.csproj rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Wpf.Ui.Mvvm.StoreNavigation.Template.csproj index 1fff7c8a1..68d136761 100644 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/WPFUI_StoreNav_MVVMTemplate.csproj +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Wpf.Ui.Mvvm.StoreNavigation.Template.csproj @@ -18,8 +18,8 @@ {5F5E2630-513E-4A8D-BB64-0F6F574DD739} Library Properties - WPFUI_StoreNav - WPFUI_StoreNav + Wpf.Ui.Mvvm.StoreNavigation + Wpf.Ui.Mvvm.StoreNavigation v4.8 false false @@ -50,11 +50,11 @@ 4 - + - - WPFUI_StoreNav_MVVM + + Wpf.Ui.Mvvm.StoreNavigation diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/WPFUI_FluentNav.csproj b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Wpf.Ui.Mvvm.StoreNavigation.csproj similarity index 78% rename from src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/WPFUI_FluentNav.csproj rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Wpf.Ui.Mvvm.StoreNavigation.csproj index d7521fcb3..d2e0fc374 100644 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/WPFUI_FluentNav.csproj +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Wpf.Ui.Mvvm.StoreNavigation.csproj @@ -15,7 +15,9 @@ - + + + diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/WPFUI_FluentNav.vstemplate b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Wpf.Ui.Mvvm.StoreNavigation.vstemplate similarity index 69% rename from src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/WPFUI_FluentNav.vstemplate rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Wpf.Ui.Mvvm.StoreNavigation.vstemplate index 4dd3cc4a1..cf5b9a5ba 100644 --- a/src/Wpf.Ui.Extension/Templates/WPFUI_FluentNav/WPFUI_FluentNav.vstemplate +++ b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/Wpf.Ui.Mvvm.StoreNavigation.vstemplate @@ -1,7 +1,8 @@ - + - WPF UI - Fluent Navigation - Template for creating WPF UI project with Fluent navigation and Mica background. + WPF UI - MS Store Navigation (MVVM | DI) + Template for creating WPF UI project with MVVM pattern, Dependency Injection, MS Store navigation and Mica background. CSharp 1000 @@ -21,7 +22,7 @@ __PreviewImage.png - + applicationIcon-256.png applicationIcon-1024.png @@ -29,15 +30,26 @@ EnumToBooleanConverter.cs + + AppConfig.cs + DataColor.cs + + + ApplicationHostService.cs + PageService.cs + ContainerViewModel.cs DashboardViewModel.cs + DataViewModel.cs SettingsViewModel.cs DashboardPage.xaml DashboardPage.xaml.cs + DataPage.xaml + DataPage.xaml.cs SettingsPage.xaml SettingsPage.xaml.cs diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/__PreviewImage.png b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/__PreviewImage.png similarity index 100% rename from src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/__PreviewImage.png rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/__PreviewImage.png diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/__TemplateIcon.png b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/__TemplateIcon.png similarity index 100% rename from src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/__TemplateIcon.png rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/__TemplateIcon.png diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/app.manifest b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/app.manifest similarity index 100% rename from src/Wpf.Ui.Extension/Templates/WPFUI_StoreNav_MVVM/app.manifest rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/app.manifest diff --git a/src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/applicationIcon.ico b/src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/applicationIcon.ico similarity index 100% rename from src/Wpf.Ui.Extension/Templates/WPFUI_TaskNav/applicationIcon.ico rename to src/Wpf.Ui.Extension/Templates/Wpf.Ui.Mvvm.StoreNavigation/applicationIcon.ico diff --git a/src/Wpf.Ui.Extension/Wpf.Ui.Extension/Wpf.Ui.Extension.csproj b/src/Wpf.Ui.Extension/Wpf.Ui.Extension/Wpf.Ui.Extension.csproj index b016e7466..658c09571 100644 --- a/src/Wpf.Ui.Extension/Wpf.Ui.Extension/Wpf.Ui.Extension.csproj +++ b/src/Wpf.Ui.Extension/Wpf.Ui.Extension/Wpf.Ui.Extension.csproj @@ -53,34 +53,27 @@ - - + + - - {4B5253B4-E818-4330-A5B5-E25140C28DC6} - WPFUI_StoreNavTemplate - ProjectTemplates - false - TemplateProjectOutputGroup%3b - - + {14D7431C-6CFF-4191-BB88-2B8D5F323A30} - WPFUI_TaskNavTemplate + Wpf.Ui.Mvvm.CompactNavigation.Template ProjectTemplates false TemplateProjectOutputGroup%3b - + {08BE0726-8E3D-4624-AC9E-07816A14E906} - WPFUI_FluentNavTemplate + Wpf.Ui.Mvvm.FluentNavigation.Template ProjectTemplates false TemplateProjectOutputGroup%3b - + {5F5E2630-513E-4A8D-BB64-0F6F574DD739} - WPFUI_StoreNav_MVVMTemplate + Wpf.Ui.Mvvm.StoreNavigation.Template ProjectTemplates false TemplateProjectOutputGroup%3b diff --git a/src/Wpf.Ui.Extension/Wpf.Ui.Extension/source.extension.vsixmanifest b/src/Wpf.Ui.Extension/Wpf.Ui.Extension/source.extension.vsixmanifest index 9ae4ee6fe..31a659781 100644 --- a/src/Wpf.Ui.Extension/Wpf.Ui.Extension/source.extension.vsixmanifest +++ b/src/Wpf.Ui.Extension/Wpf.Ui.Extension/source.extension.vsixmanifest @@ -7,6 +7,7 @@ https://github.com/lepoco/wpfui license.txt https://wpfui.lepo.co/documentation + https://github.com/lepoco/wpfui/releases wpfui.png preview.png wpf ui wpfui fluent design winui windows controls custom metro modern xaml toolkit color dark theme lepo net6 net5 net @@ -20,10 +21,9 @@ - - - - + + + diff --git a/src/Wpf.Ui.FontMapper/FluentSystemIcons-Filled.json b/src/Wpf.Ui.FontMapper/FluentSystemIcons-Filled.json index 2acf12063..97b988193 100644 --- a/src/Wpf.Ui.FontMapper/FluentSystemIcons-Filled.json +++ b/src/Wpf.Ui.FontMapper/FluentSystemIcons-Filled.json @@ -5840,5 +5840,153 @@ "ic_fluent_shield_question_16_filled": 61217, "ic_fluent_shield_question_20_filled": 61218, "ic_fluent_shield_question_24_filled": 61219, - "ic_fluent_shield_question_32_filled": 61220 + "ic_fluent_shield_question_32_filled": 61220, + "ic_fluent_heart_broken_24_filled": 61221, + "ic_fluent_layer_diagonal_20_filled": 61222, + "ic_fluent_layer_diagonal_person_20_filled": 61223, + "ic_fluent_text_wrap_16_filled": 61224, + "ic_fluent_text_wrap_off_16_filled": 61225, + "ic_fluent_text_wrap_off_20_filled": 61226, + "ic_fluent_text_wrap_off_24_filled": 61227, + "ic_fluent_trophy_lock_16_filled": 61228, + "ic_fluent_trophy_lock_20_filled": 61229, + "ic_fluent_trophy_lock_24_filled": 61230, + "ic_fluent_trophy_lock_28_filled": 61231, + "ic_fluent_trophy_lock_32_filled": 61232, + "ic_fluent_trophy_lock_48_filled": 61233, + "ic_fluent_arrow_repeat_1_16_filled": 61234, + "ic_fluent_arrow_repeat_1_20_filled": 61235, + "ic_fluent_arrow_repeat_1_24_filled": 61236, + "ic_fluent_arrow_shuffle_16_filled": 61237, + "ic_fluent_arrow_shuffle_20_filled": 61238, + "ic_fluent_arrow_shuffle_24_filled": 61239, + "ic_fluent_arrow_shuffle_28_filled": 61240, + "ic_fluent_arrow_shuffle_32_filled": 61241, + "ic_fluent_arrow_shuffle_48_filled": 61242, + "ic_fluent_arrow_shuffle_off_16_filled": 61243, + "ic_fluent_arrow_shuffle_off_20_filled": 61244, + "ic_fluent_arrow_shuffle_off_24_filled": 61245, + "ic_fluent_arrow_shuffle_off_28_filled": 61246, + "ic_fluent_arrow_shuffle_off_32_filled": 61247, + "ic_fluent_arrow_shuffle_off_48_filled": 61248, + "ic_fluent_building_desktop_16_filled": 61249, + "ic_fluent_building_desktop_20_filled": 61250, + "ic_fluent_building_desktop_24_filled": 61251, + "ic_fluent_calendar_empty_48_filled": 61252, + "ic_fluent_calendar_lock_16_filled": 61253, + "ic_fluent_calendar_lock_20_filled": 61254, + "ic_fluent_calendar_lock_24_filled": 61255, + "ic_fluent_calendar_lock_28_filled": 61256, + "ic_fluent_calendar_lock_32_filled": 61257, + "ic_fluent_calendar_lock_48_filled": 61258, + "ic_fluent_calendar_settings_24_filled": 61259, + "ic_fluent_calendar_settings_28_filled": 61260, + "ic_fluent_calendar_settings_32_filled": 61261, + "ic_fluent_calendar_settings_48_filled": 61262, + "ic_fluent_call_12_filled": 61263, + "ic_fluent_call_missed_12_filled": 61264, + "ic_fluent_chat_add_16_filled": 61265, + "ic_fluent_chat_add_20_filled": 61266, + "ic_fluent_chat_add_24_filled": 61267, + "ic_fluent_chat_add_28_filled": 61268, + "ic_fluent_chat_add_32_filled": 61269, + "ic_fluent_chat_add_48_filled": 61270, + "ic_fluent_chat_cursor_16_filled": 61271, + "ic_fluent_chat_cursor_20_filled": 61272, + "ic_fluent_chat_cursor_24_filled": 61273, + "ic_fluent_chat_empty_12_filled": 61274, + "ic_fluent_chat_empty_16_filled": 61275, + "ic_fluent_chat_empty_20_filled": 61276, + "ic_fluent_chat_empty_24_filled": 61277, + "ic_fluent_chat_empty_28_filled": 61278, + "ic_fluent_chat_empty_32_filled": 61279, + "ic_fluent_chat_empty_48_filled": 61280, + "ic_fluent_circle_image_16_filled": 61281, + "ic_fluent_circle_image_24_filled": 61282, + "ic_fluent_circle_image_28_filled": 61283, + "ic_fluent_code_text_16_filled": 61284, + "ic_fluent_desktop_checkmark_16_filled": 61285, + "ic_fluent_desktop_checkmark_20_filled": 61286, + "ic_fluent_desktop_checkmark_24_filled": 61287, + "ic_fluent_fire_16_filled": 61288, + "ic_fluent_fire_20_filled": 61289, + "ic_fluent_fire_24_filled": 61290, + "ic_fluent_hourglass_20_filled": 61291, + "ic_fluent_hourglass_24_filled": 61292, + "ic_fluent_hourglass_half_20_filled": 61293, + "ic_fluent_hourglass_half_24_filled": 61294, + "ic_fluent_hourglass_one_quarter_20_filled": 61295, + "ic_fluent_hourglass_one_quarter_24_filled": 61296, + "ic_fluent_hourglass_three_quarter_20_filled": 61297, + "ic_fluent_hourglass_three_quarter_24_filled": 61298, + "ic_fluent_ink_stroke_arrow_down_20_filled": 61299, + "ic_fluent_ink_stroke_arrow_down_24_filled": 61300, + "ic_fluent_ink_stroke_arrow_up_down_20_filled": 61301, + "ic_fluent_ink_stroke_arrow_up_down_24_filled": 61302, + "ic_fluent_megaphone_circle_20_filled": 61303, + "ic_fluent_megaphone_circle_24_filled": 61304, + "ic_fluent_number_circle_2_16_filled": 61305, + "ic_fluent_number_circle_2_20_filled": 61306, + "ic_fluent_number_circle_2_24_filled": 61307, + "ic_fluent_number_circle_2_28_filled": 61308, + "ic_fluent_number_circle_2_32_filled": 61309, + "ic_fluent_number_circle_2_48_filled": 61310, + "ic_fluent_number_circle_3_16_filled": 61311, + "ic_fluent_number_circle_3_20_filled": 61312, + "ic_fluent_number_circle_3_24_filled": 61313, + "ic_fluent_number_circle_3_28_filled": 61314, + "ic_fluent_number_circle_3_32_filled": 61315, + "ic_fluent_number_circle_3_48_filled": 61316, + "ic_fluent_number_circle_4_16_filled": 61317, + "ic_fluent_number_circle_4_20_filled": 61318, + "ic_fluent_number_circle_4_24_filled": 61319, + "ic_fluent_number_circle_4_28_filled": 61320, + "ic_fluent_number_circle_4_32_filled": 61321, + "ic_fluent_number_circle_4_48_filled": 61322, + "ic_fluent_number_circle_5_16_filled": 61323, + "ic_fluent_number_circle_5_20_filled": 61324, + "ic_fluent_number_circle_5_24_filled": 61325, + "ic_fluent_number_circle_5_28_filled": 61326, + "ic_fluent_number_circle_5_32_filled": 61327, + "ic_fluent_number_circle_5_48_filled": 61328, + "ic_fluent_person_alert_16_filled": 61329, + "ic_fluent_person_alert_20_filled": 61330, + "ic_fluent_person_alert_24_filled": 61331, + "ic_fluent_person_arrow_back_16_filled": 61332, + "ic_fluent_person_arrow_back_20_filled": 61333, + "ic_fluent_person_arrow_back_24_filled": 61334, + "ic_fluent_person_arrow_back_28_filled": 61335, + "ic_fluent_person_arrow_back_32_filled": 61336, + "ic_fluent_person_arrow_back_48_filled": 61337, + "ic_fluent_person_link_16_filled": 61338, + "ic_fluent_person_link_20_filled": 61339, + "ic_fluent_person_link_24_filled": 61340, + "ic_fluent_person_link_28_filled": 61341, + "ic_fluent_person_link_32_filled": 61342, + "ic_fluent_person_link_48_filled": 61343, + "ic_fluent_phone_28_filled": 61344, + "ic_fluent_phone_32_filled": 61345, + "ic_fluent_phone_48_filled": 61346, + "ic_fluent_phone_chat_16_filled": 61347, + "ic_fluent_phone_chat_20_filled": 61348, + "ic_fluent_phone_chat_24_filled": 61349, + "ic_fluent_phone_chat_28_filled": 61350, + "ic_fluent_premium_12_filled": 61351, + "ic_fluent_shield_add_16_filled": 61352, + "ic_fluent_shield_add_20_filled": 61353, + "ic_fluent_shield_add_24_filled": 61354, + "ic_fluent_sparkle_circle_20_filled": 61355, + "ic_fluent_sparkle_circle_24_filled": 61356, + "ic_fluent_task_list_square_ltr_16_filled": 61357, + "ic_fluent_task_list_square_rtl_16_filled": 61358, + "ic_fluent_text_bullet_list_ltr_rotate_90_20_filled": 61359, + "ic_fluent_text_bullet_list_rtl_rotate_90_20_filled": 61360, + "ic_fluent_text_direction_horizontal_ltr_20_filled": 61361, + "ic_fluent_text_direction_horizontal_ltr_24_filled": 61362, + "ic_fluent_text_direction_horizontal_rtl_20_filled": 61363, + "ic_fluent_text_direction_horizontal_rtl_24_filled": 61364, + "ic_fluent_text_direction_rotate_90_ltr_20_filled": 61365, + "ic_fluent_text_direction_rotate_90_ltr_24_filled": 61366, + "ic_fluent_text_direction_rotate_90_rtl_20_filled": 61367, + "ic_fluent_text_direction_rotate_90_rtl_24_filled": 61368 } diff --git a/src/Wpf.Ui.FontMapper/FluentSystemIcons-Regular.json b/src/Wpf.Ui.FontMapper/FluentSystemIcons-Regular.json index 9a6de9a60..8626d60f0 100644 --- a/src/Wpf.Ui.FontMapper/FluentSystemIcons-Regular.json +++ b/src/Wpf.Ui.FontMapper/FluentSystemIcons-Regular.json @@ -5837,5 +5837,153 @@ "ic_fluent_shield_question_16_regular": 61217, "ic_fluent_shield_question_20_regular": 61218, "ic_fluent_shield_question_24_regular": 61219, - "ic_fluent_shield_question_32_regular": 61220 + "ic_fluent_shield_question_32_regular": 61220, + "ic_fluent_heart_broken_24_regular": 61221, + "ic_fluent_layer_diagonal_20_regular": 61222, + "ic_fluent_layer_diagonal_person_20_regular": 61223, + "ic_fluent_text_wrap_16_regular": 61224, + "ic_fluent_text_wrap_off_16_regular": 61225, + "ic_fluent_text_wrap_off_20_regular": 61226, + "ic_fluent_text_wrap_off_24_regular": 61227, + "ic_fluent_trophy_lock_16_regular": 61228, + "ic_fluent_trophy_lock_20_regular": 61229, + "ic_fluent_trophy_lock_24_regular": 61230, + "ic_fluent_trophy_lock_28_regular": 61231, + "ic_fluent_trophy_lock_32_regular": 61232, + "ic_fluent_trophy_lock_48_regular": 61233, + "ic_fluent_arrow_repeat_1_16_regular": 61234, + "ic_fluent_arrow_repeat_1_20_regular": 61235, + "ic_fluent_arrow_repeat_1_24_regular": 61236, + "ic_fluent_arrow_shuffle_16_regular": 61237, + "ic_fluent_arrow_shuffle_20_regular": 61238, + "ic_fluent_arrow_shuffle_24_regular": 61239, + "ic_fluent_arrow_shuffle_28_regular": 61240, + "ic_fluent_arrow_shuffle_32_regular": 61241, + "ic_fluent_arrow_shuffle_48_regular": 61242, + "ic_fluent_arrow_shuffle_off_16_regular": 61243, + "ic_fluent_arrow_shuffle_off_20_regular": 61244, + "ic_fluent_arrow_shuffle_off_24_regular": 61245, + "ic_fluent_arrow_shuffle_off_28_regular": 61246, + "ic_fluent_arrow_shuffle_off_32_regular": 61247, + "ic_fluent_arrow_shuffle_off_48_regular": 61248, + "ic_fluent_building_desktop_16_regular": 61249, + "ic_fluent_building_desktop_20_regular": 61250, + "ic_fluent_building_desktop_24_regular": 61251, + "ic_fluent_calendar_empty_48_regular": 61252, + "ic_fluent_calendar_lock_16_regular": 61253, + "ic_fluent_calendar_lock_20_regular": 61254, + "ic_fluent_calendar_lock_24_regular": 61255, + "ic_fluent_calendar_lock_28_regular": 61256, + "ic_fluent_calendar_lock_32_regular": 61257, + "ic_fluent_calendar_lock_48_regular": 61258, + "ic_fluent_calendar_settings_24_regular": 61259, + "ic_fluent_calendar_settings_28_regular": 61260, + "ic_fluent_calendar_settings_32_regular": 61261, + "ic_fluent_calendar_settings_48_regular": 61262, + "ic_fluent_call_12_regular": 61263, + "ic_fluent_call_missed_12_regular": 61264, + "ic_fluent_chat_add_16_regular": 61265, + "ic_fluent_chat_add_20_regular": 61266, + "ic_fluent_chat_add_24_regular": 61267, + "ic_fluent_chat_add_28_regular": 61268, + "ic_fluent_chat_add_32_regular": 61269, + "ic_fluent_chat_add_48_regular": 61270, + "ic_fluent_chat_cursor_16_regular": 61271, + "ic_fluent_chat_cursor_20_regular": 61272, + "ic_fluent_chat_cursor_24_regular": 61273, + "ic_fluent_chat_empty_12_regular": 61274, + "ic_fluent_chat_empty_16_regular": 61275, + "ic_fluent_chat_empty_20_regular": 61276, + "ic_fluent_chat_empty_24_regular": 61277, + "ic_fluent_chat_empty_28_regular": 61278, + "ic_fluent_chat_empty_32_regular": 61279, + "ic_fluent_chat_empty_48_regular": 61280, + "ic_fluent_circle_image_16_regular": 61281, + "ic_fluent_circle_image_24_regular": 61282, + "ic_fluent_circle_image_28_regular": 61283, + "ic_fluent_code_text_16_regular": 61284, + "ic_fluent_desktop_checkmark_16_regular": 61285, + "ic_fluent_desktop_checkmark_20_regular": 61286, + "ic_fluent_desktop_checkmark_24_regular": 61287, + "ic_fluent_fire_16_regular": 61288, + "ic_fluent_fire_20_regular": 61289, + "ic_fluent_fire_24_regular": 61290, + "ic_fluent_hourglass_20_regular": 61291, + "ic_fluent_hourglass_24_regular": 61292, + "ic_fluent_hourglass_half_20_regular": 61293, + "ic_fluent_hourglass_half_24_regular": 61294, + "ic_fluent_hourglass_one_quarter_20_regular": 61295, + "ic_fluent_hourglass_one_quarter_24_regular": 61296, + "ic_fluent_hourglass_three_quarter_20_regular": 61297, + "ic_fluent_hourglass_three_quarter_24_regular": 61298, + "ic_fluent_ink_stroke_arrow_down_20_regular": 61299, + "ic_fluent_ink_stroke_arrow_down_24_regular": 61300, + "ic_fluent_ink_stroke_arrow_up_down_20_regular": 61301, + "ic_fluent_ink_stroke_arrow_up_down_24_regular": 61302, + "ic_fluent_megaphone_circle_20_regular": 61303, + "ic_fluent_megaphone_circle_24_regular": 61304, + "ic_fluent_number_circle_2_16_regular": 61305, + "ic_fluent_number_circle_2_20_regular": 61306, + "ic_fluent_number_circle_2_24_regular": 61307, + "ic_fluent_number_circle_2_28_regular": 61308, + "ic_fluent_number_circle_2_32_regular": 61309, + "ic_fluent_number_circle_2_48_regular": 61310, + "ic_fluent_number_circle_3_16_regular": 61311, + "ic_fluent_number_circle_3_20_regular": 61312, + "ic_fluent_number_circle_3_24_regular": 61313, + "ic_fluent_number_circle_3_28_regular": 61314, + "ic_fluent_number_circle_3_32_regular": 61315, + "ic_fluent_number_circle_3_48_regular": 61316, + "ic_fluent_number_circle_4_16_regular": 61317, + "ic_fluent_number_circle_4_20_regular": 61318, + "ic_fluent_number_circle_4_24_regular": 61319, + "ic_fluent_number_circle_4_28_regular": 61320, + "ic_fluent_number_circle_4_32_regular": 61321, + "ic_fluent_number_circle_4_48_regular": 61322, + "ic_fluent_number_circle_5_16_regular": 61323, + "ic_fluent_number_circle_5_20_regular": 61324, + "ic_fluent_number_circle_5_24_regular": 61325, + "ic_fluent_number_circle_5_28_regular": 61326, + "ic_fluent_number_circle_5_32_regular": 61327, + "ic_fluent_number_circle_5_48_regular": 61328, + "ic_fluent_person_alert_16_regular": 61329, + "ic_fluent_person_alert_20_regular": 61330, + "ic_fluent_person_alert_24_regular": 61331, + "ic_fluent_person_arrow_back_16_regular": 61332, + "ic_fluent_person_arrow_back_20_regular": 61333, + "ic_fluent_person_arrow_back_24_regular": 61334, + "ic_fluent_person_arrow_back_28_regular": 61335, + "ic_fluent_person_arrow_back_32_regular": 61336, + "ic_fluent_person_arrow_back_48_regular": 61337, + "ic_fluent_person_link_16_regular": 61338, + "ic_fluent_person_link_20_regular": 61339, + "ic_fluent_person_link_24_regular": 61340, + "ic_fluent_person_link_28_regular": 61341, + "ic_fluent_person_link_32_regular": 61342, + "ic_fluent_person_link_48_regular": 61343, + "ic_fluent_phone_28_regular": 61344, + "ic_fluent_phone_32_regular": 61345, + "ic_fluent_phone_48_regular": 61346, + "ic_fluent_phone_chat_16_regular": 61347, + "ic_fluent_phone_chat_20_regular": 61348, + "ic_fluent_phone_chat_24_regular": 61349, + "ic_fluent_phone_chat_28_regular": 61350, + "ic_fluent_premium_12_regular": 61351, + "ic_fluent_shield_add_16_regular": 61352, + "ic_fluent_shield_add_20_regular": 61353, + "ic_fluent_shield_add_24_regular": 61354, + "ic_fluent_sparkle_circle_20_regular": 61355, + "ic_fluent_sparkle_circle_24_regular": 61356, + "ic_fluent_task_list_square_ltr_16_regular": 61357, + "ic_fluent_task_list_square_rtl_16_regular": 61358, + "ic_fluent_text_bullet_list_ltr_rotate_90_20_regular": 61359, + "ic_fluent_text_bullet_list_rtl_rotate_90_20_regular": 61360, + "ic_fluent_text_direction_horizontal_ltr_20_regular": 61361, + "ic_fluent_text_direction_horizontal_ltr_24_regular": 61362, + "ic_fluent_text_direction_horizontal_rtl_20_regular": 61363, + "ic_fluent_text_direction_horizontal_rtl_24_regular": 61364, + "ic_fluent_text_direction_rotate_90_ltr_20_regular": 61365, + "ic_fluent_text_direction_rotate_90_ltr_24_regular": 61366, + "ic_fluent_text_direction_rotate_90_rtl_20_regular": 61367, + "ic_fluent_text_direction_rotate_90_rtl_24_regular": 61368 } diff --git a/src/Wpf.Ui.FontMapper/FluentSystemIcons-Resizable.json b/src/Wpf.Ui.FontMapper/FluentSystemIcons-Resizable.json deleted file mode 100644 index 1f31ad665..000000000 --- a/src/Wpf.Ui.FontMapper/FluentSystemIcons-Resizable.json +++ /dev/null @@ -1,4055 +0,0 @@ -{ - "ic_fluent_access_time_20_filled": 57344, - "ic_fluent_access_time_20_regular": 57345, - "ic_fluent_accessibility_20_filled": 57346, - "ic_fluent_accessibility_20_regular": 57347, - "ic_fluent_accessibility_checkmark_20_filled": 57348, - "ic_fluent_accessibility_checkmark_20_regular": 57349, - "ic_fluent_add_20_filled": 57350, - "ic_fluent_add_20_regular": 57351, - "ic_fluent_add_circle_20_filled": 57352, - "ic_fluent_add_circle_20_regular": 57353, - "ic_fluent_add_square_20_filled": 57354, - "ic_fluent_add_square_20_regular": 57355, - "ic_fluent_add_square_multiple_20_filled": 57356, - "ic_fluent_add_square_multiple_20_regular": 57357, - "ic_fluent_add_subtract_circle_20_filled": 57358, - "ic_fluent_add_subtract_circle_20_regular": 57359, - "ic_fluent_airplane_20_filled": 57360, - "ic_fluent_airplane_20_regular": 57361, - "ic_fluent_airplane_take_off_20_filled": 57362, - "ic_fluent_airplane_take_off_20_regular": 57363, - "ic_fluent_album_20_filled": 57364, - "ic_fluent_album_20_regular": 57365, - "ic_fluent_album_add_20_filled": 57366, - "ic_fluent_album_add_20_regular": 57367, - "ic_fluent_alert_20_filled": 57368, - "ic_fluent_alert_20_regular": 57369, - "ic_fluent_alert_badge_20_filled": 57370, - "ic_fluent_alert_badge_20_regular": 57371, - "ic_fluent_alert_off_20_filled": 57372, - "ic_fluent_alert_off_20_regular": 57373, - "ic_fluent_alert_on_20_filled": 57374, - "ic_fluent_alert_on_20_regular": 57375, - "ic_fluent_alert_snooze_20_filled": 57376, - "ic_fluent_alert_snooze_20_regular": 57377, - "ic_fluent_alert_urgent_20_filled": 57378, - "ic_fluent_alert_urgent_20_regular": 57379, - "ic_fluent_align_bottom_20_filled": 57380, - "ic_fluent_align_bottom_20_regular": 57381, - "ic_fluent_align_center_horizontal_20_filled": 57382, - "ic_fluent_align_center_horizontal_20_regular": 57383, - "ic_fluent_align_center_vertical_20_filled": 57384, - "ic_fluent_align_center_vertical_20_regular": 57385, - "ic_fluent_align_end_horizontal_20_filled": 57386, - "ic_fluent_align_end_horizontal_20_regular": 57387, - "ic_fluent_align_end_vertical_20_filled": 57388, - "ic_fluent_align_end_vertical_20_regular": 57389, - "ic_fluent_align_left_20_filled": 57390, - "ic_fluent_align_left_20_regular": 57391, - "ic_fluent_align_right_20_filled": 57392, - "ic_fluent_align_right_20_regular": 57393, - "ic_fluent_align_space_around_horizontal_20_filled": 57394, - "ic_fluent_align_space_around_horizontal_20_regular": 57395, - "ic_fluent_align_space_around_vertical_20_filled": 57396, - "ic_fluent_align_space_around_vertical_20_regular": 57397, - "ic_fluent_align_space_between_horizontal_20_filled": 57398, - "ic_fluent_align_space_between_horizontal_20_regular": 57399, - "ic_fluent_align_space_between_vertical_20_filled": 57400, - "ic_fluent_align_space_between_vertical_20_regular": 57401, - "ic_fluent_align_space_evenly_horizontal_20_filled": 57402, - "ic_fluent_align_space_evenly_horizontal_20_regular": 57403, - "ic_fluent_align_space_evenly_vertical_20_filled": 57404, - "ic_fluent_align_space_evenly_vertical_20_regular": 57405, - "ic_fluent_align_space_fit_vertical_20_filled": 57406, - "ic_fluent_align_space_fit_vertical_20_regular": 57407, - "ic_fluent_align_start_horizontal_20_filled": 57408, - "ic_fluent_align_start_horizontal_20_regular": 57409, - "ic_fluent_align_start_vertical_20_filled": 57410, - "ic_fluent_align_start_vertical_20_regular": 57411, - "ic_fluent_align_stretch_horizontal_20_filled": 57412, - "ic_fluent_align_stretch_horizontal_20_regular": 57413, - "ic_fluent_align_stretch_vertical_20_filled": 57414, - "ic_fluent_align_stretch_vertical_20_regular": 57415, - "ic_fluent_align_top_20_filled": 57416, - "ic_fluent_align_top_20_regular": 57417, - "ic_fluent_animal_cat_20_filled": 57418, - "ic_fluent_animal_cat_20_regular": 57419, - "ic_fluent_animal_dog_20_filled": 57420, - "ic_fluent_animal_dog_20_regular": 57421, - "ic_fluent_animal_rabbit_20_filled": 57422, - "ic_fluent_animal_rabbit_20_regular": 57423, - "ic_fluent_animal_rabbit_off_20_filled": 57424, - "ic_fluent_animal_rabbit_off_20_regular": 57425, - "ic_fluent_animal_turtle_20_filled": 57426, - "ic_fluent_animal_turtle_20_regular": 57427, - "ic_fluent_app_folder_20_filled": 57428, - "ic_fluent_app_folder_20_regular": 57429, - "ic_fluent_app_generic_20_filled": 57430, - "ic_fluent_app_generic_20_regular": 57431, - "ic_fluent_app_recent_20_filled": 57432, - "ic_fluent_app_recent_20_regular": 57433, - "ic_fluent_app_title_20_filled": 57434, - "ic_fluent_app_title_20_regular": 57435, - "ic_fluent_approvals_app_20_filled": 57436, - "ic_fluent_approvals_app_20_regular": 57437, - "ic_fluent_apps_20_filled": 57438, - "ic_fluent_apps_20_regular": 57439, - "ic_fluent_apps_add_in_20_filled": 57440, - "ic_fluent_apps_add_in_20_regular": 57441, - "ic_fluent_apps_list_20_filled": 57442, - "ic_fluent_apps_list_20_regular": 57443, - "ic_fluent_apps_list_detail_20_filled": 57444, - "ic_fluent_apps_list_detail_20_regular": 57445, - "ic_fluent_archive_20_filled": 57446, - "ic_fluent_archive_20_regular": 57447, - "ic_fluent_archive_arrow_back_20_filled": 57448, - "ic_fluent_archive_arrow_back_20_regular": 57449, - "ic_fluent_archive_multiple_20_filled": 57450, - "ic_fluent_archive_multiple_20_regular": 57451, - "ic_fluent_archive_settings_20_filled": 57452, - "ic_fluent_archive_settings_20_regular": 57453, - "ic_fluent_arrow_autofit_content_20_filled": 57454, - "ic_fluent_arrow_autofit_content_20_regular": 57455, - "ic_fluent_arrow_autofit_down_20_filled": 57456, - "ic_fluent_arrow_autofit_down_20_regular": 57457, - "ic_fluent_arrow_autofit_height_20_filled": 57458, - "ic_fluent_arrow_autofit_height_20_regular": 57459, - "ic_fluent_arrow_autofit_height_dotted_20_filled": 57460, - "ic_fluent_arrow_autofit_height_dotted_20_regular": 57461, - "ic_fluent_arrow_autofit_up_20_filled": 57462, - "ic_fluent_arrow_autofit_up_20_regular": 57463, - "ic_fluent_arrow_autofit_width_20_filled": 57464, - "ic_fluent_arrow_autofit_width_20_regular": 57465, - "ic_fluent_arrow_autofit_width_dotted_20_filled": 57466, - "ic_fluent_arrow_autofit_width_dotted_20_regular": 57467, - "ic_fluent_arrow_between_down_20_filled": 57468, - "ic_fluent_arrow_between_down_20_regular": 57469, - "ic_fluent_arrow_between_up_20_filled": 57470, - "ic_fluent_arrow_between_up_20_regular": 57471, - "ic_fluent_arrow_bidirectional_up_down_20_filled": 57472, - "ic_fluent_arrow_bidirectional_up_down_20_regular": 57473, - "ic_fluent_arrow_bounce_20_filled": 57474, - "ic_fluent_arrow_bounce_20_regular": 57475, - "ic_fluent_arrow_circle_down_20_filled": 57476, - "ic_fluent_arrow_circle_down_20_regular": 57477, - "ic_fluent_arrow_circle_down_double_20_filled": 57478, - "ic_fluent_arrow_circle_down_double_20_regular": 57479, - "ic_fluent_arrow_circle_down_right_20_filled": 57480, - "ic_fluent_arrow_circle_down_right_20_regular": 57481, - "ic_fluent_arrow_circle_down_split_20_filled": 57482, - "ic_fluent_arrow_circle_down_split_20_regular": 57483, - "ic_fluent_arrow_circle_down_up_20_filled": 57484, - "ic_fluent_arrow_circle_down_up_20_regular": 57485, - "ic_fluent_arrow_circle_left_20_filled": 57486, - "ic_fluent_arrow_circle_left_20_regular": 57487, - "ic_fluent_arrow_circle_right_20_filled": 57488, - "ic_fluent_arrow_circle_right_20_regular": 57489, - "ic_fluent_arrow_circle_up_20_filled": 57490, - "ic_fluent_arrow_circle_up_20_regular": 57491, - "ic_fluent_arrow_circle_up_left_20_filled": 57492, - "ic_fluent_arrow_circle_up_left_20_regular": 57493, - "ic_fluent_arrow_clockwise_20_filled": 57494, - "ic_fluent_arrow_clockwise_20_regular": 57495, - "ic_fluent_arrow_clockwise_dashes_20_filled": 57496, - "ic_fluent_arrow_clockwise_dashes_20_regular": 57497, - "ic_fluent_arrow_collapse_all_20_filled": 57498, - "ic_fluent_arrow_collapse_all_20_regular": 57499, - "ic_fluent_arrow_counterclockwise_20_filled": 57500, - "ic_fluent_arrow_counterclockwise_20_regular": 57501, - "ic_fluent_arrow_counterclockwise_dashes_20_filled": 57502, - "ic_fluent_arrow_counterclockwise_dashes_20_regular": 57503, - "ic_fluent_arrow_curve_down_left_20_filled": 57504, - "ic_fluent_arrow_curve_down_left_20_regular": 57505, - "ic_fluent_arrow_curve_down_right_20_filled": 57506, - "ic_fluent_arrow_curve_down_right_20_regular": 57507, - "ic_fluent_arrow_curve_up_left_20_filled": 57508, - "ic_fluent_arrow_curve_up_left_20_regular": 57509, - "ic_fluent_arrow_curve_up_right_20_filled": 57510, - "ic_fluent_arrow_curve_up_right_20_regular": 57511, - "ic_fluent_arrow_down_20_filled": 57512, - "ic_fluent_arrow_down_20_regular": 57513, - "ic_fluent_arrow_down_left_20_filled": 57514, - "ic_fluent_arrow_down_left_20_regular": 57515, - "ic_fluent_arrow_download_20_filled": 57516, - "ic_fluent_arrow_download_20_regular": 57517, - "ic_fluent_arrow_eject_20_filled": 57518, - "ic_fluent_arrow_eject_20_regular": 57519, - "ic_fluent_arrow_enter_20_filled": 57520, - "ic_fluent_arrow_enter_20_regular": 57521, - "ic_fluent_arrow_enter_left_20_filled": 57522, - "ic_fluent_arrow_enter_left_20_regular": 57523, - "ic_fluent_arrow_enter_up_20_filled": 57524, - "ic_fluent_arrow_enter_up_20_regular": 57525, - "ic_fluent_arrow_exit_20_filled": 57526, - "ic_fluent_arrow_exit_20_regular": 57527, - "ic_fluent_arrow_expand_20_filled": 57528, - "ic_fluent_arrow_expand_20_regular": 57529, - "ic_fluent_arrow_export_ltr_20_filled": 57530, - "ic_fluent_arrow_export_ltr_20_regular": 57531, - "ic_fluent_arrow_export_rtl_20_filled": 57532, - "ic_fluent_arrow_export_rtl_20_regular": 57533, - "ic_fluent_arrow_export_up_20_filled": 57534, - "ic_fluent_arrow_export_up_20_regular": 57535, - "ic_fluent_arrow_fit_20_filled": 57536, - "ic_fluent_arrow_fit_20_regular": 57537, - "ic_fluent_arrow_fit_in_20_filled": 57538, - "ic_fluent_arrow_fit_in_20_regular": 57539, - "ic_fluent_arrow_forward_20_filled": 57540, - "ic_fluent_arrow_forward_20_regular": 57541, - "ic_fluent_arrow_forward_down_lightning_20_filled": 57542, - "ic_fluent_arrow_forward_down_lightning_20_regular": 57543, - "ic_fluent_arrow_forward_down_person_20_filled": 57544, - "ic_fluent_arrow_forward_down_person_20_regular": 57545, - "ic_fluent_arrow_hook_down_left_20_filled": 57546, - "ic_fluent_arrow_hook_down_left_20_regular": 57547, - "ic_fluent_arrow_hook_down_right_20_filled": 57548, - "ic_fluent_arrow_hook_down_right_20_regular": 57549, - "ic_fluent_arrow_hook_up_left_20_filled": 57550, - "ic_fluent_arrow_hook_up_left_20_regular": 57551, - "ic_fluent_arrow_hook_up_right_20_filled": 57552, - "ic_fluent_arrow_hook_up_right_20_regular": 57553, - "ic_fluent_arrow_import_20_filled": 57554, - "ic_fluent_arrow_import_20_regular": 57555, - "ic_fluent_arrow_join_20_filled": 57556, - "ic_fluent_arrow_join_20_regular": 57557, - "ic_fluent_arrow_left_20_filled": 57558, - "ic_fluent_arrow_left_20_regular": 57559, - "ic_fluent_arrow_maximize_20_filled": 57560, - "ic_fluent_arrow_maximize_20_regular": 57561, - "ic_fluent_arrow_maximize_vertical_20_filled": 57562, - "ic_fluent_arrow_maximize_vertical_20_regular": 57563, - "ic_fluent_arrow_minimize_20_filled": 57564, - "ic_fluent_arrow_minimize_20_regular": 57565, - "ic_fluent_arrow_minimize_vertical_20_filled": 57566, - "ic_fluent_arrow_minimize_vertical_20_regular": 57567, - "ic_fluent_arrow_move_20_filled": 57568, - "ic_fluent_arrow_move_20_regular": 57569, - "ic_fluent_arrow_move_inward_20_filled": 57570, - "ic_fluent_arrow_move_inward_20_regular": 57571, - "ic_fluent_arrow_next_20_filled": 57572, - "ic_fluent_arrow_next_20_regular": 57573, - "ic_fluent_arrow_outline_up_right_20_filled": 57574, - "ic_fluent_arrow_outline_up_right_20_regular": 57575, - "ic_fluent_arrow_paragraph_20_filled": 57576, - "ic_fluent_arrow_paragraph_20_regular": 57577, - "ic_fluent_arrow_previous_20_filled": 57578, - "ic_fluent_arrow_previous_20_regular": 57579, - "ic_fluent_arrow_redo_20_filled": 57580, - "ic_fluent_arrow_redo_20_regular": 57581, - "ic_fluent_arrow_repeat_all_20_filled": 57582, - "ic_fluent_arrow_repeat_all_20_regular": 57583, - "ic_fluent_arrow_repeat_all_off_20_filled": 57584, - "ic_fluent_arrow_repeat_all_off_20_regular": 57585, - "ic_fluent_arrow_reply_20_filled": 57586, - "ic_fluent_arrow_reply_20_regular": 57587, - "ic_fluent_arrow_reply_all_20_filled": 57588, - "ic_fluent_arrow_reply_all_20_regular": 57589, - "ic_fluent_arrow_reply_down_20_filled": 57590, - "ic_fluent_arrow_reply_down_20_regular": 57591, - "ic_fluent_arrow_reset_20_filled": 57592, - "ic_fluent_arrow_reset_20_regular": 57593, - "ic_fluent_arrow_right_20_filled": 57594, - "ic_fluent_arrow_right_20_regular": 57595, - "ic_fluent_arrow_rotate_clockwise_20_filled": 57596, - "ic_fluent_arrow_rotate_clockwise_20_regular": 57597, - "ic_fluent_arrow_rotate_counterclockwise_20_filled": 57598, - "ic_fluent_arrow_rotate_counterclockwise_20_regular": 57599, - "ic_fluent_arrow_routing_20_filled": 57600, - "ic_fluent_arrow_routing_20_regular": 57601, - "ic_fluent_arrow_routing_rectangle_multiple_20_filled": 57602, - "ic_fluent_arrow_routing_rectangle_multiple_20_regular": 57603, - "ic_fluent_arrow_sort_20_filled": 57604, - "ic_fluent_arrow_sort_20_regular": 57605, - "ic_fluent_arrow_sort_down_20_filled": 57606, - "ic_fluent_arrow_sort_down_20_regular": 57607, - "ic_fluent_arrow_sort_down_lines_20_filled": 57608, - "ic_fluent_arrow_sort_down_lines_20_regular": 57609, - "ic_fluent_arrow_sort_up_20_filled": 57610, - "ic_fluent_arrow_sort_up_20_regular": 57611, - "ic_fluent_arrow_split_20_filled": 57612, - "ic_fluent_arrow_split_20_regular": 57613, - "ic_fluent_arrow_square_down_20_filled": 57614, - "ic_fluent_arrow_square_down_20_regular": 57615, - "ic_fluent_arrow_step_back_20_filled": 57616, - "ic_fluent_arrow_step_back_20_regular": 57617, - "ic_fluent_arrow_step_in_20_filled": 57618, - "ic_fluent_arrow_step_in_20_regular": 57619, - "ic_fluent_arrow_step_in_left_20_filled": 57620, - "ic_fluent_arrow_step_in_left_20_regular": 57621, - "ic_fluent_arrow_step_in_right_20_filled": 57622, - "ic_fluent_arrow_step_in_right_20_regular": 57623, - "ic_fluent_arrow_step_out_20_filled": 57624, - "ic_fluent_arrow_step_out_20_regular": 57625, - "ic_fluent_arrow_step_over_20_filled": 57626, - "ic_fluent_arrow_step_over_20_regular": 57627, - "ic_fluent_arrow_swap_20_filled": 57628, - "ic_fluent_arrow_swap_20_regular": 57629, - "ic_fluent_arrow_sync_20_filled": 57630, - "ic_fluent_arrow_sync_20_regular": 57631, - "ic_fluent_arrow_sync_checkmark_20_filled": 57632, - "ic_fluent_arrow_sync_checkmark_20_regular": 57633, - "ic_fluent_arrow_sync_circle_20_filled": 57634, - "ic_fluent_arrow_sync_circle_20_regular": 57635, - "ic_fluent_arrow_sync_dismiss_20_filled": 57636, - "ic_fluent_arrow_sync_dismiss_20_regular": 57637, - "ic_fluent_arrow_sync_off_20_filled": 57638, - "ic_fluent_arrow_sync_off_20_regular": 57639, - "ic_fluent_arrow_trending_20_filled": 57640, - "ic_fluent_arrow_trending_20_regular": 57641, - "ic_fluent_arrow_trending_checkmark_20_filled": 57642, - "ic_fluent_arrow_trending_checkmark_20_regular": 57643, - "ic_fluent_arrow_trending_down_20_filled": 57644, - "ic_fluent_arrow_trending_down_20_regular": 57645, - "ic_fluent_arrow_trending_lines_20_filled": 57646, - "ic_fluent_arrow_trending_lines_20_regular": 57647, - "ic_fluent_arrow_trending_settings_20_filled": 57648, - "ic_fluent_arrow_trending_settings_20_regular": 57649, - "ic_fluent_arrow_trending_text_20_filled": 57650, - "ic_fluent_arrow_trending_text_20_regular": 57651, - "ic_fluent_arrow_trending_wrench_20_filled": 57652, - "ic_fluent_arrow_trending_wrench_20_regular": 57653, - "ic_fluent_arrow_turn_bidirectional_down_right_20_filled": 57654, - "ic_fluent_arrow_turn_bidirectional_down_right_20_regular": 57655, - "ic_fluent_arrow_turn_right_20_filled": 57656, - "ic_fluent_arrow_turn_right_20_regular": 57657, - "ic_fluent_arrow_undo_20_filled": 57658, - "ic_fluent_arrow_undo_20_regular": 57659, - "ic_fluent_arrow_up_20_filled": 57660, - "ic_fluent_arrow_up_20_regular": 57661, - "ic_fluent_arrow_up_left_20_filled": 57662, - "ic_fluent_arrow_up_left_20_regular": 57663, - "ic_fluent_arrow_up_right_20_filled": 57664, - "ic_fluent_arrow_up_right_20_regular": 57665, - "ic_fluent_arrow_upload_20_filled": 57666, - "ic_fluent_arrow_upload_20_regular": 57667, - "ic_fluent_arrow_wrap_20_filled": 57668, - "ic_fluent_arrow_wrap_20_regular": 57669, - "ic_fluent_arrow_wrap_off_20_filled": 57670, - "ic_fluent_arrow_wrap_off_20_regular": 57671, - "ic_fluent_arrows_bidirectional_20_filled": 57672, - "ic_fluent_arrows_bidirectional_20_regular": 57673, - "ic_fluent_attach_20_filled": 57674, - "ic_fluent_attach_20_regular": 57675, - "ic_fluent_attach_arrow_right_20_filled": 57676, - "ic_fluent_attach_arrow_right_20_regular": 57677, - "ic_fluent_attach_text_20_filled": 57678, - "ic_fluent_attach_text_20_regular": 57679, - "ic_fluent_auto_fit_height_20_filled": 57680, - "ic_fluent_auto_fit_height_20_regular": 57681, - "ic_fluent_auto_fit_width_20_filled": 57682, - "ic_fluent_auto_fit_width_20_regular": 57683, - "ic_fluent_autocorrect_20_filled": 57684, - "ic_fluent_autocorrect_20_regular": 57685, - "ic_fluent_autosum_20_filled": 57686, - "ic_fluent_autosum_20_regular": 57687, - "ic_fluent_backpack_20_filled": 57688, - "ic_fluent_backpack_20_regular": 57689, - "ic_fluent_backpack_add_20_filled": 57690, - "ic_fluent_backpack_add_20_regular": 57691, - "ic_fluent_backspace_20_filled": 57692, - "ic_fluent_backspace_20_regular": 57693, - "ic_fluent_badge_20_filled": 57694, - "ic_fluent_badge_20_regular": 57695, - "ic_fluent_balloon_20_filled": 57696, - "ic_fluent_balloon_20_regular": 57697, - "ic_fluent_barcode_scanner_20_filled": 57698, - "ic_fluent_barcode_scanner_20_regular": 57699, - "ic_fluent_battery_0_20_filled": 57700, - "ic_fluent_battery_0_20_regular": 57701, - "ic_fluent_battery_1_20_filled": 57702, - "ic_fluent_battery_1_20_regular": 57703, - "ic_fluent_battery_10_20_filled": 57704, - "ic_fluent_battery_10_20_regular": 57705, - "ic_fluent_battery_2_20_filled": 57706, - "ic_fluent_battery_2_20_regular": 57707, - "ic_fluent_battery_3_20_filled": 57708, - "ic_fluent_battery_3_20_regular": 57709, - "ic_fluent_battery_4_20_filled": 57710, - "ic_fluent_battery_4_20_regular": 57711, - "ic_fluent_battery_5_20_filled": 57712, - "ic_fluent_battery_5_20_regular": 57713, - "ic_fluent_battery_6_20_filled": 57714, - "ic_fluent_battery_6_20_regular": 57715, - "ic_fluent_battery_7_20_filled": 57716, - "ic_fluent_battery_7_20_regular": 57717, - "ic_fluent_battery_8_20_filled": 57718, - "ic_fluent_battery_8_20_regular": 57719, - "ic_fluent_battery_9_20_filled": 57720, - "ic_fluent_battery_9_20_regular": 57721, - "ic_fluent_battery_charge_20_filled": 57722, - "ic_fluent_battery_charge_20_regular": 57723, - "ic_fluent_battery_checkmark_20_filled": 57724, - "ic_fluent_battery_checkmark_20_regular": 57725, - "ic_fluent_battery_saver_20_filled": 57726, - "ic_fluent_battery_saver_20_regular": 57727, - "ic_fluent_battery_warning_20_filled": 57728, - "ic_fluent_battery_warning_20_regular": 57729, - "ic_fluent_beach_20_filled": 57730, - "ic_fluent_beach_20_regular": 57731, - "ic_fluent_beaker_20_filled": 57732, - "ic_fluent_beaker_20_regular": 57733, - "ic_fluent_beaker_edit_20_filled": 57734, - "ic_fluent_beaker_edit_20_regular": 57735, - "ic_fluent_beaker_off_20_filled": 57736, - "ic_fluent_beaker_off_20_regular": 57737, - "ic_fluent_bed_20_filled": 57738, - "ic_fluent_bed_20_regular": 57739, - "ic_fluent_bezier_curve_square_20_filled": 57740, - "ic_fluent_bezier_curve_square_20_regular": 57741, - "ic_fluent_bin_full_20_filled": 57742, - "ic_fluent_bin_full_20_regular": 57743, - "ic_fluent_bluetooth_20_filled": 57744, - "ic_fluent_bluetooth_20_regular": 57745, - "ic_fluent_bluetooth_connected_20_filled": 57746, - "ic_fluent_bluetooth_connected_20_regular": 57747, - "ic_fluent_bluetooth_disabled_20_filled": 57748, - "ic_fluent_bluetooth_disabled_20_regular": 57749, - "ic_fluent_bluetooth_searching_20_filled": 57750, - "ic_fluent_bluetooth_searching_20_regular": 57751, - "ic_fluent_blur_20_filled": 57752, - "ic_fluent_blur_20_regular": 57753, - "ic_fluent_board_20_filled": 57754, - "ic_fluent_board_20_regular": 57755, - "ic_fluent_board_games_20_filled": 57756, - "ic_fluent_board_games_20_regular": 57757, - "ic_fluent_board_heart_20_filled": 57758, - "ic_fluent_board_heart_20_regular": 57759, - "ic_fluent_board_split_20_filled": 57760, - "ic_fluent_board_split_20_regular": 57761, - "ic_fluent_book_20_filled": 57762, - "ic_fluent_book_20_regular": 57763, - "ic_fluent_book_add_20_filled": 57764, - "ic_fluent_book_add_20_regular": 57765, - "ic_fluent_book_arrow_clockwise_20_filled": 57766, - "ic_fluent_book_arrow_clockwise_20_regular": 57767, - "ic_fluent_book_clock_20_filled": 57768, - "ic_fluent_book_clock_20_regular": 57769, - "ic_fluent_book_coins_20_filled": 57770, - "ic_fluent_book_coins_20_regular": 57771, - "ic_fluent_book_compass_20_filled": 57772, - "ic_fluent_book_compass_20_regular": 57773, - "ic_fluent_book_contacts_20_filled": 57774, - "ic_fluent_book_contacts_20_regular": 57775, - "ic_fluent_book_database_20_filled": 57776, - "ic_fluent_book_database_20_regular": 57777, - "ic_fluent_book_exclamation_mark_20_filled": 57778, - "ic_fluent_book_exclamation_mark_20_regular": 57779, - "ic_fluent_book_globe_20_filled": 57780, - "ic_fluent_book_globe_20_regular": 57781, - "ic_fluent_book_information_20_filled": 57782, - "ic_fluent_book_information_20_regular": 57783, - "ic_fluent_book_letter_20_filled": 57784, - "ic_fluent_book_letter_20_regular": 57785, - "ic_fluent_book_number_20_filled": 57786, - "ic_fluent_book_number_20_regular": 57787, - "ic_fluent_book_open_20_filled": 57788, - "ic_fluent_book_open_20_regular": 57789, - "ic_fluent_book_open_globe_20_filled": 57790, - "ic_fluent_book_open_globe_20_regular": 57791, - "ic_fluent_book_open_microphone_20_filled": 57792, - "ic_fluent_book_open_microphone_20_regular": 57793, - "ic_fluent_book_pulse_20_filled": 57794, - "ic_fluent_book_pulse_20_regular": 57795, - "ic_fluent_book_question_mark_20_filled": 57796, - "ic_fluent_book_question_mark_20_regular": 57797, - "ic_fluent_book_question_mark_rtl_20_filled": 57798, - "ic_fluent_book_question_mark_rtl_20_regular": 57799, - "ic_fluent_book_search_20_filled": 57800, - "ic_fluent_book_search_20_regular": 57801, - "ic_fluent_book_star_20_filled": 57802, - "ic_fluent_book_star_20_regular": 57803, - "ic_fluent_book_template_20_filled": 57804, - "ic_fluent_book_template_20_regular": 57805, - "ic_fluent_book_theta_20_filled": 57806, - "ic_fluent_book_theta_20_regular": 57807, - "ic_fluent_book_toolbox_20_filled": 57808, - "ic_fluent_book_toolbox_20_regular": 57809, - "ic_fluent_bookmark_20_filled": 57810, - "ic_fluent_bookmark_20_regular": 57811, - "ic_fluent_bookmark_add_20_filled": 57812, - "ic_fluent_bookmark_add_20_regular": 57813, - "ic_fluent_bookmark_multiple_20_filled": 57814, - "ic_fluent_bookmark_multiple_20_regular": 57815, - "ic_fluent_bookmark_off_20_filled": 57816, - "ic_fluent_bookmark_off_20_regular": 57817, - "ic_fluent_bookmark_search_20_filled": 57818, - "ic_fluent_bookmark_search_20_regular": 57819, - "ic_fluent_border_all_20_filled": 57820, - "ic_fluent_border_all_20_regular": 57821, - "ic_fluent_border_bottom_20_filled": 57822, - "ic_fluent_border_bottom_20_regular": 57823, - "ic_fluent_border_bottom_double_20_filled": 57824, - "ic_fluent_border_bottom_double_20_regular": 57825, - "ic_fluent_border_bottom_thick_20_filled": 57826, - "ic_fluent_border_bottom_thick_20_regular": 57827, - "ic_fluent_border_left_20_filled": 57828, - "ic_fluent_border_left_20_regular": 57829, - "ic_fluent_border_left_right_20_filled": 57830, - "ic_fluent_border_left_right_20_regular": 57831, - "ic_fluent_border_none_20_filled": 57832, - "ic_fluent_border_none_20_regular": 57833, - "ic_fluent_border_outside_20_filled": 57834, - "ic_fluent_border_outside_20_regular": 57835, - "ic_fluent_border_outside_thick_20_filled": 57836, - "ic_fluent_border_outside_thick_20_regular": 57837, - "ic_fluent_border_right_20_filled": 57838, - "ic_fluent_border_right_20_regular": 57839, - "ic_fluent_border_top_20_filled": 57840, - "ic_fluent_border_top_20_regular": 57841, - "ic_fluent_border_top_bottom_20_filled": 57842, - "ic_fluent_border_top_bottom_20_regular": 57843, - "ic_fluent_border_top_bottom_double_20_filled": 57844, - "ic_fluent_border_top_bottom_double_20_regular": 57845, - "ic_fluent_border_top_bottom_thick_20_filled": 57846, - "ic_fluent_border_top_bottom_thick_20_regular": 57847, - "ic_fluent_bot_20_filled": 57848, - "ic_fluent_bot_20_regular": 57849, - "ic_fluent_bot_add_20_filled": 57850, - "ic_fluent_bot_add_20_regular": 57851, - "ic_fluent_bowl_chopsticks_20_filled": 57852, - "ic_fluent_bowl_chopsticks_20_regular": 57853, - "ic_fluent_bowl_salad_20_filled": 57854, - "ic_fluent_bowl_salad_20_regular": 57855, - "ic_fluent_box_20_filled": 57856, - "ic_fluent_box_20_regular": 57857, - "ic_fluent_box_arrow_left_20_filled": 57858, - "ic_fluent_box_arrow_left_20_regular": 57859, - "ic_fluent_box_arrow_up_20_filled": 57860, - "ic_fluent_box_arrow_up_20_regular": 57861, - "ic_fluent_box_checkmark_20_filled": 57862, - "ic_fluent_box_checkmark_20_regular": 57863, - "ic_fluent_box_dismiss_20_filled": 57864, - "ic_fluent_box_dismiss_20_regular": 57865, - "ic_fluent_box_edit_20_filled": 57866, - "ic_fluent_box_edit_20_regular": 57867, - "ic_fluent_box_multiple_20_filled": 57868, - "ic_fluent_box_multiple_20_regular": 57869, - "ic_fluent_box_multiple_arrow_left_20_filled": 57870, - "ic_fluent_box_multiple_arrow_left_20_regular": 57871, - "ic_fluent_box_multiple_arrow_right_20_filled": 57872, - "ic_fluent_box_multiple_arrow_right_20_regular": 57873, - "ic_fluent_box_multiple_checkmark_20_filled": 57874, - "ic_fluent_box_multiple_checkmark_20_regular": 57875, - "ic_fluent_box_multiple_search_20_filled": 57876, - "ic_fluent_box_multiple_search_20_regular": 57877, - "ic_fluent_box_search_20_filled": 57878, - "ic_fluent_box_search_20_regular": 57879, - "ic_fluent_box_toolbox_20_filled": 57880, - "ic_fluent_box_toolbox_20_regular": 57881, - "ic_fluent_braces_20_filled": 57882, - "ic_fluent_braces_20_regular": 57883, - "ic_fluent_braces_variable_20_filled": 57884, - "ic_fluent_braces_variable_20_regular": 57885, - "ic_fluent_brain_circuit_20_filled": 57886, - "ic_fluent_brain_circuit_20_regular": 57887, - "ic_fluent_branch_20_filled": 57888, - "ic_fluent_branch_20_regular": 57889, - "ic_fluent_branch_compare_20_filled": 57890, - "ic_fluent_branch_compare_20_regular": 57891, - "ic_fluent_branch_fork_20_filled": 57892, - "ic_fluent_branch_fork_20_regular": 57893, - "ic_fluent_branch_fork_hint_20_filled": 57894, - "ic_fluent_branch_fork_hint_20_regular": 57895, - "ic_fluent_branch_fork_link_20_filled": 57896, - "ic_fluent_branch_fork_link_20_regular": 57897, - "ic_fluent_branch_request_20_filled": 57898, - "ic_fluent_branch_request_20_regular": 57899, - "ic_fluent_breakout_room_20_filled": 57900, - "ic_fluent_breakout_room_20_regular": 57901, - "ic_fluent_briefcase_20_filled": 57902, - "ic_fluent_briefcase_20_regular": 57903, - "ic_fluent_briefcase_medical_20_filled": 57904, - "ic_fluent_briefcase_medical_20_regular": 57905, - "ic_fluent_briefcase_off_20_filled": 57906, - "ic_fluent_briefcase_off_20_regular": 57907, - "ic_fluent_brightness_high_20_filled": 57908, - "ic_fluent_brightness_high_20_regular": 57909, - "ic_fluent_brightness_low_20_filled": 57910, - "ic_fluent_brightness_low_20_regular": 57911, - "ic_fluent_broad_activity_feed_20_filled": 57912, - "ic_fluent_broad_activity_feed_20_regular": 57913, - "ic_fluent_broom_20_filled": 57914, - "ic_fluent_broom_20_regular": 57915, - "ic_fluent_bug_20_filled": 57916, - "ic_fluent_bug_20_regular": 57917, - "ic_fluent_bug_arrow_counterclockwise_20_filled": 57918, - "ic_fluent_bug_arrow_counterclockwise_20_regular": 57919, - "ic_fluent_bug_prohibited_20_filled": 57920, - "ic_fluent_bug_prohibited_20_regular": 57921, - "ic_fluent_building_20_filled": 57922, - "ic_fluent_building_20_regular": 57923, - "ic_fluent_building_bank_20_filled": 57924, - "ic_fluent_building_bank_20_regular": 57925, - "ic_fluent_building_bank_link_20_filled": 57926, - "ic_fluent_building_bank_link_20_regular": 57927, - "ic_fluent_building_bank_toolbox_20_filled": 57928, - "ic_fluent_building_bank_toolbox_20_regular": 57929, - "ic_fluent_building_factory_20_filled": 57930, - "ic_fluent_building_factory_20_regular": 57931, - "ic_fluent_building_government_20_filled": 57932, - "ic_fluent_building_government_20_regular": 57933, - "ic_fluent_building_home_20_filled": 57934, - "ic_fluent_building_home_20_regular": 57935, - "ic_fluent_building_lighthouse_20_filled": 57936, - "ic_fluent_building_lighthouse_20_regular": 57937, - "ic_fluent_building_multiple_20_filled": 57938, - "ic_fluent_building_multiple_20_regular": 57939, - "ic_fluent_building_retail_20_filled": 57940, - "ic_fluent_building_retail_20_regular": 57941, - "ic_fluent_building_retail_money_20_filled": 57942, - "ic_fluent_building_retail_money_20_regular": 57943, - "ic_fluent_building_retail_more_20_filled": 57944, - "ic_fluent_building_retail_more_20_regular": 57945, - "ic_fluent_building_retail_shield_20_filled": 57946, - "ic_fluent_building_retail_shield_20_regular": 57947, - "ic_fluent_building_retail_toolbox_20_filled": 57948, - "ic_fluent_building_retail_toolbox_20_regular": 57949, - "ic_fluent_building_shop_20_filled": 57950, - "ic_fluent_building_shop_20_regular": 57951, - "ic_fluent_building_skyscraper_20_filled": 57952, - "ic_fluent_building_skyscraper_20_regular": 57953, - "ic_fluent_calculator_20_filled": 57954, - "ic_fluent_calculator_20_regular": 57955, - "ic_fluent_calculator_arrow_clockwise_20_filled": 57956, - "ic_fluent_calculator_arrow_clockwise_20_regular": 57957, - "ic_fluent_calculator_multiple_20_filled": 57958, - "ic_fluent_calculator_multiple_20_regular": 57959, - "ic_fluent_calendar_3_day_20_filled": 57960, - "ic_fluent_calendar_3_day_20_regular": 57961, - "ic_fluent_calendar_add_20_filled": 57962, - "ic_fluent_calendar_add_20_regular": 57963, - "ic_fluent_calendar_agenda_20_filled": 57964, - "ic_fluent_calendar_agenda_20_regular": 57965, - "ic_fluent_calendar_arrow_down_20_filled": 57966, - "ic_fluent_calendar_arrow_down_20_regular": 57967, - "ic_fluent_calendar_arrow_right_20_filled": 57968, - "ic_fluent_calendar_arrow_right_20_regular": 57969, - "ic_fluent_calendar_assistant_20_filled": 57970, - "ic_fluent_calendar_assistant_20_regular": 57971, - "ic_fluent_calendar_cancel_20_filled": 57972, - "ic_fluent_calendar_cancel_20_regular": 57973, - "ic_fluent_calendar_chat_20_filled": 57974, - "ic_fluent_calendar_chat_20_regular": 57975, - "ic_fluent_calendar_checkmark_20_filled": 57976, - "ic_fluent_calendar_checkmark_20_regular": 57977, - "ic_fluent_calendar_clock_20_filled": 57978, - "ic_fluent_calendar_clock_20_regular": 57979, - "ic_fluent_calendar_data_bar_20_filled": 57980, - "ic_fluent_calendar_data_bar_20_regular": 57981, - "ic_fluent_calendar_day_20_filled": 57982, - "ic_fluent_calendar_day_20_regular": 57983, - "ic_fluent_calendar_edit_20_filled": 57984, - "ic_fluent_calendar_edit_20_regular": 57985, - "ic_fluent_calendar_empty_20_filled": 57986, - "ic_fluent_calendar_empty_20_regular": 57987, - "ic_fluent_calendar_error_20_filled": 57988, - "ic_fluent_calendar_error_20_regular": 57989, - "ic_fluent_calendar_info_20_filled": 57990, - "ic_fluent_calendar_info_20_regular": 57991, - "ic_fluent_calendar_ltr_20_filled": 57992, - "ic_fluent_calendar_ltr_20_regular": 57993, - "ic_fluent_calendar_mail_20_filled": 57994, - "ic_fluent_calendar_mail_20_regular": 57995, - "ic_fluent_calendar_mention_20_filled": 57996, - "ic_fluent_calendar_mention_20_regular": 57997, - "ic_fluent_calendar_month_20_filled": 57998, - "ic_fluent_calendar_month_20_regular": 57999, - "ic_fluent_calendar_multiple_20_filled": 58000, - "ic_fluent_calendar_multiple_20_regular": 58001, - "ic_fluent_calendar_pattern_20_filled": 58002, - "ic_fluent_calendar_pattern_20_regular": 58003, - "ic_fluent_calendar_person_20_filled": 58004, - "ic_fluent_calendar_person_20_regular": 58005, - "ic_fluent_calendar_phone_20_filled": 58006, - "ic_fluent_calendar_phone_20_regular": 58007, - "ic_fluent_calendar_question_mark_20_filled": 58008, - "ic_fluent_calendar_question_mark_20_regular": 58009, - "ic_fluent_calendar_reply_20_filled": 58010, - "ic_fluent_calendar_reply_20_regular": 58011, - "ic_fluent_calendar_rtl_20_filled": 58012, - "ic_fluent_calendar_rtl_20_regular": 58013, - "ic_fluent_calendar_search_20_filled": 58014, - "ic_fluent_calendar_search_20_regular": 58015, - "ic_fluent_calendar_settings_20_filled": 58016, - "ic_fluent_calendar_settings_20_regular": 58017, - "ic_fluent_calendar_star_20_filled": 58018, - "ic_fluent_calendar_star_20_regular": 58019, - "ic_fluent_calendar_sync_20_filled": 58020, - "ic_fluent_calendar_sync_20_regular": 58021, - "ic_fluent_calendar_today_20_filled": 58022, - "ic_fluent_calendar_today_20_regular": 58023, - "ic_fluent_calendar_toolbox_20_filled": 58024, - "ic_fluent_calendar_toolbox_20_regular": 58025, - "ic_fluent_calendar_week_numbers_20_filled": 58026, - "ic_fluent_calendar_week_numbers_20_regular": 58027, - "ic_fluent_calendar_week_start_20_filled": 58028, - "ic_fluent_calendar_week_start_20_regular": 58029, - "ic_fluent_calendar_work_week_20_filled": 58030, - "ic_fluent_calendar_work_week_20_regular": 58031, - "ic_fluent_call_20_filled": 58032, - "ic_fluent_call_20_regular": 58033, - "ic_fluent_call_add_20_filled": 58034, - "ic_fluent_call_add_20_regular": 58035, - "ic_fluent_call_checkmark_20_filled": 58036, - "ic_fluent_call_checkmark_20_regular": 58037, - "ic_fluent_call_connecting_20_filled": 58038, - "ic_fluent_call_connecting_20_regular": 58039, - "ic_fluent_call_dismiss_20_filled": 58040, - "ic_fluent_call_dismiss_20_regular": 58041, - "ic_fluent_call_end_20_filled": 58042, - "ic_fluent_call_end_20_regular": 58043, - "ic_fluent_call_exclamation_20_filled": 58044, - "ic_fluent_call_exclamation_20_regular": 58045, - "ic_fluent_call_forward_20_filled": 58046, - "ic_fluent_call_forward_20_regular": 58047, - "ic_fluent_call_inbound_20_filled": 58048, - "ic_fluent_call_inbound_20_regular": 58049, - "ic_fluent_call_missed_20_filled": 58050, - "ic_fluent_call_missed_20_regular": 58051, - "ic_fluent_call_outbound_20_filled": 58052, - "ic_fluent_call_outbound_20_regular": 58053, - "ic_fluent_call_park_20_filled": 58054, - "ic_fluent_call_park_20_regular": 58055, - "ic_fluent_call_pause_20_filled": 58056, - "ic_fluent_call_pause_20_regular": 58057, - "ic_fluent_call_prohibited_20_filled": 58058, - "ic_fluent_call_prohibited_20_regular": 58059, - "ic_fluent_call_transfer_20_filled": 58060, - "ic_fluent_call_transfer_20_regular": 58061, - "ic_fluent_call_warning_20_filled": 58062, - "ic_fluent_call_warning_20_regular": 58063, - "ic_fluent_calligraphy_pen_20_filled": 58064, - "ic_fluent_calligraphy_pen_20_regular": 58065, - "ic_fluent_calligraphy_pen_checkmark_20_filled": 58066, - "ic_fluent_calligraphy_pen_checkmark_20_regular": 58067, - "ic_fluent_calligraphy_pen_error_20_filled": 58068, - "ic_fluent_calligraphy_pen_error_20_regular": 58069, - "ic_fluent_calligraphy_pen_question_mark_20_filled": 58070, - "ic_fluent_calligraphy_pen_question_mark_20_regular": 58071, - "ic_fluent_camera_20_filled": 58072, - "ic_fluent_camera_20_regular": 58073, - "ic_fluent_camera_add_20_filled": 58074, - "ic_fluent_camera_add_20_regular": 58075, - "ic_fluent_camera_dome_20_filled": 58076, - "ic_fluent_camera_dome_20_regular": 58077, - "ic_fluent_camera_edit_20_filled": 58078, - "ic_fluent_camera_edit_20_regular": 58079, - "ic_fluent_camera_off_20_filled": 58080, - "ic_fluent_camera_off_20_regular": 58081, - "ic_fluent_camera_switch_20_filled": 58082, - "ic_fluent_camera_switch_20_regular": 58083, - "ic_fluent_caret_down_20_filled": 58084, - "ic_fluent_caret_down_20_regular": 58085, - "ic_fluent_caret_down_right_20_filled": 58086, - "ic_fluent_caret_down_right_20_regular": 58087, - "ic_fluent_caret_left_20_filled": 58088, - "ic_fluent_caret_left_20_regular": 58089, - "ic_fluent_caret_right_20_filled": 58090, - "ic_fluent_caret_right_20_regular": 58091, - "ic_fluent_caret_up_20_filled": 58092, - "ic_fluent_caret_up_20_regular": 58093, - "ic_fluent_cart_20_filled": 58094, - "ic_fluent_cart_20_regular": 58095, - "ic_fluent_cast_20_filled": 58096, - "ic_fluent_cast_20_regular": 58097, - "ic_fluent_catch_up_20_filled": 58098, - "ic_fluent_catch_up_20_regular": 58099, - "ic_fluent_cellular_3g_20_filled": 58100, - "ic_fluent_cellular_3g_20_regular": 58101, - "ic_fluent_cellular_4g_20_filled": 58102, - "ic_fluent_cellular_4g_20_regular": 58103, - "ic_fluent_cellular_5g_20_filled": 58104, - "ic_fluent_cellular_5g_20_regular": 58105, - "ic_fluent_cellular_data_1_20_filled": 58106, - "ic_fluent_cellular_data_1_20_regular": 58107, - "ic_fluent_cellular_data_2_20_filled": 58108, - "ic_fluent_cellular_data_2_20_regular": 58109, - "ic_fluent_cellular_data_3_20_filled": 58110, - "ic_fluent_cellular_data_3_20_regular": 58111, - "ic_fluent_cellular_data_4_20_filled": 58112, - "ic_fluent_cellular_data_4_20_regular": 58113, - "ic_fluent_cellular_data_5_20_filled": 58114, - "ic_fluent_cellular_data_5_20_regular": 58115, - "ic_fluent_cellular_off_20_filled": 58116, - "ic_fluent_cellular_off_20_regular": 58117, - "ic_fluent_cellular_warning_20_filled": 58118, - "ic_fluent_cellular_warning_20_regular": 58119, - "ic_fluent_center_horizontal_20_filled": 58120, - "ic_fluent_center_horizontal_20_regular": 58121, - "ic_fluent_center_vertical_20_filled": 58122, - "ic_fluent_center_vertical_20_regular": 58123, - "ic_fluent_certificate_20_filled": 58124, - "ic_fluent_certificate_20_regular": 58125, - "ic_fluent_channel_20_filled": 58126, - "ic_fluent_channel_20_regular": 58127, - "ic_fluent_channel_add_20_filled": 58128, - "ic_fluent_channel_add_20_regular": 58129, - "ic_fluent_channel_alert_20_filled": 58130, - "ic_fluent_channel_alert_20_regular": 58131, - "ic_fluent_channel_arrow_left_20_filled": 58132, - "ic_fluent_channel_arrow_left_20_regular": 58133, - "ic_fluent_channel_dismiss_20_filled": 58134, - "ic_fluent_channel_dismiss_20_regular": 58135, - "ic_fluent_channel_share_20_filled": 58136, - "ic_fluent_channel_share_20_regular": 58137, - "ic_fluent_channel_subtract_20_filled": 58138, - "ic_fluent_channel_subtract_20_regular": 58139, - "ic_fluent_chart_multiple_20_filled": 58140, - "ic_fluent_chart_multiple_20_regular": 58141, - "ic_fluent_chart_person_20_filled": 58142, - "ic_fluent_chart_person_20_regular": 58143, - "ic_fluent_chat_20_filled": 58144, - "ic_fluent_chat_20_regular": 58145, - "ic_fluent_chat_arrow_back_20_filled": 58146, - "ic_fluent_chat_arrow_back_20_regular": 58147, - "ic_fluent_chat_arrow_double_back_20_filled": 58148, - "ic_fluent_chat_arrow_double_back_20_regular": 58149, - "ic_fluent_chat_bubbles_question_20_filled": 58150, - "ic_fluent_chat_bubbles_question_20_regular": 58151, - "ic_fluent_chat_dismiss_20_filled": 58152, - "ic_fluent_chat_dismiss_20_regular": 58153, - "ic_fluent_chat_help_20_filled": 58154, - "ic_fluent_chat_help_20_regular": 58155, - "ic_fluent_chat_mail_20_filled": 58156, - "ic_fluent_chat_mail_20_regular": 58157, - "ic_fluent_chat_multiple_20_filled": 58158, - "ic_fluent_chat_multiple_20_regular": 58159, - "ic_fluent_chat_off_20_filled": 58160, - "ic_fluent_chat_off_20_regular": 58161, - "ic_fluent_chat_settings_20_filled": 58162, - "ic_fluent_chat_settings_20_regular": 58163, - "ic_fluent_chat_video_20_filled": 58164, - "ic_fluent_chat_video_20_regular": 58165, - "ic_fluent_chat_warning_20_filled": 58166, - "ic_fluent_chat_warning_20_regular": 58167, - "ic_fluent_check_20_filled": 58168, - "ic_fluent_check_20_regular": 58169, - "ic_fluent_checkbox_1_20_filled": 58170, - "ic_fluent_checkbox_1_20_regular": 58171, - "ic_fluent_checkbox_2_20_filled": 58172, - "ic_fluent_checkbox_2_20_regular": 58173, - "ic_fluent_checkbox_arrow_right_20_filled": 58174, - "ic_fluent_checkbox_arrow_right_20_regular": 58175, - "ic_fluent_checkbox_checked_20_filled": 58176, - "ic_fluent_checkbox_checked_20_regular": 58177, - "ic_fluent_checkbox_checked_sync_20_filled": 58178, - "ic_fluent_checkbox_checked_sync_20_regular": 58179, - "ic_fluent_checkbox_indeterminate_20_filled": 58180, - "ic_fluent_checkbox_indeterminate_20_regular": 58181, - "ic_fluent_checkbox_person_20_filled": 58182, - "ic_fluent_checkbox_person_20_regular": 58183, - "ic_fluent_checkbox_unchecked_20_filled": 58184, - "ic_fluent_checkbox_unchecked_20_regular": 58185, - "ic_fluent_checkbox_warning_20_filled": 58186, - "ic_fluent_checkbox_warning_20_regular": 58187, - "ic_fluent_checkmark_20_filled": 58188, - "ic_fluent_checkmark_20_regular": 58189, - "ic_fluent_checkmark_circle_20_filled": 58190, - "ic_fluent_checkmark_circle_20_regular": 58191, - "ic_fluent_checkmark_lock_20_filled": 58192, - "ic_fluent_checkmark_lock_20_regular": 58193, - "ic_fluent_checkmark_note_20_filled": 58194, - "ic_fluent_checkmark_note_20_regular": 58195, - "ic_fluent_checkmark_square_20_filled": 58196, - "ic_fluent_checkmark_square_20_regular": 58197, - "ic_fluent_checkmark_starburst_20_filled": 58198, - "ic_fluent_checkmark_starburst_20_regular": 58199, - "ic_fluent_checkmark_underline_circle_20_filled": 58200, - "ic_fluent_checkmark_underline_circle_20_regular": 58201, - "ic_fluent_chess_20_filled": 58202, - "ic_fluent_chess_20_regular": 58203, - "ic_fluent_chevron_circle_down_20_filled": 58204, - "ic_fluent_chevron_circle_down_20_regular": 58205, - "ic_fluent_chevron_circle_left_20_filled": 58206, - "ic_fluent_chevron_circle_left_20_regular": 58207, - "ic_fluent_chevron_circle_right_20_filled": 58208, - "ic_fluent_chevron_circle_right_20_regular": 58209, - "ic_fluent_chevron_circle_up_20_filled": 58210, - "ic_fluent_chevron_circle_up_20_regular": 58211, - "ic_fluent_chevron_double_down_20_filled": 58212, - "ic_fluent_chevron_double_down_20_regular": 58213, - "ic_fluent_chevron_double_left_20_filled": 58214, - "ic_fluent_chevron_double_left_20_regular": 58215, - "ic_fluent_chevron_double_right_20_filled": 58216, - "ic_fluent_chevron_double_right_20_regular": 58217, - "ic_fluent_chevron_double_up_20_filled": 58218, - "ic_fluent_chevron_double_up_20_regular": 58219, - "ic_fluent_chevron_down_20_filled": 58220, - "ic_fluent_chevron_down_20_regular": 58221, - "ic_fluent_chevron_left_20_filled": 58222, - "ic_fluent_chevron_left_20_regular": 58223, - "ic_fluent_chevron_right_20_filled": 58224, - "ic_fluent_chevron_right_20_regular": 58225, - "ic_fluent_chevron_up_20_filled": 58226, - "ic_fluent_chevron_up_20_regular": 58227, - "ic_fluent_chevron_up_down_20_filled": 58228, - "ic_fluent_chevron_up_down_20_regular": 58229, - "ic_fluent_circle_20_filled": 58230, - "ic_fluent_circle_20_regular": 58231, - "ic_fluent_circle_edit_20_filled": 58232, - "ic_fluent_circle_edit_20_regular": 58233, - "ic_fluent_circle_eraser_20_filled": 58234, - "ic_fluent_circle_eraser_20_regular": 58235, - "ic_fluent_circle_half_fill_20_filled": 58236, - "ic_fluent_circle_half_fill_20_regular": 58237, - "ic_fluent_circle_image_20_filled": 58238, - "ic_fluent_circle_image_20_regular": 58239, - "ic_fluent_circle_line_20_filled": 58240, - "ic_fluent_circle_line_20_regular": 58241, - "ic_fluent_circle_multiple_subtract_checkmark_20_filled": 58242, - "ic_fluent_circle_multiple_subtract_checkmark_20_regular": 58243, - "ic_fluent_circle_off_20_filled": 58244, - "ic_fluent_circle_off_20_regular": 58245, - "ic_fluent_circle_small_20_filled": 58246, - "ic_fluent_circle_small_20_regular": 58247, - "ic_fluent_city_20_filled": 58248, - "ic_fluent_city_20_regular": 58249, - "ic_fluent_class_20_filled": 58250, - "ic_fluent_class_20_regular": 58251, - "ic_fluent_classification_20_filled": 58252, - "ic_fluent_classification_20_regular": 58253, - "ic_fluent_clear_formatting_20_filled": 58254, - "ic_fluent_clear_formatting_20_regular": 58255, - "ic_fluent_clipboard_20_filled": 58256, - "ic_fluent_clipboard_20_regular": 58257, - "ic_fluent_clipboard_3_day_20_filled": 58258, - "ic_fluent_clipboard_3_day_20_regular": 58259, - "ic_fluent_clipboard_arrow_right_20_filled": 58260, - "ic_fluent_clipboard_arrow_right_20_regular": 58261, - "ic_fluent_clipboard_bullet_list_ltr_20_filled": 58262, - "ic_fluent_clipboard_bullet_list_ltr_20_regular": 58263, - "ic_fluent_clipboard_bullet_list_rtl_20_filled": 58264, - "ic_fluent_clipboard_bullet_list_rtl_20_regular": 58265, - "ic_fluent_clipboard_checkmark_20_filled": 58266, - "ic_fluent_clipboard_checkmark_20_regular": 58267, - "ic_fluent_clipboard_clock_20_filled": 58268, - "ic_fluent_clipboard_clock_20_regular": 58269, - "ic_fluent_clipboard_code_20_filled": 58270, - "ic_fluent_clipboard_code_20_regular": 58271, - "ic_fluent_clipboard_data_bar_20_filled": 58272, - "ic_fluent_clipboard_data_bar_20_regular": 58273, - "ic_fluent_clipboard_day_20_filled": 58274, - "ic_fluent_clipboard_day_20_regular": 58275, - "ic_fluent_clipboard_edit_20_filled": 58276, - "ic_fluent_clipboard_edit_20_regular": 58277, - "ic_fluent_clipboard_error_20_filled": 58278, - "ic_fluent_clipboard_error_20_regular": 58279, - "ic_fluent_clipboard_heart_20_filled": 58280, - "ic_fluent_clipboard_heart_20_regular": 58281, - "ic_fluent_clipboard_image_20_filled": 58282, - "ic_fluent_clipboard_image_20_regular": 58283, - "ic_fluent_clipboard_letter_20_filled": 58284, - "ic_fluent_clipboard_letter_20_regular": 58285, - "ic_fluent_clipboard_link_20_filled": 58286, - "ic_fluent_clipboard_link_20_regular": 58287, - "ic_fluent_clipboard_month_20_filled": 58288, - "ic_fluent_clipboard_month_20_regular": 58289, - "ic_fluent_clipboard_more_20_filled": 58290, - "ic_fluent_clipboard_more_20_regular": 58291, - "ic_fluent_clipboard_note_20_filled": 58292, - "ic_fluent_clipboard_note_20_regular": 58293, - "ic_fluent_clipboard_paste_20_filled": 58294, - "ic_fluent_clipboard_paste_20_regular": 58295, - "ic_fluent_clipboard_pulse_20_filled": 58296, - "ic_fluent_clipboard_pulse_20_regular": 58297, - "ic_fluent_clipboard_search_20_filled": 58298, - "ic_fluent_clipboard_search_20_regular": 58299, - "ic_fluent_clipboard_settings_20_filled": 58300, - "ic_fluent_clipboard_settings_20_regular": 58301, - "ic_fluent_clipboard_task_20_filled": 58302, - "ic_fluent_clipboard_task_20_regular": 58303, - "ic_fluent_clipboard_task_add_20_filled": 58304, - "ic_fluent_clipboard_task_add_20_regular": 58305, - "ic_fluent_clipboard_task_list_ltr_20_filled": 58306, - "ic_fluent_clipboard_task_list_ltr_20_regular": 58307, - "ic_fluent_clipboard_task_list_rtl_20_filled": 58308, - "ic_fluent_clipboard_task_list_rtl_20_regular": 58309, - "ic_fluent_clipboard_text_edit_20_filled": 58310, - "ic_fluent_clipboard_text_edit_20_regular": 58311, - "ic_fluent_clipboard_text_ltr_20_filled": 58312, - "ic_fluent_clipboard_text_ltr_20_regular": 58313, - "ic_fluent_clipboard_text_rtl_20_filled": 58314, - "ic_fluent_clipboard_text_rtl_20_regular": 58315, - "ic_fluent_clock_20_filled": 58316, - "ic_fluent_clock_20_regular": 58317, - "ic_fluent_clock_alarm_20_filled": 58318, - "ic_fluent_clock_alarm_20_regular": 58319, - "ic_fluent_clock_arrow_download_20_filled": 58320, - "ic_fluent_clock_arrow_download_20_regular": 58321, - "ic_fluent_clock_dismiss_20_filled": 58322, - "ic_fluent_clock_dismiss_20_regular": 58323, - "ic_fluent_clock_pause_20_filled": 58324, - "ic_fluent_clock_pause_20_regular": 58325, - "ic_fluent_clock_toolbox_20_filled": 58326, - "ic_fluent_clock_toolbox_20_regular": 58327, - "ic_fluent_closed_caption_20_filled": 58328, - "ic_fluent_closed_caption_20_regular": 58329, - "ic_fluent_closed_caption_off_20_filled": 58330, - "ic_fluent_closed_caption_off_20_regular": 58331, - "ic_fluent_cloud_20_filled": 58332, - "ic_fluent_cloud_20_regular": 58333, - "ic_fluent_cloud_add_20_filled": 58334, - "ic_fluent_cloud_add_20_regular": 58335, - "ic_fluent_cloud_archive_20_filled": 58336, - "ic_fluent_cloud_archive_20_regular": 58337, - "ic_fluent_cloud_arrow_down_20_filled": 58338, - "ic_fluent_cloud_arrow_down_20_regular": 58339, - "ic_fluent_cloud_arrow_up_20_filled": 58340, - "ic_fluent_cloud_arrow_up_20_regular": 58341, - "ic_fluent_cloud_checkmark_20_filled": 58342, - "ic_fluent_cloud_checkmark_20_regular": 58343, - "ic_fluent_cloud_dismiss_20_filled": 58344, - "ic_fluent_cloud_dismiss_20_regular": 58345, - "ic_fluent_cloud_edit_20_filled": 58346, - "ic_fluent_cloud_edit_20_regular": 58347, - "ic_fluent_cloud_flow_20_filled": 58348, - "ic_fluent_cloud_flow_20_regular": 58349, - "ic_fluent_cloud_link_20_filled": 58350, - "ic_fluent_cloud_link_20_regular": 58351, - "ic_fluent_cloud_off_20_filled": 58352, - "ic_fluent_cloud_off_20_regular": 58353, - "ic_fluent_cloud_swap_20_filled": 58354, - "ic_fluent_cloud_swap_20_regular": 58355, - "ic_fluent_cloud_sync_20_filled": 58356, - "ic_fluent_cloud_sync_20_regular": 58357, - "ic_fluent_cloud_words_20_filled": 58358, - "ic_fluent_cloud_words_20_regular": 58359, - "ic_fluent_code_20_filled": 58360, - "ic_fluent_code_20_regular": 58361, - "ic_fluent_code_circle_20_filled": 58362, - "ic_fluent_code_circle_20_regular": 58363, - "ic_fluent_code_text_20_filled": 58364, - "ic_fluent_code_text_20_regular": 58365, - "ic_fluent_code_text_edit_20_filled": 58366, - "ic_fluent_code_text_edit_20_regular": 58367, - "ic_fluent_collections_20_filled": 58368, - "ic_fluent_collections_20_regular": 58369, - "ic_fluent_collections_add_20_filled": 58370, - "ic_fluent_collections_add_20_regular": 58371, - "ic_fluent_color_20_filled": 58372, - "ic_fluent_color_20_regular": 58373, - "ic_fluent_color_background_20_filled": 58374, - "ic_fluent_color_background_20_regular": 58375, - "ic_fluent_color_background_accent_20_regular": 58376, - "ic_fluent_color_fill_20_filled": 58377, - "ic_fluent_color_fill_20_regular": 58378, - "ic_fluent_color_fill_accent_20_regular": 58379, - "ic_fluent_color_line_20_filled": 58380, - "ic_fluent_color_line_20_regular": 58381, - "ic_fluent_color_line_accent_20_regular": 58382, - "ic_fluent_column_20_filled": 58383, - "ic_fluent_column_20_regular": 58384, - "ic_fluent_column_arrow_right_20_filled": 58385, - "ic_fluent_column_arrow_right_20_regular": 58386, - "ic_fluent_column_double_compare_20_filled": 58387, - "ic_fluent_column_double_compare_20_regular": 58388, - "ic_fluent_column_edit_20_filled": 58389, - "ic_fluent_column_edit_20_regular": 58390, - "ic_fluent_column_triple_20_filled": 58391, - "ic_fluent_column_triple_20_regular": 58392, - "ic_fluent_column_triple_edit_20_filled": 58393, - "ic_fluent_column_triple_edit_20_regular": 58394, - "ic_fluent_comma_20_filled": 58395, - "ic_fluent_comma_20_regular": 58396, - "ic_fluent_comment_20_filled": 58397, - "ic_fluent_comment_20_regular": 58398, - "ic_fluent_comment_add_20_filled": 58399, - "ic_fluent_comment_add_20_regular": 58400, - "ic_fluent_comment_arrow_left_20_filled": 58401, - "ic_fluent_comment_arrow_left_20_regular": 58402, - "ic_fluent_comment_arrow_right_20_filled": 58403, - "ic_fluent_comment_arrow_right_20_regular": 58404, - "ic_fluent_comment_checkmark_20_filled": 58405, - "ic_fluent_comment_checkmark_20_regular": 58406, - "ic_fluent_comment_dismiss_20_filled": 58407, - "ic_fluent_comment_dismiss_20_regular": 58408, - "ic_fluent_comment_edit_20_filled": 58409, - "ic_fluent_comment_edit_20_regular": 58410, - "ic_fluent_comment_error_20_filled": 58411, - "ic_fluent_comment_error_20_regular": 58412, - "ic_fluent_comment_lightning_20_filled": 58413, - "ic_fluent_comment_lightning_20_regular": 58414, - "ic_fluent_comment_mention_20_filled": 58415, - "ic_fluent_comment_mention_20_regular": 58416, - "ic_fluent_comment_multiple_20_filled": 58417, - "ic_fluent_comment_multiple_20_regular": 58418, - "ic_fluent_comment_multiple_checkmark_20_filled": 58419, - "ic_fluent_comment_multiple_checkmark_20_regular": 58420, - "ic_fluent_comment_multiple_link_20_filled": 58421, - "ic_fluent_comment_multiple_link_20_regular": 58422, - "ic_fluent_comment_note_20_filled": 58423, - "ic_fluent_comment_note_20_regular": 58424, - "ic_fluent_comment_off_20_filled": 58425, - "ic_fluent_comment_off_20_regular": 58426, - "ic_fluent_communication_20_filled": 58427, - "ic_fluent_communication_20_regular": 58428, - "ic_fluent_communication_person_20_filled": 58429, - "ic_fluent_communication_person_20_regular": 58430, - "ic_fluent_compass_northwest_20_filled": 58431, - "ic_fluent_compass_northwest_20_regular": 58432, - "ic_fluent_compose_20_filled": 58433, - "ic_fluent_compose_20_regular": 58434, - "ic_fluent_conference_room_20_filled": 58435, - "ic_fluent_conference_room_20_regular": 58436, - "ic_fluent_connected_20_filled": 58437, - "ic_fluent_connected_20_regular": 58438, - "ic_fluent_connector_20_filled": 58439, - "ic_fluent_connector_20_regular": 58440, - "ic_fluent_contact_card_20_filled": 58441, - "ic_fluent_contact_card_20_regular": 58442, - "ic_fluent_contact_card_group_20_filled": 58443, - "ic_fluent_contact_card_group_20_regular": 58444, - "ic_fluent_contact_card_link_20_filled": 58445, - "ic_fluent_contact_card_link_20_regular": 58446, - "ic_fluent_contact_card_ribbon_20_filled": 58447, - "ic_fluent_contact_card_ribbon_20_regular": 58448, - "ic_fluent_content_settings_20_filled": 58449, - "ic_fluent_content_settings_20_regular": 58450, - "ic_fluent_content_view_20_filled": 58451, - "ic_fluent_content_view_20_regular": 58452, - "ic_fluent_content_view_gallery_20_filled": 58453, - "ic_fluent_content_view_gallery_20_regular": 58454, - "ic_fluent_contract_down_left_20_filled": 58455, - "ic_fluent_contract_down_left_20_regular": 58456, - "ic_fluent_control_button_20_filled": 58457, - "ic_fluent_control_button_20_regular": 58458, - "ic_fluent_convert_range_20_filled": 58459, - "ic_fluent_convert_range_20_regular": 58460, - "ic_fluent_cookies_20_filled": 58461, - "ic_fluent_cookies_20_regular": 58462, - "ic_fluent_copy_20_filled": 58463, - "ic_fluent_copy_20_regular": 58464, - "ic_fluent_copy_add_20_filled": 58465, - "ic_fluent_copy_add_20_regular": 58466, - "ic_fluent_copy_arrow_right_20_filled": 58467, - "ic_fluent_copy_arrow_right_20_regular": 58468, - "ic_fluent_copy_select_20_filled": 58469, - "ic_fluent_copy_select_20_regular": 58470, - "ic_fluent_couch_20_filled": 58471, - "ic_fluent_couch_20_regular": 58472, - "ic_fluent_credit_card_clock_20_filled": 58473, - "ic_fluent_credit_card_clock_20_regular": 58474, - "ic_fluent_credit_card_person_20_filled": 58475, - "ic_fluent_credit_card_person_20_regular": 58476, - "ic_fluent_credit_card_toolbox_20_filled": 58477, - "ic_fluent_credit_card_toolbox_20_regular": 58478, - "ic_fluent_crop_20_filled": 58479, - "ic_fluent_crop_20_regular": 58480, - "ic_fluent_crop_interim_20_filled": 58481, - "ic_fluent_crop_interim_20_regular": 58482, - "ic_fluent_crop_interim_off_20_filled": 58483, - "ic_fluent_crop_interim_off_20_regular": 58484, - "ic_fluent_cube_20_filled": 58485, - "ic_fluent_cube_20_regular": 58486, - "ic_fluent_cube_add_20_filled": 58487, - "ic_fluent_cube_add_20_regular": 58488, - "ic_fluent_cube_arrow_curve_down_20_filled": 58489, - "ic_fluent_cube_arrow_curve_down_20_regular": 58490, - "ic_fluent_cube_link_20_filled": 58491, - "ic_fluent_cube_link_20_regular": 58492, - "ic_fluent_cube_multiple_20_filled": 58493, - "ic_fluent_cube_multiple_20_regular": 58494, - "ic_fluent_cube_quick_20_filled": 58495, - "ic_fluent_cube_quick_20_regular": 58496, - "ic_fluent_cube_rotate_20_filled": 58497, - "ic_fluent_cube_rotate_20_regular": 58498, - "ic_fluent_cube_sync_20_filled": 58499, - "ic_fluent_cube_sync_20_regular": 58500, - "ic_fluent_cube_tree_20_filled": 58501, - "ic_fluent_cube_tree_20_regular": 58502, - "ic_fluent_currency_dollar_euro_20_filled": 58503, - "ic_fluent_currency_dollar_euro_20_regular": 58504, - "ic_fluent_currency_dollar_rupee_20_filled": 58505, - "ic_fluent_currency_dollar_rupee_20_regular": 58506, - "ic_fluent_cursor_20_filled": 58507, - "ic_fluent_cursor_20_regular": 58508, - "ic_fluent_cursor_click_20_filled": 58509, - "ic_fluent_cursor_click_20_regular": 58510, - "ic_fluent_cursor_hover_20_filled": 58511, - "ic_fluent_cursor_hover_20_regular": 58512, - "ic_fluent_cursor_hover_off_20_filled": 58513, - "ic_fluent_cursor_hover_off_20_regular": 58514, - "ic_fluent_cut_20_filled": 58515, - "ic_fluent_cut_20_regular": 58516, - "ic_fluent_dark_theme_20_filled": 58517, - "ic_fluent_dark_theme_20_regular": 58518, - "ic_fluent_data_area_20_filled": 58519, - "ic_fluent_data_area_20_regular": 58520, - "ic_fluent_data_bar_horizontal_20_filled": 58521, - "ic_fluent_data_bar_horizontal_20_regular": 58522, - "ic_fluent_data_bar_vertical_20_filled": 58523, - "ic_fluent_data_bar_vertical_20_regular": 58524, - "ic_fluent_data_bar_vertical_add_20_filled": 58525, - "ic_fluent_data_bar_vertical_add_20_regular": 58526, - "ic_fluent_data_funnel_20_filled": 58527, - "ic_fluent_data_funnel_20_regular": 58528, - "ic_fluent_data_histogram_20_filled": 58529, - "ic_fluent_data_histogram_20_regular": 58530, - "ic_fluent_data_line_20_filled": 58531, - "ic_fluent_data_line_20_regular": 58532, - "ic_fluent_data_pie_20_filled": 58533, - "ic_fluent_data_pie_20_regular": 58534, - "ic_fluent_data_scatter_20_filled": 58535, - "ic_fluent_data_scatter_20_regular": 58536, - "ic_fluent_data_sunburst_20_filled": 58537, - "ic_fluent_data_sunburst_20_regular": 58538, - "ic_fluent_data_treemap_20_filled": 58539, - "ic_fluent_data_treemap_20_regular": 58540, - "ic_fluent_data_trending_20_filled": 58541, - "ic_fluent_data_trending_20_regular": 58542, - "ic_fluent_data_usage_20_filled": 58543, - "ic_fluent_data_usage_20_regular": 58544, - "ic_fluent_data_usage_edit_20_filled": 58545, - "ic_fluent_data_usage_edit_20_regular": 58546, - "ic_fluent_data_usage_settings_20_filled": 58547, - "ic_fluent_data_usage_settings_20_regular": 58548, - "ic_fluent_data_usage_toolbox_20_filled": 58549, - "ic_fluent_data_usage_toolbox_20_regular": 58550, - "ic_fluent_data_waterfall_20_filled": 58551, - "ic_fluent_data_waterfall_20_regular": 58552, - "ic_fluent_data_whisker_20_filled": 58553, - "ic_fluent_data_whisker_20_regular": 58554, - "ic_fluent_database_20_filled": 58555, - "ic_fluent_database_20_regular": 58556, - "ic_fluent_database_arrow_down_20_filled": 58557, - "ic_fluent_database_arrow_down_20_regular": 58558, - "ic_fluent_database_arrow_right_20_filled": 58559, - "ic_fluent_database_arrow_right_20_regular": 58560, - "ic_fluent_database_arrow_up_20_filled": 58561, - "ic_fluent_database_arrow_up_20_regular": 58562, - "ic_fluent_database_lightning_20_filled": 58563, - "ic_fluent_database_lightning_20_regular": 58564, - "ic_fluent_database_link_20_filled": 58565, - "ic_fluent_database_link_20_regular": 58566, - "ic_fluent_database_multiple_20_filled": 58567, - "ic_fluent_database_multiple_20_regular": 58568, - "ic_fluent_database_person_20_filled": 58569, - "ic_fluent_database_person_20_regular": 58570, - "ic_fluent_database_plug_connected_20_filled": 58571, - "ic_fluent_database_plug_connected_20_regular": 58572, - "ic_fluent_database_search_20_filled": 58573, - "ic_fluent_database_search_20_regular": 58574, - "ic_fluent_database_switch_20_filled": 58575, - "ic_fluent_database_switch_20_regular": 58576, - "ic_fluent_database_warning_20_filled": 58577, - "ic_fluent_database_warning_20_regular": 58578, - "ic_fluent_database_window_20_filled": 58579, - "ic_fluent_database_window_20_regular": 58580, - "ic_fluent_decimal_arrow_left_20_filled": 58581, - "ic_fluent_decimal_arrow_left_20_regular": 58582, - "ic_fluent_decimal_arrow_right_20_filled": 58583, - "ic_fluent_decimal_arrow_right_20_regular": 58584, - "ic_fluent_delete_20_filled": 58585, - "ic_fluent_delete_20_regular": 58586, - "ic_fluent_delete_arrow_back_20_filled": 58587, - "ic_fluent_delete_arrow_back_20_regular": 58588, - "ic_fluent_delete_dismiss_20_filled": 58589, - "ic_fluent_delete_dismiss_20_regular": 58590, - "ic_fluent_delete_lines_20_filled": 58591, - "ic_fluent_delete_lines_20_regular": 58592, - "ic_fluent_delete_off_20_filled": 58593, - "ic_fluent_delete_off_20_regular": 58594, - "ic_fluent_dentist_20_filled": 58595, - "ic_fluent_dentist_20_regular": 58596, - "ic_fluent_design_ideas_20_filled": 58597, - "ic_fluent_design_ideas_20_regular": 58598, - "ic_fluent_desktop_20_filled": 58599, - "ic_fluent_desktop_20_regular": 58600, - "ic_fluent_desktop_arrow_right_20_filled": 58601, - "ic_fluent_desktop_arrow_right_20_regular": 58602, - "ic_fluent_desktop_cursor_20_filled": 58603, - "ic_fluent_desktop_cursor_20_regular": 58604, - "ic_fluent_desktop_edit_20_filled": 58605, - "ic_fluent_desktop_edit_20_regular": 58606, - "ic_fluent_desktop_flow_20_filled": 58607, - "ic_fluent_desktop_flow_20_regular": 58608, - "ic_fluent_desktop_keyboard_20_filled": 58609, - "ic_fluent_desktop_keyboard_20_regular": 58610, - "ic_fluent_desktop_mac_20_filled": 58611, - "ic_fluent_desktop_mac_20_regular": 58612, - "ic_fluent_desktop_pulse_20_filled": 58613, - "ic_fluent_desktop_pulse_20_regular": 58614, - "ic_fluent_desktop_signal_20_filled": 58615, - "ic_fluent_desktop_signal_20_regular": 58616, - "ic_fluent_desktop_speaker_20_filled": 58617, - "ic_fluent_desktop_speaker_20_regular": 58618, - "ic_fluent_desktop_speaker_off_20_filled": 58619, - "ic_fluent_desktop_speaker_off_20_regular": 58620, - "ic_fluent_desktop_sync_20_filled": 58621, - "ic_fluent_desktop_sync_20_regular": 58622, - "ic_fluent_desktop_toolbox_20_filled": 58623, - "ic_fluent_desktop_toolbox_20_regular": 58624, - "ic_fluent_developer_board_20_filled": 58625, - "ic_fluent_developer_board_20_regular": 58626, - "ic_fluent_developer_board_lightning_20_filled": 58627, - "ic_fluent_developer_board_lightning_20_regular": 58628, - "ic_fluent_developer_board_lightning_toolbox_20_filled": 58629, - "ic_fluent_developer_board_lightning_toolbox_20_regular": 58630, - "ic_fluent_developer_board_search_20_filled": 58631, - "ic_fluent_developer_board_search_20_regular": 58632, - "ic_fluent_device_eq_20_filled": 58633, - "ic_fluent_device_eq_20_regular": 58634, - "ic_fluent_device_meeting_room_20_filled": 58635, - "ic_fluent_device_meeting_room_20_regular": 58636, - "ic_fluent_device_meeting_room_remote_20_filled": 58637, - "ic_fluent_device_meeting_room_remote_20_regular": 58638, - "ic_fluent_diagram_20_filled": 58639, - "ic_fluent_diagram_20_regular": 58640, - "ic_fluent_dialpad_20_filled": 58641, - "ic_fluent_dialpad_20_regular": 58642, - "ic_fluent_dialpad_off_20_filled": 58643, - "ic_fluent_dialpad_off_20_regular": 58644, - "ic_fluent_diamond_20_filled": 58645, - "ic_fluent_diamond_20_regular": 58646, - "ic_fluent_directions_20_filled": 58647, - "ic_fluent_directions_20_regular": 58648, - "ic_fluent_dismiss_20_filled": 58649, - "ic_fluent_dismiss_20_regular": 58650, - "ic_fluent_dismiss_circle_20_filled": 58651, - "ic_fluent_dismiss_circle_20_regular": 58652, - "ic_fluent_dismiss_square_20_filled": 58653, - "ic_fluent_dismiss_square_20_regular": 58654, - "ic_fluent_dismiss_square_multiple_20_filled": 58655, - "ic_fluent_dismiss_square_multiple_20_regular": 58656, - "ic_fluent_diversity_20_filled": 58657, - "ic_fluent_diversity_20_regular": 58658, - "ic_fluent_divider_short_20_filled": 58659, - "ic_fluent_divider_short_20_regular": 58660, - "ic_fluent_divider_tall_20_filled": 58661, - "ic_fluent_divider_tall_20_regular": 58662, - "ic_fluent_dock_20_filled": 58663, - "ic_fluent_dock_20_regular": 58664, - "ic_fluent_dock_row_20_filled": 58665, - "ic_fluent_dock_row_20_regular": 58666, - "ic_fluent_doctor_20_filled": 58667, - "ic_fluent_doctor_20_regular": 58668, - "ic_fluent_document_20_filled": 58669, - "ic_fluent_document_20_regular": 58670, - "ic_fluent_document_add_20_filled": 58671, - "ic_fluent_document_add_20_regular": 58672, - "ic_fluent_document_arrow_down_20_filled": 58673, - "ic_fluent_document_arrow_down_20_regular": 58674, - "ic_fluent_document_arrow_left_20_filled": 58675, - "ic_fluent_document_arrow_left_20_regular": 58676, - "ic_fluent_document_arrow_right_20_filled": 58677, - "ic_fluent_document_arrow_right_20_regular": 58678, - "ic_fluent_document_arrow_up_20_filled": 58679, - "ic_fluent_document_arrow_up_20_regular": 58680, - "ic_fluent_document_briefcase_20_filled": 58681, - "ic_fluent_document_briefcase_20_regular": 58682, - "ic_fluent_document_bullet_list_20_filled": 58683, - "ic_fluent_document_bullet_list_20_regular": 58684, - "ic_fluent_document_bullet_list_clock_20_filled": 58685, - "ic_fluent_document_bullet_list_clock_20_regular": 58686, - "ic_fluent_document_bullet_list_multiple_20_filled": 58687, - "ic_fluent_document_bullet_list_multiple_20_regular": 58688, - "ic_fluent_document_bullet_list_off_20_filled": 58689, - "ic_fluent_document_bullet_list_off_20_regular": 58690, - "ic_fluent_document_catch_up_20_filled": 58691, - "ic_fluent_document_catch_up_20_regular": 58692, - "ic_fluent_document_checkmark_20_filled": 58693, - "ic_fluent_document_checkmark_20_regular": 58694, - "ic_fluent_document_chevron_double_20_filled": 58695, - "ic_fluent_document_chevron_double_20_regular": 58696, - "ic_fluent_document_copy_20_filled": 58697, - "ic_fluent_document_copy_20_regular": 58698, - "ic_fluent_document_css_20_filled": 58699, - "ic_fluent_document_css_20_regular": 58700, - "ic_fluent_document_data_20_filled": 58701, - "ic_fluent_document_data_20_regular": 58702, - "ic_fluent_document_dismiss_20_filled": 58703, - "ic_fluent_document_dismiss_20_regular": 58704, - "ic_fluent_document_edit_20_filled": 58705, - "ic_fluent_document_edit_20_regular": 58706, - "ic_fluent_document_endnote_20_filled": 58707, - "ic_fluent_document_endnote_20_regular": 58708, - "ic_fluent_document_error_20_filled": 58709, - "ic_fluent_document_error_20_regular": 58710, - "ic_fluent_document_flowchart_20_filled": 58711, - "ic_fluent_document_flowchart_20_regular": 58712, - "ic_fluent_document_footer_20_filled": 58713, - "ic_fluent_document_footer_20_regular": 58714, - "ic_fluent_document_footer_dismiss_20_filled": 58715, - "ic_fluent_document_footer_dismiss_20_regular": 58716, - "ic_fluent_document_header_20_filled": 58717, - "ic_fluent_document_header_20_regular": 58718, - "ic_fluent_document_header_arrow_down_20_filled": 58719, - "ic_fluent_document_header_arrow_down_20_regular": 58720, - "ic_fluent_document_header_dismiss_20_filled": 58721, - "ic_fluent_document_header_dismiss_20_regular": 58722, - "ic_fluent_document_header_footer_20_filled": 58723, - "ic_fluent_document_header_footer_20_regular": 58724, - "ic_fluent_document_heart_20_filled": 58725, - "ic_fluent_document_heart_20_regular": 58726, - "ic_fluent_document_heart_pulse_20_filled": 58727, - "ic_fluent_document_heart_pulse_20_regular": 58728, - "ic_fluent_document_javascript_20_filled": 58729, - "ic_fluent_document_javascript_20_regular": 58730, - "ic_fluent_document_landscape_20_filled": 58731, - "ic_fluent_document_landscape_20_regular": 58732, - "ic_fluent_document_landscape_data_20_filled": 58733, - "ic_fluent_document_landscape_data_20_regular": 58734, - "ic_fluent_document_landscape_split_20_filled": 58735, - "ic_fluent_document_landscape_split_20_regular": 58736, - "ic_fluent_document_landscape_split_hint_20_filled": 58737, - "ic_fluent_document_landscape_split_hint_20_regular": 58738, - "ic_fluent_document_link_20_filled": 58739, - "ic_fluent_document_link_20_regular": 58740, - "ic_fluent_document_lock_20_filled": 58741, - "ic_fluent_document_lock_20_regular": 58742, - "ic_fluent_document_margins_20_filled": 58743, - "ic_fluent_document_margins_20_regular": 58744, - "ic_fluent_document_mention_20_filled": 58745, - "ic_fluent_document_mention_20_regular": 58746, - "ic_fluent_document_multiple_20_filled": 58747, - "ic_fluent_document_multiple_20_regular": 58748, - "ic_fluent_document_multiple_percent_20_filled": 58749, - "ic_fluent_document_multiple_percent_20_regular": 58750, - "ic_fluent_document_multiple_prohibited_20_filled": 58751, - "ic_fluent_document_multiple_prohibited_20_regular": 58752, - "ic_fluent_document_multiple_sync_20_filled": 58753, - "ic_fluent_document_multiple_sync_20_regular": 58754, - "ic_fluent_document_one_page_20_filled": 58755, - "ic_fluent_document_one_page_20_regular": 58756, - "ic_fluent_document_page_bottom_center_20_filled": 58757, - "ic_fluent_document_page_bottom_center_20_regular": 58758, - "ic_fluent_document_page_bottom_left_20_filled": 58759, - "ic_fluent_document_page_bottom_left_20_regular": 58760, - "ic_fluent_document_page_bottom_right_20_filled": 58761, - "ic_fluent_document_page_bottom_right_20_regular": 58762, - "ic_fluent_document_page_break_20_filled": 58763, - "ic_fluent_document_page_break_20_regular": 58764, - "ic_fluent_document_page_number_20_filled": 58765, - "ic_fluent_document_page_number_20_regular": 58766, - "ic_fluent_document_page_top_center_20_filled": 58767, - "ic_fluent_document_page_top_center_20_regular": 58768, - "ic_fluent_document_page_top_left_20_filled": 58769, - "ic_fluent_document_page_top_left_20_regular": 58770, - "ic_fluent_document_page_top_right_20_filled": 58771, - "ic_fluent_document_page_top_right_20_regular": 58772, - "ic_fluent_document_pdf_20_filled": 58773, - "ic_fluent_document_pdf_20_regular": 58774, - "ic_fluent_document_percent_20_filled": 58775, - "ic_fluent_document_percent_20_regular": 58776, - "ic_fluent_document_person_20_filled": 58777, - "ic_fluent_document_person_20_regular": 58778, - "ic_fluent_document_pill_20_filled": 58779, - "ic_fluent_document_pill_20_regular": 58780, - "ic_fluent_document_prohibited_20_filled": 58781, - "ic_fluent_document_prohibited_20_regular": 58782, - "ic_fluent_document_question_mark_20_filled": 58783, - "ic_fluent_document_question_mark_20_regular": 58784, - "ic_fluent_document_queue_20_filled": 58785, - "ic_fluent_document_queue_20_regular": 58786, - "ic_fluent_document_queue_add_20_filled": 58787, - "ic_fluent_document_queue_add_20_regular": 58788, - "ic_fluent_document_queue_multiple_20_filled": 58789, - "ic_fluent_document_queue_multiple_20_regular": 58790, - "ic_fluent_document_ribbon_20_filled": 58791, - "ic_fluent_document_ribbon_20_regular": 58792, - "ic_fluent_document_save_20_filled": 58793, - "ic_fluent_document_save_20_regular": 58794, - "ic_fluent_document_search_20_filled": 58795, - "ic_fluent_document_search_20_regular": 58796, - "ic_fluent_document_settings_20_filled": 58797, - "ic_fluent_document_settings_20_regular": 58798, - "ic_fluent_document_split_hint_20_filled": 58799, - "ic_fluent_document_split_hint_20_regular": 58800, - "ic_fluent_document_split_hint_off_20_filled": 58801, - "ic_fluent_document_split_hint_off_20_regular": 58802, - "ic_fluent_document_sync_20_filled": 58803, - "ic_fluent_document_sync_20_regular": 58804, - "ic_fluent_document_table_20_filled": 58805, - "ic_fluent_document_table_20_regular": 58806, - "ic_fluent_document_table_arrow_right_20_filled": 58807, - "ic_fluent_document_table_arrow_right_20_regular": 58808, - "ic_fluent_document_table_checkmark_20_filled": 58809, - "ic_fluent_document_table_checkmark_20_regular": 58810, - "ic_fluent_document_table_cube_20_filled": 58811, - "ic_fluent_document_table_cube_20_regular": 58812, - "ic_fluent_document_table_search_20_filled": 58813, - "ic_fluent_document_table_search_20_regular": 58814, - "ic_fluent_document_table_truck_20_filled": 58815, - "ic_fluent_document_table_truck_20_regular": 58816, - "ic_fluent_document_text_20_filled": 58817, - "ic_fluent_document_text_20_regular": 58818, - "ic_fluent_document_text_clock_20_filled": 58819, - "ic_fluent_document_text_clock_20_regular": 58820, - "ic_fluent_document_text_extract_20_filled": 58821, - "ic_fluent_document_text_extract_20_regular": 58822, - "ic_fluent_document_text_link_20_filled": 58823, - "ic_fluent_document_text_link_20_regular": 58824, - "ic_fluent_document_text_toolbox_20_filled": 58825, - "ic_fluent_document_text_toolbox_20_regular": 58826, - "ic_fluent_document_toolbox_20_filled": 58827, - "ic_fluent_document_toolbox_20_regular": 58828, - "ic_fluent_document_width_20_filled": 58829, - "ic_fluent_document_width_20_regular": 58830, - "ic_fluent_door_20_filled": 58831, - "ic_fluent_door_20_regular": 58832, - "ic_fluent_door_arrow_left_20_filled": 58833, - "ic_fluent_door_arrow_left_20_regular": 58834, - "ic_fluent_door_arrow_right_20_filled": 58835, - "ic_fluent_door_arrow_right_20_regular": 58836, - "ic_fluent_door_tag_20_filled": 58837, - "ic_fluent_door_tag_20_regular": 58838, - "ic_fluent_double_swipe_down_20_filled": 58839, - "ic_fluent_double_swipe_down_20_regular": 58840, - "ic_fluent_double_swipe_up_20_filled": 58841, - "ic_fluent_double_swipe_up_20_regular": 58842, - "ic_fluent_double_tap_swipe_down_20_filled": 58843, - "ic_fluent_double_tap_swipe_down_20_regular": 58844, - "ic_fluent_double_tap_swipe_up_20_filled": 58845, - "ic_fluent_double_tap_swipe_up_20_regular": 58846, - "ic_fluent_drafts_20_filled": 58847, - "ic_fluent_drafts_20_regular": 58848, - "ic_fluent_drag_20_filled": 58849, - "ic_fluent_drag_20_regular": 58850, - "ic_fluent_draw_image_20_filled": 58851, - "ic_fluent_draw_image_20_regular": 58852, - "ic_fluent_draw_shape_20_filled": 58853, - "ic_fluent_draw_shape_20_regular": 58854, - "ic_fluent_draw_text_20_filled": 58855, - "ic_fluent_draw_text_20_regular": 58856, - "ic_fluent_drawer_add_20_filled": 58857, - "ic_fluent_drawer_add_20_regular": 58858, - "ic_fluent_drawer_arrow_download_20_filled": 58859, - "ic_fluent_drawer_arrow_download_20_regular": 58860, - "ic_fluent_drawer_dismiss_20_filled": 58861, - "ic_fluent_drawer_dismiss_20_regular": 58862, - "ic_fluent_drawer_play_20_filled": 58863, - "ic_fluent_drawer_play_20_regular": 58864, - "ic_fluent_drawer_subtract_20_filled": 58865, - "ic_fluent_drawer_subtract_20_regular": 58866, - "ic_fluent_drink_beer_20_filled": 58867, - "ic_fluent_drink_beer_20_regular": 58868, - "ic_fluent_drink_bottle_20_filled": 58869, - "ic_fluent_drink_bottle_20_regular": 58870, - "ic_fluent_drink_bottle_off_20_filled": 58871, - "ic_fluent_drink_bottle_off_20_regular": 58872, - "ic_fluent_drink_coffee_20_filled": 58873, - "ic_fluent_drink_coffee_20_regular": 58874, - "ic_fluent_drink_margarita_20_filled": 58875, - "ic_fluent_drink_margarita_20_regular": 58876, - "ic_fluent_drink_to_go_20_filled": 58877, - "ic_fluent_drink_to_go_20_regular": 58878, - "ic_fluent_drink_wine_20_filled": 58879, - "ic_fluent_drink_wine_20_regular": 58880, - "ic_fluent_drive_train_20_filled": 58881, - "ic_fluent_drive_train_20_regular": 58882, - "ic_fluent_drop_20_filled": 58883, - "ic_fluent_drop_20_regular": 58884, - "ic_fluent_dual_screen_20_filled": 58885, - "ic_fluent_dual_screen_20_regular": 58886, - "ic_fluent_dual_screen_add_20_filled": 58887, - "ic_fluent_dual_screen_add_20_regular": 58888, - "ic_fluent_dual_screen_arrow_right_20_filled": 58889, - "ic_fluent_dual_screen_arrow_right_20_regular": 58890, - "ic_fluent_dual_screen_arrow_up_20_filled": 58891, - "ic_fluent_dual_screen_arrow_up_20_regular": 58892, - "ic_fluent_dual_screen_clock_20_filled": 58893, - "ic_fluent_dual_screen_clock_20_regular": 58894, - "ic_fluent_dual_screen_closed_alert_20_filled": 58895, - "ic_fluent_dual_screen_closed_alert_20_regular": 58896, - "ic_fluent_dual_screen_desktop_20_filled": 58897, - "ic_fluent_dual_screen_desktop_20_regular": 58898, - "ic_fluent_dual_screen_dismiss_20_filled": 58899, - "ic_fluent_dual_screen_dismiss_20_regular": 58900, - "ic_fluent_dual_screen_group_20_filled": 58901, - "ic_fluent_dual_screen_group_20_regular": 58902, - "ic_fluent_dual_screen_header_20_filled": 58903, - "ic_fluent_dual_screen_header_20_regular": 58904, - "ic_fluent_dual_screen_lock_20_filled": 58905, - "ic_fluent_dual_screen_lock_20_regular": 58906, - "ic_fluent_dual_screen_mirror_20_filled": 58907, - "ic_fluent_dual_screen_mirror_20_regular": 58908, - "ic_fluent_dual_screen_pagination_20_filled": 58909, - "ic_fluent_dual_screen_pagination_20_regular": 58910, - "ic_fluent_dual_screen_settings_20_filled": 58911, - "ic_fluent_dual_screen_settings_20_regular": 58912, - "ic_fluent_dual_screen_span_20_filled": 58913, - "ic_fluent_dual_screen_span_20_regular": 58914, - "ic_fluent_dual_screen_speaker_20_filled": 58915, - "ic_fluent_dual_screen_speaker_20_regular": 58916, - "ic_fluent_dual_screen_status_bar_20_filled": 58917, - "ic_fluent_dual_screen_status_bar_20_regular": 58918, - "ic_fluent_dual_screen_tablet_20_filled": 58919, - "ic_fluent_dual_screen_tablet_20_regular": 58920, - "ic_fluent_dual_screen_update_20_filled": 58921, - "ic_fluent_dual_screen_update_20_regular": 58922, - "ic_fluent_dual_screen_vertical_scroll_20_filled": 58923, - "ic_fluent_dual_screen_vertical_scroll_20_regular": 58924, - "ic_fluent_dual_screen_vibrate_20_filled": 58925, - "ic_fluent_dual_screen_vibrate_20_regular": 58926, - "ic_fluent_dumbbell_20_filled": 58927, - "ic_fluent_dumbbell_20_regular": 58928, - "ic_fluent_earth_20_filled": 58929, - "ic_fluent_earth_20_regular": 58930, - "ic_fluent_earth_leaf_20_filled": 58931, - "ic_fluent_earth_leaf_20_regular": 58932, - "ic_fluent_edit_20_filled": 58933, - "ic_fluent_edit_20_regular": 58934, - "ic_fluent_edit_arrow_back_20_filled": 58935, - "ic_fluent_edit_arrow_back_20_regular": 58936, - "ic_fluent_edit_off_20_filled": 58937, - "ic_fluent_edit_off_20_regular": 58938, - "ic_fluent_edit_prohibited_20_filled": 58939, - "ic_fluent_edit_prohibited_20_regular": 58940, - "ic_fluent_edit_settings_20_filled": 58941, - "ic_fluent_edit_settings_20_regular": 58942, - "ic_fluent_emoji_20_filled": 58943, - "ic_fluent_emoji_20_regular": 58944, - "ic_fluent_emoji_add_20_filled": 58945, - "ic_fluent_emoji_add_20_regular": 58946, - "ic_fluent_emoji_angry_20_filled": 58947, - "ic_fluent_emoji_angry_20_regular": 58948, - "ic_fluent_emoji_edit_20_filled": 58949, - "ic_fluent_emoji_edit_20_regular": 58950, - "ic_fluent_emoji_hand_20_filled": 58951, - "ic_fluent_emoji_hand_20_regular": 58952, - "ic_fluent_emoji_laugh_20_filled": 58953, - "ic_fluent_emoji_laugh_20_regular": 58954, - "ic_fluent_emoji_meh_20_filled": 58955, - "ic_fluent_emoji_meh_20_regular": 58956, - "ic_fluent_emoji_multiple_20_filled": 58957, - "ic_fluent_emoji_multiple_20_regular": 58958, - "ic_fluent_emoji_sad_20_filled": 58959, - "ic_fluent_emoji_sad_20_regular": 58960, - "ic_fluent_emoji_sad_slight_20_filled": 58961, - "ic_fluent_emoji_sad_slight_20_regular": 58962, - "ic_fluent_emoji_smile_slight_20_filled": 58963, - "ic_fluent_emoji_smile_slight_20_regular": 58964, - "ic_fluent_emoji_sparkle_20_filled": 58965, - "ic_fluent_emoji_sparkle_20_regular": 58966, - "ic_fluent_emoji_surprise_20_filled": 58967, - "ic_fluent_emoji_surprise_20_regular": 58968, - "ic_fluent_engine_20_filled": 58969, - "ic_fluent_engine_20_regular": 58970, - "ic_fluent_equal_circle_20_filled": 58971, - "ic_fluent_equal_circle_20_regular": 58972, - "ic_fluent_equal_off_20_filled": 58973, - "ic_fluent_equal_off_20_regular": 58974, - "ic_fluent_eraser_20_filled": 58975, - "ic_fluent_eraser_20_regular": 58976, - "ic_fluent_eraser_medium_20_filled": 58977, - "ic_fluent_eraser_medium_20_regular": 58978, - "ic_fluent_eraser_segment_20_filled": 58979, - "ic_fluent_eraser_segment_20_regular": 58980, - "ic_fluent_eraser_small_20_filled": 58981, - "ic_fluent_eraser_small_20_regular": 58982, - "ic_fluent_eraser_tool_20_filled": 58983, - "ic_fluent_eraser_tool_20_regular": 58984, - "ic_fluent_error_circle_20_filled": 58985, - "ic_fluent_error_circle_20_regular": 58986, - "ic_fluent_error_circle_settings_20_filled": 58987, - "ic_fluent_error_circle_settings_20_regular": 58988, - "ic_fluent_expand_up_left_20_filled": 58989, - "ic_fluent_expand_up_left_20_regular": 58990, - "ic_fluent_expand_up_right_20_filled": 58991, - "ic_fluent_expand_up_right_20_regular": 58992, - "ic_fluent_extended_dock_20_filled": 58993, - "ic_fluent_extended_dock_20_regular": 58994, - "ic_fluent_eye_20_filled": 58995, - "ic_fluent_eye_20_regular": 58996, - "ic_fluent_eye_off_20_filled": 58997, - "ic_fluent_eye_off_20_regular": 58998, - "ic_fluent_eye_tracking_20_filled": 58999, - "ic_fluent_eye_tracking_20_regular": 59000, - "ic_fluent_eye_tracking_off_20_filled": 59001, - "ic_fluent_eye_tracking_off_20_regular": 59002, - "ic_fluent_eyedropper_20_filled": 59003, - "ic_fluent_eyedropper_20_regular": 59004, - "ic_fluent_eyedropper_off_20_filled": 59005, - "ic_fluent_eyedropper_off_20_regular": 59006, - "ic_fluent_f_stop_20_filled": 59007, - "ic_fluent_f_stop_20_regular": 59008, - "ic_fluent_fast_acceleration_20_filled": 59009, - "ic_fluent_fast_acceleration_20_regular": 59010, - "ic_fluent_fast_forward_20_filled": 59011, - "ic_fluent_fast_forward_20_regular": 59012, - "ic_fluent_fax_20_filled": 59013, - "ic_fluent_fax_20_regular": 59014, - "ic_fluent_feed_20_filled": 59015, - "ic_fluent_feed_20_regular": 59016, - "ic_fluent_filmstrip_20_filled": 59017, - "ic_fluent_filmstrip_20_regular": 59018, - "ic_fluent_filter_20_filled": 59019, - "ic_fluent_filter_20_regular": 59020, - "ic_fluent_filter_add_20_filled": 59021, - "ic_fluent_filter_add_20_regular": 59022, - "ic_fluent_filter_dismiss_20_filled": 59023, - "ic_fluent_filter_dismiss_20_regular": 59024, - "ic_fluent_filter_sync_20_filled": 59025, - "ic_fluent_filter_sync_20_regular": 59026, - "ic_fluent_fingerprint_20_filled": 59027, - "ic_fluent_fingerprint_20_regular": 59028, - "ic_fluent_fixed_width_20_filled": 59029, - "ic_fluent_fixed_width_20_regular": 59030, - "ic_fluent_flag_20_filled": 59031, - "ic_fluent_flag_20_regular": 59032, - "ic_fluent_flag_off_20_filled": 59033, - "ic_fluent_flag_off_20_regular": 59034, - "ic_fluent_flag_pride_20_filled": 59035, - "ic_fluent_flash_20_filled": 59036, - "ic_fluent_flash_20_regular": 59037, - "ic_fluent_flash_add_20_filled": 59038, - "ic_fluent_flash_add_20_regular": 59039, - "ic_fluent_flash_auto_20_filled": 59040, - "ic_fluent_flash_auto_20_regular": 59041, - "ic_fluent_flash_checkmark_20_filled": 59042, - "ic_fluent_flash_checkmark_20_regular": 59043, - "ic_fluent_flash_flow_20_filled": 59044, - "ic_fluent_flash_flow_20_regular": 59045, - "ic_fluent_flash_off_20_filled": 59046, - "ic_fluent_flash_off_20_regular": 59047, - "ic_fluent_flash_play_20_filled": 59048, - "ic_fluent_flash_play_20_regular": 59049, - "ic_fluent_flash_settings_20_filled": 59050, - "ic_fluent_flash_settings_20_regular": 59051, - "ic_fluent_flashlight_20_filled": 59052, - "ic_fluent_flashlight_20_regular": 59053, - "ic_fluent_flashlight_off_20_filled": 59054, - "ic_fluent_flashlight_off_20_regular": 59055, - "ic_fluent_flip_horizontal_20_filled": 59056, - "ic_fluent_flip_horizontal_20_regular": 59057, - "ic_fluent_flip_vertical_20_filled": 59058, - "ic_fluent_flip_vertical_20_regular": 59059, - "ic_fluent_flow_20_filled": 59060, - "ic_fluent_flow_20_regular": 59061, - "ic_fluent_flowchart_20_filled": 59062, - "ic_fluent_flowchart_20_regular": 59063, - "ic_fluent_flowchart_circle_20_filled": 59064, - "ic_fluent_flowchart_circle_20_regular": 59065, - "ic_fluent_fluent_20_filled": 59066, - "ic_fluent_fluent_20_regular": 59067, - "ic_fluent_fluid_20_filled": 59068, - "ic_fluent_fluid_20_regular": 59069, - "ic_fluent_folder_20_filled": 59070, - "ic_fluent_folder_20_regular": 59071, - "ic_fluent_folder_add_20_filled": 59072, - "ic_fluent_folder_add_20_regular": 59073, - "ic_fluent_folder_arrow_left_20_filled": 59074, - "ic_fluent_folder_arrow_left_20_regular": 59075, - "ic_fluent_folder_arrow_right_20_filled": 59076, - "ic_fluent_folder_arrow_right_20_regular": 59077, - "ic_fluent_folder_arrow_up_20_filled": 59078, - "ic_fluent_folder_arrow_up_20_regular": 59079, - "ic_fluent_folder_briefcase_20_filled": 59080, - "ic_fluent_folder_briefcase_20_regular": 59081, - "ic_fluent_folder_globe_20_filled": 59082, - "ic_fluent_folder_globe_20_regular": 59083, - "ic_fluent_folder_link_20_filled": 59084, - "ic_fluent_folder_link_20_regular": 59085, - "ic_fluent_folder_mail_20_filled": 59086, - "ic_fluent_folder_mail_20_regular": 59087, - "ic_fluent_folder_open_20_filled": 59088, - "ic_fluent_folder_open_20_regular": 59089, - "ic_fluent_folder_open_vertical_20_filled": 59090, - "ic_fluent_folder_open_vertical_20_regular": 59091, - "ic_fluent_folder_people_20_filled": 59092, - "ic_fluent_folder_people_20_regular": 59093, - "ic_fluent_folder_person_20_filled": 59094, - "ic_fluent_folder_person_20_regular": 59095, - "ic_fluent_folder_prohibited_20_filled": 59096, - "ic_fluent_folder_prohibited_20_regular": 59097, - "ic_fluent_folder_swap_20_filled": 59098, - "ic_fluent_folder_swap_20_regular": 59099, - "ic_fluent_folder_sync_20_filled": 59100, - "ic_fluent_folder_sync_20_regular": 59101, - "ic_fluent_folder_zip_20_filled": 59102, - "ic_fluent_folder_zip_20_regular": 59103, - "ic_fluent_font_decrease_20_filled": 59104, - "ic_fluent_font_decrease_20_regular": 59105, - "ic_fluent_font_increase_20_filled": 59106, - "ic_fluent_font_increase_20_regular": 59107, - "ic_fluent_font_space_tracking_in_20_filled": 59108, - "ic_fluent_font_space_tracking_in_20_regular": 59109, - "ic_fluent_font_space_tracking_out_20_filled": 59110, - "ic_fluent_font_space_tracking_out_20_regular": 59111, - "ic_fluent_food_20_filled": 59112, - "ic_fluent_food_20_regular": 59113, - "ic_fluent_food_apple_20_filled": 59114, - "ic_fluent_food_apple_20_regular": 59115, - "ic_fluent_food_cake_20_filled": 59116, - "ic_fluent_food_cake_20_regular": 59117, - "ic_fluent_food_carrot_20_filled": 59118, - "ic_fluent_food_carrot_20_regular": 59119, - "ic_fluent_food_chicken_leg_20_filled": 59120, - "ic_fluent_food_chicken_leg_20_regular": 59121, - "ic_fluent_food_egg_20_filled": 59122, - "ic_fluent_food_egg_20_regular": 59123, - "ic_fluent_food_fish_20_filled": 59124, - "ic_fluent_food_fish_20_regular": 59125, - "ic_fluent_food_grains_20_filled": 59126, - "ic_fluent_food_grains_20_regular": 59127, - "ic_fluent_food_pizza_20_filled": 59128, - "ic_fluent_food_pizza_20_regular": 59129, - "ic_fluent_food_toast_20_filled": 59130, - "ic_fluent_food_toast_20_regular": 59131, - "ic_fluent_form_20_filled": 59132, - "ic_fluent_form_20_regular": 59133, - "ic_fluent_form_multiple_20_filled": 59134, - "ic_fluent_form_multiple_20_regular": 59135, - "ic_fluent_form_new_20_filled": 59136, - "ic_fluent_form_new_20_regular": 59137, - "ic_fluent_fps_120_20_filled": 59138, - "ic_fluent_fps_120_20_regular": 59139, - "ic_fluent_fps_240_20_filled": 59140, - "ic_fluent_fps_240_20_regular": 59141, - "ic_fluent_fps_30_20_filled": 59142, - "ic_fluent_fps_30_20_regular": 59143, - "ic_fluent_fps_60_20_filled": 59144, - "ic_fluent_fps_60_20_regular": 59145, - "ic_fluent_fps_960_20_filled": 59146, - "ic_fluent_fps_960_20_regular": 59147, - "ic_fluent_full_screen_maximize_20_filled": 59148, - "ic_fluent_full_screen_maximize_20_regular": 59149, - "ic_fluent_full_screen_minimize_20_filled": 59150, - "ic_fluent_full_screen_minimize_20_regular": 59151, - "ic_fluent_games_20_filled": 59152, - "ic_fluent_games_20_regular": 59153, - "ic_fluent_gantt_chart_20_filled": 59154, - "ic_fluent_gantt_chart_20_regular": 59155, - "ic_fluent_gas_20_filled": 59156, - "ic_fluent_gas_20_regular": 59157, - "ic_fluent_gas_pump_20_filled": 59158, - "ic_fluent_gas_pump_20_regular": 59159, - "ic_fluent_gather_20_filled": 59160, - "ic_fluent_gather_20_regular": 59161, - "ic_fluent_gauge_20_filled": 59162, - "ic_fluent_gauge_20_regular": 59163, - "ic_fluent_gauge_add_20_filled": 59164, - "ic_fluent_gauge_add_20_regular": 59165, - "ic_fluent_gavel_20_filled": 59166, - "ic_fluent_gavel_20_regular": 59167, - "ic_fluent_gesture_20_filled": 59168, - "ic_fluent_gesture_20_regular": 59169, - "ic_fluent_gif_20_filled": 59170, - "ic_fluent_gif_20_regular": 59171, - "ic_fluent_gift_20_filled": 59172, - "ic_fluent_gift_20_regular": 59173, - "ic_fluent_gift_card_20_filled": 59174, - "ic_fluent_gift_card_20_regular": 59175, - "ic_fluent_gift_card_add_20_filled": 59176, - "ic_fluent_gift_card_add_20_regular": 59177, - "ic_fluent_gift_card_arrow_right_20_filled": 59178, - "ic_fluent_gift_card_arrow_right_20_regular": 59179, - "ic_fluent_gift_card_money_20_filled": 59180, - "ic_fluent_gift_card_money_20_regular": 59181, - "ic_fluent_gift_card_multiple_20_filled": 59182, - "ic_fluent_gift_card_multiple_20_regular": 59183, - "ic_fluent_glance_20_filled": 59184, - "ic_fluent_glance_20_regular": 59185, - "ic_fluent_glance_horizontal_20_filled": 59186, - "ic_fluent_glance_horizontal_20_regular": 59187, - "ic_fluent_glasses_20_filled": 59188, - "ic_fluent_glasses_20_regular": 59189, - "ic_fluent_glasses_off_20_filled": 59190, - "ic_fluent_glasses_off_20_regular": 59191, - "ic_fluent_globe_20_filled": 59192, - "ic_fluent_globe_20_regular": 59193, - "ic_fluent_globe_add_20_filled": 59194, - "ic_fluent_globe_add_20_regular": 59195, - "ic_fluent_globe_clock_20_filled": 59196, - "ic_fluent_globe_clock_20_regular": 59197, - "ic_fluent_globe_desktop_20_filled": 59198, - "ic_fluent_globe_desktop_20_regular": 59199, - "ic_fluent_globe_location_20_filled": 59200, - "ic_fluent_globe_location_20_regular": 59201, - "ic_fluent_globe_person_20_filled": 59202, - "ic_fluent_globe_person_20_regular": 59203, - "ic_fluent_globe_prohibited_20_filled": 59204, - "ic_fluent_globe_prohibited_20_regular": 59205, - "ic_fluent_globe_search_20_filled": 59206, - "ic_fluent_globe_search_20_regular": 59207, - "ic_fluent_globe_shield_20_filled": 59208, - "ic_fluent_globe_shield_20_regular": 59209, - "ic_fluent_globe_star_20_filled": 59210, - "ic_fluent_globe_star_20_regular": 59211, - "ic_fluent_globe_surface_20_filled": 59212, - "ic_fluent_globe_surface_20_regular": 59213, - "ic_fluent_globe_video_20_filled": 59214, - "ic_fluent_globe_video_20_regular": 59215, - "ic_fluent_grid_20_filled": 59216, - "ic_fluent_grid_20_regular": 59217, - "ic_fluent_grid_dots_20_filled": 59218, - "ic_fluent_grid_dots_20_regular": 59219, - "ic_fluent_grid_kanban_20_filled": 59220, - "ic_fluent_grid_kanban_20_regular": 59221, - "ic_fluent_group_20_filled": 59222, - "ic_fluent_group_20_regular": 59223, - "ic_fluent_group_dismiss_20_filled": 59224, - "ic_fluent_group_dismiss_20_regular": 59225, - "ic_fluent_group_list_20_filled": 59226, - "ic_fluent_group_list_20_regular": 59227, - "ic_fluent_group_return_20_filled": 59228, - "ic_fluent_group_return_20_regular": 59229, - "ic_fluent_guardian_20_filled": 59230, - "ic_fluent_guardian_20_regular": 59231, - "ic_fluent_guest_20_filled": 59232, - "ic_fluent_guest_20_regular": 59233, - "ic_fluent_guest_add_20_filled": 59234, - "ic_fluent_guest_add_20_regular": 59235, - "ic_fluent_guitar_20_filled": 59236, - "ic_fluent_guitar_20_regular": 59237, - "ic_fluent_hand_draw_20_filled": 59238, - "ic_fluent_hand_draw_20_regular": 59239, - "ic_fluent_hand_left_20_filled": 59240, - "ic_fluent_hand_left_20_regular": 59241, - "ic_fluent_hand_left_chat_20_filled": 59242, - "ic_fluent_hand_left_chat_20_regular": 59243, - "ic_fluent_hand_open_heart_20_filled": 59244, - "ic_fluent_hand_open_heart_20_regular": 59245, - "ic_fluent_hand_right_20_filled": 59246, - "ic_fluent_hand_right_20_regular": 59247, - "ic_fluent_hand_right_off_20_filled": 59248, - "ic_fluent_hand_right_off_20_regular": 59249, - "ic_fluent_hand_wave_20_filled": 59250, - "ic_fluent_hand_wave_20_regular": 59251, - "ic_fluent_handshake_20_filled": 59252, - "ic_fluent_handshake_20_regular": 59253, - "ic_fluent_hard_drive_20_filled": 59254, - "ic_fluent_hard_drive_20_regular": 59255, - "ic_fluent_hat_graduation_20_filled": 59256, - "ic_fluent_hat_graduation_20_regular": 59257, - "ic_fluent_hd_20_filled": 59258, - "ic_fluent_hd_20_regular": 59259, - "ic_fluent_hdr_20_filled": 59260, - "ic_fluent_hdr_20_regular": 59261, - "ic_fluent_hdr_off_20_filled": 59262, - "ic_fluent_hdr_off_20_regular": 59263, - "ic_fluent_headphones_20_filled": 59264, - "ic_fluent_headphones_20_regular": 59265, - "ic_fluent_headphones_sound_wave_20_filled": 59266, - "ic_fluent_headphones_sound_wave_20_regular": 59267, - "ic_fluent_headset_20_filled": 59268, - "ic_fluent_headset_20_regular": 59269, - "ic_fluent_headset_add_20_filled": 59270, - "ic_fluent_headset_add_20_regular": 59271, - "ic_fluent_headset_vr_20_filled": 59272, - "ic_fluent_headset_vr_20_regular": 59273, - "ic_fluent_heart_20_filled": 59274, - "ic_fluent_heart_20_regular": 59275, - "ic_fluent_heart_broken_20_filled": 59276, - "ic_fluent_heart_broken_20_regular": 59277, - "ic_fluent_heart_circle_20_filled": 59278, - "ic_fluent_heart_circle_20_regular": 59279, - "ic_fluent_heart_pulse_20_filled": 59280, - "ic_fluent_heart_pulse_20_regular": 59281, - "ic_fluent_highlight_20_filled": 59282, - "ic_fluent_highlight_20_regular": 59283, - "ic_fluent_highlight_accent_20_filled": 59284, - "ic_fluent_highlight_link_20_filled": 59285, - "ic_fluent_highlight_link_20_regular": 59286, - "ic_fluent_history_20_filled": 59287, - "ic_fluent_history_20_regular": 59288, - "ic_fluent_history_dismiss_20_filled": 59289, - "ic_fluent_history_dismiss_20_regular": 59290, - "ic_fluent_home_20_filled": 59291, - "ic_fluent_home_20_regular": 59292, - "ic_fluent_home_add_20_filled": 59293, - "ic_fluent_home_add_20_regular": 59294, - "ic_fluent_home_checkmark_20_filled": 59295, - "ic_fluent_home_checkmark_20_regular": 59296, - "ic_fluent_home_database_20_filled": 59297, - "ic_fluent_home_database_20_regular": 59298, - "ic_fluent_home_more_20_filled": 59299, - "ic_fluent_home_more_20_regular": 59300, - "ic_fluent_home_person_20_filled": 59301, - "ic_fluent_home_person_20_regular": 59302, - "ic_fluent_icons_20_filled": 59303, - "ic_fluent_icons_20_regular": 59304, - "ic_fluent_image_20_filled": 59305, - "ic_fluent_image_20_regular": 59306, - "ic_fluent_image_add_20_filled": 59307, - "ic_fluent_image_add_20_regular": 59308, - "ic_fluent_image_alt_text_20_filled": 59309, - "ic_fluent_image_alt_text_20_regular": 59310, - "ic_fluent_image_arrow_back_20_filled": 59311, - "ic_fluent_image_arrow_back_20_regular": 59312, - "ic_fluent_image_arrow_counterclockwise_20_filled": 59313, - "ic_fluent_image_arrow_counterclockwise_20_regular": 59314, - "ic_fluent_image_arrow_forward_20_filled": 59315, - "ic_fluent_image_arrow_forward_20_regular": 59316, - "ic_fluent_image_copy_20_filled": 59317, - "ic_fluent_image_copy_20_regular": 59318, - "ic_fluent_image_edit_20_filled": 59319, - "ic_fluent_image_edit_20_regular": 59320, - "ic_fluent_image_globe_20_filled": 59321, - "ic_fluent_image_globe_20_regular": 59322, - "ic_fluent_image_multiple_20_filled": 59323, - "ic_fluent_image_multiple_20_regular": 59324, - "ic_fluent_image_multiple_off_20_filled": 59325, - "ic_fluent_image_multiple_off_20_regular": 59326, - "ic_fluent_image_off_20_filled": 59327, - "ic_fluent_image_off_20_regular": 59328, - "ic_fluent_image_prohibited_20_filled": 59329, - "ic_fluent_image_prohibited_20_regular": 59330, - "ic_fluent_image_reflection_20_filled": 59331, - "ic_fluent_image_reflection_20_regular": 59332, - "ic_fluent_image_search_20_filled": 59333, - "ic_fluent_image_search_20_regular": 59334, - "ic_fluent_image_shadow_20_filled": 59335, - "ic_fluent_image_shadow_20_regular": 59336, - "ic_fluent_immersive_reader_20_filled": 59337, - "ic_fluent_immersive_reader_20_regular": 59338, - "ic_fluent_important_20_filled": 59339, - "ic_fluent_important_20_regular": 59340, - "ic_fluent_incognito_20_filled": 59341, - "ic_fluent_incognito_20_regular": 59342, - "ic_fluent_info_20_filled": 59343, - "ic_fluent_info_20_regular": 59344, - "ic_fluent_info_shield_20_filled": 59345, - "ic_fluent_info_shield_20_regular": 59346, - "ic_fluent_ink_stroke_20_filled": 59347, - "ic_fluent_ink_stroke_20_regular": 59348, - "ic_fluent_inking_tool_20_filled": 59349, - "ic_fluent_inking_tool_20_regular": 59350, - "ic_fluent_inking_tool_accent_20_filled": 59351, - "ic_fluent_inprivate_account_20_filled": 59352, - "ic_fluent_inprivate_account_20_regular": 59353, - "ic_fluent_insert_20_filled": 59354, - "ic_fluent_insert_20_regular": 59355, - "ic_fluent_ios_chevron_right_20_filled": 59356, - "ic_fluent_ios_chevron_right_20_regular": 59357, - "ic_fluent_iot_20_filled": 59358, - "ic_fluent_iot_20_regular": 59359, - "ic_fluent_javascript_20_filled": 59360, - "ic_fluent_javascript_20_regular": 59361, - "ic_fluent_joystick_20_filled": 59362, - "ic_fluent_joystick_20_regular": 59363, - "ic_fluent_key_20_filled": 59364, - "ic_fluent_key_20_regular": 59365, - "ic_fluent_key_command_20_filled": 59366, - "ic_fluent_key_command_20_regular": 59367, - "ic_fluent_key_multiple_20_filled": 59368, - "ic_fluent_key_multiple_20_regular": 59369, - "ic_fluent_key_reset_20_filled": 59370, - "ic_fluent_key_reset_20_regular": 59371, - "ic_fluent_keyboard_123_20_filled": 59372, - "ic_fluent_keyboard_123_20_regular": 59373, - "ic_fluent_keyboard_20_filled": 59374, - "ic_fluent_keyboard_20_regular": 59375, - "ic_fluent_keyboard_dock_20_filled": 59376, - "ic_fluent_keyboard_dock_20_regular": 59377, - "ic_fluent_keyboard_layout_float_20_filled": 59378, - "ic_fluent_keyboard_layout_float_20_regular": 59379, - "ic_fluent_keyboard_layout_one_handed_left_20_filled": 59380, - "ic_fluent_keyboard_layout_one_handed_left_20_regular": 59381, - "ic_fluent_keyboard_layout_resize_20_filled": 59382, - "ic_fluent_keyboard_layout_resize_20_regular": 59383, - "ic_fluent_keyboard_layout_split_20_filled": 59384, - "ic_fluent_keyboard_layout_split_20_regular": 59385, - "ic_fluent_keyboard_shift_20_filled": 59386, - "ic_fluent_keyboard_shift_20_regular": 59387, - "ic_fluent_keyboard_shift_uppercase_20_filled": 59388, - "ic_fluent_keyboard_shift_uppercase_20_regular": 59389, - "ic_fluent_keyboard_tab_20_filled": 59390, - "ic_fluent_keyboard_tab_20_regular": 59391, - "ic_fluent_laptop_20_filled": 59392, - "ic_fluent_laptop_20_regular": 59393, - "ic_fluent_laptop_dismiss_20_filled": 59394, - "ic_fluent_laptop_dismiss_20_regular": 59395, - "ic_fluent_laser_tool_20_filled": 59396, - "ic_fluent_laser_tool_20_regular": 59397, - "ic_fluent_lasso_20_filled": 59398, - "ic_fluent_lasso_20_regular": 59399, - "ic_fluent_launcher_settings_20_filled": 59400, - "ic_fluent_launcher_settings_20_regular": 59401, - "ic_fluent_layer_20_filled": 59402, - "ic_fluent_layer_20_regular": 59403, - "ic_fluent_leaf_one_20_filled": 59404, - "ic_fluent_leaf_one_20_regular": 59405, - "ic_fluent_leaf_three_20_filled": 59406, - "ic_fluent_leaf_three_20_regular": 59407, - "ic_fluent_leaf_two_20_filled": 59408, - "ic_fluent_leaf_two_20_regular": 59409, - "ic_fluent_learning_app_20_filled": 59410, - "ic_fluent_learning_app_20_regular": 59411, - "ic_fluent_library_20_filled": 59412, - "ic_fluent_library_20_regular": 59413, - "ic_fluent_lightbulb_20_filled": 59414, - "ic_fluent_lightbulb_20_regular": 59415, - "ic_fluent_lightbulb_circle_20_filled": 59416, - "ic_fluent_lightbulb_circle_20_regular": 59417, - "ic_fluent_lightbulb_filament_20_filled": 59418, - "ic_fluent_lightbulb_filament_20_regular": 59419, - "ic_fluent_likert_20_filled": 59420, - "ic_fluent_likert_20_regular": 59421, - "ic_fluent_line_20_filled": 59422, - "ic_fluent_line_20_regular": 59423, - "ic_fluent_line_dashes_20_filled": 59424, - "ic_fluent_line_dashes_20_regular": 59425, - "ic_fluent_line_horizontal_1_20_filled": 59426, - "ic_fluent_line_horizontal_1_20_regular": 59427, - "ic_fluent_line_horizontal_3_20_filled": 59428, - "ic_fluent_line_horizontal_3_20_regular": 59429, - "ic_fluent_line_horizontal_5_20_filled": 59430, - "ic_fluent_line_horizontal_5_20_regular": 59431, - "ic_fluent_line_horizontal_5_error_20_filled": 59432, - "ic_fluent_line_horizontal_5_error_20_regular": 59433, - "ic_fluent_line_style_20_filled": 59434, - "ic_fluent_line_style_20_regular": 59435, - "ic_fluent_link_20_filled": 59436, - "ic_fluent_link_20_regular": 59437, - "ic_fluent_link_dismiss_20_filled": 59438, - "ic_fluent_link_dismiss_20_regular": 59439, - "ic_fluent_link_edit_20_filled": 59440, - "ic_fluent_link_edit_20_regular": 59441, - "ic_fluent_link_square_20_filled": 59442, - "ic_fluent_link_square_20_regular": 59443, - "ic_fluent_link_toolbox_20_filled": 59444, - "ic_fluent_link_toolbox_20_regular": 59445, - "ic_fluent_list_20_filled": 59446, - "ic_fluent_list_20_regular": 59447, - "ic_fluent_live_20_filled": 59448, - "ic_fluent_live_20_regular": 59449, - "ic_fluent_live_off_20_filled": 59450, - "ic_fluent_live_off_20_regular": 59451, - "ic_fluent_local_language_20_filled": 59452, - "ic_fluent_local_language_20_regular": 59453, - "ic_fluent_location_20_filled": 59454, - "ic_fluent_location_20_regular": 59455, - "ic_fluent_location_add_20_filled": 59456, - "ic_fluent_location_add_20_regular": 59457, - "ic_fluent_location_add_left_20_filled": 59458, - "ic_fluent_location_add_left_20_regular": 59459, - "ic_fluent_location_add_right_20_filled": 59460, - "ic_fluent_location_add_right_20_regular": 59461, - "ic_fluent_location_add_up_20_filled": 59462, - "ic_fluent_location_add_up_20_regular": 59463, - "ic_fluent_location_dismiss_20_filled": 59464, - "ic_fluent_location_dismiss_20_regular": 59465, - "ic_fluent_location_live_20_filled": 59466, - "ic_fluent_location_live_20_regular": 59467, - "ic_fluent_location_off_20_filled": 59468, - "ic_fluent_location_off_20_regular": 59469, - "ic_fluent_lock_closed_20_filled": 59470, - "ic_fluent_lock_closed_20_regular": 59471, - "ic_fluent_lock_multiple_20_filled": 59472, - "ic_fluent_lock_multiple_20_regular": 59473, - "ic_fluent_lock_open_20_filled": 59474, - "ic_fluent_lock_open_20_regular": 59475, - "ic_fluent_lock_shield_20_filled": 59476, - "ic_fluent_lock_shield_20_regular": 59477, - "ic_fluent_lottery_20_filled": 59478, - "ic_fluent_lottery_20_regular": 59479, - "ic_fluent_luggage_20_filled": 59480, - "ic_fluent_luggage_20_regular": 59481, - "ic_fluent_mail_20_filled": 59482, - "ic_fluent_mail_20_regular": 59483, - "ic_fluent_mail_add_20_filled": 59484, - "ic_fluent_mail_add_20_regular": 59485, - "ic_fluent_mail_alert_20_filled": 59486, - "ic_fluent_mail_alert_20_regular": 59487, - "ic_fluent_mail_all_read_20_filled": 59488, - "ic_fluent_mail_all_read_20_regular": 59489, - "ic_fluent_mail_all_unread_20_filled": 59490, - "ic_fluent_mail_all_unread_20_regular": 59491, - "ic_fluent_mail_arrow_double_back_20_filled": 59492, - "ic_fluent_mail_arrow_double_back_20_regular": 59493, - "ic_fluent_mail_arrow_down_20_filled": 59494, - "ic_fluent_mail_arrow_down_20_regular": 59495, - "ic_fluent_mail_arrow_forward_20_filled": 59496, - "ic_fluent_mail_arrow_forward_20_regular": 59497, - "ic_fluent_mail_arrow_up_20_filled": 59498, - "ic_fluent_mail_arrow_up_20_regular": 59499, - "ic_fluent_mail_attach_20_filled": 59500, - "ic_fluent_mail_attach_20_regular": 59501, - "ic_fluent_mail_checkmark_20_filled": 59502, - "ic_fluent_mail_checkmark_20_regular": 59503, - "ic_fluent_mail_clock_20_filled": 59504, - "ic_fluent_mail_clock_20_regular": 59505, - "ic_fluent_mail_copy_20_filled": 59506, - "ic_fluent_mail_copy_20_regular": 59507, - "ic_fluent_mail_dismiss_20_filled": 59508, - "ic_fluent_mail_dismiss_20_regular": 59509, - "ic_fluent_mail_edit_20_filled": 59510, - "ic_fluent_mail_edit_20_regular": 59511, - "ic_fluent_mail_error_20_filled": 59512, - "ic_fluent_mail_error_20_regular": 59513, - "ic_fluent_mail_inbox_20_filled": 59514, - "ic_fluent_mail_inbox_20_regular": 59515, - "ic_fluent_mail_inbox_add_20_filled": 59516, - "ic_fluent_mail_inbox_add_20_regular": 59517, - "ic_fluent_mail_inbox_all_20_filled": 59518, - "ic_fluent_mail_inbox_all_20_regular": 59519, - "ic_fluent_mail_inbox_arrow_down_20_filled": 59520, - "ic_fluent_mail_inbox_arrow_down_20_regular": 59521, - "ic_fluent_mail_inbox_arrow_right_20_filled": 59522, - "ic_fluent_mail_inbox_arrow_right_20_regular": 59523, - "ic_fluent_mail_inbox_arrow_up_20_filled": 59524, - "ic_fluent_mail_inbox_arrow_up_20_regular": 59525, - "ic_fluent_mail_inbox_checkmark_20_filled": 59526, - "ic_fluent_mail_inbox_checkmark_20_regular": 59527, - "ic_fluent_mail_inbox_dismiss_20_filled": 59528, - "ic_fluent_mail_inbox_dismiss_20_regular": 59529, - "ic_fluent_mail_link_20_filled": 59530, - "ic_fluent_mail_link_20_regular": 59531, - "ic_fluent_mail_list_20_filled": 59532, - "ic_fluent_mail_list_20_regular": 59533, - "ic_fluent_mail_multiple_20_filled": 59534, - "ic_fluent_mail_multiple_20_regular": 59535, - "ic_fluent_mail_off_20_filled": 59536, - "ic_fluent_mail_off_20_regular": 59537, - "ic_fluent_mail_open_person_20_filled": 59538, - "ic_fluent_mail_open_person_20_regular": 59539, - "ic_fluent_mail_pause_20_filled": 59540, - "ic_fluent_mail_pause_20_regular": 59541, - "ic_fluent_mail_prohibited_20_filled": 59542, - "ic_fluent_mail_prohibited_20_regular": 59543, - "ic_fluent_mail_read_20_filled": 59544, - "ic_fluent_mail_read_20_regular": 59545, - "ic_fluent_mail_read_multiple_20_filled": 59546, - "ic_fluent_mail_read_multiple_20_regular": 59547, - "ic_fluent_mail_settings_20_filled": 59548, - "ic_fluent_mail_settings_20_regular": 59549, - "ic_fluent_mail_shield_20_filled": 59550, - "ic_fluent_mail_shield_20_regular": 59551, - "ic_fluent_mail_template_20_filled": 59552, - "ic_fluent_mail_template_20_regular": 59553, - "ic_fluent_mail_unread_20_filled": 59554, - "ic_fluent_mail_unread_20_regular": 59555, - "ic_fluent_mail_warning_20_filled": 59556, - "ic_fluent_mail_warning_20_regular": 59557, - "ic_fluent_map_20_filled": 59558, - "ic_fluent_map_20_regular": 59559, - "ic_fluent_map_drive_20_filled": 59560, - "ic_fluent_map_drive_20_regular": 59561, - "ic_fluent_markdown_20_filled": 59562, - "ic_fluent_markdown_20_regular": 59563, - "ic_fluent_match_app_layout_20_filled": 59564, - "ic_fluent_match_app_layout_20_regular": 59565, - "ic_fluent_math_format_linear_20_filled": 59566, - "ic_fluent_math_format_linear_20_regular": 59567, - "ic_fluent_math_format_professional_20_filled": 59568, - "ic_fluent_math_format_professional_20_regular": 59569, - "ic_fluent_math_formula_20_filled": 59570, - "ic_fluent_math_formula_20_regular": 59571, - "ic_fluent_math_symbols_20_filled": 59572, - "ic_fluent_math_symbols_20_regular": 59573, - "ic_fluent_maximize_20_filled": 59574, - "ic_fluent_maximize_20_regular": 59575, - "ic_fluent_meet_now_20_filled": 59576, - "ic_fluent_meet_now_20_regular": 59577, - "ic_fluent_megaphone_20_filled": 59578, - "ic_fluent_megaphone_20_regular": 59579, - "ic_fluent_megaphone_loud_20_filled": 59580, - "ic_fluent_megaphone_loud_20_regular": 59581, - "ic_fluent_megaphone_off_20_filled": 59582, - "ic_fluent_megaphone_off_20_regular": 59583, - "ic_fluent_mention_20_filled": 59584, - "ic_fluent_mention_20_regular": 59585, - "ic_fluent_mention_arrow_down_20_filled": 59586, - "ic_fluent_mention_arrow_down_20_regular": 59587, - "ic_fluent_mention_brackets_20_filled": 59588, - "ic_fluent_mention_brackets_20_regular": 59589, - "ic_fluent_merge_20_filled": 59590, - "ic_fluent_merge_20_regular": 59591, - "ic_fluent_mic_20_filled": 59592, - "ic_fluent_mic_20_regular": 59593, - "ic_fluent_mic_off_20_filled": 59594, - "ic_fluent_mic_off_20_regular": 59595, - "ic_fluent_mic_prohibited_20_filled": 59596, - "ic_fluent_mic_prohibited_20_regular": 59597, - "ic_fluent_mic_pulse_20_filled": 59598, - "ic_fluent_mic_pulse_20_regular": 59599, - "ic_fluent_mic_pulse_off_20_filled": 59600, - "ic_fluent_mic_pulse_off_20_regular": 59601, - "ic_fluent_mic_settings_20_filled": 59602, - "ic_fluent_mic_settings_20_regular": 59603, - "ic_fluent_mic_sparkle_20_filled": 59604, - "ic_fluent_mic_sparkle_20_regular": 59605, - "ic_fluent_mic_sync_20_filled": 59606, - "ic_fluent_mic_sync_20_regular": 59607, - "ic_fluent_microscope_20_filled": 59608, - "ic_fluent_microscope_20_regular": 59609, - "ic_fluent_midi_20_filled": 59610, - "ic_fluent_midi_20_regular": 59611, - "ic_fluent_mobile_optimized_20_filled": 59612, - "ic_fluent_mobile_optimized_20_regular": 59613, - "ic_fluent_molecule_20_filled": 59614, - "ic_fluent_molecule_20_regular": 59615, - "ic_fluent_money_20_filled": 59616, - "ic_fluent_money_20_regular": 59617, - "ic_fluent_money_calculator_20_filled": 59618, - "ic_fluent_money_calculator_20_regular": 59619, - "ic_fluent_money_dismiss_20_filled": 59620, - "ic_fluent_money_dismiss_20_regular": 59621, - "ic_fluent_money_hand_20_filled": 59622, - "ic_fluent_money_hand_20_regular": 59623, - "ic_fluent_money_off_20_filled": 59624, - "ic_fluent_money_off_20_regular": 59625, - "ic_fluent_money_settings_20_filled": 59626, - "ic_fluent_money_settings_20_regular": 59627, - "ic_fluent_more_circle_20_filled": 59628, - "ic_fluent_more_circle_20_regular": 59629, - "ic_fluent_more_horizontal_20_filled": 59630, - "ic_fluent_more_horizontal_20_regular": 59631, - "ic_fluent_more_vertical_20_filled": 59632, - "ic_fluent_more_vertical_20_regular": 59633, - "ic_fluent_movies_and_tv_20_filled": 59634, - "ic_fluent_movies_and_tv_20_regular": 59635, - "ic_fluent_multiplier_1_2x_20_filled": 59636, - "ic_fluent_multiplier_1_2x_20_regular": 59637, - "ic_fluent_multiplier_1_5x_20_filled": 59638, - "ic_fluent_multiplier_1_5x_20_regular": 59639, - "ic_fluent_multiplier_1_8x_20_filled": 59640, - "ic_fluent_multiplier_1_8x_20_regular": 59641, - "ic_fluent_multiplier_1x_20_filled": 59642, - "ic_fluent_multiplier_1x_20_regular": 59643, - "ic_fluent_multiplier_2x_20_filled": 59644, - "ic_fluent_multiplier_2x_20_regular": 59645, - "ic_fluent_multiplier_5x_20_filled": 59646, - "ic_fluent_multiplier_5x_20_regular": 59647, - "ic_fluent_multiselect_ltr_20_filled": 59648, - "ic_fluent_multiselect_ltr_20_regular": 59649, - "ic_fluent_multiselect_rtl_20_filled": 59650, - "ic_fluent_multiselect_rtl_20_regular": 59651, - "ic_fluent_music_note_1_20_filled": 59652, - "ic_fluent_music_note_1_20_regular": 59653, - "ic_fluent_music_note_2_20_filled": 59654, - "ic_fluent_music_note_2_20_regular": 59655, - "ic_fluent_music_note_2_play_20_filled": 59656, - "ic_fluent_music_note_2_play_20_regular": 59657, - "ic_fluent_music_note_off_1_20_filled": 59658, - "ic_fluent_music_note_off_1_20_regular": 59659, - "ic_fluent_music_note_off_2_20_filled": 59660, - "ic_fluent_music_note_off_2_20_regular": 59661, - "ic_fluent_my_location_20_filled": 59662, - "ic_fluent_my_location_20_regular": 59663, - "ic_fluent_navigation_20_filled": 59664, - "ic_fluent_navigation_20_regular": 59665, - "ic_fluent_navigation_location_target_20_filled": 59666, - "ic_fluent_navigation_location_target_20_regular": 59667, - "ic_fluent_navigation_play_20_filled": 59668, - "ic_fluent_navigation_play_20_regular": 59669, - "ic_fluent_navigation_unread_20_filled": 59670, - "ic_fluent_navigation_unread_20_regular": 59671, - "ic_fluent_network_check_20_filled": 59672, - "ic_fluent_network_check_20_regular": 59673, - "ic_fluent_new_20_filled": 59674, - "ic_fluent_new_20_regular": 59675, - "ic_fluent_news_20_filled": 59676, - "ic_fluent_news_20_regular": 59677, - "ic_fluent_next_20_filled": 59678, - "ic_fluent_next_20_regular": 59679, - "ic_fluent_note_20_filled": 59680, - "ic_fluent_note_20_regular": 59681, - "ic_fluent_note_add_20_filled": 59682, - "ic_fluent_note_add_20_regular": 59683, - "ic_fluent_note_edit_20_filled": 59684, - "ic_fluent_note_edit_20_regular": 59685, - "ic_fluent_note_pin_20_filled": 59686, - "ic_fluent_note_pin_20_regular": 59687, - "ic_fluent_notebook_20_filled": 59688, - "ic_fluent_notebook_20_regular": 59689, - "ic_fluent_notebook_add_20_filled": 59690, - "ic_fluent_notebook_add_20_regular": 59691, - "ic_fluent_notebook_arrow_curve_down_20_filled": 59692, - "ic_fluent_notebook_arrow_curve_down_20_regular": 59693, - "ic_fluent_notebook_error_20_filled": 59694, - "ic_fluent_notebook_error_20_regular": 59695, - "ic_fluent_notebook_eye_20_filled": 59696, - "ic_fluent_notebook_eye_20_regular": 59697, - "ic_fluent_notebook_lightning_20_filled": 59698, - "ic_fluent_notebook_lightning_20_regular": 59699, - "ic_fluent_notebook_question_mark_20_filled": 59700, - "ic_fluent_notebook_question_mark_20_regular": 59701, - "ic_fluent_notebook_section_20_filled": 59702, - "ic_fluent_notebook_section_20_regular": 59703, - "ic_fluent_notebook_subsection_20_filled": 59704, - "ic_fluent_notebook_subsection_20_regular": 59705, - "ic_fluent_notebook_sync_20_filled": 59706, - "ic_fluent_notebook_sync_20_regular": 59707, - "ic_fluent_notepad_20_filled": 59708, - "ic_fluent_notepad_20_regular": 59709, - "ic_fluent_notepad_edit_20_filled": 59710, - "ic_fluent_notepad_edit_20_regular": 59711, - "ic_fluent_notepad_person_20_filled": 59712, - "ic_fluent_notepad_person_20_regular": 59713, - "ic_fluent_number_circle_1_20_filled": 59714, - "ic_fluent_number_circle_1_20_regular": 59715, - "ic_fluent_number_row_20_filled": 59716, - "ic_fluent_number_row_20_regular": 59717, - "ic_fluent_number_symbol_20_filled": 59718, - "ic_fluent_number_symbol_20_regular": 59719, - "ic_fluent_number_symbol_dismiss_20_filled": 59720, - "ic_fluent_number_symbol_dismiss_20_regular": 59721, - "ic_fluent_number_symbol_square_20_filled": 59722, - "ic_fluent_number_symbol_square_20_regular": 59723, - "ic_fluent_open_20_filled": 59724, - "ic_fluent_open_20_regular": 59725, - "ic_fluent_open_folder_20_filled": 59726, - "ic_fluent_open_folder_20_regular": 59727, - "ic_fluent_open_off_20_filled": 59728, - "ic_fluent_open_off_20_regular": 59729, - "ic_fluent_options_20_filled": 59730, - "ic_fluent_options_20_regular": 59731, - "ic_fluent_organization_20_filled": 59732, - "ic_fluent_organization_20_regular": 59733, - "ic_fluent_organization_horizontal_20_filled": 59734, - "ic_fluent_organization_horizontal_20_regular": 59735, - "ic_fluent_orientation_20_filled": 59736, - "ic_fluent_orientation_20_regular": 59737, - "ic_fluent_oval_20_filled": 59738, - "ic_fluent_oval_20_regular": 59739, - "ic_fluent_padding_down_20_filled": 59740, - "ic_fluent_padding_down_20_regular": 59741, - "ic_fluent_padding_left_20_filled": 59742, - "ic_fluent_padding_left_20_regular": 59743, - "ic_fluent_padding_right_20_filled": 59744, - "ic_fluent_padding_right_20_regular": 59745, - "ic_fluent_padding_top_20_filled": 59746, - "ic_fluent_padding_top_20_regular": 59747, - "ic_fluent_page_fit_20_filled": 59748, - "ic_fluent_page_fit_20_regular": 59749, - "ic_fluent_paint_brush_20_filled": 59750, - "ic_fluent_paint_brush_20_regular": 59751, - "ic_fluent_paint_brush_arrow_down_20_filled": 59752, - "ic_fluent_paint_brush_arrow_down_20_regular": 59753, - "ic_fluent_paint_brush_arrow_up_20_filled": 59754, - "ic_fluent_paint_brush_arrow_up_20_regular": 59755, - "ic_fluent_paint_bucket_20_filled": 59756, - "ic_fluent_paint_bucket_20_regular": 59757, - "ic_fluent_pair_20_filled": 59758, - "ic_fluent_pair_20_regular": 59759, - "ic_fluent_panel_bottom_20_filled": 59760, - "ic_fluent_panel_bottom_20_regular": 59761, - "ic_fluent_panel_bottom_contract_20_filled": 59762, - "ic_fluent_panel_bottom_contract_20_regular": 59763, - "ic_fluent_panel_bottom_expand_20_filled": 59764, - "ic_fluent_panel_bottom_expand_20_regular": 59765, - "ic_fluent_panel_left_20_filled": 59766, - "ic_fluent_panel_left_20_regular": 59767, - "ic_fluent_panel_left_contract_20_filled": 59768, - "ic_fluent_panel_left_contract_20_regular": 59769, - "ic_fluent_panel_left_expand_20_filled": 59770, - "ic_fluent_panel_left_expand_20_regular": 59771, - "ic_fluent_panel_left_focus_right_20_filled": 59772, - "ic_fluent_panel_right_20_filled": 59773, - "ic_fluent_panel_right_20_regular": 59774, - "ic_fluent_panel_right_add_20_filled": 59775, - "ic_fluent_panel_right_add_20_regular": 59776, - "ic_fluent_panel_right_contract_20_filled": 59777, - "ic_fluent_panel_right_contract_20_regular": 59778, - "ic_fluent_panel_right_expand_20_filled": 59779, - "ic_fluent_panel_right_expand_20_regular": 59780, - "ic_fluent_panel_separate_window_20_filled": 59781, - "ic_fluent_panel_separate_window_20_regular": 59782, - "ic_fluent_panel_top_contract_20_filled": 59783, - "ic_fluent_panel_top_contract_20_regular": 59784, - "ic_fluent_panel_top_expand_20_filled": 59785, - "ic_fluent_panel_top_expand_20_regular": 59786, - "ic_fluent_password_20_filled": 59787, - "ic_fluent_password_20_regular": 59788, - "ic_fluent_patch_20_filled": 59789, - "ic_fluent_patch_20_regular": 59790, - "ic_fluent_patient_20_filled": 59791, - "ic_fluent_patient_20_regular": 59792, - "ic_fluent_pause_20_filled": 59793, - "ic_fluent_pause_20_regular": 59794, - "ic_fluent_pause_circle_20_filled": 59795, - "ic_fluent_pause_circle_20_regular": 59796, - "ic_fluent_pause_off_20_filled": 59797, - "ic_fluent_pause_off_20_regular": 59798, - "ic_fluent_pause_settings_20_filled": 59799, - "ic_fluent_pause_settings_20_regular": 59800, - "ic_fluent_payment_20_filled": 59801, - "ic_fluent_payment_20_regular": 59802, - "ic_fluent_pen_20_filled": 59803, - "ic_fluent_pen_20_regular": 59804, - "ic_fluent_pen_off_20_filled": 59805, - "ic_fluent_pen_off_20_regular": 59806, - "ic_fluent_pen_prohibited_20_filled": 59807, - "ic_fluent_pen_prohibited_20_regular": 59808, - "ic_fluent_pentagon_20_filled": 59809, - "ic_fluent_pentagon_20_regular": 59810, - "ic_fluent_people_20_filled": 59811, - "ic_fluent_people_20_regular": 59812, - "ic_fluent_people_add_20_filled": 59813, - "ic_fluent_people_add_20_regular": 59814, - "ic_fluent_people_audience_20_filled": 59815, - "ic_fluent_people_audience_20_regular": 59816, - "ic_fluent_people_call_20_filled": 59817, - "ic_fluent_people_call_20_regular": 59818, - "ic_fluent_people_checkmark_20_filled": 59819, - "ic_fluent_people_checkmark_20_regular": 59820, - "ic_fluent_people_community_20_filled": 59821, - "ic_fluent_people_community_20_regular": 59822, - "ic_fluent_people_community_add_20_filled": 59823, - "ic_fluent_people_community_add_20_regular": 59824, - "ic_fluent_people_edit_20_filled": 59825, - "ic_fluent_people_edit_20_regular": 59826, - "ic_fluent_people_error_20_filled": 59827, - "ic_fluent_people_error_20_regular": 59828, - "ic_fluent_people_list_20_filled": 59829, - "ic_fluent_people_list_20_regular": 59830, - "ic_fluent_people_lock_20_filled": 59831, - "ic_fluent_people_lock_20_regular": 59832, - "ic_fluent_people_money_20_filled": 59833, - "ic_fluent_people_money_20_regular": 59834, - "ic_fluent_people_prohibited_20_filled": 59835, - "ic_fluent_people_prohibited_20_regular": 59836, - "ic_fluent_people_queue_20_filled": 59837, - "ic_fluent_people_queue_20_regular": 59838, - "ic_fluent_people_search_20_filled": 59839, - "ic_fluent_people_search_20_regular": 59840, - "ic_fluent_people_settings_20_filled": 59841, - "ic_fluent_people_settings_20_regular": 59842, - "ic_fluent_people_swap_20_filled": 59843, - "ic_fluent_people_swap_20_regular": 59844, - "ic_fluent_people_sync_20_filled": 59845, - "ic_fluent_people_sync_20_regular": 59846, - "ic_fluent_people_team_20_filled": 59847, - "ic_fluent_people_team_20_regular": 59848, - "ic_fluent_people_team_add_20_filled": 59849, - "ic_fluent_people_team_add_20_regular": 59850, - "ic_fluent_people_team_delete_20_filled": 59851, - "ic_fluent_people_team_delete_20_regular": 59852, - "ic_fluent_people_team_toolbox_20_filled": 59853, - "ic_fluent_people_team_toolbox_20_regular": 59854, - "ic_fluent_people_toolbox_20_filled": 59855, - "ic_fluent_people_toolbox_20_regular": 59856, - "ic_fluent_person_20_filled": 59857, - "ic_fluent_person_20_regular": 59858, - "ic_fluent_person_5_20_filled": 59859, - "ic_fluent_person_5_20_regular": 59860, - "ic_fluent_person_6_20_filled": 59861, - "ic_fluent_person_6_20_regular": 59862, - "ic_fluent_person_accounts_20_filled": 59863, - "ic_fluent_person_accounts_20_regular": 59864, - "ic_fluent_person_add_20_filled": 59865, - "ic_fluent_person_add_20_regular": 59866, - "ic_fluent_person_arrow_left_20_filled": 59867, - "ic_fluent_person_arrow_left_20_regular": 59868, - "ic_fluent_person_arrow_right_20_filled": 59869, - "ic_fluent_person_arrow_right_20_regular": 59870, - "ic_fluent_person_available_20_filled": 59871, - "ic_fluent_person_available_20_regular": 59872, - "ic_fluent_person_board_20_filled": 59873, - "ic_fluent_person_board_20_regular": 59874, - "ic_fluent_person_call_20_filled": 59875, - "ic_fluent_person_call_20_regular": 59876, - "ic_fluent_person_chat_20_filled": 59877, - "ic_fluent_person_chat_20_regular": 59878, - "ic_fluent_person_circle_20_filled": 59879, - "ic_fluent_person_circle_20_regular": 59880, - "ic_fluent_person_clock_20_filled": 59881, - "ic_fluent_person_clock_20_regular": 59882, - "ic_fluent_person_delete_20_filled": 59883, - "ic_fluent_person_delete_20_regular": 59884, - "ic_fluent_person_edit_20_filled": 59885, - "ic_fluent_person_edit_20_regular": 59886, - "ic_fluent_person_feedback_20_filled": 59887, - "ic_fluent_person_feedback_20_regular": 59888, - "ic_fluent_person_heart_20_filled": 59889, - "ic_fluent_person_heart_20_regular": 59890, - "ic_fluent_person_info_20_filled": 59891, - "ic_fluent_person_info_20_regular": 59892, - "ic_fluent_person_key_20_filled": 59893, - "ic_fluent_person_key_20_regular": 59894, - "ic_fluent_person_lightbulb_20_filled": 59895, - "ic_fluent_person_lightbulb_20_regular": 59896, - "ic_fluent_person_lock_20_filled": 59897, - "ic_fluent_person_lock_20_regular": 59898, - "ic_fluent_person_mail_20_filled": 59899, - "ic_fluent_person_mail_20_regular": 59900, - "ic_fluent_person_money_20_filled": 59901, - "ic_fluent_person_money_20_regular": 59902, - "ic_fluent_person_note_20_filled": 59903, - "ic_fluent_person_note_20_regular": 59904, - "ic_fluent_person_pill_20_filled": 59905, - "ic_fluent_person_pill_20_regular": 59906, - "ic_fluent_person_prohibited_20_filled": 59907, - "ic_fluent_person_prohibited_20_regular": 59908, - "ic_fluent_person_question_mark_20_filled": 59909, - "ic_fluent_person_question_mark_20_regular": 59910, - "ic_fluent_person_running_20_filled": 59911, - "ic_fluent_person_running_20_regular": 59912, - "ic_fluent_person_settings_20_filled": 59913, - "ic_fluent_person_settings_20_regular": 59914, - "ic_fluent_person_star_20_filled": 59915, - "ic_fluent_person_star_20_regular": 59916, - "ic_fluent_person_subtract_20_filled": 59917, - "ic_fluent_person_subtract_20_regular": 59918, - "ic_fluent_person_support_20_filled": 59919, - "ic_fluent_person_support_20_regular": 59920, - "ic_fluent_person_swap_20_filled": 59921, - "ic_fluent_person_swap_20_regular": 59922, - "ic_fluent_person_sync_20_filled": 59923, - "ic_fluent_person_sync_20_regular": 59924, - "ic_fluent_person_tag_20_filled": 59925, - "ic_fluent_person_tag_20_regular": 59926, - "ic_fluent_person_voice_20_filled": 59927, - "ic_fluent_person_voice_20_regular": 59928, - "ic_fluent_phone_20_filled": 59929, - "ic_fluent_phone_20_regular": 59930, - "ic_fluent_phone_add_20_filled": 59931, - "ic_fluent_phone_add_20_regular": 59932, - "ic_fluent_phone_arrow_right_20_filled": 59933, - "ic_fluent_phone_arrow_right_20_regular": 59934, - "ic_fluent_phone_checkmark_20_filled": 59935, - "ic_fluent_phone_checkmark_20_regular": 59936, - "ic_fluent_phone_desktop_20_filled": 59937, - "ic_fluent_phone_desktop_20_regular": 59938, - "ic_fluent_phone_desktop_add_20_filled": 59939, - "ic_fluent_phone_desktop_add_20_regular": 59940, - "ic_fluent_phone_dismiss_20_filled": 59941, - "ic_fluent_phone_dismiss_20_regular": 59942, - "ic_fluent_phone_eraser_20_filled": 59943, - "ic_fluent_phone_eraser_20_regular": 59944, - "ic_fluent_phone_key_20_filled": 59945, - "ic_fluent_phone_key_20_regular": 59946, - "ic_fluent_phone_laptop_20_filled": 59947, - "ic_fluent_phone_laptop_20_regular": 59948, - "ic_fluent_phone_link_setup_20_filled": 59949, - "ic_fluent_phone_link_setup_20_regular": 59950, - "ic_fluent_phone_lock_20_filled": 59951, - "ic_fluent_phone_lock_20_regular": 59952, - "ic_fluent_phone_page_header_20_filled": 59953, - "ic_fluent_phone_page_header_20_regular": 59954, - "ic_fluent_phone_pagination_20_filled": 59955, - "ic_fluent_phone_pagination_20_regular": 59956, - "ic_fluent_phone_screen_time_20_filled": 59957, - "ic_fluent_phone_screen_time_20_regular": 59958, - "ic_fluent_phone_shake_20_filled": 59959, - "ic_fluent_phone_shake_20_regular": 59960, - "ic_fluent_phone_span_in_20_filled": 59961, - "ic_fluent_phone_span_in_20_regular": 59962, - "ic_fluent_phone_span_out_20_filled": 59963, - "ic_fluent_phone_span_out_20_regular": 59964, - "ic_fluent_phone_speaker_20_filled": 59965, - "ic_fluent_phone_speaker_20_regular": 59966, - "ic_fluent_phone_status_bar_20_filled": 59967, - "ic_fluent_phone_status_bar_20_regular": 59968, - "ic_fluent_phone_tablet_20_filled": 59969, - "ic_fluent_phone_tablet_20_regular": 59970, - "ic_fluent_phone_update_20_filled": 59971, - "ic_fluent_phone_update_20_regular": 59972, - "ic_fluent_phone_update_checkmark_20_filled": 59973, - "ic_fluent_phone_update_checkmark_20_regular": 59974, - "ic_fluent_phone_vertical_scroll_20_filled": 59975, - "ic_fluent_phone_vertical_scroll_20_regular": 59976, - "ic_fluent_phone_vibrate_20_filled": 59977, - "ic_fluent_phone_vibrate_20_regular": 59978, - "ic_fluent_photo_filter_20_filled": 59979, - "ic_fluent_photo_filter_20_regular": 59980, - "ic_fluent_pi_20_filled": 59981, - "ic_fluent_pi_20_regular": 59982, - "ic_fluent_picture_in_picture_20_filled": 59983, - "ic_fluent_picture_in_picture_20_regular": 59984, - "ic_fluent_picture_in_picture_enter_20_filled": 59985, - "ic_fluent_picture_in_picture_enter_20_regular": 59986, - "ic_fluent_picture_in_picture_exit_20_filled": 59987, - "ic_fluent_picture_in_picture_exit_20_regular": 59988, - "ic_fluent_pill_20_filled": 59989, - "ic_fluent_pill_20_regular": 59990, - "ic_fluent_pin_20_filled": 59991, - "ic_fluent_pin_20_regular": 59992, - "ic_fluent_pin_off_20_filled": 59993, - "ic_fluent_pin_off_20_regular": 59994, - "ic_fluent_pipeline_20_filled": 59995, - "ic_fluent_pipeline_20_regular": 59996, - "ic_fluent_pipeline_add_20_filled": 59997, - "ic_fluent_pipeline_add_20_regular": 59998, - "ic_fluent_pipeline_arrow_curve_down_20_filled": 59999, - "ic_fluent_pipeline_arrow_curve_down_20_regular": 60000, - "ic_fluent_pipeline_play_20_filled": 60001, - "ic_fluent_pipeline_play_20_regular": 60002, - "ic_fluent_pivot_20_filled": 60003, - "ic_fluent_pivot_20_regular": 60004, - "ic_fluent_play_20_filled": 60005, - "ic_fluent_play_20_regular": 60006, - "ic_fluent_play_circle_20_filled": 60007, - "ic_fluent_play_circle_20_regular": 60008, - "ic_fluent_play_settings_20_filled": 60009, - "ic_fluent_play_settings_20_regular": 60010, - "ic_fluent_playing_cards_20_filled": 60011, - "ic_fluent_playing_cards_20_regular": 60012, - "ic_fluent_plug_connected_20_filled": 60013, - "ic_fluent_plug_connected_20_regular": 60014, - "ic_fluent_plug_connected_add_20_filled": 60015, - "ic_fluent_plug_connected_add_20_regular": 60016, - "ic_fluent_plug_connected_checkmark_20_filled": 60017, - "ic_fluent_plug_connected_checkmark_20_regular": 60018, - "ic_fluent_plug_disconnected_20_filled": 60019, - "ic_fluent_plug_disconnected_20_regular": 60020, - "ic_fluent_point_scan_20_filled": 60021, - "ic_fluent_point_scan_20_regular": 60022, - "ic_fluent_poll_20_filled": 60023, - "ic_fluent_poll_20_regular": 60024, - "ic_fluent_port_hdmi_20_filled": 60025, - "ic_fluent_port_hdmi_20_regular": 60026, - "ic_fluent_port_micro_usb_20_filled": 60027, - "ic_fluent_port_micro_usb_20_regular": 60028, - "ic_fluent_port_usb_a_20_filled": 60029, - "ic_fluent_port_usb_a_20_regular": 60030, - "ic_fluent_port_usb_c_20_filled": 60031, - "ic_fluent_port_usb_c_20_regular": 60032, - "ic_fluent_position_backward_20_filled": 60033, - "ic_fluent_position_backward_20_regular": 60034, - "ic_fluent_position_forward_20_filled": 60035, - "ic_fluent_position_forward_20_regular": 60036, - "ic_fluent_position_to_back_20_filled": 60037, - "ic_fluent_position_to_back_20_regular": 60038, - "ic_fluent_position_to_front_20_filled": 60039, - "ic_fluent_position_to_front_20_regular": 60040, - "ic_fluent_power_20_filled": 60041, - "ic_fluent_power_20_regular": 60042, - "ic_fluent_predictions_20_filled": 60043, - "ic_fluent_predictions_20_regular": 60044, - "ic_fluent_premium_20_filled": 60045, - "ic_fluent_premium_20_regular": 60046, - "ic_fluent_premium_person_20_filled": 60047, - "ic_fluent_premium_person_20_regular": 60048, - "ic_fluent_presence_available_20_filled": 60049, - "ic_fluent_presence_available_20_regular": 60050, - "ic_fluent_presence_away_20_filled": 60051, - "ic_fluent_presence_blocked_20_regular": 60052, - "ic_fluent_presence_busy_20_filled": 60053, - "ic_fluent_presence_dnd_20_filled": 60054, - "ic_fluent_presence_dnd_20_regular": 60055, - "ic_fluent_presence_offline_20_regular": 60056, - "ic_fluent_presence_oof_20_regular": 60057, - "ic_fluent_presence_unknown_20_regular": 60058, - "ic_fluent_presenter_20_filled": 60059, - "ic_fluent_presenter_20_regular": 60060, - "ic_fluent_presenter_off_20_filled": 60061, - "ic_fluent_presenter_off_20_regular": 60062, - "ic_fluent_preview_link_20_filled": 60063, - "ic_fluent_preview_link_20_regular": 60064, - "ic_fluent_previous_20_filled": 60065, - "ic_fluent_previous_20_regular": 60066, - "ic_fluent_print_20_filled": 60067, - "ic_fluent_print_20_regular": 60068, - "ic_fluent_print_add_20_filled": 60069, - "ic_fluent_print_add_20_regular": 60070, - "ic_fluent_production_20_filled": 60071, - "ic_fluent_production_20_regular": 60072, - "ic_fluent_production_checkmark_20_filled": 60073, - "ic_fluent_production_checkmark_20_regular": 60074, - "ic_fluent_prohibited_20_filled": 60075, - "ic_fluent_prohibited_20_regular": 60076, - "ic_fluent_prohibited_multiple_20_filled": 60077, - "ic_fluent_prohibited_multiple_20_regular": 60078, - "ic_fluent_prohibited_note_20_filled": 60079, - "ic_fluent_prohibited_note_20_regular": 60080, - "ic_fluent_projection_screen_20_filled": 60081, - "ic_fluent_projection_screen_20_regular": 60082, - "ic_fluent_projection_screen_dismiss_20_filled": 60083, - "ic_fluent_projection_screen_dismiss_20_regular": 60084, - "ic_fluent_protocol_handler_20_filled": 60085, - "ic_fluent_protocol_handler_20_regular": 60086, - "ic_fluent_pulse_20_filled": 60087, - "ic_fluent_pulse_20_regular": 60088, - "ic_fluent_pulse_square_20_filled": 60089, - "ic_fluent_pulse_square_20_regular": 60090, - "ic_fluent_puzzle_cube_20_filled": 60091, - "ic_fluent_puzzle_cube_20_regular": 60092, - "ic_fluent_puzzle_cube_piece_20_filled": 60093, - "ic_fluent_puzzle_cube_piece_20_regular": 60094, - "ic_fluent_puzzle_piece_20_filled": 60095, - "ic_fluent_puzzle_piece_20_regular": 60096, - "ic_fluent_puzzle_piece_shield_20_filled": 60097, - "ic_fluent_puzzle_piece_shield_20_regular": 60098, - "ic_fluent_qr_code_20_filled": 60099, - "ic_fluent_qr_code_20_regular": 60100, - "ic_fluent_question_20_filled": 60101, - "ic_fluent_question_20_regular": 60102, - "ic_fluent_question_circle_20_filled": 60103, - "ic_fluent_question_circle_20_regular": 60104, - "ic_fluent_quiz_new_20_filled": 60105, - "ic_fluent_quiz_new_20_regular": 60106, - "ic_fluent_radar_20_filled": 60107, - "ic_fluent_radar_20_regular": 60108, - "ic_fluent_radar_checkmark_20_filled": 60109, - "ic_fluent_radar_checkmark_20_regular": 60110, - "ic_fluent_radar_rectangle_multiple_20_filled": 60111, - "ic_fluent_radar_rectangle_multiple_20_regular": 60112, - "ic_fluent_radio_button_20_filled": 60113, - "ic_fluent_radio_button_20_regular": 60114, - "ic_fluent_ram_20_filled": 60115, - "ic_fluent_ram_20_regular": 60116, - "ic_fluent_rating_mature_20_filled": 60117, - "ic_fluent_rating_mature_20_regular": 60118, - "ic_fluent_ratio_one_to_one_20_filled": 60119, - "ic_fluent_ratio_one_to_one_20_regular": 60120, - "ic_fluent_re_order_dots_horizontal_20_filled": 60121, - "ic_fluent_re_order_dots_horizontal_20_regular": 60122, - "ic_fluent_re_order_dots_vertical_20_filled": 60123, - "ic_fluent_re_order_dots_vertical_20_regular": 60124, - "ic_fluent_read_aloud_20_filled": 60125, - "ic_fluent_read_aloud_20_regular": 60126, - "ic_fluent_reading_list_20_filled": 60127, - "ic_fluent_reading_list_20_regular": 60128, - "ic_fluent_reading_list_add_20_filled": 60129, - "ic_fluent_reading_list_add_20_regular": 60130, - "ic_fluent_reading_mode_mobile_20_filled": 60131, - "ic_fluent_reading_mode_mobile_20_regular": 60132, - "ic_fluent_real_estate_20_filled": 60133, - "ic_fluent_real_estate_20_regular": 60134, - "ic_fluent_receipt_20_filled": 60135, - "ic_fluent_receipt_20_regular": 60136, - "ic_fluent_receipt_add_20_filled": 60137, - "ic_fluent_receipt_add_20_regular": 60138, - "ic_fluent_receipt_bag_20_filled": 60139, - "ic_fluent_receipt_bag_20_regular": 60140, - "ic_fluent_receipt_cube_20_filled": 60141, - "ic_fluent_receipt_cube_20_regular": 60142, - "ic_fluent_receipt_money_20_filled": 60143, - "ic_fluent_receipt_money_20_regular": 60144, - "ic_fluent_receipt_play_20_filled": 60145, - "ic_fluent_receipt_play_20_regular": 60146, - "ic_fluent_receipt_search_20_filled": 60147, - "ic_fluent_receipt_search_20_regular": 60148, - "ic_fluent_record_20_filled": 60149, - "ic_fluent_record_20_regular": 60150, - "ic_fluent_record_stop_20_filled": 60151, - "ic_fluent_record_stop_20_regular": 60152, - "ic_fluent_rectangle_landscape_20_filled": 60153, - "ic_fluent_rectangle_landscape_20_regular": 60154, - "ic_fluent_rectangle_portrait_location_target_20_filled": 60155, - "ic_fluent_rectangle_portrait_location_target_20_regular": 60156, - "ic_fluent_recycle_20_filled": 60157, - "ic_fluent_recycle_20_regular": 60158, - "ic_fluent_remote_20_filled": 60159, - "ic_fluent_remote_20_regular": 60160, - "ic_fluent_rename_20_filled": 60161, - "ic_fluent_rename_20_regular": 60162, - "ic_fluent_reorder_20_filled": 60163, - "ic_fluent_reorder_20_regular": 60164, - "ic_fluent_replay_20_filled": 60165, - "ic_fluent_replay_20_regular": 60166, - "ic_fluent_resize_20_filled": 60167, - "ic_fluent_resize_20_regular": 60168, - "ic_fluent_resize_image_20_filled": 60169, - "ic_fluent_resize_image_20_regular": 60170, - "ic_fluent_resize_large_20_filled": 60171, - "ic_fluent_resize_large_20_regular": 60172, - "ic_fluent_resize_small_20_filled": 60173, - "ic_fluent_resize_small_20_regular": 60174, - "ic_fluent_resize_table_20_filled": 60175, - "ic_fluent_resize_table_20_regular": 60176, - "ic_fluent_resize_video_20_filled": 60177, - "ic_fluent_resize_video_20_regular": 60178, - "ic_fluent_reward_20_filled": 60179, - "ic_fluent_reward_20_regular": 60180, - "ic_fluent_rewind_20_filled": 60181, - "ic_fluent_rewind_20_regular": 60182, - "ic_fluent_rhombus_20_filled": 60183, - "ic_fluent_rhombus_20_regular": 60184, - "ic_fluent_ribbon_20_filled": 60185, - "ic_fluent_ribbon_20_regular": 60186, - "ic_fluent_ribbon_add_20_filled": 60187, - "ic_fluent_ribbon_add_20_regular": 60188, - "ic_fluent_ribbon_off_20_filled": 60189, - "ic_fluent_ribbon_off_20_regular": 60190, - "ic_fluent_ribbon_star_20_filled": 60191, - "ic_fluent_ribbon_star_20_regular": 60192, - "ic_fluent_road_cone_20_filled": 60193, - "ic_fluent_road_cone_20_regular": 60194, - "ic_fluent_rocket_20_filled": 60195, - "ic_fluent_rocket_20_regular": 60196, - "ic_fluent_rotate_left_20_filled": 60197, - "ic_fluent_rotate_left_20_regular": 60198, - "ic_fluent_rotate_right_20_filled": 60199, - "ic_fluent_rotate_right_20_regular": 60200, - "ic_fluent_router_20_filled": 60201, - "ic_fluent_router_20_regular": 60202, - "ic_fluent_row_triple_20_filled": 60203, - "ic_fluent_row_triple_20_regular": 60204, - "ic_fluent_rss_20_filled": 60205, - "ic_fluent_rss_20_regular": 60206, - "ic_fluent_ruler_20_filled": 60207, - "ic_fluent_ruler_20_regular": 60208, - "ic_fluent_run_20_filled": 60209, - "ic_fluent_run_20_regular": 60210, - "ic_fluent_sanitize_20_filled": 60211, - "ic_fluent_sanitize_20_regular": 60212, - "ic_fluent_save_20_filled": 60213, - "ic_fluent_save_20_regular": 60214, - "ic_fluent_save_arrow_right_20_filled": 60215, - "ic_fluent_save_arrow_right_20_regular": 60216, - "ic_fluent_save_copy_20_filled": 60217, - "ic_fluent_save_copy_20_regular": 60218, - "ic_fluent_save_edit_20_filled": 60219, - "ic_fluent_save_edit_20_regular": 60220, - "ic_fluent_save_image_20_filled": 60221, - "ic_fluent_save_image_20_regular": 60222, - "ic_fluent_save_multiple_20_filled": 60223, - "ic_fluent_save_multiple_20_regular": 60224, - "ic_fluent_save_search_20_filled": 60225, - "ic_fluent_save_search_20_regular": 60226, - "ic_fluent_save_sync_20_filled": 60227, - "ic_fluent_save_sync_20_regular": 60228, - "ic_fluent_savings_20_filled": 60229, - "ic_fluent_savings_20_regular": 60230, - "ic_fluent_scale_fill_20_filled": 60231, - "ic_fluent_scale_fill_20_regular": 60232, - "ic_fluent_scale_fit_20_filled": 60233, - "ic_fluent_scale_fit_20_regular": 60234, - "ic_fluent_scales_20_filled": 60235, - "ic_fluent_scales_20_regular": 60236, - "ic_fluent_scan_20_filled": 60237, - "ic_fluent_scan_20_regular": 60238, - "ic_fluent_scan_camera_20_filled": 60239, - "ic_fluent_scan_camera_20_regular": 60240, - "ic_fluent_scan_dash_20_filled": 60241, - "ic_fluent_scan_dash_20_regular": 60242, - "ic_fluent_scan_object_20_filled": 60243, - "ic_fluent_scan_object_20_regular": 60244, - "ic_fluent_scan_table_20_filled": 60245, - "ic_fluent_scan_table_20_regular": 60246, - "ic_fluent_scan_text_20_filled": 60247, - "ic_fluent_scan_text_20_regular": 60248, - "ic_fluent_scan_thumb_up_20_filled": 60249, - "ic_fluent_scan_thumb_up_20_regular": 60250, - "ic_fluent_scan_thumb_up_off_20_filled": 60251, - "ic_fluent_scan_thumb_up_off_20_regular": 60252, - "ic_fluent_scan_type_20_filled": 60253, - "ic_fluent_scan_type_20_regular": 60254, - "ic_fluent_scan_type_checkmark_20_filled": 60255, - "ic_fluent_scan_type_checkmark_20_regular": 60256, - "ic_fluent_scan_type_off_20_filled": 60257, - "ic_fluent_scan_type_off_20_regular": 60258, - "ic_fluent_scratchpad_20_filled": 60259, - "ic_fluent_scratchpad_20_regular": 60260, - "ic_fluent_screen_cut_20_filled": 60261, - "ic_fluent_screen_cut_20_regular": 60262, - "ic_fluent_screen_person_20_filled": 60263, - "ic_fluent_screen_person_20_regular": 60264, - "ic_fluent_screen_search_20_filled": 60265, - "ic_fluent_screen_search_20_regular": 60266, - "ic_fluent_screenshot_20_filled": 60267, - "ic_fluent_screenshot_20_regular": 60268, - "ic_fluent_search_20_filled": 60269, - "ic_fluent_search_20_regular": 60270, - "ic_fluent_search_info_20_filled": 60271, - "ic_fluent_search_info_20_regular": 60272, - "ic_fluent_search_settings_20_filled": 60273, - "ic_fluent_search_settings_20_regular": 60274, - "ic_fluent_search_shield_20_filled": 60275, - "ic_fluent_search_shield_20_regular": 60276, - "ic_fluent_search_square_20_filled": 60277, - "ic_fluent_search_square_20_regular": 60278, - "ic_fluent_search_visual_20_filled": 60279, - "ic_fluent_search_visual_20_regular": 60280, - "ic_fluent_select_all_off_20_filled": 60281, - "ic_fluent_select_all_off_20_regular": 60282, - "ic_fluent_select_all_on_20_filled": 60283, - "ic_fluent_select_all_on_20_regular": 60284, - "ic_fluent_select_object_20_filled": 60285, - "ic_fluent_select_object_20_regular": 60286, - "ic_fluent_select_object_skew_20_filled": 60287, - "ic_fluent_select_object_skew_20_regular": 60288, - "ic_fluent_select_object_skew_dismiss_20_filled": 60289, - "ic_fluent_select_object_skew_dismiss_20_regular": 60290, - "ic_fluent_select_object_skew_edit_20_filled": 60291, - "ic_fluent_select_object_skew_edit_20_regular": 60292, - "ic_fluent_send_20_filled": 60293, - "ic_fluent_send_20_regular": 60294, - "ic_fluent_send_clock_20_filled": 60295, - "ic_fluent_send_clock_20_regular": 60296, - "ic_fluent_send_copy_20_filled": 60297, - "ic_fluent_send_copy_20_regular": 60298, - "ic_fluent_serial_port_20_filled": 60299, - "ic_fluent_serial_port_20_regular": 60300, - "ic_fluent_server_20_filled": 60301, - "ic_fluent_server_20_regular": 60302, - "ic_fluent_server_multiple_20_filled": 60303, - "ic_fluent_server_multiple_20_regular": 60304, - "ic_fluent_server_play_20_filled": 60305, - "ic_fluent_server_play_20_regular": 60306, - "ic_fluent_service_bell_20_filled": 60307, - "ic_fluent_service_bell_20_regular": 60308, - "ic_fluent_settings_20_filled": 60309, - "ic_fluent_settings_20_regular": 60310, - "ic_fluent_settings_chat_20_filled": 60311, - "ic_fluent_settings_chat_20_regular": 60312, - "ic_fluent_shape_exclude_20_filled": 60313, - "ic_fluent_shape_exclude_20_regular": 60314, - "ic_fluent_shape_intersect_20_filled": 60315, - "ic_fluent_shape_intersect_20_regular": 60316, - "ic_fluent_shape_subtract_20_filled": 60317, - "ic_fluent_shape_subtract_20_regular": 60318, - "ic_fluent_shape_union_20_filled": 60319, - "ic_fluent_shape_union_20_regular": 60320, - "ic_fluent_shapes_20_filled": 60321, - "ic_fluent_shapes_20_regular": 60322, - "ic_fluent_share_20_filled": 60323, - "ic_fluent_share_20_regular": 60324, - "ic_fluent_share_android_20_filled": 60325, - "ic_fluent_share_android_20_regular": 60326, - "ic_fluent_share_close_tray_20_filled": 60327, - "ic_fluent_share_close_tray_20_regular": 60328, - "ic_fluent_share_ios_20_filled": 60329, - "ic_fluent_share_ios_20_regular": 60330, - "ic_fluent_share_screen_person_20_filled": 60331, - "ic_fluent_share_screen_person_20_regular": 60332, - "ic_fluent_share_screen_person_overlay_20_filled": 60333, - "ic_fluent_share_screen_person_overlay_20_regular": 60334, - "ic_fluent_share_screen_person_overlay_inside_20_filled": 60335, - "ic_fluent_share_screen_person_overlay_inside_20_regular": 60336, - "ic_fluent_share_screen_person_p_20_filled": 60337, - "ic_fluent_share_screen_person_p_20_regular": 60338, - "ic_fluent_share_screen_start_20_filled": 60339, - "ic_fluent_share_screen_start_20_regular": 60340, - "ic_fluent_share_screen_stop_20_filled": 60341, - "ic_fluent_share_screen_stop_20_regular": 60342, - "ic_fluent_shield_20_filled": 60343, - "ic_fluent_shield_20_regular": 60344, - "ic_fluent_shield_badge_20_filled": 60345, - "ic_fluent_shield_badge_20_regular": 60346, - "ic_fluent_shield_checkmark_20_filled": 60347, - "ic_fluent_shield_checkmark_20_regular": 60348, - "ic_fluent_shield_dismiss_20_filled": 60349, - "ic_fluent_shield_dismiss_20_regular": 60350, - "ic_fluent_shield_dismiss_shield_20_filled": 60351, - "ic_fluent_shield_dismiss_shield_20_regular": 60352, - "ic_fluent_shield_error_20_filled": 60353, - "ic_fluent_shield_error_20_regular": 60354, - "ic_fluent_shield_globe_20_filled": 60355, - "ic_fluent_shield_globe_20_regular": 60356, - "ic_fluent_shield_keyhole_20_filled": 60357, - "ic_fluent_shield_keyhole_20_regular": 60358, - "ic_fluent_shield_lock_20_filled": 60359, - "ic_fluent_shield_lock_20_regular": 60360, - "ic_fluent_shield_person_20_filled": 60361, - "ic_fluent_shield_person_20_regular": 60362, - "ic_fluent_shield_person_add_20_filled": 60363, - "ic_fluent_shield_person_add_20_regular": 60364, - "ic_fluent_shield_prohibited_20_filled": 60365, - "ic_fluent_shield_prohibited_20_regular": 60366, - "ic_fluent_shield_question_20_filled": 60367, - "ic_fluent_shield_question_20_regular": 60368, - "ic_fluent_shield_task_20_filled": 60369, - "ic_fluent_shield_task_20_regular": 60370, - "ic_fluent_shifts_20_filled": 60371, - "ic_fluent_shifts_20_regular": 60372, - "ic_fluent_shifts_30_minutes_20_filled": 60373, - "ic_fluent_shifts_30_minutes_20_regular": 60374, - "ic_fluent_shifts_activity_20_filled": 60375, - "ic_fluent_shifts_activity_20_regular": 60376, - "ic_fluent_shifts_add_20_filled": 60377, - "ic_fluent_shifts_add_20_regular": 60378, - "ic_fluent_shifts_availability_20_filled": 60379, - "ic_fluent_shifts_availability_20_regular": 60380, - "ic_fluent_shifts_checkmark_20_filled": 60381, - "ic_fluent_shifts_checkmark_20_regular": 60382, - "ic_fluent_shifts_day_20_filled": 60383, - "ic_fluent_shifts_day_20_regular": 60384, - "ic_fluent_shifts_open_20_filled": 60385, - "ic_fluent_shifts_open_20_regular": 60386, - "ic_fluent_shifts_prohibited_20_filled": 60387, - "ic_fluent_shifts_prohibited_20_regular": 60388, - "ic_fluent_shifts_question_mark_20_filled": 60389, - "ic_fluent_shifts_question_mark_20_regular": 60390, - "ic_fluent_shifts_team_20_filled": 60391, - "ic_fluent_shifts_team_20_regular": 60392, - "ic_fluent_shopping_bag_20_filled": 60393, - "ic_fluent_shopping_bag_20_regular": 60394, - "ic_fluent_shopping_bag_arrow_left_20_filled": 60395, - "ic_fluent_shopping_bag_arrow_left_20_regular": 60396, - "ic_fluent_shopping_bag_dismiss_20_filled": 60397, - "ic_fluent_shopping_bag_dismiss_20_regular": 60398, - "ic_fluent_shopping_bag_pause_20_filled": 60399, - "ic_fluent_shopping_bag_pause_20_regular": 60400, - "ic_fluent_shopping_bag_percent_20_filled": 60401, - "ic_fluent_shopping_bag_percent_20_regular": 60402, - "ic_fluent_shopping_bag_play_20_filled": 60403, - "ic_fluent_shopping_bag_play_20_regular": 60404, - "ic_fluent_shopping_bag_tag_20_filled": 60405, - "ic_fluent_shopping_bag_tag_20_regular": 60406, - "ic_fluent_shortpick_20_filled": 60407, - "ic_fluent_shortpick_20_regular": 60408, - "ic_fluent_sidebar_search_ltr_20_filled": 60409, - "ic_fluent_sidebar_search_ltr_20_regular": 60410, - "ic_fluent_sidebar_search_rtl_20_filled": 60411, - "ic_fluent_sidebar_search_rtl_20_regular": 60412, - "ic_fluent_sign_out_20_filled": 60413, - "ic_fluent_sign_out_20_regular": 60414, - "ic_fluent_signature_20_filled": 60415, - "ic_fluent_signature_20_regular": 60416, - "ic_fluent_sim_20_filled": 60417, - "ic_fluent_sim_20_regular": 60418, - "ic_fluent_skip_back_10_20_filled": 60419, - "ic_fluent_skip_back_10_20_regular": 60420, - "ic_fluent_skip_forward_10_20_filled": 60421, - "ic_fluent_skip_forward_10_20_regular": 60422, - "ic_fluent_skip_forward_30_20_filled": 60423, - "ic_fluent_skip_forward_30_20_regular": 60424, - "ic_fluent_skip_forward_tab_20_filled": 60425, - "ic_fluent_skip_forward_tab_20_regular": 60426, - "ic_fluent_sleep_20_filled": 60427, - "ic_fluent_sleep_20_regular": 60428, - "ic_fluent_slide_add_20_filled": 60429, - "ic_fluent_slide_add_20_regular": 60430, - "ic_fluent_slide_arrow_right_20_filled": 60431, - "ic_fluent_slide_arrow_right_20_regular": 60432, - "ic_fluent_slide_eraser_20_filled": 60433, - "ic_fluent_slide_eraser_20_regular": 60434, - "ic_fluent_slide_grid_20_filled": 60435, - "ic_fluent_slide_grid_20_regular": 60436, - "ic_fluent_slide_hide_20_filled": 60437, - "ic_fluent_slide_hide_20_regular": 60438, - "ic_fluent_slide_layout_20_filled": 60439, - "ic_fluent_slide_layout_20_regular": 60440, - "ic_fluent_slide_link_20_filled": 60441, - "ic_fluent_slide_link_20_regular": 60442, - "ic_fluent_slide_microphone_20_filled": 60443, - "ic_fluent_slide_microphone_20_regular": 60444, - "ic_fluent_slide_multiple_20_filled": 60445, - "ic_fluent_slide_multiple_20_regular": 60446, - "ic_fluent_slide_multiple_arrow_right_20_filled": 60447, - "ic_fluent_slide_multiple_arrow_right_20_regular": 60448, - "ic_fluent_slide_multiple_search_20_filled": 60449, - "ic_fluent_slide_multiple_search_20_regular": 60450, - "ic_fluent_slide_search_20_filled": 60451, - "ic_fluent_slide_search_20_regular": 60452, - "ic_fluent_slide_settings_20_filled": 60453, - "ic_fluent_slide_settings_20_regular": 60454, - "ic_fluent_slide_size_20_filled": 60455, - "ic_fluent_slide_size_20_regular": 60456, - "ic_fluent_slide_text_20_filled": 60457, - "ic_fluent_slide_text_20_regular": 60458, - "ic_fluent_slide_transition_20_filled": 60459, - "ic_fluent_slide_transition_20_regular": 60460, - "ic_fluent_smartwatch_20_filled": 60461, - "ic_fluent_smartwatch_20_regular": 60462, - "ic_fluent_smartwatch_dot_20_filled": 60463, - "ic_fluent_smartwatch_dot_20_regular": 60464, - "ic_fluent_snooze_20_filled": 60465, - "ic_fluent_snooze_20_regular": 60466, - "ic_fluent_sound_source_20_filled": 60467, - "ic_fluent_sound_source_20_regular": 60468, - "ic_fluent_sound_wave_circle_20_filled": 60469, - "ic_fluent_sound_wave_circle_20_regular": 60470, - "ic_fluent_spacebar_20_filled": 60471, - "ic_fluent_spacebar_20_regular": 60472, - "ic_fluent_sparkle_20_filled": 60473, - "ic_fluent_sparkle_20_regular": 60474, - "ic_fluent_speaker_0_20_filled": 60475, - "ic_fluent_speaker_0_20_regular": 60476, - "ic_fluent_speaker_1_20_filled": 60477, - "ic_fluent_speaker_1_20_regular": 60478, - "ic_fluent_speaker_2_20_filled": 60479, - "ic_fluent_speaker_2_20_regular": 60480, - "ic_fluent_speaker_bluetooth_20_filled": 60481, - "ic_fluent_speaker_bluetooth_20_regular": 60482, - "ic_fluent_speaker_edit_20_filled": 60483, - "ic_fluent_speaker_edit_20_regular": 60484, - "ic_fluent_speaker_mute_20_filled": 60485, - "ic_fluent_speaker_mute_20_regular": 60486, - "ic_fluent_speaker_off_20_filled": 60487, - "ic_fluent_speaker_off_20_regular": 60488, - "ic_fluent_speaker_settings_20_filled": 60489, - "ic_fluent_speaker_settings_20_regular": 60490, - "ic_fluent_speaker_usb_20_filled": 60491, - "ic_fluent_speaker_usb_20_regular": 60492, - "ic_fluent_spinner_ios_20_filled": 60493, - "ic_fluent_spinner_ios_20_regular": 60494, - "ic_fluent_split_hint_20_filled": 60495, - "ic_fluent_split_hint_20_regular": 60496, - "ic_fluent_split_horizontal_20_filled": 60497, - "ic_fluent_split_horizontal_20_regular": 60498, - "ic_fluent_split_vertical_20_filled": 60499, - "ic_fluent_split_vertical_20_regular": 60500, - "ic_fluent_sport_20_filled": 60501, - "ic_fluent_sport_20_regular": 60502, - "ic_fluent_sport_american_football_20_filled": 60503, - "ic_fluent_sport_american_football_20_regular": 60504, - "ic_fluent_sport_baseball_20_filled": 60505, - "ic_fluent_sport_baseball_20_regular": 60506, - "ic_fluent_sport_basketball_20_filled": 60507, - "ic_fluent_sport_basketball_20_regular": 60508, - "ic_fluent_sport_hockey_20_filled": 60509, - "ic_fluent_sport_hockey_20_regular": 60510, - "ic_fluent_sport_soccer_20_filled": 60511, - "ic_fluent_sport_soccer_20_regular": 60512, - "ic_fluent_square_20_filled": 60513, - "ic_fluent_square_20_regular": 60514, - "ic_fluent_square_add_20_filled": 60515, - "ic_fluent_square_add_20_regular": 60516, - "ic_fluent_square_arrow_forward_20_filled": 60517, - "ic_fluent_square_arrow_forward_20_regular": 60518, - "ic_fluent_square_dismiss_20_filled": 60519, - "ic_fluent_square_dismiss_20_regular": 60520, - "ic_fluent_square_eraser_20_filled": 60521, - "ic_fluent_square_eraser_20_regular": 60522, - "ic_fluent_square_hint_20_filled": 60523, - "ic_fluent_square_hint_20_regular": 60524, - "ic_fluent_square_hint_apps_20_filled": 60525, - "ic_fluent_square_hint_apps_20_regular": 60526, - "ic_fluent_square_hint_arrow_back_20_filled": 60527, - "ic_fluent_square_hint_arrow_back_20_regular": 60528, - "ic_fluent_square_hint_sparkles_20_filled": 60529, - "ic_fluent_square_hint_sparkles_20_regular": 60530, - "ic_fluent_square_multiple_20_filled": 60531, - "ic_fluent_square_multiple_20_regular": 60532, - "ic_fluent_square_shadow_20_filled": 60533, - "ic_fluent_square_shadow_20_regular": 60534, - "ic_fluent_squares_nested_20_filled": 60535, - "ic_fluent_squares_nested_20_regular": 60536, - "ic_fluent_stack_20_filled": 60537, - "ic_fluent_stack_20_regular": 60538, - "ic_fluent_stack_arrow_forward_20_filled": 60539, - "ic_fluent_stack_arrow_forward_20_regular": 60540, - "ic_fluent_stack_star_20_filled": 60541, - "ic_fluent_stack_star_20_regular": 60542, - "ic_fluent_star_20_filled": 60543, - "ic_fluent_star_20_regular": 60544, - "ic_fluent_star_add_20_filled": 60545, - "ic_fluent_star_add_20_regular": 60546, - "ic_fluent_star_arrow_right_end_20_filled": 60547, - "ic_fluent_star_arrow_right_end_20_regular": 60548, - "ic_fluent_star_arrow_right_start_20_filled": 60549, - "ic_fluent_star_arrow_right_start_20_regular": 60550, - "ic_fluent_star_dismiss_20_filled": 60551, - "ic_fluent_star_dismiss_20_regular": 60552, - "ic_fluent_star_edit_20_filled": 60553, - "ic_fluent_star_edit_20_regular": 60554, - "ic_fluent_star_emphasis_20_filled": 60555, - "ic_fluent_star_emphasis_20_regular": 60556, - "ic_fluent_star_half_20_filled": 60557, - "ic_fluent_star_half_20_regular": 60558, - "ic_fluent_star_line_horizontal_3_20_filled": 60559, - "ic_fluent_star_line_horizontal_3_20_regular": 60560, - "ic_fluent_star_off_20_filled": 60561, - "ic_fluent_star_off_20_regular": 60562, - "ic_fluent_star_one_quarter_20_filled": 60563, - "ic_fluent_star_one_quarter_20_regular": 60564, - "ic_fluent_star_prohibited_20_filled": 60565, - "ic_fluent_star_prohibited_20_regular": 60566, - "ic_fluent_star_settings_20_filled": 60567, - "ic_fluent_star_settings_20_regular": 60568, - "ic_fluent_star_three_quarter_20_filled": 60569, - "ic_fluent_star_three_quarter_20_regular": 60570, - "ic_fluent_status_20_filled": 60571, - "ic_fluent_status_20_regular": 60572, - "ic_fluent_steps_20_filled": 60573, - "ic_fluent_steps_20_regular": 60574, - "ic_fluent_stethoscope_20_filled": 60575, - "ic_fluent_stethoscope_20_regular": 60576, - "ic_fluent_sticker_20_filled": 60577, - "ic_fluent_sticker_20_regular": 60578, - "ic_fluent_sticker_add_20_filled": 60579, - "ic_fluent_sticker_add_20_regular": 60580, - "ic_fluent_stop_20_filled": 60581, - "ic_fluent_stop_20_regular": 60582, - "ic_fluent_storage_20_filled": 60583, - "ic_fluent_storage_20_regular": 60584, - "ic_fluent_store_microsoft_20_filled": 60585, - "ic_fluent_store_microsoft_20_regular": 60586, - "ic_fluent_stream_20_filled": 60587, - "ic_fluent_stream_20_regular": 60588, - "ic_fluent_stream_input_20_filled": 60589, - "ic_fluent_stream_input_20_regular": 60590, - "ic_fluent_stream_input_output_20_filled": 60591, - "ic_fluent_stream_input_output_20_regular": 60592, - "ic_fluent_stream_output_20_filled": 60593, - "ic_fluent_stream_output_20_regular": 60594, - "ic_fluent_style_guide_20_filled": 60595, - "ic_fluent_style_guide_20_regular": 60596, - "ic_fluent_sub_grid_20_filled": 60597, - "ic_fluent_sub_grid_20_regular": 60598, - "ic_fluent_subtitles_20_filled": 60599, - "ic_fluent_subtitles_20_regular": 60600, - "ic_fluent_subtract_20_filled": 60601, - "ic_fluent_subtract_20_regular": 60602, - "ic_fluent_subtract_circle_20_filled": 60603, - "ic_fluent_subtract_circle_20_regular": 60604, - "ic_fluent_subtract_circle_arrow_back_20_filled": 60605, - "ic_fluent_subtract_circle_arrow_back_20_regular": 60606, - "ic_fluent_subtract_circle_arrow_forward_20_filled": 60607, - "ic_fluent_subtract_circle_arrow_forward_20_regular": 60608, - "ic_fluent_subtract_square_20_filled": 60609, - "ic_fluent_subtract_square_20_regular": 60610, - "ic_fluent_subtract_square_multiple_20_filled": 60611, - "ic_fluent_subtract_square_multiple_20_regular": 60612, - "ic_fluent_surface_earbuds_20_filled": 60613, - "ic_fluent_surface_earbuds_20_regular": 60614, - "ic_fluent_surface_hub_20_filled": 60615, - "ic_fluent_surface_hub_20_regular": 60616, - "ic_fluent_swipe_down_20_filled": 60617, - "ic_fluent_swipe_down_20_regular": 60618, - "ic_fluent_swipe_right_20_filled": 60619, - "ic_fluent_swipe_right_20_regular": 60620, - "ic_fluent_swipe_up_20_filled": 60621, - "ic_fluent_swipe_up_20_regular": 60622, - "ic_fluent_symbols_20_filled": 60623, - "ic_fluent_symbols_20_regular": 60624, - "ic_fluent_sync_off_20_filled": 60625, - "ic_fluent_sync_off_20_regular": 60626, - "ic_fluent_syringe_20_filled": 60627, - "ic_fluent_syringe_20_regular": 60628, - "ic_fluent_system_20_filled": 60629, - "ic_fluent_system_20_regular": 60630, - "ic_fluent_tab_20_filled": 60631, - "ic_fluent_tab_20_regular": 60632, - "ic_fluent_tab_add_20_filled": 60633, - "ic_fluent_tab_add_20_regular": 60634, - "ic_fluent_tab_arrow_left_20_filled": 60635, - "ic_fluent_tab_arrow_left_20_regular": 60636, - "ic_fluent_tab_desktop_20_filled": 60637, - "ic_fluent_tab_desktop_20_regular": 60638, - "ic_fluent_tab_desktop_arrow_clockwise_20_filled": 60639, - "ic_fluent_tab_desktop_arrow_clockwise_20_regular": 60640, - "ic_fluent_tab_desktop_arrow_left_20_filled": 60641, - "ic_fluent_tab_desktop_arrow_left_20_regular": 60642, - "ic_fluent_tab_desktop_bottom_20_filled": 60643, - "ic_fluent_tab_desktop_bottom_20_regular": 60644, - "ic_fluent_tab_desktop_clock_20_filled": 60645, - "ic_fluent_tab_desktop_clock_20_regular": 60646, - "ic_fluent_tab_desktop_copy_20_filled": 60647, - "ic_fluent_tab_desktop_copy_20_regular": 60648, - "ic_fluent_tab_desktop_image_20_filled": 60649, - "ic_fluent_tab_desktop_image_20_regular": 60650, - "ic_fluent_tab_desktop_multiple_20_filled": 60651, - "ic_fluent_tab_desktop_multiple_20_regular": 60652, - "ic_fluent_tab_desktop_multiple_bottom_20_filled": 60653, - "ic_fluent_tab_desktop_multiple_bottom_20_regular": 60654, - "ic_fluent_tab_desktop_new_page_20_filled": 60655, - "ic_fluent_tab_desktop_new_page_20_regular": 60656, - "ic_fluent_tab_in_private_20_filled": 60657, - "ic_fluent_tab_in_private_20_regular": 60658, - "ic_fluent_tab_inprivate_account_20_filled": 60659, - "ic_fluent_tab_inprivate_account_20_regular": 60660, - "ic_fluent_tab_prohibited_20_filled": 60661, - "ic_fluent_tab_prohibited_20_regular": 60662, - "ic_fluent_tab_shield_dismiss_20_filled": 60663, - "ic_fluent_tab_shield_dismiss_20_regular": 60664, - "ic_fluent_table_20_filled": 60665, - "ic_fluent_table_20_regular": 60666, - "ic_fluent_table_add_20_filled": 60667, - "ic_fluent_table_add_20_regular": 60668, - "ic_fluent_table_bottom_row_20_filled": 60669, - "ic_fluent_table_bottom_row_20_regular": 60670, - "ic_fluent_table_calculator_20_filled": 60671, - "ic_fluent_table_calculator_20_regular": 60672, - "ic_fluent_table_cell_edit_20_filled": 60673, - "ic_fluent_table_cell_edit_20_regular": 60674, - "ic_fluent_table_cells_merge_20_filled": 60675, - "ic_fluent_table_cells_merge_20_regular": 60676, - "ic_fluent_table_cells_split_20_filled": 60677, - "ic_fluent_table_cells_split_20_regular": 60678, - "ic_fluent_table_checker_20_filled": 60679, - "ic_fluent_table_checker_20_regular": 60680, - "ic_fluent_table_copy_20_filled": 60681, - "ic_fluent_table_copy_20_regular": 60682, - "ic_fluent_table_delete_column_20_filled": 60683, - "ic_fluent_table_delete_column_20_regular": 60684, - "ic_fluent_table_delete_row_20_filled": 60685, - "ic_fluent_table_delete_row_20_regular": 60686, - "ic_fluent_table_dismiss_20_filled": 60687, - "ic_fluent_table_dismiss_20_regular": 60688, - "ic_fluent_table_edit_20_filled": 60689, - "ic_fluent_table_edit_20_regular": 60690, - "ic_fluent_table_freeze_column_20_filled": 60691, - "ic_fluent_table_freeze_column_20_regular": 60692, - "ic_fluent_table_freeze_column_and_row_20_filled": 60693, - "ic_fluent_table_freeze_column_and_row_20_regular": 60694, - "ic_fluent_table_freeze_row_20_filled": 60695, - "ic_fluent_table_freeze_row_20_regular": 60696, - "ic_fluent_table_image_20_filled": 60697, - "ic_fluent_table_image_20_regular": 60698, - "ic_fluent_table_insert_column_20_filled": 60699, - "ic_fluent_table_insert_column_20_regular": 60700, - "ic_fluent_table_insert_row_20_filled": 60701, - "ic_fluent_table_insert_row_20_regular": 60702, - "ic_fluent_table_lightning_20_filled": 60703, - "ic_fluent_table_lightning_20_regular": 60704, - "ic_fluent_table_link_20_filled": 60705, - "ic_fluent_table_link_20_regular": 60706, - "ic_fluent_table_move_above_20_filled": 60707, - "ic_fluent_table_move_above_20_regular": 60708, - "ic_fluent_table_move_below_20_filled": 60709, - "ic_fluent_table_move_below_20_regular": 60710, - "ic_fluent_table_move_left_20_filled": 60711, - "ic_fluent_table_move_left_20_regular": 60712, - "ic_fluent_table_move_right_20_filled": 60713, - "ic_fluent_table_move_right_20_regular": 60714, - "ic_fluent_table_multiple_20_filled": 60715, - "ic_fluent_table_multiple_20_regular": 60716, - "ic_fluent_table_resize_column_20_filled": 60717, - "ic_fluent_table_resize_column_20_regular": 60718, - "ic_fluent_table_resize_row_20_filled": 60719, - "ic_fluent_table_resize_row_20_regular": 60720, - "ic_fluent_table_search_20_filled": 60721, - "ic_fluent_table_search_20_regular": 60722, - "ic_fluent_table_settings_20_filled": 60723, - "ic_fluent_table_settings_20_regular": 60724, - "ic_fluent_table_simple_20_filled": 60725, - "ic_fluent_table_simple_20_regular": 60726, - "ic_fluent_table_split_20_filled": 60727, - "ic_fluent_table_split_20_regular": 60728, - "ic_fluent_table_stack_above_20_filled": 60729, - "ic_fluent_table_stack_above_20_regular": 60730, - "ic_fluent_table_stack_below_20_filled": 60731, - "ic_fluent_table_stack_below_20_regular": 60732, - "ic_fluent_table_stack_left_20_filled": 60733, - "ic_fluent_table_stack_left_20_regular": 60734, - "ic_fluent_table_stack_right_20_filled": 60735, - "ic_fluent_table_stack_right_20_regular": 60736, - "ic_fluent_table_switch_20_filled": 60737, - "ic_fluent_table_switch_20_regular": 60738, - "ic_fluent_tablet_20_filled": 60739, - "ic_fluent_tablet_20_regular": 60740, - "ic_fluent_tablet_speaker_20_filled": 60741, - "ic_fluent_tablet_speaker_20_regular": 60742, - "ic_fluent_tabs_20_filled": 60743, - "ic_fluent_tabs_20_regular": 60744, - "ic_fluent_tag_20_filled": 60745, - "ic_fluent_tag_20_regular": 60746, - "ic_fluent_tag_circle_20_filled": 60747, - "ic_fluent_tag_circle_20_regular": 60748, - "ic_fluent_tag_dismiss_20_filled": 60749, - "ic_fluent_tag_dismiss_20_regular": 60750, - "ic_fluent_tag_error_20_filled": 60751, - "ic_fluent_tag_error_20_regular": 60752, - "ic_fluent_tag_lock_20_filled": 60753, - "ic_fluent_tag_lock_20_regular": 60754, - "ic_fluent_tag_lock_accent_20_filled": 60755, - "ic_fluent_tag_multiple_20_filled": 60756, - "ic_fluent_tag_multiple_20_regular": 60757, - "ic_fluent_tag_off_20_filled": 60758, - "ic_fluent_tag_off_20_regular": 60759, - "ic_fluent_tag_question_mark_20_filled": 60760, - "ic_fluent_tag_question_mark_20_regular": 60761, - "ic_fluent_tag_reset_20_filled": 60762, - "ic_fluent_tag_reset_20_regular": 60763, - "ic_fluent_tag_search_20_filled": 60764, - "ic_fluent_tag_search_20_regular": 60765, - "ic_fluent_tap_double_20_filled": 60766, - "ic_fluent_tap_double_20_regular": 60767, - "ic_fluent_tap_single_20_filled": 60768, - "ic_fluent_tap_single_20_regular": 60769, - "ic_fluent_target_20_filled": 60770, - "ic_fluent_target_20_regular": 60771, - "ic_fluent_target_arrow_20_filled": 60772, - "ic_fluent_target_arrow_20_regular": 60773, - "ic_fluent_target_edit_20_filled": 60774, - "ic_fluent_target_edit_20_regular": 60775, - "ic_fluent_task_list_add_20_filled": 60776, - "ic_fluent_task_list_add_20_regular": 60777, - "ic_fluent_task_list_ltr_20_filled": 60778, - "ic_fluent_task_list_ltr_20_regular": 60779, - "ic_fluent_task_list_rtl_20_filled": 60780, - "ic_fluent_task_list_rtl_20_regular": 60781, - "ic_fluent_task_list_square_add_20_filled": 60782, - "ic_fluent_task_list_square_add_20_regular": 60783, - "ic_fluent_task_list_square_database_20_filled": 60784, - "ic_fluent_task_list_square_database_20_regular": 60785, - "ic_fluent_task_list_square_ltr_20_filled": 60786, - "ic_fluent_task_list_square_ltr_20_regular": 60787, - "ic_fluent_task_list_square_person_20_filled": 60788, - "ic_fluent_task_list_square_person_20_regular": 60789, - "ic_fluent_task_list_square_rtl_20_filled": 60790, - "ic_fluent_task_list_square_rtl_20_regular": 60791, - "ic_fluent_task_list_square_settings_20_filled": 60792, - "ic_fluent_task_list_square_settings_20_regular": 60793, - "ic_fluent_tasks_app_20_filled": 60794, - "ic_fluent_tasks_app_20_regular": 60795, - "ic_fluent_teddy_20_filled": 60796, - "ic_fluent_teddy_20_regular": 60797, - "ic_fluent_temperature_20_filled": 60798, - "ic_fluent_temperature_20_regular": 60799, - "ic_fluent_tent_20_filled": 60800, - "ic_fluent_tent_20_regular": 60801, - "ic_fluent_tetris_app_20_filled": 60802, - "ic_fluent_tetris_app_20_regular": 60803, - "ic_fluent_text_add_20_filled": 60804, - "ic_fluent_text_add_20_regular": 60805, - "ic_fluent_text_add_space_after_20_filled": 60806, - "ic_fluent_text_add_space_after_20_regular": 60807, - "ic_fluent_text_add_space_before_20_filled": 60808, - "ic_fluent_text_add_space_before_20_regular": 60809, - "ic_fluent_text_align_center_20_filled": 60810, - "ic_fluent_text_align_center_20_regular": 60811, - "ic_fluent_text_align_center_rotate_270_20_filled": 60812, - "ic_fluent_text_align_center_rotate_270_20_regular": 60813, - "ic_fluent_text_align_center_rotate_90_20_filled": 60814, - "ic_fluent_text_align_center_rotate_90_20_regular": 60815, - "ic_fluent_text_align_distributed_20_filled": 60816, - "ic_fluent_text_align_distributed_20_regular": 60817, - "ic_fluent_text_align_distributed_evenly_20_filled": 60818, - "ic_fluent_text_align_distributed_evenly_20_regular": 60819, - "ic_fluent_text_align_distributed_vertical_20_filled": 60820, - "ic_fluent_text_align_distributed_vertical_20_regular": 60821, - "ic_fluent_text_align_justify_20_filled": 60822, - "ic_fluent_text_align_justify_20_regular": 60823, - "ic_fluent_text_align_justify_low_20_filled": 60824, - "ic_fluent_text_align_justify_low_20_regular": 60825, - "ic_fluent_text_align_justify_low_rotate_270_20_filled": 60826, - "ic_fluent_text_align_justify_low_rotate_270_20_regular": 60827, - "ic_fluent_text_align_justify_low_rotate_90_20_filled": 60828, - "ic_fluent_text_align_justify_low_rotate_90_20_regular": 60829, - "ic_fluent_text_align_justify_rotate_270_20_filled": 60830, - "ic_fluent_text_align_justify_rotate_270_20_regular": 60831, - "ic_fluent_text_align_justify_rotate_90_20_filled": 60832, - "ic_fluent_text_align_justify_rotate_90_20_regular": 60833, - "ic_fluent_text_align_left_20_filled": 60834, - "ic_fluent_text_align_left_20_regular": 60835, - "ic_fluent_text_align_left_rotate_270_20_filled": 60836, - "ic_fluent_text_align_left_rotate_270_20_regular": 60837, - "ic_fluent_text_align_left_rotate_90_20_filled": 60838, - "ic_fluent_text_align_left_rotate_90_20_regular": 60839, - "ic_fluent_text_align_right_20_filled": 60840, - "ic_fluent_text_align_right_20_regular": 60841, - "ic_fluent_text_align_right_rotate_270_20_filled": 60842, - "ic_fluent_text_align_right_rotate_270_20_regular": 60843, - "ic_fluent_text_align_right_rotate_90_20_filled": 60844, - "ic_fluent_text_align_right_rotate_90_20_regular": 60845, - "ic_fluent_text_asterisk_20_filled": 60846, - "ic_fluent_text_asterisk_20_regular": 60847, - "ic_fluent_text_baseline_20_filled": 60848, - "ic_fluent_text_baseline_20_regular": 60849, - "ic_fluent_text_bold_20_filled": 60850, - "ic_fluent_text_bold_20_regular": 60851, - "ic_fluent_text_box_settings_20_filled": 60852, - "ic_fluent_text_box_settings_20_regular": 60853, - "ic_fluent_text_bullet_list_add_20_filled": 60854, - "ic_fluent_text_bullet_list_add_20_regular": 60855, - "ic_fluent_text_bullet_list_checkmark_20_filled": 60856, - "ic_fluent_text_bullet_list_checkmark_20_regular": 60857, - "ic_fluent_text_bullet_list_dismiss_20_filled": 60858, - "ic_fluent_text_bullet_list_dismiss_20_regular": 60859, - "ic_fluent_text_bullet_list_ltr_20_filled": 60860, - "ic_fluent_text_bullet_list_ltr_20_regular": 60861, - "ic_fluent_text_bullet_list_rotate_270_20_filled": 60862, - "ic_fluent_text_bullet_list_rotate_270_20_regular": 60863, - "ic_fluent_text_bullet_list_rotate_90_20_filled": 60864, - "ic_fluent_text_bullet_list_rotate_90_20_regular": 60865, - "ic_fluent_text_bullet_list_rtl_20_filled": 60866, - "ic_fluent_text_bullet_list_rtl_20_regular": 60867, - "ic_fluent_text_bullet_list_square_20_filled": 60868, - "ic_fluent_text_bullet_list_square_20_regular": 60869, - "ic_fluent_text_bullet_list_square_clock_20_filled": 60870, - "ic_fluent_text_bullet_list_square_clock_20_regular": 60871, - "ic_fluent_text_bullet_list_square_edit_20_filled": 60872, - "ic_fluent_text_bullet_list_square_edit_20_regular": 60873, - "ic_fluent_text_bullet_list_square_person_20_filled": 60874, - "ic_fluent_text_bullet_list_square_person_20_regular": 60875, - "ic_fluent_text_bullet_list_square_search_20_filled": 60876, - "ic_fluent_text_bullet_list_square_search_20_regular": 60877, - "ic_fluent_text_bullet_list_square_settings_20_filled": 60878, - "ic_fluent_text_bullet_list_square_settings_20_regular": 60879, - "ic_fluent_text_bullet_list_square_shield_20_filled": 60880, - "ic_fluent_text_bullet_list_square_shield_20_regular": 60881, - "ic_fluent_text_bullet_list_square_toolbox_20_filled": 60882, - "ic_fluent_text_bullet_list_square_toolbox_20_regular": 60883, - "ic_fluent_text_bullet_list_square_warning_20_filled": 60884, - "ic_fluent_text_bullet_list_square_warning_20_regular": 60885, - "ic_fluent_text_bullet_list_tree_20_filled": 60886, - "ic_fluent_text_bullet_list_tree_20_regular": 60887, - "ic_fluent_text_case_lowercase_20_filled": 60888, - "ic_fluent_text_case_lowercase_20_regular": 60889, - "ic_fluent_text_case_title_20_filled": 60890, - "ic_fluent_text_case_title_20_regular": 60891, - "ic_fluent_text_case_uppercase_20_filled": 60892, - "ic_fluent_text_case_uppercase_20_regular": 60893, - "ic_fluent_text_change_case_20_filled": 60894, - "ic_fluent_text_change_case_20_regular": 60895, - "ic_fluent_text_clear_formatting_20_filled": 60896, - "ic_fluent_text_clear_formatting_20_regular": 60897, - "ic_fluent_text_collapse_20_filled": 60898, - "ic_fluent_text_collapse_20_regular": 60899, - "ic_fluent_text_color_20_filled": 60900, - "ic_fluent_text_color_20_regular": 60901, - "ic_fluent_text_color_accent_20_filled": 60902, - "ic_fluent_text_column_one_20_filled": 60903, - "ic_fluent_text_column_one_20_regular": 60904, - "ic_fluent_text_column_one_narrow_20_filled": 60905, - "ic_fluent_text_column_one_narrow_20_regular": 60906, - "ic_fluent_text_column_one_wide_20_filled": 60907, - "ic_fluent_text_column_one_wide_20_regular": 60908, - "ic_fluent_text_column_one_wide_lightning_20_filled": 60909, - "ic_fluent_text_column_one_wide_lightning_20_regular": 60910, - "ic_fluent_text_column_three_20_filled": 60911, - "ic_fluent_text_column_three_20_regular": 60912, - "ic_fluent_text_column_two_20_filled": 60913, - "ic_fluent_text_column_two_20_regular": 60914, - "ic_fluent_text_column_two_left_20_filled": 60915, - "ic_fluent_text_column_two_left_20_regular": 60916, - "ic_fluent_text_column_two_right_20_filled": 60917, - "ic_fluent_text_column_two_right_20_regular": 60918, - "ic_fluent_text_continuous_20_filled": 60919, - "ic_fluent_text_continuous_20_regular": 60920, - "ic_fluent_text_density_20_filled": 60921, - "ic_fluent_text_density_20_regular": 60922, - "ic_fluent_text_description_20_filled": 60923, - "ic_fluent_text_description_20_regular": 60924, - "ic_fluent_text_direction_horizontal_left_20_filled": 60925, - "ic_fluent_text_direction_horizontal_left_20_regular": 60926, - "ic_fluent_text_direction_horizontal_right_20_filled": 60927, - "ic_fluent_text_direction_horizontal_right_20_regular": 60928, - "ic_fluent_text_direction_rotate_270_right_20_filled": 60929, - "ic_fluent_text_direction_rotate_270_right_20_regular": 60930, - "ic_fluent_text_direction_rotate_90_left_20_filled": 60931, - "ic_fluent_text_direction_rotate_90_left_20_regular": 60932, - "ic_fluent_text_direction_rotate_90_right_20_filled": 60933, - "ic_fluent_text_direction_rotate_90_right_20_regular": 60934, - "ic_fluent_text_direction_vertical_20_filled": 60935, - "ic_fluent_text_direction_vertical_20_regular": 60936, - "ic_fluent_text_edit_style_20_filled": 60937, - "ic_fluent_text_edit_style_20_regular": 60938, - "ic_fluent_text_effects_20_filled": 60939, - "ic_fluent_text_effects_20_regular": 60940, - "ic_fluent_text_expand_20_filled": 60941, - "ic_fluent_text_expand_20_regular": 60942, - "ic_fluent_text_field_20_filled": 60943, - "ic_fluent_text_field_20_regular": 60944, - "ic_fluent_text_first_line_20_filled": 60945, - "ic_fluent_text_first_line_20_regular": 60946, - "ic_fluent_text_font_20_filled": 60947, - "ic_fluent_text_font_20_regular": 60948, - "ic_fluent_text_font_info_20_filled": 60949, - "ic_fluent_text_font_info_20_regular": 60950, - "ic_fluent_text_font_size_20_filled": 60951, - "ic_fluent_text_font_size_20_regular": 60952, - "ic_fluent_text_footnote_20_filled": 60953, - "ic_fluent_text_footnote_20_regular": 60954, - "ic_fluent_text_grammar_arrow_left_20_filled": 60955, - "ic_fluent_text_grammar_arrow_left_20_regular": 60956, - "ic_fluent_text_grammar_arrow_right_20_filled": 60957, - "ic_fluent_text_grammar_arrow_right_20_regular": 60958, - "ic_fluent_text_grammar_checkmark_20_filled": 60959, - "ic_fluent_text_grammar_checkmark_20_regular": 60960, - "ic_fluent_text_grammar_dismiss_20_filled": 60961, - "ic_fluent_text_grammar_dismiss_20_regular": 60962, - "ic_fluent_text_grammar_error_20_filled": 60963, - "ic_fluent_text_grammar_error_20_regular": 60964, - "ic_fluent_text_grammar_settings_20_filled": 60965, - "ic_fluent_text_grammar_settings_20_regular": 60966, - "ic_fluent_text_grammar_wand_20_filled": 60967, - "ic_fluent_text_grammar_wand_20_regular": 60968, - "ic_fluent_text_hanging_20_filled": 60969, - "ic_fluent_text_hanging_20_regular": 60970, - "ic_fluent_text_header_1_20_filled": 60971, - "ic_fluent_text_header_1_20_regular": 60972, - "ic_fluent_text_header_2_20_filled": 60973, - "ic_fluent_text_header_2_20_regular": 60974, - "ic_fluent_text_header_3_20_filled": 60975, - "ic_fluent_text_header_3_20_regular": 60976, - "ic_fluent_text_indent_decrease_ltr_20_filled": 60977, - "ic_fluent_text_indent_decrease_ltr_20_regular": 60978, - "ic_fluent_text_indent_decrease_rotate_270_20_filled": 60979, - "ic_fluent_text_indent_decrease_rotate_270_20_regular": 60980, - "ic_fluent_text_indent_decrease_rotate_90_20_filled": 60981, - "ic_fluent_text_indent_decrease_rotate_90_20_regular": 60982, - "ic_fluent_text_indent_decrease_rtl_20_filled": 60983, - "ic_fluent_text_indent_decrease_rtl_20_regular": 60984, - "ic_fluent_text_indent_increase_ltr_20_filled": 60985, - "ic_fluent_text_indent_increase_ltr_20_regular": 60986, - "ic_fluent_text_indent_increase_rotate_270_20_filled": 60987, - "ic_fluent_text_indent_increase_rotate_270_20_regular": 60988, - "ic_fluent_text_indent_increase_rotate_90_20_filled": 60989, - "ic_fluent_text_indent_increase_rotate_90_20_regular": 60990, - "ic_fluent_text_indent_increase_rtl_20_filled": 60991, - "ic_fluent_text_indent_increase_rtl_20_regular": 60992, - "ic_fluent_text_italic_20_filled": 60993, - "ic_fluent_text_italic_20_regular": 60994, - "ic_fluent_text_line_spacing_20_filled": 60995, - "ic_fluent_text_line_spacing_20_regular": 60996, - "ic_fluent_text_more_20_filled": 60997, - "ic_fluent_text_more_20_regular": 60998, - "ic_fluent_text_number_format_20_filled": 60999, - "ic_fluent_text_number_format_20_regular": 61000, - "ic_fluent_text_number_list_ltr_20_filled": 61001, - "ic_fluent_text_number_list_ltr_20_regular": 61002, - "ic_fluent_text_number_list_rotate_270_20_filled": 61003, - "ic_fluent_text_number_list_rotate_270_20_regular": 61004, - "ic_fluent_text_number_list_rotate_90_20_filled": 61005, - "ic_fluent_text_number_list_rotate_90_20_regular": 61006, - "ic_fluent_text_number_list_rtl_20_filled": 61007, - "ic_fluent_text_number_list_rtl_20_regular": 61008, - "ic_fluent_text_paragraph_20_filled": 61009, - "ic_fluent_text_paragraph_20_regular": 61010, - "ic_fluent_text_paragraph_direction_20_filled": 61011, - "ic_fluent_text_paragraph_direction_20_regular": 61012, - "ic_fluent_text_paragraph_direction_left_20_filled": 61013, - "ic_fluent_text_paragraph_direction_left_20_regular": 61014, - "ic_fluent_text_paragraph_direction_right_20_filled": 61015, - "ic_fluent_text_paragraph_direction_right_20_regular": 61016, - "ic_fluent_text_period_asterisk_20_filled": 61017, - "ic_fluent_text_period_asterisk_20_regular": 61018, - "ic_fluent_text_position_behind_20_filled": 61019, - "ic_fluent_text_position_behind_20_regular": 61020, - "ic_fluent_text_position_front_20_filled": 61021, - "ic_fluent_text_position_front_20_regular": 61022, - "ic_fluent_text_position_line_20_filled": 61023, - "ic_fluent_text_position_line_20_regular": 61024, - "ic_fluent_text_position_square_20_filled": 61025, - "ic_fluent_text_position_square_20_regular": 61026, - "ic_fluent_text_position_through_20_filled": 61027, - "ic_fluent_text_position_through_20_regular": 61028, - "ic_fluent_text_position_tight_20_filled": 61029, - "ic_fluent_text_position_tight_20_regular": 61030, - "ic_fluent_text_position_top_bottom_20_filled": 61031, - "ic_fluent_text_position_top_bottom_20_regular": 61032, - "ic_fluent_text_proofing_tools_20_filled": 61033, - "ic_fluent_text_proofing_tools_20_regular": 61034, - "ic_fluent_text_quote_20_filled": 61035, - "ic_fluent_text_quote_20_regular": 61036, - "ic_fluent_text_sort_ascending_20_filled": 61037, - "ic_fluent_text_sort_ascending_20_regular": 61038, - "ic_fluent_text_sort_descending_20_filled": 61039, - "ic_fluent_text_sort_descending_20_regular": 61040, - "ic_fluent_text_strikethrough_20_filled": 61041, - "ic_fluent_text_strikethrough_20_regular": 61042, - "ic_fluent_text_subscript_20_filled": 61043, - "ic_fluent_text_subscript_20_regular": 61044, - "ic_fluent_text_superscript_20_filled": 61045, - "ic_fluent_text_superscript_20_regular": 61046, - "ic_fluent_text_t_20_filled": 61047, - "ic_fluent_text_t_20_regular": 61048, - "ic_fluent_text_underline_20_filled": 61049, - "ic_fluent_text_underline_20_regular": 61050, - "ic_fluent_text_whole_word_20_filled": 61051, - "ic_fluent_text_whole_word_20_regular": 61052, - "ic_fluent_text_word_count_20_filled": 61053, - "ic_fluent_text_word_count_20_regular": 61054, - "ic_fluent_text_wrap_20_filled": 61055, - "ic_fluent_text_wrap_20_regular": 61056, - "ic_fluent_textbox_20_filled": 61057, - "ic_fluent_textbox_20_regular": 61058, - "ic_fluent_textbox_align_bottom_20_filled": 61059, - "ic_fluent_textbox_align_bottom_20_regular": 61060, - "ic_fluent_textbox_align_bottom_rotate_90_20_filled": 61061, - "ic_fluent_textbox_align_bottom_rotate_90_20_regular": 61062, - "ic_fluent_textbox_align_center_20_filled": 61063, - "ic_fluent_textbox_align_center_20_regular": 61064, - "ic_fluent_textbox_align_middle_20_filled": 61065, - "ic_fluent_textbox_align_middle_20_regular": 61066, - "ic_fluent_textbox_align_middle_rotate_90_20_filled": 61067, - "ic_fluent_textbox_align_middle_rotate_90_20_regular": 61068, - "ic_fluent_textbox_align_top_20_filled": 61069, - "ic_fluent_textbox_align_top_20_regular": 61070, - "ic_fluent_textbox_align_top_rotate_90_20_filled": 61071, - "ic_fluent_textbox_align_top_rotate_90_20_regular": 61072, - "ic_fluent_textbox_more_20_filled": 61073, - "ic_fluent_textbox_more_20_regular": 61074, - "ic_fluent_textbox_rotate_90_20_filled": 61075, - "ic_fluent_textbox_rotate_90_20_regular": 61076, - "ic_fluent_thinking_20_filled": 61077, - "ic_fluent_thinking_20_regular": 61078, - "ic_fluent_thumb_dislike_20_filled": 61079, - "ic_fluent_thumb_dislike_20_regular": 61080, - "ic_fluent_thumb_like_20_filled": 61081, - "ic_fluent_thumb_like_20_regular": 61082, - "ic_fluent_ticket_diagonal_20_filled": 61083, - "ic_fluent_ticket_diagonal_20_regular": 61084, - "ic_fluent_ticket_horizontal_20_filled": 61085, - "ic_fluent_ticket_horizontal_20_regular": 61086, - "ic_fluent_time_and_weather_20_filled": 61087, - "ic_fluent_time_and_weather_20_regular": 61088, - "ic_fluent_time_picker_20_filled": 61089, - "ic_fluent_time_picker_20_regular": 61090, - "ic_fluent_timeline_20_filled": 61091, - "ic_fluent_timeline_20_regular": 61092, - "ic_fluent_timer_10_20_filled": 61093, - "ic_fluent_timer_10_20_regular": 61094, - "ic_fluent_timer_2_20_filled": 61095, - "ic_fluent_timer_2_20_regular": 61096, - "ic_fluent_timer_20_filled": 61097, - "ic_fluent_timer_20_regular": 61098, - "ic_fluent_timer_3_20_filled": 61099, - "ic_fluent_timer_3_20_regular": 61100, - "ic_fluent_timer_off_20_filled": 61101, - "ic_fluent_timer_off_20_regular": 61102, - "ic_fluent_toggle_left_20_filled": 61103, - "ic_fluent_toggle_left_20_regular": 61104, - "ic_fluent_toggle_multiple_20_filled": 61105, - "ic_fluent_toggle_multiple_20_regular": 61106, - "ic_fluent_toggle_right_20_filled": 61107, - "ic_fluent_toggle_right_20_regular": 61108, - "ic_fluent_toolbox_20_filled": 61109, - "ic_fluent_toolbox_20_regular": 61110, - "ic_fluent_tooltip_quote_20_filled": 61111, - "ic_fluent_tooltip_quote_20_regular": 61112, - "ic_fluent_top_speed_20_filled": 61113, - "ic_fluent_top_speed_20_regular": 61114, - "ic_fluent_translate_20_filled": 61115, - "ic_fluent_translate_20_regular": 61116, - "ic_fluent_transmission_20_filled": 61117, - "ic_fluent_transmission_20_regular": 61118, - "ic_fluent_tray_item_add_20_filled": 61119, - "ic_fluent_tray_item_add_20_regular": 61120, - "ic_fluent_tray_item_remove_20_filled": 61121, - "ic_fluent_tray_item_remove_20_regular": 61122, - "ic_fluent_tree_deciduous_20_filled": 61123, - "ic_fluent_tree_deciduous_20_regular": 61124, - "ic_fluent_tree_evergreen_20_filled": 61125, - "ic_fluent_tree_evergreen_20_regular": 61126, - "ic_fluent_triangle_20_filled": 61127, - "ic_fluent_triangle_20_regular": 61128, - "ic_fluent_triangle_down_20_filled": 61129, - "ic_fluent_triangle_down_20_regular": 61130, - "ic_fluent_triangle_left_20_filled": 61131, - "ic_fluent_triangle_left_20_regular": 61132, - "ic_fluent_triangle_right_20_filled": 61133, - "ic_fluent_triangle_right_20_regular": 61134, - "ic_fluent_trophy_20_filled": 61135, - "ic_fluent_trophy_20_regular": 61136, - "ic_fluent_trophy_off_20_filled": 61137, - "ic_fluent_trophy_off_20_regular": 61138, - "ic_fluent_tv_20_filled": 61139, - "ic_fluent_tv_20_regular": 61140, - "ic_fluent_tv_arrow_right_20_filled": 61141, - "ic_fluent_tv_arrow_right_20_regular": 61142, - "ic_fluent_tv_usb_20_filled": 61143, - "ic_fluent_tv_usb_20_regular": 61144, - "ic_fluent_umbrella_20_filled": 61145, - "ic_fluent_umbrella_20_regular": 61146, - "ic_fluent_uninstall_app_20_filled": 61147, - "ic_fluent_uninstall_app_20_regular": 61148, - "ic_fluent_usb_plug_20_filled": 61149, - "ic_fluent_usb_plug_20_regular": 61150, - "ic_fluent_usb_stick_20_filled": 61151, - "ic_fluent_usb_stick_20_regular": 61152, - "ic_fluent_vault_20_filled": 61153, - "ic_fluent_vault_20_regular": 61154, - "ic_fluent_vehicle_bicycle_20_filled": 61155, - "ic_fluent_vehicle_bicycle_20_regular": 61156, - "ic_fluent_vehicle_bus_20_filled": 61157, - "ic_fluent_vehicle_bus_20_regular": 61158, - "ic_fluent_vehicle_cab_20_filled": 61159, - "ic_fluent_vehicle_cab_20_regular": 61160, - "ic_fluent_vehicle_car_20_filled": 61161, - "ic_fluent_vehicle_car_20_regular": 61162, - "ic_fluent_vehicle_car_collision_20_filled": 61163, - "ic_fluent_vehicle_car_collision_20_regular": 61164, - "ic_fluent_vehicle_car_profile_ltr_20_filled": 61165, - "ic_fluent_vehicle_car_profile_ltr_20_regular": 61166, - "ic_fluent_vehicle_car_profile_rtl_20_filled": 61167, - "ic_fluent_vehicle_car_profile_rtl_20_regular": 61168, - "ic_fluent_vehicle_ship_20_filled": 61169, - "ic_fluent_vehicle_ship_20_regular": 61170, - "ic_fluent_vehicle_subway_20_filled": 61171, - "ic_fluent_vehicle_subway_20_regular": 61172, - "ic_fluent_vehicle_truck_20_filled": 61173, - "ic_fluent_vehicle_truck_20_regular": 61174, - "ic_fluent_vehicle_truck_bag_20_filled": 61175, - "ic_fluent_vehicle_truck_bag_20_regular": 61176, - "ic_fluent_vehicle_truck_cube_20_filled": 61177, - "ic_fluent_vehicle_truck_cube_20_regular": 61178, - "ic_fluent_vehicle_truck_profile_20_filled": 61179, - "ic_fluent_vehicle_truck_profile_20_regular": 61180, - "ic_fluent_video_20_filled": 61181, - "ic_fluent_video_20_regular": 61182, - "ic_fluent_video_360_20_filled": 61183, - "ic_fluent_video_360_20_regular": 61184, - "ic_fluent_video_360_off_20_filled": 61185, - "ic_fluent_video_360_off_20_regular": 61186, - "ic_fluent_video_add_20_filled": 61187, - "ic_fluent_video_add_20_regular": 61188, - "ic_fluent_video_background_effect_20_filled": 61189, - "ic_fluent_video_background_effect_20_regular": 61190, - "ic_fluent_video_chat_20_filled": 61191, - "ic_fluent_video_chat_20_regular": 61192, - "ic_fluent_video_clip_20_filled": 61193, - "ic_fluent_video_clip_20_regular": 61194, - "ic_fluent_video_clip_multiple_20_filled": 61195, - "ic_fluent_video_clip_multiple_20_regular": 61196, - "ic_fluent_video_clip_off_20_filled": 61197, - "ic_fluent_video_clip_off_20_regular": 61198, - "ic_fluent_video_off_20_filled": 61199, - "ic_fluent_video_off_20_regular": 61200, - "ic_fluent_video_person_20_filled": 61201, - "ic_fluent_video_person_20_regular": 61202, - "ic_fluent_video_person_call_20_filled": 61203, - "ic_fluent_video_person_call_20_regular": 61204, - "ic_fluent_video_person_off_20_filled": 61205, - "ic_fluent_video_person_off_20_regular": 61206, - "ic_fluent_video_person_sparkle_20_filled": 61207, - "ic_fluent_video_person_sparkle_20_regular": 61208, - "ic_fluent_video_person_star_20_filled": 61209, - "ic_fluent_video_person_star_20_regular": 61210, - "ic_fluent_video_person_star_off_20_filled": 61211, - "ic_fluent_video_person_star_off_20_regular": 61212, - "ic_fluent_video_play_pause_20_filled": 61213, - "ic_fluent_video_play_pause_20_regular": 61214, - "ic_fluent_video_prohibited_20_filled": 61215, - "ic_fluent_video_prohibited_20_regular": 61216, - "ic_fluent_video_recording_20_filled": 61217, - "ic_fluent_video_recording_20_regular": 61218, - "ic_fluent_video_security_20_filled": 61219, - "ic_fluent_video_security_20_regular": 61220, - "ic_fluent_video_switch_20_filled": 61221, - "ic_fluent_video_switch_20_regular": 61222, - "ic_fluent_video_sync_20_filled": 61223, - "ic_fluent_video_sync_20_regular": 61224, - "ic_fluent_view_desktop_20_filled": 61225, - "ic_fluent_view_desktop_20_regular": 61226, - "ic_fluent_view_desktop_mobile_20_filled": 61227, - "ic_fluent_view_desktop_mobile_20_regular": 61228, - "ic_fluent_virtual_network_20_filled": 61229, - "ic_fluent_virtual_network_20_regular": 61230, - "ic_fluent_virtual_network_toolbox_20_filled": 61231, - "ic_fluent_virtual_network_toolbox_20_regular": 61232, - "ic_fluent_voicemail_20_filled": 61233, - "ic_fluent_voicemail_20_regular": 61234, - "ic_fluent_voicemail_arrow_back_20_filled": 61235, - "ic_fluent_voicemail_arrow_back_20_regular": 61236, - "ic_fluent_voicemail_arrow_forward_20_filled": 61237, - "ic_fluent_voicemail_arrow_forward_20_regular": 61238, - "ic_fluent_voicemail_arrow_subtract_20_filled": 61239, - "ic_fluent_voicemail_arrow_subtract_20_regular": 61240, - "ic_fluent_vote_20_filled": 61241, - "ic_fluent_vote_20_regular": 61242, - "ic_fluent_walkie_talkie_20_filled": 61243, - "ic_fluent_walkie_talkie_20_regular": 61244, - "ic_fluent_wallet_20_filled": 61245, - "ic_fluent_wallet_20_regular": 61246, - "ic_fluent_wallet_credit_card_20_filled": 61247, - "ic_fluent_wallet_credit_card_20_regular": 61248, - "ic_fluent_wallpaper_20_filled": 61249, - "ic_fluent_wallpaper_20_regular": 61250, - "ic_fluent_wand_20_filled": 61251, - "ic_fluent_wand_20_regular": 61252, - "ic_fluent_warning_20_filled": 61253, - "ic_fluent_warning_20_regular": 61254, - "ic_fluent_warning_shield_20_filled": 61255, - "ic_fluent_warning_shield_20_regular": 61256, - "ic_fluent_weather_blowing_snow_20_filled": 61257, - "ic_fluent_weather_blowing_snow_20_regular": 61258, - "ic_fluent_weather_cloudy_20_filled": 61259, - "ic_fluent_weather_cloudy_20_regular": 61260, - "ic_fluent_weather_drizzle_20_filled": 61261, - "ic_fluent_weather_drizzle_20_regular": 61262, - "ic_fluent_weather_duststorm_20_filled": 61263, - "ic_fluent_weather_duststorm_20_regular": 61264, - "ic_fluent_weather_fog_20_filled": 61265, - "ic_fluent_weather_fog_20_regular": 61266, - "ic_fluent_weather_hail_day_20_filled": 61267, - "ic_fluent_weather_hail_day_20_regular": 61268, - "ic_fluent_weather_hail_night_20_filled": 61269, - "ic_fluent_weather_hail_night_20_regular": 61270, - "ic_fluent_weather_haze_20_filled": 61271, - "ic_fluent_weather_haze_20_regular": 61272, - "ic_fluent_weather_moon_20_filled": 61273, - "ic_fluent_weather_moon_20_regular": 61274, - "ic_fluent_weather_moon_off_20_filled": 61275, - "ic_fluent_weather_moon_off_20_regular": 61276, - "ic_fluent_weather_partly_cloudy_day_20_filled": 61277, - "ic_fluent_weather_partly_cloudy_day_20_regular": 61278, - "ic_fluent_weather_partly_cloudy_night_20_filled": 61279, - "ic_fluent_weather_partly_cloudy_night_20_regular": 61280, - "ic_fluent_weather_rain_20_filled": 61281, - "ic_fluent_weather_rain_20_regular": 61282, - "ic_fluent_weather_rain_showers_day_20_filled": 61283, - "ic_fluent_weather_rain_showers_day_20_regular": 61284, - "ic_fluent_weather_rain_showers_night_20_filled": 61285, - "ic_fluent_weather_rain_showers_night_20_regular": 61286, - "ic_fluent_weather_rain_snow_20_filled": 61287, - "ic_fluent_weather_rain_snow_20_regular": 61288, - "ic_fluent_weather_snow_20_filled": 61289, - "ic_fluent_weather_snow_20_regular": 61290, - "ic_fluent_weather_snow_shower_day_20_filled": 61291, - "ic_fluent_weather_snow_shower_day_20_regular": 61292, - "ic_fluent_weather_snow_shower_night_20_filled": 61293, - "ic_fluent_weather_snow_shower_night_20_regular": 61294, - "ic_fluent_weather_snowflake_20_filled": 61295, - "ic_fluent_weather_snowflake_20_regular": 61296, - "ic_fluent_weather_squalls_20_filled": 61297, - "ic_fluent_weather_squalls_20_regular": 61298, - "ic_fluent_weather_sunny_20_filled": 61299, - "ic_fluent_weather_sunny_20_regular": 61300, - "ic_fluent_weather_sunny_high_20_filled": 61301, - "ic_fluent_weather_sunny_high_20_regular": 61302, - "ic_fluent_weather_sunny_low_20_filled": 61303, - "ic_fluent_weather_sunny_low_20_regular": 61304, - "ic_fluent_weather_thunderstorm_20_filled": 61305, - "ic_fluent_weather_thunderstorm_20_regular": 61306, - "ic_fluent_web_asset_20_filled": 61307, - "ic_fluent_web_asset_20_regular": 61308, - "ic_fluent_whiteboard_20_filled": 61309, - "ic_fluent_whiteboard_20_regular": 61310, - "ic_fluent_wifi_1_20_filled": 61311, - "ic_fluent_wifi_1_20_regular": 61312, - "ic_fluent_wifi_2_20_filled": 61313, - "ic_fluent_wifi_2_20_regular": 61314, - "ic_fluent_wifi_3_20_filled": 61315, - "ic_fluent_wifi_3_20_regular": 61316, - "ic_fluent_wifi_4_20_filled": 61317, - "ic_fluent_wifi_4_20_regular": 61318, - "ic_fluent_wifi_lock_20_filled": 61319, - "ic_fluent_wifi_lock_20_regular": 61320, - "ic_fluent_wifi_off_20_filled": 61321, - "ic_fluent_wifi_off_20_regular": 61322, - "ic_fluent_wifi_settings_20_filled": 61323, - "ic_fluent_wifi_settings_20_regular": 61324, - "ic_fluent_wifi_warning_20_filled": 61325, - "ic_fluent_wifi_warning_20_regular": 61326, - "ic_fluent_window_20_filled": 61327, - "ic_fluent_window_20_regular": 61328, - "ic_fluent_window_ad_20_filled": 61329, - "ic_fluent_window_ad_20_regular": 61330, - "ic_fluent_window_ad_off_20_filled": 61331, - "ic_fluent_window_ad_off_20_regular": 61332, - "ic_fluent_window_ad_person_20_filled": 61333, - "ic_fluent_window_ad_person_20_regular": 61334, - "ic_fluent_window_apps_20_filled": 61335, - "ic_fluent_window_apps_20_regular": 61336, - "ic_fluent_window_arrow_up_20_filled": 61337, - "ic_fluent_window_arrow_up_20_regular": 61338, - "ic_fluent_window_bullet_list_20_filled": 61339, - "ic_fluent_window_bullet_list_20_regular": 61340, - "ic_fluent_window_bullet_list_add_20_filled": 61341, - "ic_fluent_window_bullet_list_add_20_regular": 61342, - "ic_fluent_window_console_20_filled": 61343, - "ic_fluent_window_console_20_regular": 61344, - "ic_fluent_window_database_20_filled": 61345, - "ic_fluent_window_database_20_regular": 61346, - "ic_fluent_window_dev_edit_20_filled": 61347, - "ic_fluent_window_dev_edit_20_regular": 61348, - "ic_fluent_window_dev_tools_20_filled": 61349, - "ic_fluent_window_dev_tools_20_regular": 61350, - "ic_fluent_window_edit_20_filled": 61351, - "ic_fluent_window_edit_20_regular": 61352, - "ic_fluent_window_header_horizontal_20_filled": 61353, - "ic_fluent_window_header_horizontal_20_regular": 61354, - "ic_fluent_window_header_horizontal_off_20_filled": 61355, - "ic_fluent_window_header_horizontal_off_20_regular": 61356, - "ic_fluent_window_header_vertical_20_filled": 61357, - "ic_fluent_window_header_vertical_20_regular": 61358, - "ic_fluent_window_inprivate_20_filled": 61359, - "ic_fluent_window_inprivate_20_regular": 61360, - "ic_fluent_window_inprivate_account_20_filled": 61361, - "ic_fluent_window_inprivate_account_20_regular": 61362, - "ic_fluent_window_location_target_20_filled": 61363, - "ic_fluent_window_location_target_20_regular": 61364, - "ic_fluent_window_multiple_20_filled": 61365, - "ic_fluent_window_multiple_20_regular": 61366, - "ic_fluent_window_multiple_swap_20_filled": 61367, - "ic_fluent_window_multiple_swap_20_regular": 61368, - "ic_fluent_window_new_20_filled": 61369, - "ic_fluent_window_new_20_regular": 61370, - "ic_fluent_window_play_20_filled": 61371, - "ic_fluent_window_play_20_regular": 61372, - "ic_fluent_window_settings_20_filled": 61373, - "ic_fluent_window_settings_20_regular": 61374, - "ic_fluent_window_shield_20_filled": 61375, - "ic_fluent_window_shield_20_regular": 61376, - "ic_fluent_window_text_20_filled": 61377, - "ic_fluent_window_text_20_regular": 61378, - "ic_fluent_window_wrench_20_filled": 61379, - "ic_fluent_window_wrench_20_regular": 61380, - "ic_fluent_wrench_20_filled": 61381, - "ic_fluent_wrench_20_regular": 61382, - "ic_fluent_wrench_screwdriver_20_filled": 61383, - "ic_fluent_wrench_screwdriver_20_regular": 61384, - "ic_fluent_xbox_console_20_filled": 61385, - "ic_fluent_xbox_console_20_regular": 61386, - "ic_fluent_xbox_controller_20_filled": 61387, - "ic_fluent_xbox_controller_20_regular": 61388, - "ic_fluent_xray_20_filled": 61389, - "ic_fluent_xray_20_regular": 61390, - "ic_fluent_zoom_fit_20_filled": 61391, - "ic_fluent_zoom_fit_20_regular": 61392, - "ic_fluent_zoom_in_20_filled": 61393, - "ic_fluent_zoom_in_20_regular": 61394, - "ic_fluent_zoom_out_20_filled": 61395, - "ic_fluent_zoom_out_20_regular": 61396 -} diff --git a/src/Wpf.Ui.FontMapper/Program.cs b/src/Wpf.Ui.FontMapper/Program.cs index 4cf906e0a..bf3f0b640 100644 --- a/src/Wpf.Ui.FontMapper/Program.cs +++ b/src/Wpf.Ui.FontMapper/Program.cs @@ -10,9 +10,9 @@ Console.WriteLine("Fluent System Icons Mapper"); System.Diagnostics.Debug.WriteLine("INFO | Fluent System Icons Mapper", "Wpf.Ui.FontMapper"); -var fluentSystemIconsVersion = "1.1.176"; +var fluentSystemIconsVersion = "1.1.181"; var executingPath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); -var fountSources = new FontSource[] +var fontSources = new FontSource[] { new() { @@ -28,16 +28,16 @@ SourcePath = "FluentSystemIcons-Filled.json", DestinationPath = "generated\\SymbolFilled.cs" }, - new() - { - Name = "SymbolResizable", - Description = $"Represents a list of resizable Fluent System Icons v.{fluentSystemIconsVersion}.\nMay be converted to using GetGlyph() or to using GetString()", - SourcePath = "FluentSystemIcons-Resizable.json", - DestinationPath = "generated\\SymbolResizable.cs" - } + // new() + // { + // Name = "SymbolResizable", + // Description = $"Represents a list of resizable Fluent System Icons v.{fluentSystemIconsVersion}.\nMay be converted to using GetGlyph() or to using GetString()", + // SourcePath = "FluentSystemIcons-Resizable.json", + // DestinationPath = "generated\\SymbolResizable.cs" + // } }; -Parallel.ForEach(fountSources, singleFont => +Parallel.ForEach(fontSources, singleFont => { if (String.IsNullOrEmpty(executingPath)) return; diff --git a/src/Wpf.Ui.FontMapper/Wpf.Ui.FontMapper.csproj b/src/Wpf.Ui.FontMapper/Wpf.Ui.FontMapper.csproj index e8aed38c7..7a18d1fa0 100644 --- a/src/Wpf.Ui.FontMapper/Wpf.Ui.FontMapper.csproj +++ b/src/Wpf.Ui.FontMapper/Wpf.Ui.FontMapper.csproj @@ -16,9 +16,6 @@ Always - - Always - PreserveNewest diff --git a/src/Wpf.Ui.Tools.sln b/src/Wpf.Ui.Tools.sln new file mode 100644 index 000000000..73dd197b2 --- /dev/null +++ b/src/Wpf.Ui.Tools.sln @@ -0,0 +1,39 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.1.32407.343 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui.FontMapper", "Wpf.Ui.FontMapper\Wpf.Ui.FontMapper.csproj", "{F251D265-51BA-4926-BB97-8EDAC34FCE4F}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{21DB16AA-40BB-428B-AFE8-DEF4E3F0DC49}" + ProjectSection(SolutionItems) = preProject + Directory.Build.props = Directory.Build.props + ..\LICENSE = ..\LICENSE + Packages.props = Packages.props + ..\README.md = ..\README.md + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F251D265-51BA-4926-BB97-8EDAC34FCE4F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F251D265-51BA-4926-BB97-8EDAC34FCE4F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F251D265-51BA-4926-BB97-8EDAC34FCE4F}.Debug|x86.ActiveCfg = Debug|Any CPU + {F251D265-51BA-4926-BB97-8EDAC34FCE4F}.Debug|x86.Build.0 = Debug|Any CPU + {F251D265-51BA-4926-BB97-8EDAC34FCE4F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F251D265-51BA-4926-BB97-8EDAC34FCE4F}.Release|Any CPU.Build.0 = Release|Any CPU + {F251D265-51BA-4926-BB97-8EDAC34FCE4F}.Release|x86.ActiveCfg = Release|Any CPU + {F251D265-51BA-4926-BB97-8EDAC34FCE4F}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {234CB3F9-5ADC-433F-BDBD-CB8EA59EB518} + EndGlobalSection +EndGlobal diff --git a/src/Wpf.Ui.sln b/src/Wpf.Ui.sln index 4b6bf5a66..e9a8effaa 100644 --- a/src/Wpf.Ui.sln +++ b/src/Wpf.Ui.sln @@ -5,12 +5,6 @@ VisualStudioVersion = 17.1.32407.343 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui", "Wpf.Ui\Wpf.Ui.csproj", "{1ADC87D1-8963-4100-845A-18477824718E}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui.Demo", "Wpf.Ui.DEMO\Wpf.Ui.Demo.csproj", "{A78FB614-E888-4D5C-92D3-690567958B90}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui.FontMapper", "Wpf.Ui.FontMapper\Wpf.Ui.FontMapper.csproj", "{F251D265-51BA-4926-BB97-8EDAC34FCE4F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Wpf.Ui.SimpleDemo", "Wpf.Ui.SimpleDemo\Wpf.Ui.SimpleDemo.csproj", "{7BFB5593-8C6F-4DF7-AA82-522936F74265}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{21DB16AA-40BB-428B-AFE8-DEF4E3F0DC49}" ProjectSection(SolutionItems) = preProject Directory.Build.props = Directory.Build.props @@ -19,10 +13,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution ..\README.md = ..\README.md EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Demo", "Demo", "{C52625A6-5E10-4ADF-9511-6379DA5228C2}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{CCFFFBC1-E0DB-4A12-96D0-6EB5781280FD}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -39,39 +29,10 @@ Global {1ADC87D1-8963-4100-845A-18477824718E}.Release|Any CPU.Build.0 = Release|Any CPU {1ADC87D1-8963-4100-845A-18477824718E}.Release|x86.ActiveCfg = Release|Any CPU {1ADC87D1-8963-4100-845A-18477824718E}.Release|x86.Build.0 = Release|Any CPU - {A78FB614-E888-4D5C-92D3-690567958B90}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A78FB614-E888-4D5C-92D3-690567958B90}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A78FB614-E888-4D5C-92D3-690567958B90}.Debug|x86.ActiveCfg = Debug|Any CPU - {A78FB614-E888-4D5C-92D3-690567958B90}.Debug|x86.Build.0 = Debug|Any CPU - {A78FB614-E888-4D5C-92D3-690567958B90}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A78FB614-E888-4D5C-92D3-690567958B90}.Release|Any CPU.Build.0 = Release|Any CPU - {A78FB614-E888-4D5C-92D3-690567958B90}.Release|x86.ActiveCfg = Release|Any CPU - {A78FB614-E888-4D5C-92D3-690567958B90}.Release|x86.Build.0 = Release|Any CPU - {F251D265-51BA-4926-BB97-8EDAC34FCE4F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F251D265-51BA-4926-BB97-8EDAC34FCE4F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F251D265-51BA-4926-BB97-8EDAC34FCE4F}.Debug|x86.ActiveCfg = Debug|Any CPU - {F251D265-51BA-4926-BB97-8EDAC34FCE4F}.Debug|x86.Build.0 = Debug|Any CPU - {F251D265-51BA-4926-BB97-8EDAC34FCE4F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F251D265-51BA-4926-BB97-8EDAC34FCE4F}.Release|Any CPU.Build.0 = Release|Any CPU - {F251D265-51BA-4926-BB97-8EDAC34FCE4F}.Release|x86.ActiveCfg = Release|Any CPU - {F251D265-51BA-4926-BB97-8EDAC34FCE4F}.Release|x86.Build.0 = Release|Any CPU - {7BFB5593-8C6F-4DF7-AA82-522936F74265}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7BFB5593-8C6F-4DF7-AA82-522936F74265}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7BFB5593-8C6F-4DF7-AA82-522936F74265}.Debug|x86.ActiveCfg = Debug|Any CPU - {7BFB5593-8C6F-4DF7-AA82-522936F74265}.Debug|x86.Build.0 = Debug|Any CPU - {7BFB5593-8C6F-4DF7-AA82-522936F74265}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7BFB5593-8C6F-4DF7-AA82-522936F74265}.Release|Any CPU.Build.0 = Release|Any CPU - {7BFB5593-8C6F-4DF7-AA82-522936F74265}.Release|x86.ActiveCfg = Release|Any CPU - {7BFB5593-8C6F-4DF7-AA82-522936F74265}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {A78FB614-E888-4D5C-92D3-690567958B90} = {C52625A6-5E10-4ADF-9511-6379DA5228C2} - {F251D265-51BA-4926-BB97-8EDAC34FCE4F} = {CCFFFBC1-E0DB-4A12-96D0-6EB5781280FD} - {7BFB5593-8C6F-4DF7-AA82-522936F74265} = {C52625A6-5E10-4ADF-9511-6379DA5228C2} - EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {234CB3F9-5ADC-433F-BDBD-CB8EA59EB518} EndGlobalSection diff --git a/src/Wpf.Ui/Services/TransitionType.cs b/src/Wpf.Ui/Animations/TransitionType.cs similarity index 96% rename from src/Wpf.Ui/Services/TransitionType.cs rename to src/Wpf.Ui/Animations/TransitionType.cs index 7ad31df98..51e4e2543 100644 --- a/src/Wpf.Ui/Services/TransitionType.cs +++ b/src/Wpf.Ui/Animations/TransitionType.cs @@ -3,7 +3,7 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -namespace Wpf.Ui.Services; +namespace Wpf.Ui.Animations; /// /// Available types of transitions. @@ -35,7 +35,6 @@ public enum TransitionType /// SlideRight, - /// /// Slide from the left side. /// diff --git a/src/Wpf.Ui/Services/TransitionService.cs b/src/Wpf.Ui/Animations/Transitions.cs similarity index 93% rename from src/Wpf.Ui/Services/TransitionService.cs rename to src/Wpf.Ui/Animations/Transitions.cs index c8644d133..65b96262f 100644 --- a/src/Wpf.Ui/Services/TransitionService.cs +++ b/src/Wpf.Ui/Animations/Transitions.cs @@ -9,13 +9,15 @@ using System.Windows.Media.Animation; using Wpf.Ui.Hardware; -namespace Wpf.Ui.Services; +namespace Wpf.Ui.Animations; /// /// Provides tools for animation. /// -public static class TransitionService +public static class Transitions { + private const double DecelerationRatio = 0.7; + /// /// Attempts to apply an animation effect while adding content to the frame. /// @@ -73,7 +75,7 @@ private static void FadeInTransition(FrameworkElement navigatedElement, Duration var opacityDoubleAnimation = new DoubleAnimation { Duration = duration, - DecelerationRatio = 0.7, + DecelerationRatio = DecelerationRatio, From = 0.0, To = 1.0, }; @@ -86,7 +88,7 @@ private static void FadeInWithSlideTransition(FrameworkElement navigatedElement, var translateDoubleAnimation = new DoubleAnimation { Duration = duration, - DecelerationRatio = 0.7, + DecelerationRatio = DecelerationRatio, From = 30, To = 0, }; @@ -102,7 +104,7 @@ private static void FadeInWithSlideTransition(FrameworkElement navigatedElement, var opacityDoubleAnimation = new DoubleAnimation { Duration = duration, - DecelerationRatio = 0.7, + DecelerationRatio = DecelerationRatio, From = 0.0, To = 1.0, }; @@ -114,7 +116,7 @@ private static void SlideBottomTransition(FrameworkElement navigatedElement, Dur var translateDoubleAnimation = new DoubleAnimation { Duration = duration, - DecelerationRatio = 0.7, + DecelerationRatio = DecelerationRatio, From = 30, To = 0, }; @@ -133,7 +135,7 @@ private static void SlideRightTransition(FrameworkElement navigatedElement, Dura var translateDoubleAnimation = new DoubleAnimation { Duration = duration, - DecelerationRatio = 0.7, + DecelerationRatio = DecelerationRatio, From = 50, To = 0, }; @@ -152,7 +154,7 @@ private static void SlideLeftTransition(FrameworkElement navigatedElement, Durat var translateDoubleAnimation = new DoubleAnimation { Duration = duration, - DecelerationRatio = 0.7, + DecelerationRatio = DecelerationRatio, From = -50, To = 0, }; diff --git a/src/Wpf.Ui/Appearance/ResourceDictionaryManager.cs b/src/Wpf.Ui/Appearance/ResourceDictionaryManager.cs index ba2b06741..af32d283b 100644 --- a/src/Wpf.Ui/Appearance/ResourceDictionaryManager.cs +++ b/src/Wpf.Ui/Appearance/ResourceDictionaryManager.cs @@ -112,17 +112,17 @@ public bool UpdateDictionary(string resourceLookup, Uri newResourceUri) for (int j = 0; j < applicationDictionaries[i].MergedDictionaries.Count; j++) { - if (applicationDictionaries[i].MergedDictionaries[j]?.Source != null) - { - sourceUri = applicationDictionaries[i].MergedDictionaries[j].Source.ToString().ToLower().Trim(); + if (applicationDictionaries[i].MergedDictionaries[j]?.Source == null) + continue; + + sourceUri = applicationDictionaries[i].MergedDictionaries[j].Source.ToString().ToLower().Trim(); - if (!sourceUri.Contains(SearchNamespace) || !sourceUri.Contains(resourceLookup)) - continue; + if (!sourceUri.Contains(SearchNamespace) || !sourceUri.Contains(resourceLookup)) + continue; - applicationDictionaries[i].MergedDictionaries[j] = new() { Source = newResourceUri }; + applicationDictionaries[i].MergedDictionaries[j] = new() { Source = newResourceUri }; - return true; - } + return true; } } diff --git a/src/Wpf.Ui/Appearance/Watcher.cs b/src/Wpf.Ui/Appearance/Watcher.cs index 253331f43..852a4344c 100644 --- a/src/Wpf.Ui/Appearance/Watcher.cs +++ b/src/Wpf.Ui/Appearance/Watcher.cs @@ -13,7 +13,7 @@ namespace Wpf.Ui.Appearance; /// /// Automatically updates the application background if the system theme or color is changed. -/// settings work globally as a singleton, they cannot be changed for each . +/// settings work globally and cannot be changed for each . /// public sealed class Watcher { diff --git a/src/Wpf.Ui/Common/EventIdentifier.cs b/src/Wpf.Ui/Common/EventIdentifier.cs index 2477b4079..fd710cb06 100644 --- a/src/Wpf.Ui/Common/EventIdentifier.cs +++ b/src/Wpf.Ui/Common/EventIdentifier.cs @@ -10,7 +10,7 @@ namespace Wpf.Ui.Common; /// /// Class used to create identifiers of threads or tasks that can be performed multiple times within one instance. -/// represents roughly the time in Unix microseconds at which it was taken. +/// represents roughly the time in microseconds at which it was taken. /// internal class EventIdentifier { diff --git a/src/Wpf.Ui/Common/SymbolFilled.cs b/src/Wpf.Ui/Common/SymbolFilled.cs index 019fea09e..78babd41a 100644 --- a/src/Wpf.Ui/Common/SymbolFilled.cs +++ b/src/Wpf.Ui/Common/SymbolFilled.cs @@ -6,7 +6,7 @@ namespace Wpf.Ui.Common; /// -/// Represents a list of filled Fluent System Icons v.1.1.176. +/// Represents a list of filled Fluent System Icons v.1.1.181. /// May be converted to using GetGlyph() or to using GetString() /// #pragma warning disable CS1591 @@ -3896,6 +3896,154 @@ public enum SymbolFilled ShieldQuestion20 = 0xEF22, ShieldQuestion24 = 0xEF23, ShieldQuestion32 = 0xEF24, + HeartBroken24 = 0xEF25, + LayerDiagonal20 = 0xEF26, + LayerDiagonalPerson20 = 0xEF27, + TextWrap16 = 0xEF28, + TextWrapOff16 = 0xEF29, + TextWrapOff20 = 0xEF2A, + TextWrapOff24 = 0xEF2B, + TrophyLock16 = 0xEF2C, + TrophyLock20 = 0xEF2D, + TrophyLock24 = 0xEF2E, + TrophyLock28 = 0xEF2F, + TrophyLock32 = 0xEF30, + TrophyLock48 = 0xEF31, + ArrowRepeat116 = 0xEF32, + ArrowRepeat120 = 0xEF33, + ArrowRepeat124 = 0xEF34, + ArrowShuffle16 = 0xEF35, + ArrowShuffle20 = 0xEF36, + ArrowShuffle24 = 0xEF37, + ArrowShuffle28 = 0xEF38, + ArrowShuffle32 = 0xEF39, + ArrowShuffle48 = 0xEF3A, + ArrowShuffleOff16 = 0xEF3B, + ArrowShuffleOff20 = 0xEF3C, + ArrowShuffleOff24 = 0xEF3D, + ArrowShuffleOff28 = 0xEF3E, + ArrowShuffleOff32 = 0xEF3F, + ArrowShuffleOff48 = 0xEF40, + BuildingDesktop16 = 0xEF41, + BuildingDesktop20 = 0xEF42, + BuildingDesktop24 = 0xEF43, + CalendarEmpty48 = 0xEF44, + CalendarLock16 = 0xEF45, + CalendarLock20 = 0xEF46, + CalendarLock24 = 0xEF47, + CalendarLock28 = 0xEF48, + CalendarLock32 = 0xEF49, + CalendarLock48 = 0xEF4A, + CalendarSettings24 = 0xEF4B, + CalendarSettings28 = 0xEF4C, + CalendarSettings32 = 0xEF4D, + CalendarSettings48 = 0xEF4E, + Call12 = 0xEF4F, + CallMissed12 = 0xEF50, + ChatAdd16 = 0xEF51, + ChatAdd20 = 0xEF52, + ChatAdd24 = 0xEF53, + ChatAdd28 = 0xEF54, + ChatAdd32 = 0xEF55, + ChatAdd48 = 0xEF56, + ChatCursor16 = 0xEF57, + ChatCursor20 = 0xEF58, + ChatCursor24 = 0xEF59, + ChatEmpty12 = 0xEF5A, + ChatEmpty16 = 0xEF5B, + ChatEmpty20 = 0xEF5C, + ChatEmpty24 = 0xEF5D, + ChatEmpty28 = 0xEF5E, + ChatEmpty32 = 0xEF5F, + ChatEmpty48 = 0xEF60, + CircleImage16 = 0xEF61, + CircleImage24 = 0xEF62, + CircleImage28 = 0xEF63, + CodeText16 = 0xEF64, + DesktopCheckmark16 = 0xEF65, + DesktopCheckmark20 = 0xEF66, + DesktopCheckmark24 = 0xEF67, + Fire16 = 0xEF68, + Fire20 = 0xEF69, + Fire24 = 0xEF6A, + Hourglass20 = 0xEF6B, + Hourglass24 = 0xEF6C, + HourglassHalf20 = 0xEF6D, + HourglassHalf24 = 0xEF6E, + HourglassOneQuarter20 = 0xEF6F, + HourglassOneQuarter24 = 0xEF70, + HourglassThreeQuarter20 = 0xEF71, + HourglassThreeQuarter24 = 0xEF72, + InkStrokeArrowDown20 = 0xEF73, + InkStrokeArrowDown24 = 0xEF74, + InkStrokeArrowUpDown20 = 0xEF75, + InkStrokeArrowUpDown24 = 0xEF76, + MegaphoneCircle20 = 0xEF77, + MegaphoneCircle24 = 0xEF78, + NumberCircle216 = 0xEF79, + NumberCircle220 = 0xEF7A, + NumberCircle224 = 0xEF7B, + NumberCircle228 = 0xEF7C, + NumberCircle232 = 0xEF7D, + NumberCircle248 = 0xEF7E, + NumberCircle316 = 0xEF7F, + NumberCircle320 = 0xEF80, + NumberCircle324 = 0xEF81, + NumberCircle328 = 0xEF82, + NumberCircle332 = 0xEF83, + NumberCircle348 = 0xEF84, + NumberCircle416 = 0xEF85, + NumberCircle420 = 0xEF86, + NumberCircle424 = 0xEF87, + NumberCircle428 = 0xEF88, + NumberCircle432 = 0xEF89, + NumberCircle448 = 0xEF8A, + NumberCircle516 = 0xEF8B, + NumberCircle520 = 0xEF8C, + NumberCircle524 = 0xEF8D, + NumberCircle528 = 0xEF8E, + NumberCircle532 = 0xEF8F, + NumberCircle548 = 0xEF90, + PersonAlert16 = 0xEF91, + PersonAlert20 = 0xEF92, + PersonAlert24 = 0xEF93, + PersonArrowBack16 = 0xEF94, + PersonArrowBack20 = 0xEF95, + PersonArrowBack24 = 0xEF96, + PersonArrowBack28 = 0xEF97, + PersonArrowBack32 = 0xEF98, + PersonArrowBack48 = 0xEF99, + PersonLink16 = 0xEF9A, + PersonLink20 = 0xEF9B, + PersonLink24 = 0xEF9C, + PersonLink28 = 0xEF9D, + PersonLink32 = 0xEF9E, + PersonLink48 = 0xEF9F, + Phone28 = 0xEFA0, + Phone32 = 0xEFA1, + Phone48 = 0xEFA2, + PhoneChat16 = 0xEFA3, + PhoneChat20 = 0xEFA4, + PhoneChat24 = 0xEFA5, + PhoneChat28 = 0xEFA6, + Premium12 = 0xEFA7, + ShieldAdd16 = 0xEFA8, + ShieldAdd20 = 0xEFA9, + ShieldAdd24 = 0xEFAA, + SparkleCircle20 = 0xEFAB, + SparkleCircle24 = 0xEFAC, + TaskListSquareLtr16 = 0xEFAD, + TaskListSquareRtl16 = 0xEFAE, + TextBulletListLtrRotate9020 = 0xEFAF, + TextBulletListRtlRotate9020 = 0xEFB0, + TextDirectionHorizontalLtr20 = 0xEFB1, + TextDirectionHorizontalLtr24 = 0xEFB2, + TextDirectionHorizontalRtl20 = 0xEFB3, + TextDirectionHorizontalRtl24 = 0xEFB4, + TextDirectionRotate90Ltr20 = 0xEFB5, + TextDirectionRotate90Ltr24 = 0xEFB6, + TextDirectionRotate90Rtl20 = 0xEFB7, + TextDirectionRotate90Rtl24 = 0xEFB8, AccessTime24 = 0xF101, Accessibility16 = 0xF102, Accessibility20 = 0xF103, diff --git a/src/Wpf.Ui/Common/SymbolRegular.cs b/src/Wpf.Ui/Common/SymbolRegular.cs index 9a8e1c41d..11f0d7796 100644 --- a/src/Wpf.Ui/Common/SymbolRegular.cs +++ b/src/Wpf.Ui/Common/SymbolRegular.cs @@ -6,7 +6,7 @@ namespace Wpf.Ui.Common; /// -/// Represents a list of regular Fluent System Icons v.1.1.176. +/// Represents a list of regular Fluent System Icons v.1.1.181. /// May be converted to using GetGlyph() or to using GetString() /// #pragma warning disable CS1591 @@ -3896,6 +3896,154 @@ public enum SymbolRegular ShieldQuestion20 = 0xEF22, ShieldQuestion24 = 0xEF23, ShieldQuestion32 = 0xEF24, + HeartBroken24 = 0xEF25, + LayerDiagonal20 = 0xEF26, + LayerDiagonalPerson20 = 0xEF27, + TextWrap16 = 0xEF28, + TextWrapOff16 = 0xEF29, + TextWrapOff20 = 0xEF2A, + TextWrapOff24 = 0xEF2B, + TrophyLock16 = 0xEF2C, + TrophyLock20 = 0xEF2D, + TrophyLock24 = 0xEF2E, + TrophyLock28 = 0xEF2F, + TrophyLock32 = 0xEF30, + TrophyLock48 = 0xEF31, + ArrowRepeat116 = 0xEF32, + ArrowRepeat120 = 0xEF33, + ArrowRepeat124 = 0xEF34, + ArrowShuffle16 = 0xEF35, + ArrowShuffle20 = 0xEF36, + ArrowShuffle24 = 0xEF37, + ArrowShuffle28 = 0xEF38, + ArrowShuffle32 = 0xEF39, + ArrowShuffle48 = 0xEF3A, + ArrowShuffleOff16 = 0xEF3B, + ArrowShuffleOff20 = 0xEF3C, + ArrowShuffleOff24 = 0xEF3D, + ArrowShuffleOff28 = 0xEF3E, + ArrowShuffleOff32 = 0xEF3F, + ArrowShuffleOff48 = 0xEF40, + BuildingDesktop16 = 0xEF41, + BuildingDesktop20 = 0xEF42, + BuildingDesktop24 = 0xEF43, + CalendarEmpty48 = 0xEF44, + CalendarLock16 = 0xEF45, + CalendarLock20 = 0xEF46, + CalendarLock24 = 0xEF47, + CalendarLock28 = 0xEF48, + CalendarLock32 = 0xEF49, + CalendarLock48 = 0xEF4A, + CalendarSettings24 = 0xEF4B, + CalendarSettings28 = 0xEF4C, + CalendarSettings32 = 0xEF4D, + CalendarSettings48 = 0xEF4E, + Call12 = 0xEF4F, + CallMissed12 = 0xEF50, + ChatAdd16 = 0xEF51, + ChatAdd20 = 0xEF52, + ChatAdd24 = 0xEF53, + ChatAdd28 = 0xEF54, + ChatAdd32 = 0xEF55, + ChatAdd48 = 0xEF56, + ChatCursor16 = 0xEF57, + ChatCursor20 = 0xEF58, + ChatCursor24 = 0xEF59, + ChatEmpty12 = 0xEF5A, + ChatEmpty16 = 0xEF5B, + ChatEmpty20 = 0xEF5C, + ChatEmpty24 = 0xEF5D, + ChatEmpty28 = 0xEF5E, + ChatEmpty32 = 0xEF5F, + ChatEmpty48 = 0xEF60, + CircleImage16 = 0xEF61, + CircleImage24 = 0xEF62, + CircleImage28 = 0xEF63, + CodeText16 = 0xEF64, + DesktopCheckmark16 = 0xEF65, + DesktopCheckmark20 = 0xEF66, + DesktopCheckmark24 = 0xEF67, + Fire16 = 0xEF68, + Fire20 = 0xEF69, + Fire24 = 0xEF6A, + Hourglass20 = 0xEF6B, + Hourglass24 = 0xEF6C, + HourglassHalf20 = 0xEF6D, + HourglassHalf24 = 0xEF6E, + HourglassOneQuarter20 = 0xEF6F, + HourglassOneQuarter24 = 0xEF70, + HourglassThreeQuarter20 = 0xEF71, + HourglassThreeQuarter24 = 0xEF72, + InkStrokeArrowDown20 = 0xEF73, + InkStrokeArrowDown24 = 0xEF74, + InkStrokeArrowUpDown20 = 0xEF75, + InkStrokeArrowUpDown24 = 0xEF76, + MegaphoneCircle20 = 0xEF77, + MegaphoneCircle24 = 0xEF78, + NumberCircle216 = 0xEF79, + NumberCircle220 = 0xEF7A, + NumberCircle224 = 0xEF7B, + NumberCircle228 = 0xEF7C, + NumberCircle232 = 0xEF7D, + NumberCircle248 = 0xEF7E, + NumberCircle316 = 0xEF7F, + NumberCircle320 = 0xEF80, + NumberCircle324 = 0xEF81, + NumberCircle328 = 0xEF82, + NumberCircle332 = 0xEF83, + NumberCircle348 = 0xEF84, + NumberCircle416 = 0xEF85, + NumberCircle420 = 0xEF86, + NumberCircle424 = 0xEF87, + NumberCircle428 = 0xEF88, + NumberCircle432 = 0xEF89, + NumberCircle448 = 0xEF8A, + NumberCircle516 = 0xEF8B, + NumberCircle520 = 0xEF8C, + NumberCircle524 = 0xEF8D, + NumberCircle528 = 0xEF8E, + NumberCircle532 = 0xEF8F, + NumberCircle548 = 0xEF90, + PersonAlert16 = 0xEF91, + PersonAlert20 = 0xEF92, + PersonAlert24 = 0xEF93, + PersonArrowBack16 = 0xEF94, + PersonArrowBack20 = 0xEF95, + PersonArrowBack24 = 0xEF96, + PersonArrowBack28 = 0xEF97, + PersonArrowBack32 = 0xEF98, + PersonArrowBack48 = 0xEF99, + PersonLink16 = 0xEF9A, + PersonLink20 = 0xEF9B, + PersonLink24 = 0xEF9C, + PersonLink28 = 0xEF9D, + PersonLink32 = 0xEF9E, + PersonLink48 = 0xEF9F, + Phone28 = 0xEFA0, + Phone32 = 0xEFA1, + Phone48 = 0xEFA2, + PhoneChat16 = 0xEFA3, + PhoneChat20 = 0xEFA4, + PhoneChat24 = 0xEFA5, + PhoneChat28 = 0xEFA6, + Premium12 = 0xEFA7, + ShieldAdd16 = 0xEFA8, + ShieldAdd20 = 0xEFA9, + ShieldAdd24 = 0xEFAA, + SparkleCircle20 = 0xEFAB, + SparkleCircle24 = 0xEFAC, + TaskListSquareLtr16 = 0xEFAD, + TaskListSquareRtl16 = 0xEFAE, + TextBulletListLtrRotate9020 = 0xEFAF, + TextBulletListRtlRotate9020 = 0xEFB0, + TextDirectionHorizontalLtr20 = 0xEFB1, + TextDirectionHorizontalLtr24 = 0xEFB2, + TextDirectionHorizontalRtl20 = 0xEFB3, + TextDirectionHorizontalRtl24 = 0xEFB4, + TextDirectionRotate90Ltr20 = 0xEFB5, + TextDirectionRotate90Ltr24 = 0xEFB6, + TextDirectionRotate90Rtl20 = 0xEFB7, + TextDirectionRotate90Rtl24 = 0xEFB8, AccessTime24 = 0xF101, Accessibility16 = 0xF102, Accessibility20 = 0xF103, diff --git a/src/Wpf.Ui/Controls/AutoSuggestBox.cs b/src/Wpf.Ui/Controls/AutoSuggestBox.cs index 56b396108..806bc938d 100644 --- a/src/Wpf.Ui/Controls/AutoSuggestBox.cs +++ b/src/Wpf.Ui/Controls/AutoSuggestBox.cs @@ -245,6 +245,14 @@ protected override void OnKeyDown(KeyEventArgs e) base.OnKeyDown(e); } + /// + protected override void OnLostFocus(RoutedEventArgs e) + { + IsSuggestionListOpen = false; + + base.OnLostFocus(e); + } + /// /// This virtual method is called after presenter containing suggestion loses focus. /// diff --git a/src/Wpf.Ui/Controls/Barcode.cs b/src/Wpf.Ui/Controls/Barcode.cs deleted file mode 100644 index 760a4af81..000000000 --- a/src/Wpf.Ui/Controls/Barcode.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System; - -namespace Wpf.Ui.Controls; - -// TODO: Another for fun -[Obsolete] -internal class Barcode : System.Windows.Controls.Control -{ -} diff --git a/src/Wpf.Ui/Controls/CardAction.cs b/src/Wpf.Ui/Controls/CardAction.cs index 6fc7a10ff..db543ca9d 100644 --- a/src/Wpf.Ui/Controls/CardAction.cs +++ b/src/Wpf.Ui/Controls/CardAction.cs @@ -23,9 +23,9 @@ namespace Wpf.Ui.Controls; public class CardAction : System.Windows.Controls.Primitives.ButtonBase, IIconControl { /// - /// Property for . + /// Property for . /// - public static readonly DependencyProperty ShowChevronProperty = DependencyProperty.Register(nameof(ShowChevron), + public static readonly DependencyProperty IsChevronVisibleProperty = DependencyProperty.Register(nameof(IsChevronVisible), typeof(bool), typeof(CardAction), new PropertyMetadata(true)); /// @@ -52,10 +52,10 @@ public class CardAction : System.Windows.Controls.Primitives.ButtonBase, IIconCo /// Gets or sets information whether to display the chevron icon on the right side of the card. /// [Bindable(true), Category("Appearance")] - public bool ShowChevron + public bool IsChevronVisible { - get => (bool)GetValue(ShowChevronProperty); - set => SetValue(ShowChevronProperty, value); + get => (bool)GetValue(IsChevronVisibleProperty); + set => SetValue(IsChevronVisibleProperty, value); } /// diff --git a/src/Wpf.Ui/Controls/ControlsServices.cs b/src/Wpf.Ui/Controls/ControlsServices.cs new file mode 100644 index 000000000..d1f477f6a --- /dev/null +++ b/src/Wpf.Ui/Controls/ControlsServices.cs @@ -0,0 +1,31 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +using System; + +namespace Wpf.Ui.Controls; + +/// +/// Used to initialize the library controls with static values. +/// +public static class ControlsServices +{ +#if NET48_OR_GREATER || NETCOREAPP3_0_OR_GREATER + internal static IServiceProvider ControlsServiceProvider { get; private set; } + + /// + /// Accepts a ServiceProvider for configuring dependency injection. + /// + /// + /// + public static void Initialize(IServiceProvider serviceProvider) + { + if (serviceProvider == null) + throw new ArgumentNullException(nameof(serviceProvider)); + + ControlsServiceProvider = serviceProvider; + } +#endif +} diff --git a/src/Wpf.Ui/Controls/DataGrid.cs b/src/Wpf.Ui/Controls/DataGrid.cs new file mode 100644 index 000000000..827ae59a4 --- /dev/null +++ b/src/Wpf.Ui/Controls/DataGrid.cs @@ -0,0 +1,88 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + + +using System; +using System.Collections.Specialized; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; + +namespace Wpf.Ui.Controls; + +/// +/// A DataGrid control that displays data in rows and columns and allows +/// for the entering and editing of data. +/// +public class DataGrid : System.Windows.Controls.DataGrid +{ + /// + /// The DependencyProperty that represents the property. + /// + public static readonly DependencyProperty CheckBoxColumnElementStyleProperty = DependencyProperty.Register(nameof(CheckBoxColumnElementStyle), + typeof(Style), typeof(DataGrid), new FrameworkPropertyMetadata(null)); + + /// + /// The DependencyProperty that represents the property. + /// + public static readonly DependencyProperty CheckBoxColumnEditingElementStyleProperty = DependencyProperty.Register(nameof(CheckBoxColumnEditingElementStyle), + typeof(Style), typeof(DataGrid), new FrameworkPropertyMetadata(null)); + + /// + /// A style to apply to all checkbox column in the DataGrid + /// + public Style CheckBoxColumnElementStyle + { + get => (Style)GetValue(CheckBoxColumnElementStyleProperty); + set => SetValue(CheckBoxColumnElementStyleProperty, value); + } + + /// + /// A style to apply to all checkbox column in the DataGrid + /// + public Style CheckBoxColumnEditingElementStyle + { + get => (Style)GetValue(CheckBoxColumnEditingElementStyleProperty); + set => SetValue(CheckBoxColumnEditingElementStyleProperty, value); + } + + protected override void OnInitialized(EventArgs e) + { + Columns.CollectionChanged += ColumnsOnCollectionChanged; + + UpdateColumnElementStyles(); + + base.OnInitialized(e); + } + + private void ColumnsOnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) + { + UpdateColumnElementStyles(); + } + + private void UpdateColumnElementStyles() + { + foreach (var singleColumn in Columns) + UpdateSingleColumn(singleColumn); + } + + private void UpdateSingleColumn(DataGridColumn dataGridColumn) + { + if (dataGridColumn is DataGridCheckBoxColumn checkBoxColumn) + { + if (checkBoxColumn.ReadLocalValue(DataGridCheckBoxColumn.ElementStyleProperty) == DependencyProperty.UnsetValue) + BindingOperations.SetBinding( + checkBoxColumn, + DataGridCheckBoxColumn.ElementStyleProperty, + new Binding { Path = new PropertyPath(CheckBoxColumnElementStyleProperty), Source = this }); + + if (checkBoxColumn.ReadLocalValue(DataGridCheckBoxColumn.EditingElementStyleProperty) == DependencyProperty.UnsetValue) + BindingOperations.SetBinding( + checkBoxColumn, + DataGridCheckBoxColumn.EditingElementStyleProperty, + new Binding { Path = new PropertyPath(CheckBoxColumnEditingElementStyleProperty), Source = this }); + } + } +} diff --git a/src/Wpf.Ui/Controls/Flyout.cs b/src/Wpf.Ui/Controls/Flyout.cs index cb2d46a23..41b53ff61 100644 --- a/src/Wpf.Ui/Controls/Flyout.cs +++ b/src/Wpf.Ui/Controls/Flyout.cs @@ -3,12 +3,72 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. +using System; +using System.Windows; + namespace Wpf.Ui.Controls; /// -/// Control that displays a flying element that can, for example, contain tips. +/// Represents a control that creates a pop-up window that displays information for an element in the interface. /// +[TemplatePart(Name = "PART_Popup", Type = typeof(System.Windows.Controls.Primitives.Popup))] public class Flyout : System.Windows.Controls.ContentControl { - // TODO: Well... to do + private const string ElementPopup = "PART_Popup"; + + private System.Windows.Controls.Primitives.Popup _popup = null; + + /// + /// Property for . + /// + public static readonly DependencyProperty IsOpenProperty = DependencyProperty.Register(nameof(IsOpen), + typeof(bool), typeof(Flyout), new PropertyMetadata(false)); + + /// + /// Invoked whenever application code or an internal process, + /// such as a rebuilding layout pass, calls the ApplyTemplate method. + /// + public override void OnApplyTemplate() + { + base.OnApplyTemplate(); + + _popup = GetTemplateChild(ElementPopup) as System.Windows.Controls.Primitives.Popup; + + if (_popup != null) + { + _popup.Opened -= OnPopupOpened; + _popup.Opened += OnPopupOpened; + + _popup.Closed -= OnPopupClosed; + _popup.Closed += OnPopupClosed; + } + } + + public bool IsOpen + { + get => (bool)GetValue(IsOpenProperty); + protected set => SetValue(IsOpenProperty, value); + } + + public void Show() + { + if (!IsOpen) + IsOpen = true; + } + + public void Hide() + { + if (IsOpen) + IsOpen = false; + } + + protected virtual void OnPopupOpened(object sender, EventArgs e) + { + + } + + protected virtual void OnPopupClosed(object sender, EventArgs e) + { + Hide(); + } } diff --git a/src/Wpf.Ui/Controls/FontIcon.cs b/src/Wpf.Ui/Controls/FontIcon.cs index d79f8ad2a..bb28bbc35 100644 --- a/src/Wpf.Ui/Controls/FontIcon.cs +++ b/src/Wpf.Ui/Controls/FontIcon.cs @@ -14,7 +14,7 @@ namespace Wpf.Ui.Controls; /// [ToolboxItem(true)] [ToolboxBitmap(typeof(FontIcon), "FontIcon.bmp")] -public class FontIcon : System.Windows.Controls.Label +public class FontIcon : System.Windows.Controls.Control { /// /// Property for . diff --git a/src/Wpf.Ui/Controls/InfoBar.cs b/src/Wpf.Ui/Controls/InfoBar.cs new file mode 100644 index 000000000..0efaa44f4 --- /dev/null +++ b/src/Wpf.Ui/Controls/InfoBar.cs @@ -0,0 +1,103 @@ +using System.Windows; + +namespace Wpf.Ui.Controls +{ + /// + /// An is an inline notification for essential app- + /// wide messages. The InfoBar will take up space in a layout and will not + /// cover up other content or float on top of it. It supports rich content + /// (including titles, messages, and icons) and can be configured to be + /// user-dismissable or persistent. + /// + public class InfoBar : System.Windows.Controls.ContentControl + { + public static readonly DependencyProperty IsClosableProperty = + DependencyProperty.Register(nameof(IsClosable), typeof(bool), typeof(InfoBar), + new PropertyMetadata(true)); + + public static readonly DependencyProperty IsOpenProperty = + DependencyProperty.Register(nameof(IsOpen), typeof(bool), typeof(InfoBar), + new PropertyMetadata(false)); + + public static readonly DependencyProperty MessageProperty = + DependencyProperty.Register(nameof(Message), typeof(string), typeof(InfoBar), + new PropertyMetadata("")); + + public static readonly DependencyProperty SeverityProperty = + DependencyProperty.Register(nameof(Severity), typeof(InfoBarSeverity), typeof(InfoBar), + new PropertyMetadata(InfoBarSeverity.Informational)); + + /// + /// Property for . + /// + public static readonly DependencyProperty TemplateButtonCommandProperty = + DependencyProperty.Register(nameof(TemplateButtonCommand), typeof(Common.IRelayCommand), typeof(InfoBar), + new PropertyMetadata(null)); + + public static readonly DependencyProperty TitleProperty = + DependencyProperty.Register("Title", typeof(string), typeof(InfoBar), + new PropertyMetadata("")); + + /// + /// Gets or sets a value that indicates whether the user can close the + /// . Defaults to true. + /// + public bool IsClosable + { + get { return (bool)GetValue(IsClosableProperty); } + set { SetValue(IsClosableProperty, value); } + } + + /// + /// Gets or sets a value that indicates whether the + /// is open. + /// + public bool IsOpen + { + get { return (bool)GetValue(IsOpenProperty); } + set { SetValue(IsOpenProperty, value); } + } + + /// + /// Gets or sets the message of the . + /// + public string Message + { + get { return (string)GetValue(MessageProperty); } + set { SetValue(MessageProperty, value); } + } + + /// + /// Gets or sets the type of the to apply + /// consistent status color, icon, and assistive technology settings + /// dependent on the criticality of the notification. + /// + public InfoBarSeverity Severity + { + get { return (InfoBarSeverity)GetValue(SeverityProperty); } + set { SetValue(SeverityProperty, value); } + } + + /// + /// Gets the triggered after clicking + /// the close button. + /// + public Common.IRelayCommand TemplateButtonCommand => (Common.IRelayCommand)GetValue(TemplateButtonCommandProperty); + + /// + /// Gets or sets the title of the . + /// + public string Title + { + get { return (string)GetValue(TitleProperty); } + set { SetValue(TitleProperty, value); } + } + + /// + public InfoBar() + { + SetValue(TemplateButtonCommandProperty, + new Common.RelayCommand(o => IsOpen = false)); + } + } +} diff --git a/src/Wpf.Ui/Controls/InfoBarSeverity.cs b/src/Wpf.Ui/Controls/InfoBarSeverity.cs new file mode 100644 index 000000000..4171015e7 --- /dev/null +++ b/src/Wpf.Ui/Controls/InfoBarSeverity.cs @@ -0,0 +1,27 @@ +namespace Wpf.Ui.Controls +{ + public enum InfoBarSeverity + { + /// + /// Communicates that the InfoBar is displaying general information that requires the user's attention. + /// + Informational = 0, + + /// + /// Communicates that the InfoBar is displaying information regarding a long-running and/or background task + /// that has completed successfully. + /// + Success = 1, + + /// + /// Communicates that the InfoBar is displaying information regarding a condition that might cause a problem in + /// the future. + /// + Warning = 2, + + /// + /// Communicates that the InfoBar is displaying information regarding an error or problem that has occurred. + /// + Error = 3 + } +} diff --git a/src/Wpf.Ui/Controls/Interfaces/INavigation.cs b/src/Wpf.Ui/Controls/Interfaces/INavigation.cs index 8be422a96..3e2592e12 100644 --- a/src/Wpf.Ui/Controls/Interfaces/INavigation.cs +++ b/src/Wpf.Ui/Controls/Interfaces/INavigation.cs @@ -7,9 +7,9 @@ using System.Collections.ObjectModel; using System.ComponentModel; using System.Windows.Controls; +using Wpf.Ui.Animations; using Wpf.Ui.Common; using Wpf.Ui.Mvvm.Contracts; -using Wpf.Ui.Services; namespace Wpf.Ui.Controls.Interfaces; @@ -39,6 +39,11 @@ public interface INavigation /// bool Precache { get; set; } + /// + /// Indicates the possibility of navigation back + /// + bool CanGoBack { get; } + /// /// Currently used item like . /// @@ -107,6 +112,12 @@ public interface INavigation /// void ClearCache(); + /// + /// Navigates to the previous page using the . + /// + /// + bool NavigateBack(); + /// /// Navigates to the page using the . /// diff --git a/src/Wpf.Ui/Controls/Interfaces/ISnackbarControl.cs b/src/Wpf.Ui/Controls/Interfaces/ISnackbarControl.cs index 2c04d22d0..1ce5bb9fd 100644 --- a/src/Wpf.Ui/Controls/Interfaces/ISnackbarControl.cs +++ b/src/Wpf.Ui/Controls/Interfaces/ISnackbarControl.cs @@ -78,6 +78,16 @@ public interface ISnackbarControl /// if invocation of method succeeded, Exception otherwise. bool Show(string title, string message, SymbolRegular icon); + /// + /// Shows the snackbar. If it is already visible, firstly hides it for a moment, changes its content, and then shows it again. + /// + /// at the top of the snackbar. + /// in the content of the snackbar. + /// Icon on the left. + /// of the snackbar. + /// if invocation of method succeeded, Exception otherwise. + bool Show(string title, string message, SymbolRegular icon, ControlAppearance appearance); + /// /// Asynchronously shows the snackbar. If it is already visible, firstly hides it for a moment, changes its content, and then shows it again. /// @@ -108,6 +118,16 @@ public interface ISnackbarControl /// if the operation was successful. Task ShowAsync(string title, string message, SymbolRegular icon); + /// + /// Asynchronously shows the snackbar. If it is already visible, firstly hides it for a moment, changes its content, and then shows it again. + /// + /// at the top of the snackbar. + /// in the content of the snackbar. + /// on the left. + /// of the snackbar. + /// if the operation was successful. + Task ShowAsync(string title, string message, SymbolRegular icon, ControlAppearance appearance); + /// /// Hides the snackbar based on the selected animation, if control is visible. /// diff --git a/src/Wpf.Ui/Controls/MessageBox.cs b/src/Wpf.Ui/Controls/MessageBox.cs index 0e8d1aab5..13ad8789a 100644 --- a/src/Wpf.Ui/Controls/MessageBox.cs +++ b/src/Wpf.Ui/Controls/MessageBox.cs @@ -188,8 +188,7 @@ public event RoutedEventHandler ButtonRightClick /// public MessageBox() { - Owner = Application.Current.MainWindow; - + SetWindowStartupLocation(); Topmost = true; Height = 200; @@ -231,19 +230,23 @@ public void Show(string title, object content) // System.Diagnostics.Debug.WriteLine(newContent.GetType()); // if (newContent != null && newContent.GetType() == typeof(System.Windows.Controls.Grid)) - // { // Height = (newContent as System.Windows.Controls.Grid).ActualHeight; - // } // base.OnContentChanged(oldContent, newContent); //} + private void SetWindowStartupLocation() + { + if (Application.Current?.MainWindow != null) + Owner = Application.Current.MainWindow; + else + WindowStartupLocation = WindowStartupLocation.CenterScreen; + } + private void Button_OnClick(object sender, object parameter) { if (parameter == null) - { return; - } string param = parameter as string ?? String.Empty; diff --git a/src/Wpf.Ui/Controls/Navigation/NavigationBackButton.cs b/src/Wpf.Ui/Controls/Navigation/NavigationBackButton.cs new file mode 100644 index 000000000..d1ffefb16 --- /dev/null +++ b/src/Wpf.Ui/Controls/Navigation/NavigationBackButton.cs @@ -0,0 +1,39 @@ +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, You can obtain one at https://opensource.org/licenses/MIT. +// Copyright (C) Leszek Pomianowski and WPF UI Contributors. +// All Rights Reserved. + +#nullable enable + +using System.ComponentModel; +using System.Windows; +using Wpf.Ui.Controls.Interfaces; + +namespace Wpf.Ui.Controls.Navigation; + +/// +/// Inherited from the , used to navigate backwards inside the . +/// +public class NavigationBackButton : System.Windows.Controls.Button +{ + /// + /// Property for . + /// + public static readonly DependencyProperty NavigationProperty = DependencyProperty.Register(nameof(Navigation), + typeof(INavigation), typeof(NavigationBackButton), new PropertyMetadata(null)); + + /// + /// Parent control. + /// + [Bindable(true), Category("Behavior")] + public INavigation? Navigation + { + get => (INavigation)GetValue(NavigationProperty); + set => SetValue(NavigationProperty, value); + } + + public NavigationBackButton() + { + SetValue(CommandProperty, new Common.RelayCommand(_ => Navigation?.NavigateBack(), () => Navigation is not null && Navigation.CanGoBack)); + } +} diff --git a/src/Wpf.Ui/Controls/Navigation/NavigationBase.cs b/src/Wpf.Ui/Controls/Navigation/NavigationBase.cs index fb7488191..bc8ea838c 100644 --- a/src/Wpf.Ui/Controls/Navigation/NavigationBase.cs +++ b/src/Wpf.Ui/Controls/Navigation/NavigationBase.cs @@ -8,7 +8,6 @@ #pragma warning disable CS8603 using System; -using System.Collections.Generic; using System.Collections.ObjectModel; using System.Collections.Specialized; using System.Windows; @@ -29,13 +28,6 @@ public abstract class NavigationBase : System.Windows.Controls.Control, INavigat /// /// Service used for navigation purposes. /// - - /* Unmerged change from project 'Wpf.Ui (net47)' - Before: - private readonly Wpf.Ui.Services.NavigationService? _navigationService; - After: - private readonly NavigationService? _navigationService; - */ private readonly Services.Internal.NavigationService? _navigationService; /// @@ -80,8 +72,8 @@ public abstract class NavigationBase : System.Windows.Controls.Control, INavigat /// public static readonly DependencyProperty TransitionTypeProperty = DependencyProperty.Register( nameof(TransitionType), - typeof(Services.TransitionType), typeof(NavigationBase), - new PropertyMetadata(Services.TransitionType.FadeInWithSlide, OnTransitionTypeChanged)); + typeof(Animations.TransitionType), typeof(NavigationBase), + new PropertyMetadata(Animations.TransitionType.FadeInWithSlide, OnTransitionTypeChanged)); /// /// Property for . @@ -136,9 +128,9 @@ public int TransitionDuration } /// - public Services.TransitionType TransitionType + public Animations.TransitionType TransitionType { - get => (Services.TransitionType)GetValue(TransitionTypeProperty); + get => (Animations.TransitionType)GetValue(TransitionTypeProperty); set => SetValue(TransitionTypeProperty, value); } @@ -225,12 +217,10 @@ public IPageService? PageService public int PreviousPageIndex => _navigationService?.GetPreviousId() ?? 0; /// - public INavigationItem? Current { get; internal set; } + public bool CanGoBack => _navigationService is not null && _navigationService.CanGoBack; - /// - /// Navigation history containing pages tags. - /// - public readonly List History; + /// + public INavigationItem? Current { get; internal set; } /// /// Static constructor overriding default properties. @@ -252,7 +242,6 @@ static NavigationBase() protected NavigationBase() { Current = (INavigationItem)null; - History = new List(); // Prepare individual collections for this navigation Items ??= new ObservableCollection(); @@ -272,6 +261,18 @@ protected NavigationBase() Loaded += OnLoaded; } + public bool NavigateBack() + { + if (_navigationService is null) return false; + + if (!_navigationService.NavigateBack()) + return false; + + NavigateInternal(0, true); + + return true; + } + /// public bool Navigate(Type pageType) { @@ -284,16 +285,7 @@ public bool Navigate(Type pageType, object? dataContext) if (!_navigationService.Navigate(pageType, dataContext)) return false; - SelectedPageIndex = _navigationService.GetCurrentId(); - - UpdateItems(); - - OnNavigated(); - - if (_navigationService.GetCurrentId() > _navigationService.GetPreviousId()) - OnNavigatedForward(); - else - OnNavigatedBackward(); + NavigateInternal(0, true); return true; } @@ -310,16 +302,7 @@ public bool Navigate(string pageTag, object? dataContext) if (!_navigationService.Navigate(pageTag, dataContext)) return false; - SelectedPageIndex = _navigationService.GetCurrentId(); - - UpdateItems(); - - OnNavigated(); - - if (_navigationService.GetCurrentId() > _navigationService.GetPreviousId()) - OnNavigatedForward(); - else - OnNavigatedBackward(); + NavigateInternal(0, true); return true; } @@ -338,16 +321,7 @@ public bool Navigate(int pageId, object? dataContext) if (!_navigationService.Navigate(pageId, dataContext)) return false; - SelectedPageIndex = _navigationService?.GetCurrentId() ?? -1; - - UpdateItems(); - - OnNavigated(); - - if (SelectedPageIndex > (_navigationService?.GetPreviousId() ?? -1)) - OnNavigatedForward(); - else - OnNavigatedBackward(); + NavigateInternal(-1, true); return true; } @@ -365,16 +339,7 @@ public bool NavigateExternal(object frameworkElement, object? dataContext) if (!_navigationService.NavigateExternal(frameworkElement, dataContext)) return false; - SelectedPageIndex = _navigationService?.GetCurrentId() ?? -1; - - UpdateItems(); - - OnNavigated(); - - if (SelectedPageIndex > (_navigationService?.GetPreviousId() ?? -1)) - OnNavigatedForward(); - else - OnNavigatedBackward(); + NavigateInternal(-1, true); return true; } @@ -392,14 +357,7 @@ public bool NavigateExternal(Uri absolutePageUri, object? dataContext) if (!_navigationService.NavigateExternal(absolutePageUri, dataContext)) return false; - SelectedPageIndex = _navigationService?.GetCurrentId() ?? -1; - - OnNavigated(); - - if (SelectedPageIndex > (_navigationService?.GetPreviousId() ?? -1)) - OnNavigatedForward(); - else - OnNavigatedBackward(); + NavigateInternal(-1, false); return true; } @@ -688,6 +646,9 @@ private static void OnTransitionDurationChanged(DependencyObject d, DependencyPr if (d is not NavigationBase navigation) return; + if (navigation._navigationService == null) + return; + navigation._navigationService.TransitionDuration = (int)e.NewValue; } @@ -696,11 +657,14 @@ private static void OnTransitionTypeChanged(DependencyObject d, DependencyProper if (d is not NavigationBase navigation) return; - navigation._navigationService.TransitionType = (Services.TransitionType)e.NewValue; + if (navigation._navigationService == null) + return; + + navigation._navigationService.TransitionType = (Animations.TransitionType)e.NewValue; } /// - /// Gets the parent view for its children. + /// Gets the parent view for its children. /// /// /// @@ -740,4 +704,19 @@ private void UpdateServiceItems() if (_navigationService != null) _navigationService.UpdateItems(navigationItems, navigationFooter); } + + private void NavigateInternal(int arg, bool updateItems) + { + SelectedPageIndex = _navigationService?.GetCurrentId() ?? +arg; + + if (updateItems) + UpdateItems(); + + OnNavigated(); + + if (SelectedPageIndex > (_navigationService?.GetPreviousId() ?? +arg)) + OnNavigatedForward(); + else + OnNavigatedBackward(); + } } diff --git a/src/Wpf.Ui/Controls/NavigationHeader.bmp b/src/Wpf.Ui/Controls/Navigation/NavigationHeader.bmp similarity index 100% rename from src/Wpf.Ui/Controls/NavigationHeader.bmp rename to src/Wpf.Ui/Controls/Navigation/NavigationHeader.bmp diff --git a/src/Wpf.Ui/Controls/NavigationHeader.cs b/src/Wpf.Ui/Controls/Navigation/NavigationHeader.cs similarity index 93% rename from src/Wpf.Ui/Controls/NavigationHeader.cs rename to src/Wpf.Ui/Controls/Navigation/NavigationHeader.cs index e626e03fe..a4a1f36a7 100644 --- a/src/Wpf.Ui/Controls/NavigationHeader.cs +++ b/src/Wpf.Ui/Controls/Navigation/NavigationHeader.cs @@ -3,7 +3,6 @@ // Copyright (C) Leszek Pomianowski and WPF UI Contributors. // All Rights Reserved. -using System; using System.ComponentModel; using System.Drawing; using System.Windows; @@ -11,7 +10,7 @@ using Brush = System.Windows.Media.Brush; using SystemColors = System.Windows.SystemColors; -namespace Wpf.Ui.Controls; +namespace Wpf.Ui.Controls.Navigation; [ToolboxItem(true)] [ToolboxBitmap(typeof(NavigationHeader), "NavigationHeader.bmp")] @@ -22,7 +21,7 @@ public class NavigationHeader : System.Windows.Controls.Control, INavigationCont /// public static readonly DependencyProperty TextProperty = DependencyProperty.Register(nameof(Text), typeof(string), typeof(NavigationHeader), - new PropertyMetadata(String.Empty)); + new PropertyMetadata(string.Empty)); /// /// Property for . @@ -77,7 +76,7 @@ public bool IconFilled } /// - /// Foreground of the . + /// Foreground of the . /// [Bindable(true), Category("Appearance")] public Brush IconForeground @@ -87,7 +86,7 @@ public Brush IconForeground } /// - /// Font size of the . + /// Font size of the . /// [Bindable(true), Category("Appearance")] public double IconSize diff --git a/src/Wpf.Ui/Controls/NavigationSeparator.bmp b/src/Wpf.Ui/Controls/Navigation/NavigationSeparator.bmp similarity index 100% rename from src/Wpf.Ui/Controls/NavigationSeparator.bmp rename to src/Wpf.Ui/Controls/Navigation/NavigationSeparator.bmp diff --git a/src/Wpf.Ui/Controls/NavigationSeparator.cs b/src/Wpf.Ui/Controls/Navigation/NavigationSeparator.cs similarity index 93% rename from src/Wpf.Ui/Controls/NavigationSeparator.cs rename to src/Wpf.Ui/Controls/Navigation/NavigationSeparator.cs index 836843ac9..3f498c6fe 100644 --- a/src/Wpf.Ui/Controls/NavigationSeparator.cs +++ b/src/Wpf.Ui/Controls/Navigation/NavigationSeparator.cs @@ -7,7 +7,7 @@ using System.Drawing; using Wpf.Ui.Controls.Interfaces; -namespace Wpf.Ui.Controls; +namespace Wpf.Ui.Controls.Navigation; [ToolboxItem(true)] [ToolboxBitmap(typeof(NavigationSeparator), "NavigationSeparator.bmp")] diff --git a/src/Wpf.Ui/Controls/NumberBox.cs b/src/Wpf.Ui/Controls/NumberBox.cs index 80de6eaa8..93579ae74 100644 --- a/src/Wpf.Ui/Controls/NumberBox.cs +++ b/src/Wpf.Ui/Controls/NumberBox.cs @@ -41,7 +41,7 @@ public class NumberBox : Wpf.Ui.Controls.TextBox /// Property for . /// public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(nameof(Value), - typeof(double), typeof(NumberBox), new PropertyMetadata(0.0d)); + typeof(double), typeof(NumberBox), new PropertyMetadata(0.0d, OnValuePropertyChanged)); /// /// Property for . @@ -214,6 +214,13 @@ public event RoutedEventHandler Decremented remove => RemoveHandler(DecrementedEvent, value); } + static NumberBox() + { + AcceptsReturnProperty.OverrideMetadata(typeof(PasswordBox), new FrameworkPropertyMetadata(false)); + MaxLinesProperty.OverrideMetadata(typeof(PasswordBox), new FrameworkPropertyMetadata(1)); + MinLinesProperty.OverrideMetadata(typeof(PasswordBox), new FrameworkPropertyMetadata(1)); + } + /// /// Creates new instance of . /// @@ -224,6 +231,11 @@ public NumberBox() Loaded += OnLoaded; } + protected virtual void OnValueChanged() + { + + } + /// protected override void OnTemplateButtonClick(object sender, object parameter) { @@ -232,9 +244,10 @@ protected override void OnTemplateButtonClick(object sender, object parameter) if (sender is not NumberBox) return; - var command = parameter?.ToString() ?? String.Empty; + if (parameter is not string parameterString) + return; - switch (command) + switch (parameterString) { case "increment": IncrementValue(); @@ -470,16 +483,7 @@ protected virtual void OnDecimalPlacesChanged(int decimalPlaces) DecimalPlaces = 0; } - private static void OnDecimalPlacesChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - if (d is not NumberBox control) - return; - - if (e.NewValue is not int newValue) - return; - control.OnDecimalPlacesChanged(newValue); - } private void OnClipboardPaste(object sender, DataObjectPastingEventArgs e) { @@ -491,4 +495,23 @@ private void OnClipboardPaste(object sender, DataObjectPastingEventArgs e) if (!IsNumberTextValid(clipboardText)) e.CancelCommand(); } + + private static void OnValuePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is not NumberBox numberBox) + return; + + numberBox.OnValueChanged(); + } + + private static void OnDecimalPlacesChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is not NumberBox control) + return; + + if (e.NewValue is not int newValue) + return; + + control.OnDecimalPlacesChanged(newValue); + } } diff --git a/src/Wpf.Ui/Controls/PasswordBox.cs b/src/Wpf.Ui/Controls/PasswordBox.cs index da59b24ca..9666f83fc 100644 --- a/src/Wpf.Ui/Controls/PasswordBox.cs +++ b/src/Wpf.Ui/Controls/PasswordBox.cs @@ -19,30 +19,27 @@ namespace Wpf.Ui.Controls; /// /// The modified password control. /// -public sealed class PasswordBox : Wpf.Ui.Controls.TextBox +public class PasswordBox : Wpf.Ui.Controls.TextBox { - /// - /// Blocks triggering overwrite when forced text editing. - /// - private bool _takenControl = false; + private bool _lockUpdatingContents; /// /// Property for . /// public static readonly DependencyProperty PasswordProperty = DependencyProperty.Register(nameof(Password), - typeof(string), typeof(PasswordBox), new PropertyMetadata(String.Empty)); + typeof(string), typeof(PasswordBox), new PropertyMetadata(String.Empty, OnPasswordPropertyChanged)); /// /// Property for . /// public static readonly DependencyProperty PasswordCharProperty = DependencyProperty.Register(nameof(PasswordChar), - typeof(char), typeof(PasswordBox), new PropertyMetadata('*', OnPasswordCharChanged)); + typeof(char), typeof(PasswordBox), new PropertyMetadata('*', OnPasswordCharPropertyChanged)); /// /// Property for . /// public static readonly DependencyProperty IsPasswordRevealedProperty = DependencyProperty.Register(nameof(IsPasswordRevealed), - typeof(bool), typeof(PasswordBox), new PropertyMetadata(false, OnPasswordRevealModeChanged)); + typeof(bool), typeof(PasswordBox), new PropertyMetadata(false, OnPasswordRevealModePropertyChanged)); /// /// Property for . @@ -51,31 +48,13 @@ public sealed class PasswordBox : Wpf.Ui.Controls.TextBox typeof(bool), typeof(PasswordBox), new PropertyMetadata(true)); /// - /// does no accept returns. + /// Event for "Password has changed" /// - public new bool AcceptsReturn - { - get => false; - set => throw new NotImplementedException($"{typeof(PasswordBox)} does not accept returns."); - } - - /// - /// does not accept changes to the number of lines. - /// - public new int MaxLines - { - get => 1; - set => throw new NotImplementedException($"{typeof(PasswordBox)} does not accept changes to the number of lines."); - } - - /// - /// does not accept changes to the number of lines. - /// - public new int MinLines - { - get => 1; - set => throw new NotImplementedException($"{typeof(PasswordBox)} does not accept changes to the number of lines."); - } + public static readonly RoutedEvent PasswordChangedEvent = EventManager.RegisterRoutedEvent( + nameof(PasswordChanged), + RoutingStrategy.Bubble, + typeof(RoutedEventHandler), + typeof(PasswordBox)); /// /// Gets or sets currently typed text represented by asterisks. @@ -83,7 +62,7 @@ public sealed class PasswordBox : Wpf.Ui.Controls.TextBox public string Password { get => (string)GetValue(PasswordProperty); - internal set => SetValue(PasswordProperty, value); + set => SetValue(PasswordProperty, value); } /// @@ -114,99 +93,76 @@ public bool RevealButtonEnabled } /// - /// Contents of the TextBox. Returns asterisks, if you want a valid password use . + /// Event fired from this text box when its inner content + /// has been changed. /// - public new string Text + /// + /// It is redirected from inner TextContainer.Changed event. + /// + public event RoutedEventHandler PasswordChanged { - get => base.Text; - set - { - SetValue(PasswordProperty, value); - SetValue(TextProperty, new String(PasswordChar, value?.Length ?? 0)); - } + add => AddHandler(PasswordChangedEvent, value); + remove => RemoveHandler(PasswordChangedEvent, value); } - /// - /// Called when content changes. - /// Partially inspired by Leonardo T. implementation of SecureWpfLogOn. - /// - /// - protected override void OnTextChanged(TextChangedEventArgs e) + public PasswordBox() { - if (_takenControl) - return; - - if (IsPasswordRevealed) - { - base.OnTextChanged(e); - Password = base.Text; - - return; - } - - string text = base.Text; - string password = Password; - int selectionIndex = SelectionStart; + _lockUpdatingContents = false; + } - if (text.Length < password.Length) - { - password = password.Remove(selectionIndex, password.Length - text.Length); - Password = password; - } + /// + protected override void OnTextChanged(TextChangedEventArgs e) + { + UpdateTextContents(true); - if (String.IsNullOrEmpty(text)) + if (_lockUpdatingContents) { base.OnTextChanged(e); - return; - } - - // TODO: Pasting text breaks this loop. - var newContent = text.Replace(PasswordChar.ToString(), String.Empty); - - if (newContent.Length > 1) - { - var index = text.IndexOf(newContent[0]); - Password = index > password.Length - 1 ? password + newContent : password.Insert(index, newContent); } else { - for (int i = 0; i < text.Length; i++) - { - if (text[i] == PasswordChar) - continue; - Password = text.Length == password.Length ? password.Remove(i, 1).Insert(i, text[i].ToString()) : password.Insert(i, text[i].ToString()); - } - } - - _takenControl = true; + if (PlaceholderEnabled && Text.Length > 0) + PlaceholderEnabled = false; - base.Text = new String(PasswordChar, Password.Length); - SelectionStart = selectionIndex; + if (!PlaceholderEnabled && Text.Length < 1) + PlaceholderEnabled = true; - _takenControl = false; + RevealClearButton(); + } + } - base.OnTextChanged(e); + /// + /// Is called when property is changing. + /// + protected virtual void OnPasswordChanged() + { + UpdateTextContents(false); } /// - /// Updates the content of the displayed password if the character is changed. + /// Is called when property is changing. /// - private void UpdatePasswordWithNewChar(char newChar) + protected virtual void OnPasswordCharChanged() { - // If password is currently revealed, do not replace text with asterisks + // If password is currently revealed, + // do not replace displayed text with asterisks if (IsPasswordRevealed) return; - base.Text = new String(newChar, base.Text.Length); + _lockUpdatingContents = true; + + Text = new String(PasswordChar, Password.Length); + + _lockUpdatingContents = false; } - /// - /// Change the display of the password. - /// - private void UpdateReveal(bool isPasswordRevealed) + protected virtual void OnPasswordRevealModeChanged() { - SetValue(TextProperty, - isPasswordRevealed ? Password : new String(PasswordChar, Password.Length)); + _lockUpdatingContents = true; + + Text = IsPasswordRevealed ? Password : new String(PasswordChar, Password.Length); + + _lockUpdatingContents = false; } /// @@ -218,20 +174,17 @@ protected override void OnTemplateButtonClick(object sender, object parameter) { base.OnTemplateButtonClick(sender, parameter); - if (parameter == null) + if (parameter is not string parameterString) return; - var param = parameter as string ?? String.Empty; - #if DEBUG - System.Diagnostics.Debug.WriteLine($"INFO: {typeof(PasswordBox)} button clicked with param: {param}", "Wpf.Ui.PasswordBox"); + System.Diagnostics.Debug.WriteLine($"INFO: {typeof(PasswordBox)} button clicked with param: {parameterString}", "Wpf.Ui.PasswordBox"); #endif - switch (param) + switch (parameterString) { case "reveal": IsPasswordRevealed = !IsPasswordRevealed; - Focus(); CaretIndex = Text.Length; @@ -239,28 +192,114 @@ protected override void OnTemplateButtonClick(object sender, object parameter) } } + private void UpdateTextContents(bool isTriggeredByTextInput) + { + if (_lockUpdatingContents) + return; + + if (IsPasswordRevealed) + { + if (Password == Text) + return; + + _lockUpdatingContents = true; + + if (isTriggeredByTextInput) + { + Password = Text; + } + else + { + Text = Password; + CaretIndex = Text.Length; + } + + RaiseEvent(new RoutedEventArgs(PasswordChangedEvent)); + + _lockUpdatingContents = false; + + return; + } + + var caretIndex = CaretIndex; + var selectionIndex = SelectionStart; + var currentPassword = Password; + var newPasswordValue = currentPassword; + + if (isTriggeredByTextInput) + { + var currentText = Text; + var newCharacters = currentText.Replace(PasswordChar.ToString(), String.Empty); + + if (currentText.Length < currentPassword.Length) + newPasswordValue = currentPassword.Remove(selectionIndex, currentPassword.Length - currentText.Length); + + if (newCharacters.Length > 1) + { + var index = currentText.IndexOf(newCharacters[0]); + + newPasswordValue = index > newPasswordValue.Length - 1 + ? newPasswordValue + newCharacters + : newPasswordValue.Insert(index, newCharacters); + } + else + { + for (int i = 0; i < currentText.Length; i++) + { + if (currentText[i] == PasswordChar) + continue; + + newPasswordValue = currentText.Length == newPasswordValue.Length + ? newPasswordValue + .Remove(i, 1) + .Insert(i, currentText[i].ToString()) + : newPasswordValue + .Insert(i, currentText[i].ToString()); + } + } + } + + _lockUpdatingContents = true; + + Text = new String(PasswordChar, newPasswordValue.Length); + Password = newPasswordValue; + CaretIndex = caretIndex; + + RaiseEvent(new RoutedEventArgs(PasswordChangedEvent)); + + _lockUpdatingContents = false; + } + + /// + /// Called when is changed. + /// + private static void OnPasswordPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is not PasswordBox control) + return; + + control.OnPasswordChanged(); + } + /// - /// Static method that is called if the character is changed in the during the run. + /// Called if the character is changed in the during the run. /// - /// Instance of the - /// Various property events. - private static void OnPasswordCharChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + private static void OnPasswordCharPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (d is not PasswordBox control) return; - control.UpdatePasswordWithNewChar(control.PasswordChar); + + control.OnPasswordCharChanged(); } /// - /// Static method that is called if the reveal mode is changed in the during the run. + /// Called if the reveal mode is changed in the during the run. /// - /// Instance of the - /// Various property events. - private static void OnPasswordRevealModeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + private static void OnPasswordRevealModePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (d is not PasswordBox control) return; - control.UpdateReveal(control.IsPasswordRevealed); + control.OnPasswordRevealModeChanged(); } } diff --git a/src/Wpf.Ui/Controls/QrCode.cs b/src/Wpf.Ui/Controls/QrCode.cs deleted file mode 100644 index dfae272a9..000000000 --- a/src/Wpf.Ui/Controls/QrCode.cs +++ /dev/null @@ -1,151 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Windows; - -namespace Wpf.Ui.Controls; - -//TODO: Just for fun - -public enum QrCodeQuality -{ - /// - /// Recovers 7% of data - /// - L, - - /// - /// Recovers 15% of data - /// - M, - - /// - /// Recovers 25% of data - /// - Q, - - /// - /// Recovers 30% of data - /// - H -} - -public enum QrCodeEncoding -{ - /// - /// Chooses automatically. - /// - Auto, - - /// - /// 7089 characters - /// - Numeric, - - /// - /// 4296 characters - /// - Alphanumeric, - - /// - /// 2953 characters - /// - Byte, - - /// - /// 1817 characters - /// - Kanji -} - -public enum QrCodeType -{ - Bitmap, - Vector -} - -/// -/// https://www.qrcode.com/en/about/standards.html -/// -[Obsolete] -internal class QrCode : System.Windows.Controls.Control -{ - // ISO 8859-1 | ISO 8859-2 | UTF-8 - - private string _rawData = String.Empty; - - /// - /// Property for . - /// - public static readonly DependencyProperty QualityProperty = - DependencyProperty.Register(nameof(Quality), typeof(QrCodeQuality), typeof(QrCode), - new PropertyMetadata(QrCodeQuality.M)); - - /// - /// Property for . - /// - public static readonly DependencyProperty EncodingProperty = - DependencyProperty.Register(nameof(Encoding), typeof(QrCodeEncoding), typeof(QrCode), - new PropertyMetadata(QrCodeEncoding.Auto)); - - /// - /// Property for . - /// - public static readonly DependencyProperty TypeProperty = - DependencyProperty.Register(nameof(Type), typeof(QrCodeType), typeof(QrCode), - new PropertyMetadata(QrCodeType.Bitmap)); - - /// - /// Gets or sets the QR Code error correction level. - /// - public QrCodeQuality Quality - { - get => (QrCodeQuality)GetValue(QualityProperty); - set => SetValue(QualityProperty, value); - } - - /// - /// Gets or sets the QR Code encoding. - /// - public QrCodeEncoding Encoding - { - get => (QrCodeEncoding)GetValue(EncodingProperty); - set => SetValue(EncodingProperty, value); - } - - /// - /// Gets or sets the QR Code generation type. - /// - public QrCodeType Type - { - get => (QrCodeType)GetValue(TypeProperty); - set => SetValue(TypeProperty, value); - } - - private static int GetModeIndicator(QrCodeEncoding encoding) - { - return encoding switch - { - QrCodeEncoding.Numeric => 0x0001, - QrCodeEncoding.Alphanumeric => 0x0010, - QrCodeEncoding.Byte => 0x0100, - QrCodeEncoding.Kanji => 0x1000, - _ => 0x0000 - }; - } - - private static byte[] Generate() - { - var bytes = new List(); - - bytes.AddRange(new byte[] { 0x51, 0x52, 0x52, 0x00 }); - - return bytes.ToArray(); - } - - private static byte[] Encode(string data, QrCodeEncoding encoding) - { - var bytes = new List(); - - return bytes.ToArray(); - } -} diff --git a/src/Wpf.Ui/Controls/Snackbar.cs b/src/Wpf.Ui/Controls/Snackbar.cs index 067d70f1d..e5c754c80 100644 --- a/src/Wpf.Ui/Controls/Snackbar.cs +++ b/src/Wpf.Ui/Controls/Snackbar.cs @@ -274,6 +274,16 @@ public bool Show(string title, string message, SymbolRegular icon) return true; } + /// + public bool Show(string title, string message, SymbolRegular icon, ControlAppearance appearance) + { +#pragma warning disable CS4014 + ShowComponentAsync(title, message, icon, appearance); +#pragma warning restore CS4014 + + return true; + } + /// public async Task ShowAsync() => await ShowComponentAsync(); @@ -290,6 +300,10 @@ public async Task ShowAsync(string title, string message) public async Task ShowAsync(string title, string message, SymbolRegular icon) => await ShowComponentAsync(title, message, icon); + /// + public async Task ShowAsync(string title, string message, SymbolRegular icon, ControlAppearance appearance) + => await ShowComponentAsync(title, message, icon, appearance); + /// public bool Hide() { @@ -403,6 +417,25 @@ private async Task ShowComponentAsync(string title, string message, Symbol return true; } + private async Task ShowComponentAsync(string title, string message, SymbolRegular icon, ControlAppearance appearance) + { + await HideIfVisible(); + + Title = title; + Message = message; + Icon = icon; + Appearance = appearance; + + IsShown = true; + + OnOpened(); + + if (Timeout > 0) + await HideComponentAsync(Timeout); + + return true; + } + private async Task HideComponentAsync(int timeout) { if (!IsShown) diff --git a/src/Wpf.Ui/Controls/SymbolIcon.cs b/src/Wpf.Ui/Controls/SymbolIcon.cs index 6dbe9e92a..d4a9dd656 100644 --- a/src/Wpf.Ui/Controls/SymbolIcon.cs +++ b/src/Wpf.Ui/Controls/SymbolIcon.cs @@ -16,7 +16,7 @@ namespace Wpf.Ui.Controls; ///https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.controls.symbolicon?view=winrt-22000 [ToolboxItem(true)] [ToolboxBitmap(typeof(SymbolIcon), "SymbolIcon.bmp")] -public class SymbolIcon : System.Windows.Controls.Label +public class SymbolIcon : System.Windows.Controls.Control { /// /// Property for . @@ -26,13 +26,13 @@ public class SymbolIcon : System.Windows.Controls.Label new PropertyMetadata(Common.SymbolRegular.Empty, OnGlyphChanged)); /// - /// property for . + /// Property for . /// public static readonly DependencyProperty RawSymbolProperty = DependencyProperty.Register(nameof(RawSymbol), typeof(string), typeof(SymbolIcon), new PropertyMetadata("\uEA01")); /// - /// property for . + /// Property for . /// public static readonly DependencyProperty FilledProperty = DependencyProperty.Register(nameof(Filled), typeof(bool), typeof(SymbolIcon), new PropertyMetadata(false, OnGlyphChanged)); diff --git a/src/Wpf.Ui/Controls/TextBox.cs b/src/Wpf.Ui/Controls/TextBox.cs index 95273a14f..cbebbcc64 100644 --- a/src/Wpf.Ui/Controls/TextBox.cs +++ b/src/Wpf.Ui/Controls/TextBox.cs @@ -195,6 +195,24 @@ protected override void OnLostFocus(RoutedEventArgs e) HideClearButton(); } + /// + /// Reveals the clear button by property. + /// + protected void RevealClearButton() + { + if (ClearButtonEnabled && IsKeyboardFocusWithin) + ShowClearButton = Text.Length > 0; + } + + /// + /// Hides the clear button by property. + /// + protected void HideClearButton() + { + if (ClearButtonEnabled && !IsKeyboardFocusWithin && ShowClearButton) + ShowClearButton = false; + } + /// /// Triggered by clicking a button in the control template. /// @@ -220,16 +238,4 @@ protected virtual void OnTemplateButtonClick(object sender, object parameter) break; } } - - private void RevealClearButton() - { - if (ClearButtonEnabled && IsKeyboardFocusWithin) - ShowClearButton = Text.Length > 0; - } - - private void HideClearButton() - { - if (ClearButtonEnabled && !IsKeyboardFocusWithin && ShowClearButton) - ShowClearButton = false; - } } diff --git a/src/Wpf.Ui/Controls/TitleBar.cs b/src/Wpf.Ui/Controls/TitleBar.cs index 371f4cf72..ca9ad8e60 100644 --- a/src/Wpf.Ui/Controls/TitleBar.cs +++ b/src/Wpf.Ui/Controls/TitleBar.cs @@ -116,6 +116,13 @@ public class TitleBar : System.Windows.Controls.Control, IThemeControl nameof(ShowHelp), typeof(bool), typeof(TitleBar), new PropertyMetadata(false)); + /// + /// Property for . + /// + public static readonly DependencyProperty ShowCloseProperty = DependencyProperty.Register( + nameof(ShowClose), + typeof(bool), typeof(TitleBar), new PropertyMetadata(true)); + /// /// Property for /// @@ -276,6 +283,15 @@ public bool ShowHelp set => SetValue(ShowHelpProperty, value); } + /// + /// Gets or sets information whether to show close button. + /// + public bool ShowClose + { + get => (bool)GetValue(ShowCloseProperty); + set => SetValue(ShowCloseProperty, value); + } + /// /// Enables or disables the maximize functionality if disables the MaximizeActionOverride action won't be called /// diff --git a/src/Wpf.Ui/Controls/UiWindow.cs b/src/Wpf.Ui/Controls/UiWindow.cs index a0d7d4827..ff3c51758 100644 --- a/src/Wpf.Ui/Controls/UiWindow.cs +++ b/src/Wpf.Ui/Controls/UiWindow.cs @@ -258,7 +258,7 @@ private void ExtendsContentIntoTitleBarInternal(bool extendContent) CaptionHeight = 1, CornerRadius = new CornerRadius(4), GlassFrameThickness = new Thickness(-1), - ResizeBorderThickness = new Thickness(4), + ResizeBorderThickness = this.ResizeMode == ResizeMode.NoResize ? new Thickness(0) : new Thickness(4), UseAeroCaptionButtons = false }); } diff --git a/src/Wpf.Ui/Fonts/FluentSystemIcons-Filled.ttf b/src/Wpf.Ui/Fonts/FluentSystemIcons-Filled.ttf index 6519026dd..ffab8cc74 100644 Binary files a/src/Wpf.Ui/Fonts/FluentSystemIcons-Filled.ttf and b/src/Wpf.Ui/Fonts/FluentSystemIcons-Filled.ttf differ diff --git a/src/Wpf.Ui/Fonts/FluentSystemIcons-Regular.ttf b/src/Wpf.Ui/Fonts/FluentSystemIcons-Regular.ttf index c3d6ee32d..6a3eca1aa 100644 Binary files a/src/Wpf.Ui/Fonts/FluentSystemIcons-Regular.ttf and b/src/Wpf.Ui/Fonts/FluentSystemIcons-Regular.ttf differ diff --git a/src/Wpf.Ui/Mvvm/Contracts/ISnackbarService.cs b/src/Wpf.Ui/Mvvm/Contracts/ISnackbarService.cs index 69eb74c63..4db9a2946 100644 --- a/src/Wpf.Ui/Mvvm/Contracts/ISnackbarService.cs +++ b/src/Wpf.Ui/Mvvm/Contracts/ISnackbarService.cs @@ -64,6 +64,16 @@ public interface ISnackbarService /// if invocation of method succeeded, Exception otherwise. bool Show(string title, string message, SymbolRegular icon); + /// + /// Shows the snackbar. If it is already visible, firstly hides it for a moment, changes its content, and then shows it again. + /// + /// at the top of the snackbar. + /// in the content of the snackbar. + /// Icon on the left. + /// of the snackbar. + /// if invocation of method succeeded, Exception otherwise. + bool Show(string title, string message, SymbolRegular icon, ControlAppearance appearance); + /// /// Asynchronously shows the snackbar. If it is already visible, firstly hides it for a moment, changes its content, and then shows it again. /// @@ -94,6 +104,16 @@ public interface ISnackbarService /// if the operation was successful. Task ShowAsync(string title, string message, SymbolRegular icon); + /// + /// Asynchronously shows the snackbar. If it is already visible, firstly hides it for a moment, changes its content, and then shows it again. + /// + /// at the top of the snackbar. + /// in the content of the snackbar. + /// on the left. + /// of the snackbar. + /// if the operation was successful. + Task ShowAsync(string title, string message, SymbolRegular icon, ControlAppearance appearance); + /// /// Hides the snackbar based on the selected animation, if control is visible. /// diff --git a/src/Wpf.Ui/Mvvm/Services/SnackbarService.cs b/src/Wpf.Ui/Mvvm/Services/SnackbarService.cs index 273286cb8..49804c720 100644 --- a/src/Wpf.Ui/Mvvm/Services/SnackbarService.cs +++ b/src/Wpf.Ui/Mvvm/Services/SnackbarService.cs @@ -103,6 +103,16 @@ public bool Show(string title, string message, SymbolRegular icon) return _snackbar.Show(title, message, icon); } + /// + public bool Show(string title, string message, SymbolRegular icon, ControlAppearance appearance) + { + if (_snackbar is null) + throw new InvalidOperationException( + $"The ${typeof(SnackbarService)} cannot be used unless previously defined with {typeof(ISnackbarService)}.{nameof(SetSnackbarControl)}()."); + + return _snackbar.Show(title, message, icon, appearance); + } + /// public async Task ShowAsync() { @@ -143,6 +153,16 @@ public async Task ShowAsync(string title, string message, SymbolRegular ic return await _snackbar.ShowAsync(title, message, icon); } + /// + public async Task ShowAsync(string title, string message, SymbolRegular icon, ControlAppearance appearance) + { + if (_snackbar is null) + throw new InvalidOperationException( + $"The ${typeof(SnackbarService)} cannot be used unless previously defined with {typeof(ISnackbarService)}.{nameof(SetSnackbarControl)}()."); + + return await _snackbar.ShowAsync(title, message, icon, appearance); + } + /// public bool Hide() { diff --git a/src/Wpf.Ui/Properties/AssemblyInfo.cs b/src/Wpf.Ui/Properties/AssemblyInfo.cs index 4c17367f4..27037b5a8 100644 --- a/src/Wpf.Ui/Properties/AssemblyInfo.cs +++ b/src/Wpf.Ui/Properties/AssemblyInfo.cs @@ -17,3 +17,4 @@ [assembly: XmlnsDefinition("http://schemas.lepo.co/wpfui/2022/xaml", "Wpf.Ui.Markup")] [assembly: XmlnsDefinition("http://schemas.lepo.co/wpfui/2022/xaml", "Wpf.Ui.Converters")] [assembly: XmlnsDefinition("http://schemas.lepo.co/wpfui/2022/xaml", "Wpf.Ui.ValidationRules")] +[assembly: XmlnsDefinition("http://schemas.lepo.co/wpfui/2022/xaml", "Wpf.Ui.Controls.Navigation")] diff --git a/src/Wpf.Ui/Services/Internal/NavigationService.cs b/src/Wpf.Ui/Services/Internal/NavigationService.cs index 151a14e1a..2bb01717c 100644 --- a/src/Wpf.Ui/Services/Internal/NavigationService.cs +++ b/src/Wpf.Ui/Services/Internal/NavigationService.cs @@ -11,6 +11,7 @@ using System.Windows; using System.Windows.Controls; using System.Windows.Navigation; +using Wpf.Ui.Animations; using Wpf.Ui.Common; using Wpf.Ui.Common.Interfaces; using Wpf.Ui.Controls.Interfaces; @@ -71,6 +72,13 @@ internal sealed class NavigationService : IDisposable /// private NavigationServiceItem[] _navigationServiceItems; + /// + /// + /// + private readonly List _history; + + private bool _isBackNavigated; + #endregion Private properties #region Public properties @@ -90,6 +98,11 @@ internal sealed class NavigationService : IDisposable /// public TransitionType TransitionType { get; set; } + /// + /// Indicates the possibility of navigation back + /// + public bool CanGoBack => _history.Count > 1; + #endregion Public properties #region Constructors @@ -101,6 +114,7 @@ public NavigationService() { _eventIdentifier = new EventIdentifier(); _navigationServiceItems = new NavigationServiceItem[] { }; + _history = new List(); } /// @@ -115,6 +129,16 @@ public NavigationService() #region Public methods + public bool NavigateBack() + { + if (_history.Count <= 1) + return false; + + _isBackNavigated = true; + + return NavigateInternal(_history[_history.Count - 2], null!); + } + /// /// Navigates the based on provided item Id. /// @@ -146,27 +170,25 @@ public bool Navigate(Type pageType, object dataContext) break; } - if (selectedIndex < 0) - { - if (_pageService == null) - return false; + if (selectedIndex >= 0) + return NavigateInternal(selectedIndex, dataContext); - var servicePageInstance = _pageService.GetPage(pageType); + if (_pageService == null) + return false; - if (servicePageInstance == null) - throw new InvalidOperationException($"The {pageType} has not been registered in the {typeof(IPageService)} service."); + var servicePageInstance = _pageService.GetPage(pageType); - _previousPageIndex = _currentPageIndex; - _currentPageIndex = -1; + if (servicePageInstance == null) + throw new InvalidOperationException($"The {pageType} has not been registered in the {typeof(IPageService)} service."); - _currentActionIdentifier = _eventIdentifier.GetNext(); + _previousPageIndex = _currentPageIndex; + _currentPageIndex = -1; - _frame.Navigate(servicePageInstance); + _currentActionIdentifier = _eventIdentifier.GetNext(); - return true; - } + _frame?.Navigate(servicePageInstance); - return NavigateInternal(selectedIndex, dataContext); + return true; } /// @@ -299,7 +321,7 @@ public bool SetContext(int serviceItemId, object dataContext) /// /// Creates mirror of based on provided collection of 's. /// - public void UpdateItems(IEnumerable mainItems, IEnumerable additionalItems) + public void UpdateItems(IEnumerable? mainItems, IEnumerable? additionalItems) { var serviceItemCollection = new List { }; @@ -518,7 +540,7 @@ private bool NavigateInternalByItemWithCache(int serviceItemId, object dataConte System.Diagnostics.Debug.WriteLine( $"DEBUG | {_navigationServiceItems[serviceItemId].Tag} navigated internally, with cache by it's instance."); #endif - + AddToHistory(serviceItemId); return true; } @@ -540,7 +562,7 @@ private bool NavigateInternalByItemWithCache(int serviceItemId, object dataConte System.Diagnostics.Debug.WriteLine( $"DEBUG | {_navigationServiceItems[serviceItemId].Tag} navigated internally, with cache by it's type."); #endif - + AddToHistory(serviceItemId); return true; } @@ -561,6 +583,7 @@ private bool NavigateInternalByItemWithCache(int serviceItemId, object dataConte $"DEBUG | {_navigationServiceItems[serviceItemId].Tag} navigated internally, with cache by it's source."); #endif + AddToHistory(serviceItemId); return true; } @@ -597,6 +620,7 @@ private bool NavigateInternalByItemWithoutCache(int serviceItemId, object dataCo System.Diagnostics.Debug.WriteLine( $"DEBUG | {_navigationServiceItems[serviceItemId].Tag} navigated internally, without cache by it's type."); #endif + AddToHistory(serviceItemId); return true; } @@ -616,6 +640,7 @@ private bool NavigateInternalByItemWithoutCache(int serviceItemId, object dataCo $"DEBUG | {_navigationServiceItems[serviceItemId].Tag} navigated internally, without cache by it's source."); #endif + AddToHistory(serviceItemId); return true; } @@ -637,10 +662,23 @@ private bool NavigateInternalByService(int serviceItemId) throw new InvalidOperationException($"The {_navigationServiceItems[serviceItemId].Type} has not been registered in the {typeof(IPageService)} service."); _frame.Navigate(servicePageInstance); + AddToHistory(serviceItemId); return true; } + private void AddToHistory(int serviceItemId) + { + if (_isBackNavigated) + { + _isBackNavigated = false; + _history.RemoveAt(_history.LastIndexOf(_history[_history.Count - 2])); + _history.RemoveAt(_history.LastIndexOf(_history[_history.Count - 1])); + } + + _history.Add(serviceItemId); + } + #endregion Internal navigation #region Instance management @@ -672,7 +710,7 @@ private void OnFrameNavigated(object sender, NavigationEventArgs e) _frame.NavigationService?.RemoveBackEntry(); if (TransitionDuration > 0 && e.Content != null) - TransitionService.ApplyTransition(e.Content, TransitionType, TransitionDuration); + Transitions.ApplyTransition(e.Content, TransitionType, TransitionDuration); // If we are using the MVVM model, // do not perform internal operations on DataContext and Instances. diff --git a/src/Wpf.Ui/Services/Internal/NavigationServiceActivator.cs b/src/Wpf.Ui/Services/Internal/NavigationServiceActivator.cs index e14ce29e2..3bc46b9da 100644 --- a/src/Wpf.Ui/Services/Internal/NavigationServiceActivator.cs +++ b/src/Wpf.Ui/Services/Internal/NavigationServiceActivator.cs @@ -4,9 +4,12 @@ // All Rights Reserved. using System; +using System.Linq; using System.Windows; using System.Windows.Controls; +using System.Reflection; using Wpf.Ui.Common; +using Wpf.Ui.Controls; using Wpf.Ui.Controls.Interfaces; namespace Wpf.Ui.Services.Internal; @@ -41,26 +44,123 @@ public static FrameworkElement CreateInstance(Type pageType, object dataContext) if (DesignerHelper.IsInDesignMode) return new Page { Content = new TextBlock { Text = "Pages are not rendered while using the Designer. Edit the page template directly." } }; - // Very poor dependency injection - if (dataContext != null) + var instance = null as FrameworkElement; + +#if NET48_OR_GREATER || NETCOREAPP3_0_OR_GREATER + if (ControlsServices.ControlsServiceProvider != null) { - var dataContextConstructor = pageType.GetConstructor(new[] { dataContext.GetType() }); + var pageConstructors = pageType.GetConstructors(); + var parameterlessCount = pageConstructors.Count(ctor => ctor.GetParameters().Length == 0); + var parameterfullCount = pageConstructors.Length - parameterlessCount; - // Return instance which has constructor with matching datacontext type - if (dataContextConstructor != null) - return dataContextConstructor.Invoke(new[] { dataContext }) as FrameworkElement; - } + if (parameterlessCount == 1) + { + instance = InvokeParameterlessConstructor(pageType); + } + else if (parameterlessCount == 0 && parameterfullCount > 0) + { + var selectedCtor = FitBestConstructor(pageConstructors, dataContext); + if (selectedCtor == null) + throw new InvalidOperationException($"The {pageType} page does not have a parameterless constructor or the required services have not been configured for dependency injection. Use the static {nameof(ControlsServices)} class to initialize the GUI library with your service provider. If you are using {typeof(Mvvm.Contracts.IPageService)} do not navigate initially and don't use Cache or Precache."); - var emptyConstructor = pageType.GetConstructor(Type.EmptyTypes); + instance = InvokeElementConstructor(selectedCtor, dataContext); + SetDataContext(instance, dataContext); + return instance; + } + } + else if (dataContext != null) +#else + if (dataContext != null) +#endif + { + instance = InvokeElementConstructor(pageType, dataContext); + if (instance != null) + return instance; + } + var emptyConstructor = FindParameterlessConstructor(pageType); if (emptyConstructor == null) throw new InvalidOperationException($"The {pageType} page does not have a parameterless constructor. If you are using {typeof(Mvvm.Contracts.IPageService)} do not navigate initially and don't use Cache or Precache."); - var instance = emptyConstructor.Invoke(null) as FrameworkElement; + instance = emptyConstructor.Invoke(null) as FrameworkElement; + SetDataContext(instance, dataContext); + return instance; + } - if (dataContext != null) - instance!.DataContext = dataContext; +#if NET48_OR_GREATER || NETCOREAPP3_0_OR_GREATER + private static object ResolveConstructorParameter(Type tParam, object dataContext) + { + if (dataContext != null && dataContext.GetType() == tParam) + { + return dataContext; + } - return instance; + return ControlsServices.ControlsServiceProvider.GetService(tParam); + } + + /// + /// Picks a constructor which has the most satisfiable arguments count. + /// + /// + /// + /// + private static ConstructorInfo FitBestConstructor(ConstructorInfo[] parameterfullCtors, object dataContext) + { + return parameterfullCtors.Select(ctor => + { + var parameters = ctor.GetParameters(); + var argumentResolution = parameters.Select(prm => + { + var resolved = ResolveConstructorParameter(prm.ParameterType, dataContext); + return resolved != null; + }); + var fullyResolved = argumentResolution.All(resolved => resolved == true); + var score = fullyResolved ? parameters.Length : 0; + + return score == 0 ? null : new + { + Constructor = ctor, + Score = score + }; + }) + .Where(cs => cs != null) + .OrderBy(cs => cs.Score) + .FirstOrDefault()?.Constructor; + } + + private static FrameworkElement InvokeElementConstructor(ConstructorInfo ctor, object dataContext) + { + var args = ctor + .GetParameters() + .Select(prm => + ResolveConstructorParameter(prm.ParameterType, dataContext)); + + return ctor.Invoke(args.ToArray()) as FrameworkElement; + } +#endif + + private static FrameworkElement InvokeElementConstructor(Type tPage, object dataContext) + { + var ctor = tPage.GetConstructor(new[] { dataContext.GetType() }); + if (ctor != null) + return ctor.Invoke(new[] { dataContext }) as FrameworkElement; + + return null; + } + + private static ConstructorInfo FindParameterlessConstructor(Type tPage) + { + return tPage.GetConstructor(Type.EmptyTypes); + } + + private static FrameworkElement InvokeParameterlessConstructor(Type tPage) + { + return FindParameterlessConstructor(tPage)?.Invoke(null) as FrameworkElement; + } + + private static void SetDataContext(FrameworkElement element, object dataContext) + { + if (dataContext != null) + element.DataContext = dataContext; } } diff --git a/src/Wpf.Ui/Styles/Assets/Variables.xaml b/src/Wpf.Ui/Styles/Assets/Variables.xaml index 6c8d90124..bc3e99b29 100644 --- a/src/Wpf.Ui/Styles/Assets/Variables.xaml +++ b/src/Wpf.Ui/Styles/Assets/Variables.xaml @@ -12,6 +12,8 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=System.Runtime"> + 16 + 14 4,4,4,4 4,4,4,4 diff --git a/src/Wpf.Ui/Styles/Controls/CardAction.xaml b/src/Wpf.Ui/Styles/Controls/CardAction.xaml index b837fec61..8b46e3fc7 100644 --- a/src/Wpf.Ui/Styles/Controls/CardAction.xaml +++ b/src/Wpf.Ui/Styles/Controls/CardAction.xaml @@ -104,6 +104,9 @@ + + + diff --git a/src/Wpf.Ui/Styles/Controls/CheckBox.xaml b/src/Wpf.Ui/Styles/Controls/CheckBox.xaml index 70f2f8222..9ddec3c5f 100644 --- a/src/Wpf.Ui/Styles/Controls/CheckBox.xaml +++ b/src/Wpf.Ui/Styles/Controls/CheckBox.xaml @@ -93,22 +93,6 @@ - - - - - - - @@ -126,10 +110,14 @@ - - - - + + + + + + + + @@ -146,6 +134,17 @@ + + + + + + + + + + + @@ -157,6 +156,12 @@ + + + + + + diff --git a/src/Wpf.Ui/Styles/Controls/DataGrid.xaml b/src/Wpf.Ui/Styles/Controls/DataGrid.xaml index a8b97c9be..4903e874d 100644 --- a/src/Wpf.Ui/Styles/Controls/DataGrid.xaml +++ b/src/Wpf.Ui/Styles/Controls/DataGrid.xaml @@ -1,163 +1,180 @@  - + + + + 14 - - - - - - + + + + + + + + + + + + + #FFFF0000 + + 11,5,11,6 + 1 + 8,0,0,0 + 14 + 22 + 22 + + + + + + + + + + + + + diff --git a/src/Wpf.Ui/Styles/Controls/NavigationBackButton.xaml b/src/Wpf.Ui/Styles/Controls/NavigationBackButton.xaml new file mode 100644 index 000000000..772909d50 --- /dev/null +++ b/src/Wpf.Ui/Styles/Controls/NavigationBackButton.xaml @@ -0,0 +1,90 @@ + + + + + \ No newline at end of file diff --git a/src/Wpf.Ui/Styles/Controls/NavigationCompact.xaml b/src/Wpf.Ui/Styles/Controls/NavigationCompact.xaml index 6684f5c3d..9f25a1c0e 100644 --- a/src/Wpf.Ui/Styles/Controls/NavigationCompact.xaml +++ b/src/Wpf.Ui/Styles/Controls/NavigationCompact.xaml @@ -8,7 +8,8 @@ + xmlns:controls="clr-namespace:Wpf.Ui.Controls" + xmlns:navigation="clr-namespace:Wpf.Ui.Controls.Navigation"> - diff --git a/src/Wpf.Ui/Styles/Controls/NavigationHeader.xaml b/src/Wpf.Ui/Styles/Controls/NavigationHeader.xaml index 318bede10..099b19c15 100644 --- a/src/Wpf.Ui/Styles/Controls/NavigationHeader.xaml +++ b/src/Wpf.Ui/Styles/Controls/NavigationHeader.xaml @@ -8,9 +8,10 @@ + xmlns:controls="clr-namespace:Wpf.Ui.Controls" + xmlns:navigation="clr-namespace:Wpf.Ui.Controls.Navigation"> - diff --git a/src/Wpf.Ui/Styles/Controls/RadioButton.xaml b/src/Wpf.Ui/Styles/Controls/RadioButton.xaml index 149b65ac2..3547d94a7 100644 --- a/src/Wpf.Ui/Styles/Controls/RadioButton.xaml +++ b/src/Wpf.Ui/Styles/Controls/RadioButton.xaml @@ -53,7 +53,10 @@ - + diff --git a/src/Wpf.Ui/Styles/Controls/SymbolIcon.xaml b/src/Wpf.Ui/Styles/Controls/SymbolIcon.xaml index 283127f16..4121314e4 100644 --- a/src/Wpf.Ui/Styles/Controls/SymbolIcon.xaml +++ b/src/Wpf.Ui/Styles/Controls/SymbolIcon.xaml @@ -10,38 +10,43 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:controls="clr-namespace:Wpf.Ui.Controls"> - + -