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",