diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..71989d9
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,404 @@
+# Version: 1.6.2 (Using https://semver.org/)
+# Updated: 2020-11-02
+# See https://github.com/RehanSaeed/EditorConfig/releases for release notes.
+# See https://github.com/RehanSaeed/EditorConfig for updates to this file.
+# See http://EditorConfig.org for more information about .editorconfig files.
+#
+# Severity-values: none, hint, suggestion, warning, error
+
+##########################################
+# Common Settings
+##########################################
+
+# This file is the top-most EditorConfig file
+root = true
+
+# All Files
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 4
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+
+##########################################
+# File Extension Settings
+##########################################
+
+# Visual Studio Solution Files
+[*.sln]
+indent_style = tab
+
+# Visual Studio XML Project Files
+[*.{csproj,vbproj,vcxproj.filters,proj,projitems,shproj}]
+indent_size = 2
+
+# XML Configuration Files
+[*.{xml,config,props,targets,nuspec,resx,ruleset,vsixmanifest,vsct}]
+indent_size = 2
+
+# JSON Files
+[*.{json,json5,webmanifest}]
+indent_size = 2
+
+# YAML Files
+[*.{yml,yaml}]
+indent_size = 2
+
+# Markdown Files
+[*.md]
+trim_trailing_whitespace = false
+
+# Web Files
+[*.{htm,html,js,jsm,ts,tsx,css,sass,scss,less,svg,vue}]
+indent_size = 2
+
+# Batch Files
+[*.{cmd,bat}]
+end_of_line = crlf
+
+# Bash Files
+[*.sh]
+end_of_line = lf
+
+# Makefiles
+[Makefile]
+indent_style = tab
+
+
+[*.js]
+trim_trailing_whitespace = true
+
+[*.less]
+trim_trailing_whitespace = false
+
+##########################################
+# File Header (Uncomment to support file headers)
+# https://docs.microsoft.com/visualstudio/ide/reference/add-file-header
+##########################################
+
+# [*.{cs,csx,cake,vb,vbx}]
+file_header_template = Copyright (c) Umbraco.\nSee LICENSE for more details.
+
+# SA1636: File header copyright text should match
+# Justification: .editorconfig supports file headers. If this is changed to a value other than "none", a stylecop.json file will need to added to the project.
+# dotnet_diagnostic.SA1636.severity = none
+
+##########################################
+# .NET Language Conventions
+# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions
+##########################################
+
+# .NET Code Style Settings
+# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#net-code-style-settings
+[*.{cs,csx,cake,vb,vbx}]
+# "this." and "Me." qualifiers
+# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#this-and-me
+dotnet_style_qualification_for_field = false:suggestion
+dotnet_style_qualification_for_property = false:suggestion
+dotnet_style_qualification_for_method = false:suggestion
+dotnet_style_qualification_for_event = false:suggestion
+# Language keywords instead of framework type names for type references
+# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#language-keywords
+dotnet_style_predefined_type_for_locals_parameters_members = true:warning
+dotnet_style_predefined_type_for_member_access = true:warning
+# Modifier preferences
+# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#normalize-modifiers
+dotnet_style_require_accessibility_modifiers = always:warning
+csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:warning
+visual_basic_preferred_modifier_order = Partial,Default,Private,Protected,Public,Friend,NotOverridable,Overridable,MustOverride,Overloads,Overrides,MustInherit,NotInheritable,Static,Shared,Shadows,ReadOnly,WriteOnly,Dim,Const,WithEvents,Widening,Narrowing,Custom,Async:warning
+dotnet_style_readonly_field = true:warning
+# Parentheses preferences
+# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#parentheses-preferences
+dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:warning
+dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:warning
+dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:warning
+dotnet_style_parentheses_in_other_operators = never_if_unnecessary:suggestion
+# Expression-level preferences
+# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#expression-level-preferences
+dotnet_style_object_initializer = true:warning
+dotnet_style_collection_initializer = true:warning
+dotnet_style_explicit_tuple_names = true:warning
+dotnet_style_prefer_inferred_tuple_names = true:warning
+dotnet_style_prefer_inferred_anonymous_type_member_names = true:warning
+dotnet_style_prefer_auto_properties = true:warning
+dotnet_style_prefer_is_null_check_over_reference_equality_method = true:warning
+dotnet_style_prefer_conditional_expression_over_assignment = false:suggestion
+dotnet_style_prefer_conditional_expression_over_return = false:suggestion
+dotnet_style_prefer_compound_assignment = true:warning
+# Null-checking preferences
+# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#null-checking-preferences
+dotnet_style_coalesce_expression = true:warning
+dotnet_style_null_propagation = true:warning
+# Parameter preferences
+# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#parameter-preferences
+dotnet_code_quality_unused_parameters = all:warning
+# More style options (Undocumented)
+# https://github.com/MicrosoftDocs/visualstudio-docs/issues/3641
+dotnet_style_operator_placement_when_wrapping = end_of_line
+# https://github.com/dotnet/roslyn/pull/40070
+dotnet_style_prefer_simplified_interpolation = true:warning
+
+# C# Code Style Settings
+# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#c-code-style-settings
+[*.{cs,csx,cake}]
+# Implicit and explicit types
+# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#implicit-and-explicit-types
+csharp_style_var_for_built_in_types = never
+csharp_style_var_when_type_is_apparent = never
+csharp_style_var_elsewhere = never
+# Expression-bodied members
+# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#expression-bodied-members
+csharp_style_expression_bodied_methods = true:suggestion
+csharp_style_expression_bodied_constructors = never
+csharp_style_expression_bodied_operators = true:suggestion
+csharp_style_expression_bodied_properties = true:suggestion
+csharp_style_expression_bodied_indexers = true:suggestion
+csharp_style_expression_bodied_accessors = true:suggestion
+csharp_style_expression_bodied_lambdas = true:suggestion
+csharp_style_expression_bodied_local_functions = true:suggestion
+# Pattern matching
+# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#pattern-matching
+csharp_style_pattern_matching_over_is_with_cast_check = true:warning
+csharp_style_pattern_matching_over_as_with_null_check = true:warning
+# Inlined variable declarations
+# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#inlined-variable-declarations
+csharp_style_inlined_variable_declaration = true:warning
+# Expression-level preferences
+# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#expression-level-preferences
+csharp_prefer_simple_default_expression = true:warning
+# "Null" checking preferences
+# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#c-null-checking-preferences
+csharp_style_throw_expression = true:warning
+csharp_style_conditional_delegate_call = true:warning
+# Code block preferences
+# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#code-block-preferences
+csharp_prefer_braces = false:warning
+# Unused value preferences
+# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#unused-value-preferences
+csharp_style_unused_value_expression_statement_preference = discard_variable:suggestion
+csharp_style_unused_value_assignment_preference = discard_variable:suggestion
+# Index and range preferences
+# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#index-and-range-preferences
+csharp_style_prefer_index_operator = true:warning
+csharp_style_prefer_range_operator = true:warning
+# Miscellaneous preferences
+# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#miscellaneous-preferences
+csharp_style_deconstructed_variable_declaration = true:warning
+csharp_style_pattern_local_over_anonymous_function = true:warning
+csharp_using_directive_placement = outside_namespace:warning
+csharp_prefer_static_local_function = true:warning
+csharp_prefer_simple_using_statement = true:suggestion
+
+##########################################
+# .NET Formatting Conventions
+# https://docs.microsoft.com/visualstudio/ide/editorconfig-code-style-settings-reference#formatting-conventions
+##########################################
+
+# Organize usings
+# https://docs.microsoft.com/visualstudio/ide/editorconfig-formatting-conventions#organize-using-directives
+dotnet_sort_system_directives_first = true
+# Newline options
+# https://docs.microsoft.com/visualstudio/ide/editorconfig-formatting-conventions#new-line-options
+csharp_new_line_before_open_brace = all
+csharp_new_line_before_else = true
+csharp_new_line_before_catch = true
+csharp_new_line_before_finally = true
+csharp_new_line_before_members_in_object_initializers = true
+csharp_new_line_before_members_in_anonymous_types = true
+csharp_new_line_between_query_expression_clauses = true
+# Indentation options
+# https://docs.microsoft.com/visualstudio/ide/editorconfig-formatting-conventions#indentation-options
+csharp_indent_case_contents = true
+csharp_indent_switch_labels = true
+csharp_indent_labels = no_change
+csharp_indent_block_contents = true
+csharp_indent_braces = false
+csharp_indent_case_contents_when_block = false
+# Spacing options
+# https://docs.microsoft.com/visualstudio/ide/editorconfig-formatting-conventions#spacing-options
+csharp_space_after_cast = false
+csharp_space_after_keywords_in_control_flow_statements = true
+csharp_space_between_parentheses = false
+csharp_space_before_colon_in_inheritance_clause = true
+csharp_space_after_colon_in_inheritance_clause = true
+csharp_space_around_binary_operators = before_and_after
+csharp_space_between_method_declaration_parameter_list_parentheses = false
+csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
+csharp_space_between_method_declaration_name_and_open_parenthesis = false
+csharp_space_between_method_call_parameter_list_parentheses = false
+csharp_space_between_method_call_empty_parameter_list_parentheses = false
+csharp_space_between_method_call_name_and_opening_parenthesis = false
+csharp_space_after_comma = true
+csharp_space_before_comma = false
+csharp_space_after_dot = false
+csharp_space_before_dot = false
+csharp_space_after_semicolon_in_for_statement = true
+csharp_space_before_semicolon_in_for_statement = false
+csharp_space_around_declaration_statements = false
+csharp_space_before_open_square_brackets = false
+csharp_space_between_empty_square_brackets = false
+csharp_space_between_square_brackets = false
+# Wrapping options
+# https://docs.microsoft.com/visualstudio/ide/editorconfig-formatting-conventions#wrap-options
+csharp_preserve_single_line_statements = false
+csharp_preserve_single_line_blocks = true
+
+##########################################
+# .NET Naming Conventions
+# https://docs.microsoft.com/visualstudio/ide/editorconfig-naming-conventions
+##########################################
+
+[*.{cs,csx,cake,vb,vbx}]
+dotnet_diagnostic.CS1591.severity = none
+
+##########################################
+# Styles
+##########################################
+
+# camel_case_style - Define the camelCase style
+dotnet_naming_style.camel_case_style.capitalization = camel_case
+# pascal_case_style - Define the PascalCase style
+dotnet_naming_style.pascal_case_style.capitalization = pascal_case
+# first_upper_style - The first character must start with an upper-case character
+dotnet_naming_style.first_upper_style.capitalization = first_word_upper
+# prefix_interface_with_i_style - Interfaces must be PascalCase and the first character of an interface must be an 'I'
+dotnet_naming_style.prefix_interface_with_i_style.capitalization = pascal_case
+dotnet_naming_style.prefix_interface_with_i_style.required_prefix = I
+# prefix_type_parameters_with_t_style - Generic Type Parameters must be PascalCase and the first character must be a 'T'
+dotnet_naming_style.prefix_type_parameters_with_t_style.capitalization = pascal_case
+dotnet_naming_style.prefix_type_parameters_with_t_style.required_prefix = T
+# disallowed_style - Anything that has this style applied is marked as disallowed
+dotnet_naming_style.disallowed_style.capitalization = pascal_case
+dotnet_naming_style.disallowed_style.required_prefix = ____RULE_VIOLATION____
+dotnet_naming_style.disallowed_style.required_suffix = ____RULE_VIOLATION____
+# internal_error_style - This style should never occur... if it does, it indicates a bug in file or in the parser using the file
+dotnet_naming_style.internal_error_style.capitalization = pascal_case
+dotnet_naming_style.internal_error_style.required_prefix = ____INTERNAL_ERROR____
+dotnet_naming_style.internal_error_style.required_suffix = ____INTERNAL_ERROR____
+
+##########################################
+# .NET Design Guideline Field Naming Rules
+# Naming rules for fields follow the .NET Framework design guidelines
+# https://docs.microsoft.com/dotnet/standard/design-guidelines/index
+##########################################
+
+# All public/protected/protected_internal constant fields must be PascalCase
+# https://docs.microsoft.com/dotnet/standard/design-guidelines/field
+dotnet_naming_symbols.public_protected_constant_fields_group.applicable_accessibilities = public, protected, protected_internal, internal, private
+dotnet_naming_symbols.public_protected_constant_fields_group.required_modifiers = const
+dotnet_naming_symbols.public_protected_constant_fields_group.applicable_kinds = field
+dotnet_naming_rule.public_protected_constant_fields_must_be_pascal_case_rule.symbols = public_protected_constant_fields_group
+dotnet_naming_rule.public_protected_constant_fields_must_be_pascal_case_rule.style = pascal_case_style
+dotnet_naming_rule.public_protected_constant_fields_must_be_pascal_case_rule.severity = warning
+
+# All public/protected/protected_internal static readonly fields must be PascalCase
+# https://docs.microsoft.com/dotnet/standard/design-guidelines/field
+dotnet_naming_symbols.public_protected_static_readonly_fields_group.applicable_accessibilities = public, protected, protected_internal
+dotnet_naming_symbols.public_protected_static_readonly_fields_group.required_modifiers = static, readonly
+dotnet_naming_symbols.public_protected_static_readonly_fields_group.applicable_kinds = field
+dotnet_naming_rule.public_protected_static_readonly_fields_must_be_pascal_case_rule.symbols = public_protected_static_readonly_fields_group
+dotnet_naming_rule.public_protected_static_readonly_fields_must_be_pascal_case_rule.style = pascal_case_style
+dotnet_naming_rule.public_protected_static_readonly_fields_must_be_pascal_case_rule.severity = warning
+
+# No other public/protected/protected_internal fields are allowed
+# https://docs.microsoft.com/dotnet/standard/design-guidelines/field
+dotnet_naming_symbols.other_public_protected_fields_group.applicable_accessibilities = public, protected, protected_internal
+dotnet_naming_symbols.other_public_protected_fields_group.applicable_kinds = field
+dotnet_naming_rule.other_public_protected_fields_disallowed_rule.symbols = other_public_protected_fields_group
+dotnet_naming_rule.other_public_protected_fields_disallowed_rule.style = disallowed_style
+dotnet_naming_rule.other_public_protected_fields_disallowed_rule.severity = ignore
+
+# This rule should never fire. However, it's included for at least two purposes:
+# First, it helps to understand, reason about, and root-case certain types of issues, such as bugs in .editorconfig parsers.
+# Second, it helps to raise immediate awareness if a new field type is added (as occurred recently in C#).
+dotnet_naming_symbols.sanity_check_uncovered_field_case_group.applicable_accessibilities = *
+dotnet_naming_symbols.sanity_check_uncovered_field_case_group.applicable_kinds = field
+dotnet_naming_rule.sanity_check_uncovered_field_case_rule.symbols = sanity_check_uncovered_field_case_group
+dotnet_naming_rule.sanity_check_uncovered_field_case_rule.style = internal_error_style
+dotnet_naming_rule.sanity_check_uncovered_field_case_rule.severity = error
+
+##########################################
+# Other Naming Rules
+##########################################
+
+# All of the following must be PascalCase:
+# - Namespaces
+# https://docs.microsoft.com/dotnet/standard/design-guidelines/names-of-namespaces
+# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1300.md
+# - Classes and Enumerations
+# https://docs.microsoft.com/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces
+# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1300.md
+# - Delegates
+# https://docs.microsoft.com/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces#names-of-common-types
+# - Constructors, Properties, Events, Methods
+# https://docs.microsoft.com/dotnet/standard/design-guidelines/names-of-type-members
+dotnet_naming_symbols.element_group.applicable_kinds = namespace, class, enum, struct, delegate, event, method, property
+dotnet_naming_rule.element_rule.symbols = element_group
+dotnet_naming_rule.element_rule.style = pascal_case_style
+dotnet_naming_rule.element_rule.severity = warning
+
+# Interfaces use PascalCase and are prefixed with uppercase 'I'
+# https://docs.microsoft.com/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces
+dotnet_naming_symbols.interface_group.applicable_kinds = interface
+dotnet_naming_rule.interface_rule.symbols = interface_group
+dotnet_naming_rule.interface_rule.style = prefix_interface_with_i_style
+dotnet_naming_rule.interface_rule.severity = warning
+
+# Generics Type Parameters use PascalCase and are prefixed with uppercase 'T'
+# https://docs.microsoft.com/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces
+dotnet_naming_symbols.type_parameter_group.applicable_kinds = type_parameter
+dotnet_naming_rule.type_parameter_rule.symbols = type_parameter_group
+dotnet_naming_rule.type_parameter_rule.style = prefix_type_parameters_with_t_style
+dotnet_naming_rule.type_parameter_rule.severity = warning
+
+# Function parameters use camelCase
+# https://docs.microsoft.com/dotnet/standard/design-guidelines/naming-parameters
+dotnet_naming_symbols.parameters_group.applicable_kinds = parameter
+dotnet_naming_rule.parameters_rule.symbols = parameters_group
+dotnet_naming_rule.parameters_rule.style = camel_case_style
+dotnet_naming_rule.parameters_rule.severity = warning
+
+# Instance fields use camelCase and are prefixed with '_'
+dotnet_naming_rule.instance_fields_should_be_camel_case.severity = warning
+dotnet_naming_rule.instance_fields_should_be_camel_case.symbols = instance_fields
+dotnet_naming_rule.instance_fields_should_be_camel_case.style = instance_field_style
+dotnet_naming_symbols.instance_fields.applicable_kinds = field
+dotnet_naming_style.instance_field_style.capitalization = camel_case
+dotnet_naming_style.instance_field_style.required_prefix = _
+
+##########################################
+# License
+##########################################
+# The following applies as to the .editorconfig file ONLY, and is
+# included below for reference, per the requirements of the license
+# corresponding to this .editorconfig file.
+# See: https://github.com/RehanSaeed/EditorConfig
+#
+# MIT License
+#
+# Copyright (c) 2017-2019 Muhammad Rehan Saeed
+# Copyright (c) 2019 Henry Gabryjelski
+#
+# Permission is hereby granted, free of charge, to any
+# person obtaining a copy of this software and associated
+# documentation files (the "Software"), to deal in the
+# Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute,
+# sublicense, and/or sell copies of the Software, and to permit
+# persons to whom the Software is furnished to do so, subject
+# to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+##########################################
diff --git a/.gitignore b/.gitignore
index bb84def..5166bef 100644
--- a/.gitignore
+++ b/.gitignore
@@ -48,4 +48,6 @@ bin/
xcopy*
Our.Umbraco.TheDashboard.Testsite/
-Artifacts
\ No newline at end of file
+Artifacts
+
+Our.Umbraco.TheDashboard/wwwroot/App_Plugins/Our.Umbraco.TheDashboard/dist
\ No newline at end of file
diff --git a/Our.Umbraco.TheDashboard/Client/.gitignore b/Our.Umbraco.TheDashboard/Client/.gitignore
new file mode 100644
index 0000000..a547bf3
--- /dev/null
+++ b/Our.Umbraco.TheDashboard/Client/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/Our.Umbraco.TheDashboard/Client/index.html b/Our.Umbraco.TheDashboard/Client/index.html
new file mode 100644
index 0000000..283e961
--- /dev/null
+++ b/Our.Umbraco.TheDashboard/Client/index.html
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+ Vite + Lit + TS
+
+
+
+
+
+ Vite + Lit
+
+
+
diff --git a/Our.Umbraco.TheDashboard/Client/openapi-ts.config.ts b/Our.Umbraco.TheDashboard/Client/openapi-ts.config.ts
new file mode 100644
index 0000000..563fb04
--- /dev/null
+++ b/Our.Umbraco.TheDashboard/Client/openapi-ts.config.ts
@@ -0,0 +1,14 @@
+import { defineConfig } from '@hey-api/openapi-ts';
+
+export default defineConfig({
+ input: 'http://localhost:24760/umbraco/swagger/the-dashboard/swagger.json',
+ output: 'src/backend-api',
+ //format : false,
+ //enums : 'javascript', // Typescript not recommended https://heyapi.vercel.app/openapi-ts/configuration.html#enums
+ schemas : false,
+ //lint : false,
+ //debug: true,
+ services: {
+ name: '{{name}}Resource'
+ }
+});
diff --git a/Our.Umbraco.TheDashboard/Client/package-lock.json b/Our.Umbraco.TheDashboard/Client/package-lock.json
new file mode 100644
index 0000000..4d1c3d8
--- /dev/null
+++ b/Our.Umbraco.TheDashboard/Client/package-lock.json
@@ -0,0 +1,2834 @@
+{
+ "name": "the-dashboard-umbraco",
+ "version": "14.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "the-dashboard-umbraco",
+ "version": "14.0.0",
+ "dependencies": {
+ "lit": "^3.1.2"
+ },
+ "devDependencies": {
+ "@hey-api/openapi-ts": "^0.45.1",
+ "@umbraco-cms/backoffice": "^14.0.0-rc3",
+ "typescript": "^5.2.2",
+ "vite": "^5.2.0"
+ }
+ },
+ "node_modules/@apidevtools/json-schema-ref-parser": {
+ "version": "11.6.1",
+ "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.6.1.tgz",
+ "integrity": "sha512-DxjgKBCoyReu4p5HMvpmgSOfRhhBcuf5V5soDDRgOTZMwsA4KSFzol1abFZgiCTE11L2kKGca5Md9GwDdXVBwQ==",
+ "dev": true,
+ "dependencies": {
+ "@jsdevtools/ono": "^7.1.3",
+ "@types/json-schema": "^7.0.15",
+ "js-yaml": "^4.1.0"
+ },
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/philsturgeon"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
+ "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz",
+ "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz",
+ "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz",
+ "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz",
+ "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz",
+ "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz",
+ "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz",
+ "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz",
+ "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz",
+ "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz",
+ "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz",
+ "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz",
+ "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz",
+ "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz",
+ "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz",
+ "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz",
+ "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz",
+ "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz",
+ "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz",
+ "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz",
+ "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz",
+ "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz",
+ "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@hey-api/openapi-ts": {
+ "version": "0.45.1",
+ "resolved": "https://registry.npmjs.org/@hey-api/openapi-ts/-/openapi-ts-0.45.1.tgz",
+ "integrity": "sha512-TT4YC9SshgruHnr/z47LD945hFhefuD6xSfdt9+fv/sU+shP0nPJhNdyt71oMGTAB9h6nsrjC8z84ZnoAGKHrg==",
+ "dev": true,
+ "dependencies": {
+ "@apidevtools/json-schema-ref-parser": "11.6.1",
+ "c12": "1.10.0",
+ "camelcase": "8.0.0",
+ "commander": "12.0.0",
+ "handlebars": "4.7.8"
+ },
+ "bin": {
+ "openapi-ts": "bin/index.cjs"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "peerDependencies": {
+ "typescript": "^5.x"
+ }
+ },
+ "node_modules/@jsdevtools/ono": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz",
+ "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==",
+ "dev": true
+ },
+ "node_modules/@lit-labs/ssr-dom-shim": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.0.tgz",
+ "integrity": "sha512-yWJKmpGE6lUURKAaIltoPIE/wrbY3TEkqQt+X0m+7fQNnAv0keydnYvbiJFP1PnMhizmIWRWOG5KLhYyc/xl+g=="
+ },
+ "node_modules/@lit/reactive-element": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.0.4.tgz",
+ "integrity": "sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==",
+ "dependencies": {
+ "@lit-labs/ssr-dom-shim": "^1.2.0"
+ }
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz",
+ "integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz",
+ "integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz",
+ "integrity": "sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz",
+ "integrity": "sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz",
+ "integrity": "sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz",
+ "integrity": "sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz",
+ "integrity": "sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz",
+ "integrity": "sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz",
+ "integrity": "sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz",
+ "integrity": "sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz",
+ "integrity": "sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz",
+ "integrity": "sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz",
+ "integrity": "sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz",
+ "integrity": "sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz",
+ "integrity": "sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz",
+ "integrity": "sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@types/diff": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/@types/diff/-/diff-5.2.1.tgz",
+ "integrity": "sha512-uxpcuwWJGhe2AR1g8hD9F5OYGCqjqWnBUQFD8gMZsDbv8oPHzxJF6iMO6n8Tk0AdzlxoaaoQhOYlIg/PukVU8g==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/@types/dompurify": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.0.5.tgz",
+ "integrity": "sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@types/trusted-types": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
+ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
+ "dev": true
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true
+ },
+ "node_modules/@types/trusted-types": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
+ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="
+ },
+ "node_modules/@types/uuid": {
+ "version": "9.0.8",
+ "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz",
+ "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/@umbraco-cms/backoffice": {
+ "version": "14.0.0-rc3",
+ "resolved": "https://registry.npmjs.org/@umbraco-cms/backoffice/-/backoffice-14.0.0-rc3.tgz",
+ "integrity": "sha512-R8NKkwN1oTb9I2Mb7GlShjkw9+7F3UiyLf3Q3admHl0BVf34TcfE6QCsZAL50FYSewI9umsi48Xdaxx/WtASVg==",
+ "dev": true,
+ "engines": {
+ "node": ">=20.9 <21",
+ "npm": ">=10.1 < 11"
+ },
+ "peerDependencies": {
+ "@types/diff": "^5.0.9",
+ "@types/dompurify": "^3.0.5",
+ "@types/uuid": "^9.0.8",
+ "@umbraco-ui/uui": "1.8.0-rc.3",
+ "@umbraco-ui/uui-css": "1.8.0-rc.0",
+ "base64-js": "^1.5.1",
+ "diff": "^5.2.0",
+ "dompurify": "^3.0.9",
+ "element-internals-polyfill": "^1.3.10",
+ "lit": "^3.1.2",
+ "marked": "^12.0.0",
+ "monaco-editor": "^0.46.0",
+ "rxjs": "^7.8.1",
+ "tinymce": "^6.8.3",
+ "tinymce-i18n": "^24.1.29",
+ "uuid": "^9.0.1"
+ }
+ },
+ "node_modules/@umbraco-ui/uui": {
+ "version": "1.8.0-rc.3",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui/-/uui-1.8.0-rc.3.tgz",
+ "integrity": "sha512-35kEb4xjQY+90cYCC28+wIbk6XPXB504TIr6qDi0Ekl11zN3PvMIyhQooohjKD1FxpwfDNeagiBW56e2LnZJkA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-action-bar": "1.8.0-rc.0",
+ "@umbraco-ui/uui-avatar": "1.8.0-rc.0",
+ "@umbraco-ui/uui-avatar-group": "1.8.0-rc.0",
+ "@umbraco-ui/uui-badge": "1.8.0-rc.0",
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-boolean-input": "1.8.0-rc.0",
+ "@umbraco-ui/uui-box": "1.8.0-rc.1",
+ "@umbraco-ui/uui-breadcrumbs": "1.8.0-rc.0",
+ "@umbraco-ui/uui-button": "1.8.0-rc.2",
+ "@umbraco-ui/uui-button-group": "1.8.0-rc.0",
+ "@umbraco-ui/uui-button-inline-create": "1.8.0-rc.0",
+ "@umbraco-ui/uui-card": "1.8.0-rc.0",
+ "@umbraco-ui/uui-card-block-type": "1.8.0-rc.0",
+ "@umbraco-ui/uui-card-content-node": "1.8.0-rc.0",
+ "@umbraco-ui/uui-card-media": "1.8.0-rc.0",
+ "@umbraco-ui/uui-card-user": "1.8.0-rc.0",
+ "@umbraco-ui/uui-caret": "1.8.0-rc.0",
+ "@umbraco-ui/uui-checkbox": "1.8.0-rc.0",
+ "@umbraco-ui/uui-color-area": "1.8.0-rc.0",
+ "@umbraco-ui/uui-color-picker": "1.8.0-rc.0",
+ "@umbraco-ui/uui-color-slider": "1.8.0-rc.0",
+ "@umbraco-ui/uui-color-swatch": "1.8.0-rc.0",
+ "@umbraco-ui/uui-color-swatches": "1.8.0-rc.0",
+ "@umbraco-ui/uui-combobox": "1.8.0-rc.2",
+ "@umbraco-ui/uui-combobox-list": "1.8.0-rc.0",
+ "@umbraco-ui/uui-css": "1.8.0-rc.0",
+ "@umbraco-ui/uui-dialog": "1.8.0-rc.0",
+ "@umbraco-ui/uui-dialog-layout": "1.8.0-rc.0",
+ "@umbraco-ui/uui-file-dropzone": "1.8.0-rc.0",
+ "@umbraco-ui/uui-file-preview": "1.8.0-rc.0",
+ "@umbraco-ui/uui-form": "1.8.0-rc.0",
+ "@umbraco-ui/uui-form-layout-item": "1.8.0-rc.0",
+ "@umbraco-ui/uui-form-validation-message": "1.8.0-rc.0",
+ "@umbraco-ui/uui-icon": "1.8.0-rc.0",
+ "@umbraco-ui/uui-icon-registry": "1.8.0-rc.0",
+ "@umbraco-ui/uui-icon-registry-essential": "1.8.0-rc.0",
+ "@umbraco-ui/uui-input": "1.8.0-rc.0",
+ "@umbraco-ui/uui-input-file": "1.8.0-rc.2",
+ "@umbraco-ui/uui-input-lock": "1.8.0-rc.2",
+ "@umbraco-ui/uui-input-password": "1.8.0-rc.0",
+ "@umbraco-ui/uui-keyboard-shortcut": "1.8.0-rc.0",
+ "@umbraco-ui/uui-label": "1.8.0-rc.0",
+ "@umbraco-ui/uui-loader": "1.8.0-rc.0",
+ "@umbraco-ui/uui-loader-bar": "1.8.0-rc.0",
+ "@umbraco-ui/uui-loader-circle": "1.8.0-rc.0",
+ "@umbraco-ui/uui-menu-item": "1.8.0-rc.1",
+ "@umbraco-ui/uui-modal": "1.8.0-rc.3",
+ "@umbraco-ui/uui-pagination": "1.8.0-rc.2",
+ "@umbraco-ui/uui-popover": "1.8.0-rc.0",
+ "@umbraco-ui/uui-popover-container": "1.8.0-rc.0",
+ "@umbraco-ui/uui-progress-bar": "1.8.0-rc.0",
+ "@umbraco-ui/uui-radio": "1.8.0-rc.0",
+ "@umbraco-ui/uui-range-slider": "1.8.0-rc.0",
+ "@umbraco-ui/uui-ref": "1.8.0-rc.0",
+ "@umbraco-ui/uui-ref-list": "1.8.0-rc.0",
+ "@umbraco-ui/uui-ref-node": "1.8.0-rc.0",
+ "@umbraco-ui/uui-ref-node-data-type": "1.8.0-rc.0",
+ "@umbraco-ui/uui-ref-node-document-type": "1.8.0-rc.0",
+ "@umbraco-ui/uui-ref-node-form": "1.8.0-rc.0",
+ "@umbraco-ui/uui-ref-node-member": "1.8.0-rc.0",
+ "@umbraco-ui/uui-ref-node-package": "1.8.0-rc.0",
+ "@umbraco-ui/uui-ref-node-user": "1.8.0-rc.0",
+ "@umbraco-ui/uui-scroll-container": "1.8.0-rc.0",
+ "@umbraco-ui/uui-select": "1.8.0-rc.0",
+ "@umbraco-ui/uui-slider": "1.8.0-rc.0",
+ "@umbraco-ui/uui-symbol-expand": "1.8.0-rc.0",
+ "@umbraco-ui/uui-symbol-file": "1.8.0-rc.0",
+ "@umbraco-ui/uui-symbol-file-dropzone": "1.8.0-rc.0",
+ "@umbraco-ui/uui-symbol-file-thumbnail": "1.8.0-rc.0",
+ "@umbraco-ui/uui-symbol-folder": "1.8.0-rc.0",
+ "@umbraco-ui/uui-symbol-lock": "1.8.0-rc.0",
+ "@umbraco-ui/uui-symbol-more": "1.8.0-rc.0",
+ "@umbraco-ui/uui-symbol-sort": "1.8.0-rc.0",
+ "@umbraco-ui/uui-table": "1.8.0-rc.0",
+ "@umbraco-ui/uui-tabs": "1.8.0-rc.2",
+ "@umbraco-ui/uui-tag": "1.8.0-rc.0",
+ "@umbraco-ui/uui-textarea": "1.8.0-rc.0",
+ "@umbraco-ui/uui-toast-notification": "1.8.0-rc.2",
+ "@umbraco-ui/uui-toast-notification-container": "1.8.0-rc.2",
+ "@umbraco-ui/uui-toast-notification-layout": "1.8.0-rc.0",
+ "@umbraco-ui/uui-toggle": "1.8.0-rc.0",
+ "@umbraco-ui/uui-visually-hidden": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-action-bar": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-action-bar/-/uui-action-bar-1.8.0-rc.0.tgz",
+ "integrity": "sha512-zG53nm7DMLsyu79gehxtuMj/2bEMgKA7lI6qudi7de74/lFvrGhxZ7JqT5RV6pDiriCxsqBd9OlLoynoWMOJow==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-button-group": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-avatar": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-avatar/-/uui-avatar-1.8.0-rc.0.tgz",
+ "integrity": "sha512-UbwoRBRXgtrebNZ1PTvQWqmgMuTSBD4dZ4xEF6mf7s0BRImI+6AoJevx3GETClnRB9UuD1lOR1GyxA7D76PCDA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-avatar-group": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-avatar-group/-/uui-avatar-group-1.8.0-rc.0.tgz",
+ "integrity": "sha512-s+odJUrwkMnDBqqP7ms1AGJznLQOw1XdVTtaJLx926U1932JBdlkDFtlKWPNrvGHRv6nILTVQWiyaz0TP02Lcg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-avatar": "1.8.0-rc.0",
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-badge": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-badge/-/uui-badge-1.8.0-rc.0.tgz",
+ "integrity": "sha512-gG6Lr9dc/6GuHcGVTnb1uJFea95GKqxZHPyp0ljuc1TWUfrX9tKm+QXsHjMwbhpM0GWJUH5iPt0dB7xCsrkTFA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-base": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-base/-/uui-base-1.8.0-rc.0.tgz",
+ "integrity": "sha512-C7JhJD0Z5/wGZ/f3E68gdtqIspGK5LaEXN0A9pJtS2ZkdMbUFYo85y8aY9NWGGXDkEXHttMvUHv/ePiFsr/7Gw==",
+ "dev": true,
+ "peer": true,
+ "peerDependencies": {
+ "lit": ">=2.8.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-boolean-input": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-boolean-input/-/uui-boolean-input-1.8.0-rc.0.tgz",
+ "integrity": "sha512-EFK9GPRa59E94Hp3K32uJGKAlYu2P9nENK9WQ8swCthBtw9a8GL9HxaQxGebgbf1kwkjyoihCYAF229czDe2Xw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-box": {
+ "version": "1.8.0-rc.1",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-box/-/uui-box-1.8.0-rc.1.tgz",
+ "integrity": "sha512-5FcG55k0dDYili4JfdOjsNkhAyseyHbqcEKOGmtV110ugvTZpjB/N/Zo49aHNkEIw4FduTLGhP6/2eFjSpLmYA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-css": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-breadcrumbs": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-breadcrumbs/-/uui-breadcrumbs-1.8.0-rc.0.tgz",
+ "integrity": "sha512-eubEanIW9LyNSxj53LNb5zCO9Hj23TJEqpYnoci4lSaeaqNOUfpQnn2FYoS8rmvZwnGpBWOq40XSCd1VbNbgbQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-button": {
+ "version": "1.8.0-rc.2",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button/-/uui-button-1.8.0-rc.2.tgz",
+ "integrity": "sha512-5JAS247c0NdjsOdzdXOqjOEsfb1HxvPWvBc2KUMOi2hjh/TQbp765BXB0lvc5RqePwuJbwogeAhbesLuRvCCwQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-icon-registry-essential": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-button-group": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button-group/-/uui-button-group-1.8.0-rc.0.tgz",
+ "integrity": "sha512-m4+OE/5CLuPikIoPIne2Rvi9cSUcTvz9qne1ZuTHtu/owuYLKA1lp1wCPVGJTkA3zITeLXkMbpuRaCpaKjB6Zw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-button-inline-create": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button-inline-create/-/uui-button-inline-create-1.8.0-rc.0.tgz",
+ "integrity": "sha512-Xz7LGdotdyApJxeEmEU8OiHImS3/4yLEIhD0yjAO1F2i33/9pu6KUmloCq0cYO+3RhbQcdcsmrd+zjQutwBHHg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-card": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card/-/uui-card-1.8.0-rc.0.tgz",
+ "integrity": "sha512-EIS73DSOpbYmpkI1IibbO/cuhZPQulweXy2wfXq1gmeux8rr+frXZtZ+6dsvgpdBIx9K/+WoGPEzpyFg08EYOw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-card-block-type": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-block-type/-/uui-card-block-type-1.8.0-rc.0.tgz",
+ "integrity": "sha512-KGODyaGfbJiK8YQczU6yvpW/PFKzu1iKCnURogMsb0qOZHyKUJyddRm1fgFpX+i7RpyR4Cjbmw/Vmnt/oeNenQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-card": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-card-content-node": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-content-node/-/uui-card-content-node-1.8.0-rc.0.tgz",
+ "integrity": "sha512-uHo3WY/cAsi87sa0QIR2sUFzUggtM31xKmoLCMm3bUMiDW0Y2lDfwb6mZU6yhykjczhcHuPSxwK1SgsI8bJsPg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-card": "1.8.0-rc.0",
+ "@umbraco-ui/uui-icon": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-card-media": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-media/-/uui-card-media-1.8.0-rc.0.tgz",
+ "integrity": "sha512-ISc540E2PZCBkJQLfRL9d2tMjP6GdLsP9+VihVgAKLSkG9+T/dMkbtTWlGX5ehmfaDzDmxXS9XUh8MCkplrRPw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-card": "1.8.0-rc.0",
+ "@umbraco-ui/uui-symbol-file": "1.8.0-rc.0",
+ "@umbraco-ui/uui-symbol-folder": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-card-user": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-user/-/uui-card-user-1.8.0-rc.0.tgz",
+ "integrity": "sha512-VIOGZnhvDO38e4RmQAxWVZFmiuT1FVIdA/DPNmrOiTJte2sWhwYb6mZWihiP1M09ChkhqviwZSkmt+xo2A80ng==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-avatar": "1.8.0-rc.0",
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-card": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-caret": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-caret/-/uui-caret-1.8.0-rc.0.tgz",
+ "integrity": "sha512-9Ko0NUorE4k3Iv49gJjVnSxiHJKUE3ImrgkPxI3GhNw5eUagpOecyl3MKlI/twpkHfY1CCeq7ngUV9+3E2uIiw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-checkbox": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-checkbox/-/uui-checkbox-1.8.0-rc.0.tgz",
+ "integrity": "sha512-zOc35YNojxC1iqezOPnf3vL/WBMhdVPkXUUvVGrWCNMBsTy42JZUt8EDOgiRJu0j1yIrPuQy4NbQJ5NPQCRuLQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-boolean-input": "1.8.0-rc.0",
+ "@umbraco-ui/uui-icon-registry-essential": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-color-area": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-area/-/uui-color-area-1.8.0-rc.0.tgz",
+ "integrity": "sha512-xj9uAsh1SPdxmsGeS+k/hM5sFwXA9XuBwgZwvXSGluiOEranTxmGW2Gq9p+dng1CQEyvvRbQ+R12R40wghpPUA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "colord": "^2.9.3"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-color-picker": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-picker/-/uui-color-picker-1.8.0-rc.0.tgz",
+ "integrity": "sha512-l5d8Ar9+z4K3GWrD3w2qn5ChnAhFmBcbJglgaKbJ78BFFccB+HYjYB2znMYPyi57+UVxcQPvr6jAz5i8BSisZg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-popover-container": "1.8.0-rc.0",
+ "colord": "^2.9.3"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-color-slider": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-slider/-/uui-color-slider-1.8.0-rc.0.tgz",
+ "integrity": "sha512-eh8XtPthXxl0z0FbyXA4epjiB18ZDnCMJJQ8w5br6d4tQicBPgJhWZQKBrZ1bNRpPaiHTxaA7kJ+mBz1l/DiUA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-color-swatch": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-swatch/-/uui-color-swatch-1.8.0-rc.0.tgz",
+ "integrity": "sha512-BdP1GYu8imhrO1KRpputsItIEGzSH44mWG3dRZakrOCyJt6V/nLGpHRymEuh2B0qcd7nDmyfN3mhtRRQ3N328w==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-icon-registry-essential": "1.8.0-rc.0",
+ "colord": "^2.9.3"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-color-swatches": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-swatches/-/uui-color-swatches-1.8.0-rc.0.tgz",
+ "integrity": "sha512-HrRS9QZKEinHoiFUfmYNs430OrkkB55r3gDgsVn+LWuiKiYDR3pXO6wYrtvq4+RiviGPMLPEzuInd3GvDI+vlA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-color-swatch": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-combobox": {
+ "version": "1.8.0-rc.2",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-combobox/-/uui-combobox-1.8.0-rc.2.tgz",
+ "integrity": "sha512-71AbVcHweB36g3jUCur/PKIKbpSHMvJq2iQou84NgVtO+hBM0PxH2JOsLRCMFG76D8fjIUd03tNp6szBHH1RMQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-button": "1.8.0-rc.2",
+ "@umbraco-ui/uui-combobox-list": "1.8.0-rc.0",
+ "@umbraco-ui/uui-icon": "1.8.0-rc.0",
+ "@umbraco-ui/uui-popover-container": "1.8.0-rc.0",
+ "@umbraco-ui/uui-scroll-container": "1.8.0-rc.0",
+ "@umbraco-ui/uui-symbol-expand": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-combobox-list": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-combobox-list/-/uui-combobox-list-1.8.0-rc.0.tgz",
+ "integrity": "sha512-UTxJvlhS4zf4XXh4j9FeTEzdLs0U9cuiBFDlNQ5F0gF2LvA9LK/bCszA1iQhKx6umyWv0U+04hXgLTY/MT1Ymg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-css": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-css/-/uui-css-1.8.0-rc.0.tgz",
+ "integrity": "sha512-trwLCgJtT91iP2b20QlHWjuj44AF4lWCg4CqBZoT2Z8a5IedqflnQstXCZRYm/F5Re32YGTwlR9lF1rAXqq4gg==",
+ "dev": true,
+ "peer": true,
+ "peerDependencies": {
+ "lit": ">=2.8.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-dialog": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-dialog/-/uui-dialog-1.8.0-rc.0.tgz",
+ "integrity": "sha512-B6HW+2wj17wyt4LGI1Zfs9OmMwK5qzDYmrAtx3uo3L+aieQ3QNpmYLJHP7c7xeU4kO0u+GJgBFt/qFRb/iPM1g==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-css": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-dialog-layout": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-dialog-layout/-/uui-dialog-layout-1.8.0-rc.0.tgz",
+ "integrity": "sha512-uMuLWLQczUWPo5QokKiYJ5CuhVly3T8kYdFaKB+OkVRPIG2GHF1VKvM/JJX6Tx3po1EsehR3wb6JaxY+/BsX0Q==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-file-dropzone": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-file-dropzone/-/uui-file-dropzone-1.8.0-rc.0.tgz",
+ "integrity": "sha512-8JN8nzoIysub+pxvj3gNhvHRrZmui9SflvF6mMTKpk1uwZxE7LI4HZDhjmczKKDX9MChbzn1bSd8JYaxoA4zzQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-symbol-file-dropzone": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-file-preview": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-file-preview/-/uui-file-preview-1.8.0-rc.0.tgz",
+ "integrity": "sha512-1xQ6R6ZoabFpAkkLWMyndR17j2xbgt0tBk59xFipnBeYsPyWkZd94MV7kl6T98YlxgmPY83+uhMI6qFuTPogiw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-symbol-file": "1.8.0-rc.0",
+ "@umbraco-ui/uui-symbol-file-thumbnail": "1.8.0-rc.0",
+ "@umbraco-ui/uui-symbol-folder": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-form": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form/-/uui-form-1.8.0-rc.0.tgz",
+ "integrity": "sha512-5NtMr9qfcRNhL+q9UmXjR57/qGxin4x86OFVANb1Y12rx+V2l1MlyTHhGhGyukZX0re3f7DaY8kwg1CvUy9U3w==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-form-layout-item": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form-layout-item/-/uui-form-layout-item-1.8.0-rc.0.tgz",
+ "integrity": "sha512-5q8b0DVhbTUUYUaPWQDdjU7+kzWmns1EESA3dOL/2I4DzejfBgU7eGufdVRjlrvQyhPuHHp0wVs4aAL3jF0CCg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-form-validation-message": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-form-validation-message": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form-validation-message/-/uui-form-validation-message-1.8.0-rc.0.tgz",
+ "integrity": "sha512-ePlg9BD4PkPvcjD+rCXrkJjAmoctXoVsDnBmhbn0cWbUiSpSX21OVTDiS9XW9Iyb+HOh5Pm0coGGTpF18+yM1A==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-icon": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon/-/uui-icon-1.8.0-rc.0.tgz",
+ "integrity": "sha512-qEXgNGhN+hdRRune048zN76EkEpsHrQR3kLW7uYtF0/NSslKQxGLVWhNMK7X2Rw8t9btRmfp9Ib2mwZFNNayQw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-icon-registry": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon-registry/-/uui-icon-registry-1.8.0-rc.0.tgz",
+ "integrity": "sha512-amoA60rpXAciPeepYM4G+pwHDG9llqPuQmTOMv7GchFbjghENDOT3dW9kOQZbSEncUEgHWpsf/Nu8zN2aJmiVw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-icon": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-icon-registry-essential": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon-registry-essential/-/uui-icon-registry-essential-1.8.0-rc.0.tgz",
+ "integrity": "sha512-0X42o/uet3bjL3v/5i2Q5hxgbkWYK9eTUrmDwBq01PIyw7XKW7Z/5C5Ryi292a3cwEGr0cAwawCLAkiTeIQiwg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-icon-registry": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-input": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input/-/uui-input-1.8.0-rc.0.tgz",
+ "integrity": "sha512-SuiTzZP0N1qTpivGKhRzVRKumTe6v6F34KGux303tJws7Nng4AW/KEq+QFpzd1nl0NQGQRQ3JaL+StSmgQFYJA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-input-file": {
+ "version": "1.8.0-rc.2",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-file/-/uui-input-file-1.8.0-rc.2.tgz",
+ "integrity": "sha512-WO4boW7+K4cFF+wo+qunBtiWyfn2XOdd3tl+8M/+lBwmCDIxuLbhrDosZEiUKvhyG4BjZxK1+C5JFqROZSQrkg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-action-bar": "1.8.0-rc.0",
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-button": "1.8.0-rc.2",
+ "@umbraco-ui/uui-file-dropzone": "1.8.0-rc.0",
+ "@umbraco-ui/uui-icon": "1.8.0-rc.0",
+ "@umbraco-ui/uui-icon-registry-essential": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-input-lock": {
+ "version": "1.8.0-rc.2",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-lock/-/uui-input-lock-1.8.0-rc.2.tgz",
+ "integrity": "sha512-k8Dv83zUuEQvQBOFE+oD6tBNXB+UBd6pnQmoqLvohDobWVmjWo8o0vL2AszroLR9XFPGbPE+UpCNODM7OAEw9A==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-button": "1.8.0-rc.2",
+ "@umbraco-ui/uui-icon": "1.8.0-rc.0",
+ "@umbraco-ui/uui-input": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-input-password": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-password/-/uui-input-password-1.8.0-rc.0.tgz",
+ "integrity": "sha512-B867GMgEr9/40tobOaO4rGI8fX7n+OZfizJrkxPNYgq9IHXMzbuHWZNiM/vW+uZNDDHDStZYxMa1L2NEfYOypg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-icon-registry-essential": "1.8.0-rc.0",
+ "@umbraco-ui/uui-input": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-keyboard-shortcut": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-keyboard-shortcut/-/uui-keyboard-shortcut-1.8.0-rc.0.tgz",
+ "integrity": "sha512-EwGbFA3TGdc9JydR4wmWCwGgMTksH7bjdBUyCR6Ix2nsekBsxNsfc/vcbHkfzw1u12WEqSZU4CzeNb8vYIldbg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-label": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-label/-/uui-label-1.8.0-rc.0.tgz",
+ "integrity": "sha512-lUYd9vmGulWyF4qeWtX4ZwFaSUwP20KsGoXfJmNJ0EF7gSaYrFPJ0Sax2VSeo8BVFzhd1VtOHmLqL4DcQcOn1w==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-loader": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader/-/uui-loader-1.8.0-rc.0.tgz",
+ "integrity": "sha512-S3LZCFrnI/F75I6OUVjXJ3E4jTH9o4b4JzE6Xe0V8u+gUfCU4NaAdoOl0x+u01Qh7NlZc318a+HiURP4W2Zr1g==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-loader-bar": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader-bar/-/uui-loader-bar-1.8.0-rc.0.tgz",
+ "integrity": "sha512-oJdr5vXP+tny6ZaM7VTV0E50MPuHeO7dbbX+hai+A55KOsSF/ZZrQMB1WZtdcyY3pzWA6AKgvTtRFEbU6nHf7w==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-loader-circle": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader-circle/-/uui-loader-circle-1.8.0-rc.0.tgz",
+ "integrity": "sha512-6g0bxqkTnNBAkSdm6EqlMQ0Gm5PDSEBGvGJ1qfyvgr9Rfa1rHR4GpOrz04A+Fobz9dXoCN2xfqNayUDBo4dy2g==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-menu-item": {
+ "version": "1.8.0-rc.1",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-menu-item/-/uui-menu-item-1.8.0-rc.1.tgz",
+ "integrity": "sha512-yccczOwXnODykEgILX/wrg+D3i06L2iAEg8uetFp+NQgMPgLz0SIVyJioNHiGkWnNlvwG/wfNOPT5PTY4LrCQA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-loader-bar": "1.8.0-rc.0",
+ "@umbraco-ui/uui-symbol-expand": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-modal": {
+ "version": "1.8.0-rc.3",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-modal/-/uui-modal-1.8.0-rc.3.tgz",
+ "integrity": "sha512-QFkGXLweUXzR7KveCNJybaqNIMGbOmb8oP0QnhK0g73yccVBozxjMqdv1Mzl/h17VpCNtNkP+P2pNXNEe8TPoQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-pagination": {
+ "version": "1.8.0-rc.2",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-pagination/-/uui-pagination-1.8.0-rc.2.tgz",
+ "integrity": "sha512-T4vw2M5EJliqwy8YI03eA7pg+gcym9fyeO95eGQvriUV6/OB60CrzjEQ2tXREkVQq1oW3RIBEUEikUgRktMpwA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-button": "1.8.0-rc.2",
+ "@umbraco-ui/uui-button-group": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-popover": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-popover/-/uui-popover-1.8.0-rc.0.tgz",
+ "integrity": "sha512-cCeDHzwz67ugMJ4tg56dksHvsG1Zye3KlLTROHFt4qeOpnNcGuA8WDQTTxC7KyzGlxEkVWUkpHT1HxLP60FCFg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-popover-container": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-popover-container/-/uui-popover-container-1.8.0-rc.0.tgz",
+ "integrity": "sha512-ErPEkvBvg3AhJnFXn8U32SZG+Tyfq3EyZxEhCwPgv4S7MajOrjz08SLN/2khSqLnqWw5dihRYcBTxcLtw4549g==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-progress-bar": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-progress-bar/-/uui-progress-bar-1.8.0-rc.0.tgz",
+ "integrity": "sha512-OJI7g8jWB2gT++faIjoyGDLGjfjzTXGg4lfvTt5zNGI8JgEUf1CY0j4C3ANoh+cXMwvxiURRGOX/UmmwZzN/uQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-radio": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-radio/-/uui-radio-1.8.0-rc.0.tgz",
+ "integrity": "sha512-lIjFN9ykLOaxcE0aHsO4HJ42X6uqX3L7S8juk8BVHKY2WiocYdW5EXKQ3qMjEkjx1rbhTrr/Ok2Pu7L8YeohJA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-range-slider": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-range-slider/-/uui-range-slider-1.8.0-rc.0.tgz",
+ "integrity": "sha512-NuIOyT4F6pWweZj7VSRFrGnxijGayAIa3BhO5+stsw+Cz1EmESgTgV175buVRRhoqMGOAhky1EGnKkD9YYQ0hg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-ref": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref/-/uui-ref-1.8.0-rc.0.tgz",
+ "integrity": "sha512-dxf4h5lfpZYpqANRvVD1eR4LrLOqut2oI8O0gLoUG/crObaU0Yta53T4xTVl2aAL7Wjm4cYkj9iQMd/9MJdo1g==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-ref-list": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-list/-/uui-ref-list-1.8.0-rc.0.tgz",
+ "integrity": "sha512-vdS3OMNX+r1akhUtuFfW2WfWsDflR7kA9QbVy2R0twvxE2JD5xttXlBybtqGljguks0nBuvUrEgcU3s014mPKQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-ref-node": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node/-/uui-ref-node-1.8.0-rc.0.tgz",
+ "integrity": "sha512-bYoL7u8AixbcA1JRfRJ/l5SfEj0sq9jF8pJzILP5wLpphwthZU8PqUC9jqgvo6RZSOVmtDcVqDsLKpG1t/vT7g==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-icon": "1.8.0-rc.0",
+ "@umbraco-ui/uui-ref": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-ref-node-data-type": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-data-type/-/uui-ref-node-data-type-1.8.0-rc.0.tgz",
+ "integrity": "sha512-zZk1y8aJBcI+jx6JvqxQc9cuWU2cSSIRcfQeM2HGVriyUBNX5oz2dgfkV6hWJK5Ndc/o6ZrXkWL0CT9X16OKxQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-ref-node": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-ref-node-document-type": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-document-type/-/uui-ref-node-document-type-1.8.0-rc.0.tgz",
+ "integrity": "sha512-tEBYvuS7XkuRoEMqgJLnMo2BIifivHOrQlyZOyoA4EQsbkQsLPNIYkn+tWDcW/qRK5GSDQGHjRPza0o3E281zA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-ref-node": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-ref-node-form": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-form/-/uui-ref-node-form-1.8.0-rc.0.tgz",
+ "integrity": "sha512-Ua25ZReynmdPqEvF0Sx4JClvWn0i2Y1bTo7KE45zm7M30jzhBjVt1LpAayy7mNK84VJY9lEt1vSt5B3rkug7oA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-ref-node": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-ref-node-member": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-member/-/uui-ref-node-member-1.8.0-rc.0.tgz",
+ "integrity": "sha512-6gW4G+kvGenCohf0vzd1heUAX2hI6ZmlSfLttdDGggETChUcYQ91sFDe/8r0pOIPGgE6r46B1WgGmFXNMFxMEA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-ref-node": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-ref-node-package": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-package/-/uui-ref-node-package-1.8.0-rc.0.tgz",
+ "integrity": "sha512-aSY1MMoNhZI+firF/UrvXrbR3JSNiOtHtrTDMreZTr85wzC82k6gRXmlz+1xvCKooduab3/e/gM+1yPoha85Ng==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-ref-node": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-ref-node-user": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-user/-/uui-ref-node-user-1.8.0-rc.0.tgz",
+ "integrity": "sha512-0o6eyHFq2WHiEUaE1FgtVxavHLEwuAByYYesnzx4b2zwO1IHVZEjuaSp5nOJ6vyUdq1zK5TZZJa2LvWIT2uMNQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-ref-node": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-scroll-container": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-scroll-container/-/uui-scroll-container-1.8.0-rc.0.tgz",
+ "integrity": "sha512-zrq/m7x/4gU8eIZYaIe6ED755sQJTsZGCi3IVUjfjFTnqQs5C4vtXczYcefALgYOXHIzatLxyOfF4nilOvpu1Q==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-select": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-select/-/uui-select-1.8.0-rc.0.tgz",
+ "integrity": "sha512-Lh4RTjBll7eU/ptCllBWd6XiCEgLNw+rqXwCL4bzEdHLaiZDVaMs9SUWJW8L1eAQcna7aPNewntIrmIv+Z5r0w==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-slider": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-slider/-/uui-slider-1.8.0-rc.0.tgz",
+ "integrity": "sha512-y1tiqp4pGTUReatXkXJcC5TQLQFEiaG9sSxTAbMlKoAgkNuZjM1xhOcJ3mDHqiqaWWznjCFRDlXN62Os8dpdcw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-symbol-expand": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-expand/-/uui-symbol-expand-1.8.0-rc.0.tgz",
+ "integrity": "sha512-rGvYaWeSArxubTf6m1S0Xgt4nLDPT0NOJzWgfI2+LqwpSoanH35Mb9+qXror2BLvog1jXfxwTZz1krqwSM3FwQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-symbol-file": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file/-/uui-symbol-file-1.8.0-rc.0.tgz",
+ "integrity": "sha512-urGF7kWtxXxMqbFJkACDs7dPk3o9KfYgLrRSCqUYE8qrz98n0R31BZ9KzrtCma+a2uI17zvFyIuRYd3xvwCilg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-symbol-file-dropzone": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file-dropzone/-/uui-symbol-file-dropzone-1.8.0-rc.0.tgz",
+ "integrity": "sha512-zWwx1jTQ3Ka4HoZ24EaHyJH3I0ez/qALf8qo5r5lLy4vn3UplunGKcNVFfOUsx6H19GlR4rDuPILIqdXJ4C/BQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-symbol-file-thumbnail": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file-thumbnail/-/uui-symbol-file-thumbnail-1.8.0-rc.0.tgz",
+ "integrity": "sha512-KV0gVKXFkYtJaOgwcma1jNBHMXT/xwDSuio4uamwV9GkdvjS1kFQyAMtXqBArWFisuifcfMcnPyZYxxeKx/CfQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-symbol-folder": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-folder/-/uui-symbol-folder-1.8.0-rc.0.tgz",
+ "integrity": "sha512-orMaoQIfbhF+gXS5FjW9mujP71GiuePQr/rCNLGWeSJntqudxRp8bjNrcop2kAUoqzK8fAAvaBM7uZTDxVxU5g==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-symbol-lock": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-lock/-/uui-symbol-lock-1.8.0-rc.0.tgz",
+ "integrity": "sha512-IJsTvHRPmG0OHnCgRQD69O7eUTDF8s/sY41uMiO9Mhhwf+CpE5R/LUJkMHvMZMCRkwMrSPCsq9cjCMNpalGepQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-symbol-more": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-more/-/uui-symbol-more-1.8.0-rc.0.tgz",
+ "integrity": "sha512-ELJpdd5XpzYYMh+ZxlESQhZkvH711UoCgOgP4e5ftU8suWUs1Jb34F/7GzppKkMbSKZlfGw7nCx3pz5n3C5ANg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-symbol-sort": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-sort/-/uui-symbol-sort-1.8.0-rc.0.tgz",
+ "integrity": "sha512-wH6Qyck706HK36mM0d+B1EWs17bM2Qv/V+DybKu/8DD+QNptOnuSzGkcCbRAV6lo36A3t7/NEru2xxvavBjUcw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-table": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-table/-/uui-table-1.8.0-rc.0.tgz",
+ "integrity": "sha512-TbDlh3qdZDsksjFw18e3emfHeGw8tAApPcPXK78WIN7LNDlKiHDHClan0J/Ul+QLZD4rUDteHJ5C1okYb/jboA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-tabs": {
+ "version": "1.8.0-rc.2",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tabs/-/uui-tabs-1.8.0-rc.2.tgz",
+ "integrity": "sha512-MLtDabiXsOEqOxfgEuqU3ji1XTgY9ABbhqOHC23cFaaGBwlqAbUyi9hAMJhfso406vkQa/9t9A7yK8qpMqKdrA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-button": "1.8.0-rc.2",
+ "@umbraco-ui/uui-popover-container": "1.8.0-rc.0",
+ "@umbraco-ui/uui-symbol-more": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-tag": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tag/-/uui-tag-1.8.0-rc.0.tgz",
+ "integrity": "sha512-3opqus5jf4Ou8JNnFOZTl64rRD6n6qffKrPn+mEHTMkUhGQ5/wTKvdfWg4G0lD60aEMzKd7L6rojZydPDLEwFA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-textarea": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-textarea/-/uui-textarea-1.8.0-rc.0.tgz",
+ "integrity": "sha512-EYOzu5E6BEqacLNoMxYPhFwbjK5xRExI47drDV+LzfyUe3hgFLUCZkIA/Z35vSFN8+HyguT7aaCfpzHhoSbFwA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-toast-notification": {
+ "version": "1.8.0-rc.2",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification/-/uui-toast-notification-1.8.0-rc.2.tgz",
+ "integrity": "sha512-ICvxWZVuDO1X/f1udYgtY1prHYbj26g3ZecKq2V2FVs9Ej5kYNIWU1nVGj6tWkdyKGnVPjoLfYmq/W8i9BJb9g==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-button": "1.8.0-rc.2",
+ "@umbraco-ui/uui-css": "1.8.0-rc.0",
+ "@umbraco-ui/uui-icon": "1.8.0-rc.0",
+ "@umbraco-ui/uui-icon-registry-essential": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-toast-notification-container": {
+ "version": "1.8.0-rc.2",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification-container/-/uui-toast-notification-container-1.8.0-rc.2.tgz",
+ "integrity": "sha512-iQ1xDQBgKrvTtCAUsT/3DJayCNVPWb+T9B5V+MyfuHnV9qOnmPtchs7l9r8cFwabOO5ZpxMke/tltsgMawwajQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-toast-notification": "1.8.0-rc.2"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-toast-notification-layout": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification-layout/-/uui-toast-notification-layout-1.8.0-rc.0.tgz",
+ "integrity": "sha512-ouQ1DlBlf0nkZZEsVIe+8Nz6mca1fjyyi0iypzDvwJq+K6tWm64FuxeqPpwp7M4jkNkcgDPOJqaONtPHQJdLKA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-css": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-toggle": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toggle/-/uui-toggle-1.8.0-rc.0.tgz",
+ "integrity": "sha512-OytTeUPk9X3H4w3vWo1JLG2WK2npoXOUBBKft4WwtN+hUoX9/KquxBrz0qkxdO/jQ4LpSRJopS9SqjNg5mqVug==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0",
+ "@umbraco-ui/uui-boolean-input": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/@umbraco-ui/uui-visually-hidden": {
+ "version": "1.8.0-rc.0",
+ "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-visually-hidden/-/uui-visually-hidden-1.8.0-rc.0.tgz",
+ "integrity": "sha512-ZawyaL4DJsv0e7pyxiJWB5ogCxkn0mrzMimbajp6ZDDQMvAJDiA/I14hcaBVOudzZyTAzNK5xJlbB3ft2TwFdg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@umbraco-ui/uui-base": "1.8.0-rc.0"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.11.3",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
+ "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "peer": true
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/c12": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/c12/-/c12-1.10.0.tgz",
+ "integrity": "sha512-0SsG7UDhoRWcuSvKWHaXmu5uNjDCDN3nkQLRL4Q42IlFy+ze58FcCoI3uPwINXinkz7ZinbhEgyzYFw9u9ZV8g==",
+ "dev": true,
+ "dependencies": {
+ "chokidar": "^3.6.0",
+ "confbox": "^0.1.3",
+ "defu": "^6.1.4",
+ "dotenv": "^16.4.5",
+ "giget": "^1.2.1",
+ "jiti": "^1.21.0",
+ "mlly": "^1.6.1",
+ "ohash": "^1.1.3",
+ "pathe": "^1.1.2",
+ "perfect-debounce": "^1.0.0",
+ "pkg-types": "^1.0.3",
+ "rc9": "^2.1.1"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz",
+ "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==",
+ "dev": true,
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "dev": true,
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chownr": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+ "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/citty": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz",
+ "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==",
+ "dev": true,
+ "dependencies": {
+ "consola": "^3.2.3"
+ }
+ },
+ "node_modules/colord": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
+ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/commander": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-12.0.0.tgz",
+ "integrity": "sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/confbox": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz",
+ "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==",
+ "dev": true
+ },
+ "node_modules/consola": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz",
+ "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==",
+ "dev": true,
+ "engines": {
+ "node": "^14.18.0 || >=16.10.0"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/defu": {
+ "version": "6.1.4",
+ "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz",
+ "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==",
+ "dev": true
+ },
+ "node_modules/destr": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.3.tgz",
+ "integrity": "sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==",
+ "dev": true
+ },
+ "node_modules/diff": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz",
+ "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/dompurify": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.3.tgz",
+ "integrity": "sha512-5sOWYSNPaxz6o2MUPvtyxTTqR4D3L77pr5rUQoWgD5ROQtVIZQgJkXbo1DLlK3vj11YGw5+LnF4SYti4gZmwng==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/dotenv": {
+ "version": "16.4.5",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz",
+ "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
+ }
+ },
+ "node_modules/element-internals-polyfill": {
+ "version": "1.3.11",
+ "resolved": "https://registry.npmjs.org/element-internals-polyfill/-/element-internals-polyfill-1.3.11.tgz",
+ "integrity": "sha512-SQLQNVY4wMdpnP/F/HtalJbpEenQd46Avtjm5hvUdeTs3QU0zHFNX5/AmtQIPPcfzePb0ipCkQGY4GwYJIhLJA==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/esbuild": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz",
+ "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.20.2",
+ "@esbuild/android-arm": "0.20.2",
+ "@esbuild/android-arm64": "0.20.2",
+ "@esbuild/android-x64": "0.20.2",
+ "@esbuild/darwin-arm64": "0.20.2",
+ "@esbuild/darwin-x64": "0.20.2",
+ "@esbuild/freebsd-arm64": "0.20.2",
+ "@esbuild/freebsd-x64": "0.20.2",
+ "@esbuild/linux-arm": "0.20.2",
+ "@esbuild/linux-arm64": "0.20.2",
+ "@esbuild/linux-ia32": "0.20.2",
+ "@esbuild/linux-loong64": "0.20.2",
+ "@esbuild/linux-mips64el": "0.20.2",
+ "@esbuild/linux-ppc64": "0.20.2",
+ "@esbuild/linux-riscv64": "0.20.2",
+ "@esbuild/linux-s390x": "0.20.2",
+ "@esbuild/linux-x64": "0.20.2",
+ "@esbuild/netbsd-x64": "0.20.2",
+ "@esbuild/openbsd-x64": "0.20.2",
+ "@esbuild/sunos-x64": "0.20.2",
+ "@esbuild/win32-arm64": "0.20.2",
+ "@esbuild/win32-ia32": "0.20.2",
+ "@esbuild/win32-x64": "0.20.2"
+ }
+ },
+ "node_modules/execa": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
+ "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^8.0.1",
+ "human-signals": "^5.0.0",
+ "is-stream": "^3.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^5.1.0",
+ "onetime": "^6.0.0",
+ "signal-exit": "^4.1.0",
+ "strip-final-newline": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=16.17"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fs-minipass": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+ "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+ "dev": true,
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/fs-minipass/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
+ "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
+ "dev": true,
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/giget": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/giget/-/giget-1.2.3.tgz",
+ "integrity": "sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==",
+ "dev": true,
+ "dependencies": {
+ "citty": "^0.1.6",
+ "consola": "^3.2.3",
+ "defu": "^6.1.4",
+ "node-fetch-native": "^1.6.3",
+ "nypm": "^0.3.8",
+ "ohash": "^1.1.3",
+ "pathe": "^1.1.2",
+ "tar": "^6.2.0"
+ },
+ "bin": {
+ "giget": "dist/cli.mjs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/handlebars": {
+ "version": "4.7.8",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz",
+ "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.5",
+ "neo-async": "^2.6.2",
+ "source-map": "^0.6.1",
+ "wordwrap": "^1.0.0"
+ },
+ "bin": {
+ "handlebars": "bin/handlebars"
+ },
+ "engines": {
+ "node": ">=0.4.7"
+ },
+ "optionalDependencies": {
+ "uglify-js": "^3.1.4"
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
+ "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=16.17.0"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
+ "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "node_modules/jiti": {
+ "version": "1.21.0",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz",
+ "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==",
+ "dev": true,
+ "bin": {
+ "jiti": "bin/jiti.js"
+ }
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/lit": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/lit/-/lit-3.1.3.tgz",
+ "integrity": "sha512-l4slfspEsnCcHVRTvaP7YnkTZEZggNFywLEIhQaGhYDczG+tu/vlgm/KaWIEjIp+ZyV20r2JnZctMb8LeLCG7Q==",
+ "dependencies": {
+ "@lit/reactive-element": "^2.0.4",
+ "lit-element": "^4.0.4",
+ "lit-html": "^3.1.2"
+ }
+ },
+ "node_modules/lit-element": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.0.5.tgz",
+ "integrity": "sha512-iTWskWZEtn9SyEf4aBG6rKT8GABZMrTWop1+jopsEOgEcugcXJGKuX5bEbkq9qfzY+XB4MAgCaSPwnNpdsNQ3Q==",
+ "dependencies": {
+ "@lit-labs/ssr-dom-shim": "^1.2.0",
+ "@lit/reactive-element": "^2.0.4",
+ "lit-html": "^3.1.2"
+ }
+ },
+ "node_modules/lit-html": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.1.3.tgz",
+ "integrity": "sha512-FwIbqDD8O/8lM4vUZ4KvQZjPPNx7V1VhT7vmRB8RBAO0AU6wuTVdoXiu2CivVjEGdugvcbPNBLtPE1y0ifplHA==",
+ "dependencies": {
+ "@types/trusted-types": "^2.0.2"
+ }
+ },
+ "node_modules/marked": {
+ "version": "12.0.2",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-12.0.2.tgz",
+ "integrity": "sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==",
+ "dev": true,
+ "peer": true,
+ "bin": {
+ "marked": "bin/marked.js"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "node_modules/mimic-fn": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
+ "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+ "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/minizlib": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+ "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+ "dev": true,
+ "dependencies": {
+ "minipass": "^3.0.0",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/minizlib/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "dev": true,
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/mlly": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.0.tgz",
+ "integrity": "sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.11.3",
+ "pathe": "^1.1.2",
+ "pkg-types": "^1.1.0",
+ "ufo": "^1.5.3"
+ }
+ },
+ "node_modules/monaco-editor": {
+ "version": "0.46.0",
+ "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.46.0.tgz",
+ "integrity": "sha512-ADwtLIIww+9FKybWscd7OCfm9odsFYHImBRI1v9AviGce55QY8raT+9ihH8jX/E/e6QVSGM+pKj4jSUSRmALNQ==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.7",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
+ "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "dev": true
+ },
+ "node_modules/node-fetch-native": {
+ "version": "1.6.4",
+ "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.4.tgz",
+ "integrity": "sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==",
+ "dev": true
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
+ "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm-run-path/node_modules/path-key": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/nypm": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.3.8.tgz",
+ "integrity": "sha512-IGWlC6So2xv6V4cIDmoV0SwwWx7zLG086gyqkyumteH2fIgCAM4nDVFB2iDRszDvmdSVW9xb1N+2KjQ6C7d4og==",
+ "dev": true,
+ "dependencies": {
+ "citty": "^0.1.6",
+ "consola": "^3.2.3",
+ "execa": "^8.0.1",
+ "pathe": "^1.1.2",
+ "ufo": "^1.4.0"
+ },
+ "bin": {
+ "nypm": "dist/cli.mjs"
+ },
+ "engines": {
+ "node": "^14.16.0 || >=16.10.0"
+ }
+ },
+ "node_modules/ohash": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.3.tgz",
+ "integrity": "sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==",
+ "dev": true
+ },
+ "node_modules/onetime": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
+ "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
+ "dev": true,
+ "dependencies": {
+ "mimic-fn": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pathe": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
+ "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
+ "dev": true
+ },
+ "node_modules/perfect-debounce": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
+ "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==",
+ "dev": true
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
+ "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==",
+ "dev": true
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pkg-types": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.1.tgz",
+ "integrity": "sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==",
+ "dev": true,
+ "dependencies": {
+ "confbox": "^0.1.7",
+ "mlly": "^1.7.0",
+ "pathe": "^1.1.2"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.38",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
+ "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.7",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/rc9": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz",
+ "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==",
+ "dev": true,
+ "dependencies": {
+ "defu": "^6.1.4",
+ "destr": "^2.0.3"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz",
+ "integrity": "sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "1.0.5"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.17.2",
+ "@rollup/rollup-android-arm64": "4.17.2",
+ "@rollup/rollup-darwin-arm64": "4.17.2",
+ "@rollup/rollup-darwin-x64": "4.17.2",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.17.2",
+ "@rollup/rollup-linux-arm-musleabihf": "4.17.2",
+ "@rollup/rollup-linux-arm64-gnu": "4.17.2",
+ "@rollup/rollup-linux-arm64-musl": "4.17.2",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.17.2",
+ "@rollup/rollup-linux-riscv64-gnu": "4.17.2",
+ "@rollup/rollup-linux-s390x-gnu": "4.17.2",
+ "@rollup/rollup-linux-x64-gnu": "4.17.2",
+ "@rollup/rollup-linux-x64-musl": "4.17.2",
+ "@rollup/rollup-win32-arm64-msvc": "4.17.2",
+ "@rollup/rollup-win32-ia32-msvc": "4.17.2",
+ "@rollup/rollup-win32-x64-msvc": "4.17.2",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/rxjs": {
+ "version": "7.8.1",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
+ "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
+ "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
+ "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/tar": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
+ "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
+ "dev": true,
+ "dependencies": {
+ "chownr": "^2.0.0",
+ "fs-minipass": "^2.0.0",
+ "minipass": "^5.0.0",
+ "minizlib": "^2.1.1",
+ "mkdirp": "^1.0.3",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/tinymce": {
+ "version": "6.8.3",
+ "resolved": "https://registry.npmjs.org/tinymce/-/tinymce-6.8.3.tgz",
+ "integrity": "sha512-3fCHKAeqT+xNwBVESf6iDbDV0VNwZNmfrkx9c/6Gz5iB8piMfaO6s7FvoiTrj1hf1gVbfyLTnz1DooI6DhgINQ==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/tinymce-i18n": {
+ "version": "24.5.8",
+ "resolved": "https://registry.npmjs.org/tinymce-i18n/-/tinymce-i18n-24.5.8.tgz",
+ "integrity": "sha512-wNWJl6c7GRdUizQVux34jRSc0rEvcClj0sNO9MsY9pNXem+N7cSLaarFTPIryNpeXcLKJIxYi/IMCI6E+rFbGA==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
+ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/typescript": {
+ "version": "5.4.5",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz",
+ "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==",
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/ufo": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz",
+ "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==",
+ "dev": true
+ },
+ "node_modules/uglify-js": {
+ "version": "3.17.4",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz",
+ "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==",
+ "dev": true,
+ "optional": true,
+ "bin": {
+ "uglifyjs": "bin/uglifyjs"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "dev": true,
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "peer": true,
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/vite": {
+ "version": "5.2.11",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz",
+ "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==",
+ "dev": true,
+ "dependencies": {
+ "esbuild": "^0.20.1",
+ "postcss": "^8.4.38",
+ "rollup": "^4.13.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || >=20.0.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==",
+ "dev": true
+ },
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ }
+ }
+}
diff --git a/Our.Umbraco.TheDashboard/Client/package.json b/Our.Umbraco.TheDashboard/Client/package.json
new file mode 100644
index 0000000..390f3c8
--- /dev/null
+++ b/Our.Umbraco.TheDashboard/Client/package.json
@@ -0,0 +1,22 @@
+{
+ "name": "the-dashboard-umbraco",
+ "private": true,
+ "version": "14.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc && vite build --emptyOutDir",
+ "watch": "tsc && vite build --watch",
+ "generate:api": "openapi-ts",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "lit": "^3.1.2"
+ },
+ "devDependencies": {
+ "@umbraco-cms/backoffice": "^14.0.0-rc3",
+ "@hey-api/openapi-ts": "^0.45.1",
+ "typescript": "^5.2.2",
+ "vite": "^5.2.0"
+ }
+}
diff --git a/Our.Umbraco.TheDashboard/Client/src/backend-api/core/ApiError.ts b/Our.Umbraco.TheDashboard/Client/src/backend-api/core/ApiError.ts
new file mode 100644
index 0000000..36675d2
--- /dev/null
+++ b/Our.Umbraco.TheDashboard/Client/src/backend-api/core/ApiError.ts
@@ -0,0 +1,21 @@
+import type { ApiRequestOptions } from './ApiRequestOptions';
+import type { ApiResult } from './ApiResult';
+
+export class ApiError extends Error {
+ public readonly url: string;
+ public readonly status: number;
+ public readonly statusText: string;
+ public readonly body: unknown;
+ public readonly request: ApiRequestOptions;
+
+ constructor(request: ApiRequestOptions, response: ApiResult, message: string) {
+ super(message);
+
+ this.name = 'ApiError';
+ this.url = response.url;
+ this.status = response.status;
+ this.statusText = response.statusText;
+ this.body = response.body;
+ this.request = request;
+ }
+}
\ No newline at end of file
diff --git a/Our.Umbraco.TheDashboard/Client/src/backend-api/core/ApiRequestOptions.ts b/Our.Umbraco.TheDashboard/Client/src/backend-api/core/ApiRequestOptions.ts
new file mode 100644
index 0000000..8f8d4d1
--- /dev/null
+++ b/Our.Umbraco.TheDashboard/Client/src/backend-api/core/ApiRequestOptions.ts
@@ -0,0 +1,13 @@
+export type ApiRequestOptions = {
+ readonly method: 'GET' | 'PUT' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD' | 'PATCH';
+ readonly url: string;
+ readonly path?: Record;
+ readonly cookies?: Record;
+ readonly headers?: Record;
+ readonly query?: Record;
+ readonly formData?: Record;
+ readonly body?: any;
+ readonly mediaType?: string;
+ readonly responseHeader?: string;
+ readonly errors?: Record;
+};
\ No newline at end of file
diff --git a/Our.Umbraco.TheDashboard/Client/src/backend-api/core/ApiResult.ts b/Our.Umbraco.TheDashboard/Client/src/backend-api/core/ApiResult.ts
new file mode 100644
index 0000000..4c58e39
--- /dev/null
+++ b/Our.Umbraco.TheDashboard/Client/src/backend-api/core/ApiResult.ts
@@ -0,0 +1,7 @@
+export type ApiResult = {
+ readonly body: TData;
+ readonly ok: boolean;
+ readonly status: number;
+ readonly statusText: string;
+ readonly url: string;
+};
\ No newline at end of file
diff --git a/Our.Umbraco.TheDashboard/Client/src/backend-api/core/CancelablePromise.ts b/Our.Umbraco.TheDashboard/Client/src/backend-api/core/CancelablePromise.ts
new file mode 100644
index 0000000..ccc082e
--- /dev/null
+++ b/Our.Umbraco.TheDashboard/Client/src/backend-api/core/CancelablePromise.ts
@@ -0,0 +1,126 @@
+export class CancelError extends Error {
+ constructor(message: string) {
+ super(message);
+ this.name = 'CancelError';
+ }
+
+ public get isCancelled(): boolean {
+ return true;
+ }
+}
+
+export interface OnCancel {
+ readonly isResolved: boolean;
+ readonly isRejected: boolean;
+ readonly isCancelled: boolean;
+
+ (cancelHandler: () => void): void;
+}
+
+export class CancelablePromise implements Promise {
+ private _isResolved: boolean;
+ private _isRejected: boolean;
+ private _isCancelled: boolean;
+ readonly cancelHandlers: (() => void)[];
+ readonly promise: Promise;
+ private _resolve?: (value: T | PromiseLike) => void;
+ private _reject?: (reason?: unknown) => void;
+
+ constructor(
+ executor: (
+ resolve: (value: T | PromiseLike) => void,
+ reject: (reason?: unknown) => void,
+ onCancel: OnCancel
+ ) => void
+ ) {
+ this._isResolved = false;
+ this._isRejected = false;
+ this._isCancelled = false;
+ this.cancelHandlers = [];
+ this.promise = new Promise((resolve, reject) => {
+ this._resolve = resolve;
+ this._reject = reject;
+
+ const onResolve = (value: T | PromiseLike): void => {
+ if (this._isResolved || this._isRejected || this._isCancelled) {
+ return;
+ }
+ this._isResolved = true;
+ if (this._resolve) this._resolve(value);
+ };
+
+ const onReject = (reason?: unknown): void => {
+ if (this._isResolved || this._isRejected || this._isCancelled) {
+ return;
+ }
+ this._isRejected = true;
+ if (this._reject) this._reject(reason);
+ };
+
+ const onCancel = (cancelHandler: () => void): void => {
+ if (this._isResolved || this._isRejected || this._isCancelled) {
+ return;
+ }
+ this.cancelHandlers.push(cancelHandler);
+ };
+
+ Object.defineProperty(onCancel, 'isResolved', {
+ get: (): boolean => this._isResolved,
+ });
+
+ Object.defineProperty(onCancel, 'isRejected', {
+ get: (): boolean => this._isRejected,
+ });
+
+ Object.defineProperty(onCancel, 'isCancelled', {
+ get: (): boolean => this._isCancelled,
+ });
+
+ return executor(onResolve, onReject, onCancel as OnCancel);
+ });
+ }
+
+ get [Symbol.toStringTag]() {
+ return "Cancellable Promise";
+ }
+
+ public then(
+ onFulfilled?: ((value: T) => TResult1 | PromiseLike) | null,
+ onRejected?: ((reason: unknown) => TResult2 | PromiseLike) | null
+ ): Promise {
+ return this.promise.then(onFulfilled, onRejected);
+ }
+
+ public catch(
+ onRejected?: ((reason: unknown) => TResult | PromiseLike) | null
+ ): Promise {
+ return this.promise.catch(onRejected);
+ }
+
+ public finally(onFinally?: (() => void) | null): Promise {
+ return this.promise.finally(onFinally);
+ }
+
+ public cancel(): void {
+ if (this._isResolved || this._isRejected || this._isCancelled) {
+ return;
+ }
+ this._isCancelled = true;
+ if (this.cancelHandlers.length) {
+ try {
+ for (const cancelHandler of this.cancelHandlers) {
+ cancelHandler();
+ }
+ } catch (error) {
+ console.warn('Cancellation threw an error', error);
+ return;
+ }
+ }
+ this.cancelHandlers.length = 0;
+ if (this._reject) this._reject(new CancelError('Request aborted'));
+ }
+
+ public get isCancelled(): boolean {
+ return this._isCancelled;
+ }
+}
\ No newline at end of file
diff --git a/Our.Umbraco.TheDashboard/Client/src/backend-api/core/OpenAPI.ts b/Our.Umbraco.TheDashboard/Client/src/backend-api/core/OpenAPI.ts
new file mode 100644
index 0000000..5abda5b
--- /dev/null
+++ b/Our.Umbraco.TheDashboard/Client/src/backend-api/core/OpenAPI.ts
@@ -0,0 +1,56 @@
+import type { ApiRequestOptions } from './ApiRequestOptions';
+
+type Headers = Record;
+type Middleware = (value: T) => T | Promise;
+type Resolver = (options: ApiRequestOptions) => Promise;
+
+export class Interceptors {
+ _fns: Middleware[];
+
+ constructor() {
+ this._fns = [];
+ }
+
+ eject(fn: Middleware) {
+ const index = this._fns.indexOf(fn);
+ if (index !== -1) {
+ this._fns = [...this._fns.slice(0, index), ...this._fns.slice(index + 1)];
+ }
+ }
+
+ use(fn: Middleware) {
+ this._fns = [...this._fns, fn];
+ }
+}
+
+export type OpenAPIConfig = {
+ BASE: string;
+ CREDENTIALS: 'include' | 'omit' | 'same-origin';
+ ENCODE_PATH?: ((path: string) => string) | undefined;
+ HEADERS?: Headers | Resolver | undefined;
+ PASSWORD?: string | Resolver | undefined;
+ TOKEN?: string | Resolver | undefined;
+ USERNAME?: string | Resolver | undefined;
+ VERSION: string;
+ WITH_CREDENTIALS: boolean;
+ interceptors: {
+ request: Interceptors;
+ response: Interceptors;
+ };
+};
+
+export const OpenAPI: OpenAPIConfig = {
+ BASE: '',
+ CREDENTIALS: 'include',
+ ENCODE_PATH: undefined,
+ HEADERS: undefined,
+ PASSWORD: undefined,
+ TOKEN: undefined,
+ USERNAME: undefined,
+ VERSION: 'Latest',
+ WITH_CREDENTIALS: false,
+ interceptors: {
+ request: new Interceptors(),
+ response: new Interceptors(),
+ },
+};
\ No newline at end of file
diff --git a/Our.Umbraco.TheDashboard/Client/src/backend-api/core/request.ts b/Our.Umbraco.TheDashboard/Client/src/backend-api/core/request.ts
new file mode 100644
index 0000000..79d04d0
--- /dev/null
+++ b/Our.Umbraco.TheDashboard/Client/src/backend-api/core/request.ts
@@ -0,0 +1,341 @@
+import { ApiError } from './ApiError';
+import type { ApiRequestOptions } from './ApiRequestOptions';
+import type { ApiResult } from './ApiResult';
+import { CancelablePromise } from './CancelablePromise';
+import type { OnCancel } from './CancelablePromise';
+import type { OpenAPIConfig } from './OpenAPI';
+
+export const isString = (value: unknown): value is string => {
+ return typeof value === 'string';
+};
+
+export const isStringWithValue = (value: unknown): value is string => {
+ return isString(value) && value !== '';
+};
+
+export const isBlob = (value: any): value is Blob => {
+ return value instanceof Blob;
+};
+
+export const isFormData = (value: unknown): value is FormData => {
+ return value instanceof FormData;
+};
+
+export const base64 = (str: string): string => {
+ try {
+ return btoa(str);
+ } catch (err) {
+ // @ts-ignore
+ return Buffer.from(str).toString('base64');
+ }
+};
+
+export const getQueryString = (params: Record): string => {
+ const qs: string[] = [];
+
+ const append = (key: string, value: unknown) => {
+ qs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`);
+ };
+
+ const encodePair = (key: string, value: unknown) => {
+ if (value === undefined || value === null) {
+ return;
+ }
+
+ if (value instanceof Date) {
+ append(key, value.toISOString());
+ } else if (Array.isArray(value)) {
+ value.forEach(v => encodePair(key, v));
+ } else if (typeof value === 'object') {
+ Object.entries(value).forEach(([k, v]) => encodePair(`${key}[${k}]`, v));
+ } else {
+ append(key, value);
+ }
+ };
+
+ Object.entries(params).forEach(([key, value]) => encodePair(key, value));
+
+ return qs.length ? `?${qs.join('&')}` : '';
+};
+
+const getUrl = (config: OpenAPIConfig, options: ApiRequestOptions): string => {
+ const encoder = config.ENCODE_PATH || encodeURI;
+
+ const path = options.url
+ .replace('{api-version}', config.VERSION)
+ .replace(/{(.*?)}/g, (substring: string, group: string) => {
+ if (options.path?.hasOwnProperty(group)) {
+ return encoder(String(options.path[group]));
+ }
+ return substring;
+ });
+
+ const url = config.BASE + path;
+ return options.query ? url + getQueryString(options.query) : url;
+};
+
+export const getFormData = (options: ApiRequestOptions): FormData | undefined => {
+ if (options.formData) {
+ const formData = new FormData();
+
+ const process = (key: string, value: unknown) => {
+ if (isString(value) || isBlob(value)) {
+ formData.append(key, value);
+ } else {
+ formData.append(key, JSON.stringify(value));
+ }
+ };
+
+ Object.entries(options.formData)
+ .filter(([, value]) => value !== undefined && value !== null)
+ .forEach(([key, value]) => {
+ if (Array.isArray(value)) {
+ value.forEach(v => process(key, v));
+ } else {
+ process(key, value);
+ }
+ });
+
+ return formData;
+ }
+ return undefined;
+};
+
+type Resolver = (options: ApiRequestOptions) => Promise;
+
+export const resolve = async (options: ApiRequestOptions, resolver?: T | Resolver): Promise => {
+ if (typeof resolver === 'function') {
+ return (resolver as Resolver)(options);
+ }
+ return resolver;
+};
+
+export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions): Promise => {
+ const [token, username, password, additionalHeaders] = await Promise.all([
+ resolve(options, config.TOKEN),
+ resolve(options, config.USERNAME),
+ resolve(options, config.PASSWORD),
+ resolve(options, config.HEADERS),
+ ]);
+
+ const headers = Object.entries({
+ Accept: 'application/json',
+ ...additionalHeaders,
+ ...options.headers,
+ })
+ .filter(([, value]) => value !== undefined && value !== null)
+ .reduce((headers, [key, value]) => ({
+ ...headers,
+ [key]: String(value),
+ }), {} as Record);
+
+ if (isStringWithValue(token)) {
+ headers['Authorization'] = `Bearer ${token}`;
+ }
+
+ if (isStringWithValue(username) && isStringWithValue(password)) {
+ const credentials = base64(`${username}:${password}`);
+ headers['Authorization'] = `Basic ${credentials}`;
+ }
+
+ if (options.body !== undefined) {
+ if (options.mediaType) {
+ headers['Content-Type'] = options.mediaType;
+ } else if (isBlob(options.body)) {
+ headers['Content-Type'] = options.body.type || 'application/octet-stream';
+ } else if (isString(options.body)) {
+ headers['Content-Type'] = 'text/plain';
+ } else if (!isFormData(options.body)) {
+ headers['Content-Type'] = 'application/json';
+ }
+ }
+
+ return new Headers(headers);
+};
+
+export const getRequestBody = (options: ApiRequestOptions): unknown => {
+ if (options.body !== undefined) {
+ if (options.mediaType?.includes('application/json') || options.mediaType?.includes('+json')) {
+ return JSON.stringify(options.body);
+ } else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) {
+ return options.body;
+ } else {
+ return JSON.stringify(options.body);
+ }
+ }
+ return undefined;
+};
+
+export const sendRequest = async (
+ config: OpenAPIConfig,
+ options: ApiRequestOptions,
+ url: string,
+ body: any,
+ formData: FormData | undefined,
+ headers: Headers,
+ onCancel: OnCancel
+): Promise => {
+ const controller = new AbortController();
+
+ let request: RequestInit = {
+ headers,
+ body: body ?? formData,
+ method: options.method,
+ signal: controller.signal,
+ };
+
+ if (config.WITH_CREDENTIALS) {
+ request.credentials = config.CREDENTIALS;
+ }
+
+ for (const fn of config.interceptors.request._fns) {
+ request = await fn(request);
+ }
+
+ onCancel(() => controller.abort());
+
+ return await fetch(url, request);
+};
+
+export const getResponseHeader = (response: Response, responseHeader?: string): string | undefined => {
+ if (responseHeader) {
+ const content = response.headers.get(responseHeader);
+ if (isString(content)) {
+ return content;
+ }
+ }
+ return undefined;
+};
+
+export const getResponseBody = async (response: Response): Promise => {
+ if (response.status !== 204) {
+ try {
+ const contentType = response.headers.get('Content-Type');
+ if (contentType) {
+ const binaryTypes = ['application/octet-stream', 'application/pdf', 'application/zip', 'audio/', 'image/', 'video/'];
+ if (contentType.includes('application/json') || contentType.includes('+json')) {
+ return await response.json();
+ } else if (binaryTypes.some(type => contentType.includes(type))) {
+ return await response.blob();
+ } else if (contentType.includes('multipart/form-data')) {
+ return await response.formData();
+ } else if (contentType.includes('text/')) {
+ return await response.text();
+ }
+ }
+ } catch (error) {
+ console.error(error);
+ }
+ }
+ return undefined;
+};
+
+export const catchErrorCodes = (options: ApiRequestOptions, result: ApiResult): void => {
+ const errors: Record = {
+ 400: 'Bad Request',
+ 401: 'Unauthorized',
+ 402: 'Payment Required',
+ 403: 'Forbidden',
+ 404: 'Not Found',
+ 405: 'Method Not Allowed',
+ 406: 'Not Acceptable',
+ 407: 'Proxy Authentication Required',
+ 408: 'Request Timeout',
+ 409: 'Conflict',
+ 410: 'Gone',
+ 411: 'Length Required',
+ 412: 'Precondition Failed',
+ 413: 'Payload Too Large',
+ 414: 'URI Too Long',
+ 415: 'Unsupported Media Type',
+ 416: 'Range Not Satisfiable',
+ 417: 'Expectation Failed',
+ 418: 'Im a teapot',
+ 421: 'Misdirected Request',
+ 422: 'Unprocessable Content',
+ 423: 'Locked',
+ 424: 'Failed Dependency',
+ 425: 'Too Early',
+ 426: 'Upgrade Required',
+ 428: 'Precondition Required',
+ 429: 'Too Many Requests',
+ 431: 'Request Header Fields Too Large',
+ 451: 'Unavailable For Legal Reasons',
+ 500: 'Internal Server Error',
+ 501: 'Not Implemented',
+ 502: 'Bad Gateway',
+ 503: 'Service Unavailable',
+ 504: 'Gateway Timeout',
+ 505: 'HTTP Version Not Supported',
+ 506: 'Variant Also Negotiates',
+ 507: 'Insufficient Storage',
+ 508: 'Loop Detected',
+ 510: 'Not Extended',
+ 511: 'Network Authentication Required',
+ ...options.errors,
+ }
+
+ const error = errors[result.status];
+ if (error) {
+ throw new ApiError(options, result, error);
+ }
+
+ if (!result.ok) {
+ const errorStatus = result.status ?? 'unknown';
+ const errorStatusText = result.statusText ?? 'unknown';
+ const errorBody = (() => {
+ try {
+ return JSON.stringify(result.body, null, 2);
+ } catch (e) {
+ return undefined;
+ }
+ })();
+
+ throw new ApiError(options, result,
+ `Generic Error: status: ${errorStatus}; status text: ${errorStatusText}; body: ${errorBody}`
+ );
+ }
+};
+
+/**
+ * Request method
+ * @param config The OpenAPI configuration object
+ * @param options The request options from the service
+ * @returns CancelablePromise
+ * @throws ApiError
+ */
+export const request = (config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise => {
+ return new CancelablePromise(async (resolve, reject, onCancel) => {
+ try {
+ const url = getUrl(config, options);
+ const formData = getFormData(options);
+ const body = getRequestBody(options);
+ const headers = await getHeaders(config, options);
+
+ if (!onCancel.isCancelled) {
+ let response = await sendRequest(config, options, url, body, formData, headers, onCancel);
+
+ for (const fn of config.interceptors.response._fns) {
+ response = await fn(response);
+ }
+
+ const responseBody = await getResponseBody(response);
+ const responseHeader = getResponseHeader(response, options.responseHeader);
+
+ const result: ApiResult = {
+ url,
+ ok: response.ok,
+ status: response.status,
+ statusText: response.statusText,
+ body: responseHeader ?? responseBody,
+ };
+
+ catchErrorCodes(options, result);
+
+ resolve(result.body);
+ }
+ } catch (error) {
+ reject(error);
+ }
+ });
+};
\ No newline at end of file
diff --git a/Our.Umbraco.TheDashboard/Client/src/backend-api/index.ts b/Our.Umbraco.TheDashboard/Client/src/backend-api/index.ts
new file mode 100644
index 0000000..3e1f0b3
--- /dev/null
+++ b/Our.Umbraco.TheDashboard/Client/src/backend-api/index.ts
@@ -0,0 +1,6 @@
+// This file is auto-generated by @hey-api/openapi-ts
+export { ApiError } from './core/ApiError';
+export { CancelablePromise, CancelError } from './core/CancelablePromise';
+export { OpenAPI, type OpenAPIConfig } from './core/OpenAPI';
+export * from './services.gen';
+export * from './types.gen';
\ No newline at end of file
diff --git a/Our.Umbraco.TheDashboard/Client/src/backend-api/services.gen.ts b/Our.Umbraco.TheDashboard/Client/src/backend-api/services.gen.ts
new file mode 100644
index 0000000..4782113
--- /dev/null
+++ b/Our.Umbraco.TheDashboard/Client/src/backend-api/services.gen.ts
@@ -0,0 +1,42 @@
+// This file is auto-generated by @hey-api/openapi-ts
+
+import type { CancelablePromise } from './core/CancelablePromise';
+import { OpenAPI } from './core/OpenAPI';
+import { request as __request } from './core/request';
+import type { GetAllRecentActivitiesResponse, GetCountersResponse, GetPendingResponse } from './types.gen';
+
+export class TheDashboardResource {
+ /**
+ * @returns unknown Success
+ * @throws ApiError
+ */
+ public static getAllRecentActivities(): CancelablePromise {
+ return __request(OpenAPI, {
+ method: 'GET',
+ url: '/umbraco/api/the-dashboard/dashboard/get-all-recent-activities'
+ });
+ }
+
+ /**
+ * @returns unknown Success
+ * @throws ApiError
+ */
+ public static getCounters(): CancelablePromise {
+ return __request(OpenAPI, {
+ method: 'GET',
+ url: '/umbraco/api/the-dashboard/dashboard/get-counters'
+ });
+ }
+
+ /**
+ * @returns unknown Success
+ * @throws ApiError
+ */
+ public static getPending(): CancelablePromise {
+ return __request(OpenAPI, {
+ method: 'GET',
+ url: '/umbraco/api/the-dashboard/dashboard/get-pending'
+ });
+ }
+
+}
\ No newline at end of file
diff --git a/Our.Umbraco.TheDashboard/Client/src/backend-api/types.gen.ts b/Our.Umbraco.TheDashboard/Client/src/backend-api/types.gen.ts
new file mode 100644
index 0000000..351bd8a
--- /dev/null
+++ b/Our.Umbraco.TheDashboard/Client/src/backend-api/types.gen.ts
@@ -0,0 +1,82 @@
+// This file is auto-generated by @hey-api/openapi-ts
+
+export type CountersFrontendModel = {
+ counters: Array<(DashboardCounterModel)>;
+};
+
+export type DashboardCounterModel = {
+ text: string;
+ count: number;
+ /**
+ * Used to provide a click url for a counter, ie linking to a content item or any given URL
+ */
+ clickUrl: string;
+ /**
+ * Provides a way to "click" on a element in the backoffice UI by providing a CSS selector. Ie. *[data-element=tab-contentIntro] > a to show the intro dashboard.
+ */
+ clickElement: string;
+ style: string;
+};
+
+export type PendingContentNotScheduledFrontendModel = {
+ count: number;
+ items: Array<(RecentActivityFrontendModel)>;
+};
+
+export type RecentActivitiesFrontendModel = {
+ allItems: Array<(RecentActivityFrontendModel)>;
+ yourItems: Array<(RecentActivityFrontendModel)>;
+};
+
+export type RecentActivityFrontendModel = {
+ activityType: string;
+ nodeName: string;
+ nodeId: number;
+ user: UserFrontendModel;
+ datestamp: string;
+ scheduledPublishDate?: string | null;
+};
+
+export type UserFrontendModel = {
+ name: string;
+ avatar: Array<(string)>;
+};
+
+export type GetAllRecentActivitiesResponse = RecentActivitiesFrontendModel;
+
+export type GetCountersResponse = CountersFrontendModel;
+
+export type GetPendingResponse = PendingContentNotScheduledFrontendModel;
+
+export type $OpenApiTs = {
+ '/umbraco/api/the-dashboard/dashboard/get-all-recent-activities': {
+ get: {
+ res: {
+ /**
+ * Success
+ */
+ 200: RecentActivitiesFrontendModel;
+ };
+ };
+ };
+ '/umbraco/api/the-dashboard/dashboard/get-counters': {
+ get: {
+ res: {
+ /**
+ * Success
+ */
+ 200: CountersFrontendModel;
+ };
+ };
+ };
+ '/umbraco/api/the-dashboard/dashboard/get-pending': {
+ get: {
+ res: {
+ /**
+ * Success
+ */
+ 200: PendingContentNotScheduledFrontendModel;
+ };
+ };
+ };
+};
\ No newline at end of file
diff --git a/Our.Umbraco.TheDashboard/Client/src/dashboard/manifest.ts b/Our.Umbraco.TheDashboard/Client/src/dashboard/manifest.ts
new file mode 100644
index 0000000..acc3243
--- /dev/null
+++ b/Our.Umbraco.TheDashboard/Client/src/dashboard/manifest.ts
@@ -0,0 +1,22 @@
+
+const dashboard = {
+ type: 'dashboard',
+ alias: 'TheDashboard.Dashboard',
+ name: 'The Dashboard Dashboard',
+ weight: 10000,
+ element : ()=> import('./the-dashboard.element.js'),
+ meta: {
+ label: '#theDashboard_tabLabel',
+ pathname: 'dashboard'
+ },
+ conditions : [
+ {
+ alias : "Umb.Condition.SectionAlias",
+ match : "Umb.Section.Content"
+ }
+ ]
+};
+
+export const manifests = [
+ dashboard
+]
diff --git a/Our.Umbraco.TheDashboard/Client/src/dashboard/the-dashboard.element.ts b/Our.Umbraco.TheDashboard/Client/src/dashboard/the-dashboard.element.ts
new file mode 100644
index 0000000..60d77d0
--- /dev/null
+++ b/Our.Umbraco.TheDashboard/Client/src/dashboard/the-dashboard.element.ts
@@ -0,0 +1,72 @@
+import { LitElement,css,html,customElement} from '@umbraco-cms/backoffice/external/lit';;
+import { UmbElementMixin } from '@umbraco-cms/backoffice/element-api';
+import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
+import '@umbraco-cms/backoffice/components';
+import { TheDashboardResource } from '../backend-api';
+
+// const DateTimeOptions: Intl.DateTimeFormatOptions = {
+// //weekday: '',
+// year: 'numeric',
+// month: 'numeric',
+// day: 'numeric',
+// hour : '2-digit',
+// minute : '2-digit',
+// hourCycle : 'h24'
+// };
+
+/**
+* the-dashboard-dashboard description
+* @element the-dashboard-dashboard
+*/
+@customElement('the-dashboard-dashboard')
+export class TheDashboardDashboardElement extends UmbElementMixin(LitElement) {
+
+ connectedCallback(): void {
+ super.connectedCallback();
+
+ TheDashboardResource.getAllRecentActivities().then((res)=>{
+ console.log('recent',res);
+ });
+ TheDashboardResource.getPending().then((res)=>{
+ console.log('pending',res);
+ });
+ TheDashboardResource.getCounters().then((res)=>{
+ console.log('counter',res);
+ });
+
+ }
+
+ render() {
+
+
+ return html`
+
+
+
+
+
+
+ `
+ }
+
+ static styles = [UmbTextStyles, css`
+
+ * {
+ box-sizing:border-box;
+ }
+ :host > div {
+ padding:20px;
+ display:flex;
+ gap:20px;
+ }
+
+ `]
+}
+
+export default TheDashboardDashboardElement;
+
+declare global {
+ interface HTMLElementTagNameMap {
+ 'the-dashboard-dashboard': TheDashboardDashboardElement;
+ }
+}
diff --git a/Our.Umbraco.TheDashboard/Client/src/entry.ts b/Our.Umbraco.TheDashboard/Client/src/entry.ts
new file mode 100644
index 0000000..55bf422
--- /dev/null
+++ b/Our.Umbraco.TheDashboard/Client/src/entry.ts
@@ -0,0 +1,21 @@
+import type { UmbEntryPointOnInit } from '@umbraco-cms/backoffice/extension-api';
+import { UMB_AUTH_CONTEXT } from '@umbraco-cms/backoffice/auth';
+import { registerManifest } from './manifest.js';
+import { OpenAPI } from './backend-api/index.js';
+
+export const onInit: UmbEntryPointOnInit = (host, extensionRegistry) => {
+
+ host.consumeContext(UMB_AUTH_CONTEXT,(auth)=> {
+
+ const config = auth.getOpenApiConfiguration();
+
+ OpenAPI.BASE = config.base;
+ OpenAPI.WITH_CREDENTIALS = config.withCredentials;
+ OpenAPI.CREDENTIALS = config.credentials;
+ OpenAPI.TOKEN = config.token;
+
+ });
+
+ registerManifest(extensionRegistry);
+
+};
diff --git a/Our.Umbraco.TheDashboard/Client/src/localization/en-us.ts b/Our.Umbraco.TheDashboard/Client/src/localization/en-us.ts
new file mode 100644
index 0000000..9fda1aa
--- /dev/null
+++ b/Our.Umbraco.TheDashboard/Client/src/localization/en-us.ts
@@ -0,0 +1,40 @@
+import type { UmbLocalizationDictionary } from '@umbraco-cms/backoffice/localization-api';
+
+export default {
+ theDashboard : {
+ tabLabel : 'Welcome',
+
+ recentActivities : 'Recent activities',
+ recentActivitiesDescription : 'Shows recent activities from all users in the back office.',
+ unpublishedContent : 'Unpublished content',
+ unpublishedContentDescription : 'Shows unpublished content that has not been scheduled for publish.',
+ pendingContent : 'Pending content',
+ pendingContentDescription : 'Shows published content with changes that has not been scheduled for publishing.',
+ yourRecentActivity : 'Your recent activity',
+ yourRecentActivitiesDescription : 'Shows your own recent activities',
+ publishedContentNodes : 'Published content nodes',
+ nodesInRecycleBin : 'Nodes in recycle bin',
+ membersOnWebsite : 'Members on website',
+ newMembersLastWeek : 'New members last week',
+ butNotPublishedOrScheduled : 'but not published or scheduled',
+ butDidNotPublish : 'but did not publish',
+ forPublishingAt : 'for publishing at',
+ to : 'to',
+ saved : 'saved',
+ moved : 'moved',
+ unpublished : 'unpublished',
+ savedBy : 'saved by',
+ savedAndScheduled : 'saved and scheduled',
+ savedAndPublished : 'saved and published',
+ recycleBin : 'recycle bin',
+ rolledBack : 'rolled back',
+
+ Saved : 'Saved',
+ Moved : 'Moved',
+ Unpublished : 'Unpublished',
+ SavedAndScheduled : 'Saved and scheduled',
+ SavedAndPublished : 'Saved and published',
+ RolledBack : 'Rolled back',
+
+ }
+} as UmbLocalizationDictionary
diff --git a/Our.Umbraco.TheDashboard/Client/src/localization/sv-se.ts b/Our.Umbraco.TheDashboard/Client/src/localization/sv-se.ts
new file mode 100644
index 0000000..309e91b
--- /dev/null
+++ b/Our.Umbraco.TheDashboard/Client/src/localization/sv-se.ts
@@ -0,0 +1,40 @@
+import type { UmbLocalizationDictionary } from '@umbraco-cms/backoffice/localization-api';
+
+export default {
+ theDashboard : {
+ tabLabel : '',
+
+ recentActivities : '',
+ recentActivitiesDescription : '',
+ unpublishedContent : '',
+ unpublishedContentDescription : '',
+ pendingContent : '',
+ pendingContentDescription : '',
+ yourRecentActivity : '',
+ yourRecentActivitiesDescription : '',
+ publishedContentNodes : '',
+ nodesInRecycleBin : '',
+ membersOnWebsite : '',
+ newMembersLastWeek : '',
+ butNotPublishedOrScheduled : '',
+ butDidNotPublish : '',
+ forPublishingAt : '',
+ to : '',
+ saved : '',
+ moved : '',
+ unpublished : '',
+ savedBy : '',
+ savedAndScheduled : '',
+ savedAndPublished : '',
+ recycleBin : '',
+ rolledBack : '',
+
+ Saved : '',
+ Moved : '',
+ Unpublished : '',
+ SavedAndScheduled : '',
+ SavedAndPublished : '',
+ RolledBack : '',
+
+ }
+} as UmbLocalizationDictionary
diff --git a/Our.Umbraco.TheDashboard/Client/src/manifest.ts b/Our.Umbraco.TheDashboard/Client/src/manifest.ts
new file mode 100644
index 0000000..9e866db
--- /dev/null
+++ b/Our.Umbraco.TheDashboard/Client/src/manifest.ts
@@ -0,0 +1,33 @@
+import type { ManifestLocalization, UmbBackofficeExtensionRegistry } from "@umbraco-cms/backoffice/extension-registry";
+import { manifests as dashboardManifests } from "./dashboard/manifest.js";
+
+const translationManifests : Array = [
+ {
+ type: "localization",
+ alias: "TheDasboard.Localize.En_US",
+ name: "English (United States)",
+ meta: {
+ "culture": "en-us"
+ },
+ js : ()=> import('./localization/en-us.js')
+ },
+ {
+ type: "localization",
+ alias: "TheDasboard.Localize.Sv_SE",
+ name: "Swedish (Sweden)",
+ meta: {
+ "culture": "sv-se"
+ },
+ js : ()=> import('./localization/sv-se.js')
+ },
+]
+
+export function registerManifest(registry : UmbBackofficeExtensionRegistry) {
+
+ console.log('register extensions');
+
+ registry.registerMany([
+ ...dashboardManifests,
+ ...translationManifests
+ ]);
+}
diff --git a/Our.Umbraco.TheDashboard/Client/src/vite-env.d.ts b/Our.Umbraco.TheDashboard/Client/src/vite-env.d.ts
new file mode 100644
index 0000000..11f02fe
--- /dev/null
+++ b/Our.Umbraco.TheDashboard/Client/src/vite-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/Our.Umbraco.TheDashboard/Client/tsconfig.json b/Our.Umbraco.TheDashboard/Client/tsconfig.json
new file mode 100644
index 0000000..69e31ac
--- /dev/null
+++ b/Our.Umbraco.TheDashboard/Client/tsconfig.json
@@ -0,0 +1,24 @@
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "experimentalDecorators": true,
+ "useDefineForClassFields": false,
+ "module": "ESNext",
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+
+ /* Linting */
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "include": ["src"]
+}
diff --git a/Our.Umbraco.TheDashboard/Client/vite.config.ts b/Our.Umbraco.TheDashboard/Client/vite.config.ts
new file mode 100644
index 0000000..92f8151
--- /dev/null
+++ b/Our.Umbraco.TheDashboard/Client/vite.config.ts
@@ -0,0 +1,16 @@
+import { defineConfig } from "vite";
+
+export default defineConfig({
+ build: {
+ lib: {
+ entry: "src/entry.ts",
+ formats: ["es"],
+ name : "TheDashboard.Umbraco"
+ },
+ outDir: "../wwwroot/App_Plugins/Our.Umbraco.TheDashboard/dist",
+ sourcemap: true,
+ rollupOptions: {
+ external: [/^@umbraco/]
+ },
+ }
+});
diff --git a/Our.Umbraco.TheDashboard/Controllers/OpenApi/ConfigureCookieTractorApiSweggerGenOptions.cs b/Our.Umbraco.TheDashboard/Controllers/OpenApi/ConfigureCookieTractorApiSweggerGenOptions.cs
new file mode 100644
index 0000000..30df7ee
--- /dev/null
+++ b/Our.Umbraco.TheDashboard/Controllers/OpenApi/ConfigureCookieTractorApiSweggerGenOptions.cs
@@ -0,0 +1,8 @@
+namespace Our.Umbraco.TheDashboard.Controllers.OpenApi;
+
+public class TheDashboardApiConfiguration
+{
+ public const string ApiName = "the-dashboard";
+ public const string ApiTitle = "TheDashboard";
+
+}
diff --git a/Our.Umbraco.TheDashboard/Controllers/OpenApi/ConfigureTheDashboardApiSwaggerGenOptions.cs b/Our.Umbraco.TheDashboard/Controllers/OpenApi/ConfigureTheDashboardApiSwaggerGenOptions.cs
new file mode 100644
index 0000000..72fb4ed
--- /dev/null
+++ b/Our.Umbraco.TheDashboard/Controllers/OpenApi/ConfigureTheDashboardApiSwaggerGenOptions.cs
@@ -0,0 +1,29 @@
+using System;
+using System.IO;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Options;
+using Microsoft.OpenApi.Models;
+using Swashbuckle.AspNetCore.SwaggerGen;
+
+namespace Our.Umbraco.TheDashboard.Controllers.OpenApi;
+
+public class ConfigureTheDashboardApiSwaggerGenOptions : IConfigureOptions
+{
+ public void Configure(SwaggerGenOptions swaggerGenOptions)
+ {
+ swaggerGenOptions.SwaggerDoc(
+ TheDashboardApiConfiguration.ApiName,
+ new OpenApiInfo
+ {
+ Title = TheDashboardApiConfiguration.ApiTitle,
+ Version = "Latest",
+ Description = $"Backoffice API for The Dashboard, for our internal use contracts might break at any time."
+ });
+
+
+ swaggerGenOptions.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, "Our.Umbraco.TheDashboard.xml"));
+
+ swaggerGenOptions.CustomOperationIds(e => $"{e.ActionDescriptor.RouteValues["action"]}");
+
+ }
+}
diff --git a/Our.Umbraco.TheDashboard/Controllers/OpenApi/TheDashboardRouteAttribute.cs b/Our.Umbraco.TheDashboard/Controllers/OpenApi/TheDashboardRouteAttribute.cs
new file mode 100644
index 0000000..854ed01
--- /dev/null
+++ b/Our.Umbraco.TheDashboard/Controllers/OpenApi/TheDashboardRouteAttribute.cs
@@ -0,0 +1,12 @@
+using Microsoft.AspNetCore.Mvc;
+using Umbraco.Cms.Core;
+
+namespace Our.Umbraco.TheDashboard.Controllers.OpenApi;
+
+public class TheDashboardRouteAttribute : RouteAttribute
+{
+ public TheDashboardRouteAttribute(string template)
+ : base($"[{Constants.Web.AttributeRouting.BackOfficeToken}]/api/the-dashboard/" + template.TrimStart('/'))
+ {
+ }
+}
diff --git a/Our.Umbraco.TheDashboard/Controllers/OpenApi/TheDashboardSchemaIdHandler.cs b/Our.Umbraco.TheDashboard/Controllers/OpenApi/TheDashboardSchemaIdHandler.cs
new file mode 100644
index 0000000..c813758
--- /dev/null
+++ b/Our.Umbraco.TheDashboard/Controllers/OpenApi/TheDashboardSchemaIdHandler.cs
@@ -0,0 +1,17 @@
+using Umbraco.Cms.Api.Common.OpenApi;
+
+namespace Our.Umbraco.TheDashboard.Controllers.OpenApi;
+
+internal class TheDashboardSchemaIdHandler : SchemaIdHandler
+{
+ public override bool CanHandle(Type type)
+ {
+ if (type.Namespace?.StartsWith("Our.Umbraco.TheDashboard") is true)
+ return true;
+
+ return false;
+
+ }
+
+ public override string Handle(Type type) => UmbracoSchemaId(type);
+}
diff --git a/Our.Umbraco.TheDashboard/Controllers/TheDasboardController.cs b/Our.Umbraco.TheDashboard/Controllers/TheDasboardController.cs
index c3c2389..d27aaa5 100644
--- a/Our.Umbraco.TheDashboard/Controllers/TheDasboardController.cs
+++ b/Our.Umbraco.TheDashboard/Controllers/TheDasboardController.cs
@@ -1,4 +1,4 @@
-using System.Collections.Generic;
+using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using Microsoft.AspNetCore.Mvc;
@@ -13,134 +13,148 @@
using Umbraco.Cms.Core.Security;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Web.Common.Attributes;
+using Microsoft.AspNetCore.Authorization;
+using Our.Umbraco.TheDashboard.Controllers.OpenApi;
+using Umbraco.Cms.Api.Common.Attributes;
+using Umbraco.Cms.Api.Common.Filters;
+using Umbraco.Cms.Core;
+using Umbraco.Cms.Web.Common.Authorization;
+using Microsoft.AspNetCore.Http;
-namespace Our.Umbraco.TheDashboard.Controllers
+namespace Our.Umbraco.TheDashboard.Controllers;
+
+internal static class EndpointCampaignConfiguration
{
- [IsBackOffice]
- public class TheDashboardController : ControllerBase
- {
- private readonly AppCaches _appCaches;
- private readonly IScopeProvider _scopeProvider;
- private readonly ITheDashboardService _dashboardService;
- private readonly DashboardCountersCollection _dashboardCountersCollection;
- private readonly IUserService _userService;
- private readonly IBackOfficeSecurity _security;
- private readonly IEntityService _entityService;
- private readonly IHttpClientFactory _httpClientFactory;
-
- public TheDashboardController(AppCaches appCaches,
- IScopeProvider scopeProvider,
- ITheDashboardService dashboardService,
- DashboardCountersCollection dashboardCountersCollection,
- IUserService userService,
- IBackOfficeSecurity security,
- IEntityService entityService,
- IHttpClientFactory httpClientFactory
- )
- {
- _appCaches = appCaches;
- _scopeProvider = scopeProvider;
- _dashboardService = dashboardService;
- _dashboardCountersCollection = dashboardCountersCollection;
- _userService = userService;
- _security = security;
- _entityService = entityService;
- _httpClientFactory = httpClientFactory;
- }
+ public const string RouteSegment = "dashboard";
+ public const string GroupName = "TheDashboard";
+}
+
+[ApiController]
+[PluginController("TheDashboard")]
+[Authorize(Policy = AuthorizationPolicies.BackOfficeAccess)]
+[JsonOptionsName(Constants.JsonOptionsNames.BackOffice)]
+[MapToApi(TheDashboardApiConfiguration.ApiName)]
+[TheDashboardRoute(EndpointCampaignConfiguration.RouteSegment)]
+[ApiExplorerSettings(GroupName = EndpointCampaignConfiguration.GroupName)]
+public class TheDashboardController : ControllerBase
+{
+ private readonly AppCaches _appCaches;
+ private readonly IScopeProvider _scopeProvider;
+ private readonly ITheDashboardService _dashboardService;
+ private readonly DashboardCountersCollection _dashboardCountersCollection;
+ private readonly IUserService _userService;
+ private readonly IBackOfficeSecurity _security;
+ private readonly IEntityService _entityService;
+ private readonly IHttpClientFactory _httpClientFactory;
+
+ public TheDashboardController(AppCaches appCaches,
+ IScopeProvider scopeProvider,
+ ITheDashboardService dashboardService,
+ DashboardCountersCollection dashboardCountersCollection,
+ IUserService userService,
+ IBackOfficeSecurity security,
+ IEntityService entityService,
+ IHttpClientFactory httpClientFactory
+ )
+ {
+ _appCaches = appCaches;
+ _scopeProvider = scopeProvider;
+ _dashboardService = dashboardService;
+ _dashboardCountersCollection = dashboardCountersCollection;
+ _userService = userService;
+ _security = security;
+ _entityService = entityService;
+ _httpClientFactory = httpClientFactory;
+ }
- [HttpGet]
- public RecentActivitiesFrontendModel GetAllRecentActivities()
- {
+ [HttpGet("get-all-recent-activities")]
+ [ProducesResponseType(typeof(RecentActivitiesFrontendModel), StatusCodes.Status200OK)]
+ public RecentActivitiesFrontendModel GetAllRecentActivities()
+ {
- var model = new RecentActivitiesFrontendModel();
- model.AllItems = new List();
- model.YourItems = new List();
+ var model = new RecentActivitiesFrontendModel();
+ model.AllItems = new List();
+ model.YourItems = new List();
- var allRecentDtos = _dashboardService.GetEntries();
+ var allRecentDtos = _dashboardService.GetEntries();
- var accessService = new UserToNodeAccessHelper(_security.CurrentUser, _userService,_entityService,_appCaches, allRecentDtos);
- var filteredDtos = allRecentDtos.Where(x => accessService.HasAccessTo(x)).ToList();
+ var accessService = new UserToNodeAccessHelper(_security.CurrentUser, _userService,_entityService,_appCaches, allRecentDtos);
+ var filteredDtos = allRecentDtos.Where(x => accessService.HasAccessTo(x)).ToList();
- model.AllItems = CreateFrontendModelsFrom(filteredDtos);
+ model.AllItems = CreateFrontendModelsFrom(filteredDtos);
- // filter to only my own
- var filteredMyActivitiesDtos = filteredDtos.Where(x => x.UserId == _security.CurrentUser.Id).ToList();
- model.YourItems = CreateFrontendModelsFrom(filteredMyActivitiesDtos);
+ // filter to only my own
+ var filteredMyActivitiesDtos = filteredDtos.Where(x => x.UserId == _security.CurrentUser.Id).ToList();
+ model.YourItems = CreateFrontendModelsFrom(filteredMyActivitiesDtos);
- return model;
- }
+ return model;
+ }
- [HttpGet]
- public PendingContentNotScheduledFrontendModel GetPending()
- {
- var model = new PendingContentNotScheduledFrontendModel();
- model.Items = new List();
+ [HttpGet("get-pending")]
+ [ProducesResponseType(typeof(PendingContentNotScheduledFrontendModel), StatusCodes.Status200OK)]
+ public PendingContentNotScheduledFrontendModel GetPending()
+ {
+ var model = new PendingContentNotScheduledFrontendModel();
+ model.Items = new List();
- var allRecentDtos = _dashboardService.GetPending();
+ var allRecentDtos = _dashboardService.GetPending();
- var accessService = new UserToNodeAccessHelper(_security.CurrentUser, _userService,_entityService,_appCaches, allRecentDtos);
- var filteredDtos = allRecentDtos.Where(x => accessService.HasAccessTo(x)).ToList();
+ var accessService = new UserToNodeAccessHelper(_security.CurrentUser, _userService,_entityService,_appCaches, allRecentDtos);
+ var filteredDtos = allRecentDtos.Where(x => accessService.HasAccessTo(x)).ToList();
- model.Items = CreateFrontendModelsFrom(filteredDtos);
- model.Count = model.Items.Count;
- return model;
- }
+ model.Items = CreateFrontendModelsFrom(filteredDtos);
+ model.Count = model.Items.Count;
+ return model;
+ }
+ [HttpGet("get-counters")]
+ [ProducesResponseType(typeof(CountersFrontendModel), StatusCodes.Status200OK)]
+ public CountersFrontendModel GetCounters()
+ {
+ var model = new CountersFrontendModel();
- private List CreateFrontendModelsFrom(List dtos)
+ using (var scope = _scopeProvider.CreateScope())
{
- var maxCount = 10;
- var mapper = new LogEntryToRecentActivityMapper(_appCaches,_httpClientFactory);
-
- // Should return a list of models containing unique items for the nodeId.
- var list = new List();
-
- for (int i = 0; i < dtos.Count; i++)
+ foreach (var counter in _dashboardCountersCollection)
{
- var dto = dtos[i];
- // If we already have a item in the list with the same nodeId this means that the latest activity
- // for this nodeid already has been added.
- if (!list.Any(x => x.NodeId == dto.NodeId))
- {
- // try to create a view model, this will return null when the model is not of a valid type.
- var vm = mapper.Map(dto);
- if (vm != null)
- {
- list.Add(vm);
- }
- }
-
- if(list.Count >= maxCount)
- return list;
-
+ model.Counters.Add(counter.GetModel(scope));
}
-
- return list;
-
}
-
+ return model;
+ }
- public string GetMyRecentActivities()
- {
- return "";
- }
+ private List CreateFrontendModelsFrom(List dtos)
+ {
+ var maxCount = 10;
+ var mapper = new LogEntryToRecentActivityMapper(_appCaches, _httpClientFactory);
- public CountersFrontendModel GetCounters()
- {
- var model = new CountersFrontendModel();
+ // Should return a list of models containing unique items for the nodeId.
+ var list = new List();
- using (var scope = _scopeProvider.CreateScope())
+ for (int i = 0; i < dtos.Count; i++)
+ {
+ var dto = dtos[i];
+ // If we already have a item in the list with the same nodeId this means that the latest activity
+ // for this nodeid already has been added.
+ if (!list.Any(x => x.NodeId == dto.NodeId))
{
- foreach (var counter in _dashboardCountersCollection)
+ // try to create a view model, this will return null when the model is not of a valid type.
+ var vm = mapper.Map(dto);
+ if (vm != null)
{
- model.Counters.Add(counter.GetModel(scope));
+ list.Add(vm);
}
}
- return model;
+ if (list.Count >= maxCount)
+ return list;
+
}
+ return list;
+
}
-}
\ No newline at end of file
+
+}
diff --git a/Our.Umbraco.TheDashboard/Our.Umbraco.TheDashboard.csproj b/Our.Umbraco.TheDashboard/Our.Umbraco.TheDashboard.csproj
index ae7789b..1137db1 100644
--- a/Our.Umbraco.TheDashboard/Our.Umbraco.TheDashboard.csproj
+++ b/Our.Umbraco.TheDashboard/Our.Umbraco.TheDashboard.csproj
@@ -1,31 +1,34 @@
-
-
- net8.0
- true
- /
- .
- Our.Umbraco.TheDashboard
- Our.Umbraco.TheDashboard
- Content dashboard for Umbraco
- The Dashboard for Umbraco
- umbraco umbraco-marketplace dashboard activities plugin package
- 14.0.0
- Markus Johansson
- Copyright (c) Obviuse AB
- Obviuse AB / Enkel Media Stockholm AB
- https://github.com/enkelmedia/TheDashboard
- https://github.com/enkelmedia/TheDashboard
- git
- README.md
- MIT
-
+
+
+ net8.0
+ enable
+ enable
+ true
+ /
+ .
+ True
+ Our.Umbraco.TheDashboard
+ Our.Umbraco.TheDashboard
+ Content dashboard for Umbraco
+ The Dashboard for Umbraco
+ umbraco umbraco-marketplace dashboard activities plugin package
+ 14.0.0
+ Markus Johansson
+ Copyright (c) Obviuse AB
+ Obviuse AB / Enkel Media Stockholm AB
+ https://github.com/enkelmedia/TheDashboard
+ https://github.com/enkelmedia/TheDashboard
+ git
+ README.md
+ MIT
+
-
-
-
-
+
+
+
+
-
-
-
+
+
+
diff --git a/Our.Umbraco.TheDashboard/TheDashboardComposer.cs b/Our.Umbraco.TheDashboard/TheDashboardComposer.cs
index 718a3c9..918979c 100644
--- a/Our.Umbraco.TheDashboard/TheDashboardComposer.cs
+++ b/Our.Umbraco.TheDashboard/TheDashboardComposer.cs
@@ -1,10 +1,12 @@
-using Our.Umbraco.TheDashboard.Counters.Implement;
+using Our.Umbraco.TheDashboard.Counters.Implement;
using Our.Umbraco.TheDashboard.Extensions;
using Our.Umbraco.TheDashboard.Services;
using Umbraco.Cms.Core.Composing;
using Umbraco.Cms.Core.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
+using Our.Umbraco.TheDashboard.Controllers.OpenApi;
using Our.Umbraco.TheDashboard.Counters.Collections;
+using Umbraco.Cms.Api.Common.OpenApi;
namespace Our.Umbraco.TheDashboard
{
@@ -23,6 +25,14 @@ public void Compose(IUmbracoBuilder builder)
// Just using this to make sure that it works and are used in the package
builder.TheDashboardCounters().Append();
+#if DEBUG
+ // SWAGGER - Only use in debug build to avoid exposing in production messing up things in the core.
+ builder.Services.ConfigureOptions();
+ builder.Services.AddSingleton();
+#endif
+
+
}
+
}
-}
\ No newline at end of file
+}
diff --git a/Our.Umbraco.TheDashboard/wwwroot/App_Plugins/Our.Umbraco.TheDashboard/umbraco-package.json b/Our.Umbraco.TheDashboard/wwwroot/App_Plugins/Our.Umbraco.TheDashboard/umbraco-package.json
new file mode 100644
index 0000000..326eeab
--- /dev/null
+++ b/Our.Umbraco.TheDashboard/wwwroot/App_Plugins/Our.Umbraco.TheDashboard/umbraco-package.json
@@ -0,0 +1,14 @@
+{
+ "$schema": "../../../../Our.Umbraco.TheDashboard.Testsite/umbraco-package-schema.json",
+ "name": "TheDashboard",
+ "version": "14.0.0",
+ "extensions": [
+ {
+ "type": "entryPoint",
+ "alias": "TheDashboard.EntryPoint",
+ "name": "TheDashboard Entry Point",
+ "js": "/App_Plugins/Our.Umbraco.TheDashboard/dist/the-dashboard-umbraco.js",
+ "weight": 13000
+ }
+ ]
+}