Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
8b14cc0
WIP
vnbaaij Feb 18, 2025
48eafc6
Initial AppBar work
vnbaaij Dec 22, 2025
b97d818
Merge branch 'dev-v5' into users/vnbaaij/dev-v5/overflow
vnbaaij Dec 22, 2025
8649abb
Finish work.
vnbaaij Dec 24, 2025
b612635
Merge branch 'dev-v5' into users/vnbaaij/dev-v5/overflow
vnbaaij Dec 24, 2025
a26f9be
Merge branch 'dev-v5' into users/vnbaaij/dev-v5/overflow
dvoituron Dec 28, 2025
c15abee
Merge branch 'users/vnbaaij/dev-v5/overflow' into users/vnbaaij/dev-v…
vnbaaij Dec 29, 2025
a67cc88
Make it work
vnbaaij Dec 29, 2025
f533730
Add tests (wip)
vnbaaij Dec 29, 2025
02b8049
Add tests (wip)
vnbaaij Dec 29, 2025
4f0de5a
Merge branch 'users/vnbaaij/dev-v5/appbar-part1' of https://github.co…
vnbaaij Dec 29, 2025
abebf71
merge dev-v5
vnbaaij Dec 29, 2025
0fd96b6
Make ShowZero=false actually hide the CounterBadge
vnbaaij Dec 30, 2025
ef2fe52
Merge branch 'dev-v5' into users/vnbaaij/dev-v5/enhance-counterbadge
vnbaaij Dec 30, 2025
d55f890
- Add ShowEmpty parameter
vnbaaij Dec 30, 2025
a6e1411
Store
vnbaaij Dec 31, 2025
fa695ff
Merge branch 'dev-v5' into users/vnbaaij/dev-v5/appbar-part0
vnbaaij Dec 31, 2025
2b4644d
Fix AppBar
vnbaaij Jan 2, 2026
3132c7e
- Restructure badges docs
vnbaaij Jan 2, 2026
26ae21d
Merge branch 'dev-v5' into users/vnbaaij/dev-v5/enhance-counterbadge
vnbaaij Jan 2, 2026
7f25baa
Cleanup test csproj
vnbaaij Jan 2, 2026
a02b4d8
Merge branch 'dev-v5' into users/vnbaaij/dev-v5/appbar-part1
vnbaaij Jan 2, 2026
703b3e5
Fix JSON error
vnbaaij Jan 2, 2026
a3e243f
Add check in OverflowRaisedAsync- Use general OverflowItem class
vnbaaij Jan 2, 2026
4e3276a
Merge branch 'users/vnbaaij/dev-v5/enhance-counterbadge' into users/v…
vnbaaij Jan 2, 2026
79ba583
Merge enhance counter badge
vnbaaij Jan 2, 2026
c0543ae
Update src/Core/Components/CounterBadge/FluentCounterBadge.razor
vnbaaij Jan 4, 2026
7c9ff33
Update src/Core/Components/CounterBadge/FluentCounterBadge.razor
vnbaaij Jan 4, 2026
8e27d82
Update src/Core/Components/CounterBadge/FluentCounterBadge.razor.cs
vnbaaij Jan 4, 2026
01f6530
Set ShowEmpty="false"
vnbaaij Jan 5, 2026
e8b0f75
- Add ContainerStyle to Badge/CounterBadge
vnbaaij Jan 5, 2026
99c7a9a
merge
vnbaaij Jan 5, 2026
7722e39
Merge branch 'users/vnbaaij/dev-v5/enhance-counterbadge' into users/v…
vnbaaij Jan 5, 2026
ef80176
Move CounterBadge into badge folder
vnbaaij Jan 5, 2026
7415f88
Merge branch 'users/vnbaaij/dev-v5/enhance-counterbadge' into users/v…
vnbaaij Jan 5, 2026
12593a4
- Add doc icon
vnbaaij Jan 5, 2026
ac2a8a6
- Undo .csproj change
vnbaaij Jan 5, 2026
be15a14
- Better check in OverflowRaisedAsync
vnbaaij Jan 5, 2026
5b017d1
- Add tests, Alter test to not use Verify
vnbaaij Jan 5, 2026
00d8f1c
Merge branch 'dev-v5' into users/vnbaaij/dev-v5/appbar-part1
vnbaaij Jan 5, 2026
7d1f5ff
Merge branch 'dev-v5' into users/vnbaaij/dev-v5/appbar-part1
vnbaaij Jan 6, 2026
1c24210
Refactor way to set style on badge container
vnbaaij Jan 6, 2026
3e28dbf
merge dev-v5
vnbaaij Jan 6, 2026
9915fba
merge
vnbaaij Jan 6, 2026
bae0abc
Fix merge inconsistencies
vnbaaij Jan 6, 2026
6af4847
Fix merging inconsistensies
vnbaaij Jan 7, 2026
3bd39f9
Undo blank line
vnbaaij Jan 7, 2026
c8b4e90
Remove ContainerStyle test as parameter is removed
vnbaaij Jan 7, 2026
6a9dd91
Process review comments
vnbaaij Jan 7, 2026
bbdcf9a
Process review comments
vnbaaij Jan 7, 2026
ba70db8
Process review comments
vnbaaij Jan 7, 2026
b48eb0e
Use DisposeAsync
vnbaaij Jan 7, 2026
a01d12b
Merge branch 'dev-v5' into users/vnbaaij/dev-v5/appbar-part1
vnbaaij Jan 7, 2026
39dbd9f
Fix Dispose test, Fix test error because of OnParameterSet change
vnbaaij Jan 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
@inject IDialogService DialogService

<FluentStack Orientation="Orientation.Vertical" Style="height: 330px;">
<FluentAppBar Style="height: 100%;">
<FluentAppBarItem Href="/"
Match="NavLinkMatch.All"
IconRest="HomeIcon()"
IconActive="HomeIcon(active: true)"
Text="Home"
OnClick="HandleOnClick" />
<FluentAppBarItem Href="/AppBar"
IconRest="AppBarIcon()"
IconActive="AppBarIcon(active: true)"
Text="AppBar"
OnClick="HandleOnClick" />
<FluentAppBarItem IconRest="WhatsNewIcon()"
IconActive="WhatsNewIcon(active: true)"
Text="What's New"
OnClick="ShowSuccessAsync" />
<FluentAppBarItem Href="@(null)"
IconRest="IconsIcon()"
IconActive="IconsIcon(active: true)"
Text="Icons"
OnClick="ShowWarningAsync" />
<FluentAppBarItem Href="/Dialog"
IconRest="DialogIcon()"
IconActive="DialogIcon(active: true)"
Text="Dialog"
OnClick="HandleOnClick" />
</FluentAppBar>
</FluentStack>

@code {
private static Icon HomeIcon(bool active = false) =>
active ? new Icons.Filled.Size24.Home()
: new Icons.Regular.Size24.Home();

private static Icon AppBarIcon(bool active = false) =>
active ? new Icons.Filled.Size24.AppsList()
: new Icons.Regular.Size24.AppsList();

private static Icon WhatsNewIcon(bool active = false) =>
active ? new Icons.Filled.Size24.Info()
: new Icons.Regular.Size24.Info();

private static Icon IconsIcon(bool active = false) =>
active ? new Icons.Filled.Size24.Symbols()
: new Icons.Regular.Size24.Symbols();

private static Icon DialogIcon(bool active = false) =>
active ? new Icons.Filled.Size24.AppGeneric()
: new Icons.Regular.Size24.AppGeneric();


private void HandleOnClick(IAppBarItem item)
{
Console.WriteLine($"Clicked {item.Text}!");
}

private async Task ShowSuccessAsync(IAppBarItem item)
{
var dialog = await DialogService.ShowSuccessAsync($"You clicked {item.Text}");
}

private async Task ShowWarningAsync(IAppBarItem item)
{
var dialog = await DialogService.ShowWarningAsync($"Are you sure? {item.Text}");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
@{
string stylevalue = $"background-color: var(--colorNeutralBackground5); overflow: hidden; resize: {(_vertical ? "vertical; width: 86px; height: 320px;" : "horizontal;width: 440px; height: 68px;")} padding: 10px;";
}
<FluentStack Orientation="Orientation.Vertical" Style="height: 100%;">
<FluentStack Orientation="Orientation.Horizontal" HorizontalGap="10">
<FluentSwitch @bind-Value="_showSearch" Label="Show search in popover" />
<FluentSwitch @bind-Value="_vertical" @bind-Value:after="@HandleOrientationChanged" Label="@($"Show {(_vertical ? "Vertical" : "Horizontal")}")" />
</FluentStack>
<div style="@stylevalue">
<FluentAppBar Orientation="@(_vertical? Orientation.Vertical: Orientation.Horizontal)" PopoverVisibilityChanged="HandlePopover" PopoverShowSearch="@_showSearch">

<FluentAppBarItem Href="/AppBarDefault"
Match="NavLinkMatch.All"
IconRest="ResourcesIcon()"
IconActive="ResourcesIcon(active: true)"
Text="Resources" />
<FluentAppBarItem Href="/AppBar"
IconRest="ConsoleLogsIcon()"
IconActive="ConsoleLogsIcon(active: true)"
Text="Console Logs"
Count="2" />
<FluentAppBarItem Href="/StructuredLogs"
IconRest="StructuredLogsIcon()"
IconActive="StructuredLogsIcon(active: true)"
Text="Logs"
Tooltip="Structured Logs"
Count="4" />
<FluentAppBarItem Href="/Traces"
IconRest="TracesIcon()"
IconActive="TracesIcon(active: true)"
Text="Traces" />
<FluentAppBarItem Href="/Metrics"
IconRest="MetricsIcon()"
IconActive="MetricsIcon(active: true)"
Text="Metrics" />
<FluentAppBarItem Href="/AppBarPage"
IconRest="ResourcesIcon()"
IconActive="ResourcesIcon(active: true)"
Text="Resources 2" />
<FluentAppBarItem Href="/AppBar"
IconRest="ConsoleLogsIcon()"
IconActive="ConsoleLogsIcon(active: true)"
Text="Console Logs 2" />
<FluentAppBarItem Href="/StructuredLogs"
IconRest="StructuredLogsIcon()"
IconActive="StructuredLogsIcon(active: true)"
Text="Structured Logs 2" />
<FluentAppBarItem Href="/Traces"
IconRest="TracesIcon()"
IconActive="TracesIcon(active: true)"
Text="Traces 2" />
<FluentAppBarItem Href="/Metrics"
IconRest="MetricsIcon()"
IconActive="MetricsIcon(active: true)"
Text="Metrics 2" />
<FluentAppBarItem Href="/AppBarPage"
IconRest="ResourcesIcon()"
IconActive="ResourcesIcon(active: true)"
Text="Resources 3" />
<FluentAppBarItem Href="/AppBar"
IconRest="ConsoleLogsIcon()"
IconActive="ConsoleLogsIcon(active: true)"
Text="Console Logs 3" />
<FluentAppBarItem Href="/StructuredLogs"
IconRest="StructuredLogsIcon()"
IconActive="StructuredLogsIcon(active: true)"
Text="Structured Logs 3" />
<FluentAppBarItem Href="/Traces"
IconRest="TracesIcon()"
IconActive="TracesIcon(active: true)"
Text="Traces 3" />
<FluentAppBarItem Href="/Metrics"
IconRest="MetricsIcon()"
IconActive="MetricsIcon(active: true)"
Text="Metrics 3" />
</FluentAppBar>
</div>
</FluentStack>

@code {
private bool _vertical = true;
private bool _showSearch = true;

private static Icon ResourcesIcon(bool active = false) =>
active ? new Icons.Filled.Size24.AppFolder()
: new Icons.Regular.Size24.AppFolder();

private static Icon ConsoleLogsIcon(bool active = false) =>
active ? new Icons.Filled.Size24.SlideText()
: new Icons.Regular.Size24.SlideText();

private static Icon StructuredLogsIcon(bool active = false) =>
active ? new Icons.Filled.Size24.SlideTextSparkle()
: new Icons.Regular.Size24.SlideTextSparkle();

private static Icon TracesIcon(bool active = false) =>
active ? new Icons.Filled.Size24.GanttChart()
: new Icons.Regular.Size24.GanttChart();

private static Icon MetricsIcon(bool active = false) =>
active ? new Icons.Filled.Size24.ChartMultiple()
: new Icons.Regular.Size24.ChartMultiple();

private void HandlePopover(bool visible) => Console.WriteLine($"Popover visibility changed to {visible}");

private void HandleOrientationChanged()
{
Console.WriteLine($"Orientation changed to {(_vertical ? "vertical" : "horizontal")}");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
<FluentStack Orientation="Orientation.Vertical" Style="height: 100%;">
<FluentSwitch @bind-Value="_showSearch" CheckedMessage="Show" UncheckedMessage="Hide" Label="Show search in popover" />
<div style="background-color: var(--colorNeutralBackground5); overflow: hidden; resize: vertical; height: 270px; width: 86px; padding: 10px;">
<FluentAppBar
Items="@_apps.OrderBy(a => a.Order)"
Style="width: 68px; height: 100%;"
PopoverVisibilityChanged="HandlePopover"
PopoverShowSearch="@_showSearch">
</FluentAppBar>
</div>
</FluentStack>


@code {
private class FluentCustomAppBarItem : IAppBarItem
{
public int Order { get; set; }
public string? Id { get; set; }
public string? Href { get; set; }
public NavLinkMatch Match { get; set; }
public Icon IconRest { get; set; } = new Icons.Regular.Size24.AppFolder();
public Icon? IconActive { get; set; }
public string Text { get; set; } = string.Empty;
public string? Tooltip { get; set; }
public ushort? Count { get; set; }
public bool? Overflow { get; set; }
public EventCallback<IAppBarItem> OnClick { get; set; }
}

private List<FluentCustomAppBarItem> _apps => new List<FluentCustomAppBarItem>
{
new FluentCustomAppBarItem { Order = 15, IconRest = ResourcesIcon(), IconActive = ResourcesIcon(active: true), Text = "Aaaaa", Href = "/AppBarDefault" },
new FluentCustomAppBarItem { Order = 14, IconRest = ResourcesIcon(), IconActive = ResourcesIcon(active: true), Text = "Bbbbb", Href = "/AppBar" },
new FluentCustomAppBarItem { Order = 13, IconRest = ResourcesIcon(), IconActive = ResourcesIcon(active: true), Text = "Ccccc" },
new FluentCustomAppBarItem { Order = 12, IconRest = ConsoleLogsIcon(), IconActive = ConsoleLogsIcon(active: true), Text = "Ddddd" },
new FluentCustomAppBarItem { Order = 11, IconRest = ConsoleLogsIcon(), IconActive = ConsoleLogsIcon(active: true), Text = "Eeeee" },
new FluentCustomAppBarItem { Order = 10, IconRest = ConsoleLogsIcon(), IconActive = ConsoleLogsIcon(active: true), Text = "Fffff" },
new FluentCustomAppBarItem { Order = 9, IconRest = StructuredLogsIcon(), IconActive = StructuredLogsIcon(active: true), Text = "Ggggg", Count = 4 },
new FluentCustomAppBarItem { Order = 8, IconRest = StructuredLogsIcon(), IconActive = StructuredLogsIcon(active: true), Text = "Hhhhh" },
new FluentCustomAppBarItem { Order = 7, IconRest = StructuredLogsIcon(), IconActive = StructuredLogsIcon(active: true), Text = "Iiiii" },
new FluentCustomAppBarItem { Order = 6, IconRest = TracesIcon(), IconActive = TracesIcon(active: true), Text = "Jjjjj" },
new FluentCustomAppBarItem { Order = 5, IconRest = TracesIcon(), IconActive = TracesIcon(active: true), Text = "Kkkkk" },
new FluentCustomAppBarItem { Order = 4, IconRest = TracesIcon(), IconActive = TracesIcon(active: true), Text = "Lllll" },
new FluentCustomAppBarItem { Order = 3, IconRest = MetricsIcon(), IconActive = MetricsIcon(active: true), Text = "Mmmmm" },
new FluentCustomAppBarItem { Order = 2, IconRest = MetricsIcon(), IconActive = MetricsIcon(active: true), Text = "Nnnnn" },
new FluentCustomAppBarItem { Order = 1, IconRest = MetricsIcon(), IconActive = MetricsIcon(active: true), Text = "Ooooo" }
};

private bool _showSearch = true;

private static Icon ResourcesIcon(bool active = false) =>
active ? new Icons.Filled.Size24.AppFolder()
: new Icons.Regular.Size24.AppFolder();

private static Icon ConsoleLogsIcon(bool active = false) =>
active ? new Icons.Filled.Size24.SlideText()
: new Icons.Regular.Size24.SlideText();

private static Icon StructuredLogsIcon(bool active = false) =>
active ? new Icons.Filled.Size24.SlideTextSparkle()
: new Icons.Regular.Size24.SlideTextSparkle();

private static Icon TracesIcon(bool active = false) =>
active ? new Icons.Filled.Size24.GanttChart()
: new Icons.Regular.Size24.GanttChart();

private static Icon MetricsIcon(bool active = false) =>
active ? new Icons.Filled.Size24.ChartMultiple()
: new Icons.Regular.Size24.ChartMultiple();

private void HandlePopover(bool visible) => Console.WriteLine($"Popover visibility changed to {visible}");
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
<style>
.fluent-appbar.smallicons {
--appbar-item-size: 58;
}
</style>
@{
string stylevalue = $"background-color: var(--colorNeutralBackground5); overflow: hidden; resize: {(_vertical ? "vertical; width: 78px; height: 300px;" : "horizontal; width: 380px; height: 58px;")} padding: 10px;";
}
<FluentStack Orientation="Orientation.Vertical" Style="height: 100%;">
<FluentStack Orientation="Orientation.Horizontal" HorizontalGap="10">
<FluentSwitch @bind-Value="_showSearch" Label="Show search in popover" />
<FluentSwitch @bind-Value="_vertical" @bind-Value:after="@HandleOrientationChanged" Label="@($"Show {(_vertical ? "Vertical" : "Horizontal")}")" />
</FluentStack>
<div class="smallicons" style="@stylevalue">
<FluentAppBar Orientation="@(_vertical ? Orientation.Vertical : Orientation.Horizontal)" Class="smallicons" PopoverVisibilityChanged="HandlePopover" PopoverShowSearch="@_showSearch">

<FluentAppBarItem Href="/AppBarDefault"
Match="NavLinkMatch.All"
IconRest="ResourcesIcon()"
IconActive="ResourcesIcon(active: true)"
Text="Resources" />
<FluentAppBarItem Href="/AppBar"
IconRest="ConsoleLogsIcon()"
IconActive="ConsoleLogsIcon(active: true)"
Text="Console Logs" />

<FluentAppBarItem Href="/StructuredLogs"
IconRest="StructuredLogsIcon()"
IconActive="StructuredLogsIcon(active: true)"
Text="Logs"
Tooltip="Structured Logs"/>
<FluentAppBarItem Href="/Traces"
IconRest="TracesIcon()"
IconActive="TracesIcon(active: true)"
Text="Traces" />
<FluentAppBarItem Href="/Metrics"
IconRest="MetricsIcon()"
IconActive="MetricsIcon(active: true)"
Text="Metrics" />
<FluentAppBarItem Href="/AppBarPage"
IconRest="ResourcesIcon()"
IconActive="ResourcesIcon(active: true)"
Text="Resources 2" />
<FluentAppBarItem Href="/AppBar"
IconRest="ConsoleLogsIcon()"
IconActive="ConsoleLogsIcon(active: true)"
Text="Console Logs 2" />

<FluentAppBarItem Href="/StructuredLogs"
IconRest="StructuredLogsIcon()"
IconActive="StructuredLogsIcon(active: true)"
Text="Structured Logs 2" />
<FluentAppBarItem Href="/Traces"
IconRest="TracesIcon()"
IconActive="TracesIcon(active: true)"
Text="Traces 2" />
<FluentAppBarItem Href="/Metrics"
IconRest="MetricsIcon()"
IconActive="MetricsIcon(active: true)"
Text="Metrics 2" />
<FluentAppBarItem Href="/AppBarPage"
IconRest="ResourcesIcon()"
IconActive="ResourcesIcon(active: true)"
Text="Resources 3" />
<FluentAppBarItem Href="/AppBar"
IconRest="ConsoleLogsIcon()"
IconActive="ConsoleLogsIcon(active: true)"
Text="Console Logs 3" />

<FluentAppBarItem Href="/StructuredLogs"
IconRest="StructuredLogsIcon()"
IconActive="StructuredLogsIcon(active: true)"
Text="Structured Logs 3" />
<FluentAppBarItem Href="/Traces"
IconRest="TracesIcon()"
IconActive="TracesIcon(active: true)"
Text="Traces 3" />
<FluentAppBarItem Href="/Metrics"
IconRest="MetricsIcon()"
IconActive="MetricsIcon(active: true)"
Text="Metrics 3" />
</FluentAppBar>
</div>
</FluentStack>


@code {
private bool _vertical = true;
private bool _showSearch = true;

private static Icon ResourcesIcon(bool active = false) =>
active ? new Icons.Filled.Size16.AppFolder()
: new Icons.Regular.Size16.AppFolder();

private static Icon ConsoleLogsIcon(bool active = false) =>
active ? new Icons.Filled.Size16.SlideText()
: new Icons.Regular.Size16.SlideText();

private static Icon StructuredLogsIcon(bool active = false) =>
active ? new Icons.Filled.Size16.SlideTextSparkle()
: new Icons.Regular.Size16.SlideTextSparkle();

private static Icon TracesIcon(bool active = false) =>
active ? new Icons.Filled.Size16.GanttChart()
: new Icons.Regular.Size16.GanttChart();

private static Icon MetricsIcon(bool active = false) =>
active ? new Icons.Filled.Size16.ChartMultiple()
: new Icons.Regular.Size16.ChartMultiple();

private void HandlePopover(bool visible) => Console.WriteLine($"Popover visibility changed to {visible}");

private void HandleOrientationChanged()
{
Console.WriteLine($"Orientation changed to {(_vertical ? "vertical" : "horizontal")}");
}
}
Loading
Loading