- Thread focus mode: threads open centered in the main pane (expand
button, room-list thread rows, and any ShowThread while focus mode is
active); back bar / Escape / channel click return to the timeline.
Centering strips the sidebar's thread cards so no duplicate remains.
- Room list: active-thread rows under channels (unread threads plus the
one currently open), collapsible section headers with per-space
persistence, live space-membership DM filtering (fixes the DM section
capping at ~6 rooms after a space switch).
- CSS: Compound token overrides now also target the body theme class so
remapped tokens stop shadowing back to green; reply-quote restyle;
min-width on the room body so the message action bar can't render
off-pane with a thread panel open in narrow windows (edit "did
nothing").
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Ship our own Element Call fork build instead of the stock embedded package
(webpack copy repointed to ../element-call/dist, with npm-package fallback), and
rework the in-call room layout to match the Blap design:
- Chat stays in the main pane with the call as a compact right-hand column;
when someone shares a screen the call takes prominence in the main pane and
chat moves to the side column (never hidden). Driven by a same-origin
screenshare signal from the EC fork.
- Camera-off: pass the `blapVideoMuted` flag to EC and drop the old (unreliable)
widget-action mute code.
- Room list already lists in-call members under voice channels; add an
"IN THE CALL" header to the call column.
- Hide redundant RTC call-notification ("Video call") pings from the timeline.
- Room header: remove the now-redundant chat, threads and member-facepile
buttons; keep info working over the call (call stays mounted).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* Add user status on user profile icon
Currently unstyled & no tests
* Style the user status icon
* Update snapshot
for avatar wrapper
* More snapshot updates
* add if braces
* Split out user status functions
to avoid circular dep which has the weird effect of just breaking
jest's mocking.
* type imports
* Update imports
* Update snapshot
* Tests
* baseline image
* Just snapshot the component itself
* User status in user menu
first pass, unstyled
* fix export
* superstylin'
* snapshots
* Add story & test
* Snapshots
and re-use the repeated rules
* Tests
* Fix jest lcov projectRoot config
* Change tooltip text to just 'clear'
* Add comment & fix console warn
* Remove all options screenshot
as it's not really particularly useful as a preset story
* remove stale screenshot
* fix imports
---------
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
* Use vitest for some EW unit tests
* Ensure library builds are done before unit tests
* Stabilise jest tests
* Move more tests over
* Make sonar happier
* Update types/node for happy-dom compat again
* Decrease max-workers to stabilise jest tests
* Split jest over 3 runners to alleviate memory woes
* Switch jest to runInBand
* Attempt to deflake jest tests
* tweak coverage
* tweak coverage
* fix: don't display the empty/collapse icon when the room list is empty
* Fix jest lcov projectRoot config
---------
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
* First version of shared component
* Refactor as a functional component
* Add unit tests and more documentation
* Fix problem where wrappedRef was used by parent before assignment was performed.
* Use the shared component in app/web
* Clean up unused styling
* Added scrollbar-gutters as default styling in shared component
* Make sure the legacy mx_AutoHideScrollbar is set in app/web
* Updated snapshots
* Removing default style, scrollbar-gutter: stable;
* Updated snapshots
* useRef on wrapperRef to avoid loop in rendering
* scrollbar-width does not propagate
* Add AutoHideScrollbar to RoomListView
* Fix Prettier issue
* Updated snapshots
* Updated snapshot after merge
* Fix Sonar issue
* Remove legacy export
* Extract view map to a switch case statement with typescript checking that all cases are handled
This lets us drop the `default` case as we know we will never reach it.
Additionally move all the settings conditions to the state-setters rather than the renderer so we are never stuck in an undefined state
* Fix comment
* Handle unknown screens better
Redirect to welcome/home rather than getting stuck at spinner
* First pass at new retention
* Add more test cases
* fixup
* Fix TODO
* Disable retention explicitly from the start
* fixup
* Just apply retention as-is
* Fixup
* fix: hide section separator in context menu when there is no section
* fix: truncate long section name
* feat: add remove from section entry to room list item context menu
* test: update tests and stories
* test: add new test
* test: use same mocks
* test: add e2e test for "Remove from section"
Sort out duplication between presence icon code, have the MemberIconView
position the presence icon rather than the presence icon trying to position
itself.