1
0
mirror of https://github.com/element-hq/element-web.git synced 2026-10-24 23:19:26 +03:00

27 Commits

Author SHA1 Message Date
Milton Moura
db69764acd Fix PiP dragger when displaying over widgets (#35395)
Signed-off-by: Milton Moura <milton.moura@nordeck.net>
Co-authored-by: Milton Moura <milton.moura@nordeck.net>
2026-10-14 13:53:28 +00:00
David Baker
1ddb4049e0 Update compound-web to 10.3.1 (#35390)
* Update compound-web to 10.3.1

To fix tooltip overflow bug

* Fix success to accent

* snapshot/test updates

* Gah the snapshots

* more snapshots

* Last lot of snapshots, hopefully

* Change the brittle CSS override to reflect the new CSS

* Same hack on date picker context menu

* s/success/accent/ and another padding override

* Update for really tiny font rendering differences
2026-10-09 12:20:01 +00:00
Will Hunt
56ec209d49 Drop support for migrating libolm sessions (#35138)
* Remove the libolm to rust crypto store migration

* Add LegacyCryptoUnsupportedView to shared-components

* Show LegacyCryptoUnsupportedView when an unmigrated libolm crypto store is found

* Replace crypto migration e2e test with legacy crypto store test

* Cleanup loadSession, reduce congivitive complexity.

* Improve centering and spacing of view

* update snap

* changes for review

* lint

* Don't format the dump file

* Re-add missing files
2026-10-08 11:27:39 +00:00
Nathanaël
8978841c64 Add cross-room thread panels to Threads Activity Centre (#32851)
* feat(TAC): add cross-room thread panels to Threads Activity Centre

Adds two new tabs to the TAC popup (Rooms / All threads / My threads):

- "Rooms" tab: existing behaviour — rooms with unread threads
- "All threads" tab: flat list of all unread threads from those rooms,
shown as two-line rows (room avatar + name, sender + message preview)
- "My threads" tab: same layout but filtered to threads the user
participated in (as root sender or replier), across all rooms

Implementation notes:
- Export doesTimelineHaveUnreadMessages from Unread.ts for per-thread
unread detection
- Participation check covers both thread root and replies
- Uses server-side notification counts as primary unread signal,
falling back to timeline inspection for activity-level unread
- settingTACOnlyNotifs applies to the Rooms tab only; thread tabs show
all unread participated threads regardless of notification level

Warning:
I know threads and unread are very difficult topics. But in daily job
we are many to strungle to find and follow threads, in which rooms
and where. So I started this not to provide a perfect solution, but
as starting point to sustain the improvment regarding this issue.
(And to see if at least we could have something in-house)
Honestly I think this would benefit a lot from the ongoing work
on element-web new architecture - which I did not took time to dive in -
and on every MSCs and synapse that will provide threads subscribe and
unsubscribe mechanisms.
Finally, this definetly needs design!

Closes #28036

* feat(TAC): replace hideChevron with compound nav-hint; dot yields to chevron on hover

Move the notification dot to the trailing edge of the thread row as a
direct MenuItem child (order: 998). The compound nav-hint chevron sits
at order: 999 in the same position. On hover, compound's `~ *` rule
naturally hides the dot; a targeted override keeps the text content
visible. This removes the hideChevron workaround entirely.

* feat(TAC): redesign per Figma — My threads / Other threads tabs

Replace 3 tabs (Rooms | All | My) with 2 mutually exclusive tabs:
"My threads" (default) and "Other threads". Categorise via server data
(thread.hasCurrentUserParticipated, highlight count); mentions/keywords
land in My threads even when not participated.

The tac_only_notifications setting is scoped to "Other threads" only:
My threads always shows participated or highlighted threads regardless
of the setting. In Other threads, setting=true drops activity-only
(local-detected) entries; setting=false keeps them. Default flipped to
false. The setting label now reads "In the Other threads tab, only
show notifications". The rooms list and greatestNotificationLevel only
reflect rooms that contribute at least one displayed thread.

Drop the doesRoomHaveUnreadThreads() room-level pre-filter; it
short-circuited on muted rooms and on rooms with no local timeline
activity, hiding participated threads in muted rooms and missing
server-pushed highlights that hadn't surfaced locally. The per-thread
loop now decides inclusion based on server counts (authoritative) plus
a lazy local fallback. Mute is applied per-room inside the Other
threads branch only, preserving the "muted rooms don't clutter Other
threads" guarantee while letting them still contribute to My threads.

UI: Compound NavBar/NavItem for tabs, hide the menu title, fixed popup
height for ~6 cells, 40px avatars. Zero Compound FloatingMenu's
padding-block so the tabs + rows containers control their own spacing.
Fix hover regression by overriding Compound's chevron-replaces-content
sibling rule so the dot and content stay visible.

* fix(TAC): don't surface read participated threads in My threads

The local unread heuristic (doesTimelineHaveUnreadMessages) reports a
participated thread as unread when the user replied but isn't the literal
last sender — e.g. a later reaction/edit/redaction landed after their
reply. The js-sdk's read shortcut only fires for the very last event (see
the "second-last event" TODO in room-receipts.ts), so the latest incoming
message, older than the user's reply, still reads as unread.

Guard the local fallback with hasUnreadAfterMyLatestReply: treat the thread
as read once the user's own latest reply is at/after the latest incoming
message. Server notification counts still take precedence and the
muted-room fallback is preserved.

* feat(TAC): use shared message-preview store and Compound typography

Render thread-row previews via MessagePreviewStore (consistent edit/reply/
emote/HTML handling with the room list) and resolve sender names with
getSenderName. Apply Compound Text typography to the room name, sender and
preview, dropping the equivalent font rules from CSS.

Open a thread with a two-card stack (thread list beneath the thread view) so
the thread view gets a working back button, mirroring Action.ShowThread.
Extract evaluateThreadUnread from computeUnreadThreadRooms and collapse the
per-tab render branches into a single active-tab selection.

* fix(TAC): keep locally-replied threads in My threads

Thread.hasCurrentUserParticipated is set only from the homeserver's
bundled current_user_participated flag, which lags behind local activity.
Right after the user replies in someone else's thread, the flag is still
false, so the thread was wrongly categorised under Other threads.

Complement the server flag by inspecting the local timeline: if the
current user authored a sent m.thread reply, the thread is theirs. This
matches the server's participated semantics (isRelation(m.thread) &&
!status), the same test the rest of the app uses for a real reply.

* test(TAC): port unit tests to colocated vitest after upstream migration

Upstream migrated the Threads Activity Centre unit tests from jest
(test/unit-tests/.../*-test.tsx) to colocated vitest (src/.../*.test.tsx)
in #34800. Re-apply our redesigned My threads / Other threads test suite
on top of that migration:

- Convert jest.* -> vi.* and jest-matrix-react -> test-utils-rtl imports.
- Replace the pre-redesign test bodies with the participated/other-threads
  suite matching the current component API.
- Update notification-badge assertions to the shared NotificationBadgeView
  data-notification-level attribute (NotificationBadge MVVM refactor).
- Drop the obsolete ThreadsActivityCentre snapshot (redesign uses explicit
  assertions, no snapshots).

* fixes requested in review

- replace `enum TACView` with a string union
- extract tab selection into `getActiveTabContent`
- `Array<ThreadData>` -> `ThreadData[]`, `Result` -> exported `UnreadThreadRooms`
- add tsdoc to `ThreadData`
- trim `computeUnreadThreadRooms` tsdoc
- restore `tac_only_notifications` default to true
- use Compound spacing tokens, incl. `--cpd-space-0-5x` for the 2px gap
- use Compound semantic colour tokens instead of `$*-content`
- use the Compound `Text` component for the empty caption
- drop all `!important` added by this PR, scoping rules under `[role="menu"]` instead
- restore `hideChevron` on `MenuItem` rather than hiding the chevron in CSS
- drop the dead `mx_ThreadsActivityCentreRow` class
- link the upstream issues/PRs from both workaround tsdocs

* fix(TAC): focus on threadsPanel

* fix(TAC): use 444px width to match Figma design

* feat(TAC): use the room list's notification decoration on thread rows

Thread rows rendered `StatelessNotificationBadge` with `forceDot`, which
collapsed three states into three 8px dots differing only in hue — grey for
activity, green for a notification, red for a mention. That encodes state by
colour alone (WCAG 1.4.1), red/green being the worst pair to pick, and
`forceDot` discarded the count so 1 and 30 unread looked identical.

Use the same decoration as the room list instead, so the states differ by
shape: an `@` icon for a mention, a counter for a notification, a plain dot
for activity, and the bell for a thread in a muted room. This reuses the
presentational component from shared-components rather than the app-side one,
which needs a `RoomNotificationState` that has no per-thread equivalent.

The count and the room's muted flag are now carried on `ThreadData`, and the
row's `aria-label` spells out the unread state — the label overrides the row's
content, so the new visible counter would otherwise go unannounced.

Also fixes `assertThreadsInTac`, which matched `mx_NotificationBadge_level_*`
classes that exist nowhere in the tree; it goes back to the
`data-notification-level` selector, kept alive by the row wrapper.

* fix(TAC): drop a thread as soon as it is read

A thread stayed listed, counter and all, for as long as the homeserver took
to push fresh notification counts — the js-sdk never recomputes `total`
locally, and only zeroes counts when we sent the last event ourselves.
Since presence was `hasServerNotifs || <local checks>`, reading changed
nothing until the next sync said so.

Check our read receipt before the server counts, so an explicit receipt on
the thread's latest known event wins over a stale count, and recompute on
`RoomEvent.Receipt` rather than waiting for the next sync.

* fix(TAC): drop the workarounds now fixed in the js-sdk

`hasUnreadAfterMyLatestReply` guarded a false positive in
`doesTimelineHaveUnreadMessages`, and `hasCurrentUserSentInThread` covered
`Thread.hasCurrentUserParticipated` being stale right after we reply. Both
root causes are fixed upstream, so the guards go and their coverage moves to
the js-sdk specs.

Fixed by matrix-org/matrix-js-sdk#5525 (treat an event as read if the user
sent a later one) and matrix-org/matrix-js-sdk#5516 (set
hasCurrentUserParticipated when the current user sends a thread reply).

Note both land after the js-sdk commit this repo currently pins, so the two
bugs reappear until that pin advances.

* test(TAC): update playwright tests for the redesigned panel

The e2e expectations still described the pre-redesign TAC, and the
workflows never ran on this PR, so none of it showed up as red:

- a mention now makes a thread ours, so the mentioning thread is asserted
  in "My threads" and the two plain ones in "Other threads", newest first
- clicking a row opens the thread itself, so "mark all as read" steps back
  to the list first, via the card's back button
- one call site still used `clickRoomInTac`, renamed to `clickThreadInTac`
  when the TAC moved from one row per room to one per thread

Screenshots regenerated with `pnpm test:playwright:screenshots`.

* fix(TAC): restore the e2e helper's types

The playwright project is type-checked separately from the app
(`tsc --noEmit --project playwright`), and this branch had loosened the TAC
helper in ways that only fail there: optional fixture names, dropped non-null
assertions, a MessageBuilder constructor whose three fields are never read,
and a nullable messageFinder.

Put those back the way develop has them, keeping only the changes this PR
needs: clickThreadInTac, switchToOtherThreadsTab, assertThreadsInTac and
clickBackToThreadList.

* test: update notification settings snapshots for the renamed setting

This PR rescoped `Notifications.tac_only_notifications` to the Other threads
tab and renamed its label accordingly, which changes the notification settings
screen. Regenerate the two vitest snapshots and the two playwright baselines
that still carried the old wording.

* Address review comments

---------

Co-authored-by: Florian Duros <florianduros@element.io>
2026-09-25 08:17:19 +00:00
Will Hunt
e7d6fd6473 Move GenericToast to shared-components (#35122)
* Port GenericToast to a shared component

* Update imports of GenericToast

* Remove legacy styles

* update test ids

* Move from classes to testIds

* update snap

* update toasts

* Add a test for coverage
2026-09-21 10:54:12 +00:00
David Langley
26771fd3b1 New timeline panel in the room view (labs) (#34859)
* Fix virtual-core scroll compensation during in-flight scrolls

Patch fixes so the timeline holds its place when rows change size while a
scroll is still settling: decisions use the up-to-date scroll position, the
stay-at-bottom correction retries if the browser clamped it, and corrections
now also apply while scrolling upwards. All candidates for upstreaming.

* Use the timeline's own 4px tolerance when deciding it is at the bottom

* Fix full-width timeline rows overflowing the right-hand edge

The list kept the browser's default 40px indent, which pushed every row 40px
too wide. Only full-width rows (the read marker line, date separators) showed
it.

* Add a labelled "New" style to the read marker

The new design: a green line with a "New" label at its right-hand end. Opt-in
via a new label prop, so the legacy timeline keeps its plain line. Also adds an
as="div" option for callers that already provide the list item.

* Fix the reserved image box collapsing while the image loads

The box meant to hold a photo's space before it downloads was being sized to
zero by the browser, so the message grew when the photo arrived and shoved the
timeline. Failed images also keep the reserved height now instead of collapsing
to one line.

* Fix the timeline stalling at the top with more history available

A request to load more history that arrived while a fetch was already running
was silently dropped, and the view would sometimes never re-ask — leaving the
timeline stuck at the top until the user jiggled the scroll. Such requests are
now remembered and run when the current fetch finishes, matching what the old
ScrollPanel did.

* Render polls at full size straight away

The question and options are in the event we already have; only votes need
fetching. Rendering them immediately stops a freshly loaded poll growing ~180px
when its votes arrive and shoving the timeline.

* Add a compact reply preview that keeps one height while it loads

For the new timeline: the quoted message shows immediately when it is already
loaded, a fixed-height skeleton stands in while one is fetched, and the rows are
pinned to one height so the preview never resizes and shoves the messages around
it. Opt-in via a new EventTile prop; the legacy timeline is unchanged.

* Add the new timeline to the room view behind a labs flag

The new virtualised timeline panel, rendering events through the legacy
EventTile for now. Enabled by the "Improved timeline scrolling and navigation"
labs setting; the existing timeline is untouched when the flag is off.

* Address SonarCloud findings

Mark component props read-only, hoist the timeline row renderer to module
level, pass the quoted event into the reply header fetch instead of re-reading
state after the await, and drop a TODO tag.

* Fix image overflow in narrow panes, and tidy up timeline rows

The clamp stopping a reserved image box from overflowing its container lived in
new-timeline CSS, but the box is drawn by a shared component the legacy timeline
and thread panel use too, so images could overflow there. Moved it onto the
component's own link wrapper, beside the width that makes it necessary: a 757px
image in a 350px pane rendered at 757px before and 350px after, and still takes
its natural size when there is room.

Also, for the new timeline's rows: skip a row whose event has gone from the room
rather than letting the tile crash and lose the whole timeline, drop a leftover
placeholder that drew the word "Gap", and give the pagination spinner a label
screen readers can announce.

* Add vis baseline and padding for the labelled read marker story

The story had no left/right inset, so the label rendered flush against the edge
of the frame and was clipped. Pads it like the timeline does, and adds the
baseline image the visual test needs.

* Add tests for the new timeline panel, tile adapter and reply preview

Covers how the panel draws each kind of row — messages, the read marker, date
separators, the loading spinner, gaps — along with the layout fallback, edit
state scoping, and skipping a row whose event has gone. Also covers the tile
adapter's pass-through and the reply preview's three states (already loaded,
skeleton while fetching, and error).

The panel's tests stand in a stub for the virtualised TimelineView, which needs
real layout the test environment doesn't have and has its own tests.

* Show the read marker properly in its stories

The stories dropped the marker into a plain list with no room around it, so the
browser's list styling came along for the ride: every baseline had a bullet in
it, and the rule was pressed against the top edge of the frame, hard to see and
liable to be clipped by the marker's own 1px offset. The hidden-marker story was
a picture of a bullet and nothing else.

Resetting the list and insetting the stories draws the marker the way a timeline
does — a hairline, evenly inset, with room above it.

* Update the bubble media baseline for the reserved-size fix

The second media box in that story was being shrunk to fit its content (255px
wide) rather than taking the size the event declares; with the reserved box now
holding, it renders at 297px and its spinner and timestamp sit inside it instead
of overflowing. Every other story in the timeline suite is unchanged.

* Create new-timeline.spec.ts

* Move panel CSS to mx_NewTimelinePanel and use new DateSeperator

* fix tanstack virtial patch and remove reply clamping to 1 line

clamping the reply to one line is awkward and not real needed now that above the fold compensation works. it will visually expand when on screen.

One of our tanstack fixes was fixed upstreamed so can be removed.

* Update media---bubble---default-auto.png
2026-09-16 21:42:40 +00:00
rbondesson
4dacb8b4ca Move EventTile to shared components - #5b (#34781)
* Align view model with the current EventTileView contract

* Use presentation context at every application call for EventTileView

* Render EventTileView from UnwrappedEventTile

* Remove the legacy styling

* Added missing receipt gutter logic

* Adding Card as a new shape, used in TimelineCard panel

* Added visual tests for the Card story

* Migrate EventTile layout styling and enhanced the story book rendering

* Migrate preview, notification, thread, and file shapes

* Use MemberAvatar and RoomAvatar in storybook

* Make slot styling self-contained and clean up corresponding application styling

* Clean up action bar styling

* Clean up event tile styling overrides

* RoomView realted styling fixes

* Adjustments for threads list

* Adjustments to File view

* Adjustments to Card shape

* More styling cleanup

* Updated Playwright test selectors

* Update the story book with more relevant data

* Fix oxlint and update story screenshots

* Restored conditional notification-badge slot rendering to avoid empty wrappers

* Fixed tests and snapshots

* Remove the unused UnreadNotificationBadge

* Updated snapshots and removed a11y failing story test

* Fix test locator hooks

* Fixed styling and logic issues in appearance settings

* Fixes to slotSender and slotBody placement for group layout

* Reorder style sheet for better readability

* Fix for spacing between slotSender, slotBody and reply-chain

* Fix more Playwright test loacators

* Clean up event tile class overrides

* Fix the slotBody styling

* More clean up of unused locators

* Styling fixes

* Fixes to test locators and styling for bubble and irc layout

* Locator fixes, updated snapshots, layout adjustements

* Fix for selected and editing markers and timestamp pos

* Styling fixes to bubble layout. Also dismiss releaseAnnouncements

* Styling updates and dont wait for release announcements anymore

* Styling adjustments

* Make the Playwright test wait for UI to settle before taking screenshot.

* Updated screenshot - the only difference is scroll pos

* Fixing test locators and styling adjustments

* Updated the test to reflect ellipsis, hence the screenshot update

* More test locators and styling adjustments

* Updated snapshots and screenshots

* More locator fixes and snapshots

* Restore the original screenshot

* Added Search result specific styling and make reply chain density aware

* Test locators and styling adjustments

* More styling fixes

* Updated snapshot

* oxfmt

* Styling adjustment and updated snapshots

* Styling adjustement

* Restore the font-12px override on thread view ViewSourceEvent

* Adjust styles for thread view bubble layout of ViewEventSoucrce

* More adjustments

* Styling adjustments

* Fix the bubble  layout thread view event source alignment

* Fix the thread view without destroying the room view

* Removing !important

* Updated snapshots after merge

* Put back !important until MemberAvatarView is actually used in event tiles

* Updated snapshots

* Use hideJumpToBottomButton to avoid flakiness

* More hideJumpToBottomButton
2026-08-31 04:28:13 +00:00
hayyaksi
46d55f25a2 Tell the user when registration is being rate limited (#34519)
* Tell the user when registration is being rate limited

* Disable the submit button while registration is rate limited

The warning now sits with the button it is disabling, below the server picker,
rather than above it, so it reads as the reason you cannot continue.

The rate limit message moves out of errorText into its own state field to get
there, which also leaves the position of every other registration error alone.

When the server tells us how long to wait, we ask again ourselves once that
time is up, so the form comes back without the user having to guess when a
reload is worth it.

* Set the rate limit warning to medium weight

Scoped to the registration rate limit warning so the other auth errors keep
the bold they have always had.
2026-08-11 15:39:39 +00:00
Zack
ce74b5f614 Refactor NotificationBadge to shared MVVM (#33843)
* Refactor NotificationBadge to shared MVVM

* Added snapshot images

* Replace legacy NotificationBadge with adapter

* Fix Eslint

* Use regular NotificationBadge prop names

* Remove legacy NotificationBadge selectors

* Update TAC badge Playwright selectors

* Rename NotificationBadgeAdapter to NotificationBadge

Addresses review feedback: the component is the app-facing badge, not an
adapter, so name it NotificationBadge.

* Make NotificationBadgeView isClickable a required boolean

Addresses review feedback: there is no semantic difference between
`isClickable: false` and `isClickable: undefined` (both render the
non-interactive variant), so the field should be a plain boolean. The
view model always provides it.

* Drop redundant comparison guards in NotificationBadge view model setters

Addresses review feedback: Snapshot.merge already compares each field
with Object.is and only emits when something actually changed, so the
manual equality guards in each setter were redundant. Recompute the
snapshot unconditionally and let merge dedupe.

* Resolve notification badge labels inside NotificationBadgeView

Addresses review feedback: static UI labels belong in the view, not the
snapshot. The view now resolves the knock and unsent-message strings via
useI18n, and the snapshot exposes a showUnsentTooltip boolean instead of
a prebuilt tooltipLabel (and drops knockLabel entirely). Adds the
room|knock_sent and notifications|message_didnt_send keys to the
shared-components i18n catalogue so they resolve in tests and storybook.

* Remove unused translation because of shared components movement

* Fix typescript issue

* Fix lint issue

* Remove unused notification badge count setting

* Pass notification badge class names explicitly
2026-08-10 08:32:23 +00:00
Adi-Beker
f6e88f4699 fix: align room timeline scrollbar to viewport edge (#33788)
* fix: align room timeline scrollbar to viewport edge

* update many screenshots

* Lots more screenshots

* screenshots

* Manual screenshot update

---------

Co-authored-by: David Baker <dbkr@users.noreply.github.com>
2026-08-07 14:02:11 +00:00
Michael Telatynski
49a2bdd7e4 Replace legacy $spacing-X vars with Compound Design Tokens (#34380)
* Replace legacy `$spacing-X` vars with Compound Design Tokens

* Remove unused font size vars

* Use calc to get negative spacing vars
2026-07-22 10:10:57 +00:00
renovate[bot]
86b5a28a32 Update npm non-major dependencies (#34263)
* Update npm non-major dependencies

* Fix pcss comments

* Run oxfmt

* Fix lockfile

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
2026-07-15 09:15:58 +00:00
Florian Duros
b68ecdb860 Remove legacy room list (#34040)
* refactor(room-list): migrate SpaceStore off the legacy room list store

SpaceStore.setActiveRoomInSpace iterated the legacy RoomListStore's
`orderedLists` in `TAG_ORDER`; switch it to the space-aware
RoomListStoreV3.getSortedRoomsInActiveSpace() accessor. This drops the
last non-UI dependency on the legacy store and on `TAG_ORDER` (exported
from LegacyRoomList, deleted next).

* feat(room-list)!: remove the legacy room list UI

Delete the old sublist-based room list and its components now that the
new RoomListPanel is the default. Removed: LegacyRoomList,
LegacyRoomListHeader, RoomSublist, ExtraTile, RoomTile (+ Subtitle/
CallSummary), RoomBreadcrumbs and RoomSearch, plus their styles and
tests.

LeftPanel collapses to the RoomListPanel-only path. The shared
`contextMenuBelow` helper is relocated into RoomResultContextMenus (its
only remaining consumer).

* feat(room-list)!: remove the legacy RoomListStore

The legacy sublist-based room list UI is gone, so the old
`stores/room-list` store (Algorithm, sorters, filters, layout store,
space
watcher) has no remaining consumers. Delete the directory and its tests.

MatrixChat.forgetRoom no longer calls the legacy `manualRoomUpdate`; the
new room list store removes the room on the `AfterForgetRoom` dispatch
that still fires. Drop the `mxRoomListStore`/`mxRoomListLayoutStore`
globals and the now-dead test imports.

* feat(room-list)!: remove the feature_new_room_list labs flag

The new room list is now the only room list, so remove the
feature_new_room_list labs flag and make its enabled behaviour
unconditional everywhere it was gated:

- LoggedInView: always use the resizable layout and
NEW_ROOM_LIST_MIN_WIDTH;
  drop the collapsible/minimized legacy path.
- SpaceStore: People and Favourites are dropped from metaSpaceOrder (per
the
  long-standing TODO on the removed accessor).
- MessagePreviewStore: stop appending thread replies to previews.
- Settings, SidebarUserSettingsTab, PreferencesUserSettingsTab,
  QuickSettingsButton, SpacePanel, LandmarkNavigation: drop the flag
reads and
  legacy branches.

Update the tests that toggled the flag; the People/Favourites meta space
tests covered behaviour that the flag (default on) already disabled.

* feat(room-list)!: remove the dead legacy left-panel resizer

LoggedInView still built the old `Resizer`/`CollapseDistributor` over an
`lp-resizer` ResizeHandle and persisted `mx_lhs_size`. That handle is no
longer rendered (the resizable layout is now driven by
LeftResizablePanelView + ResizerViewModel, which persists its own state
via RoomList.panelSize/RoomList.isPanelCollapsed), so the old resizer
was
inert dead code left over from the legacy room list.

Remove createResizer/loadResizer/loadResizerPreferences, the
_resizeContainer/resizeHandler refs, the ResizeHandle render, the
mx_lhs_size handling and NEW_ROOM_LIST_MIN_WIDTH, plus the unit tests
that
exercised the mocked resizer.

* feat(room-list)!: update i18n files

* refactor(room-list): remove the now-unused collapseLhs state

`collapseLhs` is write-only since the left panel no longer collapses: it
was last read by LoggedInView's `shouldUseMinimizedUI`, removed with the
feature_new_room_list flag. Drop it from MatrixChat's IState (and its
assignments), collapsing the hide/show_left_panel handlers to just the
`notifyLeftHandleResized()` call they still need, and from
LoggedInView's
IProps and the test props.

* fix(room-list): instantiate message previewers lazily

Removing the unused SettingsStore import from MessagePreviewStore (when
the
feature_new_room_list flag was dropped) changed module load order and
exposed a latent circular dependency: ReactionEventPreview imports
MessagePreviewStore, which eagerly did `new ReactionEventPreview()` at
module-eval — so importing ReactionEventPreview first (as its unit test
does) hit "ReactionEventPreview is not a constructor".

Construct the previewers lazily on first use (cached) instead of at
module
load, so nothing dereferences a mid-evaluation module. Fixes
ReactionEventPreview-test.

* test(room-list): remove `feature_new_room_list` labs flag in e2e tests

* chore: remove remaining `newRoomList` flag

* chore: cleanup theme files

* fix: restore the re-resizable TouchEvent polyfill

* chore: remove usage of breadcrumbs settings in BreadcrumbStore

* Revert "fix(room-list): instantiate message previewers lazily"

This reverts commit 4e6eedfff0.

* chore: remove unused function in BreadCrumbStore

* test: remove unused fuction of BreadcrumStore in tests

* test: add tests for RoomResultContextMenu
2026-07-02 09:07:37 +00:00
rbondesson
fc23fcad47 Make shared-components tiles render identically outside Element Web - #4 (#33622)
* Use shared MessageTimestampView in edit history

* Move timestamp typography into shared component

* Updated snapshots

* Update comments after clean up

* Fixed sonar issue and added tests for improved coverage

* Fix Prettier issue

* Fix font-size on timestamps and toolbar button sizing

* Updated snapshots

* Updated Storybook screenshots

* Updated screenshots

* Clean up app/web unused/redundant styling for disambiguated profile

* Fix merge error

* Fixes after merge

* Fixes after merge
2026-06-01 05:47:59 +00:00
David Baker
0140563b64 Tweak new user menu design (#33444)
* Tweak new user menu design

* Update screenshots

* More screenshots

* Add story with no avatar

* add story to test

* Expand the menu so it actually shows what it's supposed to show

* Use the open parameter

which is the param to open the menu

* snapshot

* Add test for normal open menu version

* Move menu to the right of the avatar

and make it appear on top of the display name

* Fix user menu layout

* screenshots

* snapshot

* screenshots

* more screenshots

* Shift toasts to the left slightly

So they completely cover the display name of the user menu when
it's expanded. Also down slightly so they're level with the user menu.

* Tweak toast border radius & position

to match & sit on top of the user menu

* Close toasts in cider tests

* Only close the toast if it's actually there

* Fix some toasts to be dismissed & update screenshots

more to come though

* Make closeKeyStorageToast actually optional

* Fix some more toasts & races

* Screenshots again again (again)

* More screenshots

* Convert to rejectToast

* Fix toast rejectors to not wait and update screenshots

* Apparently 1ms is not long enough
2026-05-19 13:10:14 +00:00
Zack
1e7c9f672a Phase 2 Refactor MImageBody to MVVM and remove legacy component (#33212)
* MVVMing of MImageBody and removing legacy component + css

* Fix Prettier

* update small image to large image in test

* Update test

* Preserve MImageBody legacy class names

* Click image in custom component download test

* Update snapshots

* Update MBodyFactory snapshots

* Added new tests to pass coverage

* Fix prettier

* Remove legacy import that was removed

* Add MImageReplayBody test for coverage

* Remove legacy MImageBody selectors from image view

* Update image body selectors in Playwright tests

* Keep file panel image body spacing compact

* Update apps/web/src/viewmodels/message-body/ImageBodyViewModel.ts

Co-authored-by: Florian Duros <florian.duros@ormaz.fr>

* added documentation to component

* Fix hidden media placeholder import

---------

Co-authored-by: Florian Duros <florian.duros@ormaz.fr>
2026-05-13 06:03:43 +00:00
Florian Duros
afe321d9ea fix: tac indicator not hidden when hovered (#33423) 2026-05-07 17:33:49 +00:00
Will Hunt
d4f419d1b5 Refactor and redesign user menu (#32812)
* Initial quick settings menu

* Total refactor

* Quick design fixes.

* Refactor to use a view model.

* Remove unused strings

* Apply label

* Refactor naming

* Fixup most tests

* Remove specific theming for old user menu

* prettier

* Lots of cleanup

* Allow overriding the menu classes

* update snap

* Oops translations

* tidy

* Cleanup guest flows.

* Copyrights

* Remove unused classname

* Match guest view to designs

* Add guest screenshots

* Update guests

* snapshot

* Cleanup

* fix import

* Update tests

* More sceenshot fixes

* update collapsed

* move statements to prevent flake

* update snap

* Kick it along

* Click the room list

* Fiddle with the room video list.

* More screenshot adjustments

* fix imports

* fix another import

* Update snaps

* update snaps

* Fix snap flakes

* Refactor to move actions to view component, and callbacks to Actions

* Cleanup

* Cleanup

* Cleanup

* invert auth

* More bits

* fix

* Change md buttons to sm

* Try to assemble the snapshot component of the house of cards

* Consistent newlines between tests

* Update snapshot

Not sure why this was like this, this seems consistet for a logged in user

* Update snapshot

again these seem sensible for a guest

* Remove test

I don't really understand why the thing it asserts matters, so I'm removing
it for now.

* Update snapshot

* screenshot

* Don't show profile picture for guests

I'm not really sure what it meant for this interface to have a
property with a default value, so I've removed it and added the
property to the view model.

* Show avatar in story

* update snapshots for showAvatar

* Update screenshots

& hopefully make hover consistent in one

* Use outline home icon

---------

Co-authored-by: David Baker <dbkr@users.noreply.github.com>
2026-05-06 08:34:36 +00:00
Kamil Wolter
9adaabae66 Update home page CSS (#32723)
* Update home page CSS

* Update home-thin-viewport snapshot

* Update window-custom-theme snapshot

* Update window-custom-theme snapshot after develop merge
2026-05-05 11:24:52 +00:00
Robin
244a2ca011 Show the right cursor when hovering over a space (#33351)
Fixes a regression in b0ee6f5323 where a 'grab' cursor would be shown when hovering over a space, even though the most salient way to interact with it is by clicking.
2026-05-01 12:05:28 +00:00
Robin
03b730db58 Update toast styles, improve incoming call notifications (#33043)
* Update design of incoming call notifications

* Make toast show avatars of group call participants

* Further expand test coverage for call notifications

* Update screenshots

* Update screenshots

* Delete unused variables

* Upgrade Element Call to v0.19.2

For the new group call intents.

* Consolidate some branches

* Apply Compound spacing variables a little more

* Fix lints

* Exclude Element Call assets from being re-minified to fix build
2026-04-27 14:37:42 +00:00
Zack
f615968835 Refactoring readMarkerForEvent into ReadMarkerView in shared-components (#32777)
* Refactoring readMarkerForEvent  into ReadMarketView in shared-components

* Use shared ReadMarkerView in MessagePanel

* Rename ReadMarkerView to ReadMarker

* Fix Prettier

* Update snapshots screenshots

* Use plain props for ReadMarker

* Fix Prettier

* Move ReadMarker into room timeline

* Replace ReadMarker nested ternary

* Update snapshot
2026-04-14 11:56:52 +00:00
Robin
253dcb44dd Show a 'grab' cursor on picture-in-picture view (#33079)
* Remove unused 'draggable' prop from PictureInPictureDragger

* Show a 'grab' cursor on picture-in-picture view

To give it a proper affordance for dragging.
2026-04-09 12:25:14 +00:00
R Midhun Suresh
99e6ede9f1 Implement collapsible panels for the new room list (#32742)
* Add `react-resizable-panels` library

* Implement a custom SeparatorView

* Add a `LeftResizablePanelView`

* Add a custom `GroupView`

* Export everything from shared-components

* Make it possible to track width/collapse state through settings

* Add a view model to drive the views

* Render views without disrupting the old room list

* Fix lint error

* Disable user interaction on collapsed panel

* Prevent widgets fron hijacking pointer events

* Expand to full width on separator click

* Separator should be shown when focused via keyboard

* Update tests

* Use data-attribute for hover

* Write stories for SeperatorView

* Write vite tests for SeparatorView

* Write tests for LeftResizablePanelView

* More tests

* Fix lint errors

* Fix flakey border on the roomlst

* Fix storybook axe violation

* Update snapshots

* Fix playwright tests

* Fix sonarcloud issues

* Use translated string

* Add better js-doc comments

* Rename `ResizerSnapshot` to `ResizerViewSnapshot`

* Externalize react-resizable-panels

* Link figma designs to stories

* Write playwright tests

* Update screenshots

* Fix lint errors

* Update more screenshots

* Update more screenshots

* Fix flaky toast test

* Update apps/web/playwright/e2e/crypto/toasts.spec.ts

Co-authored-by: Andy Balaam <andy.balaam@matrix.org>

* Fix indentation

---------

Co-authored-by: Andy Balaam <andy.balaam@matrix.org>
2026-03-23 13:33:32 +00:00
rbondesson
d791e3fe8a Refactor MFileBody using MVVM and move to shared-components (#32730)
* Refactor MFileBody using MVVM and move to shared component

* Simplyfing rendering properties

* Create a first version of view model for the component

* Simplifying component properties and make it possible to override module css using data-* attributes

* Create a MBodyFactory in element-web and use it to render MFileBodyView from MessageEvent

* Use <MediaBody instead of <button to support legacy rendering

* Updated styling and comments

* Refactoring className from snapshot to component property

* Rename MFileBody* to FileBody*

* Rename MFileBody* to FileBody*

* Refactoring render branches to allow for displaying nothing

* Fix styling issues

* Fix lint errors

* Fix for css selectors in playwright tests

* Remove the MFileBody component and change all callers to use MBodyFactory:FileBodyView

* Remove unused strings in element-web

* Revert to render text in story iframes

* Fix for prettier error

* Fix playwright test css selectors

* Apply legacy styling in element-web

* Add legacy styling for mx_MFileBody

* Restore file

* Change from <div to <button

* Calculate span width ad update screenshots

* Remove width calculation and update snapshots

* Fix for letter-spacing and better content in story

* Updated playwright screenshots

* Updated snapshots

* Fixing Sonar errors/warnings

* Removed extra parentheses

* Changes after review

* Change border-radius to px and updated snapshots

* Fix typo in description

* And another typo fix

* Changes after review
2026-03-16 08:47:23 +00:00
Michael Telatynski
0fc4d4c256 Fix expand space panel button not being shown on keyboard focus (#32746)
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2026-03-06 11:23:03 +00:00
Michael Telatynski
91a3cb03c1 mv element.io @types __mocks__/ debian docker module_system/ playwright res src test webapp Dockerfile .dockerignore .eslintignore .stylelintrc.cjs babel.config.cjs recorder-worklet-loader.cjs .modernizr.json components.json config.json config.sample.json package.json project.json tsconfig.json tsconfig.module_system.json jest.config.ts playwright.config.ts webpack.config.ts build_config.sample.yaml apps/web/
mkdir apps/web/scripts
mv scripts/{cleanup.sh,ci_package.sh,copy-res.ts,deploy.py,package.sh} apps/web/scripts

And a couple of gitignore tweaks

Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2026-02-24 15:43:58 +00:00