diff --git a/Build/Gruntfile.js b/Build/Gruntfile.js
index 7b3752e13888a47bac8839ad7f993287598eab8f..45841aa0ceaf3f84071042e9a4c76c38defb2283 100644
--- a/Build/Gruntfile.js
+++ b/Build/Gruntfile.js
@@ -449,6 +449,72 @@ module.exports = function (grunt) {
         cache: './.cache/grunt-newer/'
       }
     },
+    rollup: {
+      options: {
+        format: 'amd',
+        onwarn: function(warning) {
+          if (warning.code === 'THIS_IS_UNDEFINED' && grunt.file.match('*/lit-html/directives/async-*.js')) {
+            // lit-html's Symbol.asyncIterator polyfill in async-{append/replace}.js contains
+            // a global check for `this`: `(this && this.__asyncValues) || function (o) {`.
+            // rollup will rewrite that to `function (o) {` and warn about rewriting `this`.
+            // The rewrite is perfectly ok, the AMD module will act as a singleton, so no
+            // global window object is needed here. The warning is therefore silenced.
+            return;
+          }
+          console.warn( warning.message );
+        }
+      },
+      'lit-html': {
+        options: {
+          preserveModules: true,
+          plugins: () => [
+            {
+              name: 'terser',
+              renderChunk: code => require('terser').minify(code, grunt.config.get('terser.options'))
+            }
+          ]
+        },
+        files: {
+          '<%= paths.core %>Public/JavaScript/Contrib/lit-html': [
+            'node_modules/lit-html/lit-html.js',
+            'node_modules/lit-html/directives/*.js',
+            'node_modules/lit-html/lib/*.js',
+            // omitted, empty
+            '!node_modules/lit-html/lib/render-options.js',
+            '!node_modules/lit-html/lib/template-processor.js',
+          ]
+        }
+      },
+      'lit-element': {
+        options: {
+          preserveModules: true,
+          plugins: () => [
+            {
+              name: 'terser',
+              renderChunk: code => require('terser').minify(code, grunt.config.get('terser.options'))
+            },
+            {
+              name: 'externals',
+              resolveId: (source) => {
+                if (source === 'lit-html/lit-html.js') {
+                  return {id: 'lit-html', external: true}
+                }
+                if (source === 'lit-html/lib/shady-render.js') {
+                  return {id: 'lit-html/lib/shady-render', external: true}
+                }
+                return null
+              }
+            }
+          ]
+        },
+        files: {
+          '<%= paths.core %>Public/JavaScript/Contrib/lit-element': [
+            'node_modules/lit-element/lit-element.js',
+            'node_modules/lit-element/lib/*.js',
+          ]
+        }
+      },
+    },
     npmcopy: {
       options: {
         clean: false,
@@ -643,6 +709,7 @@ module.exports = function (grunt) {
   // Register tasks
   grunt.loadNpmTasks('grunt-sass');
   grunt.loadNpmTasks('grunt-contrib-watch');
+  grunt.loadNpmTasks('grunt-rollup');
   grunt.loadNpmTasks('grunt-npmcopy');
   grunt.loadNpmTasks('grunt-terser');
   grunt.loadNpmTasks('grunt-postcss');
@@ -707,7 +774,7 @@ module.exports = function (grunt) {
    * - yarn install
    * - copy some components to a specific destinations because they need to be included via PHP
    */
-  grunt.registerTask('update', ['exec:yarn-install', 'npmcopy']);
+  grunt.registerTask('update', ['exec:yarn-install', 'rollup', 'npmcopy']);
 
   /**
    * grunt compile-typescript task
diff --git a/Build/Sources/TypeScript/core/Resources/Public/TypeScript/lit-helper.ts b/Build/Sources/TypeScript/core/Resources/Public/TypeScript/lit-helper.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9adbcefeece308cb148d8623ff68917115ca2a3e
--- /dev/null
+++ b/Build/Sources/TypeScript/core/Resources/Public/TypeScript/lit-helper.ts
@@ -0,0 +1,22 @@
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+import {render} from 'lit-html';
+import {css} from 'lit-element';
+import type {TemplateResult} from 'lit-html';
+
+export const renderHTML = (result: TemplateResult): string => {
+  const anvil = document.createElement('div');
+  render(result, anvil);
+  return anvil.innerHTML;
+};
diff --git a/Build/package.json b/Build/package.json
index b373e07c832917e397b912700abf90f960938f8a..68b0b7197b763d04681522cdb7d812e85b22ab48 100644
--- a/Build/package.json
+++ b/Build/package.json
@@ -38,6 +38,7 @@
     "grunt-newer": "^1.3.0",
     "grunt-npmcopy": "^0.2.0",
     "grunt-postcss": "^0.9.0",
+    "grunt-rollup": "^11.5.0",
     "grunt-sass": "^3.1.0",
     "grunt-stylelint": "^0.15.0",
     "grunt-terser": "^1.0.0",
@@ -87,6 +88,8 @@
     "imagesloaded": "^4.1.4",
     "jquery": "^3.5.1",
     "jquery-ui": "github:jquery/jquery-ui#1.11.4",
+    "lit-element": "^2.4",
+    "lit-html": "^1.3",
     "moment": "^2.29.0",
     "moment-timezone": "^0.5.31",
     "muuri": "^0.9.3",
diff --git a/Build/yarn.lock b/Build/yarn.lock
index eb2e3fd1953d74322b2598e99c2c79b3cf67d3a9..b284197e30d669d469771259ed244e197cd6ada4 100644
--- a/Build/yarn.lock
+++ b/Build/yarn.lock
@@ -4035,6 +4035,13 @@ grunt-postcss@^0.9.0:
     diff "^3.0.0"
     postcss "^6.0.11"
 
+grunt-rollup@^11.5.0:
+  version "11.5.0"
+  resolved "https://registry.yarnpkg.com/grunt-rollup/-/grunt-rollup-11.5.0.tgz#ec1bdda97827054434de21535ac236144f9a50d4"
+  integrity sha512-Xa/1g0G4HlMIAsJYLZgDEDi8w2jZ5sLpo6XKezJqGdpTGe8qGWcXG7kopiyCUYiXs3LLv58y/DhGIXwbkCAkvQ==
+  dependencies:
+    rollup "^2.32.0"
+
 grunt-sass@^3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/grunt-sass/-/grunt-sass-3.1.0.tgz#a5936cc2a80ec08092d9f31c101dc307d1e4f71c"
@@ -5439,6 +5446,18 @@ lintspaces@^0.7.0:
     minimist "^1.2.5"
     rc "^1.2.8"
 
+lit-element@^2.4:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/lit-element/-/lit-element-2.4.0.tgz#b22607a037a8fc08f5a80736dddf7f3f5d401452"
+  integrity sha512-pBGLglxyhq/Prk2H91nA0KByq/hx/wssJBQFiYqXhGDvEnY31PRGYf1RglVzyLeRysu0IHm2K0P196uLLWmwFg==
+  dependencies:
+    lit-html "^1.1.1"
+
+lit-html@^1.1.1, lit-html@^1.3:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/lit-html/-/lit-html-1.3.0.tgz#c80f3cc5793a6dea6c07172be90a70ab20e56034"
+  integrity sha512-0Q1bwmaFH9O14vycPHw8C/IeHMk/uSDldVLIefu/kfbTBGIc44KGH6A8p1bDfxUfHdc8q6Ct7kQklWoHgr4t1Q==
+
 livereload-js@^2.3.0:
   version "2.4.0"
   resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.4.0.tgz#447c31cf1ea9ab52fc20db615c5ddf678f78009c"
@@ -7665,6 +7684,13 @@ rimraf@^3.0.0, rimraf@^3.0.2, rimraf@~3.0.2:
   dependencies:
     glob "^7.1.3"
 
+rollup@^2.32.0:
+  version "2.34.2"
+  resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.34.2.tgz#fa73e05c64df587e9ed4dc80d7d4e7d4a43f8908"
+  integrity sha512-mvtQLqu3cNeoctS+kZ09iOPxrc1P1/Bt1z15enuQ5feyKOdM3MJAVFjjsygurDpSWn530xB4AlA83TWIzRstXA==
+  optionalDependencies:
+    fsevents "~2.1.2"
+
 run-parallel@^1.1.9:
   version "1.1.9"
   resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679"
diff --git a/typo3/sysext/core/Classes/Page/PageRenderer.php b/typo3/sysext/core/Classes/Page/PageRenderer.php
index cc70b717d3fe278106f06b78c50745f9b1cf9d83..203c9cc93fdc764bda8629b39718be5f3f5cbac6 100644
--- a/typo3/sysext/core/Classes/Page/PageRenderer.php
+++ b/typo3/sysext/core/Classes/Page/PageRenderer.php
@@ -1398,6 +1398,18 @@ class PageRenderer implements SingletonInterface
         $requireJsConfig['public']['shim'] = [
             'tablesort.dotsep' => ['deps' => ['tablesort']],
         ];
+        $requireJsConfig['public']['packages'] = [
+            [
+                'name' => 'lit-html',
+                'location' => $corePath . 'lit-html',
+                'main' => 'lit-html',
+            ],
+            [
+                'name' => 'lit-element',
+                'location' => $corePath . 'lit-element',
+                'main' => 'lit-element',
+            ]
+        ];
         $requireJsConfig['public']['waitSeconds'] = 30;
         $requireJsConfig['public']['typo3BaseUrl'] = false;
         $publicPackageNames = ['core', 'frontend', 'backend'];
@@ -1490,8 +1502,11 @@ class PageRenderer implements SingletonInterface
             $requireJsConfig = $this->getRequireJsConfig(static::REQUIREJS_SCOPE_CONFIG);
             $requireJsConfig['typo3BaseUrl'] = (string)$uriBuilder->buildUriFromRoute('ajax_core_requirejs');
         } else {
-            // backend request, having backend user logged in
-            $requireJsConfig = array_replace_recursive(
+            // Backend request, having backend user logged in.
+            // Merge public and private require js configuration.
+            // Use array_merge for 'packages' definitions (scalar array indexes) and
+            // merge+replace for other, string array based configuration (like 'path' and 'shim').
+            $requireJsConfig = ArrayUtility::replaceAndAppendScalarValuesRecursive(
                 $this->publicRequireJsConfig,
                 $this->requireJsConfig
             );
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Feature-91810-IntroduceLit-htmlAndLit-elementAsClient-sideTemplatingEngine.rst b/typo3/sysext/core/Documentation/Changelog/master/Feature-91810-IntroduceLit-htmlAndLit-elementAsClient-sideTemplatingEngine.rst
new file mode 100644
index 0000000000000000000000000000000000000000..1424077bfde3088792782d9753116d864207217a
--- /dev/null
+++ b/typo3/sysext/core/Documentation/Changelog/master/Feature-91810-IntroduceLit-htmlAndLit-elementAsClient-sideTemplatingEngine.rst
@@ -0,0 +1,162 @@
+.. include:: ../../Includes.txt
+
+=====================================================================================
+Feature: #91810 - Introduce lit-html and lit-element as client-side templating engine
+=====================================================================================
+
+See :issue:`91810`
+
+Description
+===========
+
+To avoid custom jQuery template building a new slim client-side templating
+engine `lit-html`_ together with `lit-element_` is introduced.
+
+This templating engine supports conditions, iterations, events, virtual DOM,
+data-binding and mutation/change detections in templates.
+
+.. _lit-html: https://lit-html.polymer-project.org/
+.. _lit-element: https://lit-element.polymer-project.org/
+
+
+Impact
+======
+
+Individual client-side templates can be processed in JavaScript directly
+using modern web technologies like template-strings_ and template-elements_.
+
+.. _template-strings: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals
+.. _template-elements: https://developer.mozilla.org/de/docs/Web/HTML/Element/template
+
+Rendering is handled by the AMD-modules `lit-html` and `lit-element`.
+Please consult the `lit-html` template-reference_ and lit-element-guide_ for more
+information.
+
+.. _template-reference: https://lit-html.polymer-project.org/guide/template-reference
+.. _lit-element-guide: https://lit-element.polymer-project.org/guide
+
+Examples
+========
+
+Variable assignment
+-------------------
+
+.. code-block:: ts
+
+   import {html, render} from 'lit-html';
+
+   const value = 'World';
+   const target = document.getElementById('target');
+   render(html`<div>Hello ${value}!</div>`, target);
+
+.. code-block:: html
+
+   <div>Hello World!</div>
+
+Unsafe tags would have been encoded (e.g. :html:`<b>World</b>`
+as :html:`&lt;b&gt;World&lt;/b&gt;`).
+
+
+Condition and iteration
+-----------------------
+
+.. code-block:: ts
+
+   import {html, render} from 'lit-html';
+   import {classMap} from 'lit-html/directives/class-map.js';
+
+   const items = ['a', 'b', 'c']
+   const classes = { list: true };
+   const target = document.getElementById('target');
+   const template = html`
+      <ul class=${classMap(classes)}">
+      ${items.map((item: string, index: number): string => {
+         return html`<li>#${index+1}: ${item}</li>`
+      })}
+      </ul>
+   `;
+   render(template, target);
+
+.. code-block:: html
+
+   <ul class="list">
+      <li>#1: a</li>
+      <li>#2: b</li>
+      <li>#3: c</li>
+   </ul>
+
+The :js:`${...}` literal used in template tags can basically contain any
+JavaScript instruction - as long as their result can be casted to `string`
+again or is of type `lit-html.TemplateResult`. This allows to
+make use of custom conditions as well as iterations:
+
+* condition: :js:`${condition ? thenReturn : elseReturn}`
+* iteration: :js:`${array.map((item) => { return item; })}`
+
+
+Events
+------
+
+Events can be bound using the `@` attribute prefix.
+
+.. code-block:: ts
+
+   import {html, render} from 'lit-html';
+
+   const value = 'World';
+   const target = document.getElementById('target');
+   const template = html`
+      <div @click="${(evt: Event): void => { console.log(value); })}">
+         Hello ${value}!
+      </div>
+   `;
+   render(template, target);
+
+The result won't look much different than the first example - however the
+custom attribute :html:`@click` will be transformed into an according event
+listener bound to the element where it has been declared.
+
+Custom HTML elements
+------------------
+
+A web component based on the W3C custom elements ("web-components_") specification
+can be implemented using `lit-element`.
+
+.. code-block:: ts
+
+   import {LitElement, html, customElement, property} from 'lit-element';
+
+   @customElement('my-element')
+   class MyElement extends LitElement {
+
+    // Declare observed properties
+    @property()
+    value: string = 'awesome';
+
+    // Avoid Shadow DOM so global styles apply to the element contents
+    createRenderRoot(): Element|ShadowRoot {
+      return this;
+    }
+
+    // Define the element's template
+    render() {
+      return html`<p>Hello ${this.value}!</p>`;
+    }
+   }
+
+.. code-block:: html
+
+   <my-element value="World"></my-element>
+
+This is rendered as:
+
+.. code-block:: html
+
+   <my-element value="World">
+     <p>Hellow world!</p>
+   </my-element>
+
+.. _web-commponents: https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements
+
+
+.. index:: Backend, JavaScript, ext:backend
diff --git a/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-element/lib/css-tag.js b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-element/lib/css-tag.js
new file mode 100644
index 0000000000000000000000000000000000000000..d01e000f664fd8c4e935d93045fa6d50fe9a0b75
--- /dev/null
+++ b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-element/lib/css-tag.js
@@ -0,0 +1,11 @@
+define(["exports"],(function(e){"use strict";
+/**
+    @license
+    Copyright (c) 2019 The Polymer Project Authors. All rights reserved.
+    This code may only be used under the BSD style license found at
+    http://polymer.github.io/LICENSE.txt The complete set of authors may be found at
+    http://polymer.github.io/AUTHORS.txt The complete set of contributors may be
+    found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as
+    part of the polymer project is also subject to an additional IP rights grant
+    found at http://polymer.github.io/PATENTS.txt
+    */const t=window.ShadowRoot&&(void 0===window.ShadyCSS||window.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,s=Symbol();class n{constructor(e,t){if(t!==s)throw new Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=e}get styleSheet(){return void 0===this._styleSheet&&(t?(this._styleSheet=new CSSStyleSheet,this._styleSheet.replaceSync(this.cssText)):this._styleSheet=null),this._styleSheet}toString(){return this.cssText}}e.CSSResult=n,e.css=(e,...t)=>{const o=t.reduce((t,s,o)=>t+(e=>{if(e instanceof n)return e.cssText;if("number"==typeof e)return e;throw new Error(`Value passed to 'css' function must be a 'css' function result: ${e}. Use 'unsafeCSS' to pass non-literal values, but\n            take care to ensure page security.`)})(s)+e[o+1],e[0]);return new n(o,s)},e.supportsAdoptingStyleSheets=t,e.unsafeCSS=e=>new n(String(e),s),Object.defineProperty(e,"__esModule",{value:!0})}));
diff --git a/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-element/lib/decorators.js b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-element/lib/decorators.js
new file mode 100644
index 0000000000000000000000000000000000000000..041752370c52f9fc8e0af4e4f22fd0e33a45f4f3
--- /dev/null
+++ b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-element/lib/decorators.js
@@ -0,0 +1,14 @@
+define(["exports"],(function(e){"use strict";
+/**
+     * @license
+     * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+     * This code may only be used under the BSD style license found at
+     * http://polymer.github.io/LICENSE.txt
+     * The complete set of authors may be found at
+     * http://polymer.github.io/AUTHORS.txt
+     * The complete set of contributors may be found at
+     * http://polymer.github.io/CONTRIBUTORS.txt
+     * Code distributed by Google as part of the polymer project is also
+     * subject to an additional IP rights grant found at
+     * http://polymer.github.io/PATENTS.txt
+     */const t=(e,t)=>"method"===t.kind&&t.descriptor&&!("value"in t.descriptor)?Object.assign(Object.assign({},t),{finisher(n){n.createProperty(t.key,e)}}):{kind:"field",key:Symbol(),placement:"own",descriptor:{},initializer(){"function"==typeof t.initializer&&(this[t.key]=t.initializer.call(this))},finisher(n){n.createProperty(t.key,e)}};function n(e){return(n,r)=>void 0!==r?((e,t,n)=>{t.constructor.createProperty(n,e)})(e,n,r):t(e,n)}const r=(e,t,n)=>{Object.defineProperty(t,n,e)},o=(e,t)=>({kind:"method",placement:"prototype",key:t.key,descriptor:e});const i=Element.prototype,s=i.msMatchesSelector||i.webkitMatchesSelector;e.customElement=e=>t=>"function"==typeof t?((e,t)=>(window.customElements.define(e,t),t))(e,t):((e,t)=>{const{kind:n,elements:r}=t;return{kind:n,elements:r,finisher(t){window.customElements.define(e,t)}}})(e,t),e.eventOptions=function(e){return(t,n)=>void 0!==n?((e,t,n)=>{Object.assign(t[n],e)})(e,t,n):((e,t)=>Object.assign(Object.assign({},t),{finisher(n){Object.assign(n.prototype[t.key],e)}}))(e,t)},e.internalProperty=function(e){return n({attribute:!1,hasChanged:null==e?void 0:e.hasChanged})},e.property=n,e.query=function(e,t){return(n,i)=>{const s={get(){return this.renderRoot.querySelector(e)},enumerable:!0,configurable:!0};if(t){const t="symbol"==typeof i?Symbol():"__"+i;s.get=function(){return void 0===this[t]&&(this[t]=this.renderRoot.querySelector(e)),this[t]}}return void 0!==i?r(s,n,i):o(s,n)}},e.queryAll=function(e){return(t,n)=>{const i={get(){return this.renderRoot.querySelectorAll(e)},enumerable:!0,configurable:!0};return void 0!==n?r(i,t,n):o(i,t)}},e.queryAssignedNodes=function(e="",t=!1,n=""){return(i,c)=>{const u={get(){const r="slot"+(e?`[name=${e}]`:":not([name])"),o=this.renderRoot.querySelector(r);let i=o&&o.assignedNodes({flatten:t});return i&&n&&(i=i.filter(e=>e.nodeType===Node.ELEMENT_NODE&&e.matches?e.matches(n):s.call(e,n))),i},enumerable:!0,configurable:!0};return void 0!==c?r(u,i,c):o(u,i)}},e.queryAsync=function(e){return(t,n)=>{const i={async get(){return await this.updateComplete,this.renderRoot.querySelector(e)},enumerable:!0,configurable:!0};return void 0!==n?r(i,t,n):o(i,t)}},Object.defineProperty(e,"__esModule",{value:!0})}));
diff --git a/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-element/lib/updating-element.js b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-element/lib/updating-element.js
new file mode 100644
index 0000000000000000000000000000000000000000..9760aeea52a9df1b72611eadc39bacae102becc0
--- /dev/null
+++ b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-element/lib/updating-element.js
@@ -0,0 +1,14 @@
+define(["exports"],(function(t){"use strict";
+/**
+     * @license
+     * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+     * This code may only be used under the BSD style license found at
+     * http://polymer.github.io/LICENSE.txt
+     * The complete set of authors may be found at
+     * http://polymer.github.io/AUTHORS.txt
+     * The complete set of contributors may be found at
+     * http://polymer.github.io/CONTRIBUTORS.txt
+     * Code distributed by Google as part of the polymer project is also
+     * subject to an additional IP rights grant found at
+     * http://polymer.github.io/PATENTS.txt
+     */window.JSCompiler_renameProperty=(t,e)=>t;const e={toAttribute(t,e){switch(e){case Boolean:return t?"":null;case Object:case Array:return null==t?t:JSON.stringify(t)}return t},fromAttribute(t,e){switch(e){case Boolean:return null!==t;case Number:return null===t?null:Number(t);case Object:case Array:return JSON.parse(t)}return t}},r=(t,e)=>e!==t&&(e==e||t==t),s={attribute:!0,type:String,converter:e,reflect:!1,hasChanged:r},i="finalized";class a extends HTMLElement{constructor(){super(),this.initialize()}static get observedAttributes(){this.finalize();const t=[];return this._classProperties.forEach((e,r)=>{const s=this._attributeNameForProperty(r,e);void 0!==s&&(this._attributeToPropertyMap.set(s,r),t.push(s))}),t}static _ensureClassProperties(){if(!this.hasOwnProperty(JSCompiler_renameProperty("_classProperties",this))){this._classProperties=new Map;const t=Object.getPrototypeOf(this)._classProperties;void 0!==t&&t.forEach((t,e)=>this._classProperties.set(e,t))}}static createProperty(t,e=s){if(this._ensureClassProperties(),this._classProperties.set(t,e),e.noAccessor||this.prototype.hasOwnProperty(t))return;const r="symbol"==typeof t?Symbol():"__"+t,i=this.getPropertyDescriptor(t,r,e);void 0!==i&&Object.defineProperty(this.prototype,t,i)}static getPropertyDescriptor(t,e,r){return{get(){return this[e]},set(s){const i=this[t];this[e]=s,this.requestUpdateInternal(t,i,r)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this._classProperties&&this._classProperties.get(t)||s}static finalize(){const t=Object.getPrototypeOf(this);if(t.hasOwnProperty(i)||t.finalize(),this.finalized=!0,this._ensureClassProperties(),this._attributeToPropertyMap=new Map,this.hasOwnProperty(JSCompiler_renameProperty("properties",this))){const t=this.properties,e=[...Object.getOwnPropertyNames(t),..."function"==typeof Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(t):[]];for(const r of e)this.createProperty(r,t[r])}}static _attributeNameForProperty(t,e){const r=e.attribute;return!1===r?void 0:"string"==typeof r?r:"string"==typeof t?t.toLowerCase():void 0}static _valueHasChanged(t,e,s=r){return s(t,e)}static _propertyValueFromAttribute(t,r){const s=r.type,i=r.converter||e,a="function"==typeof i?i:i.fromAttribute;return a?a(t,s):t}static _propertyValueToAttribute(t,r){if(void 0===r.reflect)return;const s=r.type,i=r.converter;return(i&&i.toAttribute||e.toAttribute)(t,s)}initialize(){this._updateState=0,this._updatePromise=new Promise(t=>this._enableUpdatingResolver=t),this._changedProperties=new Map,this._saveInstanceProperties(),this.requestUpdateInternal()}_saveInstanceProperties(){this.constructor._classProperties.forEach((t,e)=>{if(this.hasOwnProperty(e)){const t=this[e];delete this[e],this._instanceProperties||(this._instanceProperties=new Map),this._instanceProperties.set(e,t)}})}_applyInstanceProperties(){this._instanceProperties.forEach((t,e)=>this[e]=t),this._instanceProperties=void 0}connectedCallback(){this.enableUpdating()}enableUpdating(){void 0!==this._enableUpdatingResolver&&(this._enableUpdatingResolver(),this._enableUpdatingResolver=void 0)}disconnectedCallback(){}attributeChangedCallback(t,e,r){e!==r&&this._attributeToProperty(t,r)}_propertyToAttribute(t,e,r=s){const i=this.constructor,a=i._attributeNameForProperty(t,r);if(void 0!==a){const t=i._propertyValueToAttribute(e,r);if(void 0===t)return;this._updateState=8|this._updateState,null==t?this.removeAttribute(a):this.setAttribute(a,t),this._updateState=-9&this._updateState}}_attributeToProperty(t,e){if(8&this._updateState)return;const r=this.constructor,s=r._attributeToPropertyMap.get(t);if(void 0!==s){const t=r.getPropertyOptions(s);this._updateState=16|this._updateState,this[s]=r._propertyValueFromAttribute(e,t),this._updateState=-17&this._updateState}}requestUpdateInternal(t,e,r){let s=!0;if(void 0!==t){const i=this.constructor;r=r||i.getPropertyOptions(t),i._valueHasChanged(this[t],e,r.hasChanged)?(this._changedProperties.has(t)||this._changedProperties.set(t,e),!0!==r.reflect||16&this._updateState||(void 0===this._reflectingProperties&&(this._reflectingProperties=new Map),this._reflectingProperties.set(t,r))):s=!1}!this._hasRequestedUpdate&&s&&(this._updatePromise=this._enqueueUpdate())}requestUpdate(t,e){return this.requestUpdateInternal(t,e),this.updateComplete}async _enqueueUpdate(){this._updateState=4|this._updateState;try{await this._updatePromise}catch(t){}const t=this.performUpdate();return null!=t&&await t,!this._hasRequestedUpdate}get _hasRequestedUpdate(){return 4&this._updateState}get hasUpdated(){return 1&this._updateState}performUpdate(){if(!this._hasRequestedUpdate)return;this._instanceProperties&&this._applyInstanceProperties();let t=!1;const e=this._changedProperties;try{t=this.shouldUpdate(e),t?this.update(e):this._markUpdated()}catch(e){throw t=!1,this._markUpdated(),e}t&&(1&this._updateState||(this._updateState=1|this._updateState,this.firstUpdated(e)),this.updated(e))}_markUpdated(){this._changedProperties=new Map,this._updateState=-5&this._updateState}get updateComplete(){return this._getUpdateComplete()}_getUpdateComplete(){return this._updatePromise}shouldUpdate(t){return!0}update(t){void 0!==this._reflectingProperties&&this._reflectingProperties.size>0&&(this._reflectingProperties.forEach((t,e)=>this._propertyToAttribute(e,this[e],t)),this._reflectingProperties=void 0),this._markUpdated()}updated(t){}firstUpdated(t){}}a.finalized=!0,t.UpdatingElement=a,t.defaultConverter=e,t.notEqual=r,Object.defineProperty(t,"__esModule",{value:!0})}));
diff --git a/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-element/lit-element.js b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-element/lit-element.js
new file mode 100644
index 0000000000000000000000000000000000000000..0db5bc162e9c1ffea550b6cc40a8fa1576459ac7
--- /dev/null
+++ b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-element/lit-element.js
@@ -0,0 +1,14 @@
+define(["exports","lit-html/lib/shady-render","./lib/updating-element","./lib/decorators","lit-html","./lib/css-tag"],(function(e,t,s,n,r,o){"use strict";
+/**
+     * @license
+     * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+     * This code may only be used under the BSD style license found at
+     * http://polymer.github.io/LICENSE.txt
+     * The complete set of authors may be found at
+     * http://polymer.github.io/AUTHORS.txt
+     * The complete set of contributors may be found at
+     * http://polymer.github.io/CONTRIBUTORS.txt
+     * Code distributed by Google as part of the polymer project is also
+     * subject to an additional IP rights grant found at
+     * http://polymer.github.io/PATENTS.txt
+     */(window.litElementVersions||(window.litElementVersions=[])).push("2.4.0");const i={};class l extends s.UpdatingElement{static getStyles(){return this.styles}static _getUniqueStyles(){if(this.hasOwnProperty(JSCompiler_renameProperty("_styles",this)))return;const e=this.getStyles();if(Array.isArray(e)){const t=(e,s)=>e.reduceRight((e,s)=>Array.isArray(s)?t(s,e):(e.add(s),e),s),s=t(e,new Set),n=[];s.forEach(e=>n.unshift(e)),this._styles=n}else this._styles=void 0===e?[]:[e];this._styles=this._styles.map(e=>{if(e instanceof CSSStyleSheet&&!o.supportsAdoptingStyleSheets){const t=Array.prototype.slice.call(e.cssRules).reduce((e,t)=>e+t.cssText,"");return o.unsafeCSS(t)}return e})}initialize(){super.initialize(),this.constructor._getUniqueStyles(),this.renderRoot=this.createRenderRoot(),window.ShadowRoot&&this.renderRoot instanceof window.ShadowRoot&&this.adoptStyles()}createRenderRoot(){return this.attachShadow({mode:"open"})}adoptStyles(){const e=this.constructor._styles;0!==e.length&&(void 0===window.ShadyCSS||window.ShadyCSS.nativeShadow?o.supportsAdoptingStyleSheets?this.renderRoot.adoptedStyleSheets=e.map(e=>e instanceof CSSStyleSheet?e:e.styleSheet):this._needsShimAdoptedStyleSheets=!0:window.ShadyCSS.ScopingShim.prepareAdoptedCssText(e.map(e=>e.cssText),this.localName))}connectedCallback(){super.connectedCallback(),this.hasUpdated&&void 0!==window.ShadyCSS&&window.ShadyCSS.styleElement(this)}update(e){const t=this.render();super.update(e),t!==i&&this.constructor.render(t,this.renderRoot,{scopeName:this.localName,eventContext:this}),this._needsShimAdoptedStyleSheets&&(this._needsShimAdoptedStyleSheets=!1,this.constructor._styles.forEach(e=>{const t=document.createElement("style");t.textContent=e.cssText,this.renderRoot.appendChild(t)}))}render(){return i}}l.finalized=!0,l.render=t.render,e.UpdatingElement=s.UpdatingElement,e.defaultConverter=s.defaultConverter,e.notEqual=s.notEqual,e.customElement=n.customElement,e.eventOptions=n.eventOptions,e.internalProperty=n.internalProperty,e.property=n.property,e.query=n.query,e.queryAll=n.queryAll,e.queryAssignedNodes=n.queryAssignedNodes,e.queryAsync=n.queryAsync,Object.defineProperty(e,"SVGTemplateResult",{enumerable:!0,get:function(){return r.SVGTemplateResult}}),Object.defineProperty(e,"TemplateResult",{enumerable:!0,get:function(){return r.TemplateResult}}),Object.defineProperty(e,"html",{enumerable:!0,get:function(){return r.html}}),Object.defineProperty(e,"svg",{enumerable:!0,get:function(){return r.svg}}),e.CSSResult=o.CSSResult,e.css=o.css,e.supportsAdoptingStyleSheets=o.supportsAdoptingStyleSheets,e.unsafeCSS=o.unsafeCSS,e.LitElement=l,Object.defineProperty(e,"__esModule",{value:!0})}));
diff --git a/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/async-append.js b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/async-append.js
new file mode 100644
index 0000000000000000000000000000000000000000..a2e69420eb4da0bf4df28eca0b0e0821b2c833d6
--- /dev/null
+++ b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/async-append.js
@@ -0,0 +1,14 @@
+define(["exports","../lib/directive","../lib/template","../lib/parts","../lit-html"],(function(e,t,r,n,o){"use strict";
+/**
+     * @license
+     * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+     * This code may only be used under the BSD style license found at
+     * http://polymer.github.io/LICENSE.txt
+     * The complete set of authors may be found at
+     * http://polymer.github.io/AUTHORS.txt
+     * The complete set of contributors may be found at
+     * http://polymer.github.io/CONTRIBUTORS.txt
+     * Code distributed by Google as part of the polymer project is also
+     * subject to an additional IP rights grant found at
+     * http://polymer.github.io/PATENTS.txt
+     */var a=function(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t,r=e[Symbol.asyncIterator];return r?r.call(e):(e="function"==typeof __values?__values(e):e[Symbol.iterator](),t={},n("next"),n("throw"),n("return"),t[Symbol.asyncIterator]=function(){return this},t);function n(r){t[r]=e[r]&&function(t){return new Promise((function(n,o){(function(e,t,r,n){Promise.resolve(n).then((function(t){e({value:t,done:r})}),t)})(n,o,(t=e[r](t)).done,t.value)}))}}};const i=t.directive((e,t)=>async o=>{var i,l;if(!(o instanceof n.NodePart))throw new Error("asyncAppend can only be used in text bindings");if(e===o.value)return;let c;o.value=e;let d=0;try{for(var s,u=a(e);!(s=await u.next()).done;){let a=s.value;if(o.value!==e)break;0===d&&o.clear(),void 0!==t&&(a=t(a,d));let i=o.startNode;void 0!==c&&(i=r.createMarker(),c.endNode=i,o.endNode.parentNode.insertBefore(i,o.endNode)),c=new n.NodePart(o.options),c.insertAfterNode(i),c.setValue(a),c.commit(),d++}}catch(e){i={error:e}}finally{try{s&&!s.done&&(l=u.return)&&await l.call(u)}finally{if(i)throw i.error}}});e.asyncAppend=i,Object.defineProperty(e,"__esModule",{value:!0})}));
diff --git a/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/async-replace.js b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/async-replace.js
new file mode 100644
index 0000000000000000000000000000000000000000..d9f3c76783c14b8e4ba8ddb45c04b1f5d4483428
--- /dev/null
+++ b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/async-replace.js
@@ -0,0 +1,14 @@
+define(["exports","../lib/directive","../lib/parts","../lit-html"],(function(e,t,n,r){"use strict";
+/**
+     * @license
+     * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+     * This code may only be used under the BSD style license found at
+     * http://polymer.github.io/LICENSE.txt
+     * The complete set of authors may be found at
+     * http://polymer.github.io/AUTHORS.txt
+     * The complete set of contributors may be found at
+     * http://polymer.github.io/CONTRIBUTORS.txt
+     * Code distributed by Google as part of the polymer project is also
+     * subject to an additional IP rights grant found at
+     * http://polymer.github.io/PATENTS.txt
+     */var o=function(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t,n=e[Symbol.asyncIterator];return n?n.call(e):(e="function"==typeof __values?__values(e):e[Symbol.iterator](),t={},r("next"),r("throw"),r("return"),t[Symbol.asyncIterator]=function(){return this},t);function r(n){t[n]=e[n]&&function(t){return new Promise((function(r,o){(function(e,t,n,r){Promise.resolve(r).then((function(t){e({value:t,done:n})}),t)})(r,o,(t=e[n](t)).done,t.value)}))}}};const a=t.directive((e,t)=>async r=>{var a,i;if(!(r instanceof n.NodePart))throw new Error("asyncReplace can only be used in text bindings");if(e===r.value)return;const l=new n.NodePart(r.options);r.value=e;let c=0;try{for(var u,s=o(e);!(u=await s.next()).done;){let n=u.value;if(r.value!==e)break;0===c&&(r.clear(),l.appendIntoPart(r)),void 0!==t&&(n=t(n,c)),l.setValue(n),l.commit(),c++}}catch(e){a={error:e}}finally{try{u&&!u.done&&(i=s.return)&&await i.call(s)}finally{if(a)throw a.error}}});e.asyncReplace=a,Object.defineProperty(e,"__esModule",{value:!0})}));
diff --git a/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/cache.js b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/cache.js
new file mode 100644
index 0000000000000000000000000000000000000000..8f5a0f6d5e7c643c14e42c62293ffda5fa432b1d
--- /dev/null
+++ b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/cache.js
@@ -0,0 +1,14 @@
+define(["exports","../lib/directive","../lib/dom","../lib/template-instance","../lib/template-result","../lib/parts","../lit-html"],(function(e,t,n,a,i,o,s){"use strict";
+/**
+     * @license
+     * Copyright (c) 2018 The Polymer Project Authors. All rights reserved.
+     * This code may only be used under the BSD style license found at
+     * http://polymer.github.io/LICENSE.txt
+     * The complete set of authors may be found at
+     * http://polymer.github.io/AUTHORS.txt
+     * The complete set of contributors may be found at
+     * http://polymer.github.io/CONTRIBUTORS.txt
+     * Code distributed by Google as part of the polymer project is also
+     * subject to an additional IP rights grant found at
+     * http://polymer.github.io/PATENTS.txt
+     */const l=new WeakMap,c=t.directive(e=>t=>{if(!(t instanceof o.NodePart))throw new Error("cache can only be used in text bindings");let s=l.get(t);void 0===s&&(s=new WeakMap,l.set(t,s));const c=t.value;if(c instanceof a.TemplateInstance){if(e instanceof i.TemplateResult&&c.template===t.options.templateFactory(e))return void t.setValue(e);{let e=s.get(c.template);void 0===e&&(e={instance:c,nodes:document.createDocumentFragment()},s.set(c.template,e)),n.reparentNodes(e.nodes,t.startNode.nextSibling,t.endNode)}}if(e instanceof i.TemplateResult){const n=t.options.templateFactory(e),a=s.get(n);void 0!==a&&(t.setValue(a.nodes),t.commit(),t.value=a.instance)}t.setValue(e)});e.cache=c,Object.defineProperty(e,"__esModule",{value:!0})}));
diff --git a/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/class-map.js b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/class-map.js
new file mode 100644
index 0000000000000000000000000000000000000000..63bfea07b766840cdacc8ab07af2aa6e581c99c3
--- /dev/null
+++ b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/class-map.js
@@ -0,0 +1,14 @@
+define(["exports","../lib/directive","../lib/parts","../lit-html"],(function(t,e,s,i){"use strict";
+/**
+     * @license
+     * Copyright (c) 2018 The Polymer Project Authors. All rights reserved.
+     * This code may only be used under the BSD style license found at
+     * http://polymer.github.io/LICENSE.txt
+     * The complete set of authors may be found at
+     * http://polymer.github.io/AUTHORS.txt
+     * The complete set of contributors may be found at
+     * http://polymer.github.io/CONTRIBUTORS.txt
+     * Code distributed by Google as part of the polymer project is also
+     * subject to an additional IP rights grant found at
+     * http://polymer.github.io/PATENTS.txt
+     */class c{constructor(t){this.classes=new Set,this.changed=!1,this.element=t;const e=(t.getAttribute("class")||"").split(/\s+/);for(const t of e)this.classes.add(t)}add(t){this.classes.add(t),this.changed=!0}remove(t){this.classes.delete(t),this.changed=!0}commit(){if(this.changed){let t="";this.classes.forEach(e=>t+=e+" "),this.element.setAttribute("class",t)}}}const a=new WeakMap,n=e.directive(t=>e=>{if(!(e instanceof s.AttributePart)||e instanceof s.PropertyPart||"class"!==e.committer.name||e.committer.parts.length>1)throw new Error("The `classMap` directive must be used in the `class` attribute and must be the only part in the attribute.");const{committer:i}=e,{element:n}=i;let o=a.get(e);void 0===o&&(n.setAttribute("class",i.strings.join(" ")),a.set(e,o=new Set));const r=n.classList||new c(n);o.forEach(e=>{e in t||(r.remove(e),o.delete(e))});for(const e in t){const s=t[e];s!=o.has(e)&&(s?(r.add(e),o.add(e)):(r.remove(e),o.delete(e)))}"function"==typeof r.commit&&r.commit()});t.classMap=n,Object.defineProperty(t,"__esModule",{value:!0})}));
diff --git a/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/guard.js b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/guard.js
new file mode 100644
index 0000000000000000000000000000000000000000..d77a4500b3bdc1430015730b059757df64c6b855
--- /dev/null
+++ b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/guard.js
@@ -0,0 +1,14 @@
+define(["exports","../lib/directive","../lit-html"],(function(e,r,t){"use strict";
+/**
+     * @license
+     * Copyright (c) 2018 The Polymer Project Authors. All rights reserved.
+     * This code may only be used under the BSD style license found at
+     * http://polymer.github.io/LICENSE.txt
+     * The complete set of authors may be found at
+     * http://polymer.github.io/AUTHORS.txt
+     * The complete set of contributors may be found at
+     * http://polymer.github.io/CONTRIBUTORS.txt
+     * Code distributed by Google as part of the polymer project is also
+     * subject to an additional IP rights grant found at
+     * http://polymer.github.io/PATENTS.txt
+     */const i=new WeakMap,a=r.directive((e,r)=>t=>{const a=i.get(t);if(Array.isArray(e)){if(Array.isArray(a)&&a.length===e.length&&e.every((e,r)=>e===a[r]))return}else if(a===e&&(void 0!==e||i.has(t)))return;t.setValue(r()),i.set(t,Array.isArray(e)?Array.from(e):e)});e.guard=a,Object.defineProperty(e,"__esModule",{value:!0})}));
diff --git a/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/if-defined.js b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/if-defined.js
new file mode 100644
index 0000000000000000000000000000000000000000..409278ed4c9737f1d0a2043cfa607a1e27918a8f
--- /dev/null
+++ b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/if-defined.js
@@ -0,0 +1,14 @@
+define(["exports","../lib/directive","../lib/parts","../lit-html"],(function(e,t,i,n){"use strict";
+/**
+     * @license
+     * Copyright (c) 2018 The Polymer Project Authors. All rights reserved.
+     * This code may only be used under the BSD style license found at
+     * http://polymer.github.io/LICENSE.txt
+     * The complete set of authors may be found at
+     * http://polymer.github.io/AUTHORS.txt
+     * The complete set of contributors may be found at
+     * http://polymer.github.io/CONTRIBUTORS.txt
+     * Code distributed by Google as part of the polymer project is also
+     * subject to an additional IP rights grant found at
+     * http://polymer.github.io/PATENTS.txt
+     */const o=new WeakMap,r=t.directive(e=>t=>{const n=o.get(t);if(void 0===e&&t instanceof i.AttributePart){if(void 0!==n||!o.has(t)){const e=t.committer.name;t.committer.element.removeAttribute(e)}}else e!==n&&t.setValue(e);o.set(t,e)});e.ifDefined=r,Object.defineProperty(e,"__esModule",{value:!0})}));
diff --git a/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/live.js b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/live.js
new file mode 100644
index 0000000000000000000000000000000000000000..9af28b4160a5a7dfcc871bcfba27071976ebc9a1
--- /dev/null
+++ b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/live.js
@@ -0,0 +1,14 @@
+define(["exports","../lib/directive","../lib/parts","../lit-html"],(function(e,t,i,n){"use strict";
+/**
+     * @license
+     * Copyright (c) 2020 The Polymer Project Authors. All rights reserved.
+     * This code may only be used under the BSD style license found at
+     * http://polymer.github.io/LICENSE.txt
+     * The complete set of authors may be found at
+     * http://polymer.github.io/AUTHORS.txt
+     * The complete set of contributors may be found at
+     * http://polymer.github.io/CONTRIBUTORS.txt
+     * Code distributed by Google as part of the polymer project is also
+     * subject to an additional IP rights grant found at
+     * http://polymer.github.io/PATENTS.txt
+     */const r=t.directive(e=>t=>{let n;if(t instanceof i.EventPart||t instanceof i.NodePart)throw new Error("The `live` directive is not allowed on text or event bindings");if(t instanceof i.BooleanAttributePart)o(t.strings),n=t.element.hasAttribute(t.name),t.value=n;else{const{element:r,name:s,strings:a}=t.committer;if(o(a),t instanceof i.PropertyPart){if(n=r[s],n===e)return}else t instanceof i.AttributePart&&(n=r.getAttribute(s));if(n===String(e))return}t.setValue(e)}),o=e=>{if(2!==e.length||""!==e[0]||""!==e[1])throw new Error("`live` bindings can only contain a single expression")};e.live=r,Object.defineProperty(e,"__esModule",{value:!0})}));
diff --git a/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/repeat.js b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/repeat.js
new file mode 100644
index 0000000000000000000000000000000000000000..4c19005a91cbe48ea66451c13e4914a01c5e7be1
--- /dev/null
+++ b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/repeat.js
@@ -0,0 +1,14 @@
+define(["exports","../lib/directive","../lib/dom","../lib/template","../lib/parts","../lit-html"],(function(e,t,o,n,r,s){"use strict";
+/**
+     * @license
+     * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+     * This code may only be used under the BSD style license found at
+     * http://polymer.github.io/LICENSE.txt
+     * The complete set of authors may be found at
+     * http://polymer.github.io/AUTHORS.txt
+     * The complete set of contributors may be found at
+     * http://polymer.github.io/CONTRIBUTORS.txt
+     * Code distributed by Google as part of the polymer project is also
+     * subject to an additional IP rights grant found at
+     * http://polymer.github.io/PATENTS.txt
+     */const i=(e,t)=>{const o=e.startNode.parentNode,s=void 0===t?e.endNode:t.startNode,i=o.insertBefore(n.createMarker(),s);o.insertBefore(n.createMarker(),s);const l=new r.NodePart(e.options);return l.insertAfterNode(i),l},l=(e,t)=>(e.setValue(t),e.commit(),e),d=(e,t,n)=>{const r=e.startNode.parentNode,s=n?n.startNode:e.endNode,i=t.endNode.nextSibling;i!==s&&o.reparentNodes(r,t.startNode,i,s)},a=e=>{o.removeNodes(e.startNode.parentNode,e.startNode,e.endNode.nextSibling)},f=(e,t,o)=>{const n=new Map;for(let r=t;r<=o;r++)n.set(e[r],r);return n},c=new WeakMap,N=new WeakMap,u=t.directive((e,t,o)=>{let n;return void 0===o?o=t:void 0!==t&&(n=t),t=>{if(!(t instanceof r.NodePart))throw new Error("repeat can only be used in text bindings");const s=c.get(t)||[],u=N.get(t)||[],p=[],b=[],v=[];let g,h,m=0;for(const t of e)v[m]=n?n(t,m):m,b[m]=o(t,m),m++;let w=0,M=s.length-1,k=0,x=b.length-1;for(;w<=M&&k<=x;)if(null===s[w])w++;else if(null===s[M])M--;else if(u[w]===v[k])p[k]=l(s[w],b[k]),w++,k++;else if(u[M]===v[x])p[x]=l(s[M],b[x]),M--,x--;else if(u[w]===v[x])p[x]=l(s[w],b[x]),d(t,s[w],p[x+1]),w++,x--;else if(u[M]===v[k])p[k]=l(s[M],b[k]),d(t,s[M],s[w]),M--,k++;else if(void 0===g&&(g=f(v,k,x),h=f(u,w,M)),g.has(u[w]))if(g.has(u[M])){const e=h.get(v[k]),o=void 0!==e?s[e]:null;if(null===o){const e=i(t,s[w]);l(e,b[k]),p[k]=e}else p[k]=l(o,b[k]),d(t,o,s[w]),s[e]=null;k++}else a(s[M]),M--;else a(s[w]),w++;for(;k<=x;){const e=i(t,p[x+1]);l(e,b[k]),p[k++]=e}for(;w<=M;){const e=s[w++];null!==e&&a(e)}c.set(t,p),N.set(t,v)}});e.repeat=u,Object.defineProperty(e,"__esModule",{value:!0})}));
diff --git a/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/style-map.js b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/style-map.js
new file mode 100644
index 0000000000000000000000000000000000000000..7df67d1036a5906e3d2f90a117b8813d2727c0e1
--- /dev/null
+++ b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/style-map.js
@@ -0,0 +1,14 @@
+define(["exports","../lib/directive","../lib/parts","../lit-html"],(function(e,t,r,i){"use strict";
+/**
+     * @license
+     * Copyright (c) 2018 The Polymer Project Authors. All rights reserved.
+     * This code may only be used under the BSD style license found at
+     * http://polymer.github.io/LICENSE.txt
+     * The complete set of authors may be found at
+     * http://polymer.github.io/AUTHORS.txt
+     * The complete set of contributors may be found at
+     * http://polymer.github.io/CONTRIBUTORS.txt
+     * Code distributed by Google as part of the polymer project is also
+     * subject to an additional IP rights grant found at
+     * http://polymer.github.io/PATENTS.txt
+     */const n=new WeakMap,s=t.directive(e=>t=>{if(!(t instanceof r.AttributePart)||t instanceof r.PropertyPart||"style"!==t.committer.name||t.committer.parts.length>1)throw new Error("The `styleMap` directive must be used in the style attribute and must be the only part in the attribute.");const{committer:i}=t,{style:s}=i.element;let o=n.get(t);void 0===o&&(s.cssText=i.strings.join(" "),n.set(t,o=new Set)),o.forEach(t=>{t in e||(o.delete(t),-1===t.indexOf("-")?s[t]=null:s.removeProperty(t))});for(const t in e)o.add(t),-1===t.indexOf("-")?s[t]=e[t]:s.setProperty(t,e[t])});e.styleMap=s,Object.defineProperty(e,"__esModule",{value:!0})}));
diff --git a/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/template-content.js b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/template-content.js
new file mode 100644
index 0000000000000000000000000000000000000000..de2a61659d937e2f7f10b3b53f45a4430c7fb70a
--- /dev/null
+++ b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/template-content.js
@@ -0,0 +1,14 @@
+define(["exports","../lib/directive","../lib/parts","../lit-html"],(function(e,t,n,i){"use strict";
+/**
+     * @license
+     * Copyright (c) 2020 The Polymer Project Authors. All rights reserved.
+     * This code may only be used under the BSD style license found at
+     * http://polymer.github.io/LICENSE.txt
+     * The complete set of authors may be found at
+     * http://polymer.github.io/AUTHORS.txt
+     * The complete set of contributors may be found at
+     * http://polymer.github.io/CONTRIBUTORS.txt
+     * Code distributed by Google as part of the polymer project is also
+     * subject to an additional IP rights grant found at
+     * http://polymer.github.io/PATENTS.txt
+     */const o=new WeakMap,r=t.directive(e=>t=>{if(!(t instanceof n.NodePart))throw new Error("templateContent can only be used in text bindings");const i=o.get(t);if(void 0!==i&&e===i.template&&t.value===i.fragment)return;const r=document.importNode(e.content,!0);t.setValue(r),o.set(t,{template:e,fragment:r})});e.templateContent=r,Object.defineProperty(e,"__esModule",{value:!0})}));
diff --git a/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/unsafe-html.js b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/unsafe-html.js
new file mode 100644
index 0000000000000000000000000000000000000000..7590c4d5ccea766ce9f9763dced4cf36d6f3a269
--- /dev/null
+++ b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/unsafe-html.js
@@ -0,0 +1,14 @@
+define(["exports","../lib/directive","../lib/parts","../lit-html"],(function(e,t,n,i){"use strict";
+/**
+     * @license
+     * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+     * This code may only be used under the BSD style license found at
+     * http://polymer.github.io/LICENSE.txt
+     * The complete set of authors may be found at
+     * http://polymer.github.io/AUTHORS.txt
+     * The complete set of contributors may be found at
+     * http://polymer.github.io/CONTRIBUTORS.txt
+     * Code distributed by Google as part of the polymer project is also
+     * subject to an additional IP rights grant found at
+     * http://polymer.github.io/PATENTS.txt
+     */const r=new WeakMap,o=t.directive(e=>t=>{if(!(t instanceof n.NodePart))throw new Error("unsafeHTML can only be used in text bindings");const i=r.get(t);if(void 0!==i&&n.isPrimitive(e)&&e===i.value&&t.value===i.fragment)return;const o=document.createElement("template");o.innerHTML=e;const a=document.importNode(o.content,!0);t.setValue(a),r.set(t,{value:e,fragment:a})});e.unsafeHTML=o,Object.defineProperty(e,"__esModule",{value:!0})}));
diff --git a/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/unsafe-svg.js b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/unsafe-svg.js
new file mode 100644
index 0000000000000000000000000000000000000000..3ed8bbf6fc4a0e928306d3ff6948fddf030cc98e
--- /dev/null
+++ b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/unsafe-svg.js
@@ -0,0 +1,14 @@
+define(["exports","../lib/directive","../lib/dom","../lib/parts","../lit-html"],(function(e,t,n,i,r){"use strict";
+/**
+     * @license
+     * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+     * This code may only be used under the BSD style license found at
+     * http://polymer.github.io/LICENSE.txt
+     * The complete set of authors may be found at
+     * http://polymer.github.io/AUTHORS.txt
+     * The complete set of contributors may be found at
+     * http://polymer.github.io/CONTRIBUTORS.txt
+     * Code distributed by Google as part of the polymer project is also
+     * subject to an additional IP rights grant found at
+     * http://polymer.github.io/PATENTS.txt
+     */const o=new WeakMap,s=window.navigator.userAgent.indexOf("Trident/")>0,d=t.directive(e=>t=>{if(!(t instanceof i.NodePart))throw new Error("unsafeSVG can only be used in text bindings");const r=o.get(t);if(void 0!==r&&i.isPrimitive(e)&&e===r.value&&t.value===r.fragment)return;const d=document.createElement("template"),a=d.content;let l;s?(d.innerHTML=`<svg>${e}</svg>`,l=a.firstChild):(l=document.createElementNS("http://www.w3.org/2000/svg","svg"),a.appendChild(l),l.innerHTML=e),a.removeChild(l),n.reparentNodes(a,l.firstChild);const c=document.importNode(a,!0);t.setValue(c),o.set(t,{value:e,fragment:c})});e.unsafeSVG=d,Object.defineProperty(e,"__esModule",{value:!0})}));
diff --git a/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/until.js b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/until.js
new file mode 100644
index 0000000000000000000000000000000000000000..d2243cbca8d939ce30c574e2cda80616465352c3
--- /dev/null
+++ b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/directives/until.js
@@ -0,0 +1,14 @@
+define(["exports","../lib/directive","../lib/parts","../lit-html"],(function(e,t,n,d){"use strict";
+/**
+     * @license
+     * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+     * This code may only be used under the BSD style license found at
+     * http://polymer.github.io/LICENSE.txt
+     * The complete set of authors may be found at
+     * http://polymer.github.io/AUTHORS.txt
+     * The complete set of contributors may be found at
+     * http://polymer.github.io/CONTRIBUTORS.txt
+     * Code distributed by Google as part of the polymer project is also
+     * subject to an additional IP rights grant found at
+     * http://polymer.github.io/PATENTS.txt
+     */const l=new WeakMap,s=2147483647,i=t.directive((...e)=>t=>{let d=l.get(t);void 0===d&&(d={lastRenderedIndex:s,values:[]},l.set(t,d));const i=d.values;let r=i.length;d.values=e;for(let l=0;l<e.length&&!(l>d.lastRenderedIndex);l++){const a=e[l];if(n.isPrimitive(a)||"function"!=typeof a.then){t.setValue(a),d.lastRenderedIndex=l;break}l<r&&a===i[l]||(d.lastRenderedIndex=s,r=0,Promise.resolve(a).then(e=>{const n=d.values.indexOf(a);n>-1&&n<d.lastRenderedIndex&&(d.lastRenderedIndex=n,t.setValue(e),t.commit())}))}});e.until=i,Object.defineProperty(e,"__esModule",{value:!0})}));
diff --git a/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/default-template-processor.js b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/default-template-processor.js
new file mode 100644
index 0000000000000000000000000000000000000000..8ef364477a8052a6859c66f27124fe53c0f74765
--- /dev/null
+++ b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/default-template-processor.js
@@ -0,0 +1,14 @@
+define(["exports","./parts"],(function(e,t){"use strict";
+/**
+     * @license
+     * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+     * This code may only be used under the BSD style license found at
+     * http://polymer.github.io/LICENSE.txt
+     * The complete set of authors may be found at
+     * http://polymer.github.io/AUTHORS.txt
+     * The complete set of contributors may be found at
+     * http://polymer.github.io/CONTRIBUTORS.txt
+     * Code distributed by Google as part of the polymer project is also
+     * subject to an additional IP rights grant found at
+     * http://polymer.github.io/PATENTS.txt
+     */class r{handleAttributeExpressions(e,r,n,s){const o=r[0];if("."===o){return new t.PropertyCommitter(e,r.slice(1),n).parts}if("@"===o)return[new t.EventPart(e,r.slice(1),s.eventContext)];if("?"===o)return[new t.BooleanAttributePart(e,r.slice(1),n)];return new t.AttributeCommitter(e,r,n).parts}handleTextExpression(e){return new t.NodePart(e)}}const n=new r;e.DefaultTemplateProcessor=r,e.defaultTemplateProcessor=n,Object.defineProperty(e,"__esModule",{value:!0})}));
diff --git a/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/directive.js b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/directive.js
new file mode 100644
index 0000000000000000000000000000000000000000..a0c903b6b9f1b87125419091ce46d834ee2db8a6
--- /dev/null
+++ b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/directive.js
@@ -0,0 +1,14 @@
+define(["exports"],(function(e){"use strict";
+/**
+     * @license
+     * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+     * This code may only be used under the BSD style license found at
+     * http://polymer.github.io/LICENSE.txt
+     * The complete set of authors may be found at
+     * http://polymer.github.io/AUTHORS.txt
+     * The complete set of contributors may be found at
+     * http://polymer.github.io/CONTRIBUTORS.txt
+     * Code distributed by Google as part of the polymer project is also
+     * subject to an additional IP rights grant found at
+     * http://polymer.github.io/PATENTS.txt
+     */const t=new WeakMap;e.directive=e=>(...i)=>{const n=e(...i);return t.set(n,!0),n},e.isDirective=e=>"function"==typeof e&&t.has(e),Object.defineProperty(e,"__esModule",{value:!0})}));
diff --git a/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/dom.js b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/dom.js
new file mode 100644
index 0000000000000000000000000000000000000000..8223065df3d3325ddaea19effda44f23553a8e76
--- /dev/null
+++ b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/dom.js
@@ -0,0 +1,14 @@
+define(["exports"],(function(e){"use strict";
+/**
+     * @license
+     * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+     * This code may only be used under the BSD style license found at
+     * http://polymer.github.io/LICENSE.txt
+     * The complete set of authors may be found at
+     * http://polymer.github.io/AUTHORS.txt
+     * The complete set of contributors may be found at
+     * http://polymer.github.io/CONTRIBUTORS.txt
+     * Code distributed by Google as part of the polymer project is also
+     * subject to an additional IP rights grant found at
+     * http://polymer.github.io/PATENTS.txt
+     */const l="undefined"!=typeof window&&null!=window.customElements&&void 0!==window.customElements.polyfillWrapFlushCallback;e.isCEPolyfill=l,e.removeNodes=(e,l,n=null)=>{for(;l!==n;){const n=l.nextSibling;e.removeChild(l),l=n}},e.reparentNodes=(e,l,n=null,o=null)=>{for(;l!==n;){const n=l.nextSibling;e.insertBefore(l,o),l=n}},Object.defineProperty(e,"__esModule",{value:!0})}));
diff --git a/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/modify-template.js b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/modify-template.js
new file mode 100644
index 0000000000000000000000000000000000000000..d2e8961b37186c8a15f423c1baebc8b1d60664e5
--- /dev/null
+++ b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/modify-template.js
@@ -0,0 +1,14 @@
+define(["exports","./template"],(function(e,n){"use strict";
+/**
+     * @license
+     * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+     * This code may only be used under the BSD style license found at
+     * http://polymer.github.io/LICENSE.txt
+     * The complete set of authors may be found at
+     * http://polymer.github.io/AUTHORS.txt
+     * The complete set of contributors may be found at
+     * http://polymer.github.io/CONTRIBUTORS.txt
+     * Code distributed by Google as part of the polymer project is also
+     * subject to an additional IP rights grant found at
+     * http://polymer.github.io/PATENTS.txt
+     */const t=e=>{let n=11===e.nodeType?0:1;const t=document.createTreeWalker(e,133,null,!1);for(;t.nextNode();)n++;return n},r=(e,t=-1)=>{for(let r=t+1;r<e.length;r++){const t=e[r];if(n.isTemplatePartActive(t))return r}return-1};e.insertNodeIntoTemplate=function(e,n,o=null){const{element:{content:l},parts:u}=e;if(null==o)return void l.appendChild(n);const d=document.createTreeWalker(l,133,null,!1);let c=r(u),i=0,s=-1;for(;d.nextNode();){s++;for(d.currentNode===o&&(i=t(n),o.parentNode.insertBefore(n,o));-1!==c&&u[c].index===s;){if(i>0){for(;-1!==c;)u[c].index+=i,c=r(u,c);return}c=r(u,c)}}},e.removeNodesFromTemplate=function(e,n){const{element:{content:t},parts:o}=e,l=document.createTreeWalker(t,133,null,!1);let u=r(o),d=o[u],c=-1,i=0;const s=[];let a=null;for(;l.nextNode();){c++;const e=l.currentNode;for(e.previousSibling===a&&(a=null),n.has(e)&&(s.push(e),null===a&&(a=e)),null!==a&&i++;void 0!==d&&d.index===c;)d.index=null!==a?-1:d.index-i,u=r(o,u),d=o[u]}s.forEach(e=>e.parentNode.removeChild(e))},Object.defineProperty(e,"__esModule",{value:!0})}));
diff --git a/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/part.js b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/part.js
new file mode 100644
index 0000000000000000000000000000000000000000..51c3f5ed8a53e03ff12c90641d9d1ebc20eb50e1
--- /dev/null
+++ b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/part.js
@@ -0,0 +1,14 @@
+define(["exports"],(function(e){"use strict";
+/**
+	 * @license
+	 * Copyright (c) 2018 The Polymer Project Authors. All rights reserved.
+	 * This code may only be used under the BSD style license found at
+	 * http://polymer.github.io/LICENSE.txt
+	 * The complete set of authors may be found at
+	 * http://polymer.github.io/AUTHORS.txt
+	 * The complete set of contributors may be found at
+	 * http://polymer.github.io/CONTRIBUTORS.txt
+	 * Code distributed by Google as part of the polymer project is also
+	 * subject to an additional IP rights grant found at
+	 * http://polymer.github.io/PATENTS.txt
+	 */e.noChange={},e.nothing={},Object.defineProperty(e,"__esModule",{value:!0})}));
diff --git a/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/parts.js b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/parts.js
new file mode 100644
index 0000000000000000000000000000000000000000..8d744b1340bd0e6f74d6928f1266073befae402c
--- /dev/null
+++ b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/parts.js
@@ -0,0 +1,14 @@
+define(["exports","./directive","./dom","./part","./template","./template-instance","./template-result"],(function(t,e,i,s,n,a,o){"use strict";
+/**
+     * @license
+     * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+     * This code may only be used under the BSD style license found at
+     * http://polymer.github.io/LICENSE.txt
+     * The complete set of authors may be found at
+     * http://polymer.github.io/AUTHORS.txt
+     * The complete set of contributors may be found at
+     * http://polymer.github.io/CONTRIBUTORS.txt
+     * Code distributed by Google as part of the polymer project is also
+     * subject to an additional IP rights grant found at
+     * http://polymer.github.io/PATENTS.txt
+     */const r=t=>null===t||!("object"==typeof t||"function"==typeof t),h=t=>Array.isArray(t)||!(!t||!t[Symbol.iterator]);class l{constructor(t,e,i){this.dirty=!0,this.element=t,this.name=e,this.strings=i,this.parts=[];for(let t=0;t<i.length-1;t++)this.parts[t]=this._createPart()}_createPart(){return new u(this)}_getValue(){const t=this.strings,e=t.length-1,i=this.parts;if(1===e&&""===t[0]&&""===t[1]){const t=i[0].value;if("symbol"==typeof t)return String(t);if("string"==typeof t||!h(t))return t}let s="";for(let n=0;n<e;n++){s+=t[n];const e=i[n];if(void 0!==e){const t=e.value;if(r(t)||!h(t))s+="string"==typeof t?t:String(t);else for(const e of t)s+="string"==typeof e?e:String(e)}}return s+=t[e],s}commit(){this.dirty&&(this.dirty=!1,this.element.setAttribute(this.name,this._getValue()))}}class u{constructor(t){this.value=void 0,this.committer=t}setValue(t){t===s.noChange||r(t)&&t===this.value||(this.value=t,e.isDirective(t)||(this.committer.dirty=!0))}commit(){for(;e.isDirective(this.value);){const t=this.value;this.value=s.noChange,t(this)}this.value!==s.noChange&&this.committer.commit()}}class d{constructor(t){this.value=void 0,this.__pendingValue=void 0,this.options=t}appendInto(t){this.startNode=t.appendChild(n.createMarker()),this.endNode=t.appendChild(n.createMarker())}insertAfterNode(t){this.startNode=t,this.endNode=t.nextSibling}appendIntoPart(t){t.__insert(this.startNode=n.createMarker()),t.__insert(this.endNode=n.createMarker())}insertAfterPart(t){t.__insert(this.startNode=n.createMarker()),this.endNode=t.endNode,t.endNode=this.startNode}setValue(t){this.__pendingValue=t}commit(){if(null===this.startNode.parentNode)return;for(;e.isDirective(this.__pendingValue);){const t=this.__pendingValue;this.__pendingValue=s.noChange,t(this)}const t=this.__pendingValue;t!==s.noChange&&(r(t)?t!==this.value&&this.__commitText(t):t instanceof o.TemplateResult?this.__commitTemplateResult(t):t instanceof Node?this.__commitNode(t):h(t)?this.__commitIterable(t):t===s.nothing?(this.value=s.nothing,this.clear()):this.__commitText(t))}__insert(t){this.endNode.parentNode.insertBefore(t,this.endNode)}__commitNode(t){this.value!==t&&(this.clear(),this.__insert(t),this.value=t)}__commitText(t){const e=this.startNode.nextSibling,i="string"==typeof(t=null==t?"":t)?t:String(t);e===this.endNode.previousSibling&&3===e.nodeType?e.data=i:this.__commitNode(document.createTextNode(i)),this.value=t}__commitTemplateResult(t){const e=this.options.templateFactory(t);if(this.value instanceof a.TemplateInstance&&this.value.template===e)this.value.update(t.values);else{const i=new a.TemplateInstance(e,t.processor,this.options),s=i._clone();i.update(t.values),this.__commitNode(s),this.value=i}}__commitIterable(t){Array.isArray(this.value)||(this.value=[],this.clear());const e=this.value;let i,s=0;for(const n of t)i=e[s],void 0===i&&(i=new d(this.options),e.push(i),0===s?i.appendIntoPart(this):i.insertAfterPart(e[s-1])),i.setValue(n),i.commit(),s++;s<e.length&&(e.length=s,this.clear(i&&i.endNode))}clear(t=this.startNode){i.removeNodes(this.startNode.parentNode,t.nextSibling,this.endNode)}}class c extends u{}let _=!1;(()=>{try{const t={get capture(){return _=!0,!1}};window.addEventListener("test",t,t),window.removeEventListener("test",t,t)}catch(t){}})();const p=t=>t&&(_?{capture:t.capture,passive:t.passive,once:t.once}:t.capture);t.AttributeCommitter=l,t.AttributePart=u,t.BooleanAttributePart=class{constructor(t,e,i){if(this.value=void 0,this.__pendingValue=void 0,2!==i.length||""!==i[0]||""!==i[1])throw new Error("Boolean attributes can only contain a single expression");this.element=t,this.name=e,this.strings=i}setValue(t){this.__pendingValue=t}commit(){for(;e.isDirective(this.__pendingValue);){const t=this.__pendingValue;this.__pendingValue=s.noChange,t(this)}if(this.__pendingValue===s.noChange)return;const t=!!this.__pendingValue;this.value!==t&&(t?this.element.setAttribute(this.name,""):this.element.removeAttribute(this.name),this.value=t),this.__pendingValue=s.noChange}},t.EventPart=class{constructor(t,e,i){this.value=void 0,this.__pendingValue=void 0,this.element=t,this.eventName=e,this.eventContext=i,this.__boundHandleEvent=t=>this.handleEvent(t)}setValue(t){this.__pendingValue=t}commit(){for(;e.isDirective(this.__pendingValue);){const t=this.__pendingValue;this.__pendingValue=s.noChange,t(this)}if(this.__pendingValue===s.noChange)return;const t=this.__pendingValue,i=this.value,n=null==t||null!=i&&(t.capture!==i.capture||t.once!==i.once||t.passive!==i.passive),a=null!=t&&(null==i||n);n&&this.element.removeEventListener(this.eventName,this.__boundHandleEvent,this.__options),a&&(this.__options=p(t),this.element.addEventListener(this.eventName,this.__boundHandleEvent,this.__options)),this.value=t,this.__pendingValue=s.noChange}handleEvent(t){"function"==typeof this.value?this.value.call(this.eventContext||this.element,t):this.value.handleEvent(t)}},t.NodePart=d,t.PropertyCommitter=class extends l{constructor(t,e,i){super(t,e,i),this.single=2===i.length&&""===i[0]&&""===i[1]}_createPart(){return new c(this)}_getValue(){return this.single?this.parts[0].value:super._getValue()}commit(){this.dirty&&(this.dirty=!1,this.element[this.name]=this._getValue())}},t.PropertyPart=c,t.isIterable=h,t.isPrimitive=r,Object.defineProperty(t,"__esModule",{value:!0})}));
diff --git a/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/render.js b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/render.js
new file mode 100644
index 0000000000000000000000000000000000000000..5fa5dea466280e0614c0437f8ae29bace9c62fe7
--- /dev/null
+++ b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/render.js
@@ -0,0 +1,14 @@
+define(["exports","./dom","./parts","./template-factory"],(function(e,t,a,o){"use strict";
+/**
+     * @license
+     * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+     * This code may only be used under the BSD style license found at
+     * http://polymer.github.io/LICENSE.txt
+     * The complete set of authors may be found at
+     * http://polymer.github.io/AUTHORS.txt
+     * The complete set of contributors may be found at
+     * http://polymer.github.io/CONTRIBUTORS.txt
+     * Code distributed by Google as part of the polymer project is also
+     * subject to an additional IP rights grant found at
+     * http://polymer.github.io/PATENTS.txt
+     */const r=new WeakMap;e.parts=r,e.render=(e,s,n)=>{let d=r.get(s);void 0===d&&(t.removeNodes(s,s.firstChild),r.set(s,d=new a.NodePart(Object.assign({templateFactory:o.templateFactory},n))),d.appendInto(s)),d.setValue(e),d.commit()},Object.defineProperty(e,"__esModule",{value:!0})}));
diff --git a/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/shady-render.js b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/shady-render.js
new file mode 100644
index 0000000000000000000000000000000000000000..d8833823a185cffc30708711a91e06cfd82611ad
--- /dev/null
+++ b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/shady-render.js
@@ -0,0 +1,14 @@
+define(["exports","./dom","./template","./template-instance","./template-result","./template-factory","./render","../lit-html","./modify-template"],(function(e,t,n,o,r,s,a,l,d){"use strict";
+/**
+     * @license
+     * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+     * This code may only be used under the BSD style license found at
+     * http://polymer.github.io/LICENSE.txt
+     * The complete set of authors may be found at
+     * http://polymer.github.io/AUTHORS.txt
+     * The complete set of contributors may be found at
+     * http://polymer.github.io/CONTRIBUTORS.txt
+     * Code distributed by Google as part of the polymer project is also
+     * subject to an additional IP rights grant found at
+     * http://polymer.github.io/PATENTS.txt
+     */const i=(e,t)=>`${e}--${t}`;let m=!0;void 0===window.ShadyCSS?m=!1:void 0===window.ShadyCSS.prepareTemplateDom&&(console.warn("Incompatible ShadyCSS version detected. Please update to at least @webcomponents/webcomponentsjs@2.0.2 and @webcomponents/shadycss@1.3.1."),m=!1);const c=e=>t=>{const o=i(t.type,e);let r=s.templateCaches.get(o);void 0===r&&(r={stringsArray:new WeakMap,keyString:new Map},s.templateCaches.set(o,r));let a=r.stringsArray.get(t.strings);if(void 0!==a)return a;const l=t.strings.join(n.marker);if(a=r.keyString.get(l),void 0===a){const o=t.getTemplateElement();m&&window.ShadyCSS.prepareTemplateDom(o,e),a=new n.Template(t,o),r.keyString.set(l,a)}return r.stringsArray.set(t.strings,a),a},p=["html","svg"],S=new Set,y=(e,t,n)=>{S.add(e);const o=n?n.element:document.createElement("template"),r=t.querySelectorAll("style"),{length:a}=r;if(0===a)return void window.ShadyCSS.prepareTemplateStyles(o,e);const l=document.createElement("style");for(let e=0;e<a;e++){const t=r[e];t.parentNode.removeChild(t),l.textContent+=t.textContent}(e=>{p.forEach(t=>{const n=s.templateCaches.get(i(t,e));void 0!==n&&n.keyString.forEach(e=>{const{element:{content:t}}=e,n=new Set;Array.from(t.querySelectorAll("style")).forEach(e=>{n.add(e)}),d.removeNodesFromTemplate(e,n)})})})(e);const m=o.content;n?d.insertNodeIntoTemplate(n,l,m.firstChild):m.insertBefore(l,m.firstChild),window.ShadyCSS.prepareTemplateStyles(o,e);const c=m.querySelector("style");if(window.ShadyCSS.nativeShadow&&null!==c)t.insertBefore(c.cloneNode(!0),t.firstChild);else if(n){m.insertBefore(l,m.firstChild);const e=new Set;e.add(l),d.removeNodesFromTemplate(n,e)}};e.TemplateResult=r.TemplateResult,e.html=l.html,e.svg=l.svg,e.render=(e,n,r)=>{if(!r||"object"!=typeof r||!r.scopeName)throw new Error("The `scopeName` option is required.");const s=r.scopeName,l=a.parts.has(n),d=m&&11===n.nodeType&&!!n.host,i=d&&!S.has(s),p=i?document.createDocumentFragment():n;if(a.render(e,p,Object.assign({templateFactory:c(s)},r)),i){const e=a.parts.get(p);a.parts.delete(p);const r=e.value instanceof o.TemplateInstance?e.value.template:void 0;y(s,p,r),t.removeNodes(n,n.firstChild),n.appendChild(p),a.parts.set(n,e)}!l&&d&&window.ShadyCSS.styleElement(n.host)},e.shadyTemplateFactory=c,Object.defineProperty(e,"__esModule",{value:!0})}));
diff --git a/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/template-factory.js b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/template-factory.js
new file mode 100644
index 0000000000000000000000000000000000000000..77dbd6a218bd5596a0a6f9e68b54418e8b5d1137
--- /dev/null
+++ b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/template-factory.js
@@ -0,0 +1,14 @@
+define(["exports","./template"],(function(e,t){"use strict";
+/**
+     * @license
+     * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+     * This code may only be used under the BSD style license found at
+     * http://polymer.github.io/LICENSE.txt
+     * The complete set of authors may be found at
+     * http://polymer.github.io/AUTHORS.txt
+     * The complete set of contributors may be found at
+     * http://polymer.github.io/CONTRIBUTORS.txt
+     * Code distributed by Google as part of the polymer project is also
+     * subject to an additional IP rights grant found at
+     * http://polymer.github.io/PATENTS.txt
+     */const r=new Map;e.templateCaches=r,e.templateFactory=function(e){let n=r.get(e.type);void 0===n&&(n={stringsArray:new WeakMap,keyString:new Map},r.set(e.type,n));let s=n.stringsArray.get(e.strings);if(void 0!==s)return s;const i=e.strings.join(t.marker);return s=n.keyString.get(i),void 0===s&&(s=new t.Template(e,e.getTemplateElement()),n.keyString.set(i,s)),n.stringsArray.set(e.strings,s),s},Object.defineProperty(e,"__esModule",{value:!0})}));
diff --git a/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/template-instance.js b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/template-instance.js
new file mode 100644
index 0000000000000000000000000000000000000000..6cf470d177771a9ae37e734811881b0c9c4ec110
--- /dev/null
+++ b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/template-instance.js
@@ -0,0 +1,14 @@
+define(["exports","./dom","./template"],(function(e,t,s){"use strict";
+/**
+     * @license
+     * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+     * This code may only be used under the BSD style license found at
+     * http://polymer.github.io/LICENSE.txt
+     * The complete set of authors may be found at
+     * http://polymer.github.io/AUTHORS.txt
+     * The complete set of contributors may be found at
+     * http://polymer.github.io/CONTRIBUTORS.txt
+     * Code distributed by Google as part of the polymer project is also
+     * subject to an additional IP rights grant found at
+     * http://polymer.github.io/PATENTS.txt
+     */e.TemplateInstance=class{constructor(e,t,s){this.__parts=[],this.template=e,this.processor=t,this.options=s}update(e){let t=0;for(const s of this.__parts)void 0!==s&&s.setValue(e[t]),t++;for(const e of this.__parts)void 0!==e&&e.commit()}_clone(){const e=t.isCEPolyfill?this.template.element.content.cloneNode(!0):document.importNode(this.template.element.content,!0),o=[],n=this.template.parts,i=document.createTreeWalker(e,133,null,!1);let r,p=0,l=0,a=i.nextNode();for(;p<n.length;)if(r=n[p],s.isTemplatePartActive(r)){for(;l<r.index;)l++,"TEMPLATE"===a.nodeName&&(o.push(a),i.currentNode=a.content),null===(a=i.nextNode())&&(i.currentNode=o.pop(),a=i.nextNode());if("node"===r.type){const e=this.processor.handleTextExpression(this.options);e.insertAfterNode(a.previousSibling),this.__parts.push(e)}else this.__parts.push(...this.processor.handleAttributeExpressions(a,r.name,r.strings,this.options));p++}else this.__parts.push(void 0),p++;return t.isCEPolyfill&&(document.adoptNode(e),customElements.upgrade(e)),e}},Object.defineProperty(e,"__esModule",{value:!0})}));
diff --git a/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/template-result.js b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/template-result.js
new file mode 100644
index 0000000000000000000000000000000000000000..2f0b3a194712e0bb9a8604fb0544c2763e2af427
--- /dev/null
+++ b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/template-result.js
@@ -0,0 +1,14 @@
+define(["exports","./dom","./template"],(function(e,t,s){"use strict";
+/**
+     * @license
+     * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+     * This code may only be used under the BSD style license found at
+     * http://polymer.github.io/LICENSE.txt
+     * The complete set of authors may be found at
+     * http://polymer.github.io/AUTHORS.txt
+     * The complete set of contributors may be found at
+     * http://polymer.github.io/CONTRIBUTORS.txt
+     * Code distributed by Google as part of the polymer project is also
+     * subject to an additional IP rights grant found at
+     * http://polymer.github.io/PATENTS.txt
+     */const r=window.trustedTypes&&trustedTypes.createPolicy("lit-html",{createHTML:e=>e}),n=` ${s.marker} `;class l{constructor(e,t,s,r){this.strings=e,this.values=t,this.type=s,this.processor=r}getHTML(){const e=this.strings.length-1;let t="",r=!1;for(let l=0;l<e;l++){const e=this.strings[l],i=e.lastIndexOf("\x3c!--");r=(i>-1||r)&&-1===e.indexOf("--\x3e",i+1);const o=s.lastAttributeNameRegex.exec(e);t+=null===o?e+(r?n:s.nodeMarker):e.substr(0,o.index)+o[1]+o[2]+s.boundAttributeSuffix+o[3]+s.marker}return t+=this.strings[e],t}getTemplateElement(){const e=document.createElement("template");let t=this.getHTML();return void 0!==r&&(t=r.createHTML(t)),e.innerHTML=t,e}}e.SVGTemplateResult=class extends l{getHTML(){return`<svg>${super.getHTML()}</svg>`}getTemplateElement(){const e=super.getTemplateElement(),s=e.content,r=s.firstChild;return s.removeChild(r),t.reparentNodes(s,r.firstChild),e}},e.TemplateResult=l,Object.defineProperty(e,"__esModule",{value:!0})}));
diff --git a/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/template.js b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/template.js
new file mode 100644
index 0000000000000000000000000000000000000000..39b36c4ba52b02151a5919afde587939ab9b3d42
--- /dev/null
+++ b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lib/template.js
@@ -0,0 +1,14 @@
+define(["exports"],(function(e){"use strict";
+/**
+     * @license
+     * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+     * This code may only be used under the BSD style license found at
+     * http://polymer.github.io/LICENSE.txt
+     * The complete set of authors may be found at
+     * http://polymer.github.io/AUTHORS.txt
+     * The complete set of contributors may be found at
+     * http://polymer.github.io/CONTRIBUTORS.txt
+     * Code distributed by Google as part of the polymer project is also
+     * subject to an additional IP rights grant found at
+     * http://polymer.github.io/PATENTS.txt
+     */const t=`{{lit-${String(Math.random()).slice(2)}}}`,n=`\x3c!--${t}--\x3e`,s=new RegExp(`${t}|${n}`),r="$lit$";const o=(e,t)=>{const n=e.length-t.length;return n>=0&&e.slice(n)===t},i=()=>document.createComment(""),a=/([ \x09\x0a\x0c\x0d])([^\0-\x1F\x7F-\x9F "'>=/]+)([ \x09\x0a\x0c\x0d]*=[ \x09\x0a\x0c\x0d]*(?:[^ \x09\x0a\x0c\x0d"'`<>=]*|"[^"]*|'[^']*))$/;e.Template=class{constructor(e,n){this.parts=[],this.element=n;const l=[],c=[],d=document.createTreeWalker(n.content,133,null,!1);let x=0,u=-1,p=0;const{strings:f,values:{length:h}}=e;for(;p<h;){const e=d.nextNode();if(null!==e){if(u++,1===e.nodeType){if(e.hasAttributes()){const t=e.attributes,{length:n}=t;let i=0;for(let e=0;e<n;e++)o(t[e].name,r)&&i++;for(;i-- >0;){const t=f[p],n=a.exec(t)[2],o=n.toLowerCase()+r,i=e.getAttribute(o);e.removeAttribute(o);const l=i.split(s);this.parts.push({type:"attribute",index:u,name:n,strings:l}),p+=l.length-1}}"TEMPLATE"===e.tagName&&(c.push(e),d.currentNode=e.content)}else if(3===e.nodeType){const n=e.data;if(n.indexOf(t)>=0){const t=e.parentNode,c=n.split(s),d=c.length-1;for(let n=0;n<d;n++){let s,l=c[n];if(""===l)s=i();else{const e=a.exec(l);null!==e&&o(e[2],r)&&(l=l.slice(0,e.index)+e[1]+e[2].slice(0,-r.length)+e[3]),s=document.createTextNode(l)}t.insertBefore(s,e),this.parts.push({type:"node",index:++u})}""===c[d]?(t.insertBefore(i(),e),l.push(e)):e.data=c[d],p+=d}}else if(8===e.nodeType)if(e.data===t){const t=e.parentNode;null!==e.previousSibling&&u!==x||(u++,t.insertBefore(i(),e)),x=u,this.parts.push({type:"node",index:u}),null===e.nextSibling?e.data="":(l.push(e),u--),p++}else{let n=-1;for(;-1!==(n=e.data.indexOf(t,n+1));)this.parts.push({type:"node",index:-1}),p++}}else d.currentNode=c.pop()}for(const e of l)e.parentNode.removeChild(e)}},e.boundAttributeSuffix=r,e.createMarker=i,e.isTemplatePartActive=e=>-1!==e.index,e.lastAttributeNameRegex=a,e.marker=t,e.markerRegex=s,e.nodeMarker=n,Object.defineProperty(e,"__esModule",{value:!0})}));
diff --git a/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lit-html.js b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lit-html.js
new file mode 100644
index 0000000000000000000000000000000000000000..15ec41541ab3030a62ddf9f195c19190c0a69658
--- /dev/null
+++ b/typo3/sysext/core/Resources/Public/JavaScript/Contrib/lit-html/lit-html.js
@@ -0,0 +1,14 @@
+define(["exports","./lib/directive","./lib/dom","./lib/part","./lib/template","./lib/template-instance","./lib/template-result","./lib/parts","./lib/default-template-processor","./lib/template-factory","./lib/render"],(function(e,t,r,a,l,i,o,s,m,p,n){"use strict";
+/**
+     * @license
+     * Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
+     * This code may only be used under the BSD style license found at
+     * http://polymer.github.io/LICENSE.txt
+     * The complete set of authors may be found at
+     * http://polymer.github.io/AUTHORS.txt
+     * The complete set of contributors may be found at
+     * http://polymer.github.io/CONTRIBUTORS.txt
+     * Code distributed by Google as part of the polymer project is also
+     * subject to an additional IP rights grant found at
+     * http://polymer.github.io/PATENTS.txt
+     */"undefined"!=typeof window&&(window.litHtmlVersions||(window.litHtmlVersions=[])).push("1.3.0");e.directive=t.directive,e.isDirective=t.isDirective,e.removeNodes=r.removeNodes,e.reparentNodes=r.reparentNodes,e.noChange=a.noChange,e.nothing=a.nothing,e.Template=l.Template,e.createMarker=l.createMarker,e.isTemplatePartActive=l.isTemplatePartActive,e.TemplateInstance=i.TemplateInstance,e.SVGTemplateResult=o.SVGTemplateResult,e.TemplateResult=o.TemplateResult,e.AttributeCommitter=s.AttributeCommitter,e.AttributePart=s.AttributePart,e.BooleanAttributePart=s.BooleanAttributePart,e.EventPart=s.EventPart,e.NodePart=s.NodePart,e.PropertyCommitter=s.PropertyCommitter,e.PropertyPart=s.PropertyPart,e.isIterable=s.isIterable,e.isPrimitive=s.isPrimitive,e.DefaultTemplateProcessor=m.DefaultTemplateProcessor,e.defaultTemplateProcessor=m.defaultTemplateProcessor,e.templateCaches=p.templateCaches,e.templateFactory=p.templateFactory,e.parts=n.parts,e.render=n.render,e.html=(e,...t)=>new o.TemplateResult(e,t,"html",m.defaultTemplateProcessor),e.svg=(e,...t)=>new o.SVGTemplateResult(e,t,"svg",m.defaultTemplateProcessor),Object.defineProperty(e,"__esModule",{value:!0})}));
diff --git a/typo3/sysext/core/Resources/Public/JavaScript/lit-helper.js b/typo3/sysext/core/Resources/Public/JavaScript/lit-helper.js
new file mode 100644
index 0000000000000000000000000000000000000000..ba9d83010e8acb9e64ee922474b824de90ecdc12
--- /dev/null
+++ b/typo3/sysext/core/Resources/Public/JavaScript/lit-helper.js
@@ -0,0 +1,13 @@
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+define(["require","exports","lit-html"],(function(e,r,n){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.renderHTML=void 0,r.renderHTML=e=>{const r=document.createElement("div");return n.render(e,r),r.innerHTML}}));
\ No newline at end of file
diff --git a/typo3/sysext/core/Tests/Functional/Page/PageRendererTest.php b/typo3/sysext/core/Tests/Functional/Page/PageRendererTest.php
index 728a7b6a3c1c3bbabbcc81326ecf2547e70ade0f..dfc447d50969a0d2403521b4fd6c98fa1beaeb4c 100644
--- a/typo3/sysext/core/Tests/Functional/Page/PageRendererTest.php
+++ b/typo3/sysext/core/Tests/Functional/Page/PageRendererTest.php
@@ -351,11 +351,13 @@ class PageRendererTest extends FunctionalTestCase
             ]);
         }
 
-        $expectedConfiguration = json_encode(['packages' => $packages]);
+        $expectedConfiguration = json_encode($packages);
         // Remove surrounding brackets as the expectation is a substring of a larger JSON string
-        $expectedConfiguration = trim($expectedConfiguration, '{}');
+        $expectedConfiguration = trim($expectedConfiguration, '[]');
 
         $renderedString = $subject->render();
         self::assertStringContainsString($expectedConfiguration, $renderedString);
+        // Default ("public") packages must not have been overwritten
+        self::assertStringContainsString('{"name":"lit-html"', $renderedString);
     }
 }
diff --git a/typo3/sysext/install/Resources/Public/JavaScript/RequireJSConfig.js b/typo3/sysext/install/Resources/Public/JavaScript/RequireJSConfig.js
index 1e03d226451e16c3671558c72f02eed5f9feac6a..430562f1d60e2b451e17752bd66fcdbb5acaba9b 100644
--- a/typo3/sysext/install/Resources/Public/JavaScript/RequireJSConfig.js
+++ b/typo3/sysext/install/Resources/Public/JavaScript/RequireJSConfig.js
@@ -11,6 +11,18 @@ var require = {
     'chosen': 'sysext/install/Resources/Public/JavaScript/chosen.jquery.min',
     'nprogress': 'sysext/core/Resources/Public/JavaScript/Contrib/nprogress'
   },
+  packages: [
+    {
+      name: 'lit-html',
+      location: 'sysext/core/Resources/Public/JavaScript/Contrib/lit-html',
+      main: 'lit-html'
+    },
+    {
+      name: 'lit-element',
+      location: 'sysext/core/Resources/Public/JavaScript/Contrib/lit-element',
+      main: 'lit-element'
+    },
+  ],
   shim: {
     jQuery: {
       exports: '$'