diff --git a/docs/release-notes-player.txt b/docs/release-notes-player.txt
index 94716a08e2ee44ad75a7ce6dc9f52f1a767154f6..9292b01027bb3c95541d47ae7e2d4befc2747cd5 100644
--- a/docs/release-notes-player.txt
+++ b/docs/release-notes-player.txt
@@ -9,11 +9,14 @@ Player
 - Optionale Tastatursymbole von Eingabefeldern und -bereichen
   werden nach erster Benutzung der Elemente ausgeblendet
 - Verbessert die Performanz von GeoGebra-Elementen
+- Zeigt Ladeanimationen während des Ladens von GeoGebra-, Video- und Audioelementen
 - Zeigt Validierungsfehler ohne angegebene Warnmeldungen nur mit rotem Rahmen an
+- Korrigiert fehlende Warnmeldungen beim Schieberegler/Zahlenstrahl
 - Die Eingabehilfe "Eigene Zeichen" nutzt weitestgehend das Layout
   der Eingabehilfe "Französische Sonderzeichen"
 - Ändert die Metadaten entsprechend der Verona Inferfaces Specification
 
+
 1.27.0
 - Add new input assistance presets ('Space' and 'Comma').
   The preset 'Space' can be used to separate words.
diff --git a/package-lock.json b/package-lock.json
index d33a917778aa2fcbbd04a22cc1db707ec540cc4a..bdcd935745ce76edda74f34972ea03bc4af1244d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -20,31 +20,31 @@
         "@angular/router": "~13.3.0",
         "@ngx-translate/core": "^14.0.0",
         "@ngx-translate/http-loader": "^6.0.0",
-        "@tiptap/core": "^2.0.0-beta.182",
-        "@tiptap/extension-blockquote": "^2.0.0-beta.29",
-        "@tiptap/extension-bold": "^2.0.0-beta.28",
-        "@tiptap/extension-bubble-menu": "^2.0.0-beta.61",
-        "@tiptap/extension-bullet-list": "^2.0.0-beta.29",
-        "@tiptap/extension-color": "^2.0.0-beta.12",
-        "@tiptap/extension-document": "^2.0.0-beta.17",
-        "@tiptap/extension-floating-menu": "^2.0.0-beta.56",
-        "@tiptap/extension-font-family": "^2.0.0-beta.24",
-        "@tiptap/extension-heading": "^2.0.0-beta.29",
-        "@tiptap/extension-highlight": "^2.0.0-beta.35",
-        "@tiptap/extension-image": "^2.0.0-beta.30",
-        "@tiptap/extension-italic": "^2.0.0-beta.28",
-        "@tiptap/extension-list-item": "^2.0.0-beta.23",
-        "@tiptap/extension-ordered-list": "^2.0.0-beta.30",
-        "@tiptap/extension-paragraph": "^2.0.0-beta.26",
-        "@tiptap/extension-strike": "~2.0.0-beta.29",
-        "@tiptap/extension-subscript": "^2.0.0-beta.13",
-        "@tiptap/extension-superscript": "^2.0.0-beta.13",
-        "@tiptap/extension-text": "^2.0.0-beta.17",
-        "@tiptap/extension-text-align": "^2.0.0-beta.31",
-        "@tiptap/extension-text-style": "^2.0.0-beta.26",
-        "@tiptap/extension-underline": "^2.0.0-beta.25",
+        "@tiptap/core": "^2.0.0-beta.202",
+        "@tiptap/extension-blockquote": "^2.0.0-beta.202",
+        "@tiptap/extension-bold": "^2.0.0-beta.202",
+        "@tiptap/extension-bubble-menu": "^2.0.0-beta.202",
+        "@tiptap/extension-bullet-list": "^2.0.0-beta.202",
+        "@tiptap/extension-color": "^2.0.0-beta.202",
+        "@tiptap/extension-document": "^2.0.0-beta.202",
+        "@tiptap/extension-floating-menu": "^2.0.0-beta.202",
+        "@tiptap/extension-font-family": "^2.0.0-beta.202",
+        "@tiptap/extension-heading": "^2.0.0-beta.202",
+        "@tiptap/extension-highlight": "^2.0.0-beta.202",
+        "@tiptap/extension-image": "^2.0.0-beta.202",
+        "@tiptap/extension-italic": "^2.0.0-beta.202",
+        "@tiptap/extension-list-item": "^2.0.0-beta.202",
+        "@tiptap/extension-ordered-list": "^2.0.0-beta.202",
+        "@tiptap/extension-paragraph": "^2.0.0-beta.202",
+        "@tiptap/extension-strike": "~2.0.0-beta.202",
+        "@tiptap/extension-subscript": "^2.0.0-beta.202",
+        "@tiptap/extension-superscript": "^2.0.0-beta.202",
+        "@tiptap/extension-text": "^2.0.0-beta.202",
+        "@tiptap/extension-text-align": "^2.0.0-beta.202",
+        "@tiptap/extension-text-style": "^2.0.0-beta.202",
+        "@tiptap/extension-underline": "^2.0.0-beta.202",
         "ngx-tiptap": "^5.0.0",
-        "prosemirror-state": "^1.4.1",
+        "prosemirror-state": "^1.4.2",
         "rxjs": "^7.4.0",
         "testcafe": "^1.18.6",
         "tslib": "^2.1.0",
@@ -2871,17 +2871,17 @@
       }
     },
     "node_modules/@tiptap/core": {
-      "version": "2.0.0-beta.182",
-      "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.0.0-beta.182.tgz",
-      "integrity": "sha512-MZGkMGnVnWhBzjvpBNwQ9zBz38ndi3Irbf90uCTSArR0kaCVkW4vmyuPuOXd+0SO8Yv/l5oyDdOCpaG3rnQYfw==",
-      "dependencies": {
-        "prosemirror-commands": "1.3.0",
-        "prosemirror-keymap": "1.2.0",
-        "prosemirror-model": "1.18.1",
-        "prosemirror-schema-list": "1.2.0",
-        "prosemirror-state": "1.4.1",
-        "prosemirror-transform": "1.6.0",
-        "prosemirror-view": "1.26.2"
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.0.0-beta.202.tgz",
+      "integrity": "sha512-KnOcZBtkWoDT7EsVLiJr9DyBnQcKJQHI8kOhNIL0snUrksr25q8xBW05iYqw6cGAF7iu1cFM80VikfgefsZUpw==",
+      "dependencies": {
+        "prosemirror-commands": "^1.3.1",
+        "prosemirror-keymap": "^1.2.0",
+        "prosemirror-model": "^1.18.1",
+        "prosemirror-schema-list": "^1.2.2",
+        "prosemirror-state": "^1.4.1",
+        "prosemirror-transform": "^1.7.0",
+        "prosemirror-view": "^1.28.2"
       },
       "funding": {
         "type": "github",
@@ -2889,9 +2889,9 @@
       }
     },
     "node_modules/@tiptap/extension-blockquote": {
-      "version": "2.0.0-beta.29",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.0.0-beta.29.tgz",
-      "integrity": "sha512-zMYT5TtpKWav9VhTn4JLyMvXmhEdbD6on0MdhcTjRm0I5ugyR4ZbJwh2aelM7G9DZVYzB8jZU18OSDJmo7Af7w==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.0.0-beta.202.tgz",
+      "integrity": "sha512-weLbMxM7VfI4hJsThw1+mB4jbQnVFizmzRlGU40LKMzEU5yIgIhuaomQ02Z7V0cRgfXsoKX9oc0BYGiO0Ra6/g==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
@@ -2901,24 +2901,24 @@
       }
     },
     "node_modules/@tiptap/extension-bold": {
-      "version": "2.0.0-beta.28",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.0.0-beta.28.tgz",
-      "integrity": "sha512-DY8GOzw9xjmTFrnvTbgHUNxTnDfKrkDgrhe0SUvdkT2udntWp8umPdhPiD3vczLgHOJw6tX68qMRjbsR1ZPcHQ==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.0.0-beta.202.tgz",
+      "integrity": "sha512-AsfoChIleoSbY9gAuhbLF8BAEhHPrRKofmU09xJ62SBkL1rtgci8YzJYhL9leQCM4n1MQZEDeVf0ho75HeTPMA==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
       },
       "peerDependencies": {
-        "@tiptap/core": "^2.0.0-beta.1"
+        "@tiptap/core": "^2.0.0-beta.193"
       }
     },
     "node_modules/@tiptap/extension-bubble-menu": {
-      "version": "2.0.0-beta.61",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.0.0-beta.61.tgz",
-      "integrity": "sha512-T3Yx+y1sUnXAJjK1CUfsQewSxOpDca9KzKqN2H9c9RZ9UlorR9XmZg6YYW7m9a7adeihj+o3cCO9jRd8dV+nnA==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.0.0-beta.202.tgz",
+      "integrity": "sha512-Xa0BO5liIHitaxj70JbbmiC70Yg9+EcF9airfI32uOFNHwgEKyXVb5MRyQadRSmXnwPMPLVGWgf3Kg/5rnDqeg==",
       "dependencies": {
-        "prosemirror-state": "1.4.1",
-        "prosemirror-view": "1.26.2",
+        "prosemirror-state": "^1.4.1",
+        "prosemirror-view": "^1.28.2",
         "tippy.js": "^6.3.7"
       },
       "funding": {
@@ -2926,53 +2926,53 @@
         "url": "https://github.com/sponsors/ueberdosis"
       },
       "peerDependencies": {
-        "@tiptap/core": "^2.0.0-beta.1"
+        "@tiptap/core": "^2.0.0-beta.193"
       }
     },
     "node_modules/@tiptap/extension-bullet-list": {
-      "version": "2.0.0-beta.29",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.0.0-beta.29.tgz",
-      "integrity": "sha512-R8VB2l1ZB6VeGWx/t/04nBS5Wg3qjIDEZCpPihj2fccJOw99Lu0Ub2UJg/SfdGmeNNpBh4ZYYFv1g/XjyzlXKg==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.0.0-beta.202.tgz",
+      "integrity": "sha512-Su+GvRGyW9FTBtcFjvNkkYwzDRo+1O2YTNOZi1Z/OkDqbg3g89kRue78avs0nHW7HEgdhCap+z8KtAPrie4eBg==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
       },
       "peerDependencies": {
-        "@tiptap/core": "^2.0.0-beta.1"
+        "@tiptap/core": "^2.0.0-beta.193"
       }
     },
     "node_modules/@tiptap/extension-color": {
-      "version": "2.0.0-beta.12",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-color/-/extension-color-2.0.0-beta.12.tgz",
-      "integrity": "sha512-ddFIUdb7e0gLlYlcQiyZ+zRC4nXtpX2bhOHZ7IdCasoHYEWs/8dsncngLtymAgsRBeruMZ5K6ZhAYtgQVUugqQ==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-color/-/extension-color-2.0.0-beta.202.tgz",
+      "integrity": "sha512-P8rBd2V3UfE9EkmnZ7sXMJihmx+P+fBe0WKo8lSSX+808869ds8YNFGv043wqY/1BnTNqC49GDo0ceP2/9cM1A==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
       },
       "peerDependencies": {
-        "@tiptap/core": "^2.0.0-beta.1",
-        "@tiptap/extension-text-style": "^2.0.0-beta.1"
+        "@tiptap/core": "^2.0.0-beta.193",
+        "@tiptap/extension-text-style": "^2.0.0-beta.193"
       }
     },
     "node_modules/@tiptap/extension-document": {
-      "version": "2.0.0-beta.17",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.0.0-beta.17.tgz",
-      "integrity": "sha512-L6sg0FNchbtIpQkCSjMmItVGs3/vep8Fq56WRtDc1wBSGUSmtHaxQG7F2FZLnNIUMuvzVMRD81m2vYG73WkY6A==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.0.0-beta.202.tgz",
+      "integrity": "sha512-UsDSe93QtnuDrUo11wYCMtp7XlTIBvL5HNhx+enLRY7B8nUhX+d78u1BzspTpCkMYKcdwDmAGfIYMqqPViPEvA==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
       },
       "peerDependencies": {
-        "@tiptap/core": "^2.0.0-beta.1"
+        "@tiptap/core": "^2.0.0-beta.193"
       }
     },
     "node_modules/@tiptap/extension-floating-menu": {
-      "version": "2.0.0-beta.56",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.0.0-beta.56.tgz",
-      "integrity": "sha512-j/evHE/6UPGkIgXny9IGcAh0IrcnQmg0b2NBYebs2mqx9xYKYoe+0jVgNdLp/0M3MRgQCzyWTyatBDBFOUR2mw==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.0.0-beta.202.tgz",
+      "integrity": "sha512-09liirOFsPDFRLS2FiFdnfzyyOQwwyVXLzI6MzUOw5RZbOsGJ5kB8jZdkXvsAIiOs0YYsH3fyOyWirIwSRhBTQ==",
       "dependencies": {
-        "prosemirror-state": "1.4.1",
-        "prosemirror-view": "1.26.2",
+        "prosemirror-state": "^1.4.1",
+        "prosemirror-view": "^1.28.2",
         "tippy.js": "^6.3.7"
       },
       "funding": {
@@ -2980,188 +2980,188 @@
         "url": "https://github.com/sponsors/ueberdosis"
       },
       "peerDependencies": {
-        "@tiptap/core": "^2.0.0-beta.1"
+        "@tiptap/core": "^2.0.0-beta.193"
       }
     },
     "node_modules/@tiptap/extension-font-family": {
-      "version": "2.0.0-beta.24",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-font-family/-/extension-font-family-2.0.0-beta.24.tgz",
-      "integrity": "sha512-R7fgyJb4X6KS2Xcr73dYDxM1NSBNIQrtHLeSa3Cfc3Y9UDqeMFUIEgYUh4sBLBi3Z8Y9D3RRMvxN1x39j5eLLA==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-font-family/-/extension-font-family-2.0.0-beta.202.tgz",
+      "integrity": "sha512-vxRFyCULuaZOqeW/heAc7fL+LgAmuxUyScdWFxnWEBxwzHn0U1L29evr8SC7Vwo7TowV/u9+6lgCeoP7GuKq1g==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
       },
       "peerDependencies": {
-        "@tiptap/core": "^2.0.0-beta.1",
-        "@tiptap/extension-text-style": "^2.0.0-beta.1"
+        "@tiptap/core": "^2.0.0-beta.193",
+        "@tiptap/extension-text-style": "^2.0.0-beta.193"
       }
     },
     "node_modules/@tiptap/extension-heading": {
-      "version": "2.0.0-beta.29",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.0.0-beta.29.tgz",
-      "integrity": "sha512-q92jYcsT5bPhvuQaB0h44Z9r+Ii22tDYo082KMVnR4+tknHT/3xx+p4JC8KHjh+/5W8Quyafqy6mS8L8VX0zsQ==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.0.0-beta.202.tgz",
+      "integrity": "sha512-sF271jSWHgtoJLDNFLS7eyUcUStl7mBDQNJIENWVI+lFu2Ax8GmO7AoB74Q6L5Zaw4h73L6TAvaafHIXurz7tA==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
       },
       "peerDependencies": {
-        "@tiptap/core": "^2.0.0-beta.1"
+        "@tiptap/core": "^2.0.0-beta.193"
       }
     },
     "node_modules/@tiptap/extension-highlight": {
-      "version": "2.0.0-beta.35",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-highlight/-/extension-highlight-2.0.0-beta.35.tgz",
-      "integrity": "sha512-xvEKOyuTj4mhQ8GIOItaSymJhGkWt2gGuCvmFWnTVZAaJJQOlgUTdkmayLCtwoDDP7biiuDhRJokTukGGmhUZw==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-highlight/-/extension-highlight-2.0.0-beta.202.tgz",
+      "integrity": "sha512-lRsXseZxOz/gATpqMZKIJk61+KeV35cr7UPoRrX4eoImSS0EJEYjjlfnBKeFxju9b1qUv3ui4oq4nvrZ/MDwnw==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
       },
       "peerDependencies": {
-        "@tiptap/core": "^2.0.0-beta.1"
+        "@tiptap/core": "^2.0.0-beta.193"
       }
     },
     "node_modules/@tiptap/extension-image": {
-      "version": "2.0.0-beta.30",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-image/-/extension-image-2.0.0-beta.30.tgz",
-      "integrity": "sha512-VhEmgiKkZMiKR7hbpJgIlIUS/QNjSGI5ER7mKDAbuV1IB5yb6nGjZ6o3Exrr2/CaTaW5hQarBC1z2Xgdu05EGg==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-image/-/extension-image-2.0.0-beta.202.tgz",
+      "integrity": "sha512-aHPJMXuoMgToTYkGZsz2ue8gKzes+B92qb9lVRYlY9f+r/tC2K4q3HMtx6qvh8l4Dei5/yeV9TqliY79E9A5dg==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
       },
       "peerDependencies": {
-        "@tiptap/core": "^2.0.0-beta.1"
+        "@tiptap/core": "^2.0.0-beta.193"
       }
     },
     "node_modules/@tiptap/extension-italic": {
-      "version": "2.0.0-beta.28",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.0.0-beta.28.tgz",
-      "integrity": "sha512-/pKRiCfewh7nqiXRD3N4hQHfGrGNOiWPFYZfY35bSpvTms7PDb/MF7xT1CWW23hSpY31BBS+R/a66vlR/gqu7Q==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.0.0-beta.202.tgz",
+      "integrity": "sha512-vgSLy4KDp6AmnAHLHXe/nWeNbLnyUXxmf4U4+esebAV5Hu2F7LgceknFt9D8AGEtYUU+/fYKSeE2NGJgTQG9lA==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
       },
       "peerDependencies": {
-        "@tiptap/core": "^2.0.0-beta.1"
+        "@tiptap/core": "^2.0.0-beta.193"
       }
     },
     "node_modules/@tiptap/extension-list-item": {
-      "version": "2.0.0-beta.23",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.0.0-beta.23.tgz",
-      "integrity": "sha512-AkzvdELz3ZnrlZM0r9+ritBDOnAjXHR/8zCZhW0ZlWx4zyKPMsNG5ygivY+xr4QT65NEGRT8P8b2zOhXrMjjMQ==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.0.0-beta.202.tgz",
+      "integrity": "sha512-15yAsO+CCM8ievdX4oxg8kMBVFqhzVAw7pU6E8KL76kIwWCIIyVW6hU3VZdglyBVnAG0ws5/DaZ4VRFtVPRDvg==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
       },
       "peerDependencies": {
-        "@tiptap/core": "^2.0.0-beta.1"
+        "@tiptap/core": "^2.0.0-beta.193"
       }
     },
     "node_modules/@tiptap/extension-ordered-list": {
-      "version": "2.0.0-beta.30",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.0.0-beta.30.tgz",
-      "integrity": "sha512-GRxGQdq1u0Rp5N8TjthCqoZ//460m343A0HCN7UwfQOnX7Ipv0UJemwNkSHWrl7Pexym9vy3yPWgrn7oRRmgEw==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.0.0-beta.202.tgz",
+      "integrity": "sha512-PpJn8EtS8MLZ4NN9R3crmrivbjTMHjuSE2Ab3Y9TdeR9x9DIF23O/EkunnkPUiBUx6sNADprEWJIQesgpakrtw==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
       },
       "peerDependencies": {
-        "@tiptap/core": "^2.0.0-beta.1"
+        "@tiptap/core": "^2.0.0-beta.193"
       }
     },
     "node_modules/@tiptap/extension-paragraph": {
-      "version": "2.0.0-beta.26",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.0.0-beta.26.tgz",
-      "integrity": "sha512-WcYsuUa7LLfk0vi7I1dVjdMRu53B52FMMqd+UL1qPdDKVkU3DBsZVwPj+yyfQyqN8Mc/xyg9VacGaiKFLmWNDg==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.0.0-beta.202.tgz",
+      "integrity": "sha512-QI86DMUAz5froDJJXpbFV0I+iSFikjhQ8W5clYDbnrP/clRI/FYxklQ3oxSk4VzGBGB5EaBJf+jD7htLKb39UA==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
       },
       "peerDependencies": {
-        "@tiptap/core": "^2.0.0-beta.1"
+        "@tiptap/core": "^2.0.0-beta.193"
       }
     },
     "node_modules/@tiptap/extension-strike": {
-      "version": "2.0.0-beta.29",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.0.0-beta.29.tgz",
-      "integrity": "sha512-zqFuY7GfNmZ/KClt6kxQ+msGo3syqucP/Xnlihxi+/h/G+oTvEwyOIXCtDOltvxcsWH/TUsdr5vzLp0j+Mdc6Q==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.0.0-beta.202.tgz",
+      "integrity": "sha512-cs87UI/VTkmSfIwlHpm7nAPXok2bAQvxmNJ1y7UPzTATVl+ixP1F4aIkwiYk+X7rE/Sys+09PGg1Pr1shwUUkQ==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
       },
       "peerDependencies": {
-        "@tiptap/core": "^2.0.0-beta.1"
+        "@tiptap/core": "^2.0.0-beta.193"
       }
     },
     "node_modules/@tiptap/extension-subscript": {
-      "version": "2.0.0-beta.13",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-subscript/-/extension-subscript-2.0.0-beta.13.tgz",
-      "integrity": "sha512-L9f2zKzNI5y4YvMdNxHDT4Y+8gS1UwtbTJ1vUJdCZGfF8DrMuTZIRp3LjOxYXydr7NGEXyYbucdm97Tzrsp8WA==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-subscript/-/extension-subscript-2.0.0-beta.202.tgz",
+      "integrity": "sha512-s/90xjDJGlWxontzyL0howpdTEbnl5EyvIDDYdAwalnHOGkyfWq8JMxL3klnxUL+Rn10sjatHnEYaLS2A5tN+Q==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
       },
       "peerDependencies": {
-        "@tiptap/core": "^2.0.0-beta.1"
+        "@tiptap/core": "^2.0.0-beta.193"
       }
     },
     "node_modules/@tiptap/extension-superscript": {
-      "version": "2.0.0-beta.13",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-superscript/-/extension-superscript-2.0.0-beta.13.tgz",
-      "integrity": "sha512-Vr9KIG2c4jzymcMMQCjhx2gppmRvnbw6Xvrd8YCpK4szyYI1ClMQ5KQMYl2zV3Y4ZIsivRSy9cE0ipGsXGE3Gw==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-superscript/-/extension-superscript-2.0.0-beta.202.tgz",
+      "integrity": "sha512-kDOc+Sf1N5LzKWDBrTYBWaQFG40z3dCt/ljIMDWJt3Vka8ahnH4kcXhW9eNZLeIWavoj+M+4th+CPSfMdAYJbg==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
       },
       "peerDependencies": {
-        "@tiptap/core": "^2.0.0-beta.1"
+        "@tiptap/core": "^2.0.0-beta.193"
       }
     },
     "node_modules/@tiptap/extension-text": {
-      "version": "2.0.0-beta.17",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.0.0-beta.17.tgz",
-      "integrity": "sha512-OyKL+pqWJEtjyd9/mrsuY1kZh2b3LWpOQDWKtd4aWR4EA0efmQG+7FPwcIeAVEh7ZoqM+/ABCnPjN6IjzIrSfg==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.0.0-beta.202.tgz",
+      "integrity": "sha512-6UsfU9xvKTxHfZYxVJy5DSQ0ibnhC403KLRQ4ePwpJql0TotBx93/CBfPCVLFEwF86HNhf1fFUCx+j2wuwVxmA==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
       },
       "peerDependencies": {
-        "@tiptap/core": "^2.0.0-beta.1"
+        "@tiptap/core": "^2.0.0-beta.193"
       }
     },
     "node_modules/@tiptap/extension-text-align": {
-      "version": "2.0.0-beta.31",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-text-align/-/extension-text-align-2.0.0-beta.31.tgz",
-      "integrity": "sha512-gSJqi57piiMPc2r6WEkXv7ZgQIogigsRUhmlnZC/7s3zzOvjXrexWnV0Ctt/9A7BKcM7OHMykpZyoewvk6QRTw==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-text-align/-/extension-text-align-2.0.0-beta.202.tgz",
+      "integrity": "sha512-cB5SBKRTn730BBwtPQaKfc7uYgI7bGuD1UbsdF8UY93vIsRjdRO4McNlvgfDrb8WrD460PsOOXx18YwX1+3T/Q==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
       },
       "peerDependencies": {
-        "@tiptap/core": "^2.0.0-beta.1"
+        "@tiptap/core": "^2.0.0-beta.193"
       }
     },
     "node_modules/@tiptap/extension-text-style": {
-      "version": "2.0.0-beta.26",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.0.0-beta.26.tgz",
-      "integrity": "sha512-sHUlj5j86W53jvj9ijhXGyqxDdT2c9B7lVwdmDtksvSIrRYuCFqn7hFBzlypNBb56zePqBlIFymUmhK283L6fQ==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.0.0-beta.202.tgz",
+      "integrity": "sha512-dTA3rdkSkANGXtObNEEk7h6+pEOP4iANZF8D0RiNK+c5dKpCfKswVAuddm5q2PMcgYgep5bv/sorAqOIire2rQ==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
       },
       "peerDependencies": {
-        "@tiptap/core": "^2.0.0-beta.1"
+        "@tiptap/core": "^2.0.0-beta.193"
       }
     },
     "node_modules/@tiptap/extension-underline": {
-      "version": "2.0.0-beta.25",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.0.0-beta.25.tgz",
-      "integrity": "sha512-kRDdb/mF6QWzFGV3cQuLh6xyXULXaKPL/TghefoOZhwkdIWV/M3zFar5tsZO54+tbIrzxoVP6t7mO2Y5G/SLDQ==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.0.0-beta.202.tgz",
+      "integrity": "sha512-aZ2BdBDopL7KNDQZZ707VIF6S2FUHGMQxJvfGPrgvCHY5lu34B9F/FGCMPd5VAZC0vaJlHTQ30FWkeQjIDetWg==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
       },
       "peerDependencies": {
-        "@tiptap/core": "^2.0.0-beta.1"
+        "@tiptap/core": "^2.0.0-beta.193"
       }
     },
     "node_modules/@tootallnate/once": {
@@ -12538,9 +12538,9 @@
       }
     },
     "node_modules/prosemirror-commands": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.3.0.tgz",
-      "integrity": "sha512-BwBbZ5OAScPcm0x7H8SPbqjuEJnCU2RJT9LDyOiiIl/3NbL1nJZI4SFNHwU2e/tRr2Xe7JsptpzseqvZvToLBQ==",
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.3.1.tgz",
+      "integrity": "sha512-XTporPgoECkOQACVw0JTe3RZGi+fls3/byqt+tXwGTkD7qLuB4KdVrJamDMJf4kfKga3uB8hZ+kUUyZ5oWpnfg==",
       "dependencies": {
         "prosemirror-model": "^1.0.0",
         "prosemirror-state": "^1.0.0",
@@ -12565,9 +12565,9 @@
       }
     },
     "node_modules/prosemirror-schema-list": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.2.0.tgz",
-      "integrity": "sha512-8PT/9xOx1HHdC7fDNNfhQ50Z8Mzu7nKyA1KCDltSpcZVZIbB0k7KtsHrnXyuIhbLlScoymBiLZ00c5MH6wdFsA==",
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.2.2.tgz",
+      "integrity": "sha512-rd0pqSDp86p0MUMKG903g3I9VmElFkQpkZ2iOd3EOVg1vo5Cst51rAsoE+5IPy0LPXq64eGcCYlW1+JPNxOj2w==",
       "dependencies": {
         "prosemirror-model": "^1.0.0",
         "prosemirror-state": "^1.0.0",
@@ -12575,26 +12575,27 @@
       }
     },
     "node_modules/prosemirror-state": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.1.tgz",
-      "integrity": "sha512-U/LBDW2gNmVa07sz/D229XigSdDQ5CLFwVB1Vb32MJbAHHhWe/6pOc721faI17tqw4pZ49i1xfY/jEZ9tbIhPg==",
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.2.tgz",
+      "integrity": "sha512-puuzLD2mz/oTdfgd8msFbe0A42j5eNudKAAPDB0+QJRw8cO1ygjLmhLrg9RvDpf87Dkd6D4t93qdef00KKNacQ==",
       "dependencies": {
         "prosemirror-model": "^1.0.0",
-        "prosemirror-transform": "^1.0.0"
+        "prosemirror-transform": "^1.0.0",
+        "prosemirror-view": "^1.27.0"
       }
     },
     "node_modules/prosemirror-transform": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.6.0.tgz",
-      "integrity": "sha512-MAp7AjsjEGEqQY0sSMufNIUuEyB1ZR9Fqlm8dTwwWwpEJRv/plsKjWXBbx52q3Ml8MtaMcd7ic14zAHVB3WaMw==",
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.7.0.tgz",
+      "integrity": "sha512-O4T697Cqilw06Zvc3Wm+e237R6eZtJL/xGMliCi+Uo8VL6qHk6afz1qq0zNjT3eZMuYwnP8ZS0+YxX/tfcE9TQ==",
       "dependencies": {
         "prosemirror-model": "^1.0.0"
       }
     },
     "node_modules/prosemirror-view": {
-      "version": "1.26.2",
-      "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.26.2.tgz",
-      "integrity": "sha512-CGKw+GadkfSBEwRAJTHCEKJ4DlV6/3IhAdjpwGyZHUHtbP7jX4Ol4zmi7xa2c6GOabDlIJLYXJydoNYLX7lNeQ==",
+      "version": "1.29.1",
+      "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.29.1.tgz",
+      "integrity": "sha512-OhujVZSDsh0l0PyHNdfaBj6DBkbhYaCfbaxmTeFrMKd/eWS+G6IC+OAbmR9IsLC8Se1HSbphMaXnsXjupHL3UQ==",
       "dependencies": {
         "prosemirror-model": "^1.16.0",
         "prosemirror-state": "^1.0.0",
@@ -17743,157 +17744,157 @@
       }
     },
     "@tiptap/core": {
-      "version": "2.0.0-beta.182",
-      "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.0.0-beta.182.tgz",
-      "integrity": "sha512-MZGkMGnVnWhBzjvpBNwQ9zBz38ndi3Irbf90uCTSArR0kaCVkW4vmyuPuOXd+0SO8Yv/l5oyDdOCpaG3rnQYfw==",
-      "requires": {
-        "prosemirror-commands": "1.3.0",
-        "prosemirror-keymap": "1.2.0",
-        "prosemirror-model": "1.18.1",
-        "prosemirror-schema-list": "1.2.0",
-        "prosemirror-state": "1.4.1",
-        "prosemirror-transform": "1.6.0",
-        "prosemirror-view": "1.26.2"
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.0.0-beta.202.tgz",
+      "integrity": "sha512-KnOcZBtkWoDT7EsVLiJr9DyBnQcKJQHI8kOhNIL0snUrksr25q8xBW05iYqw6cGAF7iu1cFM80VikfgefsZUpw==",
+      "requires": {
+        "prosemirror-commands": "^1.3.1",
+        "prosemirror-keymap": "^1.2.0",
+        "prosemirror-model": "^1.18.1",
+        "prosemirror-schema-list": "^1.2.2",
+        "prosemirror-state": "^1.4.1",
+        "prosemirror-transform": "^1.7.0",
+        "prosemirror-view": "^1.28.2"
       }
     },
     "@tiptap/extension-blockquote": {
-      "version": "2.0.0-beta.29",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.0.0-beta.29.tgz",
-      "integrity": "sha512-zMYT5TtpKWav9VhTn4JLyMvXmhEdbD6on0MdhcTjRm0I5ugyR4ZbJwh2aelM7G9DZVYzB8jZU18OSDJmo7Af7w==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.0.0-beta.202.tgz",
+      "integrity": "sha512-weLbMxM7VfI4hJsThw1+mB4jbQnVFizmzRlGU40LKMzEU5yIgIhuaomQ02Z7V0cRgfXsoKX9oc0BYGiO0Ra6/g==",
       "requires": {}
     },
     "@tiptap/extension-bold": {
-      "version": "2.0.0-beta.28",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.0.0-beta.28.tgz",
-      "integrity": "sha512-DY8GOzw9xjmTFrnvTbgHUNxTnDfKrkDgrhe0SUvdkT2udntWp8umPdhPiD3vczLgHOJw6tX68qMRjbsR1ZPcHQ==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.0.0-beta.202.tgz",
+      "integrity": "sha512-AsfoChIleoSbY9gAuhbLF8BAEhHPrRKofmU09xJ62SBkL1rtgci8YzJYhL9leQCM4n1MQZEDeVf0ho75HeTPMA==",
       "requires": {}
     },
     "@tiptap/extension-bubble-menu": {
-      "version": "2.0.0-beta.61",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.0.0-beta.61.tgz",
-      "integrity": "sha512-T3Yx+y1sUnXAJjK1CUfsQewSxOpDca9KzKqN2H9c9RZ9UlorR9XmZg6YYW7m9a7adeihj+o3cCO9jRd8dV+nnA==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.0.0-beta.202.tgz",
+      "integrity": "sha512-Xa0BO5liIHitaxj70JbbmiC70Yg9+EcF9airfI32uOFNHwgEKyXVb5MRyQadRSmXnwPMPLVGWgf3Kg/5rnDqeg==",
       "requires": {
-        "prosemirror-state": "1.4.1",
-        "prosemirror-view": "1.26.2",
+        "prosemirror-state": "^1.4.1",
+        "prosemirror-view": "^1.28.2",
         "tippy.js": "^6.3.7"
       }
     },
     "@tiptap/extension-bullet-list": {
-      "version": "2.0.0-beta.29",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.0.0-beta.29.tgz",
-      "integrity": "sha512-R8VB2l1ZB6VeGWx/t/04nBS5Wg3qjIDEZCpPihj2fccJOw99Lu0Ub2UJg/SfdGmeNNpBh4ZYYFv1g/XjyzlXKg==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.0.0-beta.202.tgz",
+      "integrity": "sha512-Su+GvRGyW9FTBtcFjvNkkYwzDRo+1O2YTNOZi1Z/OkDqbg3g89kRue78avs0nHW7HEgdhCap+z8KtAPrie4eBg==",
       "requires": {}
     },
     "@tiptap/extension-color": {
-      "version": "2.0.0-beta.12",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-color/-/extension-color-2.0.0-beta.12.tgz",
-      "integrity": "sha512-ddFIUdb7e0gLlYlcQiyZ+zRC4nXtpX2bhOHZ7IdCasoHYEWs/8dsncngLtymAgsRBeruMZ5K6ZhAYtgQVUugqQ==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-color/-/extension-color-2.0.0-beta.202.tgz",
+      "integrity": "sha512-P8rBd2V3UfE9EkmnZ7sXMJihmx+P+fBe0WKo8lSSX+808869ds8YNFGv043wqY/1BnTNqC49GDo0ceP2/9cM1A==",
       "requires": {}
     },
     "@tiptap/extension-document": {
-      "version": "2.0.0-beta.17",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.0.0-beta.17.tgz",
-      "integrity": "sha512-L6sg0FNchbtIpQkCSjMmItVGs3/vep8Fq56WRtDc1wBSGUSmtHaxQG7F2FZLnNIUMuvzVMRD81m2vYG73WkY6A==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.0.0-beta.202.tgz",
+      "integrity": "sha512-UsDSe93QtnuDrUo11wYCMtp7XlTIBvL5HNhx+enLRY7B8nUhX+d78u1BzspTpCkMYKcdwDmAGfIYMqqPViPEvA==",
       "requires": {}
     },
     "@tiptap/extension-floating-menu": {
-      "version": "2.0.0-beta.56",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.0.0-beta.56.tgz",
-      "integrity": "sha512-j/evHE/6UPGkIgXny9IGcAh0IrcnQmg0b2NBYebs2mqx9xYKYoe+0jVgNdLp/0M3MRgQCzyWTyatBDBFOUR2mw==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.0.0-beta.202.tgz",
+      "integrity": "sha512-09liirOFsPDFRLS2FiFdnfzyyOQwwyVXLzI6MzUOw5RZbOsGJ5kB8jZdkXvsAIiOs0YYsH3fyOyWirIwSRhBTQ==",
       "requires": {
-        "prosemirror-state": "1.4.1",
-        "prosemirror-view": "1.26.2",
+        "prosemirror-state": "^1.4.1",
+        "prosemirror-view": "^1.28.2",
         "tippy.js": "^6.3.7"
       }
     },
     "@tiptap/extension-font-family": {
-      "version": "2.0.0-beta.24",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-font-family/-/extension-font-family-2.0.0-beta.24.tgz",
-      "integrity": "sha512-R7fgyJb4X6KS2Xcr73dYDxM1NSBNIQrtHLeSa3Cfc3Y9UDqeMFUIEgYUh4sBLBi3Z8Y9D3RRMvxN1x39j5eLLA==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-font-family/-/extension-font-family-2.0.0-beta.202.tgz",
+      "integrity": "sha512-vxRFyCULuaZOqeW/heAc7fL+LgAmuxUyScdWFxnWEBxwzHn0U1L29evr8SC7Vwo7TowV/u9+6lgCeoP7GuKq1g==",
       "requires": {}
     },
     "@tiptap/extension-heading": {
-      "version": "2.0.0-beta.29",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.0.0-beta.29.tgz",
-      "integrity": "sha512-q92jYcsT5bPhvuQaB0h44Z9r+Ii22tDYo082KMVnR4+tknHT/3xx+p4JC8KHjh+/5W8Quyafqy6mS8L8VX0zsQ==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.0.0-beta.202.tgz",
+      "integrity": "sha512-sF271jSWHgtoJLDNFLS7eyUcUStl7mBDQNJIENWVI+lFu2Ax8GmO7AoB74Q6L5Zaw4h73L6TAvaafHIXurz7tA==",
       "requires": {}
     },
     "@tiptap/extension-highlight": {
-      "version": "2.0.0-beta.35",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-highlight/-/extension-highlight-2.0.0-beta.35.tgz",
-      "integrity": "sha512-xvEKOyuTj4mhQ8GIOItaSymJhGkWt2gGuCvmFWnTVZAaJJQOlgUTdkmayLCtwoDDP7biiuDhRJokTukGGmhUZw==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-highlight/-/extension-highlight-2.0.0-beta.202.tgz",
+      "integrity": "sha512-lRsXseZxOz/gATpqMZKIJk61+KeV35cr7UPoRrX4eoImSS0EJEYjjlfnBKeFxju9b1qUv3ui4oq4nvrZ/MDwnw==",
       "requires": {}
     },
     "@tiptap/extension-image": {
-      "version": "2.0.0-beta.30",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-image/-/extension-image-2.0.0-beta.30.tgz",
-      "integrity": "sha512-VhEmgiKkZMiKR7hbpJgIlIUS/QNjSGI5ER7mKDAbuV1IB5yb6nGjZ6o3Exrr2/CaTaW5hQarBC1z2Xgdu05EGg==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-image/-/extension-image-2.0.0-beta.202.tgz",
+      "integrity": "sha512-aHPJMXuoMgToTYkGZsz2ue8gKzes+B92qb9lVRYlY9f+r/tC2K4q3HMtx6qvh8l4Dei5/yeV9TqliY79E9A5dg==",
       "requires": {}
     },
     "@tiptap/extension-italic": {
-      "version": "2.0.0-beta.28",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.0.0-beta.28.tgz",
-      "integrity": "sha512-/pKRiCfewh7nqiXRD3N4hQHfGrGNOiWPFYZfY35bSpvTms7PDb/MF7xT1CWW23hSpY31BBS+R/a66vlR/gqu7Q==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.0.0-beta.202.tgz",
+      "integrity": "sha512-vgSLy4KDp6AmnAHLHXe/nWeNbLnyUXxmf4U4+esebAV5Hu2F7LgceknFt9D8AGEtYUU+/fYKSeE2NGJgTQG9lA==",
       "requires": {}
     },
     "@tiptap/extension-list-item": {
-      "version": "2.0.0-beta.23",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.0.0-beta.23.tgz",
-      "integrity": "sha512-AkzvdELz3ZnrlZM0r9+ritBDOnAjXHR/8zCZhW0ZlWx4zyKPMsNG5ygivY+xr4QT65NEGRT8P8b2zOhXrMjjMQ==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.0.0-beta.202.tgz",
+      "integrity": "sha512-15yAsO+CCM8ievdX4oxg8kMBVFqhzVAw7pU6E8KL76kIwWCIIyVW6hU3VZdglyBVnAG0ws5/DaZ4VRFtVPRDvg==",
       "requires": {}
     },
     "@tiptap/extension-ordered-list": {
-      "version": "2.0.0-beta.30",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.0.0-beta.30.tgz",
-      "integrity": "sha512-GRxGQdq1u0Rp5N8TjthCqoZ//460m343A0HCN7UwfQOnX7Ipv0UJemwNkSHWrl7Pexym9vy3yPWgrn7oRRmgEw==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.0.0-beta.202.tgz",
+      "integrity": "sha512-PpJn8EtS8MLZ4NN9R3crmrivbjTMHjuSE2Ab3Y9TdeR9x9DIF23O/EkunnkPUiBUx6sNADprEWJIQesgpakrtw==",
       "requires": {}
     },
     "@tiptap/extension-paragraph": {
-      "version": "2.0.0-beta.26",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.0.0-beta.26.tgz",
-      "integrity": "sha512-WcYsuUa7LLfk0vi7I1dVjdMRu53B52FMMqd+UL1qPdDKVkU3DBsZVwPj+yyfQyqN8Mc/xyg9VacGaiKFLmWNDg==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.0.0-beta.202.tgz",
+      "integrity": "sha512-QI86DMUAz5froDJJXpbFV0I+iSFikjhQ8W5clYDbnrP/clRI/FYxklQ3oxSk4VzGBGB5EaBJf+jD7htLKb39UA==",
       "requires": {}
     },
     "@tiptap/extension-strike": {
-      "version": "2.0.0-beta.29",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.0.0-beta.29.tgz",
-      "integrity": "sha512-zqFuY7GfNmZ/KClt6kxQ+msGo3syqucP/Xnlihxi+/h/G+oTvEwyOIXCtDOltvxcsWH/TUsdr5vzLp0j+Mdc6Q==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.0.0-beta.202.tgz",
+      "integrity": "sha512-cs87UI/VTkmSfIwlHpm7nAPXok2bAQvxmNJ1y7UPzTATVl+ixP1F4aIkwiYk+X7rE/Sys+09PGg1Pr1shwUUkQ==",
       "requires": {}
     },
     "@tiptap/extension-subscript": {
-      "version": "2.0.0-beta.13",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-subscript/-/extension-subscript-2.0.0-beta.13.tgz",
-      "integrity": "sha512-L9f2zKzNI5y4YvMdNxHDT4Y+8gS1UwtbTJ1vUJdCZGfF8DrMuTZIRp3LjOxYXydr7NGEXyYbucdm97Tzrsp8WA==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-subscript/-/extension-subscript-2.0.0-beta.202.tgz",
+      "integrity": "sha512-s/90xjDJGlWxontzyL0howpdTEbnl5EyvIDDYdAwalnHOGkyfWq8JMxL3klnxUL+Rn10sjatHnEYaLS2A5tN+Q==",
       "requires": {}
     },
     "@tiptap/extension-superscript": {
-      "version": "2.0.0-beta.13",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-superscript/-/extension-superscript-2.0.0-beta.13.tgz",
-      "integrity": "sha512-Vr9KIG2c4jzymcMMQCjhx2gppmRvnbw6Xvrd8YCpK4szyYI1ClMQ5KQMYl2zV3Y4ZIsivRSy9cE0ipGsXGE3Gw==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-superscript/-/extension-superscript-2.0.0-beta.202.tgz",
+      "integrity": "sha512-kDOc+Sf1N5LzKWDBrTYBWaQFG40z3dCt/ljIMDWJt3Vka8ahnH4kcXhW9eNZLeIWavoj+M+4th+CPSfMdAYJbg==",
       "requires": {}
     },
     "@tiptap/extension-text": {
-      "version": "2.0.0-beta.17",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.0.0-beta.17.tgz",
-      "integrity": "sha512-OyKL+pqWJEtjyd9/mrsuY1kZh2b3LWpOQDWKtd4aWR4EA0efmQG+7FPwcIeAVEh7ZoqM+/ABCnPjN6IjzIrSfg==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.0.0-beta.202.tgz",
+      "integrity": "sha512-6UsfU9xvKTxHfZYxVJy5DSQ0ibnhC403KLRQ4ePwpJql0TotBx93/CBfPCVLFEwF86HNhf1fFUCx+j2wuwVxmA==",
       "requires": {}
     },
     "@tiptap/extension-text-align": {
-      "version": "2.0.0-beta.31",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-text-align/-/extension-text-align-2.0.0-beta.31.tgz",
-      "integrity": "sha512-gSJqi57piiMPc2r6WEkXv7ZgQIogigsRUhmlnZC/7s3zzOvjXrexWnV0Ctt/9A7BKcM7OHMykpZyoewvk6QRTw==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-text-align/-/extension-text-align-2.0.0-beta.202.tgz",
+      "integrity": "sha512-cB5SBKRTn730BBwtPQaKfc7uYgI7bGuD1UbsdF8UY93vIsRjdRO4McNlvgfDrb8WrD460PsOOXx18YwX1+3T/Q==",
       "requires": {}
     },
     "@tiptap/extension-text-style": {
-      "version": "2.0.0-beta.26",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.0.0-beta.26.tgz",
-      "integrity": "sha512-sHUlj5j86W53jvj9ijhXGyqxDdT2c9B7lVwdmDtksvSIrRYuCFqn7hFBzlypNBb56zePqBlIFymUmhK283L6fQ==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.0.0-beta.202.tgz",
+      "integrity": "sha512-dTA3rdkSkANGXtObNEEk7h6+pEOP4iANZF8D0RiNK+c5dKpCfKswVAuddm5q2PMcgYgep5bv/sorAqOIire2rQ==",
       "requires": {}
     },
     "@tiptap/extension-underline": {
-      "version": "2.0.0-beta.25",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.0.0-beta.25.tgz",
-      "integrity": "sha512-kRDdb/mF6QWzFGV3cQuLh6xyXULXaKPL/TghefoOZhwkdIWV/M3zFar5tsZO54+tbIrzxoVP6t7mO2Y5G/SLDQ==",
+      "version": "2.0.0-beta.202",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.0.0-beta.202.tgz",
+      "integrity": "sha512-aZ2BdBDopL7KNDQZZ707VIF6S2FUHGMQxJvfGPrgvCHY5lu34B9F/FGCMPd5VAZC0vaJlHTQ30FWkeQjIDetWg==",
       "requires": {}
     },
     "@tootallnate/once": {
@@ -24865,9 +24866,9 @@
       }
     },
     "prosemirror-commands": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.3.0.tgz",
-      "integrity": "sha512-BwBbZ5OAScPcm0x7H8SPbqjuEJnCU2RJT9LDyOiiIl/3NbL1nJZI4SFNHwU2e/tRr2Xe7JsptpzseqvZvToLBQ==",
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.3.1.tgz",
+      "integrity": "sha512-XTporPgoECkOQACVw0JTe3RZGi+fls3/byqt+tXwGTkD7qLuB4KdVrJamDMJf4kfKga3uB8hZ+kUUyZ5oWpnfg==",
       "requires": {
         "prosemirror-model": "^1.0.0",
         "prosemirror-state": "^1.0.0",
@@ -24892,9 +24893,9 @@
       }
     },
     "prosemirror-schema-list": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.2.0.tgz",
-      "integrity": "sha512-8PT/9xOx1HHdC7fDNNfhQ50Z8Mzu7nKyA1KCDltSpcZVZIbB0k7KtsHrnXyuIhbLlScoymBiLZ00c5MH6wdFsA==",
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.2.2.tgz",
+      "integrity": "sha512-rd0pqSDp86p0MUMKG903g3I9VmElFkQpkZ2iOd3EOVg1vo5Cst51rAsoE+5IPy0LPXq64eGcCYlW1+JPNxOj2w==",
       "requires": {
         "prosemirror-model": "^1.0.0",
         "prosemirror-state": "^1.0.0",
@@ -24902,26 +24903,27 @@
       }
     },
     "prosemirror-state": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.1.tgz",
-      "integrity": "sha512-U/LBDW2gNmVa07sz/D229XigSdDQ5CLFwVB1Vb32MJbAHHhWe/6pOc721faI17tqw4pZ49i1xfY/jEZ9tbIhPg==",
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.2.tgz",
+      "integrity": "sha512-puuzLD2mz/oTdfgd8msFbe0A42j5eNudKAAPDB0+QJRw8cO1ygjLmhLrg9RvDpf87Dkd6D4t93qdef00KKNacQ==",
       "requires": {
         "prosemirror-model": "^1.0.0",
-        "prosemirror-transform": "^1.0.0"
+        "prosemirror-transform": "^1.0.0",
+        "prosemirror-view": "^1.27.0"
       }
     },
     "prosemirror-transform": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.6.0.tgz",
-      "integrity": "sha512-MAp7AjsjEGEqQY0sSMufNIUuEyB1ZR9Fqlm8dTwwWwpEJRv/plsKjWXBbx52q3Ml8MtaMcd7ic14zAHVB3WaMw==",
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.7.0.tgz",
+      "integrity": "sha512-O4T697Cqilw06Zvc3Wm+e237R6eZtJL/xGMliCi+Uo8VL6qHk6afz1qq0zNjT3eZMuYwnP8ZS0+YxX/tfcE9TQ==",
       "requires": {
         "prosemirror-model": "^1.0.0"
       }
     },
     "prosemirror-view": {
-      "version": "1.26.2",
-      "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.26.2.tgz",
-      "integrity": "sha512-CGKw+GadkfSBEwRAJTHCEKJ4DlV6/3IhAdjpwGyZHUHtbP7jX4Ol4zmi7xa2c6GOabDlIJLYXJydoNYLX7lNeQ==",
+      "version": "1.29.1",
+      "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.29.1.tgz",
+      "integrity": "sha512-OhujVZSDsh0l0PyHNdfaBj6DBkbhYaCfbaxmTeFrMKd/eWS+G6IC+OAbmR9IsLC8Se1HSbphMaXnsXjupHL3UQ==",
       "requires": {
         "prosemirror-model": "^1.16.0",
         "prosemirror-state": "^1.0.0",
diff --git a/package.json b/package.json
index 972fa676a94feb7a711089f7490ba29afa8db5ac..355dce8445d185059261bd69156bdbb64f6c36e2 100644
--- a/package.json
+++ b/package.json
@@ -61,31 +61,31 @@
     "@angular/router": "~13.3.0",
     "@ngx-translate/core": "^14.0.0",
     "@ngx-translate/http-loader": "^6.0.0",
-    "@tiptap/core": "^2.0.0-beta.182",
-    "@tiptap/extension-blockquote": "^2.0.0-beta.29",
-    "@tiptap/extension-bold": "^2.0.0-beta.28",
-    "@tiptap/extension-bubble-menu": "^2.0.0-beta.61",
-    "@tiptap/extension-bullet-list": "^2.0.0-beta.29",
-    "@tiptap/extension-color": "^2.0.0-beta.12",
-    "@tiptap/extension-document": "^2.0.0-beta.17",
-    "@tiptap/extension-floating-menu": "^2.0.0-beta.56",
-    "@tiptap/extension-font-family": "^2.0.0-beta.24",
-    "@tiptap/extension-heading": "^2.0.0-beta.29",
-    "@tiptap/extension-highlight": "^2.0.0-beta.35",
-    "@tiptap/extension-image": "^2.0.0-beta.30",
-    "@tiptap/extension-italic": "^2.0.0-beta.28",
-    "@tiptap/extension-list-item": "^2.0.0-beta.23",
-    "@tiptap/extension-ordered-list": "^2.0.0-beta.30",
-    "@tiptap/extension-paragraph": "^2.0.0-beta.26",
-    "@tiptap/extension-strike": "~2.0.0-beta.29",
-    "@tiptap/extension-subscript": "^2.0.0-beta.13",
-    "@tiptap/extension-superscript": "^2.0.0-beta.13",
-    "@tiptap/extension-text": "^2.0.0-beta.17",
-    "@tiptap/extension-text-align": "^2.0.0-beta.31",
-    "@tiptap/extension-text-style": "^2.0.0-beta.26",
-    "@tiptap/extension-underline": "^2.0.0-beta.25",
+    "@tiptap/core": "^2.0.0-beta.202",
+    "@tiptap/extension-blockquote": "^2.0.0-beta.202",
+    "@tiptap/extension-bold": "^2.0.0-beta.202",
+    "@tiptap/extension-bubble-menu": "^2.0.0-beta.202",
+    "@tiptap/extension-bullet-list": "^2.0.0-beta.202",
+    "@tiptap/extension-color": "^2.0.0-beta.202",
+    "@tiptap/extension-document": "^2.0.0-beta.202",
+    "@tiptap/extension-floating-menu": "^2.0.0-beta.202",
+    "@tiptap/extension-font-family": "^2.0.0-beta.202",
+    "@tiptap/extension-heading": "^2.0.0-beta.202",
+    "@tiptap/extension-highlight": "^2.0.0-beta.202",
+    "@tiptap/extension-image": "^2.0.0-beta.202",
+    "@tiptap/extension-italic": "^2.0.0-beta.202",
+    "@tiptap/extension-list-item": "^2.0.0-beta.202",
+    "@tiptap/extension-ordered-list": "^2.0.0-beta.202",
+    "@tiptap/extension-paragraph": "^2.0.0-beta.202",
+    "@tiptap/extension-strike": "~2.0.0-beta.202",
+    "@tiptap/extension-subscript": "^2.0.0-beta.202",
+    "@tiptap/extension-superscript": "^2.0.0-beta.202",
+    "@tiptap/extension-text": "^2.0.0-beta.202",
+    "@tiptap/extension-text-align": "^2.0.0-beta.202",
+    "@tiptap/extension-text-style": "^2.0.0-beta.202",
+    "@tiptap/extension-underline": "^2.0.0-beta.202",
     "ngx-tiptap": "^5.0.0",
-    "prosemirror-state": "^1.4.1",
+    "prosemirror-state": "^1.4.2",
     "rxjs": "^7.4.0",
     "testcafe": "^1.18.6",
     "tslib": "^2.1.0",
diff --git a/projects/common/components/geometry/geometry.component.ts b/projects/common/components/geometry/geometry.component.ts
index de01858fe471fc7a4f64b06b16094bff27b2e816..9565abb26249331104546d189a477c5a3ec06185 100644
--- a/projects/common/components/geometry/geometry.component.ts
+++ b/projects/common/components/geometry/geometry.component.ts
@@ -14,6 +14,7 @@ declare const GGBApplet: any;
   selector: 'aspect-geometry',
   template: `
     <div [id]="elementModel.id" class="geogebra-applet"></div>
+    <aspect-spinner [isLoaded]="isLoaded"></aspect-spinner>
   `,
   styles: [
     ':host {display: block; width: 100%; height: 100%;}',
@@ -25,6 +26,8 @@ export class GeometryComponent extends ElementComponent implements AfterViewInit
   @Input() appDefinition!: string;
   @Output() elementValueChanged = new EventEmitter<ValueChangeElement>();
 
+  isLoaded: Subject<boolean> = new Subject();
+
   private ngUnsubscribe = new Subject<void>();
   private geometryUpdated = new EventEmitter<any>();
 
@@ -80,6 +83,7 @@ export class GeometryComponent extends ElementComponent implements AfterViewInit
       useBrowserForJS: false,
       ggbBase64: this.appDefinition,
       appletOnLoad: (api: any) => {
+        this.isLoaded.next(true);
         api.registerUpdateListener(() => {
           this.geometryUpdated.emit(api);
         });
diff --git a/projects/common/components/input-elements/slider.component.ts b/projects/common/components/input-elements/slider.component.ts
index 6c918eb0f0776c2b0c8bdb3c50c816084e64d86e..1d5d4ee18254af64c46e61b7f9c332ba4a39da6e 100644
--- a/projects/common/components/input-elements/slider.component.ts
+++ b/projects/common/components/input-elements/slider.component.ts
@@ -55,6 +55,9 @@ import { FormElementComponent } from '../../directives/form-element-component.di
                     [min]="elementModel.minValue">
         </mat-slider>
       </div>
+      <mat-error *ngIf="elementFormControl.touched && elementFormControl.errors">
+        {{elementModel.requiredWarnMessage}}
+      </mat-error>
     </div>
   `,
   styles: [
diff --git a/projects/common/components/media-elements/audio.component.ts b/projects/common/components/media-elements/audio.component.ts
index f0d57cbf99862c532cf48f4b1fd0c5fbb60c4259..2015f1c689934955b6af960f205fb8d16e35dc0e 100644
--- a/projects/common/components/media-elements/audio.component.ts
+++ b/projects/common/components/media-elements/audio.component.ts
@@ -1,6 +1,6 @@
 import { Component, Input } from '@angular/core';
-import { MediaPlayerElementComponent } from '../../directives/media-player-element-component.directive';
 import { AudioElement } from 'common/models/elements/media-elements/audio';
+import { MediaPlayerElementComponent } from '../../directives/media-player-element-component.directive';
 
 @Component({
   selector: 'aspect-audio',
@@ -17,12 +17,14 @@ import { AudioElement } from 'common/models/elements/media-elements/audio';
                                        (mediaValidStatusChanged)="mediaValidStatusChanged.emit($event)"
                                        (elementValueChanged)="elementValueChanged.emit($event)">
         <audio #player
+               (loadedmetadata)="isLoaded.next(true)"
                (playing)="mediaPlayStatusChanged.emit(this.elementModel.id)"
                (pause)="mediaPlayStatusChanged.emit(null)"
                [style.width.%]="100"
                [src]="elementModel.src | safeResourceUrl">
         </audio>
       </aspect-media-player-control-bar>
+      <aspect-spinner [isLoaded]="isLoaded"></aspect-spinner>
     </div>
   `
 })
diff --git a/projects/common/components/media-elements/video.component.ts b/projects/common/components/media-elements/video.component.ts
index 6f6dc3c7bab75b5e690bf805acffc1304b93d0e7..b160e90359d548fd92eb35445931445dfa04bf8b 100644
--- a/projects/common/components/media-elements/video.component.ts
+++ b/projects/common/components/media-elements/video.component.ts
@@ -1,6 +1,6 @@
 import { Component, Input } from '@angular/core';
-import { MediaPlayerElementComponent } from '../../directives/media-player-element-component.directive';
 import { VideoElement } from 'common/models/elements/media-elements/video';
+import { MediaPlayerElementComponent } from '../../directives/media-player-element-component.directive';
 
 @Component({
   selector: 'aspect-video',
@@ -19,12 +19,14 @@ import { VideoElement } from 'common/models/elements/media-elements/video';
                                        (mediaValidStatusChanged)="mediaValidStatusChanged.emit($event)"
                                        (elementValueChanged)="elementValueChanged.emit($event)">
         <video #player
+               (loadedmetadata)="isLoaded.next(true)"
                (playing)="mediaPlayStatusChanged.emit(this.elementModel.id)"
                (pause)="mediaPlayStatusChanged.emit(null)"
                [style.width.%]="100"
                [src]="elementModel.src | safeResourceUrl">
         </video>
       </aspect-media-player-control-bar>
+      <aspect-spinner [isLoaded]="isLoaded"></aspect-spinner>
     </div>
   `,
   styles: [
diff --git a/projects/common/components/spinner/spinner.component.ts b/projects/common/components/spinner/spinner.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..38c66f0b90ec87fc26cad497de2cd353ba42686b
--- /dev/null
+++ b/projects/common/components/spinner/spinner.component.ts
@@ -0,0 +1,34 @@
+import {
+  ChangeDetectorRef, Component, Input, OnInit
+} from '@angular/core';
+import { Subject } from 'rxjs';
+import { takeUntil } from 'rxjs/operators';
+
+@Component({
+  selector: 'aspect-spinner',
+  template: `
+    <mat-spinner *ngIf="isLoading"></mat-spinner>
+  `,
+  styles: ['mat-spinner {margin: auto; position: relative; z-index: 100; top: -50%;}']
+})
+export class SpinnerComponent implements OnInit {
+  @Input() isLoaded!: Subject<boolean>;
+  isLoading: boolean = true;
+  private ngUnsubscribe = new Subject<void>();
+
+  constructor(private changeDetectionRef: ChangeDetectorRef) {}
+
+  ngOnInit(): void {
+    this.isLoaded
+      .pipe(takeUntil(this.ngUnsubscribe))
+      .subscribe(() => {
+        this.isLoading = false;
+        this.changeDetectionRef.detectChanges();
+      });
+  }
+
+  ngOnDestroy(): void {
+    this.ngUnsubscribe.next();
+    this.ngUnsubscribe.complete();
+  }
+}
diff --git a/projects/common/directives/media-player-element-component.directive.ts b/projects/common/directives/media-player-element-component.directive.ts
index 812567cdacc216ac27978cf81e878165ba98eee4..40bfbcedab84322c2b6198c4f42fd2637726697b 100644
--- a/projects/common/directives/media-player-element-component.directive.ts
+++ b/projects/common/directives/media-player-element-component.directive.ts
@@ -19,6 +19,7 @@ export abstract class MediaPlayerElementComponent extends ElementComponent imple
 
   abstract elementModel: AudioElement | VideoElement;
   active: boolean = true;
+  isLoaded: Subject<boolean> = new Subject<boolean>();
   dependencyDissolved!: boolean;
   private ngUnsubscribe = new Subject<void>();
 
diff --git a/projects/common/models/elements/geometry/geometry.ts b/projects/common/models/elements/geometry/geometry.ts
index e6f0d27a02dfedd2bf67c81fe7615ce8bab253d7..ee941e72541e622da971a2043ec1ea41d749a646 100644
--- a/projects/common/models/elements/geometry/geometry.ts
+++ b/projects/common/models/elements/geometry/geometry.ts
@@ -29,7 +29,7 @@ export class GeometryElement extends UIElement implements PositionedUIElement {
     this.showFullscreenButton = element.showFullscreenButton !== undefined ? element.showFullscreenButton : true;
     this.customToolBar = element.customToolBar !== undefined ? element.customToolBar : '';
 
-    this.position = UIElement.initPositionProps({ ...element.position });
+    this.position = UIElement.initPositionProps({ ...element.position, fixedSize: true }); // yes, always stay fixed
   }
 
   getElementComponent(): Type<ElementComponent> {
diff --git a/projects/common/shared.module.ts b/projects/common/shared.module.ts
index ecd0d1b837170e3bda6dd1373b412b77c8c5d32a..2d42f38b440c252aca8afeeecccb913919f766af 100644
--- a/projects/common/shared.module.ts
+++ b/projects/common/shared.module.ts
@@ -22,6 +22,7 @@ import { MatSliderModule } from '@angular/material/slider';
 import { DomSanitizer } from '@angular/platform-browser';
 import { HttpClientModule } from '@angular/common/http';
 import { HotspotImageComponent } from 'common/components/input-elements/hotspot-image.component';
+import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
 import { TextComponent } from './components/text/text.component';
 import { ButtonComponent } from './components/button/button.component';
 import { TextFieldComponent } from './components/input-elements/text-field.component';
@@ -73,6 +74,7 @@ import { MathAtanPipe } from './pipes/math-atan.pipe';
 import { MathDegreesPipe } from './pipes/math-degrees.pipe';
 import { ArrayIncludesPipe } from './pipes/array-includes.pipe';
 import { UpdateTextareaRowsPipe } from './pipes/update-textarea-rows.pipe';
+import { SpinnerComponent } from './components/spinner/spinner.component';
 
 @NgModule({
   imports: [
@@ -93,7 +95,8 @@ import { UpdateTextareaRowsPipe } from './pipes/update-textarea-rows.pipe';
     MatButtonModule,
     TranslateModule,
     MatSliderModule,
-    MatButtonToggleModule
+    MatButtonToggleModule,
+    MatProgressSpinnerModule
   ],
   declarations: [
     ButtonComponent,
@@ -135,6 +138,7 @@ import { UpdateTextareaRowsPipe } from './pipes/update-textarea-rows.pipe';
     MathDegreesPipe,
     ArrayIncludesPipe,
     UpdateTextareaRowsPipe,
+    SpinnerComponent
     DropListLayoutPipe,
     DropListLayoutAlignPipe
   ],
diff --git a/projects/editor/src/app/components/canvas/overlays/canvas-element-overlay.ts b/projects/editor/src/app/components/canvas/overlays/canvas-element-overlay.ts
index e7a89a152595b45db9ba4140be12c825a47e02be..43d861a9b9a6832ccaeff486c993d4ffa9f0870c 100644
--- a/projects/editor/src/app/components/canvas/overlays/canvas-element-overlay.ts
+++ b/projects/editor/src/app/components/canvas/overlays/canvas-element-overlay.ts
@@ -21,7 +21,6 @@ import { FormElementComponent } from 'common/directives/form-element-component.d
 @Directive()
 export abstract class CanvasElementOverlay implements OnInit, OnDestroy {
   @Input() element!: UIElement;
-  @Input() viewMode: boolean = false;
   @Output() elementSelected = new EventEmitter();
   @ViewChild('elementContainer', { read: ViewContainerRef, static: true }) private elementContainer!: ViewContainerRef;
   isSelected = false;
@@ -106,6 +105,14 @@ export abstract class CanvasElementOverlay implements OnInit, OnDestroy {
     this.unitService.showDefaultEditDialog(this.element);
   }
 
+  setInteractionEnabled(isEnabled: boolean): void {
+    this.childComponent.location.nativeElement.style.pointerEvents = isEnabled ? 'unset' : 'none';
+  }
+
+  isInteractionEnabled(): boolean {
+    return this.childComponent.location.nativeElement.style.pointerEvents !== 'none';
+  }
+
   ngOnDestroy(): void {
     this.ngUnsubscribe.next();
     this.ngUnsubscribe.complete();
diff --git a/projects/editor/src/app/components/dialogs/geogebra-app-definition-dialog.component.ts b/projects/editor/src/app/components/dialogs/geogebra-app-definition-dialog.component.ts
index 36aa41f7d67d8cd339f47bb237eddd2f8b660b80..efd9b106e3a4cc39d9365e449c67d1ac4c98ca58 100644
--- a/projects/editor/src/app/components/dialogs/geogebra-app-definition-dialog.component.ts
+++ b/projects/editor/src/app/components/dialogs/geogebra-app-definition-dialog.component.ts
@@ -1,47 +1,51 @@
 import { Component } from '@angular/core';
+import { FileService } from 'common/services/file.service';
+import { MatDialogRef } from '@angular/material/dialog';
 
 @Component({
   selector: 'app-geogebra-app-definition-dialog',
   template: `
     <mat-dialog-content fxLayout="column">
-      Base64 Repräsentation einfügen
       <div class="paste-area" contenteditable="true"
            (paste)="validateBase64($event.clipboardData?.getData('Text'))">
+        <span>Base64 Repräsentation einfügen</span>
       </div>
       <div class="status-area" [style.color]="statusMessage?.color" [hidden]="!statusMessage">
         {{ statusMessage?.text }}
       </div>
+      <button mat-raised-button (click)="loadGeogebraFile()">
+        {{'loadGeogebraFile' | translate}}
+        <mat-icon>file_upload</mat-icon>
+      </button>
     </mat-dialog-content>
     <mat-dialog-actions>
-      <button mat-button [mat-dialog-close]="pastedBase64"
-              [disabled]="statusMessage?.color === 'red'">
-        {{'confirm' | translate }}
-      </button>
       <button mat-button mat-dialog-close>{{'cancel' | translate }}</button>
     </mat-dialog-actions>
   `,
   styles: [
-    '.mat-dialog-content {width: 440px; height: 220px;}',
-    '.paste-area {width: 400px; height: 200px; border: 1px solid; overflow: hidden; white-space: pre-wrap;}',
+    '.paste-area {width: 400px; height: 100px; border: 1px solid; overflow: hidden; white-space: pre-wrap;}',
+    '.paste-area:focus span {display: none}',
+    'button {margin-top: 10px;}',
     '.status-area {margin-top: 10px;}'
   ]
 })
 export class GeogebraAppDefinitionDialogComponent {
-  pastedBase64: string | undefined;
   statusMessage: { text: string; color: string } | undefined;
 
-  validateBase64(base64: string | undefined): void {
-    if (base64 && btoa(atob(base64)) === base64) {
-      this.statusMessage = {
-        text: 'Base64-Definition erfolgreich gelesen',
-        color: 'green'
-      };
-      this.pastedBase64 = base64;
+  constructor(private dialogRef: MatDialogRef<GeogebraAppDefinitionDialogComponent>) { }
+
+  validateBase64(pastedBase64: string | undefined): void {
+    if (pastedBase64 && btoa(atob(pastedBase64)) === pastedBase64) {
+      this.dialogRef.close(pastedBase64);
     } else {
       this.statusMessage = {
-        text: 'Fehler beim Lesen der base64-Definition',
+        text: 'Fehler beim Lesen der eingefügten GeoGebra-Definition',
         color: 'red'
       };
     }
   }
+
+  async loadGeogebraFile(): Promise<void> {
+    this.dialogRef.close(await FileService.loadFile(['.ggb'], true));
+  }
 }
diff --git a/projects/editor/src/app/components/properties-panel/element-properties-panel.component.html b/projects/editor/src/app/components/properties-panel/element-properties-panel.component.html
index c5356915f1644a1676726d3976f92e774ae9dee2..a435ad880f67c8b73a3152aba11c0fd35431a1fe 100644
--- a/projects/editor/src/app/components/properties-panel/element-properties-panel.component.html
+++ b/projects/editor/src/app/components/properties-panel/element-properties-panel.component.html
@@ -46,6 +46,12 @@
 
   <div fxLayout="column" class="button-group">
     <mat-divider></mat-divider>
+    <mat-checkbox fxFlexAlign="center"
+                  [indeterminate]="interactionIndeterminate"
+                  [checked]="interactionEnabled"
+                  (change)="setElementInteractionEnabled($event.checked)">
+      {{'propertiesPanel.setElementInteractionEnabled' | translate }}
+    </mat-checkbox>
     <button mat-raised-button [disabled]="selectedElements.length > 1 ||
                                           combinedProperties.type == 'toggle-button' ||
                                           combinedProperties.type == 'text-field-simple'"
diff --git a/projects/editor/src/app/components/properties-panel/element-properties-panel.component.ts b/projects/editor/src/app/components/properties-panel/element-properties-panel.component.ts
index eb06f2b6ebd754f4788238c050e6ed2572f7b22e..726d9316f4620c70577be8d357a813b79dde6e34 100644
--- a/projects/editor/src/app/components/properties-panel/element-properties-panel.component.ts
+++ b/projects/editor/src/app/components/properties-panel/element-properties-panel.component.ts
@@ -10,6 +10,7 @@ import { Hotspot, TextLabel, UIElement } from 'common/models/elements/element';
 import { LikertRowElement } from 'common/models/elements/compound-elements/likert/likert-row';
 import { UnitService } from '../../services/unit.service';
 import { SelectionService } from '../../services/selection.service';
+import { CanvasElementOverlay } from '../canvas/overlays/canvas-element-overlay';
 
 export type CombinedProperties = UIElement & { idList?: string[] };
 
@@ -23,6 +24,10 @@ export class ElementPropertiesPanelComponent implements OnInit, OnDestroy {
   combinedProperties: CombinedProperties | undefined;
   private ngUnsubscribe = new Subject<void>();
 
+  interactionEnabled = false;
+  interactionIndeterminate = false;
+
+
   constructor(private selectionService: SelectionService, public unitService: UnitService,
               private messageService: MessageService,
               public sanitizer: DomSanitizer,
@@ -44,6 +49,18 @@ export class ElementPropertiesPanelComponent implements OnInit, OnDestroy {
           this.selectedElements = selectedElements;
           this.combinedProperties =
             ElementPropertiesPanelComponent.createCombinedProperties(this.selectedElements);
+
+          this.interactionEnabled = this.selectionService.selectedElementComponents
+            .filter(elementOverlay => elementOverlay instanceof CanvasElementOverlay)
+            .reduce((accumulator: boolean, elementOverlay: any) => elementOverlay.isInteractionEnabled(), false);
+
+          this.interactionIndeterminate = (this.selectionService.selectedElementComponents.length > 1) &&
+            this.selectionService.selectedElementComponents
+              .filter(elementOverlay => elementOverlay instanceof CanvasElementOverlay)
+              .reduce((accumulator: any, elementOverlay: any) => {
+                if (!accumulator) return elementOverlay.isInteractionEnabled();
+                return accumulator !== elementOverlay.isInteractionEnabled();
+              }, undefined);
         }
       );
   }
@@ -95,6 +112,12 @@ export class ElementPropertiesPanelComponent implements OnInit, OnDestroy {
     }
   }
 
+  setElementInteractionEnabled(isEnabled: boolean): void {
+    this.selectionService.selectedElementComponents.forEach(elementOverlay => {
+      if (elementOverlay instanceof CanvasElementOverlay) elementOverlay.setInteractionEnabled(isEnabled);
+    });
+  }
+
   deleteElement(): void {
     this.unitService.deleteElements(this.selectedElements);
   }
diff --git a/projects/editor/src/app/components/properties-panel/model-properties-tab/element-model-properties.component.html b/projects/editor/src/app/components/properties-panel/model-properties-tab/element-model-properties.component.html
index 8a1c6eff58f33795d8c4f4275b2d13910ba0936c..5a1e7ea33d67f59216beddb5d7558f8c970a4ed8 100644
--- a/projects/editor/src/app/components/properties-panel/model-properties-tab/element-model-properties.component.html
+++ b/projects/editor/src/app/components/properties-panel/model-properties-tab/element-model-properties.component.html
@@ -166,22 +166,6 @@
     </button>
   </mat-form-field>
 
-
-  <mat-form-field *ngIf="combinedProperties.width != null"
-                  matTooltip="{{'propertiesPanel.width' | translate }}"
-                  appearance="fill">
-    <mat-label>{{'propertiesPanel.width' | translate }}</mat-label>
-    <input matInput type="number" [value]="$any(combinedProperties.width)"
-           (input)="updateModel.emit({ property: 'width', value: $any($event.target).value })">
-  </mat-form-field>
-  <mat-form-field *ngIf="combinedProperties.height != null"
-                  matTooltip="{{'propertiesPanel.height' | translate }}"
-                  appearance="fill">
-    <mat-label>{{'propertiesPanel.height' | translate }}</mat-label>
-    <input matInput type="number" [value]="$any(combinedProperties.height)"
-           (input)="updateModel.emit({ property: 'height', value: $any($event.target).value })">
-  </mat-form-field>
-
   <mat-checkbox *ngIf="combinedProperties.showResetIcon !== undefined"
                 [checked]="$any(combinedProperties.showResetIcon)"
                 (change)="updateModel.emit({ property: 'showResetIcon', value: $event.checked })">
diff --git a/projects/editor/src/app/services/dialog.service.ts b/projects/editor/src/app/services/dialog.service.ts
index e43faa42ae769c349a775becf9644ad305c42e08..8efec52d80360f868450f90310bfa25c52d988ab 100644
--- a/projects/editor/src/app/services/dialog.service.ts
+++ b/projects/editor/src/app/services/dialog.service.ts
@@ -120,7 +120,8 @@ export class DialogService {
 
   showGeogebraAppDefinitionDialog(): Observable<string> {
     const dialogRef = this.dialog.open(GeogebraAppDefinitionDialogComponent, {
-      data: { }
+      data: { },
+      autoFocus: false
     });
     return dialogRef.afterClosed();
   }
diff --git a/projects/editor/src/app/services/selection.service.ts b/projects/editor/src/app/services/selection.service.ts
index 54a8d9268763190f49587faab40c35426b9e17ef..70017738637b0cc3e63519be13328105ca34f2b4 100644
--- a/projects/editor/src/app/services/selection.service.ts
+++ b/projects/editor/src/app/services/selection.service.ts
@@ -1,6 +1,10 @@
 import { Injectable } from '@angular/core';
 import { BehaviorSubject, Observable } from 'rxjs';
 import { UIElement } from 'common/models/elements/element';
+import { CanvasElementOverlay } from 'editor/src/app/components/canvas/overlays/canvas-element-overlay';
+import {
+  CompoundChildOverlayComponent
+} from 'common/components/compound-elements/cloze/compound-child-overlay.component';
 
 @Injectable({
   providedIn: 'root'
@@ -9,7 +13,7 @@ export class SelectionService {
   selectedPageIndex: number = 0;
   selectedPageSectionIndex: number = 0;
   private _selectedElements!: BehaviorSubject<UIElement[]>;
-  selectedElementComponents: any[] = [];
+  selectedElementComponents: (CanvasElementOverlay | CompoundChildOverlayComponent)[] = [];
   selectedCompoundChild: { element: UIElement, nativeElement: HTMLElement } | null = null;
 
   constructor() {
@@ -24,7 +28,7 @@ export class SelectionService {
     return this._selectedElements.value;
   }
 
-  selectElement(event: { elementComponent: any; multiSelect: boolean }): void {
+  selectElement(event: { elementComponent: CanvasElementOverlay | CompoundChildOverlayComponent; multiSelect: boolean }): void {
     if (!event.multiSelect) {
       this.clearElementSelection();
     }
@@ -34,7 +38,7 @@ export class SelectionService {
   }
 
   clearElementSelection(): void {
-    this.selectedElementComponents.forEach((overlayComponent: any) => {
+    this.selectedElementComponents.forEach((overlayComponent: CanvasElementOverlay | CompoundChildOverlayComponent) => {
       overlayComponent.setSelected(false);
     });
     this.selectedElementComponents = [];
diff --git a/projects/editor/src/app/services/unit.service.ts b/projects/editor/src/app/services/unit.service.ts
index 8835e0340a723659af010fe868ae6adc54112cf4..83b6e3a17c300fcb817a49c1321289d6925a6b45 100644
--- a/projects/editor/src/app/services/unit.service.ts
+++ b/projects/editor/src/app/services/unit.service.ts
@@ -46,13 +46,22 @@ export class UnitService {
 
   loadUnitDefinition(unitDefinition: string): void {
     this.idService.reset();
-    const unitDef = JSON.parse(unitDefinition);
-    this.sanitizationService.checkAndRepairIDs(unitDef, this.idService, this.messageService);
-    if (SanitizationService.isUnitDefinitionOutdated(unitDef)) {
-      this.unit = new Unit(this.sanitizationService.sanitizeUnitDefinition(unitDef));
-      this.messageService.showMessage(this.translateService.instant('outdatedUnit'));
+    if (unitDefinition) {
+      try {
+        const unitDef = JSON.parse(unitDefinition);
+        this.sanitizationService.checkAndRepairIDs(unitDef, this.idService, this.messageService);
+        if (SanitizationService.isUnitDefinitionOutdated(unitDef)) {
+          this.unit = new Unit(this.sanitizationService.sanitizeUnitDefinition(unitDef));
+          this.messageService.showMessage(this.translateService.instant('outdatedUnit'));
+        } else {
+          this.unit = new Unit(unitDef);
+        }
+      } catch (e) {
+        this.messageService.showError('Unit definition konnte nicht gelesen werden!');
+        this.unit = new Unit();
+      }
     } else {
-      this.unit = new Unit(unitDef);
+      this.unit = new Unit();
     }
     this.idService.registerUnitIds(this.unit);
   }
diff --git a/projects/editor/src/app/text-editor/extensions/bullet-list.ts b/projects/editor/src/app/text-editor/extensions/bullet-list.ts
index 9f817b81d5ad8f34bdd151cfcd9d92c7b409a8a0..08cf3857030816214812fb9b499bfb5f0dc1112d 100644
--- a/projects/editor/src/app/text-editor/extensions/bullet-list.ts
+++ b/projects/editor/src/app/text-editor/extensions/bullet-list.ts
@@ -28,5 +28,9 @@ export const BulletListExtension = BulletList.extend({
         return commands.updateAttributes(this.name, { listStyle: newStyle });
       }
     };
+  },
+
+  addInputRules() {
+    return [];
   }
 });
diff --git a/projects/editor/src/app/text-editor/extensions/ordered-list.ts b/projects/editor/src/app/text-editor/extensions/ordered-list.ts
index 5a1d5e121d6dc07e8369930c296739a539a97bf9..fc46c91d5894bacd6de9461e888644a1ee99ba7d 100644
--- a/projects/editor/src/app/text-editor/extensions/ordered-list.ts
+++ b/projects/editor/src/app/text-editor/extensions/ordered-list.ts
@@ -39,5 +39,9 @@ export const OrderedListExtension = OrderedList.extend({
         commands.updateAttributes(this.name, { fontSize: fontSize })
       )
     };
+  },
+
+  addInputRules() {
+    return [];
   }
 });
diff --git a/projects/editor/src/app/text-editor/rich-text-editor.component.ts b/projects/editor/src/app/text-editor/rich-text-editor.component.ts
index 59181bf1009751ad17d9c19390ff77d11b9b11c9..3c6a1a5d91e445055f012e9fdd730f0416df4beb 100644
--- a/projects/editor/src/app/text-editor/rich-text-editor.component.ts
+++ b/projects/editor/src/app/text-editor/rich-text-editor.component.ts
@@ -84,9 +84,7 @@ export class RichTextEditorComponent implements OnInit, AfterViewInit {
   ];
 
   editor: Editor = new Editor({
-    extensions: this.defaultExtensions,
-    enablePasteRules: false,
-    enableInputRules: false
+    extensions: this.defaultExtensions
   });
 
   constructor(private injector: Injector) { }
@@ -100,9 +98,7 @@ export class RichTextEditorComponent implements OnInit, AfterViewInit {
       activeExtensions.push(ButtonComponentExtension(this.injector));
     }
     this.editor = new Editor({
-      extensions: activeExtensions,
-      enablePasteRules: false,
-      enableInputRules: false
+      extensions: activeExtensions
     });
   }
 
diff --git a/projects/editor/src/assets/i18n/de.json b/projects/editor/src/assets/i18n/de.json
index a9daae04ccd1f41918d41a816f931c60ba1c98ee..d4e26b450e5023158fc27fcb6cd1d1dd03327049 100644
--- a/projects/editor/src/assets/i18n/de.json
+++ b/projects/editor/src/assets/i18n/de.json
@@ -185,7 +185,8 @@
     "newHotspot": "Neuer Bereich",
     "hasDynamicRowCount": "Dynamische Zeilen",
     "expectedCharactersCount": "Erwartete Zeichenanzahl",
-    "isSortList": "Sortierliste"
+    "isSortList": "Sortierliste",
+    "setElementInteractionEnabled": "Elementinteraktion erlauben"
   },
   "hotspot": {
     "top": "Abstand von oben",
@@ -272,5 +273,6 @@
   "Fehler beim Lesen des Abschnitts!": "Fehler beim Lesen des Abschnitts!",
   "limitItemPerRow": "Elemente je Zeile begrenzen",
   "numberGreater0": "Zahlenwert größer 0",
-  "itemsPerRow": "Anzahl der Elemente"
+  "itemsPerRow": "Anzahl der Elemente",
+  "loadGeogebraFile": "GGB-Datei hochladen"
 }
diff --git a/projects/player/src/html_wrapper/index.html b/projects/player/src/html_wrapper/index.html
index 1339c519219f0ed23eaceb583bec412333c929af..2b8cddfbf55e5671bb3cf516d90b00b086906c74 100644
--- a/projects/player/src/html_wrapper/index.html
+++ b/projects/player/src/html_wrapper/index.html
@@ -5,7 +5,6 @@
   <title>Verona Player Aspect</title>
   <script type="application/ld+json" id="meta_data">
     {
-      "$schema": "https://raw.githubusercontent.com/verona-interfaces/metadata/master/verona-module-metadata.json",
       "name": [
         {
           "lang": "de",