diff --git a/.github/workflows/GithubActionsWIP.yml b/.github/workflows/GithubActionsWIP.yml
index b3f58e2a9..58706c658 100644
--- a/.github/workflows/GithubActionsWIP.yml
+++ b/.github/workflows/GithubActionsWIP.yml
@@ -229,7 +229,7 @@ jobs:
# The current version of Material.Blazor is viewable on GH-pages in addition to material-blazor.com
############################################################################################################
deployghpages-mbcurrent:
- name: Deploy to GitHub pages (Material-Blazor/Material.Blazor.Current)
+ name: Deploy to GH pages (MB.Current)
needs: [test, build-documentation, build-website, deployment-allowed-mb]
runs-on: ubuntu-latest
@@ -405,7 +405,7 @@ jobs:
# Build documentation
############################################################################################################
build-documentation-MD3:
- name: Build documentation
+ name: Build documentation MD3
runs-on: windows-latest
needs: [build-allowed]
@@ -540,7 +540,7 @@ jobs:
# The current version of Material.Blazor is viewable on GH-pages in addition to material-blazor.com
############################################################################################################
deployghpages-mbcurrent-MD3:
- name: Deploy to GitHub pages (Material-Blazor/Material.Blazor.MD3.Current)
+ name: Deploy to GH pages (MB.MD3.Current)
needs: [test, build-website-MD3, build-documentation-MD3, deployment-allowed-mb]
runs-on: ubuntu-latest
diff --git a/.gitignore b/.gitignore
index 9eb975c78..6ac2707c4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,10 +1,14 @@
## Ignore temporary files and build results specific to M.B
#Generated CSS and JS files
-**/Material.Blazor/wwwroot/*.*
-**/Material.Blazor.Website/wwwroot/css/*.*
-**/Material.Blazor.MD3/wwwroot/*.*
-**/Material.Blazor.Website.MD3/wwwroot/css/*.*
+**/Material.Blazor/wwwroot/*.css
+**/Material.Blazor/wwwroot/*.js
+**/Material.Blazor.Website/wwwroot/*.css
+**/Material.Blazor.Website/wwwroot/*.js
+**/Material.Blazor.MD3/wwwroot/*.css
+**/Material.Blazor.MD3/wwwroot/*.js
+**/Material.Blazor.Website.MD3/wwwroot/css/*.css
+**/Material.Blazor.Website.MD3/wwwroot/css/*.js
# DocFx tool
!**/DocFx/*.*
diff --git a/LocalBuild.cmd b/LocalBuild.cmd
index 574b15e93..a478e49d8 100644
--- a/LocalBuild.cmd
+++ b/LocalBuild.cmd
@@ -1,6 +1,6 @@
@echo off
set argVersion=%1
-if "%1" == "" set argVersion=5.0.0-rc3
+if "%1" == "" set argVersion=5.0.3
set argDestination=%2
if "%2" == "" set argDestination="c:\solutions\local nuget packages"
diff --git a/Material.Blazor.MD3/Articles/CoreComponents.md b/Material.Blazor.MD3/Articles/CoreComponents.md
index 14145d586..cd649b2d7 100644
--- a/Material.Blazor.MD3/Articles/CoreComponents.md
+++ b/Material.Blazor.MD3/Articles/CoreComponents.md
@@ -24,4 +24,5 @@ Material Web implements web components which implement the components defined in
| [MBSelect](xref:C.MBSelect) | [select](https://material-web.dev/components/select/) |
| [MBSlider](xref:C.MBSlider) | [slider](https://material-web.dev/components/slider/) |
| [MBSwitch](xref:C.MBSwitch) | [switch](https://material-web.dev/components/switch/) |
+| [MBTabs](xref:C.MBTabs) | [tabs](https://material-web.dev/components/tabs/) |
| [MBTextField](xref:C.MBTextField) | [text-field](https://material-web.dev/components/text-field/) |
diff --git a/Material.Blazor.MD3/Components/Dialog/MBDialog.cs b/Material.Blazor.MD3/Components/Dialog/MBDialog.cs
index a111dbdf0..f572bf6ed 100644
--- a/Material.Blazor.MD3/Components/Dialog/MBDialog.cs
+++ b/Material.Blazor.MD3/Components/Dialog/MBDialog.cs
@@ -25,13 +25,6 @@ public class MBDialog : ComponentFoundation
///
[Parameter] public MBDialogButton[] ButtonItems { get; set; }
- ///
- /// A unique ID for the dialog
- /// Can be accomplished with careful naming or something like
- /// "dialog-id-" + Guid.NewGuid().ToString().ToLower();
- ///
- [Parameter, EditorRequired] public string DialogId { get; set; }
-
///
/// The action returned by the dialog when the escape key is pressed. Defaults to "close". Setting
/// this to "" will disable the escape key action.
@@ -39,31 +32,26 @@ public class MBDialog : ComponentFoundation
[Parameter] public string EscapeKeyAction { get; set; } = "close";
///
- /// Render fragment for the dialog header.
+ /// The dialog title.
///
- [Parameter] public RenderFragment Header { get; set; }
+ [Parameter] public string Headline { get; set; }
///
- /// The action returned by the dialog when the scrim is clicked. Defaults to "close". Setting
- /// this to "" will disable scrim click action.
+ /// The icon attributes.
///
- [Parameter] public string ScrimClickAction { get; set; } = "close";
+ [Parameter] public MBIconDescriptor IconDescriptor { get; set; }
///
- /// The dialog title.
+ /// The action returned by the dialog when the scrim is clicked. Defaults to "close". Setting
+ /// this to "" will disable scrim click action.
///
- [Parameter] public string Title { get; set; }
+ [Parameter] public string ScrimClickAction { get; set; } = "close";
private TaskCompletionSource CloseReasonTaskCompletionSource { get; set; }
- private bool HasBody => Body != null || false;
- private bool HasButtons => ButtonItems != null || false;
- private bool HasHeader => Header != null;
- private bool HasTitle => !string.IsNullOrWhiteSpace(Title);
- private string IdBody { get; } = Utilities.GenerateUniqueElementName();
- private string IdHeader { get; } = Utilities.GenerateUniqueElementName();
- private string IdTitle { get; } = Utilities.GenerateUniqueElementName();
+ private string DialogId { get; set; } = "dialog-id-" + Guid.NewGuid().ToString().ToLower();
+ private string FormId { get; set; } = "form-id-" + Guid.NewGuid().ToString().ToLower();
private bool IsOpen { get; set; }
private TaskCompletionSource OpenedTaskCompletionSource { get; set; } = new();
internal Task Opened => OpenedTaskCompletionSource.Task;
@@ -86,52 +74,44 @@ protected override void BuildRenderTree(RenderTreeBuilder builder)
builder.AddMultipleAttributes(rendSeq++, attributesToSplat);
}
- if (HasHeader || HasTitle)
+ if (IconDescriptor is not null)
+ {
+ MBIcon.BuildRenderTreeWorker(
+ builder,
+ ref rendSeq,
+ CascadingDefaults,
+ attributesToSplat,
+ "",
+ "",
+ "",
+ IconDescriptor,
+ "icon");
+ }
+
+ if (!string.IsNullOrWhiteSpace(Headline))
{
builder.OpenElement(rendSeq++, "div");
{
- builder.AddAttribute(rendSeq++, "slot", "header");
-
- if (HasHeader)
- {
- builder.OpenElement(rendSeq++, "div");
- {
- builder.AddContent(rendSeq++, Header);
- }
- builder.CloseElement();
- }
- else
- {
- builder.OpenElement(rendSeq++, "div");
- {
- builder.AddContent(rendSeq++, Title);
- }
- builder.CloseElement();
- }
+ builder.AddAttribute(rendSeq++, "slot", "headline");
+ builder.AddContent(rendSeq++, Headline);
}
builder.CloseElement();
}
- }
- builder.CloseElement();
- }
- #endregion
-
- #region HideAsync
+ if (Body is not null)
+ {
+ builder.OpenElement(rendSeq++, "form");
+ {
+ builder.AddAttribute(rendSeq++, "id", FormId);
+ builder.AddAttribute(rendSeq++, "slot", "content");
+ builder.AddAttribute(rendSeq++, "method", "dialog");
- ///
- /// Hides the dialog by allowing Material Theme to close it gracefully.
- ///
- public async Task HideAsync()
- {
- if (IsOpen)
- {
- await InvokeJsVoidAsync("MaterialBlazor.MBDialog.dialogHide", DialogId);
- }
- else
- {
- throw new InvalidOperationException("Cannot hide MBDialog that is not already open");
+ builder.AddContent(rendSeq++, Body);
+ }
+ builder.CloseElement();
+ }
}
+ builder.CloseElement();
}
#endregion
diff --git a/Material.Blazor.MD3/Components/Dialog/MBDialog.scss b/Material.Blazor.MD3/Components/Dialog/MBDialog.scss
deleted file mode 100644
index e288e0209..000000000
--- a/Material.Blazor.MD3/Components/Dialog/MBDialog.scss
+++ /dev/null
@@ -1,14 +0,0 @@
-.mb-dialog-overflow-visible.mdc-dialog__surface, .mb-dialog-overflow-visible.mdc-dialog__surface .mdc-dialog__content {
- overflow: visible !important;
-}
-
-.mb-dialog__header {
- padding-bottom: 0px;
- padding-left: 24px;
- padding-right: 24px;
- padding-top: 0px;
-
- .mdc-dialog__title {
- padding-left: 0px;
- }
-}
diff --git a/Material.Blazor.MD3/Components/Dialog/MBDialog.ts b/Material.Blazor.MD3/Components/Dialog/MBDialog.ts
index 5e9a042d6..1d522f42c 100644
--- a/Material.Blazor.MD3/Components/Dialog/MBDialog.ts
+++ b/Material.Blazor.MD3/Components/Dialog/MBDialog.ts
@@ -1,13 +1,5 @@
-export function dialogShow(dialogID: string) {
- const dialogElement: any | null = document.getElementById(dialogID);
- if (dialogElement != null) {
- dialogElement.open();
- }
-}
+import { MdDialog } from '@material/web/dialog/dialog';
-export function dialogHide(dialogID: string) {
- const dialogElement: any | null = document.getElementById(dialogID);
- if (dialogElement != null) {
- dialogElement.close();
- }
+export function dialogShow(dialogID: string) {
+ (document.getElementById(dialogID) as MdDialog)?.show();
}
diff --git a/Material.Blazor.MD3/Components/List/MBList.cs b/Material.Blazor.MD3/Components/List/MBList.cs
index cf530d012..ea05005e4 100644
--- a/Material.Blazor.MD3/Components/List/MBList.cs
+++ b/Material.Blazor.MD3/Components/List/MBList.cs
@@ -41,99 +41,82 @@ protected override void BuildRenderTree(RenderTreeBuilder builder)
if (ListItems is not null)
{
- builder.OpenElement(rendSeq++, "md-list-item");
+ foreach (var listItem in ListItems)
{
- foreach (var listItem in ListItems)
+ switch (listItem.ListItemType)
{
- switch (listItem.ListItemType)
- {
- case MBListItemType.Divider:
- builder.OpenElement(rendSeq++, "md-divider");
- builder.CloseElement();
- break;
-
- case MBListItemType.Regular:
- default:
- builder.OpenElement(rendSeq++, "md-list-item");
+ case MBListItemType.Divider:
+ builder.OpenElement(rendSeq++, "md-divider");
+ builder.CloseElement();
+ break;
+
+ case MBListItemType.Regular:
+ default:
+ builder.OpenElement(rendSeq++, "md-list-item");
+ {
+ if (listItem.IsDisabled)
{
- if (listItem.IsDisabled)
- {
- builder.AddAttribute(rendSeq++, "disabled");
- }
+ builder.AddAttribute(rendSeq++, "disabled");
+ }
- if (!string.IsNullOrWhiteSpace(listItem.Link))
- {
- builder.AddAttribute(rendSeq++, "interactive");
+ if (!string.IsNullOrWhiteSpace(listItem.Link))
+ {
+ builder.AddAttribute(rendSeq++, "interactive");
- builder.AddAttribute(rendSeq++, "href", listItem.Link);
+ builder.AddAttribute(rendSeq++, "href", listItem.Link);
- if (!string.IsNullOrWhiteSpace(listItem.LinkTarget))
- {
- builder.AddAttribute(rendSeq++, "target", listItem.LinkTarget);
- }
- }
-
- if (!string.IsNullOrWhiteSpace(listItem.Headline))
+ if (!string.IsNullOrWhiteSpace(listItem.LinkTarget))
{
- builder.OpenElement(rendSeq++, "div");
- {
- if (!string.IsNullOrWhiteSpace(listItem.HeadlineColor))
- {
- builder.AddAttribute(rendSeq++, "style", "color: " + listItem.HeadlineColor + "; ");
- }
- builder.AddAttribute(rendSeq++, "slot", "headline");
- builder.AddContent(rendSeq++, listItem.Headline);
- }
- builder.CloseElement();
+ builder.AddAttribute(rendSeq++, "target", listItem.LinkTarget);
}
+ }
- if (!string.IsNullOrWhiteSpace(listItem.HeadlineSupport))
+ if (!string.IsNullOrWhiteSpace(listItem.Headline))
+ {
+ builder.OpenElement(rendSeq++, "div");
{
- builder.OpenElement(rendSeq++, "div");
+ if (!string.IsNullOrWhiteSpace(listItem.HeadlineColor))
{
- if (!string.IsNullOrWhiteSpace(listItem.HeadlineSupportColor))
- {
- builder.AddAttribute(rendSeq++, "style", "color: " + listItem.HeadlineSupportColor + "; ");
- }
- builder.AddAttribute(rendSeq++, "slot", "supporting-text");
- builder.AddContent(rendSeq++, listItem.HeadlineSupport);
+ builder.AddAttribute(rendSeq++, "style", "color: " + listItem.HeadlineColor + "; ");
}
- builder.CloseElement();
+ builder.AddAttribute(rendSeq++, "slot", "headline");
+ builder.AddContent(rendSeq++, listItem.Headline);
}
+ builder.CloseElement();
+ }
- // Two users of the "start" slot; image wins
- if (!string.IsNullOrWhiteSpace(listItem.ImageSource))
+ if (!string.IsNullOrWhiteSpace(listItem.HeadlineSupport))
+ {
+ builder.OpenElement(rendSeq++, "div");
{
- builder.OpenElement(rendSeq++, "img");
+ if (!string.IsNullOrWhiteSpace(listItem.HeadlineSupportColor))
{
- builder.AddAttribute(rendSeq++, "slot", "start");
- builder.AddAttribute(rendSeq++, "src", listItem.ImageSource);
- if (!string.IsNullOrWhiteSpace(listItem.ImageStyle))
- {
- builder.AddAttribute(rendSeq++, "style", listItem.ImageStyle);
- }
-
+ builder.AddAttribute(rendSeq++, "style", "color: " + listItem.HeadlineSupportColor + "; ");
}
- builder.CloseElement();
+ builder.AddAttribute(rendSeq++, "slot", "supporting-text");
+ builder.AddContent(rendSeq++, listItem.HeadlineSupport);
}
- else
+ builder.CloseElement();
+ }
+
+ // Two users of the "start" slot; image wins
+ if (!string.IsNullOrWhiteSpace(listItem.ImageSource))
+ {
+ builder.OpenElement(rendSeq++, "img");
{
- if (listItem.LeadingIcon is not null)
+ builder.AddAttribute(rendSeq++, "slot", "start");
+ builder.AddAttribute(rendSeq++, "src", listItem.ImageSource);
+ if (!string.IsNullOrWhiteSpace(listItem.ImageStyle))
{
- MBIcon.BuildRenderTreeWorker(
- builder,
- ref rendSeq,
- CascadingDefaults,
- null,
- null,
- null,
- null,
- listItem.LeadingIcon,
- "start");
+ builder.AddAttribute(rendSeq++, "style", listItem.ImageStyle);
}
- }
- if (listItem.TrailingIcon is not null)
+ }
+ builder.CloseElement();
+ }
+ else
+ {
+ if (listItem.LeadingIcon is not null)
{
MBIcon.BuildRenderTreeWorker(
builder,
@@ -143,17 +126,30 @@ protected override void BuildRenderTree(RenderTreeBuilder builder)
null,
null,
null,
- listItem.TrailingIcon,
- "end");
+ listItem.LeadingIcon,
+ "start");
}
+ }
+ if (listItem.TrailingIcon is not null)
+ {
+ MBIcon.BuildRenderTreeWorker(
+ builder,
+ ref rendSeq,
+ CascadingDefaults,
+ null,
+ null,
+ null,
+ null,
+ listItem.TrailingIcon,
+ "end");
}
- builder.CloseElement();
- break;
- }
+
+ }
+ builder.CloseElement();
+ break;
}
}
- builder.CloseElement();
}
}
builder.CloseElement();
diff --git a/Material.Blazor.MD3/Components/Menu/MBMenu.cs b/Material.Blazor.MD3/Components/Menu/MBMenu.cs
index 716a78da3..0b003264d 100644
--- a/Material.Blazor.MD3/Components/Menu/MBMenu.cs
+++ b/Material.Blazor.MD3/Components/Menu/MBMenu.cs
@@ -1,184 +1,205 @@
using Material.Blazor.Internal;
+using Material.Blazor.MenuClose;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Rendering;
+using Microsoft.AspNetCore.Components.Web;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
-namespace Material.Blazor
+namespace Material.Blazor;
+
+public class MBMenu : ComponentFoundation
{
- public class MBMenu : ComponentFoundation
- {
- #region members
+ #region members
- ///
- /// The icon on the button used to invoke the menu.
- ///
- [Parameter] public MBIconDescriptor ButtonIconDescriptor { get; set; }
+ ///
+ /// The icon on the button used to invoke the menu.
+ ///
+ [Parameter] public MBIconDescriptor ButtonIconDescriptor { get; set; }
- ///
- /// The location of the icon on the button used to invoke the menu.
- ///
- [Parameter] public bool ButtonIconIsTrailing { get; set; }
+ ///
+ /// The location of the icon on the button used to invoke the menu.
+ ///
+ [Parameter] public bool ButtonIconIsTrailing { get; set; }
- ///
- /// The style of the button used to invoke the menu.
- ///
- [Parameter] public MBButtonStyle? ButtonStyle { get; set; }
+ ///
+ /// The style of the button used to invoke the menu.
+ ///
+ [Parameter] public MBButtonStyle? ButtonStyle { get; set; }
- ///
- /// The label of the button used to invoke the menu.
- ///
- [Parameter] public string ButtonLabel { get; set; }
+ ///
+ /// The label of the button used to invoke the menu.
+ ///
+ [Parameter] public string ButtonLabel { get; set; }
- ///
- /// The label color of the button used to invoke the menu.
- ///
- [Parameter] public string ButtonLabelColor { get; set; }
+ ///
+ /// The label color of the button used to invoke the menu.
+ ///
+ [Parameter] public string ButtonLabelColor { get; set; }
- ///
- /// The list of menu items.
- ///
- [Parameter] public MBMenuItem[] MenuItems { get; set; }
+ ///
+ /// The list of menu items.
+ ///
+ [Parameter] public MBMenuItem[] MenuItems { get; set; }
+ ///
+ /// Sets the menu positioning attribute
+ ///
+ [Parameter] public MBMenuPositioning MenuPositioning { get; set; } = MBMenuPositioning.Relative;
- private string MenuButtonId { get; set; }
- private string MenuId { get; set; }
- #endregion
+ private string MenuButtonId { get; set; }
+ private string MenuId { get; set; }
- #region BuildRenderTree
+ #endregion
- protected override void BuildRenderTree(RenderTreeBuilder builder)
- {
- MenuId = "menu-id-" + Guid.NewGuid().ToString().ToLower();
- MenuButtonId = "menu-button-id-" + Guid.NewGuid().ToString().ToLower();
+ #region BuildRenderTree
+
+ protected override void BuildRenderTree(RenderTreeBuilder builder)
+ {
+ MenuId = "menu-id-" + Guid.NewGuid().ToString().ToLower();
+ MenuButtonId = "menu-button-id-" + Guid.NewGuid().ToString().ToLower();
- var attributesToSplat = AttributesToSplat().ToArray();
+ var attributesToSplat = AttributesToSplat().ToArray();
- var rendSeq = 0;
+ var rendSeq = 0;
- builder.OpenElement(rendSeq++, "span");
+ builder.OpenElement(rendSeq++, "span");
+ {
+ builder.AddAttribute(rendSeq++, "class", @ActiveConditionalClasses + @class);
+ builder.AddAttribute(rendSeq++, "style", @style + " position: relative; ");
+ builder.AddAttribute(rendSeq++, "id", id);
+ if (attributesToSplat.Any())
{
- builder.AddAttribute(rendSeq++, "class", @ActiveConditionalClasses + @class);
- builder.AddAttribute(rendSeq++, "style", @style + " position: relative; ");
- builder.AddAttribute(rendSeq++, "id", id);
- if (attributesToSplat.Any())
- {
- builder.AddMultipleAttributes(rendSeq++, attributesToSplat);
- }
+ builder.AddMultipleAttributes(rendSeq++, attributesToSplat);
+ }
- builder.OpenComponent(rendSeq++, typeof(MBButton));
- {
- builder.AddComponentParameter(rendSeq++, "Label", ButtonLabel);
- builder.AddComponentParameter(rendSeq++, "ButtonStyle", ButtonStyle);
- builder.AddComponentParameter(rendSeq++, "IconDescriptor", ButtonIconDescriptor);
- builder.AddComponentParameter(rendSeq++, "IconIsTrailing", ButtonIconIsTrailing);
- builder.AddAttribute(rendSeq++, "id", MenuButtonId);
- builder.AddAttribute(rendSeq++, "style", "color: " + ButtonLabelColor + ";");
- }
- builder.CloseComponent();
+ builder.OpenComponent(rendSeq++, typeof(MBButton));
+ {
+ builder.AddComponentParameter(rendSeq++, "Label", ButtonLabel);
+ builder.AddComponentParameter(rendSeq++, "ButtonStyle", ButtonStyle);
+ builder.AddComponentParameter(rendSeq++, "IconDescriptor", ButtonIconDescriptor);
+ builder.AddComponentParameter(rendSeq++, "IconIsTrailing", ButtonIconIsTrailing);
+ builder.AddAttribute(rendSeq++, "id", MenuButtonId);
+ builder.AddAttribute(rendSeq++, "style", "color: " + ButtonLabelColor + ";");
+ }
+ builder.CloseComponent();
- builder.OpenElement(rendSeq++, "md-menu");
- {
- builder.AddAttribute(rendSeq++, "anchor", MenuButtonId);
- builder.AddAttribute(rendSeq++, "id", MenuId);
+ builder.OpenElement(rendSeq++, "md-menu");
+ {
+ builder.AddAttribute(rendSeq++, "anchor", MenuButtonId);
+ builder.AddAttribute(rendSeq++, "id", MenuId);
+ //builder.AddAttribute(rendSeq++, "onmenu-close", EventCallback.Factory.Create(this, OnMenuCloseInternal));
+ builder.AddAttribute(rendSeq++, "positioning", MenuPositioning.ToString().ToLower());
- if (MenuItems is not null)
+ if (MenuItems is not null)
+ {
+ foreach (var menuItem in MenuItems)
{
- foreach (var menuItem in MenuItems)
+ switch (menuItem.MenuItemType)
{
- switch (menuItem.MenuItemType)
- {
- case MBMenuItemType.BeginSubMenu:
- break;
-
- case MBMenuItemType.Divider:
- builder.OpenElement(rendSeq++, "md-divider");
- builder.CloseElement();
- break;
-
- case MBMenuItemType.EndSubMenu:
- break;
-
- case MBMenuItemType.Regular:
- default:
- builder.OpenElement(rendSeq++, "md-menu-item");
+ case MBMenuItemType.BeginSubMenu:
+ break;
+
+ case MBMenuItemType.Divider:
+ builder.OpenElement(rendSeq++, "md-divider");
+ builder.CloseElement();
+ break;
+
+ case MBMenuItemType.EndSubMenu:
+ break;
+
+ case MBMenuItemType.Regular:
+ default:
+ builder.OpenElement(rendSeq++, "md-menu-item");
+ {
+ if (menuItem.IsDisabled)
{
- if (menuItem.IsDisabled)
- {
- builder.AddAttribute(rendSeq++, "disabled");
- }
+ builder.AddAttribute(rendSeq++, "disabled");
+ }
- if (menuItem.Headline.Length > 0)
+ if (menuItem.Headline.Length > 0)
+ {
+ builder.OpenElement(rendSeq++, "div");
{
- builder.OpenElement(rendSeq++, "div");
+ if (menuItem.HeadlineColor.Length > 0)
{
- if (menuItem.HeadlineColor.Length > 0)
- {
- builder.AddAttribute(rendSeq++, "style", "color: " + menuItem.HeadlineColor + "; ");
- }
- builder.AddAttribute(rendSeq++, "slot", "headline");
- builder.AddContent(rendSeq++, menuItem.Headline);
+ builder.AddAttribute(rendSeq++, "style", "color: " + menuItem.HeadlineColor + "; ");
}
- builder.CloseElement();
+ builder.AddAttribute(rendSeq++, "slot", "headline");
+ builder.AddContent(rendSeq++, menuItem.Headline);
+ }
+ builder.CloseElement();
- if (menuItem.LeadingIcon is not null && !menuItem.SuppressLeadingIcon)
- {
- MBIcon.BuildRenderTreeWorker(
- builder,
- ref rendSeq,
- CascadingDefaults,
- null,
- null,
- null,
- null,
- menuItem.LeadingIcon,
- "start");
- }
+ if (menuItem.LeadingIcon is not null && !menuItem.SuppressLeadingIcon)
+ {
+ MBIcon.BuildRenderTreeWorker(
+ builder,
+ ref rendSeq,
+ CascadingDefaults,
+ null,
+ null,
+ null,
+ null,
+ menuItem.LeadingIcon,
+ "start");
+ }
- if (menuItem.TrailingIcon is not null)
- {
- MBIcon.BuildRenderTreeWorker(
- builder,
- ref rendSeq,
- CascadingDefaults,
- null,
- null,
- null,
- null,
- menuItem.TrailingIcon,
- "end");
- }
+ if (menuItem.TrailingIcon is not null)
+ {
+ MBIcon.BuildRenderTreeWorker(
+ builder,
+ ref rendSeq,
+ CascadingDefaults,
+ null,
+ null,
+ null,
+ null,
+ menuItem.TrailingIcon,
+ "end");
}
}
- builder.CloseComponent();
- break;
- }
+ }
+ builder.CloseComponent();
+ break;
}
}
}
- builder.CloseElement();
}
builder.CloseElement();
-
}
+ builder.CloseElement();
+
+ }
- #endregion
+ #endregion
- #region OnAfterRenderAsync
+ #region OnAfterRenderAsync
- protected override async Task OnAfterRenderAsync(bool firstRender)
+ protected override async Task OnAfterRenderAsync(bool firstRender)
+ {
+ await base.OnAfterRenderAsync(firstRender);
+ if (firstRender)
{
- await base.OnAfterRenderAsync(firstRender);
await InvokeJsVoidAsync("MaterialBlazor.MBMenu.toggleMenuOpen", MenuButtonId, MenuId).ConfigureAwait(false);
+ await InvokeJsVoidAsync("MaterialBlazor.MBMenu.setMenuCloseEvent", MenuId).ConfigureAwait(false);
}
+ }
- #endregion
+ #endregion
+ #region OnMenuCloseInternal
+
+ private async Task OnMenuCloseInternal(MenuCloseEventArgs args)
+ {
+ await Task.CompletedTask;
}
+
+ #endregion
+
}
diff --git a/Material.Blazor.MD3/Components/Menu/MBMenu.ts b/Material.Blazor.MD3/Components/Menu/MBMenu.ts
index d5b3527f6..df9aa44ad 100644
--- a/Material.Blazor.MD3/Components/Menu/MBMenu.ts
+++ b/Material.Blazor.MD3/Components/Menu/MBMenu.ts
@@ -1,7 +1,26 @@
-export function toggleMenuOpen(menuButtonID: string, menuID: string) {
+import { CloseMenuEvent } from '@material/web/menu/internal/controllers/shared.js';
+
+function reportMenuCloseEvent() {
+ console.log("Menu close event");
+}
+
+//function reportMenuCloseEvent(cme: CloseMenuEvent) {
+// console.log("Menu close event");
+//}
+
+export function setMenuCloseEvent(menuID: string) {
+ const menuElement: any | null = document.getElementById(menuID);
+ if (menuElement != null) {
+ console.log("Adding listener for menu-close events");
+ menuElement.addEventListener('menu-close', () => { reportMenuCloseEvent(); });
+ }
+}
+
+export function toggleMenuOpen(menuButtonID: string, menuID: string) {
const buttonElement: HTMLElement | null = document.getElementById(menuButtonID);
const menuElement: any | null = document.getElementById(menuID);
if ((buttonElement != null) && (menuElement != null)) {
+ console.log("Adding listener for click events");
buttonElement.addEventListener('click', () => { menuElement.open = !menuElement.open; });
}
}
diff --git a/Material.Blazor.MD3/Components/Menu/MBMenuCloseMenuCustomEvent.cs b/Material.Blazor.MD3/Components/Menu/MBMenuCloseMenuCustomEvent.cs
new file mode 100644
index 000000000..0f8ea075a
--- /dev/null
+++ b/Material.Blazor.MD3/Components/Menu/MBMenuCloseMenuCustomEvent.cs
@@ -0,0 +1,12 @@
+using Microsoft.AspNetCore.Components;
+
+namespace Material.Blazor.MenuClose;
+
+[EventHandler(
+ attributeName: "onmenuclose",
+ eventArgsType: typeof(MenuCloseEventArgs),
+ enableStopPropagation: true,
+ enablePreventDefault: true)]
+public static class EventHandlers
+{
+}
diff --git a/Material.Blazor.MD3/Components/Menu/MBMenuEvents.cs b/Material.Blazor.MD3/Components/Menu/MBMenuEvents.cs
new file mode 100644
index 000000000..4af1fd5bc
--- /dev/null
+++ b/Material.Blazor.MD3/Components/Menu/MBMenuEvents.cs
@@ -0,0 +1,17 @@
+using System;
+
+namespace Material.Blazor.MenuClose;
+
+
+/*
+** MW3 menu-close event arguments
+**
+** This must match the ts definition found in material.blazor.custom.events.ts
+*/
+public class MenuCloseEventArgs : EventArgs
+{
+#pragma warning disable CS8632 // The annotation for nullable reference types should only be used in code within a '#nullable' annotations context.
+ public string? CustomProperty1 { get; set; }
+ public string? CustomProperty2 { get; set; }
+#pragma warning restore CS8632 // The annotation for nullable reference types should only be used in code within a '#nullable' annotations context.
+}
diff --git a/Material.Blazor.MD3/Components/NumericField/MBNumericField.md b/Material.Blazor.MD3/Components/NumericField/MBNumericField.md
index 7dc78e5ff..9bfd28398 100644
--- a/Material.Blazor.MD3/Components/NumericField/MBNumericField.md
+++ b/Material.Blazor.MD3/Components/NumericField/MBNumericField.md
@@ -19,4 +19,6 @@ The following attributes are reserved by Material Components Web and will be ign
[![Docs](https://img.shields.io/static/v1?label=API%20Documentation&message=MBDecimalField&color=brightgreen)](xref:Material.Blazor.MBDecimalField)
[![Docs](https://img.shields.io/static/v1?label=API%20Documentation&message=MBDoubleField&color=brightgreen)](xref:Material.Blazor.MBDoubleField)
[![Docs](https://img.shields.io/static/v1?label=API%20Documentation&message=MBIntField&color=brightgreen)](xref:Material.Blazor.MBIntField)
-[![Docs](https://img.shields.io/static/v1?label=API%20Documentation&message=InternalNumericFieldBase&color=brightgreen)](xref:Material.Blazor.InternalNumericFieldBase)
+[![Docs](https://img.shields.io/static/v1?label=API%20Documentation&message=InternalFloatingPointFieldBase&color=brightgreen)](xref:Material.Blazor.Internal.InternalFloatingPointFieldBase)
+[![Docs](https://img.shields.io/static/v1?label=API%20Documentation&message=InternalIntFieldBase&color=brightgreen)](xref:Material.Blazor.Internal.InternalIntFieldBase)
+[![Docs](https://img.shields.io/static/v1?label=API%20Documentation&message=InternalNumericFieldBase&color=brightgreen)](xref:Material.Blazor.Internal.InternalNumericFieldBase)
diff --git a/Material.Blazor.MD3/Components/RadioButtonGroup/MBRadioButtonGroup.cs b/Material.Blazor.MD3/Components/RadioButtonGroup/MBRadioButtonGroup.cs
index bd54572c0..684cd8943 100644
--- a/Material.Blazor.MD3/Components/RadioButtonGroup/MBRadioButtonGroup.cs
+++ b/Material.Blazor.MD3/Components/RadioButtonGroup/MBRadioButtonGroup.cs
@@ -44,7 +44,12 @@ protected override void BuildRenderTree(RenderTreeBuilder builder)
builder.OpenElement(rendSeq++, "div");
{
builder.AddAttribute(rendSeq++, "class", @ActiveConditionalClasses + @class);
- builder.AddAttribute(rendSeq++, "style", @style);
+ var additionalStyle = IsHorizontal switch
+ {
+ true => "display: flex; flex-direction: row; flex-grow: 0; align-items: flex-start; ",
+ false => "display: flex; flex-direction: column; flex-grow: 0; align-items: flex-start;"
+ };
+ builder.AddAttribute(rendSeq++, "style", additionalStyle + @style);
builder.AddAttribute(rendSeq++, "id", id);
if (attributesToSplat.Any())
{
diff --git a/Material.Blazor.MD3/Components/RadioButtonGroup/MBRadioButtonGroup.scss b/Material.Blazor.MD3/Components/RadioButtonGroup/MBRadioButtonGroup.scss
deleted file mode 100644
index 9ec387920..000000000
--- a/Material.Blazor.MD3/Components/RadioButtonGroup/MBRadioButtonGroup.scss
+++ /dev/null
@@ -1,13 +0,0 @@
-.mb-radiobuttongroup__horizontal {
- display: flex;
- flex-direction: row;
- flex-grow: 0;
- align-items: flex-start;
-}
-
-.mb-radiobuttongroup__vertical {
- display: flex;
- flex-direction: column;
- flex-grow: 0;
- align-items: flex-start;
-}
diff --git a/Material.Blazor.MD3/Components/Tabs/MBTabItem.cs b/Material.Blazor.MD3/Components/Tabs/MBTabItem.cs
new file mode 100644
index 000000000..114f1d13e
--- /dev/null
+++ b/Material.Blazor.MD3/Components/Tabs/MBTabItem.cs
@@ -0,0 +1,18 @@
+namespace Material.Blazor
+{
+ public record MBTabItem
+ {
+ #region members
+
+ public string Headline { get; set; } = "";
+ public bool IconIsInline { get; set; } = false;
+ public bool IsActive { get; set; } = false;
+ public bool IsDisabled { get; set; } = false;
+ public bool IsPrimary { get; set; } = true;
+ public MBIconDescriptor Icon { get; set; } = null;
+ public string TabAriaControls { get; set; } = null;
+ public string TabId { get; set; } = null;
+
+ #endregion
+ }
+}
diff --git a/Material.Blazor.MD3/Components/Tabs/MBTabs.cs b/Material.Blazor.MD3/Components/Tabs/MBTabs.cs
new file mode 100644
index 000000000..0c38f05ca
--- /dev/null
+++ b/Material.Blazor.MD3/Components/Tabs/MBTabs.cs
@@ -0,0 +1,103 @@
+using Material.Blazor.Internal;
+
+using Microsoft.AspNetCore.Components;
+using Microsoft.AspNetCore.Components.Rendering;
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace Material.Blazor
+{
+ public class MBTabs : ComponentFoundation
+ {
+ #region members
+
+ ///
+ /// The array of tab items.
+ ///
+ [Parameter] public MBTabItem[] TabItems { get; set; }
+
+ #endregion
+
+ #region BuildRenderTree
+
+ protected override void BuildRenderTree(RenderTreeBuilder builder)
+ {
+ var attributesToSplat = AttributesToSplat().ToArray();
+
+ var rendSeq = 0;
+
+ builder.OpenElement(rendSeq++, "md-tabs");
+ {
+ builder.AddAttribute(rendSeq++, "class", @ActiveConditionalClasses + @class);
+ builder.AddAttribute(rendSeq++, "style", @style + " position: relative; ");
+ builder.AddAttribute(rendSeq++, "id", id);
+ if (attributesToSplat.Any())
+ {
+ builder.AddMultipleAttributes(rendSeq++, attributesToSplat);
+ }
+
+ if (TabItems is not null)
+ {
+ foreach (var tabItem in TabItems)
+ {
+ var componentName = tabItem.IsPrimary switch
+ {
+ true => "md-primary-tab",
+ _ => "md-secondary-tab"
+ };
+
+ builder.OpenElement(rendSeq++, componentName);
+ {
+ if (!string.IsNullOrEmpty(tabItem.TabId))
+ {
+ builder.AddAttribute(rendSeq++, "id", tabItem.TabId);
+ }
+
+ if (!string.IsNullOrEmpty(tabItem.TabAriaControls))
+ {
+ builder.AddAttribute(rendSeq++, "aria-controls", tabItem.TabAriaControls);
+ }
+
+ if (tabItem.IsActive)
+ {
+ builder.AddAttribute(rendSeq++, "active");
+ }
+
+ if (tabItem.IconIsInline)
+ {
+ builder.AddAttribute(rendSeq++, "inline-icon");
+ }
+
+ if (tabItem.Headline.Length > 0)
+ {
+ builder.AddContent(rendSeq++, tabItem.Headline);
+ }
+
+ if (tabItem.Icon is not null)
+ {
+ MBIcon.BuildRenderTreeWorker(
+ builder,
+ ref rendSeq,
+ CascadingDefaults,
+ null,
+ null,
+ null,
+ null,
+ tabItem.Icon,
+ "icon");
+ }
+ }
+ builder.CloseElement();
+ }
+ }
+ }
+ builder.CloseElement();
+ }
+
+ #endregion
+
+ }
+}
diff --git a/Material.Blazor.MD3/Components/Tabs/MBTabs.md b/Material.Blazor.MD3/Components/Tabs/MBTabs.md
new file mode 100644
index 000000000..24181e53b
--- /dev/null
+++ b/Material.Blazor.MD3/Components/Tabs/MBTabs.md
@@ -0,0 +1,20 @@
+---
+uid: C.MBTabs
+title: MBTabs
+---
+# MBTabs
+
+## Summary
+
+A simple collection of [MBTabItems](https://material-web.dev/components/Tabs/).
+TabItems are enclosed in a List container and are used to organize application content.
+
+## Reserved Attributes
+
+The following attributes are reserved by Material Components Web and will be ignored if you supply them:
+
+- role
+- type
+
+[![Components](https://img.shields.io/static/v1?label=Components&message=Core&color=blue)](xref:A.CoreComponents)
+[![Docs](https://img.shields.io/static/v1?label=API%20Documentation&message=MBTabs&color=brightgreen)](xref:Material.Blazor.MBTabs)
diff --git a/Material.Blazor.MD3/Components/TextField/MBTextField.md b/Material.Blazor.MD3/Components/TextField/MBTextField.md
index 2eb106495..c1a3da2c2 100644
--- a/Material.Blazor.MD3/Components/TextField/MBTextField.md
+++ b/Material.Blazor.MD3/Components/TextField/MBTextField.md
@@ -22,3 +22,4 @@ The following attributes are reserved by Material Components Web and will be ign
[![Components](https://img.shields.io/static/v1?label=Components&message=Core&color=blue)](xref:A.CoreComponents)
[![Docs](https://img.shields.io/static/v1?label=API%20Documentation&message=MBTextField&color=brightgreen)](xref:Material.Blazor.MBTextField)
+[![Docs](https://img.shields.io/static/v1?label=API%20Documentation&message=InternalTextFieldBase&color=brightgreen)](xref:Material.Blazor.Internal.InternalTextFieldBase)
diff --git a/Material.Blazor.MD3/Components/toc.yml b/Material.Blazor.MD3/Components/toc.yml
index 8c05a88d5..96ec5539e 100644
--- a/Material.Blazor.MD3/Components/toc.yml
+++ b/Material.Blazor.MD3/Components/toc.yml
@@ -58,5 +58,8 @@
- name: MBSwitch
topicUid: C.MBSwitch
+- name: MBTabs
+ topicUid: C.MBTabs
+
- name: MBTextField
topicUid: C.MBTextField
diff --git a/Material.Blazor.MD3/Material.Blazor.MD3.csproj b/Material.Blazor.MD3/Material.Blazor.MD3.csproj
index 77fe9a2f8..c94db2984 100644
--- a/Material.Blazor.MD3/Material.Blazor.MD3.csproj
+++ b/Material.Blazor.MD3/Material.Blazor.MD3.csproj
@@ -32,6 +32,7 @@
+
@@ -47,7 +48,6 @@
-
@@ -55,7 +55,6 @@
-
@@ -69,13 +68,16 @@
+
+ Code
+ Code
-
+
@@ -83,7 +85,15 @@
-
+
+
+
+
+
+
+
+
+
@@ -178,6 +188,8 @@
+
+
@@ -189,6 +201,9 @@
+
+
+
@@ -200,6 +215,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Material.Blazor.MD3/Model/MBEnumerations.cs b/Material.Blazor.MD3/Model/MBEnumerations.cs
index 1fec0b793..df7a1b67b 100644
--- a/Material.Blazor.MD3/Model/MBEnumerations.cs
+++ b/Material.Blazor.MD3/Model/MBEnumerations.cs
@@ -378,6 +378,42 @@ public enum MBMenuItemType
#endregion
+#region MBMenuPositioning
+
+///
+/// Determines the positioning of a menu.
+///
+public enum MBMenuPositioning
+{
+ ///
+ /// Positioned at absolute location relative to the menu button.
+ /// This is the default.
+ ///
+ Absolute,
+
+ ///
+ /// Position is relative to the document
+ ///
+ Document,
+
+ ///
+ /// Fixed position is relative to he document and will not scroll with underlying content
+ ///
+ Fixed,
+
+ ///
+ /// Popover position is on tpo of all other content
+ ///
+ Popover,
+
+ ///
+ ///
+ ///
+ Relative
+}
+
+#endregion
+
#region MBMenuSurfacePositioningMD2
///
diff --git a/Material.Blazor.MD3/Scripts/lodashparts.ts b/Material.Blazor.MD3/Scripts/lodashparts.ts
deleted file mode 100644
index 0774d8090..000000000
--- a/Material.Blazor.MD3/Scripts/lodashparts.ts
+++ /dev/null
@@ -1,384 +0,0 @@
-/**
- * @license
- *
- * This file is based on https://github.com/lodash/lodash and thus licensed as follows.
- * The code & license is based on https://github.com/lodash/lodash/tree/2da024c3b4f9947a48517639de7560457cd4ec6c
- *
- * The MIT License
- *
- * Copyright JS Foundation and other contributors
- *
- * Based on Underscore.js, copyright Jeremy Ashkenas,
- * DocumentCloud and Investigative Reporters & Editors
- *
- * This software consists of voluntary contributions made by many
- * individuals. For exact contribution history, see the revision history
- * available at https://github.com/lodash/lodash
- *
- * The following license applies to all parts of this software except as
- * documented below:
- *
- * ====
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * ====
- *
- * Copyright and related rights for sample code are waived via CC0. Sample
- * code is defined as all source code displayed within the prose of the
- * documentation.
- *
- * CC0: http://creativecommons.org/publicdomain/zero/1.0/
- *
- * ====
- *
- * Files located in the node_modules and vendor directories are externally
- * maintained libraries used by this software which have their own
- * licenses; we recommend you read them, as their terms may differ from the
- * terms above.
- *
- */
-
-//BEGIN https://github.com/lodash/lodash/blob/master/isObject.js
-/**
- * Checks if `value` is the
- * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
- * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
- *
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an object, else `false`.
- * @example
- *
- * isObject({})
- * // => true
- *
- * isObject([1, 2, 3])
- * // => true
- *
- * isObject(Function)
- * // => true
- *
- * isObject(null)
- * // => false
- */
-function isObject(value) {
- const type = typeof value
- return value != null && (type === 'object' || type === 'function')
-}
-//END https://github.com/lodash/lodash/blob/master/isObject.js
-
-//BEGIN https://github.com/lodash/lodash/blob/master/.internal/freeGlobal.js
-const freeGlobal = typeof global === 'object' && global !== null && global.Object === Object && global
-//END https://github.com/lodash/lodash/blob/master/.internal/freeGlobal.js
-
-//BEGIN https://github.com/lodash/lodash/blob/master/.internal/root.js
-/** Detect free variable `globalThis` */
-const freeGlobalThis = typeof globalThis === 'object' && globalThis !== null && globalThis.Object == Object && globalThis
-
-/** Detect free variable `self`. */
-const freeSelf = typeof self === 'object' && self !== null && self.Object === Object && self
-
-/** Used as a reference to the global object. */
-const root = freeGlobalThis || freeGlobal || freeSelf || Function('return this')()
-//END https://github.com/lodash/lodash/blob/master/.internal/root.js
-
-//BEGIN https://github.com/lodash/lodash/blob/master/debounce.js
-/**
- * Creates a debounced function that delays invoking `func` until after `wait`
- * milliseconds have elapsed since the last time the debounced function was
- * invoked, or until the next browser frame is drawn. The debounced function
- * comes with a `cancel` method to cancel delayed `func` invocations and a
- * `flush` method to immediately invoke them. Provide `options` to indicate
- * whether `func` should be invoked on the leading and/or trailing edge of the
- * `wait` timeout. The `func` is invoked with the last arguments provided to the
- * debounced function. Subsequent calls to the debounced function return the
- * result of the last `func` invocation.
- *
- * **Note:** If `leading` and `trailing` options are `true`, `func` is
- * invoked on the trailing edge of the timeout only if the debounced function
- * is invoked more than once during the `wait` timeout.
- *
- * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
- * until the next tick, similar to `setTimeout` with a timeout of `0`.
- *
- * If `wait` is omitted in an environment with `requestAnimationFrame`, `func`
- * invocation will be deferred until the next frame is drawn (typically about
- * 16ms).
- *
- * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
- * for details over the differences between `debounce` and `throttle`.
- *
- * @since 0.1.0
- * @category Function
- * @param {Function} func The function to debounce.
- * @param {number} [wait=0]
- * The number of milliseconds to delay; if omitted, `requestAnimationFrame` is
- * used (if available).
- * @param {Object} [options={}] The options object.
- * @param {boolean} [options.leading=false]
- * Specify invoking on the leading edge of the timeout.
- * @param {number} [options.maxWait]
- * The maximum time `func` is allowed to be delayed before it's invoked.
- * @param {boolean} [options.trailing=true]
- * Specify invoking on the trailing edge of the timeout.
- * @returns {Function} Returns the new debounced function.
- * @example
- *
- * // Avoid costly calculations while the window size is in flux.
- * jQuery(window).on('resize', debounce(calculateLayout, 150))
- *
- * // Invoke `sendMail` when clicked, debouncing subsequent calls.
- * jQuery(element).on('click', debounce(sendMail, 300, {
- * 'leading': true,
- * 'trailing': false
- * }))
- *
- * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
- * const debounced = debounce(batchLog, 250, { 'maxWait': 1000 })
- * const source = new EventSource('/stream')
- * jQuery(source).on('message', debounced)
- *
- * // Cancel the trailing debounced invocation.
- * jQuery(window).on('popstate', debounced.cancel)
- *
- * // Check for pending invocations.
- * const status = debounced.pending() ? "Pending..." : "Ready"
- */
-function debounce(func, wait, options) {
- let lastArgs,
- lastThis: any,
- maxWait,
- result,
- timerId,
- lastCallTime
-
- let lastInvokeTime = 0
- let leading = false
- let maxing = false
- let trailing = true
-
- // Bypass `requestAnimationFrame` by explicitly setting `wait=0`.
- const useRAF = (!wait && wait !== 0 && typeof root.requestAnimationFrame === 'function')
-
- if (typeof func !== 'function') {
- throw new TypeError('Expected a function')
- }
- wait = +wait || 0
- if (isObject(options)) {
- leading = !!options.leading
- maxing = 'maxWait' in options
- maxWait = maxing ? Math.max(+options.maxWait || 0, wait) : maxWait
- trailing = 'trailing' in options ? !!options.trailing : trailing
- }
-
- function invokeFunc(time) {
- const args = lastArgs
- const thisArg = lastThis
-
- lastArgs = lastThis = undefined
- lastInvokeTime = time
- result = func.apply(thisArg, args)
- return result
- }
-
- function startTimer(pendingFunc, wait) {
- if (useRAF) {
- root.cancelAnimationFrame(timerId)
- return root.requestAnimationFrame(pendingFunc)
- }
- return setTimeout(pendingFunc, wait)
- }
-
- function cancelTimer(id) {
- if (useRAF) {
- return root.cancelAnimationFrame(id)
- }
- clearTimeout(id)
- }
-
- function leadingEdge(time) {
- // Reset any `maxWait` timer.
- lastInvokeTime = time
- // Start the timer for the trailing edge.
- timerId = startTimer(timerExpired, wait)
- // Invoke the leading edge.
- return leading ? invokeFunc(time) : result
- }
-
- function remainingWait(time) {
- const timeSinceLastCall = time - lastCallTime
- const timeSinceLastInvoke = time - lastInvokeTime
- const timeWaiting = wait - timeSinceLastCall
-
- return maxing
- ? Math.min(timeWaiting, maxWait - timeSinceLastInvoke)
- : timeWaiting
- }
-
- function shouldInvoke(time) {
- const timeSinceLastCall = time - lastCallTime
- const timeSinceLastInvoke = time - lastInvokeTime
-
- // Either this is the first call, activity has stopped and we're at the
- // trailing edge, the system time has gone backwards and we're treating
- // it as the trailing edge, or we've hit the `maxWait` limit.
- return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
- (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait))
- }
-
- function timerExpired() {
- const time = Date.now()
- if (shouldInvoke(time)) {
- return trailingEdge(time)
- }
- // Restart the timer.
- timerId = startTimer(timerExpired, remainingWait(time))
- }
-
- function trailingEdge(time) {
- timerId = undefined
-
- // Only invoke if we have `lastArgs` which means `func` has been
- // debounced at least once.
- if (trailing && lastArgs) {
- return invokeFunc(time)
- }
- lastArgs = lastThis = undefined
- return result
- }
-
- function cancel() {
- if (timerId !== undefined) {
- cancelTimer(timerId)
- }
- lastInvokeTime = 0
- lastArgs = lastCallTime = lastThis = timerId = undefined
- }
-
- function flush() {
- return timerId === undefined ? result : trailingEdge(Date.now())
- }
-
- function pending() {
- return timerId !== undefined
- }
-
- function debounced(this: any, ...args) {
- const time = Date.now()
- const isInvoking = shouldInvoke(time)
-
- lastArgs = args
- lastThis = this
- lastCallTime = time
-
- if (isInvoking) {
- if (timerId === undefined) {
- return leadingEdge(lastCallTime)
- }
- if (maxing) {
- // Handle invocations in a tight loop.
- timerId = startTimer(timerExpired, wait)
- return invokeFunc(lastCallTime)
- }
- }
- if (timerId === undefined) {
- timerId = startTimer(timerExpired, wait)
- }
- return result
- }
- debounced.cancel = cancel
- debounced.flush = flush
- debounced.pending = pending
- return debounced
-}
-// END https://github.com/lodash/lodash/blob/master/debounce.js
-
-//BEGIN https://github.com/lodash/lodash/blob/master/throttle.js
-/**
- * Creates a throttled function that only invokes `func` at most once per
- * every `wait` milliseconds (or once per browser frame). The throttled function
- * comes with a `cancel` method to cancel delayed `func` invocations and a
- * `flush` method to immediately invoke them. Provide `options` to indicate
- * whether `func` should be invoked on the leading and/or trailing edge of the
- * `wait` timeout. The `func` is invoked with the last arguments provided to the
- * throttled function. Subsequent calls to the throttled function return the
- * result of the last `func` invocation.
- *
- * **Note:** If `leading` and `trailing` options are `true`, `func` is
- * invoked on the trailing edge of the timeout only if the throttled function
- * is invoked more than once during the `wait` timeout.
- *
- * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
- * until the next tick, similar to `setTimeout` with a timeout of `0`.
- *
- * If `wait` is omitted in an environment with `requestAnimationFrame`, `func`
- * invocation will be deferred until the next frame is drawn (typically about
- * 16ms).
- *
- * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
- * for details over the differences between `throttle` and `debounce`.
- *
- * @since 0.1.0
- * @category Function
- * @param {Function} func The function to throttle.
- * @param {number} [wait=0]
- * The number of milliseconds to throttle invocations to; if omitted,
- * `requestAnimationFrame` is used (if available).
- * @param {Object} [options={}] The options object.
- * @param {boolean} [options.leading=true]
- * Specify invoking on the leading edge of the timeout.
- * @param {boolean} [options.trailing=true]
- * Specify invoking on the trailing edge of the timeout.
- * @returns {Function} Returns the new throttled function.
- * @example
- *
- * // Avoid excessively updating the position while scrolling.
- * jQuery(window).on('scroll', throttle(updatePosition, 100))
- *
- * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
- * const throttled = throttle(renewToken, 300000, { 'trailing': false })
- * jQuery(element).on('click', throttled)
- *
- * // Cancel the trailing throttled invocation.
- * jQuery(window).on('popstate', throttled.cancel)
- */
-function throttle(func, wait, options) {
- let leading = true
- let trailing = true
-
- if (typeof func !== 'function') {
- throw new TypeError('Expected a function')
- }
- if (isObject(options)) {
- leading = 'leading' in options ? !!options.leading : leading
- trailing = 'trailing' in options ? !!options.trailing : trailing
- }
- return debounce(func, wait, {
- leading,
- trailing,
- 'maxWait': wait
- })
-}
-//END https://github.com/lodash/lodash/blob/master/throttle.js
-
-export { throttle, debounce }
-
diff --git a/Material.Blazor.MD3/Scripts/material.blazor.custom.events.ts b/Material.Blazor.MD3/Scripts/material.blazor.custom.events.ts
new file mode 100644
index 000000000..23cad9fb3
--- /dev/null
+++ b/Material.Blazor.MD3/Scripts/material.blazor.custom.events.ts
@@ -0,0 +1,21 @@
+/*
+** MW3 menu-close event arguments
+**
+** This must match the C# definition found in MBMenuEvents.cs
+*/
+export function eventArgsCreatorMenuClose(event) {
+ return {
+ customProperty1: 'any value for property 1',
+ customProperty2: event.srcElement.value
+ };
+}
+
+/*
+** Register all custom events
+*/
+export function afterStarted(blazor) {
+ blazor.registerCustomEventType('menuclose', {
+ browserEventName: "menu-closex",
+ createEventArgs: eventArgsCreatorMenuClose
+ });
+}
diff --git a/Material.Blazor.MD3/Scripts/material.blazor.ts b/Material.Blazor.MD3/Scripts/material.blazor.ts
index 82a485b2c..d02b6ab3f 100644
--- a/Material.Blazor.MD3/Scripts/material.blazor.ts
+++ b/Material.Blazor.MD3/Scripts/material.blazor.ts
@@ -1,51 +1,17 @@
/*
-MD3 JS
+MW3 JS
*/
-import '@material/web/button/elevated-button.js';
-import '@material/web/button/filled-button.js';
-import '@material/web/button/filled-tonal-button.js';
-import '@material/web/button/outlined-button.js';
-import '@material/web/button/text-button.js';
-import '@material/web/checkbox/checkbox.js';
-import '@material/web/chips/assist-chip.js';
-import '@material/web/chips/filter-chip.js';
-import '@material/web/chips/input-chip.js';
-import '@material/web/chips/suggestion-chip.js';
-import '@material/web/chips/chip-set.js'
-import '@material/web/dialog/dialog.js'
-import '@material/web/divider/divider.js'
-import '@material/web/fab/branded-fab.js'
-import '@material/web/fab/fab.js'
-import '@material/web/icon/icon.js';
-import '@material/web/iconbutton/filled-icon-button.js';
-import '@material/web/iconbutton/filled-tonal-icon-button.js';
-import '@material/web/iconbutton/icon-button.js';
-import '@material/web/iconbutton/outlined-icon-button.js';
-import '@material/web/list/list.js';
-import '@material/web/list/list-item.js';
-import '@material/web/menu/menu.js';
-import '@material/web/menu/menu-item.js';
-import '@material/web/menu/sub-menu.js';
-import '@material/web/progress/circular-progress.js';
-import '@material/web/progress/linear-progress.js';
-import '@material/web/radio/radio.js';
-import '@material/web/select/filled-select.js';
-import '@material/web/select/outlined-select.js';
-import '@material/web/select/select-option.js';
-import '@material/web/slider/slider.js';
-import '@material/web/tabs/primary-tab.js'
-import '@material/web/tabs/secondary-tab.js'
-import '@material/web/tabs/tabs.js'
-import '@material/web/textfield/filled-text-field.js';
-import '@material/web/textfield/outlined-text-field.js';
-import '@material/web/switch/switch.js';
+import '@material/web/all.js';
+/*
+M.B.MD3 JS
+*/
import * as MBDialog from '../Components/Dialog/MBDialog';
import * as MBMenu from '../Components/Menu/MBMenu';
import * as MBTextField from '../Components/TextField/MBTextField';
/*
-MD2 JS
+MWC2 JS
*/
import * as MBCard from '../Components.MD2/Card/MBCard';
import * as MBDataTable from '../Components.MD2/DataTable/MBDataTable';
diff --git a/Material.Blazor.MD3/Styles/_material-symbols-outlined.scss b/Material.Blazor.MD3/Styles/_material-symbols-outlined.scss
index 25120c40a..d79b8c80a 100644
--- a/Material.Blazor.MD3/Styles/_material-symbols-outlined.scss
+++ b/Material.Blazor.MD3/Styles/_material-symbols-outlined.scss
@@ -3,7 +3,7 @@
font-family: 'Material Symbols Outlined';
font-style: normal;
font-weight: 100 700;
- src: url(https://fonts.gstatic.com/s/materialsymbolsoutlined/v146/kJEhBvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oFsI.woff2) format('woff2');
+ src: url(https://fonts.gstatic.com/s/materialsymbolsoutlined/v151/kJEhBvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oFsI.woff2) format('woff2');
}
.material-symbols-outlined {
diff --git a/Material.Blazor.MD3/Styles/_material-symbols-rounded.scss b/Material.Blazor.MD3/Styles/_material-symbols-rounded.scss
index 4d6401771..09f28dcc6 100644
--- a/Material.Blazor.MD3/Styles/_material-symbols-rounded.scss
+++ b/Material.Blazor.MD3/Styles/_material-symbols-rounded.scss
@@ -3,7 +3,7 @@
font-family: 'Material Symbols Rounded';
font-style: normal;
font-weight: 100 700;
- src: url(https://fonts.gstatic.com/s/materialsymbolsrounded/v146/sykg-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190Fjzag.woff2) format('woff2');
+ src: url(https://fonts.gstatic.com/s/materialsymbolsrounded/v150/sykg-zNym6YjUruM-QrEh7-nyTnjDwKNJ_190Fjzag.woff2) format('woff2');
}
.material-symbols-rounded {
diff --git a/Material.Blazor.MD3/Styles/_material-symbols-sharp.scss b/Material.Blazor.MD3/Styles/_material-symbols-sharp.scss
index e814af8e4..151320895 100644
--- a/Material.Blazor.MD3/Styles/_material-symbols-sharp.scss
+++ b/Material.Blazor.MD3/Styles/_material-symbols-sharp.scss
@@ -3,7 +3,7 @@
font-family: 'Material Symbols Sharp';
font-style: normal;
font-weight: 100 700;
- src: url(https://fonts.gstatic.com/s/materialsymbolssharp/v143/gNMVW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4aWE.woff2) format('woff2');
+ src: url(https://fonts.gstatic.com/s/materialsymbolssharp/v147/gNMVW2J8Roq16WD5tFNRaeLQk6-SHQ_R00k4aWE.woff2) format('woff2');
}
.material-symbols-sharp {
diff --git a/Material.Blazor.MD3/Styles/material.blazor.scss b/Material.Blazor.MD3/Styles/material.blazor.scss
index dd6a4c3c0..242b7a1e3 100644
--- a/Material.Blazor.MD3/Styles/material.blazor.scss
+++ b/Material.Blazor.MD3/Styles/material.blazor.scss
@@ -5,8 +5,6 @@
@use '_material-symbols-rounded.scss';
@use '_material-symbols-sharp.scss';
-@use '../Components/Dialog/MBDialog.scss';
-@use '../Components/RadioButtonGroup/MBRadioButtonGroup.scss';
@use '../Components/Toast/MBToast.scss';
@use '../Components.MD2/Card/MBCard.scss';
@@ -29,36 +27,3 @@
.mb-full-width {
width: 100%;
}
-
-.loading-progress {
- position: relative;
- display: block;
- width: 8rem;
- height: 8rem;
- margin: 20vh auto 1rem auto;
-}
-
-.loading-progress circle {
- fill: none;
- stroke: #e0e0e0;
- stroke-width: 0.6rem;
- transform-origin: 50% 50%;
- transform: rotate(-90deg);
-}
-
-.loading-progress circle:last-child {
- stroke: #1b6ec2;
- stroke-dasharray: calc(3.141 * var(--blazor-load-percentage, 0%) * 0.8), 500%;
- transition: stroke-dasharray 0.05s ease-in-out;
-}
-
-.loading-progress-text {
- position: absolute;
- text-align: center;
- font-weight: bold;
- inset: calc(20vh + 3.25rem) 0 auto 0.2rem;
-}
-
-.loading-progress-text:after {
- content: var(--blazor-load-percentage-text, "Loading");
-}
diff --git a/Material.Blazor.MD3/package-lock.json b/Material.Blazor.MD3/package-lock.json
index b8920d787..e19f3418b 100644
--- a/Material.Blazor.MD3/package-lock.json
+++ b/Material.Blazor.MD3/package-lock.json
@@ -9,22 +9,22 @@
"version": "4.0.0",
"license": "MIT",
"devDependencies": {
- "@babel/cli": "^7.23.0",
- "@babel/core": "^7.23.3",
+ "@babel/cli": "^7.23.4",
+ "@babel/core": "^7.23.5",
"@babel/plugin-transform-class-properties": "^7.23.3",
- "@babel/plugin-transform-object-rest-spread": "^7.23.3",
- "@babel/plugin-transform-runtime": "^7.23.3",
- "@babel/preset-env": "^7.23.3",
+ "@babel/plugin-transform-object-rest-spread": "^7.23.4",
+ "@babel/plugin-transform-runtime": "^7.23.4",
+ "@babel/preset-env": "^7.23.5",
"@babel/preset-typescript": "^7.23.3",
- "@material/web": "1.0.0",
+ "@material/web": "^1.0.2-nightly.636a68c.0",
"babel-loader": "^9.1.3",
- "fork-ts-checker-webpack-plugin": "^8.0.0",
+ "fork-ts-checker-webpack-plugin": "^9.0.2",
"material-components-web": "14.0.0",
"regexp": "^1.0.0",
"sass": "1.39.2",
"terser": "^5.24.0",
- "ts-loader": "^9.5.0",
- "typescript": "^5.2.2",
+ "ts-loader": "^9.5.1",
+ "typescript": "^5.3.2",
"webpack": "^5.89.0",
"webpack-cli": "^5.1.4"
}
@@ -43,9 +43,9 @@
}
},
"node_modules/@babel/cli": {
- "version": "7.23.0",
- "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.23.0.tgz",
- "integrity": "sha512-17E1oSkGk2IwNILM4jtfAvgjt+ohmpfBky8aLerUfYZhiPNg7ca+CRCxZn8QDxwNhV/upsc2VHBCqGFIR+iBfA==",
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.23.4.tgz",
+ "integrity": "sha512-j3luA9xGKCXVyCa5R7lJvOMM+Kc2JEnAEIgz2ggtjQ/j5YUVgfsg/WsG95bbsgq7YLHuiCOzMnoSasuY16qiCw==",
"dev": true,
"dependencies": {
"@jridgewell/trace-mapping": "^0.3.17",
@@ -72,12 +72,12 @@
}
},
"node_modules/@babel/code-frame": {
- "version": "7.22.13",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz",
- "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==",
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz",
+ "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==",
"dev": true,
"dependencies": {
- "@babel/highlight": "^7.22.13",
+ "@babel/highlight": "^7.23.4",
"chalk": "^2.4.2"
},
"engines": {
@@ -85,30 +85,30 @@
}
},
"node_modules/@babel/compat-data": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.3.tgz",
- "integrity": "sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ==",
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz",
+ "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/core": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.3.tgz",
- "integrity": "sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==",
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.5.tgz",
+ "integrity": "sha512-Cwc2XjUrG4ilcfOw4wBAK+enbdgwAcAJCfGUItPBKR7Mjw4aEfAFYrLxeRp4jWgtNIKn3n2AlBOfwwafl+42/g==",
"dev": true,
"dependencies": {
"@ampproject/remapping": "^2.2.0",
- "@babel/code-frame": "^7.22.13",
- "@babel/generator": "^7.23.3",
+ "@babel/code-frame": "^7.23.5",
+ "@babel/generator": "^7.23.5",
"@babel/helper-compilation-targets": "^7.22.15",
"@babel/helper-module-transforms": "^7.23.3",
- "@babel/helpers": "^7.23.2",
- "@babel/parser": "^7.23.3",
+ "@babel/helpers": "^7.23.5",
+ "@babel/parser": "^7.23.5",
"@babel/template": "^7.22.15",
- "@babel/traverse": "^7.23.3",
- "@babel/types": "^7.23.3",
+ "@babel/traverse": "^7.23.5",
+ "@babel/types": "^7.23.5",
"convert-source-map": "^2.0.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
@@ -124,12 +124,12 @@
}
},
"node_modules/@babel/generator": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.3.tgz",
- "integrity": "sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==",
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.5.tgz",
+ "integrity": "sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.23.3",
+ "@babel/types": "^7.23.5",
"@jridgewell/gen-mapping": "^0.3.2",
"@jridgewell/trace-mapping": "^0.3.17",
"jsesc": "^2.5.1"
@@ -179,17 +179,17 @@
}
},
"node_modules/@babel/helper-create-class-features-plugin": {
- "version": "7.22.15",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz",
- "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==",
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.5.tgz",
+ "integrity": "sha512-QELlRWxSpgdwdJzSJn4WAhKC+hvw/AtHbbrIoncKHkhKKR/luAlKkgBDcri1EzWAo8f8VvYVryEHN4tax/V67A==",
"dev": true,
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.22.5",
- "@babel/helper-environment-visitor": "^7.22.5",
- "@babel/helper-function-name": "^7.22.5",
- "@babel/helper-member-expression-to-functions": "^7.22.15",
+ "@babel/helper-environment-visitor": "^7.22.20",
+ "@babel/helper-function-name": "^7.23.0",
+ "@babel/helper-member-expression-to-functions": "^7.23.0",
"@babel/helper-optimise-call-expression": "^7.22.5",
- "@babel/helper-replace-supers": "^7.22.9",
+ "@babel/helper-replace-supers": "^7.22.20",
"@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
"@babel/helper-split-export-declaration": "^7.22.6",
"semver": "^6.3.1"
@@ -403,9 +403,9 @@
}
},
"node_modules/@babel/helper-string-parser": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz",
- "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==",
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz",
+ "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==",
"dev": true,
"engines": {
"node": ">=6.9.0"
@@ -421,9 +421,9 @@
}
},
"node_modules/@babel/helper-validator-option": {
- "version": "7.22.15",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz",
- "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==",
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz",
+ "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==",
"dev": true,
"engines": {
"node": ">=6.9.0"
@@ -444,23 +444,23 @@
}
},
"node_modules/@babel/helpers": {
- "version": "7.23.2",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz",
- "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==",
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.5.tgz",
+ "integrity": "sha512-oO7us8FzTEsG3U6ag9MfdF1iA/7Z6dz+MtFhifZk8C8o453rGJFFWUP1t+ULM9TUIAzC9uxXEiXjOiVMyd7QPg==",
"dev": true,
"dependencies": {
"@babel/template": "^7.22.15",
- "@babel/traverse": "^7.23.2",
- "@babel/types": "^7.23.0"
+ "@babel/traverse": "^7.23.5",
+ "@babel/types": "^7.23.5"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/highlight": {
- "version": "7.22.20",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz",
- "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==",
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz",
+ "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==",
"dev": true,
"dependencies": {
"@babel/helper-validator-identifier": "^7.22.20",
@@ -472,9 +472,9 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.3.tgz",
- "integrity": "sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==",
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz",
+ "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==",
"dev": true,
"bin": {
"parser": "bin/babel-parser.js"
@@ -824,9 +824,9 @@
}
},
"node_modules/@babel/plugin-transform-async-generator-functions": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.3.tgz",
- "integrity": "sha512-59GsVNavGxAXCDDbakWSMJhajASb4kBCqDjqJsv+p5nKdbz7istmZ3HrX3L2LuiI80+zsOADCvooqQH3qGCucQ==",
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.4.tgz",
+ "integrity": "sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==",
"dev": true,
"dependencies": {
"@babel/helper-environment-visitor": "^7.22.20",
@@ -874,9 +874,9 @@
}
},
"node_modules/@babel/plugin-transform-block-scoping": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.3.tgz",
- "integrity": "sha512-QPZxHrThbQia7UdvfpaRRlq/J9ciz1J4go0k+lPBXbgaNeY7IQrBj/9ceWjvMMI07/ZBzHl/F0R/2K0qH7jCVw==",
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz",
+ "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
@@ -905,9 +905,9 @@
}
},
"node_modules/@babel/plugin-transform-class-static-block": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.3.tgz",
- "integrity": "sha512-PENDVxdr7ZxKPyi5Ffc0LjXdnJyrJxyqF5T5YjlVg4a0VFfQHW0r8iAtRiDXkfHlu1wwcvdtnndGYIeJLSuRMQ==",
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz",
+ "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==",
"dev": true,
"dependencies": {
"@babel/helper-create-class-features-plugin": "^7.22.15",
@@ -922,9 +922,9 @@
}
},
"node_modules/@babel/plugin-transform-classes": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.3.tgz",
- "integrity": "sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w==",
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.5.tgz",
+ "integrity": "sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==",
"dev": true,
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.22.5",
@@ -1007,9 +1007,9 @@
}
},
"node_modules/@babel/plugin-transform-dynamic-import": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.3.tgz",
- "integrity": "sha512-vTG+cTGxPFou12Rj7ll+eD5yWeNl5/8xvQvF08y5Gv3v4mZQoyFf8/n9zg4q5vvCWt5jmgymfzMAldO7orBn7A==",
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz",
+ "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
@@ -1039,9 +1039,9 @@
}
},
"node_modules/@babel/plugin-transform-export-namespace-from": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.3.tgz",
- "integrity": "sha512-yCLhW34wpJWRdTxxWtFZASJisihrfyMOTOQexhVzA78jlU+dH7Dw+zQgcPepQ5F3C6bAIiblZZ+qBggJdHiBAg==",
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz",
+ "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
@@ -1087,9 +1087,9 @@
}
},
"node_modules/@babel/plugin-transform-json-strings": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.3.tgz",
- "integrity": "sha512-H9Ej2OiISIZowZHaBwF0tsJOih1PftXJtE8EWqlEIwpc7LMTGq0rPOrywKLQ4nefzx8/HMR0D3JGXoMHYvhi0A==",
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz",
+ "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
@@ -1118,9 +1118,9 @@
}
},
"node_modules/@babel/plugin-transform-logical-assignment-operators": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.3.tgz",
- "integrity": "sha512-+pD5ZbxofyOygEp+zZAfujY2ShNCXRpDRIPOiBmTO693hhyOEteZgl876Xs9SAHPQpcV0vz8LvA/T+w8AzyX8A==",
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz",
+ "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
@@ -1247,9 +1247,9 @@
}
},
"node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.3.tgz",
- "integrity": "sha512-xzg24Lnld4DYIdysyf07zJ1P+iIfJpxtVFOzX4g+bsJ3Ng5Le7rXx9KwqKzuyaUeRnt+I1EICwQITqc0E2PmpA==",
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz",
+ "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
@@ -1263,9 +1263,9 @@
}
},
"node_modules/@babel/plugin-transform-numeric-separator": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.3.tgz",
- "integrity": "sha512-s9GO7fIBi/BLsZ0v3Rftr6Oe4t0ctJ8h4CCXfPoEJwmvAPMyNrfkOOJzm6b9PX9YXcCJWWQd/sBF/N26eBiMVw==",
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz",
+ "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
@@ -1279,9 +1279,9 @@
}
},
"node_modules/@babel/plugin-transform-object-rest-spread": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.3.tgz",
- "integrity": "sha512-VxHt0ANkDmu8TANdE9Kc0rndo/ccsmfe2Cx2y5sI4hu3AukHQ5wAu4cM7j3ba8B9548ijVyclBU+nuDQftZsog==",
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz",
+ "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==",
"dev": true,
"dependencies": {
"@babel/compat-data": "^7.23.3",
@@ -1314,9 +1314,9 @@
}
},
"node_modules/@babel/plugin-transform-optional-catch-binding": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.3.tgz",
- "integrity": "sha512-LxYSb0iLjUamfm7f1D7GpiS4j0UAC8AOiehnsGAP8BEsIX8EOi3qV6bbctw8M7ZvLtcoZfZX5Z7rN9PlWk0m5A==",
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz",
+ "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
@@ -1330,9 +1330,9 @@
}
},
"node_modules/@babel/plugin-transform-optional-chaining": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.3.tgz",
- "integrity": "sha512-zvL8vIfIUgMccIAK1lxjvNv572JHFJIKb4MWBz5OGdBQA0fB0Xluix5rmOby48exiJc987neOmP/m9Fnpkz3Tg==",
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz",
+ "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==",
"dev": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
@@ -1378,9 +1378,9 @@
}
},
"node_modules/@babel/plugin-transform-private-property-in-object": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.3.tgz",
- "integrity": "sha512-a5m2oLNFyje2e/rGKjVfAELTVI5mbA0FeZpBnkOWWV7eSmKQ+T/XW0Vf+29ScLzSxX+rnsarvU0oie/4m6hkxA==",
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz",
+ "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==",
"dev": true,
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.22.5",
@@ -1442,9 +1442,9 @@
}
},
"node_modules/@babel/plugin-transform-runtime": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.3.tgz",
- "integrity": "sha512-XcQ3X58CKBdBnnZpPaQjgVMePsXtSZzHoku70q9tUAQp02ggPQNM04BF3RvlW1GSM/McbSOQAzEK4MXbS7/JFg==",
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.4.tgz",
+ "integrity": "sha512-ITwqpb6V4btwUG0YJR82o2QvmWrLgDnx/p2A3CTPYGaRgULkDiC0DRA2C4jlRB9uXGUEfaSS/IGHfVW+ohzYDw==",
"dev": true,
"dependencies": {
"@babel/helper-module-imports": "^7.22.15",
@@ -1538,13 +1538,13 @@
}
},
"node_modules/@babel/plugin-transform-typescript": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.3.tgz",
- "integrity": "sha512-ogV0yWnq38CFwH20l2Afz0dfKuZBx9o/Y2Rmh5vuSS0YD1hswgEgTfyTzuSrT2q9btmHRSqYoSfwFUVaC1M1Jw==",
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.5.tgz",
+ "integrity": "sha512-2fMkXEJkrmwgu2Bsv1Saxgj30IXZdJ+84lQcKKI7sm719oXs0BBw2ZENKdJdR1PjWndgLCEBNXJOri0fk7RYQA==",
"dev": true,
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.22.5",
- "@babel/helper-create-class-features-plugin": "^7.22.15",
+ "@babel/helper-create-class-features-plugin": "^7.23.5",
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/plugin-syntax-typescript": "^7.23.3"
},
@@ -1619,15 +1619,15 @@
}
},
"node_modules/@babel/preset-env": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.3.tgz",
- "integrity": "sha512-ovzGc2uuyNfNAs/jyjIGxS8arOHS5FENZaNn4rtE7UdKMMkqHCvboHfcuhWLZNX5cB44QfcGNWjaevxMzzMf+Q==",
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.5.tgz",
+ "integrity": "sha512-0d/uxVD6tFGWXGDSfyMD1p2otoaKmu6+GD+NfAx0tMaH+dxORnp7T9TaVQ6mKyya7iBtCIVxHjWT7MuzzM9z+A==",
"dev": true,
"dependencies": {
- "@babel/compat-data": "^7.23.3",
+ "@babel/compat-data": "^7.23.5",
"@babel/helper-compilation-targets": "^7.22.15",
"@babel/helper-plugin-utils": "^7.22.5",
- "@babel/helper-validator-option": "^7.22.15",
+ "@babel/helper-validator-option": "^7.23.5",
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3",
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3",
"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3",
@@ -1651,25 +1651,25 @@
"@babel/plugin-syntax-top-level-await": "^7.14.5",
"@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
"@babel/plugin-transform-arrow-functions": "^7.23.3",
- "@babel/plugin-transform-async-generator-functions": "^7.23.3",
+ "@babel/plugin-transform-async-generator-functions": "^7.23.4",
"@babel/plugin-transform-async-to-generator": "^7.23.3",
"@babel/plugin-transform-block-scoped-functions": "^7.23.3",
- "@babel/plugin-transform-block-scoping": "^7.23.3",
+ "@babel/plugin-transform-block-scoping": "^7.23.4",
"@babel/plugin-transform-class-properties": "^7.23.3",
- "@babel/plugin-transform-class-static-block": "^7.23.3",
- "@babel/plugin-transform-classes": "^7.23.3",
+ "@babel/plugin-transform-class-static-block": "^7.23.4",
+ "@babel/plugin-transform-classes": "^7.23.5",
"@babel/plugin-transform-computed-properties": "^7.23.3",
"@babel/plugin-transform-destructuring": "^7.23.3",
"@babel/plugin-transform-dotall-regex": "^7.23.3",
"@babel/plugin-transform-duplicate-keys": "^7.23.3",
- "@babel/plugin-transform-dynamic-import": "^7.23.3",
+ "@babel/plugin-transform-dynamic-import": "^7.23.4",
"@babel/plugin-transform-exponentiation-operator": "^7.23.3",
- "@babel/plugin-transform-export-namespace-from": "^7.23.3",
+ "@babel/plugin-transform-export-namespace-from": "^7.23.4",
"@babel/plugin-transform-for-of": "^7.23.3",
"@babel/plugin-transform-function-name": "^7.23.3",
- "@babel/plugin-transform-json-strings": "^7.23.3",
+ "@babel/plugin-transform-json-strings": "^7.23.4",
"@babel/plugin-transform-literals": "^7.23.3",
- "@babel/plugin-transform-logical-assignment-operators": "^7.23.3",
+ "@babel/plugin-transform-logical-assignment-operators": "^7.23.4",
"@babel/plugin-transform-member-expression-literals": "^7.23.3",
"@babel/plugin-transform-modules-amd": "^7.23.3",
"@babel/plugin-transform-modules-commonjs": "^7.23.3",
@@ -1677,15 +1677,15 @@
"@babel/plugin-transform-modules-umd": "^7.23.3",
"@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5",
"@babel/plugin-transform-new-target": "^7.23.3",
- "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.3",
- "@babel/plugin-transform-numeric-separator": "^7.23.3",
- "@babel/plugin-transform-object-rest-spread": "^7.23.3",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4",
+ "@babel/plugin-transform-numeric-separator": "^7.23.4",
+ "@babel/plugin-transform-object-rest-spread": "^7.23.4",
"@babel/plugin-transform-object-super": "^7.23.3",
- "@babel/plugin-transform-optional-catch-binding": "^7.23.3",
- "@babel/plugin-transform-optional-chaining": "^7.23.3",
+ "@babel/plugin-transform-optional-catch-binding": "^7.23.4",
+ "@babel/plugin-transform-optional-chaining": "^7.23.4",
"@babel/plugin-transform-parameters": "^7.23.3",
"@babel/plugin-transform-private-methods": "^7.23.3",
- "@babel/plugin-transform-private-property-in-object": "^7.23.3",
+ "@babel/plugin-transform-private-property-in-object": "^7.23.4",
"@babel/plugin-transform-property-literals": "^7.23.3",
"@babel/plugin-transform-regenerator": "^7.23.3",
"@babel/plugin-transform-reserved-words": "^7.23.3",
@@ -1752,9 +1752,9 @@
"dev": true
},
"node_modules/@babel/runtime": {
- "version": "7.23.2",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz",
- "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==",
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.5.tgz",
+ "integrity": "sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w==",
"dev": true,
"dependencies": {
"regenerator-runtime": "^0.14.0"
@@ -1778,19 +1778,19 @@
}
},
"node_modules/@babel/traverse": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.3.tgz",
- "integrity": "sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==",
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.5.tgz",
+ "integrity": "sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==",
"dev": true,
"dependencies": {
- "@babel/code-frame": "^7.22.13",
- "@babel/generator": "^7.23.3",
+ "@babel/code-frame": "^7.23.5",
+ "@babel/generator": "^7.23.5",
"@babel/helper-environment-visitor": "^7.22.20",
"@babel/helper-function-name": "^7.23.0",
"@babel/helper-hoist-variables": "^7.22.5",
"@babel/helper-split-export-declaration": "^7.22.6",
- "@babel/parser": "^7.23.3",
- "@babel/types": "^7.23.3",
+ "@babel/parser": "^7.23.5",
+ "@babel/types": "^7.23.5",
"debug": "^4.1.0",
"globals": "^11.1.0"
},
@@ -1799,12 +1799,12 @@
}
},
"node_modules/@babel/types": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz",
- "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==",
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz",
+ "integrity": "sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==",
"dev": true,
"dependencies": {
- "@babel/helper-string-parser": "^7.22.5",
+ "@babel/helper-string-parser": "^7.23.4",
"@babel/helper-validator-identifier": "^7.22.20",
"to-fast-properties": "^2.0.0"
},
@@ -1886,9 +1886,9 @@
"dev": true
},
"node_modules/@lit/reactive-element": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.0.1.tgz",
- "integrity": "sha512-eu50SQXHRthFwWJMp0oAFg95Rvm6MTPjxSXWuvAu7It90WVFLFpNBoIno7XOXSDvVgTrtKnUV4OLJqys2Svn4g==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.0.2.tgz",
+ "integrity": "sha512-SVOwLAWUQg3Ji1egtOt1UiFe4zdDpnWHyc5qctSceJ5XIu0Uc76YmGpIjZgx9YJ0XtdW0Jm507sDvjOu+HnB8w==",
"dev": true,
"dependencies": {
"@lit-labs/ssr-dom-shim": "^1.1.2"
@@ -2679,9 +2679,9 @@
}
},
"node_modules/@material/web": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@material/web/-/web-1.0.0.tgz",
- "integrity": "sha512-mNn2qzHvzJLty93NTtnkrSup+Wnte5yAtcZIx0N+WbIZPVlixA2v6wXkqHN1/SJVl0EV2tNT1qz4k0jfTQ+0lw==",
+ "version": "1.0.2-nightly.f7a66a8.0",
+ "resolved": "https://registry.npmjs.org/@material/web/-/web-1.0.2-nightly.f7a66a8.0.tgz",
+ "integrity": "sha512-YUsoFN+cSQPgVhI5Z9HIC6pmoVc/syK6JHAAEv4Rt4BByV05DLS3Oimue+2C/Bu/pNWojVs1quLXA7KPW8lG7A==",
"dev": true,
"dependencies": {
"lit": "^2.7.4 || ^3.0.0",
@@ -2696,9 +2696,9 @@
"optional": true
},
"node_modules/@types/eslint": {
- "version": "8.44.7",
- "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.7.tgz",
- "integrity": "sha512-f5ORu2hcBbKei97U73mf+l9t4zTGl74IqZ0GQk4oVea/VS8tQZYkUveSYojk+frraAVYId0V2WC9O4PTNru2FQ==",
+ "version": "8.44.8",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.8.tgz",
+ "integrity": "sha512-4K8GavROwhrYl2QXDXm0Rv9epkA8GBFu0EI+XrrnnuCl7u8CWBRusX7fXJfanhZTDWSAL24gDI/UqXyUM0Injw==",
"dev": true,
"dependencies": {
"@types/estree": "*",
@@ -2728,24 +2728,18 @@
"dev": true
},
"node_modules/@types/node": {
- "version": "20.9.0",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz",
- "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==",
+ "version": "20.10.1",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.1.tgz",
+ "integrity": "sha512-T2qwhjWwGH81vUEx4EXmBKsTJRXFXNZTL4v0gi01+zyBmCwzE6TyHszqX01m+QHTEq+EZNo13NeJIdEqf+Myrg==",
"dev": true,
"dependencies": {
"undici-types": "~5.26.4"
}
},
- "node_modules/@types/parse-json": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
- "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==",
- "dev": true
- },
"node_modules/@types/trusted-types": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.6.tgz",
- "integrity": "sha512-HYtNooPvUY9WAVRBr4u+4Qa9fYD1ze2IUlAD3HoA6oehn1taGwBx3Oa52U4mTslTS+GAExKpaFu39Y5xUEwfjg==",
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
+ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
"dev": true
},
"node_modules/@webassemblyjs/ast": {
@@ -3041,6 +3035,12 @@
"node": ">= 8"
}
},
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
"node_modules/babel-loader": {
"version": "9.1.3",
"resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz",
@@ -3182,9 +3182,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001562",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001562.tgz",
- "integrity": "sha512-kfte3Hym//51EdX4239i+Rmp20EsLIYGdPkERegTgU19hQWCRhsRFGKHTliUlsry53tv17K7n077Kqa0WJU4ng==",
+ "version": "1.0.30001565",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001565.tgz",
+ "integrity": "sha512-xrE//a3O7TP0vaJ8ikzkD2c2NgcVUvsEe2IvFTntV4Yd1Z9FVzh+gW+enX96L0psrbaFMcVcH2l90xNuGDWc8w==",
"dev": true,
"funding": [
{
@@ -3314,9 +3314,9 @@
"dev": true
},
"node_modules/core-js-compat": {
- "version": "3.33.2",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.2.tgz",
- "integrity": "sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw==",
+ "version": "3.33.3",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.3.tgz",
+ "integrity": "sha512-cNzGqFsh3Ot+529GIXacjTJ7kegdt5fPXxCBVS1G0iaZpuo/tBz399ymceLJveQhFFZ8qThHiP3fzuoQjKN2ow==",
"dev": true,
"dependencies": {
"browserslist": "^4.22.1"
@@ -3327,19 +3327,29 @@
}
},
"node_modules/cosmiconfig": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
- "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
+ "version": "8.3.6",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",
+ "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==",
"dev": true,
"dependencies": {
- "@types/parse-json": "^4.0.0",
- "import-fresh": "^3.2.1",
- "parse-json": "^5.0.0",
- "path-type": "^4.0.0",
- "yaml": "^1.10.0"
+ "import-fresh": "^3.3.0",
+ "js-yaml": "^4.1.0",
+ "parse-json": "^5.2.0",
+ "path-type": "^4.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/d-fischer"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.9.5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
}
},
"node_modules/cross-spawn": {
@@ -3383,9 +3393,9 @@
}
},
"node_modules/electron-to-chromium": {
- "version": "1.4.582",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.582.tgz",
- "integrity": "sha512-89o0MGoocwYbzqUUjc+VNpeOFSOK9nIdC5wY4N+PVUarUK0MtjyTjks75AZS2bW4Kl8MdewdFsWaH0jLy+JNoA==",
+ "version": "1.4.598",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.598.tgz",
+ "integrity": "sha512-0JnipX0scPUlwsptQVCZggoCpREv+IrVD3h0ZG+sldmK9L27tSV3QjV8+QdaA4qQTzDf3PluNS45YYJky1oASw==",
"dev": true
},
"node_modules/enhanced-resolve": {
@@ -3582,15 +3592,15 @@
}
},
"node_modules/fork-ts-checker-webpack-plugin": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz",
- "integrity": "sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==",
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-9.0.2.tgz",
+ "integrity": "sha512-Uochze2R8peoN1XqlSi/rGUkDQpRogtLFocP9+PGu68zk1BDAKXfdeCdyVZpgTk8V8WFVQXdEz426VKjXLO1Gg==",
"dev": true,
"dependencies": {
"@babel/code-frame": "^7.16.7",
"chalk": "^4.1.2",
"chokidar": "^3.5.3",
- "cosmiconfig": "^7.0.1",
+ "cosmiconfig": "^8.2.0",
"deepmerge": "^4.2.2",
"fs-extra": "^10.0.0",
"memfs": "^3.4.1",
@@ -4163,6 +4173,18 @@
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"dev": true
},
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
"node_modules/jsesc": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
@@ -4227,31 +4249,31 @@
"dev": true
},
"node_modules/lit": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/lit/-/lit-3.0.2.tgz",
- "integrity": "sha512-ZoVUPGgXOQocP4OvxehEOBmC4rWB4cRYDPaz7aFmH8DFytsCi/NeACbr4C6vNPGDEC07BrhUos7uVNayDKLQ2Q==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/lit/-/lit-3.1.0.tgz",
+ "integrity": "sha512-rzo/hmUqX8zmOdamDAeydfjsGXbbdtAFqMhmocnh2j9aDYqbu0fjXygjCa0T99Od9VQ/2itwaGrjZz/ZELVl7w==",
"dev": true,
"dependencies": {
"@lit/reactive-element": "^2.0.0",
"lit-element": "^4.0.0",
- "lit-html": "^3.0.0"
+ "lit-html": "^3.1.0"
}
},
"node_modules/lit-element": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.0.1.tgz",
- "integrity": "sha512-OxRMJem4HKZt0320HplLkBPoi4KHiEHoPHKd8Lzf07ZQVAOKIjZ32yPLRKRDEolFU1RgrQBfSHQMoxKZ72V3Kw==",
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.0.2.tgz",
+ "integrity": "sha512-/W6WQZUa5VEXwC7H9tbtDMdSs9aWil3Ou8hU6z2cOKWbsm/tXPAcsoaHVEtrDo0zcOIE5GF6QgU55tlGL2Nihg==",
"dev": true,
"dependencies": {
"@lit-labs/ssr-dom-shim": "^1.1.2",
"@lit/reactive-element": "^2.0.0",
- "lit-html": "^3.0.0"
+ "lit-html": "^3.1.0"
}
},
"node_modules/lit-html": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.0.2.tgz",
- "integrity": "sha512-Q1A5lHza3bnmxoWJn6yS6vQZQdExl4fghk8W1G+jnAEdoFNYo5oeBBb/Ol7zSEdKd3TR7+r0zsJQyuWEVguiyQ==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.1.0.tgz",
+ "integrity": "sha512-FwAjq3iNsaO6SOZXEIpeROlJLUlrbyMkn4iuv4f4u1H40Jw8wkeR/OUXZUHUoiYabGk8Y4Y0F/rgq+R4MrOLmA==",
"dev": true,
"dependencies": {
"@types/trusted-types": "^2.0.2"
@@ -5104,9 +5126,9 @@
}
},
"node_modules/ts-loader": {
- "version": "9.5.0",
- "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.0.tgz",
- "integrity": "sha512-LLlB/pkB4q9mW2yLdFMnK3dEHbrBjeZTYguaaIfusyojBgAGf5kF+O6KcWqiGzWqHk0LBsoolrp4VftEURhybg==",
+ "version": "9.5.1",
+ "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz",
+ "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==",
"dev": true,
"dependencies": {
"chalk": "^4.1.0",
@@ -5242,9 +5264,9 @@
"dev": true
},
"node_modules/typescript": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz",
- "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==",
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz",
+ "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==",
"dev": true,
"bin": {
"tsc": "bin/tsc",
@@ -5567,15 +5589,6 @@
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
"dev": true
},
- "node_modules/yaml": {
- "version": "1.10.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
- "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/yocto-queue": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz",
diff --git a/Material.Blazor.MD3/package.json b/Material.Blazor.MD3/package.json
index 8a779a959..12bf42244 100644
--- a/Material.Blazor.MD3/package.json
+++ b/Material.Blazor.MD3/package.json
@@ -10,6 +10,7 @@
"build-css": "sass --no-color --unicode --style=expanded --load-path=node_modules --no-source-map Styles/material.blazor.scss wwwroot/material.blazor.css",
"build-css-minify": "sass --no-color --unicode --style=compressed --load-path=node_modules --no-source-map Styles/material.blazor.scss wwwroot/material.blazor.min.css",
"build-js": "webpack --config webpack.config.js",
+ "build-js-custom-events": "webpack --config webpack.custom.events.config.js",
"build-js-minify": "terser wwwroot/material.blazor.js --compress --mangle --ecma 2016 --output wwwroot/material.blazor.min.js",
"build-js-Comment1": "https://github.com/microsoft/TypeScript-Babel-Starter",
"build-JS-Comment2": "https://github.com/a-tarasyuk/webpack-typescript-babel"
@@ -18,22 +19,22 @@
"author": "",
"license": "MIT",
"devDependencies": {
- "@babel/cli": "^7.23.0",
- "@babel/core": "^7.23.3",
+ "@babel/cli": "^7.23.4",
+ "@babel/core": "^7.23.5",
"@babel/plugin-transform-class-properties": "^7.23.3",
- "@babel/plugin-transform-object-rest-spread": "^7.23.3",
- "@babel/plugin-transform-runtime": "^7.23.3",
- "@babel/preset-env": "^7.23.3",
+ "@babel/plugin-transform-object-rest-spread": "^7.23.4",
+ "@babel/plugin-transform-runtime": "^7.23.4",
+ "@babel/preset-env": "^7.23.5",
"@babel/preset-typescript": "^7.23.3",
- "@material/web": "1.0.0",
+ "@material/web": "^1.0.2-nightly.636a68c.0",
"babel-loader": "^9.1.3",
- "fork-ts-checker-webpack-plugin": "^8.0.0",
+ "fork-ts-checker-webpack-plugin": "^9.0.2",
"material-components-web": "14.0.0",
"regexp": "^1.0.0",
"sass": "1.39.2",
"terser": "^5.24.0",
- "ts-loader": "^9.5.0",
- "typescript": "^5.2.2",
+ "ts-loader": "^9.5.1",
+ "typescript": "^5.3.2",
"webpack": "^5.89.0",
"webpack-cli": "^5.1.4"
}
diff --git a/Material.Blazor.MD3/webpack.custom.events.config.js b/Material.Blazor.MD3/webpack.custom.events.config.js
new file mode 100644
index 000000000..2ee9b5f47
--- /dev/null
+++ b/Material.Blazor.MD3/webpack.custom.events.config.js
@@ -0,0 +1,39 @@
+var path = require("path");
+const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');
+
+module.exports = {
+ mode: 'production',
+
+ entry: {
+ 'MaterialBlazor': [
+ './scripts/material.blazor.custom.events.ts'
+ ]
+ },
+
+ optimization: {
+ minimize: false
+ },
+
+ output: {
+ filename: "Material.Blazor.MD3.lib.module.js",
+ path: path.resolve(__dirname, 'wwwroot'),
+ },
+
+ resolve: {
+ extensions: [".ts", ".js"]
+ },
+
+ module: {
+ rules: [
+ {
+ test: /\.(ts|js)x?$/,
+ use: 'babel-loader',
+ exclude: /node_modules/,
+ }
+ ],
+ },
+
+ plugins: [
+ new ForkTsCheckerWebpackPlugin(),
+ ]
+};
\ No newline at end of file
diff --git a/Material.Blazor.Test/Material.Blazor.Test.csproj b/Material.Blazor.Test/Material.Blazor.Test.csproj
index e5930efe9..afa7266df 100644
--- a/Material.Blazor.Test/Material.Blazor.Test.csproj
+++ b/Material.Blazor.Test/Material.Blazor.Test.csproj
@@ -4,12 +4,12 @@
-
-
-
+
+
+
-
-
+
+ allruntime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/Material.Blazor.Website.MD3/Pages/Dialog.razor b/Material.Blazor.Website.MD3/Pages/Dialog.razor
index 4e1fbea9a..7237b1f2b 100644
--- a/Material.Blazor.Website.MD3/Pages/Dialog.razor
+++ b/Material.Blazor.Website.MD3/Pages/Dialog.razor
@@ -1,12 +1,9 @@
@page "/dialog"
-
@inject IMBToastService ToastService
-
@using System.ComponentModel.DataAnnotations;
-
@@ -31,15 +28,16 @@
+ @onclick="@ShowDialogGeneralAsync">
General Dialog
- Launches a general dialog. Look at the result shown in a toast when you click a button, hit escape of click the scrim. Shows
- a checkbox and radio buttons to demonstrate that these are correctly initiated with Material Theme javascript when rendered inside a dialog.
+ Launches a general dialog. Look at the result shown in a toast when you click a button, hit escape or click the scrim. Shows
+ a checkbox and radio buttons to demonstrate that these are correctly initiated when rendered inside a dialog.
+
NOTE -- Since they are rendered 'inside' a MWC component there is an issue with styles
Use nuget to procure the current release.
@@ -25,7 +24,7 @@
MIT License.
- One of Material Theme's benefits is the ability to theme, using either SASS mixins (preferred and more capable) or CSS variables. We have four SASS mixin driven themes on
+ TBD -> One of Material Design's benefits is the ability to theme, using either SASS mixins (preferred and more capable) or CSS variables. We have four SASS mixin driven themes on
this website which you can select from a menu when you click the action button on the far right of the top app bar. Look particularly at how these four themes affect
buttons and text fields. See the docs for more detail on how to theme. This site's theming can be found in
the GitHub repository, and you can see how we
diff --git a/Material.Blazor.Website.MD3/Pages/Index.razor.cs b/Material.Blazor.Website.MD3/Pages/Index.razor.cs
index 861f64226..6f1d110c2 100644
--- a/Material.Blazor.Website.MD3/Pages/Index.razor.cs
+++ b/Material.Blazor.Website.MD3/Pages/Index.razor.cs
@@ -3,7 +3,7 @@
using System.Runtime.InteropServices;
using System.Threading.Tasks;
-namespace Material.Blazor.Website.Pages;
+namespace Material.Blazor.Website.MD3.Pages;
public partial class Index
{
diff --git a/Material.Blazor.Website.MD3/Pages/Menu.razor b/Material.Blazor.Website.MD3/Pages/Menu.razor
index 320ef11e0..55d8d6402 100644
--- a/Material.Blazor.Website.MD3/Pages/Menu.razor
+++ b/Material.Blazor.Website.MD3/Pages/Menu.razor
@@ -3,6 +3,7 @@
@inject IMBToastService ToastService
@using Material.Blazor
+@using Material.Blazor.MenuClose
@@ -76,7 +77,9 @@
ButtonLabel="Open MD3 Menu"
ButtonLabelColor="darkblue"
ButtonStyle="@MBButtonStyle.Outlined"
- MenuItems="@menuItems" />
+ MenuItems="@menuItems"
+ MenuPositioning="MBMenuPositioning.Popover"
+ @onmenuclose="@OnMenuCloseClickHandler" />
@@ -179,4 +182,9 @@
EightSelected = (result == "Eight") ? !EightSelected : EightSelected;
menuItems[7].SuppressLeadingIcon = !EightSelected;
}
+
+ protected void OnMenuCloseClickHandler(MenuCloseEventArgs args)
+ {
+ ToastService.ShowToast(heading: "MW3 menu close", message: $"Value: '{args.CustomProperty2}'", level: MBToastLevel.Success, showIcon: false);
+ }
}
diff --git a/Material.Blazor.Website.MD3/Pages/Tabs.razor b/Material.Blazor.Website.MD3/Pages/Tabs.razor
new file mode 100644
index 000000000..d223aeccc
--- /dev/null
+++ b/Material.Blazor.Website.MD3/Pages/Tabs.razor
@@ -0,0 +1,504 @@
+@page "/tabs"
+
+@inject IMBToastService ToastService
+
+@using Material.Blazor
+
+
+
+
+ Demonstrates a list with list items, list dividers, and a list selection group.
+
+
+
+
+
+
+
+
+
+ Primary, text only
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Primary, text and icons
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Primary, text and icons, icons inline
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Primary, icons only
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Primary, text only, lengthy
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Secondary, text and icons
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Primary, text and icons, controlling tabpanels
+