From c4802b78064692f716fd45c786ee55c8ef86697c Mon Sep 17 00:00:00 2001 From: mollykreis <20542556+mollykreis@users.noreply.github.com> Date: Mon, 24 Aug 2026 20:42:56 -0500 Subject: [PATCH 1/3] Add Blur event to interactive elements --- .../NimbleBlazor/Source/Anchor/NimbleAnchor.razor | 1 + .../NimbleBlazor/Source/Anchor/NimbleAnchor.razor.cs | 9 +++++++++ .../Source/AnchorButton/NimbleAnchorButton.razor | 1 + .../Source/AnchorButton/NimbleAnchorButton.razor.cs | 9 +++++++++ .../Source/AnchorMenuItem/NimbleAnchorMenuItem.razor | 1 + .../Source/AnchorMenuItem/NimbleAnchorMenuItem.razor.cs | 9 +++++++++ .../Source/AnchorStep/NimbleAnchorStep.razor | 1 + .../Source/AnchorStep/NimbleAnchorStep.razor.cs | 9 +++++++++ .../NimbleBlazor/Source/AnchorTab/NimbleAnchorTab.razor | 1 + .../Source/AnchorTab/NimbleAnchorTab.razor.cs | 9 +++++++++ .../Source/AnchorTabs/NimbleAnchorTabs.razor | 1 + .../Source/AnchorTabs/NimbleAnchorTabs.razor.cs | 9 +++++++++ .../Source/AnchorTreeItem/NimbleAnchorTreeItem.razor | 1 + .../Source/AnchorTreeItem/NimbleAnchorTreeItem.razor.cs | 9 +++++++++ .../NimbleBlazor/Source/Banner/NimbleBanner.razor | 1 + .../NimbleBlazor/Source/Banner/NimbleBanner.razor.cs | 9 +++++++++ .../Source/Breadcrumb/NimbleBreadcrumb.razor | 1 + .../Source/Breadcrumb/NimbleBreadcrumb.razor.cs | 9 +++++++++ .../Source/BreadcrumbItem/NimbleBreadcrumbItem.razor | 1 + .../Source/BreadcrumbItem/NimbleBreadcrumbItem.razor.cs | 9 +++++++++ .../NimbleBlazor/Source/Button/NimbleButton.razor | 1 + .../NimbleBlazor/Source/Button/NimbleButton.razor.cs | 9 +++++++++ .../NimbleBlazor/Source/Card/NimbleCard.razor | 1 + .../NimbleBlazor/Source/Card/NimbleCard.razor.cs | 9 +++++++++ .../Source/CardButton/NimbleCardButton.razor | 1 + .../Source/CardButton/NimbleCardButton.razor.cs | 9 +++++++++ .../NimbleBlazor/Source/Checkbox/NimbleCheckbox.razor | 1 + .../NimbleBlazor/Source/Checkbox/NimbleCheckbox.razor.cs | 9 +++++++++ .../NimbleBlazor/Source/Chip/NimbleChip.razor | 1 + .../NimbleBlazor/Source/Chip/NimbleChip.razor.cs | 9 +++++++++ .../NimbleBlazor/Source/Combobox/NimbleCombobox.razor | 1 + .../NimbleBlazor/Source/Combobox/NimbleCombobox.razor.cs | 9 +++++++++ .../NimbleBlazor/Source/Dialog/NimbleDialog.razor | 1 + .../NimbleBlazor/Source/Dialog/NimbleDialog.razor.cs | 9 +++++++++ .../NimbleBlazor/Source/Drawer/NimbleDrawer.razor | 1 + .../NimbleBlazor/Source/Drawer/NimbleDrawer.razor.cs | 9 +++++++++ .../Source/ListOption/NimbleListOption.razor | 1 + .../Source/ListOption/NimbleListOption.razor.cs | 9 +++++++++ .../NimbleBlazor/Source/Menu/NimbleMenu.razor | 1 + .../NimbleBlazor/Source/Menu/NimbleMenu.razor.cs | 9 +++++++++ .../Source/MenuButton/NimbleMenuButton.razor | 1 + .../Source/MenuButton/NimbleMenuButton.razor.cs | 9 +++++++++ .../NimbleBlazor/Source/MenuItem/NimbleMenuItem.razor | 1 + .../NimbleBlazor/Source/MenuItem/NimbleMenuItem.razor.cs | 9 +++++++++ .../Source/NumberField/NimbleNumberField.razor | 1 + .../Source/NumberField/NimbleNumberField.razor.cs | 9 +++++++++ .../NimbleBlazor/Source/Radio/NimbleRadio.razor | 1 + .../NimbleBlazor/Source/Radio/NimbleRadio.razor.cs | 9 +++++++++ .../Source/RadioGroup/NimbleRadioGroup.razor | 1 + .../Source/RadioGroup/NimbleRadioGroup.razor.cs | 9 +++++++++ .../Source/RichText/Viewer/NimbleRichTextViewer.razor | 1 + .../Source/RichText/Viewer/NimbleRichTextViewer.razor.cs | 9 +++++++++ .../NimbleBlazor/Source/Step/NimbleStep.razor | 1 + .../NimbleBlazor/Source/Step/NimbleStep.razor.cs | 9 +++++++++ .../NimbleBlazor/Source/Stepper/NimbleStepper.razor | 1 + .../NimbleBlazor/Source/Stepper/NimbleStepper.razor.cs | 9 +++++++++ .../NimbleBlazor/Source/Switch/NimbleSwitch.razor | 1 + .../NimbleBlazor/Source/Switch/NimbleSwitch.razor.cs | 9 +++++++++ .../NimbleBlazor/Source/Tab/NimbleTab.razor | 1 + .../NimbleBlazor/Source/Tab/NimbleTab.razor.cs | 9 +++++++++ .../NimbleBlazor/Source/TabPanel/NimbleTabPanel.razor | 1 + .../NimbleBlazor/Source/TabPanel/NimbleTabPanel.razor.cs | 9 +++++++++ .../NimbleBlazor/Source/Table/NimbleTable.razor | 1 + .../NimbleBlazor/Source/Table/NimbleTable.razor.cs | 9 +++++++++ .../NimbleBlazor/Source/Tabs/NimbleTabs.razor | 1 + .../NimbleBlazor/Source/Tabs/NimbleTabs.razor.cs | 9 +++++++++ .../Source/TabsToolbar/NimbleTabsToolbar.razor | 1 + .../Source/TabsToolbar/NimbleTabsToolbar.razor.cs | 9 +++++++++ .../NimbleBlazor/Source/TextArea/NimbleTextArea.razor | 1 + .../NimbleBlazor/Source/TextArea/NimbleTextArea.razor.cs | 9 +++++++++ .../NimbleBlazor/Source/TextField/NimbleTextField.razor | 1 + .../Source/TextField/NimbleTextField.razor.cs | 9 +++++++++ .../Source/ToggleButton/NimbleToggleButton.razor | 1 + .../Source/ToggleButton/NimbleToggleButton.razor.cs | 9 +++++++++ .../NimbleBlazor/Source/Toolbar/NimbleToolbar.razor | 1 + .../NimbleBlazor/Source/Toolbar/NimbleToolbar.razor.cs | 9 +++++++++ .../NimbleBlazor/Source/Tooltip/NimbleTooltip.razor | 1 + .../NimbleBlazor/Source/Tooltip/NimbleTooltip.razor.cs | 9 +++++++++ .../NimbleBlazor/Source/TreeItem/NimbleTreeItem.razor | 1 + .../NimbleBlazor/Source/TreeItem/NimbleTreeItem.razor.cs | 9 +++++++++ .../NimbleBlazor/Source/TreeView/NimbleTreeView.razor | 1 + .../NimbleBlazor/Source/TreeView/NimbleTreeView.razor.cs | 9 +++++++++ .../NimbleBlazor/Source/WaferMap/NimbleWaferMap.razor | 1 + .../NimbleBlazor/Source/WaferMap/NimbleWaferMap.razor.cs | 9 +++++++++ 84 files changed, 420 insertions(+) diff --git a/packages/blazor-workspace/NimbleBlazor/Source/Anchor/NimbleAnchor.razor b/packages/blazor-workspace/NimbleBlazor/Source/Anchor/NimbleAnchor.razor index 2a942cdfb4..919364c2e0 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/Anchor/NimbleAnchor.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/Anchor/NimbleAnchor.razor @@ -1,6 +1,7 @@ @namespace NimbleBlazor @inherits NimbleAnchorBase [Parameter(CaptureUnmatchedValues = true)] public IDictionary? AdditionalAttributes { get; set; } + + [Parameter] + public EventCallback Blur { get; set; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/AnchorButton/NimbleAnchorButton.razor b/packages/blazor-workspace/NimbleBlazor/Source/AnchorButton/NimbleAnchorButton.razor index 183feba89d..be96c0cf59 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/AnchorButton/NimbleAnchorButton.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/AnchorButton/NimbleAnchorButton.razor @@ -1,6 +1,7 @@ @namespace NimbleBlazor @inherits NimbleAnchorBase [Parameter(CaptureUnmatchedValues = true)] public IDictionary? AdditionalAttributes { get; set; } + + [Parameter] + public EventCallback Blur { get; set; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/AnchorMenuItem/NimbleAnchorMenuItem.razor b/packages/blazor-workspace/NimbleBlazor/Source/AnchorMenuItem/NimbleAnchorMenuItem.razor index 23b8840ad9..c1c5f7627f 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/AnchorMenuItem/NimbleAnchorMenuItem.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/AnchorMenuItem/NimbleAnchorMenuItem.razor @@ -1,6 +1,7 @@ @namespace NimbleBlazor @inherits NimbleAnchorBase [Parameter(CaptureUnmatchedValues = true)] public IDictionary? AdditionalAttributes { get; set; } + + [Parameter] + public EventCallback Blur { get; set; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/AnchorStep/NimbleAnchorStep.razor b/packages/blazor-workspace/NimbleBlazor/Source/AnchorStep/NimbleAnchorStep.razor index 974ef9c486..644fa37c0e 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/AnchorStep/NimbleAnchorStep.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/AnchorStep/NimbleAnchorStep.razor @@ -1,6 +1,7 @@ @namespace NimbleBlazor @inherits NimbleAnchorBase [Parameter(CaptureUnmatchedValues = true)] public IDictionary? AdditionalAttributes { get; set; } + + [Parameter] + public EventCallback Blur { get; set; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/AnchorTab/NimbleAnchorTab.razor b/packages/blazor-workspace/NimbleBlazor/Source/AnchorTab/NimbleAnchorTab.razor index fd03b91645..be37cd6f1a 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/AnchorTab/NimbleAnchorTab.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/AnchorTab/NimbleAnchorTab.razor @@ -1,6 +1,7 @@ @namespace NimbleBlazor @inherits NimbleAnchorBase [Parameter(CaptureUnmatchedValues = true)] public IDictionary? AdditionalAttributes { get; set; } + + [Parameter] + public EventCallback Blur { get; set; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/AnchorTabs/NimbleAnchorTabs.razor b/packages/blazor-workspace/NimbleBlazor/Source/AnchorTabs/NimbleAnchorTabs.razor index 1e284b4227..c430ff70b9 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/AnchorTabs/NimbleAnchorTabs.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/AnchorTabs/NimbleAnchorTabs.razor @@ -1,5 +1,6 @@ @namespace NimbleBlazor @ChildContent diff --git a/packages/blazor-workspace/NimbleBlazor/Source/AnchorTabs/NimbleAnchorTabs.razor.cs b/packages/blazor-workspace/NimbleBlazor/Source/AnchorTabs/NimbleAnchorTabs.razor.cs index 99345c032d..c50d85d292 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/AnchorTabs/NimbleAnchorTabs.razor.cs +++ b/packages/blazor-workspace/NimbleBlazor/Source/AnchorTabs/NimbleAnchorTabs.razor.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Web; namespace NimbleBlazor; @@ -24,4 +25,12 @@ public partial class NimbleAnchorTabs : ComponentBase /// [Parameter(CaptureUnmatchedValues = true)] public IDictionary? AdditionalAttributes { get; set; } + + [Parameter] + public EventCallback Blur { get; set; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/AnchorTreeItem/NimbleAnchorTreeItem.razor b/packages/blazor-workspace/NimbleBlazor/Source/AnchorTreeItem/NimbleAnchorTreeItem.razor index 45646c7aec..29846b3917 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/AnchorTreeItem/NimbleAnchorTreeItem.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/AnchorTreeItem/NimbleAnchorTreeItem.razor @@ -1,6 +1,7 @@ @namespace NimbleBlazor @inherits NimbleAnchorBase [Parameter(CaptureUnmatchedValues = true)] public IDictionary? AdditionalAttributes { get; set; } + + [Parameter] + public EventCallback Blur { get; set; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/Banner/NimbleBanner.razor b/packages/blazor-workspace/NimbleBlazor/Source/Banner/NimbleBanner.razor index 1a6a92f9f7..ae50eac695 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/Banner/NimbleBanner.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/Banner/NimbleBanner.razor @@ -1,5 +1,6 @@ @namespace NimbleBlazor [Parameter(CaptureUnmatchedValues = true)] public IDictionary? AdditionalAttributes { get; set; } + + [Parameter] + public EventCallback Blur { get; set; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/Breadcrumb/NimbleBreadcrumb.razor b/packages/blazor-workspace/NimbleBlazor/Source/Breadcrumb/NimbleBreadcrumb.razor index 3ef97f9b7c..41a8b756a4 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/Breadcrumb/NimbleBreadcrumb.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/Breadcrumb/NimbleBreadcrumb.razor @@ -1,5 +1,6 @@ @namespace NimbleBlazor @ChildContent diff --git a/packages/blazor-workspace/NimbleBlazor/Source/Breadcrumb/NimbleBreadcrumb.razor.cs b/packages/blazor-workspace/NimbleBlazor/Source/Breadcrumb/NimbleBreadcrumb.razor.cs index f6939159d7..422d6670c7 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/Breadcrumb/NimbleBreadcrumb.razor.cs +++ b/packages/blazor-workspace/NimbleBlazor/Source/Breadcrumb/NimbleBreadcrumb.razor.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Web; namespace NimbleBlazor; @@ -12,4 +13,12 @@ public partial class NimbleBreadcrumb : ComponentBase [Parameter(CaptureUnmatchedValues = true)] public IDictionary? AdditionalAttributes { get; set; } + + [Parameter] + public EventCallback Blur { get; set; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/BreadcrumbItem/NimbleBreadcrumbItem.razor b/packages/blazor-workspace/NimbleBlazor/Source/BreadcrumbItem/NimbleBreadcrumbItem.razor index b903191ceb..1ef79f51c8 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/BreadcrumbItem/NimbleBreadcrumbItem.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/BreadcrumbItem/NimbleBreadcrumbItem.razor @@ -1,5 +1,6 @@ @namespace NimbleBlazor Blur { get; set; } + [Parameter(CaptureUnmatchedValues = true)] public IDictionary? AdditionalAttributes { get; set; } @@ -30,4 +34,9 @@ public partial class NimbleBreadcrumbItem : ComponentBase [Parameter] public string? Type { get; set; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/Button/NimbleButton.razor b/packages/blazor-workspace/NimbleBlazor/Source/Button/NimbleButton.razor index 8db7fcb33a..c05f3a31f3 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/Button/NimbleButton.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/Button/NimbleButton.razor @@ -1,5 +1,6 @@ @namespace NimbleBlazor ? AdditionalAttributes { get; set; } + + [Parameter] + public EventCallback Blur { get; set; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/Card/NimbleCard.razor b/packages/blazor-workspace/NimbleBlazor/Source/Card/NimbleCard.razor index 5417f46e8b..49d29fa091 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/Card/NimbleCard.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/Card/NimbleCard.razor @@ -1,5 +1,6 @@ @namespace NimbleBlazor @ChildContent diff --git a/packages/blazor-workspace/NimbleBlazor/Source/Card/NimbleCard.razor.cs b/packages/blazor-workspace/NimbleBlazor/Source/Card/NimbleCard.razor.cs index 73ac4a0454..e63a7e7000 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/Card/NimbleCard.razor.cs +++ b/packages/blazor-workspace/NimbleBlazor/Source/Card/NimbleCard.razor.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Web; namespace NimbleBlazor; @@ -9,4 +10,12 @@ public partial class NimbleCard : ComponentBase [Parameter] public RenderFragment? ChildContent { get; set; } + + [Parameter] + public EventCallback Blur { get; set; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/CardButton/NimbleCardButton.razor b/packages/blazor-workspace/NimbleBlazor/Source/CardButton/NimbleCardButton.razor index 166e522f34..b04c8da21f 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/CardButton/NimbleCardButton.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/CardButton/NimbleCardButton.razor @@ -1,5 +1,6 @@ @namespace NimbleBlazor diff --git a/packages/blazor-workspace/NimbleBlazor/Source/CardButton/NimbleCardButton.razor.cs b/packages/blazor-workspace/NimbleBlazor/Source/CardButton/NimbleCardButton.razor.cs index 3988e5ab14..76a755335f 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/CardButton/NimbleCardButton.razor.cs +++ b/packages/blazor-workspace/NimbleBlazor/Source/CardButton/NimbleCardButton.razor.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Web; namespace NimbleBlazor; @@ -15,4 +16,12 @@ public partial class NimbleCardButton : ComponentBase [Parameter(CaptureUnmatchedValues = true)] public IDictionary? AdditionalAttributes { get; set; } + + [Parameter] + public EventCallback Blur { get; set; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/Checkbox/NimbleCheckbox.razor b/packages/blazor-workspace/NimbleBlazor/Source/Checkbox/NimbleCheckbox.razor index 7333a05d08..bd14c3062a 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/Checkbox/NimbleCheckbox.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/Checkbox/NimbleCheckbox.razor @@ -1,6 +1,7 @@ @namespace NimbleBlazor @inherits NimbleInputBase [Parameter] public RenderFragment? ChildContent { get; set; } + [Parameter] + public EventCallback Blur { get; set; } + protected override bool TryParseValueFromString(string? value, [MaybeNullWhen(false)] out bool result, [NotNullWhen(false)] out string? validationErrorMessage) => throw new NotSupportedException($"This component does not parse string inputs. Bind to the '{nameof(CurrentValue)}' property, not '{nameof(CurrentValueAsString)}'."); + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/Chip/NimbleChip.razor b/packages/blazor-workspace/NimbleBlazor/Source/Chip/NimbleChip.razor index 918775be24..f60e074c5e 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/Chip/NimbleChip.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/Chip/NimbleChip.razor @@ -1,5 +1,6 @@ @namespace NimbleBlazor ? AdditionalAttributes { get; set; } + + [Parameter] + public EventCallback Blur { get; set; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/Combobox/NimbleCombobox.razor b/packages/blazor-workspace/NimbleBlazor/Source/Combobox/NimbleCombobox.razor index 23e2ab9adb..6d1abf6765 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/Combobox/NimbleCombobox.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/Combobox/NimbleCombobox.razor @@ -2,6 +2,7 @@ @inherits NimbleInputBase [Parameter] public RenderFragment? ChildContent { get; set; } + [Parameter] + public EventCallback Blur { get; set; } + [CascadingParameter] private NimbleOptionContext? CascadedContext { get; set; } @@ -100,4 +104,9 @@ protected override bool TryParseValueFromString(string? value, out string? resul validationErrorMessage = null; return true; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/Dialog/NimbleDialog.razor b/packages/blazor-workspace/NimbleBlazor/Source/Dialog/NimbleDialog.razor index 72c6a27274..f2b9381961 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/Dialog/NimbleDialog.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/Dialog/NimbleDialog.razor @@ -1,6 +1,7 @@ @typeparam TCloseReason @namespace NimbleBlazor : ComponentBase [Parameter(CaptureUnmatchedValues = true)] public IDictionary? AdditionalAttributes { get; set; } + [Parameter] + public EventCallback Blur { get; set; } + [Inject] private IJSRuntime? JSRuntime { get; set; } @@ -72,4 +76,9 @@ public async Task CloseAsync(TCloseReason? reason = default) _closeValue = reason; await JSRuntime!.InvokeVoidAsync(CloseDialogMethodName, _dialogElement); } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/Drawer/NimbleDrawer.razor b/packages/blazor-workspace/NimbleBlazor/Source/Drawer/NimbleDrawer.razor index 33f00837ee..a61826e93e 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/Drawer/NimbleDrawer.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/Drawer/NimbleDrawer.razor @@ -1,6 +1,7 @@ @typeparam TCloseReason @namespace NimbleBlazor : ComponentBase [Parameter(CaptureUnmatchedValues = true)] public IDictionary? AdditionalAttributes { get; set; } + [Parameter] + public EventCallback Blur { get; set; } + [Inject] private IJSRuntime? JSRuntime { get; set; } @@ -49,4 +53,9 @@ public async Task CloseAsync(TCloseReason? reason = default) _closeValue = reason; await JSRuntime!.InvokeVoidAsync(CloseDrawerMethodName, _drawerElement); } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/ListOption/NimbleListOption.razor b/packages/blazor-workspace/NimbleBlazor/Source/ListOption/NimbleListOption.razor index eb1215b3b6..5dec4b502c 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/ListOption/NimbleListOption.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/ListOption/NimbleListOption.razor @@ -1,5 +1,6 @@ @namespace NimbleBlazor Blur { get; set; } + [CascadingParameter] private NimbleOptionContext? CascadedContext { get; set; } /// @@ -38,4 +42,9 @@ protected override void OnParametersSet() ?? throw new InvalidOperationException($"{GetType()} must have an ancestor {typeof(NimbleSelect)} " + $"with a matching 'Name' property, if specified."); } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/Menu/NimbleMenu.razor b/packages/blazor-workspace/NimbleBlazor/Source/Menu/NimbleMenu.razor index 7ac96f45f0..2e95dd4f3a 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/Menu/NimbleMenu.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/Menu/NimbleMenu.razor @@ -1,5 +1,6 @@ @namespace NimbleBlazor @ChildContent diff --git a/packages/blazor-workspace/NimbleBlazor/Source/Menu/NimbleMenu.razor.cs b/packages/blazor-workspace/NimbleBlazor/Source/Menu/NimbleMenu.razor.cs index cc5d7ae1a0..5765e409c9 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/Menu/NimbleMenu.razor.cs +++ b/packages/blazor-workspace/NimbleBlazor/Source/Menu/NimbleMenu.razor.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Web; namespace NimbleBlazor; @@ -9,4 +10,12 @@ public partial class NimbleMenu : ComponentBase [Parameter(CaptureUnmatchedValues = true)] public IDictionary? AdditionalAttributes { get; set; } + + [Parameter] + public EventCallback Blur { get; set; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/MenuButton/NimbleMenuButton.razor b/packages/blazor-workspace/NimbleBlazor/Source/MenuButton/NimbleMenuButton.razor index 815f23262d..8cb85f4503 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/MenuButton/NimbleMenuButton.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/MenuButton/NimbleMenuButton.razor @@ -1,6 +1,7 @@ @namespace NimbleBlazor @inherits ComponentBase BeforeToggle { get; set; } + [Parameter] + public EventCallback Blur { get; set; } + /// /// Called when 'open' changes on the web component. /// @@ -83,6 +87,11 @@ protected async void HandleBeforeToggle(MenuButtonToggleEventArgs eventArgs) await BeforeToggle.InvokeAsync(eventArgs); } + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } + /// /// Gets or sets the additional attributes on the . /// diff --git a/packages/blazor-workspace/NimbleBlazor/Source/MenuItem/NimbleMenuItem.razor b/packages/blazor-workspace/NimbleBlazor/Source/MenuItem/NimbleMenuItem.razor index 76dfc3103c..54cdf3ba04 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/MenuItem/NimbleMenuItem.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/MenuItem/NimbleMenuItem.razor @@ -1,5 +1,6 @@ @namespace NimbleBlazor diff --git a/packages/blazor-workspace/NimbleBlazor/Source/MenuItem/NimbleMenuItem.razor.cs b/packages/blazor-workspace/NimbleBlazor/Source/MenuItem/NimbleMenuItem.razor.cs index e886c4e647..08d1949941 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/MenuItem/NimbleMenuItem.razor.cs +++ b/packages/blazor-workspace/NimbleBlazor/Source/MenuItem/NimbleMenuItem.razor.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Web; namespace NimbleBlazor; @@ -15,4 +16,12 @@ public partial class NimbleMenuItem : ComponentBase [Parameter(CaptureUnmatchedValues = true)] public IDictionary? AdditionalAttributes { get; set; } + + [Parameter] + public EventCallback Blur { get; set; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/NumberField/NimbleNumberField.razor b/packages/blazor-workspace/NimbleBlazor/Source/NumberField/NimbleNumberField.razor index b3cc01a244..db6493ade6 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/NumberField/NimbleNumberField.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/NumberField/NimbleNumberField.razor @@ -1,6 +1,7 @@ @namespace NimbleBlazor @inherits NimbleInputBase [Parameter] public RenderFragment? ChildContent { get; set; } + [Parameter] + public EventCallback Blur { get; set; } + /// protected override string? FormatValueAsString(double? value) { @@ -130,4 +134,9 @@ private bool TryConvertToDouble(string? stringValue, out double? value) value = converted; return true; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/Radio/NimbleRadio.razor b/packages/blazor-workspace/NimbleBlazor/Source/Radio/NimbleRadio.razor index 95f7e15bae..a0eea611e1 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/Radio/NimbleRadio.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/Radio/NimbleRadio.razor @@ -1,6 +1,7 @@ @namespace NimbleBlazor @inherits ComponentBase diff --git a/packages/blazor-workspace/NimbleBlazor/Source/Radio/NimbleRadio.razor.cs b/packages/blazor-workspace/NimbleBlazor/Source/Radio/NimbleRadio.razor.cs index c141ecb1c3..c30819e80f 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/Radio/NimbleRadio.razor.cs +++ b/packages/blazor-workspace/NimbleBlazor/Source/Radio/NimbleRadio.razor.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Web; namespace NimbleBlazor; @@ -33,4 +34,12 @@ public partial class NimbleRadio : ComponentBase /// [Parameter(CaptureUnmatchedValues = true)] public IDictionary? AdditionalAttributes { get; set; } + + [Parameter] + public EventCallback Blur { get; set; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/RadioGroup/NimbleRadioGroup.razor b/packages/blazor-workspace/NimbleBlazor/Source/RadioGroup/NimbleRadioGroup.razor index 9272ac1c44..9caf312d99 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/RadioGroup/NimbleRadioGroup.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/RadioGroup/NimbleRadioGroup.razor @@ -1,6 +1,7 @@ @namespace NimbleBlazor @inherits NimbleInputBase [Parameter] public RenderFragment? ChildContent { get; set; } + [Parameter] + public EventCallback Blur { get; set; } + protected override bool TryParseValueFromString(string? value, [MaybeNullWhen(false)] out string result, [NotNullWhen(false)] out string? validationErrorMessage) { result = value ?? string.Empty; validationErrorMessage = null; return true; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/RichText/Viewer/NimbleRichTextViewer.razor b/packages/blazor-workspace/NimbleBlazor/Source/RichText/Viewer/NimbleRichTextViewer.razor index 744758152b..19a66550dc 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/RichText/Viewer/NimbleRichTextViewer.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/RichText/Viewer/NimbleRichTextViewer.razor @@ -1,5 +1,6 @@ @namespace NimbleBlazor @ChildContent diff --git a/packages/blazor-workspace/NimbleBlazor/Source/RichText/Viewer/NimbleRichTextViewer.razor.cs b/packages/blazor-workspace/NimbleBlazor/Source/RichText/Viewer/NimbleRichTextViewer.razor.cs index 713289bf8f..130ad8c375 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/RichText/Viewer/NimbleRichTextViewer.razor.cs +++ b/packages/blazor-workspace/NimbleBlazor/Source/RichText/Viewer/NimbleRichTextViewer.razor.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Web; namespace NimbleBlazor; @@ -21,4 +22,12 @@ public partial class NimbleRichTextViewer : ComponentBase /// [Parameter(CaptureUnmatchedValues = true)] public IDictionary? AdditionalAttributes { get; set; } + + [Parameter] + public EventCallback Blur { get; set; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/Step/NimbleStep.razor b/packages/blazor-workspace/NimbleBlazor/Source/Step/NimbleStep.razor index 253f3bd4b1..fe9f7edffe 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/Step/NimbleStep.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/Step/NimbleStep.razor @@ -1,5 +1,6 @@ @namespace NimbleBlazor [Parameter(CaptureUnmatchedValues = true)] public IDictionary? AdditionalAttributes { get; set; } + + [Parameter] + public EventCallback Blur { get; set; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/Stepper/NimbleStepper.razor b/packages/blazor-workspace/NimbleBlazor/Source/Stepper/NimbleStepper.razor index e7d921cf5f..54d7d9149b 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/Stepper/NimbleStepper.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/Stepper/NimbleStepper.razor @@ -1,5 +1,6 @@ @namespace NimbleBlazor @ChildContent diff --git a/packages/blazor-workspace/NimbleBlazor/Source/Stepper/NimbleStepper.razor.cs b/packages/blazor-workspace/NimbleBlazor/Source/Stepper/NimbleStepper.razor.cs index d3e70b50e2..55be15a0be 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/Stepper/NimbleStepper.razor.cs +++ b/packages/blazor-workspace/NimbleBlazor/Source/Stepper/NimbleStepper.razor.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Web; namespace NimbleBlazor; @@ -21,4 +22,12 @@ public partial class NimbleStepper : ComponentBase /// [Parameter(CaptureUnmatchedValues = true)] public IDictionary? AdditionalAttributes { get; set; } + + [Parameter] + public EventCallback Blur { get; set; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/Switch/NimbleSwitch.razor b/packages/blazor-workspace/NimbleBlazor/Source/Switch/NimbleSwitch.razor index dbe9d84e6b..f71c8d5eac 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/Switch/NimbleSwitch.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/Switch/NimbleSwitch.razor @@ -1,6 +1,7 @@ @namespace NimbleBlazor @inherits NimbleInputBase [Parameter] public RenderFragment? ChildContent { get; set; } + [Parameter] + public EventCallback Blur { get; set; } + protected override bool TryParseValueFromString(string? value, [MaybeNullWhen(false)] out bool result, [NotNullWhen(false)] out string? validationErrorMessage) => throw new NotSupportedException($"This component does not parse string inputs. Bind to the '{nameof(CurrentValue)}' property, not '{nameof(CurrentValueAsString)}'."); + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/Tab/NimbleTab.razor b/packages/blazor-workspace/NimbleBlazor/Source/Tab/NimbleTab.razor index c0a030e594..6f2ad314e0 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/Tab/NimbleTab.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/Tab/NimbleTab.razor @@ -1,5 +1,6 @@ @namespace NimbleBlazor @ChildContent diff --git a/packages/blazor-workspace/NimbleBlazor/Source/Tab/NimbleTab.razor.cs b/packages/blazor-workspace/NimbleBlazor/Source/Tab/NimbleTab.razor.cs index 7d473cd6ba..6464b9a6d7 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/Tab/NimbleTab.razor.cs +++ b/packages/blazor-workspace/NimbleBlazor/Source/Tab/NimbleTab.razor.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Web; namespace NimbleBlazor; @@ -12,4 +13,12 @@ public partial class NimbleTab : ComponentBase [Parameter(CaptureUnmatchedValues = true)] public IDictionary? AdditionalAttributes { get; set; } + + [Parameter] + public EventCallback Blur { get; set; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/TabPanel/NimbleTabPanel.razor b/packages/blazor-workspace/NimbleBlazor/Source/TabPanel/NimbleTabPanel.razor index bbd3533fd1..f68bd27511 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/TabPanel/NimbleTabPanel.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/TabPanel/NimbleTabPanel.razor @@ -1,5 +1,6 @@ @namespace NimbleBlazor @ChildContent diff --git a/packages/blazor-workspace/NimbleBlazor/Source/TabPanel/NimbleTabPanel.razor.cs b/packages/blazor-workspace/NimbleBlazor/Source/TabPanel/NimbleTabPanel.razor.cs index 7db6360ec6..f694522f75 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/TabPanel/NimbleTabPanel.razor.cs +++ b/packages/blazor-workspace/NimbleBlazor/Source/TabPanel/NimbleTabPanel.razor.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Web; namespace NimbleBlazor; @@ -9,4 +10,12 @@ public partial class NimbleTabPanel : ComponentBase [Parameter(CaptureUnmatchedValues = true)] public IDictionary? AdditionalAttributes { get; set; } + + [Parameter] + public EventCallback Blur { get; set; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/Table/NimbleTable.razor b/packages/blazor-workspace/NimbleBlazor/Source/Table/NimbleTable.razor index 1916e6a6fb..55b50121ad 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/Table/NimbleTable.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/Table/NimbleTable.razor @@ -1,6 +1,7 @@ @namespace NimbleBlazor @typeparam TData : ComponentBase [Parameter(CaptureUnmatchedValues = true)] public IDictionary? AdditionalAttributes { get; set; } + [Parameter] + public EventCallback Blur { get; set; } + /// /// Sets the data in the table. /// @@ -167,4 +171,9 @@ protected async void HandleRowExpandToggle(TableRowExpandToggleEventArgs eventAr { await RowExpandToggle.InvokeAsync(eventArgs); } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/Tabs/NimbleTabs.razor b/packages/blazor-workspace/NimbleBlazor/Source/Tabs/NimbleTabs.razor index baabd44c19..d777e9fee2 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/Tabs/NimbleTabs.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/Tabs/NimbleTabs.razor @@ -1,5 +1,6 @@ @namespace NimbleBlazor diff --git a/packages/blazor-workspace/NimbleBlazor/Source/Tabs/NimbleTabs.razor.cs b/packages/blazor-workspace/NimbleBlazor/Source/Tabs/NimbleTabs.razor.cs index fa7ddac3e8..0052214be9 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/Tabs/NimbleTabs.razor.cs +++ b/packages/blazor-workspace/NimbleBlazor/Source/Tabs/NimbleTabs.razor.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Web; namespace NimbleBlazor; @@ -26,4 +27,12 @@ private async void UpdateActiveId(string? value) [Parameter(CaptureUnmatchedValues = true)] public IDictionary? AdditionalAttributes { get; set; } + + [Parameter] + public EventCallback Blur { get; set; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/TabsToolbar/NimbleTabsToolbar.razor b/packages/blazor-workspace/NimbleBlazor/Source/TabsToolbar/NimbleTabsToolbar.razor index fd5f7bcd28..dd75f0835d 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/TabsToolbar/NimbleTabsToolbar.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/TabsToolbar/NimbleTabsToolbar.razor @@ -1,5 +1,6 @@ @namespace NimbleBlazor @ChildContent diff --git a/packages/blazor-workspace/NimbleBlazor/Source/TabsToolbar/NimbleTabsToolbar.razor.cs b/packages/blazor-workspace/NimbleBlazor/Source/TabsToolbar/NimbleTabsToolbar.razor.cs index 45a45305d3..cd6466041b 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/TabsToolbar/NimbleTabsToolbar.razor.cs +++ b/packages/blazor-workspace/NimbleBlazor/Source/TabsToolbar/NimbleTabsToolbar.razor.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Web; namespace NimbleBlazor; @@ -9,4 +10,12 @@ public partial class NimbleTabsToolbar : ComponentBase [Parameter(CaptureUnmatchedValues = true)] public IDictionary? AdditionalAttributes { get; set; } + + [Parameter] + public EventCallback Blur { get; set; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/TextArea/NimbleTextArea.razor b/packages/blazor-workspace/NimbleBlazor/Source/TextArea/NimbleTextArea.razor index ba5b8f82f2..b00bddf396 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/TextArea/NimbleTextArea.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/TextArea/NimbleTextArea.razor @@ -1,6 +1,7 @@ @namespace NimbleBlazor @inherits NimbleInputBase [Parameter] public RenderFragment? ChildContent { get; set; } + [Parameter] + public EventCallback Blur { get; set; } + protected override bool TryParseValueFromString(string? value, out string? result, [NotNullWhen(false)] out string? validationErrorMessage) { result = value; validationErrorMessage = null; return true; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/TextField/NimbleTextField.razor b/packages/blazor-workspace/NimbleBlazor/Source/TextField/NimbleTextField.razor index 82062f6f9f..efa5c14602 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/TextField/NimbleTextField.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/TextField/NimbleTextField.razor @@ -1,6 +1,7 @@ @namespace NimbleBlazor @inherits NimbleInputBase [Parameter] public RenderFragment? ChildContent { get; set; } + [Parameter] + public EventCallback Blur { get; set; } + protected override bool TryParseValueFromString(string? value, out string? result, [NotNullWhen(false)] out string? validationErrorMessage) { result = value; validationErrorMessage = null; return true; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/ToggleButton/NimbleToggleButton.razor b/packages/blazor-workspace/NimbleBlazor/Source/ToggleButton/NimbleToggleButton.razor index 42f57ddc8e..19ae6f876f 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/ToggleButton/NimbleToggleButton.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/ToggleButton/NimbleToggleButton.razor @@ -1,6 +1,7 @@ @namespace NimbleBlazor @inherits NimbleInputBase [Parameter] public RenderFragment? ChildContent { get; set; } + [Parameter] + public EventCallback Blur { get; set; } + protected override bool TryParseValueFromString(string? value, [MaybeNullWhen(false)] out bool result, [NotNullWhen(false)] out string? validationErrorMessage) => throw new NotSupportedException($"This component does not parse string inputs. Bind to the '{nameof(CurrentValue)}' property, not '{nameof(CurrentValueAsString)}'."); + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/Toolbar/NimbleToolbar.razor b/packages/blazor-workspace/NimbleBlazor/Source/Toolbar/NimbleToolbar.razor index cc71237aa2..05f680d409 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/Toolbar/NimbleToolbar.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/Toolbar/NimbleToolbar.razor @@ -1,5 +1,6 @@ @namespace NimbleBlazor @ChildContent diff --git a/packages/blazor-workspace/NimbleBlazor/Source/Toolbar/NimbleToolbar.razor.cs b/packages/blazor-workspace/NimbleBlazor/Source/Toolbar/NimbleToolbar.razor.cs index ef274877e1..d3af18e7a0 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/Toolbar/NimbleToolbar.razor.cs +++ b/packages/blazor-workspace/NimbleBlazor/Source/Toolbar/NimbleToolbar.razor.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Web; namespace NimbleBlazor; @@ -12,4 +13,12 @@ public partial class NimbleToolbar /// [Parameter(CaptureUnmatchedValues = true)] public IReadOnlyDictionary? AdditionalAttributes { get; set; } + + [Parameter] + public EventCallback Blur { get; set; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/Tooltip/NimbleTooltip.razor b/packages/blazor-workspace/NimbleBlazor/Source/Tooltip/NimbleTooltip.razor index 7c001e4c14..03807b6a0d 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/Tooltip/NimbleTooltip.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/Tooltip/NimbleTooltip.razor @@ -1,5 +1,6 @@ @namespace NimbleBlazor ? AdditionalAttributes { get; set; } + + [Parameter] + public EventCallback Blur { get; set; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/TreeItem/NimbleTreeItem.razor b/packages/blazor-workspace/NimbleBlazor/Source/TreeItem/NimbleTreeItem.razor index 6bd4b9c63a..2e42e8dc36 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/TreeItem/NimbleTreeItem.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/TreeItem/NimbleTreeItem.razor @@ -1,5 +1,6 @@ @namespace NimbleBlazor ? AdditionalAttributes { get; set; } + + [Parameter] + public EventCallback Blur { get; set; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/TreeView/NimbleTreeView.razor b/packages/blazor-workspace/NimbleBlazor/Source/TreeView/NimbleTreeView.razor index 0f94df4c8f..ee38aabe9e 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/TreeView/NimbleTreeView.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/TreeView/NimbleTreeView.razor @@ -1,5 +1,6 @@ @namespace NimbleBlazor diff --git a/packages/blazor-workspace/NimbleBlazor/Source/TreeView/NimbleTreeView.razor.cs b/packages/blazor-workspace/NimbleBlazor/Source/TreeView/NimbleTreeView.razor.cs index 4094cd9647..32dafcf003 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/TreeView/NimbleTreeView.razor.cs +++ b/packages/blazor-workspace/NimbleBlazor/Source/TreeView/NimbleTreeView.razor.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Components; +using Microsoft.AspNetCore.Components.Web; namespace NimbleBlazor; @@ -15,4 +16,12 @@ public partial class NimbleTreeView : ComponentBase [Parameter(CaptureUnmatchedValues = true)] public IDictionary? AdditionalAttributes { get; set; } + + [Parameter] + public EventCallback Blur { get; set; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } diff --git a/packages/blazor-workspace/NimbleBlazor/Source/WaferMap/NimbleWaferMap.razor b/packages/blazor-workspace/NimbleBlazor/Source/WaferMap/NimbleWaferMap.razor index f43d48d9c2..ac15b92a9e 100644 --- a/packages/blazor-workspace/NimbleBlazor/Source/WaferMap/NimbleWaferMap.razor +++ b/packages/blazor-workspace/NimbleBlazor/Source/WaferMap/NimbleWaferMap.razor @@ -1,6 +1,7 @@ @using System.Globalization @namespace NimbleBlazor Blur { get; set; } + + protected async void HandleBlur(FocusEventArgs e) + { + await Blur.InvokeAsync(e); + } } From 7277f51b4cf1a3f64331aef92181b096444cdd02 Mon Sep 17 00:00:00 2001 From: mollykreis <20542556+mollykreis@users.noreply.github.com> Date: Mon, 24 Aug 2026 20:43:50 -0500 Subject: [PATCH 2/3] Change files --- ...nimble-blazor-3ce256ca-8291-4971-8718-818b348b7788.json | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 change/@ni-nimble-blazor-3ce256ca-8291-4971-8718-818b348b7788.json diff --git a/change/@ni-nimble-blazor-3ce256ca-8291-4971-8718-818b348b7788.json b/change/@ni-nimble-blazor-3ce256ca-8291-4971-8718-818b348b7788.json new file mode 100644 index 0000000000..48d95c4f7e --- /dev/null +++ b/change/@ni-nimble-blazor-3ce256ca-8291-4971-8718-818b348b7788.json @@ -0,0 +1,7 @@ +{ + "type": "minor", + "comment": "Add Blur event to interactive elements", + "packageName": "@ni/nimble-blazor", + "email": "20542556+mollykreis@users.noreply.github.com", + "dependentChangeType": "patch" +} From 8dc1780c9daa8df68bd9350bb24d4feed8eec91f Mon Sep 17 00:00:00 2001 From: mollykreis <20542556+mollykreis@users.noreply.github.com> Date: Mon, 24 Aug 2026 20:50:11 -0500 Subject: [PATCH 3/3] Update CONTRIBUTING.md --- packages/blazor-workspace/NimbleBlazor/CONTRIBUTING.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/blazor-workspace/NimbleBlazor/CONTRIBUTING.md b/packages/blazor-workspace/NimbleBlazor/CONTRIBUTING.md index 3141d121e4..3f89460ed5 100644 --- a/packages/blazor-workspace/NimbleBlazor/CONTRIBUTING.md +++ b/packages/blazor-workspace/NimbleBlazor/CONTRIBUTING.md @@ -57,6 +57,7 @@ public partial class NimbleButton : ComponentBase [Parameter(CaptureUnmatchedValues = true)] public IDictionary? AdditionalAttributes { get; set; } ``` +- Interactive components should expose a `Blur` `EventCallback` so that clients can optionally listen to the event - Code style conventions are enforced by the [NI C# Style Guide](https://github.com/ni/csharp-styleguide) ### 2-way Binding Support, Handling DOM Events