* Default useOnlyCurrentProfiles to true
As per comment, start by setting this to true by default with intention to remove.
* Update screenshots
* Snapshot
* Use Renovate to bump testcontainers digests
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* feat: add dry run of storybook build in merge queue
* Reuse build from storybook build job
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Use nx to build library before building storybook
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
* Add NX_SKIP_LOG_GROUPING to tests workflow
* Switch CI nx outputStyle to stream-without-prefixes
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* fix(sc): use correct icon size for room list icons
* feat(sc): implement new selection and hover design for room list item
* feat(sc): set room list item height
* chore(sc): add story for long room and message preview
* fix(sc): use correct letter-spacing for room list item
* feat(sc): use new padding for room list filters
* feat(sc): update room list header style
* test(sc): update unit tests
* test(sc): update visual tests
* test: update playwright screenshots
* doc: update figma link in item story
* test: fix sliding sync test
The notification pop up was at the top of the room list filters (less
top padding) and it was unable to click on the People filter.
* chore: fix `VirtuaalizedRoomListView` comment
* test: update playwright screenshot
* fix(sc): add ellipsis on room name
* Move declaration.d.ts to @types
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Load customisations.json without `require`
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove webpack rule from when we were consuming shared-components ts vs js
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Avoid hardcoding paths to modules in webpack config
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Convert webpack config to typescript
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Stub js webpack/postcss plugins
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Patch broken rollup types until https://github.com/getsentry/sentry-javascript-bundler-plugins/pull/870 is released
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Install @types/postcss-import
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix fdir relying on @types/picomatch
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update pnpm-lock.yaml
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix usage of nx in npm scripts
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Tidy project.json
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Set history visibility to "invited" for DMs and non-public rooms
* Update e2e tests and screenshots
* lint
* Revert screenshot
* Add test that an override of historyVisibility still works
* Rename playwright-screenshots script to -experimental
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Run only browser in docker for test:playwright:screenshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix playwright config for non-remote runs
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix videos on Firefox
Videos are using cross-origin requests, and Firefox
blocks them before passing to the service worker if
the element doesn't have the crossorigin attribute to
give CORS support
* React needs camelCase attr names
---------
Co-authored-by: David Baker <dbkr@users.noreply.github.com>
* Remove old screenshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Add experimental playwright-screenshots.sh utility and use it for shared-components `test:storybook:update`
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Tidy up
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate based on review
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Avoid showing two chat timelines side by side after a call
In certain situations you could still end up with the chat timeline visible in the right panel in addition to the main split. For instance if you are in a call, open the chat panel, then leave the call while looking at another room, the chat panel would remain open upon navigating back to the original room.
* Avoid using flushPromises in tests
It was failing due to being unable to access pnpm-workspace.yaml so change the docker context to the root of the monorepo
Also disable pnpm-link script in the docker env and node-linking for storybook tests
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Use nx for running dev tasks
Initially only build & start
This enables caching, i.e. if you made no changes to shared-components then it can skip that build and speed up your iteration cycle time
nx will also be used for our release tooling down the line
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Drop `concurrently` - we no longer use it
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Make knip happier
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Also use nx tasks for jest & tsc
so that SC gets built as needed
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Add missing @nx/jest plugin
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix prebuild:rethemendex for Windows
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix prebuild:rethemendex for Windows
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Add prepack script to package.json
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update screenshot for reactive display name disambiguation
This PR updates the Playwright screenshot tests to reflect the changes
from matrix-js-sdk PR #5135, which fixes reactive display name
disambiguation.
The screenshot will be updated based on CI test results to show the
correct disambiguation behavior when multiple room members share the
same display name.
Related: matrix-org/matrix-js-sdk#5135
* Update member list screenshot for reactive disambiguation
* Retry CI for flaky MatrixChat timeout
* Refactoring of DisambiguatedProfile into shared components
* correct values and refactoring
* Add username color classes to Storybook and clean up DisambiguatedProfile stories
* Refactor DisambiguatedProfileView to use class component and enhance props structure
* Refactor DisambiguatedProfile components to use member object and enhance props structure
* Update copyright year to 2026 and adjust the tests to fit the correct memberinfro interface
* Add DisambiguatedProfileViewModel class
* Refactor DisambiguatedProfileViewModel to use member object and the rest of the props
* Refactor SenderProfile to use DisambiguatedProfileViewModel and update DisambiguatedProfile styles
* Refactor DisambiguatedProfileView to enhance interface documentation
* Refactor DisambiguatedProfileView to use CSS modules for styling
* Updated css + tests to fit the new changes
* Update of the test snap to fit the current tests
* Adjusted RoomMemberTitleView and SenderProfile to use the new viewmodel, removed the old component.
* Implemented new viewmodel test for DisambiguatedProfileViewModel
* Update copyright text
* update css class names
* update to correct snapshot after css name changes.
* Apply suggestion from @florianduros
Co-authored-by: Florian Duros <florian.duros@ormaz.fr>
* Moved logic to viewmodel instead of having it in the view. Removed unessecery functions and css.
* removed unessecery file that I copied from root folder, this is no longed needed as I use the root file instead in the viewmodel
* Better Formatting
* Fix issues after merging develop
* FIxed issues with eslint
* Added Visible, non-interactive elements with click handlers must have at least one keyboard listener from eslint docs
* Updated snapshot the fit the latest update with eslint button requirment
* Update snapshot screens for new tests.
* Update tests to reflect snapshots
* Update snapshot due of outdated CSS module classes
* Add useEffect to call setProps on the DisambiguatedProfileViewModel
when props change, ensuring the view updates with the correct display
name. Update LayoutSwitcher snapshot for new CSS classes.
* Fix Playwright editing tests by adding exact match for Edit button selector
The DisambiguatedProfile refactoring added role="button" to the component,
causing the selector { name: "Edit" } to match both the user "Edith" and
the actual Edit button.
* Fix ForwardDialog location tests for async hook rendering The SenderProfile component now uses hooks that trigger async state updates.
* Fix SenderProfile useEffect to only update changeable props
* Added letter spacing
* Added ClassName prop
* Update snapshot
* Update letter-spacing
* Update snapshot screenshots
* Update Snapshots
* Update snapshot
* Removal of letter spacing to test CI
* Apply suggestion from @florianduros
Co-authored-by: Florian Duros <florian.duros@ormaz.fr>
* Added closing brackets + added back letter-spacing
* Update snapshots
* Update snapshot
* Update span to correctly apply to the CI tests, it wasn't possible to use classname as a prop
* Update snapshot
* Added comment to explain the span classNames
* DisambiguatedProfileViewModel.setProps to runtime-changing props
* replace DisambiguatedProfileViewModel setProps with explicit setters and update call sites
* Update Setters
* Prettier FIx
* Update Setters
* update DisambiguatedProfileViewModel setters and tests
* Update SenderProfile to show connect display name
* clone snapshot in setters to trigger reactive updates
* use snapshot.merge in DisambiguatedProfileViewModel setters
* emove duplicated logic in DisambiguatedProfileViewModel
* Change snapshot name
* Update viewmodel
* Updated Tests
* typo
* Update src/viewmodels/profile/DisambiguatedProfileViewModel.ts
Co-authored-by: Florian Duros <florian.duros@ormaz.fr>
* Removal of unused function
* Update snapshots
* Update tests to pass coverage
* Update Eslint
---------
Co-authored-by: Florian Duros <florian.duros@ormaz.fr>
* Simplify CI for shared-components
Now that we use pnpm which understands monorepos we can skip manually installing shared-components in CI
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix docs workflow not being able to find pnpm version
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix storybook workflow not seeing lockfile and using wrong package manager
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix dockerbuild
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch shared-components from yarn classic to pnpm
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch element-web from yarn classic to pnpm
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch CI to pnpm
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update docs & comments
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Hold back postcss to match yarn.lock & use workspace protocol
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Tweak CI
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Rid the world of `$(res)`
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to type=module
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix module import
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Make knip happy
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update playwright imports
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Make docker build happy
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove stale params
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix badly formatted logging
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to lodash-es
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Make jest happier
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch element-web to ESM
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update testcontainers imports
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix modernizr cjs
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix modernizr cjs ignore files
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Move modernizr sonar exclusion to exclude everything
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update playwright tests for esm compat
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Add pnpm-link utility
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Test matrix-web-i18n
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Discard changes to src/vector/index.ts
* Update playwright-common
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Use catalogs
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Improve pnpm-link script
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Use pnpm import to regenerate lockfile from yarn.lock
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix room list not being cleared
RoomListV3 was lacking an onNotReady which meant that the room list
would sometimes not be cleared between logins.
* Fix return type
---------
(cherry picked from commit 81b111371f)
Co-authored-by: David Baker <dbkr@users.noreply.github.com>
Co-authored-by: Florian Duros <florianduros@element.io>
* fix: Update `globalBlacklistUnverifiedDevices` on setting change
Signed-off-by: Skye Elliot <actuallyori@gmail.com>
* fix: Use `SettingLevel.DEVICE` filter on blacklisted device watcher
* tests: Add playwright test for blacklist unverified devices toggle
* docs: Correct test step description
Co-authored-by: Andy Balaam <andy.balaam@matrix.org>
* tests: Add test for local vs global blacklist unverified devices
* tests: Ensure local toggle overrides global toggle.
* tests: Add unit tests for blacklistUnverifiedDevices listener
---------
Signed-off-by: Skye Elliot <actuallyori@gmail.com>
Co-authored-by: Andy Balaam <andy.balaam@matrix.org>
* Fix room list not being cleared
RoomListV3 was lacking an onNotReady which meant that the room list
would sometimes not be cleared between logins.
* Fix return type
Co-authored-by: Florian Duros <florianduros@element.io>
---------
Co-authored-by: Florian Duros <florianduros@element.io>
* Extract logic for this device from DeviceListener
* Remove a listener that I assume we forgot in DeviceListener
* Use a code block for JSON in a comment
Co-authored-by: Skye Elliot <actuallyori@gmail.com>
* Rename to DeviceListenerCurrentDevice
---------
Co-authored-by: Skye Elliot <actuallyori@gmail.com>
* Move SlashCommands into slash-commands
* Move SlashCommands test prep into a function that can be re-used from multiple files
* Move slash command tests into separate files
* Fix super-linear regexes and test some more slash commands
* Move splitAtFirstSpace tests into a separate file
* Test for parseCommandString
* Make parseCommandString able to handle leading whitespace and tabs
* Implement parseCommandString using splitAtFirstSpace
* Extract emoticons slash commands into a separate file and share their code
* doc: add typedoc generation for shared component
* ci: add SC doc publish
* ci: push doc on changes on develop
* ci: fix working directory
* doc: add typedoc generation into storybook
* doc: build i18n files for storybook static sites
* ci: change workflow to deploy storybook
* chore: exclude non-ui tests from vitest visual tests
* chore: try to fix error in CI
* doc: fix broken link in README
* doc: add typedoc missing export plugin
Add https://github.com/Gerrit0/typedoc-plugin-missing-exports to avoid
to have to explicit export all the types which are not used outside SC
* doc: add mapping to external docs
* fix: remove shebang
* Add NotificationDecoration component
Add the NotificationDecoration component to shared-components.
This is a leaf component that renders notification badges and indicators
for rooms/items including mentions, unread counts, call indicators, etc.
* Add RoomListItem component
Add the RoomListItem component to shared-components.
Includes context menu, hover menu, notification menu, and more options menu.
* Add RoomListPrimaryFilters component
Add filter chips component for filtering the room list by
unread, people, rooms, favourites, mentions, invites, and low priority.
* Update VirtualizedList component
Update VirtualizedList to support the room list virtualization requirements.
* Add RoomList component
Add RoomList component that renders a virtualized list of room items.
Includes story mocks for testing.
* Add RoomListView component
Add RoomListView component that composes RoomList with filters,
empty states, and loading skeleton.
* Export room-list components from shared-components
Add exports for RoomListView, RoomListItem, RoomListPrimaryFilters, and RoomList.
Include i18n strings for room list components.
* Add RoomListItemViewModel
Add view model for individual room list items.
Manages per-room subscriptions and updates only when specific room data changes.
* Add RoomListViewViewModel
Add view model for the room list view.
Manages room list state, filtering, keyboard navigation, and child view models.
* Integrate shared components into RoomListView
Update RoomListView to use the new ViewModels and shared components.
Includes i18n string updates for element-web.
* Remove old room list implementation
Remove old ViewModels, hooks, and view components that are now
replaced by the shared-components implementation.
* Update sliding-sync playwright test
Update test expectations for new room list implementation.
* Add figma links
* Move viewModels to the right folder
* Rename to RoomListEmptyStateView
* Update VirtualizedRoomListView naming
* Update screenshots and snapshots
* Move viewmodel tests to the right location and fix some imports
* lint
* Use unknown as an Opaque type rather than any. It discourages property access within shared components and can still be cast back in EW.
* Update screenshots for new shared component rendering params
* Make room order tests deterministic
* Update dependency @playwright/test to v1.58.1
* Update snapshots & screenshots
* Another screenshot
* Un-focus room tile and scroll it into view
possibly some change in what ends up focused after a popup disappears
* uncomment the screenshots
* Correct screenshot
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: David Baker <dbkr@users.noreply.github.com>
* fix: Remove state_key: null from Seshat search results
Seshat includes "state_key": null for non-state events, which causes
matrix-js-sdk to incorrectly treat them as state events. This prevents
encrypted messages from rendering properly in search results.
This fix removes the null state_key from search results and context
events before passing them to the SDK.
* test: cover local search null state_key edge cases
* test: satisfy strict types in searching coverage test
---------
Co-authored-by: David Baker <dbkr@users.noreply.github.com>
* Refactor TimelineSeparator to shared-components package
• New TimelineSeparator component in packages/shared-components/
• Updated MessagePanel.tsx to import from shared-components
* Fix copyright text
* Timeline Unit Tests + Timeline Snapshot Tests
* Imported correct timeline seperator
* Update snapshots because of css update
* Apply suggestion from @florianduros
Co-authored-by: Florian Duros <florian.duros@ormaz.fr>
* Created className prop
* Removal of element x unused css
* Update snapshot because of Flex
* Update snapshots because of Flex
* Update css to correct values and compund name
* Added letter spacing to timelineseperator
* rremoval of letter spacing
* added align center to flex to apply correct css changes
* Update snapshots to reflect new css changes
* Update snapshots to reflect css changes
* Added letter-spacing to timeline seperator
* Update snapshots after css update
* update snapshots
---------
Co-authored-by: Florian Duros <florian.duros@ormaz.fr>
* Update npm non-major dependencies
* Fix type
* Katex comes with its own types now
Or possibly it always had them but they just put them in the package.json
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: David Baker <dbkr@users.noreply.github.com>
* Move the code for running the upgrade command into its subdir
* Replace use of deprecated currentState property in runUpgradeRoomCommand
* Move upgraderoom command options into their own file
* Move upgraderoom tests into their own file and add a couple
* Move EventTileBubble to shared components as is
* Added documentation and updated stories and unit tests
* Move 'global' element web css to _common.pcss
* Adding playwright snapshots
* Updated comments
* Added legacy mx_MessageTimestamp class and updated snapshots
* Regenerate snapshots with correct hash
* Changes to css and removed timestamp from properties after review.
* Update screenshot for room-list and fix flaky CI playwright test.
* Blur the play button before matching screenshots
* Changed to button focused instead of blur for consistancy
* Stabilize play button appearance in CI (disabled due to decoding)
* Force play button appearance in CI (disabled due to decoding)
* Add comments on playwright test changes.
Change from React.RefObject<any> to Ref<HTMLDivElement> in EncryptionEvent.tsx
* Update playwright/e2e/composer/CIDER.spec.ts
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
* Update playwright/e2e/composer/CIDER.spec.ts
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
* Update playwright/e2e/crypto/toasts.spec.ts
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
* Add `HistoryVisibilityBadge` shared component
* Add `historyVisibility` to `RoomSummaryCardViewModel`
* Add a history visibility badge to the room info panel
* Allow roominfo panel badges to wrap
Now that we have an extra one, it's quite likely we'll have to spill onto more
lines.
* update screenshots
* Set icons in badges to be 16px
Having discussed this with the design team, the icons in badges should be 16px, not 13px,
at default font size settings.
* Add stories for all history visibility states
* fix incorrect use of useRoomState
* fix snapshots
* more snapshot updates
* Update screenshots
* Fix failure to update room info panel on joinrule change
Currently, if the join rules are updated, the room info panel is not updated
until the panel is re-rendered. This is due to a misuse of `useRoomState`.
* Update documentation and types on `useRoomState`
This hook is useless without a `mapper` function, so let's mandate it. Also
improve the documentation while we're here.
Because every room in a space will emit a notification state change
when push rules change so we would otherwise recalculate the space
notification state for every room in the space, On^2 style.
* Refactor DecryptionFailureBody to MVVM and moving it to shared components
* Added unit test for DecryptionFailureBodyViewModel
* Removing the dependency to matrix.js-sdk from the shared component
* Kepp class mx_EventTile_content for tile layout
* Required changes after rebase
* Updates after PR review requests
* Clean up unused translation tags in element-web
* Added missing unit tests to improve coverage
* Additional unit tests to improve test coverage
* Removing obsolete tests from the snap
* Only listen to verification state changes in the wrapper components and also limit the view model to only allow updates in verification state.
* Updates after review requests
* Updated and added missing playwright snapshots
* Bettter structure on view model
---------
Co-authored-by: Florian Duros <florianduros@element.io>
Co-authored-by: Zack <zazi21@student.bth.se>
* Setting up structure for the init refactoring of ReactionsRowButtonTooltip
* implemented example to follow for refactoring to MVVM
* Refactoring of ReactionsRowButtonTooltipView
* updated reactionrowbutton to use our new viewmodel and removed unessecery comments
* Updated children from reactnode to propswithchildren
* removal of children on the vm have it as a props
* implemented constructor into reactionrowbutton to use vm to viewmodel
* Removal of old component
* Added ViewModel Tests for new viewmodel
* Fix issues after merging develop
* Updated import placement for eslint failure CI
* Add tests for ReactionsRowButton ViewModel integration and click handlers to pass coverage
* Added more tests to cover all conditions
* Pass MatrixClient as prop instead of using global; replace expect(true).toBe(true) with not.toThrow()
* Added new snapshot to reflect modifications on tests
* Update images to fit the CI tests
* Optimize reactions tooltip viewmodel updates
* Removal of module.css for reactionbuttontooltip, we dont need it since we dont use any css
* Fixed snapshots to show the tooltip by introducing a boolean to set open to true in Storybook.
* Update snapshots
---------
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
* Extract SasEmoji to shared-components
and improve responsive layout
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Add baseline screenshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update tests
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix e2e test
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Add SasEmoji snapshot test
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Add figma link
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Improve doc
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Add new dir to crypto-web-reviewers codeowners as per ask
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Create WidgetContextMenu component in shared-components
* Modify WidgetMenuContext call (apptile, extensioncard, widgetcard), test and stories
* Correctly use new widgetcontextmenu component
* WidgetContextMenuViewModel unit test
* Lint and add comments
* Finalize widgetcontextmenuviewmodel test
* fix lint errors
* Fix test error
* Update playwright screenshots
* add userWidget in widgetcontexstmenu props
* Fix some a11y issues on playwright
* fix linter error widget card
* Use new i18n way for share component widget context menu
* Add i18n context provider for widget context menu
* chore: lint and update snapshot widgetcontextmenu
* Extract and move timestamp function
* Use new function in BaseRecencySorter
* Remove deprecated method usage
* Add jsdoc
* Avoid unnecessary exports
* Fix tests
* Show an icon in the room header for shared history
Add a decoration to the header for encrypted rooms with `history_visibility:
{shared|public}`.
Fixes: #31858
* Gate "shared history icon" behind labs flag
... since history isn't actually shared unless the flag is on
* Update snapshots
* update screenshot
* update screenshots, again
* exclude RRs from screenshot test
* Revert "Update algorithm for history visible banner. (#31577)"
This reverts commit ce9c66ba4c.
* Revert "Update prop type & documentation for HistoryVisibleBanner and VM. (#31545)"
This reverts commit 4da149e56f.
* Revert "Prevent history visible banner from displaying in threads. (#31535)"
This reverts commit c7134e8532.
* Revert "Implement UI for history visibility acknowledgement. (#31156)"
This reverts commit cff9119324.
It was not working for languages like de_DE which were normalised to de in one codepath but not the other
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* fix export
* Don't allow duplicate toasts.
* fix imports
* fix
* fix rel_type to be m.reference in tests
* Fix case where redactions were not longer checked.
* Ensure toastkey is calculated by the room call_id
* Ensure we fetch the call event if it does not exist locally.
* cleanup / reduce code complexity
* Add docs
* Add comment
* merge condition
* Fix ability to send rageshake during session restore failure
This fixes the specific edge case but also hardens the codepath to limit the effect of other similar edges popping up
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Improve coverage
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Improve coverage
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove babel
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove duplicated patch-package dep
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to @fetch-mock/vitest
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update tests to import & call vitest functions
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update test-utils imports
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update unit test snapshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from jest->vitest for unit tests
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update visual test screenshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from test-runner->vitest for visual tests
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update README
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update CI for shared-components unit & visual tests
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update yarn.lock
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update README
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix storybook trying to import vitest
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix css modules leaking between storybook tests
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Tweak screenshot update script to accept args
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix mis-alignment of `Threads` right panel title
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update screenshot
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Extract base recency sorter class
* Create unread sorter
* Write test
* Use new sorter in RLS
* Fix incorrect sort type
* Replace with a better comment
* Fall back to RecencySorter instead of throwing error
* Upgrade matrix-widget-api to 0.16.1
* Allow Element Call widgets to receive sticky events
In an upcoming version of Element Call, the call widget will be able to operate in an experimental ‘Matrix 2.0’ mode in which MatrixRTC memberships are sent as sticky events. We already auto-approve the capability for this widget to send sticky events, but we recently decided there should be a capability for receiving them as well and need to auto-approve that too.
* Fix compound.css - it is not pcss
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Improve types in shared-components storybook
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update i18n:sort script and remove patch-package
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendered svg for Field select decoration instead of SVG mask
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace warning.svg with Compound icon
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace device kind icons with Compound
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Draw notification badge decoration using SVG rather than CSS masks
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace {collapse,expand}-message icons with Compound
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove stale icon prefetch
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Render icons in AddExistingToSpaceDialog using SVGs rather than CSS masks
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Render icons in Jitsi landing page using SVGs rather than CSS masks
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Delint
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update snapshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update screenshot
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix field label
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update snapshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Add tests
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Revert icon colour
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering icons as SVG over CSS masks in PollOption
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering icons as SVG over CSS masks in AnalyticsLearnMoreDialog
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove unused class
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering icons as SVG over CSS masks in customisedCancelButton mixin
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering icons as SVG over CSS masks in ThreadSummaryIcon mixin
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering icons as SVG over CSS masks in LegacyCallButton mixin
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove unused classes in TabbedView
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* delint
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* delint
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update snapshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix `[Object object]`
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix layout issue
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Improve coverage
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Use typescript for vite config
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch shared-components to ESM
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove stale aliases
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove reference to element-web files from shared-components
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove spurious node polyfill
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
Fixed button color to inherit in following scenarios:
* RoomList now rooms follow room text compound color
* PinnedMessageBanner follow room text compound color
* RoomHeader follow room text compound color
Signed-off-by: Örnfeldt Philip (66140321) <philip.ornfeldt@forsakringskassan.se>
* chore: ignore jest-sonar.xml in gitconfig
* chore: add missing rtl types to shared component
* chore: add `symbol` to `Disposables.trackListener`
* feat: add room list header view to shared components
* fix: change `Space Settings` to `Space settings`
* feat: add room list header view model
* chore: remove old room list header
* chore: update i18n
* test: fix Room-test
* test: update playwright screenshot
* fix: remove extra margin at the top of Sort title in room options
* test: fix room status bar test
* fix: change for correct copyright
* refactor: use `Disposables#track` instead of manually disposing the listener
* refactor: avoid to recompute all the snapshot of `RoomListHeaderViewModel`
* wip
* fix: make header buttons the same size than figma
* test: update shared component snapshots
* test: update shared component screenshots
* test: update EW screenshots
* Update dependency await-lock to v3
* Change moduleResolution
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Make jest happier
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Patch await-lock to make jest happy
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Patch @vector-im/matrix-wysiwyg
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendered svg for Field select decoration instead of SVG mask
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace warning.svg with Compound icon
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace device kind icons with Compound
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Draw notification badge decoration using SVG rather than CSS masks
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace {collapse,expand}-message icons with Compound
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove stale icon prefetch
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Render icons in AddExistingToSpaceDialog using SVGs rather than CSS masks
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Render icons in Jitsi landing page using SVGs rather than CSS masks
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Delint
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update snapshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update screenshot
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix field label
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update snapshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Add tests
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Revert icon colour
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix avatar decorations in thread activity centre not being atop avatar
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Delint
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update snapshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Minor corrections shared-components-README.md
a few minor edits and clarifications
* Wrap lines at 80 characters
Mostly, this means that diff comments on PRs work better.
* Update packages/shared-components/README.md
* Apply suggestion from @richvdh
* Factor out E2ePadlock to its own file
* Show "Bob shared this message" on messages shared via MSC4268
If we received the keys for a given message from another user, indicate that in
the timeline, rather than just saying "authenticity not guaranteed"
* Apply suggestions from code review
Co-authored-by: Florian Duros <florianduros@element.io>
* Address review comments
* Move E2ePadlock to shared-components
* update snapshots
* Revert "update snapshots"
This reverts commit 751e31f9db901fda085143c98e5dffa3d2b4c099.
* Revert "Move E2ePadlock to shared-components"
This reverts commit 172ef9f70ab26fd36b0ac854379cfd3371d22c18.
---------
Co-authored-by: Florian Duros <florianduros@element.io>
* Switch to Compound icons to replace old icons
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Apply same treatment to missed icons
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update snapshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove duplicated icon
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update icon
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update snapshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from css masks to rendering svg in ImageView
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from css masks to rendering svg in ExtensionsCard
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from css masks to rendering svg in LegacyRoomListHeader
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from css masks to rendering svg in ImageSizePanel
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from css masks to rendering svg in LegacyRoomList
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove icon from CreateSecretStorageDialog title
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from css masks to rendering svg in LiveContentSummary
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from css masks to rendering svg in RoomCallBanner
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from css masks to rendering svg in NonUrgentEchoFailureToast
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from css masks to rendering svg in LegacyCallViewHeader
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from css masks to rendering svg in CallEvent
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Delint
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update screenshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace dark-light-mode.svg with Compound
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Draw stop icon using svg rather than square mask
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace masks in RoomSublist with SVG icons
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace masks with SVG icons in LegacyCall views
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace masks with SVG icons in EventTile
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace masks with SVG icons in ForwardDialog
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove redundant css style
The `::before` has no content so is never rendered
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* delint
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update tests
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update playwright tests & screenshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update snapshot
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove snapshot as it causes issues
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Delint
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* More tests
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
So that localazy_download.yaml sorts & lints both
This will be cleaner in a proper monorepo where the root package.json isn't its own project
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to Compound icons to replace old icons
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Apply same treatment to missed icons
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update snapshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove duplicated icon
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update icon
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update snapshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from css masks to rendering svg in ImageView
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from css masks to rendering svg in ExtensionsCard
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from css masks to rendering svg in LegacyRoomListHeader
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from css masks to rendering svg in ImageSizePanel
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from css masks to rendering svg in LegacyRoomList
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove icon from CreateSecretStorageDialog title
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from css masks to rendering svg in LiveContentSummary
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from css masks to rendering svg in RoomCallBanner
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from css masks to rendering svg in NonUrgentEchoFailureToast
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from css masks to rendering svg in LegacyCallViewHeader
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from css masks to rendering svg in CallEvent
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Delint
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update screenshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix error shown if accepting a 3pid invite
If no matrix ID was bound to the email address, the code would
just throw an exception and display a very generic error.
* Unused import
* I hate you too, yarn.
* i18n
* Add test
* Remove tests which assert feature_oidc_native_flow=false behaviour, that setting is long gone
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Upgrade fetch-mock-jest to @fetch-mock/jest
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update yarn.lock
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Make knip happy
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Disable broken tests
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix shared-components tests
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Snapshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Support for stable MSC4191 account management action parameter
* Pass accountManagementActionsSupported around and refactor name
* Iterate
* Iterate
* Attempt to improve clarity of action fallback
* Use name "actions supported" consistently
* Update test cases for revised default behaviour
* fixup type
* Validate Element Call foci config
* revert changes
* Split out logic to CallStore so we don't repeat checks.
* Refactor to use CallStore so we only fetch once.
* Add test for useRoomCall
* lint
* Ensure we enable MatrixRTC when configuring element call.
* fix test
* Update @element-hq/element-web-playwright-common to 2.2.2 and enable matrix rtc
* lint
* Ensure call is configured for header test
* type
* Improve coverage
* Update based on feedback
* fix type
* Switch to Compound icons to replace old icons
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Apply same treatment to missed icons
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update snapshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove duplicated icon
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update icon
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update snapshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix emoji font in emoji picker header buttons
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update screnshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace icons with Compound alternatives
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove unused icon
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace more icons with Compound alternatives
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Swap for outline icons in spotlight & update screenshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch emoji picker to use emoji for header icons
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update screenshot
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update football emoji
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from svg masks to svg rendering in ExtensionsCard
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from svg masks to svg rendering in BaseCard
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from svg masks to svg rendering in EmojiPicker
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from svg masks to svg rendering in Spotlight
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update snapshot
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update screenshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Tweak emoji and fix disabled state
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from svg masks to svg rendering in HomePage
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from svg masks to svg rendering in DecoratedRoomAvatar
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from svg masks to svg rendering in SpaceRoomView
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from svg masks to svg rendering in DialPadBackspaceButton
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from svg masks to svg rendering in NewRoomIntro
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from svg masks to svg rendering in SpaceCreateMenu
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from svg masks to svg rendering in InlineTermsAgreement
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from svg masks to svg rendering in PollCreateDialog
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from svg masks to svg rendering in ServerPicker
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Revert size change
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Delint
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update snapshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace icons with Compound alternatives
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove unused icon
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace more icons with Compound alternatives
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Swap for outline icons in spotlight & update screenshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch emoji picker to use emoji for header icons
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update screenshot
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update football emoji
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from svg masks to svg rendering in ExtensionsCard
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from svg masks to svg rendering in BaseCard
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from svg masks to svg rendering in EmojiPicker
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch from svg masks to svg rendering in Spotlight
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update snapshot
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update screenshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Tweak emoji and fix disabled state
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Revert size change
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Delint
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Add test
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update dependency matrix-web-i18n to v3.5.0
* Update matrix-web-i18n
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update matrix-web-i18n in shared-components too
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* matrix-web-i18n is now ESM
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove extra encryption strings
Found their way in during the i18n changes
* Remove log level silent
to try & work out why it only fails on CI
* Try giving it its own prettierrc
so the import is correct
* Comment why it needs its own prettierrc & put log level silent back
* Comment the right .prettierrc
* Split translations between EW and shared components
Uses update module API with global TranslationKey type that can be
overridden.
WIP.
* Removed the wrong script (for now)
* Add the type files
* Add shared components i18n file
* More i18n strings
* Add i18n check for shared conmponents
* Needs a different name
* rerun i18n for merge from develop, fix test
* Move translated strings to shared components file
NB. there are lots of removed strings for a few languages where we
seem to have hit a localazy bug or something where the key/value
for plurals got switched, making the translations invalid. They've
been missing for a while so I'm removing them rather than trying to
restore them,
* Add shared components files to localazy
* Merge element web & shared component translations
for the built app
* Use right translations for shared component tests
and fix missign en_EN strings
* Pull shared components translations too
* Fix/disable warnings
* We can now remove the build:res call
...right? (right?)
* Remove webpack import for languages index
..and just load it using a relative path which we do for the individual
language files and also did anyway for the index because even in non-test
it was an object, not a string, so we always usesd the 'test' code path.
* Make the storybook language selector work
...without referring to the parent app's files
* Revert unnecessary yarn lock change
* Typo
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
* Add comment on why we use merge
* Fix localazy download config
to actually put the translations in the right place
* Better typescript syntax
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
* Watch both translations files
---------
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace icons with Compound alternatives
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove unused icon
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace more icons with Compound alternatives
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Swap for outline icons in spotlight & update screenshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch emoji picker to use emoji for header icons
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update screenshot
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update football emoji
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Tweak emoji and fix disabled state
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace icons with Compound alternatives
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove unused icon
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace more icons with Compound alternatives
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Swap for outline icons in spotlight & update screenshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update screenshot
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
2026-01-06 13:55:04 +00:00
1339 changed files with 72464 additions and 41889 deletions
- [ ] I have read through [review guidelines](../docs/review.md) and [CONTRIBUTING.md](../CONTRIBUTING.md).
- [ ] I have read through [review guidelines](https://github.com/element-hq/element-web/blob/develop/docs/review.md) and [CONTRIBUTING.md](https://github.com/element-hq/element-web/blob/develop/CONTRIBUTING.md).
- [ ] Tests written for new code (and old code if feasible).
- [ ] New or updated `public`/`exported` symbols have accurate [TSDoc](https://tsdoc.org/) documentation.
* Remove UIFeature.BulkUnverifiedSessionsReminder setting ([#31943](https://github.com/element-hq/element-web/pull/31943)). Contributed by @andybalaam.
* Remove unused function to auto-rageshake when key backup is not set up ([#31942](https://github.com/element-hq/element-web/pull/31942)). Contributed by @andybalaam.
## ✨ Features
* Room list: update the visuals in order to have better contrast ([#32421](https://github.com/element-hq/element-web/pull/32421)). Contributed by @florianduros.
* Set history visibility to "invited" for DMs and new non-public rooms when creating a room ([#31974](https://github.com/element-hq/element-web/pull/31974)). Contributed by @langleyd.
* Remove server acl status/summaries from timeline ([#32461](https://github.com/element-hq/element-web/pull/32461)). Contributed by @langleyd.
* Update `globalBlacklistUnverifiedDevices` on setting change ([#31983](https://github.com/element-hq/element-web/pull/31983)). Contributed by @kaylendog.
* Add badge for history visibiltity to room info panel ([#31927](https://github.com/element-hq/element-web/pull/31927)). Contributed by @richvdh.
## 🐛 Bug Fixes
* Default useOnlyCurrentProfiles to true ([#32524](https://github.com/element-hq/element-web/pull/32524)). Contributed by @dbkr.
* Keep custom theme active after reload ([#32506](https://github.com/element-hq/element-web/pull/32506)). Contributed by @florianduros.
* Update font format from 'ttf' to 'truetype' ([#32493](https://github.com/element-hq/element-web/pull/32493)). Contributed by @all-yall.
* Fix videos on Firefox ([#32497](https://github.com/element-hq/element-web/pull/32497)). Contributed by @p1gp1g.
* Use a dedicated FAQ/help entry for key storage. ([#32480](https://github.com/element-hq/element-web/pull/32480)). Contributed by @mxandreas.
* Avoid showing two chat timelines side by side after a call ([#32484](https://github.com/element-hq/element-web/pull/32484)). Contributed by @robintown.
* Update screenshot for reactive display name disambiguation ([#32431](https://github.com/element-hq/element-web/pull/32431)). Contributed by @aditya-cherukuru.
* Fix Status Bar being unreadable when the user overrides the default OS light/dark theme. ([#32442](https://github.com/element-hq/element-web/pull/32442)). Contributed by @Half-Shot.
* fix: Remove state\_key: null from Seshat search results ([#31524](https://github.com/element-hq/element-web/pull/31524)). Contributed by @shinaoka.
* Fix user pill deserialisation ([#31947](https://github.com/element-hq/element-web/pull/31947)). Contributed by @t3chguy.
Changes in [1.12.10](https://github.com/element-hq/element-web/releases/tag/v1.12.10) (2026-02-10)
* Support additional\_creators in /upgraderoom (MSC4289) ([#31934](https://github.com/element-hq/element-web/pull/31934)). Contributed by @andybalaam.
* Update room header icon for world\_readable rooms ([#31915](https://github.com/element-hq/element-web/pull/31915)). Contributed by @richvdh.
* Show an icon in the room header for shared history ([#31879](https://github.com/element-hq/element-web/pull/31879)). Contributed by @richvdh.
* Remove "history may be shared" banner. ([#31881](https://github.com/element-hq/element-web/pull/31881)). Contributed by @kaylendog.
* Allow dismissing 'Key storage out of sync' temporarily ([#31455](https://github.com/element-hq/element-web/pull/31455)). Contributed by @andybalaam.
* Add `resolutions` entry for `matrix-widget-api` to package.json ([#31851](https://github.com/element-hq/element-web/pull/31851)). Contributed by @toger5.
* Improve visibility under contrast control mode ([#31847](https://github.com/element-hq/element-web/pull/31847)). Contributed by @t3chguy.
* Unread Sorting - Add option for sorting in `OptionsMenuView` ([#31754](https://github.com/element-hq/element-web/pull/31754)). Contributed by @MidhunSureshR.
* Unread sorting - Implement sorter and use it in the room list store ([#31723](https://github.com/element-hq/element-web/pull/31723)). Contributed by @MidhunSureshR.
* Allow Element Call widgets to receive sticky events ([#31843](https://github.com/element-hq/element-web/pull/31843)). Contributed by @robintown.
* Improve icon rendering accessibility ([#31791](https://github.com/element-hq/element-web/pull/31791)). Contributed by @t3chguy.
* Add message preview toggle to room list header option ([#31821](https://github.com/element-hq/element-web/pull/31821)). Contributed by @florianduros.
## 🐛 Bug Fixes
* [Backport staging] Fix room list not being cleared ([#32438](https://github.com/element-hq/element-web/pull/32438)). Contributed by @RiotRobot.
* Fix failure to update room info panel on joinrule change ([#31938](https://github.com/element-hq/element-web/pull/31938)). Contributed by @richvdh.
* Throttle space notification state calculation ([#31922](https://github.com/element-hq/element-web/pull/31922)). Contributed by @dbkr.
* Fix emoji verification responsive layout ([#31899](https://github.com/element-hq/element-web/pull/31899)). Contributed by @t3chguy.
* Add patch for linkify to fix doctype handling ([#31900](https://github.com/element-hq/element-web/pull/31900)). Contributed by @dbkr.
* Fix rooms with no messages appearing at the top of the room list ([#31798](https://github.com/element-hq/element-web/pull/31798)). Contributed by @MidhunSureshR.
* Fix room list menu flashes when menu is closed ([#31868](https://github.com/element-hq/element-web/pull/31868)). Contributed by @florianduros.
* Message preview toggle is inverted in room list header ([#31865](https://github.com/element-hq/element-web/pull/31865)). Contributed by @florianduros.
* Fix duplicate toasts appearing for the same call if two events appear. ([#31693](https://github.com/element-hq/element-web/pull/31693)). Contributed by @Half-Shot.
* Fix ability to send rageshake during session restore failure ([#31848](https://github.com/element-hq/element-web/pull/31848)). Contributed by @t3chguy.
* Fix mis-alignment of `Threads` right panel title ([#31849](https://github.com/element-hq/element-web/pull/31849)). Contributed by @t3chguy.
* Unset buttons does not include color inherit ([#31801](https://github.com/element-hq/element-web/pull/31801)). Contributed by @Philldomd.
Changes in [1.12.9](https://github.com/element-hq/element-web/releases/tag/v1.12.9) (2026-01-27)
* Allow local log downloads when a rageshake URL is not configured. ([#31716](https://github.com/element-hq/element-web/pull/31716)). Contributed by @Half-Shot.
* Improve icon rendering accessibility ([#31776](https://github.com/element-hq/element-web/pull/31776)). Contributed by @t3chguy.
* Show "Bob shared this message" on messages shared via MSC4268 ([#31684](https://github.com/element-hq/element-web/pull/31684)). Contributed by @richvdh.
* Update the way we render icons for accessibility ([#31731](https://github.com/element-hq/element-web/pull/31731)). Contributed by @t3chguy.
* Switch from css masks to rendering svg ([#31681](https://github.com/element-hq/element-web/pull/31681)). Contributed by @t3chguy.
* Support for stable MSC4191 account management action parameter ([#31701](https://github.com/element-hq/element-web/pull/31701)). Contributed by @hughns.
* Support for stable m.oauth UIA stage from MSC4312 ([#31704](https://github.com/element-hq/element-web/pull/31704)). Contributed by @hughns.
* Switch to Compound icons to replace old icons ([#31667](https://github.com/element-hq/element-web/pull/31667)). Contributed by @t3chguy.
* Switch from svg masks to svg rendering in more places ([#31652](https://github.com/element-hq/element-web/pull/31652)). Contributed by @t3chguy.
* Switch from svg masks to svg rendering in more places ([#31650](https://github.com/element-hq/element-web/pull/31650)). Contributed by @t3chguy.
* Update notification icons using Compound icons ([#31671](https://github.com/element-hq/element-web/pull/31671)). Contributed by @t3chguy.
* Memoise ListView context ([#31668](https://github.com/element-hq/element-web/pull/31668)). Contributed by @t3chguy.
* Switch emoji picker to use emoji for header icons ([#31645](https://github.com/element-hq/element-web/pull/31645)). Contributed by @t3chguy.
* Replace icons with Compound alternatives ([#31642](https://github.com/element-hq/element-web/pull/31642)). Contributed by @t3chguy.
## 🐛 Bug Fixes
* Fix avatar decorations in thread activity centre not being atop avatar ([#31789](https://github.com/element-hq/element-web/pull/31789)). Contributed by @t3chguy.
* Fix room settings roles tab getting confused if power level change fails ([#31768](https://github.com/element-hq/element-web/pull/31768)). Contributed by @t3chguy.
* Custom themes now import highlights in css ([#31758](https://github.com/element-hq/element-web/pull/31758)). Contributed by @Philldomd.
* Use correct translation for url preview settings ([#31740](https://github.com/element-hq/element-web/pull/31740)). Contributed by @florianduros.
* Fix error shown if accepting a 3pid invite ([#31735](https://github.com/element-hq/element-web/pull/31735)). Contributed by @dbkr.
* Ensure correct focus configuration for Element Call before allowing users to call. ([#31490](https://github.com/element-hq/element-web/pull/31490)). Contributed by @Half-Shot.
* Fix emoji font in emoji picker header buttons ([#31679](https://github.com/element-hq/element-web/pull/31679)). Contributed by @t3chguy.
* fix flaky test by waiting for chat panel before counting messages ([#31633](https://github.com/element-hq/element-web/pull/31633)). Contributed by @BillCarsonFr.
Changes in [1.12.8](https://github.com/element-hq/element-web/releases/tag/v1.12.8) (2026-01-13)
@@ -184,6 +184,16 @@ Please ensure your changes match the cosmetic style of the existing project,
and **_never_** mix cosmetic and functional changes in the same commit, as it
makes it horribly hard to review otherwise.
## Shared Components
When creating new UI components, consider whether they should be added to the shared components package (`packages/shared-components`) rather than directly in the main `src/` directory. Components should be placed in shared components if they:
- Are reusable across different parts of the application
- Could potentially be used by other Element projects (Element Desktop, Aurora, Element modules...)
- Follow established patterns and don't have tight coupling to specific application logic
For more details, see the [shared components README](./packages/shared-components/README.md).
## Attribution
Everyone who contributes anything to Matrix is welcome to be listed in the
@@ -116,14 +116,14 @@ instead of adding that last line.
Element is a modular webapp built with modern ES6 and uses a Node.js build system.
Ensure you have the latest LTS version of Node.js installed.
Using `yarn` instead of `npm` is recommended. Please see the Yarn [install
guide](https://classic.yarnpkg.com/en/docs/install) if you do not have it already.
Using `pnpm` instead of `npm` is recommended. Please see the pnpm [install
guide](https://pnpm.io/installation#using-corepack) if you do not have it already.
1. Install or update `node.js` so that your `node` is at least the current recommended LTS.
1. Install `yarn` if not present already.
1. Install `pnpm` if not present already.
1. Clone the repo: `git clone https://github.com/element-hq/element-web.git`.
1. Switch to the element-web directory: `cd element-web`.
1. Install the prerequisites: `yarn install`.
1. Install the prerequisites: `pnpm install`.
- If you're using the `develop` branch, then it is recommended to set up a
proper development environment (see [Setting up a dev
environment](./developer_guide.md#setting-up-a-dev-environment) below). Alternatively, you
@@ -131,11 +131,11 @@ guide](https://classic.yarnpkg.com/en/docs/install) if you do not have it alread
the develop branch.
1. Configure the app by copying `config.sample.json` to `config.json` and
modifying it. See the [configuration docs](docs/config.md) for details.
1.`yarn dist` to build a tarball to deploy. Untaring this file will give
1.`pnpm dist` to build a tarball to deploy. Untaring this file will give
a version-specific directory containing all the files that need to go on your
web server.
Note that `yarn dist` is not supported on Windows, so Windows users can run `yarn build`,
Note that `pnpm dist` is not supported on Windows, so Windows users can run `pnpm build`,
which will build all the necessary files into the `webapp` directory. The version of Element
will not appear in Settings without using the dist script. You can then mount the
`webapp` directory on your web server to actually serve up the app, which is
@@ -194,6 +194,17 @@ To add a new translation, head to the [translating doc](docs/translating.md).
For a developer guide, see the [translating dev doc](docs/translating-dev.md).
# Extending Element Web with Modules
Element Web supports a module system that allows you to extend or modify functionality at runtime. Modules are loaded dynamically and provide a safe, predictable API for customization.
## What are modules?
Modules are extensions that can add or modify Element Web's functionality. They are:
- Built using the [`@element-hq/element-web-module-api`](https://github.com/element-hq/element-modules/tree/main/packages/element-web-module-api)
- Loaded in EW via [config.json](docs/config.md#modules)
# Triaging issues
Issues are triaged by community members and the Web App Team, following the [triage process](https://github.com/element-hq/element-meta/wiki/Triage-process).
@@ -214,3 +225,6 @@ This software is multi licensed by New Vector Ltd (Element). It can be used eith
(3) under the terms of a paid-for Element Commercial License agreement between you and Element (the terms of which may vary depending on what you and Element have agreed to).
Unless required by applicable law or agreed to in writing, software distributed under the Licenses is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the Licenses for the specific language governing permissions and limitations under the Licenses.
Please contact [licensing@element.io](mailto:licensing@element.io) to purchase
@@ -272,20 +272,44 @@ Inheriting all the rules of TypeScript, the following additionally apply:
18. Components should serve a single, or near-single, purpose.
19. Prefer to derive information from component properties rather than establish state.
20. Do not use `React.Component::forceUpdate`.
21. Prefer to use [compound typography components](https://compound.element.io/?path=/docs/compound-web_typography--docs) instead of raw HTML elements for text. This ensures consistent font usage and letter spacing across the app.
22. If you can't use 21, don't forget to apply the correct CSS classes for font and letter spacing.
23. Prefer to use `Flex` or `Box` components from shared-components for layout instead of raw HTML elements with CSS flexbox styles.
## Stylesheets (\*.pcss = PostCSS + Plugins)
## Stylesheets
Note: We use PostCSS + some plugins to process our styles. It looks like SCSS, but actually it is not.
1. Keep indentation/nesting to a minimum. Maximum suggested nesting is 5 layers.
2. Components should render only within the bounding box of their outermost DOM element. Page-absolute positioning and negative CSS margins and similar are generally not cool and stop the component from being reused easily in different places.
1. The view's CSS file MUST have the same name as the component (e.g. `view/rooms/_MessageTile.css` for `MessageTile.tsx` component).
### PostCSS (\*.pcss = PostCSS + Plugins)
> [!NOTE]
> We use PostCSS + some plugins to process our styles. It looks like SCSS, but actually it is not.
**PostCSS should be use when working in the main Element Web codebase (not shared-components).**
#### Naming and file structure
1. The view's CSS file MUST have the same name as the component (e.g. `res/css/components/views/rooms/_RoomTile.pcss` for `RoomTile.tsx` component).
2. Per-view CSS is optional - it could choose to inherit all its styling from the context of the rest of the app, although this is unusual.
3. Class names must be prefixed with "mx\_".
3. Class names must be prefixed with `mx_`.
4. Class names must strictly denote the component which defines them.
For example: `mx_MyFoo` for `MyFoo` component.
5. Class names for DOM elements within a view which aren't components are named by appending a lower camel case identifier to the view's class name - e.g. .mx_MyFoo_randomDiv is how you'd name the class of an arbitrary div within the MyFoo view.
6. Use the `$font` variables instead of manual values.
7. Keep indentation/nesting to a minimum. Maximum suggested nesting is 5 layers.
8. Use the whole class name instead of shortcuts:
5. Class names for DOM elements within a view which aren't components are named by appending a lower camel case identifier to the view's class name.
For example: `.mx_MyFoo_randomDiv` is how you'd name the class of an arbitrary div within the MyFoo view.
#### Variables
6. Use the `$font-*` variables instead of manual font-size values (e.g., `$font-12px`, `$font-15px`).
- Note: These are deprecated. Prefer Compound typography tokens like `var(--cpd-font-body-md-regular)` for new code.
7. Use theme color variables like `$primary-content`, `$secondary-content`, `$accent`, `$alert` for colors.
- Prefer Compound color tokens like `var(--cpd-color-text-primary)` for new code.
8. Use spacing variables like `$spacing-8`, `$spacing-12`, `$spacing-16` where available.
- Prefer Compound spacing tokens like `var(--cpd-space-2x)` for new code.
#### Syntax and formatting
10. Use the whole class name instead of shortcuts:
```scss
.mx_MyFoo {
@@ -296,7 +320,7 @@ Note: We use PostCSS + some plugins to process our styles. It looks like SCSS, b
}
```
9. Break multiple selectors over multiple lines this way:
11. Break multiple selectors over multiple lines this way:
```scss
.mx_MyFoo,
@@ -306,8 +330,7 @@ Note: We use PostCSS + some plugins to process our styles. It looks like SCSS, b
}
```
10. Non-shared variables should use $lowerCamelCase. Shared variables use $dashed-naming.
11. Overrides to Z indexes, adjustments of dimensions/padding with pixels, and so on should all be
12. Overrides to Z indexes, adjustments of dimensions/padding with pixels, and so on should all be
[documented](#comments) for what the values mean:
```scss
@@ -318,9 +341,81 @@ Note: We use PostCSS + some plugins to process our styles. It looks like SCSS, b
}
```
12. Avoid the use of `!important`. If `!important` is necessary, add a [comment](#comments) explaining why.
13. The CSS for a component can override the rules for child components. For instance, .mxRoomList .mx_RoomTile {} would be the selector to override styles of RoomTiles when viewed in the context of a RoomList view. Overrides must be scoped to the View's CSS class - i.e. don't just define .mx_RoomTile {} in RoomList.css - only RoomTile.css is allowed to define its own CSS. Instead, say .mx_RoomList .mx_RoomTile {} to scope the override only to the context of RoomList views. N.B. overrides should be relatively rare as in general CSS inheritance should be enough.
14. Components should render only within the bounding box of their outermost DOM element. Page-absolute positioning and negative CSS margins and similar are generally not cool and stop the component from being reused easily in different places.
13. Avoid the use of `!important`. If `!important` is necessary, add a [comment](#comments) explaining why.
#### Component overrides
14. The CSS for a component can override the rules for child components. For instance, `.mx_RoomList .mx_RoomTile {}` would be the selector to override styles of RoomTiles when viewed in the context of a RoomList view. Overrides must be scoped to the View's CSS class - i.e. don't just define `.mx_RoomTile {}` in RoomList.pcss - only RoomTile.pcss is allowed to define its own CSS. Instead, say `.mx_RoomList .mx_RoomTile {}` to scope the override only to the context of RoomList views. N.B. overrides should be relatively rare as in general CSS inheritance should be enough.
### CSS module (\*.module.css)
**CSS modules provide locally-scoped class names and are the preferred approach for new shared components.**
#### Naming and file structure
1. The CSS module file MUST have the same name as the component with `.module.css` extension.
For example: `PlayPauseButton.module.css` for `PlayPauseButton.tsx`.
2. Place the CSS module file in the same directory as the component.
3. Class names should be semantic and describe their purpose, NOT prefixed with `mx_`.
For example: `.button`, `.label`, `.content`, `.title`.
4. Use camelCase for multi-word class names: `.playButton`, `.primaryAction`, `.errorMessage`.
@@ -8,7 +8,13 @@ General description of the pattern can be found [here](https://en.wikipedia.org/
If you do MVVM right, your view should be dumb i.e it gets data from the view model and merely displays it.
### Practical guidelines for MVVM in element-web
## Why are we using MVVM?
1. MVVM forces a separation of concern i.e we will no longer have large react components that have a lot of state and rendering code mixed together. This improves code readability and makes it easier to introduce changes.
2. Introduces the possibility of code reuse. You can reuse an old view model with a new view or vice versa.
3. Adding to the point above, in future you could import element-web view models to your project and supply your own views thus creating something similar to the [hydrogen sdk](https://github.com/element-hq/hydrogen-web/blob/master/doc/SDK.md).
## Practical guidelines for MVVM in element-web
A first documentation and implementation of MVVM was done in [MVVM-v1.md](MVVM-v1.md). This v1 version is now deprecated and this document describes the current implementation.
@@ -19,71 +25,247 @@ This is anywhere your data or business logic comes from. If your view model is a
#### View
1. Located in [`shared-components`](https://github.com/element-hq/element-web/tree/develop/packages/shared-components). Develop it in storybook!
2. Views are simple react components (eg: `FooView`).
3. Views use [useSyncExternalStore](https://react.dev/reference/react/useSyncExternalStore) internally where the view model is the external store.
4. Views should define the interface of the view model they expect:
```tsx
// Snapshot is the return type of your view model
interface FooViewSnapshot {
value: string;
}
// To call function on the view model
interface FooViewActions {
doSomething: () => void;
}
// ViewModel is a type defining the methods needed for `useSyncExternalStore`
2. Views are simple react components (eg: `FooView`) with very little state and logic.
3. Views must call `useViewModel` hook with the corresponding view model passed in as argument. This allows the view to re-render when something has changed in the view model. This entire mechanism is powered by [useSyncExternalStore](https://react.dev/reference/react/useSyncExternalStore).
4. Views should define the interface of the view model (see example below).
5. Multiple views can share the same view model if necessary.
6. A full example is available [here](https://github.com/element-hq/element-web/blob/develop/packages/shared-components/src/audio/AudioPlayerView/AudioPlayerView.tsx)
**Example of view implementation**
```tsx
// Snapshot is the data that your view-model provides which is rendered by the view.
exportinterfaceFooViewSnapshot{
title: string;
description: string;
}
// To call function on the view model
interfaceFooViewActions{
setTitle:(title: string)=>void;
reloadDescription:()=>void;
}
// ViewModel is an object (usually a class) that implements both the interfaces listed above.
// useViewModel is a hook that subscribes to the view model and returns the snapshot. It also ensures that the component re-renders when the snapshot changes.
1. A View model is a class extending [`BaseViewModel`](https://github.com/element-hq/element-web/blob/develop/src/viewmodels/base/BaseViewModel.ts).
2. Implements the interface defined in the view (e.g `FooViewModel` in the example above).
3. View models define a snapshot type that defines the data the view will consume. The snapshot is immutable and can only be changed by calling `this.snapshot.set(...)` in the view model. This will trigger a re-render in the view.
3. View models define a snapshot type that defines the data the view will consume. The snapshot is immutable and can only be changed by calling `this.snapshot.set(...)` or `this.snapshot.merge(...)` in the view model. This will trigger a re-render in the view.
4. Call [`this.snapshot.merge(...)`](https://github.com/element-hq/element-web/blob/develop/packages/shared-components/src/viewmodel/Snapshot.ts#L32) to only update part of the snapshot.
5. Avoid recomputing the entire snapshot when you only need to update a single field. For performance reasons, only recompute the fields that have actually changed. For example, if only `title` has changed, call `this.snapshot.merge({ title: newTitle })` rather than rebuilding the full snapshot object with all fields recomputed.
6. View models can have props which are passed in the constructor. Props are usually used to pass in dependencies (eg: stores, sdk, etc) that the view model needs to do its work. They can also be used to pass in initial values for the snapshot.
// Props are the arguments passed to the view model constructor. They are usually used to pass in dependencies (eg: stores, sdk, etc) that the view model needs to do its work. They can also be used to pass in initial values for the snapshot.
interfaceProps{
title: string;
}
/**
* This is an example view model that implements the FooViewModelInterface.
* It extends the BaseViewModel class which provides common functionality for view models, such as managing subscriptions and snapshots.
* The view model is responsible for managing the state of the view and providing actions that can be called from the view.
* In this example, we have a title and description in the snapshot, and actions to set the title and reload the description.
* This is an example of how to access props in the view model. Props are passed in the constructor and can be accessed through `this.props`.
*/
publicprintProps():void{
// Access props through `this.props`
console.log("Current props:",this.props);
}
}
```
1. MVVM forces a separation of concern i.e we will no longer have large react components that have a lot of state and rendering code mixed together. This improves code readability and makes it easier to introduce changes.
2. Introduces the possibility of code reuse. You can reuse an old view model with a new view or vice versa.
3. Adding to the point above, in future you could import element-web view models to your project and supply your own views thus creating something similar to the [hydrogen sdk](https://github.com/element-hq/hydrogen-web/blob/master/doc/SDK.md).
#### Binding of View Model Actions:
All view model actions must be defined as arrow functions to ensure they are bound to the class instance.
Using standard class methods can result in `this` being undefined when the function is passed as a callback (e.g. to a React event handler), which may cause runtime errors.
Correct pattern:
```ts
publicdoSomething=():void=>{
...
};
```
### `useViewModel` hook
Your view must call this hook with the view-model as argument. Think of this as your view subscribing to the view model.<br>
This hook returns the snapshot from your view-model.
## Disposables and helper hooks
Disposables provide a mechanism for tracking and releases resources. This is necessary for avoiding memory leaks.
### Lifecycle of a view model
The lifecycle of a given view model is from its creation (usually through the constructor i.e `new FooViewModel(prop1, prop2)`) to the time the `dispose` method on it is called (eg: `fooViewModel.dispose()`). It is the responsibility of whoever creates the view model to call the dispose method when the view model is no longer necessary.
Disposable work by tracking anything that needs to be disposed of and then sequentially disposing them when `viewModel.dispose()` is called.
### How to use disposables
Consider the following scenarios:
#### Scenario 1: Your view model listens to some event on an event emitter <br>
In the example given below, how do you ensure that the listener on `props.emitter` is removed when the view model is disposed?
```ts
classFooViewModel...{
constructor(props: Props){
...
props.emitter.on("my-event",this.doSomething());
}
}
```
You can use disposables to remove the listener when the view-model is disposed:
#### Scenario 3: Tracking and disposing arbitrary resources <br>
A disposable is:
- a function
- an object with `dispose` method (like a view model)
You can therefore use disposables to track any resource that must be eventually relinquished, eg:
```ts
classCall{
....
publicendCall();
publicstopConnections();
}
classCallViewModel{
...
constructor(props: Props){
constcall=newCall();
// When the view model is disposed, the following call methods will be called
this.disposables.track(()=>{
call.endCall();
call.stopConnections();
});
}
}
```
### Disposing view models from non-MVVMed react components
While we eventually want all our UI code to use MVVM, the current reality is that most of the existing code is just normal react components. We follow a bottoms up approach when it comes to moving code over to MVVM i.e we deal with child components before dealing with parent components.
This means that you need to dispose child view models from the non-MVVMed parent component.
#### Class component:
Create the view model in `componentDidMount()` and dispose the view model in `componentWillUnmount()`:
@@ -56,7 +56,7 @@ Element Web E2E tests require an instance running on `http://localhost:8080` (co
You can either:
- **Run manually:** `yarn start` in a separate terminal (not working for screenshot tests running in a docker environment).
- **Run manually:** `pnpm start` in a separate terminal (not working for screenshot tests running in a docker environment).
- **Auto-start:** Playwright will start the webserver automatically if it's not already running
## Running the Tests
@@ -68,19 +68,19 @@ Our main Playwright tests run against a full Element Web instance with Synapse/D
**Run all E2E tests:**
```sh
yarn run test:playwright
pnpm run test:playwright
```
**Run a specific test file:**
```sh
yarn run test:playwright playwright/e2e/register/register.spec.ts
pnpm run test:playwright playwright/e2e/register/register.spec.ts
```
**Run tests interactively with Playwright UI:**
```sh
yarn run test:playwright:open
pnpm run test:playwright:open
```
**Run screenshot tests only:**
@@ -89,7 +89,7 @@ yarn run test:playwright:open
> This command run the playwright tests in a docker environment.
```sh
yarn run test:playwright:screenshots
pnpm run test:playwright:screenshots
```
For more information about visual testing, see [Visual Testing](playwright#visual-testing).
@@ -98,30 +98,7 @@ For more information about visual testing, see [Visual Testing](playwright#visua
### Shared Components Tests
The shared-components package uses Playwright (via Storybook test runner) to validate component rendering across different states and configurations.
**Run Storybook tests:**
```sh
cd packages/shared-components
yarn test:storybook
```
**Run Storybook tests in CI mode:**
```sh
cd packages/shared-components
yarn test:storybook:ci
```
**Update Storybook screenshots:**
```sh
cd packages/shared-components
yarn test:storybook:update
```
This uses the same Docker-based screenshot rendering as Element Web to ensure consistency across platforms.
See the [Shared Components README](../packages/shared-components/README.md#visual-regression-tests) for instructions on running the shared components Playwright tests.
The shared components use Storybook's test runner (powered by Playwright) to validate component rendering across different states and configurations.
### Homeserver Setup
Homeservers (Synapse or Dendrite) are launched by Playwright workers and reused for all tests matching the worker configuration.
@@ -417,7 +387,7 @@ This command runs only tests tagged with `@screenshot` in the Docker environment
When you need to update screenshot baselines (e.g., after intentional UI changes):
```sh
yarn run test:playwright:screenshots
pnpm run test:playwright:screenshots
```
**Important:** Always use this command to update screenshots rather than running tests locally with `--update-snapshots`.
@@ -477,10 +447,3 @@ export TMPDIR=/tmp/colima
# or
exportTMPDIR=$HOME/tmp
```
**macOS users:**
Docker Desktop and Colima are both well-supported on macOS.
> [!CAUTION]
> Do not set `DOCKER_HOST` when running tests. Element Web uses [element-web-playwright-common](https://github.com/element-hq/element-modules/tree/main/packages/element-web-playwright-common), and setting `DOCKER_HOST` causes issues with testcontainers when running in the container VM.
@@ -50,7 +50,7 @@ We are aiming for a set of common strings to be shared then some more localised
1. Check if the import `import { _t } from ".../languageHandler";` is present. If not add it to the other import statements. Also import `_td` if needed.
1. Add `_t()` to your string passing the translation key you come up with based on the rules above. If the string is introduced at a point before the translation system has not yet been initialized, use `_td()` instead, and call `_t()` at the appropriate time.
1. Run `yarn i18n` to add the keys to `src/i18n/strings/en_EN.json`
1. Run `pnpm i18n` to add the keys to `src/i18n/strings/en_EN.json`
1. Modify the new entries in `src/i18n/strings/en_EN.json` with the English (UK) translations for the added keys.
Set of Playwright utilities to make it easier to write tests for Element Web, Element Web Modules & Element Desktop.
# This is a partial clone of https://github.com/element-hq/element-modules/tree/main/packages/element-web-playwright-common
In the future the rest of the package will be brought into this monorepo, for now it serves as an experimental alternative to https://github.com/element-hq/element-modules/pull/188
## Releases
The API is versioned using semver, with the major version incremented for breaking changes.
## Copyright & License
Copyright (c) 2026 Element Creations Ltd
This software is multi licensed by Element Creations Ltd (Element). It can be used either:
(1) for free under the terms of the GNU Affero General Public License (as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version); OR
(2) under the terms of a paid-for Element Commercial License agreement between you and Element (the terms of which may vary depending on what you and Element have agreed to).
Unless required by applicable law or agreed to in writing, software distributed under the Licenses is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the Licenses for the specific language governing permissions and limitations under the Licenses.
-`FormattingUtils` - Text and data formatting utilities
-`numbers` - Number formatting utilities
## Development
### Prerequisites
- Node.js >= 20.0.0
- pnpm => 10
### Setup
```bash
# Install dependencies
pnpm install
# Build the library
pnpm prepare
```
### Running Storybook
```bash
pnpm storybook
```
### Write components
Most components should be written as [MVVM pattern](../../docs/MVVM.md) view
components. See existing components for examples. The exceptions are low level
components that don't need a view model.
### Write Storybook Stories
All components should have accompanying Storybook stories for documentation and visual testing. Stories are written in TypeScript using the [Component Story Format (CSF)](https://storybook.js.org/docs/api/csf).
#### Story File Structure
Place the story file next to the component with the `.stories.tsx` extension:
```
MyComponent/
├── MyComponent.tsx
├── MyComponent.module.css
└── MyComponent.stories.tsx
```
#### Regular Component Stories
For regular React components (non-MVVM), create stories by defining a meta object and story variations:
Thanks to this approach, we can directly use primitives in the story arguments instead of a view model object.
#### Linking Figma Designs
This package uses [@storybook/addon-designs](https://github.com/storybookjs/addon-designs) to embed Figma designs directly in Storybook. This helps developers compare their implementation with the design specs.
1.**Get the Figma URL**: Open your design in Figma, click "Share" → "Copy link"
2.**Add to story parameters**: Include the `design` object in the meta's `parameters`
// Docs-only story - renders nothing but triggers autodocs
exportconstDocs={
render:()=>null,
};
```
> [!NOTE]
> Be sure to include the `skip-test` tag in your utility stories to prevent them from running as visual tests.
**Workflow:**
1. Write TsDoc in your utility function
2. Export the function from `src/index.ts`
3. Run `pnpm build:doc` to generate TypeDoc markdown
4. Create a `.stories.tsx` file importing the generated markdown
5. The documentation appears automatically in Storybook
### Tests
Two types of tests are available: unit tests and visual regression tests.
### Unit Tests
These tests cover the logic of the components and utilities. Built with Vitest
and React Testing Library.
```bash
pnpm test:unit
```
### Visual Regression Tests
These tests ensure the UI components render correctly.
Built with Storybook and run under vitest using playwright.
```bash
pnpm test:storybook:update
```
Each story will be rendered and a screenshot will be taken and compared to the
existing baseline. If there are visual changes or AXE violation, the test will
fail.
Screenshots are located in `packages/shared-components/__vis__/`.
> [!IMPORTANT]
> In case of docker issues with Playwright, see [playwright EW documentation](https://github.com/element-hq/element-web/blob/develop/docs/playwright.md#supported-container-runtimes).
### Translations
First see our [translation guide](../../docs/translating.md) and [translation dev guide](../../docs/translating-dev.md).
To generate translation strings for this package, run:
```bash
pnpm i18n
```
## Publish a new version
Two steps are required to publish a new version of this package:
1. Bump the version in `package.json` following semver rules and open a PR.
2. Once merged run the [github workflow](https://github.com/element-hq/element-web/actions/workflows/shared-component-publish.yaml)
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.