diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Startup.cs b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Startup.cs
new file mode 100644
index 0000000..7422cd8
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/Startup.cs
@@ -0,0 +1,20 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using Microsoft.AspNetCore.Components.Builder;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace Microsoft.AspNetCore.Blazor.E2EPerformance
+{
+ public class Startup
+ {
+ public void ConfigureServices(IServiceCollection services)
+ {
+ }
+
+ public void Configure(IComponentsApplicationBuilder app)
+ {
+ app.AddComponent("app");
+ }
+ }
+}
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/_ViewImports.cshtml b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/_ViewImports.cshtml
new file mode 100644
index 0000000..aaba22f
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/_ViewImports.cshtml
@@ -0,0 +1,6 @@
+@using System.Net.Http
+@using Microsoft.AspNetCore.Components.Layouts
+@using Microsoft.AspNetCore.Components.Routing
+@using Microsoft.JSInterop
+@using Microsoft.AspNetCore.Blazor.E2EPerformance
+@using Microsoft.AspNetCore.Blazor.E2EPerformance.Shared
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.Build b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.Build
new file mode 100755
index 0000000..5c5aef1
Binary files /dev/null and b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.Build differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.E2EPerformance.blazor.config b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.E2EPerformance.blazor.config
new file mode 100644
index 0000000..92f028a
Binary files /dev/null and b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.E2EPerformance.blazor.config differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.E2EPerformance.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.E2EPerformance.dll
new file mode 100644
index 0000000..a46b8aa
Binary files /dev/null and b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.E2EPerformance.dll differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.E2EPerformance.pdb b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.E2EPerformance.pdb
new file mode 100644
index 0000000..c53d541
Binary files /dev/null and b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.E2EPerformance.pdb differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.dll
new file mode 100644
index 0000000..e9120e7
Binary files /dev/null and b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.dll differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.pdb b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.pdb
new file mode 100644
index 0000000..d16331b
Binary files /dev/null and b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Blazor.pdb differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.Browser.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.Browser.dll
new file mode 100644
index 0000000..73f7d6f
Binary files /dev/null and b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.Browser.dll differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.Browser.pdb b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.Browser.pdb
new file mode 100644
index 0000000..d06f033
Binary files /dev/null and b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.Browser.pdb differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.Browser.xml b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.Browser.xml
new file mode 100644
index 0000000..a29c7c4
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.Browser.xml
@@ -0,0 +1,68 @@
+
+
+
+ Microsoft.AspNetCore.Components.Browser
+
+
+
+
+ Framework infrastructure, not intended to be used by application code.
+
+
+
+
+ Framework infrastructure, not intended to be used by application code.
+
+
+
+
+ Framework infrastructure, not intended by used by application code.
+
+
+
+
+ Framework infrastructure, not intended by used by application code.
+
+
+
+
+ Framework infrastructure, not intended by used by application code.
+
+
+
+
+ Framework infrastructure, not intended by used by application code.
+
+
+
+
+ Provides mechanisms for dispatching events to components in a .
+
+
+
+
+ For framework use only.
+
+
+
+
+ For framework use only.
+
+
+
+
+ For framework use only.
+
+
+
+
+ For framework use only.
+
+
+
+
+ For framework use only.
+
+
+
+
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.dll
new file mode 100644
index 0000000..0a67d89
Binary files /dev/null and b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.dll differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.pdb b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.pdb
new file mode 100644
index 0000000..8b13f2f
Binary files /dev/null and b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.pdb differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.xml b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.xml
new file mode 100644
index 0000000..b9e4735
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.AspNetCore.Components.xml
@@ -0,0 +1,4530 @@
+
+
+
+ Microsoft.AspNetCore.Components
+
+
+
+
+ Infrastructure for the discovery of bind attributes for markup elements.
+
+
+ To extend the set of bind attributes, define a public class named
+ BindAttributes and annotate it with the appropriate attributes.
+
+
+
+
+ Configures options for binding specific element types.
+
+
+
+
+ Constructs an instance of .
+
+ The tag name of the element.
+ The suffix value. For example, set this to value for bind-value, or set this to null for bind.
+ The name of the value attribute to be bound.
+ The name of an attribute that will register an associated change event.
+
+
+
+ Gets the tag name of the element.
+
+
+
+
+ Gets the suffix value.
+ For example, this will be value to mean bind-value, or null to mean bind.
+
+
+
+
+ Gets the name of the value attribute to be bound.
+
+
+
+
+ Gets the name of an attribute that will register an associated change event.
+
+
+
+
+ Configures options for binding subtypes of an HTML input element.
+
+
+
+
+ Constructs an instance of .
+
+ The value of the element's type attribute.
+ The suffix value.
+ The name of the value attribute to be bound.
+ The name of an attribute that will register an associated change event.
+
+
+
+ Gets the value of the element's type attribute.
+
+
+
+
+ Gets the suffix value.
+
+
+
+
+ Gets the name of the value attribute to be bound.
+
+
+
+
+ Gets the name of an attribute that will register an associated change event.
+
+
+
+
+ Methods used internally by @bind syntax. Not intended to be used directly.
+
+
+
+
+ Not intended to be used directly.
+
+
+
+
+ Not intended to be used directly.
+
+
+
+
+ Not intended to be used directly.
+
+
+
+
+ Not intended to be used directly.
+
+
+
+
+ Not intended to be used directly.
+
+
+
+
+ Not intended to be used directly.
+
+
+
+
+ Not intended to be used directly.
+
+
+
+
+ Not intended to be used directly.
+
+
+
+
+ Not intended to be used directly.
+
+
+
+
+ Not intended to be used directly.
+
+
+
+
+ Not intended to be used directly.
+
+
+
+
+ Not intended to be used directly.
+
+
+
+
+ Not intended to be used directly.
+
+
+
+
+ Not intended to be used directly.
+
+
+
+
+ Not intended to be used directly.
+
+
+
+
+ Not intended to be used directly.
+
+
+
+
+ Not intended to be used directly.
+
+
+
+
+ Not intended to be used directly.
+
+
+
+
+ Not intended to be used directly.
+
+
+
+
+ Not intended to be used directly.
+
+
+
+
+ Not intended to be used directly.
+
+
+
+
+ Not intended to be used directly.
+
+
+
+
+ Not intended to be used directly.
+
+
+
+
+ Not intended to be used directly.
+
+
+
+
+ Not intended to be used directly.
+
+
+
+
+ Denotes the target member as a cascading component parameter. Its value will be
+ supplied by the closest ancestor component that
+ supplies values with a compatible type and name.
+
+
+
+
+ If specified, the parameter value will be supplied by the closest
+ ancestor that supplies a value with
+ this name.
+
+ If null, the parameter value will be supplied by the closest ancestor
+ that supplies a value with a compatible
+ type.
+
+
+
+
+ A component that provides a cascading value to all descendant components.
+
+
+
+
+ The content to which the value should be provided.
+
+
+
+
+ The value to be provided.
+
+
+
+
+ Optionally gives a name to the provided value. Descendant components
+ will be able to receive the value by specifying this name.
+
+ If no name is specified, then descendant components will receive the
+ value based the type of value they are requesting.
+
+
+
+
+ If true, indicates that will not change. This is a
+ performance optimization that allows the framework to skip setting up
+ change notifications. Set this flag only if you will not change
+ during the component's lifetime.
+
+
+
+
+
+
+
+
+
+
+ Optional base class for components. Alternatively, components may
+ implement directly.
+
+
+
+
+ Specifies the name of the -building method.
+
+
+
+
+ Constructs an instance of .
+
+
+
+
+ Renders the component to the supplied .
+
+ A that will receive the render output.
+
+
+
+ Method invoked when the component is ready to start, having received its
+ initial parameters from its parent in the render tree.
+
+
+
+
+ Method invoked when the component is ready to start, having received its
+ initial parameters from its parent in the render tree.
+
+ Override this method if you will perform an asynchronous operation and
+ want the component to refresh when that operation is completed.
+
+ A representing any asynchronous operation.
+
+
+
+ Method invoked when the component has received parameters from its parent in
+ the render tree, and the incoming values have been assigned to properties.
+
+
+
+
+ Method invoked when the component has received parameters from its parent in
+ the render tree, and the incoming values have been assigned to properties.
+
+ A representing any asynchronous operation.
+
+
+
+ Notifies the component that its state has changed. When applicable, this will
+ cause the component to be re-rendered.
+
+
+
+
+ Returns a flag to indicate whether the component should render.
+
+
+
+
+
+ Method invoked after each time the component has been rendered.
+
+
+
+
+ Method invoked after each time the component has been rendered. Note that the component does
+ not automatically re-render after the completion of any returned , because
+ that would cause an infinite render loop.
+
+ A representing any asynchronous operation.
+
+
+
+ Executes the supplied work item on the associated renderer's
+ synchronization context.
+
+ The work item to execute.
+
+
+
+ Executes the supplied work item on the associated renderer's
+ synchronization context.
+
+ The work item to execute.
+
+
+
+ Method invoked to apply initial or updated parameters to the component.
+
+ The parameters to apply.
+
+
+
+ Resolves components for an application.
+
+
+
+
+ Lists all the types
+
+
+
+
+
+
+ Represents a reference to a rendered element.
+
+
+
+
+ A bound event handler delegate.
+
+
+
+
+ Gets a reference to the .
+
+
+
+
+ Gets an empty .
+
+
+
+
+ Creates the new .
+
+ The event receiver.
+ The delegate to bind.
+
+
+
+ Gets a value that indicates whether the delegate associated with this event dispatcher is non-null.
+
+
+
+
+ Invokes the delegate associated with this binding and dispatches an event notification to the
+ appropriate component.
+
+ The argument.
+ A which completes asynchronously once event processing has completed.
+
+
+
+ A bound event handler delegate.
+
+
+
+
+ Creates the new .
+
+ The event receiver.
+ The delegate to bind.
+
+
+
+ Gets a value that indicates whether the delegate associated with this event dispatcher is non-null.
+
+
+
+
+ Invokes the delegate associated with this binding and dispatches an event notification to the
+ appropriate component.
+
+ The argument.
+ A which completes asynchronously once event processing has completed.
+
+
+
+ A factory for creating and
+ instances.
+
+
+
+
+ Returns the provided . For internal framework use only.
+
+
+
+
+
+
+
+ Creates an for the provided and
+ .
+
+ The event receiver.
+ The event callback.
+ The .
+
+
+
+ Creates an for the provided and
+ .
+
+ The event receiver.
+ The event callback.
+ The .
+
+
+
+ Creates an for the provided and
+ .
+
+ The event receiver.
+ The event callback.
+ The .
+
+
+
+ Creates an for the provided and
+ .
+
+ The event receiver.
+ The event callback.
+ The .
+
+
+
+ Returns the provided . For internal framework use only.
+
+
+
+
+
+
+
+ Returns the provided . For internal framework use only.
+
+
+
+
+
+
+
+ Returns the provided . For internal framework use only.
+
+
+
+
+
+
+
+ Creates an for the provided and
+ .
+
+ The event receiver.
+ The event callback.
+ The .
+
+
+
+ Creates an for the provided and
+ .
+
+ The event receiver.
+ The event callback.
+ The .
+
+
+
+ Creates an for the provided and
+ .
+
+ The event receiver.
+ The event callback.
+ The .
+
+
+
+ Creates an for the provided and
+ .
+
+ The event receiver.
+ The event callback.
+ The .
+
+
+
+ Creates an for the provided and
+ . For internal framework use only.
+
+
+
+
+
+
+
+
+ Creates an for the provided and
+ . For internal framework use only.
+
+
+
+
+
+
+
+
+ Contains extension methods for two-way binding using . For internal use only.
+
+
+
+
+ For internal use only.
+
+
+
+
+
+
+
+
+
+ For internal use only.
+
+
+
+
+
+
+
+
+
+ For internal use only.
+
+
+
+
+
+
+
+
+
+ For internal use only.
+
+
+
+
+
+
+
+
+
+ For internal use only.
+
+
+
+
+
+
+
+
+
+ For internal use only.
+
+
+
+
+
+
+
+
+
+ For internal use only.
+
+
+
+
+
+
+
+
+
+ For internal use only.
+
+
+
+
+
+
+
+
+
+ For internal use only.
+
+
+
+
+
+
+
+
+
+ For internal use only.
+
+
+
+
+
+
+
+
+
+ For internal use only.
+
+
+
+
+
+
+
+
+
+ For internal use only.
+
+
+
+
+
+
+
+
+
+ For internal use only.
+
+
+
+
+
+
+
+
+
+ For internal use only.
+
+
+
+
+
+
+
+
+
+ For internal use only.
+
+
+
+
+
+
+
+
+
+
+ For internal use only.
+
+
+
+
+
+
+
+
+
+
+ Provides extension methods for and types. For internal
+ framework use.
+
+
+
+
+ Creates an for the provided and
+ .
+
+ The .
+ The event receiver.
+ The event callback.
+ The .
+
+
+
+ Creates an for the provided and
+ .
+
+ The .
+ The event receiver.
+ The event callback.
+ The .
+
+
+
+ Creates an for the provided and
+ .
+
+ The .
+ The event receiver.
+ The event callback.
+ The .
+
+
+
+ Creates an for the provided and
+ .
+
+ The .
+ The event receiver.
+ The event callback.
+ The .
+
+
+
+ Creates an for the provided and
+ .
+
+ The .
+ The event receiver.
+ The event callback.
+ The .
+
+
+
+ Creates an for the provided and
+ .
+
+ The .
+ The event receiver.
+ The event callback.
+ The .
+
+
+
+ Creates an for the provided and
+ .
+
+ The .
+ The event receiver.
+ The event callback.
+ The .
+
+
+
+ Creates an for the provided and
+ .
+
+ The .
+ The event receiver.
+ The event callback.
+ The .
+
+
+
+ Creates an for the provided and
+ .
+
+ The .
+ The event receiver.
+ The event callback.
+ The .
+
+
+
+ Creates an for the provided and
+ .
+
+ The .
+ The event receiver.
+ The event callback.
+ The .
+
+
+
+ Creates an for the provided and
+ .
+
+ The .
+ The event receiver.
+ The event callback.
+ The .
+
+
+
+ Creates an for the provided and
+ .
+
+ The .
+ The event receiver.
+ The event callback.
+ The .
+
+
+
+ Creates an for the provided and
+ .
+
+ The .
+ The event receiver.
+ The event callback.
+ The .
+
+
+
+ Creates an for the provided and
+ .
+
+ The .
+ The event receiver.
+ The event callback.
+ The .
+
+
+
+ Creates an for the provided and
+ .
+
+ The .
+ The event receiver.
+ The event callback.
+ The .
+
+
+
+ Creates an for the provided and
+ .
+
+ The .
+ The event receiver.
+ The event callback.
+ The .
+
+
+
+ Creates an for the provided and
+ .
+
+ The .
+ The event receiver.
+ The event callback.
+ The .
+
+
+
+ Creates an for the provided and
+ .
+
+ The .
+ The event receiver.
+ The event callback.
+ The .
+
+
+
+ Creates an for the provided and
+ .
+
+ The .
+ The event receiver.
+ The event callback.
+ The .
+
+
+
+ Creates an for the provided and
+ .
+
+ The .
+ The event receiver.
+ The event callback.
+ The .
+
+
+
+ Creates an for the provided and
+ .
+
+ The .
+ The event receiver.
+ The event callback.
+ The .
+
+
+
+ Creates an for the provided and
+ .
+
+ The .
+ The event receiver.
+ The event callback.
+ The .
+
+
+
+ Creates an for the provided and
+ .
+
+ The .
+ The event receiver.
+ The event callback.
+ The .
+
+
+
+ Creates an for the provided and
+ .
+
+ The .
+ The event receiver.
+ The event callback.
+ The .
+
+
+
+ Wraps a callback delegate associated with an event.
+
+
+
+
+ An empty .
+
+
+
+
+ Creates a new with the provided .
+
+ The callback delegate.
+
+
+
+ Invokes the delegate associated with this .
+
+ The argument to provide to the delegate. May be null.
+ A then will complete asynchronously once the delegate has completed.
+
+
+
+ Associates an event argument type with an event attribute name.
+
+
+
+
+ Constructs an instance of .
+
+
+
+
+
+
+ Gets the attribute name.
+
+
+
+
+ Gets the event argument type.
+
+
+
+
+ Holds attributes to configure the mappings between event names and
+ event argument types.
+
+
+
+
+ Adds Data Annotations validation support to an .
+
+
+
+
+
+
+
+ Holds metadata related to a data editing process, such as flags to indicate which
+ fields have been modified and the current set of validation messages.
+
+
+
+
+ Constructs an instance of .
+
+ The model object for the . This object should hold the data being edited, for example as a set of properties.
+
+
+
+ An event that is raised when a field value changes.
+
+
+
+
+ An event that is raised when validation is requested.
+
+
+
+
+ An event that is raised when validation state has changed.
+
+
+
+
+ Supplies a corresponding to a specified field name
+ on this 's .
+
+ The name of the editable field.
+ A corresponding to a specified field name on this 's .
+
+
+
+ Gets the model object for this .
+
+
+
+
+ Signals that the value for the specified field has changed.
+
+ Identifies the field whose value has been changed.
+
+
+
+ Signals that some aspect of validation state has changed.
+
+
+
+
+ Clears any modification flag that may be tracked for the specified field.
+
+ Identifies the field whose modification flag (if any) should be cleared.
+
+
+
+ Clears all modification flags within this .
+
+
+
+
+ Determines whether any of the fields in this have been modified.
+
+ True if any of the fields in this have been modified; otherwise false.
+
+
+
+ Gets the current validation messages across all fields.
+
+ This method does not perform validation itself. It only returns messages determined by previous validation actions.
+
+ The current validation messages.
+
+
+
+ Gets the current validation messages for the specified field.
+
+ This method does not perform validation itself. It only returns messages determined by previous validation actions.
+
+ Identifies the field whose current validation messages should be returned.
+ The current validation messages for the specified field.
+
+
+
+ Determines whether the specified fields in this has been modified.
+
+ True if the field has been modified; otherwise false.
+
+
+
+ Validates this .
+
+ True if there are no validation messages after validation; otherwise false.
+
+
+
+ Extension methods to add DataAnnotations validation to an .
+
+
+
+
+ Adds DataAnnotations validation support to the .
+
+ The .
+
+
+
+ Provides extension methods to simplify using with expressions.
+
+
+
+
+ Gets the current validation messages for the specified field.
+
+ This method does not perform validation itself. It only returns messages determined by previous validation actions.
+
+ The .
+ Identifies the field whose current validation messages should be returned.
+ The current validation messages for the specified field.
+
+
+
+ Determines whether the specified fields in this has been modified.
+
+ The .
+ Identifies the field whose current validation messages should be returned.
+ True if the field has been modified; otherwise false.
+
+
+
+ Provides extension methods to describe the state of
+ fields as CSS class names.
+
+
+
+
+ Gets a string that indicates the status of the specified field. This will include
+ some combination of "modified", "valid", or "invalid", depending on the status of the field.
+
+ The .
+ An identifier for the field.
+ A string that indicates the status of the field.
+
+
+
+ Gets a string that indicates the status of the specified field. This will include
+ some combination of "modified", "valid", or "invalid", depending on the status of the field.
+
+ The .
+ An identifier for the field.
+ A string that indicates the status of the field.
+
+
+
+ Renders a form element that cascades an to descendants.
+
+
+
+
+ Constructs an instance of .
+
+
+
+
+ Supplies the edit context explicitly. If using this parameter, do not
+ also supply , since the model value will be taken
+ from the property.
+
+
+
+
+ Specifies the top-level model object for the form. An edit context will
+ be constructed for this model. If using this parameter, do not also supply
+ a value for .
+
+
+
+
+ Specifies the content to be rendered inside this .
+
+
+
+
+ A callback that will be invoked when the form is submitted.
+
+ If using this parameter, you are responsible for triggering any validation
+ manually, e.g., by calling .
+
+
+
+
+ A callback that will be invoked when the form is submitted and the
+ is determined to be valid.
+
+
+
+
+ A callback that will be invoked when the form is submitted and the
+ is determined to be invalid.
+
+
+
+
+
+
+
+
+
+
+ Provides information about the event.
+
+
+
+
+ Identifies the field whose value has changed.
+
+
+
+
+ Uniquely identifies a single field that can be edited. This may correspond to a property on a
+ model object, or can be any other named value.
+
+
+
+
+ Initializes a new instance of the structure.
+
+ An expression that identifies an object member.
+
+
+
+ Initializes a new instance of the structure.
+
+ The object that owns the field.
+ The name of the editable field.
+
+
+
+ Gets the object that owns the editable field.
+
+
+
+
+ Gets the name of the editable field.
+
+
+
+
+
+
+
+
+
+
+ A base class for form input components. This base class automatically
+ integrates with an , which must be supplied
+ as a cascading parameter.
+
+
+
+
+ Gets a value for the component's 'id' attribute.
+
+
+
+
+ Gets a value for the component's 'class' attribute.
+
+
+
+
+ Gets or sets the value of the input. This should be used with two-way binding.
+
+
+ bind-Value="@model.PropertyName"
+
+
+
+
+ Gets or sets a callback that updates the bound value.
+
+
+
+
+ Gets or sets an expression that identifies the bound value.
+
+
+
+
+ Gets the associated .
+
+
+
+
+ Gets the for the bound value.
+
+
+
+
+ Gets or sets the current value of the input.
+
+
+
+
+ Gets or sets the current value of the input, represented as a string.
+
+
+
+
+ Formats the value as a string. Derived classes can override this to determine the formating used for .
+
+ The value to format.
+ A string representation of the value.
+
+
+
+ Parses a string to create an instance of . Derived classes can override this to change how
+ interprets incoming values.
+
+ The string value to be parsed.
+ An instance of .
+ If the value could not be parsed, provides a validation error message.
+ True if the value could be parsed; otherwise false.
+
+
+
+ Gets a string that indicates the status of the field being edited. This will include
+ some combination of "modified", "valid", or "invalid", depending on the status of the field.
+
+
+
+
+ Gets a CSS class string that combines the and
+ properties. Derived components should typically use this value for the primary HTML element's
+ 'class' attribute.
+
+
+
+
+
+
+
+ An input component for editing values.
+
+
+
+
+
+
+
+
+
+
+ An input component for editing date values.
+ Supported types are and .
+
+
+
+
+
+
+
+
+
+
+
+
+
+ An input component for editing numeric values.
+ Supported numeric types are , , , , .
+
+
+
+
+
+
+
+
+
+
+ A dropdown selection component.
+
+
+
+
+
+
+
+
+
+
+ An input component for editing values.
+
+
+
+
+
+
+
+
+
+
+ A multiline input component for editing values.
+
+
+
+
+
+
+
+
+
+
+ Displays a list of validation messages for a specified field within a cascaded .
+
+
+
+
+ Specifies the field for which validation messages should be displayed.
+
+
+
+ `
+ Constructs an instance of .
+
+
+
+
+
+
+
+
+
+
+ Holds validation messages for an .
+
+
+
+
+ Creates an instance of .
+
+ The with which this store should be associated.
+
+
+
+ Adds a validation message for the specified field.
+
+ The identifier for the field.
+ The validation message.
+
+
+
+ Adds the messages from the specified collection for the specified field.
+
+ The identifier for the field.
+ The validation messages to be added.
+
+
+
+ Gets the validation messages within this for the specified field.
+
+ To get the validation messages across all validation message stores, use instead
+
+ The identifier for the field.
+ The validation messages for the specified field within this .
+
+
+
+ Gets the validation messages within this for the specified field.
+
+ To get the validation messages across all validation message stores, use instead
+
+ The identifier for the field.
+ The validation messages for the specified field within this .
+
+
+
+ Removes all messages within this .
+
+
+
+
+ Removes all messages within this for the specified field.
+
+ The identifier for the field.
+
+
+
+ Provides extension methods to simplify using with expressions.
+
+
+
+
+ Adds a validation message for the specified field.
+
+ The .
+ Identifies the field for which to add the message.
+ The validation message.
+
+
+
+ Adds the messages from the specified collection for the specified field.
+
+ The .
+ Identifies the field for which to add the messages.
+ The validation messages to be added.
+
+
+
+ Removes all messages within this for the specified field.
+
+ The .
+ Identifies the field for which to remove the messages.
+
+
+
+ Provides information about the event.
+
+
+
+
+ Provides information about the event.
+
+
+
+
+ Displays a list of validation messages from a cascaded .
+
+
+
+ `
+ Constructs an instance of .
+
+
+
+
+
+
+
+
+
+
+ Extension methods for working with JSON APIs.
+
+
+
+
+ Sends a GET request to the specified URI, and parses the JSON response body
+ to create an object of the generic type.
+
+ A type into which the response body can be JSON-deserialized.
+ The .
+ The URI that the request will be sent to.
+ The response parsed as an object of the generic type.
+
+
+
+ Sends a POST request to the specified URI, including the specified
+ in JSON-encoded format, and parses the JSON response body to create an object of the generic type.
+
+ The .
+ The URI that the request will be sent to.
+ Content for the request body. This will be JSON-encoded and sent as a string.
+ The response parsed as an object of the generic type.
+
+
+
+ Sends a POST request to the specified URI, including the specified
+ in JSON-encoded format, and parses the JSON response body to create an object of the generic type.
+
+ A type into which the response body can be JSON-deserialized.
+ The .
+ The URI that the request will be sent to.
+ Content for the request body. This will be JSON-encoded and sent as a string.
+ The response parsed as an object of the generic type.
+
+
+
+ Sends a PUT request to the specified URI, including the specified
+ in JSON-encoded format.
+
+ The .
+ The URI that the request will be sent to.
+ Content for the request body. This will be JSON-encoded and sent as a string.
+
+
+
+ Sends a PUT request to the specified URI, including the specified
+ in JSON-encoded format, and parses the JSON response body to create an object of the generic type.
+
+ A type into which the response body can be JSON-deserialized.
+ The .
+ The URI that the request will be sent to.
+ Content for the request body. This will be JSON-encoded and sent as a string.
+ The response parsed as an object of the generic type.
+
+
+
+ Sends an HTTP request to the specified URI, including the specified
+ in JSON-encoded format.
+
+ The .
+ The HTTP method.
+ The URI that the request will be sent to.
+ Content for the request body. This will be JSON-encoded and sent as a string.
+
+
+
+ Sends an HTTP request to the specified URI, including the specified
+ in JSON-encoded format, and parses the JSON response body to create an object of the generic type.
+
+ A type into which the response body can be JSON-deserialized.
+ The .
+ The HTTP method.
+ The URI that the request will be sent to.
+ Content for the request body. This will be JSON-encoded and sent as a string.
+ The response parsed as an object of the generic type.
+
+
+
+ Represents a UI component.
+
+
+
+
+ Initializes the component.
+
+ A that allows the component to be rendered.
+
+
+
+ Sets parameters supplied by the component's parent in the render tree.
+
+ The parameters.
+ A that completes when the component has finished updating and rendering itself.
+
+
+
+ Interface implemented by components that receive notification that they have been rendered.
+
+
+
+
+ Notifies the component that it has been rendered.
+
+ A that represents the asynchronous event handling operation.
+
+
+
+ Interface implemented by components that receive notification of state changes.
+
+
+
+
+ Notifies the a state change has been triggered.
+
+ The associated with this event.
+ The argument associated with this event.
+
+ A that completes once the component has processed the state change.
+
+
+
+
+ Indicates that the associated property should have a value injected from the
+ service provider during initialization.
+
+
+
+
+ Indicates that the associated component type uses a specified layout.
+
+
+
+
+ The type of the layout. The type myst implement
+ and must accept a parameter with the name 'Body'.
+
+
+
+
+ Constructs an instance of .
+
+ The type of the layout.
+
+
+
+ Optional base class for components that represent a layout.
+ Alternatively, components may implement directly
+ and declare their own parameter named .
+
+
+
+
+ Gets the content to be rendered inside the layout.
+
+
+
+
+ Displays the specified page component, rendering it inside its layout
+ and any further nested layouts.
+
+
+
+
+ Gets or sets the type of the page component to display.
+ The type must implement .
+
+
+
+
+ Gets or sets the parameters to pass to the page.
+
+
+
+
+
+
+
+
+
+
+ A string value that can be rendered as markup such as HTML.
+
+
+
+
+ Constructs an instance of .
+
+ The value for the new instance.
+
+
+
+ Gets the value of the .
+
+
+
+
+ Casts a to a .
+
+ The value.
+
+
+
+
+
+
+ Represents a single parameter supplied to an
+ by its parent in the render tree.
+
+
+
+
+ Gets the name of the parameter.
+
+
+
+
+ Gets the value being supplied for the parameter.
+
+
+
+
+ Gets a value to indicate whether the parameter is cascading, meaning that it
+ was supplied by a .
+
+
+
+
+ Denotes the target member as a component parameter.
+
+
+
+
+ Represents a collection of parameters supplied to an
+ by its parent in the render tree.
+
+
+
+
+ Gets an empty .
+
+
+
+
+ Returns an enumerator that iterates through the .
+
+ The enumerator.
+
+
+
+ Gets the value of the parameter with the specified name.
+
+ The type of the value.
+ The name of the parameter.
+ Receives the result, if any.
+ True if a matching parameter was found; false otherwise.
+
+
+
+ Gets the value of the parameter with the specified name, or a default value
+ if no such parameter exists in the collection.
+
+ The type of the value.
+ The name of the parameter.
+ The parameter value if found; otherwise the default value for the specified type.
+
+
+
+ Gets the value of the parameter with the specified name, or a specified default value
+ if no such parameter exists in the collection.
+
+ The type of the value.
+ The name of the parameter.
+ The default value to return if no such parameter exists in the collection.
+ The parameter value if found; otherwise .
+
+
+
+ Returns a dictionary populated with the contents of the .
+
+ A dictionary populated with the contents of the .
+
+
+
+ Creates a new from the given .
+
+ The with the parameters.
+ A .
+
+
+
+ Extension methods for the type.
+
+
+
+
+ For each parameter property on , updates its value to
+ match the corresponding entry in the .
+
+ The .
+ An object that has a public writable property matching each parameter's name and type.
+
+
+
+ An enumerator that iterates through a .
+
+
+
+
+ Gets the current value of the enumerator.
+
+
+
+
+ Instructs the enumerator to move to the next value in the sequence.
+
+ A flag to indicate whether or not there is a next value.
+
+
+
+ Represents a segment of UI content, implemented as a delegate that
+ writes the content to a .
+
+ The to which the content should be written.
+
+
+
+ Represents a segment of UI content for an object of type , implemented as
+ a function that returns a .
+
+ The type of object.
+ The value used to build the content.
+
+
+
+ Allows a component to notify the renderer that it should be rendered.
+
+
+
+
+ Gets a value that indicates whether the has been
+ initialised and is ready to use.
+
+
+
+
+ Notifies the renderer that the component should be rendered.
+
+ The content that should be rendered.
+
+
+
+ Executes the supplied work item on the renderer's
+ synchronization context.
+
+ The work item to execute.
+
+
+
+ Executes the supplied work item on the renderer's
+ synchronization context.
+
+ The work item to execute.
+
+
+
+ Tracks the rendering state associated with an instance
+ within the context of a . This is an internal implementation
+ detail of .
+
+
+
+
+ Constructs an instance of .
+
+ The with which the new instance should be associated.
+ The externally visible identifier for the . The identifier must be unique in the context of the .
+ The whose state is being tracked.
+ The for the parent component, or null if this is a root component.
+
+
+
+ A that produces HTML.
+
+
+
+
+ Initializes a new instance of .
+
+ The to use to instantiate components.
+ A that will HTML encode the given string.
+
+
+
+
+
+
+
+ Renders a component into a sequence of fragments that represent the textual representation
+ of the HTML produced by the component.
+
+ The type of the .
+ A with the initial parameters to render the component.
+ A that on completion returns a sequence of fragments that represent the HTML text of the component.
+
+
+
+ Renders a component into a sequence of fragments that represent the textual representation
+ of the HTML produced by the component.
+
+ The type of the .
+ A with the initial parameters to render the component.
+ A that on completion returns a sequence of fragments that represent the HTML text of the component.
+
+
+
+
+
+
+ Dispatches external actions to be executed on the context of a .
+
+
+
+
+ Invokes the given in the context of the associated .
+
+ The action to execute.
+ A that will be completed when the action has finished executing.
+
+
+
+ Invokes the given in the context of the associated .
+
+ The asynchronous action to execute.
+ A that will be completed when the action has finished executing.
+
+
+
+ Invokes the given in the context of the associated .
+
+ The function to execute.
+ A that will be completed when the function has finished executing.
+
+
+
+ Invokes the given in the context of the associated .
+
+ The asynchronous function to execute.
+ A that will be completed when the function has finished executing.
+
+
+
+ Describes a set of UI changes.
+
+
+
+
+ Gets the changes to components that were added or updated.
+
+
+
+
+ Gets render frames that may be referenced by entries in .
+ For example, edit entries of type
+ will point to an entry in this array to specify the subtree to be prepended.
+
+
+
+
+ Gets the IDs of the components that were disposed.
+
+
+
+
+ Gets the IDs of the event handlers that were disposed.
+
+
+
+
+ Collects the data produced by the rendering system during the course
+ of rendering a single batch. This tracks both the final output data
+ and the intermediate states (such as the queue of components still to
+ be rendered).
+
+
+
+
+ Provides mechanisms for rendering hierarchies of instances,
+ dispatching events to them, and notifying when the user interface is being updated.
+
+
+
+
+ Allows the caller to handle exceptions from the SynchronizationContext when one is available.
+
+
+
+
+ Constructs an instance of .
+
+ The to be used when initializing components.
+
+
+
+ Constructs an instance of .
+
+ The to be used when initializing components.
+ The to be for invoking user actions into the context.
+
+
+
+ Creates an that can be used with one or more .
+
+ The .
+
+
+
+ Constructs a new component of the specified type.
+
+ The type of the component to instantiate.
+ The component instance.
+
+
+
+ Associates the with the , assigning
+ an identifier that is unique within the scope of the .
+
+ The component.
+ The component's assigned identifier.
+
+
+
+ Gets the current render tree for a given component.
+
+ The id for the component.
+ The representing the current render tree.
+
+
+
+ Performs the first render for a root component, waiting for this component and all
+ children components to finish rendering in case there is any asynchronous work being
+ done by any of the components. After this, the root component
+ makes its own decisions about when to re-render, so there is no need to call
+ this more than once.
+
+ The ID returned by .
+
+ Rendering a root component is an asynchronous operation. Clients may choose to not await the returned task to
+ start, but not wait for the entire render to complete.
+
+
+
+
+ Performs the first render for a root component, waiting for this component and all
+ children components to finish rendering in case there is any asynchronous work being
+ done by any of the components. After this, the root component
+ makes its own decisions about when to re-render, so there is no need to call
+ this more than once.
+
+ The ID returned by .
+ The with the initial parameters to use for rendering.
+
+ Rendering a root component is an asynchronous operation. Clients may choose to not await the returned task to
+ start, but not wait for the entire render to complete.
+
+
+
+
+ Allows derived types to handle exceptions during rendering. Defaults to rethrowing the original exception.
+
+ The .
+
+
+
+ Updates the visible UI.
+
+ The changes to the UI since the previous call.
+ A to represent the UI update process.
+
+
+
+ Notifies the renderer that an event has occurred.
+
+ The value from the original event attribute.
+ Arguments to be passed to the event handler.
+
+ A which will complete once all asynchronous processing related to the event
+ has completed.
+
+
+
+
+ Executes the supplied work item on the renderer's
+ synchronization context.
+
+ The work item to execute.
+
+
+
+ Executes the supplied work item on the renderer's
+ synchronization context.
+
+ The work item to execute.
+
+
+
+ Schedules a render for the specified . Its display
+ will be populated using the specified .
+
+ The ID of the component to render.
+ A that will supply the updated UI contents.
+
+
+
+ Releases all resources currently used by this instance.
+
+ if this method is being invoked by , otherwise .
+
+
+
+ Releases all resources currently used by this instance.
+
+
+
+
+ Implements a list that uses an array of objects to store the elements.
+
+ This differs from a in that
+ it not only grows as required but also shrinks if cleared with significant
+ excess capacity. This makes it useful for component rendering, because
+ components can be long-lived and re-render frequently, with the rendered size
+ varying dramatically depending on the user's navigation in the app.
+
+
+
+
+ Constructs a new instance of .
+
+
+
+
+ Constructs a new instance of .
+
+
+
+
+ Gets the number of items.
+
+
+
+
+ Gets the underlying buffer.
+
+
+
+
+ Appends a new item, automatically resizing the underlying array if necessary.
+
+ The item to append.
+ The index of the appended item.
+
+
+
+ Sets the supplied value at the specified index. The index must be within
+ range for the array.
+
+ The index.
+ The value.
+
+
+
+ Removes the last item.
+
+
+
+
+ Marks the array as empty, also shrinking the underlying storage if it was
+ not being used to near its full capacity.
+
+
+
+
+ Produces an structure describing the current contents.
+
+ The .
+
+
+
+ Produces an structure describing the selected contents.
+
+ The index of the first item in the segment.
+ One plus the index of the last item in the segment.
+ The .
+
+
+
+ Represents a range of elements in an array that are in use.
+
+ The array item type.
+
+
+
+ Gets the underlying array instance.
+
+
+
+
+ Gets the number of items in the array that are considered to be in use.
+
+
+
+
+ Constructs an instance of .
+
+ The array.
+ The number of items in the array that are in use.
+
+
+
+
+
+
+
+
+
+ Creates a shallow clone of the instance.
+
+
+
+
+
+ Provides methods for building a collection of entries.
+
+
+
+
+ The reserved parameter name used for supplying child content.
+
+
+
+
+ Constructs an instance of .
+
+ The associated .
+
+
+
+ Appends a frame representing an element, i.e., a container for other frames.
+ In order for the state to be valid, you must
+ also call immediately after appending the
+ new element's child frames.
+
+ An integer that represents the position of the instruction in the source code.
+ A value representing the type of the element.
+
+
+
+ Marks a previously appended element frame as closed. Calls to this method
+ must be balanced with calls to .
+
+
+
+
+ Appends a frame representing markup content.
+
+ An integer that represents the position of the instruction in the source code.
+ Content for the new markup frame.
+
+
+
+ Appends a frame representing text content.
+
+ An integer that represents the position of the instruction in the source code.
+ Content for the new text frame.
+
+
+
+ Appends frames representing an arbitrary fragment of content.
+
+ An integer that represents the position of the instruction in the source code.
+ Content to append.
+
+
+
+ Appends frames representing an arbitrary fragment of content.
+
+ An integer that represents the position of the instruction in the source code.
+ Content to append.
+ The value used by .
+
+
+
+ Appends a frame representing markup content.
+
+ An integer that represents the position of the instruction in the source code.
+ Content for the new markup frame.
+
+
+
+ Appends a frame representing text content.
+
+ An integer that represents the position of the instruction in the source code.
+ Content for the new text frame.
+
+
+
+
+ Appends a frame representing a bool-valued attribute.
+
+
+ The attribute is associated with the most recently added element. If the value is false and the
+ current element is not a component, the frame will be omitted.
+
+
+ An integer that represents the position of the instruction in the source code.
+ The name of the attribute.
+ The value of the attribute.
+
+
+
+
+ Appends a frame representing a string-valued attribute.
+
+
+ The attribute is associated with the most recently added element. If the value is null and the
+ current element is not a component, the frame will be omitted.
+
+
+ An integer that represents the position of the instruction in the source code.
+ The name of the attribute.
+ The value of the attribute.
+
+
+
+
+ Appends a frame representing an -valued attribute.
+
+
+ The attribute is associated with the most recently added element. If the value is null and the
+ current element is not a component, the frame will be omitted.
+
+
+ An integer that represents the position of the instruction in the source code.
+ The name of the attribute.
+ The value of the attribute.
+
+
+
+
+ Appends a frame representing an -valued attribute.
+
+
+ The attribute is associated with the most recently added element. If the value is null and the
+ current element is not a component, the frame will be omitted.
+
+
+ An integer that represents the position of the instruction in the source code.
+ The name of the attribute.
+ The value of the attribute.
+
+
+
+
+ Appends a frame representing a -valued attribute.
+
+
+ The attribute is associated with the most recently added element. If the value is null and the
+ current element is not a component, the frame will be omitted.
+
+
+ An integer that represents the position of the instruction in the source code.
+ The name of the attribute.
+ The value of the attribute.
+
+
+
+
+ Appends a frame representing a -valued attribute.
+
+
+ The attribute is associated with the most recently added element. If the value is null and the
+ current element is not a component, the frame will be omitted.
+
+
+ An integer that represents the position of the instruction in the source code.
+ The name of the attribute.
+ The value of the attribute.
+
+
+
+
+ Appends a frame representing a delegate-valued attribute.
+
+
+ The attribute is associated with the most recently added element. If the value is null and the
+ current element is not a component, the frame will be omitted.
+
+
+ An integer that represents the position of the instruction in the source code.
+ The name of the attribute.
+ The value of the attribute.
+
+ This method is provided for infrastructure purposes, and is used to be
+ to provide support for delegates of specific
+ types. For a good programming experience when using a custom delegate type, define an
+ extension method similar to
+
+ that calls this method.
+
+
+
+
+
+ Appends a frame representing an attribute.
+
+
+ The attribute is associated with the most recently added element. If the value is null and the
+ current element is not a component, the frame will be omitted.
+
+
+ An integer that represents the position of the instruction in the source code.
+ The name of the attribute.
+ The value of the attribute.
+
+ This method is provided for infrastructure purposes, and is used to support generated code
+ that uses .
+
+
+
+
+
+ Appends a frame representing an attribute.
+
+
+ The attribute is associated with the most recently added element. If the value is null and the
+ current element is not a component, the frame will be omitted.
+
+
+ An integer that represents the position of the instruction in the source code.
+ The name of the attribute.
+ The value of the attribute.
+
+ This method is provided for infrastructure purposes, and is used to support generated code
+ that uses .
+
+
+
+
+ Appends a frame representing a string-valued attribute.
+ The attribute is associated with the most recently added element. If the value is null, or
+ the value false and the current element is not a component, the
+ frame will be omitted.
+
+ An integer that represents the position of the instruction in the source code.
+ The name of the attribute.
+ The value of the attribute.
+
+
+
+
+ Appends a frame representing an attribute.
+
+
+ The attribute is associated with the most recently added element.
+
+
+ An integer that represents the position of the instruction in the source code.
+ A holding the name and value of the attribute.
+
+
+
+ Appends a frame representing a child component.
+
+ The type of the child component.
+ An integer that represents the position of the instruction in the source code.
+
+
+
+ Appends a frame representing a child component.
+
+ An integer that represents the position of the instruction in the source code.
+ The type of the child component.
+
+
+
+ Marks a previously appended component frame as closed. Calls to this method
+ must be balanced with calls to .
+
+
+
+
+ Appends a frame representing an instruction to capture a reference to the parent element.
+
+ An integer that represents the position of the instruction in the source code.
+ An action to be invoked whenever the reference value changes.
+
+
+
+ Appends a frame representing an instruction to capture a reference to the parent component.
+
+ An integer that represents the position of the instruction in the source code.
+ An action to be invoked whenever the reference value changes.
+
+
+
+ Clears the builder.
+
+
+
+
+ Returns the values that have been appended.
+
+ An array range of values.
+
+
+
+ Describes changes to a component's render tree between successive renders.
+
+
+
+
+ Gets the ID of the component.
+
+
+
+
+ Gets the changes to the render tree since a previous state.
+
+
+
+
+ Exists only so that the various methods in this class can call each other without
+ constantly building up long lists of parameters. Is private to this class, so the
+ fact that it's a mutable struct is manageable.
+
+ Always pass by ref to avoid copying, and because the 'SiblingIndex' is mutable.
+
+
+
+
+ Represents a single edit operation on a component's render tree.
+
+
+
+
+ Gets the type of the edit operation.
+
+
+
+
+ Gets the index of the sibling frame that the edit relates to.
+
+
+
+
+ Gets the index of related data in an associated render frames array. For example, if the
+ value is , gets the
+ index of the new frame data in an associated render tree.
+
+
+
+
+ If the value is ,
+ gets the name of the attribute that is being removed.
+
+
+
+
+ Describes the type of a render tree edit operation.
+
+
+
+
+ Indicates that a new frame should be inserted before the specified tree frame.
+
+
+
+
+ Indicates that the specified tree frame should be removed.
+
+
+
+
+ Indicates that an attribute value should be applied to the specified frame.
+ This may be a change to an existing attribute, or the addition of a new attribute.
+
+
+
+
+ Indicates that a named attribute should be removed from the specified frame.
+
+
+
+
+ Indicates that the text content of the specified frame (which must be a text frame)
+ should be updated.
+
+
+
+
+ Indicates that the edit position should move inside the specified frame.
+
+
+
+
+ Indicates that there are no further edit operations on the current frame, and the
+ edit position should move back to the parent frame.
+
+
+
+
+ Indicates that the markup content of the specified frame (which must be a markup frame)
+ should be updated.
+
+
+
+
+ Represents an entry in a tree of user interface (UI) items.
+
+
+
+
+ Gets the sequence number of the frame. Sequence numbers indicate the relative source
+ positions of the instructions that inserted the frames. Sequence numbers are only
+ comparable within the same sequence (typically, the same source method).
+
+
+
+
+ Describes the type of this frame.
+
+
+
+
+ If the property equals
+ gets the number of frames in the subtree for which this frame is the root.
+ The value is zero if the frame has not yet been closed.
+
+
+
+
+ If the property equals ,
+ gets a name representing the type of the element. Otherwise, the value is undefined.
+
+
+
+
+ If the property equals ,
+ gets the content of the text frame. Otherwise, the value is undefined.
+
+
+
+
+ If the property equals
+ gets the ID of the corresponding event handler, if any.
+
+
+
+
+ If the property equals ,
+ gets the attribute name. Otherwise, the value is undefined.
+
+
+
+
+ If the property equals ,
+ gets the attribute value. Otherwise, the value is undefined.
+
+
+
+
+ If the property equals
+ gets the number of frames in the subtree for which this frame is the root.
+ The value is zero if the frame has not yet been closed.
+
+
+
+
+ If the property equals ,
+ gets the child component instance identifier.
+
+
+
+
+ If the property equals ,
+ gets the type of the child component.
+
+
+
+
+ If the property equals ,
+ gets the child component state object. Otherwise, the value is undefined.
+
+
+
+
+ If the property equals ,
+ gets the child component instance. Otherwise, the value is undefined.
+
+
+
+
+ If the property equals
+ gets the number of frames in the subtree for which this frame is the root.
+ The value is zero if the frame has not yet been closed.
+
+
+
+
+ If the property equals ,
+ gets the ID of the reference capture. Otherwise, the value is undefined.
+
+
+
+
+ If the property equals ,
+ gets the action that writes the reference to its target. Otherwise, the value is undefined.
+
+
+
+
+ If the property equals ,
+ gets the index of the parent frame representing the component being captured. Otherwise, the value is undefined.
+ WARNING: This index can only be used in the context of the frame's original render tree. If the frame is
+ copied elsewhere, such as to the ReferenceFrames buffer of a RenderTreeDiff, then the index will
+ not relate to entries in that other buffer.
+ Currently there's no scenario where this matters, but if there was, we could change all of the subtree
+ initialization logic in RenderTreeDiffBuilder to walk the frames hierarchically, then it would know
+ the parent index at the point where it wants to initialize the ComponentReferenceCapture frame.
+
+
+
+
+ If the property equals ,
+ gets the action that writes the reference to its target. Otherwise, the value is undefined.
+
+
+
+
+ If the property equals ,
+ gets the content of the markup frame. Otherwise, the value is undefined.
+
+
+
+
+
+
+
+ Describes the type of a .
+
+
+
+
+ Represents a container for other frames.
+
+
+
+
+ Represents text content.
+
+
+
+
+ Represents a key-value pair associated with another .
+
+
+
+
+ Represents a child component.
+
+
+
+
+ Defines the boundary around range of sibling frames that should be treated as an
+ unsplittable group for the purposes of diffing. This is typically used when appending
+ a tree fragment generated by external code, because the sequence numbers in that tree
+ fragment are not comparable to sequence numbers outside it.
+
+
+
+
+ Represents an instruction to capture or update a reference to the parent element.
+
+
+
+
+ Represents an instruction to capture or update a reference to the parent component.
+
+
+
+
+ Represents a block of markup content.
+
+
+
+
+ Indicates that the associated component should match the specified route template pattern.
+
+
+
+
+ Constructs an instance of .
+
+ The route template.
+
+
+
+ Gets the route template.
+
+
+
+
+ A component that renders an anchor tag, automatically toggling its 'active'
+ class based on whether its 'href' matches the current URI.
+
+
+
+
+ Gets or sets the CSS class name applied to the NavLink when the
+ current route matches the NavLink href.
+
+
+
+
+ Gets or sets a value representing the URL matching behavior.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Modifies the URL matching behavior for a .
+
+
+
+
+ Specifies that the should be active when it matches any prefix
+ of the current URL.
+
+
+
+
+ Specifies that the should be active when it matches the entire
+ current URL.
+
+
+
+
+ A component that displays whichever other component corresponds to the
+ current navigation location.
+
+
+
+
+ Gets or sets the assembly that should be searched, along with its referenced
+ assemblies, for components matching the URI.
+
+
+
+
+ Gets or sets the type of the component that should be used as a fallback when no match is found for the requested route.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Route precedence algorithm.
+ We collect all the routes and sort them from most specific to
+ less specific. The specificity of a route is given by the specificity
+ of its segments and the position of those segments in the route.
+ * A literal segment is more specific than a parameter segment.
+ * A parameter segment with more constraints is more specific than one with fewer constraints
+ * Segment earlier in the route are evaluated before segments later in the route.
+ For example:
+ /Literal is more specific than /Parameter
+ /Route/With/{parameter} is more specific than /{multiple}/With/{parameters}
+ /Product/{id:int} is more specific than /Product/{id}
+
+ Routes can be ambiguous if:
+ They are composed of literals and those literals have the same values (case insensitive)
+ They are composed of a mix of literals and parameters, in the same relative order and the
+ literals have the same values.
+ For example:
+ * /literal and /Literal
+ /{parameter}/literal and /{something}/literal
+ /{parameter:constraint}/literal and /{something:constraint}/literal
+
+ To calculate the precedence we sort the list of routes as follows:
+ * Shorter routes go first.
+ * A literal wins over a parameter in precedence.
+ * For literals with different values (case insensitive) we choose the lexical order
+ * For parameters with different numbers of constraints, the one with more wins
+ If we get to the end of the comparison routing we've detected an ambiguous pair of routes.
+
+
+
+
+ A route constraint that requires the value to be parseable as a specified type.
+
+ The type to which the value must be parseable.
+
+
+
+ Used by generated code produced by the Components code generator. Not intended or supported
+ for use in application code.
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Not intended for use by application code.
+
+
+
+
+
+
+
+ Helpers for working with URIs and navigation state.
+
+
+
+
+ Gets the current absolute URI.
+
+ The current absolute URI.
+
+
+
+ An event that fires when the navigation location has changed.
+
+
+
+
+ Converts a relative URI into an absolute one (by resolving it
+ relative to the current absolute URI).
+
+ The relative URI.
+ The absolute URI.
+
+
+
+ Gets the base URI (with trailing slash) that can be prepended before relative URI paths to produce an absolute URI.
+ Typically this corresponds to the 'href' attribute on the document's <base> element.
+
+ The URI prefix, which has a trailing slash.
+
+
+
+ Given a base URI (e.g., one previously returned by ),
+ converts an absolute URI into one relative to the base URI prefix.
+
+ The base URI prefix (e.g., previously returned by ).
+ An absolute URI that is within the space of the base URI.
+ A relative URI path.
+
+
+
+ Navigates to the specified URI.
+
+ The destination URI. This can be absolute, or relative to the base URI
+ (as returned by ).
+
+
+
+ Navigates to the specified URI.
+
+ The destination URI. This can be absolute, or relative to the base URI
+ (as returned by ).
+ If true, bypasses client-side routing and forces the browser to load the new page from the server, whether or not the URI would normally be handled by the client-side router.
+
+
+
+ A base class for implementations.
+
+
+
+
+ An event that fires when the navigation location has changed.
+
+
+
+
+ Navigates to the specified URI.
+
+ The destination URI. This can be absolute, or relative to the base URI
+ (as returned by ).
+
+
+
+ Navigates to the specified URI.
+
+ The destination URI. This can be absolute, or relative to the base URI
+ (as returned by ).
+ If true, bypasses client-side routing and forces the browser to load the new page from the server, whether or not the URI would normally be handled by the client-side router.
+
+
+
+ Navigates to the specified URI.
+
+ The destination URI. This can be absolute, or relative to the base URI
+ (as returned by ).
+ If true, bypasses client-side routing and forces the browser to load the new page from the server, whether or not the URI would normally be handled by the client-side router.
+
+
+
+ Called to initialize BaseURI and current URI before those values the first time.
+ Override this method to dynamically calculate the those values.
+
+
+
+
+ Gets the current absolute URI.
+
+ The current absolute URI.
+
+
+
+ Gets the base URI (with trailing slash) that can be prepended before relative URI paths to
+ produce an absolute URI. Typically this corresponds to the 'href' attribute on the
+ document's <base> element.
+
+ The URI prefix, which has a trailing slash.
+
+
+
+ Converts a relative URI into an absolute one (by resolving it
+ relative to the current absolute URI).
+
+ The relative URI.
+ The absolute URI.
+
+
+
+ Given a base URI (e.g., one previously returned by ),
+ converts an absolute URI into one relative to the base URI prefix.
+
+
+ The base URI prefix (e.g., previously returned by ).
+
+ An absolute URI that is within the space of the base URI.
+ A relative URI path.
+
+
+
+ Set the URI to the provided value.
+
+ The URI. Must be an absolute URI.
+
+ Calling does not trigger .
+
+
+
+
+ Sets the base URI to the provided value (after normalization).
+
+ The base URI. Must be an absolute URI.
+
+ Calling does not trigger .
+
+
+
+
+ Triggers the event with the current URI value.
+
+
+
+
+ Supplies information about an event that is being raised.
+
+
+
+
+ An empty instance of .
+
+
+
+
+ Gets or sets the type of the event.
+
+
+
+
+ Supplies information about an input change event that is being raised.
+
+
+
+
+ Gets or sets the new value of the input. This may be a
+ or a .
+
+
+
+
+ Supplies information about an clipboard event that is being raised.
+
+
+
+
+ Supplies information about an drag event that is being raised.
+
+
+
+
+ A count of consecutive clicks that happened in a short amount of time, incremented by one.
+
+
+
+
+ The data that underlies a drag-and-drop operation, known as the drag data store.
+ See .
+
+
+
+
+ The X coordinate of the mouse pointer in global (screen) coordinates.
+
+
+
+
+ The Y coordinate of the mouse pointer in global (screen) coordinates.
+
+
+
+
+ The X coordinate of the mouse pointer in local (DOM content) coordinates.
+
+
+
+
+ The Y coordinate of the mouse pointer in local (DOM content) coordinates.
+
+
+
+
+ The button number that was pressed when the mouse event was fired:
+ Left button=0,
+ middle button=1 (if present),
+ right button=2.
+ For mice configured for left handed use in which the button actions are reversed the values are instead read from right to left.
+
+
+
+
+ The buttons being pressed when the mouse event was fired:
+ Left button=1,
+ Right button=2,
+ Middle (wheel) button=4,
+ 4th button (typically, "Browser Back" button)=8,
+ 5th button (typically, "Browser Forward" button)=16.
+ If two or more buttons are pressed, returns the logical sum of the values.
+ E.g., if Left button and Right button are pressed, returns 3 (=1 | 2).
+
+
+
+
+ true if the control key was down when the event was fired. false otherwise.
+
+
+
+
+ true if the shift key was down when the event was fired. false otherwise.
+
+
+
+
+ true if the alt key was down when the event was fired. false otherwise.
+
+
+
+
+ true if the meta key was down when the event was fired. false otherwise.
+
+
+
+
+ The object is used to hold the data that is being dragged during a drag and drop operation.
+ It may hold one or more , each of one or more data types.
+ For more information about drag and drop, see HTML Drag and Drop API.
+
+
+
+
+ Gets the type of drag-and-drop operation currently selected or sets the operation to a new type.
+ The value must be none, copy, link or move.
+
+
+
+
+ Provides all of the types of operations that are possible.
+ Must be one of none, copy, copyLink, copyMove, link, linkMove, move, all or uninitialized.
+
+
+
+
+ Contains a list of all the local files available on the data transfer.
+ If the drag operation doesn't involve dragging files, this property is an empty list.
+
+
+
+
+ Gives a array which is a list of all of the drag data.
+
+
+
+
+ An array of giving the formats that were set in the dragstart event.
+
+
+
+
+ The object represents one drag data item.
+ During a drag operation, each drag event has a dataTransfer property which contains a list of drag data items.
+ Each item in the list is a object.
+
+
+
+
+ The kind of drag data item, string or file
+
+
+
+
+ The drag data item's type, typically a MIME type
+
+
+
+
+ Supplies information about an error event that is being raised.
+
+
+
+
+ Gets a a human-readable error message describing the problem.
+
+
+
+
+ Gets the name of the script file in which the error occurred.
+
+
+
+
+ Gets the line number of the script file on which the error occurred.
+
+
+
+
+ Gets the column number of the script file on which the error occurred.
+
+
+
+
+ Supplies information about a focus event that is being raised.
+
+
+
+
+ Supplies information about a keyboard event that is being raised.
+
+
+
+
+ The key value of the key represented by the event.
+ If the value has a printed representation, this attribute's value is the same as the char attribute.
+ Otherwise, it's one of the key value strings specified in 'Key values'.
+ If the key can't be identified, this is the string "Unidentified"
+
+
+
+
+ Holds a string that identifies the physical key being pressed.
+ The value is not affected by the current keyboard layout or modifier state, so a particular key will always return the same value.
+
+
+
+
+ The location of the key on the device.
+
+
+
+
+ true if a key has been depressed long enough to trigger key repetition, otherwise false.
+
+
+
+
+ true if the control key was down when the event was fired. false otherwise.
+
+
+
+
+ true if the shift key was down when the event was fired. false otherwise.
+
+
+
+
+ true if the alt key was down when the event was fired. false otherwise.
+
+
+
+
+ true if the meta key was down when the event was fired. false otherwise.
+
+
+
+
+ Supplies information about a mouse event that is being raised.
+
+
+
+
+ A count of consecutive clicks that happened in a short amount of time, incremented by one.
+
+
+
+
+ The X coordinate of the mouse pointer in global (screen) coordinates.
+
+
+
+
+ The Y coordinate of the mouse pointer in global (screen) coordinates.
+
+
+
+
+ The X coordinate of the mouse pointer in local (DOM content) coordinates.
+
+
+
+
+ The Y coordinate of the mouse pointer in local (DOM content) coordinates.
+
+
+
+
+ The button number that was pressed when the mouse event was fired:
+ Left button=0,
+ middle button=1 (if present),
+ right button=2.
+ For mice configured for left handed use in which the button actions are reversed the values are instead read from right to left.
+
+
+
+
+ The buttons being pressed when the mouse event was fired:
+ Left button=1,
+ Right button=2,
+ Middle (wheel) button=4,
+ 4th button (typically, "Browser Back" button)=8,
+ 5th button (typically, "Browser Forward" button)=16.
+ If two or more buttons are pressed, returns the logical sum of the values.
+ E.g., if Left button and Right button are pressed, returns 3 (=1 | 2).
+
+
+
+
+ true if the control key was down when the event was fired. false otherwise.
+
+
+
+
+ true if the shift key was down when the event was fired. false otherwise.
+
+
+
+
+ true if the alt key was down when the event was fired. false otherwise.
+
+
+
+
+ true if the meta key was down when the event was fired. false otherwise.
+
+
+
+
+ Supplies information about a mouse event that is being raised.
+
+
+
+
+ A unique identifier for the pointer causing the event.
+
+
+
+
+ The width (magnitude on the X axis), in CSS pixels, of the contact geometry of the pointer.
+
+
+
+
+ The height (magnitude on the Y axis), in CSS pixels, of the contact geometry of the pointer.
+
+
+
+
+ The normalized pressure of the pointer input in the range of 0 to 1,
+ where 0 and 1 represent the minimum and maximum pressure the hardware is capable of detecting, respectively.
+
+
+
+
+ The plane angle (in degrees, in the range of -90 to 90) between the Y-Z plane
+ and the plane containing both the transducer (e.g. pen stylus) axis and the Y axis.
+
+
+
+
+ The plane angle (in degrees, in the range of -90 to 90) between the X-Z plane
+ and the plane containing both the transducer (e.g. pen stylus) axis and the X axis.
+
+
+
+
+ Indicates the device type that caused the event.
+ Must be one of the strings mouse, pen or touch, or an empty string.
+
+
+
+
+ Indicates if the pointer represents the primary pointer of this pointer type.
+
+
+
+
+ Supplies information about a progress event that is being raised.
+
+
+
+
+ Whether or not the total size of the transfer is known.
+
+
+
+
+ The number of bytes transferred since the beginning of the operation.
+ This doesn't include headers and other overhead, but only the content itself.
+
+
+
+
+ The total number of bytes of content that will be transferred during the operation.
+ If the total size is unknown, this value is zero.
+
+
+
+
+ Supplies information about a touch event that is being raised.
+
+
+
+
+ A count of consecutive clicks that happened in a short amount of time, incremented by one.
+
+
+
+
+ A list of for every point of contact currently touching the surface.
+
+
+
+
+ A list of for every point of contact that is touching the surface and started on the element that is the target of the current event.
+
+
+
+
+ A list of Touches for every point of contact which contributed to the event.
+ For the touchstart event this must be a list of the touch points that just became active with the current event.
+ For the touchmove event this must be a list of the touch points that have moved since the last event.
+ For the touchend and touchcancel events this must be a list of the touch points that have just been removed from the surface.
+
+
+
+
+ true if the control key was down when the event was fired. false otherwise.
+
+
+
+
+ true if the shift key was down when the event was fired. false otherwise.
+
+
+
+
+ true if the alt key was down when the event was fired. false otherwise.
+
+
+
+
+ true if the meta key was down when the event was fired. false otherwise.
+
+
+
+
+ Represents a single contact point on a touch-sensitive device.
+ The contact point is commonly a finger or stylus and the device may be a touchscreen or trackpad.
+
+
+
+
+ A unique identifier for this Touch object.
+ A given touch point (say, by a finger) will have the same identifier for the duration of its movement around the surface.
+ This lets you ensure that you're tracking the same touch all the time.
+
+
+
+
+ The X coordinate of the touch point relative to the left edge of the screen.
+
+
+
+
+ The Y coordinate of the touch point relative to the top edge of the screen.
+
+
+
+
+ The X coordinate of the touch point relative to the left edge of the browser viewport, not including any scroll offset.
+
+
+
+
+ The Y coordinate of the touch point relative to the top edge of the browser viewport, not including any scroll offset.
+
+
+
+
+ The X coordinate of the touch point relative to the left edge of the document.
+ Unlike , this value includes the horizontal scroll offset, if any.
+
+
+
+
+ The Y coordinate of the touch point relative to the top of the document.
+ Unlike , this value includes the vertical scroll offset, if any.
+
+
+
+
+ Supplies information about a mouse wheel event that is being raised.
+
+
+
+
+ The horizontal scroll amount.
+
+
+
+
+ The vertical scroll amount.
+
+
+
+
+ The scroll amount for the z-axis.
+
+
+
+
+ The unit of the delta values scroll amount.
+
+
+
+
+ Extensions methods on for event handlers.
+
+
+
+ These methods enable method-group to delegate conversion for delegates and methods that accept
+ types derived from .
+
+
+ This enhances the programming experience for using event handlers with the render tree builder
+ in components written in pure C#. These extension methods make it possible to write code like:
+
+ builder.AddAttribute(0, "onkeypress", MyKeyPressHandler);
+
+ Where void MyKeyPressHandler(UIKeyboardEventArgs e) is a method defined in the same class.
+ In this example, the author knows that the onclick event is associated with the
+ event args type. The component author is responsible for
+ providing a delegate that matches the expected event args type, an error will result in a failure
+ at runtime.
+
+
+ When a component is authored in Razor (.cshtml), the Razor code generator will maintain a mapping
+ between event names and event arg types that can be used to generate more strongly typed code.
+ Generated code for the same case will look like:
+
+ builder.AddAttribute(0, "onkeypress", BindMethods.GetEventHandlerValue<UIKeyboardEventArgs>(MyKeyPressHandler));
+
+
+
+
+
+
+
+ Appends a frame representing an -valued attribute.
+
+
+ The attribute is associated with the most recently added element. If the value is null and the
+ current element is not a component, the frame will be omitted.
+
+
+ The .
+ An integer that represents the position of the instruction in the source code.
+ The name of the attribute.
+ The value of the attribute.
+
+
+
+
+ Appends a frame representing an -valued attribute.
+
+
+ The attribute is associated with the most recently added element. If the value is null and the
+ current element is not a component, the frame will be omitted.
+
+
+ The .
+ An integer that represents the position of the instruction in the source code.
+ The name of the attribute.
+ The value of the attribute.
+
+
+
+
+ Appends a frame representing an -valued attribute.
+
+
+ The attribute is associated with the most recently added element. If the value is null and the
+ current element is not a component, the frame will be omitted.
+
+
+ The .
+ An integer that represents the position of the instruction in the source code.
+ The name of the attribute.
+ The value of the attribute.
+
+
+
+
+ Appends a frame representing an -valued attribute.
+
+
+ The attribute is associated with the most recently added element. If the value is null and the
+ current element is not a component, the frame will be omitted.
+
+
+ The .
+ An integer that represents the position of the instruction in the source code.
+ The name of the attribute.
+ The value of the attribute.
+
+
+
+
+ Appends a frame representing an -valued attribute.
+
+
+ The attribute is associated with the most recently added element. If the value is null and the
+ current element is not a component, the frame will be omitted.
+
+
+ The .
+ An integer that represents the position of the instruction in the source code.
+ The name of the attribute.
+ The value of the attribute.
+
+
+
+
+ Appends a frame representing an -valued attribute.
+
+
+ The attribute is associated with the most recently added element. If the value is null and the
+ current element is not a component, the frame will be omitted.
+
+
+ The .
+ An integer that represents the position of the instruction in the source code.
+ The name of the attribute.
+ The value of the attribute.
+
+
+
+
+ Appends a frame representing an -valued attribute.
+
+
+ The attribute is associated with the most recently added element. If the value is null and the
+ current element is not a component, the frame will be omitted.
+
+
+ The .
+ An integer that represents the position of the instruction in the source code.
+ The name of the attribute.
+ The value of the attribute.
+
+
+
+
+ Appends a frame representing an -valued attribute.
+
+
+ The attribute is associated with the most recently added element. If the value is null and the
+ current element is not a component, the frame will be omitted.
+
+
+ The .
+ An integer that represents the position of the instruction in the source code.
+ The name of the attribute.
+ The value of the attribute.
+
+
+
+
+ Appends a frame representing an -valued attribute.
+
+
+ The attribute is associated with the most recently added element. If the value is null and the
+ current element is not a component, the frame will be omitted.
+
+
+ The .
+ An integer that represents the position of the instruction in the source code.
+ The name of the attribute.
+ The value of the attribute.
+
+
+
+
+ Appends a frame representing an -valued attribute.
+
+
+ The attribute is associated with the most recently added element. If the value is null and the
+ current element is not a component, the frame will be omitted.
+
+
+ The .
+ An integer that represents the position of the instruction in the source code.
+ The name of the attribute.
+ The value of the attribute.
+
+
+
+
+ Appends a frame representing an -valued attribute.
+
+
+ The attribute is associated with the most recently added element. If the value is null and the
+ current element is not a component, the frame will be omitted.
+
+
+ The .
+ An integer that represents the position of the instruction in the source code.
+ The name of the attribute.
+ The value of the attribute.
+
+
+
+
+ Appends a frame representing an -valued attribute.
+
+
+ The attribute is associated with the most recently added element. If the value is null and the
+ current element is not a component, the frame will be omitted.
+
+
+ The .
+ An integer that represents the position of the instruction in the source code.
+ The name of the attribute.
+ The value of the attribute.
+
+
+
+
+ Appends a frame representing an -valued attribute.
+
+
+ The attribute is associated with the most recently added element. If the value is null and the
+ current element is not a component, the frame will be omitted.
+
+
+ The .
+ An integer that represents the position of the instruction in the source code.
+ The name of the attribute.
+ The value of the attribute.
+
+
+
+
+ Appends a frame representing an -valued attribute.
+
+
+ The attribute is associated with the most recently added element. If the value is null and the
+ current element is not a component, the frame will be omitted.
+
+
+ The .
+ An integer that represents the position of the instruction in the source code.
+ The name of the attribute.
+ The value of the attribute.
+
+
+
+
+ Appends a frame representing an -valued attribute.
+
+
+ The attribute is associated with the most recently added element. If the value is null and the
+ current element is not a component, the frame will be omitted.
+
+
+ The .
+ An integer that represents the position of the instruction in the source code.
+ The name of the attribute.
+ The value of the attribute.
+
+
+
+
+ Appends a frame representing an -valued attribute.
+
+
+ The attribute is associated with the most recently added element. If the value is null and the
+ current element is not a component, the frame will be omitted.
+
+
+ The .
+ An integer that represents the position of the instruction in the source code.
+ The name of the attribute.
+ The value of the attribute.
+
+
+
+
+ Appends a frame representing an -valued attribute.
+
+
+ The attribute is associated with the most recently added element. If the value is null and the
+ current element is not a component, the frame will be omitted.
+
+
+ The .
+ An integer that represents the position of the instruction in the source code.
+ The name of the attribute.
+ The value of the attribute.
+
+
+
+
+ Appends a frame representing an -valued attribute.
+
+
+ The attribute is associated with the most recently added element. If the value is null and the
+ current element is not a component, the frame will be omitted.
+
+
+ The .
+ An integer that represents the position of the instruction in the source code.
+ The name of the attribute.
+ The value of the attribute.
+
+
+
+
+ Appends a frame representing an -valued attribute.
+
+
+ The attribute is associated with the most recently added element. If the value is null and the
+ current element is not a component, the frame will be omitted.
+
+
+ The .
+ An integer that represents the position of the instruction in the source code.
+ The name of the attribute.
+ The value of the attribute.
+
+
+
+
+ Appends a frame representing an -valued attribute.
+
+
+ The attribute is associated with the most recently added element. If the value is null and the
+ current element is not a component, the frame will be omitted.
+
+
+ The .
+ An integer that represents the position of the instruction in the source code.
+ The name of the attribute.
+ The value of the attribute.
+
+
+
+
+ Appends a frame representing an -valued attribute.
+
+
+ The attribute is associated with the most recently added element. If the value is null and the
+ current element is not a component, the frame will be omitted.
+
+
+ The .
+ An integer that represents the position of the instruction in the source code.
+ The name of the attribute.
+ The value of the attribute.
+
+
+
+
+ Appends a frame representing an -valued attribute.
+
+
+ The attribute is associated with the most recently added element. If the value is null and the
+ current element is not a component, the frame will be omitted.
+
+
+ The .
+ An integer that represents the position of the instruction in the source code.
+ The name of the attribute.
+ The value of the attribute.
+
+
+
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll
new file mode 100755
index 0000000..80058b1
Binary files /dev/null and b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.Extensions.DependencyInjection.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.Extensions.DependencyInjection.dll
new file mode 100755
index 0000000..a859ce6
Binary files /dev/null and b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.Extensions.DependencyInjection.dll differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.JSInterop.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.JSInterop.dll
new file mode 100755
index 0000000..efe4501
Binary files /dev/null and b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Microsoft.JSInterop.dll differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Mono.WebAssembly.Interop.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Mono.WebAssembly.Interop.dll
new file mode 100755
index 0000000..1ac3342
Binary files /dev/null and b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/Mono.WebAssembly.Interop.dll differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/System.ComponentModel.Annotations.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/System.ComponentModel.Annotations.dll
new file mode 100755
index 0000000..bff09e6
Binary files /dev/null and b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/System.ComponentModel.Annotations.dll differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Blazor.E2EPerformance.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Blazor.E2EPerformance.dll
new file mode 100644
index 0000000..e523046
Binary files /dev/null and b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Blazor.E2EPerformance.dll differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Blazor.E2EPerformance.pdb b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Blazor.E2EPerformance.pdb
new file mode 100644
index 0000000..cdfe9a8
Binary files /dev/null and b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Blazor.E2EPerformance.pdb differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Blazor.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Blazor.dll
new file mode 100644
index 0000000..5239765
Binary files /dev/null and b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Blazor.dll differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Blazor.pdb b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Blazor.pdb
new file mode 100644
index 0000000..9d77703
Binary files /dev/null and b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Blazor.pdb differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Components.Browser.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Components.Browser.dll
new file mode 100644
index 0000000..83845be
Binary files /dev/null and b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Components.Browser.dll differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Components.Browser.pdb b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Components.Browser.pdb
new file mode 100644
index 0000000..89798bf
Binary files /dev/null and b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Components.Browser.pdb differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Components.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Components.dll
new file mode 100644
index 0000000..7117b84
Binary files /dev/null and b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Components.dll differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Components.pdb b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Components.pdb
new file mode 100644
index 0000000..853acc5
Binary files /dev/null and b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.AspNetCore.Components.pdb differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.Extensions.DependencyInjection.Abstractions.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.Extensions.DependencyInjection.Abstractions.dll
new file mode 100644
index 0000000..7cd9149
Binary files /dev/null and b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.Extensions.DependencyInjection.Abstractions.dll differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.Extensions.DependencyInjection.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.Extensions.DependencyInjection.dll
new file mode 100644
index 0000000..9c1fdc0
Binary files /dev/null and b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.Extensions.DependencyInjection.dll differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.JSInterop.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.JSInterop.dll
new file mode 100644
index 0000000..0b1ea66
Binary files /dev/null and b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Microsoft.JSInterop.dll differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Mono.WebAssembly.Interop.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Mono.WebAssembly.Interop.dll
new file mode 100644
index 0000000..872f078
Binary files /dev/null and b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/Mono.WebAssembly.Interop.dll differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/System.ComponentModel.Annotations.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/System.ComponentModel.Annotations.dll
new file mode 100644
index 0000000..4815dad
Binary files /dev/null and b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/System.ComponentModel.Annotations.dll differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/System.Core.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/System.Core.dll
new file mode 100644
index 0000000..f9c71a5
Binary files /dev/null and b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/System.Core.dll differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/System.Net.Http.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/System.Net.Http.dll
new file mode 100644
index 0000000..e219d2d
Binary files /dev/null and b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/System.Net.Http.dll differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/System.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/System.dll
new file mode 100644
index 0000000..512abc3
Binary files /dev/null and b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/System.dll differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/mscorlib.dll b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/mscorlib.dll
new file mode 100644
index 0000000..a6d8cb0
Binary files /dev/null and b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/_bin/mscorlib.dll differ
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/blazor.boot.json b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/blazor.boot.json
new file mode 100644
index 0000000..1cc3e35
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/blazor.boot.json
@@ -0,0 +1 @@
+{"main":"Microsoft.AspNetCore.Blazor.E2EPerformance.dll","entryPoint":"Microsoft.AspNetCore.Blazor.E2EPerformance.Program::Main","assemblyReferences":["Microsoft.AspNetCore.Blazor.dll","Microsoft.AspNetCore.Components.Browser.dll","Microsoft.AspNetCore.Components.dll","Microsoft.Extensions.DependencyInjection.Abstractions.dll","Microsoft.Extensions.DependencyInjection.dll","Microsoft.JSInterop.dll","Mono.WebAssembly.Interop.dll","mscorlib.dll","System.ComponentModel.Annotations.dll","System.Core.dll","System.dll","System.Net.Http.dll","Microsoft.AspNetCore.Blazor.E2EPerformance.pdb","Microsoft.AspNetCore.Blazor.pdb","Microsoft.AspNetCore.Components.Browser.pdb","Microsoft.AspNetCore.Components.pdb"],"cssReferences":[],"jsReferences":[],"linkerEnabled":true}
\ No newline at end of file
diff --git a/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/components.server.js b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/components.server.js
new file mode 100644
index 0000000..f2ca64c
--- /dev/null
+++ b/wasm/Microsoft.AspNetCore.Blazor.E2EPerformance/bin/Debug/netstandard2.0/dist/_framework/components.server.js
@@ -0,0 +1,13562 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./Boot.Server.ts");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./Boot.Server.ts":
+/*!************************!*\
+ !*** ./Boot.Server.ts ***!
+ \************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+var __generator = (this && this.__generator) || function (thisArg, body) {
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
+ function verb(n) { return function (v) { return step([n, v]); }; }
+ function step(op) {
+ if (f) throw new TypeError("Generator is already executing.");
+ while (_) try {
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
+ if (y = 0, t) op = [op[0] & 2, t.value];
+ switch (op[0]) {
+ case 0: case 1: t = op; break;
+ case 4: _.label++; return { value: op[1], done: false };
+ case 5: _.label++; y = op[1]; op = [0]; continue;
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
+ default:
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
+ if (t[2]) _.ops.pop();
+ _.trys.pop(); continue;
+ }
+ op = body.call(thisArg, _);
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
+ }
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+__webpack_require__(/*! @dotnet/jsinterop */ "./node_modules/@dotnet/jsinterop/dist/Microsoft.JSInterop.js");
+__webpack_require__(/*! ./GlobalExports */ "./GlobalExports.ts");
+var signalR = __webpack_require__(/*! @aspnet/signalr */ "./node_modules/@aspnet/signalr/dist/esm/index.js");
+var signalr_protocol_msgpack_1 = __webpack_require__(/*! @aspnet/signalr-protocol-msgpack */ "./node_modules/@aspnet/signalr-protocol-msgpack/dist/esm/index.js");
+var OutOfProcessRenderBatch_1 = __webpack_require__(/*! ./Rendering/RenderBatch/OutOfProcessRenderBatch */ "./Rendering/RenderBatch/OutOfProcessRenderBatch.ts");
+var UriHelper_1 = __webpack_require__(/*! ./Services/UriHelper */ "./Services/UriHelper.ts");
+var Renderer_1 = __webpack_require__(/*! ./Rendering/Renderer */ "./Rendering/Renderer.ts");
+var BootCommon_1 = __webpack_require__(/*! ./BootCommon */ "./BootCommon.ts");
+var AutoReconnectCircuitHandler_1 = __webpack_require__(/*! ./Platform/Circuits/AutoReconnectCircuitHandler */ "./Platform/Circuits/AutoReconnectCircuitHandler.ts");
+function boot() {
+ return __awaiter(this, void 0, void 0, function () {
+ var circuitHandlers, embeddedResourcesPromise, initialConnection, circuitId;
+ var _this = this;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ circuitHandlers = [new AutoReconnectCircuitHandler_1.AutoReconnectCircuitHandler()];
+ window['Blazor'].circuitHandlers = circuitHandlers;
+ embeddedResourcesPromise = BootCommon_1.fetchBootConfigAsync().then(function (bootConfig) {
+ return BootCommon_1.loadEmbeddedResourcesAsync(bootConfig);
+ });
+ return [4 /*yield*/, initializeConnection(circuitHandlers)];
+ case 1:
+ initialConnection = _a.sent();
+ // Ensure any embedded resources have been loaded before starting the app
+ return [4 /*yield*/, embeddedResourcesPromise];
+ case 2:
+ // Ensure any embedded resources have been loaded before starting the app
+ _a.sent();
+ return [4 /*yield*/, initialConnection.invoke('StartCircuit', UriHelper_1.internalFunctions.getLocationHref(), UriHelper_1.internalFunctions.getBaseURI())];
+ case 3:
+ circuitId = _a.sent();
+ window['Blazor'].reconnect = function () { return __awaiter(_this, void 0, void 0, function () {
+ var reconnection;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [4 /*yield*/, initializeConnection(circuitHandlers)];
+ case 1:
+ reconnection = _a.sent();
+ return [4 /*yield*/, reconnection.invoke('ConnectCircuit', circuitId)];
+ case 2:
+ if (!(_a.sent())) {
+ return [2 /*return*/, false];
+ }
+ circuitHandlers.forEach(function (h) { return h.onConnectionUp && h.onConnectionUp(); });
+ return [2 /*return*/, true];
+ }
+ });
+ }); };
+ circuitHandlers.forEach(function (h) { return h.onConnectionUp && h.onConnectionUp(); });
+ return [2 /*return*/];
+ }
+ });
+ });
+}
+function initializeConnection(circuitHandlers) {
+ return __awaiter(this, void 0, void 0, function () {
+ var connection, ex_1;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ connection = new signalR.HubConnectionBuilder()
+ .withUrl('_blazor')
+ .withHubProtocol(new signalr_protocol_msgpack_1.MessagePackHubProtocol())
+ .configureLogging(signalR.LogLevel.Information)
+ .build();
+ connection.on('JS.BeginInvokeJS', DotNet.jsCallDispatcher.beginInvokeJSFromDotNet);
+ connection.on('JS.RenderBatch', function (browserRendererId, renderId, batchData) {
+ try {
+ Renderer_1.renderBatch(browserRendererId, new OutOfProcessRenderBatch_1.OutOfProcessRenderBatch(batchData));
+ connection.send('OnRenderCompleted', renderId, null);
+ }
+ catch (ex) {
+ // If there's a rendering exception, notify server *and* throw on client
+ connection.send('OnRenderCompleted', renderId, ex.toString());
+ throw ex;
+ }
+ });
+ connection.onclose(function (error) { return circuitHandlers.forEach(function (h) { return h.onConnectionDown && h.onConnectionDown(error); }); });
+ connection.on('JS.Error', function (error) { return unhandledError(connection, error); });
+ window['Blazor']._internal.forceCloseConnection = function () { return connection.stop(); };
+ _a.label = 1;
+ case 1:
+ _a.trys.push([1, 3, , 4]);
+ return [4 /*yield*/, connection.start()];
+ case 2:
+ _a.sent();
+ return [3 /*break*/, 4];
+ case 3:
+ ex_1 = _a.sent();
+ unhandledError(connection, ex_1);
+ return [3 /*break*/, 4];
+ case 4:
+ DotNet.attachDispatcher({
+ beginInvokeDotNetFromJS: function (callId, assemblyName, methodIdentifier, dotNetObjectId, argsJson) {
+ connection.send('BeginInvokeDotNetFromJS', callId ? callId.toString() : null, assemblyName, methodIdentifier, dotNetObjectId || 0, argsJson);
+ }
+ });
+ return [2 /*return*/, connection];
+ }
+ });
+ });
+}
+function unhandledError(connection, err) {
+ console.error(err);
+ // Disconnect on errors.
+ //
+ // Trying to call methods on the connection after its been closed will throw.
+ if (connection) {
+ connection.stop();
+ }
+}
+boot();
+
+
+/***/ }),
+
+/***/ "./BootCommon.ts":
+/*!***********************!*\
+ !*** ./BootCommon.ts ***!
+ \***********************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+var __generator = (this && this.__generator) || function (thisArg, body) {
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
+ function verb(n) { return function (v) { return step([n, v]); }; }
+ function step(op) {
+ if (f) throw new TypeError("Generator is already executing.");
+ while (_) try {
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
+ if (y = 0, t) op = [op[0] & 2, t.value];
+ switch (op[0]) {
+ case 0: case 1: t = op; break;
+ case 4: _.label++; return { value: op[1], done: false };
+ case 5: _.label++; y = op[1]; op = [0]; continue;
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
+ default:
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
+ if (t[2]) _.ops.pop();
+ _.trys.pop(); continue;
+ }
+ op = body.call(thisArg, _);
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
+ }
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+function fetchBootConfigAsync() {
+ return __awaiter(this, void 0, void 0, function () {
+ var bootConfigResponse;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [4 /*yield*/, fetch('_framework/blazor.boot.json', { method: 'Get', credentials: 'include' })];
+ case 1:
+ bootConfigResponse = _a.sent();
+ return [2 /*return*/, bootConfigResponse.json()];
+ }
+ });
+ });
+}
+exports.fetchBootConfigAsync = fetchBootConfigAsync;
+function loadEmbeddedResourcesAsync(bootConfig) {
+ var cssLoadingPromises = bootConfig.cssReferences.map(function (cssReference) {
+ var linkElement = document.createElement('link');
+ linkElement.rel = 'stylesheet';
+ linkElement.href = cssReference;
+ return loadResourceFromElement(linkElement);
+ });
+ var jsLoadingPromises = bootConfig.jsReferences.map(function (jsReference) {
+ var scriptElement = document.createElement('script');
+ scriptElement.src = jsReference;
+ return loadResourceFromElement(scriptElement);
+ });
+ return Promise.all(cssLoadingPromises.concat(jsLoadingPromises));
+}
+exports.loadEmbeddedResourcesAsync = loadEmbeddedResourcesAsync;
+function loadResourceFromElement(element) {
+ return new Promise(function (resolve, reject) {
+ element.onload = resolve;
+ element.onerror = reject;
+ document.head.appendChild(element);
+ });
+}
+
+
+/***/ }),
+
+/***/ "./Environment.ts":
+/*!************************!*\
+ !*** ./Environment.ts ***!
+ \************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+function setPlatform(platformInstance) {
+ exports.platform = platformInstance;
+ return exports.platform;
+}
+exports.setPlatform = setPlatform;
+
+
+/***/ }),
+
+/***/ "./GlobalExports.ts":
+/*!**************************!*\
+ !*** ./GlobalExports.ts ***!
+ \**************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var UriHelper_1 = __webpack_require__(/*! ./Services/UriHelper */ "./Services/UriHelper.ts");
+var Http_1 = __webpack_require__(/*! ./Services/Http */ "./Services/Http.ts");
+var Renderer_1 = __webpack_require__(/*! ./Rendering/Renderer */ "./Rendering/Renderer.ts");
+// Make the following APIs available in global scope for invocation from JS
+window['Blazor'] = {
+ navigateTo: UriHelper_1.navigateTo,
+ _internal: {
+ attachRootComponentToElement: Renderer_1.attachRootComponentToElement,
+ http: Http_1.internalFunctions,
+ uriHelper: UriHelper_1.internalFunctions
+ }
+};
+
+
+/***/ }),
+
+/***/ "./Platform/Circuits/AutoReconnectCircuitHandler.ts":
+/*!**********************************************************!*\
+ !*** ./Platform/Circuits/AutoReconnectCircuitHandler.ts ***!
+ \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+};
+var __generator = (this && this.__generator) || function (thisArg, body) {
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
+ function verb(n) { return function (v) { return step([n, v]); }; }
+ function step(op) {
+ if (f) throw new TypeError("Generator is already executing.");
+ while (_) try {
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
+ if (y = 0, t) op = [op[0] & 2, t.value];
+ switch (op[0]) {
+ case 0: case 1: t = op; break;
+ case 4: _.label++; return { value: op[1], done: false };
+ case 5: _.label++; y = op[1]; op = [0]; continue;
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
+ default:
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
+ if (t[2]) _.ops.pop();
+ _.trys.pop(); continue;
+ }
+ op = body.call(thisArg, _);
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
+ }
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+var UserSpecifiedDisplay_1 = __webpack_require__(/*! ./UserSpecifiedDisplay */ "./Platform/Circuits/UserSpecifiedDisplay.ts");
+var DefaultReconnectDisplay_1 = __webpack_require__(/*! ./DefaultReconnectDisplay */ "./Platform/Circuits/DefaultReconnectDisplay.ts");
+var AutoReconnectCircuitHandler = /** @class */ (function () {
+ function AutoReconnectCircuitHandler() {
+ var _this = this;
+ this.reconnectDisplay = new DefaultReconnectDisplay_1.DefaultReconnectDisplay(document);
+ document.addEventListener('DOMContentLoaded', function () {
+ var modal = document.getElementById(AutoReconnectCircuitHandler.DialogId);
+ if (modal) {
+ _this.reconnectDisplay = new UserSpecifiedDisplay_1.UserSpecifiedDisplay(modal);
+ }
+ });
+ }
+ AutoReconnectCircuitHandler.prototype.onConnectionUp = function () {
+ this.reconnectDisplay.hide();
+ };
+ AutoReconnectCircuitHandler.prototype.delay = function () {
+ return new Promise(function (resolve) { return setTimeout(resolve, AutoReconnectCircuitHandler.RetryInterval); });
+ };
+ AutoReconnectCircuitHandler.prototype.onConnectionDown = function () {
+ return __awaiter(this, void 0, void 0, function () {
+ var i, result, err_1;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ this.reconnectDisplay.show();
+ i = 0;
+ _a.label = 1;
+ case 1:
+ if (!(i < AutoReconnectCircuitHandler.MaxRetries)) return [3 /*break*/, 7];
+ return [4 /*yield*/, this.delay()];
+ case 2:
+ _a.sent();
+ _a.label = 3;
+ case 3:
+ _a.trys.push([3, 5, , 6]);
+ return [4 /*yield*/, window['Blazor'].reconnect()];
+ case 4:
+ result = _a.sent();
+ if (!result) {
+ // If the server responded and refused to reconnect, stop auto-retrying.
+ return [3 /*break*/, 7];
+ }
+ return [2 /*return*/];
+ case 5:
+ err_1 = _a.sent();
+ console.error(err_1);
+ return [3 /*break*/, 6];
+ case 6:
+ i++;
+ return [3 /*break*/, 1];
+ case 7:
+ this.reconnectDisplay.failed();
+ return [2 /*return*/];
+ }
+ });
+ });
+ };
+ AutoReconnectCircuitHandler.MaxRetries = 5;
+ AutoReconnectCircuitHandler.RetryInterval = 3000;
+ AutoReconnectCircuitHandler.DialogId = 'components-reconnect-modal';
+ return AutoReconnectCircuitHandler;
+}());
+exports.AutoReconnectCircuitHandler = AutoReconnectCircuitHandler;
+
+
+/***/ }),
+
+/***/ "./Platform/Circuits/DefaultReconnectDisplay.ts":
+/*!******************************************************!*\
+ !*** ./Platform/Circuits/DefaultReconnectDisplay.ts ***!
+ \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var AutoReconnectCircuitHandler_1 = __webpack_require__(/*! ./AutoReconnectCircuitHandler */ "./Platform/Circuits/AutoReconnectCircuitHandler.ts");
+var DefaultReconnectDisplay = /** @class */ (function () {
+ function DefaultReconnectDisplay(document) {
+ this.document = document;
+ this.addedToDom = false;
+ this.modal = this.document.createElement('div');
+ this.modal.id = AutoReconnectCircuitHandler_1.AutoReconnectCircuitHandler.DialogId;
+ var modalStyles = [
+ "position: fixed",
+ "top: 0",
+ "right: 0",
+ "bottom: 0",
+ "left: 0",
+ "z-index: 1000",
+ "display: none",
+ "overflow: hidden",
+ "background-color: #fff",
+ "opacity: 0.8",
+ "text-align: center",
+ "font-weight: bold"
+ ];
+ this.modal.style.cssText = modalStyles.join(';');
+ this.modal.innerHTML = '';
+ this.message = this.modal.querySelector('h5');
+ this.button = this.modal.querySelector('button');
+ this.button.addEventListener('click', function () { return window['Blazor'].reconnect(); });
+ }
+ DefaultReconnectDisplay.prototype.show = function () {
+ if (!this.addedToDom) {
+ this.addedToDom = true;
+ this.document.body.appendChild(this.modal);
+ }
+ this.modal.style.display = 'block';
+ this.button.style.display = 'none';
+ this.message.textContent = 'Attempting to reconnect to the server...';
+ };
+ DefaultReconnectDisplay.prototype.hide = function () {
+ this.modal.style.display = 'none';
+ };
+ DefaultReconnectDisplay.prototype.failed = function () {
+ this.button.style.display = 'block';
+ this.message.textContent = 'Failed to reconnect to the server.';
+ };
+ return DefaultReconnectDisplay;
+}());
+exports.DefaultReconnectDisplay = DefaultReconnectDisplay;
+
+
+/***/ }),
+
+/***/ "./Platform/Circuits/UserSpecifiedDisplay.ts":
+/*!***************************************************!*\
+ !*** ./Platform/Circuits/UserSpecifiedDisplay.ts ***!
+ \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var UserSpecifiedDisplay = /** @class */ (function () {
+ function UserSpecifiedDisplay(dialog) {
+ this.dialog = dialog;
+ }
+ UserSpecifiedDisplay.prototype.show = function () {
+ this.removeClasses();
+ this.dialog.classList.add(UserSpecifiedDisplay.ShowClassName);
+ };
+ UserSpecifiedDisplay.prototype.hide = function () {
+ this.removeClasses();
+ this.dialog.classList.add(UserSpecifiedDisplay.HideClassName);
+ };
+ UserSpecifiedDisplay.prototype.failed = function () {
+ this.removeClasses();
+ this.dialog.classList.add(UserSpecifiedDisplay.FailedClassName);
+ };
+ UserSpecifiedDisplay.prototype.removeClasses = function () {
+ this.dialog.classList.remove(UserSpecifiedDisplay.ShowClassName, UserSpecifiedDisplay.HideClassName, UserSpecifiedDisplay.FailedClassName);
+ };
+ UserSpecifiedDisplay.ShowClassName = 'components-reconnect-show';
+ UserSpecifiedDisplay.HideClassName = 'components-reconnect-hide';
+ UserSpecifiedDisplay.FailedClassName = 'components-reconnect-failed';
+ return UserSpecifiedDisplay;
+}());
+exports.UserSpecifiedDisplay = UserSpecifiedDisplay;
+
+
+/***/ }),
+
+/***/ "./Rendering/BrowserRenderer.ts":
+/*!**************************************!*\
+ !*** ./Rendering/BrowserRenderer.ts ***!
+ \**************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var RenderBatch_1 = __webpack_require__(/*! ./RenderBatch/RenderBatch */ "./Rendering/RenderBatch/RenderBatch.ts");
+var EventDelegator_1 = __webpack_require__(/*! ./EventDelegator */ "./Rendering/EventDelegator.ts");
+var LogicalElements_1 = __webpack_require__(/*! ./LogicalElements */ "./Rendering/LogicalElements.ts");
+var ElementReferenceCapture_1 = __webpack_require__(/*! ./ElementReferenceCapture */ "./Rendering/ElementReferenceCapture.ts");
+var selectValuePropname = '_blazorSelectValue';
+var sharedTemplateElemForParsing = document.createElement('template');
+var sharedSvgElemForParsing = document.createElementNS('http://www.w3.org/2000/svg', 'g');
+var preventDefaultEvents = { submit: true };
+var rootComponentsPendingFirstRender = {};
+var BrowserRenderer = /** @class */ (function () {
+ function BrowserRenderer(browserRendererId) {
+ var _this = this;
+ this.browserRendererId = browserRendererId;
+ this.childComponentLocations = {};
+ this.eventDelegator = new EventDelegator_1.EventDelegator(function (event, eventHandlerId, eventArgs) {
+ raiseEvent(event, _this.browserRendererId, eventHandlerId, eventArgs);
+ });
+ }
+ BrowserRenderer.prototype.attachRootComponentToElement = function (componentId, element) {
+ // 'allowExistingContents' to keep any prerendered content until we do the first client-side render
+ this.attachComponentToElement(componentId, LogicalElements_1.toLogicalElement(element, /* allowExistingContents */ true));
+ rootComponentsPendingFirstRender[componentId] = element;
+ };
+ BrowserRenderer.prototype.updateComponent = function (batch, componentId, edits, referenceFrames) {
+ var element = this.childComponentLocations[componentId];
+ if (!element) {
+ throw new Error("No element is currently associated with component " + componentId);
+ }
+ // On the first render for each root component, clear any existing content (e.g., prerendered)
+ var rootElementToClear = rootComponentsPendingFirstRender[componentId];
+ if (rootElementToClear) {
+ delete rootComponentsPendingFirstRender[componentId];
+ clearElement(rootElementToClear);
+ }
+ this.applyEdits(batch, element, 0, edits, referenceFrames);
+ };
+ BrowserRenderer.prototype.disposeComponent = function (componentId) {
+ delete this.childComponentLocations[componentId];
+ };
+ BrowserRenderer.prototype.disposeEventHandler = function (eventHandlerId) {
+ this.eventDelegator.removeListener(eventHandlerId);
+ };
+ BrowserRenderer.prototype.attachComponentToElement = function (componentId, element) {
+ this.childComponentLocations[componentId] = element;
+ };
+ BrowserRenderer.prototype.applyEdits = function (batch, parent, childIndex, edits, referenceFrames) {
+ var currentDepth = 0;
+ var childIndexAtCurrentDepth = childIndex;
+ var arraySegmentReader = batch.arraySegmentReader;
+ var editReader = batch.editReader;
+ var frameReader = batch.frameReader;
+ var editsValues = arraySegmentReader.values(edits);
+ var editsOffset = arraySegmentReader.offset(edits);
+ var editsLength = arraySegmentReader.count(edits);
+ var maxEditIndexExcl = editsOffset + editsLength;
+ for (var editIndex = editsOffset; editIndex < maxEditIndexExcl; editIndex++) {
+ var edit = batch.diffReader.editsEntry(editsValues, editIndex);
+ var editType = editReader.editType(edit);
+ switch (editType) {
+ case RenderBatch_1.EditType.prependFrame: {
+ var frameIndex = editReader.newTreeIndex(edit);
+ var frame = batch.referenceFramesEntry(referenceFrames, frameIndex);
+ var siblingIndex = editReader.siblingIndex(edit);
+ this.insertFrame(batch, parent, childIndexAtCurrentDepth + siblingIndex, referenceFrames, frame, frameIndex);
+ break;
+ }
+ case RenderBatch_1.EditType.removeFrame: {
+ var siblingIndex = editReader.siblingIndex(edit);
+ LogicalElements_1.removeLogicalChild(parent, childIndexAtCurrentDepth + siblingIndex);
+ break;
+ }
+ case RenderBatch_1.EditType.setAttribute: {
+ var frameIndex = editReader.newTreeIndex(edit);
+ var frame = batch.referenceFramesEntry(referenceFrames, frameIndex);
+ var siblingIndex = editReader.siblingIndex(edit);
+ var element = LogicalElements_1.getLogicalChild(parent, childIndexAtCurrentDepth + siblingIndex);
+ if (element instanceof Element) {
+ this.applyAttribute(batch, element, frame);
+ }
+ else {
+ throw new Error("Cannot set attribute on non-element child");
+ }
+ break;
+ }
+ case RenderBatch_1.EditType.removeAttribute: {
+ // Note that we don't have to dispose the info we track about event handlers here, because the
+ // disposed event handler IDs are delivered separately (in the 'disposedEventHandlerIds' array)
+ var siblingIndex = editReader.siblingIndex(edit);
+ var element = LogicalElements_1.getLogicalChild(parent, childIndexAtCurrentDepth + siblingIndex);
+ if (element instanceof HTMLElement) {
+ var attributeName = editReader.removedAttributeName(edit);
+ // First try to remove any special property we use for this attribute
+ if (!this.tryApplySpecialProperty(batch, element, attributeName, null)) {
+ // If that's not applicable, it's a regular DOM attribute so remove that
+ element.removeAttribute(attributeName);
+ }
+ }
+ else {
+ throw new Error("Cannot remove attribute from non-element child");
+ }
+ break;
+ }
+ case RenderBatch_1.EditType.updateText: {
+ var frameIndex = editReader.newTreeIndex(edit);
+ var frame = batch.referenceFramesEntry(referenceFrames, frameIndex);
+ var siblingIndex = editReader.siblingIndex(edit);
+ var textNode = LogicalElements_1.getLogicalChild(parent, childIndexAtCurrentDepth + siblingIndex);
+ if (textNode instanceof Text) {
+ textNode.textContent = frameReader.textContent(frame);
+ }
+ else {
+ throw new Error("Cannot set text content on non-text child");
+ }
+ break;
+ }
+ case RenderBatch_1.EditType.updateMarkup: {
+ var frameIndex = editReader.newTreeIndex(edit);
+ var frame = batch.referenceFramesEntry(referenceFrames, frameIndex);
+ var siblingIndex = editReader.siblingIndex(edit);
+ LogicalElements_1.removeLogicalChild(parent, childIndexAtCurrentDepth + siblingIndex);
+ this.insertMarkup(batch, parent, childIndexAtCurrentDepth + siblingIndex, frame);
+ break;
+ }
+ case RenderBatch_1.EditType.stepIn: {
+ var siblingIndex = editReader.siblingIndex(edit);
+ parent = LogicalElements_1.getLogicalChild(parent, childIndexAtCurrentDepth + siblingIndex);
+ currentDepth++;
+ childIndexAtCurrentDepth = 0;
+ break;
+ }
+ case RenderBatch_1.EditType.stepOut: {
+ parent = LogicalElements_1.getLogicalParent(parent);
+ currentDepth--;
+ childIndexAtCurrentDepth = currentDepth === 0 ? childIndex : 0; // The childIndex is only ever nonzero at zero depth
+ break;
+ }
+ default: {
+ var unknownType = editType; // Compile-time verification that the switch was exhaustive
+ throw new Error("Unknown edit type: " + unknownType);
+ }
+ }
+ }
+ };
+ BrowserRenderer.prototype.insertFrame = function (batch, parent, childIndex, frames, frame, frameIndex) {
+ var frameReader = batch.frameReader;
+ var frameType = frameReader.frameType(frame);
+ switch (frameType) {
+ case RenderBatch_1.FrameType.element:
+ this.insertElement(batch, parent, childIndex, frames, frame, frameIndex);
+ return 1;
+ case RenderBatch_1.FrameType.text:
+ this.insertText(batch, parent, childIndex, frame);
+ return 1;
+ case RenderBatch_1.FrameType.attribute:
+ throw new Error('Attribute frames should only be present as leading children of element frames.');
+ case RenderBatch_1.FrameType.component:
+ this.insertComponent(batch, parent, childIndex, frame);
+ return 1;
+ case RenderBatch_1.FrameType.region:
+ return this.insertFrameRange(batch, parent, childIndex, frames, frameIndex + 1, frameIndex + frameReader.subtreeLength(frame));
+ case RenderBatch_1.FrameType.elementReferenceCapture:
+ if (parent instanceof Element) {
+ ElementReferenceCapture_1.applyCaptureIdToElement(parent, frameReader.elementReferenceCaptureId(frame));
+ return 0; // A "capture" is a child in the diff, but has no node in the DOM
+ }
+ else {
+ throw new Error('Reference capture frames can only be children of element frames.');
+ }
+ case RenderBatch_1.FrameType.markup:
+ this.insertMarkup(batch, parent, childIndex, frame);
+ return 1;
+ default:
+ var unknownType = frameType; // Compile-time verification that the switch was exhaustive
+ throw new Error("Unknown frame type: " + unknownType);
+ }
+ };
+ BrowserRenderer.prototype.insertElement = function (batch, parent, childIndex, frames, frame, frameIndex) {
+ var frameReader = batch.frameReader;
+ var tagName = frameReader.elementName(frame);
+ var newDomElementRaw = tagName === 'svg' || LogicalElements_1.isSvgElement(parent) ?
+ document.createElementNS('http://www.w3.org/2000/svg', tagName) :
+ document.createElement(tagName);
+ var newElement = LogicalElements_1.toLogicalElement(newDomElementRaw);
+ LogicalElements_1.insertLogicalChild(newDomElementRaw, parent, childIndex);
+ // Apply attributes
+ var descendantsEndIndexExcl = frameIndex + frameReader.subtreeLength(frame);
+ for (var descendantIndex = frameIndex + 1; descendantIndex < descendantsEndIndexExcl; descendantIndex++) {
+ var descendantFrame = batch.referenceFramesEntry(frames, descendantIndex);
+ if (frameReader.frameType(descendantFrame) === RenderBatch_1.FrameType.attribute) {
+ this.applyAttribute(batch, newDomElementRaw, descendantFrame);
+ }
+ else {
+ // As soon as we see a non-attribute child, all the subsequent child frames are
+ // not attributes, so bail out and insert the remnants recursively
+ this.insertFrameRange(batch, newElement, 0, frames, descendantIndex, descendantsEndIndexExcl);
+ break;
+ }
+ }
+ };
+ BrowserRenderer.prototype.insertComponent = function (batch, parent, childIndex, frame) {
+ var containerElement = LogicalElements_1.createAndInsertLogicalContainer(parent, childIndex);
+ // All we have to do is associate the child component ID with its location. We don't actually
+ // do any rendering here, because the diff for the child will appear later in the render batch.
+ var childComponentId = batch.frameReader.componentId(frame);
+ this.attachComponentToElement(childComponentId, containerElement);
+ };
+ BrowserRenderer.prototype.insertText = function (batch, parent, childIndex, textFrame) {
+ var textContent = batch.frameReader.textContent(textFrame);
+ var newTextNode = document.createTextNode(textContent);
+ LogicalElements_1.insertLogicalChild(newTextNode, parent, childIndex);
+ };
+ BrowserRenderer.prototype.insertMarkup = function (batch, parent, childIndex, markupFrame) {
+ var markupContainer = LogicalElements_1.createAndInsertLogicalContainer(parent, childIndex);
+ var markupContent = batch.frameReader.markupContent(markupFrame);
+ var parsedMarkup = parseMarkup(markupContent, LogicalElements_1.isSvgElement(parent));
+ var logicalSiblingIndex = 0;
+ while (parsedMarkup.firstChild) {
+ LogicalElements_1.insertLogicalChild(parsedMarkup.firstChild, markupContainer, logicalSiblingIndex++);
+ }
+ };
+ BrowserRenderer.prototype.applyAttribute = function (batch, toDomElement, attributeFrame) {
+ var frameReader = batch.frameReader;
+ var attributeName = frameReader.attributeName(attributeFrame);
+ var browserRendererId = this.browserRendererId;
+ var eventHandlerId = frameReader.attributeEventHandlerId(attributeFrame);
+ if (eventHandlerId) {
+ var firstTwoChars = attributeName.substring(0, 2);
+ var eventName = attributeName.substring(2);
+ if (firstTwoChars !== 'on' || !eventName) {
+ throw new Error("Attribute has nonzero event handler ID, but attribute name '" + attributeName + "' does not start with 'on'.");
+ }
+ this.eventDelegator.setListener(toDomElement, eventName, eventHandlerId);
+ return;
+ }
+ // First see if we have special handling for this attribute
+ if (!this.tryApplySpecialProperty(batch, toDomElement, attributeName, attributeFrame)) {
+ // If not, treat it as a regular string-valued attribute
+ toDomElement.setAttribute(attributeName, frameReader.attributeValue(attributeFrame));
+ }
+ };
+ BrowserRenderer.prototype.tryApplySpecialProperty = function (batch, element, attributeName, attributeFrame) {
+ switch (attributeName) {
+ case 'value':
+ return this.tryApplyValueProperty(batch, element, attributeFrame);
+ case 'checked':
+ return this.tryApplyCheckedProperty(batch, element, attributeFrame);
+ default:
+ return false;
+ }
+ };
+ BrowserRenderer.prototype.tryApplyValueProperty = function (batch, element, attributeFrame) {
+ // Certain elements have built-in behaviour for their 'value' property
+ var frameReader = batch.frameReader;
+ switch (element.tagName) {
+ case 'INPUT':
+ case 'SELECT':
+ case 'TEXTAREA': {
+ var value = attributeFrame ? frameReader.attributeValue(attributeFrame) : null;
+ element.value = value;
+ if (element.tagName === 'SELECT') {
+ //