Microsoft.Fast.Components.FluentUI 2.2.0-preview.2
Microsoft Fluent UI Blazor components
:star: We appreciate your star, it helps!
Introduction
The Microsoft.Fast.Components.FluentUI
package provides a set of Blazor components which you can use to build applications that have
the look and feel or modern Microsoft applications. Some of the componets are wrappers around Microsoft's official FluentUI Web Components. Others are components
that leverage the Fluent UI design system or make it easier to work with Fluent UI. To get up and running with the library, see the 'Getting Started' section below.
The source for the library is hosted in the Fast Blazor repository at GitHub. Documentation on the components is available at the demo site and at docs.microsoft.com.
The source for @fluentui/web-components
is hosted in the Fluent UI mono-repository. Documentation on the components is available on docs.microsoft.com.
The FluentUI Web Components are built on FAST and work in every major browser.
When upgrading from an earlier version
If you are upgrading from an earlier version of the library, please see the what's new for information on (breaking) changes.
Getting Started
To get started using the Fluent UI Blazor components for Blazor, you will first need to install the official Nuget package for Fluent UI in the project you would like to use the library and components. You can use the following command:
dotnet add package Microsoft.Fast.Components.FluentUI
Scripts
Next, you need to add the web components script. You can either add the script from CDN directly, or you can install it with NPM, whichever you prefer.
To add the script from CDN use the following markup:
<script type="module" src="https://cdn.jsdelivr.net/npm/@fluentui/web-components/dist/web-components.min.js"></script>
:notebook: Note
If you prefer to use another CDN, that is entirely possible. Just make sure it is offering the Fluent UI package and you are getting the right
web-components.min.js
file)
The markup above always references the latest release of the components. When deploying to production, you will want to ship with a specific version. Here's an example of the markup for that:
<script type="module" src="https://cdn.jsdelivr.net/npm/@fluentui/web-components@2.0.2/dist/web-components.min.js"></script>
The script tag is normally placed in your index.html
(_Layout.cshtml
for Blazor server project) file in the script section at the bottom of the <body>
.
If you wish to leverage NPM instead, run the following command:
npm install --save @fluentui/web-components
You can locate the single file script build in the following location:
node_modules/@fluentui/web-components/dist/web-components.min.js
Copy this to your wwwroot/script
folder and reference it with a script tag as described above.
:notebook: Note
If you are setting up Fluent UI Blazor components on a Blazor Server project, you will need to escape the
@
character by repeating it in the source link. For more information check out the Razor Pages syntax documentation.
Styles
In order for this library to work as expected, you will need to add the composed scoped CSS file for the components. This can be done by adding the following line to the
section of yourindex.html
or _Layout.cshtml
file in the project you installed the package:
<link href="{PROJECT_NAME}.styles.css" rel="stylesheet" />
It is possible that the line is already in place (but commented out).
Reboot
Reboot is a collection of element-specific CSS changes in a single file to help kick-start building a site with the Fluent UI Blazor components for Blazor. It provides an elegant, consistent, and simple baseline to build upon.
If you want to use Reboot, you'll need to add to your index.html
or _Layout.cshtml
file a line that includes the stylesheet (.css
file). This can be done by adding the following line to the <head>
section:
<link href="_content/Microsoft.Fast.Components.FluentUI/css/reboot.css" rel="stylesheet" />
It is entirely possible to build a site without using Reboot. If you choose not to use it, please do add the variables.css
file (which is otherwise imported through the reboot.css
file)
to your index.html
or _Layout.cshtml
file in the <head>
section like this:
<link href="_content/Microsoft.Fast.Components.FluentUI/css/variables.css" rel="stylesheet" />
The file contains a number of CSS variables that are required to be defined for the components to work correctly.
Code
In your Program.cs
file you need to add the following:
builder.Services.AddFluentUIComponents();
This addition makes sure all the necessary services the library uses are setup in a correct way.
When using the 2.1 or higher version of the library, you might need to make some changes here. Please refer to the what's new document for more information.
If you're running your application on Blazor Server, make sure a default HttpClient is available by adding the following:
builder.Services.AddHttpClient();
Using the FluentUI Web Components
With the package installed and the script configured, you can begin using the Fluent UI Blazor components in the same way as any other Blazor component. Just be sure to add the following using statement to your views:
@using Microsoft.Fast.Components.FluentUI
Here's a small example of a FluentCard
with a FluentButton
that uses the Fluent "Accent" appearance:
@using Microsoft.Fast.Components.FluentUI
<FluentCard>
<h2>Hello World!</h2>
<FluentButton Appearance="@Appearance.Accent">Click Me</FluentButton>
</FluentCard>
:bulb: Tip
You can add
@using Microsoft.Fast.Components.FluentUI
to the namespace collection in_Imports.razor
, so you don't have to add it to every razor page that uses one of the components.
Configuring the Design System
The Fluent UI Blazor components are built on FAST's Adaptive UI technology, which enables design customization and personalization, while automatically maintaining accessibility. This is accomplished through setting various "Design Tokens". The library exposes all of the (over 160) Design Tokens, which you can use both from code as in a declarative way in your .razor
pages. See https://docs.microsoft.com/en-us/fluent-ui/web-components/design-system/design-tokens for more information on how Design Tokens work
Option 1: Using Design Tokens from C# code
Given the following .razor
page fragment:
<FluentButton @ref="ref1" Appearance="Appearance.Filled">A button</FluentButton>
<FluentButton @ref="ref2" Appearance="Appearance.Filled">Another button</FluentButton>
<FluentButton @ref="ref3" Appearance="Appearance.Filled">And one more</FluentButton>
<FluentButton @ref="ref4" Appearance="Appearance.Filled" @onclick=OnClick>Last button</FluentButton>
You can use Design Tokens to manipulate the styles from C# code as follows:
[Inject]
private BaseLayerLuminance BaseLayerLuminance { get; set; } = default!;
[Inject]
private AccentBaseColor AccentBaseColor { get; set; } = default!;
[Inject]
private BodyFont BodyFont { get; set; } = default!;
[Inject]
private StrokeWidth StrokeWidth { get; set; } = default!;
[Inject]
private ControlCornerRadius ControlCornerRadius { get; set; } = default!;
private FluentButton? ref1;
private FluentButton? ref2;
private FluentButton? ref3;
private FluentButton? ref4;
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
//Set to dark mode
await BaseLayerLuminance.SetValueFor(ref1!.Element, (float)0.15);
//Set to Excel color
await AccentBaseColor.SetValueFor(ref2!.Element, "#185ABD".ToSwatch());
//Set the font
await BodyFont.SetValueFor(ref3!.Element, "Comic Sans MS");
//Set 'border' width for ref4
await StrokeWidth.SetValueFor(ref4!.Element, 7);
//And change conrner radius as well
await ControlCornerRadius.SetValueFor(ref4!.Element, 15);
StateHasChanged();
}
}
public async Task OnClick()
{
//Remove the wide border
await StrokeWidth.DeleteValueFor(ref4!.Element);
}
As can be seen in the code above (with the ref4.Element
), it is possible to apply multiple tokens to the same component.
For Design Tokens that work with a color value, you must call the ToSwatch()
extension method on a string value or use one of the Swatch
constructors. This makes sure the color is using a format that Design Tokens can handle. A Swatch
has a lot of commonality with the System.Drawing.Color
struct. Instead of the values of the components being between 0 and 255, in a Swatch
they are expressed as a value between 0 and 1.
:notebook: Note
The Design Tokens are manipulated through JavaScript interop working with an
ElementReference
. There is no JavaScript element until after the component is rendered. This means you can only work with the Design Tokens from code after the component has been rendered inOnAfterRenderAsync
and not in any earlier lifecycle methods.
Option 2: Using Design Tokens as components
The Design Tokens can also be used as components in a .razor
page directely. It looks like this:
<BaseLayerLuminance Value="(float?)0.15">
<FluentCard BackReference="@context">
<div class="contents">
Dark
<FluentButton Appearance="Appearance.Accent">Accent</FluentButton>
<FluentButton Appearance="Appearance.Stealth">Stealth</FluentButton>
<FluentButton Appearance="Appearance.Outline">Outline</FluentButton>
<FluentButton Appearance="Appearance.Lightweight">Lightweight</FluentButton>
</div>
</FluentCard>
</BaseLayerLuminance>
To make this work, a link needs to be created between the Design Token component and its child components. This is done with the BackReference="@context"
construct.
:notebook: Note
Only one Design Token component at a time can be used this way. If you need to set more tokens, use the code approach as described in Option 1 above.
Option 3: Using the <FluentDesignSystemProvider>
The third way to customize the design in Blazor is to wrap the entire block you want to manipulate in a <FluentDesignSystemProvider>
. This special element has a number of properties you can set to configure a subset of the tokens. Not all tokens are available/supported and we recommend this to only be used as a fall-back mechanism. The preferred method of working with the design tokens is to manipulate them from code as described in option 1.
Here's an example of changing the "accent base color" and switching the system into dark mode (in the file app.razor
):
<FluentDesignSystemProvider AccentBaseColor="#464EB8" BaseLayerLuminance="0">
<Router AppAssembly="@typeof(App).Assembly">
<Found Context="routeData">
<RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
</Found>
<NotFound>
<PageTitle>Not found</PageTitle>
<LayoutView Layout="@typeof(MainLayout)">
<p role="alert">Sorry, there's nothing at this address.</p>
</LayoutView>
</NotFound>
</Router>
</FluentDesignSystemProvider>
:notebook: Note
FluentDesignSystemProvider token attributes can be changed on-the-fly like any other Blazor component attribute.
Colors for integration with specific Microsoft products
If you are configuring the components for integration into a specific Microsoft product, the following table provides AccentBaseColor
values you can use.
The library offers an OfficeColor
enumeration which contains the specific accent colors for 17 different Office applications.
Product | AccentBaseColor |
---|---|
Office | #D83B01 |
Word | #185ABD |
Excel | #107C41 |
PowerPoint | #C43E1C |
Teams | #6264A7 |
OneNote | #7719AA |
SharePoint | #03787C |
Stream | #BC1948 |
Blazor Hybrid
Starting with the 2.0 release, you can also use this library in your Blazor Hybrid projects. Setup is almost the same as described in the "Getting started" section above, but to get everything to work you'll need to take two extra steps:
- You need to add a MAUI specific IStaticAssetService implementation.
Due to some issues, this file can't be part of the library (yet) so this needs to be added manually to your MAUI Blazor project.
Create a new class in you project calledFileBasedStaticAssetService.cs
Replace it's contents with the following:
using System.Net;
using Microsoft.Fast.Components.FluentUI.Infrastructure;
namespace Microsoft.Fast.Components.FluentUI;
public class FileBasedStaticAssetService : IStaticAssetService
{
private readonly CacheStorageAccessor _cacheStorageAccessor;
public FileBasedStaticAssetService(CacheStorageAccessor cacheStorageAccessor)
{
_cacheStorageAccessor = cacheStorageAccessor;
}
public async Task<string> GetAsync(string assetUrl, bool useCache = false)
{
string result = null;
HttpRequestMessage message = CreateMessage(assetUrl);
if (useCache)
{
// Get the result from the cache
result = await _cacheStorageAccessor.GetAsync(message);
}
if (string.IsNullOrEmpty(result))
{
//It not in the cache (or cache not used), read the asset from disk
result = await ReadData(assetUrl);
if (!string.IsNullOrEmpty(result))
{
if (useCache)
{
// If successful, create the response and store in the cache (when used)
HttpResponseMessage response = new()
{
StatusCode = HttpStatusCode.OK,
Content = new StringContent(result)
};
await _cacheStorageAccessor.PutAsync(message, response);
}
}
}
return result;
}
private static HttpRequestMessage CreateMessage(string url) => new(HttpMethod.Get, url);
private static async Task<string> ReadData(string file)
{
using var stream = await FileSystem.OpenAppPackageFileAsync($"wwwroot/{file}");
using var reader = new StreamReader(stream);
return await reader.ReadToEndAsync();
}
}
- You need to make some changes in your
MauiProgram.cs
file
Make sure the following is added before thereturn builder.Build()
line:
builder.Services.AddFluentUIComponents(options =>
{
options.HostingModel = BlazorHostingModel.Hybrid;
});
builder.Services.AddScoped<IStaticAssetService, FileBasedStaticAssetService>();
Use the DataGrid component with EF Core
If you want to use the FluentDataGrid
with data provided through EF Core, you need to install
an additional package so the grid knows how to resolve queries asynchronously for efficiency. .
Installation
Install the package by running the command:
dotnet add package Microsoft.Fast.Components.FluentUI.DataGrid.EntityFrameworkAdapter
Usage
In your Program.cs file you need to add the following after the builder.Services.AddFluentUIComponents();
line:
builder.Services.AddDataGridEntityFrameworkAdapter();
Joining the Community
Looking to get answers to questions or engage with us in real-time? Our community is most active on Discord. Submit requests and issues on GitHub, or join us by contributing on some good first issues via GitHub.
If you don't find a component you're looking for, it's best to create the issue in our FAST repo here and limit issues on this repo to bugs in the Blazor component wrappers or Blazor-specific features.
We look forward to building an amazing open source community with you!
Contact
- Join the community and chat with us in real-time on Discord.
- Submit requests and issues on GitHub.
- Contribute by helping out on some of our recommended first issues on GitHub.
Additional resources
- The Microsoft Fluent UI Blazor components demo site
- The Microsoft Fluent UI Blazor components documentation
- The Fluent UI Web components demo site
- The FAST site
Showing the top 20 packages that depend on Microsoft.Fast.Components.FluentUI.
Packages | Downloads |
---|---|
Microsoft.Fast.Components.FluentUI.Icons
A set of icons wrapping Microsoft’s official Fluent UI Icon library.
|
7 |
Microsoft.Fast.Components.FluentUI.Icons
A set of icons wrapping Microsoft’s official Fluent UI Icon library.
|
6 |
Microsoft.Fast.Components.FluentUI.Icons
A set of icons wrapping Microsoft’s official Fluent UI Icon library.
|
5 |
Microsoft.Fast.Components.FluentUI.Icons
A set of icons wrapping Microsoft’s official Fluent UI Icon library.
|
4 |
Microsoft.Fast.Components.FluentUI.Icons
A set of icons wrapping Microsoft’s official Fluent UI Icon library.
|
3 |
.NET 6.0
- Microsoft.AspNetCore.Components.Web (>= 6.0.15)
- Microsoft.Extensions.Configuration.Abstractions (>= 6.0.0)
- Microsoft.Extensions.Hosting.Abstractions (>= 6.0.0)
- Microsoft.Extensions.Http (>= 6.0.0)
- System.Text.Json (>= 6.0.7)
.NET 7.0
- Microsoft.AspNetCore.Components.Web (>= 7.0.4)
- Microsoft.Extensions.Configuration.Abstractions (>= 7.0.0)
- Microsoft.Extensions.Hosting.Abstractions (>= 7.0.0)
- Microsoft.Extensions.Http (>= 7.0.0)
- System.Text.Json (>= 7.0.2)
Version | Downloads | Last updated |
---|---|---|
3.8.0 | 1 | 11/15/2024 |
3.7.8 | 20 | 07/05/2024 |
3.7.7 | 20 | 07/06/2024 |
3.7.5 | 3 | 06/30/2024 |
3.7.4 | 3 | 06/29/2024 |
3.7.3 | 3 | 06/29/2024 |
3.7.2 | 3 | 06/24/2024 |
3.7.1 | 6 | 05/22/2024 |
3.7.1-preview.24138.3 | 5 | 05/20/2024 |
3.7.0 | 5 | 05/04/2024 |
3.6.2 | 5 | 04/29/2024 |
3.6.1 | 5 | 04/17/2024 |
3.6.0 | 6 | 03/29/2024 |
3.5.5 | 3 | 05/28/2024 |
3.5.4 | 4 | 05/28/2024 |
3.5.3 | 4 | 05/28/2024 |
3.5.2 | 4 | 05/28/2024 |
3.5.1 | 5 | 05/28/2024 |
3.5.0 | 3 | 05/28/2024 |
3.4.1 | 3 | 05/28/2024 |
3.4.0 | 4 | 05/28/2024 |
3.3.0 | 7 | 04/04/2024 |
3.2.2 | 4 | 05/28/2024 |
3.2.1 | 5 | 05/28/2024 |
3.2.0 | 4 | 05/15/2024 |
3.1.1 | 3 | 05/28/2024 |
3.1.0 | 4 | 05/28/2024 |
3.0.1 | 3 | 05/28/2024 |
3.0.0 | 5 | 04/23/2024 |
3.0.0-RC.1 | 2 | 06/26/2024 |
3.0.0-preview.5 | 4 | 05/27/2024 |
3.0.0-preview.4.230627.1 | 3 | 05/28/2024 |
3.0.0-preview.3 | 3 | 05/27/2024 |
3.0.0-preview.2 | 4 | 05/27/2024 |
2.4.3 | 4 | 05/28/2024 |
2.4.2 | 3 | 05/28/2024 |
2.4.1 | 3 | 05/28/2024 |
2.4.0 | 6 | 04/30/2024 |
2.3.6 | 3 | 05/28/2024 |
2.3.5 | 3 | 05/28/2024 |
2.3.4 | 5 | 05/26/2024 |
2.3.3 | 4 | 05/28/2024 |
2.3.1 | 3 | 05/28/2024 |
2.3.0 | 5 | 05/28/2024 |
2.2.1 | 3 | 05/28/2024 |
2.2.0 | 5 | 05/04/2024 |
2.2.0-preview.2 | 4 | 05/27/2024 |
2.1.4 | 4 | 05/28/2024 |
2.1.3 | 4 | 05/28/2024 |
2.1.2 | 4 | 05/28/2024 |
2.1.1 | 4 | 05/28/2024 |
2.1.0 | 3 | 05/28/2024 |
2.1.0-rc-4 | 4 | 05/29/2024 |
2.1.0-rc-3 | 3 | 06/25/2024 |
2.1.0-rc-2 | 4 | 05/29/2024 |
2.1.0-beta-1 | 6 | 04/12/2024 |
2.0.5 | 4 | 05/28/2024 |
2.0.4 | 3 | 05/28/2024 |
2.0.3 | 4 | 05/28/2024 |
2.0.2 | 4 | 05/28/2024 |
2.0.1 | 4 | 05/28/2024 |
2.0.0 | 3 | 05/28/2024 |
2.0.0-rc-2 | 4 | 05/29/2024 |
2.0.0-rc-1 | 3 | 05/29/2024 |
1.6.1 | 4 | 05/28/2024 |
1.6.0 | 3 | 05/28/2024 |
1.5.3 | 6 | 05/28/2024 |
1.5.2 | 3 | 05/28/2024 |
1.5.1 | 5 | 05/28/2024 |
1.5.0 | 3 | 05/28/2024 |
1.4.4 | 3 | 05/28/2024 |
1.4.3 | 3 | 05/28/2024 |
1.4.2 | 4 | 05/28/2024 |
1.4.1 | 6 | 05/15/2024 |
1.4.0 | 4 | 05/28/2024 |
1.3.1 | 5 | 05/14/2024 |
1.3.0 | 4 | 05/28/2024 |
1.2.1 | 4 | 05/28/2024 |
1.2.0 | 3 | 05/28/2024 |
1.1.0 | 6 | 05/28/2024 |
1.0.0 | 4 | 05/28/2024 |
0.5.0 | 3 | 05/28/2024 |
0.4.0 | 4 | 05/28/2024 |
0.3.0 | 5 | 04/25/2024 |
0.2.0 | 4 | 05/07/2024 |
0.1.0 | 6 | 03/28/2024 |
0.0.4 | 3 | 05/28/2024 |
0.0.3 | 3 | 05/28/2024 |
0.0.2 | 4 | 05/28/2024 |