diff --git a/apps/web/playwright/e2e/audio-player/audio-player.spec.ts b/apps/web/playwright/e2e/audio-player/audio-player.spec.ts index ff8e3f89b0..b442be2b92 100644 --- a/apps/web/playwright/e2e/audio-player/audio-player.spec.ts +++ b/apps/web/playwright/e2e/audio-player/audio-player.spec.ts @@ -49,6 +49,11 @@ test.describe("Audio player", { tag: ["@no-firefox", "@no-webkit"] }, () => { ).toBeVisible(); }; + const scrollToBottomOfTimeline = async (page: Page) => { + await page.locator(".mx_RoomView_MessageList").click(); + await page.mouse.wheel(0, 100); + }; + /** * Take snapshots of mx_EventTile_last on each layout, outputting log for reference/debugging. * @param detail The snapshot name. Used for outputting logs too. @@ -113,10 +118,12 @@ test.describe("Audio player", { tag: ["@no-firefox", "@no-webkit"] }, () => { `, mask: [page.getByTestId("audio-player-seek")], clip: undefined, + hideJumpToBottomButton: true, }; // Take a snapshot of mx_EventTile_last on IRC layout screenshotOptions.clip = await page.locator(".mx_EventTile_last").boundingBox(); + await scrollToBottomOfTimeline(page); await expect(page).toMatchScreenshot(`${detail.replaceAll(" ", "-")}-irc-layout.png`, screenshotOptions); // Take a snapshot on modern/group layout @@ -125,6 +132,7 @@ test.describe("Audio player", { tag: ["@no-firefox", "@no-webkit"] }, () => { await groupTile.locator(".mx_MessageTimestamp").click(); await checkPlayerVisibility(groupTile); screenshotOptions.clip = await page.locator(".mx_EventTile_last").boundingBox(); + await scrollToBottomOfTimeline(page); await expect(page).toMatchScreenshot(`${detail.replaceAll(" ", "-")}-group-layout.png`, screenshotOptions); // Take a snapshot on bubble layout @@ -133,6 +141,7 @@ test.describe("Audio player", { tag: ["@no-firefox", "@no-webkit"] }, () => { await bubbleTile.locator(".mx_MessageTimestamp").click(); await checkPlayerVisibility(bubbleTile); screenshotOptions.clip = await page.locator(".mx_EventTile_last").boundingBox(); + await scrollToBottomOfTimeline(page); await expect(page).toMatchScreenshot(`${detail.replaceAll(" ", "-")}-bubble-layout.png`, screenshotOptions); }; diff --git a/apps/web/playwright/e2e/crypto/toasts.spec.ts b/apps/web/playwright/e2e/crypto/toasts.spec.ts index fb7a298be9..876000009b 100644 --- a/apps/web/playwright/e2e/crypto/toasts.spec.ts +++ b/apps/web/playwright/e2e/crypto/toasts.spec.ts @@ -11,6 +11,16 @@ import { test, expect } from "../../element-web-test"; import { createBot, deleteCachedSecrets, disableKeyBackup, logIntoElement, logIntoElementAndVerify } from "./utils"; import { type Bot } from "../../pages/bot"; +// Mask the background of the screenshot to avoid failing the test just because some +// other component has changed its rendering. +const screenshotOptions = { + css: ` + .mx_ToastContainer { + background-color: magenta !important; + } + `, +}; + test.describe("Key storage out of sync toast", () => { let recoveryKey: GeneratedSecretStorageKey; @@ -37,15 +47,10 @@ test.describe("Key storage out of sync toast", () => { // playwright only evaluates the 'first()' call initially, not subsequent times it checks, so // it would always be checking the same toast, even if another one is now the first. await expect(page.getByRole("alert")).toHaveCount(2); - // Mask the background of the screenshot to avoid failing the test just because some - // other component have changed its rendering. - await expect(page.getByRole("alert").first()).toMatchScreenshot("key-storage-out-of-sync-toast.png", { - css: ` - .mx_ToastContainer { - background-color: magenta !important; - } - `, - }); + await expect(page.getByRole("alert").first()).toMatchScreenshot( + "key-storage-out-of-sync-toast.png", + screenshotOptions, + ); await page.getByRole("button", { name: "Enter recovery key" }).click(); @@ -209,7 +214,10 @@ test.describe("Verify this device toast", () => { await expect(page.getByRole("heading", { name: "Verify this device" })).toBeVisible(); - await expect(page.locator(".mx_ToastContainer")).toMatchScreenshot("verify-this-device.png"); + await expect(page.locator(".mx_ToastContainer")).toMatchScreenshot( + "verify-this-device.png", + screenshotOptions, + ); }, ); }); diff --git a/apps/web/playwright/e2e/left-panel/room-list-panel/room-list-collapse.spec.ts b/apps/web/playwright/e2e/left-panel/room-list-panel/room-list-collapse.spec.ts new file mode 100644 index 0000000000..2bf8b558dd --- /dev/null +++ b/apps/web/playwright/e2e/left-panel/room-list-panel/room-list-collapse.spec.ts @@ -0,0 +1,91 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import { test, expect } from "../../../element-web-test"; +import type { Locator, Page } from "playwright-core"; + +test.describe("Collapsible Room list", () => { + test.use({ + displayName: "Alice", + }); + + test.beforeEach(async ({ page, app, user }) => { + await app.closeNotificationToast(); + for (let i = 0; i < 10; i++) { + await app.client.createRoom({ name: `room${i}` }); + } + }); + + /** + * Resize the panel and return the bounding box + * @param pixels The number of pixels by which to resize the panel + */ + async function resize(page: Page, pixels: number): ReturnType { + const leftPanelLocator = page.getByTestId("left-panel"); + const boundingBox = await leftPanelLocator.boundingBox(); + + // Move mouse 2px to the right of the left-panel, this should be region that the user drags to resize the panel. + const mouseX = boundingBox.x + boundingBox.width + 2; + const mouseY = boundingBox.y + boundingBox.height / 2; + + await page.mouse.move(mouseX, mouseY); + await page.mouse.down(); + await page.mouse.move(mouseX + pixels, mouseY); + + return boundingBox; + } + + test("should be possible to expand/contract the room list", { tag: "@screenshot" }, async ({ page, app, user }) => { + await expect(page).toMatchScreenshot("room-list-collapse-default.png"); + const leftPanelLocator = page.getByTestId("left-panel"); + + // Contract the panel + let previousBoundingBox = await resize(page, -50); + let currentBoundingBox = await leftPanelLocator.boundingBox(); + expect(currentBoundingBox.width).toBeCloseTo(previousBoundingBox.width - 50, 0); + + // Expand the panel + previousBoundingBox = await resize(page, 30); + currentBoundingBox = await leftPanelLocator.boundingBox(); + expect(currentBoundingBox.width).toBeCloseTo(previousBoundingBox.width + 30, 0); + }); + + test( + "should be possible to fully collapse and expand the left panel", + { tag: "@screenshot" }, + async ({ page, app, user }) => { + const leftPanelLocator = page.getByTestId("left-panel"); + + // Collapse the panel + await resize(page, -300); + let currentBoundingBox = await leftPanelLocator.boundingBox(); + expect(currentBoundingBox.width).toStrictEqual(0); + + // Expect te separator to be shown + const separator = page.getByRole("separator", { name: "Click or drag to expand" }); + await expect(separator).toBeInViewport(); + await expect(page).toMatchScreenshot("room-list-collapse-fully-collapsed.png"); + + // Should be possible to expand by clicking on the separator + await separator.click(); + currentBoundingBox = await leftPanelLocator.boundingBox(); + expect(currentBoundingBox.width).toBeGreaterThan(365); + + // Collapse the panel again + await resize(page, -300); + + // Check that the panel can be expanded by dragging the separator + const separatorBoundingBox = await separator.boundingBox(); + const mouseX = separatorBoundingBox.x + separatorBoundingBox.width / 2; + const mouseY = separatorBoundingBox.y + separatorBoundingBox.height / 2; + await page.mouse.move(mouseX, mouseY); + await page.mouse.down(); + await page.mouse.move(mouseX + 400, mouseY); + expect(currentBoundingBox.width).toBeGreaterThan(365); + }, + ); +}); diff --git a/apps/web/playwright/element-web-test.ts b/apps/web/playwright/element-web-test.ts index 558d8192ff..f7c6f5b8e2 100644 --- a/apps/web/playwright/element-web-test.ts +++ b/apps/web/playwright/element-web-test.ts @@ -73,7 +73,15 @@ export const test = base.extend({ axe: async ({ axe }, use) => { // Exclude floating UI for now - await use(axe.exclude("[data-floating-ui-portal]")); + axe = axe.exclude("[data-floating-ui-portal]"); + /** + * Bunch of axe violations arise from this separator not being a part of any + * aria landmarks. + * But fixing this involves restructuring the existing landmarks. + * Ignore temporarily until we fix this. + */ + axe = axe.exclude(".mx_Separator"); + await use(axe); }, app: async ({ page }, use) => { diff --git a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--dark-theme--bubble-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--dark-theme--bubble-layout-linux.png index a0aa6bebde..bd5fb364cd 100644 Binary files a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--dark-theme--bubble-layout-linux.png and b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--dark-theme--bubble-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--dark-theme--group-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--dark-theme--group-layout-linux.png index 7866accb70..f4b1409866 100644 Binary files a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--dark-theme--group-layout-linux.png and b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--dark-theme--group-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--dark-theme--irc-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--dark-theme--irc-layout-linux.png index 26e8bf6449..2643ccee95 100644 Binary files a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--dark-theme--irc-layout-linux.png and b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--dark-theme--irc-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--high-contrast--bubble-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--high-contrast--bubble-layout-linux.png index ba5d27771e..b0dc89eae1 100644 Binary files a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--high-contrast--bubble-layout-linux.png and b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--high-contrast--bubble-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--high-contrast--group-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--high-contrast--group-layout-linux.png index b60332c1a1..c8cf82cf97 100644 Binary files a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--high-contrast--group-layout-linux.png and b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--high-contrast--group-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--high-contrast--irc-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--high-contrast--irc-layout-linux.png index 29e61d6968..623e2adc3a 100644 Binary files a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--high-contrast--irc-layout-linux.png and b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--high-contrast--irc-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--bubble-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--bubble-layout-linux.png index 17d3ccbd10..5f9eb946bd 100644 Binary files a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--bubble-layout-linux.png and b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--bubble-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--group-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--group-layout-linux.png index 16d212bfe0..e61bc8fa07 100644 Binary files a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--group-layout-linux.png and b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--group-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--irc-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--irc-layout-linux.png index 76d9745d47..074a125b5d 100644 Binary files a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--irc-layout-linux.png and b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--irc-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--monospace-font--bubble-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--monospace-font--bubble-layout-linux.png index a15bd80ccf..6ec8408d93 100644 Binary files a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--monospace-font--bubble-layout-linux.png and b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--monospace-font--bubble-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--monospace-font--group-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--monospace-font--group-layout-linux.png index e136a01f3b..6ac9b12de2 100644 Binary files a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--monospace-font--group-layout-linux.png and b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--monospace-font--group-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--monospace-font--irc-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--monospace-font--irc-layout-linux.png index e0dfb3601a..bc75317841 100644 Binary files a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--monospace-font--irc-layout-linux.png and b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--monospace-font--irc-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-bubble-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-bubble-layout-linux.png index bcab07b3f5..99aa065e9d 100644 Binary files a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-bubble-layout-linux.png and b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-bubble-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-chain-bubble-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-chain-bubble-layout-linux.png index d55718a5ae..5e844ede99 100644 Binary files a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-chain-bubble-layout-linux.png and b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-chain-bubble-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-chain-group-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-chain-group-layout-linux.png index 1d0d8f6118..ada0ca1f08 100644 Binary files a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-chain-group-layout-linux.png and b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-chain-group-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-chain-irc-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-chain-irc-layout-linux.png index 226fc99f00..db942937ee 100644 Binary files a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-chain-irc-layout-linux.png and b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-chain-irc-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-group-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-group-layout-linux.png index 06d5b6bde8..1a2fafea2c 100644 Binary files a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-group-layout-linux.png and b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-group-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-irc-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-irc-layout-linux.png index c843ff8d48..bcf1e37566 100644 Binary files a/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-irc-layout-linux.png and b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-irc-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/composer/CIDER.spec.ts/emoji-autocomplete-linux.png b/apps/web/playwright/snapshots/composer/CIDER.spec.ts/emoji-autocomplete-linux.png index 94c7ec42c8..4ab37fc895 100644 Binary files a/apps/web/playwright/snapshots/composer/CIDER.spec.ts/emoji-autocomplete-linux.png and b/apps/web/playwright/snapshots/composer/CIDER.spec.ts/emoji-autocomplete-linux.png differ diff --git a/apps/web/playwright/snapshots/composer/CIDER.spec.ts/mention-linux.png b/apps/web/playwright/snapshots/composer/CIDER.spec.ts/mention-linux.png index 712697a3fa..b3dff463b3 100644 Binary files a/apps/web/playwright/snapshots/composer/CIDER.spec.ts/mention-linux.png and b/apps/web/playwright/snapshots/composer/CIDER.spec.ts/mention-linux.png differ diff --git a/apps/web/playwright/snapshots/crypto/crypto.spec.ts/composer-e2e-icon-linux.png b/apps/web/playwright/snapshots/crypto/crypto.spec.ts/composer-e2e-icon-linux.png index 1adc91faf0..30a5951f01 100644 Binary files a/apps/web/playwright/snapshots/crypto/crypto.spec.ts/composer-e2e-icon-linux.png and b/apps/web/playwright/snapshots/crypto/crypto.spec.ts/composer-e2e-icon-linux.png differ diff --git a/apps/web/playwright/snapshots/crypto/decryption-failure-messages.spec.ts/history-not-available-linux.png b/apps/web/playwright/snapshots/crypto/decryption-failure-messages.spec.ts/history-not-available-linux.png index 351e2c5d02..9fc790e4c4 100644 Binary files a/apps/web/playwright/snapshots/crypto/decryption-failure-messages.spec.ts/history-not-available-linux.png and b/apps/web/playwright/snapshots/crypto/decryption-failure-messages.spec.ts/history-not-available-linux.png differ diff --git a/apps/web/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-authenticity-linux.png b/apps/web/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-authenticity-linux.png index 5980ff3ca0..5777a77e59 100644 Binary files a/apps/web/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-authenticity-linux.png and b/apps/web/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-authenticity-linux.png differ diff --git a/apps/web/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-identity-reset-linux.png b/apps/web/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-identity-reset-linux.png index 3499e8f704..cf0fae7587 100644 Binary files a/apps/web/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-identity-reset-linux.png and b/apps/web/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-identity-reset-linux.png differ diff --git a/apps/web/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-not-verified-linux.png b/apps/web/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-not-verified-linux.png index 3499e8f704..cf0fae7587 100644 Binary files a/apps/web/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-not-verified-linux.png and b/apps/web/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-not-verified-linux.png differ diff --git a/apps/web/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-utd-linux.png b/apps/web/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-utd-linux.png index 3d80c319c8..9cdf979ce0 100644 Binary files a/apps/web/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-utd-linux.png and b/apps/web/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-utd-linux.png differ diff --git a/apps/web/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-warning-linux.png b/apps/web/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-warning-linux.png index eacd2a7803..cf0fae7587 100644 Binary files a/apps/web/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-warning-linux.png and b/apps/web/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-warning-linux.png differ diff --git a/apps/web/playwright/snapshots/crypto/history-sharing.spec.ts/shared-history-invite-accepted-linux.png b/apps/web/playwright/snapshots/crypto/history-sharing.spec.ts/shared-history-invite-accepted-linux.png index 8aa140d0d2..ffae9b7929 100644 Binary files a/apps/web/playwright/snapshots/crypto/history-sharing.spec.ts/shared-history-invite-accepted-linux.png and b/apps/web/playwright/snapshots/crypto/history-sharing.spec.ts/shared-history-invite-accepted-linux.png differ diff --git a/apps/web/playwright/snapshots/crypto/toasts.spec.ts/verify-this-device-linux.png b/apps/web/playwright/snapshots/crypto/toasts.spec.ts/verify-this-device-linux.png index 750b118686..7aeac7a9a9 100644 Binary files a/apps/web/playwright/snapshots/crypto/toasts.spec.ts/verify-this-device-linux.png and b/apps/web/playwright/snapshots/crypto/toasts.spec.ts/verify-this-device-linux.png differ diff --git a/apps/web/playwright/snapshots/invite/invite-dialog.spec.ts/send-your-first-message-view-linux.png b/apps/web/playwright/snapshots/invite/invite-dialog.spec.ts/send-your-first-message-view-linux.png index b39a8c82cb..8408700761 100644 Binary files a/apps/web/playwright/snapshots/invite/invite-dialog.spec.ts/send-your-first-message-view-linux.png and b/apps/web/playwright/snapshots/invite/invite-dialog.spec.ts/send-your-first-message-view-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-collapse.spec.ts/room-list-collapse-default-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-collapse.spec.ts/room-list-collapse-default-linux.png new file mode 100644 index 0000000000..4ae6fff8ba Binary files /dev/null and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-collapse.spec.ts/room-list-collapse-default-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-collapse.spec.ts/room-list-collapse-fully-collapsed-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-collapse.spec.ts/room-list-collapse-fully-collapsed-linux.png new file mode 100644 index 0000000000..9a9270e7db Binary files /dev/null and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-collapse.spec.ts/room-list-collapse-fully-collapsed-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Favourite-empty-room-list-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Favourite-empty-room-list-linux.png index d30b38b38f..e46fd5339b 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Favourite-empty-room-list-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Favourite-empty-room-list-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Invites-empty-room-list-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Invites-empty-room-list-linux.png index c770da3377..a3ff80267e 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Invites-empty-room-list-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Invites-empty-room-list-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Mentions-empty-room-list-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Mentions-empty-room-list-linux.png index 44e27d9618..498a63fa8c 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Mentions-empty-room-list-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Mentions-empty-room-list-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/People-empty-room-list-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/People-empty-room-list-linux.png index 3f700037cb..72cf50b914 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/People-empty-room-list-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/People-empty-room-list-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Rooms-empty-room-list-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Rooms-empty-room-list-linux.png index e01564eeb4..bea7130aca 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Rooms-empty-room-list-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Rooms-empty-room-list-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Unreads-empty-room-list-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Unreads-empty-room-list-linux.png index 94b09ac14f..8498c97fb6 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Unreads-empty-room-list-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Unreads-empty-room-list-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/collapsed-primary-filters-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/collapsed-primary-filters-linux.png index 932af08f7c..43c984a6ad 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/collapsed-primary-filters-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/collapsed-primary-filters-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/default-empty-room-list-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/default-empty-room-list-linux.png index d47d04e9a6..ce39afb3ce 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/default-empty-room-list-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/default-empty-room-list-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/expanded-primary-filters-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/expanded-primary-filters-linux.png index 122c437092..e9dd085d4f 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/expanded-primary-filters-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/expanded-primary-filters-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/room-panel-empty-room-list-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/room-panel-empty-room-list-linux.png index 47e1318cd3..124cdc674d 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/room-panel-empty-room-list-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/room-panel-empty-room-list-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/unread-dm-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/unread-dm-linux.png index d78d66705e..e1f451d121 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/unread-dm-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/unread-dm-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/unread-primary-filters-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/unread-primary-filters-linux.png index 15e0444cab..af908ec7d1 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/unread-primary-filters-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/unread-primary-filters-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/unselected-primary-filters-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/unselected-primary-filters-linux.png index 932af08f7c..43c984a6ad 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/unselected-primary-filters-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/unselected-primary-filters-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-header-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-header-linux.png index 90195d6cce..6dc877db96 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-header-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-header-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-space-header-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-space-header-linux.png index ec3f616ae9..294ba408dd 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-space-header-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-space-header-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-panel.spec.ts/room-list-panel-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-panel.spec.ts/room-list-panel-linux.png index 55980f5808..f19a6cb0c4 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-panel.spec.ts/room-list-panel-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-panel.spec.ts/room-list-panel-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-panel.spec.ts/room-list-panel-smallscreen-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-panel.spec.ts/room-list-panel-smallscreen-linux.png index 916932e156..dd26980a18 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-panel.spec.ts/room-list-panel-smallscreen-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-panel.spec.ts/room-list-panel-smallscreen-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-search.spec.ts/search-section-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-search.spec.ts/search-section-linux.png index df3e924e4c..8aac675759 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-search.spec.ts/search-section-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-search.spec.ts/search-section-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-activity-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-activity-linux.png index 4db4049eb2..9fc0fec4f2 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-activity-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-activity-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-hover-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-hover-linux.png index 675667b611..3ecaa94ad2 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-hover-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-hover-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-hover-silent-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-hover-silent-linux.png index 87095e3f80..4347081d83 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-hover-silent-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-hover-silent-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-invited-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-invited-linux.png index b1d313bdee..f130518d76 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-invited-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-invited-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-low-priority-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-low-priority-linux.png index 7569db5ca2..881eac278b 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-low-priority-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-low-priority-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-mark-as-unread-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-mark-as-unread-linux.png index fb7777b490..447bb1954d 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-mark-as-unread-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-mark-as-unread-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-mention-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-mention-linux.png index fe3c039fb7..1ac6df0244 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-mention-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-mention-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-message-preview-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-message-preview-linux.png index 5842bf50f6..2a8aaf63bb 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-message-preview-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-message-preview-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-notification-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-notification-linux.png index 09a4cb48a9..86b51ee0d0 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-notification-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-notification-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-more-options-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-more-options-linux.png index d4029d215a..35a3cda353 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-more-options-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-more-options-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-notification-options-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-notification-options-linux.png index 83486d3e0b..6050cc8298 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-notification-options-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-notification-options-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-notification-options-selection-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-notification-options-selection-linux.png index 424e26da4c..41df0a9106 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-notification-options-selection-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-notification-options-selection-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-public-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-public-linux.png index 653d2ddcb8..6737625908 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-public-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-public-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-silent-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-silent-linux.png index 5e433f591d..fb6b14957f 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-silent-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-silent-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-video-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-video-linux.png index 18ae6d4ce2..aaf8af550b 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-video-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-video-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-linux.png index 32592acb04..2f43e8032c 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-scrolled-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-scrolled-linux.png index 4d2e56a921..6857ac3106 100644 Binary files a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-scrolled-linux.png and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-scrolled-linux.png differ diff --git a/apps/web/playwright/snapshots/links/permalinks.spec.ts/permalink-rendering-linux.png b/apps/web/playwright/snapshots/links/permalinks.spec.ts/permalink-rendering-linux.png index 760e2b181a..eccc4610d3 100644 Binary files a/apps/web/playwright/snapshots/links/permalinks.spec.ts/permalink-rendering-linux.png and b/apps/web/playwright/snapshots/links/permalinks.spec.ts/permalink-rendering-linux.png differ diff --git a/apps/web/playwright/snapshots/messages/messages.spec.ts/basic-message-ltr-ltrdisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/basic-message-ltr-ltrdisplayname-linux.png index 9e26f29f74..e2f70cd530 100644 Binary files a/apps/web/playwright/snapshots/messages/messages.spec.ts/basic-message-ltr-ltrdisplayname-linux.png and b/apps/web/playwright/snapshots/messages/messages.spec.ts/basic-message-ltr-ltrdisplayname-linux.png differ diff --git a/apps/web/playwright/snapshots/messages/messages.spec.ts/basic-message-ltr-rtldisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/basic-message-ltr-rtldisplayname-linux.png index 5e6fc8dd6f..beee99852b 100644 Binary files a/apps/web/playwright/snapshots/messages/messages.spec.ts/basic-message-ltr-rtldisplayname-linux.png and b/apps/web/playwright/snapshots/messages/messages.spec.ts/basic-message-ltr-rtldisplayname-linux.png differ diff --git a/apps/web/playwright/snapshots/messages/messages.spec.ts/basic-message-rtl-ltrdisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/basic-message-rtl-ltrdisplayname-linux.png index 199daa5e5e..73c821f513 100644 Binary files a/apps/web/playwright/snapshots/messages/messages.spec.ts/basic-message-rtl-ltrdisplayname-linux.png and b/apps/web/playwright/snapshots/messages/messages.spec.ts/basic-message-rtl-ltrdisplayname-linux.png differ diff --git a/apps/web/playwright/snapshots/messages/messages.spec.ts/basic-message-rtl-rtldisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/basic-message-rtl-rtldisplayname-linux.png index 362930195d..934afa3429 100644 Binary files a/apps/web/playwright/snapshots/messages/messages.spec.ts/basic-message-rtl-rtldisplayname-linux.png and b/apps/web/playwright/snapshots/messages/messages.spec.ts/basic-message-rtl-rtldisplayname-linux.png differ diff --git a/apps/web/playwright/snapshots/messages/messages.spec.ts/edited-message-ltr-ltrdisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/edited-message-ltr-ltrdisplayname-linux.png index 0e3826f022..1004849ecb 100644 Binary files a/apps/web/playwright/snapshots/messages/messages.spec.ts/edited-message-ltr-ltrdisplayname-linux.png and b/apps/web/playwright/snapshots/messages/messages.spec.ts/edited-message-ltr-ltrdisplayname-linux.png differ diff --git a/apps/web/playwright/snapshots/messages/messages.spec.ts/edited-message-ltr-rtldisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/edited-message-ltr-rtldisplayname-linux.png index 314d4e8938..3673c5a441 100644 Binary files a/apps/web/playwright/snapshots/messages/messages.spec.ts/edited-message-ltr-rtldisplayname-linux.png and b/apps/web/playwright/snapshots/messages/messages.spec.ts/edited-message-ltr-rtldisplayname-linux.png differ diff --git a/apps/web/playwright/snapshots/messages/messages.spec.ts/edited-message-rtl-ltrdisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/edited-message-rtl-ltrdisplayname-linux.png index 4f4266737f..e1b094bd14 100644 Binary files a/apps/web/playwright/snapshots/messages/messages.spec.ts/edited-message-rtl-ltrdisplayname-linux.png and b/apps/web/playwright/snapshots/messages/messages.spec.ts/edited-message-rtl-ltrdisplayname-linux.png differ diff --git a/apps/web/playwright/snapshots/messages/messages.spec.ts/edited-message-rtl-rtldisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/edited-message-rtl-rtldisplayname-linux.png index fa17ddf3f5..b9e65fce21 100644 Binary files a/apps/web/playwright/snapshots/messages/messages.spec.ts/edited-message-rtl-rtldisplayname-linux.png and b/apps/web/playwright/snapshots/messages/messages.spec.ts/edited-message-rtl-rtldisplayname-linux.png differ diff --git a/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-ltr-ltrdisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-ltr-ltrdisplayname-linux.png index d7325c874d..e87d2c0819 100644 Binary files a/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-ltr-ltrdisplayname-linux.png and b/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-ltr-ltrdisplayname-linux.png differ diff --git a/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-ltr-rtldisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-ltr-rtldisplayname-linux.png index 4b45b09a90..10082f77f5 100644 Binary files a/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-ltr-rtldisplayname-linux.png and b/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-ltr-rtldisplayname-linux.png differ diff --git a/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rich-ltr-ltrdisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rich-ltr-ltrdisplayname-linux.png index eb95e95298..f9c75004e5 100644 Binary files a/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rich-ltr-ltrdisplayname-linux.png and b/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rich-ltr-ltrdisplayname-linux.png differ diff --git a/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rich-ltr-rtldisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rich-ltr-rtldisplayname-linux.png index c1c8bc34fc..6e9d930a22 100644 Binary files a/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rich-ltr-rtldisplayname-linux.png and b/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rich-ltr-rtldisplayname-linux.png differ diff --git a/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rich-rtl-ltrdisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rich-rtl-ltrdisplayname-linux.png index e5af698b56..01fbc69609 100644 Binary files a/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rich-rtl-ltrdisplayname-linux.png and b/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rich-rtl-ltrdisplayname-linux.png differ diff --git a/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rich-rtl-rtldisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rich-rtl-rtldisplayname-linux.png index df4d6c0642..a5a29ddad5 100644 Binary files a/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rich-rtl-rtldisplayname-linux.png and b/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rich-rtl-rtldisplayname-linux.png differ diff --git a/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rtl-ltrdisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rtl-ltrdisplayname-linux.png index fae90a16b3..f6799ebcca 100644 Binary files a/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rtl-ltrdisplayname-linux.png and b/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rtl-ltrdisplayname-linux.png differ diff --git a/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rtl-rtldisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rtl-rtldisplayname-linux.png index 95531ecaf8..dc5fb3d1bb 100644 Binary files a/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rtl-rtldisplayname-linux.png and b/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rtl-rtldisplayname-linux.png differ diff --git a/apps/web/playwright/snapshots/messages/messages.spec.ts/preview-basic-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/preview-basic-linux.png index 534571fe13..6d004c8da2 100644 Binary files a/apps/web/playwright/snapshots/messages/messages.spec.ts/preview-basic-linux.png and b/apps/web/playwright/snapshots/messages/messages.spec.ts/preview-basic-linux.png differ diff --git a/apps/web/playwright/snapshots/messages/messages.spec.ts/preview-with-thumb-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/preview-with-thumb-linux.png index d18c74a3b1..aa36fca9e9 100644 Binary files a/apps/web/playwright/snapshots/messages/messages.spec.ts/preview-with-thumb-linux.png and b/apps/web/playwright/snapshots/messages/messages.spec.ts/preview-with-thumb-linux.png differ diff --git a/apps/web/playwright/snapshots/messages/messages.spec.ts/reply-message-ltr-ltrdisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/reply-message-ltr-ltrdisplayname-linux.png index 4e93ab419e..4a829f8d8c 100644 Binary files a/apps/web/playwright/snapshots/messages/messages.spec.ts/reply-message-ltr-ltrdisplayname-linux.png and b/apps/web/playwright/snapshots/messages/messages.spec.ts/reply-message-ltr-ltrdisplayname-linux.png differ diff --git a/apps/web/playwright/snapshots/messages/messages.spec.ts/reply-message-ltr-rtldisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/reply-message-ltr-rtldisplayname-linux.png index 0a65531909..ed2c1e465b 100644 Binary files a/apps/web/playwright/snapshots/messages/messages.spec.ts/reply-message-ltr-rtldisplayname-linux.png and b/apps/web/playwright/snapshots/messages/messages.spec.ts/reply-message-ltr-rtldisplayname-linux.png differ diff --git a/apps/web/playwright/snapshots/messages/messages.spec.ts/reply-message-trl-ltrdisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/reply-message-trl-ltrdisplayname-linux.png index 067fab6cf9..6d0e372ebc 100644 Binary files a/apps/web/playwright/snapshots/messages/messages.spec.ts/reply-message-trl-ltrdisplayname-linux.png and b/apps/web/playwright/snapshots/messages/messages.spec.ts/reply-message-trl-ltrdisplayname-linux.png differ diff --git a/apps/web/playwright/snapshots/messages/messages.spec.ts/reply-message-trl-rtldisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/reply-message-trl-rtldisplayname-linux.png index a1c1f4aea7..a221290718 100644 Binary files a/apps/web/playwright/snapshots/messages/messages.spec.ts/reply-message-trl-rtldisplayname-linux.png and b/apps/web/playwright/snapshots/messages/messages.spec.ts/reply-message-trl-rtldisplayname-linux.png differ diff --git a/apps/web/playwright/snapshots/modules/custom-component.spec.ts/custom-component-crash-handle-filter-linux.png b/apps/web/playwright/snapshots/modules/custom-component.spec.ts/custom-component-crash-handle-filter-linux.png index ccf6439b65..d91b914a19 100644 Binary files a/apps/web/playwright/snapshots/modules/custom-component.spec.ts/custom-component-crash-handle-filter-linux.png and b/apps/web/playwright/snapshots/modules/custom-component.spec.ts/custom-component-crash-handle-filter-linux.png differ diff --git a/apps/web/playwright/snapshots/modules/custom-component.spec.ts/custom-component-crash-handle-renderer-linux.png b/apps/web/playwright/snapshots/modules/custom-component.spec.ts/custom-component-crash-handle-renderer-linux.png index 479f2d34ad..c298db811d 100644 Binary files a/apps/web/playwright/snapshots/modules/custom-component.spec.ts/custom-component-crash-handle-renderer-linux.png and b/apps/web/playwright/snapshots/modules/custom-component.spec.ts/custom-component-crash-handle-renderer-linux.png differ diff --git a/apps/web/playwright/snapshots/modules/custom-component.spec.ts/custom-component-tile-fall-through-linux.png b/apps/web/playwright/snapshots/modules/custom-component.spec.ts/custom-component-tile-fall-through-linux.png index 4198fed325..908d4ea5bb 100644 Binary files a/apps/web/playwright/snapshots/modules/custom-component.spec.ts/custom-component-tile-fall-through-linux.png and b/apps/web/playwright/snapshots/modules/custom-component.spec.ts/custom-component-tile-fall-through-linux.png differ diff --git a/apps/web/playwright/snapshots/modules/custom-component.spec.ts/custom-component-tile-linux.png b/apps/web/playwright/snapshots/modules/custom-component.spec.ts/custom-component-tile-linux.png index baf7bf4ef2..762d0f53f9 100644 Binary files a/apps/web/playwright/snapshots/modules/custom-component.spec.ts/custom-component-tile-linux.png and b/apps/web/playwright/snapshots/modules/custom-component.spec.ts/custom-component-tile-linux.png differ diff --git a/apps/web/playwright/snapshots/modules/custom-component.spec.ts/custom-component-tile-original-linux.png b/apps/web/playwright/snapshots/modules/custom-component.spec.ts/custom-component-tile-original-linux.png index 5ac5509641..3ccba0347a 100644 Binary files a/apps/web/playwright/snapshots/modules/custom-component.spec.ts/custom-component-tile-original-linux.png and b/apps/web/playwright/snapshots/modules/custom-component.spec.ts/custom-component-tile-original-linux.png differ diff --git a/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-Msg1-linux.png b/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-Msg1-linux.png index fc82f24778..a7ff75f1cd 100644 Binary files a/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-Msg1-linux.png and b/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-Msg1-linux.png differ diff --git a/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-1-Msg1-linux.png b/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-1-Msg1-linux.png index e240565e11..0ef0cbdb28 100644 Binary files a/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-1-Msg1-linux.png and b/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-1-Msg1-linux.png differ diff --git a/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-2-Msg1-linux.png b/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-2-Msg1-linux.png index a22ae313ae..5ee1e3bc62 100644 Binary files a/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-2-Msg1-linux.png and b/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-2-Msg1-linux.png differ diff --git a/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-2-Msg2-linux.png b/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-2-Msg2-linux.png index 4f635ff5fd..f5d4e7d824 100644 Binary files a/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-2-Msg2-linux.png and b/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-2-Msg2-linux.png differ diff --git a/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-4-Msg1-linux.png b/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-4-Msg1-linux.png index 0c544e58cb..6aa2b737c4 100644 Binary files a/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-4-Msg1-linux.png and b/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-4-Msg1-linux.png differ diff --git a/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-4-Msg2-linux.png b/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-4-Msg2-linux.png index f9df40b66d..032271eed1 100644 Binary files a/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-4-Msg2-linux.png and b/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-4-Msg2-linux.png differ diff --git a/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-4-Msg3-linux.png b/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-4-Msg3-linux.png index 969df22f36..b4af4bd7e6 100644 Binary files a/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-4-Msg3-linux.png and b/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-4-Msg3-linux.png differ diff --git a/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-4-Msg4-linux.png b/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-4-Msg4-linux.png index 8af50bb4e5..0de00679f1 100644 Binary files a/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-4-Msg4-linux.png and b/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-4-Msg4-linux.png differ diff --git a/apps/web/playwright/snapshots/polls/polls.spec.ts/Polls-Timeline-tile-no-votes-linux.png b/apps/web/playwright/snapshots/polls/polls.spec.ts/Polls-Timeline-tile-no-votes-linux.png index 759dcb7813..8b3a17361a 100644 Binary files a/apps/web/playwright/snapshots/polls/polls.spec.ts/Polls-Timeline-tile-no-votes-linux.png and b/apps/web/playwright/snapshots/polls/polls.spec.ts/Polls-Timeline-tile-no-votes-linux.png differ diff --git a/apps/web/playwright/snapshots/room/invites.spec.ts/Invites-room-view-linux.png b/apps/web/playwright/snapshots/room/invites.spec.ts/Invites-room-view-linux.png index 60487a7768..0f0162d709 100644 Binary files a/apps/web/playwright/snapshots/room/invites.spec.ts/Invites-room-view-linux.png and b/apps/web/playwright/snapshots/room/invites.spec.ts/Invites-room-view-linux.png differ diff --git a/apps/web/playwright/snapshots/room/room-status-bar.spec.ts/connectivity-lost-linux.png b/apps/web/playwright/snapshots/room/room-status-bar.spec.ts/connectivity-lost-linux.png index d07fc6d969..0eb0a9fc54 100644 Binary files a/apps/web/playwright/snapshots/room/room-status-bar.spec.ts/connectivity-lost-linux.png and b/apps/web/playwright/snapshots/room/room-status-bar.spec.ts/connectivity-lost-linux.png differ diff --git a/apps/web/playwright/snapshots/room/room-status-bar.spec.ts/consent-linux.png b/apps/web/playwright/snapshots/room/room-status-bar.spec.ts/consent-linux.png index f0ef19d724..dec77f8ef7 100644 Binary files a/apps/web/playwright/snapshots/room/room-status-bar.spec.ts/consent-linux.png and b/apps/web/playwright/snapshots/room/room-status-bar.spec.ts/consent-linux.png differ diff --git a/apps/web/playwright/snapshots/room/room-status-bar.spec.ts/local-room-create-failed-linux.png b/apps/web/playwright/snapshots/room/room-status-bar.spec.ts/local-room-create-failed-linux.png index b1a20f0315..e604e01a1e 100644 Binary files a/apps/web/playwright/snapshots/room/room-status-bar.spec.ts/local-room-create-failed-linux.png and b/apps/web/playwright/snapshots/room/room-status-bar.spec.ts/local-room-create-failed-linux.png differ diff --git a/apps/web/playwright/snapshots/room/room-status-bar.spec.ts/message-failed-linux.png b/apps/web/playwright/snapshots/room/room-status-bar.spec.ts/message-failed-linux.png index df2ec6e3b2..673ab956d6 100644 Binary files a/apps/web/playwright/snapshots/room/room-status-bar.spec.ts/message-failed-linux.png and b/apps/web/playwright/snapshots/room/room-status-bar.spec.ts/message-failed-linux.png differ diff --git a/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/window-12px-linux.png b/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/window-12px-linux.png index 0d652c9488..9a1d2cd0ac 100644 Binary files a/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/window-12px-linux.png and b/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/window-12px-linux.png differ diff --git a/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/window-after-switch-linux.png b/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/window-after-switch-linux.png index 87c9c8c565..dddecbe5ef 100644 Binary files a/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/window-after-switch-linux.png and b/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/window-after-switch-linux.png differ diff --git a/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/window-before-switch-linux.png b/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/window-before-switch-linux.png index 9f7dd4abd5..fe61d9dcb6 100644 Binary files a/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/window-before-switch-linux.png and b/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/window-before-switch-linux.png differ diff --git a/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/window-custom-theme-linux.png b/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/window-custom-theme-linux.png index 37080fce40..8caf08f4a5 100644 Binary files a/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/window-custom-theme-linux.png and b/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/window-custom-theme-linux.png differ diff --git a/apps/web/playwright/snapshots/spaces/spaces.spec.ts/invite-teammates-dialog-linux.png b/apps/web/playwright/snapshots/spaces/spaces.spec.ts/invite-teammates-dialog-linux.png index d7126166d7..e41e64a2fe 100644 Binary files a/apps/web/playwright/snapshots/spaces/spaces.spec.ts/invite-teammates-dialog-linux.png and b/apps/web/playwright/snapshots/spaces/spaces.spec.ts/invite-teammates-dialog-linux.png differ diff --git a/apps/web/playwright/snapshots/spaces/spaces.spec.ts/space-room-view-linux.png b/apps/web/playwright/snapshots/spaces/spaces.spec.ts/space-room-view-linux.png index ac19c94bdb..4bd9805665 100644 Binary files a/apps/web/playwright/snapshots/spaces/spaces.spec.ts/space-room-view-linux.png and b/apps/web/playwright/snapshots/spaces/spaces.spec.ts/space-room-view-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/event-list-summary.spec.ts/bot-joined-the-room-linux.png b/apps/web/playwright/snapshots/timeline/event-list-summary.spec.ts/bot-joined-the-room-linux.png index fd779a3752..44be83cb88 100644 Binary files a/apps/web/playwright/snapshots/timeline/event-list-summary.spec.ts/bot-joined-the-room-linux.png and b/apps/web/playwright/snapshots/timeline/event-list-summary.spec.ts/bot-joined-the-room-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/event-list-summary.spec.ts/bot-was-banned-linux.png b/apps/web/playwright/snapshots/timeline/event-list-summary.spec.ts/bot-was-banned-linux.png index 460e9bea73..981989e501 100644 Binary files a/apps/web/playwright/snapshots/timeline/event-list-summary.spec.ts/bot-was-banned-linux.png and b/apps/web/playwright/snapshots/timeline/event-list-summary.spec.ts/bot-was-banned-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/event-list-summary.spec.ts/multiple-join-ban-messages-linux.png b/apps/web/playwright/snapshots/timeline/event-list-summary.spec.ts/multiple-join-ban-messages-linux.png index 8706084d06..d8163d1056 100644 Binary files a/apps/web/playwright/snapshots/timeline/event-list-summary.spec.ts/multiple-join-ban-messages-linux.png and b/apps/web/playwright/snapshots/timeline/event-list-summary.spec.ts/multiple-join-ban-messages-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/event-list-summary.spec.ts/multiple-join-leave-messages-linux.png b/apps/web/playwright/snapshots/timeline/event-list-summary.spec.ts/multiple-join-leave-messages-linux.png index a998623d1d..c011103b78 100644 Binary files a/apps/web/playwright/snapshots/timeline/event-list-summary.spec.ts/multiple-join-leave-messages-linux.png and b/apps/web/playwright/snapshots/timeline/event-list-summary.spec.ts/multiple-join-leave-messages-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/event-list-summary.spec.ts/multiple-people-ban-messages-expanded-linux.png b/apps/web/playwright/snapshots/timeline/event-list-summary.spec.ts/multiple-people-ban-messages-expanded-linux.png index b66a1cefd1..cd6ae7bec1 100644 Binary files a/apps/web/playwright/snapshots/timeline/event-list-summary.spec.ts/multiple-people-ban-messages-expanded-linux.png and b/apps/web/playwright/snapshots/timeline/event-list-summary.spec.ts/multiple-people-ban-messages-expanded-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/event-list-summary.spec.ts/multiple-people-ban-messages-linux.png b/apps/web/playwright/snapshots/timeline/event-list-summary.spec.ts/multiple-people-ban-messages-linux.png index a4cbb01f03..b892fb31b2 100644 Binary files a/apps/web/playwright/snapshots/timeline/event-list-summary.spec.ts/multiple-people-ban-messages-linux.png and b/apps/web/playwright/snapshots/timeline/event-list-summary.spec.ts/multiple-people-ban-messages-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/event-list-summary.spec.ts/multiple-people-join-leave-messages-expanded-linux.png b/apps/web/playwright/snapshots/timeline/event-list-summary.spec.ts/multiple-people-join-leave-messages-expanded-linux.png index 83ce27bad0..ad3a446fb1 100644 Binary files a/apps/web/playwright/snapshots/timeline/event-list-summary.spec.ts/multiple-people-join-leave-messages-expanded-linux.png and b/apps/web/playwright/snapshots/timeline/event-list-summary.spec.ts/multiple-people-join-leave-messages-expanded-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/event-list-summary.spec.ts/multiple-people-join-leave-messages-linux.png b/apps/web/playwright/snapshots/timeline/event-list-summary.spec.ts/multiple-people-join-leave-messages-linux.png index 51489a1de1..abb228f9d0 100644 Binary files a/apps/web/playwright/snapshots/timeline/event-list-summary.spec.ts/multiple-people-join-leave-messages-linux.png and b/apps/web/playwright/snapshots/timeline/event-list-summary.spec.ts/multiple-people-join-leave-messages-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-no-avatar-linux.png b/apps/web/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-no-avatar-linux.png index 6840739135..ea22f0f842 100644 Binary files a/apps/web/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-no-avatar-linux.png and b/apps/web/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-no-avatar-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-room-tree-no-avatar-linux.png b/apps/web/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-room-tree-no-avatar-linux.png index 3210a498af..b2fec6be6e 100644 Binary files a/apps/web/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-room-tree-no-avatar-linux.png and b/apps/web/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-room-tree-no-avatar-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-room-tree-with-avatar-linux.png b/apps/web/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-room-tree-with-avatar-linux.png index 6e0a26cc6b..c606d3f117 100644 Binary files a/apps/web/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-room-tree-with-avatar-linux.png and b/apps/web/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-room-tree-with-avatar-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-with-avatar-linux.png b/apps/web/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-with-avatar-linux.png index 7a7d2025c2..be846ace9c 100644 Binary files a/apps/web/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-with-avatar-linux.png and b/apps/web/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-with-avatar-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/code-block-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/code-block-linux.png index 3f4cae7c29..5bd106b17f 100644 Binary files a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/code-block-linux.png and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/code-block-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/collapsed-gels-and-messages-irc-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/collapsed-gels-and-messages-irc-layout-linux.png index 4b5c6ff7e9..781d4c67fe 100644 Binary files a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/collapsed-gels-and-messages-irc-layout-linux.png and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/collapsed-gels-and-messages-irc-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/collapsed-gels-bubble-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/collapsed-gels-bubble-layout-linux.png index 0ad4a0f191..6b849468b8 100644 Binary files a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/collapsed-gels-bubble-layout-linux.png and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/collapsed-gels-bubble-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/configured-room-irc-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/configured-room-irc-layout-linux.png index 10896ff87d..64ad63d865 100644 Binary files a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/configured-room-irc-layout-linux.png and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/configured-room-irc-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/edited-code-block-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/edited-code-block-linux.png index dcd74911d5..0dc4ad4846 100644 Binary files a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/edited-code-block-linux.png and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/edited-code-block-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-line-inline-start-margin-irc-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-line-inline-start-margin-irc-layout-linux.png index 89ab0ca222..475be8c267 100644 Binary files a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-line-inline-start-margin-irc-layout-linux.png and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-line-inline-start-margin-irc-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tile-reply-chains-bubble-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tile-reply-chains-bubble-layout-linux.png index eae52b9e4b..f8be1339ec 100644 Binary files a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tile-reply-chains-bubble-layout-linux.png and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tile-reply-chains-bubble-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tile-reply-chains-compact-modern-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tile-reply-chains-compact-modern-layout-linux.png index f724a3198f..8e4f752586 100644 Binary files a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tile-reply-chains-compact-modern-layout-linux.png and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tile-reply-chains-compact-modern-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tile-reply-chains-irc-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tile-reply-chains-irc-layout-linux.png index 3af1ce146f..4fed5a2688 100644 Binary files a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tile-reply-chains-irc-layout-linux.png and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tile-reply-chains-irc-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tile-reply-chains-irc-modern-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tile-reply-chains-irc-modern-linux.png index 49580a63d6..77a760c073 100644 Binary files a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tile-reply-chains-irc-modern-linux.png and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tile-reply-chains-irc-modern-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tiles-bubble-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tiles-bubble-layout-linux.png index 040b1ef72c..f4af327000 100644 Binary files a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tiles-bubble-layout-linux.png and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tiles-bubble-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tiles-compact-modern-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tiles-compact-modern-layout-linux.png index e8c495e8e9..b142d6b940 100644 Binary files a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tiles-compact-modern-layout-linux.png and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tiles-compact-modern-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tiles-irc-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tiles-irc-layout-linux.png index f5dfef5714..2e7a681247 100644 Binary files a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tiles-irc-layout-linux.png and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tiles-irc-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tiles-modern-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tiles-modern-layout-linux.png index 914e10dff2..fe75aaabd3 100644 Binary files a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tiles-modern-layout-linux.png and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tiles-modern-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-and-messages-irc-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-and-messages-irc-layout-linux.png index e801381b8c..c75b214a5e 100644 Binary files a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-and-messages-irc-layout-linux.png and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-and-messages-irc-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-bubble-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-bubble-layout-linux.png index d7e58aace0..7ce4b411db 100644 Binary files a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-bubble-layout-linux.png and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-bubble-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-emote-irc-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-emote-irc-layout-linux.png index 2f503a5d7b..a71eca7b90 100644 Binary files a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-emote-irc-layout-linux.png and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-emote-irc-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-irc-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-irc-layout-linux.png index 89ab0ca222..475be8c267 100644 Binary files a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-irc-layout-linux.png and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-irc-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-modern-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-modern-layout-linux.png index 2343978f71..8f453b8de2 100644 Binary files a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-modern-layout-linux.png and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-modern-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-redaction-placeholder-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-redaction-placeholder-linux.png index d0ec667834..37670d5754 100644 Binary files a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-redaction-placeholder-linux.png and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-redaction-placeholder-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/hidden-event-line-padding-modern-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/hidden-event-line-padding-modern-layout-linux.png index c58861bbfb..b22eb6d474 100644 Binary files a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/hidden-event-line-padding-modern-layout-linux.png and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/hidden-event-line-padding-modern-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/hidden-event-line-zero-padding-irc-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/hidden-event-line-zero-padding-irc-layout-linux.png index 3c7eb3caf9..ad00531521 100644 Binary files a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/hidden-event-line-zero-padding-irc-layout-linux.png and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/hidden-event-line-zero-padding-irc-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/highlighted-search-results-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/highlighted-search-results-linux.png index d8e061597f..1ca92215fa 100644 Binary files a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/highlighted-search-results-linux.png and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/highlighted-search-results-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/hovered-hidden-event-line-irc-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/hovered-hidden-event-line-irc-layout-linux.png index 8a86ec81bb..247c8313ff 100644 Binary files a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/hovered-hidden-event-line-irc-layout-linux.png and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/hovered-hidden-event-line-irc-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/image-in-timeline-default-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/image-in-timeline-default-layout-linux.png index 8949324613..54f27f78ee 100644 Binary files a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/image-in-timeline-default-layout-linux.png and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/image-in-timeline-default-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/long-strings-with-reply-bubble-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/long-strings-with-reply-bubble-layout-linux.png index 0ebb9196ed..7924725ead 100644 Binary files a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/long-strings-with-reply-bubble-layout-linux.png and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/long-strings-with-reply-bubble-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/long-strings-with-reply-irc-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/long-strings-with-reply-irc-layout-linux.png index 2896031331..e59c59796b 100644 Binary files a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/long-strings-with-reply-irc-layout-linux.png and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/long-strings-with-reply-irc-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/long-strings-with-reply-modern-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/long-strings-with-reply-modern-layout-linux.png index 84f32debc2..cfd7db0fdb 100644 Binary files a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/long-strings-with-reply-modern-layout-linux.png and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/long-strings-with-reply-modern-layout-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/search-aux-panel-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/search-aux-panel-linux.png index 6009b554ca..a4f5b67ad7 100644 Binary files a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/search-aux-panel-linux.png and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/search-aux-panel-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/search-results-with-TextualEvent-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/search-results-with-TextualEvent-linux.png index e742edfed9..27746d1981 100644 Binary files a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/search-results-with-TextualEvent-linux.png and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/search-results-with-TextualEvent-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/spoiler-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/spoiler-linux.png index 1679135c12..14f9e6815b 100644 Binary files a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/spoiler-linux.png and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/spoiler-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/spoiler-uncovered-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/spoiler-uncovered-linux.png index 3e4583da5b..9c3c94a127 100644 Binary files a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/spoiler-uncovered-linux.png and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/spoiler-uncovered-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/voice-message-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/voice-message-linux.png index ba1cb6e3f6..bb121bfdb2 100644 Binary files a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/voice-message-linux.png and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/voice-message-linux.png differ diff --git a/apps/web/playwright/snapshots/user-menu/user-menu.spec.ts/user-menu-linux.png b/apps/web/playwright/snapshots/user-menu/user-menu.spec.ts/user-menu-linux.png index d61ac9e147..d32108d254 100644 Binary files a/apps/web/playwright/snapshots/user-menu/user-menu.spec.ts/user-menu-linux.png and b/apps/web/playwright/snapshots/user-menu/user-menu.spec.ts/user-menu-linux.png differ diff --git a/apps/web/playwright/snapshots/voip/pstn.spec.ts/dialpad-trigger-linux.png b/apps/web/playwright/snapshots/voip/pstn.spec.ts/dialpad-trigger-linux.png index d1c0cad107..c98c368e3c 100644 Binary files a/apps/web/playwright/snapshots/voip/pstn.spec.ts/dialpad-trigger-linux.png and b/apps/web/playwright/snapshots/voip/pstn.spec.ts/dialpad-trigger-linux.png differ diff --git a/apps/web/playwright/snapshots/widgets/layout.spec.ts/apps-drawer-linux.png b/apps/web/playwright/snapshots/widgets/layout.spec.ts/apps-drawer-linux.png index 50c0e1ed2d..5c6c78bed4 100644 Binary files a/apps/web/playwright/snapshots/widgets/layout.spec.ts/apps-drawer-linux.png and b/apps/web/playwright/snapshots/widgets/layout.spec.ts/apps-drawer-linux.png differ diff --git a/apps/web/res/css/_common.pcss b/apps/web/res/css/_common.pcss index b461a08485..355d480b73 100644 --- a/apps/web/res/css/_common.pcss +++ b/apps/web/res/css/_common.pcss @@ -54,6 +54,15 @@ Please see LICENSE files in the repository root for full details. isolation: isolate; } +/** + * Disable pointer events inside the persistentElement container when the room-list is being resized. + * This is necessary to avoid the pointer events from being hijacked by the content rendered inside + * that div. + */ +:root:has(.mx_Separator[data-separator="active"]) #mx_PersistedElement_container { + pointer-events: none; +} + /** * We need to increase the specificity of the selector to override the * custom property set by the design tokens package diff --git a/apps/web/res/css/structures/_LeftPanel.pcss b/apps/web/res/css/structures/_LeftPanel.pcss index 45fc6b0a6a..e72579064a 100644 --- a/apps/web/res/css/structures/_LeftPanel.pcss +++ b/apps/web/res/css/structures/_LeftPanel.pcss @@ -25,6 +25,17 @@ Please see LICENSE files in the repository root for full details. --collapsedWidth: 68px; } +.mx_LeftPanel_panel { + .mx_LeftPanel_outerWrapper { + height: 100%; + max-width: none; + } + + .mx_LeftPanel_wrapper--user { + width: 100%; + } +} + .mx_LeftPanel_wrapper { display: flex; flex-direction: row; @@ -211,3 +222,11 @@ Please see LICENSE files in the repository root for full details. /* Important to force the color on ED titlebar until we remove the old room list */ background-color: var(--cpd-color-bg-canvas-default) !important; } + +#left-panel .mx_LeftPanel_wrapper--user { + /* + * Disable background when using the new room list. + * This background sometimes shows when the panel is resized and it looks like a thicker border. + */ + background: none; +} diff --git a/apps/web/res/css/structures/_RoomView.pcss b/apps/web/res/css/structures/_RoomView.pcss index 6a5ceb641b..e3342f69bf 100644 --- a/apps/web/res/css/structures/_RoomView.pcss +++ b/apps/web/res/css/structures/_RoomView.pcss @@ -10,6 +10,12 @@ Please see LICENSE files in the repository root for full details. --RoomView_MessageList-padding: 18px; } +.mx_LeftPanel_panel { + .mx_RoomView_wrapper { + height: 100%; + } +} + .mx_RoomView_wrapper { display: flex; flex-direction: column; diff --git a/apps/web/src/components/structures/LoggedInView.tsx b/apps/web/src/components/structures/LoggedInView.tsx index 0e084d5644..ad364a6527 100644 --- a/apps/web/src/components/structures/LoggedInView.tsx +++ b/apps/web/src/components/structures/LoggedInView.tsx @@ -22,6 +22,7 @@ import { } from "matrix-js-sdk/src/matrix"; import { type MatrixCall } from "matrix-js-sdk/src/webrtc/call"; import classNames from "classnames"; +import { GroupView, SeparatorView, Panel, LeftResizablePanelView } from "@element-hq/web-shared-components"; import { isOnlyCtrlOrCmdKeyEvent, Key } from "../../Keyboard"; import PageTypes from "../../PageTypes"; @@ -70,6 +71,7 @@ import { MatrixClientContextProvider } from "./MatrixClientContextProvider"; import { Landmark, LandmarkNavigation } from "../../accessibility/LandmarkNavigation"; import { ModuleApi } from "../../modules/Api.ts"; import { SDKContext } from "../../contexts/SDKContext.ts"; +import { ResizerViewModel } from "../../viewmodels/structures/ResizerViewModel.ts"; // We need to fetch each pinned message individually (if we don't already have it) // so each pinned message may trigger a request. Limit the number per room for sanity. @@ -136,6 +138,8 @@ class LoggedInView extends React.Component { protected timezoneProfileUpdateRef?: string[]; protected resizer?: Resizer; + private resizerViewModel?: ResizerViewModel; + public static contextType = SDKContext; declare public context: React.ContextType; @@ -198,6 +202,8 @@ class LoggedInView extends React.Component { OwnProfileStore.instance.on(UPDATE_EVENT, this.refreshBackgroundImage); this.refreshBackgroundImage(); + + this.resizerViewModel = new ResizerViewModel(); } /** @@ -258,6 +264,7 @@ class LoggedInView extends React.Component { SettingsStore.unwatchSetting(this.backgroundImageWatcherRef); this.timezoneProfileUpdateRef?.forEach((s) => SettingsStore.unwatchSetting(s)); this.resizer?.detach(); + this.resizerViewModel?.dispose(); } private onCallState = (): void => { @@ -760,6 +767,58 @@ class LoggedInView extends React.Component { }); const shouldUseMinimizedUI = !useNewRoomList && this.props.collapseLhs; + + const leftPanel = ( +
+ +
+ {!useNewRoomList && ( + + )} + {!useNewRoomList && } + {!useNewRoomList && } + {!moduleRenderer && ( +
+ +
+ )} +
+
+ ); + + const roomView =
{pageElement}
; + const content = + useNewRoomList && this.resizerViewModel ? ( + + + + {leftPanel} + + + {roomView} + + ) : ( + <> + {leftPanel} + {!moduleRenderer && } + {roomView} + + ); + return (
{ aria-hidden={this.props.hideToSRUsers} > -
-
- -
- {!useNewRoomList && ( - - )} - - {!useNewRoomList && } - {!moduleRenderer && ( -
- -
- )} -
-
- {!moduleRenderer && } -
{pageElement}
-
+
{content}
diff --git a/apps/web/src/settings/Settings.tsx b/apps/web/src/settings/Settings.tsx index 4294279d17..02a692a209 100644 --- a/apps/web/src/settings/Settings.tsx +++ b/apps/web/src/settings/Settings.tsx @@ -329,6 +329,8 @@ export interface Settings { "lowBandwidth": IBaseSetting; "fallbackICEServerAllowed": IBaseSetting; "RoomList.preferredSorting": IBaseSetting; + "RoomList.panelSize": IBaseSetting; + "RoomList.isPanelCollapsed": IBaseSetting; "RoomList.showMessagePreview": IBaseSetting; "RightPanel.phasesGlobal": IBaseSetting; "RightPanel.phases": IBaseSetting; @@ -1217,6 +1219,14 @@ export const SETTINGS: Settings = { supportedLevels: [SettingLevel.DEVICE], default: SortingAlgorithm.Recency, }, + "RoomList.panelSize": { + supportedLevels: [SettingLevel.DEVICE], + default: null, + }, + "RoomList.isPanelCollapsed": { + supportedLevels: [SettingLevel.DEVICE], + default: false, + }, "RoomList.showMessagePreview": { supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG, default: false, diff --git a/apps/web/src/viewmodels/structures/ResizerViewModel.ts b/apps/web/src/viewmodels/structures/ResizerViewModel.ts new file mode 100644 index 0000000000..10067ff9ae --- /dev/null +++ b/apps/web/src/viewmodels/structures/ResizerViewModel.ts @@ -0,0 +1,103 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import { + BaseViewModel, + type LeftResizablePanelViewActions, + type SeparatorViewActions, + type PanelSize, + type PanelImperativeHandle, + type GroupViewActions, + type ResizerViewSnapshot, +} from "@element-hq/web-shared-components"; +import { debounce } from "lodash"; +import whatInput from "what-input"; + +import SettingsStore from "../../settings/SettingsStore"; +import { SettingLevel } from "../../settings/SettingLevel"; + +function getInitialState(): ResizerViewSnapshot { + if (SettingsStore.getValue("RoomList.isPanelCollapsed")) { + return { + isCollapsed: true, + initialSize: 0, + isFocusedViaKeyboard: false, + }; + } + return { + isCollapsed: false, + initialSize: SettingsStore.getValue("RoomList.panelSize") ?? undefined, + isFocusedViaKeyboard: false, + }; +} + +/** + * Viewmodel that drives the resizable left panel. + */ +export class ResizerViewModel + extends BaseViewModel + implements SeparatorViewActions, LeftResizablePanelViewActions, GroupViewActions +{ + /** + * This object gives us access to the API methods of react-resizable-panels library. + */ + private panelHandle?: PanelImperativeHandle; + + public constructor() { + super(undefined, getInitialState()); + } + + public onLeftPanelResize = debounce((panelSize: PanelSize): void => { + const newSize = panelSize.inPixels; + this.snapshot.merge({ isCollapsed: newSize === 0 }); + }, 50); + + public onLeftPanelResized = (newSize: number): void => { + const isCollapsed = newSize === 0; + // Store the size if the panel isn't collapsed. + if (!isCollapsed) { + SettingsStore.setValue("RoomList.panelSize", null, SettingLevel.DEVICE, newSize); + } + // Store whether the panel was collapsed. + // This is stored separately instead of being inferred from the stored panel size so that + // the panel can be restored to its last known non-zero width even after app reload, which + // we wouldn't be able to do if we stored panelSize as zero. + SettingsStore.setValue("RoomList.isPanelCollapsed", null, SettingLevel.DEVICE, isCollapsed); + }; + + public setPanelHandle = (handle: PanelImperativeHandle): void => { + this.panelHandle = handle; + }; + + public onSeparatorClick = (): void => { + if (this.panelHandle?.isCollapsed()) { + this.panelHandle.resize(`100%`); + } + }; + + public onFocus = (): void => { + /** + * The intention here is to make the separator visible when it is focused by keyboard + * navigation i.e tabbing through the app. + * + * There's a good reason to take this approach instead of just relying on the focus-visible + * selector: + * When exactly an element gets focus-visible is determined by browser heuristics and usually + * interacting with the mouse will not give an element focus-visible. + * However with this separator on chrome, mouse interaction occasionally gives it focus-visible. + * The leads to flakey separator behaviour. + */ + const currentNavigation = whatInput.ask(); + if (currentNavigation === "keyboard") { + this.snapshot.merge({ isFocusedViaKeyboard: true }); + } + }; + + public onBlur = (): void => { + if (this.getSnapshot().isFocusedViaKeyboard) this.snapshot.merge({ isFocusedViaKeyboard: false }); + }; +} diff --git a/apps/web/test/viewmodels/structures/ResizerViewModel-test.ts b/apps/web/test/viewmodels/structures/ResizerViewModel-test.ts new file mode 100644 index 0000000000..aacdb95bf1 --- /dev/null +++ b/apps/web/test/viewmodels/structures/ResizerViewModel-test.ts @@ -0,0 +1,92 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import { waitFor } from "jest-matrix-react"; +import { type PanelImperativeHandle } from "@element-hq/web-shared-components"; +import whatInput from "what-input"; + +import { ResizerViewModel } from "../../../src/viewmodels/structures/ResizerViewModel"; +import SettingsStore from "../../../src/settings/SettingsStore"; +import { SettingLevel } from "../../../src/settings/SettingLevel"; + +jest.mock("what-input"); + +describe("LeftPanelResizerViewModel", () => { + afterEach(() => { + SettingsStore.reset(); + }); + + describe("Initial state is correct", () => { + it("should have correct initial state when panel was previously collapsed", () => { + SettingsStore.setValue("RoomList.isPanelCollapsed", null, SettingLevel.DEVICE, true); + const vm = new ResizerViewModel(); + expect(vm.getSnapshot()).toStrictEqual({ + isCollapsed: true, + initialSize: 0, + isFocusedViaKeyboard: false, + }); + }); + + it("should have correct initial state when panel was previously resized", () => { + SettingsStore.setValue("RoomList.panelSize", null, SettingLevel.DEVICE, 34); + const vm = new ResizerViewModel(); + expect(vm.getSnapshot()).toStrictEqual({ + isCollapsed: false, + initialSize: 34, + isFocusedViaKeyboard: false, + }); + }); + + it("should have correct initial state when panel was neither resized nor collapsed", () => { + const vm = new ResizerViewModel(); + expect(vm.getSnapshot()).toStrictEqual({ + isCollapsed: false, + initialSize: undefined, + isFocusedViaKeyboard: false, + }); + }); + }); + + it("should update isCollapsed on onLeftPanelResized()", async () => { + const vm = new ResizerViewModel(); + vm.onLeftPanelResize({ inPixels: 100, asPercentage: 6 }); + await waitFor(() => { + expect(vm.getSnapshot().isCollapsed).toStrictEqual(false); + }); + vm.onLeftPanelResize({ inPixels: 0, asPercentage: 6 }); + await waitFor(() => { + expect(vm.getSnapshot().isCollapsed).toStrictEqual(true); + }); + }); + + it("should noop on onSeparatorClick() when handle is not yet set", () => { + const vm = new ResizerViewModel(); + expect(() => vm.onSeparatorClick()).not.toThrow(); + }); + + it("should expand panel on onSeparatorClick()", () => { + const vm = new ResizerViewModel(); + const mockHandle = { + resize: jest.fn(), + isCollapsed: jest.fn().mockReturnValue(true), + } as unknown as PanelImperativeHandle; + vm.setPanelHandle(mockHandle); + + vm.onSeparatorClick(); + + expect(mockHandle.resize).toHaveBeenCalledWith("100%"); + }); + + it("should set isFocusedViaKeyboard state correctly", () => { + whatInput.ask = jest.fn().mockReturnValue("keyboard"); + const vm = new ResizerViewModel(); + vm.onFocus(); + expect(vm.getSnapshot().isFocusedViaKeyboard).toStrictEqual(true); + vm.onBlur(); + expect(vm.getSnapshot().isFocusedViaKeyboard).toStrictEqual(false); + }); +}); diff --git a/packages/shared-components/__vis__/linux/__baselines__/resize/separator/SeparatorView.stories.tsx/default-auto.png b/packages/shared-components/__vis__/linux/__baselines__/resize/separator/SeparatorView.stories.tsx/default-auto.png new file mode 100644 index 0000000000..8f5c822828 Binary files /dev/null and b/packages/shared-components/__vis__/linux/__baselines__/resize/separator/SeparatorView.stories.tsx/default-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/resize/separator/SeparatorView.stories.tsx/hover-1.png b/packages/shared-components/__vis__/linux/__baselines__/resize/separator/SeparatorView.stories.tsx/hover-1.png new file mode 100644 index 0000000000..34149eba6c Binary files /dev/null and b/packages/shared-components/__vis__/linux/__baselines__/resize/separator/SeparatorView.stories.tsx/hover-1.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/resize/separator/SeparatorView.stories.tsx/keyboard-focused-1.png b/packages/shared-components/__vis__/linux/__baselines__/resize/separator/SeparatorView.stories.tsx/keyboard-focused-1.png new file mode 100644 index 0000000000..769bf9de51 Binary files /dev/null and b/packages/shared-components/__vis__/linux/__baselines__/resize/separator/SeparatorView.stories.tsx/keyboard-focused-1.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/resize/separator/SeparatorView.stories.tsx/left-panel-expanded-auto.png b/packages/shared-components/__vis__/linux/__baselines__/resize/separator/SeparatorView.stories.tsx/left-panel-expanded-auto.png new file mode 100644 index 0000000000..adfeaa7f5d Binary files /dev/null and b/packages/shared-components/__vis__/linux/__baselines__/resize/separator/SeparatorView.stories.tsx/left-panel-expanded-auto.png differ diff --git a/packages/shared-components/package.json b/packages/shared-components/package.json index 70aa0b0438..992fb3e3bc 100644 --- a/packages/shared-components/package.json +++ b/packages/shared-components/package.json @@ -64,6 +64,7 @@ "lodash": "npm:lodash-es@^4.17.21", "matrix-web-i18n": "catalog:", "react-merge-refs": "^3.0.2", + "react-resizable-panels": "^4.6.5", "react-virtuoso": "^4.14.0", "temporal-polyfill": "^0.3.0" }, diff --git a/packages/shared-components/src/i18n/strings/en_EN.json b/packages/shared-components/src/i18n/strings/en_EN.json index 10776b46f3..80a43241c8 100644 --- a/packages/shared-components/src/i18n/strings/en_EN.json +++ b/packages/shared-components/src/i18n/strings/en_EN.json @@ -30,7 +30,8 @@ "state_encryption_enabled": "Experimental state encryption enabled" }, "left_panel": { - "open_dial_pad": "Open dial pad" + "open_dial_pad": "Open dial pad", + "separator_label": "Click or drag to expand" }, "notifications": { "all_messages": "All messages", diff --git a/packages/shared-components/src/index.ts b/packages/shared-components/src/index.ts index 96b2a8acba..3bcfdac0ae 100644 --- a/packages/shared-components/src/index.ts +++ b/packages/shared-components/src/index.ts @@ -49,6 +49,7 @@ export * from "./utils/Flex"; export * from "./utils/LinkedText"; export * from "./right-panel/WidgetContextMenu"; export * from "./utils/VirtualizedList"; +export * from "./resize"; // Utils export * from "./utils/i18n"; diff --git a/packages/shared-components/src/resize/group/GroupView.stories.tsx b/packages/shared-components/src/resize/group/GroupView.stories.tsx new file mode 100644 index 0000000000..132429d192 --- /dev/null +++ b/packages/shared-components/src/resize/group/GroupView.stories.tsx @@ -0,0 +1,72 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { type JSX } from "react"; +import { fn } from "storybook/test"; + +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { GroupView, type GroupViewActions, Panel, Separator } from ".."; +import { useMockedViewModel } from "../../viewmodel"; +import { withViewDocs } from "../../../.storybook/withViewDocs"; +import { Flex } from "../../utils/Flex"; + +type GroupViewProps = GroupViewActions; + +const Wrapper = ({ onLeftPanelResized }: GroupViewProps): JSX.Element => { + const vm = useMockedViewModel(undefined, { onLeftPanelResized }); + return ( + + + + LEFT CONTENT + + + + + + MAIN CONTENT + + + + ); +}; + +const GroupViewWrapper = withViewDocs(Wrapper, GroupView); + +const meta = { + title: "Resize/GroupView", + component: GroupViewWrapper, + // This is a structural component, so nothing to visually test. + tags: ["autodocs", "!snapshot"], + args: { + onLeftPanelResized: fn(), + }, + parameters: { + design: { + type: "figma", + url: "https://www.figma.com/design/vlmt46QDdE4dgXDiyBJXqp/ER-33-Left-Panel?node-id=2503-46137&t=d52sHg9vUDKnQS1Y-4", + }, + }, +} satisfies Meta; + +export default meta; + +type Story = StoryObj; + +export const Default: Story = { + decorators: [ + (Story) => ( +
+ +
+ ), + ], +}; diff --git a/packages/shared-components/src/resize/group/GroupView.test.tsx b/packages/shared-components/src/resize/group/GroupView.test.tsx new file mode 100644 index 0000000000..5144ada618 --- /dev/null +++ b/packages/shared-components/src/resize/group/GroupView.test.tsx @@ -0,0 +1,57 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React from "react"; +import { render, screen } from "@test-utils"; +import { composeStories } from "@storybook/react-vite"; +import { describe, it, expect, vi } from "vitest"; +import userEvent from "@testing-library/user-event"; + +import * as stories from "./GroupView.stories"; +import { BaseViewModel } from "../../viewmodel"; +import { GroupView, type GroupViewActions, Panel, Separator } from ".."; + +const { Default } = composeStories(stories); + +class MockViewModel extends BaseViewModel implements GroupViewActions { + public constructor() { + super(undefined, undefined); + } + + public onLeftPanelResized: (newSize: number) => void = vi.fn(); +} + +function renderPanel(): MockViewModel { + const vm = new MockViewModel(); + render( + + Test + + Test + , + ); + return vm; +} + +describe("", () => { + it("renders Default story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("should call onLeftPanelResize", async () => { + const vm = renderPanel(); + const separator = screen.getByRole("separator"); + const user = userEvent.setup(); + await user.pointer([ + { target: separator, keys: "[MouseLeft>]" }, + { coords: { x: 400, y: 200 } }, + { keys: "[/MouseLeft]" }, + ]); + expect(vm.onLeftPanelResized).toHaveBeenCalledOnce(); + }); +}); diff --git a/packages/shared-components/src/resize/group/GroupView.tsx b/packages/shared-components/src/resize/group/GroupView.tsx new file mode 100644 index 0000000000..e685a5108e --- /dev/null +++ b/packages/shared-components/src/resize/group/GroupView.tsx @@ -0,0 +1,42 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { type PropsWithChildren } from "react"; +import { Group, type Layout } from "react-resizable-panels"; + +import { type ViewModel, useViewModel } from "../../viewmodel"; +import { LEFT_PANEL_ID } from ".."; + +export interface GroupViewActions { + /** + * Indicates to the view-model that the left panel was resized. + * @param newSize The new size of the left panel + */ + onLeftPanelResized: (newSize: number) => void; +} + +interface Props { + vm: ViewModel; +} + +/** + * This the root component for collapsible left panel. Based on {@link Group} from react-resizable-panels. + */ +export function GroupView({ vm, children }: PropsWithChildren): React.ReactNode { + useViewModel(vm); + + /** + * Take layout data provided by the library and pass just the size + * of the left panel to the vm. + */ + const onLayoutChanged = (layout: Layout): void => { + const newSize = layout[LEFT_PANEL_ID]; + vm.onLeftPanelResized(newSize); + }; + + return {children}; +} diff --git a/packages/shared-components/src/resize/group/__snapshots__/GroupView.test.tsx.snap b/packages/shared-components/src/resize/group/__snapshots__/GroupView.test.tsx.snap new file mode 100644 index 0000000000..d0862c4d67 --- /dev/null +++ b/packages/shared-components/src/resize/group/__snapshots__/GroupView.test.tsx.snap @@ -0,0 +1,64 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[` > renders Default story 1`] = ` +
+
+
+
+
+
+ LEFT CONTENT +
+
+
+ +
+
+`; diff --git a/packages/shared-components/src/resize/index.ts b/packages/shared-components/src/resize/index.ts new file mode 100644 index 0000000000..7030fbe0fe --- /dev/null +++ b/packages/shared-components/src/resize/index.ts @@ -0,0 +1,46 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +/** + * This is the id given to the resizable container that holds + * the left panel contents. + */ +export const LEFT_PANEL_ID = "left-panel"; + +export * from "./group/GroupView"; +export * from "./separator/SeparatorView"; +export * from "./panel/LeftResizablePanelView"; + +/** + * Common snapshot for GroupView, SeparatorView and LeftResizablePanelView. + */ +export interface ResizerViewSnapshot { + /** + * Whether the left panel is collapsed or not. + */ + isCollapsed: boolean; + /** + * This is the initial size of the panel if available; should be interpreted as percentage. + */ + initialSize?: number; + /** + * Whether the separator is currently focused by navigating + * to it using keyboard input. + */ + isFocusedViaKeyboard: boolean; +} + +/** + * Export relevant parts of the underlying library. + */ +export { + Group as ResizableGroup, + Panel, + Separator, + type PanelSize, + type PanelImperativeHandle, +} from "react-resizable-panels"; diff --git a/packages/shared-components/src/resize/panel/LeftResizablePanelView.stories.tsx b/packages/shared-components/src/resize/panel/LeftResizablePanelView.stories.tsx new file mode 100644 index 0000000000..2c6f583d2f --- /dev/null +++ b/packages/shared-components/src/resize/panel/LeftResizablePanelView.stories.tsx @@ -0,0 +1,81 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { type JSX } from "react"; +import { fn } from "storybook/test"; + +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { + ResizableGroup, + LeftResizablePanelView, + Panel, + Separator, + type LeftResizablePanelViewActions, + type ResizerViewSnapshot, +} from ".."; +import { useMockedViewModel } from "../../viewmodel"; +import { withViewDocs } from "../../../.storybook/withViewDocs"; +import { Flex } from "../../utils/Flex"; + +type LeftResizablePanelViewProps = ResizerViewSnapshot & LeftResizablePanelViewActions; + +const Wrapper = ({ onLeftPanelResize, setPanelHandle, ...snapshot }: LeftResizablePanelViewProps): JSX.Element => { + const vm = useMockedViewModel(snapshot, { onLeftPanelResize, setPanelHandle }); + return ( + + + LEFT CONTENT + + + ); +}; + +const LeftResizablePanelViewWrapper = withViewDocs(Wrapper, LeftResizablePanelView); + +const meta = { + title: "Resize/LeftResizablePanelView", + component: LeftResizablePanelViewWrapper, + // This is a structural component, so nothing to visually test. + tags: ["autodocs", "!snapshot"], + argTypes: { + // This snapshot state is not relevant for this View. + isFocusedViaKeyboard: { table: { disable: true } }, + }, + args: { + initialSize: 20, + isCollapsed: false, + isFocusedViaKeyboard: false, + onLeftPanelResize: fn(), + setPanelHandle: fn(), + }, +} satisfies Meta; + +export default meta; + +type Story = StoryObj; + +export const Default: Story = { + decorators: [ + (Story) => ( +
+ + + + + + MAIN CONTENT + + + +
+ ), + ], +}; diff --git a/packages/shared-components/src/resize/panel/LeftResizablePanelView.test.tsx b/packages/shared-components/src/resize/panel/LeftResizablePanelView.test.tsx new file mode 100644 index 0000000000..bb80654901 --- /dev/null +++ b/packages/shared-components/src/resize/panel/LeftResizablePanelView.test.tsx @@ -0,0 +1,80 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React from "react"; +import { render, screen } from "@test-utils"; +import { composeStories } from "@storybook/react-vite"; +import { describe, it, expect, vi } from "vitest"; +import userEvent from "@testing-library/user-event"; + +import * as stories from "./LeftResizablePanelView.stories"; +import { BaseViewModel } from "../../viewmodel"; +import { + ResizableGroup, + LEFT_PANEL_ID, + LeftResizablePanelView, + type LeftResizablePanelViewActions, + Panel, + type PanelImperativeHandle, + type PanelSize, + type ResizerViewSnapshot, + Separator, +} from ".."; + +const { Default } = composeStories(stories); + +class MockViewModel extends BaseViewModel implements LeftResizablePanelViewActions { + public constructor(snapshot: ResizerViewSnapshot) { + super(undefined, snapshot); + } + + public onLeftPanelResize: (panelSize: PanelSize) => void = vi.fn(); + public setPanelHandle: (handle: PanelImperativeHandle) => void = vi.fn(); +} + +function renderPanel(initialSnapshot?: Partial): MockViewModel { + const snapshot = { isCollapsed: false, isFocusedViaKeyboard: false, initialSize: 20, ...initialSnapshot }; + const vm = new MockViewModel(snapshot); + render( + + Left + + Test + , + ); + return vm; +} + +describe("", () => { + it("renders Default story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("should call setPanelHandle", () => { + const vm = renderPanel(); + expect(vm.setPanelHandle).toHaveBeenCalled(); + }); + + it("should call onLeftPanelResize", async () => { + const vm = renderPanel(); + const separator = screen.getByRole("separator"); + const user = userEvent.setup(); + await user.pointer([ + { target: separator, keys: "[MouseLeft>]" }, + { coords: { x: 400, y: 200 } }, + { keys: "[/MouseLeft]" }, + ]); + expect(vm.onLeftPanelResize).toHaveBeenCalled(); + }); + + it("should be inert when collapsed", () => { + renderPanel({ isCollapsed: true }); + const panel = screen.getByTestId(LEFT_PANEL_ID); + expect(panel.getAttribute("inert")).not.toBeNull(); + }); +}); diff --git a/packages/shared-components/src/resize/panel/LeftResizablePanelView.tsx b/packages/shared-components/src/resize/panel/LeftResizablePanelView.tsx new file mode 100644 index 0000000000..73bbed3c10 --- /dev/null +++ b/packages/shared-components/src/resize/panel/LeftResizablePanelView.tsx @@ -0,0 +1,73 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { useEffect, type PropsWithChildren } from "react"; +import { + Panel, + type PanelProps, + usePanelCallbackRef, + type PanelImperativeHandle, + type PanelSize, +} from "react-resizable-panels"; + +import { type ViewModel, useViewModel } from "../../viewmodel"; +import { LEFT_PANEL_ID, type ResizerViewSnapshot } from ".."; + +export interface LeftResizablePanelViewActions { + /** + * Indicates to the view-model that the left panel is being resized. + * @param panelSize The new panel size. + */ + onLeftPanelResize: (panelSize: PanelSize) => void; + + /** + * Pass the vm the object containing the API to interact with this panel. + * @param handle Object that can be used to access the imperative methods of the panel. + */ + setPanelHandle: (handle: PanelImperativeHandle) => void; +} + +type Props = { + vm: ViewModel; + className?: string; +} & Pick; + +/** + * This is a custom panel component for the left-panel. It is used along with SeparatorView, Group and Panel to render + * collapsible room list. + */ +export function LeftResizablePanelView({ + vm, + className, + children, + ...props +}: PropsWithChildren): React.ReactNode { + const { initialSize, isCollapsed } = useViewModel(vm); + const [panelRef, setPanelRef] = usePanelCallbackRef(); + + useEffect(() => { + if (panelRef) vm.setPanelHandle(panelRef); + }, [vm, panelRef]); + + const defaultSize = initialSize === undefined ? props.defaultSize : `${initialSize}%`; + + return ( + + {children} + + ); +} diff --git a/packages/shared-components/src/resize/panel/__snapshots__/LeftResizablePanelView.test.tsx.snap b/packages/shared-components/src/resize/panel/__snapshots__/LeftResizablePanelView.test.tsx.snap new file mode 100644 index 0000000000..8cfdc4a2bf --- /dev/null +++ b/packages/shared-components/src/resize/panel/__snapshots__/LeftResizablePanelView.test.tsx.snap @@ -0,0 +1,64 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[` > renders Default story 1`] = ` +
+
+
+
+
+
+ LEFT CONTENT +
+
+
+ +
+
+`; diff --git a/packages/shared-components/src/resize/separator/SeparatorView.module.css b/packages/shared-components/src/resize/separator/SeparatorView.module.css new file mode 100644 index 0000000000..a6cd8d5bf1 --- /dev/null +++ b/packages/shared-components/src/resize/separator/SeparatorView.module.css @@ -0,0 +1,28 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +.separator { + display: flex; + align-items: center; + /* Hide the separator by default */ + width: 0px; + opacity: 0; + /* Necessary to avoid weird focus outlines (doubled on one side, absent on one side etc...) */ + outline-offset: -2px; +} + +.separator[data-separator="hover"], +.separator:focus-visible { + background: var(--cpd-color-bg-action-tertiary-hovered); +} + +.visible { + /* Show the separator when the left panel is collapsed */ + opacity: 100%; + width: 12px; + border-right: 1px solid var(--cpd-color-bg-subtle-primary); +} diff --git a/packages/shared-components/src/resize/separator/SeparatorView.stories.tsx b/packages/shared-components/src/resize/separator/SeparatorView.stories.tsx new file mode 100644 index 0000000000..1b37c58eba --- /dev/null +++ b/packages/shared-components/src/resize/separator/SeparatorView.stories.tsx @@ -0,0 +1,152 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { type JSX } from "react"; +import { expect, fn } from "storybook/test"; + +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { ResizableGroup, Panel, type ResizerViewSnapshot, SeparatorView, type SeparatorViewActions } from ".."; +import { useMockedViewModel } from "../../viewmodel"; +import { withViewDocs } from "../../../.storybook/withViewDocs"; +import { Flex } from "../../utils/Flex"; + +type SeparatorViewProps = ResizerViewSnapshot & SeparatorViewActions; + +const Wrapper = ({ onFocus, onBlur, onSeparatorClick, ...snapshot }: SeparatorViewProps): JSX.Element => { + const vm = useMockedViewModel(snapshot, { onFocus, onBlur, onSeparatorClick }); + return ; +}; + +const SeparatorViewWrapper = withViewDocs(Wrapper, SeparatorView); + +const meta = { + title: "Resize/SeparatorView", + component: SeparatorViewWrapper, + tags: ["autodocs"], + args: { + onFocus: fn(), + onBlur: fn(), + onSeparatorClick: fn(), + isCollapsed: true, + isFocusedViaKeyboard: false, + }, + parameters: { + design: { + type: "figma", + url: "https://www.figma.com/design/rTaQE2nIUSLav4Tg3nozq7/Compound-Web-Components?node-id=10603-14568&t=hvg0p1vDW5Cg6ZKY-4", + }, + }, +} satisfies Meta; + +export default meta; + +type Story = StoryObj; + +export const Default: Story = { + decorators: [ + (Story) => ( +
+ + + + LEFT CONTENT + + + + + + MAIN CONTENT + + + +
+ ), + ], +}; + +const commonDecorator = (Story: React.ComponentType): React.ReactElement => { + return ( +
+ + + + LEFT CONTENT + + + + + + MAIN CONTENT + + + +
+ ); +}; + +export const LeftPanelExpanded: Story = { + decorators: [(Story) => commonDecorator(Story)], + args: { + isCollapsed: false, + }, +}; + +export const KeyboardFocused: Story = { + // We'll manually take a screenshot for this story + tags: ["autodocs", "!snapshot"], + decorators: [(Story) => commonDecorator(Story)], + args: { + isCollapsed: false, + isFocusedViaKeyboard: true, + }, + play: async ({ canvas, canvasElement }) => { + const separator = canvas.getByRole("separator"); + separator.focus(); + await expect(canvasElement).toMatchImageSnapshot(); + }, +}; + +export const Hover: Story = { + // We'll manually take a screenshot for this story + tags: ["autodocs", "!snapshot"], + decorators: [ + (Story) => ( +
+ + + + LEFT CONTENT + + + + + + MAIN CONTENT + + + +
+ ), + ], + play: async ({ canvas, canvasElement }) => { + const separator = canvas.getByRole("separator"); + separator.dataset.separator = "hover"; + await expect(canvasElement).toMatchImageSnapshot(); + }, +}; diff --git a/packages/shared-components/src/resize/separator/SeparatorView.test.tsx b/packages/shared-components/src/resize/separator/SeparatorView.test.tsx new file mode 100644 index 0000000000..eb6195c81f --- /dev/null +++ b/packages/shared-components/src/resize/separator/SeparatorView.test.tsx @@ -0,0 +1,73 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React from "react"; +import { render, screen } from "@test-utils"; +import { composeStories } from "@storybook/react-vite"; +import { describe, it, expect, vi } from "vitest"; +import { userEvent } from "vitest/browser"; + +import * as stories from "./SeparatorView.stories"; +import { BaseViewModel } from "../../viewmodel"; +import { ResizableGroup, Panel, type ResizerViewSnapshot, SeparatorView, type SeparatorViewActions } from ".."; + +const { Default, LeftPanelExpanded, KeyboardFocused } = composeStories(stories); + +class MockViewModel extends BaseViewModel implements SeparatorViewActions { + public constructor(snapshot: ResizerViewSnapshot) { + super(undefined, snapshot); + } + public onBlur: () => void = vi.fn(); + public onFocus: () => void = vi.fn(); + public onSeparatorClick: () => void = vi.fn(); +} + +function renderPanel(initialSnapshot?: Partial): MockViewModel { + const snapshot = { isCollapsed: true, isFocusedViaKeyboard: false, initialSize: 20, ...initialSnapshot }; + const vm = new MockViewModel(snapshot); + render( + + Left + + Test + , + ); + return vm; +} + +describe("", () => { + it("renders Default story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders LeftPanelExpanded story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders KeyboardFocused story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("should call onSeparatorClick() when clicked", async () => { + const vm = renderPanel(); + const separator = screen.getByRole("separator"); + await userEvent.click(separator); + expect(vm.onSeparatorClick).toHaveBeenCalledOnce(); + }); + + it("should call onFocus and onBlur when receiving/loosing focus", async () => { + const vm = renderPanel(); + const separator = screen.getByRole("separator"); + separator.focus(); + expect(vm.onFocus).toHaveBeenCalled(); + separator.blur(); + expect(vm.onBlur).toHaveBeenCalled(); + }); +}); diff --git a/packages/shared-components/src/resize/separator/SeparatorView.tsx b/packages/shared-components/src/resize/separator/SeparatorView.tsx new file mode 100644 index 0000000000..e857487d27 --- /dev/null +++ b/packages/shared-components/src/resize/separator/SeparatorView.tsx @@ -0,0 +1,72 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React from "react"; +import { Separator } from "react-resizable-panels"; +import DragIcon from "@vector-im/compound-design-tokens/assets/web/icons/drag-list"; +import classNames from "classnames"; +import { Tooltip } from "@vector-im/compound-web"; + +import { type ViewModel, useViewModel } from "../../viewmodel"; +import styles from "./SeparatorView.module.css"; +import { type ResizerViewSnapshot } from ".."; +import { useI18n } from "../../utils/i18nContext"; + +export interface SeparatorViewActions { + /** + * onClick handler for the separator. + */ + onSeparatorClick: () => void; + + /** + * onFocus handler for the separator. + */ + onFocus: () => void; + + /** + * onBlur handler for the separator. + */ + onBlur: () => void; +} + +interface Props { + vm: ViewModel; + className?: string; +} + +/** + * Custom separator for collapsible left-panel based on {@link Separator}. + */ +export function SeparatorView({ vm, className }: Props): React.ReactNode { + const { translate: _t } = useI18n(); + const { isCollapsed, isFocusedViaKeyboard } = useViewModel(vm); + + const classes = classNames(styles.separator, className, { + [styles.visible]: isCollapsed || isFocusedViaKeyboard, + }); + + return ( + + + + + + ); +} diff --git a/packages/shared-components/src/resize/separator/__snapshots__/SeparatorView.test.tsx.snap b/packages/shared-components/src/resize/separator/__snapshots__/SeparatorView.test.tsx.snap new file mode 100644 index 0000000000..85a950b5f8 --- /dev/null +++ b/packages/shared-components/src/resize/separator/__snapshots__/SeparatorView.test.tsx.snap @@ -0,0 +1,238 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[` > renders Default story 1`] = ` +
+
+
+
+
+
+ LEFT CONTENT +
+
+
+ +
+
+
+ MAIN CONTENT +
+
+
+
+
+
+`; + +exports[` > renders KeyboardFocused story 1`] = ` +
+
+
+
+
+
+ LEFT CONTENT +
+
+
+ +
+
+
+ MAIN CONTENT +
+
+
+
+
+
+`; + +exports[` > renders LeftPanelExpanded story 1`] = ` +
+
+
+
+
+
+ LEFT CONTENT +
+
+
+ +
+
+
+ MAIN CONTENT +
+
+
+
+
+
+`; diff --git a/packages/shared-components/vite.config.ts b/packages/shared-components/vite.config.ts index 82cef50a9b..66b7f08c86 100644 --- a/packages/shared-components/vite.config.ts +++ b/packages/shared-components/vite.config.ts @@ -25,7 +25,12 @@ export default defineConfig({ rolldownOptions: { // make sure to externalize deps that shouldn't be bundled // into your library - external: ["@vector-im/compound-design-tokens", "@vector-im/compound-web", "react-virtuoso"], + external: [ + "@vector-im/compound-design-tokens", + "@vector-im/compound-web", + "react-virtuoso", + "react-resizable-panels", + ], plugins: [ esmExternalRequirePlugin({ external: ["react", "react-dom"], diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9539d8f3cf..81d3d97c95 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -790,6 +790,9 @@ importers: react-merge-refs: specifier: ^3.0.2 version: 3.0.2(react@19.2.4) + react-resizable-panels: + specifier: ^4.6.5 + version: 4.7.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react-virtuoso: specifier: ^4.14.0 version: 4.18.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -9315,6 +9318,12 @@ packages: '@types/react': optional: true + react-resizable-panels@4.7.2: + resolution: {integrity: sha512-1L2vyeBG96hp7N6x6rzYXJ8EjYiDiffMsqj3cd+T9aOKwscvuyCn2CuZ5q3PoUSTIJUM6Q5DgXH1bdDe6uvh2w==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + react-string-replace@2.0.1: resolution: {integrity: sha512-J7y/IxZkwhOgCexu6GtkNH2FIa9f/z6ykvK1YXS8VLIdvcP8Vyx3LAUFsfIFvq3aQbmin2d+clFR1J50LnR2yA==} @@ -20546,6 +20555,11 @@ snapshots: optionalDependencies: '@types/react': 19.2.10 + react-resizable-panels@4.7.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-string-replace@2.0.1: {} react-style-singleton@2.2.3(@types/react@19.2.10)(react@19.2.4):