Commit Graph
7556 Commits
Author SHA1 Message Date
fkwpandClaude Opus 5 870556d66f Keep the footer while a menu opened from it is open
- In a short window the footer fades out when the pointer leaves the window.
  The chevron menus are portalled to the document, so they stayed behind, their
  trigger faded out beneath them.
- The footer already stays for keyboard focus. A menu's focus is outside it, so
  the trigger's aria-expanded tracks it instead.
- Pre-existing: the camera chevron does the same on main today.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 17:43:55 +02:00
fkwpandClaude Opus 5 4883267098 Add end-to-end specs for the quick audio menu
- Two participants, for what only a real call can show: a device switch that
  neither drops the media session nor rejoins, and a meter that keeps moving
  while muted while the peer is still shown the mute rather than left to infer
  it from silence.
- The component harness covers what only a host page shows: every device
  reachable in a small container, the list sized against the call rather than
  the window, and the menu following the call area when the host resizes it.
- Synthetic devices are patched onto the media element and the audio context
  alike, so a browser with no hardware still enumerates and still routes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 14:56:47 +02:00
fkwpandClaude Opus 5 8417599f02 Add stories for the meter and the device menu
- One story per state that matters: silence, three volumes of speech, denied
  permission, no device, many devices, and a selection still settling.
- The geometry the design rests on is asserted rather than eyeballed — the bars'
  shape at any width, the icon's two centre lines with the rows above it,
  headings that stay while their section is in view, every row reachable by the
  keyboard clear of both, and each section headed by a rule edge to edge.
- Each story supplies its own microphone and its own call-sized root, so what it
  renders is what the app renders. Browser flags that fake a device were tried
  and rejected: they made the suite pass while the same story showed no
  microphone in a browser without them.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 14:56:47 +02:00
fkwpandClaude Opus 5 a3cd39435c Wire speaker selection through the call footer
- The footer view model now carries the output devices, the current output and
  the callback that changes it, alongside the ones it already carried for input.
- That callback is withheld where the platform cannot route audio to a chosen
  device, and its absence is what renders the section disabled — an absent
  action rather than a flag the view has to interpret.
- An empty output list stays a list rather than becoming an absence, so the
  section is still drawn where a platform enumerates nothing.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 14:56:47 +02:00
fkwpandClaude Opus 5 dd00226526 Show speakers and microphones in the quick audio menu
- Two labelled sections, speaker above microphone, with radio selection in both,
  the pattern the settings list already uses.
- A device that cannot be chosen is shown disabled rather than hidden, so the
  menu keeps one shape across browsers; where a platform lists no output at all,
  a disabled Default stands in that section instead of leaving a bare heading.
- The list is bounded by the measured call area rather than the window, so it
  stays usable where Element Call is a component in a corner of a host's page,
  and follows that area when the host resizes it.
- It scrolls with its section headings pinned and the meter held at its foot,
  and keeps both clear of whichever row the keyboard has just reached.
- The focus ring is shown only when the keyboard moved the focus, tracked on the
  menu rather than the document, so two calls on one page cannot answer for each
  other.
- While a requested device has not arrived, nothing in either section can be
  picked, so a second request cannot overtake the first. That holds only while
  the device is still offered and only within the menu it was asked in: one
  removed before the switch lands never arrives, and waiting for it would leave
  every device unselectable for the rest of the call.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 14:56:47 +02:00
fkwpandClaude Opus 5 c9bfe9df04 Add a microphone level meter
- Draws the level as lit bars, and each failure state as its own message with a
  next action rather than as a meter that has stopped.
- A bar and the space beside it keep one size wherever the meter is drawn; what
  the width decides is how many bars there are. Bars spread to fill would be a
  different shape in every place, and would close into one block where the space
  ran short.
- Announces the level on a fixed scale, so it does not rest on hue or on how
  many bars happened to fit.
- The hook is a bridge and nothing more: the capture belongs to the state layer.
- The capture is held by a component of its own, so a level that does change
  redraws the meter rather than whatever is rendered beside it. A level arrives
  many times a second; held by the menu it would reconcile every device row on
  the way to the bars. A test counts those renders, because nothing else would
  notice the hook moving back.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 14:56:47 +02:00
fkwpandClaude Opus 5 1e64d56964 Give the microphone level its own observable
- Opens a short-lived capture of a named device and reports a smoothed level.
- Owns the capture, the audio context and the frame loop, and releases all three
  idempotently, including when cleanup lands before getUserMedia has resolved.
- Reports denied permission and a missing device as states of their own, so a
  caller never has to read silence as an error.
- Gives the microphone back when the audio graph fails to build. That can fail
  after getUserMedia has resolved, and the capture would otherwise outlive its
  own failure: the device open and its in-use light on, behind a meter saying
  it is unavailable.
- Shares the capture stub through the test utilities, silence and a signal
  alike, so the meter's tests and its stories drive the same microphone.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 14:56:46 +02:00
Johannes Marbach cf7c275fb7 Merge pull request #4274 from element-hq/hs/bell
Bell reaction sound.
2026-09-22 12:32:38 +02:00
Half-Shot 93b2661513 Switch to 🛎️ 2026-09-22 11:21:11 +01:00
Robin 1f84cb9c5c Merge pull request #4273 from element-hq/simplify-local-transport
Simplify local transport code
2026-09-22 12:15:34 +02:00
Half-Shot 4269aaa163 update snap 2026-09-22 10:04:12 +01:00
Half-Shot bc62bb9565 lint 2026-09-22 10:01:22 +01:00
Half-Shot be56bbd05b lint 2026-09-22 10:01:10 +01:00
Half-Shot eb44fd545d Bell reaction sound. 2026-09-22 09:57:43 +01:00
Robin c9f911b7c9 Swallow local transport errors in connection manager 2026-09-22 10:01:14 +02:00
Robin 3a189d155b Remove references to outdated variables or types 2026-09-22 09:56:02 +02:00
Robin 0211d5c367 Remove unused shareReplay operator 2026-09-22 09:45:48 +02:00
Robin c88f884fc9 Simplify local transport code
As of the removal of 'Legacy' mode, there can no longer be a difference between the transport you advertise in your membership and the transport you publish media on, so the local transport code can be simplified considerably. For instance, the function which gets the local transport can simply return a promise rather than being reactive.

I kept the local transport as an Observable in other modules so that they could easily be tested with existing marble tests.
2026-09-21 12:51:28 +02:00
Johannes Marbach 9f7c35cd8f Merge pull request #4270 from element-hq/renovate/major-compound
Update dependency @vector-im/compound-design-tokens to v11
v0.26.1-rc.1
2026-09-21 07:51:35 +02:00
renovate[bot] ac81a7c0ab Update dependency @vector-im/compound-design-tokens to v11 2026-09-21 02:56:00 +00:00
Timo 03f81bcd64 Merge pull request #4266 from toger5/toger5/memberId-based-on-matrixRTCMode
Make the memberId dependent on the matrixRTC mode.
2026-09-17 14:02:32 +02:00
Timo K. 9f6c8bb434 Make the memberId dependent on the matrixRTC mode.
This outherwise creates to-device messages with the uuid for members
that use the userId:deviceId memberId in the state event.
2026-09-17 13:44:25 +02:00
renovate[bot] f56c74adf9 Update ghcr.io/element-hq/element-web:develop Docker digest to 3993d53 (#4265)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-17 00:51:42 +00:00
Johannes Marbach 3c88d217f2 Merge pull request #4244 from element-hq/matthew/default-output-first
Prefer the browser default audio output when no output has been chosen
2026-09-16 15:39:12 +02:00
renovate[bot] 967a06ba39 Update ghcr.io/element-hq/element-web:develop Docker digest to 506caaa (#4262)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-16 00:29:13 +00:00
renovate[bot] 71593f1a24 Update ghcr.io/element-hq/element-web:develop Docker digest to c76d299 (#4260)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
v0.26.0
2026-09-15 02:40:31 +00:00
renovate[bot]andJohannes Marbach 5d38a13c46 Update ghcr.io/element-hq/element-web:develop Docker digest to 9d8d8fc (#4243)
* Update ghcr.io/element-hq/element-web:develop Docker digest to 1850bf6

* Adapt to latest EW

* Reformat

* Next try

* Fix regexp

* Fix DM path

* Next try

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Johannes Marbach <n0-0ne+github@mailbox.org>
2026-09-14 08:51:33 +00:00
Johannes Marbach fe91162869 Merge pull request #4257 from element-hq/matthew/log-livekit-ice
Always log LiveKit ICE candidates and states to the rageshake
2026-09-14 08:31:42 +02:00
Johannes Marbach 74328d7e42 Merge pull request #4258 from element-hq/renovate/livekit-client
Update dependency livekit-client to v2.22.3
2026-09-14 08:03:12 +02:00
renovate[bot] 6046337877 Update dependency livekit-client to v2.22.3 2026-09-14 02:37:28 +00:00
Matthew Hodgson 16b2c31ebb Always log LiveKit ICE candidates and states to the rageshake
LiveKit's livekit-ice logger records each local ICE candidate, ICE
candidate errors and ICE connection state changes, but only at debug,
which we cap to info unless extended LiveKit logs are switched on. That
means a 'could not establish pc connection' rageshake carries no way to
tell 'no relay candidates at all' from 'relay candidates that never
paired'. Keep that one logger at debug regardless of the toggle.
2026-09-11 18:30:33 +01:00
fkwpandClaude Opus 5 a58a5f615f Add AGENTS.md documenting the repo's conventions (#4256)
* Add AGENTS.md documenting the repo's conventions

Codifies what is currently tribal knowledge or only discoverable by reading CI
config: the view model / view contract, the rule that nothing reads the page,
Clean Code ordering, the three test layers, and reuse-before-you-build.

The root AGENTS.md is the always-loaded minimum and routes to docs/agents/, so
an agent loads only the detail its task needs.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Allow either hand at the commit, and measure continuous redraws

Committing from the agent rules out running it where there is no git
identity, a sandbox included. Either is now fine: commit on the user's
word where the setup allows it, or write the message and hand it over.

Redrawing continuously is the other addition. A level meter reported a
fresh value every animation frame, so its whole menu reconciled sixty
times a second, silence included, and nobody noticed until review. A PR
that adds anything of the kind now says what it costs, or better, counts
the redraws — commits rather than render calls, since React runs a
component it then discards.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-11 15:12:15 +02:00
Robin 2cac2d7e8b Merge pull request #4231 from element-hq/matthew/blur-processor-ended-track
Don't attach the background blur processor to an ended camera track
2026-09-10 21:27:11 +02:00
Robin 1695d3f518 Use flushPromises for readability 2026-09-10 21:15:48 +02:00
Robin 96a2e9b481 Merge pull request #4230 from element-hq/matthew/connection-stop-during-connect
Don't report an aborted connect as a connection error
2026-09-10 20:25:12 +02:00
Robin 23ba8f3204 Merge pull request #4249 from element-hq/matthew/audio-renderer-warn-spam
Stop MatrixAudioRenderer warning on every render
2026-09-10 19:56:56 +02:00
Matthew HodgsonandClaude Fable 5.1 b284bb00c0 Cover the stopProcessor failure path and trackProcessorSync
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GSB8Qb89KDoTNRV83dWJHa
2026-09-10 18:28:57 +01:00
Johannes Marbach cb0ae89143 Merge pull request #4253 from element-hq/johannes/jwt-0.7.0
Bump lk-jwt-service to 0.7.0 in the docker setup and integrate it as an app service
2026-09-10 17:46:02 +02:00
Johannes Marbach 344aac21f9 Force undelegated mode in tests 2026-09-10 14:15:38 +02:00
Johannes Marbach 21d7f24f61 Bump lk-jwt-service to 0.7.0 in the docker setup and integrate it as an app service 2026-09-10 12:26:49 +02:00
Johannes Marbach 029622f07b Merge pull request #4251 from element-hq/renovate/npm-postcss-selector-parser-vulnerability
Update dependency postcss-selector-parser to v7.1.3 [SECURITY]
2026-09-10 07:42:07 +02:00
renovate[bot] 251535d371 Update dependency postcss-selector-parser to v7.1.3 [SECURITY] 2026-09-09 17:42:33 +00:00
Timo 5c6fa7c864 Merge pull request #4233 from element-hq/valere/component_ec_M1
ElementCall as a react component: refactor + a local dev harness
2026-09-09 19:39:30 +02:00
Timo K. be4023dd66 fix layout in spotlight (top inset) 2026-09-09 19:20:31 +02:00
Timo K. be5f3390f7 more tests 2026-09-09 17:01:16 +02:00
Timo K. 59ef5f5400 ci 2026-09-09 16:05:18 +02:00
Matthew Hodgson dbd2423e7b Stop MatrixAudioRenderer warning on every render
The "has no matching matrix call member" warning fired on every re-render
(i.e. every active speaker update) and also for the local participant's own
track, which is never rendered here anyway. Skip local tracks and warn once
per unexpected identity.
2026-09-09 11:20:49 +01:00
Timo K. 2ac95df75f update readmes 2026-09-09 12:15:19 +02:00
Timo K. 7821b465a5 Merge branch 'main' into valere/component_ec_M1 2026-09-09 10:23:47 +02:00
Robin b90ed5bdf7 Merge pull request #4247 from element-hq/fix-cd
Fix call.element.dev not updating after branch rename
2026-09-09 09:07:51 +02:00