$(DefaultNetCoreTargetFramework)
@@ -22,6 +22,7 @@
+
diff --git a/src/Components/test/testassets/BasicTestApp/CustomElementParameterTypes.razor b/src/Components/test/testassets/BasicTestApp/CustomElementParameterTypes.razor
new file mode 100644
index 000000000000..c5905a805148
--- /dev/null
+++ b/src/Components/test/testassets/BasicTestApp/CustomElementParameterTypes.razor
@@ -0,0 +1,48 @@
+@using Microsoft.JSInterop
+
+
+@nameof(StringParam): @StringParam
+@nameof(BoolParam): @BoolParam
+@nameof(IntParam): @IntParam
+@nameof(LongParam): @LongParam
+@nameof(FloatParam): @FloatParam
+@nameof(DoubleParam): @DoubleParam
+@nameof(DecimalParam): @DecimalParam
+@nameof(NullableBoolParam): @(NullableBoolParam?.ToString() ?? "null")
+@nameof(NullableIntParam): @(NullableIntParam?.ToString() ?? "null")
+@nameof(NullableLongParam): @(NullableLongParam?.ToString() ?? "null")
+@nameof(NullableFloatParam): @(NullableFloatParam?.ToString() ?? "null")
+@nameof(NullableDoubleParam): @(NullableDoubleParam?.ToString() ?? "null")
+@nameof(NullableDecimalParam): @(NullableDecimalParam?.ToString() ?? "null")
+@nameof(ComplexTypeParam): @ComplexTypeParam
+
+@code {
+ [Parameter] public string StringParam { get; set; }
+ [Parameter] public bool BoolParam { get; set; }
+ [Parameter] public int IntParam { get; set; }
+ [Parameter] public long LongParam { get; set; }
+ [Parameter] public float FloatParam { get; set; }
+ [Parameter] public double DoubleParam { get; set; }
+ [Parameter] public decimal DecimalParam { get; set; }
+ [Parameter] public bool? NullableBoolParam { get; set; }
+ [Parameter] public int? NullableIntParam { get; set; }
+ [Parameter] public long? NullableLongParam { get; set; }
+ [Parameter] public float? NullableFloatParam { get; set; }
+ [Parameter] public double? NullableDoubleParam { get; set; }
+ [Parameter] public decimal? NullableDecimalParam { get; set; }
+ [Parameter] public MyComplexType ComplexTypeParam { get; set; }
+ [Parameter] public EventCallback CallbackParam { get; set; }
+
+ private async Task InvokeCallbackAsync()
+ {
+ await CallbackParam.InvokeAsync();
+ }
+
+ public class MyComplexType
+ {
+ public string Property { get; set; }
+
+ public override string ToString()
+ => $@"{{ {nameof(Property)} = ""{Property}"" }}";
+ }
+}
diff --git a/src/Components/test/testassets/BasicTestApp/CustomElementsComponent.razor b/src/Components/test/testassets/BasicTestApp/CustomElementsComponent.razor
new file mode 100644
index 000000000000..f88ab8d3f022
--- /dev/null
+++ b/src/Components/test/testassets/BasicTestApp/CustomElementsComponent.razor
@@ -0,0 +1,75 @@
+@using Microsoft.JSInterop
+@inject IJSRuntime JSRuntime
+
+CustomElementsComponent
+
+
+
+
+
+
+@for (var i = 0; i < _customElements.Count; i++)
+{
+ var customElement = _customElements[i];
+ var clickCount = customElement.ClickCount;
+
+
+
+
+
+}
+
+@code {
+ private List _customElements = new();
+
+ private void AddCustomElement()
+ {
+ _customElements.Add(new(JSRuntime));
+ }
+
+ private void RemoveCustomElement()
+ {
+ if (_customElements.Count != 0)
+ {
+ _customElements.RemoveAt(_customElements.Count - 1);
+ }
+ }
+
+ private class CustomElementWrapper
+ {
+ private readonly IJSRuntime _jsRuntime;
+
+ public ElementReference Reference { get; set; }
+ public int ClickCount { get; private set; }
+
+ public CustomElementWrapper(IJSRuntime jsRuntime)
+ {
+ _jsRuntime = jsRuntime;
+ }
+
+ public void IncrementCount()
+ {
+ ClickCount++;
+ }
+
+ public async Task UpdateComplexParameters()
+ {
+ await _jsRuntime.InvokeVoidAsync("customElementFunctions.updateComplexProperties", Reference, ClickCount);
+ }
+ }
+}
diff --git a/src/Components/test/testassets/BasicTestApp/Index.razor b/src/Components/test/testassets/BasicTestApp/Index.razor
index 87da2d67e4d3..b856c58b6124 100644
--- a/src/Components/test/testassets/BasicTestApp/Index.razor
+++ b/src/Components/test/testassets/BasicTestApp/Index.razor
@@ -18,6 +18,7 @@
+
diff --git a/src/Components/test/testassets/BasicTestApp/Program.cs b/src/Components/test/testassets/BasicTestApp/Program.cs
index b669190d7de0..0cef496473e0 100644
--- a/src/Components/test/testassets/BasicTestApp/Program.cs
+++ b/src/Components/test/testassets/BasicTestApp/Program.cs
@@ -28,6 +28,7 @@ public static async Task Main(string[] args)
builder.RootComponents.RegisterForJavaScript(
"component-with-many-parameters",
javaScriptInitializer: "myJsRootComponentInitializers.testInitializer");
+ builder.RootComponents.RegisterCustomElement("my-custom-element");
builder.Services.AddSingleton(new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
builder.Services.AddSingleton();
diff --git a/src/Components/test/testassets/BasicTestApp/wwwroot/index.html b/src/Components/test/testassets/BasicTestApp/wwwroot/index.html
index 02bdad915168..9048aa642710 100644
--- a/src/Components/test/testassets/BasicTestApp/wwwroot/index.html
+++ b/src/Components/test/testassets/BasicTestApp/wwwroot/index.html
@@ -31,6 +31,7 @@
+
+
+
+