* 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>
* Fix expand/collapse reply preview not showing in some cases
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Move tests to appropriate place
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Add comments
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove superfluous rageshake label for Rust Crypto
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove old test
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Delint
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them in SpacePanel
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix badly rendered icon in JoinRuleDropdown
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix badly rendered icon in RoomPreviewCard
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix badly rendered icon in Space menus
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix badly rendered icon in ThreadPanel
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>
* Remove unused icon underfill
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update screenshot
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Add test
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Add missing snapshot
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove unused AccessibleButton kinds
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them in EventTileBubble
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them in ReactionsRow
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them in MFileBody
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them in BaseCard
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them in RedactedBody
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them in E2ePadlock
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Tidy up E2EIcon
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them in DialPad
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them in AccessSecretStorageDialog
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them in HiddenBody
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update tests
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update tests
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix overflow in base card size
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Add missing screenshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Add tests
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* refactor: transform `FontWater.onAction` to switch
* fix: reload font after switching theme
Fix#26248#31588
When a theme is swiched, `clearCustomTheme` remove all css variables.
After the styles are re-applied but the custom fonts or emoji are not
re-applied.
* test: add test for `Action.ReloadFont`
* test: add missing tests for existing actions
* test(e2e): add tests to ensure that font and emoji stay unchanged
* Revert "fix: reload font after switching theme"
This reverts commit 2b0071af21c38bf2c86780356aa39d290e9d9148.
* Revert "refactor: transform `FontWater.onAction` to switch"
This reverts commit 411915860923230cabce3ad5498fb46696a9a65e.
* Revert "test: add test for `Action.ReloadFont`"
This reverts commit 31b3b224cd2c443663a2b9bba312a4140907a8ed.
* fix: don't remove custom emoji and cpd font when clearing custom theme
Fix#26248#31588
When a theme is swiched, `clearCustomTheme` remove all css variables.
After the styles are re-applied but the custom fonts or emoji are not
re-applied.
This fix avoid the custom font and emoji to be removed.
* test: add tests
* Open right panel timeline when jumping to event with maximised widget
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Add test
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix types & update snapshot
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Do not alter text-decoration if an <a> tag is a Link.
* Update screenshots
* update compound web to 8.3.4
* Update snaps
* Update alllllll the snaps
* update screenshots
* recalculate mentions of forwarded messages
In transformEvent(), parse event body back into an EditorModel, and pass this into attachMentions(), so that it actually recalculates mentions.
* refactor ForwardDialog-test.tsx
Refactor test for stripping mentions on forwards to allow for more tests of mention recalculation
* add test to recalculate mention pills
Fails due to not mocking room membership
* fix lint
* fix test: add ability to provide source room stub
* show correct toast when cross-signing keys missing
If cross-signing keys are missing both locally and in 4S, show a new toast
saying that identity needs resetting, rather than saying that the device
needs to be verified.
* refactor: make DeviceListener in charge of device state
- move enum from SetupEncryptionToast to DeviceListener
- DeviceListener has public method to get device state
- DeviceListener emits events to update device state
* reset key backup when needed in RecoveryPanelOutOfSync
brings RecoveryPanelOutOfSync in line with SetupEncryptionToast behaviour
* update strings to agree with designs from Figma
* use DeviceListener to determine EncryptionUserSettingsTab display
rather than using its own logic
* prompt to reset identity in Encryption Settings when needed
* fix type
* calculate device state even if we aren't going to show a toast
* update snapshot
* make logs more accurate
* add tests
* make the bot use a different access token/device
* only log in a new session when requested
* Mark properties as read-only
Co-authored-by: Skye Elliot <actuallyori@gmail.com>
* remove some duplicate strings
* make accessToken optional instead of using empty string
* switch from enum to string union as per review
* apply other changes from review
* handle errors in accessSecretStorage
* remove incorrect testid
---------
Co-authored-by: Skye Elliot <actuallyori@gmail.com>
* feat: Update algorithm for history visible banner.
- The banner now only shows for rooms with `shared` or `worldReadable`
history visibility.
- The banner does not show in rooms in which the current user cannot
send messages.
* tests: Add `getHistoryVisibility` to stub room.
* docs: Add description to `visible` condition check.
* docs: Fix spelling.
Co-authored-by: Florian Duros <florian.duros@ormaz.fr>
* chore: Remove `jest-sonar.xml`.
---------
Co-authored-by: Florian Duros <florian.duros@ormaz.fr>
* Remove release announcements for new sounds & room list
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update tests
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update tests
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update tests
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Add a timeout for toast checks
* Add tests for room status bar
* Fix MAU toast never appearing.
* Also cover local room create fails.
* fix await
* docstring
* Enwiden
* Add a test for the changes
* Switch to non-solid compound icons for room settings & composer
Also manually fixes sticker.svg to be tintable until it is redrawn
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace sticker.svg
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>
* style: move compound loading order
* fix: spotlight fiting
* fix: don't use internal compound css var in settings subsection
* fix: don't use internaal compound css var in read receipt group
* fix: add important to font settings on body element
* fix: remove play pause button color and fix padding
This color wasn't apply because this PR. Removing to avoid visual
regression
* fix: add important to form help message override in preference settings
* fix: override compound in space panel buttons
* fix: layout of forgot password
* fix: height of encryption tab
* fix: widget avatar border radius
* build: fix shared component screenshot update
The yarn command `test:storybook:update` was running twice
`playwright-sceenshots`. However this script is using ryuk to delete
remaining containers/etc and ryuk does the cleanup after 50sec of idle.
So on the script second call, ryuk container was still running and the
script failed.
This PR introduces a shell script to install the dependencies and to run
the tests in the same playrwright-screenshots call.
* Update packages/shared-components/scripts/storybook-screenshot-update.sh
Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
* Update packages/shared-components/scripts/storybook-screenshot-update.sh
Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
* doc: fix duplicated documentation after github commit
---------
Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
* docs: Update documentation for HistoryVisibleBanner and VM.
* docs: Improve documentation for `HistoryVisibleBanner`, second pass.
* docs: Move documentation to prop types over FC.
Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
* fix: Simplify type for `HistoryVisibleBannerViewModel` `threadId`.
* docs: Apply suggestions from code review
Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
---------
Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com>
* Amend e2e normal icon from lock-solid to info (#31555)
* Amend e2e normal icon from lock-solid to info
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>
(cherry picked from commit 773662e018)
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>
* Switch to rendering svg icons rather than masking them in SpacePanel
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix badly rendered icon in JoinRuleDropdown
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix badly rendered icon in RoomPreviewCard
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix badly rendered icon in Space menus
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix badly rendered icon in ThreadPanel
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>
* Remove unused icon underfill
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update screenshot
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Add test
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Add missing snapshot
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Amend e2e normal icon from lock-solid to info
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>
* Make AccessibleButton contrast control compatible
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>
* Switch to rendering svg icons rather than masking them in left panel
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove unused stylesheet
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them for ExternalLink
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them for TabbedView
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them for JoinRuleDropdown
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them in ManageRestrictedJoinRuleDialog
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them in LeaveSpaceDialog
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them in ReplyPreview
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them in SearchBox
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them in RoomStatusBar
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix advanced.svg
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update snapshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update screenshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix bad merge conflict resolution
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them in Toasts
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them in RoomInfoLine
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them in UploadBar
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove unused class
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them in ConfirmSpaceUserActionDialog
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them in FeedbackDialog
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them in KeyBackupFailedDialog
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them in CopyableText
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them in EventTile
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them in InviteReason
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>
* Add test
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>
* Switch to rendering svg icons rather than masking them in left panel
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove unused stylesheet
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them for ExternalLink
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them for TabbedView
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them for JoinRuleDropdown
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them in ManageRestrictedJoinRuleDialog
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them in LeaveSpaceDialog
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them in ReplyPreview
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them in SearchBox
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch to rendering svg icons rather than masking them in RoomStatusBar
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix advanced.svg
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update snapshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update screenshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix bad merge conflict resolution
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Tidy up token refresh code
This was a bit odd where the function to create a refresher sometimes
created a refresher and sometimes just returned null, including if the
init failed, in which case you would just end up with no token refresher.
Pairs with https://github.com/matrix-org/matrix-js-sdk/pull/5106 but
doesn't depend on either way.
* Remove deviceId property in favour of superclass one
* Fix tests
* Fix argument order in super call
redirect URI & device ID were swapped. It appears that gthe OIDS client
only actually sends the redirect URI when refreshing a token, so we will
have been sending a device ID for that when refreshing. I think this is safe
to fix since this is only when refreshing so it already would not have
matched what was passed at login time.
* Pass client ID into createOidcTokenRefresher
* refactor: move room list search to shared components
* refactor: add view model
* refactor: use view and vm in room list search component
* refactor: use room list id instead of class for landmark navigation
* refactor: remove old room list search css
* test: add screenshots test for room list search view
* test: fix e2e test using class as selector...
* refactor: useCreateAutoDisposedViewModel for audio player
* Update src/viewmodels/audio/AudioPlayerViewModel.ts
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
* Size Autocomplete relative to the RoomView height rather than the viewport height
* Add screenshot for the autocomplete in a regression changes the height
* Add cjk fonts to support rendering text emoticons displayed in slash command picker
* Maybe when actually running the tests?
* Try after system dependencies and clear font cache
* Add cjk fonts to support rendering text emoticons displayed in slash command picker
Try after system dependencies and clear font cache
Maybe when actually running the tests?
Revert "Add cjk fonts to support rendering text emoticons displayed in slash command picker"
This reverts commit 46fa014308b6010626174f8cd0d3a978488963ee.
* Render emoji autocoplete instead
* Remove font install that didn't work
* feat: Implement UI for history visibility acknowledgement.
Shows a banner above the message composer whenever a user opens a room
with non-join history visibility, which they can dismiss.
- Whenever a user opens an encrypted room with non-join history
visibility, show them a banner, unless we have already marked it as
dismissed.
- Whenever a user opens an encrypted room with joined history
visibility, we unmark it as dismissed.
Issue: https://github.com/element-hq/element-meta/issues/2875
* tests: Add test suite for `RoomStatusBarHistoryVisible`.
* docs: Document `RoomStatusBarHistoryVisible` and props interface.
* feat: Use newer `@vector-im/compound` components.
* test: Update snapshots for `RoomStatusBarHistoryVisible` tests.
* chore: Update playwright screenshots.
* feat: Move `RoomStatusBarHistoryVisible` to `shared-components`.
* fix: Address review comments on `RoomStatusBarHistoryVisible`.
* fix: Address review comments on `RoomStatusBar` and tests.
* chore: Move `RoomStatusBarHistoryVisible` to `room/RoomStatusBarHistoryVisible`
* chore: Fix linting issues.
* feat: Gate behind history visibility labs flag.
* feat: Add link to history sharing docs.
* fix: Resolve build issue with shared-components.
* tests: Enable history sharing lab for unit tests.
* tests: Set labs flag in SettingsStore mock.
* fix: Remove non-existent arg - documentation should be updated!
* chore: Remove old CSS rule filter.
* fix: Use package name for import over relative path.
* fix: Mark styles as important due to improper CSS load order.
* docs: Add doc comments to `!important` directives.
This change should restore my status as a good person.
* docs: Correct license header.
* tests: Update `RoomStatusBarHistoryVisible` snapshot.
* tests: Update shared history invite screenshot.
* tests: Revert spurious screenshot changes.
* feat: Update to use `Banner` component.
* chore: Remove broken import.
* chore: Remove unused translation string.
* tests: Add `getHistoryVisibility` to `currentState` of stub room.
* tests: Update screenshot.
* chore: Remove old snapshots.
* tests: Update playwright screenshot.
* feat: Separate `HistoryVisibleBanner` hooks into MVVM architecture.
* chore: Remove unused imports.
* feat: Use info link over action button for `HistoryVisibleBanner`
* tests: Update snapshot for `HistoryVisibleBanner`.
* chore: Remove unused imports.
* feat: Switch to MVVM architecture per style guide.
* tests: Update snapshot for `HistoryVisibleBanner`.
* tests: Update shared components snapshots.
* tests: Add unit tests for `HistoryVisibleBannerView` stories.
* fix: Linting errors from SonarCloud.
* feat: Finalise conversion to MVVM.
* fix: Silent `this` binding issue.
* tests: Update playwright snapshot.
* feat: Introduce wrapper component for `HistoryVisibleBanner`.
* tests: Update playwright screenshots for `HistoryVisibleBanner`.
* docs: Add doc comments to fields in `HistoryVisibleBannerViewModel`.
* tests: Update playwright snapshot.
* Update dependency is-ip to v5
* Fix import
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Make jest happier
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>
* Check default PL when setting a new PL in createRoom
* Drop custom PL setting for video rooms
* lint files
* Add room version test
* Cleanup test
* fix import
* Fix e2e icon rendering
Regressed by change to compound icons, due to it relying on a hack of rendering icons atop each other to draw a background.
Also fixes a nested tooltip which became annoying during testing
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update tests
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>
* EventIndex: add some documentation
... because comments are not subject to rationing.
* EventIndex: rationalise addInitialCheckpoints logic
* EventIndex: improve logging
* use a single `logger` instance to do the prefixing
* use `JSON.stringify` on the checkpoints so that the rageshakes are useful
* distinguish between logger.warn and logger.debug
* emit some logs if the crawler loop fails
* Move check for empty database to `init`
The problem with checking if the database is empty in `onSync` is that, by the
time we get there, it won't be.
Instead let's remember if the db was empty in `init`, and then once a sync
completes, we can add the checkpoints.
* Some tests for EventIndexer
* MessageEventIndexDialog: comments for state
* ManageEventIndexDialog: deduplicate some code
`updateCurrentRoom` has the same logic as `componentDidMount`, so let's factor
it out.
* ManageEventIndexDialog: distinguish indexed rooms
Just because a room is not currently awaiting indexing does not mean it has
been indexed. Update the dialog to show the actual number of indexed rooms, and
the number of rooms that are awaiting indexing.
* Apply suggestion from @richvdh
---------
Co-authored-by: Will Hunt <2072976+Half-Shot@users.noreply.github.com>
* Remove poll ended event UI.
* Add better aria labels for screen reader and change ui to match mobile UX.
- Checkmark and progress bar are only green if the poll is ended.
- Updated the Poll icon for open and ended state and added labels
- Right align total votes count and update text
* Update jest tests
* Fix total votes alignment
* Fix screenshots
* Update snapshot
* Update e2e tests
* fix more e2e tests
* Clean up CSS
* Add back text for undisclosed poll (total should be hidden)
* Update checkmark and progress colours to more closely match mobile
* Don't compute optionNumber on each render
* "Total votes" working doesn't really work with the current web behaviour
Web doesn't show the votes for undisclosed polls(mobile does). reverting and that behaviour change should be addressed in a different PR(or on mobile.).
* Fix e2e test
* Update screenshots
* Move positioning of total votes label back to the left side
as we are no longer changing the copy to match mobile
* Don't concatenate label
* Fix translation order
* Remove unneeded translations
* remove O(n^2) code
* fix snapshots
* Fix check style in poll option
* prettier
* Move `EditInPlace` out of `Form`
If it is part of the form saving will submit the inner form of
EditInPlace and reload EW.
* add tests and comments
* update snapshot
* fix playwright
* feat(room view): add `enableReadReceiptsAndMarkersOnActivity` props
For the multiroom module, we display several room views at the same
time. In order to avoid all the rooms to send read receipts and markers
automatically when we are interacting with the UI, we add
`enableReadReceiptsAndMarkersOnActivity`props.
When at false, the timeline doesn't listen to user activity to send
these receipts. Only when the room is focused, marker and read receipts
are updated.
* test(room view): add test for `enableReadReceiptsAndMarkersOnActivity`
* build(ew-api): update `@element-hq/element-web-module-api` to `v1.9.0`
* Fix cursor position bug during IME composition
Add IME composition check to BasicMessageComposer.onKeyDown to prevent
cursor position issues when pressing Tab key immediately after Japanese
input conversion. This matches the behavior in SendMessageComposer and
EditMessageComposer.
Fixes issue where cursor would jump to the beginning of the input field
after converting Japanese text and pressing Tab.
* Add tests for IME composition keydown handling
- Add test to verify keydown events are ignored during IME composition
- Add test to verify keydown events are handled normally when not composing
- Tests ensure the fix for Japanese IME cursor position bug works correctly
* Refer to ClientWidgetApi as "widget API" rather than "messaging"
* Rename StopGapWidgetDriver to ElementWidgetDriver
* Rename StopGapWidget to WidgetMessaging
* Fix WidgetMessaging's lifetime by storing it in WidgetMessagingStore
(Rather than storing just the raw ClientWidgetApi objects.)
* Unfail test
* use an error
* cleanup start
* Add docs
* Prettier
* link to store
* remove a let
* More logging, split up loop
* Add a test demonstrating a regression in Call.start
* Restore Call.start to a single, robust event loop
* Fix test failure by resetting the messaging store
* Expand on the WidgetMessaging doc comment
* Add additional tests to buff up coverage
* Add a test for the sticker picker opening the IM.
* reduce copy paste
---------
Co-authored-by: Half-Shot <will@half-shot.uk>
Co-authored-by: Timo K <toger5@hotmail.de>
* Use EditInPlace for identity server picker.
* Update test
* Add a test for setting an ID server.
* fix tests
* Reformat other :not sections
* forgot a comma
* Update Apperance settings to use toggle switches.
* Remove unused checkbox setting.
* Remove unused import.
* Update tests
* lint
* update apperance screenshot
* Begin replacing settings
* Refactor RoomPublishSetting
* Remove LabelledToggleSwitch
* Refactor SettingsFlag to use SettingsToggleInput
* Refactor CreateRoomDialog to use SettingsToggleInput
* Refactor DeclineAndBlockInviteDialog to use SettingsToggleInput
* Update DevtoolsDialog
* Refactor ReportRoomDialog to use SettingsToggle
* Update RoomUpgradeWarningDialog to use SettingsToggleInput
* Update WidgetCapabilitiesPromptDialog to use SettingsToggleInput
* Update trivial switchovers
* Update Notifications settings to use SettingsFlag where possible
* Update RoomPublishSetting and SpaceSettingVisibilityTab to use SettingsToggleInput with a warning
* revert changes to field
* Updated screenshots
* Prevent accidental submits
* Replace test ID tests
* Create new snapshot tests
* Add screenshot test for DeclineAndBlockDialog
* Add screenshot for create room dialog.
* Add devtools test
* Add upgrade rooms test
* Add widget capabilites prompt test
* Fix spec
* Add a test for the live location sharing prompt.
* fix copyright
* Add tests for notification settings
* Add tests for user security tab.
* Add test for room security tab.
* Add test for video settings tab.
* remove .only
* Test creating a video room
* Mask the IM name in the header.
* Add spaces vis tab test.
* Fixup unit tests to check correct attributes.
* Various fixes to components for tests.
* lint
* Update compound
* update setting names
* Cleanup tests
prettier
Updates some more playwright tests
Update more snapshots
Update switch
more fixes
drop .only
last screenshot round
fix video room flake
Remove console.logs
Remove roomId from devtools view.
lint
final screenshot
* Add playwright tests
* import pages/ remove duplicate create-room
* Update screenshots
* Fix accessibility for devtools
* Disable region test
* Fixup headers
* remove extra test
* Fix permissions dialog
* fixup tests
* update snapshot
* Update jest tests
* Clear up playwright tests
* update widget screenshot
* Fix wrong snaps from using wrong compound version
* Revert mistaken s/checkbox/switch/
* lint lint
* Update headings
* fix snap
* remove unused
* update snapshot
* update tab screenshot
* Update snapshots
* Fix margins
* Iterate
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>
* Delint
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>
* Iterate
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>
* Update snapshot
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
* Tweak rendering of icons in legacy video feed
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove unused classes
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Tweak rendering of icons in face pile
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Tweak rendering of icons in overflow tile
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Tweak rendering of icons in room search view
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Tweak rendering of icons in top unread messages bar
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Tweak rendering of icons in space basic settings
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Tweak rendering of icons in thread summary tile
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Tweak rendering of icons in legacy room tile
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Tweak rendering of icons in incoming call toast
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Tweak rendering of icons in labs jump to date
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Tweak rendering of icons in field validation
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update snapshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Tweak rendering of icons in mini avatar uploader
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Tweak rendering of icons in info tooltip
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Tweak rendering of icons in network dropdown
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix the topic update workflow
* Update room IDs with the new ones after upgrades
* Make room name variable more descriptive
* Fail if the topic doesn't match
* Return when failing
* Add option to pick call options for voice calls.
* hook on the right thing
* Fix wrong call being disabled
* update snaps
* Add tests for menus
* more snaps
* snap snap
(cherry picked from commit a352a3838e)
Co-authored-by: Will Hunt <2072976+Half-Shot@users.noreply.github.com>
* Make ESLint's TS Root dir relative to .eslintrc.js
As per https://github.com/typescript-eslint/typescript-eslint/issues/251 seems
like this is the answer for having vscode not getting confused about
multiple projects in a monorepo with different tsconfigs.
* Add it here too for good measure
* Add option to pick call options for voice calls.
* hook on the right thing
* Fix wrong call being disabled
* update snaps
* Add tests for menus
* more snaps
* snap snap
* Upgrade module api package
* Add a wrapper component
So that we can render the decoration component with just the room.
* Implement module API method
* Add more tests
* Replace element-icons/chat-bubbles.svg with compound
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace element-icons/chat-bubbles.svg with compound
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace external-link.svg with compound
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace element-icons/hide.svg with compound
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace element-icons/explore.svg with compound
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace element-icons/hash-*.svg with compound
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace element-icons/share.svg with compound
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace element-icons/group-members.svg with compound
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace element-icons/mask-as-*.svg with compound
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace element-icons/low-priority.svg with compound
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace element-icons/plus-circle.svg with compound
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace element-icons/roles.svg with compound
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update jest snapshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update screenshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* 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>
* Introduce i18nContext
* Adds a context that holds the module i1n API
* Switches shared components to use that instead of importing it directly
* Adds the context to MatrixChat and BaseDalog so it should be available most places in EW
This is a relatively small PR but does change the way the shared components do i18n so
just doing this one by itself (it stands by itself anyway).
This will allow shared components to use i18n when used in modules.
* Add the file
* Fix import lint
* Name the translate function _t
Then it should continue to get picked up by the script
This seems a bit flaky and ew but I'm not sure I want to get into
changing this in this PR.
* Put humanize back to calling something called _t too
* Missed one
* Add i18n context wrapper to stories
* Unused import
* Fix imports
* wrap richitem
* Wrap other richitem & richlist
* One day I will get my head around this syntax
* Fix import spacing
* Add wrapper to test
* unused import
* Hack around dependency cycle
* Make a moduleapi instance for tests
* Add i18n wrapper to jest-matrix-react
* Simple test for i18napi
* Import type
* Move i18n context wrapper to storybook template
* Unused imports & fix pill story
* Move i18n to its own provider
* Add i18ncontext wrapper to jest tests
* imports
* Bump module api to 1.7.0
* tsdoc
* MatrixChat: add a load of logging for view transitions
This stuff was essentially impossible to follow and debug. I think a load of
logging will help.
* Add more comments on `state.view`
* Add a new state between LOADING/SOFT_LOGOUT and LOGGED_IN
... so that we can transition into COMPLETE_SECURITY without going via
LOGGED_IN.
* Remove redundant check for `force_verification`
This check was previously necessary to keep the tests working, because:
* onLoggedIn would call `onShowPostLoginScreen`,
* which (without the check) would call `showScreenAfterLogin`
* which would queue up an action `Action.ViewHomePage`
* Then we would receive an already-queued `ClientStarted` action, which would
transition us (correctly) to the `COMPLETE_SECURITY` view
* Then we would receive the `ViewHomePage` action, taking us back to `LOGGED_IN`.
I don't think the check was necessary in practice, because in practice there
would be enough delay between the OnLoggedIn and ClientStarted actions that the
race didn't happen.
The *problem* with the check was that it meant that, whenever
`force_verification` was enabled, we would get stuck in the LOADING state.
The check is now unnecessary, because `onLoggedIn` no longer calls
`onShowPostLoginScreen`.
* `onShowPostLoginScreen` need no longer be `async`
* Regression test for https://github.com/element-hq/element-web/issues/31203
Add a workaround for the fact that MatrixChat attempts to use React state for
the state of a state machine: a small `sleep` to let the state settle.
As a result, it turns out we may not see the "Syncing..." state, and in general
`waitForSyncAndLoad` doesn't seem to be doing anything useful.
* fix: display the menu option on the room list item when clicked/opened
Fix#31366
`onBlur` was called when the room is opened, the focus is moved to the
composr. The hover state was removed.
The hover state is diplayed when `ìsFocused=true` so the keyboard
navigation is not impacted
* test: update room list e2e tests
* test: update marked as unread state
* Update vector-im
* Update Jest snapshots
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>
* Fix playwright styling overrides
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Hold back Compound Design Tokens as threads icons unexpectedly grew a dot in the top corner where we conditionally draw a dot
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>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update snapshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update Compound Design Tokens to 6.4.1
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update snapshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Revert snapshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Tweak bubble
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update snapshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update storybook snapshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update jest snapshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update jest snapshots
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>
* Fix handling of SVGs
1. Ensure we always include thumbnails for them
2. Show `m.file` handler if we cannot render the SVG
3. When opening ImageView use svg thumbnail if the SVG cannot be rendered
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix UploadConfirmDialog choking under React devmode
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix test
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Add tests
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
In the upcoming work for encrypted state, we need to keep the spinner
until the m.room.encryption event is received. This change keeps the
spinner just a little longer than before: until the room is received
from the server.
I'm submitting this change partly because I think it makes sense to
delay until we can confirm the room exists and partly to separate this
change from other changes that will be involved in encrypted state. That
way if this causes problems we can discuss or revert it separately.
* Replace element-icons/room/composer/attach.svg with compound
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace element-icons/room/*/emoji.svg with compound
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace element-icons/room/message-bar/edit.svg with compound
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace element-icons/room/composer/poll.svg with compound
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace element-icons/room/composer/plain_text.svg with compound
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove unused star.svg
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace element-icons/upload.svg with compound
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace element-icons/settings/preference.svg with compound
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace element-icons/settings/flask.svg with compound
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace element-icons/settings/appearance.svg with compound
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update snapshots
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>
* Replace element-icons/call/dialpad.svg with compound
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace element-icons/call/hangup.svg with compound
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace element-icons/call/video-call.svg with compound
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace element-icons/call/voice-call.svg with compound
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace element-icons/cloud-off.svg with compound
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Replace element-icons/eye.svg with compound
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove debug
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>
* Add a fake ecall page
* Start to setup a test to check PiP works
* Complete test file
* cleanup
* lint
* use test fail
* lint again
* remove fake
* Fix flake
* better comment
* Initial implementation of MSC4380
* fix lint
* Update InviteRulesAccountSetting-test
* add some docs
* `block_all` -> `default_action`
* Add a unit test for BlockInvitesConfigController
* Tweak rendering of icons in dropdowns
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Tweak rendering of icons in composer format bar
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Tweak rendering of icons in jump to bottom button
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Tweak rendering of icons in quick settings button
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Tweak rendering of icons in left panel search
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 margin
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update test
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update snapshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Tweak rendering of icons in security user settings tab
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Tweak rendering of icons in space hierarchy
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update screenshots
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>
* Simplify
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Tidy
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Add test
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>
* Remove some unused CSS & icons
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix type
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove another unused class
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Move call to `tryPersistStorage` to `OnLoggedIn` handler
I think this needs to happen whether or not we are in the middle of a login
flow.
Fixes: https://github.com/element-hq/element-web/issues/31298
* Inline `MatrixChat.onLoggedIn`
It's now a one-liner, and its semantics are very confusing.
* Factor out `MatrixChat.onLoggedIn`
Now that we've got rid of the confusing `onLoggedIn` method, we can factor out
a method which *actually* handles `OnLoggedIn` actions.
* Allow the Login screen to use the dark theme
There is a whole bunch of code dedicated to attempting to force a "light" theme
onto the login view, even if the deployment is configured to prioritise the
dark theme.
Apparently this was done because, in the old days, the
login view looked rubbish with the dark theme, but now it looks fine.
Fixes https://github.com/element-hq/element-web/issues/31292
* Fix up background colour of auth screen in dark theme
In dark theme, the background of the login/register/welcome box needs to be
translucent black rather than translucent white.
To make this work, I've moved the style from inline to CSS, and used a PostCSS
variable to define the colour.
* Fix up Welcome page colours in dark theme
Make the text and image white, not black, in short.
* Fix incorrect merge
that will teach me to use the Github UI to address merge conflicts.
* Update all non-major dependencies
* Make knip happy
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>
Because RoomViewStore used two slightly different conditions, the Call.presented flag could get out of sync with the viewingCall flag. But these should effectively be the same thing.
This was causing some subtle bugs if you would join a call, switch to another room, and then click back into the call room via the room list. The call would be visible but not know that it's presented, causing:
1. The hangup sound to get cut off at the end of the call
2. The widget to disappear immediately without offering a 'reconnect' button if you lose connectivity
* feat: implement `ExtrasApi#setRoomIdsForSpace`
* fix: message reply with multiple room views
* fix: message edition when multiple rooms are displayed
* test: check that the view room action is not dispatch when replying
* test: check that the view room action is not dispatch when editing
* refactor: use `ExtraApis#getVisibleRoomBySpaceKey` instead of `ExtraApis#setRoomIdsForSpace`
* test: update tests to use `getVisibleRoomBySpaceKey`
* add function to pause device listener
* add function to check if key backup key missing both locally and in 4s
* reset backup if backup key missing both locally and in 4s
* fixup! add function to check if key backup key missing both locally and in 4s
* Drop KEY_STORAGE_OUT_OF_SYNC_STORE in favour of checking cross-signing
Check if cross-signing needs resetting, because that seems to be what
KEY_STORAGE_OUT_OF_SYNC_STORE is actually trying to do.
* add a function for resetting key backup and waiting until it's ready
* trigger key storage out of sync toast when missing backup key locally
and fetch it when user enters their recovery key
* reset backup when needed if user forgets recovery key
* rename function as suggested in code review
* Remove unreachable code
`view_last_screen` is never used.
* Remove unused action `user_activity_started`
Nothing listens to this, so it's pointless.
* Symbolic constant for `Action.UserActivity`
* Define symbolic constants for more `Action`s
Constants for some actions that are emitted by `Lifecycle`
* Rename callback on E2eSetup component
`BaseDialog.onFinished` is unused when `hasCancel=false`, so this callback is
only used when the user clicks cancel. For clarity, rename it.
* Test for cancellation behaviour
* Fix invalid events crashing entire room rather than just their tile
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>
* feat: add options to hide right panel in room view
This option is added for the module API.
* test: add test for hideRightPanel=true of room view
* test: update snapshot ids
This was telling the browser that the children of this div will never go
out of the bounding rect of the div. This is incorrect because the
expand button is supposed to sit at the edge of the space panel with
half of it outside the bounding rect.
* Delayed event management: split endpoints, no auth
Use the new js-sdk client methods for calling the dedicated,
unauthenticated endpoints for each of the cancel/restart/send actions
for updating a delayed event.
Note that these methods are compatible with homeservers that support
only the original endpoint where the update action is in the request
body.
* REPLACEME: pull in dependant js-sdk branch
see matrix-org/matrix-js-sdk#5066
* Format with Prettier
* Update matrix-js-sdk
* Add voiceOnly options.
* tweaks
* Nearly working demo
* Lots of minor fixes
* Better working version
* remove unused payload
* bits and pieces
* Cleanup based on new hints
* Simple refactor for skipLobby (and remove returnToLobby)
* Tidyup
* Remove unused tests
* Update tests for voice calls
* Add video room support.
* Add a test for video rooms
* tidy
* remove console log line
* lint and tests
* Bunch of fixes
* Fixes
* Use correct title
* make linter happier
* Update tests
* cleanup
* Drop only
* update snaps
* Document
* lint
* Update snapshots
* Remove duplicate test
* add brackets
* fix jest
* Fix gen-workflow-mermaid to be compatible with Node 22.18+
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>
* Update jest to v30
* Update jest to v30
* Update snapshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Apply jsdom patch
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix tests
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>
* Update dependency vite to v7.1.11 [SECURITY]
* Iterate
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>
* Update all non-major dependencies
* Make knip happy
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>
* fix: install shared components during EW install
* chore: ignore `@element-hq/web-shared-components` for knip
* chore: remove shared-components operation in layered.sh
EW `yarn install` is also installing shared-componenents dependencies.
`link:` in `package.json` works nearly like `yarn link`.
* Iterate
---------
(cherry picked from commit e883b05206)
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
Co-authored-by: Florian Duros <florianduros@element.io>
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
* fix: install shared components during EW install
* chore: ignore `@element-hq/web-shared-components` for knip
* chore: remove shared-components operation in layered.sh
EW `yarn install` is also installing shared-componenents dependencies.
`link:` in `package.json` works nearly like `yarn link`.
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
* Apply aria-hidden to emoji in SAS verification
So that for screen readers the canonical emoji description is preferred & we avoid the user being read each emoji twice.
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update snapshot
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix room list handling of membership changes
Including knock->invite for ask to join
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* lint
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Inhibit keyboard highlight in spotlight dialog when effector is not in focus
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Inhibit keyboard highlight in forward dialog when effector is not in focus
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix search box height bouncing on focus/blur
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>
* Update docs for 'bug_report_endpoint_url' to use the dedicated subdomain
* Update {app,develop}.element.io to use the dedicated subdomain for 'bug_report_endpoint_url'
As the comment indicated, this apparently was necessary to get stuff
built the first time, but does not appear to be necessary anymore and
looks to be causing occasional flakiness, so let's remove it.
* feat: add props to hide header in `RoomView`
* feat: add props to hide composer in `RoomView`
* feat: pass `RoomViewProps` to room view in `renderRoomView`
* refactor: add doc and use existing types
* test: add tests for new room view props
* strip mentions from forwarded messages
fixeselement-hq/element-web#30883
* call attachMentions() for empty m.mentions in forwarded messages
As there is no EditorModel, attachMentions() currently does nothing
* fix lint and typecheck
* update test "should be navigable using arrow keys"
* update test "forwards pin drop event"
add empty mentions to expected content
* add doc to transformEvent() & elaborate on attachMentions()
* add test "strips mentions from forwarded messages"
* fix lint
* update source of `attachMentions()` import
---------
Co-authored-by: David Baker <dbkr@users.noreply.github.com>
* Module API experiments
* Move ResizerNotifier into SDKContext
so we don't have to pass it into RoomView
* Add the MultiRoomViewStore
* Make RoomViewStore able to take a roomId prop
* Different interface to add space panel items
A bit less flexible but probably simpler and will help keep things
actually consistent rather than just allowing modules to stick any
JSX into the space panel (which means they also have to worry about
styling if they *do* want it to be consistent).
* Allow space panel items to be updated
and manage which one is selected, allowing module "spaces" to be
considered spaces
* Remove fetchRoomFn from SpaceNotificationStore
which didn't really seem to have any point as it was only called from
one place
* Switch to using module api via .instance
* Fairly awful workaround
to actually break the dependency nightmare
* Add test for multiroomviewstore
* add test
* Make room names deterministic
So the tests don't fail if you add other tests or run them individually
* Add test for builtinsapi
* Update module api
* RVS is not needed as prop anymore
Since it's passed through context
* Add roomId to prop
* Remove RoomViewStore from state
This is now accessed through class field
* Fix test
* No need to pass RVS from LoggedInView
* Add RoomContextType
* Implement new builtins api
* Add tests
* Fix import
* Fix circular dependency issue
* Fix import
* Add more tests
* Improve comment
* room-id is optional
* Update license
* Add implementation for AccountDataApi
* Add implementation for Room
* Add implementation for ClientApi
* Create ClientApi in Api.ts
* Write tests
* Use nullish coalescing assignment
* Implement openRoom in NavigationApi
* Write tests
* Add implementation for StoresApi
* Write tests
* Fix circular dependency
* Add comments in lieu of type
and fix else block
* Change to class field
---------
Co-authored-by: R Midhun Suresh <hi@midhun.dev>
* Make shared component build work in isolation
* Add deps that were missing because they were getting picked up
from element-web main but shared-components needs itself
* Exclude test files from dts generation
* Bump version
* Change all the shared-component import to be the built artifact
* Don't randomly inhale eslint configs in parent dirs please
* maybe we don't need this anymore?
* maybe fix build
* Maybe fix docker build
* More build faff
* build:res on the parent as part of shared component prepare
* link shared component repo inn docker build
* 💅
* 💅x2
* Try converting the translation keys to a .d.ts file manually
so it gets bundled rather than left as a relative import to the json
file
* add the script
* Add this back for 2nd time now I think
* Shouldn't need this anymore
* patch-package on prepare
because we're patching a dev dependency so it won't be there if we're
installed as a dependency
* Unused import
* Prettier compliance
* Only use counterpart from shared components
as per comment
* Import shared components CSS
* Prettier
* Call the one from shared components
rather than recurse infinitely
* Hopefully make tests work
* wake up, comment goes before import
* Fix lint errors
* Fix dupe TranslationKey export
* Update compound-web to fix type error
An update to @types.react adds the 'hint' value to the enum of the
'popover' attribute and this version of compound-web uses the maching
verson of @types/react so they don't conflict.
* Maybe, hopefully, get the types working?
Please?
* Add copyright header to i18nkeys
as eslint complains otherwise since it's now in src
* prettier
* stop running shared-component tests in EW
* update snapshots
because flex is now from an external stylesheet I guess
* More snapshots
* Manual class update
* Avoid bundling compound bits
Because a) it's silly and b) it means we end up bundling a copy of
floating-ui too which causes absolute madness with its useDelayGroup
contexts.
* ignore test util files for coverage
* Add !important
because the styles are being applied in a different order now
* Another !important because css order has changed
* Try adding it here to make the test files ignored
* More !important
* commit yarn lock change
* Add shared components coverage file
* Update snapshots
Because the line height was being overridden to 22.5px somehow by
something I can't find, and now isn't: surely the normal 1.5rem is
more sensible.
* Update snapshots, attempt 2
* Another !important
* More snapshot updates
* Add test for i18n wrappers
& add test script
* lint
* Prettier
* Hopefully run shared component tests
* don't need this bit for non-matrix
* install ew deps
* rigfht coverage location
* Rename job here too
* Try different coverage filename
* Fix copyrights & comment
* Typo
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
* Only set active descendant when the user starts typing.
* Fix jest tests.
* Remove aria-hidden
It was failing code quality checks and it actually wasn't addressing the issue.
* Only show highlight on arrow key navigation or updating the search query.
* Update screenshots
* Enter should not select an emoji if it is not highlighted.
* On clearing a query and using arrow kets again the highlighted emoji should be reset to the first.
* Update selector in picker tests
* Add focus lock to emoji picker and e2e test.
* Remove direct use of FocusLock in favour of the ContextMenu prop.
* Apply returnFocus for ContextMenu focusLocks
* Remove import
* Add relevant aria attribute for selected emoji in the emoji picker
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Add aria-multiselectable
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Do not specify aria-selected/pressed when element is disabled
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Use checkbox role for reaction picker as gridcell + aria-selected has very inconsistent screenreader support
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix keyboard handling for modified DOM structure
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix enter behaviour
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix tooltips within context menu portals being unreliable
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update snapshots
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>
* fix(list view): avoid re-create `onFocus` function at each render of the child items
* fix(room list): update `onFocus` signature
* fix(member list): update `onFocus` signature
* fix(room list): avoid re-render at the beginning and end of the scroll
* test(room list): remove scrolling test and props
* test(member list): update member tile view tests
* test(room list): update `ListView` focus test
* test(member list): add `onFocus` test for member list tile
* We should focus the node in the DOM so that the browser focus(with outline) matches the our internal RovingIndex state
* Don't move focus from the input if we are in "virtual" focus(via active descendant)
* Improve logging in `DeviceListener`
Sometimes we get a logline `4S is missing secrets` but it's hard to see *which*
secrets are missing. https://github.com/matrix-org/matrix-js-sdk/pull/5054
added a method to the js-sdk which allows us to get more info: use it here.
* Use getSecretStorageStatus for analytics reporting too
* Fix unit tests
* Show timestamps when keyboard focus is within an event tile
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Ensure toolbar navigation pattern works in MessageActionBar
This requires all buttons within to be roving by using the ref callback given by useRovingTabIndex
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Use PureComponent in EventTile to avoid mass re-rendering due to transitive onFocus/onBlur calls
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove unused timestamp event tile prop
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Use MessageTimestamp to generate the wrapping anchor so that focusing it brings up the tooltip
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Tweak MessageTimestamp
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch back to Component as we specify a shouldComponentUpdate already
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update jest tests
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update playwright timestamp masks
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Revert snapshot
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update snapshot
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix IRC layout
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Use PureComponent in EventTile to avoid mass re-rendering due to transitive onFocus/onBlur calls
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove unused timestamp event tile prop
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Use MessageTimestamp to generate the wrapping anchor so that focusing it brings up the tooltip
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Tweak MessageTimestamp
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Switch back to Component as we specify a shouldComponentUpdate already
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update jest tests
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update playwright timestamp masks
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Revert snapshot
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update snapshot
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix IRC layout
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Lint styles
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix layout picker
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update snapshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update screenshots
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Fix pcss comment
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate Playwright
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Iterate Playwright
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
This requires all buttons within to be roving by using the ref callback given by useRovingTabIndex
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Pass roomViewStore to the RoomView and add to the RoomContext.
* lint
* lint
* Make constants more DRY
* Make constants more DRY
* Commend non-null assertion on roomViewStore property of the RoomContext
* Update tsdocs.
* Fix sort order in space hierarchy
To match spec and not add unexpected sorting by space vs room
* Update SpaceHierarchy.tsx
* Iterate
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update snapshot
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Add test
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* Update snapshot
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---------
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
* fix: use EW and shared component counterpart
* fix: exclude counterpart from build
* Revert "fix: use EW and shared component counterpart"
This reverts commit 1983d063c6b75a4f6e193e3c57e3bd9bae0888de.
* Revert "fix: exclude counterpart from build"
This reverts commit 8e41b137fc0b3d88c38921ac5762836e29c062f8.
* fix: force EW and shared components to use EW counterpart
* Fix highlights in messages (or search results) breaking links
Fixes#17011 and fixes#29807, by running the linkifier that turns text into links before the highlighter that adds highlights to text.
* Fix jest test
* Fix tests related to emojis and pills-inside-spoilers
* Remove dead code
* Address review comments around sanitizeParams
* Address review comment about linkify-matrix
* Fix code style
* Refactor if statement per review
---------
Co-authored-by: Michael Telatynski <7t3chguy@gmail.com>
* Remove vm related code from element-web/src
* Add and export view model code from package
* Update imports
* Rewrite vm tests using vitest
* Add github action to run vm tests
* Fix lint errors
* Mvoe tests over to jest
* Try fixing code coverage
* Second attempt at fixing code coverage
* Change module API to be an instance getter
Helps with circular dependencies by not instantating the module API
on the initial evaluation of the files.
* Add basic test
* add another test
* fix: update jest config with new shared components path
* fix: update sonar config
* chore: add `storybook` & `@storybook/react-vite` to run the shared components tests
* Fix html exports by adding SDKContext
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>
* Remove auto-bump step from share component publishing
Avoids having to give release bot permission to commit directly to
the branch for now.
* Pass npm token & remove version bump param
* On this step?
* We have to provide a registry URL????
* Rename as it doesn't really release
2025-10-14 13:37:35 +00:00
2157 changed files with 114736 additions and 55501 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)
* Remove `element_call.participant_limit` config and associated code. ([#31638](https://github.com/element-hq/element-web/pull/31638)). Contributed by @Half-Shot.
## ✨ Features
* Switch to rendering svg icons rather than masking them ([#31557](https://github.com/element-hq/element-web/pull/31557)). Contributed by @t3chguy.
* Update history visibility UX ([#31635](https://github.com/element-hq/element-web/pull/31635)). Contributed by @langleyd.
* Show correct call icon for joining a call. ([#31489](https://github.com/element-hq/element-web/pull/31489)). Contributed by @Half-Shot.
* Update StopGapWidgetDriver to support sticky events ([#31205](https://github.com/element-hq/element-web/pull/31205)). Contributed by @Half-Shot.
* Remove release announcements for new sounds \& room list ([#31544](https://github.com/element-hq/element-web/pull/31544)). Contributed by @t3chguy.
* Add button to restore from backup into /devtools ([#31581](https://github.com/element-hq/element-web/pull/31581)). Contributed by @mxandreas.
* Switch to non-solid compound icons for room settings \& composer ([#31561](https://github.com/element-hq/element-web/pull/31561)). Contributed by @t3chguy.
* Support encrypted state events MSC4362 ([#31513](https://github.com/element-hq/element-web/pull/31513)). Contributed by @andybalaam.
* Update prop type \& documentation for HistoryVisibleBanner and VM. ([#31545](https://github.com/element-hq/element-web/pull/31545)). Contributed by @kaylendog.
* Switch to Compound icons in more places ([#31560](https://github.com/element-hq/element-web/pull/31560)). Contributed by @t3chguy.
* Switch to rendering svg icons rather than masking them ([#31550](https://github.com/element-hq/element-web/pull/31550)). Contributed by @t3chguy.
* Make AccessibleButton contrast control compatible ([#31308](https://github.com/element-hq/element-web/pull/31308)). Contributed by @t3chguy.
* Switch to compound-design-tokens for platform icons ([#31543](https://github.com/element-hq/element-web/pull/31543)). Contributed by @t3chguy.
* Switch to rendering svg icons rather than masking them ([#31531](https://github.com/element-hq/element-web/pull/31531)). Contributed by @t3chguy.
* Switch to rendering svg icons rather than css masking ([#31517](https://github.com/element-hq/element-web/pull/31517)). Contributed by @t3chguy.
* Auto approve matrix rtc member event (`m.rtc.member`) (sticky events) ([#31452](https://github.com/element-hq/element-web/pull/31452)). Contributed by @toger5.
* Size Autocomplete relative to the RoomView height rather than the viewport height ([#31425](https://github.com/element-hq/element-web/pull/31425)). Contributed by @langleyd.
* Implement UI for history visibility acknowledgement. ([#31156](https://github.com/element-hq/element-web/pull/31156)). Contributed by @kaylendog.
* Export disposing hook from package ([#31498](https://github.com/element-hq/element-web/pull/31498)). Contributed by @MidhunSureshR.
* Change `header-panel-bg-hover` to use `var(--cpd-color-bg-action-secondary-hovered)` for better custom theming ([#31457](https://github.com/element-hq/element-web/pull/31457)). Contributed by @th0mcat.
* Improve icon rendering in iconized context menu ([#31458](https://github.com/element-hq/element-web/pull/31458)). Contributed by @t3chguy.
## 🐛 Bug Fixes
* [Backport staging] Fix space settings visibility tab crashing ([#31705](https://github.com/element-hq/element-web/pull/31705)). Contributed by @RiotRobot.
* Fix expand/collapse reply preview not showing in some cases ([#31639](https://github.com/element-hq/element-web/pull/31639)). Contributed by @t3chguy.
* Fix bundled font or custom font not applied after theme switch ([#31591](https://github.com/element-hq/element-web/pull/31591)). Contributed by @florianduros.
* Add ol override CSS for markdown-body ([#31618](https://github.com/element-hq/element-web/pull/31618)). Contributed by @niamu.
* Fix reaction left margin in timeline card ([#31625](https://github.com/element-hq/element-web/pull/31625)). Contributed by @t3chguy.
* Open right panel timeline when jumping to event with maximised widget ([#31626](https://github.com/element-hq/element-web/pull/31626)). Contributed by @t3chguy.
* Fix Compound Link elements not having an underline. ([#31583](https://github.com/element-hq/element-web/pull/31583)). Contributed by @Half-Shot.
* Recalculate mentions metadata of forwarded messages based on message body ([#31193](https://github.com/element-hq/element-web/pull/31193)). Contributed by @twassman.
* Fix Room Preview Card Layout ([#31611](https://github.com/element-hq/element-web/pull/31611)). Contributed by @germain-gg.
* Fix: WidgetMessaging not properly closed causing side effects and bugs ([#31598](https://github.com/element-hq/element-web/pull/31598)). Contributed by @BillCarsonFr.
* Handle cross-signing keys missing locally and/or from secret storage ([#31367](https://github.com/element-hq/element-web/pull/31367)). Contributed by @uhoreg.
* fix: Allow wrapping in `Banner` component. ([#31532](https://github.com/element-hq/element-web/pull/31532)). Contributed by @kaylendog.
* Update algorithm for history visible banner. ([#31577](https://github.com/element-hq/element-web/pull/31577)). Contributed by @kaylendog.
* Fix styling issue when using EW modules ([#31533](https://github.com/element-hq/element-web/pull/31533)). Contributed by @florianduros.
* Prevent history visible banner from displaying in threads. ([#31535](https://github.com/element-hq/element-web/pull/31535)). Contributed by @kaylendog.
* Make the feedback icon be the right color in dark theme ([#31527](https://github.com/element-hq/element-web/pull/31527)). Contributed by @robintown.
Changes in [1.12.7](https://github.com/element-hq/element-web/releases/tag/v1.12.7) (2025-12-16)
* Replace legacy icons with compound ([#31424](https://github.com/element-hq/element-web/pull/31424)). Contributed by @t3chguy.
* Update polls UX to match EX Mobile and improve accessibility ([#31245](https://github.com/element-hq/element-web/pull/31245)). Contributed by @langleyd.
* Add option to enable read receipt and marker when user interact with UI ([#31353](https://github.com/element-hq/element-web/pull/31353)). Contributed by @florianduros.
* Introduce a hook to auto dispose view models ([#31178](https://github.com/element-hq/element-web/pull/31178)). Contributed by @MidhunSureshR.
* Update settings toggles to use consistent design across app. ([#30169](https://github.com/element-hq/element-web/pull/30169)). Contributed by @Half-Shot.
* Add ability to the room view to hide widgets ([#31400](https://github.com/element-hq/element-web/pull/31400)). Contributed by @langleyd.
* call: Pass the echo cancellation and noise suppression settings to EC ([#31317](https://github.com/element-hq/element-web/pull/31317)). Contributed by @BillCarsonFr.
* Tweak rendering of icons for a11y ([#31358](https://github.com/element-hq/element-web/pull/31358)). Contributed by @t3chguy.
* Implement new `renderNotificationDecoration` from module API ([#31389](https://github.com/element-hq/element-web/pull/31389)). Contributed by @MidhunSureshR.
* Replace more icons with compound ([#31381](https://github.com/element-hq/element-web/pull/31381)). Contributed by @t3chguy.
* Replace more icons with compound ([#31378](https://github.com/element-hq/element-web/pull/31378)). Contributed by @t3chguy.
*`<Banner/>`: Hide `Dismiss` button if `onClose` handler is not provided. ([#31362](https://github.com/element-hq/element-web/pull/31362)). Contributed by @kaylendog.
* Replace batch of legacy icons with compound design tokens ([#31360](https://github.com/element-hq/element-web/pull/31360)). Contributed by @t3chguy.
* MSC4380: Invite blocking ([#31268](https://github.com/element-hq/element-web/pull/31268)). Contributed by @richvdh.
* Tweak rendering of icons for accessibility ([#31346](https://github.com/element-hq/element-web/pull/31346)). Contributed by @t3chguy.
* Implement a shared `Banner` component. ([#31266](https://github.com/element-hq/element-web/pull/31266)). Contributed by @kaylendog.
* Allow the Login screen to use the dark theme ([#31293](https://github.com/element-hq/element-web/pull/31293)). Contributed by @richvdh.
## 🐛 Bug Fixes
* [Backport staging] Amend e2e normal icon from lock-solid to info ([#31559](https://github.com/element-hq/element-web/pull/31559)). Contributed by @t3chguy.
* [Backport staging] Fix CSS specificity causing icon issues in e2e verification ([#31548](https://github.com/element-hq/element-web/pull/31548)). Contributed by @RiotRobot.
* [Backport staging] Fix e2e icons in CompleteSecurity \& SetupEncryptionBody ([#31522](https://github.com/element-hq/element-web/pull/31522)). Contributed by @RiotRobot.
* [Backport staging] Remove an extra paragraph in advanced room settings ([#31511](https://github.com/element-hq/element-web/pull/31511)). Contributed by @RiotRobot.
* [Backport staging] Don't show the key storage out of sync toast when backup disabled ([#31507](https://github.com/element-hq/element-web/pull/31507)). Contributed by @RiotRobot.
* Fix composer button visibility in contrast colour mode ([#31255](https://github.com/element-hq/element-web/pull/31255)). Contributed by @t3chguy.
* Ensure correct room version is used and permissions are appropriately sert when creating rooms ([#31464](https://github.com/element-hq/element-web/pull/31464)). Contributed by @Half-Shot.
* Fix e2e icon rendering ([#31454](https://github.com/element-hq/element-web/pull/31454)). Contributed by @t3chguy.
* EventIndexer: ensure we add initial checkpoints when the db is first opened ([#31448](https://github.com/element-hq/element-web/pull/31448)). Contributed by @richvdh.
* Fix `/join <alias>` command failing due to race condition ([#31433](https://github.com/element-hq/element-web/pull/31433)). Contributed by @MidhunSureshR.
* MessageEventIndexDialog: distinguish indexed rooms ([#31436](https://github.com/element-hq/element-web/pull/31436)). Contributed by @richvdh.
* Move `EditInPlace` out of `Form` (Fixes: reloading EW on EC url update) ([#31434](https://github.com/element-hq/element-web/pull/31434)). Contributed by @toger5.
* Fixes issue where cursor would jump to the beginning of the input field after converting Japanese text and pressing Tab ([#31432](https://github.com/element-hq/element-web/pull/31432)). Contributed by @shinaoka.
* Fix widgets getting stuck in loading states ([#31314](https://github.com/element-hq/element-web/pull/31314)). Contributed by @robintown.
* Room list: fix room options remaining on room item after mouse leaving ([#31414](https://github.com/element-hq/element-web/pull/31414)). Contributed by @florianduros.
* Make `RoomList.showMessagePreview` configurable by `config.json` ([#31419](https://github.com/element-hq/element-web/pull/31419)). Contributed by @florianduros.
* Fix bug which caused app not to load correctly when `force_verification` is enabled ([#31265](https://github.com/element-hq/element-web/pull/31265)). Contributed by @richvdh.
* Room list: display the menu option on the room list item when clicked/opened ([#31380](https://github.com/element-hq/element-web/pull/31380)). Contributed by @florianduros.
* Fix handling of SVGs ([#31359](https://github.com/element-hq/element-web/pull/31359)). Contributed by @t3chguy.
* Fix word wrapping in expanded left panel buttons ([#31377](https://github.com/element-hq/element-web/pull/31377)). Contributed by @t3chguy.
* Fix aspect ratio on error view background ([#31361](https://github.com/element-hq/element-web/pull/31361)). Contributed by @t3chguy.
* Fix failure to request persistent storage perms ([#31299](https://github.com/element-hq/element-web/pull/31299)). Contributed by @richvdh.
* Fix calls sometimes not knowing that they're presented ([#31313](https://github.com/element-hq/element-web/pull/31313)). Contributed by @robintown.
Changes in [1.12.6](https://github.com/element-hq/element-web/releases/tag/v1.12.6) (2025-12-03)
* Update Emojibase to v17 ([#31307](https://github.com/element-hq/element-web/pull/31307)). Contributed by @t3chguy.
* Adds tooltip for compose menu ([#31122](https://github.com/element-hq/element-web/pull/31122)). Contributed by @byteplow.
* Add option to hide pinned message banner in room view ([#31296](https://github.com/element-hq/element-web/pull/31296)). Contributed by @florianduros.
* update twemoji to not monochromise emoji with BLACK in their name ([#31281](https://github.com/element-hq/element-web/pull/31281)). Contributed by @ara4n.
* upgrade to twemoji 17.0.2 and fix #14695 ([#31267](https://github.com/element-hq/element-web/pull/31267)). Contributed by @ara4n.
* Add options to hide right panel in room view ([#31252](https://github.com/element-hq/element-web/pull/31252)). Contributed by @florianduros.
* Delayed event management: split endpoints, no auth ([#31183](https://github.com/element-hq/element-web/pull/31183)). Contributed by @AndrewFerr.
* Support using Element Call for voice calls in DMs ([#30817](https://github.com/element-hq/element-web/pull/30817)). Contributed by @Half-Shot.
* Improve screen reader accessibility of auth pages ([#31236](https://github.com/element-hq/element-web/pull/31236)). Contributed by @t3chguy.
* Add posthog tracking for key backup toasts ([#31195](https://github.com/element-hq/element-web/pull/31195)). Contributed by @Half-Shot.
## 🐛 Bug Fixes
* Return to using Fira Code as the default monospace font ([#31302](https://github.com/element-hq/element-web/pull/31302)). Contributed by @ara4n.
* Fix case of home screen being displayed erroneously ([#31301](https://github.com/element-hq/element-web/pull/31301)). Contributed by @langleyd.
* Fix message edition and reply when multiple rooms at displayed the same moment ([#31280](https://github.com/element-hq/element-web/pull/31280)). Contributed by @florianduros.
* Key storage out of sync: reset key backup when needed ([#31279](https://github.com/element-hq/element-web/pull/31279)). Contributed by @uhoreg.
* Fix invalid events crashing entire room rather than just their tile ([#31256](https://github.com/element-hq/element-web/pull/31256)). Contributed by @t3chguy.
* Fix expand button of space panel getting cut off at the edges ([#31259](https://github.com/element-hq/element-web/pull/31259)). Contributed by @MidhunSureshR.
* Fix pill buttons in dialogs ([#31246](https://github.com/element-hq/element-web/pull/31246)). Contributed by @dbkr.
* Fix blank sections at the top and bottom of the member list when scrolling ([#31198](https://github.com/element-hq/element-web/pull/31198)). Contributed by @langleyd.
* Fix emoji category selection with keyboard ([#31162](https://github.com/element-hq/element-web/pull/31162)). Contributed by @langleyd.
Changes in [1.12.4](https://github.com/element-hq/element-web/releases/tag/v1.12.4) (2025-11-18)
* Apply aria-hidden to emoji in SAS verification ([#31204](https://github.com/element-hq/element-web/pull/31204)). Contributed by @t3chguy.
* Add options to hide header and composer of room view for the module api ([#31095](https://github.com/element-hq/element-web/pull/31095)). Contributed by @florianduros.
* Experimental Module API Additions ([#30863](https://github.com/element-hq/element-web/pull/30863)). Contributed by @dbkr.
* Change polls to use fieldset/legend markup ([#31160](https://github.com/element-hq/element-web/pull/31160)). Contributed by @langleyd.
* Use compound Button styles for Jitsi button ([#31159](https://github.com/element-hq/element-web/pull/31159)). Contributed by @Half-Shot.
* Add FocusLock to emoji picker ([#31146](https://github.com/element-hq/element-web/pull/31146)). Contributed by @langleyd.
* Move room name, avatar, and topic to IOpts. ([#30981](https://github.com/element-hq/element-web/pull/30981)). Contributed by @kaylendog.
* Add a devtool for looking at users and their devices ([#30983](https://github.com/element-hq/element-web/pull/30983)). Contributed by @uhoreg.
## 🐛 Bug Fixes
* Fix room list handling of membership changes ([#31197](https://github.com/element-hq/element-web/pull/31197)). Contributed by @t3chguy.
* Fix room list unable to be resized when displayed after a module ([#31186](https://github.com/element-hq/element-web/pull/31186)). Contributed by @florianduros.
* Inhibit keyboard highlights in dialogs when effector is not in focus ([#31181](https://github.com/element-hq/element-web/pull/31181)). Contributed by @t3chguy.
* Strip mentions from forwarded messages ([#30884](https://github.com/element-hq/element-web/pull/30884)). Contributed by @twassman.
* Don't allow pin or edit of messages with a send status ([#31158](https://github.com/element-hq/element-web/pull/31158)). Contributed by @langleyd.
* Hide room header buttons if the room hasn't been created yet. ([#31092](https://github.com/element-hq/element-web/pull/31092)). Contributed by @Half-Shot.
* Fix screen readers not indicating the emoji picker search field is focused. ([#31128](https://github.com/element-hq/element-web/pull/31128)). Contributed by @langleyd.
* Fix emoji picker highlight missing when not active element ([#31148](https://github.com/element-hq/element-web/pull/31148)). Contributed by @t3chguy.
* Add relevant aria attribute for selected emoji in the emoji picker ([#31125](https://github.com/element-hq/element-web/pull/31125)). Contributed by @t3chguy.
* Fix tooltips within context menu portals being unreliable ([#31129](https://github.com/element-hq/element-web/pull/31129)). Contributed by @t3chguy.
* Avoid excessive re-render of room list and member list ([#31131](https://github.com/element-hq/element-web/pull/31131)). Contributed by @florianduros.
* Make emoji picker height responsive. ([#31130](https://github.com/element-hq/element-web/pull/31130)). Contributed by @langleyd.
* Emoji Picker: Focused emoji does not move with the arrow keys ([#30893](https://github.com/element-hq/element-web/pull/30893)). Contributed by @langleyd.
* Fix audio player seek bar position ([#31127](https://github.com/element-hq/element-web/pull/31127)). Contributed by @florianduros.
* Add aria label to emoji picker search ([#31126](https://github.com/element-hq/element-web/pull/31126)). Contributed by @langleyd.
Changes in [1.12.3](https://github.com/element-hq/element-web/releases/tag/v1.12.3) (2025-11-04)
* Remove allowVoipWithNoMedia feature flag ([#31087](https://github.com/element-hq/element-web/pull/31087)). Contributed by @Half-Shot.
## ✨ Features
* Change module API to be an instance getter ([#31025](https://github.com/element-hq/element-web/pull/31025)). Contributed by @dbkr.
## 🐛 Bug Fixes
* Show hover elements when keyboard focus is within an event tile ([#31078](https://github.com/element-hq/element-web/pull/31078)). Contributed by @t3chguy.
* Ensure toolbar navigation pattern works in MessageActionBar ([#31080](https://github.com/element-hq/element-web/pull/31080)). Contributed by @t3chguy.
* Ensure sent markers are hidden when showing thread summary. ([#31076](https://github.com/element-hq/element-web/pull/31076)). Contributed by @Half-Shot.
* Fix translation in dev mode ([#31045](https://github.com/element-hq/element-web/pull/31045)). Contributed by @florianduros.
* Fix sort order in space hierarchy ([#30975](https://github.com/element-hq/element-web/pull/30975)). Contributed by @t3chguy.
* New Room list: don't display message preview of thread ([#31043](https://github.com/element-hq/element-web/pull/31043)). Contributed by @florianduros.
* Revert "A11y: move focus to right panel when opened" ([#30999](https://github.com/element-hq/element-web/pull/30999)). Contributed by @florianduros.
* Fix highlights in messages (or search results) breaking links ([#30264](https://github.com/element-hq/element-web/pull/30264)). Contributed by @bojidar-bg.
* Add prepare script ([#31030](https://github.com/element-hq/element-web/pull/31030)). Contributed by @dbkr.
* Fix html exports by adding SDKContext ([#30987](https://github.com/element-hq/element-web/pull/30987)). Contributed by @t3chguy.
Changes in [1.12.2](https://github.com/element-hq/element-web/releases/tag/v1.12.2) (2025-10-21)
@@ -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
@@ -79,7 +79,7 @@ Unless otherwise specified, the following applies to all code:
11. If a variable is not receiving a value on declaration, its type must be defined.
```typescript
let errorMessage: Optional<string>;
let errorMessage: string;
```
12. Objects can use shorthand declarations, including mixing of types.
@@ -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()`:
@@ -160,7 +160,8 @@ complete re-branding/private labeling, a more personalised experience can be ach
3. `show_once`: Optional. If true then the notice will only be shown once per device.
19. `help_url`: The URL to point users to for help with the app, defaults to `https://element.io/help`.
20. `help_encryption_url`: The URL to point users to for help with encryption, defaults to `https://element.io/help#encryption`.
21. `force_verification`: If true, users must verify new logins (eg. with another device / their recovery key)
21. `help_key_storage_url`: The URL to point users to for help with key storage, defaults to `https://element.io/help#encryption5`.
22. `force_verification`: If true, users must verify new logins (eg. with another device / their recovery key)
### `desktop_builds` and `mobile_builds`
@@ -249,7 +250,7 @@ Together, the options might look like this in your config:
Note that `index.html` also has an og:image meta tag that is set to an image hosted on element.io. This is the image used if
links to your copy of Element appear in some websites like Facebook, and indeed Element itself. This has to be static in the HTML
and an absolute URL (and HTTP rather than HTTPS), so it's not possible for this to be an option in config.json. If you'd like to
change it, you can build Element, but run `RIOT_OG_IMAGE_URL="http://example.com/logo.png" yarn build`. Alternatively, you can edit
change it, you can build Element, but run `RIOT_OG_IMAGE_URL="http://example.com/logo.png" pnpm build`. Alternatively, you can edit
the `og:image` meta tag in `index.html` directly each time you download a new version of Element.
## SSO setup
@@ -391,8 +392,6 @@ The VoIP and Jitsi options are:
6. `element_call`: Optional configuration for native group calls using Element Call, with the following subkeys:
- `use_exclusively`: A boolean specifying whether Element Call should be used exclusively as the only VoIP stack in
the app, removing the ability to start legacy 1:1 calls or Jitsi calls. Defaults to `false`.
- `participant_limit`: The maximum number of users who can join a call; if
this number is exceeded, the user will not be able to join a given call.
- `brand`: Optional name for the app. Defaults to `Element Call`. This is
used throughout the application in various strings/locations.
- `guest_spa_url`: Optional URL for an Element Call single-page app (SPA),
@@ -407,8 +406,9 @@ The VoIP and Jitsi options are:
If you run your own rageshake server to collect bug reports, the following options may be of interest:
1. `bug_report_endpoint_url`: URL for where to submit rageshake logs to. Rageshakes include feedback submissions and bug reports. When
not present in the config, the app will disable all rageshake functionality. Set to `https://element.io/bugreports/submit` to submit
not present in the config, the app will disable all rageshake functionality. Set to `https://rageshakes.element.io/api/submit` to submit
rageshakes to us, or use your own rageshake server.
You may also set the value to `"local"` if you wish to only store logs locally, in order to download them for debugging.
2. `uisi_autorageshake_app`: If a user has enabled the "automatically send debug logs on decryption errors" flag, this option will be sent
alongside the rageshake so the rageshake server can filter them by app name. By default, this will be `element-auto-uisi`
(in contrast to other rageshakes submitted by the app, which use `element-web`).
@@ -582,12 +582,26 @@ Currently, the following UI feature flags are supported:
This should only be used if the room history visibility options are managed by the server.
- `UIFeature.TimelineEnableRelativeDates` - Display relative date separators (eg: 'Today', 'Yesterday') in the
timeline for recent messages. When false day dates will be used.
- `UIFeature.BulkUnverifiedSessionsReminder` - Display popup reminders to verify or remove unverified sessions. Defaults
to true.
- `UIFeature.locationSharing` - Whether or not location sharing menus will be shown.
- `UIFeature.allowCreatingPublicRooms` - Whether or not public rooms can be created.
- `UIFeature.allowCreatingPublicSpaces` - Whether or not public spaces can be created.
## Modules
`modules`: An optional array of module paths to load at runtime. Each entry is a URL or path to a JavaScript module entry point that will be dynamically imported when Element Web starts.
**Note:** This is separate from the build-time module system configured via `build_config.yaml`. Runtime modules are loaded dynamically from the paths specified in `config.json`, while build-time modules are bundled during compilation.
Each module URL is loaded using dynamic import (`import()`). The modules are loaded in order after Element Web initializes but before the application fully starts. Modules must be accessible from the browser and should export a compatible module format that works with the [Module API](https://github.com/element-hq/element-modules/tree/main/packages/element-web-module-api).
## Undocumented / developer options
The following are undocumented or intended for developer use only.
@@ -596,4 +610,3 @@ The following are undocumented or intended for developer use only.
4. `latex_maths_delims`: An optional setting to override the default delimiters used for maths parsing. See https://github.com/matrix-org/matrix-react-sdk/pull/5939 for details. Only used when `feature_latex_maths` is enabled.
5. `modules`: An optional list of modules to load. This is used for testing and development purposes only.
installed and working in order to run the Playwright tests.
There are a few different ways to run the tests yourself. The simplest is to run:
```shell
yarn run test:playwright
```sh
pnpm run test:playwright
```
This will run the Playwright tests once, non-interactively.
**Run a specific test file:**
You can also run individual tests this way too, as you'd expect:
```shell
yarn run test:playwright --spec playwright/e2e/register/register.spec.ts
```sh
pnpm run test:playwright playwright/e2e/register/register.spec.ts
```
Playwright also has its own UI that you can use to run and debug the tests.
To launch it:
**Run tests interactively with Playwright UI:**
```shell
yarn run test:playwright:open --headed --debug
```sh
pnpm run test:playwright:open
```
See more command line options at <https://playwright.dev/docs/test-cli>.
**Run screenshot tests only:**
## Projects
> [!WARNING]
> This command run the playwright tests in a docker environment.
By default, Playwright will run all "Projects", this means tests will run against Chrome, Firefox and "Safari" (Webkit).
We only run tests against Chrome in pull request CI, but all projects in the merge queue.
Some tests are excluded from running on certain browsers due to incompatibilities in the test harness.
```sh
pnpm run test:playwright:screenshots
```
For more information about visual testing, see [Visual Testing](playwright#visual-testing).
**Additional command line options:** <https://playwright.dev/docs/test-cli>
### Shared Components Tests
See the [Shared Components README](../packages/shared-components/README.md#visual-regression-tests) for instructions on running the shared components Playwright tests.
### Projects
By default, Playwright runs tests against all "Projects": Chrome, Firefox, "Safari" (Webkit), Dendrite and Picone.
- Chrome, Firefox, Safari run against Synapse
- Dendrite and Picone run against Chrome
Misc:
- **Pull Request CI:** Tests run only against Chrome
- **Merge Queue:** Tests run against all projects
- Some tests are excluded from certain browsers due to incompatibilities (see [Test Tags](#test-tags))
## How the Tests Work
Everything Playwright-related lives in the `playwright/` subdirectory
as is typical for Playwright tests. Likewise, tests live in `playwright/e2e`.
### Test Structure
`playwright/testcontainers` contains the testcontainers which start instances
of Synapse/Dendrite. These servers are what Element-web runs against in the tests.
**Element Web tests** are located in the `playwright/` subdirectory:
Synapse can be launched with different configurations in order to test element
in different configurations. You can specify `synapseConfig` as such:
-`playwright/e2e/` - E2E test files
-`playwright/testcontainers/` - Testcontainers for Synapse/Dendrite instances
-`playwright/snapshots/` - Visual regression test screenshots
Homeservers (Synapse or Dendrite) are launched by Playwright workers and reused for all tests matching the worker configuration.
**Configure Synapse options:**
```typescript
test.use({
synapseConfig:{
// The config options to pass to the Synapse instance
// Configuration options for the Synapse instance
},
});
```
The appropriate homeserver will be launched by the Playwright worker and reused for all tests which match the worker configuration.
Due to homeservers being reused between tests, please use unique names for any rooms put into the room directory as
they may be visible from other tests, the suggested approach is to use `testInfo.testId` within the name or lodash's uniqueId.
We remove public rooms from the room directory between tests but deleting users doesn't have a homeserver agnostic solution.
The logs from testcontainers will be attached to any reports output from Playwright.
**Important notes:**
- Homeservers are reused between tests for efficiency
- Please use unique names for any rooms put into the room directory as they may be visible from other tests, the suggested approach is to use `testInfo.testId` within the name or lodash's uniqueId.
- We remove public rooms from the room directory between tests but deleting users doesn't have a homeserver agnostic solution.
- Homeserver logs are attached to Playwright test reports
### Fixtures
We heavily leverage [Playwright fixtures](https://playwright.dev/docs/test-fixtures) to provide:
- Homeserver instances (`homeserver`)
- Logged-in users (`user`)
- Bot users (`bot`)
- Application state (`app`)
See [Writing Tests](#writing-tests) for usage examples.
## Writing Tests
Mostly this is the same advice as for writing any other Playwright test: the Playwright
docs are well worth a read if you're not already familiar with Playwright testing, eg.
https://playwright.dev/docs/best-practices. To avoid your tests being flaky it is also
recommended to use [auto-retrying assertions](https://playwright.dev/docs/test-assertions#auto-retrying-assertions).
For general Playwright best practices, see:
### Getting a Synapse
- <https://playwright.dev/docs/best-practices>
- <https://playwright.dev/docs/test-assertions#auto-retrying-assertions> (recommended for avoiding flaky tests)
We heavily leverage the magic of [Playwright fixtures](https://playwright.dev/docs/test-fixtures).
To acquire a homeserver within a test just add the `homeserver` fixture to the test:
### Getting a Homeserver
Use the `homeserver` fixture to acquire a Homeserver instance:
```typescript
test("should do something",async({homeserver})=>{
// homeserver is a Synapse/Dendrite instance
// homeserver is a ready-to-use Synapse/Dendrite instance
});
```
This returns an object with information about the Homeserver instance, including what port
it was started on and the ID that needs to be passed to shut it down again. It also
returns the registration shared secret (`registrationSecret`) that can be used to
register users via the REST API. The Homeserver has been ensured ready to go by awaiting
its internal health-check.
**The fixture provides:**
Homeserver instances should be reasonably cheap to start (you may see the first one take a
while as it pulls the Docker image).
You do not need to explicitly clean up the instance as it will be cleaned up by the fixture.
- Server port information
- Instance ID for shutdown
- Registration shared secret (`registrationSecret`) for registering users via REST API
Homeserver instances are:
- Reasonably cheap to start (first run may be slow while pulling Docker image)
- Automatically cleaned up by the fixture
### Logging In
We again heavily leverage the magic of [Playwright fixtures](https://playwright.dev/docs/test-fixtures).
To acquire a logged-in user within a test just add the `user` fixture to the test:
Use the `user` fixture to get a logged-in user:
```typescript
test("should do something",async({user})=>{
// user is a logged in user
// user is logged in and ready to use
});
```
You can specify a display name for the user via `test.use``displayName`,
otherwise a random one will be generated.
This will register a random userId using the registrationSecret with a random password
and the given display name. The user fixture will contain details about the credentials for if
they are needed for User-Interactive Auth or similar but localStorage will already be seeded with them
and the app loaded (path `/`).
**Customize the user:**
```typescript
test.use({
displayName:"Alice",
});
test("should do something",async({user})=>{
// user is logged in as "Alice"
});
```
**What the fixture does:**
- Registers a random userId with the `registrationSecret`
- Generates a random password (or uses specified display name)
- Seeds localStorage with credentials
- Loads the app at path `/`
- Provides user details for User-Interactive Auth if needed
### Joining a Room
Many tests will also want to start with the client in a room, ready to send & receive messages. Best
way to do this may be to get an access token for the user and use this to create a room with the REST
API before logging the user in.
You can make use of the bot fixture and the `client` field on the app fixture to do this.
To start with a user in a room:
### Try to write tests from the users' perspective
```typescript
test("should send a message",async({user,app,bot})=>{
// Use the bot client to create a room
constroomId=awaitbot.createRoom({
name:"Test Room",
invite:[user.userId],
});
Like for instance a user will not look for a button by querying a CSS selector.
Instead, you should work with roles / labels etc, see https://playwright.dev/docs/locators.
// Accept the invite using the app client
awaitapp.client.joinRoom(roomId);
// Now ready to test messaging
});
```
**Best practice:** Use the REST API (via `bot` or `app.client`) to set up room state rather than driving the UI.
### Using matrix-js-sdk
Due to the way we run the Playwright tests in CI, at this time you can only use the matrix-js-sdk module
exposed on `window.matrixcs`. This has the limitation that it is only accessible with the app loaded.
This may be revisited in the future.
Due to CI constraints, use the matrix-js-sdk module exposed on `window.matrixcs`:
## Good Test Hygiene
```typescript
constmatrixcs=window.matrixcs;
```
This section mostly summarises general good Playwright testing practice, and should not be news to anyone
already familiar with Playwright.
**Limitation:** Only accessible when the app is loaded. This may be revisited in the future.
1. Test a well-isolated unit of functionality. The more specific, the easier it will be to tell what's
wrong when they fail.
1. Don't depend on state from other tests: any given test should be able to run in isolation.
1. Try to avoid driving the UI for anything other than the UI you're trying to test. e.g. if you're
testing that the user can send a reaction to a message, it's best to send a message using a REST
API, then react to it using the UI, rather than using the element-web UI to send the message.
1. Avoid explicit waits. Playwright locators & assertions will implicitly wait for the specified
element to appear and all assertions are retried until they either pass or time out, so you should
never need to manually wait for an element.
- For example, for asserting about editing an already-edited message, you can't wait for the
'edited' element to appear as there was already one there, but you can assert that the body
of the message is what is should be after the second edit and this assertion will pass once
it becomes true. You can then assert that the 'edited' element is still in the DOM.
- You can also wait for other things like network requests in the
browser to complete (https://playwright.dev/docs/api/class-page#page-wait-for-response).
Needing to wait for things can also be because of race conditions in the app itself, which ideally
shouldn't be there!
### Best Practices
This is a small selection - the Playwright best practices guide, linked above, has more good advice, and we
should generally try to adhere to them.
For more guidance, see the [Playwright best practices guide](https://playwright.dev/docs/best-practices).
## Screenshot testing
#### 1. Test from the User's Perspective
When we previously used Cypress we also dabbled with Percy, and whilst powerful it did not
lend itself well to being executed on all PRs without needing to budget it substantially.
Work with roles, labels, and accessible elements rather than CSS selectors:
See [Playwright masking docs](https://playwright.dev/docs/test-snapshots#masking) for more details.
### Updating Screenshots
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
pnpm run test:playwright:screenshots
```
**Important:** Always use this command to update screenshots rather than running tests locally with `--update-snapshots`.
**Why?** Screenshots must be rendered in a consistent Linux Docker environment because:
- Font rendering differs between operating systems (macOS, Windows, Linux)
- Subpixel rendering varies across systems
- Browser rendering engines have platform-specific differences
Using `test:playwright:screenshots` ensures screenshots are generated in the same Docker environment used in CI, preventing false failures due to rendering differences.
## Test Tags
We use test tags to categorise tests for running subsets more efficiently.
Test tags categorize tests for efficient subset execution.
-`@mergequeue`: Tests that are slow or flaky and cover areas of the app we update seldom, should not be run on every PR commit but will be run in the Merge Queue.
-`@screenshot`: Tests that use `toMatchScreenshot` to speed up a run of `test:playwright:screenshots`. A test with this tag must not also have the `@mergequeue` tag as this would cause false positives in the stale screenshot detection.
-`@no-$project`: Tests which are unsupported in $Project. These tests will be skipped when running in $Project.
### Available Tags
Anything testing Matrix media will need to have `@no-firefox` and `@no-webkit` as those rely on the service worker which
has to be disabled in Playwright on Firefox & Webkit to retain routing functionality.
Anything testing VoIP/microphone will need to have `@no-webkit` as fake microphone functionality is not available
there at this time.
- **`@mergequeue`**: Slow or flaky tests covering rarely-updated app areas
- Not run on every PR commit
- Run in the Merge Queue
If you wish to run all tests in a PR, you can give it the label `X-Run-All-Tests`.
- **`@screenshot`**: Tests using `toMatchScreenshot` for visual regression testing
- See the [Visual Testing](#visual-testing) section for detailed usage
## Supporter container runtimes
- **`@no-firefox`**: Tests unsupported in Firefox
- Automatically skipped in Firefox project
- Common reason: Service worker required (disabled in Playwright Firefox for routing)
We use testcontainers to spin up various instances of Synapse, Matrix Authentication Service, and more.
It supports Docker out of the box but also has support for Podman, Colima, Rancher, you just need to follow some instructions to achieve it:
@@ -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.
## Editing existing strings
@@ -58,6 +58,12 @@ We are aiming for a set of common strings to be shared then some more localised
Edits to existing strings should be performed only via Localazy.
There you can also require all translations to be redone if the meaning of the string has changed significantly.
## Removing existing strings
You can remove an existing string by removing the key from `en_EN.json`. Do not modify other language json files for this purpose.
Localazy will mark the keys you removed as deprecated. See https://localazy.com/docs/general/editing-source-language#source-key-states for more information about the difference between deprecated keys and deleted keys.
## Adding variables inside a string.
1. Extend your `_t()` call. Instead of `_t(TKEY)` use `_t(TKEY, {})`
@@ -66,7 +72,7 @@ There you can also require all translations to be redone if the meaning of the s
1. Add the variable inside the string. The syntax for variables is `%(variable)s`. Please note the _s_ at the end. The name of the variable has to match the previous used name.
- You can use the special `count` variable to choose between multiple versions of the same string, in order to get the correct pluralization. E.g. `_t('You have %(count)s new messages', { count: 2 })` would show 'You have 2 new messages', while `_t('You have %(count)s new messages', { count: 1 })` would show 'You have one new message' (assuming a singular version of the string has been added to the translation file. See above). Passing in `count` is much preferred over having an if-statement choose the correct string to use, because some languages have much more complicated plural rules than english (e.g. they might need a completely different form if there are three things rather than two).
- If you want to translate text that includes e.g. hyperlinks or other HTML you have to also use tag substitution, e.g. `_t('<a>Click here!</a>', {}, { 'a': (sub) => <a>{sub}</a> })`. If you don't do the tag substitution you will end up showing literally '<a>' rather than making a hyperlink.
- If you want to translate text that includes e.g. hyperlinks or other HTML you have to also use tag substitution, e.g. `_t('<a>Click here!</a>', {}, { 'a': (sub) => <a>{sub}</a> })`. If you don't do the tag substitution you will end up showing literally `<a>` rather than making a hyperlink.
- You can also use React components with normal variable substitution if you want to insert HTML markup, e.g. `_t('Your email address is %(emailAddress)s', { emailAddress: <i>{userEmailAddress}</i> })`.
## Things to know/Style Guides
@@ -78,4 +84,4 @@ There you can also require all translations to be redone if the meaning of the s
- Concatenating strings often also introduces an implicit assumption about word order (e.g. that the subject of the sentence comes first), which is incorrect for many languages.
- Translation 'smell test': If you have a string that does not begin with a capital letter (is not the start of a sentence) or it ends with e.g. ':' or a preposition (e.g. 'to') you should recheck that you are not trying to translate a partial sentence.
- If you have multiple strings, that are almost identical, except some part (e.g. a word or two) it is still better to translate the full sentence multiple times. It may seem like inefficient repetition, but unlike programming where you try to minimize repetition, translation is much faster if you have many, full, clear, sentences to work with, rather than fewer, but incomplete sentence fragments.
- Don't forget curly braces when you assign an expression to JSX attributes in the render method)
- Don't forget curly braces when you assign an expression to JSX attributes in the render method.
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.