Skip to content

[dev-v5] Redesign FluentOverflow with generic item and template support - #5268

Merged
Denis Voituron (dvoituron) merged 26 commits into
dev-v5from
users/dvoituron/dev-v5/refactor-overflow
Sep 15, 2026
Merged

Denis Voituron (dvoituron) merged 26 commits into
dev-v5from
users/dvoituron/dev-v5/refactor-overflow

Conversation

@dvoituron

Copy link
Copy Markdown
Collaborator

[dev-v5] Redesign FluentOverflow with generic item and template support

Summary

This PR redesigns FluentOverflow as a generic, collection-driven component.

It adds support for strongly typed items and templates, custom overflow and "more" content, configurable rendered-item limits, item text conversion, and callbacks when the "more" button is clicked.

The Overflow JavaScript controller and interop logic have also been updated, along with the AppBar and Tabs integrations, documentation, examples, and tests.

Example

<FluentOverflow TItem="ResourceUrl" Items="@_urls" MaxRenderedItems="20">

    <ItemTemplate Context="url">
        <FluentBadge>@url.DisplayName</FluentBadge>
    </ItemTemplate>

    <OverflowTemplate Context="overflow">
        <FluentTooltip Anchor="@overflow.IdMoreButton">
            @foreach (var url in overflow.Items.Take(10))
            {
                <FluentBadge>@url.DisplayName</FluentBadge>
            }
        </FluentTooltip>
    </OverflowTemplate>

</FluentOverflow>

@code
{
    readonly ResourceUrl[] _urls = Enumerable.Range(1, 100)
        .Select(index => new ResourceUrl($"Item {index}"))
        .ToArray();

    sealed record ResourceUrl(string DisplayName);
}
peek_3.mp4

Changes

Added

  • FluentOverflow<TItem>
  • IEnumerable<TItem>? Items
  • RenderFragment<TItem>? ItemTemplate
  • Func<TItem, string>? ItemText
  • EventCallback<MouseEventArgs> OnMoreClick
  • int MaxRenderedItems
  • RenderFragment<OverflowContext<TItem>>? OverflowTemplate
  • RenderFragment<OverflowContext<TItem>>? MoreTemplate
  • IReadOnlyList<OverflowItem> ItemsOverflow
  • int OverflowCount

A new OverflowContext<TItem> type has been added with the following properties:

  • IReadOnlyList<TItem> Items
  • IReadOnlyList<OverflowItem> ItemsOverflow
  • int OverflowCount
  • string IdMoreButton

Removed or replaced

  • The non-generic FluentOverflow component has been replaced by FluentOverflow<TItem>.
  • StoreOverflowInMemory has been removed.
  • MaxOverflowItems has been removed and replaced by MaxRenderedItems.
  • RenderFragment<FluentOverflow>? OverflowTemplate has been replaced by RenderFragment<OverflowContext<TItem>>?.
  • RenderFragment<FluentOverflow>? MoreTemplate has been replaced by RenderFragment<OverflowContext<TItem>>?.
  • The ItemsOverflow return type has changed from IEnumerable<OverflowItem> to IReadOnlyList<OverflowItem>.

Breaking changes

Consumers must now provide the item type through FluentOverflow<TItem> and update overflow or "more" templates to use OverflowContext<TItem>.

Validation

  • Demo project builds successfully.
  • Unit and integration tests were added or updated for Overflow, AppBar, and Tabs scenarios.

Unit Tests

image

…xRenderedItems for improved clarity and functionality
- Added FluentOverflowController to manage overflow behavior for elements.
- Introduced FluentOverflowInterop for imperative API to attach overflow behavior.
- Created FluentOverflowStyles for component styling.
- Defined FluentOverflowTemplate for Shadow DOM structure.
- Established FluentOverflowTypes for public types and configurations.
Copilot AI lite review requested due to automatic review settings September 14, 2026 14:54

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Unresolved moderate findings affect overflow lifecycle, layout, trigger behavior, and state handling.

Get a fresh assessment by requesting another Copilot review.

Pull request overview

Redesigns FluentOverflow as a generic, template-driven component with updated JavaScript handling and AppBar/Tabs integrations.

Changes:

  • Adds typed items, templates, contexts, limits, and callbacks.
  • Reworks overflow measurement, visibility, and lifecycle handling.
  • Updates tests, documentation, examples, and event models.
File summaries
File Reviewed change
tests/Integration/Components/Overflow/FluentOverflowTests.cs Adds integration coverage for overflow scenarios.
tests/Integration/Components/Overflow/Examples/SchedulingOverflow.razor Updates the scheduling fixture for generic overflow.
tests/Integration/Components/Overflow/Examples/ConsumersPage.razor Adds consumer integration scenarios.
tests/Core/Serialization/EventArgsJsonTests.cs Updates overflow payload serialization expectations.
tests/Core/Components/Tabs/FluentTabsTests.razor Updates Tabs interop tests.
tests/Core/Components/Overflow/OverflowStateTests.cs Removes obsolete state tests.
tests/Core/Components/Overflow/OverflowItemTests.cs Updates overflow item tests.
tests/Core/Components/Overflow/OverflowChangedEventArgsTests.cs Tests revised event payloads.
tests/Core/Components/Overflow/FluentOverflowTests.razor Adds generic component and template coverage.
tests/Core/Components/DataGrid/FluentDataGridTests.razor Adjusts virtualization test conditions.
tests/Core/Components/Base/ComponentBaseTests.cs Registers the generic component for testing.
tests/Core/Components/AppBar/FluentAppBarTests.razor Updates AppBar overflow tests.
src/Core/Events/OverflowChangedItem.cs Removes obsolete overflow metadata.
src/Core/Events/OverflowChangedEventArgs.cs Simplifies overflow event arguments.
src/Core/Components/Tabs/FluentTabs.razor.cs Uses the new Tabs overflow controller API.
src/Core/Components/Overflow/OverflowState.cs Removes the obsolete overflow state type.
src/Core/Components/Overflow/OverflowItem.cs Represents hidden overflow items.
src/Core/Components/Overflow/OverflowContext.cs Adds typed template context.
src/Core/Components/Overflow/FluentOverflow.razor.css Updates overflow styling.
src/Core/Components/Overflow/FluentOverflow.razor.cs Implements generic items, templates, limits, and callbacks.
src/Core/Components/Overflow/FluentOverflow.razor Renders typed items and overflow templates.
src/Core/Components/AppBar/FluentAppBar.razor.css Updates AppBar hidden-item styling.
src/Core/Components/AppBar/FluentAppBar.razor.cs Applies hidden overflow item IDs.
src/Core/Components/AppBar/FluentAppBar.razor Integrates the overflow trigger.
src/Core.Scripts/src/FluentUICustomEvents.ts Updates overflow event conversion.
src/Core.Scripts/src/ExportedMethods.ts Exposes overflow interop methods.
src/Core.Scripts/src/Components/Tabs/FluentTabs.ts Adds shared overflow controller integration.
src/Core.Scripts/src/Components/Overflow/README.md Documents the JavaScript overflow API.
src/Core.Scripts/src/Components/Overflow/FluentOverflowTypes.ts Defines controller and event types.
src/Core.Scripts/src/Components/Overflow/FluentOverflowTemplate.ts Defines the shadow DOM template.
src/Core.Scripts/src/Components/Overflow/FluentOverflowStyles.ts Defines shadow DOM styles.
src/Core.Scripts/src/Components/Overflow/FluentOverflowInterop.ts Adds imperative overflow lifecycle APIs.
src/Core.Scripts/src/Components/Overflow/FluentOverflowController.ts Implements overflow measurement and visibility logic.
src/Core.Scripts/src/Components/Overflow/FluentOverflowAttachedController.ts Adds an attached controller implementation.
src/Core.Scripts/src/Components/Overflow/FluentOverflow.ts Rebuilds the overflow custom element.
src/Core.Scripts/src/Components/Overflow/AttachedOverflowController.ts Removes the obsolete attached controller.
examples/Demo/FluentUI.Demo.Client/Documentation/GetStarted/Migration/MigrationFluentOverflow.md Documents migration to generic overflow.
examples/Demo/FluentUI.Demo.Client/Documentation/Components/Overflow/FluentOverflow.md Documents generic overflow usage.
examples/Demo/FluentUI.Demo.Client/Documentation/Components/Overflow/Examples/OverflowVisibleOnLoad.razor Updates the visible-on-load example.
examples/Demo/FluentUI.Demo.Client/Documentation/Components/Overflow/Examples/OverflowSelectorExample.razor Updates the selector example.
examples/Demo/FluentUI.Demo.Client/Documentation/Components/Overflow/Examples/OverflowMultipleFixedItemsExample.razor Updates overflow behavior examples.
examples/Demo/FluentUI.Demo.Client/Documentation/Components/Overflow/Examples/OverflowMaxRenderedItemsExample.razor Removes the obsolete payload-limit example.
examples/Demo/FluentUI.Demo.Client/Documentation/Components/Overflow/Examples/OverflowItemsExample.razor Adds a typed-items example.
examples/Demo/FluentUI.Demo.Client/Documentation/Components/Overflow/Examples/OverflowEllipsis.razor Removes the obsolete ellipsis example.
examples/Demo/FluentUI.Demo.Client/Documentation/Components/Overflow/Examples/OverflowDefault.razor Updates the default overflow example.
examples/Demo/FluentUI.Demo.Client/Documentation/Components/Overflow/Examples/OverflowCustomPopupExample.razor Adds a custom popup example.
examples/Demo/FluentUI.Demo.Client/Documentation/Components/Overflow/Examples/OverflowCustomExample.razor Updates the custom overflow example.
Review details

Suppressed comments (5)

src/Core.Scripts/src/Components/Overflow/FluentOverflowController.ts:450

  • When an item is hidden here it is unobserved, but its cached getOuterSize value is retained. If the item changes size while hidden (for example through responsive styling, a font load, or content changes that do not mutate the item), the next layout reuses that stale measurement and can hide the wrong items. Invalidate measuredSizes when unobserving hidden items, or continue observing them so their size cache stays current.
      for (const item of this.observedItems) {
        if (!nextItems.has(item) || hidden.has(item)) {
          this.resizeObserver.unobserve(item);
          this.observedItems.delete(item);

src/Core.Scripts/src/Components/Overflow/FluentOverflowController.ts:500

  • An external hidden mutation on an item that this controller previously hid does not clear its hiddenByController ownership. The next refresh therefore excludes it from consumerHidden, unhides it in the loop above, and may make it visible again even though the consumer requested it to stay hidden. Clear controller ownership when an unexpected hidden mutation is detected so the documented consumer-hidden state is preserved.
      return true;

src/Core.Scripts/src/Components/Overflow/FluentOverflowInterop.ts:50

  • disposeOverflow calls Overflow.dispose(), which clears the custom element's controller, but this custom-element branch of initializeOverflow only changes attributes and calls refresh(). Therefore an initializeOverflow call after disposeOverflow leaves the still-connected <fluent-overflow> permanently unmanaged because refresh() is a no-op without a controller. Add a reconnect/initialize method on Overflow and invoke it here, or otherwise recreate the controller before refreshing.
    if (element instanceof Overflow) {
      element.selector = querySelector;
      element.threshold = threshold;
      element.maxOverflowItems = maxRenderedItems <= 0
        ? Number.POSITIVE_INFINITY
        : maxRenderedItems;
      element.refresh();

src/Core/Components/AppBar/FluentAppBar.razor:21

  • This AppBar uses the raw custom element, so the FluentOverflow.razor.css host rule that sets the spacing variable is not applied. The new shadow controller reads --fluent-overflow-gap, while OverflowStyleValue still supplies only gap: 2px (a non-inherited property), so AppBar layout is measured with the controller's 4px default instead of its configured gap. Pass --fluent-overflow-gap: 2px in the AppBar overflow style, including the vertical case.
			<div id="@($"appbar-more-{Id}")" class="fluent-appbar-more-item" style="min-width: var(--appbar-item-size);" tabindex="0" slot="trigger" title="@Localizer[Localization.LanguageResource.AppBar_MoreItems]" @onclick="@TogglePopoverAsync">

src/Core/Components/AppBar/FluentAppBar.razor:21

  • FluentOverflow.razor always renders its own slot="trigger" element, so adding this second slotted element gives the AppBar two assigned triggers. Both are laid out when overflow is active, the default +N badge appears beside the AppBar's ellipsis trigger, and selectors such as the integration test's [slot='trigger'] become ambiguous. Keep a single trigger (or add a way to suppress the wrapper's default trigger) and anchor the popover to that trigger.
			<div id="@($"appbar-more-{Id}")" class="fluent-appbar-more-item" style="min-width: var(--appbar-item-size);" tabindex="0" slot="trigger" title="@Localizer[Localization.LanguageResource.AppBar_MoreItems]" @onclick="@TogglePopoverAsync">
  • Files reviewed: 47/47 changed files
  • Comments generated: 5
  • Review effort level: Lite

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread src/Core/Components/Overflow/FluentOverflow.razor Outdated
Comment thread src/Core/Components/Overflow/FluentOverflow.razor.cs
Comment thread src/Core/Components/Overflow/FluentOverflow.razor.css
Comment thread src/Core.Scripts/src/Components/Overflow/FluentOverflowAttachedController.ts Outdated
@github-actions

Copy link
Copy Markdown

✅ All tests passed successfully

Details on your Workflow / Core Tests page.

@github-actions

github-actions Bot commented Sep 14, 2026

Copy link
Copy Markdown

Summary - Unit Tests Code Coverage

Summary
Generated on: 09/15/2026 - 13:03:37
Parser: MultiReport (6x Cobertura)
Assemblies: 2
Classes: 322
Files: 376
Line coverage: 98.5% (11888 of 12058)
Covered lines: 11888
Uncovered lines: 170
Coverable lines: 12058
Total lines: 45658
Branch coverage: 92.4% (7013 of 7582)
Covered branches: 7013
Total branches: 7582
Method coverage: Feature is only available for sponsors
Tag: 7579_34972051585

Coverage

Microsoft.FluentUI.AspNetCore.Components - 98.5%
Name Line Branch
Microsoft.FluentUI.AspNetCore.Components 98.5% 92.4%
Microsoft.FluentUI.AspNetCore.Components.AdditionalAttributesExtensions 100% 100%
Microsoft.FluentUI.AspNetCore.Components.AdditionalAttributesExtensions.Add
itionalAttributeCondition
100% 100%
Microsoft.FluentUI.AspNetCore.Components.AdditionalAttributesExtensions.Add
itionalAttributeCondition.AdditionalAttributeConditionItem
100%
Microsoft.FluentUI.AspNetCore.Components.AutocompleteHeaderFooterContent<TO
ption>
100% 50%
Microsoft.FluentUI.AspNetCore.Components.CachedServices 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Calendar.CalendarExtended 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Calendar.CalendarTitles 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Calendar.CalendarTValue 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Calendar.CalendarTValue 100% 100%
Microsoft.FluentUI.AspNetCore.Components.ColorPicker.ColorHelper 100% 100%
Microsoft.FluentUI.AspNetCore.Components.ColorPicker.DefaultColors 100%
Microsoft.FluentUI.AspNetCore.Components.ColorPicker.HsvColor 100% 100%
Microsoft.FluentUI.AspNetCore.Components.ColorPicker.WheelColor 100% 100%
Microsoft.FluentUI.AspNetCore.Components.ColumnBase 78.7% 73.5%
Microsoft.FluentUI.AspNetCore.Components.ColumnBase 97.6% 89.2%
Microsoft.FluentUI.AspNetCore.Components.ColumnHeaderCapabilities 100% 100%
Microsoft.FluentUI.AspNetCore.Components.ColumnKeyGridSort 94.4% 75%
Microsoft.FluentUI.AspNetCore.Components.ColumnMenuSettings 100%
Microsoft.FluentUI.AspNetCore.Components.ColumnReorderOptions 100%
Microsoft.FluentUI.AspNetCore.Components.ColumnResizeOptions 100% 100%
Microsoft.FluentUI.AspNetCore.Components.ColumnResizeOptions 100% 100%
Microsoft.FluentUI.AspNetCore.Components.CustomEmoji 100% 100%
Microsoft.FluentUI.AspNetCore.Components.CustomIcon 100%
Microsoft.FluentUI.AspNetCore.Components.DataGrid.Infrastructure.Defer 100%
Microsoft.FluentUI.AspNetCore.Components.DataGrid.Infrastructure.InternalGr
idContext
100% 100%
Microsoft.FluentUI.AspNetCore.Components.DateTimeProvider 100% 100%
Microsoft.FluentUI.AspNetCore.Components.DateTimeProviderContext 100% 92.8%
Microsoft.FluentUI.AspNetCore.Components.DefaultStyles 100%
Microsoft.FluentUI.AspNetCore.Components.DefaultValues 100% 96.1%
Microsoft.FluentUI.AspNetCore.Components.DefaultValues 100% 96.1%
Microsoft.FluentUI.AspNetCore.Components.DefaultValuesComponentBuilder<TCom
ponent, TValue>
100% 100%
Microsoft.FluentUI.AspNetCore.Components.DefaultValuesComponentBuilder<TCom
ponent>
100% 96.4%
Microsoft.FluentUI.AspNetCore.Components.Dialog.MessageBox.FluentMessageBox 100% 75%
Microsoft.FluentUI.AspNetCore.Components.DialogEventArgs 100% 92.8%
Microsoft.FluentUI.AspNetCore.Components.DialogInstance 100% 100%
Microsoft.FluentUI.AspNetCore.Components.DialogOptions 94.1%
Microsoft.FluentUI.AspNetCore.Components.DialogOptionsFooter 100% 100%
Microsoft.FluentUI.AspNetCore.Components.DialogOptionsFooterAction 100% 100%
Microsoft.FluentUI.AspNetCore.Components.DialogOptionsHeader 100% 100%
Microsoft.FluentUI.AspNetCore.Components.DialogOptionsHeaderAction 100% 100%
Microsoft.FluentUI.AspNetCore.Components.DialogResult 100% 100%
Microsoft.FluentUI.AspNetCore.Components.DialogResult 100%
Microsoft.FluentUI.AspNetCore.Components.DialogService 100% 82.8%
Microsoft.FluentUI.AspNetCore.Components.DynamicComponentRenderer 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Emoji 100% 100%
Microsoft.FluentUI.AspNetCore.Components.EmojiCompress 100% 100%
Microsoft.FluentUI.AspNetCore.Components.EmojiExtensions 100% 50%
Microsoft.FluentUI.AspNetCore.Components.EmojiInfo 100%
Microsoft.FluentUI.AspNetCore.Components.Extensions.DateTimeExtensions 98.4% 90.3%
Microsoft.FluentUI.AspNetCore.Components.Extensions.DisplayAttributeExtensi
ons
100% 87.5%
Microsoft.FluentUI.AspNetCore.Components.Extensions.EnumExtensions 100% 92.3%
Microsoft.FluentUI.AspNetCore.Components.Extensions.FieldSizeExtensions 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Extensions.FluentInputExtensions 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FileSizeConverter 100%
Microsoft.FluentUI.AspNetCore.Components.FluentAccordion 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentAccordionItem 100% 95.8%
Microsoft.FluentUI.AspNetCore.Components.FluentAnchorButton 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentAppBar 97.2% 81.1%
Microsoft.FluentUI.AspNetCore.Components.FluentAppBarItem 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentAutocomplete<TOption, TValue
>
97.5% 94.7%
Microsoft.FluentUI.AspNetCore.Components.FluentAutocomplete<TOption, TValue
>
92.8% 88.2%
Microsoft.FluentUI.AspNetCore.Components.FluentAvatar 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentBadge 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentButton 97.3% 88.8%
Microsoft.FluentUI.AspNetCore.Components.FluentCalendar 96.7% 76.6%
Microsoft.FluentUI.AspNetCore.Components.FluentCalendar 96.6% 83.5%
Microsoft.FluentUI.AspNetCore.Components.FluentCalendarBase 100% 89.1%
Microsoft.FluentUI.AspNetCore.Components.FluentCalendarDay 100% 95.4%
Microsoft.FluentUI.AspNetCore.Components.FluentCalendarMonth 100% 85.7%
Microsoft.FluentUI.AspNetCore.Components.FluentCalendarYear 100% 91.6%
Microsoft.FluentUI.AspNetCore.Components.FluentCard 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentCheckbox 100% 97.3%
Microsoft.FluentUI.AspNetCore.Components.FluentColorPicker 97.3% 94.8%
Microsoft.FluentUI.AspNetCore.Components.FluentColorPickerInput 98.5% 95.6%
Microsoft.FluentUI.AspNetCore.Components.FluentCombobox<TOption, TValue> 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentCombobox<TOption, TValue> 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentComponentBase 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentCompoundButton 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentCounterBadge 100% 95.2%
Microsoft.FluentUI.AspNetCore.Components.FluentDataGrid 98.5% 95.3%
Microsoft.FluentUI.AspNetCore.Components.FluentDataGrid 97.8% 94.9%
Microsoft.FluentUI.AspNetCore.Components.FluentDataGridCell 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentDataGridCell 98.6% 93.8%
Microsoft.FluentUI.AspNetCore.Components.FluentDataGridRow 96.9% 96.4%
Microsoft.FluentUI.AspNetCore.Components.FluentDataGridRow 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentDatePicker 100% 83.3%
Microsoft.FluentUI.AspNetCore.Components.FluentDatePicker 96.6% 82.2%
Microsoft.FluentUI.AspNetCore.Components.FluentDialog 97.7% 89.8%
Microsoft.FluentUI.AspNetCore.Components.FluentDialogBody 97.5% 94.4%
Microsoft.FluentUI.AspNetCore.Components.FluentDialogInstance 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentDialogProvider 95.3% 77.5%
Microsoft.FluentUI.AspNetCore.Components.FluentDivider 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentDragContainer 100%
Microsoft.FluentUI.AspNetCore.Components.FluentDropZone 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentDropZone 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentEmoji 100% 95%
Microsoft.FluentUI.AspNetCore.Components.FluentErrorBoundary 94.7% 93.7%
Microsoft.FluentUI.AspNetCore.Components.FluentField 98.3% 95%
Microsoft.FluentUI.AspNetCore.Components.FluentFieldCondition 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentFieldConditionItem 100%
Microsoft.FluentUI.AspNetCore.Components.FluentFieldConditionOptions 100%
Microsoft.FluentUI.AspNetCore.Components.FluentFieldExtensions 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentFieldParameterSelector 97.7% 94.8%
Microsoft.FluentUI.AspNetCore.Components.FluentGrid 100% 90%
Microsoft.FluentUI.AspNetCore.Components.FluentGridItem 100% 98.4%
Microsoft.FluentUI.AspNetCore.Components.FluentHighlighter 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentIcon 100%
Microsoft.FluentUI.AspNetCore.Components.FluentIcon 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentImage 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentInputBase 68.7% 50%
Microsoft.FluentUI.AspNetCore.Components.FluentInputBase 89.2% 50%
Microsoft.FluentUI.AspNetCore.Components.FluentInputFile 98.6% 93.7%
Microsoft.FluentUI.AspNetCore.Components.FluentInputFileBuffer 100%
Microsoft.FluentUI.AspNetCore.Components.FluentInputFileErrorEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.FluentInputImmediateBase 100%
Microsoft.FluentUI.AspNetCore.Components.FluentInputImmediateBase 100%
Microsoft.FluentUI.AspNetCore.Components.FluentInputImmediateManager 97.6% 97%
Microsoft.FluentUI.AspNetCore.Components.FluentJSModule 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentKeyCode 100% 93.7%
Microsoft.FluentUI.AspNetCore.Components.FluentKeyCodeEventArgs 100% 77.7%
Microsoft.FluentUI.AspNetCore.Components.FluentKeyCodeProvider 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentLabel 100%
Microsoft.FluentUI.AspNetCore.Components.FluentLabelInfo 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentLayout 100% 93.7%
Microsoft.FluentUI.AspNetCore.Components.FluentLayoutHamburger 97.7% 89.4%
Microsoft.FluentUI.AspNetCore.Components.FluentLayoutItem 100% 91.6%
Microsoft.FluentUI.AspNetCore.Components.FluentLink 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentListBase<TOption, TValue> 100% 96.4%
Microsoft.FluentUI.AspNetCore.Components.FluentListBase<TOption, TValue> 89.5% 86.6%
Microsoft.FluentUI.AspNetCore.Components.FluentListbox<TOption, TValue> 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentListbox<TOption, TValue> 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentLocalizerExtensions 100%
Microsoft.FluentUI.AspNetCore.Components.FluentLocalizerInternal 100%
Microsoft.FluentUI.AspNetCore.Components.FluentMenu 100% 90%
Microsoft.FluentUI.AspNetCore.Components.FluentMenuButton 100% 83.3%
Microsoft.FluentUI.AspNetCore.Components.FluentMenuItem 100% 92.5%
Microsoft.FluentUI.AspNetCore.Components.FluentMenuList 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentMessageBar 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentMessageBarProvider 100% 92.3%
Microsoft.FluentUI.AspNetCore.Components.FluentMultiSplitter 100% 93.7%
Microsoft.FluentUI.AspNetCore.Components.FluentMultiSplitterEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.FluentMultiSplitterPane 100% 85.3%
Microsoft.FluentUI.AspNetCore.Components.FluentMultiSplitterResizeEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.FluentNav 98.6% 95.8%
Microsoft.FluentUI.AspNetCore.Components.FluentNavBase 100%
Microsoft.FluentUI.AspNetCore.Components.FluentNavCategory 96.6% 91.2%
Microsoft.FluentUI.AspNetCore.Components.FluentNavItem 100% 91.4%
Microsoft.FluentUI.AspNetCore.Components.FluentNavSectionHeader 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentNumberInput 100% 87.5%
Microsoft.FluentUI.AspNetCore.Components.FluentNumberInput 99.1% 89.5%
Microsoft.FluentUI.AspNetCore.Components.FluentNumberInputCultureInfo 100%
Microsoft.FluentUI.AspNetCore.Components.FluentOption 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentOption 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentOptionString 100%
Microsoft.FluentUI.AspNetCore.Components.FluentOverflow 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentOverflow 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentOverlay 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentPaginator 100% 92.8%
Microsoft.FluentUI.AspNetCore.Components.FluentPopover 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentPresenceBadge 100% 95.4%
Microsoft.FluentUI.AspNetCore.Components.FluentProgress 100%
Microsoft.FluentUI.AspNetCore.Components.FluentProgressBar 100% 87.5%
Microsoft.FluentUI.AspNetCore.Components.FluentProgressRing 100%
Microsoft.FluentUI.AspNetCore.Components.FluentProviders 100%
Microsoft.FluentUI.AspNetCore.Components.FluentPullToRefresh 99.3% 91.7%
Microsoft.FluentUI.AspNetCore.Components.FluentRadio 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentRadioGroup 100% 88.8%
Microsoft.FluentUI.AspNetCore.Components.FluentRadioGroup 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentRatingDisplay 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentSelect<TOption, TValue> 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentSelect<TOption, TValue> 100% 50%
Microsoft.FluentUI.AspNetCore.Components.FluentServiceBase 100%
Microsoft.FluentUI.AspNetCore.Components.FluentServiceBase 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentServiceProviderException<TPr
ovider>
100%
Microsoft.FluentUI.AspNetCore.Components.FluentSkeleton 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentSlider 100%
Microsoft.FluentUI.AspNetCore.Components.FluentSlider 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentSortableList 91.6% 87.5%
Microsoft.FluentUI.AspNetCore.Components.FluentSortableList 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentSortableListEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.FluentSpacer 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentSpinner 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentSplitButton 100%
Microsoft.FluentUI.AspNetCore.Components.FluentStack 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentStatus 100%
Microsoft.FluentUI.AspNetCore.Components.FluentSwitch 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentTab 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentTabs 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentText 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentTextArea 98.3% 61.5%
Microsoft.FluentUI.AspNetCore.Components.FluentTextInput 100% 82.1%
Microsoft.FluentUI.AspNetCore.Components.FluentTimePicker.TimeEqualityCompa
rer
100% 58.3%
Microsoft.FluentUI.AspNetCore.Components.FluentTimePicker 100% 72.7%
Microsoft.FluentUI.AspNetCore.Components.FluentTimePicker 98.7% 71.1%
Microsoft.FluentUI.AspNetCore.Components.FluentToast 100% 92.8%
Microsoft.FluentUI.AspNetCore.Components.FluentToastProvider 99% 97%
Microsoft.FluentUI.AspNetCore.Components.FluentToggleButton 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentTooltip 97.9% 89.2%
Microsoft.FluentUI.AspNetCore.Components.FluentTooltipProvider 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentTreeItem 100% 94.7%
Microsoft.FluentUI.AspNetCore.Components.FluentTreeView 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentValidationMessage 100%
Microsoft.FluentUI.AspNetCore.Components.FluentValidationMessage 97.5% 88.8%
Microsoft.FluentUI.AspNetCore.Components.FluentValidationSummary 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FluentWizard 98.4% 87.5%
Microsoft.FluentUI.AspNetCore.Components.FluentWizardStep 97.8% 92.7%
Microsoft.FluentUI.AspNetCore.Components.FluentWizardStepArgs 100%
Microsoft.FluentUI.AspNetCore.Components.FluentWizardStepChangeEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.FluentWizardStepValidator 100% 100%
Microsoft.FluentUI.AspNetCore.Components.FreeOptionOutput 100%
Microsoft.FluentUI.AspNetCore.Components.GridItemsProviderRequest<TGridItem
>
100% 100%
Microsoft.FluentUI.AspNetCore.Components.GridItemsProviderResult 100%
Microsoft.FluentUI.AspNetCore.Components.GridSort<TGridItem, U> 100% 94.4%
Microsoft.FluentUI.AspNetCore.Components.GridSort 100% 94.4%
Microsoft.FluentUI.AspNetCore.Components.GridSort 95.7% 91.9%
Microsoft.FluentUI.AspNetCore.Components.HierarchicalGridItem<TItem, TGridI
tem>
100%
Microsoft.FluentUI.AspNetCore.Components.HierarchicalGridItem<TItem, TGridI
tem>
100% 100%
Microsoft.FluentUI.AspNetCore.Components.HierarchicalGridUtilities 100% 100%
Microsoft.FluentUI.AspNetCore.Components.HierarchicalGridUtilities<TGridIte
m, TItem>
100% 100%
Microsoft.FluentUI.AspNetCore.Components.HierarchicalSelectColumn<TGridItem
>
100% 95.2%
Microsoft.FluentUI.AspNetCore.Components.HierarchicalSelectColumn<TGridItem
>
98% 95.9%
Microsoft.FluentUI.AspNetCore.Components.HighlighterSplitter 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Icon 100% 95%
Microsoft.FluentUI.AspNetCore.Components.IconFromImage 100%
Microsoft.FluentUI.AspNetCore.Components.IconInfo 100%
Microsoft.FluentUI.AspNetCore.Components.IconsExtensions 100% 50%
Microsoft.FluentUI.AspNetCore.Components.IFluentComponentBase 100%
Microsoft.FluentUI.AspNetCore.Components.IFluentComponentChangeAfterKeyPres
s
100% 100%
Microsoft.FluentUI.AspNetCore.Components.IFluentLocalizer 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Infrastructure.EventCallbackSubscr
ibable
100% 100%
Microsoft.FluentUI.AspNetCore.Components.Infrastructure.EventCallbackSubscr
ibable
100%
Microsoft.FluentUI.AspNetCore.Components.Infrastructure.EventCallbackSubscr
iber
100% 87.5%
Microsoft.FluentUI.AspNetCore.Components.InputFileInstance 100% 100%
Microsoft.FluentUI.AspNetCore.Components.InputFileOptions 100%
Microsoft.FluentUI.AspNetCore.Components.InternalAppBarContext 100% 100%
Microsoft.FluentUI.AspNetCore.Components.InternalListContext 100%
Microsoft.FluentUI.AspNetCore.Components.JSRuntimeExtensions 100% 25%
Microsoft.FluentUI.AspNetCore.Components.JSRuntimeExtensions 100% 25%
Microsoft.FluentUI.AspNetCore.Components.KeyCodeService 100% 87.5%
Microsoft.FluentUI.AspNetCore.Components.KeyCodeService.KeyCodeListener 100% 100%
Microsoft.FluentUI.AspNetCore.Components.KeyPress 100%
Microsoft.FluentUI.AspNetCore.Components.LabelInfo 100%
Microsoft.FluentUI.AspNetCore.Components.LayoutHamburgerEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.LibraryToastOptions 100%
Microsoft.FluentUI.AspNetCore.Components.LibraryTooltipOptions 100%
Microsoft.FluentUI.AspNetCore.Components.Localization.LanguageResource 100% 100%
Microsoft.FluentUI.AspNetCore.Components.MarkupSanitizedOptions 100%
Microsoft.FluentUI.AspNetCore.Components.MessageBarEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.MessageBarInstance 94.1% 100%
Microsoft.FluentUI.AspNetCore.Components.MessageBarOptions 94.4%
Microsoft.FluentUI.AspNetCore.Components.MessageBarResult 100%
Microsoft.FluentUI.AspNetCore.Components.MessageBoxOptions 100%
Microsoft.FluentUI.AspNetCore.Components.Migration.AppearanceExtensions 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Migration.FluentInputAppearanceExt
ensions
100% 100%
Microsoft.FluentUI.AspNetCore.Components.Migration.TooltipPositionExtension 100% 100%
Microsoft.FluentUI.AspNetCore.Components.NotificationService 98.1% 97.4%
Microsoft.FluentUI.AspNetCore.Components.NotificationService 98.1% 97.4%
Microsoft.FluentUI.AspNetCore.Components.NotificationService 98.1% 97.4%
Microsoft.FluentUI.AspNetCore.Components.OptionsSearchEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.OverflowContext 100%
Microsoft.FluentUI.AspNetCore.Components.OverlayOptions 100%
Microsoft.FluentUI.AspNetCore.Components.PaginationState 100% 81.2%
Microsoft.FluentUI.AspNetCore.Components.PropertyColumn<TGridItem, TProp> 100% 75%
Microsoft.FluentUI.AspNetCore.Components.PropertyColumn<TGridItem, TProp> 100% 84.6%
Microsoft.FluentUI.AspNetCore.Components.RangeOfDates 96.5% 86.8%
Microsoft.FluentUI.AspNetCore.Components.SelectAllTemplateArgs 100%
Microsoft.FluentUI.AspNetCore.Components.SelectColumn.ItemKeyEqualityCompar
er
72.7% 66.6%
Microsoft.FluentUI.AspNetCore.Components.SelectColumn 88.7% 93.1%
Microsoft.FluentUI.AspNetCore.Components.SelectColumn 96% 85.8%
Microsoft.FluentUI.AspNetCore.Components.ServiceProviderExtensions 100%
Microsoft.FluentUI.AspNetCore.Components.SpacingExtensions 100% 97.3%
Microsoft.FluentUI.AspNetCore.Components.TemplateColumn 100% 100%
Microsoft.FluentUI.AspNetCore.Components.TemplateColumn 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Theme 100% 80%
Microsoft.FluentUI.AspNetCore.Components.Theme.ThemeBorders 100%
Microsoft.FluentUI.AspNetCore.Components.Theme.ThemeColors 100%
Microsoft.FluentUI.AspNetCore.Components.Theme.ThemeCurves 100%
Microsoft.FluentUI.AspNetCore.Components.Theme.ThemeFonts 100%
Microsoft.FluentUI.AspNetCore.Components.Theme.ThemeLines 100%
Microsoft.FluentUI.AspNetCore.Components.Theme.ThemeSpacings 100%
Microsoft.FluentUI.AspNetCore.Components.Theme.ThemeStrokes 100%
Microsoft.FluentUI.AspNetCore.Components.ThemeExtensions 93.3% 94.4%
Microsoft.FluentUI.AspNetCore.Components.ThemeService 100% 93.7%
Microsoft.FluentUI.AspNetCore.Components.ThemeSettings 100%
Microsoft.FluentUI.AspNetCore.Components.ToastEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.ToastInstance 100% 100%
Microsoft.FluentUI.AspNetCore.Components.ToastOptions 94.7%
Microsoft.FluentUI.AspNetCore.Components.ToastResult 100%
Microsoft.FluentUI.AspNetCore.Components.TooltipEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.TotalItemCountChangedEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.TreeViewItem 100% 100%
Microsoft.FluentUI.AspNetCore.Components.TreeViewItemExpandedEventArgs 100%
Microsoft.FluentUI.AspNetCore.Components.Utilities.AddTag 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Utilities.CssBuilder 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Utilities.Debounce 93.3% 100%
Microsoft.FluentUI.AspNetCore.Components.Utilities.Identifier 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Utilities.IdentifierContext 100% 75%
Microsoft.FluentUI.AspNetCore.Components.Utilities.InlineStyleBuilder 100% 93.7%
Microsoft.FluentUI.AspNetCore.Components.Utilities.MarkupStringSanitized 100% 92.5%
Microsoft.FluentUI.AspNetCore.Components.Utilities.MarkupStringSanitized.Pa
rsedContent
100%
Microsoft.FluentUI.AspNetCore.Components.Utilities.RangeOf 96.5% 97.2%
Microsoft.FluentUI.AspNetCore.Components.Utilities.StyleBuilder 100% 100%
Microsoft.FluentUI.AspNetCore.Components.ZIndex 100%
Microsoft.FluentUI.AspNetCore.Components.Charts - 100%
Name Line Branch
Microsoft.FluentUI.AspNetCore.Components.Charts 100% 95.6%
Microsoft.FluentUI.AspNetCore.Components.Charts.AreaChartSeries 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.ChartAxisValue 100% 90%
Microsoft.FluentUI.AspNetCore.Components.Charts.ChartAxisValueJsonConverter 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.DataVizPaletteExtensions 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.DonutDataPoint 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.FluentAreaChart 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.FluentCartesianChartBase 100% 87.5%
Microsoft.FluentUI.AspNetCore.Components.Charts.FluentChartBase 100% 90%
Microsoft.FluentUI.AspNetCore.Components.Charts.FluentDonutChart 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.FluentFunnelChart 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.FluentGanttChart 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.FluentHorizontalBarChart 100% 75%
Microsoft.FluentUI.AspNetCore.Components.Charts.FluentHorizontalBarChartWit
hAxis
100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.FunnelDataPoint 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.FunnelSubValue 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.GanttChartDataPoint 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.HorizontalBarChartDataPoint 100% 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.HorizontalBarChartSeries 100%
Microsoft.FluentUI.AspNetCore.Components.Charts.HorizontalBarChartWithAxisD
ataPoint
100% 100%

@dvoituron

Copy link
Copy Markdown
Collaborator Author

James Newton-King (@JamesNK) What do you think?

Comment thread src/Core.Scripts/src/ExportedMethods.ts
@vnbaaij

Vincent Baaij (vnbaaij) commented Sep 15, 2026

Copy link
Copy Markdown
Collaborator

I see two issues with this currently:
on

  1. In the Selector-based overflow example, the 'visible' block stays visible perfectly fine. But once the space to hold both 'Pinned' and 'Visible' get too narrow, the overflow 'rolls over' the pinned and visible children. It shouldn't do that and stop resizing
overflow-rework
  1. In the overflow ellipsis example, the resizing first does the 'ellipsing' of the labels and then overflows the badges.
erflow-ellipsis

It should be the other way around. Overflow first and then show the ellipses when everything gets too small

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I found three issues that should be addressed before merge:

  • constrained children are measured by intrinsic scroll size instead of their rendered layout size, which can hide items that actually fit;
  • the migration guide omits removed public event/item members while saying existing callbacks can remain unchanged;
  • Overflow and AppBar triggers are visible with misleading counts during prerender/no-JS before the custom element upgrades.

I verified the current Overflow revision in an isolated worktree and browser server. The eight new Overflow integration tests pass, and direct browser checks covered resize scheduling, selectors/fixed/ellipsis behavior, bounded rendering, Tabs keyboard/disposal, and horizontal/vertical AppBar behavior. Details and reproduction evidence are inline.

Comment thread src/Core/Components/Overflow/FluentOverflow.razor
@dvoituron

Copy link
Copy Markdown
Collaborator Author
  1. In the Selector-based overflow example, the 'visible' block stays visible perfectly fine. But once the space to hold both 'Pinned' and 'Visible' get too narrow, the overflow 'rolls over' the pinned and visible children. It shouldn't do that and stop resizing

I don’t agree; it’s the developer’s responsibility to set a min-width for their container if they want to have enough space to display the fixed elements. If there isn’t enough space, it behaves just like any other HTML element.

  1. In the overflow ellipsis example, the resizing first does the 'ellipsing' of the labels and then overflows the badges.
    It should be the other way around. Overflow first and then show the ellipses when everything gets too small

I agree. I’ll have a look at that.

@JamesNK

Copy link
Copy Markdown
Member

Comments are from AI. Feel free to ignore.

@dvoituron

Copy link
Copy Markdown
Collaborator Author
  1. In the Selector-based overflow example, the 'visible' block stays visible perfectly fine. But once the space to hold both 'Pinned' and 'Visible' get too narrow, the overflow 'rolls over' the pinned and visible children. It shouldn't do that and stop resizing

Fixed in next commit

peek_1.mp4
  1. In the overflow ellipsis example, the resizing first does the 'ellipsing' of the labels and then overflows the badges.
    It should be the other way around. Overflow first and then show the ellipses when everything gets too small

Fixed in next commit

peek_2.mp4

@dvoituron
Denis Voituron (dvoituron) merged commit ce684bf into dev-v5 Sep 15, 2026
3 checks passed
@dvoituron
Denis Voituron (dvoituron) deleted the users/dvoituron/dev-v5/refactor-overflow branch September 15, 2026 12:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants