diff --git a/Oqtane.Client/Themes/Controls/FontIcon.razor b/Oqtane.Client/Themes/Controls/FontIcon.razor
new file mode 100644
index 00000000..04cd682a
--- /dev/null
+++ b/Oqtane.Client/Themes/Controls/FontIcon.razor
@@ -0,0 +1,4 @@
+@if (!string.IsNullOrWhiteSpace(Value))
+{
+
+}
\ No newline at end of file
diff --git a/Oqtane.Client/Themes/Controls/FontIcon.razor.cs b/Oqtane.Client/Themes/Controls/FontIcon.razor.cs
new file mode 100644
index 00000000..07ecda89
--- /dev/null
+++ b/Oqtane.Client/Themes/Controls/FontIcon.razor.cs
@@ -0,0 +1,10 @@
+using Microsoft.AspNetCore.Components;
+
+namespace Oqtane.Themes.Controls
+{
+ public partial class FontIcon : ComponentBase
+ {
+ [Parameter()]
+ public string Value { get; set; }
+ }
+}
diff --git a/Oqtane.Client/Themes/Controls/MenuHorizontal.razor b/Oqtane.Client/Themes/Controls/MenuHorizontal.razor
index 575a513b..c4c45f16 100644
--- a/Oqtane.Client/Themes/Controls/MenuHorizontal.razor
+++ b/Oqtane.Client/Themes/Controls/MenuHorizontal.razor
@@ -1,4 +1,5 @@
@namespace Oqtane.Themes.Controls
+
@inherits MenuBase
@if (MenuPages.Any())
@@ -10,35 +11,7 @@
}
diff --git a/Oqtane.Client/Themes/Controls/MenuItemsBase.cs b/Oqtane.Client/Themes/Controls/MenuItemsBase.cs
new file mode 100644
index 00000000..bfdd3cd4
--- /dev/null
+++ b/Oqtane.Client/Themes/Controls/MenuItemsBase.cs
@@ -0,0 +1,27 @@
+using System.Collections.Generic;
+using System.Linq;
+
+using Microsoft.AspNetCore.Components;
+
+using Oqtane.Models;
+using Oqtane.UI;
+
+namespace Oqtane.Themes.Controls
+{
+ public abstract class MenuItemsBase : MenuBase
+ {
+ [Parameter()]
+ public Page ParentPage { get; set; }
+
+ [Parameter()]
+ public IEnumerable Pages { get; set; }
+
+ protected IEnumerable GetChildPages()
+ {
+ return Pages
+ .Where(e => e.ParentId == ParentPage?.PageId)
+ .OrderBy(e => e.Order)
+ .AsEnumerable();
+ }
+ }
+}
diff --git a/Oqtane.Client/Themes/Controls/MenuItemsHorizontal.razor b/Oqtane.Client/Themes/Controls/MenuItemsHorizontal.razor
new file mode 100644
index 00000000..1ba03d4f
--- /dev/null
+++ b/Oqtane.Client/Themes/Controls/MenuItemsHorizontal.razor
@@ -0,0 +1,78 @@
+@namespace Oqtane.Themes.Controls
+
+@inherits MenuItemsBase
+
+@if (ParentPage != null)
+{
+
+}
+else
+{
+
+}
\ No newline at end of file
diff --git a/Oqtane.Client/Themes/Controls/MenuItemsHorizontal.razor.cs b/Oqtane.Client/Themes/Controls/MenuItemsHorizontal.razor.cs
new file mode 100644
index 00000000..30226bfb
--- /dev/null
+++ b/Oqtane.Client/Themes/Controls/MenuItemsHorizontal.razor.cs
@@ -0,0 +1,6 @@
+namespace Oqtane.Themes.Controls
+{
+ public partial class MenuItemsHorizontal : MenuItemsBase
+ {
+ }
+}
diff --git a/Oqtane.Client/Themes/Controls/MenuItemsVertical.razor b/Oqtane.Client/Themes/Controls/MenuItemsVertical.razor
new file mode 100644
index 00000000..ab6c92d8
--- /dev/null
+++ b/Oqtane.Client/Themes/Controls/MenuItemsVertical.razor
@@ -0,0 +1,62 @@
+@namespace Oqtane.Themes.Controls
+
+@inherits MenuItemsBase
+
+@if (ParentPage != null)
+{
+ foreach (var childPage in GetChildPages())
+ {
+ if (childPage.PageId == PageState.Page.PageId)
+ {
+
+
+
+ @childPage.Name (current)
+
+
+ }
+ else
+ {
+
+
+
+ @childPage.Name
+
+
+ }
+ if (Pages.Any(e => e.ParentId == childPage.PageId))
+ {
+
+ }
+ }
+}
+else
+{
+
+}
\ No newline at end of file
diff --git a/Oqtane.Client/Themes/Controls/MenuItemsVertical.razor.cs b/Oqtane.Client/Themes/Controls/MenuItemsVertical.razor.cs
new file mode 100644
index 00000000..85ba00b8
--- /dev/null
+++ b/Oqtane.Client/Themes/Controls/MenuItemsVertical.razor.cs
@@ -0,0 +1,6 @@
+namespace Oqtane.Themes.Controls
+{
+ public partial class MenuItemsVertical : MenuItemsBase
+ {
+ }
+}
diff --git a/Oqtane.Client/Themes/Controls/MenuVertical.razor b/Oqtane.Client/Themes/Controls/MenuVertical.razor
index 79b20589..a552ea11 100644
--- a/Oqtane.Client/Themes/Controls/MenuVertical.razor
+++ b/Oqtane.Client/Themes/Controls/MenuVertical.razor
@@ -10,25 +10,7 @@
}