Compare commits

...

15 Commits

Author SHA1 Message Date
Robin
d33dedd038 Hide the browser's default placeholder image for videos
Source: https://stackoverflow.com/a/79058682
2026-07-15 17:26:02 +02:00
Robin
927cf68110 Merge pull request #4109 from element-hq/service-interruptions-vm
Create service interruptions view model
2026-07-14 12:21:18 +02:00
Robin
cd72ad0008 Create service interruptions view model 2026-07-14 12:02:36 +02:00
Robin
2d2e85e340 Merge pull request #4107 from element-hq/spotlight-icon
Update spotlight icon
2026-07-14 09:34:50 +02:00
Johannes Marbach
4da1b9a02a Merge pull request #4082 from element-hq/johannes/docker-compose-renovate
Make renovate track docker-compose files and pin synapse / element-web for playwright tests
2026-07-14 07:55:17 +02:00
Robin
73758f7f77 Merge pull request #4108 from element-hq/renovate/compound
Update Compound
2026-07-13 18:37:15 +02:00
Robin
c433c36687 Update snapshots 2026-07-13 18:20:56 +02:00
Robin
3e9d7b7cf7 Exclude packages developed in-house from release age requirements 2026-07-13 17:00:02 +02:00
renovate[bot]
2a56d2afb8 Update Compound 2026-07-13 14:35:37 +00:00
Timo K.
023aec22ca Update docker-compose-playwright.yml 2026-07-10 17:45:53 +02:00
Timo K.
bf4cee9898 update to latest EW
(this fixes the playwright tests)
2026-07-10 17:39:36 +02:00
Timo K.
147ff131f4 Merge branch 'livekit' into johannes/docker-compose-renovate 2026-07-10 12:59:06 +02:00
Timo K.
49a762832b Merge branch 'livekit' into johannes/docker-compose-renovate 2026-07-09 14:03:18 +02:00
Timo K.
3cf5cab1d2 Add additional renovate packageGroup for element-web 2026-07-09 13:20:57 +02:00
Johannes Marbach
1811b36205 Make renovate track docker-compose files and pin synapse / element-web for playwright tests 2026-07-03 08:48:28 +02:00
17 changed files with 98 additions and 30 deletions

View File

@@ -56,8 +56,8 @@ jobs:
run: pnpm exec playwright install --with-deps
- name: Run backend components
run: |
docker compose -f playwright-backend-docker-compose.yml -f playwright-backend-docker-compose.override.yml pull
docker compose -f playwright-backend-docker-compose.yml -f playwright-backend-docker-compose.override.yml up -d
docker compose -f docker-compose-dev.yml -f docker-compose-playwright.yml pull
docker compose -f docker-compose-dev.yml -f docker-compose-playwright.yml up -d
docker ps
- name: Run Playwright tests
env:

View File

@@ -212,7 +212,7 @@ See also:
### Backend
A docker compose file `dev-backend-docker-compose.yml` is provided to start the
A docker compose file `docker-compose-dev.yml` is provided to start the
whole stack of components which is required for a local development environment
including federation:
@@ -239,7 +239,7 @@ the backend components:
```sh
pnpm backend
# or for podman-compose:
# podman-compose -f dev-backend-docker-compose.yml up
# podman-compose -f docker-compose-dev.yml up
```
> [!NOTE]

View File

@@ -156,7 +156,7 @@ services:
nginx:
# see backend/dev_tls_setup for how to generate the tls certs
hostname: synapse.m.localhost
image: nginx:latest
image: nginx:latest@sha256:4ae259ae64fbedb67918c07d167fdcb0e05855a1615480ca445bea485e7d65ff
pull_policy: always
volumes:
- ./backend/dev_nginx.conf:/etc/nginx/conf.d/default.conf:Z

View File

@@ -0,0 +1,19 @@
# This file contains overrides to docker-compose-dev.yml and should
# only be used in combination with that file.
services:
synapse:
# Pin to a SHA so that upstream cannot break our tests. Renovate handles regular updates.
image: ghcr.io/element-hq/synapse:latest@sha256:da325af40104051923899e5f5a2f1d537e6e3ccf2f0f38285689ae9bbfdb190a
volumes:
- ./backend/playwright_homeserver.yaml:/data/cfg/homeserver.yaml:Z
synapse-1:
# Pin to a SHA so that upstream cannot break our tests. Renovate handles regular updates.
image: ghcr.io/element-hq/synapse:latest@sha256:da325af40104051923899e5f5a2f1d537e6e3ccf2f0f38285689ae9bbfdb190a
volumes:
- ./backend/playwright_homeserver-othersite.yaml:/data/cfg/homeserver.yaml:Z
element-web:
# Pin to a SHA so that upstream cannot break our tests. Renovate handles regular updates.
image: ghcr.io/element-hq/element-web:develop@sha256:365eca844f0782676f2406e5107e2f74fae2ecdb1725cc42060a91681aeee4c4
element-web-1:
# Pin to a SHA so that upstream cannot break our tests. Renovate handles regular updates.
image: ghcr.io/element-hq/element-web:develop@sha256:365eca844f0782676f2406e5107e2f74fae2ecdb1725cc42060a91681aeee4c4

View File

@@ -20,7 +20,12 @@ export default {
// This is a shell built-in.
"printf",
],
ignoreFiles: ["scripts/.pnpmfile.cjs"],
ignoreFiles: [
"scripts/.pnpmfile.cjs",
// Deliberately added prior to any component or business logic
// implementation
"src/state/ServiceInterruptionsViewModel.ts",
],
ignoreDependencies: [
// Used in CSS
"normalize.css",

View File

@@ -30,8 +30,8 @@
"test:storybook": "vitest --project=storybook",
"test:unit": "vitest --project=unit",
"test:coverage": "vitest --coverage",
"backend": "docker-compose -f dev-backend-docker-compose.yml up",
"backend-playwright": "docker-compose -f playwright-backend-docker-compose.yml -f playwright-backend-docker-compose.override.yml up",
"backend": "docker-compose -f docker-compose-dev.yml up",
"backend-playwright": "docker-compose -f docker-compose-dev.yml -f docker-compose-playwright.yml up",
"test:playwright": "playwright test",
"test:playwright:open": "pnpm test:playwright --ui",
"links:on": "cp scripts/.pnpmfile.cjs .pnpmfile.cjs & pnpm install",

View File

@@ -1,7 +0,0 @@
services:
synapse:
volumes:
- ./backend/playwright_homeserver.yaml:/data/cfg/homeserver.yaml:Z
synapse-1:
volumes:
- ./backend/playwright_homeserver-othersite.yaml:/data/cfg/homeserver.yaml:Z

View File

@@ -1,2 +0,0 @@
include:
- dev-backend-docker-compose.yml

19
pnpm-lock.yaml generated
View File

@@ -127,10 +127,10 @@ importers:
version: 10.3.1(react@19.2.7)
'@vector-im/compound-design-tokens':
specifier: ^10.0.0
version: 10.2.2(@types/react@19.2.17)(react@19.2.7)
version: 10.2.3(@types/react@19.2.17)(react@19.2.7)
'@vector-im/compound-web':
specifier: ^9.3.0
version: 9.7.1(@fontsource/inconsolata@5.2.8)(@fontsource/inter@5.2.8)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(@vector-im/compound-design-tokens@10.2.2(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
version: 9.8.0(@fontsource/inconsolata@5.2.8)(@fontsource/inter@5.2.8)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(@vector-im/compound-design-tokens@10.2.3(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
'@vitejs/plugin-react':
specifier: ^6.0.2
version: 6.0.3(vite@8.1.0(@types/node@24.13.2)(esbuild@0.28.1)(jiti@2.7.0)(sass@1.101.0)(terser@5.46.1)(yaml@2.9.0))
@@ -3413,8 +3413,8 @@ packages:
peerDependencies:
react: '>= 16.8.0'
'@vector-im/compound-design-tokens@10.2.2':
resolution: {integrity: sha512-kncYroDEwyvvk4K4E67ExP4RYp9NEineD1tB38KeJwTmOvcrPtGjWyBAyJgOGeRuc7G5edNLkWnAbvk5yZJ+5w==}
'@vector-im/compound-design-tokens@10.2.3':
resolution: {integrity: sha512-K2xNkjOzYn2Ya0kUqCy7JIYyx9jbkNIWpex2t9m3FUG4wzkNscvaiRJ/a9Wse1aJmwDDARcHU6mUjtHf5os5MA==}
peerDependencies:
'@types/react': '*'
react: ^17 || ^18 || ^19.0.0
@@ -3424,8 +3424,8 @@ packages:
react:
optional: true
'@vector-im/compound-web@9.7.1':
resolution: {integrity: sha512-kR2lJTeudadPYPH9eeZLX+iO+5yEUihb3idp2IH4NDvm0/0W1l1Ok3ljoIcf0W74V2piyiNu4jME2Byy4byosg==}
'@vector-im/compound-web@9.8.0':
resolution: {integrity: sha512-1Xy9eacbp9qD0uhLKb9SoyZ2iM868+M2BOiVX8oGfoZOyJYwihTwWmh2+0K8Kn8pag86t0yqyYplL0NVLY0sUA==}
peerDependencies:
'@fontsource/inconsolata': ^5
'@fontsource/inter': ^5
@@ -9054,14 +9054,15 @@ snapshots:
'@use-gesture/core': 10.3.1
react: 19.2.7
'@vector-im/compound-design-tokens@10.2.2(@types/react@19.2.17)(react@19.2.7)':
'@vector-im/compound-design-tokens@10.2.3(@types/react@19.2.17)(react@19.2.7)':
optionalDependencies:
'@types/react': 19.2.17
react: 19.2.7
'@vector-im/compound-web@9.7.1(@fontsource/inconsolata@5.2.8)(@fontsource/inter@5.2.8)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(@vector-im/compound-design-tokens@10.2.2(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
'@vector-im/compound-web@9.8.0(@fontsource/inconsolata@5.2.8)(@fontsource/inter@5.2.8)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(@vector-im/compound-design-tokens@10.2.3(@types/react@19.2.17)(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
dependencies:
'@floating-ui/react': 0.27.20(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
'@floating-ui/react-dom': 2.1.9(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
'@fontsource/inconsolata': 5.2.8
'@fontsource/inter': 5.2.8
'@radix-ui/react-context-menu': 2.3.3(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
@@ -9070,7 +9071,7 @@ snapshots:
'@radix-ui/react-progress': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
'@radix-ui/react-separator': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
'@radix-ui/react-slot': 1.3.0(@types/react@19.2.17)(react@19.2.7)
'@vector-im/compound-design-tokens': 10.2.2(@types/react@19.2.17)(react@19.2.7)
'@vector-im/compound-design-tokens': 10.2.3(@types/react@19.2.17)(react@19.2.7)
classnames: 2.5.1
react: 19.2.7
vaul: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)

View File

@@ -1,3 +1,8 @@
minimumReleaseAgeExclude:
- "@vector-im/compound-design-tokens"
- "@vector-im/compound-web"
- matrix-js-sdk
- matrix-widget-api
allowBuilds:
"@parcel/watcher": true
"@sentry/cli": true

View File

@@ -61,6 +61,15 @@
{
"groupName": "Pnpm",
"matchDepNames": ["pnpm"]
},
{
"description": "Update the element-web image digest daily, in its own PR",
"groupName": "Element Web",
"matchPackageNames": ["ghcr.io/element-hq/element-web"],
"matchUpdateTypes": ["digest"],
"schedule": ["* 0-3 * * *"],
"minimumReleaseAge": null,
"automerge": true
}
],
"semanticCommits": "disabled",

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 B

View File

@@ -14,6 +14,7 @@ import { useTranslation } from "react-i18next";
import { TileAvatar } from "../tile/TileAvatar";
import styles from "./VideoPreview.module.css";
import { type EncryptionSystem } from "../e2ee/sharedKeyManagement";
import videoPlaceholder from "../graphics/video-placeholder.gif";
export type MatrixInfo = {
userId: string;
@@ -74,6 +75,9 @@ export const VideoPreview: FC<Props> = ({
// There's no reason for this to be focusable
tabIndex={-1}
disablePictureInPicture
// Set the placeholder to a small transparent image. (On Android web
// views the default poster image is particularly ugly.)
poster={videoPlaceholder}
/>
{(!videoEnabled || cameraIsStarting) && (
<>

View File

@@ -428,7 +428,7 @@ exports[`InCallView > rendering > renders 1`] = `
</div>
<fieldset
aria-label="Layout"
class="_toggle_13rnk_9 _layout_20b7b4"
class="_toggle_1t5ha_9 _layout_20b7b4"
data-size="lg"
>
<input

View File

@@ -49,6 +49,7 @@ exports[`LobbyView > renders with AppBar android 1`] = `
<video
disablepictureinpicture=""
playsinline=""
poster="/src/graphics/video-placeholder.gif"
tabindex="-1"
/>
<div
@@ -84,7 +85,7 @@ exports[`LobbyView > renders with AppBar android 1`] = `
</div>
</div>
<a
class="_link_k9ljz_8"
class="_link_13esb_8"
data-kind="primary"
data-size="md"
href="/"
@@ -280,6 +281,7 @@ exports[`LobbyView > renders with AppBar ios 1`] = `
<video
disablepictureinpicture=""
playsinline=""
poster="/src/graphics/video-placeholder.gif"
tabindex="-1"
/>
<div
@@ -315,7 +317,7 @@ exports[`LobbyView > renders with AppBar ios 1`] = `
</div>
</div>
<a
class="_link_k9ljz_8"
class="_link_13esb_8"
data-kind="primary"
data-size="md"
href="/"
@@ -558,6 +560,7 @@ exports[`LobbyView > renders with header and participant count 1`] = `
<video
disablepictureinpicture=""
playsinline=""
poster="/src/graphics/video-placeholder.gif"
tabindex="-1"
/>
<div
@@ -592,7 +595,7 @@ exports[`LobbyView > renders with header and participant count 1`] = `
</div>
</div>
<a
class="_link_k9ljz_8"
class="_link_13esb_8"
data-kind="primary"
data-size="md"
href="/"

View File

@@ -0,0 +1,27 @@
/*
Copyright 2026 Element Creations Ltd.
SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
Please see LICENSE in the repository root for full details.
*/
export type Service =
| { name: "encryption-keys" }
| { name: "reactions" }
| { name: "screen-sharing" }
| { name: "local-media" }
| {
name: "remote-media";
/**
* The number of users affected, for the purpose of pluralising the
* strings.
*/
count: number;
};
export interface ServiceInterruptionsViewModel {
/**
* A non-empty array of services which are temporarily unavailable.
*/
unavailable: Service[];
}

View File

@@ -25,6 +25,7 @@ import {
import { type ReactionOption } from "../reactions";
import { ReactionIndicator } from "../reactions/ReactionIndicator";
import { RTCConnectionStats } from "../RTCConnectionStats";
import videoPlaceholder from "../graphics/video-placeholder.gif";
interface Props extends ComponentProps<typeof animated.div> {
className?: string;
@@ -154,6 +155,9 @@ export const MediaView: FC<Props> = ({
tabIndex={-1}
disablePictureInPicture
data-testid="video"
// Set the placeholder to a small transparent image. (On Android web
// views the default poster image is particularly ugly.)
poster={videoPlaceholder}
/>
)}
</div>