From 2a2bd34cd50d8ff3621868c6d8d67c82e78a43a3 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 22 Mar 2025 00:00:19 +0800 Subject: [PATCH 01/18] =?UTF-8?q?refactor:=20=E6=9B=B4=E6=96=B0=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Components/Tab/Tab.razor | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor b/src/BootstrapBlazor/Components/Tab/Tab.razor index 8d35f24b3a6..4b794a878cd 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor @@ -51,11 +51,11 @@ else } else if (item.IsDisabled) { - @RenderDisabledHeader(item) + @RenderDisabledHeaderItem(item) } else { - @RenderHeader(item) + @RenderHeaderItem(item) } } @if (IsCard || IsBorderCard) @@ -124,7 +124,7 @@ else @RenderTabItemContent(item) ; - RenderFragment RenderDisabledHeader(TabItem item) => + RenderFragment RenderDisabledHeaderItem(TabItem item) => @
; - RenderFragment RenderHeader(TabItem item) => + RenderFragment RenderHeaderItem(TabItem item) => @
@RenderHeaderContent(item) From 182f7dc1324d0ee8d23dbe6fecc21cd5c12b8441 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 22 Mar 2025 00:01:54 +0800 Subject: [PATCH 02/18] =?UTF-8?q?refactor:=20=E6=9B=B4=E6=96=B0=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E5=90=8D=E7=A7=B0=E6=8F=90=E9=AB=98=E5=8F=AF=E8=AF=BB?= =?UTF-8?q?=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Components/Tab/Tab.razor | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor b/src/BootstrapBlazor/Components/Tab/Tab.razor index 4b794a878cd..d823ffb2b95 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor @@ -127,7 +127,7 @@ else RenderFragment RenderDisabledHeaderItem(TabItem item) => @
@if (TabStyle == TabStyle.Chrome) { @@ -139,7 +139,7 @@ else RenderFragment RenderHeaderItem(TabItem item) => @
- @RenderHeaderContent(item) + @RenderHeaderItemContent(item) @if (TabStyle == TabStyle.Chrome) { @@ -148,7 +148,7 @@ else }
; - RenderFragment RenderHeaderContent(TabItem item) => + RenderFragment RenderHeaderItemContent(TabItem item) => @
@if (!string.IsNullOrEmpty(item.Icon)) { From 1d1b11a6717604d805a62df8a99adfb1c9b84bdf Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 22 Mar 2025 00:05:58 +0800 Subject: [PATCH 03/18] =?UTF-8?q?refactor:=20=E5=A2=9E=E5=8A=A0=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F=E9=98=B2=E6=AD=A2=E6=BA=A2=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Components/Tab/Tab.razor.scss | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor.scss b/src/BootstrapBlazor/Components/Tab/Tab.razor.scss index 35acdabb21a..f16969e45bb 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor.scss +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor.scss @@ -232,6 +232,8 @@ .tabs .tabs-item-fix { height: 100%; flex: 1; + width: 1%; + min-width: 0; border: 1px solid var(--bs-border-color); border-width: 0 0 1px 0; } From 7dc6a6924be1e811fbb6a73fc0e1dcc350f1fcf9 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 22 Mar 2025 08:51:51 +0800 Subject: [PATCH 04/18] =?UTF-8?q?style:=20=E6=9B=B4=E6=96=B0=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Tab/Tab.razor.scss | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor.scss b/src/BootstrapBlazor/Components/Tab/Tab.razor.scss index f16969e45bb..95a4faf6091 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor.scss +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor.scss @@ -645,3 +645,30 @@ } } } + +.tabs { + &:not(.tabs-vertical) > .tabs-header .tabs-nav .tabs-nav-toolbar { + display: flex; + } + + &.tabs-bottom > .tabs-header { + .tabs-nav .tabs-nav-toolbar { + border-top: 1px solid var(--bs-border-color); + } + } + + &:not(.tabs-bottom) > .tabs-header { + .tabs-nav .tabs-nav-toolbar { + border-bottom: 1px solid var(--bs-border-color); + } + } + + > .tabs-header { + .tabs-nav .tabs-nav-toolbar { + display: none; + align-items: center; + height: 100%; + padding-inline: 1rem; + } + } +} From ab63fc7f32c2ab9f057b883583151bba3d31cc7c Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 22 Mar 2025 09:09:46 +0800 Subject: [PATCH 05/18] =?UTF-8?q?refactor:=20=E5=A2=9E=E5=8A=A0=20Toolbar?= =?UTF-8?q?=20=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Components/Tab/Tab.razor | 11 +++++++++++ src/BootstrapBlazor/Components/Tab/Tab.razor.cs | 12 ++++++++++++ src/BootstrapBlazor/Components/Tab/Tab.razor.scss | 10 +++++----- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor b/src/BootstrapBlazor/Components/Tab/Tab.razor index d823ffb2b95..fd129d73748 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor @@ -73,6 +73,17 @@ else { @ButtonTemplate } + @if (ShowToolbar) + { +
+ @if (ShowFullscreenButton) + { +
+ +
+ } +
+ } @if (ShowNavigatorButtons) { diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor.cs b/src/BootstrapBlazor/Components/Tab/Tab.razor.cs index 231e641607c..cc7870856b6 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor.cs +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor.cs @@ -294,6 +294,18 @@ public partial class Tab : IHandlerException [Parameter] public TabStyle TabStyle { get; set; } + /// + /// Gets or sets whether show the toolbar. Default is false. + /// + [Parameter] + public bool ShowToolbar { get; set; } + + /// + /// Gets or sets whether show the full screen button. Default is true. + /// + [Parameter] + public bool ShowFullscreenButton { get; set; } = true; + [CascadingParameter] private Layout? Layout { get; set; } diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor.scss b/src/BootstrapBlazor/Components/Tab/Tab.razor.scss index 95a4faf6091..f94d28b00a8 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor.scss +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor.scss @@ -197,6 +197,7 @@ } .tabs .tabs-body { + background-color: var(--bs-body-bg); padding: var(--bb-tabs-body-padding); flex: 1; } @@ -647,28 +648,27 @@ } .tabs { - &:not(.tabs-vertical) > .tabs-header .tabs-nav .tabs-nav-toolbar { + &:not(.tabs-vertical) > .tabs-header .tabs-nav-toolbar { display: flex; } &.tabs-bottom > .tabs-header { - .tabs-nav .tabs-nav-toolbar { + .tabs-nav-toolbar { border-top: 1px solid var(--bs-border-color); } } &:not(.tabs-bottom) > .tabs-header { - .tabs-nav .tabs-nav-toolbar { + .tabs-nav-toolbar { border-bottom: 1px solid var(--bs-border-color); } } > .tabs-header { - .tabs-nav .tabs-nav-toolbar { + .tabs-nav-toolbar { display: none; align-items: center; height: 100%; - padding-inline: 1rem; } } } From 01c60f829d99e1da81e1d65b8dbc619e06ea47b9 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 22 Mar 2025 09:48:33 +0800 Subject: [PATCH 06/18] =?UTF-8?q?doc:=20=E6=9B=B4=E6=96=B0=E7=A4=BA?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Samples/Tabs.razor | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/BootstrapBlazor.Server/Components/Samples/Tabs.razor b/src/BootstrapBlazor.Server/Components/Samples/Tabs.razor index be0c0544c1e..6e85ded7e2a 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/Tabs.razor +++ b/src/BootstrapBlazor.Server/Components/Samples/Tabs.razor @@ -423,7 +423,21 @@ private void Navigation() - + + +
@Localizer["TabItem1Content"]
+
+ +
@Localizer["TabItem2Content"]
+
+ +
@Localizer["TabItem3Content"]
+
+
+
+ + +
@Localizer["TabItem1Content"]
@@ -437,7 +451,7 @@ private void Navigation()
- +
@Localizer["TabItem1Content"]
@@ -454,7 +468,7 @@ private void Navigation()
- +
@Localizer["TabItem1Content"]
From bf03635ee90bd148f523ad99d5e21d66342aeee0 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 22 Mar 2025 10:46:57 +0800 Subject: [PATCH 07/18] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E5=88=B7?= =?UTF-8?q?=E6=96=B0=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Components/Tab/Tab.razor | 10 ++++-- .../Components/Tab/Tab.razor.cs | 20 +++++++++++- .../Components/Tab/Tab.razor.scss | 4 +++ .../Tab/TabToolbarRefreshButton.razor | 3 ++ .../Tab/TabToolbarRefreshButton.razor.cs | 32 +++++++++++++++++++ src/BootstrapBlazor/Enums/ComponentIcons.cs | 5 +++ src/BootstrapBlazor/Icons/BootstrapIcons.cs | 1 + src/BootstrapBlazor/Icons/FontAwesomeIcons.cs | 1 + .../Icons/MaterialDesignIcons.cs | 1 + 9 files changed, 74 insertions(+), 3 deletions(-) create mode 100644 src/BootstrapBlazor/Components/Tab/TabToolbarRefreshButton.razor create mode 100644 src/BootstrapBlazor/Components/Tab/TabToolbarRefreshButton.razor.cs diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor b/src/BootstrapBlazor/Components/Tab/Tab.razor index fd129d73748..2d27304d78a 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor @@ -76,9 +76,15 @@ else @if (ShowToolbar) {
- @if (ShowFullscreenButton) + @if (ShowRefreshToolbarButton) { -
+
+ +
+ } + @if (ShowFullscreenToolbarButton) + { +
} diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor.cs b/src/BootstrapBlazor/Components/Tab/Tab.razor.cs index cc7870856b6..993fd677132 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor.cs +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor.cs @@ -304,7 +304,19 @@ public partial class Tab : IHandlerException /// Gets or sets whether show the full screen button. Default is true. /// [Parameter] - public bool ShowFullscreenButton { get; set; } = true; + public bool ShowFullscreenToolbarButton { get; set; } = true; + + /// + /// Gets or sets whether show the full screen button. Default is true. + /// + [Parameter] + public bool ShowRefreshToolbarButton { get; set; } = true; + + /// + /// Gets or sets the refresh toolbar button icon string. Default is null. + /// + [Parameter] + public string? RefreshToolbarButtonIcon { get; set; } [CascadingParameter] private Layout? Layout { get; set; } @@ -372,6 +384,7 @@ protected override void OnParametersSet() NextIcon ??= IconTheme.GetIconByKey(ComponentIcons.TabNextIcon); DropdownIcon ??= IconTheme.GetIconByKey(ComponentIcons.TabDropdownIcon); CloseIcon ??= IconTheme.GetIconByKey(ComponentIcons.TabCloseIcon); + RefreshToolbarButtonIcon ??= IconTheme.GetIconByKey(ComponentIcons.TabRefreshButtonIcon); AdditionalAssemblies ??= new[] { Assembly.GetEntryAssembly()! }; @@ -890,6 +903,11 @@ public async Task DragItemCallback(int originIndex, int currentIndex) private string? GetIdByTabItem(TabItem item) => (ShowFullScreen && item.ShowFullScreen) ? ComponentIdGenerator.Generate(item) : null; + private Task OnRefreshAsync() + { + return Task.CompletedTask; + } + /// /// /// diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor.scss b/src/BootstrapBlazor/Components/Tab/Tab.razor.scss index f94d28b00a8..f427991de80 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor.scss +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor.scss @@ -669,6 +669,10 @@ display: none; align-items: center; height: 100%; + + .tabs-nav-toolbar-button { + cursor: pointer; + } } } } diff --git a/src/BootstrapBlazor/Components/Tab/TabToolbarRefreshButton.razor b/src/BootstrapBlazor/Components/Tab/TabToolbarRefreshButton.razor new file mode 100644 index 00000000000..69e9e9577d9 --- /dev/null +++ b/src/BootstrapBlazor/Components/Tab/TabToolbarRefreshButton.razor @@ -0,0 +1,3 @@ +@namespace BootstrapBlazor.Components + + diff --git a/src/BootstrapBlazor/Components/Tab/TabToolbarRefreshButton.razor.cs b/src/BootstrapBlazor/Components/Tab/TabToolbarRefreshButton.razor.cs new file mode 100644 index 00000000000..a77d56e80e1 --- /dev/null +++ b/src/BootstrapBlazor/Components/Tab/TabToolbarRefreshButton.razor.cs @@ -0,0 +1,32 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the Apache 2.0 License +// See the LICENSE file in the project root for more information. +// Maintainer: Argo Zhang(argo@live.ca) Website: https://www.blazor.zone + +namespace BootstrapBlazor.Components; + +/// +/// TabToolbarRefreshButton component +/// +public partial class TabToolbarRefreshButton +{ + /// + /// Gets or sets the button icon string. Default is null. + /// + [Parameter] + public string? Icon { get; set; } + + /// + /// Gets or sets the button click event handler. Default is null. + /// + [Parameter] + public Func? OnClickAsync { get; set; } + + private async Task OnClick() + { + if (OnClickAsync != null) + { + await OnClickAsync(); + } + } +} diff --git a/src/BootstrapBlazor/Enums/ComponentIcons.cs b/src/BootstrapBlazor/Enums/ComponentIcons.cs index 9ccde6692d8..98aaa444683 100644 --- a/src/BootstrapBlazor/Enums/ComponentIcons.cs +++ b/src/BootstrapBlazor/Enums/ComponentIcons.cs @@ -705,6 +705,11 @@ public enum ComponentIcons /// TabCloseIcon, + /// + /// Tab 组件 RefreshToolbarButtonIcon 属性图标 + /// + TabRefreshButtonIcon, + /// /// Timer 组件 Icon 属性图标 /// diff --git a/src/BootstrapBlazor/Icons/BootstrapIcons.cs b/src/BootstrapBlazor/Icons/BootstrapIcons.cs index 8a4817671ee..51cf458b9f6 100644 --- a/src/BootstrapBlazor/Icons/BootstrapIcons.cs +++ b/src/BootstrapBlazor/Icons/BootstrapIcons.cs @@ -136,6 +136,7 @@ internal static class BootstrapIcons { ComponentIcons.TabNextIcon, "bi bi-chevron-right" }, { ComponentIcons.TabDropdownIcon, "bi bi-chevron-down" }, { ComponentIcons.TabCloseIcon, "bi bi-x" }, + { ComponentIcons.TabRefreshButtonIcon, "bi bi-arrow-clockwise" }, { ComponentIcons.TableColumnToolboxIcon, "bi bi-gear" }, diff --git a/src/BootstrapBlazor/Icons/FontAwesomeIcons.cs b/src/BootstrapBlazor/Icons/FontAwesomeIcons.cs index 3fb9db7a467..96ac7c0ffe7 100644 --- a/src/BootstrapBlazor/Icons/FontAwesomeIcons.cs +++ b/src/BootstrapBlazor/Icons/FontAwesomeIcons.cs @@ -134,6 +134,7 @@ internal static class FontAwesomeIcons { ComponentIcons.TabNextIcon, "fa-solid fa-chevron-right" }, { ComponentIcons.TabDropdownIcon, "fa-solid fa-chevron-down" }, { ComponentIcons.TabCloseIcon, "fa-solid fa-xmark" }, + { ComponentIcons.TabRefreshButtonIcon, "fa-solid fa-arrows-rotate" }, { ComponentIcons.TableColumnToolboxIcon, "fa-solid fa-gear" }, diff --git a/src/BootstrapBlazor/Icons/MaterialDesignIcons.cs b/src/BootstrapBlazor/Icons/MaterialDesignIcons.cs index d724caf5efb..5227750d1a3 100644 --- a/src/BootstrapBlazor/Icons/MaterialDesignIcons.cs +++ b/src/BootstrapBlazor/Icons/MaterialDesignIcons.cs @@ -136,6 +136,7 @@ internal static class MaterialDesignIcons { ComponentIcons.TabNextIcon, "mdi mdi-chevron-right" }, { ComponentIcons.TabDropdownIcon, "mdi mdi-chevron-down" }, { ComponentIcons.TabCloseIcon, "mdi mdi-close" }, + { ComponentIcons.TabRefreshButtonIcon, "mdi mdi-refresh" }, { ComponentIcons.TableColumnToolboxIcon, "mdi mdi-cog" }, From f97024d0e7a9335f739ae5e77ec0c6742299cfaa Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 22 Mar 2025 12:16:05 +0800 Subject: [PATCH 08/18] =?UTF-8?q?doc:=20=E6=9B=B4=E6=96=B0=E7=A4=BA?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Layout/ComponentLayout.razor | 2 +- src/BootstrapBlazor.Server/Components/Samples/Tabs.razor | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/BootstrapBlazor.Server/Components/Layout/ComponentLayout.razor b/src/BootstrapBlazor.Server/Components/Layout/ComponentLayout.razor index 3fa93db5737..b8f3cb9c85e 100644 --- a/src/BootstrapBlazor.Server/Components/Layout/ComponentLayout.razor +++ b/src/BootstrapBlazor.Server/Components/Layout/ComponentLayout.razor @@ -30,7 +30,7 @@
- + @Body diff --git a/src/BootstrapBlazor.Server/Components/Samples/Tabs.razor b/src/BootstrapBlazor.Server/Components/Samples/Tabs.razor index 6e85ded7e2a..9076971d8ed 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/Tabs.razor +++ b/src/BootstrapBlazor.Server/Components/Samples/Tabs.razor @@ -471,6 +471,7 @@ private void Navigation()
@Localizer["TabItem1Content"]
+
@Localizer["TabItem2Content"]
From 1a3bea702f834821e38855ea488af541020c36de Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 22 Mar 2025 12:16:13 +0800 Subject: [PATCH 09/18] =?UTF-8?q?chore:=20=E6=9B=B4=E6=96=B0=20Icon=20?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor.Server/BootstrapBlazor.Server.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BootstrapBlazor.Server/BootstrapBlazor.Server.csproj b/src/BootstrapBlazor.Server/BootstrapBlazor.Server.csproj index ec6cce29417..acf0224f659 100644 --- a/src/BootstrapBlazor.Server/BootstrapBlazor.Server.csproj +++ b/src/BootstrapBlazor.Server/BootstrapBlazor.Server.csproj @@ -27,7 +27,7 @@ - + From 42a7d27303f8000be49eb4309838ad21b0cfdaea Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 22 Mar 2025 12:16:28 +0800 Subject: [PATCH 10/18] =?UTF-8?q?refactor:=20=E6=9B=B4=E6=96=B0=E5=88=B7?= =?UTF-8?q?=E6=96=B0=E6=8C=89=E9=92=AE=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Icons/FontAwesomeIcons.cs | 2 +- src/BootstrapBlazor/Icons/MaterialDesignIcons.cs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/BootstrapBlazor/Icons/FontAwesomeIcons.cs b/src/BootstrapBlazor/Icons/FontAwesomeIcons.cs index 96ac7c0ffe7..6d36a912bd7 100644 --- a/src/BootstrapBlazor/Icons/FontAwesomeIcons.cs +++ b/src/BootstrapBlazor/Icons/FontAwesomeIcons.cs @@ -134,7 +134,7 @@ internal static class FontAwesomeIcons { ComponentIcons.TabNextIcon, "fa-solid fa-chevron-right" }, { ComponentIcons.TabDropdownIcon, "fa-solid fa-chevron-down" }, { ComponentIcons.TabCloseIcon, "fa-solid fa-xmark" }, - { ComponentIcons.TabRefreshButtonIcon, "fa-solid fa-arrows-rotate" }, + { ComponentIcons.TabRefreshButtonIcon, "fa-solid fa-rotate-right" }, { ComponentIcons.TableColumnToolboxIcon, "fa-solid fa-gear" }, diff --git a/src/BootstrapBlazor/Icons/MaterialDesignIcons.cs b/src/BootstrapBlazor/Icons/MaterialDesignIcons.cs index 5227750d1a3..7792c063da5 100644 --- a/src/BootstrapBlazor/Icons/MaterialDesignIcons.cs +++ b/src/BootstrapBlazor/Icons/MaterialDesignIcons.cs @@ -77,8 +77,8 @@ internal static class MaterialDesignIcons { ComponentIcons.ImagePreviewNextIcon, "mdi mdi-chevron-right" }, { ComponentIcons.ImagePreviewMinusIcon, "mdi mdi-magnify-minus-outline" }, { ComponentIcons.ImagePreviewPlusIcon, "mdi mdi-magnify-plus-outline" }, - { ComponentIcons.ImagePreviewRotateLeftIcon, "mdi mdi-file-rotate-left-outline" }, - { ComponentIcons.ImagePreviewRotateRightIcon, "mdi mdi-file-rotate-right-outline" }, + { ComponentIcons.ImagePreviewRotateLeftIcon, "mdi mdi-restore" }, + { ComponentIcons.ImagePreviewRotateRightIcon, "mdi mdi-reload" }, { ComponentIcons.ImageViewerFileIcon, "mdi mdi-file-image-outline" }, @@ -136,7 +136,7 @@ internal static class MaterialDesignIcons { ComponentIcons.TabNextIcon, "mdi mdi-chevron-right" }, { ComponentIcons.TabDropdownIcon, "mdi mdi-chevron-down" }, { ComponentIcons.TabCloseIcon, "mdi mdi-close" }, - { ComponentIcons.TabRefreshButtonIcon, "mdi mdi-refresh" }, + { ComponentIcons.TabRefreshButtonIcon, "mdi mdi-reload" }, { ComponentIcons.TableColumnToolboxIcon, "mdi mdi-cog" }, From ad53d08cb0c291eba1d072b54f0ff3fc8f2f085e Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 22 Mar 2025 18:37:56 +0800 Subject: [PATCH 11/18] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=E5=88=B7?= =?UTF-8?q?=E6=96=B0=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Tab/Tab.razor.cs | 9 ++- .../Components/Tab/TabItemContent.cs | 60 +++++++++++++++++++ .../Extensions/TabItemExtensions.cs | 34 +++++++++++ 3 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 src/BootstrapBlazor/Components/Tab/TabItemContent.cs create mode 100644 src/BootstrapBlazor/Extensions/TabItemExtensions.cs diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor.cs b/src/BootstrapBlazor/Components/Tab/Tab.razor.cs index 993fd677132..ee54ceed153 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor.cs +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor.cs @@ -354,6 +354,8 @@ public partial class Tab : IHandlerException private string? DraggableString => AllowDrag ? "true" : null; + private readonly ConcurrentDictionary _cache = []; + /// /// /// @@ -844,7 +846,7 @@ private RenderFragment RenderTabItemContent(TabItem item) => builder => if (item.IsActive) { - builder.AddContent(0, item.ChildContent); + builder.AddContent(0, item.RenderContent(_cache)); if (IsLazyLoadTabItem) { LazyTabCache.AddOrUpdate(item, _ => true, (_, _) => true); @@ -852,7 +854,7 @@ private RenderFragment RenderTabItemContent(TabItem item) => builder => } else if (!IsLazyLoadTabItem || item.AlwaysLoad || LazyTabCache.TryGetValue(item, out var init) && init) { - builder.AddContent(0, item.ChildContent); + builder.AddContent(0, item.RenderContent(_cache)); } }; @@ -905,6 +907,9 @@ public async Task DragItemCallback(int originIndex, int currentIndex) private Task OnRefreshAsync() { + // refresh the active tab item + var item = TabItems.FirstOrDefault(i => i.IsActive); + item.Refresh(_cache); return Task.CompletedTask; } diff --git a/src/BootstrapBlazor/Components/Tab/TabItemContent.cs b/src/BootstrapBlazor/Components/Tab/TabItemContent.cs new file mode 100644 index 00000000000..d3dd5f2edc3 --- /dev/null +++ b/src/BootstrapBlazor/Components/Tab/TabItemContent.cs @@ -0,0 +1,60 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the Apache 2.0 License +// See the LICENSE file in the project root for more information. +// Maintainer: Argo Zhang(argo@live.ca) Website: https://www.blazor.zone + +using Microsoft.AspNetCore.Components.Rendering; + +namespace BootstrapBlazor.Components; + +internal class TabItemContent : IComponent +{ + /// + /// Gets or sets the component content. Default is null + /// + [Parameter] + public RenderFragment? ChildContent { get; set; } + + private RenderHandle _renderHandle; + + void IComponent.Attach(RenderHandle renderHandle) + { + _renderHandle = renderHandle; + } + + Task IComponent.SetParametersAsync(ParameterView parameters) + { + parameters.SetParameterProperties(this); + + RenderContent(); + return Task.CompletedTask; + } + + private void RenderContent() + { + _renderHandle.Render(BuildRenderTree); + } + + private object key = new(); + + /// + /// + /// + /// + private void BuildRenderTree(RenderTreeBuilder builder) + { + builder.OpenElement(0, "div"); + builder.SetKey(key); + builder.AddContent(10, ChildContent); + builder.CloseElement(); + } + + /// + /// Render method + /// + public void Render() + { + key = new object(); + RenderContent(); + } +} diff --git a/src/BootstrapBlazor/Extensions/TabItemExtensions.cs b/src/BootstrapBlazor/Extensions/TabItemExtensions.cs new file mode 100644 index 00000000000..9a0935be1dc --- /dev/null +++ b/src/BootstrapBlazor/Extensions/TabItemExtensions.cs @@ -0,0 +1,34 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the Apache 2.0 License +// See the LICENSE file in the project root for more information. +// Maintainer: Argo Zhang(argo@live.ca) Website: https://www.blazor.zone + +using System.Collections.Concurrent; + +namespace BootstrapBlazor.Components; + +/// +/// TabItem Extension +/// +internal static class TabItemExtensions +{ + public static RenderFragment RenderContent(this TabItem item, ConcurrentDictionary cache) => builder => + { + builder.OpenComponent(0); + builder.AddAttribute(10, nameof(TabItemContent.ChildContent), item.ChildContent); + builder.AddComponentReferenceCapture(20, content => + { + var tabItemContent = (TabItemContent)content; + cache.AddOrUpdate(item, tabItemContent, (_, _) => tabItemContent); + }); + builder.CloseComponent(); + }; + + public static void Refresh(this TabItem? item, ConcurrentDictionary cache) + { + if (item is not null && cache.TryGetValue(item, out var content)) + { + content.Render(); + } + } +} From a3256fed606f130474361817b54dd9dfee00fefe Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 22 Mar 2025 18:44:04 +0800 Subject: [PATCH 12/18] =?UTF-8?q?doc:=20=E6=9B=B4=E6=96=B0=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Components/Tab/Tab.razor.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor.cs b/src/BootstrapBlazor/Components/Tab/Tab.razor.cs index ee54ceed153..586075772f9 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor.cs +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor.cs @@ -10,7 +10,7 @@ namespace BootstrapBlazor.Components; /// -/// Tab 组件 +/// Tab component /// public partial class Tab : IHandlerException { @@ -58,25 +58,25 @@ public partial class Tab : IHandlerException private readonly List _draggedItems = new(50); /// - /// 获得/设置 TabItem 集合 + /// Gets the collection of tab items. /// public IEnumerable Items => TabItems; private List TabItems => _dragged ? _draggedItems : _items; /// - /// 获得/设置 是否为排除地址 默认 false + /// Gets or sets the excluded link. Default is false. /// private bool Excluded { get; set; } /// - /// 获得/设置 是否为卡片样式 默认 false + /// Gets or sets whether card style. Default is false. /// [Parameter] public bool IsCard { get; set; } /// - /// 获得/设置 是否为带边框卡片样式 默认 false + /// Gets or sets whether border card style. Default is false. /// [Parameter] public bool IsBorderCard { get; set; } From aa705822a4f2e47de21f34a5f22aa1b576659623 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 22 Mar 2025 18:50:41 +0800 Subject: [PATCH 13/18] =?UTF-8?q?refactor:=20=E4=BB=A3=E7=A0=81=E9=87=8D?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Components/Tab/Tab.razor.cs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor.cs b/src/BootstrapBlazor/Components/Tab/Tab.razor.cs index 586075772f9..6ac27776717 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor.cs +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor.cs @@ -25,7 +25,7 @@ public partial class Tab : IHandlerException .Build(); private static string? GetItemWrapClassString(TabItem item) => CssBuilder.Default("tabs-item-wrap") - .AddClass("active", item.IsActive && !item.IsDisabled) + .AddClass("active", item is { IsActive: true, IsDisabled: false }) .Build(); private string? GetClassString(TabItem item) => CssBuilder.Default("tabs-item") @@ -388,7 +388,14 @@ protected override void OnParametersSet() CloseIcon ??= IconTheme.GetIconByKey(ComponentIcons.TabCloseIcon); RefreshToolbarButtonIcon ??= IconTheme.GetIconByKey(ComponentIcons.TabRefreshButtonIcon); - AdditionalAssemblies ??= new[] { Assembly.GetEntryAssembly()! }; + if (AdditionalAssemblies is null) + { + var entryAssembly = Assembly.GetEntryAssembly(); + if (entryAssembly is not null) + { + AdditionalAssemblies = [entryAssembly]; + } + } if (Placement != Placement.Top && TabStyle == TabStyle.Chrome) { @@ -832,7 +839,7 @@ public void SetDisabledItem(TabItem item, bool disabled) } if (TabItems.Any(i => i.IsActive) == false) { - TabItems.Where(i => !i.IsDisabled).FirstOrDefault()?.SetActive(true); + TabItems.FirstOrDefault(i => !i.IsDisabled)?.SetActive(true); } StateHasChanged(); } From 5982ba83fc95768f881fe1a9b64f0a808ea27bad Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 22 Mar 2025 19:07:38 +0800 Subject: [PATCH 14/18] =?UTF-8?q?refactor:=20=E6=9B=B4=E6=96=B0=20TabItem?= =?UTF-8?q?=20Body=20=E6=B8=B2=E6=9F=93=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Components/Tab/Tab.razor | 4 +-- .../Components/Tab/Tab.razor.cs | 4 --- .../Components/Tab/TabItemContent.cs | 29 ++++++++++++------- .../Extensions/TabItemExtensions.cs | 2 +- 4 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor b/src/BootstrapBlazor/Components/Tab/Tab.razor index 2d27304d78a..c5ddbba0d20 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor @@ -125,9 +125,7 @@ else { foreach (var item in Items) { -
- @RenderTabItem(item) -
+ @RenderTabItem(item) } }
diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor.cs b/src/BootstrapBlazor/Components/Tab/Tab.razor.cs index 6ac27776717..3f7e2555f6a 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor.cs +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor.cs @@ -16,10 +16,6 @@ public partial class Tab : IHandlerException { private bool FirstRender { get; set; } = true; - private static string? GetContentClassString(TabItem item) => CssBuilder.Default("tabs-body-content") - .AddClass("d-none", !item.IsActive) - .Build(); - private string? WrapClassString => CssBuilder.Default("tabs-nav-wrap") .AddClass("extend", ShouldShowExtendButtons()) .Build(); diff --git a/src/BootstrapBlazor/Components/Tab/TabItemContent.cs b/src/BootstrapBlazor/Components/Tab/TabItemContent.cs index d3dd5f2edc3..249867bc926 100644 --- a/src/BootstrapBlazor/Components/Tab/TabItemContent.cs +++ b/src/BootstrapBlazor/Components/Tab/TabItemContent.cs @@ -12,8 +12,15 @@ internal class TabItemContent : IComponent /// /// Gets or sets the component content. Default is null /// - [Parameter] - public RenderFragment? ChildContent { get; set; } + [Parameter, NotNull] + public TabItem? Item { get; set; } + + /// + /// Gets instrance + /// + [Inject] + [NotNull] + private IComponentIdGenerator? ComponentIdGenerator { get; set; } private RenderHandle _renderHandle; @@ -35,26 +42,28 @@ private void RenderContent() _renderHandle.Render(BuildRenderTree); } - private object key = new(); + private object _key = new(); - /// - /// - /// - /// private void BuildRenderTree(RenderTreeBuilder builder) { builder.OpenElement(0, "div"); - builder.SetKey(key); - builder.AddContent(10, ChildContent); + builder.SetKey(_key); + builder.AddAttribute(5, "class", ClassString); + builder.AddAttribute(6, "id", ComponentIdGenerator.Generate(Item)); + builder.AddContent(10, Item.ChildContent); builder.CloseElement(); } + private string? ClassString => CssBuilder.Default("tabs-body-content") + .AddClass("d-none", !Item.IsActive) + .Build(); + /// /// Render method /// public void Render() { - key = new object(); + _key = new object(); RenderContent(); } } diff --git a/src/BootstrapBlazor/Extensions/TabItemExtensions.cs b/src/BootstrapBlazor/Extensions/TabItemExtensions.cs index 9a0935be1dc..75abc1a3391 100644 --- a/src/BootstrapBlazor/Extensions/TabItemExtensions.cs +++ b/src/BootstrapBlazor/Extensions/TabItemExtensions.cs @@ -15,7 +15,7 @@ internal static class TabItemExtensions public static RenderFragment RenderContent(this TabItem item, ConcurrentDictionary cache) => builder => { builder.OpenComponent(0); - builder.AddAttribute(10, nameof(TabItemContent.ChildContent), item.ChildContent); + builder.AddAttribute(10, nameof(TabItemContent.Item), item); builder.AddComponentReferenceCapture(20, content => { var tabItemContent = (TabItemContent)content; From 7a9ad9fde5031753ca902167cf9b567bcc7b58ba Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 22 Mar 2025 19:31:12 +0800 Subject: [PATCH 15/18] =?UTF-8?q?refactor:=20=E7=B2=BE=E7=AE=80=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Components/Tab/Tab.razor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor.cs b/src/BootstrapBlazor/Components/Tab/Tab.razor.cs index 3f7e2555f6a..187adc45325 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor.cs +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor.cs @@ -906,7 +906,7 @@ public async Task DragItemCallback(int originIndex, int currentIndex) } } - private string? GetIdByTabItem(TabItem item) => (ShowFullScreen && item.ShowFullScreen) ? ComponentIdGenerator.Generate(item) : null; + private string? GetIdByTabItem(TabItem item) => ComponentIdGenerator.Generate(item); private Task OnRefreshAsync() { From b6911bff6099845d0b0d4c086e7ed808330e6c58 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 22 Mar 2025 19:31:18 +0800 Subject: [PATCH 16/18] =?UTF-8?q?test:=20=E6=9B=B4=E6=96=B0=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/UnitTest/Components/LayoutTest.cs | 4 +- test/UnitTest/Components/TabTest.cs | 63 ++++++++++++++++++++++++-- 2 files changed, 62 insertions(+), 5 deletions(-) diff --git a/test/UnitTest/Components/LayoutTest.cs b/test/UnitTest/Components/LayoutTest.cs index 1b915fa9702..179c8e2699a 100644 --- a/test/UnitTest/Components/LayoutTest.cs +++ b/test/UnitTest/Components/LayoutTest.cs @@ -234,7 +234,7 @@ public void UseTabSet_Layout() }); var nav = cut.Services.GetRequiredService(); nav.NavigateTo("/Binder"); - cut.WaitForAssertion(() => cut.Contains("
Binder
")); + cut.Contains("Binder"); } [Fact] @@ -268,7 +268,7 @@ public void UseTabSet_Menus() }); var nav = cut.Services.GetRequiredService(); nav.NavigateTo("/Binder"); - cut.WaitForAssertion(() => cut.Contains("
Binder
")); + cut.Contains("Binder"); } [Fact] diff --git a/test/UnitTest/Components/TabTest.cs b/test/UnitTest/Components/TabTest.cs index e259b50552e..1e6085e55a9 100644 --- a/test/UnitTest/Components/TabTest.cs +++ b/test/UnitTest/Components/TabTest.cs @@ -353,7 +353,7 @@ public void Menus_Ok() }); var nav = cut.Services.GetRequiredService(); nav.NavigateTo("/Binder"); - cut.Contains("
Binder
"); + cut.Contains("Binder"); var items = cut.Instance.Items; Assert.Equal(2, items.Count()); @@ -542,10 +542,9 @@ public void IsOnlyRenderActiveTab_True() }); Assert.Contains("Tab1-Content", cut.Markup); Assert.DoesNotContain("Tab2-Content", cut.Markup); - Assert.DoesNotContain("tabs-body-content", cut.Markup); // 提高代码覆盖率 - cut.InvokeAsync(() => cut.Instance.CloseOtherTabs()); + cut.InvokeAsync(cut.Instance.CloseOtherTabs); } [Fact] @@ -942,6 +941,13 @@ public async Task FullScreen_Ok() var button = cut.Find(".btn-fs"); await cut.InvokeAsync(() => button.Click()); + + var tab = cut.FindComponent(); + tab.SetParametersAndRender(pb => + { + pb.Add(a => a.ShowFullScreen, false); + }); + cut.DoesNotContain("btn btn-fs"); } [Fact] @@ -965,6 +971,57 @@ public void BeforeNavigatorTemplate_Ok() cut.Contains("after-navigator-template"); } + [Fact] + public async Task ShowToolbar_Ok() + { + var cut = Context.RenderComponent(pb => + { + pb.AddChildContent(pb => + { + pb.Add(a => a.ShowToolbar, false); + pb.AddChildContent(pb => + { + pb.Add(a => a.ShowFullScreen, true); + pb.Add(a => a.Text, "Text1"); + pb.Add(a => a.ChildContent, builder => builder.AddContent(0, "Test1")); + }); + }); + }); + cut.DoesNotContain("tabs-nav-toolbar"); + + var tab = cut.FindComponent(); + tab.SetParametersAndRender(pb => + { + pb.Add(a => a.ShowToolbar, true); + }); + cut.Contains("tabs-nav-toolbar"); + cut.Contains("tabs-nav-toolbar-refresh"); + cut.Contains("tabs-nav-toolbar-fs"); + + // 点击刷新按钮 + var button = cut.Find(".tabs-nav-toolbar-refresh > i"); + await cut.InvokeAsync(() => button.Click()); + + tab.SetParametersAndRender(pb => + { + pb.Add(a => a.ShowRefreshToolbarButton, false); + }); + cut.DoesNotContain("tabs-nav-toolbar-refresh"); + + tab.SetParametersAndRender(pb => + { + pb.Add(a => a.ShowFullscreenToolbarButton, false); + }); + cut.DoesNotContain("tabs-nav-toolbar-fs"); + + // 利用反射提高代码覆盖率 + var type = Type.GetType("BootstrapBlazor.Components.TabItemExtensions, BootstrapBlazor"); + Assert.NotNull(type); + var mi = type.GetMethod("Refresh", BindingFlags.Static | BindingFlags.Public); + Assert.NotNull(mi); + mi.Invoke(null, [null, null]); + } + class DisableTabItemButton : ComponentBase { [CascadingParameter, NotNull] From 6f6ca5cb350b9c4fbb3c226a4e05580b734a032d Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 22 Mar 2025 20:01:51 +0800 Subject: [PATCH 17/18] =?UTF-8?q?style:=20=E8=B0=83=E6=95=B4=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Components/Tab/Tab.razor.scss | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor.scss b/src/BootstrapBlazor/Components/Tab/Tab.razor.scss index f427991de80..82fa992a942 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor.scss +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor.scss @@ -669,9 +669,23 @@ display: none; align-items: center; height: 100%; + padding: 3px 0.5rem; .tabs-nav-toolbar-button { cursor: pointer; + padding: 0 .75rem; + height: 100%; + display: flex; + align-items: center; + border-radius: var(--bs-border-radius); + + &:not(.disabled):not(:disabled):hover { + background-color: var(--bb-tabs-item-hover-bg-color); + } + + .btn { + padding: 0; + } } } } From b12a5fcbbffc59488b3bf0dfea582def5a2804f6 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Sat, 22 Mar 2025 20:04:40 +0800 Subject: [PATCH 18/18] chore: bump version 9.5.0-beta11 --- src/BootstrapBlazor/BootstrapBlazor.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BootstrapBlazor/BootstrapBlazor.csproj b/src/BootstrapBlazor/BootstrapBlazor.csproj index 40666cb0b8f..9e81c4b15b8 100644 --- a/src/BootstrapBlazor/BootstrapBlazor.csproj +++ b/src/BootstrapBlazor/BootstrapBlazor.csproj @@ -1,7 +1,7 @@  - 9.5.0-beta10 + 9.5.0-beta11