From 03d27e28088b03b602837a836adcea5eaa0bc028 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 18 Feb 2025 13:01:30 +0000 Subject: [PATCH 01/22] Upgrade dependency to matrix-js-sdk@37.0.0-rc.0 --- package.json | 2 +- yarn.lock | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 8558639470..9721776130 100644 --- a/package.json +++ b/package.json @@ -128,7 +128,7 @@ "maplibre-gl": "^5.0.0", "matrix-encrypt-attachment": "^1.0.3", "matrix-events-sdk": "0.0.1", - "matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop", + "matrix-js-sdk": "37.0.0-rc.0", "matrix-widget-api": "^1.10.0", "memoize-one": "^6.0.0", "mime": "^4.0.4", diff --git a/yarn.lock b/yarn.lock index 6c3b510ed3..99302d6163 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8723,9 +8723,10 @@ matrix-events-sdk@0.0.1: resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== -"matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop": - version "36.2.0" - resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/b584f818f51c899cc81bc83bf1499a2ed374c6c7" +matrix-js-sdk@37.0.0-rc.0: + version "37.0.0-rc.0" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-37.0.0-rc.0.tgz#d6a87bda024d2ec9ee782e7d825da1e8e31fc00f" + integrity sha512-KcshXXWRIrXx6E7vsm+BvBgcJc8STEgbOcMTu9ZneITDwHrjP13qObdEUXUZv3x8tYxKSWj821aMr+nOH3jL+A== dependencies: "@babel/runtime" "^7.12.5" "@matrix-org/matrix-sdk-crypto-wasm" "^13.0.0" From 8c4996b437c277216fadb1f8f6a2e3fd4635222b Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 18 Feb 2025 13:04:49 +0000 Subject: [PATCH 02/22] v1.11.93-rc.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9721776130..8e70c087eb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "element-web", - "version": "1.11.91", + "version": "1.11.93-rc.0", "description": "Element: the future of secure communication", "author": "New Vector Ltd.", "repository": { From d8904a6e56d5b545bc4c30b56d8ad097665c8e8d Mon Sep 17 00:00:00 2001 From: David Langley Date: Fri, 21 Feb 2025 13:45:52 +0000 Subject: [PATCH 03/22] getByRole is slow on large trees, use getByText (#29331) --- .../components/views/settings/AddRemoveThreepids-test.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/unit-tests/components/views/settings/AddRemoveThreepids-test.tsx b/test/unit-tests/components/views/settings/AddRemoveThreepids-test.tsx index 5685f1eb8f..6d3d3de692 100644 --- a/test/unit-tests/components/views/settings/AddRemoveThreepids-test.tsx +++ b/test/unit-tests/components/views/settings/AddRemoveThreepids-test.tsx @@ -172,7 +172,7 @@ describe("AddRemoveThreepids", () => { const countryDropdown = await screen.findByRole("button", { name: /Country Dropdown/ }); await userEvent.click(countryDropdown); - const gbOption = screen.getByRole("option", { name: "🇬🇧 United Kingdom (+44)" }); + const gbOption = screen.getByText("United Kingdom (+44)"); await userEvent.click(gbOption); const input = screen.getByRole("textbox", { name: "Phone Number" }); @@ -511,7 +511,7 @@ describe("AddRemoveThreepids", () => { const countryDropdown = screen.getByRole("button", { name: /Country Dropdown/ }); await userEvent.click(countryDropdown); - const gbOption = screen.getByRole("option", { name: "🇬🇧 United Kingdom (+44)" }); + const gbOption = screen.getByText("United Kingdom (+44)"); await userEvent.click(gbOption); const input = screen.getByRole("textbox", { name: "Phone Number" }); From 0cbc6f99d06b8daf12c0185e8a211796b5c57e4b Mon Sep 17 00:00:00 2001 From: David Langley Date: Sat, 22 Feb 2025 00:16:33 +0000 Subject: [PATCH 04/22] Set language explicitly (#29332) --- .../components/views/elements/SyntaxHighlight-test.tsx | 6 ++++-- .../elements/__snapshots__/SyntaxHighlight-test.tsx.snap | 6 +++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/test/unit-tests/components/views/elements/SyntaxHighlight-test.tsx b/test/unit-tests/components/views/elements/SyntaxHighlight-test.tsx index 5983e7b0f2..3d442a6f4d 100644 --- a/test/unit-tests/components/views/elements/SyntaxHighlight-test.tsx +++ b/test/unit-tests/components/views/elements/SyntaxHighlight-test.tsx @@ -12,8 +12,10 @@ import SyntaxHighlight from "../../../../../src/components/views/elements/Syntax describe("", () => { it("renders", async () => { - const { container } = render(console.log("Hello, World!");); - await waitFor(() => expect(container.querySelector(".language-arcade")).toBeTruthy()); + const { container } = render( + console.log("Hello, World!");, + ); + await waitFor(() => expect(container.querySelector(".language-javascript")).toBeTruthy()); expect(container).toMatchSnapshot(); }); diff --git a/test/unit-tests/components/views/elements/__snapshots__/SyntaxHighlight-test.tsx.snap b/test/unit-tests/components/views/elements/__snapshots__/SyntaxHighlight-test.tsx.snap index e7ad9c057b..9068995c59 100644 --- a/test/unit-tests/components/views/elements/__snapshots__/SyntaxHighlight-test.tsx.snap +++ b/test/unit-tests/components/views/elements/__snapshots__/SyntaxHighlight-test.tsx.snap @@ -3,17 +3,17 @@ exports[` renders 1`] = `
     
       
         console
       
       .
       
         log
       

From 27c0e97e44c1df848bc5e924fe0a2d5c8d2acc1d Mon Sep 17 00:00:00 2001
From: David Langley 
Date: Sat, 22 Feb 2025 00:17:13 +0000
Subject: [PATCH 05/22] Fix test that doesn't make sense in
 usePublicRoomDirectory-test.tsx (#29335)

* remove test that doesn't make sense

* Actually let's fix the test rather than remove it

* Add comment, remove consoles.
---
 .../hooks/usePublicRoomDirectory-test.tsx     | 22 +++++++++----------
 1 file changed, 10 insertions(+), 12 deletions(-)

diff --git a/test/unit-tests/hooks/usePublicRoomDirectory-test.tsx b/test/unit-tests/hooks/usePublicRoomDirectory-test.tsx
index cc35a49bf7..5c1b2a8ac4 100644
--- a/test/unit-tests/hooks/usePublicRoomDirectory-test.tsx
+++ b/test/unit-tests/hooks/usePublicRoomDirectory-test.tsx
@@ -27,17 +27,15 @@ describe("usePublicRoomDirectory", () => {
         cli.getDomain = () => "matrix.org";
         cli.getThirdpartyProtocols = () => Promise.resolve({});
         cli.publicRooms = ({ filter }: IRoomDirectoryOptions) => {
-            const chunk = filter?.generic_search_term
-                ? [
-                      {
-                          room_id: "hello world!",
-                          name: filter.generic_search_term,
-                          world_readable: true,
-                          guest_can_join: true,
-                          num_joined_members: 1,
-                      },
-                  ]
-                : [];
+            const chunk = [
+                {
+                    room_id: "hello world!",
+                    name: filter?.generic_search_term ?? "", // If the query is "" no filter is applied(an is undefined here), in keeping with the pattern let's call the room ""
+                    world_readable: true,
+                    guest_can_join: true,
+                    num_joined_members: 1,
+                },
+            ];
             return Promise.resolve({
                 chunk,
                 total_room_count_estimate: 1,
@@ -67,7 +65,7 @@ describe("usePublicRoomDirectory", () => {
     });
 
     it("should work with empty queries", async () => {
-        const query = "ROOM NAME";
+        const query = "";
         const { result } = render();
 
         act(() => {

From 99b9eee86e1f46148725f0956cc6270de1e6b3d5 Mon Sep 17 00:00:00 2001
From: ElementRobot 
Date: Sat, 22 Feb 2025 07:14:13 +0100
Subject: [PATCH 06/22] [create-pull-request] automated change (#29338)

Co-authored-by: t3chguy <2403652+t3chguy@users.noreply.github.com>
---
 playwright/testcontainers/synapse.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/playwright/testcontainers/synapse.ts b/playwright/testcontainers/synapse.ts
index 82d567185d..13250c86d9 100644
--- a/playwright/testcontainers/synapse.ts
+++ b/playwright/testcontainers/synapse.ts
@@ -25,7 +25,7 @@ import { type HomeserverContainer, type StartedHomeserverContainer } from "./Hom
 import { type StartedMatrixAuthenticationServiceContainer } from "./mas.ts";
 import { Api, ClientServerApi, type Verb } from "../plugins/utils/api.ts";
 
-const TAG = "develop@sha256:cdf9ad343d8d9cae7ae37078dd3a07e8ec88fba30ba014e767bab1f752eb9752";
+const TAG = "develop@sha256:8d1c531cf6010b63142a04e1b138a60720946fa131ad404813232f02db4ce7ba";
 
 const DEFAULT_CONFIG = {
     server_name: "localhost",

From 37136ecf46218c0425e3b985f87b9f2d327bbdae Mon Sep 17 00:00:00 2001
From: ElementRobot 
Date: Mon, 24 Feb 2025 07:21:38 +0100
Subject: [PATCH 07/22] [create-pull-request] automated change (#29342)

Co-authored-by: t3chguy <2403652+t3chguy@users.noreply.github.com>
---
 src/i18n/strings/el.json    |  7 +++++++
 src/i18n/strings/nb_NO.json | 17 +++++++++++------
 src/i18n/strings/pl.json    |  8 +++++++-
 src/i18n/strings/uk.json    |  7 ++++++-
 4 files changed, 31 insertions(+), 8 deletions(-)

diff --git a/src/i18n/strings/el.json b/src/i18n/strings/el.json
index 84b8fc4d44..0f3ed2c5d4 100644
--- a/src/i18n/strings/el.json
+++ b/src/i18n/strings/el.json
@@ -2212,13 +2212,18 @@
             "ignore_users_empty": "Δεν έχετε χρήστες που έχετε αγνοήσει.",
             "ignore_users_section": "Χρήστες που αγνοήθηκαν",
             "import_megolm_keys": "Εισαγωγή κλειδιών E2E",
+            "key_backup_active": "Αυτή η συνεδρία δημιουργεί αντίγραφα ασφαλείας των κλειδιών σου.",
+            "key_backup_active_version": "Ενεργή έκδοση αντιγράφων ασφαλείας:",
             "key_backup_active_version_none": "Κανένα",
             "key_backup_algorithm": "Αλγόριθμος:",
+            "key_backup_can_be_restored": "Αυτό το αντίγραφο ασφαλείας μπορεί να επαναφερθεί σε αυτήν την περίοδο λειτουργίας",
             "key_backup_complete": "Δημιουργήθηκαν αντίγραφα ασφαλείας όλων των κλειδιών",
             "key_backup_connect": "Συνδέστε αυτήν την συνεδρία με το αντίγραφο ασφαλείας κλειδιού",
             "key_backup_connect_prompt": "Συνδέστε αυτήν την συνεδρία με το αντίγραφο ασφαλείας κλειδιού πριν αποσυνδεθείτε για να αποφύγετε την απώλεια κλειδιών που μπορεί να υπάρχουν μόνο σε αυτήν την συνεδρία.",
+            "key_backup_in_progress": "Δημιουργία αντιγράφων %(sessionsRemaining)s κλειδιών...",
             "key_backup_inactive": "Αυτή η συνεδρία δεν δημιουργεί αντίγραφα ασφαλείας των κλειδιών σας, αλλά έχετε ένα υπάρχον αντίγραφο ασφαλείας από το οποίο μπορείτε να επαναφέρετε και να προσθέσετε στη συνέχεια.",
             "key_backup_inactive_warning": "Δεν δημιουργούνται αντίγραφα ασφαλείας των κλειδιών σας από αυτήν την συνεδρία.",
+            "key_backup_latest_version": "Τελευταία έκδοση αντιγράφων ασφαλείας στο διακομιστή:",
             "message_search_disable_warning": "Εάν απενεργοποιηθεί, τα μηνύματα από κρυπτογραφημένα δωμάτια δε θα εμφανίζονται στα αποτελέσματα αναζήτησης.",
             "message_search_disabled": "Αποθηκεύστε με ασφάλεια κρυπτογραφημένα μηνύματα τοπικά για να εμφανίζονται στα αποτελέσματα αναζήτησης.",
             "message_search_enabled": {
@@ -2237,6 +2242,7 @@
             "message_search_space_used": "Χώρος που χρησιμοποιείται:",
             "message_search_unsupported": "Λείπουν ορισμένα στοιχεία από το %(brand)s που απαιτούνται για την ασφαλή αποθήκευση κρυπτογραφημένων μηνυμάτων τοπικά. Εάν θέλετε να πειραματιστείτε με αυτό το χαρακτηριστικό, δημιουργήστε μια προσαρμοσμένη %(brand)s επιφάνεια εργασίαςμε προσθήκη στοιχείων αναζήτησης.",
             "message_search_unsupported_web": "Το %(brand)s δεν μπορεί να αποθηκεύσει με ασφάλεια κρυπτογραφημένα μηνύματα τοπικά ενώ εκτελείται σε πρόγραμμα περιήγησης ιστού. Χρησιμοποιήστε την %(brand)s Επιφάνεια εργασίας για να εμφανίζονται κρυπτογραφημένα μηνύματα στα αποτελέσματα αναζήτησης.",
+            "record_session_details": "Κατέγραψε το όνομα του πελάτη, την έκδοση και τη διεύθυνση URL για να αναγνωρίζεις τις συνεδρίες πιο εύκολα στον διαχειριστή συνεδρίας",
             "restore_key_backup": "Επαναφορά από Αντίγραφο ασφαλείας",
             "secret_storage_not_ready": "δεν είναι έτοιμο",
             "secret_storage_ready": "έτοιμο",
@@ -2305,6 +2311,7 @@
             "auto_gain_control": "Αυτόματος έλεγχος gain",
             "connection_section": "Σύνδεση",
             "echo_cancellation": "Ακύρωση ηχούς",
+            "enable_fallback_ice_server": "Να επιτρέπεται ο εναλλακτικής διακομιστής υποβοήθησης κλήσης (%(server)s )",
             "enable_fallback_ice_server_description": "Ισχύει μόνο εάν ο οικιακός διακομιστής σου δεν προσφέρει ένα. Η διεύθυνση IP σου θα κοινοποιηθεί κατά τη διάρκεια μιας κλήσης.",
             "mirror_local_feed": "Αντικατοπτρίστε την τοπική ροή βίντεο",
             "missing_permissions_prompt": "Λείπουν δικαιώματα πολυμέσων, κάντε κλικ στο κουμπί παρακάτω για να αιτηθείτε.",
diff --git a/src/i18n/strings/nb_NO.json b/src/i18n/strings/nb_NO.json
index c361dcdbe7..f20b4e1af6 100644
--- a/src/i18n/strings/nb_NO.json
+++ b/src/i18n/strings/nb_NO.json
@@ -80,12 +80,14 @@
         "maximise": "Maksimer",
         "mention": "Nevn",
         "minimise": "Minimer",
+        "new_message": "Ny melding",
         "new_room": "Nytt rom",
         "new_video_room": "Nytt videorom",
         "next": "Neste",
         "no": "Nei",
         "ok": "OK",
         "open": "Åpne",
+        "open_menu": "Åpne meny",
         "pause": "Pause",
         "pin": "Fest",
         "play": "Spill av",
@@ -1242,6 +1244,7 @@
         "change": "Bytt ut identitetstjener",
         "change_prompt": "Koble fra identitetsserveren  og koble til  i stedet?",
         "change_server_prompt": "Hvis du ikke ønsker å bruke  til å oppdage og bli oppdaget av eksisterende kontakter som du kjenner, skriv inn en annen identitetstjener nedenfor.",
+        "changed": "Identitetsserveren din har blitt endret",
         "checking": "Sjekker tjeneren",
         "description_connected": "Du bruker for øyeblikket  til å oppdage og bli oppdaget av eksisterende kontakter du kjenner. Du kan endre identitetsserveren din nedenfor.",
         "description_disconnected": "Du bruker for øyeblikket ikke en identitetsserver. For å oppdage og bli oppdaget av eksisterende kontakter du kjenner, legg til en nedenfor.",
@@ -3621,18 +3624,19 @@
                 "ble invitert %(count)s ganger": "other"
             },
             "joined": {
-                "%(oneUser)s ble med %(count)s ganger": "other",
-                "%(oneUser)s ble med": "one"
+                "one": "%(oneUser)sble med",
+                "other": "%(oneUser)sble med %(count)s ganger"
             },
             "joined_and_left": {
                 "%(oneUser)sble med og forlot igjen": "one"
             },
             "joined_and_left_multiple": {
-                "%(severalUsers)sble med og forlot igjen": "one"
+                "one": "%(severalUsers)sble med og forlot",
+                "other": "%(severalUsers)sble med og forlot %(count)s ganger"
             },
             "joined_multiple": {
-                "%(severalUsers)s ble med %(count)s ganger": "other",
-                "%(severalUsers)s ble med": "one"
+                "one": "%(severalUsers)sble med",
+                "other": "%(severalUsers)sble med %(count)s ganger"
             },
             "kicked": {
                 "one": "ble fjernet",
@@ -3675,7 +3679,8 @@
                 "other": "%(severalUsers)sfjernet %(count)s meldinger"
             },
             "rejected_invite": {
-                "%(oneUser)savslo invitasjonen sin": "one"
+                "one": "%(oneUser)savviste invitasjonen",
+                "other": "%(oneUser)savviste invitasjonen deres %(count)s ganger"
             },
             "rejected_invite_multiple": {
                 "one": "%(severalUsers)savviste invitasjonene deres",
diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json
index 5c9eb18c56..24b026098b 100644
--- a/src/i18n/strings/pl.json
+++ b/src/i18n/strings/pl.json
@@ -80,12 +80,14 @@
         "maximise": "Maksymalizuj",
         "mention": "Wzmianka",
         "minimise": "Minimalizuj",
+        "new_message": "Nowa wiadomość",
         "new_room": "Nowy pokój",
         "new_video_room": "Nowy pokój wideo",
         "next": "Dalej",
         "no": "Nie",
         "ok": "OK",
         "open": "Otwórz",
+        "open_menu": "Otwórz menu",
         "pause": "Wstrzymaj",
         "pin": "Przypnij",
         "play": "Odtwórz",
@@ -1251,6 +1253,7 @@
         "change": "Zmień serwer tożsamości",
         "change_prompt": "Rozłączyć się z bieżącym serwerem tożsamości  i połączyć się z ?",
         "change_server_prompt": "Jeżeli nie chcesz używać  do odnajdywania i bycia odnajdywanym przez osoby, które znasz, wpisz inny serwer tożsamości poniżej.",
+        "changed": "Twój serwer tożsamości został zmieniony",
         "checking": "Sprawdzanie serwera",
         "description_connected": "Używasz , aby odnajdywać i móc być odnajdywanym przez istniejące kontakty, które znasz. Możesz zmienić serwer tożsamości poniżej.",
         "description_disconnected": "Nie używasz serwera tożsamości. Aby odkrywać i być odkrywanym przez istniejące kontakty które znasz, dodaj jeden poniżej.",
@@ -1294,7 +1297,9 @@
         "title": "%(brand)s nie wspiera tej przeglądarki",
         "use_desktop_heading": "Zamiast tego użyj %(brand)s Desktop",
         "use_mobile_heading": "Zamiast tego użyj %(brand)s Mobile",
-        "use_mobile_heading_after_desktop": "lub skorzystaj z naszej aplikacji mobilnej"
+        "use_mobile_heading_after_desktop": "lub skorzystaj z naszej aplikacji mobilnej",
+        "windows_64bit": "Windows (64-bit)",
+        "windows_arm_64bit": "Windows (ARM 64-bit)"
     },
     "info_tooltip_title": "Informacje",
     "integration_manager": {
@@ -3471,6 +3476,7 @@
             "left_reason": "%(targetName)s opuścił pokój: %(reason)s",
             "no_change": "%(senderName)s nie dokonał żadnych zmian",
             "reject_invite": "%(targetName)s odrzucił zaproszenie",
+            "reject_invite_reason": "%(targetName)s odrzucił zaproszenie: %(reason)s",
             "remove_avatar": "%(senderName)s usunął swoje zdjęcie profilowe",
             "remove_name": "%(senderName)s usunął swoją widoczną nazwę (%(oldDisplayName)s)",
             "set_avatar": "%(senderName)s ustawił zdjęcie profilowe",
diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json
index 98e8a2af2a..33bd47ea3c 100644
--- a/src/i18n/strings/uk.json
+++ b/src/i18n/strings/uk.json
@@ -80,12 +80,14 @@
         "maximise": "Розгорнути",
         "mention": "Згадати",
         "minimise": "Згорнути",
+        "new_message": "Нове повідомлення",
         "new_room": "Нова кімната",
         "new_video_room": "Нова відеокімната",
         "next": "Далі",
         "no": "НІ",
         "ok": "Гаразд",
         "open": "Відкрити",
+        "open_menu": "Відкрити меню",
         "pause": "Призупинити",
         "pin": "Кнопка",
         "play": "Відтворити",
@@ -1244,6 +1246,7 @@
         "change": "Змінити сервер ідентифікації",
         "change_prompt": "Від'єднатися від сервера ідентифікації  й натомість під'єднатися до ?",
         "change_server_prompt": "Якщо ви не бажаєте використовувати , щоб знаходити наявні контакти й щоб вони вас знаходили, введіть інший сервер ідентифікації нижче.",
+        "changed": "Ваш сервер ідентифікації змінено",
         "checking": "Перевірка сервера",
         "description_connected": "Зараз  дозволяє вам знаходити контакти, а контактам вас. Можете змінити сервер ідентифікації нижче.",
         "description_disconnected": "Зараз ви не використовуєте сервер ідентифікації. Щоб знайти наявні контакти й вони могли знайти вас, додайте його нижче.",
@@ -1286,7 +1289,9 @@
         "title": "Непідтримуваний браузер",
         "use_desktop_heading": "Натомість використовуйте %(brand)s для комп'ютерів",
         "use_mobile_heading": "Натомість використовуйте %(brand)s для мобільних",
-        "use_mobile_heading_after_desktop": "Або скористайтеся нашим мобільним застосунком"
+        "use_mobile_heading_after_desktop": "Або скористайтеся нашим мобільним застосунком",
+        "windows_64bit": "Windows (64-розрядна)",
+        "windows_arm_64bit": "Windows (64-розрядна версія ARM)"
     },
     "info_tooltip_title": "Відомості",
     "integration_manager": {

From 7d94fa9b038136445c6b818f83ba127f48549127 Mon Sep 17 00:00:00 2001
From: Florian Duros 
Date: Mon, 24 Feb 2025 16:51:50 +0100
Subject: [PATCH 08/22] New room list: add compose menu for spaces in header
 (#29347)

* feat(new room list): add compose menu in header for spaces

* test(new room list): add tests for space

* test(e2e new room list): update space test

* chore: formatting and reuse type var
---
 .../room-list-view/room-list-header.spec.ts   |  2 +-
 .../roomlist/RoomListHeaderViewModel.tsx      | 37 ++++++++++++-------
 .../roomlist/RoomListHeaderViewModel-test.tsx | 28 ++++++++++++--
 3 files changed, 49 insertions(+), 18 deletions(-)

diff --git a/playwright/e2e/left-panel/room-list-view/room-list-header.spec.ts b/playwright/e2e/left-panel/room-list-view/room-list-header.spec.ts
index bda87b0462..2f4ef6f001 100644
--- a/playwright/e2e/left-panel/room-list-view/room-list-header.spec.ts
+++ b/playwright/e2e/left-panel/room-list-view/room-list-header.spec.ts
@@ -53,6 +53,6 @@ test.describe("Header section of the room list", () => {
 
         const roomListHeader = getHeaderSection(page);
         await expect(roomListHeader.getByRole("heading", { name: "MySpace" })).toBeVisible();
-        await expect(roomListHeader.getByRole("button", { name: "Add" })).not.toBeVisible();
+        await expect(roomListHeader.getByRole("button", { name: "Add" })).toBeVisible();
     });
 });
diff --git a/src/components/viewmodels/roomlist/RoomListHeaderViewModel.tsx b/src/components/viewmodels/roomlist/RoomListHeaderViewModel.tsx
index 3284933a9b..a37384b7fa 100644
--- a/src/components/viewmodels/roomlist/RoomListHeaderViewModel.tsx
+++ b/src/components/viewmodels/roomlist/RoomListHeaderViewModel.tsx
@@ -23,6 +23,7 @@ import {
     UPDATE_SELECTED_SPACE,
 } from "../../../stores/spaces";
 import SpaceStore from "../../../stores/spaces/SpaceStore";
+import { showCreateNewRoom } from "../../../utils/space";
 
 /**
  * Hook to get the active space and its title.
@@ -55,7 +56,7 @@ export interface RoomListHeaderViewState {
     title: string;
     /**
      * Whether to display the compose menu
-     * True if the user can create rooms and is not in a Space
+     * True if the user can create rooms
      */
     displayComposeMenu: boolean;
     /**
@@ -84,15 +85,13 @@ export interface RoomListHeaderViewState {
 
 /**
  * View model for the RoomListHeader.
- * The actions don't work when called in a space yet.
  */
 export function useRoomListHeaderViewModel(): RoomListHeaderViewState {
     const { activeSpace, title } = useSpace();
 
     const canCreateRoom = shouldShowComponent(UIComponent.CreateRooms);
     const canCreateVideoRoom = useFeatureEnabled("feature_video_rooms");
-    // Temporary: don't display the compose menu when in a Space
-    const displayComposeMenu = canCreateRoom && !activeSpace;
+    const displayComposeMenu = canCreateRoom;
 
     /* Actions */
 
@@ -101,20 +100,30 @@ export function useRoomListHeaderViewModel(): RoomListHeaderViewState {
         PosthogTrackers.trackInteraction("WebRoomListHeaderPlusMenuCreateChatItem", e);
     }, []);
 
-    const createRoom = useCallback((e: Event) => {
-        defaultDispatcher.fire(Action.CreateRoom);
-        PosthogTrackers.trackInteraction("WebRoomListHeaderPlusMenuCreateRoomItem", e);
-    }, []);
+    const createRoom = useCallback(
+        (e: Event) => {
+            if (activeSpace) {
+                showCreateNewRoom(activeSpace);
+            } else {
+                defaultDispatcher.fire(Action.CreateRoom);
+            }
+            PosthogTrackers.trackInteraction("WebRoomListHeaderPlusMenuCreateRoomItem", e);
+        },
+        [activeSpace],
+    );
 
     const elementCallVideoRoomsEnabled = useFeatureEnabled("feature_element_call_video_rooms");
-    const createVideoRoom = useCallback(
-        () =>
+    const createVideoRoom = useCallback(() => {
+        const type = elementCallVideoRoomsEnabled ? RoomType.UnstableCall : RoomType.ElementVideo;
+        if (activeSpace) {
+            showCreateNewRoom(activeSpace, type);
+        } else {
             defaultDispatcher.dispatch({
                 action: Action.CreateRoom,
-                type: elementCallVideoRoomsEnabled ? RoomType.UnstableCall : RoomType.ElementVideo,
-            }),
-        [elementCallVideoRoomsEnabled],
-    );
+                type,
+            });
+        }
+    }, [activeSpace, elementCallVideoRoomsEnabled]);
 
     return {
         title,
diff --git a/test/unit-tests/components/viewmodels/roomlist/RoomListHeaderViewModel-test.tsx b/test/unit-tests/components/viewmodels/roomlist/RoomListHeaderViewModel-test.tsx
index 95a594e3b6..fe96e26861 100644
--- a/test/unit-tests/components/viewmodels/roomlist/RoomListHeaderViewModel-test.tsx
+++ b/test/unit-tests/components/viewmodels/roomlist/RoomListHeaderViewModel-test.tsx
@@ -6,7 +6,7 @@
  */
 
 import { renderHook } from "jest-matrix-react";
-import { type MatrixClient, RoomType } from "matrix-js-sdk/src/matrix";
+import { type MatrixClient, type Room, RoomType } from "matrix-js-sdk/src/matrix";
 import { mocked } from "jest-mock";
 
 import { useRoomListHeaderViewModel } from "../../../../../src/components/viewmodels/roomlist/RoomListHeaderViewModel";
@@ -16,16 +16,23 @@ import { shouldShowComponent } from "../../../../../src/customisations/helpers/U
 import SettingsStore from "../../../../../src/settings/SettingsStore";
 import defaultDispatcher from "../../../../../src/dispatcher/dispatcher";
 import { Action } from "../../../../../src/dispatcher/actions";
+import { showCreateNewRoom } from "../../../../../src/utils/space";
 
 jest.mock("../../../../../src/customisations/helpers/UIComponents", () => ({
     shouldShowComponent: jest.fn(),
 }));
 
+jest.mock("../../../../../src/utils/space", () => ({
+    showCreateNewRoom: jest.fn(),
+}));
+
 describe("useRoomListHeaderViewModel", () => {
     let matrixClient: MatrixClient;
+    let space: Room;
 
     beforeEach(() => {
         matrixClient = stubClient();
+        space = mkStubRoom("spaceId", "spaceName", matrixClient);
     });
 
     afterEach(() => {
@@ -39,8 +46,7 @@ describe("useRoomListHeaderViewModel", () => {
         });
 
         it("should return the current space name as title", () => {
-            const room = mkStubRoom("spaceId", "spaceName", matrixClient);
-            jest.spyOn(SpaceStore.instance, "activeSpaceRoom", "get").mockReturnValue(room);
+            jest.spyOn(SpaceStore.instance, "activeSpaceRoom", "get").mockReturnValue(space);
             const { result } = renderHook(() => useRoomListHeaderViewModel());
 
             expect(result.current.title).toStrictEqual("spaceName");
@@ -81,6 +87,14 @@ describe("useRoomListHeaderViewModel", () => {
         expect(spy).toHaveBeenCalledWith(Action.CreateRoom);
     });
 
+    it("should call showCreateNewRoom when createRoom is called in a space", () => {
+        jest.spyOn(SpaceStore.instance, "activeSpaceRoom", "get").mockReturnValue(space);
+        const { result } = renderHook(() => useRoomListHeaderViewModel());
+        result.current.createRoom(new Event("click"));
+
+        expect(showCreateNewRoom).toHaveBeenCalledWith(space);
+    });
+
     it("should fire Action.CreateRoom with RoomType.UnstableCall when createVideoRoom is called and feature_element_call_video_rooms is enabled", () => {
         jest.spyOn(SettingsStore, "getValue").mockReturnValue(true);
         const spy = jest.spyOn(defaultDispatcher, "dispatch");
@@ -98,4 +112,12 @@ describe("useRoomListHeaderViewModel", () => {
 
         expect(spy).toHaveBeenCalledWith({ action: Action.CreateRoom, type: RoomType.ElementVideo });
     });
+
+    it("should call showCreateNewRoom when createVideoRoom is called in a space", () => {
+        jest.spyOn(SpaceStore.instance, "activeSpaceRoom", "get").mockReturnValue(space);
+        const { result } = renderHook(() => useRoomListHeaderViewModel());
+        result.current.createVideoRoom();
+
+        expect(showCreateNewRoom).toHaveBeenCalledWith(space, RoomType.ElementVideo);
+    });
 });

From 8ef84349b5b74d4c2b9edceee376e6a1df56ec92 Mon Sep 17 00:00:00 2001
From: Michael Telatynski <7t3chguy@gmail.com>
Date: Mon, 24 Feb 2025 16:54:57 +0000
Subject: [PATCH 09/22] Dynamically load Element Web modules in Docker
 entrypoint (#29346)

* Dynamically load Element Web modules in Docker entrypoint

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>

* Iterate

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>

* Drop environment for PR runs

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>

* Iterate

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>

---------

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---
 .github/workflows/docker.yaml                 | 37 ++++++++++++++++++-
 Dockerfile                                    |  8 +++-
 .../18-load-element-modules.sh                | 34 +++++++++++++++++
 docker/nginx-templates/default.conf.template  |  4 ++
 docs/install.md                               | 12 ++++++
 5 files changed, 93 insertions(+), 2 deletions(-)
 create mode 100755 docker/docker-entrypoint.d/18-load-element-modules.sh

diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml
index a6b54cabd5..56b91c750e 100644
--- a/.github/workflows/docker.yaml
+++ b/.github/workflows/docker.yaml
@@ -3,6 +3,7 @@ on:
     workflow_dispatch: {}
     push:
         tags: [v*]
+    pull_request: {}
     schedule:
         # This job can take a while, and we have usage limits, so just publish develop only twice a day
         - cron: "0 7/12 * * *"
@@ -12,10 +13,12 @@ jobs:
     buildx:
         name: Docker Buildx
         runs-on: ubuntu-24.04
-        environment: dockerhub
+        environment: ${{ github.event_name != 'pull_request' && 'dockerhub' || '' }}
         permissions:
             id-token: write # needed for signing the images with GitHub OIDC Token
             packages: write # needed for publishing packages to GHCR
+        env:
+            TEST_TAG: vectorim/element-web:test
         steps:
             - uses: actions/checkout@v4
               with:
@@ -23,6 +26,7 @@ jobs:
 
             - name: Install Cosign
               uses: sigstore/cosign-installer@c56c2d3e59e4281cc41dea2217323ba5694b171e # v3
+              if: github.event_name != 'pull_request'
 
             - name: Set up QEMU
               uses: docker/setup-qemu-action@4574d27a4764455b42196d70a065bc6853246a25 # v3
@@ -34,20 +38,48 @@ jobs:
 
             - name: Login to Docker Hub
               uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3
+              if: github.event_name != 'pull_request'
               with:
                   username: ${{ secrets.DOCKERHUB_USERNAME }}
                   password: ${{ secrets.DOCKERHUB_TOKEN }}
 
             - name: Login to GitHub Container Registry
               uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3
+              if: github.event_name != 'pull_request'
               with:
                   registry: ghcr.io
                   username: ${{ github.repository_owner }}
                   password: ${{ secrets.GITHUB_TOKEN }}
 
+            - name: Build and load
+              uses: docker/build-push-action@ca877d9245402d1537745e0e356eab47c3520991 # v6
+              with:
+                  context: .
+                  load: true
+                  tags: ${{ env.TEST_TAG }}
+
+            - name: Test the image
+              run: |
+                  # Make a fake module to test the image
+                  MODULE_PATH="modules/module_name/index.js"
+                  mkdir -p $(dirname $MODULE_PATH)
+                  echo 'alert("Testing");' > $MODULE_PATH
+
+                  # Spin up a container of the image
+                  CONTAINER_ID=$(docker run --rm -dp 80:80 -v $(pwd)/modules:/tmp/element-web-modules ${{ env.TEST_TAG }})
+
+                  # Run some smoke tests
+                  wget --retry-connrefused --tries=5 -q --wait=3 --spider http://localhost:80/modules/module_name/index.js
+                  MODULE_1=$(curl http://localhost:80/config.json | jq -r .modules[0])
+                  test "$MODULE_1" = "/${MODULE_PATH}"
+
+                  # Clean up
+                  docker stop "$CONTAINER_ID"
+
             - name: Docker meta
               id: meta
               uses: docker/metadata-action@369eb591f429131d6889c46b94e711f089e6ca96 # v5
+              if: github.event_name != 'pull_request'
               with:
                   images: |
                       vectorim/element-web
@@ -61,6 +93,7 @@ jobs:
             - name: Build and push
               id: build-and-push
               uses: docker/build-push-action@ca877d9245402d1537745e0e356eab47c3520991 # v6
+              if: github.event_name != 'pull_request'
               with:
                   context: .
                   push: true
@@ -72,6 +105,7 @@ jobs:
               env:
                   DIGEST: ${{ steps.build-and-push.outputs.digest }}
                   TAGS: ${{ steps.meta.outputs.tags }}
+              if: github.event_name != 'pull_request'
               run: |
                   images=""
                   for tag in ${TAGS}; do
@@ -81,6 +115,7 @@ jobs:
 
             - name: Update repo description
               uses: peter-evans/dockerhub-description@e98e4d1628a5f3be2be7c231e50981aee98723ae # v4
+              if: github.event_name != 'pull_request'
               continue-on-error: true
               with:
                   username: ${{ secrets.DOCKERHUB_USERNAME }}
diff --git a/Dockerfile b/Dockerfile
index 93d7c676d9..dd8be21932 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,3 +1,5 @@
+# syntax=docker.io/docker/dockerfile:1.7-labs
+
 # Builder
 FROM --platform=$BUILDPLATFORM node:22-bullseye AS builder
 
@@ -8,7 +10,7 @@ ARG JS_SDK_BRANCH="master"
 
 WORKDIR /src
 
-COPY . /src
+COPY --exclude=docker . /src
 RUN /src/scripts/docker-link-repos.sh
 RUN yarn --network-timeout=200000 install
 RUN /src/scripts/docker-package.sh
@@ -19,11 +21,15 @@ RUN cp /src/config.sample.json /src/webapp/config.json
 # App
 FROM nginx:alpine-slim
 
+# Install jq and moreutils for sponge, both used by our entrypoints
+RUN apk add jq moreutils
+
 COPY --from=builder /src/webapp /app
 
 # Override default nginx config. Templates in `/etc/nginx/templates` are passed
 # through `envsubst` by the nginx docker image entry point.
 COPY /docker/nginx-templates/* /etc/nginx/templates/
+COPY /docker/docker-entrypoint.d/* /docker-entrypoint.d/
 
 # Tell nginx to put its pidfile elsewhere, so it can run as non-root
 RUN sed -i -e 's,/var/run/nginx.pid,/tmp/nginx.pid,' /etc/nginx/nginx.conf
diff --git a/docker/docker-entrypoint.d/18-load-element-modules.sh b/docker/docker-entrypoint.d/18-load-element-modules.sh
new file mode 100755
index 0000000000..15c0cb6086
--- /dev/null
+++ b/docker/docker-entrypoint.d/18-load-element-modules.sh
@@ -0,0 +1,34 @@
+#!/bin/sh
+
+# Loads modules from `/tmp/element-web-modules` into config.json's `modules` field
+
+set -e
+
+entrypoint_log() {
+    if [ -z "${NGINX_ENTRYPOINT_QUIET_LOGS:-}" ]; then
+        echo "$@"
+    fi
+}
+
+# Copy these config files as a base
+mkdir /tmp/element-web-config
+cp /app/config*.json /tmp/element-web-config/
+
+# If there are modules to be loaded
+if [ -d "/tmp/element-web-modules" ]; then
+    cd /tmp/element-web-modules
+
+    for MODULE in *
+    do
+        # If the module has a package.json, use its main field as the entrypoint
+        ENTRYPOINT="index.js"
+        if [ -f "/tmp/element-web-modules/$MODULE/package.json" ]; then
+            ENTRYPOINT=$(jq -r '.main' "/tmp/element-web-modules/$MODULE/package.json")
+        fi
+
+        entrypoint_log "Loading module $MODULE with entrypoint $ENTRYPOINT"
+
+        # Append the module to the config
+        jq ".modules += [\"/modules/$MODULE/$ENTRYPOINT\"]" /tmp/element-web-config/config.json | sponge /tmp/element-web-config/config.json
+    done
+fi
diff --git a/docker/nginx-templates/default.conf.template b/docker/nginx-templates/default.conf.template
index 06f33e08dd..53870038b6 100644
--- a/docker/nginx-templates/default.conf.template
+++ b/docker/nginx-templates/default.conf.template
@@ -18,8 +18,12 @@ server {
     }
     # covers config.json and config.hostname.json requests as it is prefix.
     location /config {
+        root /tmp/element-web-config;
         add_header Cache-Control "no-cache";
     }
+    location /modules {
+        alias /tmp/element-web-modules;
+    }
     # redirect server error pages to the static page /50x.html
     #
     error_page   500 502 503 504  /50x.html;
diff --git a/docs/install.md b/docs/install.md
index f6bd98611c..743ae0a93a 100644
--- a/docs/install.md
+++ b/docs/install.md
@@ -66,6 +66,18 @@ on other runtimes may require root privileges. To resolve this, either run the
 image as root (`docker run --user 0`) or, better, change the port that nginx
 listens on via the `ELEMENT_WEB_PORT` environment variable.
 
+[Element Web Modules](https://github.com/element-hq/element-modules/tree/main/packages/element-web-module-api) can be dynamically loaded
+by being made available (e.g. via bind mount) in a directory within `/tmp/element-web-modules/`.
+The default entrypoint will be index.js in that directory but can be overridden if a package.json file is found with a `main` directive.
+These modules will be presented in a `/modules` subdirectory within the webroot, and automatically added to the config.json `modules` field.
+
+If you wish to use docker in read-only mode,
+you should follow the [upstream instructions](https://hub.docker.com/_/nginx#:~:text=Running%20nginx%20in%20read%2Donly%20mode)
+but additionally include the following directories:
+
+- /tmp/element-web-config/
+- /etc/nginx/conf.d/
+
 The behaviour of the docker image can be customised via the following
 environment variables:
 

From efc6149a8b3362c01b93f52e76e5c4ae8cbcb65c Mon Sep 17 00:00:00 2001
From: Florian Duros 
Date: Mon, 24 Feb 2025 18:08:12 +0100
Subject: [PATCH 10/22] Update `@vector-im/compound-design-tokens` &
 `@vector-im/compound-web` (#29307)

* chore: update `@vector-im/compound-design-tokens` & `@vector-im/compound-web` to last version

* chore: use `error-solid` icon instead of `error`

* chore: update jest snapshot

* fix: `AccessibleButton` lint
---
 package.json                                  |   4 +-
 res/css/structures/_SpaceHierarchy.pcss       |   2 +-
 .../context_menus/_MessageContextMenu.pcss    |   2 +-
 .../security/_AccessSecretStorageDialog.pcss  |   4 +-
 res/css/views/elements/_InfoTooltip.pcss      |   2 +-
 src/components/views/auth/LoginWithQRFlow.tsx |   2 +-
 .../views/elements/AccessibleButton.tsx       |   2 +-
 .../views/right_panel/RoomSummaryCard.tsx     |   2 +-
 .../MemberList/tiles/common/E2EIconView.tsx   |   2 +-
 .../views/rooms/RoomHeader/RoomHeader.tsx     |   2 +-
 .../views/settings/SettingsSubheader.tsx      |   2 +-
 .../encryption/ResetIdentityPanel.tsx         |   2 +-
 .../__snapshots__/ErrorView-test.tsx.snap     |  32 +-
 .../__snapshots__/FilePanel-test.tsx.snap     |  14 +-
 .../__snapshots__/MessagePanel-test.tsx.snap  |   2 +-
 .../__snapshots__/RoomView-test.tsx.snap      | 248 ++++----
 .../SpaceHierarchy-test.tsx.snap              |  10 +-
 .../__snapshots__/ThreadPanel-test.tsx.snap   |   8 +-
 ...teractiveAuthEntryComponents-test.tsx.snap |  10 +-
 .../DecoratedRoomAvatar-test.tsx.snap         |   4 +-
 .../__snapshots__/RoomAvatar-test.tsx.snap    |   6 +-
 .../__snapshots__/BeaconMarker-test.tsx.snap  |   2 +-
 .../BeaconViewDialog-test.tsx.snap            |   4 +-
 .../__snapshots__/DialogSidebar-test.tsx.snap |   6 +-
 .../ConfirmUserActionDialog-test.tsx.snap     |   2 +-
 ...nageRestrictedJoinRuleDialog-test.tsx.snap |   2 +-
 .../__snapshots__/ShareDialog-test.tsx.snap   |  40 +-
 .../UnpinAllDialog-test.tsx.snap              |   6 +-
 .../UserSettingsDialog-test.tsx.snap          |  34 +-
 .../__snapshots__/AppTile-test.tsx.snap       |  42 +-
 .../__snapshots__/FacePile-test.tsx.snap      |   4 +-
 .../FilterDropdown-test.tsx.snap              |   2 +-
 .../elements/__snapshots__/Pill-test.tsx.snap |  18 +-
 .../__snapshots__/RoomFacePile-test.tsx.snap  |   4 +-
 .../LocationViewDialog-test.tsx.snap          |   6 +-
 .../__snapshots__/MapError-test.tsx.snap      |   6 +-
 .../__snapshots__/Marker-test.tsx.snap        |   2 +-
 .../__snapshots__/SmartMarker-test.tsx.snap   |   4 +-
 .../__snapshots__/ZoomButtons-test.tsx.snap   |   4 +-
 .../views/messages/TextualBody-test.tsx       |   4 +-
 .../DecryptionFailureBody-test.tsx.snap       |   2 +-
 .../__snapshots__/MBeaconBody-test.tsx.snap   |   2 +-
 .../__snapshots__/MFileBody-test.tsx.snap     |   4 +-
 .../__snapshots__/MLocationBody-test.tsx.snap |   4 +-
 .../PinnedMessageBadge-test.tsx.snap          |   2 +-
 .../__snapshots__/TextualBody-test.tsx.snap   |  22 +-
 .../__snapshots__/PollHistory-test.tsx.snap   |   2 +-
 .../__snapshots__/BaseCard-test.tsx.snap      |   8 +-
 .../ExtensionsCard-test.tsx.snap              |  44 +-
 .../PinnedMessagesCard-test.tsx.snap          |  68 +--
 .../RoomSummaryCard-test.tsx.snap             | 574 +++++++++---------
 .../__snapshots__/UserInfo-test.tsx.snap      | 170 +++---
 .../UrlPreviewSettings-test.tsx.snap          |   4 +-
 .../EventTileThreadToolbar-test.tsx.snap      |   2 +-
 .../__snapshots__/RoomHeader-test.tsx.snap    |  28 +-
 .../VideoRoomChatButton-test.tsx.snap         |   6 +-
 .../RoomListHeaderView-test.tsx.snap          |  13 +-
 .../RoomListSearch-test.tsx.snap              |  16 +-
 .../__snapshots__/RoomListView-test.tsx.snap  |  21 +-
 .../PinnedEventTile-test.tsx.snap             | 100 +--
 .../PinnedMessageBanner-test.tsx.snap         |  24 +-
 .../ReadReceiptGroup-test.tsx.snap            |  10 +-
 .../RoomPreviewBar-test.tsx.snap              |  12 +-
 .../__snapshots__/RoomTile-test.tsx.snap      |   8 +-
 .../ThirdPartyMemberInfo-test.tsx.snap        |  24 +-
 .../MemberTileView-test.tsx.snap              |  14 +-
 .../PresenceIconView-test.tsx.snap            |  10 +-
 .../FormattingButtons-test.tsx.snap           |  20 +-
 .../LayoutSwitcher-test.tsx.snap              |  64 +-
 .../PowerLevelSelector-test.tsx.snap          |   4 +-
 .../__snapshots__/SetIdServer-test.tsx.snap   |  10 +-
 .../SettingsHeader-test.tsx.snap              |   4 +-
 .../SettingsSubheader-test.tsx.snap           |   6 +-
 .../ThemeChoicePanel-test.tsx.snap            | 250 ++++----
 .../CurrentDeviceSection-test.tsx.snap        |  10 +-
 .../DeviceExpandDetailsButton-test.tsx.snap   |   4 +-
 .../LoginWithQRFlow-test.tsx.snap             | 100 +--
 .../__snapshots__/AdvancedPanel-test.tsx.snap |  42 +-
 .../ChangeRecoveryKey-test.tsx.snap           | 170 +++---
 .../EncryptionCard-test.tsx.snap              |   6 +-
 .../__snapshots__/RecoveryPanel-test.tsx.snap |  18 +-
 .../RecoveryPanelOutOfSync-test.tsx.snap      |  10 +-
 .../ResetIdentityPanel-test.tsx.snap          |  96 +--
 .../Notifications2-test.tsx.snap              |  18 +-
 .../PeopleRoomSettingsTab-test.tsx.snap       |  14 +-
 .../AppearanceUserSettingsTab-test.tsx.snap   | 110 ++--
 .../EncryptionUserSettingsTab-test.tsx.snap   |  66 +-
 .../SecurityUserSettingsTab-test.tsx.snap     |  10 +-
 .../SessionManagerTab-test.tsx.snap           |   8 +-
 .../SidebarUserSettingsTab-test.tsx.snap      |  20 +-
 .../AddExistingToSpaceDialog-test.tsx.snap    |   4 +-
 .../__snapshots__/SpacePanel-test.tsx.snap    |   8 +-
 .../ThreadsActivityCentre-test.tsx.snap       | 106 ++--
 .../__snapshots__/GenericToast-test.tsx.snap  |   8 +-
 .../VerificationRequestToast-test.tsx.snap    |   8 +-
 .../UnverifiedSessionToast-test.tsx.snap      |   6 +-
 .../__snapshots__/HTMLExport-test.ts.snap     |   6 +-
 .../vector/__snapshots__/init-test.ts.snap    |  34 +-
 yarn.lock                                     |  23 +-
 99 files changed, 1498 insertions(+), 1513 deletions(-)

diff --git a/package.json b/package.json
index a3390c11c0..2c37e3111b 100644
--- a/package.json
+++ b/package.json
@@ -91,8 +91,8 @@
         "@sentry/browser": "^9.0.0",
         "@types/png-chunks-extract": "^1.0.2",
         "@types/react-virtualized": "^9.21.30",
-        "@vector-im/compound-design-tokens": "^3.0.0",
-        "@vector-im/compound-web": "^7.6.1",
+        "@vector-im/compound-design-tokens": "^4.0.0",
+        "@vector-im/compound-web": "^7.6.4",
         "@vector-im/matrix-wysiwyg": "2.38.0",
         "@zxcvbn-ts/core": "^3.0.4",
         "@zxcvbn-ts/language-common": "^3.0.4",
diff --git a/res/css/structures/_SpaceHierarchy.pcss b/res/css/structures/_SpaceHierarchy.pcss
index 31dad9413f..02f39a0b72 100644
--- a/res/css/structures/_SpaceHierarchy.pcss
+++ b/res/css/structures/_SpaceHierarchy.pcss
@@ -77,7 +77,7 @@ Please see LICENSE files in the repository root for full details.
             height: 16px;
             width: 16px;
             left: 0;
-            background-image: url("@vector-im/compound-design-tokens/icons/error.svg");
+            background-image: url("@vector-im/compound-design-tokens/icons/error-solid.svg");
             background-size: cover;
             background-repeat: no-repeat;
         }
diff --git a/res/css/views/context_menus/_MessageContextMenu.pcss b/res/css/views/context_menus/_MessageContextMenu.pcss
index f365c4a293..9fc454f328 100644
--- a/res/css/views/context_menus/_MessageContextMenu.pcss
+++ b/res/css/views/context_menus/_MessageContextMenu.pcss
@@ -29,7 +29,7 @@ Please see LICENSE files in the repository root for full details.
     }
 
     .mx_MessageContextMenu_iconReport::before {
-        mask-image: url("@vector-im/compound-design-tokens/icons/error.svg");
+        mask-image: url("@vector-im/compound-design-tokens/icons/error-solid.svg");
     }
 
     .mx_MessageContextMenu_iconLink::before {
diff --git a/res/css/views/dialogs/security/_AccessSecretStorageDialog.pcss b/res/css/views/dialogs/security/_AccessSecretStorageDialog.pcss
index da71b4462b..83b9fe96b4 100644
--- a/res/css/views/dialogs/security/_AccessSecretStorageDialog.pcss
+++ b/res/css/views/dialogs/security/_AccessSecretStorageDialog.pcss
@@ -21,7 +21,7 @@ Please see LICENSE files in the repository root for full details.
 
         &.mx_AccessSecretStorageDialog_resetBadge::before {
             /* The image isn't capable of masking, so we use a background instead. */
-            background-image: url("@vector-im/compound-design-tokens/icons/error.svg");
+            background-image: url("@vector-im/compound-design-tokens/icons/error-solid.svg");
             background-size: 24px;
             background-color: transparent;
         }
@@ -120,7 +120,7 @@ Please see LICENSE files in the repository root for full details.
                         width: 16px;
                         left: 0;
                         top: 2px; /* alignment */
-                        background-image: url("@vector-im/compound-design-tokens/icons/error.svg");
+                        background-image: url("@vector-im/compound-design-tokens/icons/error-solid.svg");
                         background-size: contain;
                     }
 
diff --git a/res/css/views/elements/_InfoTooltip.pcss b/res/css/views/elements/_InfoTooltip.pcss
index 5229b7d9f5..a214f0bf83 100644
--- a/res/css/views/elements/_InfoTooltip.pcss
+++ b/res/css/views/elements/_InfoTooltip.pcss
@@ -29,5 +29,5 @@ Please see LICENSE files in the repository root for full details.
 }
 
 .mx_InfoTooltip_icon_warning::before {
-    mask-image: url("@vector-im/compound-design-tokens/icons/error.svg");
+    mask-image: url("@vector-im/compound-design-tokens/icons/error-solid.svg");
 }
diff --git a/src/components/views/auth/LoginWithQRFlow.tsx b/src/components/views/auth/LoginWithQRFlow.tsx
index 588e599098..b246013421 100644
--- a/src/components/views/auth/LoginWithQRFlow.tsx
+++ b/src/components/views/auth/LoginWithQRFlow.tsx
@@ -10,7 +10,7 @@ import React, { createRef, type ReactNode } from "react";
 import { ClientRendezvousFailureReason, MSC4108FailureReason } from "matrix-js-sdk/src/rendezvous";
 import ChevronLeftIcon from "@vector-im/compound-design-tokens/assets/web/icons/chevron-left";
 import CheckCircleSolidIcon from "@vector-im/compound-design-tokens/assets/web/icons/check-circle-solid";
-import ErrorIcon from "@vector-im/compound-design-tokens/assets/web/icons/error";
+import ErrorIcon from "@vector-im/compound-design-tokens/assets/web/icons/error-solid";
 import { Heading, MFAInput, Text } from "@vector-im/compound-web";
 import classNames from "classnames";
 import { QrCodeIcon } from "@vector-im/compound-design-tokens/assets/web/icons";
diff --git a/src/components/views/elements/AccessibleButton.tsx b/src/components/views/elements/AccessibleButton.tsx
index efb6e5f939..a07e40c1d7 100644
--- a/src/components/views/elements/AccessibleButton.tsx
+++ b/src/components/views/elements/AccessibleButton.tsx
@@ -80,7 +80,7 @@ type Props = {
     /**
      * The tooltip to show on hover or focus.
      */
-    title?: TooltipProps["label"];
+    title?: string;
     /**
      * The caption is a secondary text displayed under the `title` of the tooltip.
      * Only valid when used in conjunction with `title`.
diff --git a/src/components/views/right_panel/RoomSummaryCard.tsx b/src/components/views/right_panel/RoomSummaryCard.tsx
index 8c32c21f0f..2d3453feba 100644
--- a/src/components/views/right_panel/RoomSummaryCard.tsx
+++ b/src/components/views/right_panel/RoomSummaryCard.tsx
@@ -35,7 +35,7 @@ import PinIcon from "@vector-im/compound-design-tokens/assets/web/icons/pin";
 import LockIcon from "@vector-im/compound-design-tokens/assets/web/icons/lock-solid";
 import LockOffIcon from "@vector-im/compound-design-tokens/assets/web/icons/lock-off";
 import PublicIcon from "@vector-im/compound-design-tokens/assets/web/icons/public";
-import ErrorIcon from "@vector-im/compound-design-tokens/assets/web/icons/error";
+import ErrorIcon from "@vector-im/compound-design-tokens/assets/web/icons/error-solid";
 import ChevronDownIcon from "@vector-im/compound-design-tokens/assets/web/icons/chevron-down";
 import { EventType, JoinRule, type Room, RoomStateEvent } from "matrix-js-sdk/src/matrix";
 
diff --git a/src/components/views/rooms/MemberList/tiles/common/E2EIconView.tsx b/src/components/views/rooms/MemberList/tiles/common/E2EIconView.tsx
index a1f37e5185..c25d40fc58 100644
--- a/src/components/views/rooms/MemberList/tiles/common/E2EIconView.tsx
+++ b/src/components/views/rooms/MemberList/tiles/common/E2EIconView.tsx
@@ -8,7 +8,7 @@ Please see LICENSE files in the repository root for full details.
 import React from "react";
 import { Tooltip } from "@vector-im/compound-web";
 import VerifiedIcon from "@vector-im/compound-design-tokens/assets/web/icons/verified";
-import ErrorIcon from "@vector-im/compound-design-tokens/assets/web/icons/error";
+import ErrorIcon from "@vector-im/compound-design-tokens/assets/web/icons/error-solid";
 
 import { _t } from "../../../../../../languageHandler";
 import { E2EStatus } from "../../../../../../utils/ShieldUtils";
diff --git a/src/components/views/rooms/RoomHeader/RoomHeader.tsx b/src/components/views/rooms/RoomHeader/RoomHeader.tsx
index 964295f0be..dbd8c4d073 100644
--- a/src/components/views/rooms/RoomHeader/RoomHeader.tsx
+++ b/src/components/views/rooms/RoomHeader/RoomHeader.tsx
@@ -15,7 +15,7 @@ import ThreadsIcon from "@vector-im/compound-design-tokens/assets/web/icons/thre
 import RoomInfoIcon from "@vector-im/compound-design-tokens/assets/web/icons/info-solid";
 import NotificationsIcon from "@vector-im/compound-design-tokens/assets/web/icons/notifications-solid";
 import VerifiedIcon from "@vector-im/compound-design-tokens/assets/web/icons/verified";
-import ErrorIcon from "@vector-im/compound-design-tokens/assets/web/icons/error";
+import ErrorIcon from "@vector-im/compound-design-tokens/assets/web/icons/error-solid";
 import PublicIcon from "@vector-im/compound-design-tokens/assets/web/icons/public";
 import { JoinRule, type Room } from "matrix-js-sdk/src/matrix";
 import { type ViewRoomOpts } from "@matrix-org/react-sdk-module-api/lib/lifecycles/RoomViewLifecycle";
diff --git a/src/components/views/settings/SettingsSubheader.tsx b/src/components/views/settings/SettingsSubheader.tsx
index e3e6eae555..158728f530 100644
--- a/src/components/views/settings/SettingsSubheader.tsx
+++ b/src/components/views/settings/SettingsSubheader.tsx
@@ -7,7 +7,7 @@
 
 import React, { type JSX } from "react";
 import CheckCircleIcon from "@vector-im/compound-design-tokens/assets/web/icons/check-circle-solid";
-import ErrorIcon from "@vector-im/compound-design-tokens/assets/web/icons/error";
+import ErrorIcon from "@vector-im/compound-design-tokens/assets/web/icons/error-solid";
 import classNames from "classnames";
 
 interface SettingsSubheaderProps {
diff --git a/src/components/views/settings/encryption/ResetIdentityPanel.tsx b/src/components/views/settings/encryption/ResetIdentityPanel.tsx
index 7b3b84c6b8..747b22fd59 100644
--- a/src/components/views/settings/encryption/ResetIdentityPanel.tsx
+++ b/src/components/views/settings/encryption/ResetIdentityPanel.tsx
@@ -8,7 +8,7 @@
 import { Breadcrumb, Button, VisualList, VisualListItem } from "@vector-im/compound-web";
 import CheckIcon from "@vector-im/compound-design-tokens/assets/web/icons/check";
 import InfoIcon from "@vector-im/compound-design-tokens/assets/web/icons/info";
-import ErrorIcon from "@vector-im/compound-design-tokens/assets/web/icons/error";
+import ErrorIcon from "@vector-im/compound-design-tokens/assets/web/icons/error-solid";
 import React, { type MouseEventHandler } from "react";
 
 import { _t } from "../../../../languageHandler";
diff --git a/test/unit-tests/async-components/structures/__snapshots__/ErrorView-test.tsx.snap b/test/unit-tests/async-components/structures/__snapshots__/ErrorView-test.tsx.snap
index 16e94cdeee..469ef5db5d 100644
--- a/test/unit-tests/async-components/structures/__snapshots__/ErrorView-test.tsx.snap
+++ b/test/unit-tests/async-components/structures/__snapshots__/ErrorView-test.tsx.snap
@@ -15,17 +15,17 @@ exports[` should match snapshot 1`] = `
       class="mx_ErrorView_container"
     >
       

TITLE

MSG1

MSG2

@@ -49,17 +49,17 @@ exports[` should match snapshot 1`] = ` class="mx_ErrorView_container" >

Element does not support this browser

Element uses some browser features which are not available in your current browser. Try updating this browser if you're not using the latest version and try again.

For the best experience, use @@ -102,7 +102,7 @@ exports[` should match snapshot 1`] = ` style="--mx-flex-display: flex; --mx-flex-direction: row; --mx-flex-align: start; --mx-flex-justify: start; --mx-flex-gap: var(--cpd-space-4x);" >

Or use our mobile app

diff --git a/test/unit-tests/components/structures/__snapshots__/FilePanel-test.tsx.snap b/test/unit-tests/components/structures/__snapshots__/FilePanel-test.tsx.snap index 6a58ac9811..d8a1e2302d 100644 --- a/test/unit-tests/components/structures/__snapshots__/FilePanel-test.tsx.snap +++ b/test/unit-tests/components/structures/__snapshots__/FilePanel-test.tsx.snap @@ -12,7 +12,7 @@ exports[`FilePanel renders empty state 1`] = ` class="mx_BaseCard_header_title" >

Files @@ -20,14 +20,14 @@ exports[`FilePanel renders empty state 1`] = `

@@ -263,13 +263,13 @@ exports[`RoomView for a local room in state ERROR should match the snapshot 1`]
@@ -563,13 +563,13 @@ exports[`RoomView for a local room in state NEW should match the snapshot 1`] =
@@ -940,13 +940,13 @@ exports[`RoomView for a local room in state NEW that is encrypted should match t
@@ -1325,13 +1325,13 @@ exports[`RoomView should not display the timeline when the room encryption is lo
0
@@ -1497,7 +1497,7 @@ exports[`RoomView should not display the timeline when the room encryption is lo
0
@@ -1878,7 +1878,7 @@ exports[`RoomView video rooms should render joined video room view 1`] = `
0
@@ -2025,7 +2025,7 @@ exports[`RoomView video rooms should render joined video room view 1`] = ` class="mx_BaseCard_header_title" >

Chat @@ -2033,14 +2033,14 @@ exports[`RoomView video rooms should render joined video room view 1`] = `

@@ -41,7 +41,7 @@ exports[` renders sidebar correctly with beacons 1`] = ` class="mx_BeaconListItem" > renders sidebar correctly without beacons 1`] = ` xmlns="http://www.w3.org/2000/svg" >
diff --git a/test/unit-tests/components/views/dialogs/__snapshots__/ConfirmUserActionDialog-test.tsx.snap b/test/unit-tests/components/views/dialogs/__snapshots__/ConfirmUserActionDialog-test.tsx.snap index bf0fc31443..d48b62c57d 100644 --- a/test/unit-tests/components/views/dialogs/__snapshots__/ConfirmUserActionDialog-test.tsx.snap +++ b/test/unit-tests/components/views/dialogs/__snapshots__/ConfirmUserActionDialog-test.tsx.snap @@ -35,7 +35,7 @@ exports[`ConfirmUserActionDialog renders 1`] = ` class="mx_ConfirmUserActionDialog_avatar" > should list spaces which are not par
Make sure that you really want to remove all pinned messages. This action can’t be undone. @@ -32,7 +32,7 @@ exports[` should render 1`] = ` class="mx_UnpinAllDialog_buttons" >
@@ -161,7 +161,7 @@ exports[`AppTile for a pinned widget should render 1`] = ` xmlns="http://www.w3.org/2000/svg" >
@@ -182,7 +182,7 @@ exports[`AppTile for a pinned widget should render 1`] = ` xmlns="http://www.w3.org/2000/svg" >
@@ -213,7 +213,7 @@ exports[`AppTile for a pinned widget should render permission request 1`] = `
@@ -273,7 +273,7 @@ exports[`AppTile for a pinned widget should render permission request 1`] = ` xmlns="http://www.w3.org/2000/svg" >
@@ -294,7 +294,7 @@ exports[`AppTile for a pinned widget should render permission request 1`] = ` xmlns="http://www.w3.org/2000/svg" >
@@ -316,7 +316,7 @@ exports[`AppTile for a pinned widget should render permission request 1`] = `
@@ -404,7 +404,7 @@ exports[`AppTile preserves non-persisted widget on container move 1`] = `
@@ -464,7 +464,7 @@ exports[`AppTile preserves non-persisted widget on container move 1`] = ` xmlns="http://www.w3.org/2000/svg" >
@@ -485,7 +485,7 @@ exports[`AppTile preserves non-persisted widget on container move 1`] = ` xmlns="http://www.w3.org/2000/svg" >
diff --git a/test/unit-tests/components/views/elements/__snapshots__/FacePile-test.tsx.snap b/test/unit-tests/components/views/elements/__snapshots__/FacePile-test.tsx.snap index 2956bed066..2e923be862 100644 --- a/test/unit-tests/components/views/elements/__snapshots__/FacePile-test.tsx.snap +++ b/test/unit-tests/components/views/elements/__snapshots__/FacePile-test.tsx.snap @@ -9,10 +9,10 @@ exports[` renders with a tooltip 1`] = ` tabindex="0" >
renders dropdown options in menu 1`] = ` xmlns="http://www.w3.org/2000/svg" > should render the expected pill for @room 1`] = ` >
@@ -67,7 +67,7 @@ exports[` renders map correctly 1`] = ` xmlns="http://www.w3.org/2000/svg" >
diff --git a/test/unit-tests/components/views/location/__snapshots__/MapError-test.tsx.snap b/test/unit-tests/components/views/location/__snapshots__/MapError-test.tsx.snap index 238097d995..f0c4749153 100644 --- a/test/unit-tests/components/views/location/__snapshots__/MapError-test.tsx.snap +++ b/test/unit-tests/components/views/location/__snapshots__/MapError-test.tsx.snap @@ -15,7 +15,7 @@ exports[` applies class when isMinimised is truthy 1`] = ` xmlns="http://www.w3.org/2000/svg" >

renders correctly for MapStyleUrlNotConfigured 1`] = ` xmlns="http://www.w3.org/2000/svg" >

renders correctly for MapStyleUrlNotReachable 1`] = ` xmlns="http://www.w3.org/2000/svg" >

renders with location icon when no room member 1`] = ` xmlns="http://www.w3.org/2000/svg" >

diff --git a/test/unit-tests/components/views/location/__snapshots__/SmartMarker-test.tsx.snap b/test/unit-tests/components/views/location/__snapshots__/SmartMarker-test.tsx.snap index f2b3e4cc8b..f1663bb751 100644 --- a/test/unit-tests/components/views/location/__snapshots__/SmartMarker-test.tsx.snap +++ b/test/unit-tests/components/views/location/__snapshots__/SmartMarker-test.tsx.snap @@ -18,7 +18,7 @@ exports[` creates a marker on mount 1`] = ` xmlns="http://www.w3.org/2000/svg" >
@@ -45,7 +45,7 @@ exports[` removes marker on unmount 1`] = ` xmlns="http://www.w3.org/2000/svg" >
diff --git a/test/unit-tests/components/views/location/__snapshots__/ZoomButtons-test.tsx.snap b/test/unit-tests/components/views/location/__snapshots__/ZoomButtons-test.tsx.snap index 4aa18b2f1e..02131a43d7 100644 --- a/test/unit-tests/components/views/location/__snapshots__/ZoomButtons-test.tsx.snap +++ b/test/unit-tests/components/views/location/__snapshots__/ZoomButtons-test.tsx.snap @@ -21,7 +21,7 @@ exports[` renders buttons 1`] = ` xmlns="http://www.w3.org/2000/svg" >
@@ -41,7 +41,7 @@ exports[` renders buttons 1`] = ` xmlns="http://www.w3.org/2000/svg" >
diff --git a/test/unit-tests/components/views/messages/TextualBody-test.tsx b/test/unit-tests/components/views/messages/TextualBody-test.tsx index a10e4bebe0..753534a93f 100644 --- a/test/unit-tests/components/views/messages/TextualBody-test.tsx +++ b/test/unit-tests/components/views/messages/TextualBody-test.tsx @@ -186,7 +186,7 @@ describe("", () => { const { container } = getComponent({ mxEvent: ev }); const content = container.querySelector(".mx_EventTile_body"); expect(content.innerHTML).toMatchInlineSnapshot( - `"Chat with Member"`, + `"Chat with Member"`, ); }); @@ -204,7 +204,7 @@ describe("", () => { const { container } = getComponent({ mxEvent: ev }); const content = container.querySelector(".mx_EventTile_body"); expect(content.innerHTML).toMatchInlineSnapshot( - `"Visit #room:example.com"`, + `"Visit #room:example.com"`, ); }); diff --git a/test/unit-tests/components/views/messages/__snapshots__/DecryptionFailureBody-test.tsx.snap b/test/unit-tests/components/views/messages/__snapshots__/DecryptionFailureBody-test.tsx.snap index a3b9fb205f..599a7719d5 100644 --- a/test/unit-tests/components/views/messages/__snapshots__/DecryptionFailureBody-test.tsx.snap +++ b/test/unit-tests/components/views/messages/__snapshots__/DecryptionFailureBody-test.tsx.snap @@ -35,7 +35,7 @@ exports[`DecryptionFailureBody should handle messages from users who change iden xmlns="http://www.w3.org/2000/svg" > Sender's verified identity has changed diff --git a/test/unit-tests/components/views/messages/__snapshots__/MBeaconBody-test.tsx.snap b/test/unit-tests/components/views/messages/__snapshots__/MBeaconBody-test.tsx.snap index de31628ec3..14007bd61a 100644 --- a/test/unit-tests/components/views/messages/__snapshots__/MBeaconBody-test.tsx.snap +++ b/test/unit-tests/components/views/messages/__snapshots__/MBeaconBody-test.tsx.snap @@ -14,7 +14,7 @@ exports[` when map display is not configured renders maps unavail xmlns="http://www.w3.org/2000/svg" >

should show a download button in file rendering type 1`] = class="mx_MFileBody_download" > should show a download button in file rendering type 1`] = xmlns="http://www.w3.org/2000/svg" > Download diff --git a/test/unit-tests/components/views/messages/__snapshots__/MLocationBody-test.tsx.snap b/test/unit-tests/components/views/messages/__snapshots__/MLocationBody-test.tsx.snap index 7b919b5326..48dc54241f 100644 --- a/test/unit-tests/components/views/messages/__snapshots__/MLocationBody-test.tsx.snap +++ b/test/unit-tests/components/views/messages/__snapshots__/MLocationBody-test.tsx.snap @@ -58,7 +58,7 @@ exports[`MLocationBody without error renders map correctly 1`] = xmlns="http://www.w3.org/2000/svg" > @@ -92,7 +92,7 @@ exports[`MLocationBody without error renders marker correctly fo class="mx_Marker_border" > Pinned message diff --git a/test/unit-tests/components/views/messages/__snapshots__/TextualBody-test.tsx.snap b/test/unit-tests/components/views/messages/__snapshots__/TextualBody-test.tsx.snap index 1ea245acf0..44672397ac 100644 --- a/test/unit-tests/components/views/messages/__snapshots__/TextualBody-test.tsx.snap +++ b/test/unit-tests/components/views/messages/__snapshots__/TextualBody-test.tsx.snap @@ -86,7 +86,7 @@ exports[` renders formatted m.text correctly pills appear for an Message from Member"`; +exports[` renders plain-text m.text correctly should pillify a permalink to a message in the same room with the label »Message from Member« 1`] = `"Visit Message from Member"`; -exports[` renders plain-text m.text correctly should pillify a permalink to an event in another room with the label »Message in Room 2« 1`] = `"Visit Message in Room 2"`; +exports[` renders plain-text m.text correctly should pillify a permalink to an event in another room with the label »Message in Room 2« 1`] = `"Visit Message in Room 2"`; exports[` renders plain-text m.text correctly should pillify a permalink to an unknown message in the same room with the label »Message« 1`] = `
renders plain-text m.text correctly should pillify a pe xmlns="http://www.w3.org/2000/svg" > Poll detail navigates back to poll list from detail vie xmlns="http://www.w3.org/2000/svg" > Active polls diff --git a/test/unit-tests/components/views/right_panel/__snapshots__/BaseCard-test.tsx.snap b/test/unit-tests/components/views/right_panel/__snapshots__/BaseCard-test.tsx.snap index 21ec64e9b3..dc85fba985 100644 --- a/test/unit-tests/components/views/right_panel/__snapshots__/BaseCard-test.tsx.snap +++ b/test/unit-tests/components/views/right_panel/__snapshots__/BaseCard-test.tsx.snap @@ -12,7 +12,7 @@ exports[` should close when clicking X button 1`] = ` class="mx_BaseCard_header_title" >

Heading text @@ -20,14 +20,14 @@ exports[` should close when clicking X button 1`] = `

message case AskToJoin renders the corresponding mes

message case AskToJoin renders the corresponding mes

with an invite with an invited email when client has

with an invite without an invited email for a dm roo

with an invite without an invited email for a non-dm

should render invite 1`] = ` class="mx_BaseCard_header_title" >

Profile @@ -20,14 +20,14 @@ exports[` should render invite 1`] = ` @@ -39,7 +39,7 @@ exports[`FormattingButtons renders in german 1`] = ` xmlns="http://www.w3.org/2000/svg" > @@ -58,7 +58,7 @@ exports[`FormattingButtons renders in german 1`] = ` xmlns="http://www.w3.org/2000/svg" > @@ -77,7 +77,7 @@ exports[`FormattingButtons renders in german 1`] = ` xmlns="http://www.w3.org/2000/svg" > @@ -96,7 +96,7 @@ exports[`FormattingButtons renders in german 1`] = ` xmlns="http://www.w3.org/2000/svg" > @@ -115,7 +115,7 @@ exports[`FormattingButtons renders in german 1`] = ` xmlns="http://www.w3.org/2000/svg" > @@ -134,7 +134,7 @@ exports[`FormattingButtons renders in german 1`] = ` xmlns="http://www.w3.org/2000/svg" > @@ -153,7 +153,7 @@ exports[`FormattingButtons renders in german 1`] = ` xmlns="http://www.w3.org/2000/svg" > @@ -172,7 +172,7 @@ exports[`FormattingButtons renders in german 1`] = ` xmlns="http://www.w3.org/2000/svg" > @@ -191,7 +191,7 @@ exports[`FormattingButtons renders in german 1`] = ` xmlns="http://www.w3.org/2000/svg" > diff --git a/test/unit-tests/components/views/settings/__snapshots__/LayoutSwitcher-test.tsx.snap b/test/unit-tests/components/views/settings/__snapshots__/LayoutSwitcher-test.tsx.snap index 2aa08adb94..e8ab3ccd2f 100644 --- a/test/unit-tests/components/views/settings/__snapshots__/LayoutSwitcher-test.tsx.snap +++ b/test/unit-tests/components/views/settings/__snapshots__/LayoutSwitcher-test.tsx.snap @@ -19,25 +19,25 @@ exports[` should render 1`] = ` class="mx_SettingsSubsection_content mx_SettingsSubsection_content_newUi" >

  1. flow to change the recovery key should display th
  2. Change recovery key @@ -61,7 +61,7 @@ exports[` flow to change the recovery key should display th class="mx_EncryptionCard_header" >
    flow to change the recovery key should display th xmlns="http://www.w3.org/2000/svg" >

    Change recovery key?

    @@ -89,32 +89,32 @@ exports[` flow to change the recovery key should display th class="mx_KeyPanel" > Recovery key
    encoded private key Do not share this with anyone!
    1. flow to set up a recovery key should ask the user
    2. Set up recovery @@ -221,7 +221,7 @@ exports[` flow to set up a recovery key should ask the user class="mx_EncryptionCard_header" >
      flow to set up a recovery key should ask the user xmlns="http://www.w3.org/2000/svg" >

      Enter your recovery key to confirm

      @@ -246,19 +246,19 @@ exports[` flow to set up a recovery key should ask the user
After clicking continue, we’ll generate a recovery key for you. @@ -542,7 +542,7 @@ exports[` flow to set up a recovery key should display info class="mx_EncryptionCard_buttons" >
  1. flow to set up a recovery key should display the
  2. Set up recovery @@ -625,7 +625,7 @@ exports[` flow to set up a recovery key should display the class="mx_EncryptionCard_header" >
    flow to set up a recovery key should display the xmlns="http://www.w3.org/2000/svg" >

    Save your recovery key somewhere safe

    @@ -653,32 +653,32 @@ exports[` flow to set up a recovery key should display the class="mx_KeyPanel" > Recovery key
    encoded private key Do not share this with anyone!
  1. should display the 'forgot recovery key' variant
  2. Reset encryption @@ -61,7 +61,7 @@ exports[` should display the 'forgot recovery key' variant class="mx_EncryptionCard_header" >
    should display the 'forgot recovery key' variant xmlns="http://www.w3.org/2000/svg" >

    Forgot your recovery key? You’ll need to reset your identity.

    @@ -87,14 +87,14 @@ exports[` should display the 'forgot recovery key' variant style="--mx-flex-display: flex; --mx-flex-direction: column; --mx-flex-align: normal; --mx-flex-justify: start; --mx-flex-gap: var(--cpd-space-3x);" >