diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index d905231103..8b49cb8b89 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,36 +1,36 @@ * @element-hq/element-web-reviewers /.github/workflows/** @element-hq/element-web-team -/package.json @element-hq/element-web-team +package.json @element-hq/element-web-team /pnpm-lock.yaml @element-hq/element-web-team -/src/SecurityManager.ts @element-hq/element-crypto-web-reviewers -/test/SecurityManager-test.ts @element-hq/element-crypto-web-reviewers -/src/async-components/views/dialogs/security/ @element-hq/element-crypto-web-reviewers -/src/components/views/dialogs/security/ @element-hq/element-crypto-web-reviewers -/test/components/views/dialogs/security/ @element-hq/element-crypto-web-reviewers -/src/stores/SetupEncryptionStore.ts @element-hq/element-crypto-web-reviewers -/test/stores/SetupEncryptionStore-test.ts @element-hq/element-crypto-web-reviewers -/src/components/views/settings/tabs/user/EncryptionUserSettingsTab.tsx @element-hq/element-crypto-web-reviewers -/src/components/views/settings/encryption/ @element-hq/element-crypto-web-reviewers -/test/unit-tests/components/views/settings/encryption/ @element-hq/element-crypto-web-reviewers -/src/components/views/dialogs/devtools/Crypto.tsx @element-hq/element-crypto-web-reviewers -/playwright/e2e/crypto/ @element-hq/element-crypto-web-reviewers -/playwright/e2e/settings/encryption-user-tab/ @element-hq/element-crypto-web-reviewers -/packages/shared-components/src/crypto/ @element-hq/element-crypto-web-reviewers +/apps/web/src/SecurityManager.ts @element-hq/element-crypto-web-reviewers +/apps/web/test/SecurityManager-test.ts @element-hq/element-crypto-web-reviewers +/apps/web/src/async-components/views/dialogs/security/ @element-hq/element-crypto-web-reviewers +/apps/web/src/components/views/dialogs/security/ @element-hq/element-crypto-web-reviewers +/apps/web/test/components/views/dialogs/security/ @element-hq/element-crypto-web-reviewers +/apps/web/src/stores/SetupEncryptionStore.ts @element-hq/element-crypto-web-reviewers +/apps/web/test/stores/SetupEncryptionStore-test.ts @element-hq/element-crypto-web-reviewers +/apps/web/src/components/views/settings/tabs/user/EncryptionUserSettingsTab.tsx @element-hq/element-crypto-web-reviewers +/apps/web/src/components/views/settings/encryption/ @element-hq/element-crypto-web-reviewers +/apps/web/test/unit-tests/components/views/settings/encryption/ @element-hq/element-crypto-web-reviewers +/apps/web/src/components/views/dialogs/devtools/Crypto.tsx @element-hq/element-crypto-web-reviewers +/apps/web/playwright/e2e/crypto/ @element-hq/element-crypto-web-reviewers +/apps/web/playwright/e2e/settings/encryption-user-tab/ @element-hq/element-crypto-web-reviewers +/packages/shared-components/src/crypto/ @element-hq/element-crypto-web-reviewers -/src/models/Call.ts @element-hq/element-call-reviewers -/src/call-types.ts @element-hq/element-call-reviewers -/src/components/views/voip @element-hq/element-call-reviewers -/playwright/e2e/voip/element-call.spec.ts @element-hq/element-call-reviewers +/apps/web/src/models/Call.ts @element-hq/element-call-reviewers +/apps/web/src/call-types.ts @element-hq/element-call-reviewers +/apps/web/src/components/views/voip @element-hq/element-call-reviewers +/apps/web/playwright/e2e/voip/element-call.spec.ts @element-hq/element-call-reviewers # Ignore translations as those will be updated by GHA for Localazy download -/src/i18n/strings +/apps/web/src/i18n/strings /packages/shared-components/src/i18n/strings -/src/i18n/strings/en_EN.json @element-hq/element-web-reviewers +/apps/web/src/i18n/strings/en_EN.json @element-hq/element-web-reviewers /packages/shared-components/src/i18n/strings/en_EN.json @element-hq/element-web-reviewers # Ignore the synapse & mas plugins as this is updated by GHA for docker image updating -/playwright/testcontainers/synapse.ts -/playwright/testcontainers/mas.ts +/apps/web/playwright/testcontainers/synapse.ts +/apps/web/playwright/testcontainers/mas.ts diff --git a/.github/renovate.json b/.github/renovate.json index 3bfef8356f..5afa859d07 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -1,5 +1,15 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": ["github>matrix-org/renovate-config-element-web"], - "postUpdateOptions": ["pnpmDedupe"] + "postUpdateOptions": ["pnpmDedupe"], + "customManagers": [ + { + "customType": "regex", + "datasourceTemplate": "docker", + "versioningTemplate": "loose", + "description": "Update testcontainers docker digests", + "managerFilePatterns": ["**/testcontainers/*.ts"], + "matchStrings": ["\\s+\"(?[^@]+):(?[^@]+)@(?sha256:[a-f0-9]+)\""] + } + ] } diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7c264064f5..d8975c8904 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,7 +12,7 @@ concurrency: env: # This must be set for fetchdep.sh to get the right branch PR_NUMBER: ${{ github.event.pull_request.number }} - NX_DEFAULT_OUTPUT_STYLE: static + NX_DEFAULT_OUTPUT_STYLE: stream-without-prefixes permissions: {} # No permissions required jobs: build: @@ -43,7 +43,7 @@ jobs: run: shell: bash steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4 - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6 @@ -57,9 +57,11 @@ jobs: run: ./scripts/layered.sh - name: Copy config + working-directory: apps/web run: cp element.io/develop/config.json config.json - name: Build + working-directory: apps/web env: CI_PACKAGE: true run: VERSION=$(scripts/get-version-from-git.sh) pnpm build @@ -68,5 +70,5 @@ jobs: uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6 with: name: webapp-${{ matrix.image }} - path: webapp + path: apps/web/webapp retention-days: 1 diff --git a/.github/workflows/build_debian.yaml b/.github/workflows/build_debian.yaml index 6ad62f85aa..91d01611fd 100644 --- a/.github/workflows/build_debian.yaml +++ b/.github/workflows/build_debian.yaml @@ -14,14 +14,16 @@ jobs: R2_URL: ${{ vars.CF_R2_S3_API }} VERSION: ${{ github.ref_name }} steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - name: Download package + working-directory: apps/web run: | wget "https://github.com/element-hq/element-web/releases/download/$VERSION/element-$VERSION.tar.gz" wget "https://github.com/element-hq/element-web/releases/download/$VERSION/element-$VERSION.tar.gz.asc" - name: Check GPG signature + working-directory: apps/web run: | wget "https://packages.element.io/element-release-key.gpg" gpg --import element-release-key.gpg @@ -31,6 +33,7 @@ jobs: FINGERPRINT: ${{ vars.GPG_FINGERPRINT }} - name: Prepare + working-directory: apps/web run: | mkdir -p debian/tmp/DEBIAN find debian -maxdepth 1 -type f -exec cp "{}" debian/tmp/DEBIAN/ \; @@ -41,6 +44,7 @@ jobs: ln -s /etc/element-web/config.json debian/tmp/usr/share/element-web/config.json - name: Write changelog + working-directory: apps/web run: | VERSION=$(cat package.json | jq -r .version) TIME=$(date -d "$PUBLISHED_AT" -R) @@ -57,6 +61,7 @@ jobs: PUBLISHED_AT: ${{ github.event.release.published_at }} - name: Build deb package + working-directory: apps/web run: | VERSION=$(cat package.json | jq -r .version) dpkg-gencontrol -v"$VERSION" -ldebian/tmp/DEBIAN/changelog @@ -65,14 +70,14 @@ jobs: - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6 with: name: element-web.deb - path: element-web.deb + path: apps/web/element-web.deb retention-days: 14 - name: Publish to packages.element.io if: github.event.release.prerelease == false uses: element-hq/packages.element.io@master with: - file: element-web.deb + file: apps/web/element-web.deb github-token: ${{ secrets.ELEMENT_BOT_TOKEN }} bucket-api: ${{ vars.CF_R2_S3_API }} bucket-key-id: ${{ secrets.CF_R2_ACCESS_KEY_ID }} diff --git a/.github/workflows/build_develop.yml b/.github/workflows/build_develop.yml index f70f860005..78227e601e 100644 --- a/.github/workflows/build_develop.yml +++ b/.github/workflows/build_develop.yml @@ -10,7 +10,7 @@ concurrency: group: ${{ github.repository_owner }}-${{ github.workflow }}-${{ github.ref_name }} cancel-in-progress: true env: - NX_DEFAULT_OUTPUT_STYLE: static + NX_DEFAULT_OUTPUT_STYLE: stream-without-prefixes permissions: {} jobs: build: @@ -28,7 +28,7 @@ jobs: R2_URL: ${{ vars.CF_R2_S3_API }} R2_PUBLIC_URL: "https://element-web-develop.element.io" steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4 - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6 @@ -40,6 +40,7 @@ jobs: run: "./scripts/layered.sh" - name: Build, Package & Upload sourcemaps + working-directory: apps/web run: "./scripts/ci_package.sh" env: SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} @@ -55,20 +56,21 @@ jobs: CSP_EXTRA_SOURCE: ${{ env.R2_PUBLIC_URL }} - run: mv dist/element-*.tar.gz dist/develop.tar.gz + working-directory: apps/web - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6 with: name: webapp - path: dist/develop.tar.gz + path: apps/web/dist/develop.tar.gz retention-days: 1 - name: Extract webapp run: | mkdir _deploy - tar xf dist/develop.tar.gz -C _deploy --strip-components=1 + tar xf apps/web/dist/develop.tar.gz -C _deploy --strip-components=1 - name: Copy config - run: cp element.io/develop/config.json _deploy/config.json + run: cp apps/web/element.io/develop/config.json _deploy/config.json - name: Populate 404.html run: echo "404 Not Found" > _deploy/404.html @@ -115,7 +117,7 @@ jobs: # Checksum algorithm specified as per https://developers.cloudflare.com/r2/examples/aws/aws-cli/ - name: Deploy to R2 run: | - aws s3 cp dist/develop.tar.gz s3://$R2_BUCKET/develop.tar.gz --endpoint-url $R2_URL --region=auto --checksum-algorithm CRC32 + aws s3 cp apps/web/dist/develop.tar.gz s3://$R2_BUCKET/develop.tar.gz --endpoint-url $R2_URL --region=auto --checksum-algorithm CRC32 aws s3 cp _deploy/ s3://$R2_BUCKET/ --recursive --endpoint-url $R2_URL --region=auto --checksum-algorithm CRC32 env: AWS_ACCESS_KEY_ID: ${{ secrets.CF_R2_ACCESS_KEY_ID }} diff --git a/.github/workflows/cd.yaml b/.github/workflows/cd.yaml new file mode 100644 index 0000000000..6010a9fbc3 --- /dev/null +++ b/.github/workflows/cd.yaml @@ -0,0 +1,78 @@ +name: CD # Continuous Delivery +on: + push: + branches: [develop] +concurrency: ${{ github.workflow }}-${{ github.ref_name }} + +permissions: {} +env: + NX_DEFAULT_OUTPUT_STYLE: static + +jobs: + docker: + name: Docker Bake + runs-on: ubuntu-24.04 + permissions: + id-token: write # needed for signing the images with GitHub OIDC Token + packages: write # needed for publishing packages to GHCR + # Needed for nx-set-shas + contents: read + actions: read + steps: + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 + with: + # We need to fetch all branches and commits so that Nx affected has a base to compare against. + fetch-depth: 0 + # reduce the size of the checkout with tree filtering, + # see https://github.blog/open-source/git/get-up-to-speed-with-partial-clone-and-shallow-clone/ + filter: tree:0 + + - name: Prepare nx + uses: nrwl/nx-set-shas@3e9ad7370203c1e93d109be57f3b72eb0eb511b1 # v4 + with: + main-branch-name: develop + + - name: Install Cosign + uses: sigstore/cosign-installer@398d4b0eeef1380460a10c8013a76f728fb906ac # v3 + + - name: Set up QEMU + uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3 + + - name: Set up Docker Buildx + id: builder + uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3 + + - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4 + - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6 + with: + node-version-file: package.json + cache: "pnpm" + + - name: Install Deps + run: "pnpm install --frozen-lockfile" + + - name: Login to GitHub Container Registry + uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - run: pnpm nx affected -t docker:build + env: + INPUT_PUSH: true + INPUT_LOAD: false + INPUT_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + INPUT_BUILDER: ${{ steps.builder.outputs.name }} + + - name: Sign the images with GitHub OIDC token + env: + PATTERN: "^ghcr.io/element-hq/element-web*" + run: | + docker image ls --digests --format '{{.Repository}}@{{.Digest}}' | grep "$PATTERN" | while read -r TARGET; do + # Check if digest is valid (not ) + if [[ "$TARGET" != *"@"* ]]; then + echo "Signing $TARGET..." + cosign sign --yes "$TARGET" + fi + done diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 7abba47247..ab09eb9fc4 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -34,7 +34,7 @@ jobs: env: SITE: ${{ inputs.site || 'staging.element.io' }} steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - name: Load GPG key run: | @@ -70,7 +70,7 @@ jobs: run: cp -vnpr _current_version/bundles/* _deploy/bundles/ - name: Copy config - run: cp element.io/app/config.json _deploy/config.json + run: cp apps/web/element.io/app/config.json _deploy/config.json - name: Populate 404.html run: echo "404 Not Found" > _deploy/404.html diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml index a11da471f9..c3943b1a40 100644 --- a/.github/workflows/docker.yaml +++ b/.github/workflows/docker.yaml @@ -20,7 +20,7 @@ jobs: env: TEST_TAG: vectorim/element-web:test steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: fetch-depth: 0 # needed for docker-package to be able to calculate the version @@ -38,9 +38,10 @@ jobs: - name: Build and load id: test-build - uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6 + uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6 with: context: . + file: apps/web/Dockerfile load: true - name: Test the image @@ -147,10 +148,11 @@ jobs: - name: Build and push id: build-and-push - uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6 + uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6 if: github.event_name != 'pull_request' with: context: . + file: apps/web/Dockerfile push: true platforms: linux/amd64,linux/arm64 tags: ${{ steps.meta.outputs.tags }} diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 3ead30584c..03a5fa139f 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -17,18 +17,18 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Fetch element-desktop - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: repository: element-hq/element-desktop path: element-desktop - name: Fetch element-web - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: path: element-web - name: Fetch matrix-js-sdk - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: repository: matrix-org/matrix-js-sdk path: matrix-js-sdk diff --git a/.github/workflows/end-to-end-tests.yaml b/.github/workflows/end-to-end-tests.yaml index 532f99e0fc..2eb40950ef 100644 --- a/.github/workflows/end-to-end-tests.yaml +++ b/.github/workflows/end-to-end-tests.yaml @@ -37,7 +37,7 @@ env: PR_NUMBER: ${{ github.event.pull_request.number }} # Use 6 runners in the default case, but 4 when running on a schedule where we run all 5 projects (20 runners total) NUM_RUNNERS: ${{ github.event_name == 'schedule' && 4 || 6 }} - NX_DEFAULT_OUTPUT_STYLE: static + NX_DEFAULT_OUTPUT_STYLE: stream-without-prefixes permissions: {} # No permissions required @@ -51,7 +51,7 @@ jobs: runners-matrix: ${{ steps.runner-vars.outputs.matrix }} steps: - name: Checkout code - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: repository: element-hq/element-web @@ -68,18 +68,20 @@ jobs: run: scripts/layered.sh - name: Copy config + working-directory: apps/web run: cp element.io/develop/config.json config.json - name: Build env: CI_PACKAGE: true + working-directory: apps/web run: VERSION=$(scripts/get-version-from-git.sh) pnpm build - name: Upload Artifact uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6 with: name: webapp - path: webapp + path: apps/web/webapp retention-days: 1 - name: Calculate runner variables @@ -124,7 +126,7 @@ jobs: - runAllTests: false project: Pinecone steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: persist-credentials: false repository: element-hq/element-web @@ -133,7 +135,7 @@ jobs: uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7 with: name: webapp - path: webapp + path: apps/web/webapp - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4 - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6 @@ -167,6 +169,7 @@ jobs: # We skip tests tagged with @mergequeue when running on PRs, but run them in MQ and everywhere else - name: Run Playwright tests + working-directory: apps/web run: | pnpm playwright test \ --shard "${{ matrix.runner }}/${{ needs.build.outputs.num-runners }}" \ @@ -178,7 +181,7 @@ jobs: uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6 with: name: all-blob-reports-${{ matrix.project }}-${{ matrix.runner }} - path: blob-report + path: apps/web/blob-report retention-days: 1 downstream-modules: @@ -197,7 +200,7 @@ jobs: if: always() runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 if: inputs.skip != true with: persist-credentials: false @@ -225,7 +228,7 @@ jobs: - name: Merge into HTML Report if: inputs.skip != true - run: pnpm playwright merge-reports --reporter=html,./playwright/flaky-reporter.ts,@element-hq/element-web-playwright-common/lib/stale-screenshot-reporter.js ./all-blob-reports + run: pnpm playwright merge-reports --reporter=html,./apps/web/playwright/flaky-reporter.ts,@element-hq/element-web-playwright-common/lib/stale-screenshot-reporter.js ./all-blob-reports env: # Only pass creds to the flaky-reporter on main branch runs GITHUB_TOKEN: ${{ github.ref_name == 'develop' && secrets.ELEMENT_BOT_TOKEN || '' }} diff --git a/.github/workflows/localazy_upload.yaml b/.github/workflows/localazy_upload.yaml index ad23f350f7..16b8df5972 100644 --- a/.github/workflows/localazy_upload.yaml +++ b/.github/workflows/localazy_upload.yaml @@ -1,9 +1,10 @@ name: Localazy Upload on: + workflow_dispatch: {} push: branches: [develop] paths: - - "src/i18n/strings/en_EN.json" + - "apps/web/src/i18n/strings/en_EN.json" - "packages/shared-components/src/i18n/strings/en_EN.json" permissions: {} # No permissions needed jobs: diff --git a/.github/workflows/pending-reviews.yaml b/.github/workflows/pending-reviews.yaml deleted file mode 100644 index 0474e60aa0..0000000000 --- a/.github/workflows/pending-reviews.yaml +++ /dev/null @@ -1,92 +0,0 @@ -name: Pending reviews automation -on: - # The bot exceeded its API rate limit. Disabling for now (adding workflow dispatch so the workflow file stays valid & we can test to see if it starts working again) - workflow_dispatch: {} - # We run it on a schedule instead of on pull_request_* events to not create confusing messaging in the PR - #schedule: - # - cron: "*/10 * * * *" -concurrency: ${{ github.workflow }} -permissions: {} # We use ELEMENT_BOT_TOKEN instead -jobs: - bot: - name: Pending reviews bot - runs-on: ubuntu-24.04 - environment: Matrix - env: - URL: "https://github.com/pulls?q=is%3Apr+is%3Aopen+repo%3Amatrix-org%2Fmatrix-js-sdk+repo%3Amatrix-org%2Fmatrix-react-sdk+repo%3Aelement-hq%2Felement-web+repo%3Aelement-hq%2Felement-desktop+review-requested%3A%40me+sort%3Aupdated-desc+" - RELEASE_BLOCKERS_URL: "https://github.com/pulls?q=is%3Aopen+repo%3Amatrix-org%2Fmatrix-js-sdk+repo%3Amatrix-org%2Fmatrix-react-sdk+repo%3Aelement-hq%2Felement-web+repo%3Aelement-hq%2Felement-desktop+sort%3Aupdated-desc+label%3AX-Release-Blocker+" - steps: - - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 - env: - HS_URL: ${{ secrets.BETABOT_HS_URL }} - ROOM_ID: ${{ secrets.ROOM_ID }} - TOKEN: ${{ secrets.BETABOT_ACCESS_TOKEN }} - with: - # PAT needed as the GITHUB_TOKEN won't be able to see cross-references from other orgs (matrix-org) - github-token: ${{ secrets.ELEMENT_BOT_TOKEN }} - script: | - const { HS_URL, ROOM_ID, TOKEN, URL, RELEASE_BLOCKERS_URL } = process.env; - - async function updateCounter(counter, link, severity, title, value, clearOnZero) { - const apiUrl = `${HS_URL}/_matrix/client/v3/rooms/${ROOM_ID}/state/re.jki.counter/${counter}`; - const headers = { - "Content-Type": "application/json", - "Authorization": `Bearer ${TOKEN}`, - }; - const res = await fetch(apiUrl, { - method: "GET", - headers, - }); - - const data = await res.json(); - - if (data.value === issueCount) { - console.log("Pending review count already correct"); - return; - } - - let body = {}; - if (issueCount || !clearOnZero) { - body = JSON.stringify({ - link, - severity, - title, - value, - }); - } - - await fetch(apiUrl, { - method: "PUT", - body, - headers, - }); - } - - const repos = [ - "element-hq/element-desktop", - "element-hq/element-web", - "matrix-org/matrix-js-sdk", - ]; - const teams = [ - "matrix-org/element-web-team", - "matrix-org/element-web-reviewers", - "element-hq/element-web-team", - "element-hq/element-web-reviewers", - ]; - - let issueCount = 0; - for (const team of teams) { - const org = team.split("/", 2)[0]; - const reposInOrg = repos.filter(repo => repo.startsWith(org + "/")); - const { data } = await github.rest.search.issuesAndPullRequests({ - q: `is:pr is:open review:required ${reposInOrg.map(r => `repo:${r}`).join(" ")} team-review-requested:${team}`, - }); - issueCount += data.total_count; - } - await updateCounter("gh_reviews", URL, "warning", "Pending reviews", issueCount); - - const { data } = await github.rest.search.issuesAndPullRequests({ - q: `is:open ${repos.map(repo => `repo:${repo}`).join(" ")} label:X-Release-Blocker`, - }); - const blockerCount = data.total_count; - await updateCounter("release_blockers", RELEASE_BLOCKERS_URL, "alert", "Release Blockers", blockerCount, true); diff --git a/.github/workflows/playwright-image-updates.yaml b/.github/workflows/playwright-image-updates.yaml deleted file mode 100644 index d0cd242884..0000000000 --- a/.github/workflows/playwright-image-updates.yaml +++ /dev/null @@ -1,57 +0,0 @@ -name: Update Playwright docker images -on: - workflow_dispatch: {} - schedule: - - cron: "0 6 * * *" # Every day at 6am UTC -permissions: {} -jobs: - update: - runs-on: ubuntu-24.04 - permissions: - pull-requests: write - steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 - - - name: Update synapse image - run: | - docker pull "$IMAGE" - INSPECT=$(docker inspect --format='{{index .RepoDigests 0}}' "$IMAGE") - DIGEST=${INSPECT#*@} - sed -i "s/const TAG.*/const TAG = \"develop@$DIGEST\";/" playwright/testcontainers/synapse.ts - env: - IMAGE: ghcr.io/element-hq/synapse:develop - - - name: Update MAS image - run: | - docker pull "$IMAGE" - INSPECT=$(docker inspect --format='{{index .RepoDigests 0}}' "$IMAGE") - DIGEST=${INSPECT#*@} - sed -i "s/const TAG.*/const TAG = \"main@$DIGEST\";/" playwright/testcontainers/mas.ts - env: - IMAGE: ghcr.io/element-hq/matrix-authentication-service:main - - - name: Create Pull Request - id: cpr - uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8 - with: - token: ${{ secrets.ELEMENT_BOT_TOKEN }} - branch: actions/playwright-image-updates - delete-branch: true - title: Playwright Docker image updates - labels: | - T-Task - - - name: Enable automerge - run: gh pr merge --merge --auto "$PR_NUMBER" - if: steps.cpr.outputs.pull-request-operation == 'created' - env: - GH_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} - PR_NUMBER: ${{ steps.cpr.outputs.pull-request-number }} - - - name: Enable autoapprove - run: | - gh pr review --approve "$PR_NUMBER" - if: steps.cpr.outputs.pull-request-operation == 'created' - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - PR_NUMBER: ${{ steps.cpr.outputs.pull-request-number }} diff --git a/.github/workflows/release-gitflow.yml b/.github/workflows/release-gitflow.yml index 128c6a1e05..a776a12987 100644 --- a/.github/workflows/release-gitflow.yml +++ b/.github/workflows/release-gitflow.yml @@ -11,5 +11,6 @@ jobs: secrets: ELEMENT_BOT_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} with: + dir: apps/web dependencies: | matrix-js-sdk diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 78383e8bf5..c182aa8661 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -29,6 +29,7 @@ jobs: gpg-fingerprint: ${{ vars.GPG_FINGERPRINT }} asset-path: dist/*.tar.gz expected-asset-count: 3 + dir: apps/web notify-downstream: name: Trigger release drafter downstream diff --git a/.github/workflows/release_prepare.yml b/.github/workflows/release_prepare.yml index 7be70e6b00..b0b89a7eea 100644 --- a/.github/workflows/release_prepare.yml +++ b/.github/workflows/release_prepare.yml @@ -41,7 +41,7 @@ jobs: REPOS: matrix-js-sdk element-web element-desktop steps: - name: Checkout Element Desktop - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 if: inputs.element-desktop with: repository: element-hq/element-desktop @@ -51,7 +51,7 @@ jobs: fetch-tags: true token: ${{ secrets.ELEMENT_BOT_TOKEN }} - name: Checkout Element Web - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 if: inputs.element-web with: repository: element-hq/element-web @@ -61,7 +61,7 @@ jobs: fetch-tags: true token: ${{ secrets.ELEMENT_BOT_TOKEN }} - name: Checkout Matrix JS SDK - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 if: inputs.matrix-js-sdk with: repository: matrix-org/matrix-js-sdk diff --git a/.github/workflows/shared-component-publish.yaml b/.github/workflows/shared-component-publish.yaml index 1ec7775297..38164878ea 100644 --- a/.github/workflows/shared-component-publish.yaml +++ b/.github/workflows/shared-component-publish.yaml @@ -13,7 +13,7 @@ jobs: steps: - name: 🧮 Checkout code - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4 - name: 🔧 Set up node environment diff --git a/.github/workflows/shared-component-storybook-build.yml b/.github/workflows/shared-component-storybook-build.yml new file mode 100644 index 0000000000..3484d5a427 --- /dev/null +++ b/.github/workflows/shared-component-storybook-build.yml @@ -0,0 +1,36 @@ +name: Build shared component storybook +on: + merge_group: {} + pull_request: {} + workflow_call: {} + +permissions: {} + +jobs: + doc: + name: Build storybook + runs-on: ubuntu-latest + steps: + - name: 🧮 Checkout code + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + + - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4 + - name: 🔧 Pnpm cache + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6 + with: + cache: "pnpm" + node-version-file: package.json + + - name: 🔨 Install dependencies + working-directory: packages/shared-components + run: "pnpm install --frozen-lockfile" + + - name: 📖 Build Storybook + working-directory: packages/shared-components + run: pnpm build:storybook + + - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6 + with: + name: shared-components-storybook + path: packages/shared-components/storybook-static + retention-days: 1 diff --git a/.github/workflows/shared-component-storybook-publish.yaml b/.github/workflows/shared-component-storybook-publish.yaml index 8dbbaa7f86..de401c23ea 100644 --- a/.github/workflows/shared-component-storybook-publish.yaml +++ b/.github/workflows/shared-component-storybook-publish.yaml @@ -10,34 +10,24 @@ on: permissions: {} jobs: - doc: + build: + name: Build storybook + uses: ./.github/workflows/shared-component-storybook-build.yml + + publish: name: Publish storybook runs-on: ubuntu-latest + needs: build environment: SharedComponents steps: - - name: 🧮 Checkout code - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 - - - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4 - - name: 🔧 Pnpm cache - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6 + - uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7 with: - cache: "pnpm" - node-version-file: package.json - - - name: 🔨 Install dependencies - working-directory: packages/shared-components - run: "pnpm install --frozen-lockfile" - - - name: 📖 Build Storybook - working-directory: packages/shared-components - run: pnpm build:storybook + name: shared-components-storybook + path: storybook-static - name: 🚀 Deploy to Cloudflare Pages - uses: cloudflare/wrangler-action@9681c2997648301493e78cacbfb790a9f19c833f # v3 + uses: cloudflare/wrangler-action@da0e0dfe58b7a431659754fdf3f186c529afbe65 # v3 with: apiToken: ${{ secrets.CF_PAGES_TOKEN }} accountId: ${{ secrets.CF_PAGES_ACCOUNT_ID }} - workingDirectory: "packages/shared-components" - packageManager: "pnpm" command: pages deploy storybook-static --project-name=shared-components-storybook diff --git a/.github/workflows/shared-component-visual-tests.yaml b/.github/workflows/shared-component-visual-tests.yaml index e242dde766..68c6b38beb 100644 --- a/.github/workflows/shared-component-visual-tests.yaml +++ b/.github/workflows/shared-component-visual-tests.yaml @@ -21,7 +21,7 @@ jobs: issues: read pull-requests: read steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: persist-credentials: false repository: element-hq/element-web diff --git a/.github/workflows/static_analysis.yaml b/.github/workflows/static_analysis.yaml index 937b9f44ff..5409d55b8a 100644 --- a/.github/workflows/static_analysis.yaml +++ b/.github/workflows/static_analysis.yaml @@ -14,147 +14,100 @@ concurrency: env: # This must be set for fetchdep.sh to get the right branch PR_NUMBER: ${{ github.event.pull_request.number }} - NX_DEFAULT_OUTPUT_STYLE: static + NX_DEFAULT_OUTPUT_STYLE: stream-without-prefixes permissions: {} # No permissions required jobs: - ts_lint: - name: "Typescript Syntax Check" + lint: + strategy: + fail-fast: false + matrix: + include: + - name: Typescript Syntax Check + install: layered + command: "lint:types" + - name: Prettier + install: normal + command: "lint:prettier" + - name: ESLint + install: normal + command: "lint:js" + - name: Style Lint + install: normal + command: "lint:style" + - name: Workflow Lint + install: normal + command: "lint:workflows" + - name: Analyse Dead Code + install: normal + command: "lint:knip" + - name: Rethemendex Check + command: "rethemendex" + assert-diff: true + name: ${{ matrix.name }} runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4 - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6 + if: matrix.install != '' with: cache: "pnpm" node-version: "lts/*" - - name: Install Dependencies + - name: Install Dependencies (layered) + if: matrix.install == 'layered' run: "./scripts/layered.sh" + - name: Install Dependencies (normal) + if: matrix.install == 'normal' + run: "pnpm install --frozen-lockfile" - - name: Typecheck - run: "pnpm run lint:types" + - name: Run ${{ matrix.command }} + run: pnpm --if-present run "$CMD" && pnpm -r --if-present run "$CMD" + env: + CMD: ${{ matrix.command }} - - name: Typecheck Shared Components - run: "pnpm --dir packages/shared-components run lint:types" + - name: Assert no changes + run: git diff --exit-code + if: matrix.assert-diff - i18n_lint_ew: - name: "i18n Check (Element Web)" - uses: matrix-org/matrix-web-i18n/.github/workflows/i18n_check.yml@3673fd3abbf8dfae1de849c6cd3e69e24ed7a766 + i18n: + strategy: + fail-fast: false + matrix: + include: + - name: Element Web + path: "apps/web" + allowed-hardcoded-keys: | + console_dev_note + labs|element_call_video_rooms + labs|feature_disable_call_per_sender_encryption + voip|element_call + error|invalid_json + error|misconfigured + welcome_to_element + devtools|settings|elementCallUrl + labs|sliding_sync_description + settings|voip|noise_suppression_description + settings|voip|echo_cancellation_description + - name: Shared Components + path: "packages/shared-components" + name: "i18n Check (${{ matrix.name }})" + uses: matrix-org/matrix-web-i18n/.github/workflows/i18n_check.yml@main permissions: pull-requests: read with: hardcoded-words: "Element" packageManager: pnpm - allowed-hardcoded-keys: | - console_dev_note - labs|element_call_video_rooms - labs|feature_disable_call_per_sender_encryption - voip|element_call - error|invalid_json - error|misconfigured - welcome_to_element - devtools|settings|elementCallUrl - labs|sliding_sync_description - settings|voip|noise_suppression_description - settings|voip|echo_cancellation_description + path: ${{ matrix.path }} + allowed-hardcoded-keys: ${{ matrix.allowed-hardcoded-keys }} - i18n_lint_shared_components: - name: "i18n Check (Shared Components)" - uses: matrix-org/matrix-web-i18n/.github/workflows/i18n_check.yml@3673fd3abbf8dfae1de849c6cd3e69e24ed7a766 - permissions: - pull-requests: read - with: - path: "packages/shared-components" - hardcoded-words: "Element" - packageManager: pnpm - - rethemendex_lint: - name: "Rethemendex Check" + # Dummy job to simplify branch protections + ci: + name: Static Analysis + needs: [lint, i18n] runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 - - - run: ./res/css/rethemendex.sh - - - run: git diff --exit-code - - js_lint: - name: "ESLint" - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 - - - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4 - - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6 - with: - cache: "pnpm" - node-version: "lts/*" - - # Does not need branch matching as only analyses this layer - - name: Install Deps - run: "pnpm install --frozen-lockfile" - - - name: Run Linter - run: "pnpm run lint:js" - - - name: Run Linter - run: "pnpm --dir packages/shared-components run lint:js" - - style_lint: - name: "Style Lint" - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 - - - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4 - - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6 - with: - cache: "pnpm" - node-version: "lts/*" - - # Does not need branch matching as only analyses this layer - - name: Install Deps - run: "pnpm install" - - - name: Run Linter - run: "pnpm run lint:style" - - workflow_lint: - name: "Workflow Lint" - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 - - - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4 - - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6 - with: - cache: "pnpm" - node-version: "lts/*" - - # Does not need branch matching as only analyses this layer - - name: Install Deps - run: "pnpm install --frozen-lockfile" - - - name: Run Linter - run: "pnpm lint:workflows" - - analyse_dead_code: - name: "Analyse Dead Code" - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 - - - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4 - - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6 - with: - cache: "pnpm" - node-version: "lts/*" - - - name: Install Deps - run: "pnpm install --frozen-lockfile" - - - name: Run linter - run: "pnpm run lint:knip" + - run: echo "Ok" diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 2be50c8f89..5e2b9c94d8 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -25,7 +25,7 @@ env: ENABLE_COVERAGE: ${{ github.event_name != 'merge_group' && inputs.disable_coverage != 'true' }} # fetchdep.sh needs to know our PR number PR_NUMBER: ${{ github.event.pull_request.number }} - NX_DEFAULT_OUTPUT_STYLE: static + NX_DEFAULT_OUTPUT_STYLE: stream-without-prefixes permissions: {} @@ -40,7 +40,7 @@ jobs: runner: [1, 2] steps: - name: Checkout code - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: repository: ${{ inputs.matrix-js-sdk-sha && 'element-hq/element-web' || github.repository }} @@ -67,10 +67,12 @@ jobs: uses: SimenB/github-actions-cpu-cores@97ba232459a8e02ff6121db9362b09661c875ab8 # v2 - name: Run tests + working-directory: apps/web run: | pnpm test \ --coverage=${{ env.ENABLE_COVERAGE }} \ --ci \ + --no-tui \ --max-workers ${{ steps.cpu-cores.outputs.count }} \ --shard ${{ matrix.runner }}/${{ strategy.job-total }} \ --cacheDirectory /tmp/jest_cache @@ -82,6 +84,7 @@ jobs: - name: Move coverage files into place if: env.ENABLE_COVERAGE == 'true' + working-directory: apps/web run: mv coverage/lcov.info coverage/${{ steps.setupNode.outputs.node-version }}-${{ matrix.runner }}.lcov.info - name: Upload Artifact @@ -90,8 +93,8 @@ jobs: with: name: coverage-${{ matrix.runner }} path: | - coverage - !coverage/lcov-report + apps/web/coverage + !apps/web/coverage/lcov-report complete: name: jest-tests @@ -120,7 +123,7 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Checkout code - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: repository: ${{ inputs.matrix-js-sdk-sha && 'element-hq/element-web' || github.repository }} diff --git a/.github/workflows/triage-stale.yml b/.github/workflows/triage-stale.yml index c7a9d1ba31..bd2df0a568 100644 --- a/.github/workflows/triage-stale.yml +++ b/.github/workflows/triage-stale.yml @@ -12,7 +12,7 @@ jobs: issues: write pull-requests: write steps: - - uses: actions/stale@997185467fa4f803885201cee163a9f38240193d # v10 + - uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v10 with: operations-per-run: 100 diff --git a/.github/workflows/update-jitsi.yml b/.github/workflows/update-jitsi.yml index 49acd1b704..f4f4409190 100644 --- a/.github/workflows/update-jitsi.yml +++ b/.github/workflows/update-jitsi.yml @@ -9,7 +9,7 @@ jobs: update: runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4 - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6 @@ -21,6 +21,7 @@ jobs: run: "pnpm install --frozen-lockfile" - name: Fetch Jitsi + working-directory: apps/web run: "pnpm vendor:jitsi" - name: Create Pull Request diff --git a/.gitignore b/.gitignore index 90b326d79d..3fb5035a38 100644 --- a/.gitignore +++ b/.gitignore @@ -3,29 +3,19 @@ /dist /key.pem /lib -/node_modules -/webapp +node_modules /.npmrc /*.log package-lock.json .DS_Store -electron/dist -electron/pub **/.idea -/config.json -/config.json.* -/config.local*.json -# Legacy skinning file that some people might still have -/src/component-index.js -/.tmp /webpack-stats.json +/.tmp .vscode .vscode/ .env -/coverage -# Auto-generated file -/src/modules.js -/build_config.yaml +.env.* +coverage /book /index.html # version file and tarball created by `npm pack` / `yarn pack` diff --git a/.lintstagedrc b/.lintstagedrc index 6b93e89d5a..01cb44a5de 100644 --- a/.lintstagedrc +++ b/.lintstagedrc @@ -1,7 +1,3 @@ { - "*": "prettier --write", - "src/**/*.(ts|tsx)": ["eslint --fix"], - "scripts/**/*.(ts|tsx)": ["eslint --fix"], - "module_system/**/*.(ts|tsx)": ["eslint --fix"], - "*.pcss": ["stylelint --fix"] + "*": "prettier --write" } diff --git a/.prettierignore b/.prettierignore index 9f619a9e49..b2455d46db 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,30 +1,30 @@ /build /dist /lib -/node_modules -/webapp +node_modules +/apps/web/webapp /*.log pnpm-lock.yaml electron/dist electron/pub **/.idea /.tmp -/webpack-stats.json +webpack-stats.json .vscode .vscode/ .env -/coverage +coverage # Auto-generated file -/src/modules.ts -/src/modules.js -/src/i18n/strings -/build_config.yaml +/apps/web/src/modules.ts +/apps/web/src/modules.js +src/i18n/strings +/apps/web//build_config.yaml # Raises an error because it contains a template var breaking the script tag -src/vector/index.html -src/vector/modernizr.cjs +/apps/web/src/vector/index.html +/apps/web/src/vector/modernizr.cjs /docs/lib /book -/debian/tmp +debian/tmp /.npmrc package-lock.json @@ -33,20 +33,22 @@ package-lock.json /docs/changelogs # Legacy skinning file that some people might still have -/src/component-index.js +/apps/web/src/component-index.js # Downloaded and already minified -res/jitsi_external_api.min.js +/apps/web/res/jitsi_external_api.min.js # This file is also machine-generated -/playwright/e2e/crypto/test_indexeddb_cryptostore_dump/dump.json -/playwright/test-results/ -/playwright/html-report/ -/playwright/logs/ -/playwright/snapshots/ +/apps/web/playwright/e2e/crypto/test_indexeddb_cryptostore_dump/dump.json +/apps/web/playwright/test-results/ +/apps/web/playwright/html-report/ +/apps/web/playwright/logs/ +/apps/web/playwright/snapshots/ # Shared components generated files -packages/shared-components/dist/ -packages/shared-components/src/i18n/i18nKeys.d.ts -packages/shared-components/typedoc/ +/packages/shared-components/dist/ +/packages/shared-components/src/i18n/i18nKeys.d.ts +/packages/shared-components/typedoc/ +/packages/shared-components/storybook-static/ +/.nx/ diff --git a/README.md b/README.md index 717f34a0f6..c236b953dc 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ # Element -Element (formerly known as Vector and Riot) is a Matrix web client built using the [Matrix +Element (formerly known as Vector and Riot) is a Matrix web & desktop client built using the [Matrix JS SDK](https://github.com/matrix-org/matrix-js-sdk). # Supported Environments @@ -42,8 +42,8 @@ Element has several tiers of support for different environments: The period of support for these tiers should last until the releases specified above, plus 1 app release cycle(2 weeks). In the case of Firefox ESR this is extended further to allow it land in Debian Stable. For accessing Element on an Android or iOS device, we currently recommend the -native apps [element-android](https://github.com/element-hq/element-android) -and [element-ios](https://github.com/element-hq/element-ios). +native apps [element-x-android](https://github.com/element-hq/element-x-android) +and [element-x-ios](https://github.com/element-hq/element-x-ios). # Getting Started @@ -55,91 +55,16 @@ To host your own instance of Element see [Installing Element Web](docs/install.m To install Element as a desktop application, see [Running as a desktop app](#running-as-a-desktop-app) below. -# Important Security Notes +--- -## Separate domains +# Monorepo -We do not recommend running Element from the same domain name as your Matrix -homeserver. The reason is the risk of XSS (cross-site-scripting) -vulnerabilities that could occur if someone caused Element to load and render -malicious user generated content from a Matrix API which then had trusted -access to Element (or other apps) due to sharing the same domain. +This repository is a monorepo hosting Element Web and other related projects in various subdirectories. +You can read more about the structure [here](docs/monorepo.md). -We have put some coarse mitigations into place to try to protect against this -situation, but it's still not good practice to do it in the first place. See - for more details. +# Element Web -## Configuration best practices - -Unless you have special requirements, you will want to add the following to -your web server configuration when hosting Element Web: - -- The `X-Frame-Options: SAMEORIGIN` header, to prevent Element Web from being - framed and protect from [clickjacking][owasp-clickjacking]. -- The `frame-ancestors 'self'` directive to your `Content-Security-Policy` - header, as the modern replacement for `X-Frame-Options` (though both should be - included since not all browsers support it yet, see - [this][owasp-clickjacking-csp]). -- The `X-Content-Type-Options: nosniff` header, to [disable MIME - sniffing][mime-sniffing]. -- The `X-XSS-Protection: 1; mode=block;` header, for basic XSS protection in - legacy browsers. - -[mime-sniffing]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types#mime_sniffing -[owasp-clickjacking-csp]: https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html#content-security-policy-frame-ancestors-examples -[owasp-clickjacking]: https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html - -If you are using nginx, this would look something like the following: - -``` -add_header X-Frame-Options SAMEORIGIN; -add_header X-Content-Type-Options nosniff; -add_header X-XSS-Protection "1; mode=block"; -add_header Content-Security-Policy "frame-ancestors 'self'"; -``` - -For Apache, the configuration looks like: - -``` -Header set X-Frame-Options SAMEORIGIN -Header set X-Content-Type-Options nosniff -Header set X-XSS-Protection "1; mode=block" -Header set Content-Security-Policy "frame-ancestors 'self'" -``` - -Note: In case you are already setting a `Content-Security-Policy` header -elsewhere, you should modify it to include the `frame-ancestors` directive -instead of adding that last line. - -# Building From Source - -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 `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 `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: `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 - can use - the continuous integration release of - 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. `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 `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 -entirely static content. +To learn more about Element Web [click here](apps/web/README.md) # Running as a Desktop app @@ -153,33 +78,6 @@ Many thanks to @aviraldg for the initial work on the Electron integration. The [configuration docs](docs/config.md#desktop-app-configuration) show how to override the desktop app's default settings if desired. -# config.json - -Element supports a variety of settings to configure default servers, behaviour, themes, etc. -See the [configuration docs](docs/config.md) for more details. - -# Labs Features - -Some features of Element may be enabled by flags in the `Labs` section of the settings. -Some of these features are described in [labs.md](https://github.com/element-hq/element-web/blob/develop/docs/labs.md). - -# Caching requirements - -Element requires the following URLs not to be cached, when/if you are serving Element from your own webserver: - -``` -/config.*.json -/i18n -/home -/sites -/index.html -``` - -We also recommend that you force browsers to re-validate any cached copy of Element on page load by configuring your -webserver to return `Cache-Control: no-cache` for `/`. This ensures the browser will fetch a new version of Element on -the next page load after it's been deployed. Note that this is already configured for you in the nginx config of our -Dockerfile. - # Development Please read through the following: @@ -194,17 +92,6 @@ 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). diff --git a/.dockerignore b/apps/web/.dockerignore similarity index 100% rename from .dockerignore rename to apps/web/.dockerignore diff --git a/.eslintignore b/apps/web/.eslintignore similarity index 100% rename from .eslintignore rename to apps/web/.eslintignore diff --git a/.eslintrc.cjs b/apps/web/.eslintrc.cjs similarity index 99% rename from .eslintrc.cjs rename to apps/web/.eslintrc.cjs index e4aaf87fb3..a5cc00f80b 100644 --- a/.eslintrc.cjs +++ b/apps/web/.eslintrc.cjs @@ -199,6 +199,7 @@ module.exports = { files: ["src/**/*.{ts,tsx}", "test/**/*.{ts,tsx}", "playwright/**/*.ts", "*.ts"], extends: ["plugin:matrix-org/typescript", "plugin:matrix-org/react"], rules: { + "@typescript-eslint/unbound-method": ["error", { ignoreStatic: true }], "@typescript-eslint/explicit-function-return-type": [ "error", { @@ -238,6 +239,7 @@ module.exports = { "@typescript-eslint/explicit-function-return-type": "off", "@typescript-eslint/explicit-member-accessibility": "off", "@typescript-eslint/no-empty-object-type": "off", + "@typescript-eslint/unbound-method": "off", // Jest/Playwright specific diff --git a/apps/web/.gitignore b/apps/web/.gitignore new file mode 100644 index 0000000000..da3848aea3 --- /dev/null +++ b/apps/web/.gitignore @@ -0,0 +1,9 @@ +/webapp +/config.json +/config.json.* +/config.local*.json +# Legacy skinning file that some people might still have +/src/component-index.js +# Auto-generated file +/src/modules.js +/build_config.yaml diff --git a/apps/web/.lintstagedrc b/apps/web/.lintstagedrc new file mode 100644 index 0000000000..6b93e89d5a --- /dev/null +++ b/apps/web/.lintstagedrc @@ -0,0 +1,7 @@ +{ + "*": "prettier --write", + "src/**/*.(ts|tsx)": ["eslint --fix"], + "scripts/**/*.(ts|tsx)": ["eslint --fix"], + "module_system/**/*.(ts|tsx)": ["eslint --fix"], + "*.pcss": ["stylelint --fix"] +} diff --git a/.modernizr.json b/apps/web/.modernizr.json similarity index 100% rename from .modernizr.json rename to apps/web/.modernizr.json diff --git a/.stylelintrc.cjs b/apps/web/.stylelintrc.cjs similarity index 87% rename from .stylelintrc.cjs rename to apps/web/.stylelintrc.cjs index 2cbebc0472..57c39e8c05 100644 --- a/.stylelintrc.cjs +++ b/apps/web/.stylelintrc.cjs @@ -55,17 +55,16 @@ module.exports = { { from: "res/css/views/rooms/_ReadReceiptGroup.pcss", type: "css" }, { from: "res/css/views/rooms/_EditMessageComposer.pcss", type: "css" }, { from: "res/css/views/right_panel/_BaseCard.pcss", type: "css" }, - { from: "res/css/views/messages/_MessageTimestamp.pcss", type: "css" }, { from: "res/css/views/messages/_MessageActionBar.pcss", type: "css" }, { from: "res/css/views/voip/LegacyCallView/_LegacyCallViewButtons.pcss", type: "css" }, { from: "res/css/views/elements/_ToggleSwitch.pcss", type: "css" }, { from: "res/css/views/settings/tabs/_SettingsTab.pcss", type: "css" }, { from: "res/css/structures/_RoomView.pcss", type: "css" }, // Compound vars - "node_modules/@vector-im/compound-design-tokens/assets/web/css/cpd-common-base.css", - "node_modules/@vector-im/compound-design-tokens/assets/web/css/cpd-common-semantic.css", - "node_modules/@vector-im/compound-design-tokens/assets/web/css/cpd-theme-light-base-mq.css", - "node_modules/@vector-im/compound-design-tokens/assets/web/css/cpd-theme-light-semantic-mq.css", + "../../node_modules/@vector-im/compound-design-tokens/assets/web/css/cpd-common-base.css", + "../../node_modules/@vector-im/compound-design-tokens/assets/web/css/cpd-common-semantic.css", + "../../node_modules/@vector-im/compound-design-tokens/assets/web/css/cpd-theme-light-base-mq.css", + "../../node_modules/@vector-im/compound-design-tokens/assets/web/css/cpd-theme-light-semantic-mq.css", ], }, ], diff --git a/@types/declaration.d.ts b/apps/web/@types/declaration.d.ts similarity index 100% rename from @types/declaration.d.ts rename to apps/web/@types/declaration.d.ts diff --git a/@types/postcss-easings.d.ts b/apps/web/@types/postcss-easings.d.ts similarity index 100% rename from @types/postcss-easings.d.ts rename to apps/web/@types/postcss-easings.d.ts diff --git a/@types/postcss-hexrgba.d.ts b/apps/web/@types/postcss-hexrgba.d.ts similarity index 100% rename from @types/postcss-hexrgba.d.ts rename to apps/web/@types/postcss-hexrgba.d.ts diff --git a/@types/postcss-mixins.d.ts b/apps/web/@types/postcss-mixins.d.ts similarity index 100% rename from @types/postcss-mixins.d.ts rename to apps/web/@types/postcss-mixins.d.ts diff --git a/@types/webpack-version-file-plugin.d.ts b/apps/web/@types/webpack-version-file-plugin.d.ts similarity index 100% rename from @types/webpack-version-file-plugin.d.ts rename to apps/web/@types/webpack-version-file-plugin.d.ts diff --git a/Dockerfile b/apps/web/Dockerfile similarity index 70% rename from Dockerfile rename to apps/web/Dockerfile index 30aabc95ed..0402e9c0a6 100644 --- a/Dockerfile +++ b/apps/web/Dockerfile @@ -1,7 +1,7 @@ # syntax=docker.io/docker/dockerfile:1.21-labs@sha256:2e681d22e86e738a057075f930b81b2ab8bc2a34cd16001484a7453cfa7a03fb # Builder -FROM --platform=$BUILDPLATFORM node:24-bullseye@sha256:8036dbe5b1f465e3acb8b866031cd06e4f84c31b0e83dabbdc59397a40dbe288 AS builder +FROM --platform=$BUILDPLATFORM node:24-bullseye@sha256:38edad6b2e5962120f5144ff9dd3dbd223c7f140ba6fa03920d62d28b021402b AS builder # Support custom branch of the js-sdk. This also helps us build images of element-web develop. ARG USE_CUSTOM_SDKS=false @@ -17,10 +17,10 @@ RUN pnpm install RUN /src/scripts/docker-package.sh # Copy the config now so that we don't create another layer in the app image -RUN cp /src/config.sample.json /src/webapp/config.json +RUN cp /src/apps/web/config.sample.json /src/apps/web/webapp/config.json # App -FROM nginxinc/nginx-unprivileged:alpine-slim@sha256:9ac6a908ed07ba7d23cbf6048090453a081abf663c53a7c3f3bf96abc16c0799 +FROM nginxinc/nginx-unprivileged:alpine-slim@sha256:c9448f9aaf2dee3dccfe0d2e51d6927cc9fbfdbcada66b0b01c0759816d86a5b # Need root user to install packages & manipulate the usr directory USER root @@ -28,12 +28,12 @@ USER root # Install jq and moreutils for sponge, both used by our entrypoints RUN apk add jq moreutils -COPY --from=builder /src/webapp /app +COPY --from=builder /src/apps/web/webapp /app # Override default nginx config. Templates in `/etc/nginx/templates` are passed # through `envsubst` by the nginx docker image entry point. -COPY /docker/nginx-templates/* /etc/nginx/templates/ -COPY /docker/docker-entrypoint.d/* /docker-entrypoint.d/ +COPY /apps/web/docker/nginx-templates/* /etc/nginx/templates/ +COPY /apps/web/docker/docker-entrypoint.d/* /docker-entrypoint.d/ RUN rm -rf /usr/share/nginx/html \ && ln -s /app /usr/share/nginx/html diff --git a/apps/web/README.md b/apps/web/README.md new file mode 100644 index 0000000000..b10652d455 --- /dev/null +++ b/apps/web/README.md @@ -0,0 +1,131 @@ +# Important Security Notes + +## Separate domains + +We do not recommend running Element from the same domain name as your Matrix +homeserver. The reason is the risk of XSS (cross-site-scripting) +vulnerabilities that could occur if someone caused Element to load and render +malicious user generated content from a Matrix API which then had trusted +access to Element (or other apps) due to sharing the same domain. + +We have put some coarse mitigations into place to try to protect against this +situation, but it's still not good practice to do it in the first place. See + for more details. + +## Configuration best practices + +Unless you have special requirements, you will want to add the following to +your web server configuration when hosting Element Web: + +- The `X-Frame-Options: SAMEORIGIN` header, to prevent Element Web from being + framed and protect from [clickjacking][owasp-clickjacking]. +- The `frame-ancestors 'self'` directive to your `Content-Security-Policy` + header, as the modern replacement for `X-Frame-Options` (though both should be + included since not all browsers support it yet, see + [this][owasp-clickjacking-csp]). +- The `X-Content-Type-Options: nosniff` header, to [disable MIME + sniffing][mime-sniffing]. +- The `X-XSS-Protection: 1; mode=block;` header, for basic XSS protection in + legacy browsers. + +[mime-sniffing]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types#mime_sniffing +[owasp-clickjacking-csp]: https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html#content-security-policy-frame-ancestors-examples +[owasp-clickjacking]: https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html + +If you are using nginx, this would look something like the following: + +``` +add_header X-Frame-Options SAMEORIGIN; +add_header X-Content-Type-Options nosniff; +add_header X-XSS-Protection "1; mode=block"; +add_header Content-Security-Policy "frame-ancestors 'self'"; +``` + +For Apache, the configuration looks like: + +``` +Header set X-Frame-Options SAMEORIGIN +Header set X-Content-Type-Options nosniff +Header set X-XSS-Protection "1; mode=block" +Header set Content-Security-Policy "frame-ancestors 'self'" +``` + +Note: In case you are already setting a `Content-Security-Policy` header +elsewhere, you should modify it to include the `frame-ancestors` directive +instead of adding that last line. + +# Building From Source + +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 `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 `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/apps/web`. +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 + can use - the continuous integration release of + 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. `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 `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 +entirely static content. + +# config.json + +Element supports a variety of settings to configure default servers, behaviour, themes, etc. +See the [configuration docs](docs/config.md) for more details. + +# Labs Features + +Some features of Element may be enabled by flags in the `Labs` section of the settings. +Some of these features are described in [labs.md](https://github.com/element-hq/element-web/blob/develop/docs/labs.md). + +# Caching requirements + +Element requires the following URLs not to be cached, when/if you are serving Element from your own webserver: + +``` +/config.*.json +/i18n +/home +/sites +/index.html +``` + +We also recommend that you force browsers to re-validate any cached copy of Element on page load by configuring your +webserver to return `Cache-Control: no-cache` for `/`. This ensures the browser will fetch a new version of Element on +the next page load after it's been deployed. Note that this is already configured for you in the nginx config of our +Dockerfile. + +# Development + +Please read through the following: + +1. [Developer guide](./developer_guide.md) +2. [Code style](./code_style.md) +3. [Contribution guide](./CONTRIBUTING.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) diff --git a/__mocks__/cssMock.js b/apps/web/__mocks__/cssMock.js similarity index 100% rename from __mocks__/cssMock.js rename to apps/web/__mocks__/cssMock.js diff --git a/__mocks__/empty.js b/apps/web/__mocks__/empty.js similarity index 100% rename from __mocks__/empty.js rename to apps/web/__mocks__/empty.js diff --git a/__mocks__/imageMock.js b/apps/web/__mocks__/imageMock.js similarity index 100% rename from __mocks__/imageMock.js rename to apps/web/__mocks__/imageMock.js diff --git a/__mocks__/languages.json b/apps/web/__mocks__/languages.json similarity index 100% rename from __mocks__/languages.json rename to apps/web/__mocks__/languages.json diff --git a/__mocks__/maplibre-gl.js b/apps/web/__mocks__/maplibre-gl.js similarity index 100% rename from __mocks__/maplibre-gl.js rename to apps/web/__mocks__/maplibre-gl.js diff --git a/__mocks__/svg.js b/apps/web/__mocks__/svg.js similarity index 100% rename from __mocks__/svg.js rename to apps/web/__mocks__/svg.js diff --git a/__mocks__/workerFactoryMock.js b/apps/web/__mocks__/workerFactoryMock.js similarity index 100% rename from __mocks__/workerFactoryMock.js rename to apps/web/__mocks__/workerFactoryMock.js diff --git a/babel.config.cjs b/apps/web/babel.config.cjs similarity index 100% rename from babel.config.cjs rename to apps/web/babel.config.cjs diff --git a/build_config.sample.yaml b/apps/web/build_config.sample.yaml similarity index 100% rename from build_config.sample.yaml rename to apps/web/build_config.sample.yaml diff --git a/components.json b/apps/web/components.json similarity index 100% rename from components.json rename to apps/web/components.json diff --git a/config.sample.json b/apps/web/config.sample.json similarity index 100% rename from config.sample.json rename to apps/web/config.sample.json diff --git a/debian/.gitignore b/apps/web/debian/.gitignore similarity index 100% rename from debian/.gitignore rename to apps/web/debian/.gitignore diff --git a/debian/conffiles b/apps/web/debian/conffiles similarity index 100% rename from debian/conffiles rename to apps/web/debian/conffiles diff --git a/debian/control b/apps/web/debian/control similarity index 100% rename from debian/control rename to apps/web/debian/control diff --git a/docker/docker-entrypoint.d/18-load-element-modules.sh b/apps/web/docker/docker-entrypoint.d/18-load-element-modules.sh similarity index 100% rename from docker/docker-entrypoint.d/18-load-element-modules.sh rename to apps/web/docker/docker-entrypoint.d/18-load-element-modules.sh diff --git a/docker/nginx-templates/default.conf.template b/apps/web/docker/nginx-templates/default.conf.template similarity index 100% rename from docker/nginx-templates/default.conf.template rename to apps/web/docker/nginx-templates/default.conf.template diff --git a/element.io/README b/apps/web/element.io/README similarity index 100% rename from element.io/README rename to apps/web/element.io/README diff --git a/element.io/app/config.json b/apps/web/element.io/app/config.json similarity index 100% rename from element.io/app/config.json rename to apps/web/element.io/app/config.json diff --git a/element.io/develop/config.json b/apps/web/element.io/develop/config.json similarity index 100% rename from element.io/develop/config.json rename to apps/web/element.io/develop/config.json diff --git a/jest.config.ts b/apps/web/jest.config.ts similarity index 89% rename from jest.config.ts rename to apps/web/jest.config.ts index b19b884d30..43bfef70ab 100644 --- a/jest.config.ts +++ b/apps/web/jest.config.ts @@ -28,9 +28,9 @@ const config: Config = { "\\.(gif|png|ttf|woff2)$": "/__mocks__/imageMock.js", "\\.svg$": "/__mocks__/svg.js", "\\$webapp/i18n/languages.json": "/__mocks__/languages.json", - "^react$": "/node_modules/react", - "^react-dom$": "/node_modules/react-dom", - "^matrix-js-sdk$": "/node_modules/matrix-js-sdk/src", + "^react$": "/../../node_modules/react", + "^react-dom$": "/../../node_modules/react-dom", + "^matrix-js-sdk$": "/../../node_modules/matrix-js-sdk/src", "^matrix-react-sdk$": "/src", "decoderWorker\\.min\\.js": "/__mocks__/empty.js", "decoderWorker\\.min\\.wasm": "/__mocks__/empty.js", @@ -39,8 +39,8 @@ const config: Config = { "workers/(.+)Factory": "/__mocks__/workerFactoryMock.js", "^!!raw-loader!.*": "jest-raw-loader", "recorderWorkletFactory": "/__mocks__/empty.js", - "counterpart": "/node_modules/counterpart", - "@vector-im/compound-web": "/node_modules/@vector-im/compound-web", + "counterpart": "/../../node_modules/counterpart", + "@vector-im/compound-web": "/../../node_modules/@vector-im/compound-web", }, transformIgnorePatterns: [ "/node_modules/(?!(mime|matrix-js-sdk|uuid|p-retry|is-network-error|react-merge-refs|is-ip|ip-regex|super-regex|function-timeout|time-span|convert-hrtime|clone-regexp|is-regexp|matrix-web-i18n|await-lock|@element-hq/web-shared-components|react-virtuoso|lodash)).+$", diff --git a/module_system/BuildConfig.ts b/apps/web/module_system/BuildConfig.ts similarity index 100% rename from module_system/BuildConfig.ts rename to apps/web/module_system/BuildConfig.ts diff --git a/module_system/installer.ts b/apps/web/module_system/installer.ts similarity index 100% rename from module_system/installer.ts rename to apps/web/module_system/installer.ts diff --git a/module_system/scripts/install.ts b/apps/web/module_system/scripts/install.ts similarity index 100% rename from module_system/scripts/install.ts rename to apps/web/module_system/scripts/install.ts diff --git a/apps/web/package.json b/apps/web/package.json new file mode 100644 index 0000000000..f055e73e2f --- /dev/null +++ b/apps/web/package.json @@ -0,0 +1,258 @@ +{ + "name": "element-web", + "version": "1.12.11-rc.0", + "description": "Element: the future of secure communication", + "author": "New Vector Ltd.", + "repository": { + "type": "git", + "url": "https://github.com/element-hq/element-web" + }, + "license": "SEE LICENSE IN README.md", + "type": "module", + "matrix_i18n_extra_translation_funcs": [ + "UserFriendlyError" + ], + "scripts": { + "i18n": "matrix-gen-i18n src res && pnpm i18n:sort && pnpm i18n:lint", + "i18n:sort": "matrix-sort-i18n src/i18n/strings/en_EN.json", + "i18n:lint": "matrix-i18n-lint && prettier --log-level=silent --write src/i18n/strings/ --ignore-path /dev/null", + "i18n:diff": "cp src/i18n/strings/en_EN.json src/i18n/strings/en_EN_orig.json && pnpm i18n && matrix-compare-i18n-files src/i18n/strings/en_EN_orig.json src/i18n/strings/en_EN.json", + "rethemendex": "sh ./res/css/rethemendex.sh", + "build": "nx build", + "build-stats": "nx build --json=webpack-stats.json", + "vendor:modernizr": "modernizr -c .modernizr.json -d src/vector/modernizr.js && mv src/vector/modernizr.js src/vector/modernizr.cjs", + "vendor:jitsi": "curl -s https://meet.element.io/libs/external_api.min.js > ./res/jitsi_external_api.min.js", + "dist": "./scripts/package.sh", + "start": "nx start", + "lint": "pnpm lint:types && pnpm lint:js && pnpm lint:style", + "lint:js": "eslint --max-warnings 0 src test playwright module_system", + "lint:js-fix": "eslint --fix src test playwright module_system", + "lint:types": "nx lint:types", + "lint:style": "stylelint \"res/css/**/*.pcss\"", + "test": "nx test:unit", + "test:playwright": "playwright test", + "test:playwright:open": "pnpm test:playwright --ui", + "test:playwright:screenshots": "playwright-screenshots-experimental pnpm playwright test --update-snapshots --project=Chrome --grep @screenshot", + "coverage": "pnpm test --coverage", + "analyse:webpack-bundles": "webpack-bundle-analyzer webpack-stats.json webapp" + }, + "dependencies": { + "@babel/runtime": "^7.12.5", + "@element-hq/element-web-module-api": "catalog:", + "@element-hq/web-shared-components": "workspace:*", + "@fontsource/fira-code": "^5", + "@fontsource/inter": "catalog:", + "@formatjs/intl-segmenter": "^12.0.0", + "@matrix-org/analytics-events": "^0.32.0", + "@matrix-org/emojibase-bindings": "^1.5.0", + "@matrix-org/react-sdk-module-api": "^2.4.0", + "@sentry/browser": "^10.0.0", + "@types/png-chunks-extract": "^1.0.2", + "@vector-im/compound-design-tokens": "catalog:", + "@vector-im/compound-web": "catalog:", + "@vector-im/matrix-wysiwyg": "2.40.0", + "@zxcvbn-ts/core": "^3.0.4", + "@zxcvbn-ts/language-common": "^3.0.4", + "@zxcvbn-ts/language-en": "^3.0.2", + "await-lock": "^3.0.0", + "bloom-filters": "^3.0.3", + "blurhash": "^2.0.3", + "browserslist": "^4.23.2", + "classnames": "^2.2.6", + "commonmark": "^0.31.0", + "css-tree": "^3.0.0", + "diff-dom": "^5.0.0", + "diff-match-patch": "^1.0.5", + "domutils": "^3.2.2", + "emojibase-regex": "^17.0.0", + "escape-html": "^1.0.3", + "file-saver": "^2.0.5", + "filesize": "11.0.13", + "github-markdown-css": "^5.5.1", + "glob-to-regexp": "^0.4.1", + "highlight.js": "^11.3.1", + "html-entities": "^2.0.0", + "html-react-parser": "^5.2.2", + "is-ip": "^5.0.0", + "js-xxhash": "^5.0.0", + "jsrsasign": "^11.0.0", + "jszip": "^3.7.0", + "katex": "^0.16.0", + "linkify-html": "4.3.2", + "linkify-react": "4.3.2", + "linkify-string": "4.3.2", + "linkifyjs": "4.3.2", + "lodash": "npm:lodash-es@^4.17.21", + "maplibre-gl": "^5.0.0", + "matrix-encrypt-attachment": "^1.0.3", + "matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop", + "matrix-widget-api": "^1.16.1", + "memoize-one": "^6.0.0", + "mime": "^4.0.4", + "oidc-client-ts": "^3.0.1", + "opus-recorder": "^8.0.3", + "pako": "^2.0.3", + "png-chunks-extract": "^1.0.0", + "posthog-js": "1.347.2", + "qrcode": "1.5.4", + "re-resizable": "6.11.2", + "react": "catalog:", + "react-beautiful-dnd": "^13.1.0", + "react-blurhash": "^0.3.0", + "react-dom": "catalog:", + "react-focus-lock": "^2.5.1", + "react-string-replace": "^2.0.0", + "react-transition-group": "^4.4.1", + "rfc4648": "^1.4.0", + "sanitize-filename": "^1.6.3", + "sanitize-html": "2.17.0", + "tar-js": "^0.3.0", + "ua-parser-js": "1.0.40", + "uuid": "^13.0.0", + "what-input": "^5.2.10" + }, + "devDependencies": { + "@babel/core": "^7.12.10", + "@babel/eslint-parser": "^7.12.10", + "@babel/eslint-plugin": "^7.12.10", + "@babel/plugin-proposal-decorators": "^7.25.9", + "@babel/plugin-proposal-export-default-from": "^7.12.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-class-properties": "^7.12.1", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-logical-assignment-operators": "^7.20.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-transform-numeric-separator": "^7.12.7", + "@babel/plugin-transform-object-rest-spread": "^7.12.1", + "@babel/plugin-transform-optional-chaining": "^7.12.7", + "@babel/plugin-transform-runtime": "^7.12.10", + "@babel/preset-env": "^7.12.11", + "@babel/preset-react": "^7.12.10", + "@babel/preset-typescript": "^7.12.7", + "@babel/runtime": "^7.12.5", + "@casualbot/jest-sonar-reporter": "2.5.0", + "@element-hq/element-call-embedded": "0.16.3", + "@element-hq/element-web-playwright-common": "catalog:", + "@element-hq/element-web-playwright-common-local": "workspace:*", + "@fetch-mock/jest": "^0.2.20", + "@jest/globals": "^30.2.0", + "@peculiar/webcrypto": "^1.4.3", + "@playwright/test": "catalog:", + "@principalstudio/html-webpack-inject-preload": "^1.2.7", + "@sentry/webpack-plugin": "^4.0.0", + "@stylistic/eslint-plugin": "^5.0.0", + "@svgr/webpack": "^8.0.0", + "@testing-library/dom": "^10.4.0", + "@testing-library/jest-dom": "^6.4.8", + "@testing-library/react": "^16.0.0", + "@testing-library/user-event": "^14.5.2", + "@types/commonmark": "^0.27.4", + "@types/content-type": "^1.1.9", + "@types/counterpart": "^0.18.1", + "@types/css-tree": "^2.3.8", + "@types/diff-match-patch": "^1.0.32", + "@types/escape-html": "^1.0.1", + "@types/express": "^5.0.0", + "@types/file-saver": "^2.0.3", + "@types/glob-to-regexp": "^0.4.1", + "@types/jest": "30.0.0", + "@types/jitsi-meet": "^2.0.2", + "@types/jsrsasign": "^10.5.4", + "@types/lodash": "^4.14.168", + "@types/minimist": "^1.2.5", + "@types/modernizr": "^3.5.3", + "@types/node": "22", + "@types/pako": "^2.0.0", + "@types/postcss-import": "^14.0.3", + "@types/qrcode": "^1.3.5", + "@types/react": "catalog:", + "@types/react-beautiful-dnd": "^13.0.0", + "@types/react-dom": "catalog:", + "@types/react-transition-group": "^4.4.0", + "@types/sanitize-html": "2.16.0", + "@types/sdp-transform": "^2.4.10", + "@types/semver": "^7.5.8", + "@types/tar-js": "^0.3.5", + "@types/ua-parser-js": "^0.7.36", + "@typescript-eslint/eslint-plugin": "^8.19.0", + "@typescript-eslint/parser": "^8.19.0", + "babel-jest": "^30.0.0", + "babel-loader": "^10.0.0", + "babel-plugin-jsx-remove-data-test-id": "^3.0.0", + "blob-polyfill": "^9.0.0", + "chokidar": "^5.0.0", + "copy-webpack-plugin": "^13.0.0", + "css-loader": "^7.0.0", + "css-minimizer-webpack-plugin": "^7.0.0", + "dotenv": "^17.0.0", + "eslint": "8.57.1", + "eslint-config-google": "^0.14.0", + "eslint-config-prettier": "^10.0.0", + "eslint-plugin-deprecate": "0.8.7", + "eslint-plugin-import": "^2.25.4", + "eslint-plugin-jest": "^29.0.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-matrix-org": "^3.0.0", + "eslint-plugin-react": "^7.28.0", + "eslint-plugin-react-compiler": "^19.0.0-beta-df7b47d-20241124", + "eslint-plugin-react-hooks": "^7.0.0", + "eslint-plugin-unicorn": "^56.0.0", + "express": "^5.0.0", + "fake-indexeddb": "^6.0.0", + "file-loader": "^6.0.0", + "html-webpack-plugin": "^5.5.3", + "identity-obj-proxy": "^3.0.0", + "jest": "^30.0.0", + "jest-canvas-mock": "^2.5.2", + "jest-environment-jsdom": "^30.2.0", + "jest-fixed-jsdom": "^0.0.11", + "jest-mock": "^30.0.0", + "jest-raw-loader": "^1.0.1", + "jsqr": "^1.4.0", + "matrix-web-i18n": "catalog:", + "mini-css-extract-plugin": "2.10.0", + "minimist": "^1.2.6", + "modernizr": "^3.12.0", + "postcss": "8.5.6", + "postcss-easings": "4.0.0", + "postcss-hexrgba": "2.1.0", + "postcss-import": "16.1.1", + "postcss-loader": "8.2.0", + "postcss-mixins": "12.0.0", + "postcss-nested": "7.0.2", + "postcss-preset-env": "11.1.1", + "postcss-scss": "4.0.9", + "postcss-simple-vars": "7.0.1", + "prettier": "3.8.1", + "process": "^0.11.10", + "raw-loader": "^4.0.2", + "semver": "^7.5.2", + "source-map-loader": "^5.0.0", + "stylelint": "^17.0.0", + "stylelint-config-standard": "^40.0.0", + "stylelint-scss": "^7.0.0", + "stylelint-value-no-unknown-custom-properties": "^6.0.1", + "terser-webpack-plugin": "^5.3.9", + "testcontainers": "^11.0.0", + "typescript": "catalog:", + "util": "^0.12.5", + "web-streams-polyfill": "^4.0.0", + "webpack": "^5.89.0", + "webpack-bundle-analyzer": "^5.0.0", + "webpack-cli": "^6.0.0", + "webpack-dev-server": "^5.0.0", + "webpack-retry-chunk-load-plugin": "^3.1.1", + "webpack-version-file-plugin": "^0.5.0", + "yaml": "^2.3.3" + }, + "@casualbot/jest-sonar-reporter": { + "outputDirectory": "coverage", + "outputName": "jest-sonar-report.xml", + "relativePaths": true + }, + "engines": { + "node": ">=22.18" + }, + "packageManager": "pnpm@10.29.3+sha512.498e1fb4cca5aa06c1dcf2611e6fafc50972ffe7189998c409e90de74566444298ffe43e6cd2acdc775ba1aa7cc5e092a8b7054c811ba8c5770f84693d33d2dc", + "private": true +} diff --git a/playwright.config.ts b/apps/web/playwright.config.ts similarity index 100% rename from playwright.config.ts rename to apps/web/playwright.config.ts diff --git a/playwright/.gitignore b/apps/web/playwright/.gitignore similarity index 57% rename from playwright/.gitignore rename to apps/web/playwright/.gitignore index 78bb2e0277..0d50077f5a 100644 --- a/playwright/.gitignore +++ b/apps/web/playwright/.gitignore @@ -4,5 +4,3 @@ # Only commit snapshots from Linux /snapshots/**/*.png !/snapshots/**/*-linux.png -# This file is machine-generated -/e2e/crypto/test_indexeddb_cryptostore_dump/dump.json diff --git a/playwright/e2e/accessibility/keyboard-navigation.spec.ts b/apps/web/playwright/e2e/accessibility/keyboard-navigation.spec.ts similarity index 100% rename from playwright/e2e/accessibility/keyboard-navigation.spec.ts rename to apps/web/playwright/e2e/accessibility/keyboard-navigation.spec.ts diff --git a/playwright/e2e/app-loading/feature-detection.spec.ts b/apps/web/playwright/e2e/app-loading/feature-detection.spec.ts similarity index 100% rename from playwright/e2e/app-loading/feature-detection.spec.ts rename to apps/web/playwright/e2e/app-loading/feature-detection.spec.ts diff --git a/playwright/e2e/app-loading/guest-registration.spec.ts b/apps/web/playwright/e2e/app-loading/guest-registration.spec.ts similarity index 100% rename from playwright/e2e/app-loading/guest-registration.spec.ts rename to apps/web/playwright/e2e/app-loading/guest-registration.spec.ts diff --git a/playwright/e2e/app-loading/stored-credentials.spec.ts b/apps/web/playwright/e2e/app-loading/stored-credentials.spec.ts similarity index 97% rename from playwright/e2e/app-loading/stored-credentials.spec.ts rename to apps/web/playwright/e2e/app-loading/stored-credentials.spec.ts index 7e1bb29ce7..e47df68ede 100644 --- a/playwright/e2e/app-loading/stored-credentials.spec.ts +++ b/apps/web/playwright/e2e/app-loading/stored-credentials.spec.ts @@ -30,6 +30,7 @@ test("Shows the last known page on reload", async ({ pageWithCredentials: page } const app = new ElementAppPage(page); await app.client.createRoom({ name: "Test Room" }); await app.viewRoomByName("Test Room"); + await expect(page).toHaveURL(/\/#\/room\//); // Navigate away await page.goto("about:blank"); diff --git a/playwright/e2e/audio-player/audio-player.spec.ts b/apps/web/playwright/e2e/audio-player/audio-player.spec.ts similarity index 100% rename from playwright/e2e/audio-player/audio-player.spec.ts rename to apps/web/playwright/e2e/audio-player/audio-player.spec.ts diff --git a/playwright/e2e/chat-export/html-export.spec.ts b/apps/web/playwright/e2e/chat-export/html-export.spec.ts similarity index 100% rename from playwright/e2e/chat-export/html-export.spec.ts rename to apps/web/playwright/e2e/chat-export/html-export.spec.ts diff --git a/playwright/e2e/composer/CIDER.spec.ts b/apps/web/playwright/e2e/composer/CIDER.spec.ts similarity index 100% rename from playwright/e2e/composer/CIDER.spec.ts rename to apps/web/playwright/e2e/composer/CIDER.spec.ts diff --git a/playwright/e2e/composer/RTE.spec.ts b/apps/web/playwright/e2e/composer/RTE.spec.ts similarity index 100% rename from playwright/e2e/composer/RTE.spec.ts rename to apps/web/playwright/e2e/composer/RTE.spec.ts diff --git a/playwright/e2e/crypto/backups-mas.spec.ts b/apps/web/playwright/e2e/crypto/backups-mas.spec.ts similarity index 100% rename from playwright/e2e/crypto/backups-mas.spec.ts rename to apps/web/playwright/e2e/crypto/backups-mas.spec.ts diff --git a/playwright/e2e/crypto/complete-security.spec.ts b/apps/web/playwright/e2e/crypto/complete-security.spec.ts similarity index 63% rename from playwright/e2e/crypto/complete-security.spec.ts rename to apps/web/playwright/e2e/crypto/complete-security.spec.ts index d4c303fae4..217da3348e 100644 --- a/playwright/e2e/crypto/complete-security.spec.ts +++ b/apps/web/playwright/e2e/crypto/complete-security.spec.ts @@ -7,7 +7,7 @@ Please see LICENSE files in the repository root for full details. */ import { test, expect } from "../../element-web-test"; -import { logIntoElement } from "./utils"; +import { createBot, logIntoElement } from "./utils"; import { isDendrite } from "../../plugins/homeserver/dendrite"; test.describe("Complete security", () => { @@ -16,6 +16,17 @@ test.describe("Complete security", () => { displayName: "Jeff", }); + test( + "Complete Security dialog appears correctly", + { tag: "@screenshot" }, + async ({ page, credentials, homeserver }) => { + await createBot(page, homeserver, credentials, true); + await logIntoElement(page, credentials); + await expect(page.getByRole("heading", { name: "Confirm your identity" })).toBeVisible(); + await expect(page.getByRole("main")).toMatchScreenshot("complete-security.png"); + }, + ); + test("should go straight to the welcome screen if we have no signed device", async ({ page, homeserver, diff --git a/playwright/e2e/crypto/crypto.spec.ts b/apps/web/playwright/e2e/crypto/crypto.spec.ts similarity index 100% rename from playwright/e2e/crypto/crypto.spec.ts rename to apps/web/playwright/e2e/crypto/crypto.spec.ts diff --git a/playwright/e2e/crypto/decryption-failure-messages.spec.ts b/apps/web/playwright/e2e/crypto/decryption-failure-messages.spec.ts similarity index 100% rename from playwright/e2e/crypto/decryption-failure-messages.spec.ts rename to apps/web/playwright/e2e/crypto/decryption-failure-messages.spec.ts diff --git a/playwright/e2e/crypto/dehydration.spec.ts b/apps/web/playwright/e2e/crypto/dehydration.spec.ts similarity index 100% rename from playwright/e2e/crypto/dehydration.spec.ts rename to apps/web/playwright/e2e/crypto/dehydration.spec.ts diff --git a/playwright/e2e/crypto/device-verification.spec.ts b/apps/web/playwright/e2e/crypto/device-verification.spec.ts similarity index 100% rename from playwright/e2e/crypto/device-verification.spec.ts rename to apps/web/playwright/e2e/crypto/device-verification.spec.ts diff --git a/playwright/e2e/crypto/event-shields.spec.ts b/apps/web/playwright/e2e/crypto/event-shields.spec.ts similarity index 100% rename from playwright/e2e/crypto/event-shields.spec.ts rename to apps/web/playwright/e2e/crypto/event-shields.spec.ts diff --git a/playwright/e2e/crypto/history-sharing.spec.ts b/apps/web/playwright/e2e/crypto/history-sharing.spec.ts similarity index 100% rename from playwright/e2e/crypto/history-sharing.spec.ts rename to apps/web/playwright/e2e/crypto/history-sharing.spec.ts diff --git a/playwright/e2e/crypto/invisible-crypto.spec.ts b/apps/web/playwright/e2e/crypto/invisible-crypto.spec.ts similarity index 100% rename from playwright/e2e/crypto/invisible-crypto.spec.ts rename to apps/web/playwright/e2e/crypto/invisible-crypto.spec.ts diff --git a/playwright/e2e/crypto/logout.spec.ts b/apps/web/playwright/e2e/crypto/logout.spec.ts similarity index 100% rename from playwright/e2e/crypto/logout.spec.ts rename to apps/web/playwright/e2e/crypto/logout.spec.ts diff --git a/playwright/e2e/crypto/migration.spec.ts b/apps/web/playwright/e2e/crypto/migration.spec.ts similarity index 100% rename from playwright/e2e/crypto/migration.spec.ts rename to apps/web/playwright/e2e/crypto/migration.spec.ts diff --git a/playwright/e2e/crypto/test_indexeddb_cryptostore_dump/README.md b/apps/web/playwright/e2e/crypto/test_indexeddb_cryptostore_dump/README.md similarity index 100% rename from playwright/e2e/crypto/test_indexeddb_cryptostore_dump/README.md rename to apps/web/playwright/e2e/crypto/test_indexeddb_cryptostore_dump/README.md diff --git a/playwright/e2e/crypto/test_indexeddb_cryptostore_dump/dump.json b/apps/web/playwright/e2e/crypto/test_indexeddb_cryptostore_dump/dump.json similarity index 100% rename from playwright/e2e/crypto/test_indexeddb_cryptostore_dump/dump.json rename to apps/web/playwright/e2e/crypto/test_indexeddb_cryptostore_dump/dump.json diff --git a/playwright/e2e/crypto/test_indexeddb_cryptostore_dump/index.html b/apps/web/playwright/e2e/crypto/test_indexeddb_cryptostore_dump/index.html similarity index 100% rename from playwright/e2e/crypto/test_indexeddb_cryptostore_dump/index.html rename to apps/web/playwright/e2e/crypto/test_indexeddb_cryptostore_dump/index.html diff --git a/playwright/e2e/crypto/test_indexeddb_cryptostore_dump/load.js b/apps/web/playwright/e2e/crypto/test_indexeddb_cryptostore_dump/load.js similarity index 100% rename from playwright/e2e/crypto/test_indexeddb_cryptostore_dump/load.js rename to apps/web/playwright/e2e/crypto/test_indexeddb_cryptostore_dump/load.js diff --git a/playwright/e2e/crypto/toasts.spec.ts b/apps/web/playwright/e2e/crypto/toasts.spec.ts similarity index 100% rename from playwright/e2e/crypto/toasts.spec.ts rename to apps/web/playwright/e2e/crypto/toasts.spec.ts diff --git a/playwright/e2e/crypto/user-verification.spec.ts b/apps/web/playwright/e2e/crypto/user-verification.spec.ts similarity index 100% rename from playwright/e2e/crypto/user-verification.spec.ts rename to apps/web/playwright/e2e/crypto/user-verification.spec.ts diff --git a/playwright/e2e/crypto/utils.ts b/apps/web/playwright/e2e/crypto/utils.ts similarity index 100% rename from playwright/e2e/crypto/utils.ts rename to apps/web/playwright/e2e/crypto/utils.ts diff --git a/playwright/e2e/csAPI.ts b/apps/web/playwright/e2e/csAPI.ts similarity index 100% rename from playwright/e2e/csAPI.ts rename to apps/web/playwright/e2e/csAPI.ts diff --git a/playwright/e2e/devtools/devtools.spec.ts b/apps/web/playwright/e2e/devtools/devtools.spec.ts similarity index 100% rename from playwright/e2e/devtools/devtools.spec.ts rename to apps/web/playwright/e2e/devtools/devtools.spec.ts diff --git a/playwright/e2e/devtools/upgraderoom.spec.ts b/apps/web/playwright/e2e/devtools/upgraderoom.spec.ts similarity index 100% rename from playwright/e2e/devtools/upgraderoom.spec.ts rename to apps/web/playwright/e2e/devtools/upgraderoom.spec.ts diff --git a/playwright/e2e/editing/editing.spec.ts b/apps/web/playwright/e2e/editing/editing.spec.ts similarity index 100% rename from playwright/e2e/editing/editing.spec.ts rename to apps/web/playwright/e2e/editing/editing.spec.ts diff --git a/playwright/e2e/feedback/rageshakes.spec.ts b/apps/web/playwright/e2e/feedback/rageshakes.spec.ts similarity index 100% rename from playwright/e2e/feedback/rageshakes.spec.ts rename to apps/web/playwright/e2e/feedback/rageshakes.spec.ts diff --git a/playwright/e2e/file-upload/image-upload.spec.ts b/apps/web/playwright/e2e/file-upload/image-upload.spec.ts similarity index 100% rename from playwright/e2e/file-upload/image-upload.spec.ts rename to apps/web/playwright/e2e/file-upload/image-upload.spec.ts diff --git a/playwright/e2e/forgot-password/forgot-password.spec.ts b/apps/web/playwright/e2e/forgot-password/forgot-password.spec.ts similarity index 100% rename from playwright/e2e/forgot-password/forgot-password.spec.ts rename to apps/web/playwright/e2e/forgot-password/forgot-password.spec.ts diff --git a/playwright/e2e/integration-manager/get-openid-token.spec.ts b/apps/web/playwright/e2e/integration-manager/get-openid-token.spec.ts similarity index 100% rename from playwright/e2e/integration-manager/get-openid-token.spec.ts rename to apps/web/playwright/e2e/integration-manager/get-openid-token.spec.ts diff --git a/playwright/e2e/integration-manager/kick.spec.ts b/apps/web/playwright/e2e/integration-manager/kick.spec.ts similarity index 100% rename from playwright/e2e/integration-manager/kick.spec.ts rename to apps/web/playwright/e2e/integration-manager/kick.spec.ts diff --git a/playwright/e2e/integration-manager/read_events.spec.ts b/apps/web/playwright/e2e/integration-manager/read_events.spec.ts similarity index 100% rename from playwright/e2e/integration-manager/read_events.spec.ts rename to apps/web/playwright/e2e/integration-manager/read_events.spec.ts diff --git a/playwright/e2e/integration-manager/send_event.spec.ts b/apps/web/playwright/e2e/integration-manager/send_event.spec.ts similarity index 100% rename from playwright/e2e/integration-manager/send_event.spec.ts rename to apps/web/playwright/e2e/integration-manager/send_event.spec.ts diff --git a/playwright/e2e/integration-manager/utils.ts b/apps/web/playwright/e2e/integration-manager/utils.ts similarity index 100% rename from playwright/e2e/integration-manager/utils.ts rename to apps/web/playwright/e2e/integration-manager/utils.ts diff --git a/playwright/e2e/invite/decline-and-block-invite-dialog.spec.ts b/apps/web/playwright/e2e/invite/decline-and-block-invite-dialog.spec.ts similarity index 100% rename from playwright/e2e/invite/decline-and-block-invite-dialog.spec.ts rename to apps/web/playwright/e2e/invite/decline-and-block-invite-dialog.spec.ts diff --git a/playwright/e2e/invite/invite-dialog.spec.ts b/apps/web/playwright/e2e/invite/invite-dialog.spec.ts similarity index 100% rename from playwright/e2e/invite/invite-dialog.spec.ts rename to apps/web/playwright/e2e/invite/invite-dialog.spec.ts diff --git a/playwright/e2e/knock/create-knock-room.spec.ts b/apps/web/playwright/e2e/knock/create-knock-room.spec.ts similarity index 100% rename from playwright/e2e/knock/create-knock-room.spec.ts rename to apps/web/playwright/e2e/knock/create-knock-room.spec.ts diff --git a/playwright/e2e/knock/knock-into-room.spec.ts b/apps/web/playwright/e2e/knock/knock-into-room.spec.ts similarity index 100% rename from playwright/e2e/knock/knock-into-room.spec.ts rename to apps/web/playwright/e2e/knock/knock-into-room.spec.ts diff --git a/playwright/e2e/knock/manage-knocks.spec.ts b/apps/web/playwright/e2e/knock/manage-knocks.spec.ts similarity index 100% rename from playwright/e2e/knock/manage-knocks.spec.ts rename to apps/web/playwright/e2e/knock/manage-knocks.spec.ts diff --git a/playwright/e2e/lazy-loading/lazy-loading.spec.ts b/apps/web/playwright/e2e/lazy-loading/lazy-loading.spec.ts similarity index 100% rename from playwright/e2e/lazy-loading/lazy-loading.spec.ts rename to apps/web/playwright/e2e/lazy-loading/lazy-loading.spec.ts diff --git a/playwright/e2e/left-panel/left-panel.spec.ts b/apps/web/playwright/e2e/left-panel/left-panel.spec.ts similarity index 100% rename from playwright/e2e/left-panel/left-panel.spec.ts rename to apps/web/playwright/e2e/left-panel/left-panel.spec.ts diff --git a/playwright/e2e/left-panel/room-list-panel/room-list-filter-sort.spec.ts b/apps/web/playwright/e2e/left-panel/room-list-panel/room-list-filter-sort.spec.ts similarity index 88% rename from playwright/e2e/left-panel/room-list-panel/room-list-filter-sort.spec.ts rename to apps/web/playwright/e2e/left-panel/room-list-panel/room-list-filter-sort.spec.ts index d1c0332cef..99ffed3ff8 100644 --- a/playwright/e2e/left-panel/room-list-panel/room-list-filter-sort.spec.ts +++ b/apps/web/playwright/e2e/left-panel/room-list-panel/room-list-filter-sort.spec.ts @@ -109,55 +109,6 @@ test.describe("Room list filters and sort", () => { await expect(oldRoomTile).not.toBeVisible(); }); - test.describe("Scroll behaviour", () => { - test("should scroll to the top of list when filter is applied and active room is not in filtered list", async ({ - page, - app, - }) => { - const createFavouriteRoom = async (name: string) => { - const id = await app.client.createRoom({ - name, - }); - await app.client.evaluate(async (client, favouriteId) => { - await client.setRoomTag(favouriteId, "m.favourite", { order: 0.5 }); - }, id); - }; - - // Create 5 favourite rooms - let i = 0; - for (; i < 5; i++) { - await createFavouriteRoom(`room${i}-fav`); - } - - // Create a non-favourite room - await app.client.createRoom({ name: `room-non-fav` }); - - // Create rest of the favourite rooms - for (; i < 20; i++) { - await createFavouriteRoom(`room${i}-fav`); - } - - // Open the non-favourite room - const roomListView = getRoomList(page); - const tile = roomListView.getByRole("option", { name: "Open room room-non-fav" }); - // item may not be in the DOM using scrollListToBottom rather than scrollIntoViewIfNeeded - await app.scrollListToBottom(roomListView); - await tile.click(); - - // Enable Favourite filter - await getFilterExpandButton(page).click(); - const primaryFilters = getPrimaryFilters(page); - await primaryFilters.getByRole("option", { name: "Favourite" }).click(); - await expect(tile).not.toBeVisible(); - - // Ensure the room list is not scrolled - const isScrolledDown = await page - .getByRole("listbox", { name: "Room list", exact: true }) - .evaluate((e) => e.scrollTop !== 0); - expect(isScrolledDown).toStrictEqual(false); - }); - }); - test.describe("Room list", () => { let unReadDmId: string | undefined; let unReadRoomId: string | undefined; diff --git a/playwright/e2e/left-panel/room-list-panel/room-list-header.spec.ts b/apps/web/playwright/e2e/left-panel/room-list-panel/room-list-header.spec.ts similarity index 100% rename from playwright/e2e/left-panel/room-list-panel/room-list-header.spec.ts rename to apps/web/playwright/e2e/left-panel/room-list-panel/room-list-header.spec.ts diff --git a/playwright/e2e/left-panel/room-list-panel/room-list-panel.spec.ts b/apps/web/playwright/e2e/left-panel/room-list-panel/room-list-panel.spec.ts similarity index 100% rename from playwright/e2e/left-panel/room-list-panel/room-list-panel.spec.ts rename to apps/web/playwright/e2e/left-panel/room-list-panel/room-list-panel.spec.ts diff --git a/playwright/e2e/left-panel/room-list-panel/room-list-search.spec.ts b/apps/web/playwright/e2e/left-panel/room-list-panel/room-list-search.spec.ts similarity index 100% rename from playwright/e2e/left-panel/room-list-panel/room-list-search.spec.ts rename to apps/web/playwright/e2e/left-panel/room-list-panel/room-list-search.spec.ts diff --git a/playwright/e2e/left-panel/room-list-panel/room-list.spec.ts b/apps/web/playwright/e2e/left-panel/room-list-panel/room-list.spec.ts similarity index 100% rename from playwright/e2e/left-panel/room-list-panel/room-list.spec.ts rename to apps/web/playwright/e2e/left-panel/room-list-panel/room-list.spec.ts diff --git a/playwright/e2e/location/location.spec.ts b/apps/web/playwright/e2e/location/location.spec.ts similarity index 100% rename from playwright/e2e/location/location.spec.ts rename to apps/web/playwright/e2e/location/location.spec.ts diff --git a/playwright/e2e/login/consent.spec.ts b/apps/web/playwright/e2e/login/consent.spec.ts similarity index 100% rename from playwright/e2e/login/consent.spec.ts rename to apps/web/playwright/e2e/login/consent.spec.ts diff --git a/playwright/e2e/login/login-consent.spec.ts b/apps/web/playwright/e2e/login/login-consent.spec.ts similarity index 100% rename from playwright/e2e/login/login-consent.spec.ts rename to apps/web/playwright/e2e/login/login-consent.spec.ts diff --git a/playwright/e2e/login/login-sso.spec.ts b/apps/web/playwright/e2e/login/login-sso.spec.ts similarity index 100% rename from playwright/e2e/login/login-sso.spec.ts rename to apps/web/playwright/e2e/login/login-sso.spec.ts diff --git a/playwright/e2e/login/login.spec.ts b/apps/web/playwright/e2e/login/login.spec.ts similarity index 100% rename from playwright/e2e/login/login.spec.ts rename to apps/web/playwright/e2e/login/login.spec.ts diff --git a/playwright/e2e/login/logout_redirect_url.spec.ts b/apps/web/playwright/e2e/login/logout_redirect_url.spec.ts similarity index 100% rename from playwright/e2e/login/logout_redirect_url.spec.ts rename to apps/web/playwright/e2e/login/logout_redirect_url.spec.ts diff --git a/playwright/e2e/login/overwrite_login.spec.ts b/apps/web/playwright/e2e/login/overwrite_login.spec.ts similarity index 100% rename from playwright/e2e/login/overwrite_login.spec.ts rename to apps/web/playwright/e2e/login/overwrite_login.spec.ts diff --git a/playwright/e2e/login/soft_logout.spec.ts b/apps/web/playwright/e2e/login/soft_logout.spec.ts similarity index 100% rename from playwright/e2e/login/soft_logout.spec.ts rename to apps/web/playwright/e2e/login/soft_logout.spec.ts diff --git a/playwright/e2e/login/soft_logout_oauth.spec.ts b/apps/web/playwright/e2e/login/soft_logout_oauth.spec.ts similarity index 100% rename from playwright/e2e/login/soft_logout_oauth.spec.ts rename to apps/web/playwright/e2e/login/soft_logout_oauth.spec.ts diff --git a/playwright/e2e/login/utils.ts b/apps/web/playwright/e2e/login/utils.ts similarity index 100% rename from playwright/e2e/login/utils.ts rename to apps/web/playwright/e2e/login/utils.ts diff --git a/playwright/e2e/messages/messages.spec.ts b/apps/web/playwright/e2e/messages/messages.spec.ts similarity index 86% rename from playwright/e2e/messages/messages.spec.ts rename to apps/web/playwright/e2e/messages/messages.spec.ts index 641929e61c..4224737595 100644 --- a/playwright/e2e/messages/messages.spec.ts +++ b/apps/web/playwright/e2e/messages/messages.spec.ts @@ -220,9 +220,10 @@ test.describe("Message url previews", () => { await use({ roomId }); }, }); - test("should render a basic preview", { tag: "@screenshot" }, async ({ page, user, app, room }) => { - // TODO: This should be changed to _matrix/client/v1/media/preview_url when the matrix-js-sdk is updated. - await page.route("**/_matrix/media/v3/preview_url**", (route, request) => { + test("should render a basic preview", { tag: "@screenshot" }, async ({ page, user, app, room, axe }) => { + axe.disableRules("color-contrast"); + + await page.route(/.*\/_matrix\/(client\/v1\/media|media\/v3)\/preview_url.*/, (route, request) => { const requestedPage = new URL(request.url()).searchParams.get("url"); expect(requestedPage).toEqual("https://example.org/"); return route.fulfill({ @@ -234,25 +235,31 @@ test.describe("Message url previews", () => { await page.goto(`#/room/${room.roomId}`); const msgTile = await sendMessage(page, "https://example.org"); await expect(msgTile.getByRole("link", { name: "A simple site" })).toBeVisible(); + await expect(axe).toHaveNoViolations(); await expect(msgTile).toMatchScreenshot("preview-basic.png", screenshotOptions(page)); }); - test("should render a preview with a thumbnail", { tag: "@screenshot" }, async ({ page, user, bot, app, room }) => { - const mxc = (await bot.uploadContent(MEDIA_FILE, { name: "image.png", type: "image/png" })).content_uri; - // TODO: This should be changed to _matrix/client/v1/media/preview_url when the matrix-js-sdk is updated. - await page.route("**/_matrix/media/v3/preview_url**", (route, request) => { - const requestedPage = new URL(request.url()).searchParams.get("url"); - expect(requestedPage).toEqual("https://example.org/"); - return route.fulfill({ - json: { - "og:title": "A simple site", - "og:description": "And with a brief description", - "og:image": mxc, - }, + test( + "should render a preview with a thumbnail", + { tag: "@screenshot" }, + async ({ page, user, bot, app, room, axe }) => { + axe.disableRules("color-contrast"); + const mxc = (await bot.uploadContent(MEDIA_FILE, { name: "image.png", type: "image/png" })).content_uri; + await page.route(/.*\/_matrix\/(client\/v1\/media|media\/v3)\/preview_url.*/, (route, request) => { + const requestedPage = new URL(request.url()).searchParams.get("url"); + expect(requestedPage).toEqual("https://example.org/"); + return route.fulfill({ + json: { + "og:title": "A simple site", + "og:description": "And with a brief description", + "og:image": mxc, + }, + }); }); - }); - await page.goto(`#/room/${room.roomId}`); - const msgTile = await sendMessage(page, "https://example.org"); - await expect(msgTile.getByRole("link", { name: "A simple site" })).toBeVisible(); - await expect(msgTile).toMatchScreenshot("preview-with-thumb.png", screenshotOptions(page)); - }); + await page.goto(`#/room/${room.roomId}`); + const msgTile = await sendMessage(page, "https://example.org"); + await expect(msgTile.getByRole("link", { name: "A simple site" })).toBeVisible(); + await expect(axe).toHaveNoViolations(); + await expect(msgTile).toMatchScreenshot("preview-with-thumb.png", screenshotOptions(page)); + }, + ); }); diff --git a/playwright/e2e/mobile-guide/mobile-guide.spec.ts b/apps/web/playwright/e2e/mobile-guide/mobile-guide.spec.ts similarity index 100% rename from playwright/e2e/mobile-guide/mobile-guide.spec.ts rename to apps/web/playwright/e2e/mobile-guide/mobile-guide.spec.ts diff --git a/playwright/e2e/modules/custom-component.spec.ts b/apps/web/playwright/e2e/modules/custom-component.spec.ts similarity index 100% rename from playwright/e2e/modules/custom-component.spec.ts rename to apps/web/playwright/e2e/modules/custom-component.spec.ts diff --git a/playwright/e2e/modules/loader.spec.ts b/apps/web/playwright/e2e/modules/loader.spec.ts similarity index 100% rename from playwright/e2e/modules/loader.spec.ts rename to apps/web/playwright/e2e/modules/loader.spec.ts diff --git a/playwright/e2e/oidc/index.ts b/apps/web/playwright/e2e/oidc/index.ts similarity index 100% rename from playwright/e2e/oidc/index.ts rename to apps/web/playwright/e2e/oidc/index.ts diff --git a/playwright/e2e/oidc/oidc-native.spec.ts b/apps/web/playwright/e2e/oidc/oidc-native.spec.ts similarity index 100% rename from playwright/e2e/oidc/oidc-native.spec.ts rename to apps/web/playwright/e2e/oidc/oidc-native.spec.ts diff --git a/playwright/e2e/one-to-one-chat/one-to-one-chat.spec.ts b/apps/web/playwright/e2e/one-to-one-chat/one-to-one-chat.spec.ts similarity index 100% rename from playwright/e2e/one-to-one-chat/one-to-one-chat.spec.ts rename to apps/web/playwright/e2e/one-to-one-chat/one-to-one-chat.spec.ts diff --git a/playwright/e2e/permalinks/permalinks.spec.ts b/apps/web/playwright/e2e/permalinks/permalinks.spec.ts similarity index 100% rename from playwright/e2e/permalinks/permalinks.spec.ts rename to apps/web/playwright/e2e/permalinks/permalinks.spec.ts diff --git a/playwright/e2e/pinned-messages/index.ts b/apps/web/playwright/e2e/pinned-messages/index.ts similarity index 100% rename from playwright/e2e/pinned-messages/index.ts rename to apps/web/playwright/e2e/pinned-messages/index.ts diff --git a/playwright/e2e/pinned-messages/pinned-messages.spec.ts b/apps/web/playwright/e2e/pinned-messages/pinned-messages.spec.ts similarity index 100% rename from playwright/e2e/pinned-messages/pinned-messages.spec.ts rename to apps/web/playwright/e2e/pinned-messages/pinned-messages.spec.ts diff --git a/playwright/e2e/polls/pollHistory.spec.ts b/apps/web/playwright/e2e/polls/pollHistory.spec.ts similarity index 100% rename from playwright/e2e/polls/pollHistory.spec.ts rename to apps/web/playwright/e2e/polls/pollHistory.spec.ts diff --git a/playwright/e2e/polls/polls.spec.ts b/apps/web/playwright/e2e/polls/polls.spec.ts similarity index 100% rename from playwright/e2e/polls/polls.spec.ts rename to apps/web/playwright/e2e/polls/polls.spec.ts diff --git a/playwright/e2e/presence/presence.spec.ts b/apps/web/playwright/e2e/presence/presence.spec.ts similarity index 100% rename from playwright/e2e/presence/presence.spec.ts rename to apps/web/playwright/e2e/presence/presence.spec.ts diff --git a/playwright/e2e/read-receipts/editing-messages-in-threads.spec.ts b/apps/web/playwright/e2e/read-receipts/editing-messages-in-threads.spec.ts similarity index 100% rename from playwright/e2e/read-receipts/editing-messages-in-threads.spec.ts rename to apps/web/playwright/e2e/read-receipts/editing-messages-in-threads.spec.ts diff --git a/playwright/e2e/read-receipts/editing-messages-main-timeline.spec.ts b/apps/web/playwright/e2e/read-receipts/editing-messages-main-timeline.spec.ts similarity index 100% rename from playwright/e2e/read-receipts/editing-messages-main-timeline.spec.ts rename to apps/web/playwright/e2e/read-receipts/editing-messages-main-timeline.spec.ts diff --git a/playwright/e2e/read-receipts/editing-messages-thread-roots.spec.ts b/apps/web/playwright/e2e/read-receipts/editing-messages-thread-roots.spec.ts similarity index 100% rename from playwright/e2e/read-receipts/editing-messages-thread-roots.spec.ts rename to apps/web/playwright/e2e/read-receipts/editing-messages-thread-roots.spec.ts diff --git a/playwright/e2e/read-receipts/high-level.spec.ts b/apps/web/playwright/e2e/read-receipts/high-level.spec.ts similarity index 100% rename from playwright/e2e/read-receipts/high-level.spec.ts rename to apps/web/playwright/e2e/read-receipts/high-level.spec.ts diff --git a/playwright/e2e/read-receipts/index.ts b/apps/web/playwright/e2e/read-receipts/index.ts similarity index 100% rename from playwright/e2e/read-receipts/index.ts rename to apps/web/playwright/e2e/read-receipts/index.ts diff --git a/playwright/e2e/read-receipts/message-ordering.spec.ts b/apps/web/playwright/e2e/read-receipts/message-ordering.spec.ts similarity index 100% rename from playwright/e2e/read-receipts/message-ordering.spec.ts rename to apps/web/playwright/e2e/read-receipts/message-ordering.spec.ts diff --git a/playwright/e2e/read-receipts/missing-referents.spec.ts b/apps/web/playwright/e2e/read-receipts/missing-referents.spec.ts similarity index 100% rename from playwright/e2e/read-receipts/missing-referents.spec.ts rename to apps/web/playwright/e2e/read-receipts/missing-referents.spec.ts diff --git a/playwright/e2e/read-receipts/new-messages-in-threads.spec.ts b/apps/web/playwright/e2e/read-receipts/new-messages-in-threads.spec.ts similarity index 100% rename from playwright/e2e/read-receipts/new-messages-in-threads.spec.ts rename to apps/web/playwright/e2e/read-receipts/new-messages-in-threads.spec.ts diff --git a/playwright/e2e/read-receipts/new-messages-main-timeline.spec.ts b/apps/web/playwright/e2e/read-receipts/new-messages-main-timeline.spec.ts similarity index 100% rename from playwright/e2e/read-receipts/new-messages-main-timeline.spec.ts rename to apps/web/playwright/e2e/read-receipts/new-messages-main-timeline.spec.ts diff --git a/playwright/e2e/read-receipts/new-messages-thread-roots.spec.ts b/apps/web/playwright/e2e/read-receipts/new-messages-thread-roots.spec.ts similarity index 100% rename from playwright/e2e/read-receipts/new-messages-thread-roots.spec.ts rename to apps/web/playwright/e2e/read-receipts/new-messages-thread-roots.spec.ts diff --git a/playwright/e2e/read-receipts/notifications.spec.ts b/apps/web/playwright/e2e/read-receipts/notifications.spec.ts similarity index 100% rename from playwright/e2e/read-receipts/notifications.spec.ts rename to apps/web/playwright/e2e/read-receipts/notifications.spec.ts diff --git a/playwright/e2e/read-receipts/reactions-in-threads.spec.ts b/apps/web/playwright/e2e/read-receipts/reactions-in-threads.spec.ts similarity index 100% rename from playwright/e2e/read-receipts/reactions-in-threads.spec.ts rename to apps/web/playwright/e2e/read-receipts/reactions-in-threads.spec.ts diff --git a/playwright/e2e/read-receipts/reactions-main-timeline.spec.ts b/apps/web/playwright/e2e/read-receipts/reactions-main-timeline.spec.ts similarity index 100% rename from playwright/e2e/read-receipts/reactions-main-timeline.spec.ts rename to apps/web/playwright/e2e/read-receipts/reactions-main-timeline.spec.ts diff --git a/playwright/e2e/read-receipts/reactions-thread-roots.spec.ts b/apps/web/playwright/e2e/read-receipts/reactions-thread-roots.spec.ts similarity index 100% rename from playwright/e2e/read-receipts/reactions-thread-roots.spec.ts rename to apps/web/playwright/e2e/read-receipts/reactions-thread-roots.spec.ts diff --git a/playwright/e2e/read-receipts/read-receipts.spec.ts b/apps/web/playwright/e2e/read-receipts/read-receipts.spec.ts similarity index 100% rename from playwright/e2e/read-receipts/read-receipts.spec.ts rename to apps/web/playwright/e2e/read-receipts/read-receipts.spec.ts diff --git a/playwright/e2e/read-receipts/readme.md b/apps/web/playwright/e2e/read-receipts/readme.md similarity index 100% rename from playwright/e2e/read-receipts/readme.md rename to apps/web/playwright/e2e/read-receipts/readme.md diff --git a/playwright/e2e/read-receipts/redactions-in-threads.spec.ts b/apps/web/playwright/e2e/read-receipts/redactions-in-threads.spec.ts similarity index 100% rename from playwright/e2e/read-receipts/redactions-in-threads.spec.ts rename to apps/web/playwright/e2e/read-receipts/redactions-in-threads.spec.ts diff --git a/playwright/e2e/read-receipts/redactions-main-timeline.spec.ts b/apps/web/playwright/e2e/read-receipts/redactions-main-timeline.spec.ts similarity index 100% rename from playwright/e2e/read-receipts/redactions-main-timeline.spec.ts rename to apps/web/playwright/e2e/read-receipts/redactions-main-timeline.spec.ts diff --git a/playwright/e2e/read-receipts/redactions-thread-roots.spec.ts b/apps/web/playwright/e2e/read-receipts/redactions-thread-roots.spec.ts similarity index 100% rename from playwright/e2e/read-receipts/redactions-thread-roots.spec.ts rename to apps/web/playwright/e2e/read-receipts/redactions-thread-roots.spec.ts diff --git a/playwright/e2e/read-receipts/room-list-order.spec.ts b/apps/web/playwright/e2e/read-receipts/room-list-order.spec.ts similarity index 100% rename from playwright/e2e/read-receipts/room-list-order.spec.ts rename to apps/web/playwright/e2e/read-receipts/room-list-order.spec.ts diff --git a/playwright/e2e/register/email.spec.ts b/apps/web/playwright/e2e/register/email.spec.ts similarity index 100% rename from playwright/e2e/register/email.spec.ts rename to apps/web/playwright/e2e/register/email.spec.ts diff --git a/playwright/e2e/register/register.spec.ts b/apps/web/playwright/e2e/register/register.spec.ts similarity index 100% rename from playwright/e2e/register/register.spec.ts rename to apps/web/playwright/e2e/register/register.spec.ts diff --git a/playwright/e2e/regression-tests/pills-click-in-app.spec.ts b/apps/web/playwright/e2e/regression-tests/pills-click-in-app.spec.ts similarity index 100% rename from playwright/e2e/regression-tests/pills-click-in-app.spec.ts rename to apps/web/playwright/e2e/regression-tests/pills-click-in-app.spec.ts diff --git a/playwright/e2e/release-announcement/index.ts b/apps/web/playwright/e2e/release-announcement/index.ts similarity index 100% rename from playwright/e2e/release-announcement/index.ts rename to apps/web/playwright/e2e/release-announcement/index.ts diff --git a/playwright/e2e/release-announcement/releaseAnnouncement.spec.ts b/apps/web/playwright/e2e/release-announcement/releaseAnnouncement.spec.ts similarity index 100% rename from playwright/e2e/release-announcement/releaseAnnouncement.spec.ts rename to apps/web/playwright/e2e/release-announcement/releaseAnnouncement.spec.ts diff --git a/playwright/e2e/right-panel/file-panel.spec.ts b/apps/web/playwright/e2e/right-panel/file-panel.spec.ts similarity index 100% rename from playwright/e2e/right-panel/file-panel.spec.ts rename to apps/web/playwright/e2e/right-panel/file-panel.spec.ts diff --git a/playwright/e2e/right-panel/memberlist.spec.ts b/apps/web/playwright/e2e/right-panel/memberlist.spec.ts similarity index 100% rename from playwright/e2e/right-panel/memberlist.spec.ts rename to apps/web/playwright/e2e/right-panel/memberlist.spec.ts diff --git a/playwright/e2e/right-panel/notification-panel.spec.ts b/apps/web/playwright/e2e/right-panel/notification-panel.spec.ts similarity index 100% rename from playwright/e2e/right-panel/notification-panel.spec.ts rename to apps/web/playwright/e2e/right-panel/notification-panel.spec.ts diff --git a/playwright/e2e/right-panel/right-panel.spec.ts b/apps/web/playwright/e2e/right-panel/right-panel.spec.ts similarity index 100% rename from playwright/e2e/right-panel/right-panel.spec.ts rename to apps/web/playwright/e2e/right-panel/right-panel.spec.ts diff --git a/playwright/e2e/right-panel/utils.ts b/apps/web/playwright/e2e/right-panel/utils.ts similarity index 100% rename from playwright/e2e/right-panel/utils.ts rename to apps/web/playwright/e2e/right-panel/utils.ts diff --git a/playwright/e2e/room-directory/room-directory.spec.ts b/apps/web/playwright/e2e/room-directory/room-directory.spec.ts similarity index 100% rename from playwright/e2e/room-directory/room-directory.spec.ts rename to apps/web/playwright/e2e/room-directory/room-directory.spec.ts diff --git a/playwright/e2e/room/create-room.spec.ts b/apps/web/playwright/e2e/room/create-room.spec.ts similarity index 100% rename from playwright/e2e/room/create-room.spec.ts rename to apps/web/playwright/e2e/room/create-room.spec.ts diff --git a/playwright/e2e/room/invites.spec.ts b/apps/web/playwright/e2e/room/invites.spec.ts similarity index 100% rename from playwright/e2e/room/invites.spec.ts rename to apps/web/playwright/e2e/room/invites.spec.ts diff --git a/playwright/e2e/room/room-header.spec.ts b/apps/web/playwright/e2e/room/room-header.spec.ts similarity index 100% rename from playwright/e2e/room/room-header.spec.ts rename to apps/web/playwright/e2e/room/room-header.spec.ts diff --git a/playwright/e2e/room/room-status-bar.spec.ts b/apps/web/playwright/e2e/room/room-status-bar.spec.ts similarity index 100% rename from playwright/e2e/room/room-status-bar.spec.ts rename to apps/web/playwright/e2e/room/room-status-bar.spec.ts diff --git a/playwright/e2e/room/room.spec.ts b/apps/web/playwright/e2e/room/room.spec.ts similarity index 100% rename from playwright/e2e/room/room.spec.ts rename to apps/web/playwright/e2e/room/room.spec.ts diff --git a/playwright/e2e/room_options/marked_unread.spec.ts b/apps/web/playwright/e2e/room_options/marked_unread.spec.ts similarity index 100% rename from playwright/e2e/room_options/marked_unread.spec.ts rename to apps/web/playwright/e2e/room_options/marked_unread.spec.ts diff --git a/playwright/e2e/settings/account-user-settings-tab.spec.ts b/apps/web/playwright/e2e/settings/account-user-settings-tab.spec.ts similarity index 100% rename from playwright/e2e/settings/account-user-settings-tab.spec.ts rename to apps/web/playwright/e2e/settings/account-user-settings-tab.spec.ts diff --git a/playwright/e2e/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts b/apps/web/playwright/e2e/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts similarity index 100% rename from playwright/e2e/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts rename to apps/web/playwright/e2e/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts diff --git a/playwright/e2e/settings/appearance-user-settings-tab/index.ts b/apps/web/playwright/e2e/settings/appearance-user-settings-tab/index.ts similarity index 100% rename from playwright/e2e/settings/appearance-user-settings-tab/index.ts rename to apps/web/playwright/e2e/settings/appearance-user-settings-tab/index.ts diff --git a/playwright/e2e/settings/appearance-user-settings-tab/message-layout-panel.spec.ts b/apps/web/playwright/e2e/settings/appearance-user-settings-tab/message-layout-panel.spec.ts similarity index 100% rename from playwright/e2e/settings/appearance-user-settings-tab/message-layout-panel.spec.ts rename to apps/web/playwright/e2e/settings/appearance-user-settings-tab/message-layout-panel.spec.ts diff --git a/playwright/e2e/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts b/apps/web/playwright/e2e/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts similarity index 100% rename from playwright/e2e/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts rename to apps/web/playwright/e2e/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts diff --git a/playwright/e2e/settings/device-management.spec.ts b/apps/web/playwright/e2e/settings/device-management.spec.ts similarity index 100% rename from playwright/e2e/settings/device-management.spec.ts rename to apps/web/playwright/e2e/settings/device-management.spec.ts diff --git a/playwright/e2e/settings/encryption-user-tab/advanced.spec.ts b/apps/web/playwright/e2e/settings/encryption-user-tab/advanced.spec.ts similarity index 100% rename from playwright/e2e/settings/encryption-user-tab/advanced.spec.ts rename to apps/web/playwright/e2e/settings/encryption-user-tab/advanced.spec.ts diff --git a/playwright/e2e/settings/encryption-user-tab/encryption-tab.spec.ts b/apps/web/playwright/e2e/settings/encryption-user-tab/encryption-tab.spec.ts similarity index 100% rename from playwright/e2e/settings/encryption-user-tab/encryption-tab.spec.ts rename to apps/web/playwright/e2e/settings/encryption-user-tab/encryption-tab.spec.ts diff --git a/playwright/e2e/settings/encryption-user-tab/index.ts b/apps/web/playwright/e2e/settings/encryption-user-tab/index.ts similarity index 100% rename from playwright/e2e/settings/encryption-user-tab/index.ts rename to apps/web/playwright/e2e/settings/encryption-user-tab/index.ts diff --git a/playwright/e2e/settings/encryption-user-tab/other-devices.spec.ts b/apps/web/playwright/e2e/settings/encryption-user-tab/other-devices.spec.ts similarity index 100% rename from playwright/e2e/settings/encryption-user-tab/other-devices.spec.ts rename to apps/web/playwright/e2e/settings/encryption-user-tab/other-devices.spec.ts diff --git a/playwright/e2e/settings/encryption-user-tab/recovery.spec.ts b/apps/web/playwright/e2e/settings/encryption-user-tab/recovery.spec.ts similarity index 100% rename from playwright/e2e/settings/encryption-user-tab/recovery.spec.ts rename to apps/web/playwright/e2e/settings/encryption-user-tab/recovery.spec.ts diff --git a/playwright/e2e/settings/general-room-settings-tab.spec.ts b/apps/web/playwright/e2e/settings/general-room-settings-tab.spec.ts similarity index 100% rename from playwright/e2e/settings/general-room-settings-tab.spec.ts rename to apps/web/playwright/e2e/settings/general-room-settings-tab.spec.ts diff --git a/playwright/e2e/settings/notifications/notifications-settings-2-tab.spec.ts b/apps/web/playwright/e2e/settings/notifications/notifications-settings-2-tab.spec.ts similarity index 100% rename from playwright/e2e/settings/notifications/notifications-settings-2-tab.spec.ts rename to apps/web/playwright/e2e/settings/notifications/notifications-settings-2-tab.spec.ts diff --git a/playwright/e2e/settings/notifications/notifications-settings-tab.spec.ts b/apps/web/playwright/e2e/settings/notifications/notifications-settings-tab.spec.ts similarity index 100% rename from playwright/e2e/settings/notifications/notifications-settings-tab.spec.ts rename to apps/web/playwright/e2e/settings/notifications/notifications-settings-tab.spec.ts diff --git a/playwright/e2e/settings/preferences-user-settings-tab.spec.ts b/apps/web/playwright/e2e/settings/preferences-user-settings-tab.spec.ts similarity index 100% rename from playwright/e2e/settings/preferences-user-settings-tab.spec.ts rename to apps/web/playwright/e2e/settings/preferences-user-settings-tab.spec.ts diff --git a/playwright/e2e/settings/quick-settings-menu.spec.ts b/apps/web/playwright/e2e/settings/quick-settings-menu.spec.ts similarity index 100% rename from playwright/e2e/settings/quick-settings-menu.spec.ts rename to apps/web/playwright/e2e/settings/quick-settings-menu.spec.ts diff --git a/playwright/e2e/settings/room-settings/roles-permissions-room-settings-tab.spec.ts b/apps/web/playwright/e2e/settings/room-settings/roles-permissions-room-settings-tab.spec.ts similarity index 100% rename from playwright/e2e/settings/room-settings/roles-permissions-room-settings-tab.spec.ts rename to apps/web/playwright/e2e/settings/room-settings/roles-permissions-room-settings-tab.spec.ts index d287234af5..e575f71b72 100644 --- a/playwright/e2e/settings/room-settings/roles-permissions-room-settings-tab.spec.ts +++ b/apps/web/playwright/e2e/settings/room-settings/roles-permissions-room-settings-tab.spec.ts @@ -36,7 +36,6 @@ test.describe("Roles & Permissions room settings tab", () => { // Change the role of Alice to Moderator (50) await combobox.selectOption("Moderator"); - await expect(combobox).toHaveValue("50"); // Should display a modal to warn that we are demoting the only admin user const modal = await page.locator(".mx_Dialog", { @@ -49,6 +48,7 @@ test.describe("Roles & Permissions room settings tab", () => { const respPromise = page.waitForRequest("**/state/**"); await applyButton.click(); await respPromise; + await expect(combobox).toHaveValue("50"); // Reload and check Alice is still Moderator (50) await page.reload(); diff --git a/playwright/e2e/settings/room-settings/room-security-tab.spec.ts b/apps/web/playwright/e2e/settings/room-settings/room-security-tab.spec.ts similarity index 100% rename from playwright/e2e/settings/room-settings/room-security-tab.spec.ts rename to apps/web/playwright/e2e/settings/room-settings/room-security-tab.spec.ts diff --git a/playwright/e2e/settings/room-settings/room-video-tab.spec.ts b/apps/web/playwright/e2e/settings/room-settings/room-video-tab.spec.ts similarity index 100% rename from playwright/e2e/settings/room-settings/room-video-tab.spec.ts rename to apps/web/playwright/e2e/settings/room-settings/room-video-tab.spec.ts diff --git a/playwright/e2e/settings/security-user-settings-tab.spec.ts b/apps/web/playwright/e2e/settings/security-user-settings-tab.spec.ts similarity index 100% rename from playwright/e2e/settings/security-user-settings-tab.spec.ts rename to apps/web/playwright/e2e/settings/security-user-settings-tab.spec.ts diff --git a/playwright/e2e/share-dialog/share-by-url.spec.ts b/apps/web/playwright/e2e/share-dialog/share-by-url.spec.ts similarity index 100% rename from playwright/e2e/share-dialog/share-by-url.spec.ts rename to apps/web/playwright/e2e/share-dialog/share-by-url.spec.ts diff --git a/playwright/e2e/share-dialog/share-dialog.spec.ts b/apps/web/playwright/e2e/share-dialog/share-dialog.spec.ts similarity index 100% rename from playwright/e2e/share-dialog/share-dialog.spec.ts rename to apps/web/playwright/e2e/share-dialog/share-dialog.spec.ts diff --git a/playwright/e2e/sliding-sync/sliding-sync.spec.ts b/apps/web/playwright/e2e/sliding-sync/sliding-sync.spec.ts similarity index 99% rename from playwright/e2e/sliding-sync/sliding-sync.spec.ts rename to apps/web/playwright/e2e/sliding-sync/sliding-sync.spec.ts index 38aff5928d..cde2d57c14 100644 --- a/playwright/e2e/sliding-sync/sliding-sync.spec.ts +++ b/apps/web/playwright/e2e/sliding-sync/sliding-sync.spec.ts @@ -71,7 +71,9 @@ test.describe("Sliding Sync", () => { }); // Load the user fixture for all tests - test.beforeEach(({ user }) => {}); + test.beforeEach(async ({ app, user }) => { + await app.closeNotificationToast(); + }); test("should render the Rooms list in reverse chronological order by default and allowing sorting A-Z", async ({ page, diff --git a/playwright/e2e/spaces/spaces.spec.ts b/apps/web/playwright/e2e/spaces/spaces.spec.ts similarity index 100% rename from playwright/e2e/spaces/spaces.spec.ts rename to apps/web/playwright/e2e/spaces/spaces.spec.ts diff --git a/playwright/e2e/spaces/threads-activity-centre/index.ts b/apps/web/playwright/e2e/spaces/threads-activity-centre/index.ts similarity index 100% rename from playwright/e2e/spaces/threads-activity-centre/index.ts rename to apps/web/playwright/e2e/spaces/threads-activity-centre/index.ts diff --git a/playwright/e2e/spaces/threads-activity-centre/threadsActivityCentre.spec.ts b/apps/web/playwright/e2e/spaces/threads-activity-centre/threadsActivityCentre.spec.ts similarity index 100% rename from playwright/e2e/spaces/threads-activity-centre/threadsActivityCentre.spec.ts rename to apps/web/playwright/e2e/spaces/threads-activity-centre/threadsActivityCentre.spec.ts diff --git a/playwright/e2e/spotlight/spotlight.spec.ts b/apps/web/playwright/e2e/spotlight/spotlight.spec.ts similarity index 100% rename from playwright/e2e/spotlight/spotlight.spec.ts rename to apps/web/playwright/e2e/spotlight/spotlight.spec.ts diff --git a/playwright/e2e/threads/threads.spec.ts b/apps/web/playwright/e2e/threads/threads.spec.ts similarity index 100% rename from playwright/e2e/threads/threads.spec.ts rename to apps/web/playwright/e2e/threads/threads.spec.ts diff --git a/playwright/e2e/timeline/media-preview-settings.spec.ts b/apps/web/playwright/e2e/timeline/media-preview-settings.spec.ts similarity index 100% rename from playwright/e2e/timeline/media-preview-settings.spec.ts rename to apps/web/playwright/e2e/timeline/media-preview-settings.spec.ts diff --git a/playwright/e2e/timeline/timeline.spec.ts b/apps/web/playwright/e2e/timeline/timeline.spec.ts similarity index 95% rename from playwright/e2e/timeline/timeline.spec.ts rename to apps/web/playwright/e2e/timeline/timeline.spec.ts index b4e927cdac..5553bbd3de 100644 --- a/playwright/e2e/timeline/timeline.spec.ts +++ b/apps/web/playwright/e2e/timeline/timeline.spec.ts @@ -783,67 +783,6 @@ test.describe("Timeline", () => { ).toBeVisible(); }); - test("should render url previews", { tag: "@screenshot" }, async ({ page, app, room, axe, context }) => { - axe.disableRules("color-contrast"); - - // Element Web uses a Service Worker to rewrite unauthenticated media requests to authenticated ones, but - // the page can't see this happening. We intercept the route at the BrowserContext to ensure we get it - // post-worker, but we can't waitForResponse on that, so the page context is still used there. Because - // the page doesn't see the rewrite, it waits for the unauthenticated route. This is only confusing until - // the js-sdk (and thus the app as a whole) switches to using authenticated endpoints by default, hopefully. - await context.route( - "**/_matrix/client/v1/media/thumbnail/matrix.org/2022-08-16_yaiSVSRIsNFfxDnV?*", - async (route) => { - await route.fulfill({ - path: "playwright/sample-files/riot.png", - }); - }, - ); - await page.route( - "**/_matrix/media/v3/preview_url?url=https%3A%2F%2Fcall.element.io%2F&ts=*", - async (route) => { - await route.fulfill({ - json: { - "og:title": "Element Call", - "og:description": null, - "og:image:width": 48, - "og:image:height": 48, - "og:image": "mxc://matrix.org/2022-08-16_yaiSVSRIsNFfxDnV", - "og:image:type": "image/png", - "matrix:image:size": 2121, - }, - }); - }, - ); - - const requestPromises: Promise[] = [ - page.waitForResponse("**/_matrix/media/v3/preview_url?url=https%3A%2F%2Fcall.element.io%2F&ts=*"), - // see context.route above for why we listen for the unauthenticated endpoint - page.waitForResponse("**/_matrix/media/v3/thumbnail/matrix.org/2022-08-16_yaiSVSRIsNFfxDnV?*"), - ]; - - await app.client.sendMessage(room.roomId, "https://call.element.io/"); - await page.goto(`/#/room/${room.roomId}`); - - await expect(page.locator(".mx_LinkPreviewWidget").getByText("Element Call")).toBeVisible(); - await Promise.all(requestPromises); - - await expect(axe).toHaveNoViolations(); - - await app.timeline.scrollToBottom(); - await expect(page.locator(".mx_EventTile_last")).toMatchScreenshot("url-preview.png", { - // Exclude timestamp and read marker from snapshot - css: ` - .mx_MessageTimestamp { - visibility: hidden; - } - .mx_TopUnreadMessagesBar, .mx_MessagePanel_myReadMarker { - display: none !important; - } - `, - }); - }); - test.describe("on search results panel", () => { test( "should highlight search result words regardless of formatting", @@ -1008,6 +947,34 @@ test.describe("Timeline", () => { await expect(page.getByRole("button", { name: "Show video" })).toBeVisible(); await expect(page.locator("video")).not.toBeVisible(); }); + + test("should insert a mention when clicking sender profile in timeline", async ({ + page, + app, + homeserver, + room, + }) => { + const senderDisplayName = "SenderBot"; + const messageFromSender = "message from sender"; + + const bot = new Bot(page, homeserver, { + displayName: senderDisplayName, + autoAcceptInvites: false, + }); + await bot.prepareClient(); + await app.client.inviteUser(room.roomId, bot.credentials.userId); + await bot.joinRoom(room.roomId); + await bot.sendMessage(room.roomId, messageFromSender); + + await app.viewRoomById(room.roomId); + + const senderMessageTile = getEventTilesWithBodies(page).filter({ hasText: messageFromSender }).first(); + await expect(senderMessageTile).toBeVisible(); + + await senderMessageTile.locator(".mx_DisambiguatedProfile").click(); + + await expect(app.getComposerField().getByText(senderDisplayName)).toBeVisible(); + }); }); test.describe("message sending", { tag: ["@no-firefox", "@no-webkit"] }, () => { diff --git a/playwright/e2e/toasts/analytics-toast.spec.ts b/apps/web/playwright/e2e/toasts/analytics-toast.spec.ts similarity index 100% rename from playwright/e2e/toasts/analytics-toast.spec.ts rename to apps/web/playwright/e2e/toasts/analytics-toast.spec.ts diff --git a/playwright/e2e/update/update.spec.ts b/apps/web/playwright/e2e/update/update.spec.ts similarity index 100% rename from playwright/e2e/update/update.spec.ts rename to apps/web/playwright/e2e/update/update.spec.ts diff --git a/playwright/e2e/user-menu/user-menu.spec.ts b/apps/web/playwright/e2e/user-menu/user-menu.spec.ts similarity index 100% rename from playwright/e2e/user-menu/user-menu.spec.ts rename to apps/web/playwright/e2e/user-menu/user-menu.spec.ts diff --git a/playwright/e2e/user-view/user-view.spec.ts b/apps/web/playwright/e2e/user-view/user-view.spec.ts similarity index 100% rename from playwright/e2e/user-view/user-view.spec.ts rename to apps/web/playwright/e2e/user-view/user-view.spec.ts diff --git a/playwright/e2e/utils.ts b/apps/web/playwright/e2e/utils.ts similarity index 100% rename from playwright/e2e/utils.ts rename to apps/web/playwright/e2e/utils.ts diff --git a/playwright/e2e/voip/element-call.spec.ts b/apps/web/playwright/e2e/voip/element-call.spec.ts similarity index 99% rename from playwright/e2e/voip/element-call.spec.ts rename to apps/web/playwright/e2e/voip/element-call.spec.ts index b481f241cc..64f7a6f0f0 100644 --- a/playwright/e2e/voip/element-call.spec.ts +++ b/apps/web/playwright/e2e/voip/element-call.spec.ts @@ -6,6 +6,7 @@ Please see LICENSE files in the repository root for full details. */ import { readFile } from "node:fs/promises"; +import { fileURLToPath } from "node:url"; import { type Page } from "@playwright/test"; import type { EventType, Preset } from "matrix-js-sdk/src/matrix"; @@ -19,7 +20,7 @@ import { isDendrite } from "../../plugins/homeserver/dendrite"; // The fake call app does *just* enough to convince Element Web that a call is ongoing // and functions like PiP work. It does not actually do anything though, to limit the // surface we test. -const widgetApi = readFile("node_modules/matrix-widget-api/dist/api.min.js", "utf-8"); +const widgetApi = readFile(fileURLToPath(import.meta.resolve("matrix-widget-api/dist/api.min.js")), "utf-8"); const fakeCallClient = readFile("playwright/sample-files/fake-element-call.html", "utf-8"); function assertCommonCallParameters( diff --git a/playwright/e2e/voip/pstn.spec.ts b/apps/web/playwright/e2e/voip/pstn.spec.ts similarity index 100% rename from playwright/e2e/voip/pstn.spec.ts rename to apps/web/playwright/e2e/voip/pstn.spec.ts diff --git a/playwright/e2e/widgets/events.spec.ts b/apps/web/playwright/e2e/widgets/events.spec.ts similarity index 100% rename from playwright/e2e/widgets/events.spec.ts rename to apps/web/playwright/e2e/widgets/events.spec.ts diff --git a/playwright/e2e/widgets/jitsi.spec.ts b/apps/web/playwright/e2e/widgets/jitsi.spec.ts similarity index 100% rename from playwright/e2e/widgets/jitsi.spec.ts rename to apps/web/playwright/e2e/widgets/jitsi.spec.ts diff --git a/playwright/e2e/widgets/layout.spec.ts b/apps/web/playwright/e2e/widgets/layout.spec.ts similarity index 100% rename from playwright/e2e/widgets/layout.spec.ts rename to apps/web/playwright/e2e/widgets/layout.spec.ts diff --git a/playwright/e2e/widgets/permissions-dialog.spec.ts b/apps/web/playwright/e2e/widgets/permissions-dialog.spec.ts similarity index 94% rename from playwright/e2e/widgets/permissions-dialog.spec.ts rename to apps/web/playwright/e2e/widgets/permissions-dialog.spec.ts index bdaec30cd5..fde57b040f 100644 --- a/playwright/e2e/widgets/permissions-dialog.spec.ts +++ b/apps/web/playwright/e2e/widgets/permissions-dialog.spec.ts @@ -36,7 +36,7 @@ const DEMO_WIDGET_HTML = ` `; -test.describe("Widger permissions dialog", () => { +test.describe("Widget permissions dialog", () => { test.use({ displayName: "Mike", }); @@ -88,7 +88,7 @@ test.describe("Widger permissions dialog", () => { // open the room await app.viewRoomByName(ROOM_NAME); - axe.disableRules("color-contrast"); // XXX: Inheriting colour contrast issues from room view. + axe.disableRules(["color-contrast", "nested-interactive"]); // XXX: Inheriting colour contrast issues from room view. await expect(axe).toHaveNoViolations(); await expect(page.locator(".mx_WidgetCapabilitiesPromptDialog")).toMatchScreenshot( "widget-capabilites-prompt.png", diff --git a/playwright/e2e/widgets/stickers.spec.ts b/apps/web/playwright/e2e/widgets/stickers.spec.ts similarity index 100% rename from playwright/e2e/widgets/stickers.spec.ts rename to apps/web/playwright/e2e/widgets/stickers.spec.ts diff --git a/playwright/e2e/widgets/widget-pip-close.spec.ts b/apps/web/playwright/e2e/widgets/widget-pip-close.spec.ts similarity index 100% rename from playwright/e2e/widgets/widget-pip-close.spec.ts rename to apps/web/playwright/e2e/widgets/widget-pip-close.spec.ts diff --git a/playwright/element-web-test.ts b/apps/web/playwright/element-web-test.ts similarity index 95% rename from playwright/element-web-test.ts rename to apps/web/playwright/element-web-test.ts index bf1353ea6c..558d8192ff 100644 --- a/playwright/element-web-test.ts +++ b/apps/web/playwright/element-web-test.ts @@ -89,10 +89,11 @@ export const test = base.extend({ }, botCreateOpts: {}, - bot: async ({ page, homeserver, botCreateOpts, user }, use) => { + bot: async ({ page, homeserver, botCreateOpts, user }, use, testInfo) => { const bot = new Bot(page, homeserver, botCreateOpts); await bot.prepareClient(); // eagerly register the bot await use(bot); + await bot.onTestFinished(testInfo); }, // eslint-disable-next-line no-empty-pattern @@ -136,6 +137,10 @@ export const expect = baseExpect.extend({ border-color: var(--cpd-color-fuchsia-1200) !important; color: white !important; } + span.mx_Pill:not([style*="--avatar-letter: ''"])::before { + background: var(--cpd-color-fuchsia-1200) !important; + color: white !important; + } .mx_ReplyChain { border-left-color: var(--cpd-color-blue-1200) !important; } diff --git a/playwright/flaky-reporter.ts b/apps/web/playwright/flaky-reporter.ts similarity index 100% rename from playwright/flaky-reporter.ts rename to apps/web/playwright/flaky-reporter.ts diff --git a/playwright/global.d.ts b/apps/web/playwright/global.d.ts similarity index 100% rename from playwright/global.d.ts rename to apps/web/playwright/global.d.ts diff --git a/playwright/pages/ElementAppPage.ts b/apps/web/playwright/pages/ElementAppPage.ts similarity index 100% rename from playwright/pages/ElementAppPage.ts rename to apps/web/playwright/pages/ElementAppPage.ts diff --git a/playwright/pages/Spotlight.ts b/apps/web/playwright/pages/Spotlight.ts similarity index 100% rename from playwright/pages/Spotlight.ts rename to apps/web/playwright/pages/Spotlight.ts diff --git a/playwright/pages/bot.ts b/apps/web/playwright/pages/bot.ts similarity index 80% rename from playwright/pages/bot.ts rename to apps/web/playwright/pages/bot.ts index 300721d0ec..0df531020c 100644 --- a/playwright/pages/bot.ts +++ b/apps/web/playwright/pages/bot.ts @@ -6,7 +6,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import { type JSHandle, type Page } from "@playwright/test"; +import { type JSHandle, type Page, type TestInfo } from "@playwright/test"; import { uniqueId } from "lodash"; import { type MatrixClient } from "matrix-js-sdk/src/matrix"; @@ -116,30 +116,44 @@ export class Bot extends Client { const credentials = await this.getCredentials(); const clientHandle = await this.page.evaluateHandle( async ({ baseUrl, credentials, opts }) => { - function getLogger(loggerName: string): Logger { - const logger = { - getChild: (namespace: string) => getLogger(`${loggerName}:${namespace}`), - trace(...msg: any[]): void { - console.trace(loggerName, ...msg); - }, - debug(...msg: any[]): void { - console.debug(loggerName, ...msg); - }, - info(...msg: any[]): void { - console.info(loggerName, ...msg); - }, - warn(...msg: any[]): void { - console.warn(loggerName, ...msg); - }, - error(...msg: any[]): void { - console.error(loggerName, ...msg); - }, - } satisfies Logger; + class NestedLogger implements Logger { + constructor( + public readonly loggerName: string, + private writeLog: (msg: string) => void, + ) {} - return logger as unknown as Logger; + getChild(namespace: string): Logger { + return new NestedLogger(`${this.loggerName}:${namespace}`, this.writeLog); + } + + trace(...msg: any[]): void { + this.writeLog(`T ${this.loggerName} ${msg.join(" ")}`); + } + debug(...msg: any[]): void { + this.writeLog(`D ${this.loggerName} ${msg.join(" ")}`); + } + info(...msg: any[]): void { + this.writeLog(`I ${this.loggerName} ${msg.join(" ")}`); + } + warn(...msg: any[]): void { + this.writeLog(`W ${this.loggerName} ${msg.join(" ")}`); + } + error(...msg: any[]): void { + this.writeLog(`E ${this.loggerName} ${msg.join(" ")}`); + } } - const logger = getLogger(`bot ${credentials.userId}`); + class PlaywrightLogger extends NestedLogger { + public log = ""; + + constructor() { + super("", (msg: string) => { + this.log += msg + "\n"; + }); + } + } + + const logger = new PlaywrightLogger(); // Store the cached secret storage key and return it when `getSecretStorageKey` is called let cachedKey: { keyId: string; key: Uint8Array }; @@ -251,4 +265,17 @@ export class Bot extends Client { return clientHandle; } + + public async onTestFinished(testInfo: TestInfo): Promise { + if (testInfo.status !== "passed") { + const credentials = await this.getCredentials(); + const client = await this.getClientHandle(); + // @ts-ignore private field logger + const body = await client.evaluate((cli) => (cli.logger).log); + await testInfo.attach(`playwright-bot-${credentials.userId}`, { + body, + contentType: "text/plain", + }); + } + } } diff --git a/playwright/pages/client.ts b/apps/web/playwright/pages/client.ts similarity index 100% rename from playwright/pages/client.ts rename to apps/web/playwright/pages/client.ts diff --git a/playwright/pages/crypto.ts b/apps/web/playwright/pages/crypto.ts similarity index 100% rename from playwright/pages/crypto.ts rename to apps/web/playwright/pages/crypto.ts diff --git a/playwright/pages/network.ts b/apps/web/playwright/pages/network.ts similarity index 100% rename from playwright/pages/network.ts rename to apps/web/playwright/pages/network.ts diff --git a/playwright/pages/settings.ts b/apps/web/playwright/pages/settings.ts similarity index 100% rename from playwright/pages/settings.ts rename to apps/web/playwright/pages/settings.ts diff --git a/playwright/pages/timeline.ts b/apps/web/playwright/pages/timeline.ts similarity index 100% rename from playwright/pages/timeline.ts rename to apps/web/playwright/pages/timeline.ts diff --git a/playwright/pages/toasts.ts b/apps/web/playwright/pages/toasts.ts similarity index 100% rename from playwright/pages/toasts.ts rename to apps/web/playwright/pages/toasts.ts diff --git a/playwright/plugins/homeserver/dendrite/index.ts b/apps/web/playwright/plugins/homeserver/dendrite/index.ts similarity index 100% rename from playwright/plugins/homeserver/dendrite/index.ts rename to apps/web/playwright/plugins/homeserver/dendrite/index.ts diff --git a/playwright/plugins/homeserver/index.ts b/apps/web/playwright/plugins/homeserver/index.ts similarity index 100% rename from playwright/plugins/homeserver/index.ts rename to apps/web/playwright/plugins/homeserver/index.ts diff --git a/playwright/plugins/homeserver/synapse/consentHomeserver.ts b/apps/web/playwright/plugins/homeserver/synapse/consentHomeserver.ts similarity index 100% rename from playwright/plugins/homeserver/synapse/consentHomeserver.ts rename to apps/web/playwright/plugins/homeserver/synapse/consentHomeserver.ts diff --git a/playwright/plugins/homeserver/synapse/emailHomeserver.ts b/apps/web/playwright/plugins/homeserver/synapse/emailHomeserver.ts similarity index 100% rename from playwright/plugins/homeserver/synapse/emailHomeserver.ts rename to apps/web/playwright/plugins/homeserver/synapse/emailHomeserver.ts diff --git a/playwright/plugins/homeserver/synapse/legacyOAuthHomeserver.ts b/apps/web/playwright/plugins/homeserver/synapse/legacyOAuthHomeserver.ts similarity index 100% rename from playwright/plugins/homeserver/synapse/legacyOAuthHomeserver.ts rename to apps/web/playwright/plugins/homeserver/synapse/legacyOAuthHomeserver.ts diff --git a/playwright/plugins/homeserver/synapse/masHomeserver.ts b/apps/web/playwright/plugins/homeserver/synapse/masHomeserver.ts similarity index 100% rename from playwright/plugins/homeserver/synapse/masHomeserver.ts rename to apps/web/playwright/plugins/homeserver/synapse/masHomeserver.ts diff --git a/playwright/plugins/homeserver/synapse/res/templates/privacy/en/1.0.html b/apps/web/playwright/plugins/homeserver/synapse/res/templates/privacy/en/1.0.html similarity index 100% rename from playwright/plugins/homeserver/synapse/res/templates/privacy/en/1.0.html rename to apps/web/playwright/plugins/homeserver/synapse/res/templates/privacy/en/1.0.html diff --git a/playwright/plugins/homeserver/synapse/res/templates/privacy/en/success.html b/apps/web/playwright/plugins/homeserver/synapse/res/templates/privacy/en/success.html similarity index 100% rename from playwright/plugins/homeserver/synapse/res/templates/privacy/en/success.html rename to apps/web/playwright/plugins/homeserver/synapse/res/templates/privacy/en/success.html diff --git a/playwright/plugins/homeserver/synapse/uiaLongSessionTimeoutHomeserver.ts b/apps/web/playwright/plugins/homeserver/synapse/uiaLongSessionTimeoutHomeserver.ts similarity index 100% rename from playwright/plugins/homeserver/synapse/uiaLongSessionTimeoutHomeserver.ts rename to apps/web/playwright/plugins/homeserver/synapse/uiaLongSessionTimeoutHomeserver.ts diff --git a/playwright/plugins/oauth_server/README.md b/apps/web/playwright/plugins/oauth_server/README.md similarity index 100% rename from playwright/plugins/oauth_server/README.md rename to apps/web/playwright/plugins/oauth_server/README.md diff --git a/playwright/plugins/oauth_server/index.ts b/apps/web/playwright/plugins/oauth_server/index.ts similarity index 100% rename from playwright/plugins/oauth_server/index.ts rename to apps/web/playwright/plugins/oauth_server/index.ts diff --git a/playwright/plugins/oauth_server/res/oauth/auth.html b/apps/web/playwright/plugins/oauth_server/res/oauth/auth.html similarity index 100% rename from playwright/plugins/oauth_server/res/oauth/auth.html rename to apps/web/playwright/plugins/oauth_server/res/oauth/auth.html diff --git a/playwright/plugins/webserver/index.ts b/apps/web/playwright/plugins/webserver/index.ts similarity index 100% rename from playwright/plugins/webserver/index.ts rename to apps/web/playwright/plugins/webserver/index.ts diff --git a/playwright/sample-files/1sec-long-name-audio-file.ogg b/apps/web/playwright/sample-files/1sec-long-name-audio-file.ogg similarity index 100% rename from playwright/sample-files/1sec-long-name-audio-file.ogg rename to apps/web/playwright/sample-files/1sec-long-name-audio-file.ogg diff --git a/playwright/sample-files/1sec.ogg b/apps/web/playwright/sample-files/1sec.ogg similarity index 100% rename from playwright/sample-files/1sec.ogg rename to apps/web/playwright/sample-files/1sec.ogg diff --git a/playwright/sample-files/5secvid.webm b/apps/web/playwright/sample-files/5secvid.webm similarity index 100% rename from playwright/sample-files/5secvid.webm rename to apps/web/playwright/sample-files/5secvid.webm diff --git a/playwright/sample-files/custom-component-module.js b/apps/web/playwright/sample-files/custom-component-module.js similarity index 100% rename from playwright/sample-files/custom-component-module.js rename to apps/web/playwright/sample-files/custom-component-module.js diff --git a/playwright/sample-files/element.png b/apps/web/playwright/sample-files/element.png similarity index 100% rename from playwright/sample-files/element.png rename to apps/web/playwright/sample-files/element.png diff --git a/playwright/sample-files/example-module.js b/apps/web/playwright/sample-files/example-module.js similarity index 100% rename from playwright/sample-files/example-module.js rename to apps/web/playwright/sample-files/example-module.js diff --git a/playwright/sample-files/fake-element-call-with-send.html b/apps/web/playwright/sample-files/fake-element-call-with-send.html similarity index 100% rename from playwright/sample-files/fake-element-call-with-send.html rename to apps/web/playwright/sample-files/fake-element-call-with-send.html diff --git a/playwright/sample-files/fake-element-call.html b/apps/web/playwright/sample-files/fake-element-call.html similarity index 100% rename from playwright/sample-files/fake-element-call.html rename to apps/web/playwright/sample-files/fake-element-call.html diff --git a/playwright/sample-files/matrix-org-client-versions.json b/apps/web/playwright/sample-files/matrix-org-client-versions.json similarity index 100% rename from playwright/sample-files/matrix-org-client-versions.json rename to apps/web/playwright/sample-files/matrix-org-client-versions.json diff --git a/playwright/sample-files/riot.png b/apps/web/playwright/sample-files/riot.png similarity index 100% rename from playwright/sample-files/riot.png rename to apps/web/playwright/sample-files/riot.png diff --git a/playwright/sample-files/upload-first.ogg b/apps/web/playwright/sample-files/upload-first.ogg similarity index 100% rename from playwright/sample-files/upload-first.ogg rename to apps/web/playwright/sample-files/upload-first.ogg diff --git a/playwright/sample-files/upload-second.ogg b/apps/web/playwright/sample-files/upload-second.ogg similarity index 100% rename from playwright/sample-files/upload-second.ogg rename to apps/web/playwright/sample-files/upload-second.ogg diff --git a/playwright/sample-files/upload-third.ogg b/apps/web/playwright/sample-files/upload-third.ogg similarity index 100% rename from playwright/sample-files/upload-third.ogg rename to apps/web/playwright/sample-files/upload-third.ogg diff --git a/playwright/services.ts b/apps/web/playwright/services.ts similarity index 100% rename from playwright/services.ts rename to apps/web/playwright/services.ts diff --git a/playwright/snapshots/app-loading/feature-detection.spec.ts/unsupported-browser-CompatibilityView-linux.png b/apps/web/playwright/snapshots/app-loading/feature-detection.spec.ts/unsupported-browser-CompatibilityView-linux.png similarity index 100% rename from playwright/snapshots/app-loading/feature-detection.spec.ts/unsupported-browser-CompatibilityView-linux.png rename to apps/web/playwright/snapshots/app-loading/feature-detection.spec.ts/unsupported-browser-CompatibilityView-linux.png diff --git a/playwright/snapshots/app-loading/feature-detection.spec.ts/unsupported-browser-linux.png b/apps/web/playwright/snapshots/app-loading/feature-detection.spec.ts/unsupported-browser-linux.png similarity index 100% rename from playwright/snapshots/app-loading/feature-detection.spec.ts/unsupported-browser-linux.png rename to apps/web/playwright/snapshots/app-loading/feature-detection.spec.ts/unsupported-browser-linux.png diff --git a/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--dark-theme--bubble-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--dark-theme--bubble-layout-linux.png similarity index 100% rename from playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--dark-theme--bubble-layout-linux.png rename to apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--dark-theme--bubble-layout-linux.png diff --git a/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--dark-theme--group-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--dark-theme--group-layout-linux.png similarity index 100% rename from playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--dark-theme--group-layout-linux.png rename to apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--dark-theme--group-layout-linux.png diff --git a/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--dark-theme--irc-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--dark-theme--irc-layout-linux.png similarity index 100% rename from playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--dark-theme--irc-layout-linux.png rename to apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--dark-theme--irc-layout-linux.png diff --git a/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--high-contrast--bubble-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--high-contrast--bubble-layout-linux.png similarity index 100% rename from playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--high-contrast--bubble-layout-linux.png rename to apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--high-contrast--bubble-layout-linux.png diff --git a/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--high-contrast--group-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--high-contrast--group-layout-linux.png similarity index 100% rename from playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--high-contrast--group-layout-linux.png rename to apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--high-contrast--group-layout-linux.png diff --git a/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--high-contrast--irc-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--high-contrast--irc-layout-linux.png similarity index 100% rename from playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--high-contrast--irc-layout-linux.png rename to apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--high-contrast--irc-layout-linux.png diff --git a/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--bubble-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--bubble-layout-linux.png similarity index 100% rename from playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--bubble-layout-linux.png rename to apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--bubble-layout-linux.png diff --git a/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--group-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--group-layout-linux.png similarity index 100% rename from playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--group-layout-linux.png rename to apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--group-layout-linux.png diff --git a/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--irc-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--irc-layout-linux.png similarity index 100% rename from playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--irc-layout-linux.png rename to apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--irc-layout-linux.png diff --git a/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--monospace-font--bubble-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--monospace-font--bubble-layout-linux.png similarity index 100% rename from playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--monospace-font--bubble-layout-linux.png rename to apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--monospace-font--bubble-layout-linux.png diff --git a/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--monospace-font--group-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--monospace-font--group-layout-linux.png similarity index 100% rename from playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--monospace-font--group-layout-linux.png rename to apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--monospace-font--group-layout-linux.png diff --git a/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--monospace-font--irc-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--monospace-font--irc-layout-linux.png similarity index 100% rename from playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--monospace-font--irc-layout-linux.png rename to apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player--light-theme--monospace-font--irc-layout-linux.png diff --git a/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-bubble-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-bubble-layout-linux.png similarity index 100% rename from playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-bubble-layout-linux.png rename to apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-bubble-layout-linux.png diff --git a/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-chain-bubble-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-chain-bubble-layout-linux.png similarity index 100% rename from playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-chain-bubble-layout-linux.png rename to apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-chain-bubble-layout-linux.png diff --git a/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-chain-group-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-chain-group-layout-linux.png similarity index 100% rename from playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-chain-group-layout-linux.png rename to apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-chain-group-layout-linux.png diff --git a/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-chain-irc-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-chain-irc-layout-linux.png similarity index 100% rename from playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-chain-irc-layout-linux.png rename to apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-chain-irc-layout-linux.png diff --git a/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-group-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-group-layout-linux.png similarity index 100% rename from playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-group-layout-linux.png rename to apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-group-layout-linux.png diff --git a/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-irc-layout-linux.png b/apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-irc-layout-linux.png similarity index 100% rename from playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-irc-layout-linux.png rename to apps/web/playwright/snapshots/audio-player/audio-player.spec.ts/Selected-EventTile-of-audio-player-with-a-reply-irc-layout-linux.png diff --git a/playwright/snapshots/chat-export/html-export.spec.ts/html-export-linux.png b/apps/web/playwright/snapshots/chat-export/html-export.spec.ts/html-export-linux.png similarity index 100% rename from playwright/snapshots/chat-export/html-export.spec.ts/html-export-linux.png rename to apps/web/playwright/snapshots/chat-export/html-export.spec.ts/html-export-linux.png diff --git a/playwright/snapshots/composer/CIDER.spec.ts/emoji-autocomplete-linux.png b/apps/web/playwright/snapshots/composer/CIDER.spec.ts/emoji-autocomplete-linux.png similarity index 100% rename from playwright/snapshots/composer/CIDER.spec.ts/emoji-autocomplete-linux.png rename to apps/web/playwright/snapshots/composer/CIDER.spec.ts/emoji-autocomplete-linux.png diff --git a/playwright/snapshots/composer/CIDER.spec.ts/emoji-picker-linux.png b/apps/web/playwright/snapshots/composer/CIDER.spec.ts/emoji-picker-linux.png similarity index 100% rename from playwright/snapshots/composer/CIDER.spec.ts/emoji-picker-linux.png rename to apps/web/playwright/snapshots/composer/CIDER.spec.ts/emoji-picker-linux.png diff --git a/playwright/snapshots/composer/CIDER.spec.ts/emoji-picker-small-linux.png b/apps/web/playwright/snapshots/composer/CIDER.spec.ts/emoji-picker-small-linux.png similarity index 100% rename from playwright/snapshots/composer/CIDER.spec.ts/emoji-picker-small-linux.png rename to apps/web/playwright/snapshots/composer/CIDER.spec.ts/emoji-picker-small-linux.png diff --git a/apps/web/playwright/snapshots/composer/CIDER.spec.ts/mention-linux.png b/apps/web/playwright/snapshots/composer/CIDER.spec.ts/mention-linux.png new file mode 100644 index 0000000000..712697a3fa Binary files /dev/null and b/apps/web/playwright/snapshots/composer/CIDER.spec.ts/mention-linux.png differ diff --git a/apps/web/playwright/snapshots/crypto/complete-security.spec.ts/complete-security-linux.png b/apps/web/playwright/snapshots/crypto/complete-security.spec.ts/complete-security-linux.png new file mode 100644 index 0000000000..adc8726c3a Binary files /dev/null and b/apps/web/playwright/snapshots/crypto/complete-security.spec.ts/complete-security-linux.png differ diff --git a/playwright/snapshots/crypto/crypto.spec.ts/RoomSummaryCard-with-verified-e2ee-linux.png b/apps/web/playwright/snapshots/crypto/crypto.spec.ts/RoomSummaryCard-with-verified-e2ee-linux.png similarity index 100% rename from playwright/snapshots/crypto/crypto.spec.ts/RoomSummaryCard-with-verified-e2ee-linux.png rename to apps/web/playwright/snapshots/crypto/crypto.spec.ts/RoomSummaryCard-with-verified-e2ee-linux.png diff --git a/playwright/snapshots/crypto/crypto.spec.ts/composer-e2e-icon-linux.png b/apps/web/playwright/snapshots/crypto/crypto.spec.ts/composer-e2e-icon-linux.png similarity index 100% rename from playwright/snapshots/crypto/crypto.spec.ts/composer-e2e-icon-linux.png rename to apps/web/playwright/snapshots/crypto/crypto.spec.ts/composer-e2e-icon-linux.png diff --git a/playwright/snapshots/crypto/decryption-failure-messages.spec.ts/history-not-available-linux.png b/apps/web/playwright/snapshots/crypto/decryption-failure-messages.spec.ts/history-not-available-linux.png similarity index 100% rename from playwright/snapshots/crypto/decryption-failure-messages.spec.ts/history-not-available-linux.png rename to apps/web/playwright/snapshots/crypto/decryption-failure-messages.spec.ts/history-not-available-linux.png diff --git a/playwright/snapshots/crypto/device-verification.spec.ts/confirm-green-shield-linux.png b/apps/web/playwright/snapshots/crypto/device-verification.spec.ts/confirm-green-shield-linux.png similarity index 100% rename from playwright/snapshots/crypto/device-verification.spec.ts/confirm-green-shield-linux.png rename to apps/web/playwright/snapshots/crypto/device-verification.spec.ts/confirm-green-shield-linux.png diff --git a/playwright/snapshots/crypto/device-verification.spec.ts/device-verified-e2eIcon-linux.png b/apps/web/playwright/snapshots/crypto/device-verification.spec.ts/device-verified-e2eIcon-linux.png similarity index 100% rename from playwright/snapshots/crypto/device-verification.spec.ts/device-verified-e2eIcon-linux.png rename to apps/web/playwright/snapshots/crypto/device-verification.spec.ts/device-verified-e2eIcon-linux.png diff --git a/playwright/snapshots/crypto/device-verification.spec.ts/got-it-linux.png b/apps/web/playwright/snapshots/crypto/device-verification.spec.ts/got-it-linux.png similarity index 100% rename from playwright/snapshots/crypto/device-verification.spec.ts/got-it-linux.png rename to apps/web/playwright/snapshots/crypto/device-verification.spec.ts/got-it-linux.png diff --git a/playwright/snapshots/crypto/device-verification.spec.ts/qr-code-linux.png b/apps/web/playwright/snapshots/crypto/device-verification.spec.ts/qr-code-linux.png similarity index 100% rename from playwright/snapshots/crypto/device-verification.spec.ts/qr-code-linux.png rename to apps/web/playwright/snapshots/crypto/device-verification.spec.ts/qr-code-linux.png diff --git a/playwright/snapshots/crypto/device-verification.spec.ts/recovery-key-linux.png b/apps/web/playwright/snapshots/crypto/device-verification.spec.ts/recovery-key-linux.png similarity index 100% rename from playwright/snapshots/crypto/device-verification.spec.ts/recovery-key-linux.png rename to apps/web/playwright/snapshots/crypto/device-verification.spec.ts/recovery-key-linux.png diff --git a/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-authenticity-linux.png b/apps/web/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-authenticity-linux.png similarity index 100% rename from playwright/snapshots/crypto/event-shields.spec.ts/event-shield-authenticity-linux.png rename to apps/web/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-authenticity-linux.png diff --git a/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-identity-reset-linux.png b/apps/web/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-identity-reset-linux.png similarity index 100% rename from playwright/snapshots/crypto/event-shields.spec.ts/event-shield-identity-reset-linux.png rename to apps/web/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-identity-reset-linux.png diff --git a/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-not-verified-linux.png b/apps/web/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-not-verified-linux.png similarity index 100% rename from playwright/snapshots/crypto/event-shields.spec.ts/event-shield-not-verified-linux.png rename to apps/web/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-not-verified-linux.png diff --git a/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-utd-linux.png b/apps/web/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-utd-linux.png similarity index 100% rename from playwright/snapshots/crypto/event-shields.spec.ts/event-shield-utd-linux.png rename to apps/web/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-utd-linux.png diff --git a/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-warning-linux.png b/apps/web/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-warning-linux.png similarity index 100% rename from playwright/snapshots/crypto/event-shields.spec.ts/event-shield-warning-linux.png rename to apps/web/playwright/snapshots/crypto/event-shields.spec.ts/event-shield-warning-linux.png diff --git a/playwright/snapshots/crypto/history-sharing.spec.ts/shared-history-invite-accepted-linux.png b/apps/web/playwright/snapshots/crypto/history-sharing.spec.ts/shared-history-invite-accepted-linux.png similarity index 100% rename from playwright/snapshots/crypto/history-sharing.spec.ts/shared-history-invite-accepted-linux.png rename to apps/web/playwright/snapshots/crypto/history-sharing.spec.ts/shared-history-invite-accepted-linux.png diff --git a/playwright/snapshots/crypto/toasts.spec.ts/key-storage-out-of-sync-toast-linux.png b/apps/web/playwright/snapshots/crypto/toasts.spec.ts/key-storage-out-of-sync-toast-linux.png similarity index 100% rename from playwright/snapshots/crypto/toasts.spec.ts/key-storage-out-of-sync-toast-linux.png rename to apps/web/playwright/snapshots/crypto/toasts.spec.ts/key-storage-out-of-sync-toast-linux.png diff --git a/playwright/snapshots/devtools/devtools.spec.ts/devtools-dialog-linux.png b/apps/web/playwright/snapshots/devtools/devtools.spec.ts/devtools-dialog-linux.png similarity index 100% rename from playwright/snapshots/devtools/devtools.spec.ts/devtools-dialog-linux.png rename to apps/web/playwright/snapshots/devtools/devtools.spec.ts/devtools-dialog-linux.png diff --git a/playwright/snapshots/devtools/upgraderoom.spec.ts/upgrade-room-linux.png b/apps/web/playwright/snapshots/devtools/upgraderoom.spec.ts/upgrade-room-linux.png similarity index 100% rename from playwright/snapshots/devtools/upgraderoom.spec.ts/upgrade-room-linux.png rename to apps/web/playwright/snapshots/devtools/upgraderoom.spec.ts/upgrade-room-linux.png diff --git a/playwright/snapshots/editing/editing.spec.ts/message-edit-history-dialog-linux.png b/apps/web/playwright/snapshots/editing/editing.spec.ts/message-edit-history-dialog-linux.png similarity index 100% rename from playwright/snapshots/editing/editing.spec.ts/message-edit-history-dialog-linux.png rename to apps/web/playwright/snapshots/editing/editing.spec.ts/message-edit-history-dialog-linux.png diff --git a/playwright/snapshots/feedback/rageshakes.spec.ts/rageshake-locally-linux.png b/apps/web/playwright/snapshots/feedback/rageshakes.spec.ts/rageshake-locally-linux.png similarity index 100% rename from playwright/snapshots/feedback/rageshakes.spec.ts/rageshake-locally-linux.png rename to apps/web/playwright/snapshots/feedback/rageshakes.spec.ts/rageshake-locally-linux.png diff --git a/playwright/snapshots/feedback/rageshakes.spec.ts/rageshake-via-url-linux.png b/apps/web/playwright/snapshots/feedback/rageshakes.spec.ts/rageshake-via-url-linux.png similarity index 100% rename from playwright/snapshots/feedback/rageshakes.spec.ts/rageshake-via-url-linux.png rename to apps/web/playwright/snapshots/feedback/rageshakes.spec.ts/rageshake-via-url-linux.png diff --git a/playwright/snapshots/file-upload/image-upload.spec.ts/image-upload-preview-linux.png b/apps/web/playwright/snapshots/file-upload/image-upload.spec.ts/image-upload-preview-linux.png similarity index 100% rename from playwright/snapshots/file-upload/image-upload.spec.ts/image-upload-preview-linux.png rename to apps/web/playwright/snapshots/file-upload/image-upload.spec.ts/image-upload-preview-linux.png diff --git a/apps/web/playwright/snapshots/forgot-password/forgot-password.spec.ts/forgot-password-linux.png b/apps/web/playwright/snapshots/forgot-password/forgot-password.spec.ts/forgot-password-linux.png new file mode 100644 index 0000000000..f764311250 Binary files /dev/null and b/apps/web/playwright/snapshots/forgot-password/forgot-password.spec.ts/forgot-password-linux.png differ diff --git a/playwright/snapshots/forgot-password/forgot-password.spec.ts/forgot-password-verify-email-linux.png b/apps/web/playwright/snapshots/forgot-password/forgot-password.spec.ts/forgot-password-verify-email-linux.png similarity index 100% rename from playwright/snapshots/forgot-password/forgot-password.spec.ts/forgot-password-verify-email-linux.png rename to apps/web/playwright/snapshots/forgot-password/forgot-password.spec.ts/forgot-password-verify-email-linux.png diff --git a/playwright/snapshots/invite/decline-and-block-invite-dialog.spec.ts/decline-and-block-invite-empty-linux.png b/apps/web/playwright/snapshots/invite/decline-and-block-invite-dialog.spec.ts/decline-and-block-invite-empty-linux.png similarity index 100% rename from playwright/snapshots/invite/decline-and-block-invite-dialog.spec.ts/decline-and-block-invite-empty-linux.png rename to apps/web/playwright/snapshots/invite/decline-and-block-invite-dialog.spec.ts/decline-and-block-invite-empty-linux.png diff --git a/playwright/snapshots/invite/invite-dialog.spec.ts/invite-dialog-dm-with-user-pill-linux.png b/apps/web/playwright/snapshots/invite/invite-dialog.spec.ts/invite-dialog-dm-with-user-pill-linux.png similarity index 100% rename from playwright/snapshots/invite/invite-dialog.spec.ts/invite-dialog-dm-with-user-pill-linux.png rename to apps/web/playwright/snapshots/invite/invite-dialog.spec.ts/invite-dialog-dm-with-user-pill-linux.png diff --git a/playwright/snapshots/invite/invite-dialog.spec.ts/invite-dialog-dm-without-user-linux.png b/apps/web/playwright/snapshots/invite/invite-dialog.spec.ts/invite-dialog-dm-without-user-linux.png similarity index 100% rename from playwright/snapshots/invite/invite-dialog.spec.ts/invite-dialog-dm-without-user-linux.png rename to apps/web/playwright/snapshots/invite/invite-dialog.spec.ts/invite-dialog-dm-without-user-linux.png diff --git a/playwright/snapshots/invite/invite-dialog.spec.ts/invite-dialog-room-with-user-pill-linux.png b/apps/web/playwright/snapshots/invite/invite-dialog.spec.ts/invite-dialog-room-with-user-pill-linux.png similarity index 100% rename from playwright/snapshots/invite/invite-dialog.spec.ts/invite-dialog-room-with-user-pill-linux.png rename to apps/web/playwright/snapshots/invite/invite-dialog.spec.ts/invite-dialog-room-with-user-pill-linux.png diff --git a/playwright/snapshots/invite/invite-dialog.spec.ts/invite-dialog-room-without-user-linux.png b/apps/web/playwright/snapshots/invite/invite-dialog.spec.ts/invite-dialog-room-without-user-linux.png similarity index 100% rename from playwright/snapshots/invite/invite-dialog.spec.ts/invite-dialog-room-without-user-linux.png rename to apps/web/playwright/snapshots/invite/invite-dialog.spec.ts/invite-dialog-room-without-user-linux.png diff --git a/playwright/snapshots/invite/invite-dialog.spec.ts/send-your-first-message-view-linux.png b/apps/web/playwright/snapshots/invite/invite-dialog.spec.ts/send-your-first-message-view-linux.png similarity index 100% rename from playwright/snapshots/invite/invite-dialog.spec.ts/send-your-first-message-view-linux.png rename to apps/web/playwright/snapshots/invite/invite-dialog.spec.ts/send-your-first-message-view-linux.png diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Favourite-empty-room-list-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Favourite-empty-room-list-linux.png similarity index 100% rename from playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Favourite-empty-room-list-linux.png rename to apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Favourite-empty-room-list-linux.png diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Invites-empty-room-list-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Invites-empty-room-list-linux.png similarity index 100% rename from playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Invites-empty-room-list-linux.png rename to apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Invites-empty-room-list-linux.png diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Mentions-empty-room-list-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Mentions-empty-room-list-linux.png similarity index 100% rename from playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Mentions-empty-room-list-linux.png rename to apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Mentions-empty-room-list-linux.png diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/People-empty-room-list-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/People-empty-room-list-linux.png similarity index 100% rename from playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/People-empty-room-list-linux.png rename to apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/People-empty-room-list-linux.png diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Rooms-empty-room-list-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Rooms-empty-room-list-linux.png similarity index 100% rename from playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Rooms-empty-room-list-linux.png rename to apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Rooms-empty-room-list-linux.png diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Unreads-empty-room-list-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Unreads-empty-room-list-linux.png similarity index 100% rename from playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Unreads-empty-room-list-linux.png rename to apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/Unreads-empty-room-list-linux.png diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/collapsed-primary-filters-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/collapsed-primary-filters-linux.png new file mode 100644 index 0000000000..932af08f7c Binary files /dev/null and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/collapsed-primary-filters-linux.png differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/default-empty-room-list-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/default-empty-room-list-linux.png similarity index 100% rename from playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/default-empty-room-list-linux.png rename to apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/default-empty-room-list-linux.png diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/expanded-primary-filters-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/expanded-primary-filters-linux.png new file mode 100644 index 0000000000..122c437092 Binary files /dev/null and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/expanded-primary-filters-linux.png differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/filter-menu-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/filter-menu-linux.png similarity index 100% rename from playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/filter-menu-linux.png rename to apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/filter-menu-linux.png diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/room-panel-empty-room-list-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/room-panel-empty-room-list-linux.png new file mode 100644 index 0000000000..47e1318cd3 Binary files /dev/null and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/room-panel-empty-room-list-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/unread-dm-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/unread-dm-linux.png new file mode 100644 index 0000000000..d78d66705e Binary files /dev/null and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/unread-dm-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/unread-primary-filters-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/unread-primary-filters-linux.png new file mode 100644 index 0000000000..15e0444cab Binary files /dev/null and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/unread-primary-filters-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/unselected-primary-filters-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/unselected-primary-filters-linux.png new file mode 100644 index 0000000000..932af08f7c Binary files /dev/null and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/unselected-primary-filters-linux.png differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-header-compose-menu-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-header-compose-menu-linux.png similarity index 100% rename from playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-header-compose-menu-linux.png rename to apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-header-compose-menu-linux.png diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-header-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-header-linux.png new file mode 100644 index 0000000000..90195d6cce Binary files /dev/null and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-header-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-header-space-menu-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-header-space-menu-linux.png new file mode 100644 index 0000000000..98d333c5ce Binary files /dev/null and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-header-space-menu-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-space-header-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-space-header-linux.png new file mode 100644 index 0000000000..ec3f616ae9 Binary files /dev/null and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-space-header-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-panel.spec.ts/room-list-panel-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-panel.spec.ts/room-list-panel-linux.png new file mode 100644 index 0000000000..55980f5808 Binary files /dev/null and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-panel.spec.ts/room-list-panel-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-panel.spec.ts/room-list-panel-smallscreen-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-panel.spec.ts/room-list-panel-smallscreen-linux.png new file mode 100644 index 0000000000..916932e156 Binary files /dev/null and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-panel.spec.ts/room-list-panel-smallscreen-linux.png differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list-search.spec.ts/search-section-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-search.spec.ts/search-section-linux.png similarity index 100% rename from playwright/snapshots/left-panel/room-list-panel/room-list-search.spec.ts/search-section-linux.png rename to apps/web/playwright/snapshots/left-panel/room-list-panel/room-list-search.spec.ts/search-section-linux.png diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-activity-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-activity-linux.png new file mode 100644 index 0000000000..4db4049eb2 Binary files /dev/null and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-activity-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-hover-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-hover-linux.png new file mode 100644 index 0000000000..675667b611 Binary files /dev/null and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-hover-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-hover-silent-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-hover-silent-linux.png new file mode 100644 index 0000000000..87095e3f80 Binary files /dev/null and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-hover-silent-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-invited-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-invited-linux.png new file mode 100644 index 0000000000..b1d313bdee Binary files /dev/null and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-invited-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-low-priority-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-low-priority-linux.png new file mode 100644 index 0000000000..7569db5ca2 Binary files /dev/null and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-low-priority-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-mark-as-unread-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-mark-as-unread-linux.png new file mode 100644 index 0000000000..fb7777b490 Binary files /dev/null and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-mark-as-unread-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-mention-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-mention-linux.png new file mode 100644 index 0000000000..fe3c039fb7 Binary files /dev/null and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-mention-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-message-preview-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-message-preview-linux.png new file mode 100644 index 0000000000..5842bf50f6 Binary files /dev/null and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-message-preview-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-notification-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-notification-linux.png new file mode 100644 index 0000000000..09a4cb48a9 Binary files /dev/null and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-notification-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-more-options-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-more-options-linux.png new file mode 100644 index 0000000000..d4029d215a Binary files /dev/null and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-more-options-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-notification-options-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-notification-options-linux.png new file mode 100644 index 0000000000..83486d3e0b Binary files /dev/null and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-notification-options-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-notification-options-selection-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-notification-options-selection-linux.png new file mode 100644 index 0000000000..424e26da4c Binary files /dev/null and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-notification-options-selection-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-public-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-public-linux.png new file mode 100644 index 0000000000..653d2ddcb8 Binary files /dev/null and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-public-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-silent-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-silent-linux.png new file mode 100644 index 0000000000..5e433f591d Binary files /dev/null and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-silent-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-video-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-video-linux.png new file mode 100644 index 0000000000..18ae6d4ce2 Binary files /dev/null and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-video-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-linux.png new file mode 100644 index 0000000000..32592acb04 Binary files /dev/null and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-linux.png differ diff --git a/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-scrolled-linux.png b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-scrolled-linux.png new file mode 100644 index 0000000000..4d2e56a921 Binary files /dev/null and b/apps/web/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-scrolled-linux.png differ diff --git a/playwright/snapshots/location/location.spec.ts/location-live-share-dialog-linux.png b/apps/web/playwright/snapshots/location/location.spec.ts/location-live-share-dialog-linux.png similarity index 100% rename from playwright/snapshots/location/location.spec.ts/location-live-share-dialog-linux.png rename to apps/web/playwright/snapshots/location/location.spec.ts/location-live-share-dialog-linux.png diff --git a/playwright/snapshots/location/location.spec.ts/location-pin-drop-message-map-linux.png b/apps/web/playwright/snapshots/location/location.spec.ts/location-pin-drop-message-map-linux.png similarity index 100% rename from playwright/snapshots/location/location.spec.ts/location-pin-drop-message-map-linux.png rename to apps/web/playwright/snapshots/location/location.spec.ts/location-pin-drop-message-map-linux.png diff --git a/playwright/snapshots/messages/messages.spec.ts/basic-message-ltr-ltrdisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/basic-message-ltr-ltrdisplayname-linux.png similarity index 100% rename from playwright/snapshots/messages/messages.spec.ts/basic-message-ltr-ltrdisplayname-linux.png rename to apps/web/playwright/snapshots/messages/messages.spec.ts/basic-message-ltr-ltrdisplayname-linux.png diff --git a/playwright/snapshots/messages/messages.spec.ts/basic-message-ltr-rtldisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/basic-message-ltr-rtldisplayname-linux.png similarity index 100% rename from playwright/snapshots/messages/messages.spec.ts/basic-message-ltr-rtldisplayname-linux.png rename to apps/web/playwright/snapshots/messages/messages.spec.ts/basic-message-ltr-rtldisplayname-linux.png diff --git a/playwright/snapshots/messages/messages.spec.ts/basic-message-rtl-ltrdisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/basic-message-rtl-ltrdisplayname-linux.png similarity index 100% rename from playwright/snapshots/messages/messages.spec.ts/basic-message-rtl-ltrdisplayname-linux.png rename to apps/web/playwright/snapshots/messages/messages.spec.ts/basic-message-rtl-ltrdisplayname-linux.png diff --git a/playwright/snapshots/messages/messages.spec.ts/basic-message-rtl-rtldisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/basic-message-rtl-rtldisplayname-linux.png similarity index 100% rename from playwright/snapshots/messages/messages.spec.ts/basic-message-rtl-rtldisplayname-linux.png rename to apps/web/playwright/snapshots/messages/messages.spec.ts/basic-message-rtl-rtldisplayname-linux.png diff --git a/playwright/snapshots/messages/messages.spec.ts/edited-message-ltr-ltrdisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/edited-message-ltr-ltrdisplayname-linux.png similarity index 100% rename from playwright/snapshots/messages/messages.spec.ts/edited-message-ltr-ltrdisplayname-linux.png rename to apps/web/playwright/snapshots/messages/messages.spec.ts/edited-message-ltr-ltrdisplayname-linux.png diff --git a/playwright/snapshots/messages/messages.spec.ts/edited-message-ltr-rtldisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/edited-message-ltr-rtldisplayname-linux.png similarity index 100% rename from playwright/snapshots/messages/messages.spec.ts/edited-message-ltr-rtldisplayname-linux.png rename to apps/web/playwright/snapshots/messages/messages.spec.ts/edited-message-ltr-rtldisplayname-linux.png diff --git a/playwright/snapshots/messages/messages.spec.ts/edited-message-rtl-ltrdisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/edited-message-rtl-ltrdisplayname-linux.png similarity index 100% rename from playwright/snapshots/messages/messages.spec.ts/edited-message-rtl-ltrdisplayname-linux.png rename to apps/web/playwright/snapshots/messages/messages.spec.ts/edited-message-rtl-ltrdisplayname-linux.png diff --git a/playwright/snapshots/messages/messages.spec.ts/edited-message-rtl-rtldisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/edited-message-rtl-rtldisplayname-linux.png similarity index 100% rename from playwright/snapshots/messages/messages.spec.ts/edited-message-rtl-rtldisplayname-linux.png rename to apps/web/playwright/snapshots/messages/messages.spec.ts/edited-message-rtl-rtldisplayname-linux.png diff --git a/playwright/snapshots/messages/messages.spec.ts/emote-ltr-ltrdisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-ltr-ltrdisplayname-linux.png similarity index 100% rename from playwright/snapshots/messages/messages.spec.ts/emote-ltr-ltrdisplayname-linux.png rename to apps/web/playwright/snapshots/messages/messages.spec.ts/emote-ltr-ltrdisplayname-linux.png diff --git a/playwright/snapshots/messages/messages.spec.ts/emote-ltr-rtldisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-ltr-rtldisplayname-linux.png similarity index 100% rename from playwright/snapshots/messages/messages.spec.ts/emote-ltr-rtldisplayname-linux.png rename to apps/web/playwright/snapshots/messages/messages.spec.ts/emote-ltr-rtldisplayname-linux.png diff --git a/playwright/snapshots/messages/messages.spec.ts/emote-rich-ltr-ltrdisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rich-ltr-ltrdisplayname-linux.png similarity index 100% rename from playwright/snapshots/messages/messages.spec.ts/emote-rich-ltr-ltrdisplayname-linux.png rename to apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rich-ltr-ltrdisplayname-linux.png diff --git a/playwright/snapshots/messages/messages.spec.ts/emote-rich-ltr-rtldisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rich-ltr-rtldisplayname-linux.png similarity index 100% rename from playwright/snapshots/messages/messages.spec.ts/emote-rich-ltr-rtldisplayname-linux.png rename to apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rich-ltr-rtldisplayname-linux.png diff --git a/playwright/snapshots/messages/messages.spec.ts/emote-rich-rtl-ltrdisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rich-rtl-ltrdisplayname-linux.png similarity index 100% rename from playwright/snapshots/messages/messages.spec.ts/emote-rich-rtl-ltrdisplayname-linux.png rename to apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rich-rtl-ltrdisplayname-linux.png diff --git a/playwright/snapshots/messages/messages.spec.ts/emote-rich-rtl-rtldisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rich-rtl-rtldisplayname-linux.png similarity index 100% rename from playwright/snapshots/messages/messages.spec.ts/emote-rich-rtl-rtldisplayname-linux.png rename to apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rich-rtl-rtldisplayname-linux.png diff --git a/playwright/snapshots/messages/messages.spec.ts/emote-rtl-ltrdisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rtl-ltrdisplayname-linux.png similarity index 100% rename from playwright/snapshots/messages/messages.spec.ts/emote-rtl-ltrdisplayname-linux.png rename to apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rtl-ltrdisplayname-linux.png diff --git a/playwright/snapshots/messages/messages.spec.ts/emote-rtl-rtldisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rtl-rtldisplayname-linux.png similarity index 100% rename from playwright/snapshots/messages/messages.spec.ts/emote-rtl-rtldisplayname-linux.png rename to apps/web/playwright/snapshots/messages/messages.spec.ts/emote-rtl-rtldisplayname-linux.png diff --git a/playwright/snapshots/messages/messages.spec.ts/preview-basic-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/preview-basic-linux.png similarity index 100% rename from playwright/snapshots/messages/messages.spec.ts/preview-basic-linux.png rename to apps/web/playwright/snapshots/messages/messages.spec.ts/preview-basic-linux.png diff --git a/playwright/snapshots/messages/messages.spec.ts/preview-with-thumb-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/preview-with-thumb-linux.png similarity index 100% rename from playwright/snapshots/messages/messages.spec.ts/preview-with-thumb-linux.png rename to apps/web/playwright/snapshots/messages/messages.spec.ts/preview-with-thumb-linux.png diff --git a/playwright/snapshots/messages/messages.spec.ts/reply-message-ltr-ltrdisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/reply-message-ltr-ltrdisplayname-linux.png similarity index 100% rename from playwright/snapshots/messages/messages.spec.ts/reply-message-ltr-ltrdisplayname-linux.png rename to apps/web/playwright/snapshots/messages/messages.spec.ts/reply-message-ltr-ltrdisplayname-linux.png diff --git a/playwright/snapshots/messages/messages.spec.ts/reply-message-ltr-rtldisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/reply-message-ltr-rtldisplayname-linux.png similarity index 100% rename from playwright/snapshots/messages/messages.spec.ts/reply-message-ltr-rtldisplayname-linux.png rename to apps/web/playwright/snapshots/messages/messages.spec.ts/reply-message-ltr-rtldisplayname-linux.png diff --git a/playwright/snapshots/messages/messages.spec.ts/reply-message-trl-ltrdisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/reply-message-trl-ltrdisplayname-linux.png similarity index 100% rename from playwright/snapshots/messages/messages.spec.ts/reply-message-trl-ltrdisplayname-linux.png rename to apps/web/playwright/snapshots/messages/messages.spec.ts/reply-message-trl-ltrdisplayname-linux.png diff --git a/playwright/snapshots/messages/messages.spec.ts/reply-message-trl-rtldisplayname-linux.png b/apps/web/playwright/snapshots/messages/messages.spec.ts/reply-message-trl-rtldisplayname-linux.png similarity index 100% rename from playwright/snapshots/messages/messages.spec.ts/reply-message-trl-rtldisplayname-linux.png rename to apps/web/playwright/snapshots/messages/messages.spec.ts/reply-message-trl-rtldisplayname-linux.png diff --git a/playwright/snapshots/mobile-guide/mobile-guide.spec.ts/mobile-guide-element-classic-linux.png b/apps/web/playwright/snapshots/mobile-guide/mobile-guide.spec.ts/mobile-guide-element-classic-linux.png similarity index 100% rename from playwright/snapshots/mobile-guide/mobile-guide.spec.ts/mobile-guide-element-classic-linux.png rename to apps/web/playwright/snapshots/mobile-guide/mobile-guide.spec.ts/mobile-guide-element-classic-linux.png diff --git a/playwright/snapshots/mobile-guide/mobile-guide.spec.ts/mobile-guide-element-linux.png b/apps/web/playwright/snapshots/mobile-guide/mobile-guide.spec.ts/mobile-guide-element-linux.png similarity index 100% rename from playwright/snapshots/mobile-guide/mobile-guide.spec.ts/mobile-guide-element-linux.png rename to apps/web/playwright/snapshots/mobile-guide/mobile-guide.spec.ts/mobile-guide-element-linux.png diff --git a/playwright/snapshots/mobile-guide/mobile-guide.spec.ts/mobile-guide-element-pro-linux.png b/apps/web/playwright/snapshots/mobile-guide/mobile-guide.spec.ts/mobile-guide-element-pro-linux.png similarity index 100% rename from playwright/snapshots/mobile-guide/mobile-guide.spec.ts/mobile-guide-element-pro-linux.png rename to apps/web/playwright/snapshots/mobile-guide/mobile-guide.spec.ts/mobile-guide-element-pro-linux.png diff --git a/playwright/snapshots/modules/custom-component.spec.ts/custom-component-crash-handle-filter-linux.png b/apps/web/playwright/snapshots/modules/custom-component.spec.ts/custom-component-crash-handle-filter-linux.png similarity index 100% rename from playwright/snapshots/modules/custom-component.spec.ts/custom-component-crash-handle-filter-linux.png rename to apps/web/playwright/snapshots/modules/custom-component.spec.ts/custom-component-crash-handle-filter-linux.png diff --git a/playwright/snapshots/modules/custom-component.spec.ts/custom-component-crash-handle-renderer-linux.png b/apps/web/playwright/snapshots/modules/custom-component.spec.ts/custom-component-crash-handle-renderer-linux.png similarity index 100% rename from playwright/snapshots/modules/custom-component.spec.ts/custom-component-crash-handle-renderer-linux.png rename to apps/web/playwright/snapshots/modules/custom-component.spec.ts/custom-component-crash-handle-renderer-linux.png diff --git a/playwright/snapshots/modules/custom-component.spec.ts/custom-component-tile-fall-through-linux.png b/apps/web/playwright/snapshots/modules/custom-component.spec.ts/custom-component-tile-fall-through-linux.png similarity index 100% rename from playwright/snapshots/modules/custom-component.spec.ts/custom-component-tile-fall-through-linux.png rename to apps/web/playwright/snapshots/modules/custom-component.spec.ts/custom-component-tile-fall-through-linux.png diff --git a/playwright/snapshots/modules/custom-component.spec.ts/custom-component-tile-linux.png b/apps/web/playwright/snapshots/modules/custom-component.spec.ts/custom-component-tile-linux.png similarity index 100% rename from playwright/snapshots/modules/custom-component.spec.ts/custom-component-tile-linux.png rename to apps/web/playwright/snapshots/modules/custom-component.spec.ts/custom-component-tile-linux.png diff --git a/playwright/snapshots/modules/custom-component.spec.ts/custom-component-tile-original-linux.png b/apps/web/playwright/snapshots/modules/custom-component.spec.ts/custom-component-tile-original-linux.png similarity index 100% rename from playwright/snapshots/modules/custom-component.spec.ts/custom-component-tile-original-linux.png rename to apps/web/playwright/snapshots/modules/custom-component.spec.ts/custom-component-tile-original-linux.png diff --git a/playwright/snapshots/oidc/oidc-native.spec.ts/token-expired-linux.png b/apps/web/playwright/snapshots/oidc/oidc-native.spec.ts/token-expired-linux.png similarity index 100% rename from playwright/snapshots/oidc/oidc-native.spec.ts/token-expired-linux.png rename to apps/web/playwright/snapshots/oidc/oidc-native.spec.ts/token-expired-linux.png diff --git a/playwright/snapshots/permalinks/permalinks.spec.ts/permalink-rendering-linux.png b/apps/web/playwright/snapshots/permalinks/permalinks.spec.ts/permalink-rendering-linux.png similarity index 100% rename from playwright/snapshots/permalinks/permalinks.spec.ts/permalink-rendering-linux.png rename to apps/web/playwright/snapshots/permalinks/permalinks.spec.ts/permalink-rendering-linux.png diff --git a/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-Msg1-linux.png b/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-Msg1-linux.png similarity index 100% rename from playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-Msg1-linux.png rename to apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-Msg1-linux.png diff --git a/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-1-Msg1-linux.png b/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-1-Msg1-linux.png similarity index 100% rename from playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-1-Msg1-linux.png rename to apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-1-Msg1-linux.png diff --git a/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-2-Msg1-linux.png b/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-2-Msg1-linux.png similarity index 100% rename from playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-2-Msg1-linux.png rename to apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-2-Msg1-linux.png diff --git a/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-2-Msg2-linux.png b/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-2-Msg2-linux.png similarity index 100% rename from playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-2-Msg2-linux.png rename to apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-2-Msg2-linux.png diff --git a/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-4-Msg1-linux.png b/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-4-Msg1-linux.png similarity index 100% rename from playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-4-Msg1-linux.png rename to apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-4-Msg1-linux.png diff --git a/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-4-Msg2-linux.png b/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-4-Msg2-linux.png similarity index 100% rename from playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-4-Msg2-linux.png rename to apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-4-Msg2-linux.png diff --git a/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-4-Msg3-linux.png b/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-4-Msg3-linux.png similarity index 100% rename from playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-4-Msg3-linux.png rename to apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-4-Msg3-linux.png diff --git a/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-4-Msg4-linux.png b/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-4-Msg4-linux.png similarity index 100% rename from playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-4-Msg4-linux.png rename to apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-message-banner-4-Msg4-linux.png diff --git a/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-messages-list-empty-linux.png b/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-messages-list-empty-linux.png similarity index 100% rename from playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-messages-list-empty-linux.png rename to apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-messages-list-empty-linux.png diff --git a/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/unpin-all-dialog-linux.png b/apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/unpin-all-dialog-linux.png similarity index 100% rename from playwright/snapshots/pinned-messages/pinned-messages.spec.ts/unpin-all-dialog-linux.png rename to apps/web/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/unpin-all-dialog-linux.png diff --git a/playwright/snapshots/polls/polls.spec.ts/Polls-Timeline-tile-no-votes-linux.png b/apps/web/playwright/snapshots/polls/polls.spec.ts/Polls-Timeline-tile-no-votes-linux.png similarity index 100% rename from playwright/snapshots/polls/polls.spec.ts/Polls-Timeline-tile-no-votes-linux.png rename to apps/web/playwright/snapshots/polls/polls.spec.ts/Polls-Timeline-tile-no-votes-linux.png diff --git a/playwright/snapshots/polls/polls.spec.ts/ThreadView-with-a-poll-on-bubble-layout-linux.png b/apps/web/playwright/snapshots/polls/polls.spec.ts/ThreadView-with-a-poll-on-bubble-layout-linux.png similarity index 100% rename from playwright/snapshots/polls/polls.spec.ts/ThreadView-with-a-poll-on-bubble-layout-linux.png rename to apps/web/playwright/snapshots/polls/polls.spec.ts/ThreadView-with-a-poll-on-bubble-layout-linux.png diff --git a/playwright/snapshots/polls/polls.spec.ts/ThreadView-with-a-poll-on-group-layout-linux.png b/apps/web/playwright/snapshots/polls/polls.spec.ts/ThreadView-with-a-poll-on-group-layout-linux.png similarity index 100% rename from playwright/snapshots/polls/polls.spec.ts/ThreadView-with-a-poll-on-group-layout-linux.png rename to apps/web/playwright/snapshots/polls/polls.spec.ts/ThreadView-with-a-poll-on-group-layout-linux.png diff --git a/playwright/snapshots/register/email.spec.ts/registration-check-your-email-linux.png b/apps/web/playwright/snapshots/register/email.spec.ts/registration-check-your-email-linux.png similarity index 100% rename from playwright/snapshots/register/email.spec.ts/registration-check-your-email-linux.png rename to apps/web/playwright/snapshots/register/email.spec.ts/registration-check-your-email-linux.png diff --git a/apps/web/playwright/snapshots/register/register.spec.ts/email-prompt-linux.png b/apps/web/playwright/snapshots/register/register.spec.ts/email-prompt-linux.png new file mode 100644 index 0000000000..406cddffde Binary files /dev/null and b/apps/web/playwright/snapshots/register/register.spec.ts/email-prompt-linux.png differ diff --git a/apps/web/playwright/snapshots/register/register.spec.ts/registration-linux.png b/apps/web/playwright/snapshots/register/register.spec.ts/registration-linux.png new file mode 100644 index 0000000000..2babcd2343 Binary files /dev/null and b/apps/web/playwright/snapshots/register/register.spec.ts/registration-linux.png differ diff --git a/playwright/snapshots/register/register.spec.ts/server-picker-linux.png b/apps/web/playwright/snapshots/register/register.spec.ts/server-picker-linux.png similarity index 100% rename from playwright/snapshots/register/register.spec.ts/server-picker-linux.png rename to apps/web/playwright/snapshots/register/register.spec.ts/server-picker-linux.png diff --git a/playwright/snapshots/register/register.spec.ts/terms-prompt-linux.png b/apps/web/playwright/snapshots/register/register.spec.ts/terms-prompt-linux.png similarity index 100% rename from playwright/snapshots/register/register.spec.ts/terms-prompt-linux.png rename to apps/web/playwright/snapshots/register/register.spec.ts/terms-prompt-linux.png diff --git a/playwright/snapshots/right-panel/file-panel.spec.ts/empty-linux.png b/apps/web/playwright/snapshots/right-panel/file-panel.spec.ts/empty-linux.png similarity index 100% rename from playwright/snapshots/right-panel/file-panel.spec.ts/empty-linux.png rename to apps/web/playwright/snapshots/right-panel/file-panel.spec.ts/empty-linux.png diff --git a/playwright/snapshots/right-panel/file-panel.spec.ts/file-tiles-list-linux.png b/apps/web/playwright/snapshots/right-panel/file-panel.spec.ts/file-tiles-list-linux.png similarity index 100% rename from playwright/snapshots/right-panel/file-panel.spec.ts/file-tiles-list-linux.png rename to apps/web/playwright/snapshots/right-panel/file-panel.spec.ts/file-tiles-list-linux.png diff --git a/playwright/snapshots/right-panel/memberlist.spec.ts/with-four-members-linux.png b/apps/web/playwright/snapshots/right-panel/memberlist.spec.ts/with-four-members-linux.png similarity index 100% rename from playwright/snapshots/right-panel/memberlist.spec.ts/with-four-members-linux.png rename to apps/web/playwright/snapshots/right-panel/memberlist.spec.ts/with-four-members-linux.png diff --git a/playwright/snapshots/right-panel/notification-panel.spec.ts/empty-linux.png b/apps/web/playwright/snapshots/right-panel/notification-panel.spec.ts/empty-linux.png similarity index 100% rename from playwright/snapshots/right-panel/notification-panel.spec.ts/empty-linux.png rename to apps/web/playwright/snapshots/right-panel/notification-panel.spec.ts/empty-linux.png diff --git a/playwright/snapshots/right-panel/right-panel.spec.ts/room-report-dialog-linux.png b/apps/web/playwright/snapshots/right-panel/right-panel.spec.ts/room-report-dialog-linux.png similarity index 100% rename from playwright/snapshots/right-panel/right-panel.spec.ts/room-report-dialog-linux.png rename to apps/web/playwright/snapshots/right-panel/right-panel.spec.ts/room-report-dialog-linux.png diff --git a/playwright/snapshots/right-panel/right-panel.spec.ts/with-extensions-linux.png b/apps/web/playwright/snapshots/right-panel/right-panel.spec.ts/with-extensions-linux.png similarity index 100% rename from playwright/snapshots/right-panel/right-panel.spec.ts/with-extensions-linux.png rename to apps/web/playwright/snapshots/right-panel/right-panel.spec.ts/with-extensions-linux.png diff --git a/playwright/snapshots/right-panel/right-panel.spec.ts/with-leave-room-linux.png b/apps/web/playwright/snapshots/right-panel/right-panel.spec.ts/with-leave-room-linux.png similarity index 100% rename from playwright/snapshots/right-panel/right-panel.spec.ts/with-leave-room-linux.png rename to apps/web/playwright/snapshots/right-panel/right-panel.spec.ts/with-leave-room-linux.png diff --git a/playwright/snapshots/right-panel/right-panel.spec.ts/with-long-name-linux.png b/apps/web/playwright/snapshots/right-panel/right-panel.spec.ts/with-long-name-linux.png similarity index 100% rename from playwright/snapshots/right-panel/right-panel.spec.ts/with-long-name-linux.png rename to apps/web/playwright/snapshots/right-panel/right-panel.spec.ts/with-long-name-linux.png diff --git a/playwright/snapshots/right-panel/right-panel.spec.ts/with-name-and-address-linux.png b/apps/web/playwright/snapshots/right-panel/right-panel.spec.ts/with-name-and-address-linux.png similarity index 100% rename from playwright/snapshots/right-panel/right-panel.spec.ts/with-name-and-address-linux.png rename to apps/web/playwright/snapshots/right-panel/right-panel.spec.ts/with-name-and-address-linux.png diff --git a/playwright/snapshots/room-directory/room-directory.spec.ts/filtered-no-results-linux.png b/apps/web/playwright/snapshots/room-directory/room-directory.spec.ts/filtered-no-results-linux.png similarity index 100% rename from playwright/snapshots/room-directory/room-directory.spec.ts/filtered-no-results-linux.png rename to apps/web/playwright/snapshots/room-directory/room-directory.spec.ts/filtered-no-results-linux.png diff --git a/playwright/snapshots/room-directory/room-directory.spec.ts/filtered-one-result-linux.png b/apps/web/playwright/snapshots/room-directory/room-directory.spec.ts/filtered-one-result-linux.png similarity index 100% rename from playwright/snapshots/room-directory/room-directory.spec.ts/filtered-one-result-linux.png rename to apps/web/playwright/snapshots/room-directory/room-directory.spec.ts/filtered-one-result-linux.png diff --git a/playwright/snapshots/room/create-room.spec.ts/create-room-linux.png b/apps/web/playwright/snapshots/room/create-room.spec.ts/create-room-linux.png similarity index 100% rename from playwright/snapshots/room/create-room.spec.ts/create-room-linux.png rename to apps/web/playwright/snapshots/room/create-room.spec.ts/create-room-linux.png diff --git a/playwright/snapshots/room/create-room.spec.ts/create-room-no-public-linux.png b/apps/web/playwright/snapshots/room/create-room.spec.ts/create-room-no-public-linux.png similarity index 100% rename from playwright/snapshots/room/create-room.spec.ts/create-room-no-public-linux.png rename to apps/web/playwright/snapshots/room/create-room.spec.ts/create-room-no-public-linux.png diff --git a/playwright/snapshots/room/create-room.spec.ts/create-video-room-linux.png b/apps/web/playwright/snapshots/room/create-room.spec.ts/create-video-room-linux.png similarity index 100% rename from playwright/snapshots/room/create-room.spec.ts/create-video-room-linux.png rename to apps/web/playwright/snapshots/room/create-room.spec.ts/create-video-room-linux.png diff --git a/playwright/snapshots/room/invites.spec.ts/Invites-reject-dialog-linux.png b/apps/web/playwright/snapshots/room/invites.spec.ts/Invites-reject-dialog-linux.png similarity index 100% rename from playwright/snapshots/room/invites.spec.ts/Invites-reject-dialog-linux.png rename to apps/web/playwright/snapshots/room/invites.spec.ts/Invites-reject-dialog-linux.png diff --git a/playwright/snapshots/room/invites.spec.ts/Invites-room-view-linux.png b/apps/web/playwright/snapshots/room/invites.spec.ts/Invites-room-view-linux.png similarity index 100% rename from playwright/snapshots/room/invites.spec.ts/Invites-room-view-linux.png rename to apps/web/playwright/snapshots/room/invites.spec.ts/Invites-room-view-linux.png diff --git a/playwright/snapshots/room/room-header.spec.ts/room-header-linux.png b/apps/web/playwright/snapshots/room/room-header.spec.ts/room-header-linux.png similarity index 100% rename from playwright/snapshots/room/room-header.spec.ts/room-header-linux.png rename to apps/web/playwright/snapshots/room/room-header.spec.ts/room-header-linux.png diff --git a/playwright/snapshots/room/room-header.spec.ts/room-header-long-name-linux.png b/apps/web/playwright/snapshots/room/room-header.spec.ts/room-header-long-name-linux.png similarity index 100% rename from playwright/snapshots/room/room-header.spec.ts/room-header-long-name-linux.png rename to apps/web/playwright/snapshots/room/room-header.spec.ts/room-header-long-name-linux.png diff --git a/playwright/snapshots/room/room-header.spec.ts/room-header-video-room-linux.png b/apps/web/playwright/snapshots/room/room-header.spec.ts/room-header-video-room-linux.png similarity index 100% rename from playwright/snapshots/room/room-header.spec.ts/room-header-video-room-linux.png rename to apps/web/playwright/snapshots/room/room-header.spec.ts/room-header-video-room-linux.png diff --git a/playwright/snapshots/room/room-header.spec.ts/room-header-with-icon-linux.png b/apps/web/playwright/snapshots/room/room-header.spec.ts/room-header-with-icon-linux.png similarity index 100% rename from playwright/snapshots/room/room-header.spec.ts/room-header-with-icon-linux.png rename to apps/web/playwright/snapshots/room/room-header.spec.ts/room-header-with-icon-linux.png diff --git a/apps/web/playwright/snapshots/room/room-status-bar.spec.ts/connectivity-lost-linux.png b/apps/web/playwright/snapshots/room/room-status-bar.spec.ts/connectivity-lost-linux.png new file mode 100644 index 0000000000..d07fc6d969 Binary files /dev/null and b/apps/web/playwright/snapshots/room/room-status-bar.spec.ts/connectivity-lost-linux.png differ diff --git a/apps/web/playwright/snapshots/room/room-status-bar.spec.ts/consent-linux.png b/apps/web/playwright/snapshots/room/room-status-bar.spec.ts/consent-linux.png new file mode 100644 index 0000000000..f0ef19d724 Binary files /dev/null and b/apps/web/playwright/snapshots/room/room-status-bar.spec.ts/consent-linux.png differ diff --git a/apps/web/playwright/snapshots/room/room-status-bar.spec.ts/local-room-create-failed-linux.png b/apps/web/playwright/snapshots/room/room-status-bar.spec.ts/local-room-create-failed-linux.png new file mode 100644 index 0000000000..b1a20f0315 Binary files /dev/null and b/apps/web/playwright/snapshots/room/room-status-bar.spec.ts/local-room-create-failed-linux.png differ diff --git a/apps/web/playwright/snapshots/room/room-status-bar.spec.ts/message-failed-linux.png b/apps/web/playwright/snapshots/room/room-status-bar.spec.ts/message-failed-linux.png new file mode 100644 index 0000000000..df2ec6e3b2 Binary files /dev/null and b/apps/web/playwright/snapshots/room/room-status-bar.spec.ts/message-failed-linux.png differ diff --git a/playwright/snapshots/settings/account-user-settings-tab.spec.ts/account-linux.png b/apps/web/playwright/snapshots/settings/account-user-settings-tab.spec.ts/account-linux.png similarity index 100% rename from playwright/snapshots/settings/account-user-settings-tab.spec.ts/account-linux.png rename to apps/web/playwright/snapshots/settings/account-user-settings-tab.spec.ts/account-linux.png diff --git a/playwright/snapshots/settings/account-user-settings-tab.spec.ts/account-smallscreen-linux.png b/apps/web/playwright/snapshots/settings/account-user-settings-tab.spec.ts/account-smallscreen-linux.png similarity index 100% rename from playwright/snapshots/settings/account-user-settings-tab.spec.ts/account-smallscreen-linux.png rename to apps/web/playwright/snapshots/settings/account-user-settings-tab.spec.ts/account-smallscreen-linux.png diff --git a/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/appearance-tab-linux.png b/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/appearance-tab-linux.png new file mode 100644 index 0000000000..98de99bf98 Binary files /dev/null and b/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/appearance-tab-linux.png differ diff --git a/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/window-12px-linux.png b/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/window-12px-linux.png new file mode 100644 index 0000000000..0d652c9488 Binary files /dev/null and b/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/window-12px-linux.png differ diff --git a/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/window-after-switch-linux.png b/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/window-after-switch-linux.png new file mode 100644 index 0000000000..87c9c8c565 Binary files /dev/null and b/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/window-after-switch-linux.png differ diff --git a/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/window-before-switch-linux.png b/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/window-before-switch-linux.png new file mode 100644 index 0000000000..9f7dd4abd5 Binary files /dev/null and b/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/window-before-switch-linux.png differ diff --git a/playwright/snapshots/settings/appearance-user-settings-tab/message-layout-panel.spec.ts/message-layout-panel-bubble-linux.png b/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/message-layout-panel.spec.ts/message-layout-panel-bubble-linux.png similarity index 100% rename from playwright/snapshots/settings/appearance-user-settings-tab/message-layout-panel.spec.ts/message-layout-panel-bubble-linux.png rename to apps/web/playwright/snapshots/settings/appearance-user-settings-tab/message-layout-panel.spec.ts/message-layout-panel-bubble-linux.png diff --git a/playwright/snapshots/settings/appearance-user-settings-tab/message-layout-panel.spec.ts/message-layout-panel-modern-linux.png b/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/message-layout-panel.spec.ts/message-layout-panel-modern-linux.png similarity index 100% rename from playwright/snapshots/settings/appearance-user-settings-tab/message-layout-panel.spec.ts/message-layout-panel-modern-linux.png rename to apps/web/playwright/snapshots/settings/appearance-user-settings-tab/message-layout-panel.spec.ts/message-layout-panel-modern-linux.png diff --git a/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/theme-panel-custom-theme-added-linux.png b/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/theme-panel-custom-theme-added-linux.png similarity index 100% rename from playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/theme-panel-custom-theme-added-linux.png rename to apps/web/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/theme-panel-custom-theme-added-linux.png diff --git a/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/theme-panel-custom-theme-linux.png b/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/theme-panel-custom-theme-linux.png similarity index 100% rename from playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/theme-panel-custom-theme-linux.png rename to apps/web/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/theme-panel-custom-theme-linux.png diff --git a/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/theme-panel-custom-theme-removed-linux.png b/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/theme-panel-custom-theme-removed-linux.png similarity index 100% rename from playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/theme-panel-custom-theme-removed-linux.png rename to apps/web/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/theme-panel-custom-theme-removed-linux.png diff --git a/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/theme-panel-dark-linux.png b/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/theme-panel-dark-linux.png similarity index 100% rename from playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/theme-panel-dark-linux.png rename to apps/web/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/theme-panel-dark-linux.png diff --git a/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/theme-panel-light-linux.png b/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/theme-panel-light-linux.png similarity index 100% rename from playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/theme-panel-light-linux.png rename to apps/web/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/theme-panel-light-linux.png diff --git a/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/theme-panel-match-system-enabled-linux.png b/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/theme-panel-match-system-enabled-linux.png similarity index 100% rename from playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/theme-panel-match-system-enabled-linux.png rename to apps/web/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/theme-panel-match-system-enabled-linux.png diff --git a/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/window-custom-theme-linux.png b/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/window-custom-theme-linux.png new file mode 100644 index 0000000000..37080fce40 Binary files /dev/null and b/apps/web/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/window-custom-theme-linux.png differ diff --git a/playwright/snapshots/settings/encryption-user-tab/advanced.spec.ts/encryption-details-linux.png b/apps/web/playwright/snapshots/settings/encryption-user-tab/advanced.spec.ts/encryption-details-linux.png similarity index 100% rename from playwright/snapshots/settings/encryption-user-tab/advanced.spec.ts/encryption-details-linux.png rename to apps/web/playwright/snapshots/settings/encryption-user-tab/advanced.spec.ts/encryption-details-linux.png diff --git a/playwright/snapshots/settings/encryption-user-tab/advanced.spec.ts/reset-cryptographic-identity-linux.png b/apps/web/playwright/snapshots/settings/encryption-user-tab/advanced.spec.ts/reset-cryptographic-identity-linux.png similarity index 100% rename from playwright/snapshots/settings/encryption-user-tab/advanced.spec.ts/reset-cryptographic-identity-linux.png rename to apps/web/playwright/snapshots/settings/encryption-user-tab/advanced.spec.ts/reset-cryptographic-identity-linux.png diff --git a/playwright/snapshots/settings/encryption-user-tab/encryption-tab.spec.ts/default-tab-linux.png b/apps/web/playwright/snapshots/settings/encryption-user-tab/encryption-tab.spec.ts/default-tab-linux.png similarity index 100% rename from playwright/snapshots/settings/encryption-user-tab/encryption-tab.spec.ts/default-tab-linux.png rename to apps/web/playwright/snapshots/settings/encryption-user-tab/encryption-tab.spec.ts/default-tab-linux.png diff --git a/playwright/snapshots/settings/encryption-user-tab/encryption-tab.spec.ts/delete-key-storage-confirm-linux.png b/apps/web/playwright/snapshots/settings/encryption-user-tab/encryption-tab.spec.ts/delete-key-storage-confirm-linux.png similarity index 100% rename from playwright/snapshots/settings/encryption-user-tab/encryption-tab.spec.ts/delete-key-storage-confirm-linux.png rename to apps/web/playwright/snapshots/settings/encryption-user-tab/encryption-tab.spec.ts/delete-key-storage-confirm-linux.png diff --git a/playwright/snapshots/settings/encryption-user-tab/encryption-tab.spec.ts/out-of-sync-recovery-linux.png b/apps/web/playwright/snapshots/settings/encryption-user-tab/encryption-tab.spec.ts/out-of-sync-recovery-linux.png similarity index 100% rename from playwright/snapshots/settings/encryption-user-tab/encryption-tab.spec.ts/out-of-sync-recovery-linux.png rename to apps/web/playwright/snapshots/settings/encryption-user-tab/encryption-tab.spec.ts/out-of-sync-recovery-linux.png diff --git a/playwright/snapshots/settings/encryption-user-tab/encryption-tab.spec.ts/verify-device-encryption-tab-linux.png b/apps/web/playwright/snapshots/settings/encryption-user-tab/encryption-tab.spec.ts/verify-device-encryption-tab-linux.png similarity index 100% rename from playwright/snapshots/settings/encryption-user-tab/encryption-tab.spec.ts/verify-device-encryption-tab-linux.png rename to apps/web/playwright/snapshots/settings/encryption-user-tab/encryption-tab.spec.ts/verify-device-encryption-tab-linux.png diff --git a/playwright/snapshots/settings/encryption-user-tab/recovery.spec.ts/change-key-1-encryption-tab-linux.png b/apps/web/playwright/snapshots/settings/encryption-user-tab/recovery.spec.ts/change-key-1-encryption-tab-linux.png similarity index 100% rename from playwright/snapshots/settings/encryption-user-tab/recovery.spec.ts/change-key-1-encryption-tab-linux.png rename to apps/web/playwright/snapshots/settings/encryption-user-tab/recovery.spec.ts/change-key-1-encryption-tab-linux.png diff --git a/playwright/snapshots/settings/encryption-user-tab/recovery.spec.ts/change-key-2-encryption-tab-linux.png b/apps/web/playwright/snapshots/settings/encryption-user-tab/recovery.spec.ts/change-key-2-encryption-tab-linux.png similarity index 100% rename from playwright/snapshots/settings/encryption-user-tab/recovery.spec.ts/change-key-2-encryption-tab-linux.png rename to apps/web/playwright/snapshots/settings/encryption-user-tab/recovery.spec.ts/change-key-2-encryption-tab-linux.png diff --git a/playwright/snapshots/settings/encryption-user-tab/recovery.spec.ts/default-recovery-linux.png b/apps/web/playwright/snapshots/settings/encryption-user-tab/recovery.spec.ts/default-recovery-linux.png similarity index 100% rename from playwright/snapshots/settings/encryption-user-tab/recovery.spec.ts/default-recovery-linux.png rename to apps/web/playwright/snapshots/settings/encryption-user-tab/recovery.spec.ts/default-recovery-linux.png diff --git a/playwright/snapshots/settings/encryption-user-tab/recovery.spec.ts/set-up-key-1-encryption-tab-linux.png b/apps/web/playwright/snapshots/settings/encryption-user-tab/recovery.spec.ts/set-up-key-1-encryption-tab-linux.png similarity index 100% rename from playwright/snapshots/settings/encryption-user-tab/recovery.spec.ts/set-up-key-1-encryption-tab-linux.png rename to apps/web/playwright/snapshots/settings/encryption-user-tab/recovery.spec.ts/set-up-key-1-encryption-tab-linux.png diff --git a/playwright/snapshots/settings/encryption-user-tab/recovery.spec.ts/set-up-key-2-encryption-tab-linux.png b/apps/web/playwright/snapshots/settings/encryption-user-tab/recovery.spec.ts/set-up-key-2-encryption-tab-linux.png similarity index 100% rename from playwright/snapshots/settings/encryption-user-tab/recovery.spec.ts/set-up-key-2-encryption-tab-linux.png rename to apps/web/playwright/snapshots/settings/encryption-user-tab/recovery.spec.ts/set-up-key-2-encryption-tab-linux.png diff --git a/playwright/snapshots/settings/encryption-user-tab/recovery.spec.ts/set-up-key-3-encryption-tab-linux.png b/apps/web/playwright/snapshots/settings/encryption-user-tab/recovery.spec.ts/set-up-key-3-encryption-tab-linux.png similarity index 100% rename from playwright/snapshots/settings/encryption-user-tab/recovery.spec.ts/set-up-key-3-encryption-tab-linux.png rename to apps/web/playwright/snapshots/settings/encryption-user-tab/recovery.spec.ts/set-up-key-3-encryption-tab-linux.png diff --git a/playwright/snapshots/settings/encryption-user-tab/recovery.spec.ts/set-up-recovery-linux.png b/apps/web/playwright/snapshots/settings/encryption-user-tab/recovery.spec.ts/set-up-recovery-linux.png similarity index 100% rename from playwright/snapshots/settings/encryption-user-tab/recovery.spec.ts/set-up-recovery-linux.png rename to apps/web/playwright/snapshots/settings/encryption-user-tab/recovery.spec.ts/set-up-recovery-linux.png diff --git a/playwright/snapshots/settings/general-room-settings-tab.spec.ts/General-room-settings-tab-should-be-rendered-properly-1-linux.png b/apps/web/playwright/snapshots/settings/general-room-settings-tab.spec.ts/General-room-settings-tab-should-be-rendered-properly-1-linux.png similarity index 100% rename from playwright/snapshots/settings/general-room-settings-tab.spec.ts/General-room-settings-tab-should-be-rendered-properly-1-linux.png rename to apps/web/playwright/snapshots/settings/general-room-settings-tab.spec.ts/General-room-settings-tab-should-be-rendered-properly-1-linux.png diff --git a/playwright/snapshots/settings/notifications/notifications-settings-2-tab.spec.ts/standard-notifications-2-settings-linux.png b/apps/web/playwright/snapshots/settings/notifications/notifications-settings-2-tab.spec.ts/standard-notifications-2-settings-linux.png similarity index 100% rename from playwright/snapshots/settings/notifications/notifications-settings-2-tab.spec.ts/standard-notifications-2-settings-linux.png rename to apps/web/playwright/snapshots/settings/notifications/notifications-settings-2-tab.spec.ts/standard-notifications-2-settings-linux.png diff --git a/playwright/snapshots/settings/notifications/notifications-settings-tab.spec.ts/standard-notification-settings-linux.png b/apps/web/playwright/snapshots/settings/notifications/notifications-settings-tab.spec.ts/standard-notification-settings-linux.png similarity index 100% rename from playwright/snapshots/settings/notifications/notifications-settings-tab.spec.ts/standard-notification-settings-linux.png rename to apps/web/playwright/snapshots/settings/notifications/notifications-settings-tab.spec.ts/standard-notification-settings-linux.png diff --git a/apps/web/playwright/snapshots/settings/preferences-user-settings-tab.spec.ts/Preferences-user-settings-tab-should-be-rendered-properly-1-linux.png b/apps/web/playwright/snapshots/settings/preferences-user-settings-tab.spec.ts/Preferences-user-settings-tab-should-be-rendered-properly-1-linux.png new file mode 100644 index 0000000000..0536ce4fe9 Binary files /dev/null and b/apps/web/playwright/snapshots/settings/preferences-user-settings-tab.spec.ts/Preferences-user-settings-tab-should-be-rendered-properly-1-linux.png differ diff --git a/playwright/snapshots/settings/quick-settings-menu.spec.ts/quick-settings-linux.png b/apps/web/playwright/snapshots/settings/quick-settings-menu.spec.ts/quick-settings-linux.png similarity index 100% rename from playwright/snapshots/settings/quick-settings-menu.spec.ts/quick-settings-linux.png rename to apps/web/playwright/snapshots/settings/quick-settings-menu.spec.ts/quick-settings-linux.png diff --git a/playwright/snapshots/settings/room-settings/room-security-tab.spec.ts/room-security-settings-linux.png b/apps/web/playwright/snapshots/settings/room-settings/room-security-tab.spec.ts/room-security-settings-linux.png similarity index 100% rename from playwright/snapshots/settings/room-settings/room-security-tab.spec.ts/room-security-settings-linux.png rename to apps/web/playwright/snapshots/settings/room-settings/room-security-tab.spec.ts/room-security-settings-linux.png diff --git a/playwright/snapshots/settings/room-settings/room-security-tab.spec.ts/room-security-settings-world-readable-linux.png b/apps/web/playwright/snapshots/settings/room-settings/room-security-tab.spec.ts/room-security-settings-world-readable-linux.png similarity index 100% rename from playwright/snapshots/settings/room-settings/room-security-tab.spec.ts/room-security-settings-world-readable-linux.png rename to apps/web/playwright/snapshots/settings/room-settings/room-security-tab.spec.ts/room-security-settings-world-readable-linux.png diff --git a/playwright/snapshots/settings/room-settings/room-video-tab.spec.ts/room-video-settings-linux.png b/apps/web/playwright/snapshots/settings/room-settings/room-video-tab.spec.ts/room-video-settings-linux.png similarity index 100% rename from playwright/snapshots/settings/room-settings/room-video-tab.spec.ts/room-video-settings-linux.png rename to apps/web/playwright/snapshots/settings/room-settings/room-video-tab.spec.ts/room-video-settings-linux.png diff --git a/playwright/snapshots/settings/security-user-settings-tab.spec.ts/Security-user-settings-tab-with-posthog-enable-b5d89-csLearnMoreDialog-should-be-rendered-properly-1-linux.png b/apps/web/playwright/snapshots/settings/security-user-settings-tab.spec.ts/Security-user-settings-tab-with-posthog-enable-b5d89-csLearnMoreDialog-should-be-rendered-properly-1-linux.png similarity index 100% rename from playwright/snapshots/settings/security-user-settings-tab.spec.ts/Security-user-settings-tab-with-posthog-enable-b5d89-csLearnMoreDialog-should-be-rendered-properly-1-linux.png rename to apps/web/playwright/snapshots/settings/security-user-settings-tab.spec.ts/Security-user-settings-tab-with-posthog-enable-b5d89-csLearnMoreDialog-should-be-rendered-properly-1-linux.png diff --git a/playwright/snapshots/settings/security-user-settings-tab.spec.ts/security-settings-tab-linux.png b/apps/web/playwright/snapshots/settings/security-user-settings-tab.spec.ts/security-settings-tab-linux.png similarity index 100% rename from playwright/snapshots/settings/security-user-settings-tab.spec.ts/security-settings-tab-linux.png rename to apps/web/playwright/snapshots/settings/security-user-settings-tab.spec.ts/security-settings-tab-linux.png diff --git a/playwright/snapshots/share-dialog/share-dialog.spec.ts/share-dialog-event-linux.png b/apps/web/playwright/snapshots/share-dialog/share-dialog.spec.ts/share-dialog-event-linux.png similarity index 100% rename from playwright/snapshots/share-dialog/share-dialog.spec.ts/share-dialog-event-linux.png rename to apps/web/playwright/snapshots/share-dialog/share-dialog.spec.ts/share-dialog-event-linux.png diff --git a/playwright/snapshots/share-dialog/share-dialog.spec.ts/share-dialog-room-linux.png b/apps/web/playwright/snapshots/share-dialog/share-dialog.spec.ts/share-dialog-room-linux.png similarity index 100% rename from playwright/snapshots/share-dialog/share-dialog.spec.ts/share-dialog-room-linux.png rename to apps/web/playwright/snapshots/share-dialog/share-dialog.spec.ts/share-dialog-room-linux.png diff --git a/playwright/snapshots/share-dialog/share-dialog.spec.ts/share-dialog-user-linux.png b/apps/web/playwright/snapshots/share-dialog/share-dialog.spec.ts/share-dialog-user-linux.png similarity index 100% rename from playwright/snapshots/share-dialog/share-dialog.spec.ts/share-dialog-user-linux.png rename to apps/web/playwright/snapshots/share-dialog/share-dialog.spec.ts/share-dialog-user-linux.png diff --git a/playwright/snapshots/spaces/spaces.spec.ts/add-existing-rooms-dialog-linux.png b/apps/web/playwright/snapshots/spaces/spaces.spec.ts/add-existing-rooms-dialog-linux.png similarity index 100% rename from playwright/snapshots/spaces/spaces.spec.ts/add-existing-rooms-dialog-linux.png rename to apps/web/playwright/snapshots/spaces/spaces.spec.ts/add-existing-rooms-dialog-linux.png diff --git a/playwright/snapshots/spaces/spaces.spec.ts/invite-teammates-dialog-linux.png b/apps/web/playwright/snapshots/spaces/spaces.spec.ts/invite-teammates-dialog-linux.png similarity index 100% rename from playwright/snapshots/spaces/spaces.spec.ts/invite-teammates-dialog-linux.png rename to apps/web/playwright/snapshots/spaces/spaces.spec.ts/invite-teammates-dialog-linux.png diff --git a/playwright/snapshots/spaces/spaces.spec.ts/space-create-menu-linux.png b/apps/web/playwright/snapshots/spaces/spaces.spec.ts/space-create-menu-linux.png similarity index 100% rename from playwright/snapshots/spaces/spaces.spec.ts/space-create-menu-linux.png rename to apps/web/playwright/snapshots/spaces/spaces.spec.ts/space-create-menu-linux.png diff --git a/playwright/snapshots/spaces/spaces.spec.ts/space-panel-collapsed-linux.png b/apps/web/playwright/snapshots/spaces/spaces.spec.ts/space-panel-collapsed-linux.png similarity index 100% rename from playwright/snapshots/spaces/spaces.spec.ts/space-panel-collapsed-linux.png rename to apps/web/playwright/snapshots/spaces/spaces.spec.ts/space-panel-collapsed-linux.png diff --git a/playwright/snapshots/spaces/spaces.spec.ts/space-panel-expanded-linux.png b/apps/web/playwright/snapshots/spaces/spaces.spec.ts/space-panel-expanded-linux.png similarity index 100% rename from playwright/snapshots/spaces/spaces.spec.ts/space-panel-expanded-linux.png rename to apps/web/playwright/snapshots/spaces/spaces.spec.ts/space-panel-expanded-linux.png diff --git a/playwright/snapshots/spaces/spaces.spec.ts/space-room-view-linux.png b/apps/web/playwright/snapshots/spaces/spaces.spec.ts/space-room-view-linux.png similarity index 100% rename from playwright/snapshots/spaces/spaces.spec.ts/space-room-view-linux.png rename to apps/web/playwright/snapshots/spaces/spaces.spec.ts/space-room-view-linux.png diff --git a/playwright/snapshots/spaces/spaces.spec.ts/space-visibility-settings-linux.png b/apps/web/playwright/snapshots/spaces/spaces.spec.ts/space-visibility-settings-linux.png similarity index 100% rename from playwright/snapshots/spaces/spaces.spec.ts/space-visibility-settings-linux.png rename to apps/web/playwright/snapshots/spaces/spaces.spec.ts/space-visibility-settings-linux.png diff --git a/playwright/snapshots/spaces/threads-activity-centre/threadsActivityCentre.spec.ts/tac-button-expanded-linux.png b/apps/web/playwright/snapshots/spaces/threads-activity-centre/threadsActivityCentre.spec.ts/tac-button-expanded-linux.png similarity index 100% rename from playwright/snapshots/spaces/threads-activity-centre/threadsActivityCentre.spec.ts/tac-button-expanded-linux.png rename to apps/web/playwright/snapshots/spaces/threads-activity-centre/threadsActivityCentre.spec.ts/tac-button-expanded-linux.png diff --git a/playwright/snapshots/spaces/threads-activity-centre/threadsActivityCentre.spec.ts/tac-hovered-expanded-linux.png b/apps/web/playwright/snapshots/spaces/threads-activity-centre/threadsActivityCentre.spec.ts/tac-hovered-expanded-linux.png similarity index 100% rename from playwright/snapshots/spaces/threads-activity-centre/threadsActivityCentre.spec.ts/tac-hovered-expanded-linux.png rename to apps/web/playwright/snapshots/spaces/threads-activity-centre/threadsActivityCentre.spec.ts/tac-hovered-expanded-linux.png diff --git a/playwright/snapshots/spaces/threads-activity-centre/threadsActivityCentre.spec.ts/tac-hovered-linux.png b/apps/web/playwright/snapshots/spaces/threads-activity-centre/threadsActivityCentre.spec.ts/tac-hovered-linux.png similarity index 100% rename from playwright/snapshots/spaces/threads-activity-centre/threadsActivityCentre.spec.ts/tac-hovered-linux.png rename to apps/web/playwright/snapshots/spaces/threads-activity-centre/threadsActivityCentre.spec.ts/tac-hovered-linux.png diff --git a/playwright/snapshots/spaces/threads-activity-centre/threadsActivityCentre.spec.ts/tac-no-indicator-linux.png b/apps/web/playwright/snapshots/spaces/threads-activity-centre/threadsActivityCentre.spec.ts/tac-no-indicator-linux.png similarity index 100% rename from playwright/snapshots/spaces/threads-activity-centre/threadsActivityCentre.spec.ts/tac-no-indicator-linux.png rename to apps/web/playwright/snapshots/spaces/threads-activity-centre/threadsActivityCentre.spec.ts/tac-no-indicator-linux.png diff --git a/playwright/snapshots/spaces/threads-activity-centre/threadsActivityCentre.spec.ts/tac-panel-mix-unread-linux.png b/apps/web/playwright/snapshots/spaces/threads-activity-centre/threadsActivityCentre.spec.ts/tac-panel-mix-unread-linux.png similarity index 100% rename from playwright/snapshots/spaces/threads-activity-centre/threadsActivityCentre.spec.ts/tac-panel-mix-unread-linux.png rename to apps/web/playwright/snapshots/spaces/threads-activity-centre/threadsActivityCentre.spec.ts/tac-panel-mix-unread-linux.png diff --git a/playwright/snapshots/spaces/threads-activity-centre/threadsActivityCentre.spec.ts/tac-panel-notification-unread-linux.png b/apps/web/playwright/snapshots/spaces/threads-activity-centre/threadsActivityCentre.spec.ts/tac-panel-notification-unread-linux.png similarity index 100% rename from playwright/snapshots/spaces/threads-activity-centre/threadsActivityCentre.spec.ts/tac-panel-notification-unread-linux.png rename to apps/web/playwright/snapshots/spaces/threads-activity-centre/threadsActivityCentre.spec.ts/tac-panel-notification-unread-linux.png diff --git a/playwright/snapshots/threads/threads.spec.ts/Initial-ThreadView-on-bubble-layout-linux.png b/apps/web/playwright/snapshots/threads/threads.spec.ts/Initial-ThreadView-on-bubble-layout-linux.png similarity index 100% rename from playwright/snapshots/threads/threads.spec.ts/Initial-ThreadView-on-bubble-layout-linux.png rename to apps/web/playwright/snapshots/threads/threads.spec.ts/Initial-ThreadView-on-bubble-layout-linux.png diff --git a/playwright/snapshots/threads/threads.spec.ts/Initial-ThreadView-on-group-layout-linux.png b/apps/web/playwright/snapshots/threads/threads.spec.ts/Initial-ThreadView-on-group-layout-linux.png similarity index 100% rename from playwright/snapshots/threads/threads.spec.ts/Initial-ThreadView-on-group-layout-linux.png rename to apps/web/playwright/snapshots/threads/threads.spec.ts/Initial-ThreadView-on-group-layout-linux.png diff --git a/playwright/snapshots/threads/threads.spec.ts/Reply-to-the-location-on-ThreadView-linux.png b/apps/web/playwright/snapshots/threads/threads.spec.ts/Reply-to-the-location-on-ThreadView-linux.png similarity index 100% rename from playwright/snapshots/threads/threads.spec.ts/Reply-to-the-location-on-ThreadView-linux.png rename to apps/web/playwright/snapshots/threads/threads.spec.ts/Reply-to-the-location-on-ThreadView-linux.png diff --git a/playwright/snapshots/threads/threads.spec.ts/ThreadView-with-reaction-and-a-hidden-event-on-bubble-layout-linux.png b/apps/web/playwright/snapshots/threads/threads.spec.ts/ThreadView-with-reaction-and-a-hidden-event-on-bubble-layout-linux.png similarity index 100% rename from playwright/snapshots/threads/threads.spec.ts/ThreadView-with-reaction-and-a-hidden-event-on-bubble-layout-linux.png rename to apps/web/playwright/snapshots/threads/threads.spec.ts/ThreadView-with-reaction-and-a-hidden-event-on-bubble-layout-linux.png diff --git a/playwright/snapshots/threads/threads.spec.ts/ThreadView-with-reaction-and-a-hidden-event-on-group-layout-linux.png b/apps/web/playwright/snapshots/threads/threads.spec.ts/ThreadView-with-reaction-and-a-hidden-event-on-group-layout-linux.png similarity index 100% rename from playwright/snapshots/threads/threads.spec.ts/ThreadView-with-reaction-and-a-hidden-event-on-group-layout-linux.png rename to apps/web/playwright/snapshots/threads/threads.spec.ts/ThreadView-with-reaction-and-a-hidden-event-on-group-layout-linux.png diff --git a/playwright/snapshots/threads/threads.spec.ts/ThreadView-with-redacted-messages-on-bubble-layout-linux.png b/apps/web/playwright/snapshots/threads/threads.spec.ts/ThreadView-with-redacted-messages-on-bubble-layout-linux.png similarity index 100% rename from playwright/snapshots/threads/threads.spec.ts/ThreadView-with-redacted-messages-on-bubble-layout-linux.png rename to apps/web/playwright/snapshots/threads/threads.spec.ts/ThreadView-with-redacted-messages-on-bubble-layout-linux.png diff --git a/playwright/snapshots/threads/threads.spec.ts/ThreadView-with-redacted-messages-on-group-layout-linux.png b/apps/web/playwright/snapshots/threads/threads.spec.ts/ThreadView-with-redacted-messages-on-group-layout-linux.png similarity index 100% rename from playwright/snapshots/threads/threads.spec.ts/ThreadView-with-redacted-messages-on-group-layout-linux.png rename to apps/web/playwright/snapshots/threads/threads.spec.ts/ThreadView-with-redacted-messages-on-group-layout-linux.png diff --git a/playwright/snapshots/threads/threads.spec.ts/thread-panel-linux.png b/apps/web/playwright/snapshots/threads/threads.spec.ts/thread-panel-linux.png similarity index 100% rename from playwright/snapshots/threads/threads.spec.ts/thread-panel-linux.png rename to apps/web/playwright/snapshots/threads/threads.spec.ts/thread-panel-linux.png diff --git a/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-no-avatar-linux.png b/apps/web/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-no-avatar-linux.png similarity index 100% rename from playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-no-avatar-linux.png rename to apps/web/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-no-avatar-linux.png diff --git a/apps/web/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-room-tree-no-avatar-linux.png b/apps/web/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-room-tree-no-avatar-linux.png new file mode 100644 index 0000000000..3210a498af Binary files /dev/null and b/apps/web/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-room-tree-no-avatar-linux.png differ diff --git a/apps/web/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-room-tree-with-avatar-linux.png b/apps/web/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-room-tree-with-avatar-linux.png new file mode 100644 index 0000000000..6e0a26cc6b Binary files /dev/null and b/apps/web/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-room-tree-with-avatar-linux.png differ diff --git a/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-with-avatar-linux.png b/apps/web/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-with-avatar-linux.png similarity index 100% rename from playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-with-avatar-linux.png rename to apps/web/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-with-avatar-linux.png diff --git a/playwright/snapshots/timeline/timeline.spec.ts/code-block-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/code-block-linux.png similarity index 100% rename from playwright/snapshots/timeline/timeline.spec.ts/code-block-linux.png rename to apps/web/playwright/snapshots/timeline/timeline.spec.ts/code-block-linux.png diff --git a/playwright/snapshots/timeline/timeline.spec.ts/collapsed-gels-and-messages-irc-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/collapsed-gels-and-messages-irc-layout-linux.png similarity index 100% rename from playwright/snapshots/timeline/timeline.spec.ts/collapsed-gels-and-messages-irc-layout-linux.png rename to apps/web/playwright/snapshots/timeline/timeline.spec.ts/collapsed-gels-and-messages-irc-layout-linux.png diff --git a/playwright/snapshots/timeline/timeline.spec.ts/collapsed-gels-bubble-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/collapsed-gels-bubble-layout-linux.png similarity index 100% rename from playwright/snapshots/timeline/timeline.spec.ts/collapsed-gels-bubble-layout-linux.png rename to apps/web/playwright/snapshots/timeline/timeline.spec.ts/collapsed-gels-bubble-layout-linux.png diff --git a/playwright/snapshots/timeline/timeline.spec.ts/configured-room-irc-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/configured-room-irc-layout-linux.png similarity index 100% rename from playwright/snapshots/timeline/timeline.spec.ts/configured-room-irc-layout-linux.png rename to apps/web/playwright/snapshots/timeline/timeline.spec.ts/configured-room-irc-layout-linux.png diff --git a/playwright/snapshots/timeline/timeline.spec.ts/edited-code-block-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/edited-code-block-linux.png similarity index 100% rename from playwright/snapshots/timeline/timeline.spec.ts/edited-code-block-linux.png rename to apps/web/playwright/snapshots/timeline/timeline.spec.ts/edited-code-block-linux.png diff --git a/playwright/snapshots/timeline/timeline.spec.ts/event-line-inline-start-margin-irc-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-line-inline-start-margin-irc-layout-linux.png similarity index 100% rename from playwright/snapshots/timeline/timeline.spec.ts/event-line-inline-start-margin-irc-layout-linux.png rename to apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-line-inline-start-margin-irc-layout-linux.png diff --git a/playwright/snapshots/timeline/timeline.spec.ts/event-tile-reply-chains-bubble-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tile-reply-chains-bubble-layout-linux.png similarity index 100% rename from playwright/snapshots/timeline/timeline.spec.ts/event-tile-reply-chains-bubble-layout-linux.png rename to apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tile-reply-chains-bubble-layout-linux.png diff --git a/playwright/snapshots/timeline/timeline.spec.ts/event-tile-reply-chains-compact-modern-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tile-reply-chains-compact-modern-layout-linux.png similarity index 100% rename from playwright/snapshots/timeline/timeline.spec.ts/event-tile-reply-chains-compact-modern-layout-linux.png rename to apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tile-reply-chains-compact-modern-layout-linux.png diff --git a/playwright/snapshots/timeline/timeline.spec.ts/event-tile-reply-chains-irc-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tile-reply-chains-irc-layout-linux.png similarity index 100% rename from playwright/snapshots/timeline/timeline.spec.ts/event-tile-reply-chains-irc-layout-linux.png rename to apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tile-reply-chains-irc-layout-linux.png diff --git a/playwright/snapshots/timeline/timeline.spec.ts/event-tile-reply-chains-irc-modern-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tile-reply-chains-irc-modern-linux.png similarity index 100% rename from playwright/snapshots/timeline/timeline.spec.ts/event-tile-reply-chains-irc-modern-linux.png rename to apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tile-reply-chains-irc-modern-linux.png diff --git a/playwright/snapshots/timeline/timeline.spec.ts/event-tiles-bubble-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tiles-bubble-layout-linux.png similarity index 100% rename from playwright/snapshots/timeline/timeline.spec.ts/event-tiles-bubble-layout-linux.png rename to apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tiles-bubble-layout-linux.png diff --git a/playwright/snapshots/timeline/timeline.spec.ts/event-tiles-compact-modern-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tiles-compact-modern-layout-linux.png similarity index 100% rename from playwright/snapshots/timeline/timeline.spec.ts/event-tiles-compact-modern-layout-linux.png rename to apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tiles-compact-modern-layout-linux.png diff --git a/playwright/snapshots/timeline/timeline.spec.ts/event-tiles-irc-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tiles-irc-layout-linux.png similarity index 100% rename from playwright/snapshots/timeline/timeline.spec.ts/event-tiles-irc-layout-linux.png rename to apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tiles-irc-layout-linux.png diff --git a/playwright/snapshots/timeline/timeline.spec.ts/event-tiles-modern-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tiles-modern-layout-linux.png similarity index 100% rename from playwright/snapshots/timeline/timeline.spec.ts/event-tiles-modern-layout-linux.png rename to apps/web/playwright/snapshots/timeline/timeline.spec.ts/event-tiles-modern-layout-linux.png diff --git a/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-and-messages-irc-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-and-messages-irc-layout-linux.png similarity index 100% rename from playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-and-messages-irc-layout-linux.png rename to apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-and-messages-irc-layout-linux.png diff --git a/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-bubble-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-bubble-layout-linux.png similarity index 100% rename from playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-bubble-layout-linux.png rename to apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-bubble-layout-linux.png diff --git a/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-emote-irc-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-emote-irc-layout-linux.png similarity index 100% rename from playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-emote-irc-layout-linux.png rename to apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-emote-irc-layout-linux.png diff --git a/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-irc-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-irc-layout-linux.png similarity index 100% rename from playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-irc-layout-linux.png rename to apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-irc-layout-linux.png diff --git a/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-modern-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-modern-layout-linux.png similarity index 100% rename from playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-modern-layout-linux.png rename to apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-modern-layout-linux.png diff --git a/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-redaction-placeholder-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-redaction-placeholder-linux.png similarity index 100% rename from playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-redaction-placeholder-linux.png rename to apps/web/playwright/snapshots/timeline/timeline.spec.ts/expanded-gels-redaction-placeholder-linux.png diff --git a/playwright/snapshots/timeline/timeline.spec.ts/hidden-event-line-padding-modern-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/hidden-event-line-padding-modern-layout-linux.png similarity index 100% rename from playwright/snapshots/timeline/timeline.spec.ts/hidden-event-line-padding-modern-layout-linux.png rename to apps/web/playwright/snapshots/timeline/timeline.spec.ts/hidden-event-line-padding-modern-layout-linux.png diff --git a/apps/web/playwright/snapshots/timeline/timeline.spec.ts/hidden-event-line-zero-padding-irc-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/hidden-event-line-zero-padding-irc-layout-linux.png new file mode 100644 index 0000000000..3c7eb3caf9 Binary files /dev/null and b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/hidden-event-line-zero-padding-irc-layout-linux.png differ diff --git a/playwright/snapshots/timeline/timeline.spec.ts/highlighted-search-results-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/highlighted-search-results-linux.png similarity index 100% rename from playwright/snapshots/timeline/timeline.spec.ts/highlighted-search-results-linux.png rename to apps/web/playwright/snapshots/timeline/timeline.spec.ts/highlighted-search-results-linux.png diff --git a/playwright/snapshots/timeline/timeline.spec.ts/hovered-hidden-event-line-irc-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/hovered-hidden-event-line-irc-layout-linux.png similarity index 100% rename from playwright/snapshots/timeline/timeline.spec.ts/hovered-hidden-event-line-irc-layout-linux.png rename to apps/web/playwright/snapshots/timeline/timeline.spec.ts/hovered-hidden-event-line-irc-layout-linux.png diff --git a/playwright/snapshots/timeline/timeline.spec.ts/image-in-timeline-default-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/image-in-timeline-default-layout-linux.png similarity index 100% rename from playwright/snapshots/timeline/timeline.spec.ts/image-in-timeline-default-layout-linux.png rename to apps/web/playwright/snapshots/timeline/timeline.spec.ts/image-in-timeline-default-layout-linux.png diff --git a/playwright/snapshots/timeline/timeline.spec.ts/long-strings-with-reply-bubble-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/long-strings-with-reply-bubble-layout-linux.png similarity index 100% rename from playwright/snapshots/timeline/timeline.spec.ts/long-strings-with-reply-bubble-layout-linux.png rename to apps/web/playwright/snapshots/timeline/timeline.spec.ts/long-strings-with-reply-bubble-layout-linux.png diff --git a/playwright/snapshots/timeline/timeline.spec.ts/long-strings-with-reply-irc-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/long-strings-with-reply-irc-layout-linux.png similarity index 100% rename from playwright/snapshots/timeline/timeline.spec.ts/long-strings-with-reply-irc-layout-linux.png rename to apps/web/playwright/snapshots/timeline/timeline.spec.ts/long-strings-with-reply-irc-layout-linux.png diff --git a/playwright/snapshots/timeline/timeline.spec.ts/long-strings-with-reply-modern-layout-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/long-strings-with-reply-modern-layout-linux.png similarity index 100% rename from playwright/snapshots/timeline/timeline.spec.ts/long-strings-with-reply-modern-layout-linux.png rename to apps/web/playwright/snapshots/timeline/timeline.spec.ts/long-strings-with-reply-modern-layout-linux.png diff --git a/playwright/snapshots/timeline/timeline.spec.ts/search-aux-panel-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/search-aux-panel-linux.png similarity index 100% rename from playwright/snapshots/timeline/timeline.spec.ts/search-aux-panel-linux.png rename to apps/web/playwright/snapshots/timeline/timeline.spec.ts/search-aux-panel-linux.png diff --git a/playwright/snapshots/timeline/timeline.spec.ts/search-results-with-TextualEvent-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/search-results-with-TextualEvent-linux.png similarity index 100% rename from playwright/snapshots/timeline/timeline.spec.ts/search-results-with-TextualEvent-linux.png rename to apps/web/playwright/snapshots/timeline/timeline.spec.ts/search-results-with-TextualEvent-linux.png diff --git a/playwright/snapshots/timeline/timeline.spec.ts/spoiler-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/spoiler-linux.png similarity index 100% rename from playwright/snapshots/timeline/timeline.spec.ts/spoiler-linux.png rename to apps/web/playwright/snapshots/timeline/timeline.spec.ts/spoiler-linux.png diff --git a/playwright/snapshots/timeline/timeline.spec.ts/spoiler-uncovered-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/spoiler-uncovered-linux.png similarity index 100% rename from playwright/snapshots/timeline/timeline.spec.ts/spoiler-uncovered-linux.png rename to apps/web/playwright/snapshots/timeline/timeline.spec.ts/spoiler-uncovered-linux.png diff --git a/playwright/snapshots/timeline/timeline.spec.ts/voice-message-linux.png b/apps/web/playwright/snapshots/timeline/timeline.spec.ts/voice-message-linux.png similarity index 100% rename from playwright/snapshots/timeline/timeline.spec.ts/voice-message-linux.png rename to apps/web/playwright/snapshots/timeline/timeline.spec.ts/voice-message-linux.png diff --git a/apps/web/playwright/snapshots/user-menu/user-menu.spec.ts/user-menu-linux.png b/apps/web/playwright/snapshots/user-menu/user-menu.spec.ts/user-menu-linux.png new file mode 100644 index 0000000000..fcd039ba26 Binary files /dev/null and b/apps/web/playwright/snapshots/user-menu/user-menu.spec.ts/user-menu-linux.png differ diff --git a/playwright/snapshots/user-view/user-view.spec.ts/user-info-linux.png b/apps/web/playwright/snapshots/user-view/user-view.spec.ts/user-info-linux.png similarity index 100% rename from playwright/snapshots/user-view/user-view.spec.ts/user-info-linux.png rename to apps/web/playwright/snapshots/user-view/user-view.spec.ts/user-info-linux.png diff --git a/playwright/snapshots/voip/element-call.spec.ts/incoming-call-dm-video-toast-checked-linux.png b/apps/web/playwright/snapshots/voip/element-call.spec.ts/incoming-call-dm-video-toast-checked-linux.png similarity index 100% rename from playwright/snapshots/voip/element-call.spec.ts/incoming-call-dm-video-toast-checked-linux.png rename to apps/web/playwright/snapshots/voip/element-call.spec.ts/incoming-call-dm-video-toast-checked-linux.png diff --git a/playwright/snapshots/voip/element-call.spec.ts/incoming-call-dm-video-toast-unchecked-linux.png b/apps/web/playwright/snapshots/voip/element-call.spec.ts/incoming-call-dm-video-toast-unchecked-linux.png similarity index 100% rename from playwright/snapshots/voip/element-call.spec.ts/incoming-call-dm-video-toast-unchecked-linux.png rename to apps/web/playwright/snapshots/voip/element-call.spec.ts/incoming-call-dm-video-toast-unchecked-linux.png diff --git a/apps/web/playwright/snapshots/voip/element-call.spec.ts/incoming-call-dm-voice-toast-linux.png b/apps/web/playwright/snapshots/voip/element-call.spec.ts/incoming-call-dm-voice-toast-linux.png new file mode 100644 index 0000000000..39a5ec6a19 Binary files /dev/null and b/apps/web/playwright/snapshots/voip/element-call.spec.ts/incoming-call-dm-voice-toast-linux.png differ diff --git a/playwright/snapshots/voip/element-call.spec.ts/incoming-call-group-video-toast-checked-linux.png b/apps/web/playwright/snapshots/voip/element-call.spec.ts/incoming-call-group-video-toast-checked-linux.png similarity index 100% rename from playwright/snapshots/voip/element-call.spec.ts/incoming-call-group-video-toast-checked-linux.png rename to apps/web/playwright/snapshots/voip/element-call.spec.ts/incoming-call-group-video-toast-checked-linux.png diff --git a/playwright/snapshots/voip/element-call.spec.ts/incoming-call-group-video-toast-unchecked-linux.png b/apps/web/playwright/snapshots/voip/element-call.spec.ts/incoming-call-group-video-toast-unchecked-linux.png similarity index 100% rename from playwright/snapshots/voip/element-call.spec.ts/incoming-call-group-video-toast-unchecked-linux.png rename to apps/web/playwright/snapshots/voip/element-call.spec.ts/incoming-call-group-video-toast-unchecked-linux.png diff --git a/apps/web/playwright/snapshots/voip/element-call.spec.ts/incoming-call-group-voice-toast-linux.png b/apps/web/playwright/snapshots/voip/element-call.spec.ts/incoming-call-group-voice-toast-linux.png new file mode 100644 index 0000000000..d255b63c6c Binary files /dev/null and b/apps/web/playwright/snapshots/voip/element-call.spec.ts/incoming-call-group-voice-toast-linux.png differ diff --git a/playwright/snapshots/voip/pstn.spec.ts/dialpad-linux.png b/apps/web/playwright/snapshots/voip/pstn.spec.ts/dialpad-linux.png similarity index 100% rename from playwright/snapshots/voip/pstn.spec.ts/dialpad-linux.png rename to apps/web/playwright/snapshots/voip/pstn.spec.ts/dialpad-linux.png diff --git a/playwright/snapshots/voip/pstn.spec.ts/dialpad-trigger-linux.png b/apps/web/playwright/snapshots/voip/pstn.spec.ts/dialpad-trigger-linux.png similarity index 100% rename from playwright/snapshots/voip/pstn.spec.ts/dialpad-trigger-linux.png rename to apps/web/playwright/snapshots/voip/pstn.spec.ts/dialpad-trigger-linux.png diff --git a/playwright/snapshots/widgets/layout.spec.ts/apps-drawer-linux.png b/apps/web/playwright/snapshots/widgets/layout.spec.ts/apps-drawer-linux.png similarity index 100% rename from playwright/snapshots/widgets/layout.spec.ts/apps-drawer-linux.png rename to apps/web/playwright/snapshots/widgets/layout.spec.ts/apps-drawer-linux.png diff --git a/playwright/snapshots/widgets/permissions-dialog.spec.ts/widget-capabilites-prompt-linux.png b/apps/web/playwright/snapshots/widgets/permissions-dialog.spec.ts/widget-capabilites-prompt-linux.png similarity index 100% rename from playwright/snapshots/widgets/permissions-dialog.spec.ts/widget-capabilites-prompt-linux.png rename to apps/web/playwright/snapshots/widgets/permissions-dialog.spec.ts/widget-capabilites-prompt-linux.png diff --git a/playwright/testcontainers/dendrite.ts b/apps/web/playwright/testcontainers/dendrite.ts similarity index 100% rename from playwright/testcontainers/dendrite.ts rename to apps/web/playwright/testcontainers/dendrite.ts diff --git a/playwright/testcontainers/mas.ts b/apps/web/playwright/testcontainers/mas.ts similarity index 80% rename from playwright/testcontainers/mas.ts rename to apps/web/playwright/testcontainers/mas.ts index 51460f6bdf..86650fa2d2 100644 --- a/playwright/testcontainers/mas.ts +++ b/apps/web/playwright/testcontainers/mas.ts @@ -10,7 +10,8 @@ import { type StartedPostgreSqlContainer, } from "@element-hq/element-web-playwright-common/lib/testcontainers/index.js"; -const TAG = "main@sha256:79cefba4e15ccfa850fb2dc410313b793a93c79c6852081dd0b39c0051d4a403"; +const DOCKER_IMAGE = + "ghcr.io/element-hq/matrix-authentication-service:main@sha256:a28fb988827211b19f8983465a286291aa7112dfbe410ad24c849f74aee4ce0f"; /** * MatrixAuthenticationServiceContainer which freezes the docker digest to @@ -19,6 +20,6 @@ const TAG = "main@sha256:79cefba4e15ccfa850fb2dc410313b793a93c79c6852081dd0b39c0 */ export class MatrixAuthenticationServiceContainer extends BaseMatrixAuthenticationServiceContainer { public constructor(db: StartedPostgreSqlContainer) { - super(db, `ghcr.io/element-hq/matrix-authentication-service:${TAG}`); + super(db, DOCKER_IMAGE); } } diff --git a/playwright/testcontainers/synapse.ts b/apps/web/playwright/testcontainers/synapse.ts similarity index 77% rename from playwright/testcontainers/synapse.ts rename to apps/web/playwright/testcontainers/synapse.ts index 32ac67479a..85687e6e24 100644 --- a/playwright/testcontainers/synapse.ts +++ b/apps/web/playwright/testcontainers/synapse.ts @@ -7,7 +7,8 @@ Please see LICENSE files in the repository root for full details. import { SynapseContainer as BaseSynapseContainer } from "@element-hq/element-web-playwright-common/lib/testcontainers/index.js"; -const TAG = "develop@sha256:9e515689caf849b9c66bee33465c1dcd2b46adac2b781db0e98a9571d32c89a2"; +const DOCKER_IMAGE = + "ghcr.io/element-hq/synapse:develop@sha256:b935cb06b158966dad4faa81d021fc6c7c4080fa5361d9b3a08efc431a249a81"; /** * SynapseContainer which freezes the docker digest to stabilise tests, @@ -15,6 +16,6 @@ const TAG = "develop@sha256:9e515689caf849b9c66bee33465c1dcd2b46adac2b781db0e98a */ export class SynapseContainer extends BaseSynapseContainer { public constructor() { - super(`ghcr.io/element-hq/synapse:${TAG}`); + super(DOCKER_IMAGE); } } diff --git a/playwright/tsconfig.json b/apps/web/playwright/tsconfig.json similarity index 73% rename from playwright/tsconfig.json rename to apps/web/playwright/tsconfig.json index 442e2527b3..1b612abfa3 100644 --- a/playwright/tsconfig.json +++ b/apps/web/playwright/tsconfig.json @@ -12,7 +12,7 @@ "include": [ "**/*.ts", "../src/@types/matrix-js-sdk.d.ts", - "../node_modules/matrix-js-sdk/src/@types/*.d.ts", - "../node_modules/matrix-js-sdk/node_modules/@matrix-org/olm/index.d.ts" + "../../../node_modules/matrix-js-sdk/src/@types/*.d.ts", + "../../../node_modules/matrix-js-sdk/node_modules/@matrix-org/olm/index.d.ts" ] } diff --git a/project.json b/apps/web/project.json similarity index 61% rename from project.json rename to apps/web/project.json index b6a4ac89f0..eb5177046f 100644 --- a/project.json +++ b/apps/web/project.json @@ -1,47 +1,49 @@ { - "$schema": "./node_modules/nx/schemas/project-schema.json", + "$schema": "../../node_modules/nx/schemas/project-schema.json", "projectType": "application", - "implicitDependencies": ["@element-hq/web-shared-components"], "targets": { - "clean": { - "command": "rimraf webapp", - "outputs": ["{projectRoot}/webapp/"] - }, "prebuild:i18n": { "cache": true, "command": "node scripts/copy-res.ts", - "dependsOn": ["clean"], - "inputs": ["{projectRoot}/src/i18n/strings/*.json"], - "outputs": ["{projectRoot}/webapp/i18n/"] + "inputs": [ + "{projectRoot}/src/i18n/strings/*.json", + "{workspaceRoot}/packages/shared-components/src/i18n/strings/*.json" + ], + "outputs": ["{projectRoot}/webapp/i18n/"], + "options": { "cwd": "apps/web" } }, "prebuild:module_system": { "cache": true, "command": "node module_system/scripts/install.ts", "inputs": ["{projectRoot}/build_config.yaml"], - "outputs": ["{projectRoot}/src/modules.js", "{projectRoot}/package.json", "{workspaceRoot}/pnpm-lock.yaml"] + "outputs": ["{projectRoot}/src/modules.js", "{projectRoot}/package.json", "{workspaceRoot}/pnpm-lock.yaml"], + "options": { "cwd": "apps/web" } }, "prebuild:rethemendex": { "cache": true, "executor": "nx:run-script", "options": { - "script": "rethemendex" + "script": "rethemendex", + "cwd": "apps/web" }, "inputs": ["{projectRoot}/res/css/**/*"], "outputs": ["{projectRoot}/res/css/_components.pcss"] }, "build": { "command": "webpack-cli --disable-interpret --progress --mode production", - "outputs": ["{projectRoot}/webapp"] + "outputs": ["{projectRoot}/webapp"], + "options": { "cwd": "apps/web" } }, "start:i18n": { "command": "node scripts/copy-res.ts -w", - "dependsOn": ["clean"], - "continuous": true + "continuous": true, + "options": { "cwd": "apps/web" } }, "start": { "command": "webpack-dev-server --disable-interpret --output-path webapp --output-filename=bundles/_dev_/[name].js --output-chunk-filename=bundles/_dev_/[name].js --mode development", - "dependsOn": ["prebuild:*", "start:i18n", "^start"], - "continuous": true + "dependsOn": ["prebuild:module_system", "prebuild:rethemendex", "start:i18n", "^start"], + "continuous": true, + "options": { "cwd": "apps/web" } }, "lint:types": { "executor": "nx:run-commands", @@ -51,14 +53,16 @@ "tsc --noEmit", "tsc --noEmit -p playwright" ], - "parallel": false + "parallel": false, + "cwd": "apps/web" }, "dependsOn": ["^build"] }, "test:unit": { "executor": "@nx/jest:jest", "options": { - "jestConfig": "jest.config.ts" + "jestConfig": "{projectRoot}/jest.config.ts", + "cwd": "apps/web" }, "dependsOn": ["^build"] } diff --git a/recorder-worklet-loader.cjs b/apps/web/recorder-worklet-loader.cjs similarity index 100% rename from recorder-worklet-loader.cjs rename to apps/web/recorder-worklet-loader.cjs diff --git a/res/.well-known/assetlinks.json b/apps/web/res/.well-known/assetlinks.json similarity index 100% rename from res/.well-known/assetlinks.json rename to apps/web/res/.well-known/assetlinks.json diff --git a/res/apple-app-site-association b/apps/web/res/apple-app-site-association similarity index 100% rename from res/apple-app-site-association rename to apps/web/res/apple-app-site-association diff --git a/res/css/_animations.pcss b/apps/web/res/css/_animations.pcss similarity index 100% rename from res/css/_animations.pcss rename to apps/web/res/css/_animations.pcss diff --git a/res/css/_common.pcss b/apps/web/res/css/_common.pcss similarity index 97% rename from res/css/_common.pcss rename to apps/web/res/css/_common.pcss index 736c535d65..b461a08485 100644 --- a/res/css/_common.pcss +++ b/apps/web/res/css/_common.pcss @@ -23,6 +23,7 @@ Please see LICENSE files in the repository root for full details. --buttons-dialog-gap-column: $spacing-8; --MBody-border-radius: 8px; --EventTileBubble_margin-block: 10px; + --MessageTimestamp-width: 46px; /* 8 + 30 (avatar) + 8 */ /* Expected z-indexes for dialogs: 4000 - Default wrapper index @@ -510,6 +511,7 @@ legend { svg { width: inherit; height: inherit; + vertical-align: top; color: var(--cpd-color-icon-secondary); } } @@ -908,3 +910,17 @@ legend { -webkit-line-clamp: var(--mx-line-clamp, 1); overflow: hidden; } + +/* This class is used extensively in element-web and are included here for compatibility with the existing timeline and layout. +/* TODO: Review mx_MessageTimestamp usage after finishing migration of timeline tiles to shared components. */ +/* https://github.com/element-hq/element-web/issues/31651 */ +.mx_MessageTimestamp { + color: var(--cpd-color-text-secondary) !important; /* override anchor color */ + font-size: $font-10px; + font-variant-numeric: tabular-nums; + display: block; /* enable the width setting below */ + width: var(--MessageTimestamp-width); + white-space: nowrap; + user-select: none; + text-decoration: none; +} diff --git a/res/css/_components.pcss b/apps/web/res/css/_components.pcss similarity index 99% rename from res/css/_components.pcss rename to apps/web/res/css/_components.pcss index a5f1c4fba5..0219929632 100644 --- a/res/css/_components.pcss +++ b/apps/web/res/css/_components.pcss @@ -237,11 +237,9 @@ @import "./views/messages/_MVideoBody.pcss"; @import "./views/messages/_MediaBody.pcss"; @import "./views/messages/_MessageActionBar.pcss"; -@import "./views/messages/_MessageTimestamp.pcss"; @import "./views/messages/_MjolnirBody.pcss"; @import "./views/messages/_PinnedMessageBadge.pcss"; @import "./views/messages/_ReactionsRow.pcss"; -@import "./views/messages/_ReactionsRowButton.pcss"; @import "./views/messages/_RedactedBody.pcss"; @import "./views/messages/_RoomAvatarEvent.pcss"; @import "./views/messages/_TextualEvent.pcss"; diff --git a/res/css/_compound.pcss b/apps/web/res/css/_compound.pcss similarity index 100% rename from res/css/_compound.pcss rename to apps/web/res/css/_compound.pcss diff --git a/res/css/_font-sizes.pcss b/apps/web/res/css/_font-sizes.pcss similarity index 100% rename from res/css/_font-sizes.pcss rename to apps/web/res/css/_font-sizes.pcss diff --git a/res/css/_spacing.pcss b/apps/web/res/css/_spacing.pcss similarity index 100% rename from res/css/_spacing.pcss rename to apps/web/res/css/_spacing.pcss diff --git a/res/css/components/views/beacon/_BeaconListItem.pcss b/apps/web/res/css/components/views/beacon/_BeaconListItem.pcss similarity index 100% rename from res/css/components/views/beacon/_BeaconListItem.pcss rename to apps/web/res/css/components/views/beacon/_BeaconListItem.pcss diff --git a/res/css/components/views/beacon/_BeaconStatus.pcss b/apps/web/res/css/components/views/beacon/_BeaconStatus.pcss similarity index 100% rename from res/css/components/views/beacon/_BeaconStatus.pcss rename to apps/web/res/css/components/views/beacon/_BeaconStatus.pcss diff --git a/res/css/components/views/beacon/_BeaconStatusTooltip.pcss b/apps/web/res/css/components/views/beacon/_BeaconStatusTooltip.pcss similarity index 100% rename from res/css/components/views/beacon/_BeaconStatusTooltip.pcss rename to apps/web/res/css/components/views/beacon/_BeaconStatusTooltip.pcss diff --git a/res/css/components/views/beacon/_BeaconViewDialog.pcss b/apps/web/res/css/components/views/beacon/_BeaconViewDialog.pcss similarity index 100% rename from res/css/components/views/beacon/_BeaconViewDialog.pcss rename to apps/web/res/css/components/views/beacon/_BeaconViewDialog.pcss diff --git a/res/css/components/views/beacon/_DialogOwnBeaconStatus.pcss b/apps/web/res/css/components/views/beacon/_DialogOwnBeaconStatus.pcss similarity index 100% rename from res/css/components/views/beacon/_DialogOwnBeaconStatus.pcss rename to apps/web/res/css/components/views/beacon/_DialogOwnBeaconStatus.pcss diff --git a/res/css/components/views/beacon/_DialogSidebar.pcss b/apps/web/res/css/components/views/beacon/_DialogSidebar.pcss similarity index 100% rename from res/css/components/views/beacon/_DialogSidebar.pcss rename to apps/web/res/css/components/views/beacon/_DialogSidebar.pcss diff --git a/res/css/components/views/beacon/_LeftPanelLiveShareWarning.pcss b/apps/web/res/css/components/views/beacon/_LeftPanelLiveShareWarning.pcss similarity index 100% rename from res/css/components/views/beacon/_LeftPanelLiveShareWarning.pcss rename to apps/web/res/css/components/views/beacon/_LeftPanelLiveShareWarning.pcss diff --git a/res/css/components/views/beacon/_LiveTimeRemaining.pcss b/apps/web/res/css/components/views/beacon/_LiveTimeRemaining.pcss similarity index 100% rename from res/css/components/views/beacon/_LiveTimeRemaining.pcss rename to apps/web/res/css/components/views/beacon/_LiveTimeRemaining.pcss diff --git a/res/css/components/views/beacon/_OwnBeaconStatus.pcss b/apps/web/res/css/components/views/beacon/_OwnBeaconStatus.pcss similarity index 100% rename from res/css/components/views/beacon/_OwnBeaconStatus.pcss rename to apps/web/res/css/components/views/beacon/_OwnBeaconStatus.pcss diff --git a/res/css/components/views/beacon/_ShareLatestLocation.pcss b/apps/web/res/css/components/views/beacon/_ShareLatestLocation.pcss similarity index 100% rename from res/css/components/views/beacon/_ShareLatestLocation.pcss rename to apps/web/res/css/components/views/beacon/_ShareLatestLocation.pcss diff --git a/res/css/components/views/beacon/_StyledLiveBeaconIcon.pcss b/apps/web/res/css/components/views/beacon/_StyledLiveBeaconIcon.pcss similarity index 100% rename from res/css/components/views/beacon/_StyledLiveBeaconIcon.pcss rename to apps/web/res/css/components/views/beacon/_StyledLiveBeaconIcon.pcss diff --git a/res/css/components/views/context_menus/_KebabContextMenu.pcss b/apps/web/res/css/components/views/context_menus/_KebabContextMenu.pcss similarity index 100% rename from res/css/components/views/context_menus/_KebabContextMenu.pcss rename to apps/web/res/css/components/views/context_menus/_KebabContextMenu.pcss diff --git a/res/css/components/views/dialogs/polls/_PollDetailHeader.pcss b/apps/web/res/css/components/views/dialogs/polls/_PollDetailHeader.pcss similarity index 100% rename from res/css/components/views/dialogs/polls/_PollDetailHeader.pcss rename to apps/web/res/css/components/views/dialogs/polls/_PollDetailHeader.pcss diff --git a/res/css/components/views/dialogs/polls/_PollListItem.pcss b/apps/web/res/css/components/views/dialogs/polls/_PollListItem.pcss similarity index 100% rename from res/css/components/views/dialogs/polls/_PollListItem.pcss rename to apps/web/res/css/components/views/dialogs/polls/_PollListItem.pcss diff --git a/res/css/components/views/dialogs/polls/_PollListItemEnded.pcss b/apps/web/res/css/components/views/dialogs/polls/_PollListItemEnded.pcss similarity index 100% rename from res/css/components/views/dialogs/polls/_PollListItemEnded.pcss rename to apps/web/res/css/components/views/dialogs/polls/_PollListItemEnded.pcss diff --git a/res/css/components/views/elements/_AppPermission.pcss b/apps/web/res/css/components/views/elements/_AppPermission.pcss similarity index 100% rename from res/css/components/views/elements/_AppPermission.pcss rename to apps/web/res/css/components/views/elements/_AppPermission.pcss diff --git a/res/css/components/views/elements/_AppWarning.pcss b/apps/web/res/css/components/views/elements/_AppWarning.pcss similarity index 100% rename from res/css/components/views/elements/_AppWarning.pcss rename to apps/web/res/css/components/views/elements/_AppWarning.pcss diff --git a/res/css/components/views/elements/_FilterDropdown.pcss b/apps/web/res/css/components/views/elements/_FilterDropdown.pcss similarity index 100% rename from res/css/components/views/elements/_FilterDropdown.pcss rename to apps/web/res/css/components/views/elements/_FilterDropdown.pcss diff --git a/res/css/components/views/elements/_FilterTabGroup.pcss b/apps/web/res/css/components/views/elements/_FilterTabGroup.pcss similarity index 100% rename from res/css/components/views/elements/_FilterTabGroup.pcss rename to apps/web/res/css/components/views/elements/_FilterTabGroup.pcss diff --git a/res/css/components/views/elements/_LearnMore.pcss b/apps/web/res/css/components/views/elements/_LearnMore.pcss similarity index 100% rename from res/css/components/views/elements/_LearnMore.pcss rename to apps/web/res/css/components/views/elements/_LearnMore.pcss diff --git a/res/css/components/views/location/_EnableLiveShare.pcss b/apps/web/res/css/components/views/location/_EnableLiveShare.pcss similarity index 100% rename from res/css/components/views/location/_EnableLiveShare.pcss rename to apps/web/res/css/components/views/location/_EnableLiveShare.pcss diff --git a/res/css/components/views/location/_LiveDurationDropdown.pcss b/apps/web/res/css/components/views/location/_LiveDurationDropdown.pcss similarity index 100% rename from res/css/components/views/location/_LiveDurationDropdown.pcss rename to apps/web/res/css/components/views/location/_LiveDurationDropdown.pcss diff --git a/res/css/components/views/location/_LocationShareMenu.pcss b/apps/web/res/css/components/views/location/_LocationShareMenu.pcss similarity index 100% rename from res/css/components/views/location/_LocationShareMenu.pcss rename to apps/web/res/css/components/views/location/_LocationShareMenu.pcss diff --git a/res/css/components/views/location/_MapError.pcss b/apps/web/res/css/components/views/location/_MapError.pcss similarity index 100% rename from res/css/components/views/location/_MapError.pcss rename to apps/web/res/css/components/views/location/_MapError.pcss diff --git a/res/css/components/views/location/_MapFallback.pcss b/apps/web/res/css/components/views/location/_MapFallback.pcss similarity index 100% rename from res/css/components/views/location/_MapFallback.pcss rename to apps/web/res/css/components/views/location/_MapFallback.pcss diff --git a/res/css/components/views/location/_Marker.pcss b/apps/web/res/css/components/views/location/_Marker.pcss similarity index 100% rename from res/css/components/views/location/_Marker.pcss rename to apps/web/res/css/components/views/location/_Marker.pcss diff --git a/res/css/components/views/location/_ShareDialogButtons.pcss b/apps/web/res/css/components/views/location/_ShareDialogButtons.pcss similarity index 100% rename from res/css/components/views/location/_ShareDialogButtons.pcss rename to apps/web/res/css/components/views/location/_ShareDialogButtons.pcss diff --git a/res/css/components/views/location/_ShareType.pcss b/apps/web/res/css/components/views/location/_ShareType.pcss similarity index 100% rename from res/css/components/views/location/_ShareType.pcss rename to apps/web/res/css/components/views/location/_ShareType.pcss diff --git a/res/css/components/views/location/_ZoomButtons.pcss b/apps/web/res/css/components/views/location/_ZoomButtons.pcss similarity index 100% rename from res/css/components/views/location/_ZoomButtons.pcss rename to apps/web/res/css/components/views/location/_ZoomButtons.pcss diff --git a/res/css/components/views/messages/_MBeaconBody.pcss b/apps/web/res/css/components/views/messages/_MBeaconBody.pcss similarity index 100% rename from res/css/components/views/messages/_MBeaconBody.pcss rename to apps/web/res/css/components/views/messages/_MBeaconBody.pcss diff --git a/res/css/components/views/messages/shared/_MediaProcessingError.pcss b/apps/web/res/css/components/views/messages/shared/_MediaProcessingError.pcss similarity index 100% rename from res/css/components/views/messages/shared/_MediaProcessingError.pcss rename to apps/web/res/css/components/views/messages/shared/_MediaProcessingError.pcss diff --git a/res/css/components/views/polls/_PollOption.pcss b/apps/web/res/css/components/views/polls/_PollOption.pcss similarity index 100% rename from res/css/components/views/polls/_PollOption.pcss rename to apps/web/res/css/components/views/polls/_PollOption.pcss diff --git a/res/css/components/views/settings/_AddRemoveThreepids.pcss b/apps/web/res/css/components/views/settings/_AddRemoveThreepids.pcss similarity index 100% rename from res/css/components/views/settings/_AddRemoveThreepids.pcss rename to apps/web/res/css/components/views/settings/_AddRemoveThreepids.pcss diff --git a/res/css/components/views/settings/devices/_CurrentDeviceSection.pcss b/apps/web/res/css/components/views/settings/devices/_CurrentDeviceSection.pcss similarity index 100% rename from res/css/components/views/settings/devices/_CurrentDeviceSection.pcss rename to apps/web/res/css/components/views/settings/devices/_CurrentDeviceSection.pcss diff --git a/res/css/components/views/settings/devices/_DeviceDetailHeading.pcss b/apps/web/res/css/components/views/settings/devices/_DeviceDetailHeading.pcss similarity index 100% rename from res/css/components/views/settings/devices/_DeviceDetailHeading.pcss rename to apps/web/res/css/components/views/settings/devices/_DeviceDetailHeading.pcss diff --git a/res/css/components/views/settings/devices/_DeviceDetails.pcss b/apps/web/res/css/components/views/settings/devices/_DeviceDetails.pcss similarity index 100% rename from res/css/components/views/settings/devices/_DeviceDetails.pcss rename to apps/web/res/css/components/views/settings/devices/_DeviceDetails.pcss diff --git a/res/css/components/views/settings/devices/_DeviceExpandDetailsButton.pcss b/apps/web/res/css/components/views/settings/devices/_DeviceExpandDetailsButton.pcss similarity index 100% rename from res/css/components/views/settings/devices/_DeviceExpandDetailsButton.pcss rename to apps/web/res/css/components/views/settings/devices/_DeviceExpandDetailsButton.pcss diff --git a/res/css/components/views/settings/devices/_DeviceSecurityCard.pcss b/apps/web/res/css/components/views/settings/devices/_DeviceSecurityCard.pcss similarity index 100% rename from res/css/components/views/settings/devices/_DeviceSecurityCard.pcss rename to apps/web/res/css/components/views/settings/devices/_DeviceSecurityCard.pcss diff --git a/res/css/components/views/settings/devices/_DeviceTile.pcss b/apps/web/res/css/components/views/settings/devices/_DeviceTile.pcss similarity index 100% rename from res/css/components/views/settings/devices/_DeviceTile.pcss rename to apps/web/res/css/components/views/settings/devices/_DeviceTile.pcss diff --git a/res/css/components/views/settings/devices/_DeviceTypeIcon.pcss b/apps/web/res/css/components/views/settings/devices/_DeviceTypeIcon.pcss similarity index 100% rename from res/css/components/views/settings/devices/_DeviceTypeIcon.pcss rename to apps/web/res/css/components/views/settings/devices/_DeviceTypeIcon.pcss diff --git a/res/css/components/views/settings/devices/_FilteredDeviceList.pcss b/apps/web/res/css/components/views/settings/devices/_FilteredDeviceList.pcss similarity index 100% rename from res/css/components/views/settings/devices/_FilteredDeviceList.pcss rename to apps/web/res/css/components/views/settings/devices/_FilteredDeviceList.pcss diff --git a/res/css/components/views/settings/devices/_FilteredDeviceListHeader.pcss b/apps/web/res/css/components/views/settings/devices/_FilteredDeviceListHeader.pcss similarity index 100% rename from res/css/components/views/settings/devices/_FilteredDeviceListHeader.pcss rename to apps/web/res/css/components/views/settings/devices/_FilteredDeviceListHeader.pcss diff --git a/res/css/components/views/settings/devices/_SecurityRecommendations.pcss b/apps/web/res/css/components/views/settings/devices/_SecurityRecommendations.pcss similarity index 100% rename from res/css/components/views/settings/devices/_SecurityRecommendations.pcss rename to apps/web/res/css/components/views/settings/devices/_SecurityRecommendations.pcss diff --git a/res/css/components/views/settings/devices/_SelectableDeviceTile.pcss b/apps/web/res/css/components/views/settings/devices/_SelectableDeviceTile.pcss similarity index 100% rename from res/css/components/views/settings/devices/_SelectableDeviceTile.pcss rename to apps/web/res/css/components/views/settings/devices/_SelectableDeviceTile.pcss diff --git a/res/css/components/views/settings/encryption/_KeyStoragePanel.pcss b/apps/web/res/css/components/views/settings/encryption/_KeyStoragePanel.pcss similarity index 100% rename from res/css/components/views/settings/encryption/_KeyStoragePanel.pcss rename to apps/web/res/css/components/views/settings/encryption/_KeyStoragePanel.pcss diff --git a/res/css/components/views/settings/shared/_SettingsSubsection.pcss b/apps/web/res/css/components/views/settings/shared/_SettingsSubsection.pcss similarity index 100% rename from res/css/components/views/settings/shared/_SettingsSubsection.pcss rename to apps/web/res/css/components/views/settings/shared/_SettingsSubsection.pcss diff --git a/res/css/components/views/settings/shared/_SettingsSubsectionHeading.pcss b/apps/web/res/css/components/views/settings/shared/_SettingsSubsectionHeading.pcss similarity index 100% rename from res/css/components/views/settings/shared/_SettingsSubsectionHeading.pcss rename to apps/web/res/css/components/views/settings/shared/_SettingsSubsectionHeading.pcss diff --git a/res/css/components/views/spaces/_QuickThemeSwitcher.pcss b/apps/web/res/css/components/views/spaces/_QuickThemeSwitcher.pcss similarity index 100% rename from res/css/components/views/spaces/_QuickThemeSwitcher.pcss rename to apps/web/res/css/components/views/spaces/_QuickThemeSwitcher.pcss diff --git a/res/css/components/views/typography/_Caption.pcss b/apps/web/res/css/components/views/typography/_Caption.pcss similarity index 100% rename from res/css/components/views/typography/_Caption.pcss rename to apps/web/res/css/components/views/typography/_Caption.pcss diff --git a/res/css/compound/_Icon.pcss b/apps/web/res/css/compound/_Icon.pcss similarity index 100% rename from res/css/compound/_Icon.pcss rename to apps/web/res/css/compound/_Icon.pcss diff --git a/res/css/compound/_SuccessDialog.pcss b/apps/web/res/css/compound/_SuccessDialog.pcss similarity index 100% rename from res/css/compound/_SuccessDialog.pcss rename to apps/web/res/css/compound/_SuccessDialog.pcss diff --git a/res/css/rethemendex.sh b/apps/web/res/css/rethemendex.sh similarity index 100% rename from res/css/rethemendex.sh rename to apps/web/res/css/rethemendex.sh diff --git a/res/css/shared.pcss b/apps/web/res/css/shared.pcss similarity index 100% rename from res/css/shared.pcss rename to apps/web/res/css/shared.pcss diff --git a/res/css/structures/ErrorView.pcss b/apps/web/res/css/structures/ErrorView.pcss similarity index 100% rename from res/css/structures/ErrorView.pcss rename to apps/web/res/css/structures/ErrorView.pcss diff --git a/res/css/structures/_AutoHideScrollbar.pcss b/apps/web/res/css/structures/_AutoHideScrollbar.pcss similarity index 100% rename from res/css/structures/_AutoHideScrollbar.pcss rename to apps/web/res/css/structures/_AutoHideScrollbar.pcss diff --git a/res/css/structures/_AutocompleteInput.pcss b/apps/web/res/css/structures/_AutocompleteInput.pcss similarity index 100% rename from res/css/structures/_AutocompleteInput.pcss rename to apps/web/res/css/structures/_AutocompleteInput.pcss diff --git a/res/css/structures/_BackdropPanel.pcss b/apps/web/res/css/structures/_BackdropPanel.pcss similarity index 100% rename from res/css/structures/_BackdropPanel.pcss rename to apps/web/res/css/structures/_BackdropPanel.pcss diff --git a/res/css/structures/_CompatibilityPage.pcss b/apps/web/res/css/structures/_CompatibilityPage.pcss similarity index 100% rename from res/css/structures/_CompatibilityPage.pcss rename to apps/web/res/css/structures/_CompatibilityPage.pcss diff --git a/res/css/structures/_ContextualMenu.pcss b/apps/web/res/css/structures/_ContextualMenu.pcss similarity index 100% rename from res/css/structures/_ContextualMenu.pcss rename to apps/web/res/css/structures/_ContextualMenu.pcss diff --git a/res/css/structures/_ErrorMessage.pcss b/apps/web/res/css/structures/_ErrorMessage.pcss similarity index 100% rename from res/css/structures/_ErrorMessage.pcss rename to apps/web/res/css/structures/_ErrorMessage.pcss diff --git a/res/css/structures/_FileDropTarget.pcss b/apps/web/res/css/structures/_FileDropTarget.pcss similarity index 100% rename from res/css/structures/_FileDropTarget.pcss rename to apps/web/res/css/structures/_FileDropTarget.pcss diff --git a/res/css/structures/_FilePanel.pcss b/apps/web/res/css/structures/_FilePanel.pcss similarity index 100% rename from res/css/structures/_FilePanel.pcss rename to apps/web/res/css/structures/_FilePanel.pcss diff --git a/res/css/structures/_GenericDropdownMenu.pcss b/apps/web/res/css/structures/_GenericDropdownMenu.pcss similarity index 100% rename from res/css/structures/_GenericDropdownMenu.pcss rename to apps/web/res/css/structures/_GenericDropdownMenu.pcss diff --git a/res/css/structures/_HomePage.pcss b/apps/web/res/css/structures/_HomePage.pcss similarity index 100% rename from res/css/structures/_HomePage.pcss rename to apps/web/res/css/structures/_HomePage.pcss diff --git a/res/css/structures/_LargeLoader.pcss b/apps/web/res/css/structures/_LargeLoader.pcss similarity index 100% rename from res/css/structures/_LargeLoader.pcss rename to apps/web/res/css/structures/_LargeLoader.pcss diff --git a/res/css/structures/_LeftPanel.pcss b/apps/web/res/css/structures/_LeftPanel.pcss similarity index 100% rename from res/css/structures/_LeftPanel.pcss rename to apps/web/res/css/structures/_LeftPanel.pcss diff --git a/res/css/structures/_MainSplit.pcss b/apps/web/res/css/structures/_MainSplit.pcss similarity index 100% rename from res/css/structures/_MainSplit.pcss rename to apps/web/res/css/structures/_MainSplit.pcss diff --git a/res/css/structures/_MatrixChat.pcss b/apps/web/res/css/structures/_MatrixChat.pcss similarity index 100% rename from res/css/structures/_MatrixChat.pcss rename to apps/web/res/css/structures/_MatrixChat.pcss diff --git a/res/css/structures/_MessagePanel.pcss b/apps/web/res/css/structures/_MessagePanel.pcss similarity index 100% rename from res/css/structures/_MessagePanel.pcss rename to apps/web/res/css/structures/_MessagePanel.pcss diff --git a/res/css/structures/_NonUrgentToastContainer.pcss b/apps/web/res/css/structures/_NonUrgentToastContainer.pcss similarity index 100% rename from res/css/structures/_NonUrgentToastContainer.pcss rename to apps/web/res/css/structures/_NonUrgentToastContainer.pcss diff --git a/res/css/structures/_QuickSettingsButton.pcss b/apps/web/res/css/structures/_QuickSettingsButton.pcss similarity index 100% rename from res/css/structures/_QuickSettingsButton.pcss rename to apps/web/res/css/structures/_QuickSettingsButton.pcss diff --git a/res/css/structures/_RightPanel.pcss b/apps/web/res/css/structures/_RightPanel.pcss similarity index 100% rename from res/css/structures/_RightPanel.pcss rename to apps/web/res/css/structures/_RightPanel.pcss diff --git a/res/css/structures/_RoomSearch.pcss b/apps/web/res/css/structures/_RoomSearch.pcss similarity index 100% rename from res/css/structures/_RoomSearch.pcss rename to apps/web/res/css/structures/_RoomSearch.pcss diff --git a/res/css/structures/_RoomView.pcss b/apps/web/res/css/structures/_RoomView.pcss similarity index 100% rename from res/css/structures/_RoomView.pcss rename to apps/web/res/css/structures/_RoomView.pcss diff --git a/res/css/structures/_SearchBox.pcss b/apps/web/res/css/structures/_SearchBox.pcss similarity index 100% rename from res/css/structures/_SearchBox.pcss rename to apps/web/res/css/structures/_SearchBox.pcss diff --git a/res/css/structures/_SpaceHierarchy.pcss b/apps/web/res/css/structures/_SpaceHierarchy.pcss similarity index 100% rename from res/css/structures/_SpaceHierarchy.pcss rename to apps/web/res/css/structures/_SpaceHierarchy.pcss diff --git a/res/css/structures/_SpacePanel.pcss b/apps/web/res/css/structures/_SpacePanel.pcss similarity index 100% rename from res/css/structures/_SpacePanel.pcss rename to apps/web/res/css/structures/_SpacePanel.pcss diff --git a/res/css/structures/_SpacePillButton.pcss b/apps/web/res/css/structures/_SpacePillButton.pcss similarity index 100% rename from res/css/structures/_SpacePillButton.pcss rename to apps/web/res/css/structures/_SpacePillButton.pcss diff --git a/res/css/structures/_SpaceRoomView.pcss b/apps/web/res/css/structures/_SpaceRoomView.pcss similarity index 100% rename from res/css/structures/_SpaceRoomView.pcss rename to apps/web/res/css/structures/_SpaceRoomView.pcss diff --git a/res/css/structures/_SplashPage.pcss b/apps/web/res/css/structures/_SplashPage.pcss similarity index 100% rename from res/css/structures/_SplashPage.pcss rename to apps/web/res/css/structures/_SplashPage.pcss diff --git a/res/css/structures/_TabbedView.pcss b/apps/web/res/css/structures/_TabbedView.pcss similarity index 100% rename from res/css/structures/_TabbedView.pcss rename to apps/web/res/css/structures/_TabbedView.pcss diff --git a/res/css/structures/_ThreadsActivityCentre.pcss b/apps/web/res/css/structures/_ThreadsActivityCentre.pcss similarity index 100% rename from res/css/structures/_ThreadsActivityCentre.pcss rename to apps/web/res/css/structures/_ThreadsActivityCentre.pcss diff --git a/res/css/structures/_ToastContainer.pcss b/apps/web/res/css/structures/_ToastContainer.pcss similarity index 100% rename from res/css/structures/_ToastContainer.pcss rename to apps/web/res/css/structures/_ToastContainer.pcss diff --git a/res/css/structures/_UploadBar.pcss b/apps/web/res/css/structures/_UploadBar.pcss similarity index 100% rename from res/css/structures/_UploadBar.pcss rename to apps/web/res/css/structures/_UploadBar.pcss diff --git a/res/css/structures/_UserMenu.pcss b/apps/web/res/css/structures/_UserMenu.pcss similarity index 93% rename from res/css/structures/_UserMenu.pcss rename to apps/web/res/css/structures/_UserMenu.pcss index 89b15e68b2..b6c5b73e93 100644 --- a/res/css/structures/_UserMenu.pcss +++ b/apps/web/res/css/structures/_UserMenu.pcss @@ -86,14 +86,8 @@ Please see LICENSE files in the repository root for full details. } .mx_UserMenu_contextMenu_themeButton { - min-width: 32px; - max-width: 32px; - width: 32px; - height: 32px; + flex-shrink: 0; margin-left: 8px; - border-radius: 32px; - background-color: $theme-button-bg-color; - cursor: pointer; /* to make alignment easier, create flexbox for the image */ display: flex; @@ -102,6 +96,13 @@ Please see LICENSE files in the repository root for full details. /* For enhanced visibility under contrast control */ outline: 1px solid transparent; + + /* Compound overrides to match transitional designs */ + padding: var(--cpd-space-2x); + svg { + width: 16px; + height: 16px; + } } &.mx_UserMenu_contextMenu_guestPrompts { diff --git a/res/css/structures/_ViewSource.pcss b/apps/web/res/css/structures/_ViewSource.pcss similarity index 100% rename from res/css/structures/_ViewSource.pcss rename to apps/web/res/css/structures/_ViewSource.pcss diff --git a/res/css/structures/auth/_CompleteSecurity.pcss b/apps/web/res/css/structures/auth/_CompleteSecurity.pcss similarity index 100% rename from res/css/structures/auth/_CompleteSecurity.pcss rename to apps/web/res/css/structures/auth/_CompleteSecurity.pcss diff --git a/res/css/structures/auth/_ConfirmSessionLockTheftView.pcss b/apps/web/res/css/structures/auth/_ConfirmSessionLockTheftView.pcss similarity index 100% rename from res/css/structures/auth/_ConfirmSessionLockTheftView.pcss rename to apps/web/res/css/structures/auth/_ConfirmSessionLockTheftView.pcss diff --git a/res/css/structures/auth/_Login.pcss b/apps/web/res/css/structures/auth/_Login.pcss similarity index 87% rename from res/css/structures/auth/_Login.pcss rename to apps/web/res/css/structures/auth/_Login.pcss index a7192b1f0d..e8445dc493 100644 --- a/res/css/structures/auth/_Login.pcss +++ b/apps/web/res/css/structures/auth/_Login.pcss @@ -7,19 +7,9 @@ Please see LICENSE files in the repository root for full details. */ .mx_Login_submit { - @mixin mx_DialogButton; - font-size: 15px; - font-weight: var(--cpd-font-weight-semibold); width: 100%; margin-top: 24px; margin-bottom: 24px; - box-sizing: border-box; - text-align: center; -} - -.mx_Login_submit:disabled { - opacity: 0.3; - cursor: default; } .mx_Login_loader { diff --git a/res/css/structures/auth/_LoginSplashView.pcss b/apps/web/res/css/structures/auth/_LoginSplashView.pcss similarity index 100% rename from res/css/structures/auth/_LoginSplashView.pcss rename to apps/web/res/css/structures/auth/_LoginSplashView.pcss diff --git a/res/css/structures/auth/_MobileRegistration.pcss b/apps/web/res/css/structures/auth/_MobileRegistration.pcss similarity index 100% rename from res/css/structures/auth/_MobileRegistration.pcss rename to apps/web/res/css/structures/auth/_MobileRegistration.pcss diff --git a/res/css/structures/auth/_Registration.pcss b/apps/web/res/css/structures/auth/_Registration.pcss similarity index 100% rename from res/css/structures/auth/_Registration.pcss rename to apps/web/res/css/structures/auth/_Registration.pcss diff --git a/res/css/structures/auth/_SessionLockStolenView.pcss b/apps/web/res/css/structures/auth/_SessionLockStolenView.pcss similarity index 100% rename from res/css/structures/auth/_SessionLockStolenView.pcss rename to apps/web/res/css/structures/auth/_SessionLockStolenView.pcss diff --git a/res/css/structures/auth/_SetupEncryptionBody.pcss b/apps/web/res/css/structures/auth/_SetupEncryptionBody.pcss similarity index 100% rename from res/css/structures/auth/_SetupEncryptionBody.pcss rename to apps/web/res/css/structures/auth/_SetupEncryptionBody.pcss diff --git a/res/css/views/audio_messages/_PlayPauseButton.pcss b/apps/web/res/css/views/audio_messages/_PlayPauseButton.pcss similarity index 100% rename from res/css/views/audio_messages/_PlayPauseButton.pcss rename to apps/web/res/css/views/audio_messages/_PlayPauseButton.pcss diff --git a/res/css/views/audio_messages/_PlaybackContainer.pcss b/apps/web/res/css/views/audio_messages/_PlaybackContainer.pcss similarity index 100% rename from res/css/views/audio_messages/_PlaybackContainer.pcss rename to apps/web/res/css/views/audio_messages/_PlaybackContainer.pcss diff --git a/res/css/views/audio_messages/_SeekBar.pcss b/apps/web/res/css/views/audio_messages/_SeekBar.pcss similarity index 100% rename from res/css/views/audio_messages/_SeekBar.pcss rename to apps/web/res/css/views/audio_messages/_SeekBar.pcss diff --git a/res/css/views/audio_messages/_Waveform.pcss b/apps/web/res/css/views/audio_messages/_Waveform.pcss similarity index 100% rename from res/css/views/audio_messages/_Waveform.pcss rename to apps/web/res/css/views/audio_messages/_Waveform.pcss diff --git a/res/css/views/auth/_AuthBody.pcss b/apps/web/res/css/views/auth/_AuthBody.pcss similarity index 99% rename from res/css/views/auth/_AuthBody.pcss rename to apps/web/res/css/views/auth/_AuthBody.pcss index f5f0f9cce5..dcff439107 100644 --- a/res/css/views/auth/_AuthBody.pcss +++ b/apps/web/res/css/views/auth/_AuthBody.pcss @@ -148,7 +148,6 @@ Please see LICENSE files in the repository root for full details. } .mx_Login_submit { - font-weight: var(--cpd-font-weight-semibold); margin: 0 0 $spacing-16; } diff --git a/res/css/views/auth/_AuthFooter.pcss b/apps/web/res/css/views/auth/_AuthFooter.pcss similarity index 100% rename from res/css/views/auth/_AuthFooter.pcss rename to apps/web/res/css/views/auth/_AuthFooter.pcss diff --git a/res/css/views/auth/_AuthHeader.pcss b/apps/web/res/css/views/auth/_AuthHeader.pcss similarity index 100% rename from res/css/views/auth/_AuthHeader.pcss rename to apps/web/res/css/views/auth/_AuthHeader.pcss diff --git a/res/css/views/auth/_AuthHeaderLogo.pcss b/apps/web/res/css/views/auth/_AuthHeaderLogo.pcss similarity index 100% rename from res/css/views/auth/_AuthHeaderLogo.pcss rename to apps/web/res/css/views/auth/_AuthHeaderLogo.pcss diff --git a/res/css/views/auth/_AuthPage.pcss b/apps/web/res/css/views/auth/_AuthPage.pcss similarity index 100% rename from res/css/views/auth/_AuthPage.pcss rename to apps/web/res/css/views/auth/_AuthPage.pcss diff --git a/res/css/views/auth/_CompleteSecurityBody.pcss b/apps/web/res/css/views/auth/_CompleteSecurityBody.pcss similarity index 100% rename from res/css/views/auth/_CompleteSecurityBody.pcss rename to apps/web/res/css/views/auth/_CompleteSecurityBody.pcss diff --git a/res/css/views/auth/_CountryDropdown.pcss b/apps/web/res/css/views/auth/_CountryDropdown.pcss similarity index 100% rename from res/css/views/auth/_CountryDropdown.pcss rename to apps/web/res/css/views/auth/_CountryDropdown.pcss diff --git a/res/css/views/auth/_InteractiveAuthEntryComponents.pcss b/apps/web/res/css/views/auth/_InteractiveAuthEntryComponents.pcss similarity index 100% rename from res/css/views/auth/_InteractiveAuthEntryComponents.pcss rename to apps/web/res/css/views/auth/_InteractiveAuthEntryComponents.pcss diff --git a/res/css/views/auth/_LanguageSelector.pcss b/apps/web/res/css/views/auth/_LanguageSelector.pcss similarity index 100% rename from res/css/views/auth/_LanguageSelector.pcss rename to apps/web/res/css/views/auth/_LanguageSelector.pcss diff --git a/res/css/views/auth/_LoginWithQR.pcss b/apps/web/res/css/views/auth/_LoginWithQR.pcss similarity index 100% rename from res/css/views/auth/_LoginWithQR.pcss rename to apps/web/res/css/views/auth/_LoginWithQR.pcss diff --git a/res/css/views/auth/_PassphraseField.pcss b/apps/web/res/css/views/auth/_PassphraseField.pcss similarity index 100% rename from res/css/views/auth/_PassphraseField.pcss rename to apps/web/res/css/views/auth/_PassphraseField.pcss diff --git a/res/css/views/auth/_Welcome.pcss b/apps/web/res/css/views/auth/_Welcome.pcss similarity index 100% rename from res/css/views/auth/_Welcome.pcss rename to apps/web/res/css/views/auth/_Welcome.pcss diff --git a/res/css/views/avatars/_BaseAvatar.pcss b/apps/web/res/css/views/avatars/_BaseAvatar.pcss similarity index 100% rename from res/css/views/avatars/_BaseAvatar.pcss rename to apps/web/res/css/views/avatars/_BaseAvatar.pcss diff --git a/res/css/views/avatars/_DecoratedRoomAvatar.pcss b/apps/web/res/css/views/avatars/_DecoratedRoomAvatar.pcss similarity index 100% rename from res/css/views/avatars/_DecoratedRoomAvatar.pcss rename to apps/web/res/css/views/avatars/_DecoratedRoomAvatar.pcss diff --git a/res/css/views/avatars/_RoomAvatarView.pcss b/apps/web/res/css/views/avatars/_RoomAvatarView.pcss similarity index 97% rename from res/css/views/avatars/_RoomAvatarView.pcss rename to apps/web/res/css/views/avatars/_RoomAvatarView.pcss index 509b51c3e8..11995aec8d 100644 --- a/res/css/views/avatars/_RoomAvatarView.pcss +++ b/apps/web/res/css/views/avatars/_RoomAvatarView.pcss @@ -18,6 +18,7 @@ mask-position: center; mask-size: contain; mask-repeat: no-repeat; + pointer-events: none; } .mx_RoomAvatarView_RoomAvatar_icon { diff --git a/res/css/views/avatars/_WidgetAvatar.pcss b/apps/web/res/css/views/avatars/_WidgetAvatar.pcss similarity index 100% rename from res/css/views/avatars/_WidgetAvatar.pcss rename to apps/web/res/css/views/avatars/_WidgetAvatar.pcss diff --git a/res/css/views/avatars/_WithPresenceIndicator.pcss b/apps/web/res/css/views/avatars/_WithPresenceIndicator.pcss similarity index 100% rename from res/css/views/avatars/_WithPresenceIndicator.pcss rename to apps/web/res/css/views/avatars/_WithPresenceIndicator.pcss diff --git a/res/css/views/beta/_BetaCard.pcss b/apps/web/res/css/views/beta/_BetaCard.pcss similarity index 100% rename from res/css/views/beta/_BetaCard.pcss rename to apps/web/res/css/views/beta/_BetaCard.pcss diff --git a/res/css/views/context_menus/_DeviceContextMenu.pcss b/apps/web/res/css/views/context_menus/_DeviceContextMenu.pcss similarity index 100% rename from res/css/views/context_menus/_DeviceContextMenu.pcss rename to apps/web/res/css/views/context_menus/_DeviceContextMenu.pcss diff --git a/res/css/views/context_menus/_IconizedContextMenu.pcss b/apps/web/res/css/views/context_menus/_IconizedContextMenu.pcss similarity index 100% rename from res/css/views/context_menus/_IconizedContextMenu.pcss rename to apps/web/res/css/views/context_menus/_IconizedContextMenu.pcss diff --git a/res/css/views/context_menus/_LegacyCallContextMenu.pcss b/apps/web/res/css/views/context_menus/_LegacyCallContextMenu.pcss similarity index 100% rename from res/css/views/context_menus/_LegacyCallContextMenu.pcss rename to apps/web/res/css/views/context_menus/_LegacyCallContextMenu.pcss diff --git a/res/css/views/dialogs/_AddExistingToSpaceDialog.pcss b/apps/web/res/css/views/dialogs/_AddExistingToSpaceDialog.pcss similarity index 100% rename from res/css/views/dialogs/_AddExistingToSpaceDialog.pcss rename to apps/web/res/css/views/dialogs/_AddExistingToSpaceDialog.pcss diff --git a/res/css/views/dialogs/_AnalyticsLearnMoreDialog.pcss b/apps/web/res/css/views/dialogs/_AnalyticsLearnMoreDialog.pcss similarity index 100% rename from res/css/views/dialogs/_AnalyticsLearnMoreDialog.pcss rename to apps/web/res/css/views/dialogs/_AnalyticsLearnMoreDialog.pcss diff --git a/res/css/views/dialogs/_BugReportDialog.pcss b/apps/web/res/css/views/dialogs/_BugReportDialog.pcss similarity index 100% rename from res/css/views/dialogs/_BugReportDialog.pcss rename to apps/web/res/css/views/dialogs/_BugReportDialog.pcss diff --git a/res/css/views/dialogs/_ChangelogDialog.pcss b/apps/web/res/css/views/dialogs/_ChangelogDialog.pcss similarity index 100% rename from res/css/views/dialogs/_ChangelogDialog.pcss rename to apps/web/res/css/views/dialogs/_ChangelogDialog.pcss diff --git a/res/css/views/dialogs/_CompoundDialog.pcss b/apps/web/res/css/views/dialogs/_CompoundDialog.pcss similarity index 100% rename from res/css/views/dialogs/_CompoundDialog.pcss rename to apps/web/res/css/views/dialogs/_CompoundDialog.pcss diff --git a/res/css/views/dialogs/_ConfirmKeyStorageOffDialog.pcss b/apps/web/res/css/views/dialogs/_ConfirmKeyStorageOffDialog.pcss similarity index 100% rename from res/css/views/dialogs/_ConfirmKeyStorageOffDialog.pcss rename to apps/web/res/css/views/dialogs/_ConfirmKeyStorageOffDialog.pcss diff --git a/res/css/views/dialogs/_ConfirmSpaceUserActionDialog.pcss b/apps/web/res/css/views/dialogs/_ConfirmSpaceUserActionDialog.pcss similarity index 100% rename from res/css/views/dialogs/_ConfirmSpaceUserActionDialog.pcss rename to apps/web/res/css/views/dialogs/_ConfirmSpaceUserActionDialog.pcss diff --git a/res/css/views/dialogs/_ConfirmUserActionDialog.pcss b/apps/web/res/css/views/dialogs/_ConfirmUserActionDialog.pcss similarity index 100% rename from res/css/views/dialogs/_ConfirmUserActionDialog.pcss rename to apps/web/res/css/views/dialogs/_ConfirmUserActionDialog.pcss diff --git a/res/css/views/dialogs/_CreateRoomDialog.pcss b/apps/web/res/css/views/dialogs/_CreateRoomDialog.pcss similarity index 100% rename from res/css/views/dialogs/_CreateRoomDialog.pcss rename to apps/web/res/css/views/dialogs/_CreateRoomDialog.pcss diff --git a/res/css/views/dialogs/_CreateSubspaceDialog.pcss b/apps/web/res/css/views/dialogs/_CreateSubspaceDialog.pcss similarity index 100% rename from res/css/views/dialogs/_CreateSubspaceDialog.pcss rename to apps/web/res/css/views/dialogs/_CreateSubspaceDialog.pcss diff --git a/res/css/views/dialogs/_Crypto.pcss b/apps/web/res/css/views/dialogs/_Crypto.pcss similarity index 100% rename from res/css/views/dialogs/_Crypto.pcss rename to apps/web/res/css/views/dialogs/_Crypto.pcss diff --git a/res/css/views/dialogs/_DeactivateAccountDialog.pcss b/apps/web/res/css/views/dialogs/_DeactivateAccountDialog.pcss similarity index 100% rename from res/css/views/dialogs/_DeactivateAccountDialog.pcss rename to apps/web/res/css/views/dialogs/_DeactivateAccountDialog.pcss diff --git a/res/css/views/dialogs/_DevtoolsDialog.pcss b/apps/web/res/css/views/dialogs/_DevtoolsDialog.pcss similarity index 100% rename from res/css/views/dialogs/_DevtoolsDialog.pcss rename to apps/web/res/css/views/dialogs/_DevtoolsDialog.pcss diff --git a/res/css/views/dialogs/_ExportDialog.pcss b/apps/web/res/css/views/dialogs/_ExportDialog.pcss similarity index 100% rename from res/css/views/dialogs/_ExportDialog.pcss rename to apps/web/res/css/views/dialogs/_ExportDialog.pcss diff --git a/res/css/views/dialogs/_FeedbackDialog.pcss b/apps/web/res/css/views/dialogs/_FeedbackDialog.pcss similarity index 100% rename from res/css/views/dialogs/_FeedbackDialog.pcss rename to apps/web/res/css/views/dialogs/_FeedbackDialog.pcss diff --git a/res/css/views/dialogs/_ForwardDialog.pcss b/apps/web/res/css/views/dialogs/_ForwardDialog.pcss similarity index 100% rename from res/css/views/dialogs/_ForwardDialog.pcss rename to apps/web/res/css/views/dialogs/_ForwardDialog.pcss diff --git a/res/css/views/dialogs/_GenericFeatureFeedbackDialog.pcss b/apps/web/res/css/views/dialogs/_GenericFeatureFeedbackDialog.pcss similarity index 100% rename from res/css/views/dialogs/_GenericFeatureFeedbackDialog.pcss rename to apps/web/res/css/views/dialogs/_GenericFeatureFeedbackDialog.pcss diff --git a/res/css/views/dialogs/_IncomingSasDialog.pcss b/apps/web/res/css/views/dialogs/_IncomingSasDialog.pcss similarity index 100% rename from res/css/views/dialogs/_IncomingSasDialog.pcss rename to apps/web/res/css/views/dialogs/_IncomingSasDialog.pcss diff --git a/res/css/views/dialogs/_InviteDialog.pcss b/apps/web/res/css/views/dialogs/_InviteDialog.pcss similarity index 100% rename from res/css/views/dialogs/_InviteDialog.pcss rename to apps/web/res/css/views/dialogs/_InviteDialog.pcss diff --git a/res/css/views/dialogs/_InviteProgressBody.pcss b/apps/web/res/css/views/dialogs/_InviteProgressBody.pcss similarity index 100% rename from res/css/views/dialogs/_InviteProgressBody.pcss rename to apps/web/res/css/views/dialogs/_InviteProgressBody.pcss diff --git a/res/css/views/dialogs/_JoinRuleDropdown.pcss b/apps/web/res/css/views/dialogs/_JoinRuleDropdown.pcss similarity index 100% rename from res/css/views/dialogs/_JoinRuleDropdown.pcss rename to apps/web/res/css/views/dialogs/_JoinRuleDropdown.pcss diff --git a/res/css/views/dialogs/_LeaveSpaceDialog.pcss b/apps/web/res/css/views/dialogs/_LeaveSpaceDialog.pcss similarity index 100% rename from res/css/views/dialogs/_LeaveSpaceDialog.pcss rename to apps/web/res/css/views/dialogs/_LeaveSpaceDialog.pcss diff --git a/res/css/views/dialogs/_LocationViewDialog.pcss b/apps/web/res/css/views/dialogs/_LocationViewDialog.pcss similarity index 100% rename from res/css/views/dialogs/_LocationViewDialog.pcss rename to apps/web/res/css/views/dialogs/_LocationViewDialog.pcss diff --git a/res/css/views/dialogs/_LogoutDialog.pcss b/apps/web/res/css/views/dialogs/_LogoutDialog.pcss similarity index 100% rename from res/css/views/dialogs/_LogoutDialog.pcss rename to apps/web/res/css/views/dialogs/_LogoutDialog.pcss diff --git a/res/css/views/dialogs/_ManageRestrictedJoinRuleDialog.pcss b/apps/web/res/css/views/dialogs/_ManageRestrictedJoinRuleDialog.pcss similarity index 100% rename from res/css/views/dialogs/_ManageRestrictedJoinRuleDialog.pcss rename to apps/web/res/css/views/dialogs/_ManageRestrictedJoinRuleDialog.pcss diff --git a/res/css/views/dialogs/_MessageEditHistoryDialog.pcss b/apps/web/res/css/views/dialogs/_MessageEditHistoryDialog.pcss similarity index 100% rename from res/css/views/dialogs/_MessageEditHistoryDialog.pcss rename to apps/web/res/css/views/dialogs/_MessageEditHistoryDialog.pcss diff --git a/res/css/views/dialogs/_ModalWidgetDialog.pcss b/apps/web/res/css/views/dialogs/_ModalWidgetDialog.pcss similarity index 100% rename from res/css/views/dialogs/_ModalWidgetDialog.pcss rename to apps/web/res/css/views/dialogs/_ModalWidgetDialog.pcss diff --git a/res/css/views/dialogs/_PollCreateDialog.pcss b/apps/web/res/css/views/dialogs/_PollCreateDialog.pcss similarity index 100% rename from res/css/views/dialogs/_PollCreateDialog.pcss rename to apps/web/res/css/views/dialogs/_PollCreateDialog.pcss diff --git a/res/css/views/dialogs/_RegistrationEmailPromptDialog.pcss b/apps/web/res/css/views/dialogs/_RegistrationEmailPromptDialog.pcss similarity index 100% rename from res/css/views/dialogs/_RegistrationEmailPromptDialog.pcss rename to apps/web/res/css/views/dialogs/_RegistrationEmailPromptDialog.pcss diff --git a/res/css/views/dialogs/_ReportRoomDialog.pcss b/apps/web/res/css/views/dialogs/_ReportRoomDialog.pcss similarity index 100% rename from res/css/views/dialogs/_ReportRoomDialog.pcss rename to apps/web/res/css/views/dialogs/_ReportRoomDialog.pcss diff --git a/res/css/views/dialogs/_RoomSettingsDialog.pcss b/apps/web/res/css/views/dialogs/_RoomSettingsDialog.pcss similarity index 100% rename from res/css/views/dialogs/_RoomSettingsDialog.pcss rename to apps/web/res/css/views/dialogs/_RoomSettingsDialog.pcss diff --git a/res/css/views/dialogs/_RoomSettingsDialogBridges.pcss b/apps/web/res/css/views/dialogs/_RoomSettingsDialogBridges.pcss similarity index 100% rename from res/css/views/dialogs/_RoomSettingsDialogBridges.pcss rename to apps/web/res/css/views/dialogs/_RoomSettingsDialogBridges.pcss diff --git a/res/css/views/dialogs/_RoomUpgradeDialog.pcss b/apps/web/res/css/views/dialogs/_RoomUpgradeDialog.pcss similarity index 100% rename from res/css/views/dialogs/_RoomUpgradeDialog.pcss rename to apps/web/res/css/views/dialogs/_RoomUpgradeDialog.pcss diff --git a/res/css/views/dialogs/_RoomUpgradeWarningDialog.pcss b/apps/web/res/css/views/dialogs/_RoomUpgradeWarningDialog.pcss similarity index 100% rename from res/css/views/dialogs/_RoomUpgradeWarningDialog.pcss rename to apps/web/res/css/views/dialogs/_RoomUpgradeWarningDialog.pcss diff --git a/res/css/views/dialogs/_ServerOfflineDialog.pcss b/apps/web/res/css/views/dialogs/_ServerOfflineDialog.pcss similarity index 100% rename from res/css/views/dialogs/_ServerOfflineDialog.pcss rename to apps/web/res/css/views/dialogs/_ServerOfflineDialog.pcss diff --git a/res/css/views/dialogs/_ServerPickerDialog.pcss b/apps/web/res/css/views/dialogs/_ServerPickerDialog.pcss similarity index 100% rename from res/css/views/dialogs/_ServerPickerDialog.pcss rename to apps/web/res/css/views/dialogs/_ServerPickerDialog.pcss diff --git a/res/css/views/dialogs/_SetEmailDialog.pcss b/apps/web/res/css/views/dialogs/_SetEmailDialog.pcss similarity index 100% rename from res/css/views/dialogs/_SetEmailDialog.pcss rename to apps/web/res/css/views/dialogs/_SetEmailDialog.pcss diff --git a/res/css/views/dialogs/_SettingsDialog.pcss b/apps/web/res/css/views/dialogs/_SettingsDialog.pcss similarity index 100% rename from res/css/views/dialogs/_SettingsDialog.pcss rename to apps/web/res/css/views/dialogs/_SettingsDialog.pcss diff --git a/res/css/views/dialogs/_ShareDialog.pcss b/apps/web/res/css/views/dialogs/_ShareDialog.pcss similarity index 100% rename from res/css/views/dialogs/_ShareDialog.pcss rename to apps/web/res/css/views/dialogs/_ShareDialog.pcss diff --git a/res/css/views/dialogs/_SlashCommandHelpDialog.pcss b/apps/web/res/css/views/dialogs/_SlashCommandHelpDialog.pcss similarity index 100% rename from res/css/views/dialogs/_SlashCommandHelpDialog.pcss rename to apps/web/res/css/views/dialogs/_SlashCommandHelpDialog.pcss diff --git a/res/css/views/dialogs/_SpacePreferencesDialog.pcss b/apps/web/res/css/views/dialogs/_SpacePreferencesDialog.pcss similarity index 100% rename from res/css/views/dialogs/_SpacePreferencesDialog.pcss rename to apps/web/res/css/views/dialogs/_SpacePreferencesDialog.pcss diff --git a/res/css/views/dialogs/_SpaceSettingsDialog.pcss b/apps/web/res/css/views/dialogs/_SpaceSettingsDialog.pcss similarity index 100% rename from res/css/views/dialogs/_SpaceSettingsDialog.pcss rename to apps/web/res/css/views/dialogs/_SpaceSettingsDialog.pcss diff --git a/res/css/views/dialogs/_SpotlightDialog.pcss b/apps/web/res/css/views/dialogs/_SpotlightDialog.pcss similarity index 100% rename from res/css/views/dialogs/_SpotlightDialog.pcss rename to apps/web/res/css/views/dialogs/_SpotlightDialog.pcss diff --git a/res/css/views/dialogs/_TermsDialog.pcss b/apps/web/res/css/views/dialogs/_TermsDialog.pcss similarity index 100% rename from res/css/views/dialogs/_TermsDialog.pcss rename to apps/web/res/css/views/dialogs/_TermsDialog.pcss diff --git a/res/css/views/dialogs/_UnpinAllDialog.pcss b/apps/web/res/css/views/dialogs/_UnpinAllDialog.pcss similarity index 100% rename from res/css/views/dialogs/_UnpinAllDialog.pcss rename to apps/web/res/css/views/dialogs/_UnpinAllDialog.pcss diff --git a/res/css/views/dialogs/_UntrustedDeviceDialog.pcss b/apps/web/res/css/views/dialogs/_UntrustedDeviceDialog.pcss similarity index 100% rename from res/css/views/dialogs/_UntrustedDeviceDialog.pcss rename to apps/web/res/css/views/dialogs/_UntrustedDeviceDialog.pcss diff --git a/res/css/views/dialogs/_UploadConfirmDialog.pcss b/apps/web/res/css/views/dialogs/_UploadConfirmDialog.pcss similarity index 100% rename from res/css/views/dialogs/_UploadConfirmDialog.pcss rename to apps/web/res/css/views/dialogs/_UploadConfirmDialog.pcss diff --git a/res/css/views/dialogs/_UserSettingsDialog.pcss b/apps/web/res/css/views/dialogs/_UserSettingsDialog.pcss similarity index 100% rename from res/css/views/dialogs/_UserSettingsDialog.pcss rename to apps/web/res/css/views/dialogs/_UserSettingsDialog.pcss diff --git a/res/css/views/dialogs/_VerifyEMailDialog.pcss b/apps/web/res/css/views/dialogs/_VerifyEMailDialog.pcss similarity index 100% rename from res/css/views/dialogs/_VerifyEMailDialog.pcss rename to apps/web/res/css/views/dialogs/_VerifyEMailDialog.pcss diff --git a/res/css/views/dialogs/_WidgetCapabilitiesPromptDialog.pcss b/apps/web/res/css/views/dialogs/_WidgetCapabilitiesPromptDialog.pcss similarity index 100% rename from res/css/views/dialogs/_WidgetCapabilitiesPromptDialog.pcss rename to apps/web/res/css/views/dialogs/_WidgetCapabilitiesPromptDialog.pcss diff --git a/res/css/views/dialogs/security/_AccessSecretStorageDialog.pcss b/apps/web/res/css/views/dialogs/security/_AccessSecretStorageDialog.pcss similarity index 100% rename from res/css/views/dialogs/security/_AccessSecretStorageDialog.pcss rename to apps/web/res/css/views/dialogs/security/_AccessSecretStorageDialog.pcss diff --git a/res/css/views/dialogs/security/_CreateCrossSigningDialog.pcss b/apps/web/res/css/views/dialogs/security/_CreateCrossSigningDialog.pcss similarity index 100% rename from res/css/views/dialogs/security/_CreateCrossSigningDialog.pcss rename to apps/web/res/css/views/dialogs/security/_CreateCrossSigningDialog.pcss diff --git a/res/css/views/dialogs/security/_CreateSecretStorageDialog.pcss b/apps/web/res/css/views/dialogs/security/_CreateSecretStorageDialog.pcss similarity index 100% rename from res/css/views/dialogs/security/_CreateSecretStorageDialog.pcss rename to apps/web/res/css/views/dialogs/security/_CreateSecretStorageDialog.pcss diff --git a/res/css/views/dialogs/security/_KeyBackupFailedDialog.pcss b/apps/web/res/css/views/dialogs/security/_KeyBackupFailedDialog.pcss similarity index 100% rename from res/css/views/dialogs/security/_KeyBackupFailedDialog.pcss rename to apps/web/res/css/views/dialogs/security/_KeyBackupFailedDialog.pcss diff --git a/res/css/views/dialogs/security/_RestoreKeyBackupDialog.pcss b/apps/web/res/css/views/dialogs/security/_RestoreKeyBackupDialog.pcss similarity index 100% rename from res/css/views/dialogs/security/_RestoreKeyBackupDialog.pcss rename to apps/web/res/css/views/dialogs/security/_RestoreKeyBackupDialog.pcss diff --git a/res/css/views/directory/_NetworkDropdown.pcss b/apps/web/res/css/views/directory/_NetworkDropdown.pcss similarity index 100% rename from res/css/views/directory/_NetworkDropdown.pcss rename to apps/web/res/css/views/directory/_NetworkDropdown.pcss diff --git a/res/css/views/elements/_AccessibleButton.pcss b/apps/web/res/css/views/elements/_AccessibleButton.pcss similarity index 100% rename from res/css/views/elements/_AccessibleButton.pcss rename to apps/web/res/css/views/elements/_AccessibleButton.pcss diff --git a/res/css/views/elements/_CopyableText.pcss b/apps/web/res/css/views/elements/_CopyableText.pcss similarity index 100% rename from res/css/views/elements/_CopyableText.pcss rename to apps/web/res/css/views/elements/_CopyableText.pcss diff --git a/res/css/views/elements/_DesktopCapturerSourcePicker.pcss b/apps/web/res/css/views/elements/_DesktopCapturerSourcePicker.pcss similarity index 100% rename from res/css/views/elements/_DesktopCapturerSourcePicker.pcss rename to apps/web/res/css/views/elements/_DesktopCapturerSourcePicker.pcss diff --git a/res/css/views/elements/_DialPadBackspaceButton.pcss b/apps/web/res/css/views/elements/_DialPadBackspaceButton.pcss similarity index 100% rename from res/css/views/elements/_DialPadBackspaceButton.pcss rename to apps/web/res/css/views/elements/_DialPadBackspaceButton.pcss diff --git a/res/css/views/elements/_Dropdown.pcss b/apps/web/res/css/views/elements/_Dropdown.pcss similarity index 100% rename from res/css/views/elements/_Dropdown.pcss rename to apps/web/res/css/views/elements/_Dropdown.pcss diff --git a/res/css/views/elements/_EditableItemList.pcss b/apps/web/res/css/views/elements/_EditableItemList.pcss similarity index 100% rename from res/css/views/elements/_EditableItemList.pcss rename to apps/web/res/css/views/elements/_EditableItemList.pcss diff --git a/res/css/views/elements/_ErrorBoundary.pcss b/apps/web/res/css/views/elements/_ErrorBoundary.pcss similarity index 100% rename from res/css/views/elements/_ErrorBoundary.pcss rename to apps/web/res/css/views/elements/_ErrorBoundary.pcss diff --git a/res/css/views/elements/_ExternalLink.pcss b/apps/web/res/css/views/elements/_ExternalLink.pcss similarity index 100% rename from res/css/views/elements/_ExternalLink.pcss rename to apps/web/res/css/views/elements/_ExternalLink.pcss diff --git a/res/css/views/elements/_FacePile.pcss b/apps/web/res/css/views/elements/_FacePile.pcss similarity index 100% rename from res/css/views/elements/_FacePile.pcss rename to apps/web/res/css/views/elements/_FacePile.pcss diff --git a/res/css/views/elements/_Field.pcss b/apps/web/res/css/views/elements/_Field.pcss similarity index 100% rename from res/css/views/elements/_Field.pcss rename to apps/web/res/css/views/elements/_Field.pcss diff --git a/res/css/views/elements/_GenericEventListSummary.pcss b/apps/web/res/css/views/elements/_GenericEventListSummary.pcss similarity index 100% rename from res/css/views/elements/_GenericEventListSummary.pcss rename to apps/web/res/css/views/elements/_GenericEventListSummary.pcss diff --git a/res/css/views/elements/_ImageView.pcss b/apps/web/res/css/views/elements/_ImageView.pcss similarity index 100% rename from res/css/views/elements/_ImageView.pcss rename to apps/web/res/css/views/elements/_ImageView.pcss diff --git a/res/css/views/elements/_InfoTooltip.pcss b/apps/web/res/css/views/elements/_InfoTooltip.pcss similarity index 100% rename from res/css/views/elements/_InfoTooltip.pcss rename to apps/web/res/css/views/elements/_InfoTooltip.pcss diff --git a/res/css/views/elements/_InlineSpinner.pcss b/apps/web/res/css/views/elements/_InlineSpinner.pcss similarity index 100% rename from res/css/views/elements/_InlineSpinner.pcss rename to apps/web/res/css/views/elements/_InlineSpinner.pcss diff --git a/res/css/views/elements/_InteractiveTooltip.pcss b/apps/web/res/css/views/elements/_InteractiveTooltip.pcss similarity index 100% rename from res/css/views/elements/_InteractiveTooltip.pcss rename to apps/web/res/css/views/elements/_InteractiveTooltip.pcss diff --git a/res/css/views/elements/_InviteReason.pcss b/apps/web/res/css/views/elements/_InviteReason.pcss similarity index 100% rename from res/css/views/elements/_InviteReason.pcss rename to apps/web/res/css/views/elements/_InviteReason.pcss diff --git a/res/css/views/elements/_LabelledCheckbox.pcss b/apps/web/res/css/views/elements/_LabelledCheckbox.pcss similarity index 100% rename from res/css/views/elements/_LabelledCheckbox.pcss rename to apps/web/res/css/views/elements/_LabelledCheckbox.pcss diff --git a/res/css/views/elements/_LanguageDropdown.pcss b/apps/web/res/css/views/elements/_LanguageDropdown.pcss similarity index 100% rename from res/css/views/elements/_LanguageDropdown.pcss rename to apps/web/res/css/views/elements/_LanguageDropdown.pcss diff --git a/res/css/views/elements/_MiniAvatarUploader.pcss b/apps/web/res/css/views/elements/_MiniAvatarUploader.pcss similarity index 100% rename from res/css/views/elements/_MiniAvatarUploader.pcss rename to apps/web/res/css/views/elements/_MiniAvatarUploader.pcss diff --git a/res/css/views/elements/_Pill.pcss b/apps/web/res/css/views/elements/_Pill.pcss similarity index 100% rename from res/css/views/elements/_Pill.pcss rename to apps/web/res/css/views/elements/_Pill.pcss diff --git a/res/css/views/elements/_PowerSelector.pcss b/apps/web/res/css/views/elements/_PowerSelector.pcss similarity index 100% rename from res/css/views/elements/_PowerSelector.pcss rename to apps/web/res/css/views/elements/_PowerSelector.pcss diff --git a/res/css/views/elements/_ProgressBar.pcss b/apps/web/res/css/views/elements/_ProgressBar.pcss similarity index 100% rename from res/css/views/elements/_ProgressBar.pcss rename to apps/web/res/css/views/elements/_ProgressBar.pcss diff --git a/res/css/views/elements/_QRCode.pcss b/apps/web/res/css/views/elements/_QRCode.pcss similarity index 100% rename from res/css/views/elements/_QRCode.pcss rename to apps/web/res/css/views/elements/_QRCode.pcss diff --git a/res/css/views/elements/_ReplyChain.pcss b/apps/web/res/css/views/elements/_ReplyChain.pcss similarity index 100% rename from res/css/views/elements/_ReplyChain.pcss rename to apps/web/res/css/views/elements/_ReplyChain.pcss diff --git a/res/css/views/elements/_ResizeHandle.pcss b/apps/web/res/css/views/elements/_ResizeHandle.pcss similarity index 100% rename from res/css/views/elements/_ResizeHandle.pcss rename to apps/web/res/css/views/elements/_ResizeHandle.pcss diff --git a/res/css/views/elements/_RichText.pcss b/apps/web/res/css/views/elements/_RichText.pcss similarity index 100% rename from res/css/views/elements/_RichText.pcss rename to apps/web/res/css/views/elements/_RichText.pcss diff --git a/res/css/views/elements/_RoomAliasField.pcss b/apps/web/res/css/views/elements/_RoomAliasField.pcss similarity index 100% rename from res/css/views/elements/_RoomAliasField.pcss rename to apps/web/res/css/views/elements/_RoomAliasField.pcss diff --git a/apps/web/res/css/views/elements/_SSOButtons.pcss b/apps/web/res/css/views/elements/_SSOButtons.pcss new file mode 100644 index 0000000000..2108b56c40 --- /dev/null +++ b/apps/web/res/css/views/elements/_SSOButtons.pcss @@ -0,0 +1,47 @@ +/* +Copyright 2024 New Vector Ltd. +Copyright 2020 The Matrix.org Foundation C.I.C. + +SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. +*/ + +.mx_SSOButtons { + display: flex; + flex-wrap: wrap; + justify-content: center; + + .mx_SSOButtons_row + .mx_SSOButtons_row { + margin-top: 16px; + } + + .mx_SSOButton { + position: relative; + width: 100%; + display: inline-block; + + svg, + img { + width: 24px; + height: 24px; + object-fit: contain; + position: absolute; + left: 8px; + top: 4px; + color: var(--cpd-color-icon-primary); + } + } + + .mx_SSOButton_mini { + svg, + img { + /* 30px parent, 24px self */ + padding: 3px; + position: unset; + } + + & + .mx_SSOButton_mini { + margin-left: 16px; + } + } +} diff --git a/res/css/views/elements/_SearchWarning.pcss b/apps/web/res/css/views/elements/_SearchWarning.pcss similarity index 100% rename from res/css/views/elements/_SearchWarning.pcss rename to apps/web/res/css/views/elements/_SearchWarning.pcss diff --git a/res/css/views/elements/_ServerPicker.pcss b/apps/web/res/css/views/elements/_ServerPicker.pcss similarity index 100% rename from res/css/views/elements/_ServerPicker.pcss rename to apps/web/res/css/views/elements/_ServerPicker.pcss diff --git a/res/css/views/elements/_SettingsDropdown.pcss b/apps/web/res/css/views/elements/_SettingsDropdown.pcss similarity index 100% rename from res/css/views/elements/_SettingsDropdown.pcss rename to apps/web/res/css/views/elements/_SettingsDropdown.pcss diff --git a/res/css/views/elements/_SettingsFlag.pcss b/apps/web/res/css/views/elements/_SettingsFlag.pcss similarity index 100% rename from res/css/views/elements/_SettingsFlag.pcss rename to apps/web/res/css/views/elements/_SettingsFlag.pcss diff --git a/res/css/views/elements/_Spinner.pcss b/apps/web/res/css/views/elements/_Spinner.pcss similarity index 100% rename from res/css/views/elements/_Spinner.pcss rename to apps/web/res/css/views/elements/_Spinner.pcss diff --git a/res/css/views/elements/_StyledRadioButton.pcss b/apps/web/res/css/views/elements/_StyledRadioButton.pcss similarity index 100% rename from res/css/views/elements/_StyledRadioButton.pcss rename to apps/web/res/css/views/elements/_StyledRadioButton.pcss diff --git a/res/css/views/elements/_SyntaxHighlight.pcss b/apps/web/res/css/views/elements/_SyntaxHighlight.pcss similarity index 100% rename from res/css/views/elements/_SyntaxHighlight.pcss rename to apps/web/res/css/views/elements/_SyntaxHighlight.pcss diff --git a/res/css/views/elements/_TagComposer.pcss b/apps/web/res/css/views/elements/_TagComposer.pcss similarity index 100% rename from res/css/views/elements/_TagComposer.pcss rename to apps/web/res/css/views/elements/_TagComposer.pcss diff --git a/res/css/views/elements/_TextWithTooltip.pcss b/apps/web/res/css/views/elements/_TextWithTooltip.pcss similarity index 100% rename from res/css/views/elements/_TextWithTooltip.pcss rename to apps/web/res/css/views/elements/_TextWithTooltip.pcss diff --git a/res/css/views/elements/_ToggleSwitch.pcss b/apps/web/res/css/views/elements/_ToggleSwitch.pcss similarity index 100% rename from res/css/views/elements/_ToggleSwitch.pcss rename to apps/web/res/css/views/elements/_ToggleSwitch.pcss diff --git a/res/css/views/elements/_Validation.pcss b/apps/web/res/css/views/elements/_Validation.pcss similarity index 100% rename from res/css/views/elements/_Validation.pcss rename to apps/web/res/css/views/elements/_Validation.pcss diff --git a/res/css/views/emojipicker/_EmojiPicker.pcss b/apps/web/res/css/views/emojipicker/_EmojiPicker.pcss similarity index 100% rename from res/css/views/emojipicker/_EmojiPicker.pcss rename to apps/web/res/css/views/emojipicker/_EmojiPicker.pcss diff --git a/res/css/views/location/_LocationPicker.pcss b/apps/web/res/css/views/location/_LocationPicker.pcss similarity index 100% rename from res/css/views/location/_LocationPicker.pcss rename to apps/web/res/css/views/location/_LocationPicker.pcss diff --git a/res/css/views/messages/_CallEvent.pcss b/apps/web/res/css/views/messages/_CallEvent.pcss similarity index 100% rename from res/css/views/messages/_CallEvent.pcss rename to apps/web/res/css/views/messages/_CallEvent.pcss diff --git a/res/css/views/messages/_CreateEvent.pcss b/apps/web/res/css/views/messages/_CreateEvent.pcss similarity index 100% rename from res/css/views/messages/_CreateEvent.pcss rename to apps/web/res/css/views/messages/_CreateEvent.pcss diff --git a/res/css/views/messages/_DateSeparator.pcss b/apps/web/res/css/views/messages/_DateSeparator.pcss similarity index 100% rename from res/css/views/messages/_DateSeparator.pcss rename to apps/web/res/css/views/messages/_DateSeparator.pcss diff --git a/res/css/views/messages/_DisambiguatedProfile.pcss b/apps/web/res/css/views/messages/_DisambiguatedProfile.pcss similarity index 100% rename from res/css/views/messages/_DisambiguatedProfile.pcss rename to apps/web/res/css/views/messages/_DisambiguatedProfile.pcss diff --git a/res/css/views/messages/_HiddenBody.pcss b/apps/web/res/css/views/messages/_HiddenBody.pcss similarity index 100% rename from res/css/views/messages/_HiddenBody.pcss rename to apps/web/res/css/views/messages/_HiddenBody.pcss diff --git a/res/css/views/messages/_HiddenMediaPlaceholder.pcss b/apps/web/res/css/views/messages/_HiddenMediaPlaceholder.pcss similarity index 100% rename from res/css/views/messages/_HiddenMediaPlaceholder.pcss rename to apps/web/res/css/views/messages/_HiddenMediaPlaceholder.pcss diff --git a/res/css/views/messages/_JumpToDatePicker.pcss b/apps/web/res/css/views/messages/_JumpToDatePicker.pcss similarity index 100% rename from res/css/views/messages/_JumpToDatePicker.pcss rename to apps/web/res/css/views/messages/_JumpToDatePicker.pcss diff --git a/res/css/views/messages/_LegacyCallEvent.pcss b/apps/web/res/css/views/messages/_LegacyCallEvent.pcss similarity index 100% rename from res/css/views/messages/_LegacyCallEvent.pcss rename to apps/web/res/css/views/messages/_LegacyCallEvent.pcss diff --git a/res/css/views/messages/_MEmoteBody.pcss b/apps/web/res/css/views/messages/_MEmoteBody.pcss similarity index 100% rename from res/css/views/messages/_MEmoteBody.pcss rename to apps/web/res/css/views/messages/_MEmoteBody.pcss diff --git a/res/css/views/messages/_MFileBody.pcss b/apps/web/res/css/views/messages/_MFileBody.pcss similarity index 100% rename from res/css/views/messages/_MFileBody.pcss rename to apps/web/res/css/views/messages/_MFileBody.pcss diff --git a/res/css/views/messages/_MImageBody.pcss b/apps/web/res/css/views/messages/_MImageBody.pcss similarity index 100% rename from res/css/views/messages/_MImageBody.pcss rename to apps/web/res/css/views/messages/_MImageBody.pcss diff --git a/res/css/views/messages/_MImageReplyBody.pcss b/apps/web/res/css/views/messages/_MImageReplyBody.pcss similarity index 100% rename from res/css/views/messages/_MImageReplyBody.pcss rename to apps/web/res/css/views/messages/_MImageReplyBody.pcss diff --git a/res/css/views/messages/_MJitsiWidgetEvent.pcss b/apps/web/res/css/views/messages/_MJitsiWidgetEvent.pcss similarity index 100% rename from res/css/views/messages/_MJitsiWidgetEvent.pcss rename to apps/web/res/css/views/messages/_MJitsiWidgetEvent.pcss diff --git a/res/css/views/messages/_MLocationBody.pcss b/apps/web/res/css/views/messages/_MLocationBody.pcss similarity index 100% rename from res/css/views/messages/_MLocationBody.pcss rename to apps/web/res/css/views/messages/_MLocationBody.pcss diff --git a/res/css/views/messages/_MNoticeBody.pcss b/apps/web/res/css/views/messages/_MNoticeBody.pcss similarity index 100% rename from res/css/views/messages/_MNoticeBody.pcss rename to apps/web/res/css/views/messages/_MNoticeBody.pcss diff --git a/res/css/views/messages/_MPollBody.pcss b/apps/web/res/css/views/messages/_MPollBody.pcss similarity index 100% rename from res/css/views/messages/_MPollBody.pcss rename to apps/web/res/css/views/messages/_MPollBody.pcss diff --git a/res/css/views/messages/_MStickerBody.pcss b/apps/web/res/css/views/messages/_MStickerBody.pcss similarity index 100% rename from res/css/views/messages/_MStickerBody.pcss rename to apps/web/res/css/views/messages/_MStickerBody.pcss diff --git a/res/css/views/messages/_MTextBody.pcss b/apps/web/res/css/views/messages/_MTextBody.pcss similarity index 100% rename from res/css/views/messages/_MTextBody.pcss rename to apps/web/res/css/views/messages/_MTextBody.pcss diff --git a/res/css/views/messages/_MVideoBody.pcss b/apps/web/res/css/views/messages/_MVideoBody.pcss similarity index 100% rename from res/css/views/messages/_MVideoBody.pcss rename to apps/web/res/css/views/messages/_MVideoBody.pcss diff --git a/res/css/views/messages/_MediaBody.pcss b/apps/web/res/css/views/messages/_MediaBody.pcss similarity index 100% rename from res/css/views/messages/_MediaBody.pcss rename to apps/web/res/css/views/messages/_MediaBody.pcss diff --git a/res/css/views/messages/_MessageActionBar.pcss b/apps/web/res/css/views/messages/_MessageActionBar.pcss similarity index 100% rename from res/css/views/messages/_MessageActionBar.pcss rename to apps/web/res/css/views/messages/_MessageActionBar.pcss diff --git a/res/css/views/messages/_MjolnirBody.pcss b/apps/web/res/css/views/messages/_MjolnirBody.pcss similarity index 100% rename from res/css/views/messages/_MjolnirBody.pcss rename to apps/web/res/css/views/messages/_MjolnirBody.pcss diff --git a/res/css/views/messages/_PinnedMessageBadge.pcss b/apps/web/res/css/views/messages/_PinnedMessageBadge.pcss similarity index 100% rename from res/css/views/messages/_PinnedMessageBadge.pcss rename to apps/web/res/css/views/messages/_PinnedMessageBadge.pcss diff --git a/res/css/views/messages/_ReactionsRow.pcss b/apps/web/res/css/views/messages/_ReactionsRow.pcss similarity index 100% rename from res/css/views/messages/_ReactionsRow.pcss rename to apps/web/res/css/views/messages/_ReactionsRow.pcss diff --git a/res/css/views/messages/_RedactedBody.pcss b/apps/web/res/css/views/messages/_RedactedBody.pcss similarity index 100% rename from res/css/views/messages/_RedactedBody.pcss rename to apps/web/res/css/views/messages/_RedactedBody.pcss diff --git a/res/css/views/messages/_RoomAvatarEvent.pcss b/apps/web/res/css/views/messages/_RoomAvatarEvent.pcss similarity index 100% rename from res/css/views/messages/_RoomAvatarEvent.pcss rename to apps/web/res/css/views/messages/_RoomAvatarEvent.pcss diff --git a/res/css/views/messages/_TextualEvent.pcss b/apps/web/res/css/views/messages/_TextualEvent.pcss similarity index 100% rename from res/css/views/messages/_TextualEvent.pcss rename to apps/web/res/css/views/messages/_TextualEvent.pcss diff --git a/res/css/views/messages/_UnknownBody.pcss b/apps/web/res/css/views/messages/_UnknownBody.pcss similarity index 100% rename from res/css/views/messages/_UnknownBody.pcss rename to apps/web/res/css/views/messages/_UnknownBody.pcss diff --git a/res/css/views/messages/_ViewSourceEvent.pcss b/apps/web/res/css/views/messages/_ViewSourceEvent.pcss similarity index 100% rename from res/css/views/messages/_ViewSourceEvent.pcss rename to apps/web/res/css/views/messages/_ViewSourceEvent.pcss diff --git a/res/css/views/messages/_common_CryptoEvent.pcss b/apps/web/res/css/views/messages/_common_CryptoEvent.pcss similarity index 100% rename from res/css/views/messages/_common_CryptoEvent.pcss rename to apps/web/res/css/views/messages/_common_CryptoEvent.pcss diff --git a/res/css/views/polls/pollHistory/_PollHistory.pcss b/apps/web/res/css/views/polls/pollHistory/_PollHistory.pcss similarity index 100% rename from res/css/views/polls/pollHistory/_PollHistory.pcss rename to apps/web/res/css/views/polls/pollHistory/_PollHistory.pcss diff --git a/res/css/views/polls/pollHistory/_PollHistoryList.pcss b/apps/web/res/css/views/polls/pollHistory/_PollHistoryList.pcss similarity index 100% rename from res/css/views/polls/pollHistory/_PollHistoryList.pcss rename to apps/web/res/css/views/polls/pollHistory/_PollHistoryList.pcss diff --git a/res/css/views/right_panel/_BaseCard.pcss b/apps/web/res/css/views/right_panel/_BaseCard.pcss similarity index 100% rename from res/css/views/right_panel/_BaseCard.pcss rename to apps/web/res/css/views/right_panel/_BaseCard.pcss diff --git a/res/css/views/right_panel/_EmptyState.pcss b/apps/web/res/css/views/right_panel/_EmptyState.pcss similarity index 100% rename from res/css/views/right_panel/_EmptyState.pcss rename to apps/web/res/css/views/right_panel/_EmptyState.pcss diff --git a/res/css/views/right_panel/_EncryptionInfo.pcss b/apps/web/res/css/views/right_panel/_EncryptionInfo.pcss similarity index 100% rename from res/css/views/right_panel/_EncryptionInfo.pcss rename to apps/web/res/css/views/right_panel/_EncryptionInfo.pcss diff --git a/res/css/views/right_panel/_ExtensionsCard.pcss b/apps/web/res/css/views/right_panel/_ExtensionsCard.pcss similarity index 100% rename from res/css/views/right_panel/_ExtensionsCard.pcss rename to apps/web/res/css/views/right_panel/_ExtensionsCard.pcss diff --git a/res/css/views/right_panel/_PinnedMessagesCard.pcss b/apps/web/res/css/views/right_panel/_PinnedMessagesCard.pcss similarity index 100% rename from res/css/views/right_panel/_PinnedMessagesCard.pcss rename to apps/web/res/css/views/right_panel/_PinnedMessagesCard.pcss diff --git a/res/css/views/right_panel/_RoomSummaryCard.pcss b/apps/web/res/css/views/right_panel/_RoomSummaryCard.pcss similarity index 100% rename from res/css/views/right_panel/_RoomSummaryCard.pcss rename to apps/web/res/css/views/right_panel/_RoomSummaryCard.pcss diff --git a/res/css/views/right_panel/_ThreadPanel.pcss b/apps/web/res/css/views/right_panel/_ThreadPanel.pcss similarity index 100% rename from res/css/views/right_panel/_ThreadPanel.pcss rename to apps/web/res/css/views/right_panel/_ThreadPanel.pcss diff --git a/res/css/views/right_panel/_TimelineCard.pcss b/apps/web/res/css/views/right_panel/_TimelineCard.pcss similarity index 100% rename from res/css/views/right_panel/_TimelineCard.pcss rename to apps/web/res/css/views/right_panel/_TimelineCard.pcss diff --git a/res/css/views/right_panel/_UserInfo.pcss b/apps/web/res/css/views/right_panel/_UserInfo.pcss similarity index 100% rename from res/css/views/right_panel/_UserInfo.pcss rename to apps/web/res/css/views/right_panel/_UserInfo.pcss diff --git a/res/css/views/right_panel/_VerificationPanel.pcss b/apps/web/res/css/views/right_panel/_VerificationPanel.pcss similarity index 100% rename from res/css/views/right_panel/_VerificationPanel.pcss rename to apps/web/res/css/views/right_panel/_VerificationPanel.pcss diff --git a/res/css/views/right_panel/_WidgetCard.pcss b/apps/web/res/css/views/right_panel/_WidgetCard.pcss similarity index 100% rename from res/css/views/right_panel/_WidgetCard.pcss rename to apps/web/res/css/views/right_panel/_WidgetCard.pcss diff --git a/res/css/views/room_settings/_AliasSettings.pcss b/apps/web/res/css/views/room_settings/_AliasSettings.pcss similarity index 100% rename from res/css/views/room_settings/_AliasSettings.pcss rename to apps/web/res/css/views/room_settings/_AliasSettings.pcss diff --git a/res/css/views/rooms/RoomListPanel/_RoomListPanel.pcss b/apps/web/res/css/views/rooms/RoomListPanel/_RoomListPanel.pcss similarity index 100% rename from res/css/views/rooms/RoomListPanel/_RoomListPanel.pcss rename to apps/web/res/css/views/rooms/RoomListPanel/_RoomListPanel.pcss diff --git a/res/css/views/rooms/_AppsDrawer.pcss b/apps/web/res/css/views/rooms/_AppsDrawer.pcss similarity index 100% rename from res/css/views/rooms/_AppsDrawer.pcss rename to apps/web/res/css/views/rooms/_AppsDrawer.pcss diff --git a/res/css/views/rooms/_Autocomplete.pcss b/apps/web/res/css/views/rooms/_Autocomplete.pcss similarity index 100% rename from res/css/views/rooms/_Autocomplete.pcss rename to apps/web/res/css/views/rooms/_Autocomplete.pcss diff --git a/res/css/views/rooms/_AuxPanel.pcss b/apps/web/res/css/views/rooms/_AuxPanel.pcss similarity index 100% rename from res/css/views/rooms/_AuxPanel.pcss rename to apps/web/res/css/views/rooms/_AuxPanel.pcss diff --git a/res/css/views/rooms/_BasicMessageComposer.pcss b/apps/web/res/css/views/rooms/_BasicMessageComposer.pcss similarity index 100% rename from res/css/views/rooms/_BasicMessageComposer.pcss rename to apps/web/res/css/views/rooms/_BasicMessageComposer.pcss diff --git a/res/css/views/rooms/_CallGuestLinkButton.pcss b/apps/web/res/css/views/rooms/_CallGuestLinkButton.pcss similarity index 100% rename from res/css/views/rooms/_CallGuestLinkButton.pcss rename to apps/web/res/css/views/rooms/_CallGuestLinkButton.pcss diff --git a/res/css/views/rooms/_E2EIcon.pcss b/apps/web/res/css/views/rooms/_E2EIcon.pcss similarity index 100% rename from res/css/views/rooms/_E2EIcon.pcss rename to apps/web/res/css/views/rooms/_E2EIcon.pcss diff --git a/res/css/views/rooms/_E2EIconView.pcss b/apps/web/res/css/views/rooms/_E2EIconView.pcss similarity index 100% rename from res/css/views/rooms/_E2EIconView.pcss rename to apps/web/res/css/views/rooms/_E2EIconView.pcss diff --git a/res/css/views/rooms/_EditMessageComposer.pcss b/apps/web/res/css/views/rooms/_EditMessageComposer.pcss similarity index 100% rename from res/css/views/rooms/_EditMessageComposer.pcss rename to apps/web/res/css/views/rooms/_EditMessageComposer.pcss diff --git a/res/css/views/rooms/_EmojiButton.pcss b/apps/web/res/css/views/rooms/_EmojiButton.pcss similarity index 100% rename from res/css/views/rooms/_EmojiButton.pcss rename to apps/web/res/css/views/rooms/_EmojiButton.pcss diff --git a/res/css/views/rooms/_EventBubbleTile.pcss b/apps/web/res/css/views/rooms/_EventBubbleTile.pcss similarity index 99% rename from res/css/views/rooms/_EventBubbleTile.pcss rename to apps/web/res/css/views/rooms/_EventBubbleTile.pcss index 24cd126728..d7c88982db 100644 --- a/res/css/views/rooms/_EventBubbleTile.pcss +++ b/apps/web/res/css/views/rooms/_EventBubbleTile.pcss @@ -38,7 +38,7 @@ Please see LICENSE files in the repository root for full details. .mx_MessageTimestamp { width: unset; /* Cancel the default width */ - max-width: var(--MessageTimestamp-max-width); + max-width: 80px; } .mx_ThreadSummary { diff --git a/res/css/views/rooms/_EventPreview.pcss b/apps/web/res/css/views/rooms/_EventPreview.pcss similarity index 100% rename from res/css/views/rooms/_EventPreview.pcss rename to apps/web/res/css/views/rooms/_EventPreview.pcss diff --git a/res/css/views/rooms/_EventTile.pcss b/apps/web/res/css/views/rooms/_EventTile.pcss similarity index 99% rename from res/css/views/rooms/_EventTile.pcss rename to apps/web/res/css/views/rooms/_EventTile.pcss index cc532079b6..59bb2d23d0 100644 --- a/res/css/views/rooms/_EventTile.pcss +++ b/apps/web/res/css/views/rooms/_EventTile.pcss @@ -66,6 +66,13 @@ $left-gutter: 64px; } } + .mx_MessageTimestamp_lateIcon { + position: absolute; + right: 100%; + top: var(--cpd-space-1x); + color: var(--cpd-color-text-secondary); + } + .mx_EventTileBubble { margin-block: var(--EventTileBubble_margin-block); min-width: 100px; diff --git a/res/css/views/rooms/_HistoryTile.pcss b/apps/web/res/css/views/rooms/_HistoryTile.pcss similarity index 100% rename from res/css/views/rooms/_HistoryTile.pcss rename to apps/web/res/css/views/rooms/_HistoryTile.pcss diff --git a/res/css/views/rooms/_IRCLayout.pcss b/apps/web/res/css/views/rooms/_IRCLayout.pcss similarity index 100% rename from res/css/views/rooms/_IRCLayout.pcss rename to apps/web/res/css/views/rooms/_IRCLayout.pcss diff --git a/res/css/views/rooms/_InvitedIconView.pcss b/apps/web/res/css/views/rooms/_InvitedIconView.pcss similarity index 100% rename from res/css/views/rooms/_InvitedIconView.pcss rename to apps/web/res/css/views/rooms/_InvitedIconView.pcss diff --git a/res/css/views/rooms/_JumpToBottomButton.pcss b/apps/web/res/css/views/rooms/_JumpToBottomButton.pcss similarity index 100% rename from res/css/views/rooms/_JumpToBottomButton.pcss rename to apps/web/res/css/views/rooms/_JumpToBottomButton.pcss diff --git a/res/css/views/rooms/_LegacyRoomList.pcss b/apps/web/res/css/views/rooms/_LegacyRoomList.pcss similarity index 100% rename from res/css/views/rooms/_LegacyRoomList.pcss rename to apps/web/res/css/views/rooms/_LegacyRoomList.pcss diff --git a/res/css/views/rooms/_LegacyRoomListHeader.pcss b/apps/web/res/css/views/rooms/_LegacyRoomListHeader.pcss similarity index 100% rename from res/css/views/rooms/_LegacyRoomListHeader.pcss rename to apps/web/res/css/views/rooms/_LegacyRoomListHeader.pcss diff --git a/res/css/views/rooms/_LinkPreviewGroup.pcss b/apps/web/res/css/views/rooms/_LinkPreviewGroup.pcss similarity index 100% rename from res/css/views/rooms/_LinkPreviewGroup.pcss rename to apps/web/res/css/views/rooms/_LinkPreviewGroup.pcss diff --git a/res/css/views/rooms/_LinkPreviewWidget.pcss b/apps/web/res/css/views/rooms/_LinkPreviewWidget.pcss similarity index 100% rename from res/css/views/rooms/_LinkPreviewWidget.pcss rename to apps/web/res/css/views/rooms/_LinkPreviewWidget.pcss diff --git a/res/css/views/rooms/_LiveContentSummary.pcss b/apps/web/res/css/views/rooms/_LiveContentSummary.pcss similarity index 100% rename from res/css/views/rooms/_LiveContentSummary.pcss rename to apps/web/res/css/views/rooms/_LiveContentSummary.pcss diff --git a/res/css/views/rooms/_MemberListHeaderView.pcss b/apps/web/res/css/views/rooms/_MemberListHeaderView.pcss similarity index 100% rename from res/css/views/rooms/_MemberListHeaderView.pcss rename to apps/web/res/css/views/rooms/_MemberListHeaderView.pcss diff --git a/res/css/views/rooms/_MemberListView.pcss b/apps/web/res/css/views/rooms/_MemberListView.pcss similarity index 100% rename from res/css/views/rooms/_MemberListView.pcss rename to apps/web/res/css/views/rooms/_MemberListView.pcss diff --git a/res/css/views/rooms/_MemberTileView.pcss b/apps/web/res/css/views/rooms/_MemberTileView.pcss similarity index 100% rename from res/css/views/rooms/_MemberTileView.pcss rename to apps/web/res/css/views/rooms/_MemberTileView.pcss diff --git a/res/css/views/rooms/_MessageComposer.pcss b/apps/web/res/css/views/rooms/_MessageComposer.pcss similarity index 100% rename from res/css/views/rooms/_MessageComposer.pcss rename to apps/web/res/css/views/rooms/_MessageComposer.pcss diff --git a/res/css/views/rooms/_MessageComposerFormatBar.pcss b/apps/web/res/css/views/rooms/_MessageComposerFormatBar.pcss similarity index 100% rename from res/css/views/rooms/_MessageComposerFormatBar.pcss rename to apps/web/res/css/views/rooms/_MessageComposerFormatBar.pcss diff --git a/res/css/views/rooms/_NewRoomIntro.pcss b/apps/web/res/css/views/rooms/_NewRoomIntro.pcss similarity index 100% rename from res/css/views/rooms/_NewRoomIntro.pcss rename to apps/web/res/css/views/rooms/_NewRoomIntro.pcss diff --git a/res/css/views/rooms/_NotificationBadge.pcss b/apps/web/res/css/views/rooms/_NotificationBadge.pcss similarity index 100% rename from res/css/views/rooms/_NotificationBadge.pcss rename to apps/web/res/css/views/rooms/_NotificationBadge.pcss diff --git a/res/css/views/rooms/_OverflowTile.pcss b/apps/web/res/css/views/rooms/_OverflowTile.pcss similarity index 100% rename from res/css/views/rooms/_OverflowTile.pcss rename to apps/web/res/css/views/rooms/_OverflowTile.pcss diff --git a/res/css/views/rooms/_PinnedEventTile.pcss b/apps/web/res/css/views/rooms/_PinnedEventTile.pcss similarity index 100% rename from res/css/views/rooms/_PinnedEventTile.pcss rename to apps/web/res/css/views/rooms/_PinnedEventTile.pcss diff --git a/res/css/views/rooms/_PinnedMessageBanner.pcss b/apps/web/res/css/views/rooms/_PinnedMessageBanner.pcss similarity index 100% rename from res/css/views/rooms/_PinnedMessageBanner.pcss rename to apps/web/res/css/views/rooms/_PinnedMessageBanner.pcss diff --git a/res/css/views/rooms/_PresenceIconView.pcss b/apps/web/res/css/views/rooms/_PresenceIconView.pcss similarity index 100% rename from res/css/views/rooms/_PresenceIconView.pcss rename to apps/web/res/css/views/rooms/_PresenceIconView.pcss diff --git a/res/css/views/rooms/_PresenceLabel.pcss b/apps/web/res/css/views/rooms/_PresenceLabel.pcss similarity index 100% rename from res/css/views/rooms/_PresenceLabel.pcss rename to apps/web/res/css/views/rooms/_PresenceLabel.pcss diff --git a/res/css/views/rooms/_ReadReceiptGroup.pcss b/apps/web/res/css/views/rooms/_ReadReceiptGroup.pcss similarity index 100% rename from res/css/views/rooms/_ReadReceiptGroup.pcss rename to apps/web/res/css/views/rooms/_ReadReceiptGroup.pcss diff --git a/res/css/views/rooms/_ReplyPreview.pcss b/apps/web/res/css/views/rooms/_ReplyPreview.pcss similarity index 100% rename from res/css/views/rooms/_ReplyPreview.pcss rename to apps/web/res/css/views/rooms/_ReplyPreview.pcss diff --git a/res/css/views/rooms/_ReplyTile.pcss b/apps/web/res/css/views/rooms/_ReplyTile.pcss similarity index 100% rename from res/css/views/rooms/_ReplyTile.pcss rename to apps/web/res/css/views/rooms/_ReplyTile.pcss diff --git a/res/css/views/rooms/_RoomBreadcrumbs.pcss b/apps/web/res/css/views/rooms/_RoomBreadcrumbs.pcss similarity index 100% rename from res/css/views/rooms/_RoomBreadcrumbs.pcss rename to apps/web/res/css/views/rooms/_RoomBreadcrumbs.pcss diff --git a/res/css/views/rooms/_RoomCallBanner.pcss b/apps/web/res/css/views/rooms/_RoomCallBanner.pcss similarity index 100% rename from res/css/views/rooms/_RoomCallBanner.pcss rename to apps/web/res/css/views/rooms/_RoomCallBanner.pcss diff --git a/res/css/views/rooms/_RoomHeader.pcss b/apps/web/res/css/views/rooms/_RoomHeader.pcss similarity index 100% rename from res/css/views/rooms/_RoomHeader.pcss rename to apps/web/res/css/views/rooms/_RoomHeader.pcss diff --git a/res/css/views/rooms/_RoomInfoLine.pcss b/apps/web/res/css/views/rooms/_RoomInfoLine.pcss similarity index 100% rename from res/css/views/rooms/_RoomInfoLine.pcss rename to apps/web/res/css/views/rooms/_RoomInfoLine.pcss diff --git a/res/css/views/rooms/_RoomKnocksBar.pcss b/apps/web/res/css/views/rooms/_RoomKnocksBar.pcss similarity index 100% rename from res/css/views/rooms/_RoomKnocksBar.pcss rename to apps/web/res/css/views/rooms/_RoomKnocksBar.pcss diff --git a/res/css/views/rooms/_RoomPreviewBar.pcss b/apps/web/res/css/views/rooms/_RoomPreviewBar.pcss similarity index 100% rename from res/css/views/rooms/_RoomPreviewBar.pcss rename to apps/web/res/css/views/rooms/_RoomPreviewBar.pcss diff --git a/res/css/views/rooms/_RoomPreviewCard.pcss b/apps/web/res/css/views/rooms/_RoomPreviewCard.pcss similarity index 100% rename from res/css/views/rooms/_RoomPreviewCard.pcss rename to apps/web/res/css/views/rooms/_RoomPreviewCard.pcss diff --git a/res/css/views/rooms/_RoomSearchAuxPanel.pcss b/apps/web/res/css/views/rooms/_RoomSearchAuxPanel.pcss similarity index 100% rename from res/css/views/rooms/_RoomSearchAuxPanel.pcss rename to apps/web/res/css/views/rooms/_RoomSearchAuxPanel.pcss diff --git a/res/css/views/rooms/_RoomSublist.pcss b/apps/web/res/css/views/rooms/_RoomSublist.pcss similarity index 100% rename from res/css/views/rooms/_RoomSublist.pcss rename to apps/web/res/css/views/rooms/_RoomSublist.pcss diff --git a/res/css/views/rooms/_RoomTile.pcss b/apps/web/res/css/views/rooms/_RoomTile.pcss similarity index 100% rename from res/css/views/rooms/_RoomTile.pcss rename to apps/web/res/css/views/rooms/_RoomTile.pcss diff --git a/res/css/views/rooms/_RoomUpgradeWarningBar.pcss b/apps/web/res/css/views/rooms/_RoomUpgradeWarningBar.pcss similarity index 100% rename from res/css/views/rooms/_RoomUpgradeWarningBar.pcss rename to apps/web/res/css/views/rooms/_RoomUpgradeWarningBar.pcss diff --git a/res/css/views/rooms/_SendMessageComposer.pcss b/apps/web/res/css/views/rooms/_SendMessageComposer.pcss similarity index 100% rename from res/css/views/rooms/_SendMessageComposer.pcss rename to apps/web/res/css/views/rooms/_SendMessageComposer.pcss diff --git a/res/css/views/rooms/_Stickers.pcss b/apps/web/res/css/views/rooms/_Stickers.pcss similarity index 100% rename from res/css/views/rooms/_Stickers.pcss rename to apps/web/res/css/views/rooms/_Stickers.pcss diff --git a/res/css/views/rooms/_ThirdPartyMemberInfo.pcss b/apps/web/res/css/views/rooms/_ThirdPartyMemberInfo.pcss similarity index 100% rename from res/css/views/rooms/_ThirdPartyMemberInfo.pcss rename to apps/web/res/css/views/rooms/_ThirdPartyMemberInfo.pcss diff --git a/res/css/views/rooms/_ThreadSummary.pcss b/apps/web/res/css/views/rooms/_ThreadSummary.pcss similarity index 100% rename from res/css/views/rooms/_ThreadSummary.pcss rename to apps/web/res/css/views/rooms/_ThreadSummary.pcss diff --git a/res/css/views/rooms/_TopUnreadMessagesBar.pcss b/apps/web/res/css/views/rooms/_TopUnreadMessagesBar.pcss similarity index 100% rename from res/css/views/rooms/_TopUnreadMessagesBar.pcss rename to apps/web/res/css/views/rooms/_TopUnreadMessagesBar.pcss diff --git a/res/css/views/rooms/_UserIdentityWarning.pcss b/apps/web/res/css/views/rooms/_UserIdentityWarning.pcss similarity index 100% rename from res/css/views/rooms/_UserIdentityWarning.pcss rename to apps/web/res/css/views/rooms/_UserIdentityWarning.pcss diff --git a/res/css/views/rooms/_VoiceRecordComposerTile.pcss b/apps/web/res/css/views/rooms/_VoiceRecordComposerTile.pcss similarity index 100% rename from res/css/views/rooms/_VoiceRecordComposerTile.pcss rename to apps/web/res/css/views/rooms/_VoiceRecordComposerTile.pcss diff --git a/res/css/views/rooms/_WhoIsTypingTile.pcss b/apps/web/res/css/views/rooms/_WhoIsTypingTile.pcss similarity index 100% rename from res/css/views/rooms/_WhoIsTypingTile.pcss rename to apps/web/res/css/views/rooms/_WhoIsTypingTile.pcss diff --git a/res/css/views/rooms/wysiwyg_composer/_EditWysiwygComposer.pcss b/apps/web/res/css/views/rooms/wysiwyg_composer/_EditWysiwygComposer.pcss similarity index 100% rename from res/css/views/rooms/wysiwyg_composer/_EditWysiwygComposer.pcss rename to apps/web/res/css/views/rooms/wysiwyg_composer/_EditWysiwygComposer.pcss diff --git a/res/css/views/rooms/wysiwyg_composer/_SendWysiwygComposer.pcss b/apps/web/res/css/views/rooms/wysiwyg_composer/_SendWysiwygComposer.pcss similarity index 100% rename from res/css/views/rooms/wysiwyg_composer/_SendWysiwygComposer.pcss rename to apps/web/res/css/views/rooms/wysiwyg_composer/_SendWysiwygComposer.pcss diff --git a/res/css/views/rooms/wysiwyg_composer/components/_Editor.pcss b/apps/web/res/css/views/rooms/wysiwyg_composer/components/_Editor.pcss similarity index 100% rename from res/css/views/rooms/wysiwyg_composer/components/_Editor.pcss rename to apps/web/res/css/views/rooms/wysiwyg_composer/components/_Editor.pcss diff --git a/res/css/views/rooms/wysiwyg_composer/components/_FormattingButtons.pcss b/apps/web/res/css/views/rooms/wysiwyg_composer/components/_FormattingButtons.pcss similarity index 100% rename from res/css/views/rooms/wysiwyg_composer/components/_FormattingButtons.pcss rename to apps/web/res/css/views/rooms/wysiwyg_composer/components/_FormattingButtons.pcss diff --git a/res/css/views/rooms/wysiwyg_composer/components/_LinkModal.pcss b/apps/web/res/css/views/rooms/wysiwyg_composer/components/_LinkModal.pcss similarity index 100% rename from res/css/views/rooms/wysiwyg_composer/components/_LinkModal.pcss rename to apps/web/res/css/views/rooms/wysiwyg_composer/components/_LinkModal.pcss diff --git a/res/css/views/settings/_AvatarSetting.pcss b/apps/web/res/css/views/settings/_AvatarSetting.pcss similarity index 100% rename from res/css/views/settings/_AvatarSetting.pcss rename to apps/web/res/css/views/settings/_AvatarSetting.pcss diff --git a/res/css/views/settings/_FontScalingPanel.pcss b/apps/web/res/css/views/settings/_FontScalingPanel.pcss similarity index 100% rename from res/css/views/settings/_FontScalingPanel.pcss rename to apps/web/res/css/views/settings/_FontScalingPanel.pcss diff --git a/res/css/views/settings/_ImageSizePanel.pcss b/apps/web/res/css/views/settings/_ImageSizePanel.pcss similarity index 100% rename from res/css/views/settings/_ImageSizePanel.pcss rename to apps/web/res/css/views/settings/_ImageSizePanel.pcss diff --git a/res/css/views/settings/_IntegrationManager.pcss b/apps/web/res/css/views/settings/_IntegrationManager.pcss similarity index 100% rename from res/css/views/settings/_IntegrationManager.pcss rename to apps/web/res/css/views/settings/_IntegrationManager.pcss diff --git a/res/css/views/settings/_JoinRuleSettings.pcss b/apps/web/res/css/views/settings/_JoinRuleSettings.pcss similarity index 100% rename from res/css/views/settings/_JoinRuleSettings.pcss rename to apps/web/res/css/views/settings/_JoinRuleSettings.pcss diff --git a/res/css/views/settings/_KeyboardShortcut.pcss b/apps/web/res/css/views/settings/_KeyboardShortcut.pcss similarity index 100% rename from res/css/views/settings/_KeyboardShortcut.pcss rename to apps/web/res/css/views/settings/_KeyboardShortcut.pcss diff --git a/res/css/views/settings/_LayoutSwitcher.pcss b/apps/web/res/css/views/settings/_LayoutSwitcher.pcss similarity index 100% rename from res/css/views/settings/_LayoutSwitcher.pcss rename to apps/web/res/css/views/settings/_LayoutSwitcher.pcss diff --git a/res/css/views/settings/_NotificationPusherSettings.pcss b/apps/web/res/css/views/settings/_NotificationPusherSettings.pcss similarity index 100% rename from res/css/views/settings/_NotificationPusherSettings.pcss rename to apps/web/res/css/views/settings/_NotificationPusherSettings.pcss diff --git a/res/css/views/settings/_NotificationSettings2.pcss b/apps/web/res/css/views/settings/_NotificationSettings2.pcss similarity index 100% rename from res/css/views/settings/_NotificationSettings2.pcss rename to apps/web/res/css/views/settings/_NotificationSettings2.pcss diff --git a/res/css/views/settings/_Notifications.pcss b/apps/web/res/css/views/settings/_Notifications.pcss similarity index 100% rename from res/css/views/settings/_Notifications.pcss rename to apps/web/res/css/views/settings/_Notifications.pcss diff --git a/res/css/views/settings/_PhoneNumbers.pcss b/apps/web/res/css/views/settings/_PhoneNumbers.pcss similarity index 100% rename from res/css/views/settings/_PhoneNumbers.pcss rename to apps/web/res/css/views/settings/_PhoneNumbers.pcss diff --git a/res/css/views/settings/_PowerLevelSelector.pcss b/apps/web/res/css/views/settings/_PowerLevelSelector.pcss similarity index 100% rename from res/css/views/settings/_PowerLevelSelector.pcss rename to apps/web/res/css/views/settings/_PowerLevelSelector.pcss diff --git a/res/css/views/settings/_RoomProfileSettings.pcss b/apps/web/res/css/views/settings/_RoomProfileSettings.pcss similarity index 100% rename from res/css/views/settings/_RoomProfileSettings.pcss rename to apps/web/res/css/views/settings/_RoomProfileSettings.pcss diff --git a/res/css/views/settings/_SetIntegrationManager.pcss b/apps/web/res/css/views/settings/_SetIntegrationManager.pcss similarity index 100% rename from res/css/views/settings/_SetIntegrationManager.pcss rename to apps/web/res/css/views/settings/_SetIntegrationManager.pcss diff --git a/res/css/views/settings/_SettingsFieldset.pcss b/apps/web/res/css/views/settings/_SettingsFieldset.pcss similarity index 100% rename from res/css/views/settings/_SettingsFieldset.pcss rename to apps/web/res/css/views/settings/_SettingsFieldset.pcss diff --git a/res/css/views/settings/_SettingsHeader.pcss b/apps/web/res/css/views/settings/_SettingsHeader.pcss similarity index 100% rename from res/css/views/settings/_SettingsHeader.pcss rename to apps/web/res/css/views/settings/_SettingsHeader.pcss diff --git a/res/css/views/settings/_SettingsSubheader.pcss b/apps/web/res/css/views/settings/_SettingsSubheader.pcss similarity index 100% rename from res/css/views/settings/_SettingsSubheader.pcss rename to apps/web/res/css/views/settings/_SettingsSubheader.pcss diff --git a/res/css/views/settings/_SpellCheckLanguages.pcss b/apps/web/res/css/views/settings/_SpellCheckLanguages.pcss similarity index 100% rename from res/css/views/settings/_SpellCheckLanguages.pcss rename to apps/web/res/css/views/settings/_SpellCheckLanguages.pcss diff --git a/res/css/views/settings/_ThemeChoicePanel.pcss b/apps/web/res/css/views/settings/_ThemeChoicePanel.pcss similarity index 100% rename from res/css/views/settings/_ThemeChoicePanel.pcss rename to apps/web/res/css/views/settings/_ThemeChoicePanel.pcss diff --git a/res/css/views/settings/_UpdateCheckButton.pcss b/apps/web/res/css/views/settings/_UpdateCheckButton.pcss similarity index 100% rename from res/css/views/settings/_UpdateCheckButton.pcss rename to apps/web/res/css/views/settings/_UpdateCheckButton.pcss diff --git a/res/css/views/settings/_UserProfileSettings.pcss b/apps/web/res/css/views/settings/_UserProfileSettings.pcss similarity index 100% rename from res/css/views/settings/_UserProfileSettings.pcss rename to apps/web/res/css/views/settings/_UserProfileSettings.pcss diff --git a/res/css/views/settings/encryption/_AdvancedPanel.pcss b/apps/web/res/css/views/settings/encryption/_AdvancedPanel.pcss similarity index 100% rename from res/css/views/settings/encryption/_AdvancedPanel.pcss rename to apps/web/res/css/views/settings/encryption/_AdvancedPanel.pcss diff --git a/res/css/views/settings/encryption/_ChangeRecoveryKey.pcss b/apps/web/res/css/views/settings/encryption/_ChangeRecoveryKey.pcss similarity index 100% rename from res/css/views/settings/encryption/_ChangeRecoveryKey.pcss rename to apps/web/res/css/views/settings/encryption/_ChangeRecoveryKey.pcss diff --git a/res/css/views/settings/encryption/_EncryptionCard.pcss b/apps/web/res/css/views/settings/encryption/_EncryptionCard.pcss similarity index 100% rename from res/css/views/settings/encryption/_EncryptionCard.pcss rename to apps/web/res/css/views/settings/encryption/_EncryptionCard.pcss diff --git a/res/css/views/settings/encryption/_EncryptionCardEmphasisedContent.pcss b/apps/web/res/css/views/settings/encryption/_EncryptionCardEmphasisedContent.pcss similarity index 100% rename from res/css/views/settings/encryption/_EncryptionCardEmphasisedContent.pcss rename to apps/web/res/css/views/settings/encryption/_EncryptionCardEmphasisedContent.pcss diff --git a/res/css/views/settings/encryption/_RecoveryPanelOutOfSync.pcss b/apps/web/res/css/views/settings/encryption/_RecoveryPanelOutOfSync.pcss similarity index 100% rename from res/css/views/settings/encryption/_RecoveryPanelOutOfSync.pcss rename to apps/web/res/css/views/settings/encryption/_RecoveryPanelOutOfSync.pcss diff --git a/res/css/views/settings/encryption/_ResetIdentityPanel.pcss b/apps/web/res/css/views/settings/encryption/_ResetIdentityPanel.pcss similarity index 100% rename from res/css/views/settings/encryption/_ResetIdentityPanel.pcss rename to apps/web/res/css/views/settings/encryption/_ResetIdentityPanel.pcss diff --git a/res/css/views/settings/tabs/_SettingsBanner.pcss b/apps/web/res/css/views/settings/tabs/_SettingsBanner.pcss similarity index 100% rename from res/css/views/settings/tabs/_SettingsBanner.pcss rename to apps/web/res/css/views/settings/tabs/_SettingsBanner.pcss diff --git a/res/css/views/settings/tabs/_SettingsIndent.pcss b/apps/web/res/css/views/settings/tabs/_SettingsIndent.pcss similarity index 100% rename from res/css/views/settings/tabs/_SettingsIndent.pcss rename to apps/web/res/css/views/settings/tabs/_SettingsIndent.pcss diff --git a/res/css/views/settings/tabs/_SettingsSection.pcss b/apps/web/res/css/views/settings/tabs/_SettingsSection.pcss similarity index 100% rename from res/css/views/settings/tabs/_SettingsSection.pcss rename to apps/web/res/css/views/settings/tabs/_SettingsSection.pcss diff --git a/res/css/views/settings/tabs/_SettingsTab.pcss b/apps/web/res/css/views/settings/tabs/_SettingsTab.pcss similarity index 100% rename from res/css/views/settings/tabs/_SettingsTab.pcss rename to apps/web/res/css/views/settings/tabs/_SettingsTab.pcss diff --git a/res/css/views/settings/tabs/room/_NotificationSettingsTab.pcss b/apps/web/res/css/views/settings/tabs/room/_NotificationSettingsTab.pcss similarity index 100% rename from res/css/views/settings/tabs/room/_NotificationSettingsTab.pcss rename to apps/web/res/css/views/settings/tabs/room/_NotificationSettingsTab.pcss diff --git a/res/css/views/settings/tabs/room/_PeopleRoomSettingsTab.pcss b/apps/web/res/css/views/settings/tabs/room/_PeopleRoomSettingsTab.pcss similarity index 100% rename from res/css/views/settings/tabs/room/_PeopleRoomSettingsTab.pcss rename to apps/web/res/css/views/settings/tabs/room/_PeopleRoomSettingsTab.pcss diff --git a/res/css/views/settings/tabs/room/_RolesRoomSettingsTab.pcss b/apps/web/res/css/views/settings/tabs/room/_RolesRoomSettingsTab.pcss similarity index 100% rename from res/css/views/settings/tabs/room/_RolesRoomSettingsTab.pcss rename to apps/web/res/css/views/settings/tabs/room/_RolesRoomSettingsTab.pcss diff --git a/res/css/views/settings/tabs/room/_SecurityRoomSettingsTab.pcss b/apps/web/res/css/views/settings/tabs/room/_SecurityRoomSettingsTab.pcss similarity index 100% rename from res/css/views/settings/tabs/room/_SecurityRoomSettingsTab.pcss rename to apps/web/res/css/views/settings/tabs/room/_SecurityRoomSettingsTab.pcss diff --git a/res/css/views/settings/tabs/user/_AppearanceUserSettingsTab.pcss b/apps/web/res/css/views/settings/tabs/user/_AppearanceUserSettingsTab.pcss similarity index 100% rename from res/css/views/settings/tabs/user/_AppearanceUserSettingsTab.pcss rename to apps/web/res/css/views/settings/tabs/user/_AppearanceUserSettingsTab.pcss diff --git a/res/css/views/settings/tabs/user/_HelpUserSettingsTab.pcss b/apps/web/res/css/views/settings/tabs/user/_HelpUserSettingsTab.pcss similarity index 100% rename from res/css/views/settings/tabs/user/_HelpUserSettingsTab.pcss rename to apps/web/res/css/views/settings/tabs/user/_HelpUserSettingsTab.pcss diff --git a/res/css/views/settings/tabs/user/_KeyboardUserSettingsTab.pcss b/apps/web/res/css/views/settings/tabs/user/_KeyboardUserSettingsTab.pcss similarity index 100% rename from res/css/views/settings/tabs/user/_KeyboardUserSettingsTab.pcss rename to apps/web/res/css/views/settings/tabs/user/_KeyboardUserSettingsTab.pcss diff --git a/res/css/views/settings/tabs/user/_MediaPreviewAccountSettings.pcss b/apps/web/res/css/views/settings/tabs/user/_MediaPreviewAccountSettings.pcss similarity index 100% rename from res/css/views/settings/tabs/user/_MediaPreviewAccountSettings.pcss rename to apps/web/res/css/views/settings/tabs/user/_MediaPreviewAccountSettings.pcss diff --git a/res/css/views/settings/tabs/user/_MjolnirUserSettingsTab.pcss b/apps/web/res/css/views/settings/tabs/user/_MjolnirUserSettingsTab.pcss similarity index 100% rename from res/css/views/settings/tabs/user/_MjolnirUserSettingsTab.pcss rename to apps/web/res/css/views/settings/tabs/user/_MjolnirUserSettingsTab.pcss diff --git a/res/css/views/settings/tabs/user/_PreferencesUserSettingsTab.pcss b/apps/web/res/css/views/settings/tabs/user/_PreferencesUserSettingsTab.pcss similarity index 100% rename from res/css/views/settings/tabs/user/_PreferencesUserSettingsTab.pcss rename to apps/web/res/css/views/settings/tabs/user/_PreferencesUserSettingsTab.pcss diff --git a/res/css/views/settings/tabs/user/_SecurityUserSettingsTab.pcss b/apps/web/res/css/views/settings/tabs/user/_SecurityUserSettingsTab.pcss similarity index 100% rename from res/css/views/settings/tabs/user/_SecurityUserSettingsTab.pcss rename to apps/web/res/css/views/settings/tabs/user/_SecurityUserSettingsTab.pcss diff --git a/res/css/views/settings/tabs/user/_SidebarUserSettingsTab.pcss b/apps/web/res/css/views/settings/tabs/user/_SidebarUserSettingsTab.pcss similarity index 100% rename from res/css/views/settings/tabs/user/_SidebarUserSettingsTab.pcss rename to apps/web/res/css/views/settings/tabs/user/_SidebarUserSettingsTab.pcss diff --git a/res/css/views/spaces/_SpaceBasicSettings.pcss b/apps/web/res/css/views/spaces/_SpaceBasicSettings.pcss similarity index 100% rename from res/css/views/spaces/_SpaceBasicSettings.pcss rename to apps/web/res/css/views/spaces/_SpaceBasicSettings.pcss diff --git a/res/css/views/spaces/_SpaceChildrenPicker.pcss b/apps/web/res/css/views/spaces/_SpaceChildrenPicker.pcss similarity index 100% rename from res/css/views/spaces/_SpaceChildrenPicker.pcss rename to apps/web/res/css/views/spaces/_SpaceChildrenPicker.pcss diff --git a/res/css/views/spaces/_SpaceCreateMenu.pcss b/apps/web/res/css/views/spaces/_SpaceCreateMenu.pcss similarity index 100% rename from res/css/views/spaces/_SpaceCreateMenu.pcss rename to apps/web/res/css/views/spaces/_SpaceCreateMenu.pcss diff --git a/res/css/views/terms/_InlineTermsAgreement.pcss b/apps/web/res/css/views/terms/_InlineTermsAgreement.pcss similarity index 100% rename from res/css/views/terms/_InlineTermsAgreement.pcss rename to apps/web/res/css/views/terms/_InlineTermsAgreement.pcss diff --git a/res/css/views/toasts/_AnalyticsToast.pcss b/apps/web/res/css/views/toasts/_AnalyticsToast.pcss similarity index 100% rename from res/css/views/toasts/_AnalyticsToast.pcss rename to apps/web/res/css/views/toasts/_AnalyticsToast.pcss diff --git a/res/css/views/toasts/_IncomingCallToast.pcss b/apps/web/res/css/views/toasts/_IncomingCallToast.pcss similarity index 100% rename from res/css/views/toasts/_IncomingCallToast.pcss rename to apps/web/res/css/views/toasts/_IncomingCallToast.pcss diff --git a/res/css/views/toasts/_IncomingLegacyCallToast.pcss b/apps/web/res/css/views/toasts/_IncomingLegacyCallToast.pcss similarity index 100% rename from res/css/views/toasts/_IncomingLegacyCallToast.pcss rename to apps/web/res/css/views/toasts/_IncomingLegacyCallToast.pcss diff --git a/res/css/views/toasts/_NonUrgentEchoFailureToast.pcss b/apps/web/res/css/views/toasts/_NonUrgentEchoFailureToast.pcss similarity index 100% rename from res/css/views/toasts/_NonUrgentEchoFailureToast.pcss rename to apps/web/res/css/views/toasts/_NonUrgentEchoFailureToast.pcss diff --git a/res/css/views/typography/_Heading.pcss b/apps/web/res/css/views/typography/_Heading.pcss similarity index 100% rename from res/css/views/typography/_Heading.pcss rename to apps/web/res/css/views/typography/_Heading.pcss diff --git a/res/css/views/verification/_VerificationShowSas.pcss b/apps/web/res/css/views/verification/_VerificationShowSas.pcss similarity index 100% rename from res/css/views/verification/_VerificationShowSas.pcss rename to apps/web/res/css/views/verification/_VerificationShowSas.pcss diff --git a/res/css/views/voip/LegacyCallView/_LegacyCallViewButtons.pcss b/apps/web/res/css/views/voip/LegacyCallView/_LegacyCallViewButtons.pcss similarity index 100% rename from res/css/views/voip/LegacyCallView/_LegacyCallViewButtons.pcss rename to apps/web/res/css/views/voip/LegacyCallView/_LegacyCallViewButtons.pcss diff --git a/res/css/views/voip/_CallDuration.pcss b/apps/web/res/css/views/voip/_CallDuration.pcss similarity index 100% rename from res/css/views/voip/_CallDuration.pcss rename to apps/web/res/css/views/voip/_CallDuration.pcss diff --git a/res/css/views/voip/_CallView.pcss b/apps/web/res/css/views/voip/_CallView.pcss similarity index 100% rename from res/css/views/voip/_CallView.pcss rename to apps/web/res/css/views/voip/_CallView.pcss diff --git a/res/css/views/voip/_DialPad.pcss b/apps/web/res/css/views/voip/_DialPad.pcss similarity index 100% rename from res/css/views/voip/_DialPad.pcss rename to apps/web/res/css/views/voip/_DialPad.pcss diff --git a/res/css/views/voip/_DialPadContextMenu.pcss b/apps/web/res/css/views/voip/_DialPadContextMenu.pcss similarity index 100% rename from res/css/views/voip/_DialPadContextMenu.pcss rename to apps/web/res/css/views/voip/_DialPadContextMenu.pcss diff --git a/res/css/views/voip/_DialPadModal.pcss b/apps/web/res/css/views/voip/_DialPadModal.pcss similarity index 100% rename from res/css/views/voip/_DialPadModal.pcss rename to apps/web/res/css/views/voip/_DialPadModal.pcss diff --git a/res/css/views/voip/_LegacyCallPreview.pcss b/apps/web/res/css/views/voip/_LegacyCallPreview.pcss similarity index 100% rename from res/css/views/voip/_LegacyCallPreview.pcss rename to apps/web/res/css/views/voip/_LegacyCallPreview.pcss diff --git a/res/css/views/voip/_LegacyCallView.pcss b/apps/web/res/css/views/voip/_LegacyCallView.pcss similarity index 100% rename from res/css/views/voip/_LegacyCallView.pcss rename to apps/web/res/css/views/voip/_LegacyCallView.pcss diff --git a/res/css/views/voip/_LegacyCallViewForRoom.pcss b/apps/web/res/css/views/voip/_LegacyCallViewForRoom.pcss similarity index 100% rename from res/css/views/voip/_LegacyCallViewForRoom.pcss rename to apps/web/res/css/views/voip/_LegacyCallViewForRoom.pcss diff --git a/res/css/views/voip/_LegacyCallViewHeader.pcss b/apps/web/res/css/views/voip/_LegacyCallViewHeader.pcss similarity index 100% rename from res/css/views/voip/_LegacyCallViewHeader.pcss rename to apps/web/res/css/views/voip/_LegacyCallViewHeader.pcss diff --git a/res/css/views/voip/_LegacyCallViewSidebar.pcss b/apps/web/res/css/views/voip/_LegacyCallViewSidebar.pcss similarity index 100% rename from res/css/views/voip/_LegacyCallViewSidebar.pcss rename to apps/web/res/css/views/voip/_LegacyCallViewSidebar.pcss diff --git a/res/css/views/voip/_VideoFeed.pcss b/apps/web/res/css/views/voip/_VideoFeed.pcss similarity index 100% rename from res/css/views/voip/_VideoFeed.pcss rename to apps/web/res/css/views/voip/_VideoFeed.pcss diff --git a/res/decoder-ring/datatypes.js b/apps/web/res/decoder-ring/datatypes.js similarity index 100% rename from res/decoder-ring/datatypes.js rename to apps/web/res/decoder-ring/datatypes.js diff --git a/res/decoder-ring/decoder.js b/apps/web/res/decoder-ring/decoder.js similarity index 100% rename from res/decoder-ring/decoder.js rename to apps/web/res/decoder-ring/decoder.js diff --git a/res/decoder-ring/index.html b/apps/web/res/decoder-ring/index.html similarity index 100% rename from res/decoder-ring/index.html rename to apps/web/res/decoder-ring/index.html diff --git a/res/fonts/Nunito/Nunito-Bold.ttf b/apps/web/res/fonts/Nunito/Nunito-Bold.ttf similarity index 100% rename from res/fonts/Nunito/Nunito-Bold.ttf rename to apps/web/res/fonts/Nunito/Nunito-Bold.ttf diff --git a/res/fonts/Nunito/Nunito-Regular.ttf b/apps/web/res/fonts/Nunito/Nunito-Regular.ttf similarity index 100% rename from res/fonts/Nunito/Nunito-Regular.ttf rename to apps/web/res/fonts/Nunito/Nunito-Regular.ttf diff --git a/res/fonts/Nunito/Nunito-SemiBold.ttf b/apps/web/res/fonts/Nunito/Nunito-SemiBold.ttf similarity index 100% rename from res/fonts/Nunito/Nunito-SemiBold.ttf rename to apps/web/res/fonts/Nunito/Nunito-SemiBold.ttf diff --git a/res/fonts/Twemoji_Mozilla/TwemojiMozilla-colr.woff2 b/apps/web/res/fonts/Twemoji_Mozilla/TwemojiMozilla-colr.woff2 similarity index 100% rename from res/fonts/Twemoji_Mozilla/TwemojiMozilla-colr.woff2 rename to apps/web/res/fonts/Twemoji_Mozilla/TwemojiMozilla-colr.woff2 diff --git a/res/img/betas/.gitkeep b/apps/web/res/img/betas/.gitkeep similarity index 100% rename from res/img/betas/.gitkeep rename to apps/web/res/img/betas/.gitkeep diff --git a/res/img/betas/video_rooms.png b/apps/web/res/img/betas/video_rooms.png similarity index 100% rename from res/img/betas/video_rooms.png rename to apps/web/res/img/betas/video_rooms.png diff --git a/res/img/element-desktop-logo.svg b/apps/web/res/img/element-desktop-logo.svg similarity index 100% rename from res/img/element-desktop-logo.svg rename to apps/web/res/img/element-desktop-logo.svg diff --git a/res/img/element-icons/brands/facebook.svg b/apps/web/res/img/element-icons/brands/facebook.svg similarity index 100% rename from res/img/element-icons/brands/facebook.svg rename to apps/web/res/img/element-icons/brands/facebook.svg diff --git a/res/img/element-icons/brands/github.svg b/apps/web/res/img/element-icons/brands/github.svg similarity index 98% rename from res/img/element-icons/brands/github.svg rename to apps/web/res/img/element-icons/brands/github.svg index 503719520b..73369969d5 100644 --- a/res/img/element-icons/brands/github.svg +++ b/apps/web/res/img/element-icons/brands/github.svg @@ -1,3 +1,3 @@ - + diff --git a/res/img/element-icons/brands/gitlab.svg b/apps/web/res/img/element-icons/brands/gitlab.svg similarity index 100% rename from res/img/element-icons/brands/gitlab.svg rename to apps/web/res/img/element-icons/brands/gitlab.svg diff --git a/res/img/element-icons/brands/google.svg b/apps/web/res/img/element-icons/brands/google.svg similarity index 100% rename from res/img/element-icons/brands/google.svg rename to apps/web/res/img/element-icons/brands/google.svg diff --git a/res/img/element-icons/brands/twitter.svg b/apps/web/res/img/element-icons/brands/twitter.svg similarity index 100% rename from res/img/element-icons/brands/twitter.svg rename to apps/web/res/img/element-icons/brands/twitter.svg diff --git a/res/img/element-icons/check-all.svg b/apps/web/res/img/element-icons/check-all.svg similarity index 100% rename from res/img/element-icons/check-all.svg rename to apps/web/res/img/element-icons/check-all.svg diff --git a/res/img/element-icons/email-prompt.svg b/apps/web/res/img/element-icons/email-prompt.svg similarity index 100% rename from res/img/element-icons/email-prompt.svg rename to apps/web/res/img/element-icons/email-prompt.svg diff --git a/res/img/element-icons/new-and-improved.svg b/apps/web/res/img/element-icons/new-and-improved.svg similarity index 100% rename from res/img/element-icons/new-and-improved.svg rename to apps/web/res/img/element-icons/new-and-improved.svg diff --git a/res/img/element-icons/room/default_app.svg b/apps/web/res/img/element-icons/room/default_app.svg similarity index 100% rename from res/img/element-icons/room/default_app.svg rename to apps/web/res/img/element-icons/room/default_app.svg diff --git a/res/img/element-icons/room/default_cal.svg b/apps/web/res/img/element-icons/room/default_cal.svg similarity index 100% rename from res/img/element-icons/room/default_cal.svg rename to apps/web/res/img/element-icons/room/default_cal.svg diff --git a/res/img/element-icons/room/default_clock.svg b/apps/web/res/img/element-icons/room/default_clock.svg similarity index 100% rename from res/img/element-icons/room/default_clock.svg rename to apps/web/res/img/element-icons/room/default_clock.svg diff --git a/res/img/element-icons/room/default_doc.svg b/apps/web/res/img/element-icons/room/default_doc.svg similarity index 100% rename from res/img/element-icons/room/default_doc.svg rename to apps/web/res/img/element-icons/room/default_doc.svg diff --git a/res/img/element-icons/room/default_video.svg b/apps/web/res/img/element-icons/room/default_video.svg similarity index 100% rename from res/img/element-icons/room/default_video.svg rename to apps/web/res/img/element-icons/room/default_video.svg diff --git a/res/img/element-icons/roomlist/decorated-avatar-mask.svg b/apps/web/res/img/element-icons/roomlist/decorated-avatar-mask.svg similarity index 100% rename from res/img/element-icons/roomlist/decorated-avatar-mask.svg rename to apps/web/res/img/element-icons/roomlist/decorated-avatar-mask.svg diff --git a/res/img/element-icons/roomlist/room-avatar-view-icon-mask.svg b/apps/web/res/img/element-icons/roomlist/room-avatar-view-icon-mask.svg similarity index 100% rename from res/img/element-icons/roomlist/room-avatar-view-icon-mask.svg rename to apps/web/res/img/element-icons/roomlist/room-avatar-view-icon-mask.svg diff --git a/res/img/element-icons/roomlist/room-avatar-view-presence-mask.svg b/apps/web/res/img/element-icons/roomlist/room-avatar-view-presence-mask.svg similarity index 100% rename from res/img/element-icons/roomlist/room-avatar-view-presence-mask.svg rename to apps/web/res/img/element-icons/roomlist/room-avatar-view-presence-mask.svg diff --git a/res/img/element-icons/roomlist/skeleton-ui.svg b/apps/web/res/img/element-icons/roomlist/skeleton-ui.svg similarity index 100% rename from res/img/element-icons/roomlist/skeleton-ui.svg rename to apps/web/res/img/element-icons/roomlist/skeleton-ui.svg diff --git a/res/img/element-icons/settings/img-size-large.svg b/apps/web/res/img/element-icons/settings/img-size-large.svg similarity index 100% rename from res/img/element-icons/settings/img-size-large.svg rename to apps/web/res/img/element-icons/settings/img-size-large.svg diff --git a/res/img/element-icons/settings/img-size-normal.svg b/apps/web/res/img/element-icons/settings/img-size-normal.svg similarity index 100% rename from res/img/element-icons/settings/img-size-normal.svg rename to apps/web/res/img/element-icons/settings/img-size-normal.svg diff --git a/res/img/element-icons/settings/inactive.svg b/apps/web/res/img/element-icons/settings/inactive.svg similarity index 100% rename from res/img/element-icons/settings/inactive.svg rename to apps/web/res/img/element-icons/settings/inactive.svg diff --git a/res/img/element-icons/trophy.svg b/apps/web/res/img/element-icons/trophy.svg similarity index 100% rename from res/img/element-icons/trophy.svg rename to apps/web/res/img/element-icons/trophy.svg diff --git a/res/img/element-shiny.svg b/apps/web/res/img/element-shiny.svg similarity index 100% rename from res/img/element-shiny.svg rename to apps/web/res/img/element-shiny.svg diff --git a/res/img/icon-email-pill-avatar.svg b/apps/web/res/img/icon-email-pill-avatar.svg similarity index 100% rename from res/img/icon-email-pill-avatar.svg rename to apps/web/res/img/icon-email-pill-avatar.svg diff --git a/res/img/icons-show-stickers.svg b/apps/web/res/img/icons-show-stickers.svg similarity index 98% rename from res/img/icons-show-stickers.svg rename to apps/web/res/img/icons-show-stickers.svg index 26779a3940..05b6953d10 100644 --- a/res/img/icons-show-stickers.svg +++ b/apps/web/res/img/icons-show-stickers.svg @@ -1,16 +1,16 @@ - - - - - - - - - + + + + + + + + + diff --git a/res/img/location/live-location.svg b/apps/web/res/img/location/live-location.svg similarity index 100% rename from res/img/location/live-location.svg rename to apps/web/res/img/location/live-location.svg diff --git a/res/img/location/map.svg b/apps/web/res/img/location/map.svg similarity index 100% rename from res/img/location/map.svg rename to apps/web/res/img/location/map.svg diff --git a/res/img/matrix.svg b/apps/web/res/img/matrix.svg similarity index 100% rename from res/img/matrix.svg rename to apps/web/res/img/matrix.svg diff --git a/res/img/noise.png b/apps/web/res/img/noise.png similarity index 100% rename from res/img/noise.png rename to apps/web/res/img/noise.png diff --git a/res/img/room_replaced.svg b/apps/web/res/img/room_replaced.svg similarity index 100% rename from res/img/room_replaced.svg rename to apps/web/res/img/room_replaced.svg diff --git a/res/img/sensor.svg b/apps/web/res/img/sensor.svg similarity index 100% rename from res/img/sensor.svg rename to apps/web/res/img/sensor.svg diff --git a/res/img/social/email-1.png b/apps/web/res/img/social/email-1.png similarity index 100% rename from res/img/social/email-1.png rename to apps/web/res/img/social/email-1.png diff --git a/res/img/social/facebook.png b/apps/web/res/img/social/facebook.png similarity index 100% rename from res/img/social/facebook.png rename to apps/web/res/img/social/facebook.png diff --git a/res/img/social/linkedin.png b/apps/web/res/img/social/linkedin.png similarity index 100% rename from res/img/social/linkedin.png rename to apps/web/res/img/social/linkedin.png diff --git a/res/img/social/reddit.png b/apps/web/res/img/social/reddit.png similarity index 100% rename from res/img/social/reddit.png rename to apps/web/res/img/social/reddit.png diff --git a/res/img/social/twitter-2.png b/apps/web/res/img/social/twitter-2.png similarity index 100% rename from res/img/social/twitter-2.png rename to apps/web/res/img/social/twitter-2.png diff --git a/res/img/stickerpack-placeholder.png b/apps/web/res/img/stickerpack-placeholder.png similarity index 100% rename from res/img/stickerpack-placeholder.png rename to apps/web/res/img/stickerpack-placeholder.png diff --git a/res/img/typing-indicator-2x.gif b/apps/web/res/img/typing-indicator-2x.gif similarity index 100% rename from res/img/typing-indicator-2x.gif rename to apps/web/res/img/typing-indicator-2x.gif diff --git a/res/img/upload-big.svg b/apps/web/res/img/upload-big.svg similarity index 100% rename from res/img/upload-big.svg rename to apps/web/res/img/upload-big.svg diff --git a/res/img/voip/paused.svg b/apps/web/res/img/voip/paused.svg similarity index 100% rename from res/img/voip/paused.svg rename to apps/web/res/img/voip/paused.svg diff --git a/res/jitsi_external_api.min.js b/apps/web/res/jitsi_external_api.min.js similarity index 100% rename from res/jitsi_external_api.min.js rename to apps/web/res/jitsi_external_api.min.js diff --git a/res/jitsi_external_api.min.js.LICENSE.txt b/apps/web/res/jitsi_external_api.min.js.LICENSE.txt similarity index 100% rename from res/jitsi_external_api.min.js.LICENSE.txt rename to apps/web/res/jitsi_external_api.min.js.LICENSE.txt diff --git a/res/manifest.json b/apps/web/res/manifest.json similarity index 100% rename from res/manifest.json rename to apps/web/res/manifest.json diff --git a/res/media/busy.mp3 b/apps/web/res/media/busy.mp3 similarity index 100% rename from res/media/busy.mp3 rename to apps/web/res/media/busy.mp3 diff --git a/res/media/busy.ogg b/apps/web/res/media/busy.ogg similarity index 100% rename from res/media/busy.ogg rename to apps/web/res/media/busy.ogg diff --git a/res/media/callend.mp3 b/apps/web/res/media/callend.mp3 similarity index 100% rename from res/media/callend.mp3 rename to apps/web/res/media/callend.mp3 diff --git a/res/media/callend.ogg b/apps/web/res/media/callend.ogg similarity index 100% rename from res/media/callend.ogg rename to apps/web/res/media/callend.ogg diff --git a/res/media/error.mp3 b/apps/web/res/media/error.mp3 similarity index 100% rename from res/media/error.mp3 rename to apps/web/res/media/error.mp3 diff --git a/res/media/error.ogg b/apps/web/res/media/error.ogg similarity index 100% rename from res/media/error.ogg rename to apps/web/res/media/error.ogg diff --git a/res/media/message.mp3 b/apps/web/res/media/message.mp3 similarity index 100% rename from res/media/message.mp3 rename to apps/web/res/media/message.mp3 diff --git a/res/media/message.ogg b/apps/web/res/media/message.ogg similarity index 100% rename from res/media/message.ogg rename to apps/web/res/media/message.ogg diff --git a/res/media/ring.mp3 b/apps/web/res/media/ring.mp3 similarity index 100% rename from res/media/ring.mp3 rename to apps/web/res/media/ring.mp3 diff --git a/res/media/ring.ogg b/apps/web/res/media/ring.ogg similarity index 100% rename from res/media/ring.ogg rename to apps/web/res/media/ring.ogg diff --git a/res/media/ringback.mp3 b/apps/web/res/media/ringback.mp3 similarity index 100% rename from res/media/ringback.mp3 rename to apps/web/res/media/ringback.mp3 diff --git a/res/media/ringback.ogg b/apps/web/res/media/ringback.ogg similarity index 100% rename from res/media/ringback.ogg rename to apps/web/res/media/ringback.ogg diff --git a/res/themes/dark-custom/css/dark-custom.pcss b/apps/web/res/themes/dark-custom/css/dark-custom.pcss similarity index 100% rename from res/themes/dark-custom/css/dark-custom.pcss rename to apps/web/res/themes/dark-custom/css/dark-custom.pcss diff --git a/res/themes/dark/css/_dark.pcss b/apps/web/res/themes/dark/css/_dark.pcss similarity index 99% rename from res/themes/dark/css/_dark.pcss rename to apps/web/res/themes/dark/css/_dark.pcss index dbd5176653..99fd31f371 100644 --- a/res/themes/dark/css/_dark.pcss +++ b/apps/web/res/themes/dark/css/_dark.pcss @@ -250,7 +250,6 @@ $visual-bell-bg-color: #800; $event-timestamp-color: var(--cpd-color-text-secondary); $composer-shadow-color: rgba(0, 0, 0, 0.28); $breadcrumb-placeholder-bg-color: #272c35; -$theme-button-bg-color: #e3e8f0; $resend-button-divider-color: var(--cpd-color-gray-700); $inlinecode-border-color: $quinary-content; $inlinecode-background-color: $system; diff --git a/res/themes/dark/css/dark.pcss b/apps/web/res/themes/dark/css/dark.pcss similarity index 100% rename from res/themes/dark/css/dark.pcss rename to apps/web/res/themes/dark/css/dark.pcss diff --git a/res/themes/element/img/backgrounds/lake.jpg b/apps/web/res/themes/element/img/backgrounds/lake.jpg similarity index 100% rename from res/themes/element/img/backgrounds/lake.jpg rename to apps/web/res/themes/element/img/backgrounds/lake.jpg diff --git a/res/themes/element/img/compound/fade-arc-light.png b/apps/web/res/themes/element/img/compound/fade-arc-light.png similarity index 100% rename from res/themes/element/img/compound/fade-arc-light.png rename to apps/web/res/themes/element/img/compound/fade-arc-light.png diff --git a/res/themes/element/img/download/apple.svg b/apps/web/res/themes/element/img/download/apple.svg similarity index 100% rename from res/themes/element/img/download/apple.svg rename to apps/web/res/themes/element/img/download/apple.svg diff --git a/res/themes/element/img/download/fdroid.svg b/apps/web/res/themes/element/img/download/fdroid.svg similarity index 100% rename from res/themes/element/img/download/fdroid.svg rename to apps/web/res/themes/element/img/download/fdroid.svg diff --git a/res/themes/element/img/download/google.svg b/apps/web/res/themes/element/img/download/google.svg similarity index 100% rename from res/themes/element/img/download/google.svg rename to apps/web/res/themes/element/img/download/google.svg diff --git a/res/themes/element/img/logos/element-app-logo.png b/apps/web/res/themes/element/img/logos/element-app-logo.png similarity index 100% rename from res/themes/element/img/logos/element-app-logo.png rename to apps/web/res/themes/element/img/logos/element-app-logo.png diff --git a/res/themes/element/img/logos/element-logo.svg b/apps/web/res/themes/element/img/logos/element-logo.svg similarity index 100% rename from res/themes/element/img/logos/element-logo.svg rename to apps/web/res/themes/element/img/logos/element-logo.svg diff --git a/res/themes/element/img/logos/opengraph.png b/apps/web/res/themes/element/img/logos/opengraph.png similarity index 100% rename from res/themes/element/img/logos/opengraph.png rename to apps/web/res/themes/element/img/logos/opengraph.png diff --git a/res/themes/legacy-dark/css/_legacy-dark.pcss b/apps/web/res/themes/legacy-dark/css/_legacy-dark.pcss similarity index 100% rename from res/themes/legacy-dark/css/_legacy-dark.pcss rename to apps/web/res/themes/legacy-dark/css/_legacy-dark.pcss diff --git a/res/themes/legacy-dark/css/legacy-dark.pcss b/apps/web/res/themes/legacy-dark/css/legacy-dark.pcss similarity index 100% rename from res/themes/legacy-dark/css/legacy-dark.pcss rename to apps/web/res/themes/legacy-dark/css/legacy-dark.pcss diff --git a/res/themes/legacy-light/css/_fonts.pcss b/apps/web/res/themes/legacy-light/css/_fonts.pcss similarity index 100% rename from res/themes/legacy-light/css/_fonts.pcss rename to apps/web/res/themes/legacy-light/css/_fonts.pcss diff --git a/res/themes/legacy-light/css/_legacy-light.pcss b/apps/web/res/themes/legacy-light/css/_legacy-light.pcss similarity index 99% rename from res/themes/legacy-light/css/_legacy-light.pcss rename to apps/web/res/themes/legacy-light/css/_legacy-light.pcss index 8c00393d41..c2b0bd5995 100644 --- a/res/themes/legacy-light/css/_legacy-light.pcss +++ b/apps/web/res/themes/legacy-light/css/_legacy-light.pcss @@ -138,8 +138,6 @@ $room-icon-unread-color: var(--cpd-color-icon-tertiary); /* ******************** */ -$theme-button-bg-color: #e3e8f0; - $roomtile-default-badge-bg-color: #61708b; $roomtile-selected-bg-color: #fff; diff --git a/res/themes/legacy-light/css/legacy-light.pcss b/apps/web/res/themes/legacy-light/css/legacy-light.pcss similarity index 100% rename from res/themes/legacy-light/css/legacy-light.pcss rename to apps/web/res/themes/legacy-light/css/legacy-light.pcss diff --git a/res/themes/light-custom/css/_custom.pcss b/apps/web/res/themes/light-custom/css/_custom.pcss similarity index 100% rename from res/themes/light-custom/css/_custom.pcss rename to apps/web/res/themes/light-custom/css/_custom.pcss diff --git a/res/themes/light-custom/css/light-custom.pcss b/apps/web/res/themes/light-custom/css/light-custom.pcss similarity index 100% rename from res/themes/light-custom/css/light-custom.pcss rename to apps/web/res/themes/light-custom/css/light-custom.pcss diff --git a/res/themes/light-high-contrast/css/_light-high-contrast.pcss b/apps/web/res/themes/light-high-contrast/css/_light-high-contrast.pcss similarity index 99% rename from res/themes/light-high-contrast/css/_light-high-contrast.pcss rename to apps/web/res/themes/light-high-contrast/css/_light-high-contrast.pcss index ada87d7a33..483917fb0c 100644 --- a/res/themes/light-high-contrast/css/_light-high-contrast.pcss +++ b/apps/web/res/themes/light-high-contrast/css/_light-high-contrast.pcss @@ -21,7 +21,6 @@ $input-darker-bg-color: $quinary-content; $input-darker-fg-color: $secondary-content; $resend-button-divider-color: $input-darker-bg-color; $icon-button-color: var(--cpd-color-icon-tertiary); -$theme-button-bg-color: $quinary-content; /* not using a compound color here for now as we want to have the same color in light and dark theme. Until we have a non-symetrical token for it, let's keep it hardcoded to the following value */ diff --git a/res/themes/light-high-contrast/css/light-high-contrast.pcss b/apps/web/res/themes/light-high-contrast/css/light-high-contrast.pcss similarity index 100% rename from res/themes/light-high-contrast/css/light-high-contrast.pcss rename to apps/web/res/themes/light-high-contrast/css/light-high-contrast.pcss diff --git a/res/themes/light/css/_fonts.pcss b/apps/web/res/themes/light/css/_fonts.pcss similarity index 100% rename from res/themes/light/css/_fonts.pcss rename to apps/web/res/themes/light/css/_fonts.pcss diff --git a/res/themes/light/css/_light.pcss b/apps/web/res/themes/light/css/_light.pcss similarity index 99% rename from res/themes/light/css/_light.pcss rename to apps/web/res/themes/light/css/_light.pcss index fcab227283..3bd803c53e 100644 --- a/res/themes/light/css/_light.pcss +++ b/apps/web/res/themes/light/css/_light.pcss @@ -321,7 +321,6 @@ $visual-bell-bg-color: #faa; $event-timestamp-color: var(--cpd-color-text-secondary); $composer-shadow-color: rgba(0, 0, 0, 0.04); $breadcrumb-placeholder-bg-color: #e8eef5; -$theme-button-bg-color: $quinary-content; $resend-button-divider-color: $input-darker-bg-color; $inlinecode-border-color: $quinary-content; $inlinecode-background-color: $system; diff --git a/res/themes/light/css/_mods.pcss b/apps/web/res/themes/light/css/_mods.pcss similarity index 100% rename from res/themes/light/css/_mods.pcss rename to apps/web/res/themes/light/css/_mods.pcss diff --git a/res/themes/light/css/light.pcss b/apps/web/res/themes/light/css/light.pcss similarity index 100% rename from res/themes/light/css/light.pcss rename to apps/web/res/themes/light/css/light.pcss diff --git a/res/vector-icons/1024.png b/apps/web/res/vector-icons/1024.png similarity index 100% rename from res/vector-icons/1024.png rename to apps/web/res/vector-icons/1024.png diff --git a/res/vector-icons/120.png b/apps/web/res/vector-icons/120.png similarity index 100% rename from res/vector-icons/120.png rename to apps/web/res/vector-icons/120.png diff --git a/res/vector-icons/144.png b/apps/web/res/vector-icons/144.png similarity index 100% rename from res/vector-icons/144.png rename to apps/web/res/vector-icons/144.png diff --git a/res/vector-icons/152.png b/apps/web/res/vector-icons/152.png similarity index 100% rename from res/vector-icons/152.png rename to apps/web/res/vector-icons/152.png diff --git a/res/vector-icons/180.png b/apps/web/res/vector-icons/180.png similarity index 100% rename from res/vector-icons/180.png rename to apps/web/res/vector-icons/180.png diff --git a/res/vector-icons/24.png b/apps/web/res/vector-icons/24.png similarity index 100% rename from res/vector-icons/24.png rename to apps/web/res/vector-icons/24.png diff --git a/res/vector-icons/512.png b/apps/web/res/vector-icons/512.png similarity index 100% rename from res/vector-icons/512.png rename to apps/web/res/vector-icons/512.png diff --git a/res/welcome.html b/apps/web/res/welcome.html similarity index 100% rename from res/welcome.html rename to apps/web/res/welcome.html diff --git a/res/welcome/images/icon-create-account.svg b/apps/web/res/welcome/images/icon-create-account.svg similarity index 100% rename from res/welcome/images/icon-create-account.svg rename to apps/web/res/welcome/images/icon-create-account.svg diff --git a/res/welcome/images/icon-help.svg b/apps/web/res/welcome/images/icon-help.svg similarity index 100% rename from res/welcome/images/icon-help.svg rename to apps/web/res/welcome/images/icon-help.svg diff --git a/res/welcome/images/icon-room-directory.svg b/apps/web/res/welcome/images/icon-room-directory.svg similarity index 100% rename from res/welcome/images/icon-room-directory.svg rename to apps/web/res/welcome/images/icon-room-directory.svg diff --git a/res/welcome/images/icon-sign-in.svg b/apps/web/res/welcome/images/icon-sign-in.svg similarity index 100% rename from res/welcome/images/icon-sign-in.svg rename to apps/web/res/welcome/images/icon-sign-in.svg diff --git a/scripts/ci_package.sh b/apps/web/scripts/ci_package.sh similarity index 77% rename from scripts/ci_package.sh rename to apps/web/scripts/ci_package.sh index d5736420c3..e5da64a0e1 100755 --- a/scripts/ci_package.sh +++ b/apps/web/scripts/ci_package.sh @@ -6,6 +6,6 @@ set -ex rm dist/element-*.tar.gz || true # rm previous artifacts without failing if it doesn't exist -DIST_VERSION=`$(dirname $0)/get-version-from-git.sh` +DIST_VERSION=`$(dirname $0)/../../../scripts/get-version-from-git.sh` CI_PACKAGE=true DIST_VERSION=$DIST_VERSION scripts/package.sh diff --git a/scripts/cleanup.sh b/apps/web/scripts/cleanup.sh similarity index 100% rename from scripts/cleanup.sh rename to apps/web/scripts/cleanup.sh diff --git a/scripts/copy-res.ts b/apps/web/scripts/copy-res.ts similarity index 93% rename from scripts/copy-res.ts rename to apps/web/scripts/copy-res.ts index 94e456700d..4ce96a3d8e 100755 --- a/scripts/copy-res.ts +++ b/apps/web/scripts/copy-res.ts @@ -7,10 +7,10 @@ import * as chokidar from "chokidar"; import * as fs from "node:fs"; import _ from "lodash"; import webpack from "webpack"; -import type { Translations } from "matrix-web-i18n"; +import { type Translations } from "matrix-web-i18n"; const EW_I18N_BASE_PATH = "src/i18n/strings/"; -const SC_I18N_BASE_PATH = "packages/shared-components/src/i18n/strings/"; +const SC_I18N_BASE_PATH = "../../packages/shared-components/src/i18n/strings/"; const INCLUDE_LANGS = [...new Set([...fs.readdirSync(EW_I18N_BASE_PATH)])] .filter((fn) => fn.endsWith(".json")) @@ -28,16 +28,13 @@ function errCheck(err: unknown): void { } } -// Check if webapp exists -if (!fs.existsSync("webapp")) { - fs.mkdirSync("webapp"); -} -// Check if i18n exists -if (!fs.existsSync("webapp/i18n/")) { - fs.mkdirSync("webapp/i18n/"); +const I18N_DEST = "webapp/i18n/"; +// Check if webapp/i18n exists +if (!fs.existsSync(I18N_DEST)) { + fs.mkdirSync(I18N_DEST, { recursive: true }); } -const logWatch = (path: string) => { +const logWatch = (path: string): void => { if (verbose) { console.log(`Watching: ${path}`); } @@ -72,7 +69,7 @@ function prepareLangFile(lang: string): [filename: string, json: string] { return [filename, json]; } -function genLangFile(dest: string, filename: string, json: string) { +function genLangFile(dest: string, filename: string, json: string): void { fs.writeFileSync(dest + filename, json); if (verbose) { console.log("Generated language file: " + filename); @@ -139,7 +136,6 @@ function watchLanguage(lang: string, dest: string, langFileMap: Record>((m, l) => { const [filename, json] = prepareLangFile(l); if (!watch) { diff --git a/scripts/deploy.py b/apps/web/scripts/deploy.py similarity index 100% rename from scripts/deploy.py rename to apps/web/scripts/deploy.py diff --git a/scripts/package.sh b/apps/web/scripts/package.sh similarity index 98% rename from scripts/package.sh rename to apps/web/scripts/package.sh index d99f96f7ee..22411168a0 100755 --- a/scripts/package.sh +++ b/apps/web/scripts/package.sh @@ -8,7 +8,6 @@ else version=`git describe --dirty --tags || echo unknown` fi -pnpm nx clean VERSION=$version pnpm build # include the sample config in the tarball. Arguably this should be done by diff --git a/src/@types/common.ts b/apps/web/src/@types/common.ts similarity index 100% rename from src/@types/common.ts rename to apps/web/src/@types/common.ts diff --git a/src/@types/commonmark.ts b/apps/web/src/@types/commonmark.ts similarity index 100% rename from src/@types/commonmark.ts rename to apps/web/src/@types/commonmark.ts diff --git a/src/@types/diff-dom.d.ts b/apps/web/src/@types/diff-dom.d.ts similarity index 100% rename from src/@types/diff-dom.d.ts rename to apps/web/src/@types/diff-dom.d.ts diff --git a/src/@types/electron-to-chromium.d.ts b/apps/web/src/@types/electron-to-chromium.d.ts similarity index 100% rename from src/@types/electron-to-chromium.d.ts rename to apps/web/src/@types/electron-to-chromium.d.ts diff --git a/src/@types/global.d.ts b/apps/web/src/@types/global.d.ts similarity index 100% rename from src/@types/global.d.ts rename to apps/web/src/@types/global.d.ts diff --git a/src/@types/i18n.d.ts b/apps/web/src/@types/i18n.d.ts similarity index 100% rename from src/@types/i18n.d.ts rename to apps/web/src/@types/i18n.d.ts diff --git a/src/@types/invite-rules.ts b/apps/web/src/@types/invite-rules.ts similarity index 89% rename from src/@types/invite-rules.ts rename to apps/web/src/@types/invite-rules.ts index b51b9d377e..bc72a5e922 100644 --- a/src/@types/invite-rules.ts +++ b/apps/web/src/@types/invite-rules.ts @@ -6,7 +6,6 @@ Please see LICENSE files in the repository root for full details. */ export const INVITE_RULES_ACCOUNT_DATA_TYPE = "org.matrix.msc4155.invite_permission_config"; -export const MSC4380_INVITE_RULES_ACCOUNT_DATA_TYPE = "org.matrix.msc4380.invite_permission_config"; export interface InviteConfigAccountData { allowed_users?: string[]; diff --git a/src/@types/jitsi-meet.d.ts b/apps/web/src/@types/jitsi-meet.d.ts similarity index 100% rename from src/@types/jitsi-meet.d.ts rename to apps/web/src/@types/jitsi-meet.d.ts diff --git a/src/@types/json.ts b/apps/web/src/@types/json.ts similarity index 100% rename from src/@types/json.ts rename to apps/web/src/@types/json.ts diff --git a/src/@types/matrix-js-sdk.d.ts b/apps/web/src/@types/matrix-js-sdk.d.ts similarity index 94% rename from src/@types/matrix-js-sdk.d.ts rename to apps/web/src/@types/matrix-js-sdk.d.ts index 802ae0da21..3f36190e4e 100644 --- a/src/@types/matrix-js-sdk.d.ts +++ b/apps/web/src/@types/matrix-js-sdk.d.ts @@ -15,11 +15,7 @@ import type { EmptyObject } from "matrix-js-sdk/src/matrix"; import type { DeviceClientInformation } from "../utils/device/types.ts"; import type { UserWidget } from "../utils/WidgetUtils-types.ts"; import { type MediaPreviewConfig } from "./media_preview.ts"; -import { - type INVITE_RULES_ACCOUNT_DATA_TYPE, - type InviteConfigAccountData, - type MSC4380_INVITE_RULES_ACCOUNT_DATA_TYPE, -} from "./invite-rules.ts"; +import { type INVITE_RULES_ACCOUNT_DATA_TYPE, type InviteConfigAccountData } from "./invite-rules.ts"; // Extend Matrix JS SDK types via Typescript declaration merging to support unspecced event fields and types declare module "matrix-js-sdk/src/types" { @@ -96,8 +92,6 @@ declare module "matrix-js-sdk/src/types" { // MSC4155: Invite filtering [INVITE_RULES_ACCOUNT_DATA_TYPE]: InviteConfigAccountData; - [MSC4380_INVITE_RULES_ACCOUNT_DATA_TYPE]: { default_action?: "allow" | "block" }; - "io.element.msc4278.media_preview_config": MediaPreviewConfig; // Indicate whether recovery is enabled or disabled diff --git a/src/@types/media_preview.ts b/apps/web/src/@types/media_preview.ts similarity index 100% rename from src/@types/media_preview.ts rename to apps/web/src/@types/media_preview.ts diff --git a/src/@types/opus-recorder.d.ts b/apps/web/src/@types/opus-recorder.d.ts similarity index 100% rename from src/@types/opus-recorder.d.ts rename to apps/web/src/@types/opus-recorder.d.ts diff --git a/src/@types/polyfill.ts b/apps/web/src/@types/polyfill.ts similarity index 100% rename from src/@types/polyfill.ts rename to apps/web/src/@types/polyfill.ts diff --git a/src/@types/raw-loader.d.ts b/apps/web/src/@types/raw-loader.d.ts similarity index 100% rename from src/@types/raw-loader.d.ts rename to apps/web/src/@types/raw-loader.d.ts diff --git a/src/@types/react.d.ts b/apps/web/src/@types/react.d.ts similarity index 100% rename from src/@types/react.d.ts rename to apps/web/src/@types/react.d.ts diff --git a/src/@types/svg.d.ts b/apps/web/src/@types/svg.d.ts similarity index 100% rename from src/@types/svg.d.ts rename to apps/web/src/@types/svg.d.ts diff --git a/src/@types/worker-loader.d.ts b/apps/web/src/@types/worker-loader.d.ts similarity index 100% rename from src/@types/worker-loader.d.ts rename to apps/web/src/@types/worker-loader.d.ts diff --git a/src/AddThreepid.ts b/apps/web/src/AddThreepid.ts similarity index 100% rename from src/AddThreepid.ts rename to apps/web/src/AddThreepid.ts diff --git a/src/AsyncWrapper.tsx b/apps/web/src/AsyncWrapper.tsx similarity index 100% rename from src/AsyncWrapper.tsx rename to apps/web/src/AsyncWrapper.tsx diff --git a/src/Avatar.ts b/apps/web/src/Avatar.ts similarity index 100% rename from src/Avatar.ts rename to apps/web/src/Avatar.ts diff --git a/src/BasePlatform.ts b/apps/web/src/BasePlatform.ts similarity index 98% rename from src/BasePlatform.ts rename to apps/web/src/BasePlatform.ts index 5c81beb9ff..822b282e25 100644 --- a/src/BasePlatform.ts +++ b/apps/web/src/BasePlatform.ts @@ -245,14 +245,6 @@ export default abstract class BasePlatform { public loudNotification(ev: MatrixEvent, room: Room): void {} - public clearNotification(notif: Notification): void { - // Some browsers don't support this, e.g Safari on iOS - // https://developer.mozilla.org/en-US/docs/Web/API/Notification/close - if (notif.close) { - notif.close(); - } - } - /** * Returns true if the platform requires URL previews in tooltips, otherwise false. * @returns {boolean} whether the platform requires URL previews in tooltips diff --git a/src/BlurhashEncoder.ts b/apps/web/src/BlurhashEncoder.ts similarity index 100% rename from src/BlurhashEncoder.ts rename to apps/web/src/BlurhashEncoder.ts diff --git a/src/ContentMessages.ts b/apps/web/src/ContentMessages.ts similarity index 100% rename from src/ContentMessages.ts rename to apps/web/src/ContentMessages.ts diff --git a/src/CreateCrossSigning.ts b/apps/web/src/CreateCrossSigning.ts similarity index 100% rename from src/CreateCrossSigning.ts rename to apps/web/src/CreateCrossSigning.ts diff --git a/src/DateUtils.ts b/apps/web/src/DateUtils.ts similarity index 97% rename from src/DateUtils.ts rename to apps/web/src/DateUtils.ts index 82e7bfa880..cd4a440372 100644 --- a/src/DateUtils.ts +++ b/apps/web/src/DateUtils.ts @@ -23,8 +23,8 @@ export const DAY_MS = HOUR_MS * 24; */ export function getDaysArray(weekday: Intl.DateTimeFormatOptions["weekday"] = "short"): string[] { const sunday = 1672574400000; // 2023-01-01 12:00 UTC - const { format } = new Intl.DateTimeFormat(getUserLanguage(), { weekday, timeZone: "UTC" }); - return [...Array(7).keys()].map((day) => format(sunday + day * DAY_MS)); + const dateTimeFormat = new Intl.DateTimeFormat(getUserLanguage(), { weekday, timeZone: "UTC" }); + return [...Array(7).keys()].map((day) => dateTimeFormat.format(sunday + day * DAY_MS)); } /** @@ -32,8 +32,8 @@ export function getDaysArray(weekday: Intl.DateTimeFormatOptions["weekday"] = "s * @param month - format desired "numeric" | "2-digit" | "long" | "short" | "narrow" */ export function getMonthsArray(month: Intl.DateTimeFormatOptions["month"] = "short"): string[] { - const { format } = new Intl.DateTimeFormat(getUserLanguage(), { month, timeZone: "UTC" }); - return [...Array(12).keys()].map((m) => format(Date.UTC(2021, m))); + const dateTimeFormat = new Intl.DateTimeFormat(getUserLanguage(), { month, timeZone: "UTC" }); + return [...Array(12).keys()].map((m) => dateTimeFormat.format(Date.UTC(2021, m))); } // XXX: Ideally we could just specify `hour12: boolean` but it has issues on Chrome in the `en` locale diff --git a/src/DecryptionFailureTracker.ts b/apps/web/src/DecryptionFailureTracker.ts similarity index 100% rename from src/DecryptionFailureTracker.ts rename to apps/web/src/DecryptionFailureTracker.ts diff --git a/src/DraftCleaner.ts b/apps/web/src/DraftCleaner.ts similarity index 100% rename from src/DraftCleaner.ts rename to apps/web/src/DraftCleaner.ts diff --git a/src/Editing.ts b/apps/web/src/Editing.ts similarity index 100% rename from src/Editing.ts rename to apps/web/src/Editing.ts diff --git a/src/HtmlUtils.tsx b/apps/web/src/HtmlUtils.tsx similarity index 100% rename from src/HtmlUtils.tsx rename to apps/web/src/HtmlUtils.tsx diff --git a/src/IConfigOptions.ts b/apps/web/src/IConfigOptions.ts similarity index 98% rename from src/IConfigOptions.ts rename to apps/web/src/IConfigOptions.ts index fa9fd45c0a..9123078d5d 100644 --- a/src/IConfigOptions.ts +++ b/apps/web/src/IConfigOptions.ts @@ -134,8 +134,6 @@ export interface IConfigOptions { logout_redirect_url?: string; - // sso_immediate_redirect is deprecated in favour of sso_redirect_options.immediate - sso_immediate_redirect?: boolean; sso_redirect_options?: ISsoRedirectOptions; custom_translations_url?: string; diff --git a/src/IdentityAuthClient.tsx b/apps/web/src/IdentityAuthClient.tsx similarity index 100% rename from src/IdentityAuthClient.tsx rename to apps/web/src/IdentityAuthClient.tsx diff --git a/src/ImageUtils.ts b/apps/web/src/ImageUtils.ts similarity index 100% rename from src/ImageUtils.ts rename to apps/web/src/ImageUtils.ts diff --git a/src/KeyBindingsDefaults.ts b/apps/web/src/KeyBindingsDefaults.ts similarity index 100% rename from src/KeyBindingsDefaults.ts rename to apps/web/src/KeyBindingsDefaults.ts diff --git a/src/KeyBindingsManager.ts b/apps/web/src/KeyBindingsManager.ts similarity index 100% rename from src/KeyBindingsManager.ts rename to apps/web/src/KeyBindingsManager.ts diff --git a/src/Keyboard.ts b/apps/web/src/Keyboard.ts similarity index 100% rename from src/Keyboard.ts rename to apps/web/src/Keyboard.ts diff --git a/src/LegacyCallHandler.tsx b/apps/web/src/LegacyCallHandler.tsx similarity index 100% rename from src/LegacyCallHandler.tsx rename to apps/web/src/LegacyCallHandler.tsx diff --git a/src/Lifecycle.ts b/apps/web/src/Lifecycle.ts similarity index 100% rename from src/Lifecycle.ts rename to apps/web/src/Lifecycle.ts diff --git a/src/Linkify.tsx b/apps/web/src/Linkify.tsx similarity index 100% rename from src/Linkify.tsx rename to apps/web/src/Linkify.tsx diff --git a/src/Livestream.ts b/apps/web/src/Livestream.ts similarity index 100% rename from src/Livestream.ts rename to apps/web/src/Livestream.ts diff --git a/src/Login.ts b/apps/web/src/Login.ts similarity index 99% rename from src/Login.ts rename to apps/web/src/Login.ts index d5992af2ab..34b6513ad1 100644 --- a/src/Login.ts +++ b/apps/web/src/Login.ts @@ -118,7 +118,7 @@ export default class Login { ); return [oidcFlow]; } catch (error) { - logger.error(error); + logger.error("Failed to get oidc native flow", error); } } diff --git a/src/Markdown.ts b/apps/web/src/Markdown.ts similarity index 100% rename from src/Markdown.ts rename to apps/web/src/Markdown.ts diff --git a/src/MatrixClientPeg.ts b/apps/web/src/MatrixClientPeg.ts similarity index 100% rename from src/MatrixClientPeg.ts rename to apps/web/src/MatrixClientPeg.ts diff --git a/src/MediaDeviceHandler.ts b/apps/web/src/MediaDeviceHandler.ts similarity index 100% rename from src/MediaDeviceHandler.ts rename to apps/web/src/MediaDeviceHandler.ts diff --git a/src/Modal.tsx b/apps/web/src/Modal.tsx similarity index 89% rename from src/Modal.tsx rename to apps/web/src/Modal.tsx index e2873783ea..d92f83d7f1 100644 --- a/src/Modal.tsx +++ b/apps/web/src/Modal.tsx @@ -12,6 +12,7 @@ import { createRoot, type Root } from "react-dom/client"; import classNames from "classnames"; import { TypedEventEmitter } from "matrix-js-sdk/src/matrix"; import { Glass, TooltipProvider } from "@vector-im/compound-web"; +import { I18nContext } from "@element-hq/web-shared-components"; import defaultDispatcher from "./dispatcher/dispatcher"; import AsyncWrapper from "./AsyncWrapper"; @@ -92,7 +93,7 @@ export interface IHandle { * * @param args - Arguments to return to {@link finished}. */ - close(...args: OnFinishedParams): void; + close(this: void, ...args: OnFinishedParams): void; } interface IOptions { @@ -436,18 +437,21 @@ export class ModalManager extends TypedEventEmitter - -
- -
{this.staticModal.elem}
-
-
-
- + {/* Provide I18nContext for shared-components used inside dialogs rendered in a separate root. */} + + +
+ +
{this.staticModal.elem}
+
+
+
+ + ); @@ -465,18 +469,21 @@ export class ModalManager extends TypedEventEmitter - -
- -
{modal.elem}
-
-
-
- + {/* Provide I18nContext for shared-components used inside dialogs rendered in a separate root. */} + + +
+ +
{modal.elem}
+
+
+
+ + ); diff --git a/src/NodeAnimator.tsx b/apps/web/src/NodeAnimator.tsx similarity index 100% rename from src/NodeAnimator.tsx rename to apps/web/src/NodeAnimator.tsx diff --git a/src/Notifier.ts b/apps/web/src/Notifier.ts similarity index 99% rename from src/Notifier.ts rename to apps/web/src/Notifier.ts index 6f7922fb94..dbe890909e 100644 --- a/src/Notifier.ts +++ b/apps/web/src/Notifier.ts @@ -433,11 +433,9 @@ class NotifierClass extends TypedEventEmitter = { [PageType.UserView]: "User", }; +const SortingAlgorithmMap: Record = { + [SortingAlgorithm.Recency]: "Activity", + [SortingAlgorithm.Unread]: "Unread", + [SortingAlgorithm.Alphabetic]: "Alphabetic", +}; + export default class PosthogTrackers { private static internalInstance: PosthogTrackers; @@ -112,6 +120,22 @@ export default class PosthogTrackers { from, }); } + + /** + * Track when the user chooses a different sorting algorithm for the room-list. + * @param oldAlgorithm - The old algorithm. + * @param newAlgorithm - The new algorithm. + */ + public static trackRoomListSortingAlgorithmChange( + oldAlgorithm: SortingAlgorithm, + newAlgorithm: SortingAlgorithm, + ): void { + PosthogAnalytics.instance.trackEvent({ + eventName: "RoomListSortingAlgorithmChanged", + oldAlgorithm: SortingAlgorithmMap[oldAlgorithm], + newAlgorithm: SortingAlgorithmMap[newAlgorithm], + }); + } } export class PosthogScreenTracker extends PureComponent<{ screenName: ScreenName }> { diff --git a/src/Presence.ts b/apps/web/src/Presence.ts similarity index 100% rename from src/Presence.ts rename to apps/web/src/Presence.ts diff --git a/src/Registration.tsx b/apps/web/src/Registration.tsx similarity index 100% rename from src/Registration.tsx rename to apps/web/src/Registration.tsx diff --git a/src/Resend.ts b/apps/web/src/Resend.ts similarity index 100% rename from src/Resend.ts rename to apps/web/src/Resend.ts diff --git a/src/Roles.ts b/apps/web/src/Roles.ts similarity index 100% rename from src/Roles.ts rename to apps/web/src/Roles.ts diff --git a/src/RoomAliasCache.ts b/apps/web/src/RoomAliasCache.ts similarity index 100% rename from src/RoomAliasCache.ts rename to apps/web/src/RoomAliasCache.ts diff --git a/src/RoomInvite.tsx b/apps/web/src/RoomInvite.tsx similarity index 100% rename from src/RoomInvite.tsx rename to apps/web/src/RoomInvite.tsx diff --git a/src/RoomNotifs.ts b/apps/web/src/RoomNotifs.ts similarity index 100% rename from src/RoomNotifs.ts rename to apps/web/src/RoomNotifs.ts diff --git a/src/Rooms.ts b/apps/web/src/Rooms.ts similarity index 100% rename from src/Rooms.ts rename to apps/web/src/Rooms.ts diff --git a/src/ScalarAuthClient.ts b/apps/web/src/ScalarAuthClient.ts similarity index 100% rename from src/ScalarAuthClient.ts rename to apps/web/src/ScalarAuthClient.ts diff --git a/src/ScalarMessaging.ts b/apps/web/src/ScalarMessaging.ts similarity index 100% rename from src/ScalarMessaging.ts rename to apps/web/src/ScalarMessaging.ts diff --git a/src/SdkConfig.ts b/apps/web/src/SdkConfig.ts similarity index 91% rename from src/SdkConfig.ts rename to apps/web/src/SdkConfig.ts index f4b95fa4f9..27fc803329 100644 --- a/src/SdkConfig.ts +++ b/apps/web/src/SdkConfig.ts @@ -10,7 +10,7 @@ Please see LICENSE files in the repository root for full details. import { mergeWith } from "lodash"; import { SnakedObject } from "./utils/SnakedObject"; -import { type IConfigOptions, type ISsoRedirectOptions } from "./IConfigOptions"; +import { type IConfigOptions } from "./IConfigOptions"; import { isObject, objectClone } from "./utils/objects"; import { type DeepReadonly, type Defaultize } from "./@types/common"; @@ -141,14 +141,3 @@ export default class SdkConfig { SdkConfig.put(mergeConfig(SdkConfig.get(), cfg)); } } - -export function parseSsoRedirectOptions(config: IConfigOptions): ISsoRedirectOptions { - // Ignore deprecated options if the config is using new ones - if (config.sso_redirect_options) return config.sso_redirect_options; - - // We can cheat here because the default is false anyways - if (config.sso_immediate_redirect) return { immediate: true }; - - // Default: do nothing - return {}; -} diff --git a/src/Searching.ts b/apps/web/src/Searching.ts similarity index 100% rename from src/Searching.ts rename to apps/web/src/Searching.ts diff --git a/src/SecurityManager.ts b/apps/web/src/SecurityManager.ts similarity index 100% rename from src/SecurityManager.ts rename to apps/web/src/SecurityManager.ts diff --git a/src/SendHistoryManager.ts b/apps/web/src/SendHistoryManager.ts similarity index 100% rename from src/SendHistoryManager.ts rename to apps/web/src/SendHistoryManager.ts diff --git a/src/SlidingSyncManager.ts b/apps/web/src/SlidingSyncManager.ts similarity index 100% rename from src/SlidingSyncManager.ts rename to apps/web/src/SlidingSyncManager.ts diff --git a/src/SupportedBrowser.ts b/apps/web/src/SupportedBrowser.ts similarity index 100% rename from src/SupportedBrowser.ts rename to apps/web/src/SupportedBrowser.ts diff --git a/src/Terms.ts b/apps/web/src/Terms.ts similarity index 100% rename from src/Terms.ts rename to apps/web/src/Terms.ts diff --git a/src/TextForEvent.tsx b/apps/web/src/TextForEvent.tsx similarity index 100% rename from src/TextForEvent.tsx rename to apps/web/src/TextForEvent.tsx diff --git a/src/TimezoneHandler.ts b/apps/web/src/TimezoneHandler.ts similarity index 100% rename from src/TimezoneHandler.ts rename to apps/web/src/TimezoneHandler.ts diff --git a/src/Typeguards.ts b/apps/web/src/Typeguards.ts similarity index 100% rename from src/Typeguards.ts rename to apps/web/src/Typeguards.ts diff --git a/src/Unread.ts b/apps/web/src/Unread.ts similarity index 100% rename from src/Unread.ts rename to apps/web/src/Unread.ts diff --git a/src/UserActivity.ts b/apps/web/src/UserActivity.ts similarity index 100% rename from src/UserActivity.ts rename to apps/web/src/UserActivity.ts diff --git a/src/UserAddress.ts b/apps/web/src/UserAddress.ts similarity index 100% rename from src/UserAddress.ts rename to apps/web/src/UserAddress.ts diff --git a/src/Views.ts b/apps/web/src/Views.ts similarity index 100% rename from src/Views.ts rename to apps/web/src/Views.ts diff --git a/src/WhoIsTyping.ts b/apps/web/src/WhoIsTyping.ts similarity index 100% rename from src/WhoIsTyping.ts rename to apps/web/src/WhoIsTyping.ts diff --git a/src/WorkerManager.ts b/apps/web/src/WorkerManager.ts similarity index 100% rename from src/WorkerManager.ts rename to apps/web/src/WorkerManager.ts diff --git a/src/accessibility/KeyboardShortcutUtils.ts b/apps/web/src/accessibility/KeyboardShortcutUtils.ts similarity index 100% rename from src/accessibility/KeyboardShortcutUtils.ts rename to apps/web/src/accessibility/KeyboardShortcutUtils.ts diff --git a/src/accessibility/KeyboardShortcuts.ts b/apps/web/src/accessibility/KeyboardShortcuts.ts similarity index 100% rename from src/accessibility/KeyboardShortcuts.ts rename to apps/web/src/accessibility/KeyboardShortcuts.ts diff --git a/src/accessibility/LandmarkNavigation.ts b/apps/web/src/accessibility/LandmarkNavigation.ts similarity index 100% rename from src/accessibility/LandmarkNavigation.ts rename to apps/web/src/accessibility/LandmarkNavigation.ts diff --git a/src/accessibility/RovingTabIndex.tsx b/apps/web/src/accessibility/RovingTabIndex.tsx similarity index 97% rename from src/accessibility/RovingTabIndex.tsx rename to apps/web/src/accessibility/RovingTabIndex.tsx index 9942b4398c..947024661e 100644 --- a/src/accessibility/RovingTabIndex.tsx +++ b/apps/web/src/accessibility/RovingTabIndex.tsx @@ -171,8 +171,14 @@ interface IProps { handleLeftRight?: boolean; handleInputFields?: boolean; scrollIntoView?: boolean | ScrollIntoViewOptions; - children(renderProps: { onKeyDownHandler(ev: React.KeyboardEvent): void; onDragEndHandler(): void }): ReactNode; - onKeyDown?(ev: React.KeyboardEvent, state: IState, dispatch: Dispatch): void; + children( + this: void, + renderProps: { + onKeyDownHandler(this: void, ev: React.KeyboardEvent): void; + onDragEndHandler(this: void): void; + }, + ): ReactNode; + onKeyDown?(this: void, ev: React.KeyboardEvent, state: IState, dispatch: Dispatch): void; } export const findSiblingElement = ( diff --git a/src/accessibility/Toolbar.tsx b/apps/web/src/accessibility/Toolbar.tsx similarity index 100% rename from src/accessibility/Toolbar.tsx rename to apps/web/src/accessibility/Toolbar.tsx diff --git a/src/accessibility/context_menu/ContextMenuButton.tsx b/apps/web/src/accessibility/context_menu/ContextMenuButton.tsx similarity index 100% rename from src/accessibility/context_menu/ContextMenuButton.tsx rename to apps/web/src/accessibility/context_menu/ContextMenuButton.tsx diff --git a/src/accessibility/context_menu/ContextMenuTooltipButton.tsx b/apps/web/src/accessibility/context_menu/ContextMenuTooltipButton.tsx similarity index 100% rename from src/accessibility/context_menu/ContextMenuTooltipButton.tsx rename to apps/web/src/accessibility/context_menu/ContextMenuTooltipButton.tsx diff --git a/src/accessibility/context_menu/MenuItem.tsx b/apps/web/src/accessibility/context_menu/MenuItem.tsx similarity index 100% rename from src/accessibility/context_menu/MenuItem.tsx rename to apps/web/src/accessibility/context_menu/MenuItem.tsx diff --git a/src/accessibility/context_menu/MenuItemCheckbox.tsx b/apps/web/src/accessibility/context_menu/MenuItemCheckbox.tsx similarity index 100% rename from src/accessibility/context_menu/MenuItemCheckbox.tsx rename to apps/web/src/accessibility/context_menu/MenuItemCheckbox.tsx diff --git a/src/accessibility/context_menu/MenuItemRadio.tsx b/apps/web/src/accessibility/context_menu/MenuItemRadio.tsx similarity index 100% rename from src/accessibility/context_menu/MenuItemRadio.tsx rename to apps/web/src/accessibility/context_menu/MenuItemRadio.tsx diff --git a/src/accessibility/context_menu/StyledMenuItemCheckbox.tsx b/apps/web/src/accessibility/context_menu/StyledMenuItemCheckbox.tsx similarity index 92% rename from src/accessibility/context_menu/StyledMenuItemCheckbox.tsx rename to apps/web/src/accessibility/context_menu/StyledMenuItemCheckbox.tsx index f208eb1091..82175199ae 100644 --- a/src/accessibility/context_menu/StyledMenuItemCheckbox.tsx +++ b/apps/web/src/accessibility/context_menu/StyledMenuItemCheckbox.tsx @@ -16,8 +16,8 @@ import { KeyBindingAction } from "../KeyboardShortcuts"; import { getKeyBindingsManager } from "../../KeyBindingsManager"; interface IProps extends React.ComponentProps { - onChange(): void; // we handle keyup/down ourselves so lose the ChangeEvent - onClose(): void; // gets called after onChange on KeyBindingAction.ActivateSelectedButton + onChange(this: void): void; // we handle keyup/down ourselves so lose the ChangeEvent + onClose(this: void): void; // gets called after onChange on KeyBindingAction.ActivateSelectedButton } // Semantic component for representing a styled role=menuitemcheckbox diff --git a/src/accessibility/context_menu/StyledMenuItemRadio.tsx b/apps/web/src/accessibility/context_menu/StyledMenuItemRadio.tsx similarity index 93% rename from src/accessibility/context_menu/StyledMenuItemRadio.tsx rename to apps/web/src/accessibility/context_menu/StyledMenuItemRadio.tsx index 5bf6d4706c..62213b33c6 100644 --- a/src/accessibility/context_menu/StyledMenuItemRadio.tsx +++ b/apps/web/src/accessibility/context_menu/StyledMenuItemRadio.tsx @@ -17,8 +17,8 @@ import { getKeyBindingsManager } from "../../KeyBindingsManager"; interface IProps extends React.ComponentProps { label?: string; - onChange(): void; // we handle keyup/down ourselves so lose the ChangeEvent - onClose(): void; // gets called after onChange on KeyBindingAction.Enter + onChange(this: void): void; // we handle keyup/down ourselves so lose the ChangeEvent + onClose(this: void): void; // gets called after onChange on KeyBindingAction.Enter } // Semantic component for representing a styled role=menuitemradio diff --git a/src/accessibility/roving/RovingAccessibleButton.tsx b/apps/web/src/accessibility/roving/RovingAccessibleButton.tsx similarity index 100% rename from src/accessibility/roving/RovingAccessibleButton.tsx rename to apps/web/src/accessibility/roving/RovingAccessibleButton.tsx diff --git a/src/accessibility/roving/RovingTabIndexWrapper.tsx b/apps/web/src/accessibility/roving/RovingTabIndexWrapper.tsx similarity index 79% rename from src/accessibility/roving/RovingTabIndexWrapper.tsx rename to apps/web/src/accessibility/roving/RovingTabIndexWrapper.tsx index f2c7c98dd3..5d2f001241 100644 --- a/src/accessibility/roving/RovingTabIndexWrapper.tsx +++ b/apps/web/src/accessibility/roving/RovingTabIndexWrapper.tsx @@ -14,11 +14,14 @@ import { type FocusHandler } from "./types"; interface IProps { inputRef?: RefObject; - children(renderProps: { - onFocus: FocusHandler; - isActive: boolean; - ref: RefCallback; - }): ReactElement; + children( + this: void, + renderProps: { + onFocus: FocusHandler; + isActive: boolean; + ref: RefCallback; + }, + ): ReactElement; } // Wrapper to allow use of useRovingTabIndex outside of React Functional Components. diff --git a/src/accessibility/roving/types.ts b/apps/web/src/accessibility/roving/types.ts similarity index 100% rename from src/accessibility/roving/types.ts rename to apps/web/src/accessibility/roving/types.ts diff --git a/src/actions/MatrixActionCreators.ts b/apps/web/src/actions/MatrixActionCreators.ts similarity index 100% rename from src/actions/MatrixActionCreators.ts rename to apps/web/src/actions/MatrixActionCreators.ts diff --git a/src/actions/RoomListActions.ts b/apps/web/src/actions/RoomListActions.ts similarity index 100% rename from src/actions/RoomListActions.ts rename to apps/web/src/actions/RoomListActions.ts diff --git a/src/actions/actionCreators.ts b/apps/web/src/actions/actionCreators.ts similarity index 100% rename from src/actions/actionCreators.ts rename to apps/web/src/actions/actionCreators.ts diff --git a/src/actions/handlers/viewUserDeviceSettings.ts b/apps/web/src/actions/handlers/viewUserDeviceSettings.ts similarity index 100% rename from src/actions/handlers/viewUserDeviceSettings.ts rename to apps/web/src/actions/handlers/viewUserDeviceSettings.ts diff --git a/src/async-components/structures/ErrorView.tsx b/apps/web/src/async-components/structures/ErrorView.tsx similarity index 99% rename from src/async-components/structures/ErrorView.tsx rename to apps/web/src/async-components/structures/ErrorView.tsx index 80a3d8dba1..7271bac0cf 100644 --- a/src/async-components/structures/ErrorView.tsx +++ b/apps/web/src/async-components/structures/ErrorView.tsx @@ -116,7 +116,7 @@ const linkFactory = ); export const UnsupportedBrowserView: React.FC<{ - onAccept?(): void; + onAccept?(this: void): void; }> = ({ onAccept }) => { const config = SdkConfig.get(); const brand = config.brand ?? "Element"; diff --git a/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.tsx b/apps/web/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.tsx similarity index 100% rename from src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.tsx rename to apps/web/src/async-components/views/dialogs/eventindex/DisableEventIndexDialog.tsx diff --git a/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.tsx b/apps/web/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.tsx similarity index 100% rename from src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.tsx rename to apps/web/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.tsx diff --git a/src/async-components/views/dialogs/security/CreateSecretStorageDialog.tsx b/apps/web/src/async-components/views/dialogs/security/CreateSecretStorageDialog.tsx similarity index 100% rename from src/async-components/views/dialogs/security/CreateSecretStorageDialog.tsx rename to apps/web/src/async-components/views/dialogs/security/CreateSecretStorageDialog.tsx diff --git a/src/async-components/views/dialogs/security/ExportE2eKeysDialog.tsx b/apps/web/src/async-components/views/dialogs/security/ExportE2eKeysDialog.tsx similarity index 100% rename from src/async-components/views/dialogs/security/ExportE2eKeysDialog.tsx rename to apps/web/src/async-components/views/dialogs/security/ExportE2eKeysDialog.tsx diff --git a/src/async-components/views/dialogs/security/ImportE2eKeysDialog.tsx b/apps/web/src/async-components/views/dialogs/security/ImportE2eKeysDialog.tsx similarity index 100% rename from src/async-components/views/dialogs/security/ImportE2eKeysDialog.tsx rename to apps/web/src/async-components/views/dialogs/security/ImportE2eKeysDialog.tsx diff --git a/src/async-components/views/dialogs/security/NewRecoveryMethodDialog.tsx b/apps/web/src/async-components/views/dialogs/security/NewRecoveryMethodDialog.tsx similarity index 98% rename from src/async-components/views/dialogs/security/NewRecoveryMethodDialog.tsx rename to apps/web/src/async-components/views/dialogs/security/NewRecoveryMethodDialog.tsx index 2642f01560..de3583fef9 100644 --- a/src/async-components/views/dialogs/security/NewRecoveryMethodDialog.tsx +++ b/apps/web/src/async-components/views/dialogs/security/NewRecoveryMethodDialog.tsx @@ -26,7 +26,7 @@ interface NewRecoveryMethodDialogProps { /** * Callback when the dialog is dismissed. */ - onFinished(): void; + onFinished(this: void): void; } // Export as default instead of a named export so that it can be dynamically imported with React lazy diff --git a/src/async-components/views/dialogs/security/RecoveryMethodRemovedDialog.tsx b/apps/web/src/async-components/views/dialogs/security/RecoveryMethodRemovedDialog.tsx similarity index 100% rename from src/async-components/views/dialogs/security/RecoveryMethodRemovedDialog.tsx rename to apps/web/src/async-components/views/dialogs/security/RecoveryMethodRemovedDialog.tsx diff --git a/src/audio/BackgroundAudio.ts b/apps/web/src/audio/BackgroundAudio.ts similarity index 100% rename from src/audio/BackgroundAudio.ts rename to apps/web/src/audio/BackgroundAudio.ts diff --git a/src/audio/ManagedPlayback.ts b/apps/web/src/audio/ManagedPlayback.ts similarity index 100% rename from src/audio/ManagedPlayback.ts rename to apps/web/src/audio/ManagedPlayback.ts diff --git a/src/audio/Playback.ts b/apps/web/src/audio/Playback.ts similarity index 100% rename from src/audio/Playback.ts rename to apps/web/src/audio/Playback.ts diff --git a/src/audio/PlaybackClock.ts b/apps/web/src/audio/PlaybackClock.ts similarity index 100% rename from src/audio/PlaybackClock.ts rename to apps/web/src/audio/PlaybackClock.ts diff --git a/src/audio/PlaybackManager.ts b/apps/web/src/audio/PlaybackManager.ts similarity index 100% rename from src/audio/PlaybackManager.ts rename to apps/web/src/audio/PlaybackManager.ts diff --git a/src/audio/PlaybackQueue.ts b/apps/web/src/audio/PlaybackQueue.ts similarity index 100% rename from src/audio/PlaybackQueue.ts rename to apps/web/src/audio/PlaybackQueue.ts diff --git a/src/audio/RecorderWorklet.ts b/apps/web/src/audio/RecorderWorklet.ts similarity index 100% rename from src/audio/RecorderWorklet.ts rename to apps/web/src/audio/RecorderWorklet.ts diff --git a/src/audio/VoiceMessageRecording.ts b/apps/web/src/audio/VoiceMessageRecording.ts similarity index 100% rename from src/audio/VoiceMessageRecording.ts rename to apps/web/src/audio/VoiceMessageRecording.ts diff --git a/src/audio/VoiceRecording.ts b/apps/web/src/audio/VoiceRecording.ts similarity index 100% rename from src/audio/VoiceRecording.ts rename to apps/web/src/audio/VoiceRecording.ts diff --git a/src/audio/compat.ts b/apps/web/src/audio/compat.ts similarity index 100% rename from src/audio/compat.ts rename to apps/web/src/audio/compat.ts diff --git a/src/audio/consts.ts b/apps/web/src/audio/consts.ts similarity index 100% rename from src/audio/consts.ts rename to apps/web/src/audio/consts.ts diff --git a/src/audio/recorderWorkletFactory.ts b/apps/web/src/audio/recorderWorkletFactory.ts similarity index 100% rename from src/audio/recorderWorkletFactory.ts rename to apps/web/src/audio/recorderWorkletFactory.ts diff --git a/src/autocomplete/AutocompleteProvider.tsx b/apps/web/src/autocomplete/AutocompleteProvider.tsx similarity index 100% rename from src/autocomplete/AutocompleteProvider.tsx rename to apps/web/src/autocomplete/AutocompleteProvider.tsx diff --git a/src/autocomplete/Autocompleter.ts b/apps/web/src/autocomplete/Autocompleter.ts similarity index 100% rename from src/autocomplete/Autocompleter.ts rename to apps/web/src/autocomplete/Autocompleter.ts diff --git a/src/autocomplete/CommandProvider.tsx b/apps/web/src/autocomplete/CommandProvider.tsx similarity index 100% rename from src/autocomplete/CommandProvider.tsx rename to apps/web/src/autocomplete/CommandProvider.tsx diff --git a/src/autocomplete/Components.tsx b/apps/web/src/autocomplete/Components.tsx similarity index 100% rename from src/autocomplete/Components.tsx rename to apps/web/src/autocomplete/Components.tsx diff --git a/src/autocomplete/EmojiProvider.tsx b/apps/web/src/autocomplete/EmojiProvider.tsx similarity index 100% rename from src/autocomplete/EmojiProvider.tsx rename to apps/web/src/autocomplete/EmojiProvider.tsx diff --git a/src/autocomplete/NotifProvider.tsx b/apps/web/src/autocomplete/NotifProvider.tsx similarity index 100% rename from src/autocomplete/NotifProvider.tsx rename to apps/web/src/autocomplete/NotifProvider.tsx diff --git a/src/autocomplete/QueryMatcher.ts b/apps/web/src/autocomplete/QueryMatcher.ts similarity index 100% rename from src/autocomplete/QueryMatcher.ts rename to apps/web/src/autocomplete/QueryMatcher.ts diff --git a/src/autocomplete/RoomProvider.tsx b/apps/web/src/autocomplete/RoomProvider.tsx similarity index 100% rename from src/autocomplete/RoomProvider.tsx rename to apps/web/src/autocomplete/RoomProvider.tsx diff --git a/src/autocomplete/SpaceProvider.tsx b/apps/web/src/autocomplete/SpaceProvider.tsx similarity index 100% rename from src/autocomplete/SpaceProvider.tsx rename to apps/web/src/autocomplete/SpaceProvider.tsx diff --git a/src/autocomplete/UserProvider.tsx b/apps/web/src/autocomplete/UserProvider.tsx similarity index 100% rename from src/autocomplete/UserProvider.tsx rename to apps/web/src/autocomplete/UserProvider.tsx diff --git a/src/boundThreepids.ts b/apps/web/src/boundThreepids.ts similarity index 100% rename from src/boundThreepids.ts rename to apps/web/src/boundThreepids.ts diff --git a/src/call-types.ts b/apps/web/src/call-types.ts similarity index 100% rename from src/call-types.ts rename to apps/web/src/call-types.ts diff --git a/src/components/structures/AutoHideScrollbar.tsx b/apps/web/src/components/structures/AutoHideScrollbar.tsx similarity index 100% rename from src/components/structures/AutoHideScrollbar.tsx rename to apps/web/src/components/structures/AutoHideScrollbar.tsx diff --git a/src/components/structures/AutocompleteInput.tsx b/apps/web/src/components/structures/AutocompleteInput.tsx similarity index 100% rename from src/components/structures/AutocompleteInput.tsx rename to apps/web/src/components/structures/AutocompleteInput.tsx diff --git a/src/components/structures/BackdropPanel.tsx b/apps/web/src/components/structures/BackdropPanel.tsx similarity index 100% rename from src/components/structures/BackdropPanel.tsx rename to apps/web/src/components/structures/BackdropPanel.tsx diff --git a/src/components/structures/ContextMenu.tsx b/apps/web/src/components/structures/ContextMenu.tsx similarity index 99% rename from src/components/structures/ContextMenu.tsx rename to apps/web/src/components/structures/ContextMenu.tsx index 03538a21bf..9d4b76e38e 100644 --- a/src/components/structures/ContextMenu.tsx +++ b/apps/web/src/components/structures/ContextMenu.tsx @@ -92,9 +92,9 @@ export interface IProps extends MenuProps { closeOnInteraction?: boolean; // Function to be called on menu close - onFinished(): void; + onFinished(this: void): void; // on resize callback - windowResize?(): void; + windowResize?(this: void): void; } interface IState { diff --git a/src/components/structures/EmbeddedPage.tsx b/apps/web/src/components/structures/EmbeddedPage.tsx similarity index 100% rename from src/components/structures/EmbeddedPage.tsx rename to apps/web/src/components/structures/EmbeddedPage.tsx diff --git a/src/components/structures/ErrorMessage.tsx b/apps/web/src/components/structures/ErrorMessage.tsx similarity index 100% rename from src/components/structures/ErrorMessage.tsx rename to apps/web/src/components/structures/ErrorMessage.tsx diff --git a/src/components/structures/FileDropTarget.tsx b/apps/web/src/components/structures/FileDropTarget.tsx similarity index 98% rename from src/components/structures/FileDropTarget.tsx rename to apps/web/src/components/structures/FileDropTarget.tsx index 5ad16303bf..564383d9f4 100644 --- a/src/components/structures/FileDropTarget.tsx +++ b/apps/web/src/components/structures/FileDropTarget.tsx @@ -16,7 +16,7 @@ import { useRoomState } from "../../hooks/useRoomState.ts"; interface IProps { room: Room; parent: HTMLElement | null; - onFileDrop(dataTransfer: DataTransfer): void; + onFileDrop(this: void, dataTransfer: DataTransfer): void; } interface IState { diff --git a/src/components/structures/FilePanel.tsx b/apps/web/src/components/structures/FilePanel.tsx similarity index 100% rename from src/components/structures/FilePanel.tsx rename to apps/web/src/components/structures/FilePanel.tsx diff --git a/src/components/structures/GenericDropdownMenu.tsx b/apps/web/src/components/structures/GenericDropdownMenu.tsx similarity index 100% rename from src/components/structures/GenericDropdownMenu.tsx rename to apps/web/src/components/structures/GenericDropdownMenu.tsx diff --git a/src/components/structures/HomePage.tsx b/apps/web/src/components/structures/HomePage.tsx similarity index 100% rename from src/components/structures/HomePage.tsx rename to apps/web/src/components/structures/HomePage.tsx diff --git a/src/components/structures/IndicatorScrollbar.tsx b/apps/web/src/components/structures/IndicatorScrollbar.tsx similarity index 100% rename from src/components/structures/IndicatorScrollbar.tsx rename to apps/web/src/components/structures/IndicatorScrollbar.tsx diff --git a/src/components/structures/InteractiveAuth.tsx b/apps/web/src/components/structures/InteractiveAuth.tsx similarity index 100% rename from src/components/structures/InteractiveAuth.tsx rename to apps/web/src/components/structures/InteractiveAuth.tsx diff --git a/src/components/structures/LargeLoader.tsx b/apps/web/src/components/structures/LargeLoader.tsx similarity index 100% rename from src/components/structures/LargeLoader.tsx rename to apps/web/src/components/structures/LargeLoader.tsx diff --git a/src/components/structures/LeftPanel.tsx b/apps/web/src/components/structures/LeftPanel.tsx similarity index 100% rename from src/components/structures/LeftPanel.tsx rename to apps/web/src/components/structures/LeftPanel.tsx diff --git a/src/components/structures/LegacyCallEventGrouper.ts b/apps/web/src/components/structures/LegacyCallEventGrouper.ts similarity index 100% rename from src/components/structures/LegacyCallEventGrouper.ts rename to apps/web/src/components/structures/LegacyCallEventGrouper.ts diff --git a/src/components/structures/LoggedInView.tsx b/apps/web/src/components/structures/LoggedInView.tsx similarity index 99% rename from src/components/structures/LoggedInView.tsx rename to apps/web/src/components/structures/LoggedInView.tsx index 70258e143c..03927a5689 100644 --- a/src/components/structures/LoggedInView.tsx +++ b/apps/web/src/components/structures/LoggedInView.tsx @@ -87,7 +87,7 @@ interface IProps { matrixClient: MatrixClient; // Called with the credentials of a registered user (if they were a ROU that // transitioned to PWLU) - onRegistered: (credentials: IMatrixClientCreds) => Promise; + onRegistered: (this: void, credentials: IMatrixClientCreds) => Promise; hideToSRUsers: boolean; // eslint-disable-next-line camelcase page_type?: string; diff --git a/src/components/structures/MainSplit.tsx b/apps/web/src/components/structures/MainSplit.tsx similarity index 100% rename from src/components/structures/MainSplit.tsx rename to apps/web/src/components/structures/MainSplit.tsx diff --git a/src/components/structures/MatrixChat.tsx b/apps/web/src/components/structures/MatrixChat.tsx similarity index 99% rename from src/components/structures/MatrixChat.tsx rename to apps/web/src/components/structures/MatrixChat.tsx index 4831f9ed89..3ba87f5043 100644 --- a/src/components/structures/MatrixChat.tsx +++ b/apps/web/src/components/structures/MatrixChat.tsx @@ -2023,7 +2023,7 @@ export default class MatrixChat extends React.PureComponent { this.setPageSubtitle(); } - private onLogoutClick(event: ButtonEvent): void { + private onLogoutClick(this: void, event: ButtonEvent): void { dis.dispatch({ action: "logout", }); @@ -2047,7 +2047,7 @@ export default class MatrixChat extends React.PureComponent { this.stores.resizeNotifier.notifyWindowResized(); }; - private dispatchTimelineResize(): void { + private dispatchTimelineResize(this: void): void { dis.dispatch({ action: "timeline_resize" }); } @@ -2068,7 +2068,7 @@ export default class MatrixChat extends React.PureComponent { }; // returns a promise which resolves to the new MatrixClient - private onRegistered(credentials: IMatrixClientCreds): Promise { + private onRegistered(this: void, credentials: IMatrixClientCreds): Promise { return Lifecycle.setLoggedIn(credentials); } diff --git a/src/components/structures/MatrixClientContextProvider.tsx b/apps/web/src/components/structures/MatrixClientContextProvider.tsx similarity index 100% rename from src/components/structures/MatrixClientContextProvider.tsx rename to apps/web/src/components/structures/MatrixClientContextProvider.tsx diff --git a/src/components/structures/MessagePanel.tsx b/apps/web/src/components/structures/MessagePanel.tsx similarity index 100% rename from src/components/structures/MessagePanel.tsx rename to apps/web/src/components/structures/MessagePanel.tsx diff --git a/src/components/structures/NonUrgentToastContainer.tsx b/apps/web/src/components/structures/NonUrgentToastContainer.tsx similarity index 100% rename from src/components/structures/NonUrgentToastContainer.tsx rename to apps/web/src/components/structures/NonUrgentToastContainer.tsx diff --git a/src/components/structures/NotificationPanel.tsx b/apps/web/src/components/structures/NotificationPanel.tsx similarity index 100% rename from src/components/structures/NotificationPanel.tsx rename to apps/web/src/components/structures/NotificationPanel.tsx diff --git a/src/components/structures/PictureInPictureDragger.tsx b/apps/web/src/components/structures/PictureInPictureDragger.tsx similarity index 100% rename from src/components/structures/PictureInPictureDragger.tsx rename to apps/web/src/components/structures/PictureInPictureDragger.tsx diff --git a/src/components/structures/PipContainer.tsx b/apps/web/src/components/structures/PipContainer.tsx similarity index 100% rename from src/components/structures/PipContainer.tsx rename to apps/web/src/components/structures/PipContainer.tsx diff --git a/src/components/structures/ReleaseAnnouncement.tsx b/apps/web/src/components/structures/ReleaseAnnouncement.tsx similarity index 100% rename from src/components/structures/ReleaseAnnouncement.tsx rename to apps/web/src/components/structures/ReleaseAnnouncement.tsx diff --git a/src/components/structures/RightPanel.tsx b/apps/web/src/components/structures/RightPanel.tsx similarity index 100% rename from src/components/structures/RightPanel.tsx rename to apps/web/src/components/structures/RightPanel.tsx diff --git a/src/components/structures/RoomSearch.tsx b/apps/web/src/components/structures/RoomSearch.tsx similarity index 97% rename from src/components/structures/RoomSearch.tsx rename to apps/web/src/components/structures/RoomSearch.tsx index 4c8329b6dd..f099032a63 100644 --- a/src/components/structures/RoomSearch.tsx +++ b/apps/web/src/components/structures/RoomSearch.tsx @@ -22,7 +22,7 @@ interface IProps { } export default class RoomSearch extends React.PureComponent { - private openSpotlight(): void { + private openSpotlight(this: void): void { defaultDispatcher.fire(Action.OpenSpotlight); } diff --git a/src/components/structures/RoomSearchView.tsx b/apps/web/src/components/structures/RoomSearchView.tsx similarity index 99% rename from src/components/structures/RoomSearchView.tsx rename to apps/web/src/components/structures/RoomSearchView.tsx index f19c0e0dc5..80ad9ad11e 100644 --- a/src/components/structures/RoomSearchView.tsx +++ b/apps/web/src/components/structures/RoomSearchView.tsx @@ -42,7 +42,7 @@ interface Props { promise: Promise; abortController?: AbortController; className: string; - onUpdate(inProgress: boolean, results: ISearchResults | null, error: Error | null): void; + onUpdate(this: void, inProgress: boolean, results: ISearchResults | null, error: Error | null): void; ref?: Ref; } diff --git a/src/components/structures/RoomView.tsx b/apps/web/src/components/structures/RoomView.tsx similarity index 99% rename from src/components/structures/RoomView.tsx rename to apps/web/src/components/structures/RoomView.tsx index 76177bc5c8..a8050571b2 100644 --- a/src/components/structures/RoomView.tsx +++ b/apps/web/src/components/structures/RoomView.tsx @@ -46,7 +46,11 @@ import { debounce, throttle } from "lodash"; import { CryptoEvent } from "matrix-js-sdk/src/crypto-api"; import { type ViewRoomOpts } from "@matrix-org/react-sdk-module-api/lib/lifecycles/RoomViewLifecycle"; import { type RoomViewProps } from "@element-hq/element-web-module-api"; -import { RoomStatusBarView, useCreateAutoDisposedViewModel } from "@element-hq/web-shared-components"; +import { + EncryptionEventView, + RoomStatusBarView, + useCreateAutoDisposedViewModel, +} from "@element-hq/web-shared-components"; import shouldHideEvent from "../../shouldHideEvent"; import { _t } from "../../languageHandler"; @@ -69,6 +73,7 @@ import { TimelineRenderingType, MainSplitContentType } from "../../contexts/Room import { E2EStatus, shieldStatusForRoom } from "../../utils/ShieldUtils"; import { Action } from "../../dispatcher/actions"; import { type IMatrixClientCreds } from "../../MatrixClientPeg"; +import { useMatrixClientContext } from "../../contexts/MatrixClientContext"; import ScrollPanel from "./ScrollPanel"; import TimelinePanel from "./TimelinePanel"; import ErrorBoundary from "../views/elements/ErrorBoundary"; @@ -111,7 +116,6 @@ import { type FocusComposerPayload } from "../../dispatcher/payloads/FocusCompos import { LocalRoom, LocalRoomState } from "../../models/LocalRoom"; import { createRoomFromLocalRoom } from "../../utils/direct-messages"; import NewRoomIntro from "../views/rooms/NewRoomIntro"; -import EncryptionEvent from "../views/messages/EncryptionEvent"; import { isLocalRoom } from "../../utils/localRoom/isLocalRoom"; import { type ShowThreadPayload } from "../../dispatcher/payloads/ShowThreadPayload"; import { LargeLoader } from "./LargeLoader"; @@ -136,6 +140,7 @@ import { type FocusMessageSearchPayload } from "../../dispatcher/payloads/FocusM import { isRoomEncrypted } from "../../hooks/useIsEncrypted"; import { type RoomViewStore } from "../../stores/RoomViewStore.tsx"; import { RoomStatusBarViewModel } from "../../viewmodels/room/RoomStatusBar.ts"; +import { EncryptionEventViewModel } from "../../viewmodels/event-tiles/EncryptionEventViewModel.ts"; const DEBUG = false; const PREVENT_MULTIPLE_JITSI_WITHIN = 30_000; @@ -313,7 +318,7 @@ function LocalRoomView(props: LocalRoomViewProps): ReactElement { let encryptionTile: ReactNode; if (encryptionEvent) { - encryptionTile = ; + encryptionTile = ; } let statusBar: ReactElement | null = null; @@ -405,6 +410,15 @@ function RoomStatusBarWrappedView(props: ConstructorParameters; } +/** + * Wrap an EncryptionEventView and ViewModel into one component, for usage with legacy React components. + */ +function EncryptionEventWrappedView({ mxEvent }: { mxEvent: MatrixEvent }): ReactElement | null { + const cli = useMatrixClientContext(); + const vm = useCreateAutoDisposedViewModel(() => new EncryptionEventViewModel({ mxEvent, cli })); + return ; +} + export class RoomView extends React.Component { // We cache the latest computed e2eStatus per room to show as soon as we switch rooms otherwise defaulting to // unencrypted causes a flicker which can yield confusion/concern in a larger room. diff --git a/src/components/structures/ScrollPanel.tsx b/apps/web/src/components/structures/ScrollPanel.tsx similarity index 100% rename from src/components/structures/ScrollPanel.tsx rename to apps/web/src/components/structures/ScrollPanel.tsx diff --git a/src/components/structures/SearchBox.tsx b/apps/web/src/components/structures/SearchBox.tsx similarity index 100% rename from src/components/structures/SearchBox.tsx rename to apps/web/src/components/structures/SearchBox.tsx diff --git a/src/components/structures/SpaceHierarchy.tsx b/apps/web/src/components/structures/SpaceHierarchy.tsx similarity index 98% rename from src/components/structures/SpaceHierarchy.tsx rename to apps/web/src/components/structures/SpaceHierarchy.tsx index e2b05c54f1..e799868240 100644 --- a/src/components/structures/SpaceHierarchy.tsx +++ b/apps/web/src/components/structures/SpaceHierarchy.tsx @@ -78,7 +78,7 @@ interface IProps { space: Room; initialText?: string; additionalButtons?: ReactNode; - showRoom(cli: MatrixClient, hierarchy: RoomHierarchy, roomId: string, roomType?: RoomType): void; + showRoom(this: void, cli: MatrixClient, hierarchy: RoomHierarchy, roomId: string, roomType?: RoomType): void; } interface ITileProps { @@ -88,9 +88,9 @@ interface ITileProps { numChildRooms?: number; hasPermissions?: boolean; children?: ReactNode; - onViewRoomClick(): void; - onJoinRoomClick(): Promise; - onToggleClick?(): void; + onViewRoomClick(this: void): void; + onJoinRoomClick(this: void): Promise; + onToggleClick?(this: void): void; } const Tile: React.FC = ({ @@ -468,9 +468,9 @@ interface IHierarchyLevelProps { hierarchy: RoomHierarchy; parents: Set; selectedMap?: Map>; - onViewRoomClick(roomId: string, roomType?: RoomType): void; - onJoinRoomClick(roomId: string, parents: Set): Promise; - onToggleClick?(parentId: string, childId: string): void; + onViewRoomClick(this: void, roomId: string, roomType?: RoomType): void; + onJoinRoomClick(this: void, roomId: string, parents: Set): Promise; + onToggleClick?(this: void, parentId: string, childId: string): void; } export const toLocalRoom = (cli: MatrixClient, room: HierarchyRoom, hierarchy: RoomHierarchy): HierarchyRoom => { @@ -600,7 +600,7 @@ export const useRoomHierarchy = ( rooms?: HierarchyRoom[]; hierarchy?: RoomHierarchy; error?: Error; - loadMore(pageSize?: number): Promise; + loadMore(this: void, pageSize?: number): Promise; } => { const [rooms, setRooms] = useState([]); const [hierarchy, setHierarchy] = useState(); diff --git a/src/components/structures/SpacePillButton.tsx b/apps/web/src/components/structures/SpacePillButton.tsx similarity index 95% rename from src/components/structures/SpacePillButton.tsx rename to apps/web/src/components/structures/SpacePillButton.tsx index 0093e2911b..2755de6d14 100644 --- a/src/components/structures/SpacePillButton.tsx +++ b/apps/web/src/components/structures/SpacePillButton.tsx @@ -13,7 +13,7 @@ const SpacePillButton: React.FC<{ title: string; icon: JSX.Element; description: string; - onClick(): void; + onClick(this: void): void; }> = ({ title, icon, description, onClick }) => { return ( diff --git a/src/components/structures/SpaceRoomView.tsx b/apps/web/src/components/structures/SpaceRoomView.tsx similarity index 98% rename from src/components/structures/SpaceRoomView.tsx rename to apps/web/src/components/structures/SpaceRoomView.tsx index bf43369d9e..7b7b79c126 100644 --- a/src/components/structures/SpaceRoomView.tsx +++ b/apps/web/src/components/structures/SpaceRoomView.tsx @@ -64,7 +64,6 @@ import AccessibleButton, { type ButtonEvent } from "../views/elements/Accessible import ErrorBoundary from "../views/elements/ErrorBoundary"; import Field from "../views/elements/Field"; import RoomFacePile from "../views/elements/RoomFacePile"; -import RoomName from "../views/elements/RoomName"; import RoomTopic from "../views/elements/RoomTopic"; import withValidation from "../views/elements/Validation"; import RoomInfoLine from "../views/rooms/RoomInfoLine"; @@ -76,6 +75,7 @@ import RightPanel from "./RightPanel"; import SpaceHierarchy, { showRoom } from "./SpaceHierarchy"; import { type RoomPermalinkCreator } from "../../utils/permalinks/Permalinks"; import SpacePillButton from "./SpacePillButton.tsx"; +import { useRoomName } from "../../hooks/useRoomName.ts"; interface IProps { space: Room; @@ -214,6 +214,7 @@ const SpaceLanding: React.FC<{ space: Room }> = ({ space }) => { const cli = useContext(MatrixClientContext); const myMembership = useMyRoomMembership(space); const userId = cli.getSafeUserId(); + const name = useRoomName(space); const storeIsShowingSpaceMembers = useCallback( () => @@ -273,12 +274,7 @@ const SpaceLanding: React.FC<{ space: Room }> = ({ space }) => {
- - {(name) => { - const tags = { name: () =>

{name}

}; - return _t("space|landing_welcome", {}, tags) as JSX.Element; - }} -
+ {_t("space|landing_welcome", {}, { name: () =>

{name}

})}
@@ -304,7 +300,7 @@ const SpaceSetupFirstRooms: React.FC<{ space: Room; title: string; description: JSX.Element; - onFinished(firstRoomId?: string): void; + onFinished(this: void, firstRoomId?: string): void; }> = ({ space, title, description, onFinished }) => { const [busy, setBusy] = useState(false); const [error, setError] = useState(""); @@ -399,7 +395,7 @@ const SpaceSetupFirstRooms: React.FC<{ const SpaceAddExistingRooms: React.FC<{ space: Room; - onFinished(): void; + onFinished(this: void): void; }> = ({ space, onFinished }) => { return (
@@ -423,7 +419,7 @@ const SpaceAddExistingRooms: React.FC<{ }; interface ISpaceSetupPublicShareProps extends Pick { - onFinished(): void; + onFinished(this: void): void; } const SpaceSetupPublicShare: React.FC = ({ @@ -455,7 +451,7 @@ const SpaceSetupPublicShare: React.FC = ({ const SpaceSetupPrivateScope: React.FC<{ space: Room; justCreatedOpts?: IOpts; - onFinished(createRooms: boolean): void; + onFinished(this: void, createRooms: boolean): void; }> = ({ space, justCreatedOpts, onFinished }) => { return (
@@ -498,7 +494,7 @@ const validateEmailRules = withValidation({ const SpaceSetupPrivateInvite: React.FC<{ space: Room; - onFinished(): void; + onFinished(this: void): void; }> = ({ space, onFinished }) => { const [busy, setBusy] = useState(false); const [error, setError] = useState(""); diff --git a/src/components/structures/SplashPage.tsx b/apps/web/src/components/structures/SplashPage.tsx similarity index 100% rename from src/components/structures/SplashPage.tsx rename to apps/web/src/components/structures/SplashPage.tsx diff --git a/src/components/structures/TabbedView.tsx b/apps/web/src/components/structures/TabbedView.tsx similarity index 100% rename from src/components/structures/TabbedView.tsx rename to apps/web/src/components/structures/TabbedView.tsx diff --git a/src/components/structures/ThreadPanel.tsx b/apps/web/src/components/structures/ThreadPanel.tsx similarity index 100% rename from src/components/structures/ThreadPanel.tsx rename to apps/web/src/components/structures/ThreadPanel.tsx diff --git a/src/components/structures/ThreadView.tsx b/apps/web/src/components/structures/ThreadView.tsx similarity index 100% rename from src/components/structures/ThreadView.tsx rename to apps/web/src/components/structures/ThreadView.tsx diff --git a/src/components/structures/TimelinePanel.tsx b/apps/web/src/components/structures/TimelinePanel.tsx similarity index 100% rename from src/components/structures/TimelinePanel.tsx rename to apps/web/src/components/structures/TimelinePanel.tsx diff --git a/src/components/structures/ToastContainer.tsx b/apps/web/src/components/structures/ToastContainer.tsx similarity index 100% rename from src/components/structures/ToastContainer.tsx rename to apps/web/src/components/structures/ToastContainer.tsx diff --git a/src/components/structures/UploadBar.tsx b/apps/web/src/components/structures/UploadBar.tsx similarity index 100% rename from src/components/structures/UploadBar.tsx rename to apps/web/src/components/structures/UploadBar.tsx diff --git a/src/components/structures/UserMenu.tsx b/apps/web/src/components/structures/UserMenu.tsx similarity index 86% rename from src/components/structures/UserMenu.tsx rename to apps/web/src/components/structures/UserMenu.tsx index 6f9b768588..b3f20a07ed 100644 --- a/src/components/structures/UserMenu.tsx +++ b/apps/web/src/components/structures/UserMenu.tsx @@ -6,7 +6,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import React, { type JSX, createRef, type ReactNode } from "react"; +import React, { type JSX, createRef, type ReactNode, useMemo } from "react"; import { type Room } from "matrix-js-sdk/src/matrix"; import { ChatSolidIcon, @@ -18,6 +18,7 @@ import { NotificationsSolidIcon, ThemeIcon, } from "@vector-im/compound-design-tokens/assets/web/icons"; +import { IconButton } from "@vector-im/compound-web"; import { MatrixClientPeg } from "../../MatrixClientPeg"; import defaultDispatcher from "../../dispatcher/dispatcher"; @@ -31,8 +32,8 @@ import FeedbackDialog from "../views/dialogs/FeedbackDialog"; import Modal from "../../Modal"; import LogoutDialog, { shouldShowLogoutDialog } from "../views/dialogs/LogoutDialog"; import SettingsStore from "../../settings/SettingsStore"; -import { findHighContrastTheme, getCustomTheme, isHighContrastTheme } from "../../theme"; -import { RovingAccessibleButton } from "../../accessibility/RovingTabIndex"; +import { findHighContrastTheme, isHighContrastTheme } from "../../theme"; +import { useRovingTabIndex } from "../../accessibility/RovingTabIndex"; import AccessibleButton, { type ButtonEvent } from "../views/elements/AccessibleButton"; import SdkConfig from "../../SdkConfig"; import { getHomePageUrl } from "../../utils/pages"; @@ -52,6 +53,8 @@ import PosthogTrackers from "../../PosthogTrackers"; import { type ViewHomePagePayload } from "../../dispatcher/payloads/ViewHomePagePayload"; import { SDKContext } from "../../contexts/SDKContext"; import { shouldShowFeedback } from "../../utils/Feedback"; +import ThemeWatcher, { ThemeWatcherEvent } from "../../settings/watchers/ThemeWatcher.ts"; +import { useTypedEventEmitterState } from "../../hooks/useEventEmitter.ts"; interface IProps { isPanelCollapsed: boolean; @@ -62,8 +65,6 @@ type PartialDOMRect = Pick; interface IState { contextMenuPosition: PartialDOMRect | null; - isDarkTheme: boolean; - isHighContrast: boolean; selectedSpace?: Room | null; } @@ -83,6 +84,51 @@ const below = (rect: PartialDOMRect): MenuProps => { }; }; +const ThemeSwitchButton = (): JSX.Element => { + const [onFocus, isActive, ref] = useRovingTabIndex(); + const themeWatcher = useMemo(() => new ThemeWatcher(), []); + const [isHighContrast, isDark] = useTypedEventEmitterState( + themeWatcher, + ThemeWatcherEvent.Change, + (theme: string) => [isHighContrastTheme(theme), themeWatcher.isUserOnDarkTheme()], + ); + + const onSwitchThemeClick = (ev: ButtonEvent): void => { + ev.preventDefault(); + ev.stopPropagation(); + + PosthogTrackers.trackInteraction("WebUserMenuThemeToggleButton", ev); + + // Disable system theme matching if the user hits this button + SettingsStore.setValue("use_system_theme", null, SettingLevel.DEVICE, false); + + let newTheme = isDark ? "light" : "dark"; + if (isHighContrast) { + const hcTheme = findHighContrastTheme(newTheme); + if (hcTheme) { + newTheme = hcTheme; + } + } + SettingsStore.setValue("theme", null, SettingLevel.DEVICE, newTheme); // set at same level as Appearance tab + themeWatcher.recheck(newTheme); + }; + + return ( + + + + ); +}; + export default class UserMenu extends React.Component { public static contextType = SDKContext; declare public context: React.ContextType; @@ -97,8 +143,6 @@ export default class UserMenu extends React.Component { this.state = { contextMenuPosition: null, - isDarkTheme: this.isUserOnDarkTheme(), - isHighContrast: this.isUserOnHighContrastTheme(), selectedSpace: SpaceStore.instance.activeSpaceRoom, }; } @@ -111,7 +155,6 @@ export default class UserMenu extends React.Component { OwnProfileStore.instance.on(UPDATE_EVENT, this.onProfileUpdate); SpaceStore.instance.on(UPDATE_SELECTED_SPACE, this.onSelectedSpaceUpdate); this.dispatcherRef = defaultDispatcher.register(this.onAction); - this.themeWatcherRef = SettingsStore.watchSetting("theme", null, this.onThemeChanged); } public componentWillUnmount(): void { @@ -122,30 +165,6 @@ export default class UserMenu extends React.Component { SpaceStore.instance.off(UPDATE_SELECTED_SPACE, this.onSelectedSpaceUpdate); } - private isUserOnDarkTheme(): boolean { - if (SettingsStore.getValue("use_system_theme")) { - return window.matchMedia("(prefers-color-scheme: dark)").matches; - } else { - const theme = SettingsStore.getValue("theme"); - if (theme.startsWith("custom-")) { - return !!getCustomTheme(theme.substring("custom-".length)).is_dark; - } - return theme === "dark"; - } - } - - private isUserOnHighContrastTheme(): boolean { - if (SettingsStore.getValue("use_system_theme")) { - return window.matchMedia("(prefers-contrast: more)").matches; - } else { - const theme = SettingsStore.getValue("theme"); - if (theme.startsWith("custom-")) { - return false; - } - return isHighContrastTheme(theme); - } - } - private onProfileUpdate = async (): Promise => { // the store triggered an update, so force a layout update. We don't // have any state to store here for that to magically happen. @@ -158,13 +177,6 @@ export default class UserMenu extends React.Component { }); }; - private onThemeChanged = (): void => { - this.setState({ - isDarkTheme: this.isUserOnDarkTheme(), - isHighContrast: this.isUserOnHighContrastTheme(), - }); - }; - private onAction = (payload: ActionPayload): void => { switch (payload.action) { case Action.ToggleUserMenu: @@ -200,25 +212,6 @@ export default class UserMenu extends React.Component { this.setState({ contextMenuPosition: null }); }; - private onSwitchThemeClick = (ev: ButtonEvent): void => { - ev.preventDefault(); - ev.stopPropagation(); - - PosthogTrackers.trackInteraction("WebUserMenuThemeToggleButton", ev); - - // Disable system theme matching if the user hits this button - SettingsStore.setValue("use_system_theme", null, SettingLevel.DEVICE, false); - - let newTheme = this.state.isDarkTheme ? "light" : "dark"; - if (this.state.isHighContrast) { - const hcTheme = findHighContrastTheme(newTheme); - if (hcTheme) { - newTheme = hcTheme; - } - } - SettingsStore.setValue("theme", null, SettingLevel.DEVICE, newTheme); // set at same level as Appearance tab - }; - private onSettingsOpen = (ev: ButtonEvent, tabId?: string, props?: Record): void => { ev.preventDefault(); ev.stopPropagation(); @@ -398,17 +391,7 @@ export default class UserMenu extends React.Component {
- - - +
{topSection} {primaryOptionList} diff --git a/src/components/structures/UserView.tsx b/apps/web/src/components/structures/UserView.tsx similarity index 100% rename from src/components/structures/UserView.tsx rename to apps/web/src/components/structures/UserView.tsx diff --git a/src/components/structures/ViewSource.tsx b/apps/web/src/components/structures/ViewSource.tsx similarity index 100% rename from src/components/structures/ViewSource.tsx rename to apps/web/src/components/structures/ViewSource.tsx diff --git a/src/components/structures/WaitingForThirdPartyRoomView.tsx b/apps/web/src/components/structures/WaitingForThirdPartyRoomView.tsx similarity index 100% rename from src/components/structures/WaitingForThirdPartyRoomView.tsx rename to apps/web/src/components/structures/WaitingForThirdPartyRoomView.tsx diff --git a/src/components/structures/auth/CompleteSecurity.tsx b/apps/web/src/components/structures/auth/CompleteSecurity.tsx similarity index 100% rename from src/components/structures/auth/CompleteSecurity.tsx rename to apps/web/src/components/structures/auth/CompleteSecurity.tsx diff --git a/src/components/structures/auth/ConfirmSessionLockTheftView.tsx b/apps/web/src/components/structures/auth/ConfirmSessionLockTheftView.tsx similarity index 100% rename from src/components/structures/auth/ConfirmSessionLockTheftView.tsx rename to apps/web/src/components/structures/auth/ConfirmSessionLockTheftView.tsx diff --git a/src/components/structures/auth/E2eSetup.tsx b/apps/web/src/components/structures/auth/E2eSetup.tsx similarity index 100% rename from src/components/structures/auth/E2eSetup.tsx rename to apps/web/src/components/structures/auth/E2eSetup.tsx diff --git a/src/components/structures/auth/ForgotPassword.tsx b/apps/web/src/components/structures/auth/ForgotPassword.tsx similarity index 97% rename from src/components/structures/auth/ForgotPassword.tsx rename to apps/web/src/components/structures/auth/ForgotPassword.tsx index 0a5080869b..c9d5466801 100644 --- a/src/components/structures/auth/ForgotPassword.tsx +++ b/apps/web/src/components/structures/auth/ForgotPassword.tsx @@ -12,6 +12,7 @@ import React, { type JSX, type ReactNode } from "react"; import { logger } from "matrix-js-sdk/src/logger"; import { sleep } from "matrix-js-sdk/src/utils"; import { LockSolidIcon, CheckIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; +import { Button } from "@vector-im/compound-web"; import { _t, _td } from "../../../languageHandler"; import Modal from "../../../Modal"; @@ -417,9 +418,9 @@ export default class ForgotPassword extends React.Component {
{this.state.errorText && } - + @@ -432,12 +433,9 @@ export default class ForgotPassword extends React.Component {

{_t("auth|reset_password|reset_successful")}

{this.state.logoutDevices ?

{_t("auth|reset_password|devices_logout_success")}

: null} - + ); } diff --git a/src/components/structures/auth/Login.tsx b/apps/web/src/components/structures/auth/Login.tsx similarity index 99% rename from src/components/structures/auth/Login.tsx rename to apps/web/src/components/structures/auth/Login.tsx index 9aca0046f2..006c6c7cb7 100644 --- a/src/components/structures/auth/Login.tsx +++ b/apps/web/src/components/structures/auth/Login.tsx @@ -10,6 +10,7 @@ import React, { type JSX, type ReactNode } from "react"; import classNames from "classnames"; import { logger } from "matrix-js-sdk/src/logger"; import { type SSOFlow, SSOAction } from "matrix-js-sdk/src/matrix"; +import { Button } from "@vector-im/compound-web"; import { _t, UserFriendlyError } from "../../../languageHandler"; import Login, { type ClientLoginFlow, type OidcNativeFlow } from "../../../Login"; @@ -439,9 +440,10 @@ export default class LoginComponent extends React.PureComponent private renderOidcNativeStep = (): React.ReactNode => { const flow = this.state.flows!.find((flow) => flow.type === "oidcNativeFlow")! as OidcNativeFlow; return ( - { await startOidcLogin( this.props.serverConfig.delegatedAuthentication!, @@ -452,7 +454,7 @@ export default class LoginComponent extends React.PureComponent }} > {_t("action|continue")} - + ); }; diff --git a/src/components/structures/auth/LoginSplashView.tsx b/apps/web/src/components/structures/auth/LoginSplashView.tsx similarity index 97% rename from src/components/structures/auth/LoginSplashView.tsx rename to apps/web/src/components/structures/auth/LoginSplashView.tsx index aae7980185..acdf3c86b3 100644 --- a/src/components/structures/auth/LoginSplashView.tsx +++ b/apps/web/src/components/structures/auth/LoginSplashView.tsx @@ -27,7 +27,7 @@ interface Props { * * @param event - The click event */ - onLogoutClick: (event: ButtonEvent) => void; + onLogoutClick: (this: void, event: ButtonEvent) => void; /** * Error that caused `/sync` to fail. If set, an error message will be shown on the splash screen. diff --git a/src/components/structures/auth/Registration.tsx b/apps/web/src/components/structures/auth/Registration.tsx similarity index 99% rename from src/components/structures/auth/Registration.tsx rename to apps/web/src/components/structures/auth/Registration.tsx index a5c713b3ea..6c5df8cce2 100644 --- a/src/components/structures/auth/Registration.tsx +++ b/apps/web/src/components/structures/auth/Registration.tsx @@ -23,6 +23,7 @@ import { import React, { type JSX, Fragment, type ReactNode } from "react"; import classNames from "classnames"; import { logger } from "matrix-js-sdk/src/logger"; +import { Button } from "@vector-im/compound-web"; import { _t } from "../../../languageHandler"; import { adminContactStrings, messageForResourceLimitError, resourceLimitStrings } from "../../../utils/ErrorUtils"; @@ -546,9 +547,10 @@ export default class Registration extends React.Component { ); } else if (this.state.matrixClient && this.state.oidcNativeFlow) { return ( - { await startOidcLogin( this.props.serverConfig.delegatedAuthentication!, @@ -560,7 +562,7 @@ export default class Registration extends React.Component { }} > {_t("action|continue")} - + ); } else if (this.state.matrixClient && this.state.flows.length) { let ssoSection: JSX.Element | undefined; diff --git a/src/components/structures/auth/SessionLockStolenView.tsx b/apps/web/src/components/structures/auth/SessionLockStolenView.tsx similarity index 100% rename from src/components/structures/auth/SessionLockStolenView.tsx rename to apps/web/src/components/structures/auth/SessionLockStolenView.tsx diff --git a/src/components/structures/auth/SetupEncryptionBody.tsx b/apps/web/src/components/structures/auth/SetupEncryptionBody.tsx similarity index 100% rename from src/components/structures/auth/SetupEncryptionBody.tsx rename to apps/web/src/components/structures/auth/SetupEncryptionBody.tsx diff --git a/src/components/structures/auth/SoftLogout.tsx b/apps/web/src/components/structures/auth/SoftLogout.tsx similarity index 100% rename from src/components/structures/auth/SoftLogout.tsx rename to apps/web/src/components/structures/auth/SoftLogout.tsx diff --git a/src/components/structures/auth/forgot-password/CheckEmail.tsx b/apps/web/src/components/structures/auth/forgot-password/CheckEmail.tsx similarity index 93% rename from src/components/structures/auth/forgot-password/CheckEmail.tsx rename to apps/web/src/components/structures/auth/forgot-password/CheckEmail.tsx index 64036507de..1525f330d7 100644 --- a/src/components/structures/auth/forgot-password/CheckEmail.tsx +++ b/apps/web/src/components/structures/auth/forgot-password/CheckEmail.tsx @@ -7,7 +7,7 @@ Please see LICENSE files in the repository root for full details. */ import React, { type ReactNode } from "react"; -import { Tooltip } from "@vector-im/compound-web"; +import { Button, Tooltip } from "@vector-im/compound-web"; import { RestartIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; import AccessibleButton from "../../../views/elements/AccessibleButton"; @@ -55,7 +55,9 @@ export const CheckEmail: React.FC = ({
{errorText && } - +
{_t("auth|check_email_resend_prompt")} diff --git a/src/components/structures/auth/forgot-password/EnterEmail.tsx b/apps/web/src/components/structures/auth/forgot-password/EnterEmail.tsx similarity index 95% rename from src/components/structures/auth/forgot-password/EnterEmail.tsx rename to apps/web/src/components/structures/auth/forgot-password/EnterEmail.tsx index 643cb6c963..75907b2a5e 100644 --- a/src/components/structures/auth/forgot-password/EnterEmail.tsx +++ b/apps/web/src/components/structures/auth/forgot-password/EnterEmail.tsx @@ -8,6 +8,7 @@ Please see LICENSE files in the repository root for full details. import React, { type ReactNode, useRef } from "react"; import { EmailSolidIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; +import { Button } from "@vector-im/compound-web"; import { _t, _td } from "../../../../languageHandler"; import EmailField from "../../../views/auth/EmailField"; @@ -74,9 +75,9 @@ export const EnterEmail: React.FC = ({ />
{errorText && } - +
{ /> {forgotPasswordJsx} {!this.props.busy && ( - + )}
diff --git a/src/components/views/auth/RegistrationForm.tsx b/apps/web/src/components/views/auth/RegistrationForm.tsx similarity index 98% rename from src/components/views/auth/RegistrationForm.tsx rename to apps/web/src/components/views/auth/RegistrationForm.tsx index 88e9aa0615..113ea833ea 100644 --- a/src/components/views/auth/RegistrationForm.tsx +++ b/apps/web/src/components/views/auth/RegistrationForm.tsx @@ -10,6 +10,7 @@ Please see LICENSE files in the repository root for full details. import React, { type JSX, type BaseSyntheticEvent, type ComponentProps, type ReactNode } from "react"; import { type MatrixClient, MatrixError } from "matrix-js-sdk/src/matrix"; import { logger } from "matrix-js-sdk/src/logger"; +import { Button } from "@vector-im/compound-web"; import * as Email from "../../../email"; import { looksValid as phoneNumberLooksValid, type PhoneNumberCountryDefinition } from "../../../phonenumber"; @@ -548,12 +549,9 @@ export default class RegistrationForm extends React.PureComponent + ); let emailHelperText: JSX.Element | undefined; diff --git a/src/components/views/auth/Welcome.tsx b/apps/web/src/components/views/auth/Welcome.tsx similarity index 100% rename from src/components/views/auth/Welcome.tsx rename to apps/web/src/components/views/auth/Welcome.tsx diff --git a/src/components/views/avatars/BaseAvatar.tsx b/apps/web/src/components/views/avatars/BaseAvatar.tsx similarity index 100% rename from src/components/views/avatars/BaseAvatar.tsx rename to apps/web/src/components/views/avatars/BaseAvatar.tsx diff --git a/src/components/views/avatars/DecoratedRoomAvatar.tsx b/apps/web/src/components/views/avatars/DecoratedRoomAvatar.tsx similarity index 100% rename from src/components/views/avatars/DecoratedRoomAvatar.tsx rename to apps/web/src/components/views/avatars/DecoratedRoomAvatar.tsx diff --git a/src/components/views/avatars/MemberAvatar.tsx b/apps/web/src/components/views/avatars/MemberAvatar.tsx similarity index 100% rename from src/components/views/avatars/MemberAvatar.tsx rename to apps/web/src/components/views/avatars/MemberAvatar.tsx diff --git a/src/components/views/avatars/RoomAvatar.tsx b/apps/web/src/components/views/avatars/RoomAvatar.tsx similarity index 99% rename from src/components/views/avatars/RoomAvatar.tsx rename to apps/web/src/components/views/avatars/RoomAvatar.tsx index 6490378731..dd1e5f0ce4 100644 --- a/src/components/views/avatars/RoomAvatar.tsx +++ b/apps/web/src/components/views/avatars/RoomAvatar.tsx @@ -33,7 +33,7 @@ interface IProps extends Omit, "name" | "idNam roomId?: string; }; viewAvatarOnClick?: boolean; - onClick?(): void; + onClick?(this: void): void; } const RoomAvatar: React.FC = ({ room, viewAvatarOnClick, onClick, oobData, size = "36px", ...otherProps }) => { diff --git a/src/components/views/avatars/RoomAvatarView.tsx b/apps/web/src/components/views/avatars/RoomAvatarView.tsx similarity index 98% rename from src/components/views/avatars/RoomAvatarView.tsx rename to apps/web/src/components/views/avatars/RoomAvatarView.tsx index 408690fa1d..b21a0ed04e 100644 --- a/src/components/views/avatars/RoomAvatarView.tsx +++ b/apps/web/src/components/views/avatars/RoomAvatarView.tsx @@ -15,6 +15,7 @@ import OfflineIcon from "@vector-im/compound-design-tokens/assets/web/icons/pres import BusyIcon from "@vector-im/compound-design-tokens/assets/web/icons/presence-strikethrough-8x8"; import classNames from "classnames"; import { Tooltip } from "@vector-im/compound-web"; +import { Flex } from "@element-hq/web-shared-components"; import RoomAvatar from "./RoomAvatar"; import { AvatarBadgeDecoration, useRoomAvatarViewModel } from "../../viewmodels/avatars/RoomAvatarViewModel"; @@ -48,10 +49,10 @@ export function RoomAvatarView({ room }: RoomAvatarViewProps): JSX.Element { : "mx_RoomAvatarView_RoomAvatar_icon"; return ( -
+ {label ? {icon} : icon} -
+ ); } diff --git a/src/components/views/avatars/SearchResultAvatar.tsx b/apps/web/src/components/views/avatars/SearchResultAvatar.tsx similarity index 100% rename from src/components/views/avatars/SearchResultAvatar.tsx rename to apps/web/src/components/views/avatars/SearchResultAvatar.tsx diff --git a/src/components/views/avatars/WidgetAvatar.tsx b/apps/web/src/components/views/avatars/WidgetAvatar.tsx similarity index 100% rename from src/components/views/avatars/WidgetAvatar.tsx rename to apps/web/src/components/views/avatars/WidgetAvatar.tsx diff --git a/src/components/views/avatars/WithPresenceIndicator.tsx b/apps/web/src/components/views/avatars/WithPresenceIndicator.tsx similarity index 100% rename from src/components/views/avatars/WithPresenceIndicator.tsx rename to apps/web/src/components/views/avatars/WithPresenceIndicator.tsx diff --git a/src/components/views/beacon/BeaconListItem.tsx b/apps/web/src/components/views/beacon/BeaconListItem.tsx similarity index 100% rename from src/components/views/beacon/BeaconListItem.tsx rename to apps/web/src/components/views/beacon/BeaconListItem.tsx diff --git a/src/components/views/beacon/BeaconMarker.tsx b/apps/web/src/components/views/beacon/BeaconMarker.tsx similarity index 100% rename from src/components/views/beacon/BeaconMarker.tsx rename to apps/web/src/components/views/beacon/BeaconMarker.tsx diff --git a/src/components/views/beacon/BeaconStatus.tsx b/apps/web/src/components/views/beacon/BeaconStatus.tsx similarity index 100% rename from src/components/views/beacon/BeaconStatus.tsx rename to apps/web/src/components/views/beacon/BeaconStatus.tsx diff --git a/src/components/views/beacon/BeaconStatusTooltip.tsx b/apps/web/src/components/views/beacon/BeaconStatusTooltip.tsx similarity index 100% rename from src/components/views/beacon/BeaconStatusTooltip.tsx rename to apps/web/src/components/views/beacon/BeaconStatusTooltip.tsx diff --git a/src/components/views/beacon/BeaconViewDialog.tsx b/apps/web/src/components/views/beacon/BeaconViewDialog.tsx similarity index 99% rename from src/components/views/beacon/BeaconViewDialog.tsx rename to apps/web/src/components/views/beacon/BeaconViewDialog.tsx index d779ebbf2e..ab6c6cf3c0 100644 --- a/src/components/views/beacon/BeaconViewDialog.tsx +++ b/apps/web/src/components/views/beacon/BeaconViewDialog.tsx @@ -33,7 +33,7 @@ export interface IProps { matrixClient: MatrixClient; // open the map centered on this beacon's location initialFocusedBeacon?: Beacon; - onFinished(): void; + onFinished(this: void): void; } // track the 'focused time' as ts diff --git a/src/components/views/beacon/DialogOwnBeaconStatus.tsx b/apps/web/src/components/views/beacon/DialogOwnBeaconStatus.tsx similarity index 100% rename from src/components/views/beacon/DialogOwnBeaconStatus.tsx rename to apps/web/src/components/views/beacon/DialogOwnBeaconStatus.tsx diff --git a/src/components/views/beacon/DialogSidebar.tsx b/apps/web/src/components/views/beacon/DialogSidebar.tsx similarity index 100% rename from src/components/views/beacon/DialogSidebar.tsx rename to apps/web/src/components/views/beacon/DialogSidebar.tsx diff --git a/src/components/views/beacon/LeftPanelLiveShareWarning.tsx b/apps/web/src/components/views/beacon/LeftPanelLiveShareWarning.tsx similarity index 100% rename from src/components/views/beacon/LeftPanelLiveShareWarning.tsx rename to apps/web/src/components/views/beacon/LeftPanelLiveShareWarning.tsx diff --git a/src/components/views/beacon/LiveTimeRemaining.tsx b/apps/web/src/components/views/beacon/LiveTimeRemaining.tsx similarity index 100% rename from src/components/views/beacon/LiveTimeRemaining.tsx rename to apps/web/src/components/views/beacon/LiveTimeRemaining.tsx diff --git a/src/components/views/beacon/OwnBeaconStatus.tsx b/apps/web/src/components/views/beacon/OwnBeaconStatus.tsx similarity index 100% rename from src/components/views/beacon/OwnBeaconStatus.tsx rename to apps/web/src/components/views/beacon/OwnBeaconStatus.tsx diff --git a/src/components/views/beacon/RoomCallBanner.tsx b/apps/web/src/components/views/beacon/RoomCallBanner.tsx similarity index 100% rename from src/components/views/beacon/RoomCallBanner.tsx rename to apps/web/src/components/views/beacon/RoomCallBanner.tsx diff --git a/src/components/views/beacon/ShareLatestLocation.tsx b/apps/web/src/components/views/beacon/ShareLatestLocation.tsx similarity index 100% rename from src/components/views/beacon/ShareLatestLocation.tsx rename to apps/web/src/components/views/beacon/ShareLatestLocation.tsx diff --git a/src/components/views/beacon/StyledLiveBeaconIcon.tsx b/apps/web/src/components/views/beacon/StyledLiveBeaconIcon.tsx similarity index 100% rename from src/components/views/beacon/StyledLiveBeaconIcon.tsx rename to apps/web/src/components/views/beacon/StyledLiveBeaconIcon.tsx diff --git a/src/components/views/beacon/displayStatus.ts b/apps/web/src/components/views/beacon/displayStatus.ts similarity index 100% rename from src/components/views/beacon/displayStatus.ts rename to apps/web/src/components/views/beacon/displayStatus.ts diff --git a/src/components/views/beacon/index.tsx b/apps/web/src/components/views/beacon/index.tsx similarity index 100% rename from src/components/views/beacon/index.tsx rename to apps/web/src/components/views/beacon/index.tsx diff --git a/src/components/views/beta/BetaCard.tsx b/apps/web/src/components/views/beta/BetaCard.tsx similarity index 100% rename from src/components/views/beta/BetaCard.tsx rename to apps/web/src/components/views/beta/BetaCard.tsx diff --git a/src/components/views/context_menus/DeveloperToolsOption.tsx b/apps/web/src/components/views/context_menus/DeveloperToolsOption.tsx similarity index 100% rename from src/components/views/context_menus/DeveloperToolsOption.tsx rename to apps/web/src/components/views/context_menus/DeveloperToolsOption.tsx diff --git a/src/components/views/context_menus/DeviceContextMenu.tsx b/apps/web/src/components/views/context_menus/DeviceContextMenu.tsx similarity index 100% rename from src/components/views/context_menus/DeviceContextMenu.tsx rename to apps/web/src/components/views/context_menus/DeviceContextMenu.tsx diff --git a/src/components/views/context_menus/DialpadContextMenu.tsx b/apps/web/src/components/views/context_menus/DialpadContextMenu.tsx similarity index 100% rename from src/components/views/context_menus/DialpadContextMenu.tsx rename to apps/web/src/components/views/context_menus/DialpadContextMenu.tsx diff --git a/src/components/views/context_menus/GenericElementContextMenu.tsx b/apps/web/src/components/views/context_menus/GenericElementContextMenu.tsx similarity index 100% rename from src/components/views/context_menus/GenericElementContextMenu.tsx rename to apps/web/src/components/views/context_menus/GenericElementContextMenu.tsx diff --git a/src/components/views/context_menus/IconizedContextMenu.tsx b/apps/web/src/components/views/context_menus/IconizedContextMenu.tsx similarity index 100% rename from src/components/views/context_menus/IconizedContextMenu.tsx rename to apps/web/src/components/views/context_menus/IconizedContextMenu.tsx diff --git a/src/components/views/context_menus/KebabContextMenu.tsx b/apps/web/src/components/views/context_menus/KebabContextMenu.tsx similarity index 100% rename from src/components/views/context_menus/KebabContextMenu.tsx rename to apps/web/src/components/views/context_menus/KebabContextMenu.tsx diff --git a/src/components/views/context_menus/LegacyCallContextMenu.tsx b/apps/web/src/components/views/context_menus/LegacyCallContextMenu.tsx similarity index 100% rename from src/components/views/context_menus/LegacyCallContextMenu.tsx rename to apps/web/src/components/views/context_menus/LegacyCallContextMenu.tsx diff --git a/src/components/views/context_menus/MessageContextMenu.tsx b/apps/web/src/components/views/context_menus/MessageContextMenu.tsx similarity index 100% rename from src/components/views/context_menus/MessageContextMenu.tsx rename to apps/web/src/components/views/context_menus/MessageContextMenu.tsx diff --git a/src/components/views/context_menus/RoomGeneralContextMenu.tsx b/apps/web/src/components/views/context_menus/RoomGeneralContextMenu.tsx similarity index 100% rename from src/components/views/context_menus/RoomGeneralContextMenu.tsx rename to apps/web/src/components/views/context_menus/RoomGeneralContextMenu.tsx diff --git a/src/components/views/context_menus/RoomNotificationContextMenu.tsx b/apps/web/src/components/views/context_menus/RoomNotificationContextMenu.tsx similarity index 100% rename from src/components/views/context_menus/RoomNotificationContextMenu.tsx rename to apps/web/src/components/views/context_menus/RoomNotificationContextMenu.tsx diff --git a/src/components/views/context_menus/SpaceContextMenu.tsx b/apps/web/src/components/views/context_menus/SpaceContextMenu.tsx similarity index 100% rename from src/components/views/context_menus/SpaceContextMenu.tsx rename to apps/web/src/components/views/context_menus/SpaceContextMenu.tsx diff --git a/src/components/views/context_menus/ThreadListContextMenu.tsx b/apps/web/src/components/views/context_menus/ThreadListContextMenu.tsx similarity index 100% rename from src/components/views/context_menus/ThreadListContextMenu.tsx rename to apps/web/src/components/views/context_menus/ThreadListContextMenu.tsx diff --git a/src/components/views/context_menus/WidgetContextMenu.tsx b/apps/web/src/components/views/context_menus/WidgetContextMenu.tsx similarity index 99% rename from src/components/views/context_menus/WidgetContextMenu.tsx rename to apps/web/src/components/views/context_menus/WidgetContextMenu.tsx index 4ba300370f..f974741cf5 100644 --- a/src/components/views/context_menus/WidgetContextMenu.tsx +++ b/apps/web/src/components/views/context_menus/WidgetContextMenu.tsx @@ -36,9 +36,9 @@ interface IProps extends Omit, "child userWidget?: boolean; showUnpin?: boolean; // override delete handler - onDeleteClick?(): void; + onDeleteClick?(this: void): void; // override edit handler - onEditClick?(): void; + onEditClick?(this: void): void; } const showStreamAudioStreamButton = (app: IWidget): boolean => { diff --git a/src/components/views/dialogs/AddExistingSubspaceDialog.tsx b/apps/web/src/components/views/dialogs/AddExistingSubspaceDialog.tsx similarity index 95% rename from src/components/views/dialogs/AddExistingSubspaceDialog.tsx rename to apps/web/src/components/views/dialogs/AddExistingSubspaceDialog.tsx index 09a828194a..8edf71a242 100644 --- a/src/components/views/dialogs/AddExistingSubspaceDialog.tsx +++ b/apps/web/src/components/views/dialogs/AddExistingSubspaceDialog.tsx @@ -17,8 +17,8 @@ import { AddExistingToSpace, defaultSpacesRenderer, SubspaceSelector } from "./A interface IProps { space: Room; - onCreateSubspaceClick(): void; - onFinished(added?: boolean): void; + onCreateSubspaceClick(this: void): void; + onFinished(this: void, added?: boolean): void; } const AddExistingSubspaceDialog: React.FC = ({ space, onCreateSubspaceClick, onFinished }) => { diff --git a/src/components/views/dialogs/AddExistingToSpaceDialog.tsx b/apps/web/src/components/views/dialogs/AddExistingToSpaceDialog.tsx similarity index 98% rename from src/components/views/dialogs/AddExistingToSpaceDialog.tsx rename to apps/web/src/components/views/dialogs/AddExistingToSpaceDialog.tsx index d60e3edab6..fd1d4117bf 100644 --- a/src/components/views/dialogs/AddExistingToSpaceDialog.tsx +++ b/apps/web/src/components/views/dialogs/AddExistingToSpaceDialog.tsx @@ -43,15 +43,15 @@ const GROUP_MARGIN = 24; interface IProps { space: Room; - onCreateRoomClick(ev: ButtonEvent): void; - onAddSubspaceClick(): void; - onFinished(added?: boolean): void; + onCreateRoomClick(this: void, ev: ButtonEvent): void; + onAddSubspaceClick(this: void): void; + onFinished(this: void, added?: boolean): void; } export const Entry: React.FC<{ room: Room; checked: boolean; - onChange?(value: boolean): void; + onChange?(this: void, value: boolean): void; }> = ({ room, checked, onChange }) => { const id = useId(); return ( @@ -86,7 +86,7 @@ interface IAddExistingToSpaceProps { footerPrompt?: ReactNode; filterPlaceholder: string; emptySelectionButton?: ReactNode; - onFinished(added: boolean): void; + onFinished(this: void, added: boolean): void; roomsRenderer?: Renderer; spacesRenderer?: Renderer; dmsRenderer?: Renderer; @@ -391,7 +391,7 @@ interface ISubspaceSelectorProps { title: string; space: Room; value: Room; - onChange(space: Room): void; + onChange(this: void, space: Room): void; } export const SubspaceSelector: React.FC = ({ title, space, value, onChange }) => { diff --git a/src/components/views/dialogs/AnalyticsLearnMoreDialog.tsx b/apps/web/src/components/views/dialogs/AnalyticsLearnMoreDialog.tsx similarity index 98% rename from src/components/views/dialogs/AnalyticsLearnMoreDialog.tsx rename to apps/web/src/components/views/dialogs/AnalyticsLearnMoreDialog.tsx index 77ef5d522f..f5481c09ce 100644 --- a/src/components/views/dialogs/AnalyticsLearnMoreDialog.tsx +++ b/apps/web/src/components/views/dialogs/AnalyticsLearnMoreDialog.tsx @@ -23,7 +23,7 @@ export enum ButtonClicked { } interface IProps { - onFinished(buttonClicked?: ButtonClicked): void; + onFinished(this: void, buttonClicked?: ButtonClicked): void; analyticsOwner: string; privacyPolicyUrl?: string; primaryButton?: string; diff --git a/src/components/views/dialogs/AskInviteAnywayDialog.tsx b/apps/web/src/components/views/dialogs/AskInviteAnywayDialog.tsx similarity index 100% rename from src/components/views/dialogs/AskInviteAnywayDialog.tsx rename to apps/web/src/components/views/dialogs/AskInviteAnywayDialog.tsx diff --git a/src/components/views/dialogs/BaseDialog.tsx b/apps/web/src/components/views/dialogs/BaseDialog.tsx similarity index 100% rename from src/components/views/dialogs/BaseDialog.tsx rename to apps/web/src/components/views/dialogs/BaseDialog.tsx diff --git a/src/components/views/dialogs/BetaFeedbackDialog.tsx b/apps/web/src/components/views/dialogs/BetaFeedbackDialog.tsx similarity index 97% rename from src/components/views/dialogs/BetaFeedbackDialog.tsx rename to apps/web/src/components/views/dialogs/BetaFeedbackDialog.tsx index 081f8beaca..8b00375100 100644 --- a/src/components/views/dialogs/BetaFeedbackDialog.tsx +++ b/apps/web/src/components/views/dialogs/BetaFeedbackDialog.tsx @@ -21,7 +21,7 @@ import { type SettingKey } from "../../../settings/Settings.tsx"; interface IProps { featureId: SettingKey; - onFinished(sendFeedback?: boolean): void; + onFinished(this: void, sendFeedback?: boolean): void; } const BetaFeedbackDialog: React.FC = ({ featureId, onFinished }) => { diff --git a/src/components/views/dialogs/BugReportDialog.tsx b/apps/web/src/components/views/dialogs/BugReportDialog.tsx similarity index 100% rename from src/components/views/dialogs/BugReportDialog.tsx rename to apps/web/src/components/views/dialogs/BugReportDialog.tsx diff --git a/src/components/views/dialogs/BulkRedactDialog.tsx b/apps/web/src/components/views/dialogs/BulkRedactDialog.tsx similarity index 99% rename from src/components/views/dialogs/BulkRedactDialog.tsx rename to apps/web/src/components/views/dialogs/BulkRedactDialog.tsx index 1b8bf9b07e..891acab5b9 100644 --- a/src/components/views/dialogs/BulkRedactDialog.tsx +++ b/apps/web/src/components/views/dialogs/BulkRedactDialog.tsx @@ -29,7 +29,7 @@ interface Props { matrixClient: MatrixClient; room: Room; member: RoomMember; - onFinished(redact?: boolean): void; + onFinished(this: void, redact?: boolean): void; } const BulkRedactDialog: React.FC = (props) => { diff --git a/src/components/views/dialogs/ChangelogDialog.tsx b/apps/web/src/components/views/dialogs/ChangelogDialog.tsx similarity index 98% rename from src/components/views/dialogs/ChangelogDialog.tsx rename to apps/web/src/components/views/dialogs/ChangelogDialog.tsx index 6e12674653..e9ff59a720 100644 --- a/src/components/views/dialogs/ChangelogDialog.tsx +++ b/apps/web/src/components/views/dialogs/ChangelogDialog.tsx @@ -88,7 +88,7 @@ export default class ChangelogDialog extends React.Component { } } - private elementsForCommit(commit: Commit): JSX.Element { + private elementsForCommit(this: void, commit: Commit): JSX.Element { return (
  • diff --git a/src/components/views/dialogs/ConfirmAndWaitRedactDialog.tsx b/apps/web/src/components/views/dialogs/ConfirmAndWaitRedactDialog.tsx similarity index 100% rename from src/components/views/dialogs/ConfirmAndWaitRedactDialog.tsx rename to apps/web/src/components/views/dialogs/ConfirmAndWaitRedactDialog.tsx diff --git a/src/components/views/dialogs/ConfirmKeyStorageOffDialog.tsx b/apps/web/src/components/views/dialogs/ConfirmKeyStorageOffDialog.tsx similarity index 100% rename from src/components/views/dialogs/ConfirmKeyStorageOffDialog.tsx rename to apps/web/src/components/views/dialogs/ConfirmKeyStorageOffDialog.tsx diff --git a/src/components/views/dialogs/ConfirmRedactDialog.tsx b/apps/web/src/components/views/dialogs/ConfirmRedactDialog.tsx similarity index 100% rename from src/components/views/dialogs/ConfirmRedactDialog.tsx rename to apps/web/src/components/views/dialogs/ConfirmRedactDialog.tsx diff --git a/src/components/views/dialogs/ConfirmSpaceUserActionDialog.tsx b/apps/web/src/components/views/dialogs/ConfirmSpaceUserActionDialog.tsx similarity index 94% rename from src/components/views/dialogs/ConfirmSpaceUserActionDialog.tsx rename to apps/web/src/components/views/dialogs/ConfirmSpaceUserActionDialog.tsx index 6d1bb38956..b686b4cc4a 100644 --- a/src/components/views/dialogs/ConfirmSpaceUserActionDialog.tsx +++ b/apps/web/src/components/views/dialogs/ConfirmSpaceUserActionDialog.tsx @@ -21,8 +21,8 @@ interface IProps extends Omit = ({ diff --git a/src/components/views/dialogs/ConfirmUserActionDialog.tsx b/apps/web/src/components/views/dialogs/ConfirmUserActionDialog.tsx similarity index 100% rename from src/components/views/dialogs/ConfirmUserActionDialog.tsx rename to apps/web/src/components/views/dialogs/ConfirmUserActionDialog.tsx diff --git a/src/components/views/dialogs/ConfirmWipeDeviceDialog.tsx b/apps/web/src/components/views/dialogs/ConfirmWipeDeviceDialog.tsx similarity index 100% rename from src/components/views/dialogs/ConfirmWipeDeviceDialog.tsx rename to apps/web/src/components/views/dialogs/ConfirmWipeDeviceDialog.tsx diff --git a/src/components/views/dialogs/CreateRoomDialog.tsx b/apps/web/src/components/views/dialogs/CreateRoomDialog.tsx similarity index 100% rename from src/components/views/dialogs/CreateRoomDialog.tsx rename to apps/web/src/components/views/dialogs/CreateRoomDialog.tsx diff --git a/src/components/views/dialogs/CreateSubspaceDialog.tsx b/apps/web/src/components/views/dialogs/CreateSubspaceDialog.tsx similarity index 98% rename from src/components/views/dialogs/CreateSubspaceDialog.tsx rename to apps/web/src/components/views/dialogs/CreateSubspaceDialog.tsx index 290c606731..7223db55f9 100644 --- a/src/components/views/dialogs/CreateSubspaceDialog.tsx +++ b/apps/web/src/components/views/dialogs/CreateSubspaceDialog.tsx @@ -23,8 +23,8 @@ import JoinRuleDropdown from "../elements/JoinRuleDropdown"; interface IProps { space: Room; - onAddExistingSpaceClick(): void; - onFinished(added?: boolean): void; + onAddExistingSpaceClick(this: void): void; + onFinished(this: void, added?: boolean): void; } const CreateSubspaceDialog: React.FC = ({ space, onAddExistingSpaceClick, onFinished }) => { diff --git a/src/components/views/dialogs/DeactivateAccountDialog.tsx b/apps/web/src/components/views/dialogs/DeactivateAccountDialog.tsx similarity index 100% rename from src/components/views/dialogs/DeactivateAccountDialog.tsx rename to apps/web/src/components/views/dialogs/DeactivateAccountDialog.tsx diff --git a/src/components/views/dialogs/DeclineAndBlockInviteDialog.tsx b/apps/web/src/components/views/dialogs/DeclineAndBlockInviteDialog.tsx similarity index 100% rename from src/components/views/dialogs/DeclineAndBlockInviteDialog.tsx rename to apps/web/src/components/views/dialogs/DeclineAndBlockInviteDialog.tsx diff --git a/src/components/views/dialogs/DevtoolsDialog.tsx b/apps/web/src/components/views/dialogs/DevtoolsDialog.tsx similarity index 99% rename from src/components/views/dialogs/DevtoolsDialog.tsx rename to apps/web/src/components/views/dialogs/DevtoolsDialog.tsx index 10986095ea..93ffd8c0d3 100644 --- a/src/components/views/dialogs/DevtoolsDialog.tsx +++ b/apps/web/src/components/views/dialogs/DevtoolsDialog.tsx @@ -61,7 +61,7 @@ const Tools: Record = { interface IProps { roomId: string; threadRootId?: string | null; - onFinished(finished?: boolean): void; + onFinished(this: void, finished?: boolean): void; } type ToolInfo = [label: TranslationKey, tool: Tool]; diff --git a/src/components/views/dialogs/EndPollDialog.tsx b/apps/web/src/components/views/dialogs/EndPollDialog.tsx similarity index 100% rename from src/components/views/dialogs/EndPollDialog.tsx rename to apps/web/src/components/views/dialogs/EndPollDialog.tsx diff --git a/src/components/views/dialogs/ErrorDialog.tsx b/apps/web/src/components/views/dialogs/ErrorDialog.tsx similarity index 100% rename from src/components/views/dialogs/ErrorDialog.tsx rename to apps/web/src/components/views/dialogs/ErrorDialog.tsx diff --git a/src/components/views/dialogs/ExportDialog.tsx b/apps/web/src/components/views/dialogs/ExportDialog.tsx similarity index 99% rename from src/components/views/dialogs/ExportDialog.tsx rename to apps/web/src/components/views/dialogs/ExportDialog.tsx index c615f106fc..5767b1202b 100644 --- a/src/components/views/dialogs/ExportDialog.tsx +++ b/apps/web/src/components/views/dialogs/ExportDialog.tsx @@ -37,7 +37,7 @@ import { validateNumberInRange } from "../../../utils/validate"; interface IProps { room: Room; - onFinished(doExport?: boolean): void; + onFinished(this: void, doExport?: boolean): void; } interface ExportConfig { diff --git a/src/components/views/dialogs/FeedbackDialog.tsx b/apps/web/src/components/views/dialogs/FeedbackDialog.tsx similarity index 100% rename from src/components/views/dialogs/FeedbackDialog.tsx rename to apps/web/src/components/views/dialogs/FeedbackDialog.tsx diff --git a/src/components/views/dialogs/ForwardDialog.tsx b/apps/web/src/components/views/dialogs/ForwardDialog.tsx similarity index 99% rename from src/components/views/dialogs/ForwardDialog.tsx rename to apps/web/src/components/views/dialogs/ForwardDialog.tsx index f97ccd61a2..a6a6954bc5 100644 --- a/src/components/views/dialogs/ForwardDialog.tsx +++ b/apps/web/src/components/views/dialogs/ForwardDialog.tsx @@ -73,7 +73,7 @@ interface IProps { // We need a permalink creator for the source room to pass through to EventTile // in case the event is a reply (even though the user can't get at the link) permalinkCreator: RoomPermalinkCreator; - onFinished(): void; + onFinished(this: void): void; } interface IEntryProps { @@ -81,7 +81,7 @@ interface IEntryProps { type: K; content: TimelineEvents[K]; matrixClient: MatrixClient; - onFinished(success: boolean): void; + onFinished(this: void, success: boolean): void; } enum SendState { diff --git a/src/components/views/dialogs/GenericFeatureFeedbackDialog.tsx b/apps/web/src/components/views/dialogs/GenericFeatureFeedbackDialog.tsx similarity index 98% rename from src/components/views/dialogs/GenericFeatureFeedbackDialog.tsx rename to apps/web/src/components/views/dialogs/GenericFeatureFeedbackDialog.tsx index 8df5b8dbb4..29fee059dc 100644 --- a/src/components/views/dialogs/GenericFeatureFeedbackDialog.tsx +++ b/apps/web/src/components/views/dialogs/GenericFeatureFeedbackDialog.tsx @@ -22,7 +22,7 @@ interface IProps { rageshakeLabel?: string; rageshakeData?: Record; children?: ReactNode; - onFinished(sendFeedback?: boolean): void; + onFinished(this: void, sendFeedback?: boolean): void; } const GenericFeatureFeedbackDialog: React.FC = ({ diff --git a/src/components/views/dialogs/IncomingSasDialog.tsx b/apps/web/src/components/views/dialogs/IncomingSasDialog.tsx similarity index 100% rename from src/components/views/dialogs/IncomingSasDialog.tsx rename to apps/web/src/components/views/dialogs/IncomingSasDialog.tsx diff --git a/src/components/views/dialogs/InfoDialog.tsx b/apps/web/src/components/views/dialogs/InfoDialog.tsx similarity index 100% rename from src/components/views/dialogs/InfoDialog.tsx rename to apps/web/src/components/views/dialogs/InfoDialog.tsx diff --git a/src/components/views/dialogs/IntegrationsDisabledDialog.tsx b/apps/web/src/components/views/dialogs/IntegrationsDisabledDialog.tsx similarity index 98% rename from src/components/views/dialogs/IntegrationsDisabledDialog.tsx rename to apps/web/src/components/views/dialogs/IntegrationsDisabledDialog.tsx index 93cd5f82c9..2682e077ae 100644 --- a/src/components/views/dialogs/IntegrationsDisabledDialog.tsx +++ b/apps/web/src/components/views/dialogs/IntegrationsDisabledDialog.tsx @@ -16,7 +16,7 @@ import DialogButtons from "../elements/DialogButtons"; import { UserTab } from "./UserTab"; interface IProps { - onFinished(): void; + onFinished(this: void): void; } export const IntegrationsDisabledDialog: React.FC = ({ onFinished }) => { diff --git a/src/components/views/dialogs/IntegrationsImpossibleDialog.tsx b/apps/web/src/components/views/dialogs/IntegrationsImpossibleDialog.tsx similarity index 100% rename from src/components/views/dialogs/IntegrationsImpossibleDialog.tsx rename to apps/web/src/components/views/dialogs/IntegrationsImpossibleDialog.tsx diff --git a/src/components/views/dialogs/InteractiveAuthDialog.tsx b/apps/web/src/components/views/dialogs/InteractiveAuthDialog.tsx similarity index 100% rename from src/components/views/dialogs/InteractiveAuthDialog.tsx rename to apps/web/src/components/views/dialogs/InteractiveAuthDialog.tsx diff --git a/src/components/views/dialogs/InviteDialog.tsx b/apps/web/src/components/views/dialogs/InviteDialog.tsx similarity index 99% rename from src/components/views/dialogs/InviteDialog.tsx rename to apps/web/src/components/views/dialogs/InviteDialog.tsx index 6f60f56fdb..dd29dbddce 100644 --- a/src/components/views/dialogs/InviteDialog.tsx +++ b/apps/web/src/components/views/dialogs/InviteDialog.tsx @@ -1124,7 +1124,7 @@ export default class InviteDialog extends React.PureComponent): Promise { + private async onLinkClick(this: void, e: React.MouseEvent): Promise { e.preventDefault(); selectText(e.currentTarget); } diff --git a/src/components/views/dialogs/InviteDialogTypes.ts b/apps/web/src/components/views/dialogs/InviteDialogTypes.ts similarity index 100% rename from src/components/views/dialogs/InviteDialogTypes.ts rename to apps/web/src/components/views/dialogs/InviteDialogTypes.ts diff --git a/src/components/views/dialogs/InviteProgressBody.tsx b/apps/web/src/components/views/dialogs/InviteProgressBody.tsx similarity index 100% rename from src/components/views/dialogs/InviteProgressBody.tsx rename to apps/web/src/components/views/dialogs/InviteProgressBody.tsx diff --git a/src/components/views/dialogs/InviteProgressDialog.tsx b/apps/web/src/components/views/dialogs/InviteProgressDialog.tsx similarity index 100% rename from src/components/views/dialogs/InviteProgressDialog.tsx rename to apps/web/src/components/views/dialogs/InviteProgressDialog.tsx diff --git a/src/components/views/dialogs/LeaveSpaceDialog.tsx b/apps/web/src/components/views/dialogs/LeaveSpaceDialog.tsx similarity index 98% rename from src/components/views/dialogs/LeaveSpaceDialog.tsx rename to apps/web/src/components/views/dialogs/LeaveSpaceDialog.tsx index 37838292ff..ffa780ccc9 100644 --- a/src/components/views/dialogs/LeaveSpaceDialog.tsx +++ b/apps/web/src/components/views/dialogs/LeaveSpaceDialog.tsx @@ -20,7 +20,7 @@ import { isOnlyAdmin } from "../../../utils/membership"; interface IProps { space: Room; - onFinished(leave: boolean, rooms?: Room[]): void; + onFinished(this: void, leave: boolean, rooms?: Room[]): void; } const LeaveSpaceDialog: React.FC = ({ space, onFinished }) => { diff --git a/src/components/views/dialogs/LogoutDialog.tsx b/apps/web/src/components/views/dialogs/LogoutDialog.tsx similarity index 100% rename from src/components/views/dialogs/LogoutDialog.tsx rename to apps/web/src/components/views/dialogs/LogoutDialog.tsx diff --git a/src/components/views/dialogs/ManageRestrictedJoinRuleDialog.tsx b/apps/web/src/components/views/dialogs/ManageRestrictedJoinRuleDialog.tsx similarity index 99% rename from src/components/views/dialogs/ManageRestrictedJoinRuleDialog.tsx rename to apps/web/src/components/views/dialogs/ManageRestrictedJoinRuleDialog.tsx index 2de5d23b55..811fb1a10c 100644 --- a/src/components/views/dialogs/ManageRestrictedJoinRuleDialog.tsx +++ b/apps/web/src/components/views/dialogs/ManageRestrictedJoinRuleDialog.tsx @@ -25,13 +25,13 @@ import { filterBoolean } from "../../../utils/arrays"; interface IProps { room: Room; selected?: string[]; - onFinished(rooms?: string[]): void; + onFinished(this: void, rooms?: string[]): void; } const Entry: React.FC<{ room: Room; checked: boolean; - onChange(value: boolean): void; + onChange(this: void, value: boolean): void; }> = ({ room, checked, onChange }) => { const localRoom = room instanceof Room; diff --git a/src/components/views/dialogs/ManualDeviceKeyVerificationDialog.tsx b/apps/web/src/components/views/dialogs/ManualDeviceKeyVerificationDialog.tsx similarity index 100% rename from src/components/views/dialogs/ManualDeviceKeyVerificationDialog.tsx rename to apps/web/src/components/views/dialogs/ManualDeviceKeyVerificationDialog.tsx diff --git a/src/components/views/dialogs/MessageEditHistoryDialog.tsx b/apps/web/src/components/views/dialogs/MessageEditHistoryDialog.tsx similarity index 100% rename from src/components/views/dialogs/MessageEditHistoryDialog.tsx rename to apps/web/src/components/views/dialogs/MessageEditHistoryDialog.tsx diff --git a/src/components/views/dialogs/ModalWidgetDialog.tsx b/apps/web/src/components/views/dialogs/ModalWidgetDialog.tsx similarity index 100% rename from src/components/views/dialogs/ModalWidgetDialog.tsx rename to apps/web/src/components/views/dialogs/ModalWidgetDialog.tsx diff --git a/src/components/views/dialogs/ModuleUiDialog.tsx b/apps/web/src/components/views/dialogs/ModuleUiDialog.tsx similarity index 100% rename from src/components/views/dialogs/ModuleUiDialog.tsx rename to apps/web/src/components/views/dialogs/ModuleUiDialog.tsx diff --git a/src/components/views/dialogs/PollHistoryDialog.tsx b/apps/web/src/components/views/dialogs/PollHistoryDialog.tsx similarity index 97% rename from src/components/views/dialogs/PollHistoryDialog.tsx rename to apps/web/src/components/views/dialogs/PollHistoryDialog.tsx index bcc92932e0..d222dde427 100644 --- a/src/components/views/dialogs/PollHistoryDialog.tsx +++ b/apps/web/src/components/views/dialogs/PollHistoryDialog.tsx @@ -17,7 +17,7 @@ type PollHistoryDialogProps = { room: Room; matrixClient: MatrixClient; permalinkCreator: RoomPermalinkCreator; - onFinished(): void; + onFinished(this: void): void; }; export const PollHistoryDialog: React.FC = ({ diff --git a/src/components/views/dialogs/QuestionDialog.tsx b/apps/web/src/components/views/dialogs/QuestionDialog.tsx similarity index 100% rename from src/components/views/dialogs/QuestionDialog.tsx rename to apps/web/src/components/views/dialogs/QuestionDialog.tsx diff --git a/src/components/views/dialogs/RegistrationEmailPromptDialog.tsx b/apps/web/src/components/views/dialogs/RegistrationEmailPromptDialog.tsx similarity index 95% rename from src/components/views/dialogs/RegistrationEmailPromptDialog.tsx rename to apps/web/src/components/views/dialogs/RegistrationEmailPromptDialog.tsx index b798035ab9..5a00d87bfe 100644 --- a/src/components/views/dialogs/RegistrationEmailPromptDialog.tsx +++ b/apps/web/src/components/views/dialogs/RegistrationEmailPromptDialog.tsx @@ -15,8 +15,8 @@ import DialogButtons from "../elements/DialogButtons"; import EmailField from "../auth/EmailField"; interface IProps { - onFinished(continued: false, email?: undefined): void; - onFinished(continued: true, email: string): void; + onFinished(this: void, continued: false, email?: undefined): void; + onFinished(this: void, continued: true, email: string): void; } const RegistrationEmailPromptDialog: React.FC = ({ onFinished }) => { diff --git a/src/components/views/dialogs/ReportEventDialog.tsx b/apps/web/src/components/views/dialogs/ReportEventDialog.tsx similarity index 100% rename from src/components/views/dialogs/ReportEventDialog.tsx rename to apps/web/src/components/views/dialogs/ReportEventDialog.tsx diff --git a/src/components/views/dialogs/ReportRoomDialog.tsx b/apps/web/src/components/views/dialogs/ReportRoomDialog.tsx similarity index 98% rename from src/components/views/dialogs/ReportRoomDialog.tsx rename to apps/web/src/components/views/dialogs/ReportRoomDialog.tsx index 9a7ac2bd56..510778655b 100644 --- a/src/components/views/dialogs/ReportRoomDialog.tsx +++ b/apps/web/src/components/views/dialogs/ReportRoomDialog.tsx @@ -25,7 +25,7 @@ import { MatrixClientPeg } from "../../../MatrixClientPeg"; interface IProps { roomId: string; - onFinished(leave: boolean): void; + onFinished(this: void, leave: boolean): void; } /* diff --git a/src/components/views/dialogs/ResetIdentityDialog.tsx b/apps/web/src/components/views/dialogs/ResetIdentityDialog.tsx similarity index 100% rename from src/components/views/dialogs/ResetIdentityDialog.tsx rename to apps/web/src/components/views/dialogs/ResetIdentityDialog.tsx diff --git a/src/components/views/dialogs/RoomSettingsDialog.tsx b/apps/web/src/components/views/dialogs/RoomSettingsDialog.tsx similarity index 100% rename from src/components/views/dialogs/RoomSettingsDialog.tsx rename to apps/web/src/components/views/dialogs/RoomSettingsDialog.tsx diff --git a/src/components/views/dialogs/RoomUpgradeDialog.tsx b/apps/web/src/components/views/dialogs/RoomUpgradeDialog.tsx similarity index 100% rename from src/components/views/dialogs/RoomUpgradeDialog.tsx rename to apps/web/src/components/views/dialogs/RoomUpgradeDialog.tsx diff --git a/src/components/views/dialogs/RoomUpgradeWarningDialog.tsx b/apps/web/src/components/views/dialogs/RoomUpgradeWarningDialog.tsx similarity index 100% rename from src/components/views/dialogs/RoomUpgradeWarningDialog.tsx rename to apps/web/src/components/views/dialogs/RoomUpgradeWarningDialog.tsx diff --git a/src/components/views/dialogs/ScrollableBaseModal.tsx b/apps/web/src/components/views/dialogs/ScrollableBaseModal.tsx similarity index 100% rename from src/components/views/dialogs/ScrollableBaseModal.tsx rename to apps/web/src/components/views/dialogs/ScrollableBaseModal.tsx diff --git a/src/components/views/dialogs/ServerOfflineDialog.tsx b/apps/web/src/components/views/dialogs/ServerOfflineDialog.tsx similarity index 100% rename from src/components/views/dialogs/ServerOfflineDialog.tsx rename to apps/web/src/components/views/dialogs/ServerOfflineDialog.tsx diff --git a/src/components/views/dialogs/ServerPickerDialog.tsx b/apps/web/src/components/views/dialogs/ServerPickerDialog.tsx similarity index 100% rename from src/components/views/dialogs/ServerPickerDialog.tsx rename to apps/web/src/components/views/dialogs/ServerPickerDialog.tsx diff --git a/src/components/views/dialogs/SeshatResetDialog.tsx b/apps/web/src/components/views/dialogs/SeshatResetDialog.tsx similarity index 100% rename from src/components/views/dialogs/SeshatResetDialog.tsx rename to apps/web/src/components/views/dialogs/SeshatResetDialog.tsx diff --git a/src/components/views/dialogs/SessionRestoreErrorDialog.tsx b/apps/web/src/components/views/dialogs/SessionRestoreErrorDialog.tsx similarity index 100% rename from src/components/views/dialogs/SessionRestoreErrorDialog.tsx rename to apps/web/src/components/views/dialogs/SessionRestoreErrorDialog.tsx diff --git a/src/components/views/dialogs/SetEmailDialog.tsx b/apps/web/src/components/views/dialogs/SetEmailDialog.tsx similarity index 100% rename from src/components/views/dialogs/SetEmailDialog.tsx rename to apps/web/src/components/views/dialogs/SetEmailDialog.tsx diff --git a/src/components/views/dialogs/ShareDialog.tsx b/apps/web/src/components/views/dialogs/ShareDialog.tsx similarity index 99% rename from src/components/views/dialogs/ShareDialog.tsx rename to apps/web/src/components/views/dialogs/ShareDialog.tsx index dd909376a0..993c411562 100644 --- a/src/components/views/dialogs/ShareDialog.tsx +++ b/apps/web/src/components/views/dialogs/ShareDialog.tsx @@ -56,7 +56,7 @@ interface BaseProps { /** * A function that is called when the dialog is dismissed */ - onFinished(): void; + onFinished(this: void): void; /** * An optional string to use as the dialog title. * If not provided, an appropriate title for the target type will be used. diff --git a/src/components/views/dialogs/SlashCommandHelpDialog.tsx b/apps/web/src/components/views/dialogs/SlashCommandHelpDialog.tsx similarity index 98% rename from src/components/views/dialogs/SlashCommandHelpDialog.tsx rename to apps/web/src/components/views/dialogs/SlashCommandHelpDialog.tsx index 6ceb80a1fd..d912c85616 100644 --- a/src/components/views/dialogs/SlashCommandHelpDialog.tsx +++ b/apps/web/src/components/views/dialogs/SlashCommandHelpDialog.tsx @@ -20,7 +20,7 @@ import { MatrixClientPeg } from "../../../MatrixClientPeg"; */ interface IProps { roomId: string; - onFinished(): void; + onFinished(this: void): void; } const SlashCommandHelpDialog: React.FC = ({ roomId, onFinished }) => { diff --git a/src/components/views/dialogs/SpacePreferencesDialog.tsx b/apps/web/src/components/views/dialogs/SpacePreferencesDialog.tsx similarity index 95% rename from src/components/views/dialogs/SpacePreferencesDialog.tsx rename to apps/web/src/components/views/dialogs/SpacePreferencesDialog.tsx index 69fa897ec3..6925cadcf1 100644 --- a/src/components/views/dialogs/SpacePreferencesDialog.tsx +++ b/apps/web/src/components/views/dialogs/SpacePreferencesDialog.tsx @@ -17,16 +17,16 @@ import StyledCheckbox from "../elements/StyledCheckbox"; import { useSettingValue } from "../../../hooks/useSettings"; import SettingsStore from "../../../settings/SettingsStore"; import { SettingLevel } from "../../../settings/SettingLevel"; -import RoomName from "../elements/RoomName"; import { SpacePreferenceTab } from "../../../dispatcher/payloads/OpenSpacePreferencesPayload"; import { type NonEmptyArray } from "../../../@types/common"; import SettingsTab from "../settings/tabs/SettingsTab"; import { SettingsSection } from "../settings/shared/SettingsSection"; import { SettingsSubsection, SettingsSubsectionText } from "../settings/shared/SettingsSubsection"; +import { useRoomName } from "../../../hooks/useRoomName.ts"; interface IProps { space: Room; - onFinished(): void; + onFinished(this: void): void; } const SpacePreferencesAppearanceTab: React.FC> = ({ space }) => { @@ -60,6 +60,7 @@ const SpacePreferencesAppearanceTab: React.FC> = ({ space }; const SpacePreferencesDialog: React.FC = ({ space, onFinished }) => { + const name = useRoomName(space); const tabs: NonEmptyArray> = [ new Tab( SpacePreferenceTab.Appearance, @@ -77,9 +78,7 @@ const SpacePreferencesDialog: React.FC = ({ space, onFinished }) => { title={_t("common|preferences")} fixedWidth={false} > -

    - -

    +

    {name}

    {}} />
    diff --git a/src/components/views/dialogs/SpaceSettingsDialog.tsx b/apps/web/src/components/views/dialogs/SpaceSettingsDialog.tsx similarity index 99% rename from src/components/views/dialogs/SpaceSettingsDialog.tsx rename to apps/web/src/components/views/dialogs/SpaceSettingsDialog.tsx index 7566cbb9c8..11cc82cadb 100644 --- a/src/components/views/dialogs/SpaceSettingsDialog.tsx +++ b/apps/web/src/components/views/dialogs/SpaceSettingsDialog.tsx @@ -39,7 +39,7 @@ export enum SpaceSettingsTab { interface IProps { matrixClient: MatrixClient; space: Room; - onFinished(): void; + onFinished(this: void): void; } const SpaceSettingsDialog: React.FC = ({ matrixClient: cli, space, onFinished }) => { diff --git a/src/components/views/dialogs/StorageEvictedDialog.tsx b/apps/web/src/components/views/dialogs/StorageEvictedDialog.tsx similarity index 100% rename from src/components/views/dialogs/StorageEvictedDialog.tsx rename to apps/web/src/components/views/dialogs/StorageEvictedDialog.tsx diff --git a/src/components/views/dialogs/TermsDialog.tsx b/apps/web/src/components/views/dialogs/TermsDialog.tsx similarity index 100% rename from src/components/views/dialogs/TermsDialog.tsx rename to apps/web/src/components/views/dialogs/TermsDialog.tsx diff --git a/src/components/views/dialogs/TextInputDialog.tsx b/apps/web/src/components/views/dialogs/TextInputDialog.tsx similarity index 100% rename from src/components/views/dialogs/TextInputDialog.tsx rename to apps/web/src/components/views/dialogs/TextInputDialog.tsx diff --git a/src/components/views/dialogs/UnpinAllDialog.tsx b/apps/web/src/components/views/dialogs/UnpinAllDialog.tsx similarity index 100% rename from src/components/views/dialogs/UnpinAllDialog.tsx rename to apps/web/src/components/views/dialogs/UnpinAllDialog.tsx diff --git a/src/components/views/dialogs/UntrustedDeviceDialog.tsx b/apps/web/src/components/views/dialogs/UntrustedDeviceDialog.tsx similarity index 98% rename from src/components/views/dialogs/UntrustedDeviceDialog.tsx rename to apps/web/src/components/views/dialogs/UntrustedDeviceDialog.tsx index 5a076a57b4..703dbec85f 100644 --- a/src/components/views/dialogs/UntrustedDeviceDialog.tsx +++ b/apps/web/src/components/views/dialogs/UntrustedDeviceDialog.tsx @@ -31,7 +31,7 @@ interface IProps { * If mode is "sas", the user wants to verify the device with SAS. Otherwise, the dialog was dismissed normally. * @param mode The mode of dismissal. */ - onFinished(mode?: "sas"): void; + onFinished(this: void, mode?: "sas"): void; } const UntrustedDeviceDialog: React.FC = ({ device, user, onFinished }) => { diff --git a/src/components/views/dialogs/UploadConfirmDialog.tsx b/apps/web/src/components/views/dialogs/UploadConfirmDialog.tsx similarity index 100% rename from src/components/views/dialogs/UploadConfirmDialog.tsx rename to apps/web/src/components/views/dialogs/UploadConfirmDialog.tsx diff --git a/src/components/views/dialogs/UploadFailureDialog.tsx b/apps/web/src/components/views/dialogs/UploadFailureDialog.tsx similarity index 100% rename from src/components/views/dialogs/UploadFailureDialog.tsx rename to apps/web/src/components/views/dialogs/UploadFailureDialog.tsx diff --git a/src/components/views/dialogs/UserSettingsDialog.tsx b/apps/web/src/components/views/dialogs/UserSettingsDialog.tsx similarity index 99% rename from src/components/views/dialogs/UserSettingsDialog.tsx rename to apps/web/src/components/views/dialogs/UserSettingsDialog.tsx index 4d8b8ad3c0..a0802f8a57 100644 --- a/src/components/views/dialogs/UserSettingsDialog.tsx +++ b/apps/web/src/components/views/dialogs/UserSettingsDialog.tsx @@ -58,7 +58,7 @@ interface IProps { */ initialEncryptionState?: State; sdkContext: SdkContextClass; - onFinished(): void; + onFinished(this: void): void; } function titleForTabID(tabId: UserTab): React.ReactNode { diff --git a/src/components/views/dialogs/UserTab.ts b/apps/web/src/components/views/dialogs/UserTab.ts similarity index 100% rename from src/components/views/dialogs/UserTab.ts rename to apps/web/src/components/views/dialogs/UserTab.ts diff --git a/src/components/views/dialogs/VerificationRequestDialog.tsx b/apps/web/src/components/views/dialogs/VerificationRequestDialog.tsx similarity index 100% rename from src/components/views/dialogs/VerificationRequestDialog.tsx rename to apps/web/src/components/views/dialogs/VerificationRequestDialog.tsx diff --git a/src/components/views/dialogs/WidgetCapabilitiesPromptDialog.tsx b/apps/web/src/components/views/dialogs/WidgetCapabilitiesPromptDialog.tsx similarity index 100% rename from src/components/views/dialogs/WidgetCapabilitiesPromptDialog.tsx rename to apps/web/src/components/views/dialogs/WidgetCapabilitiesPromptDialog.tsx diff --git a/src/components/views/dialogs/WidgetOpenIDPermissionsDialog.tsx b/apps/web/src/components/views/dialogs/WidgetOpenIDPermissionsDialog.tsx similarity index 100% rename from src/components/views/dialogs/WidgetOpenIDPermissionsDialog.tsx rename to apps/web/src/components/views/dialogs/WidgetOpenIDPermissionsDialog.tsx diff --git a/src/components/views/dialogs/devtools/AccountData.tsx b/apps/web/src/components/views/dialogs/devtools/AccountData.tsx similarity index 100% rename from src/components/views/dialogs/devtools/AccountData.tsx rename to apps/web/src/components/views/dialogs/devtools/AccountData.tsx diff --git a/src/components/views/dialogs/devtools/BaseTool.tsx b/apps/web/src/components/views/dialogs/devtools/BaseTool.tsx similarity index 93% rename from src/components/views/dialogs/devtools/BaseTool.tsx rename to apps/web/src/components/views/dialogs/devtools/BaseTool.tsx index 555d5b31ff..09120ecde2 100644 --- a/src/components/views/dialogs/devtools/BaseTool.tsx +++ b/apps/web/src/components/views/dialogs/devtools/BaseTool.tsx @@ -16,8 +16,8 @@ import { type XOR } from "../../../../@types/common"; import { type Tool } from "../DevtoolsDialog"; export interface IDevtoolsProps { - onBack(): void; - setTool(label: TranslationKey, tool: Tool): void; + onBack(this: void): void; + setTool(this: void, label: TranslationKey, tool: Tool): void; } interface IMinProps extends Pick { @@ -28,7 +28,7 @@ interface IMinProps extends Pick { interface IProps extends IMinProps { actionLabel: TranslationKey; - onAction(): Promise; + onAction(this: void): Promise; } const BaseTool: React.FC> = ({ diff --git a/src/components/views/dialogs/devtools/Crypto.tsx b/apps/web/src/components/views/dialogs/devtools/Crypto.tsx similarity index 99% rename from src/components/views/dialogs/devtools/Crypto.tsx rename to apps/web/src/components/views/dialogs/devtools/Crypto.tsx index af6d4935ba..1c02f062c3 100644 --- a/src/components/views/dialogs/devtools/Crypto.tsx +++ b/apps/web/src/components/views/dialogs/devtools/Crypto.tsx @@ -20,7 +20,7 @@ interface KeyBackupProps { /** * Callback to invoke when the back button is clicked. */ - onBack(): void; + onBack(this: void): void; } /** diff --git a/src/components/views/dialogs/devtools/Event.tsx b/apps/web/src/components/views/dialogs/devtools/Event.tsx similarity index 98% rename from src/components/views/dialogs/devtools/Event.tsx rename to apps/web/src/components/views/dialogs/devtools/Event.tsx index 63712b28d9..c205e89986 100644 --- a/src/components/views/dialogs/devtools/Event.tsx +++ b/apps/web/src/components/views/dialogs/devtools/Event.tsx @@ -24,7 +24,7 @@ export const stringify = (object: object): string => { interface IEventEditorProps extends Pick { fieldDefs: IFieldDef[]; // immutable defaultContent?: string; - onSend(fields: string[], content: IContent): Promise; + onSend(this: void, fields: string[], content: IContent): Promise; } interface IFieldDef { diff --git a/src/components/views/dialogs/devtools/FilteredList.tsx b/apps/web/src/components/views/dialogs/devtools/FilteredList.tsx similarity index 98% rename from src/components/views/dialogs/devtools/FilteredList.tsx rename to apps/web/src/components/views/dialogs/devtools/FilteredList.tsx index 2b7ed027db..e59059722a 100644 --- a/src/components/views/dialogs/devtools/FilteredList.tsx +++ b/apps/web/src/components/views/dialogs/devtools/FilteredList.tsx @@ -19,7 +19,7 @@ const LOAD_TILES_STEP_SIZE = 50; interface IProps { children: React.ReactElement[]; query: string; - onChange(value: string): void; + onChange(this: void, value: string): void; } const FilteredList: React.FC = ({ children, query, onChange }) => { diff --git a/src/components/views/dialogs/devtools/RoomNotifications.tsx b/apps/web/src/components/views/dialogs/devtools/RoomNotifications.tsx similarity index 100% rename from src/components/views/dialogs/devtools/RoomNotifications.tsx rename to apps/web/src/components/views/dialogs/devtools/RoomNotifications.tsx diff --git a/src/components/views/dialogs/devtools/RoomState.tsx b/apps/web/src/components/views/dialogs/devtools/RoomState.tsx similarity index 99% rename from src/components/views/dialogs/devtools/RoomState.tsx rename to apps/web/src/components/views/dialogs/devtools/RoomState.tsx index b9863b69ff..0d7041355a 100644 --- a/src/components/views/dialogs/devtools/RoomState.tsx +++ b/apps/web/src/components/views/dialogs/devtools/RoomState.tsx @@ -40,12 +40,12 @@ export const StateEventEditor: React.FC = ({ mxEvent, onBack }) => interface StateEventButtonProps { label: string; - onClick(): void; + onClick(this: void): void; } const RoomStateHistory: React.FC<{ mxEvent: MatrixEvent; - onBack(): void; + onBack(this: void): void; }> = ({ mxEvent, onBack }) => { const cli = useContext(MatrixClientContext); const events = useAsyncMemo( diff --git a/src/components/views/dialogs/devtools/ServerInfo.tsx b/apps/web/src/components/views/dialogs/devtools/ServerInfo.tsx similarity index 100% rename from src/components/views/dialogs/devtools/ServerInfo.tsx rename to apps/web/src/components/views/dialogs/devtools/ServerInfo.tsx diff --git a/src/components/views/dialogs/devtools/ServersInRoom.tsx b/apps/web/src/components/views/dialogs/devtools/ServersInRoom.tsx similarity index 100% rename from src/components/views/dialogs/devtools/ServersInRoom.tsx rename to apps/web/src/components/views/dialogs/devtools/ServersInRoom.tsx diff --git a/src/components/views/dialogs/devtools/SettingExplorer.tsx b/apps/web/src/components/views/dialogs/devtools/SettingExplorer.tsx similarity index 98% rename from src/components/views/dialogs/devtools/SettingExplorer.tsx rename to apps/web/src/components/views/dialogs/devtools/SettingExplorer.tsx index 7fedcd2fa5..e45b082cf3 100644 --- a/src/components/views/dialogs/devtools/SettingExplorer.tsx +++ b/apps/web/src/components/views/dialogs/devtools/SettingExplorer.tsx @@ -192,7 +192,7 @@ const EditSetting: React.FC = ({ setting, onBack }) => { interface IViewSettingProps extends Pick { setting: SettingKey; - onEdit(): Promise; + onEdit(this: void): Promise; } const ViewSetting: React.FC = ({ setting, onEdit, onBack }) => { @@ -249,8 +249,8 @@ function renderSettingValue(val: any): string { } interface ISettingsListProps extends Pick { - onView(setting: string): void; - onEdit(setting: string): void; + onView(this: void, setting: string): void; + onEdit(this: void, setting: string): void; } const SettingsList: React.FC = ({ onBack, onView, onEdit }) => { diff --git a/src/components/views/dialogs/devtools/Users.tsx b/apps/web/src/components/views/dialogs/devtools/Users.tsx similarity index 99% rename from src/components/views/dialogs/devtools/Users.tsx rename to apps/web/src/components/views/dialogs/devtools/Users.tsx index 889d437355..aab47e672b 100644 --- a/src/components/views/dialogs/devtools/Users.tsx +++ b/apps/web/src/components/views/dialogs/devtools/Users.tsx @@ -78,7 +78,7 @@ export const UserList: React.FC> = ({ onBack }) = interface UserButtonProps { member: RoomMember; - onClick(): void; + onClick(this: void): void; } /** @@ -216,7 +216,7 @@ const UserView: React.FC = ({ member, onBack }) => { interface DeviceButtonProps { crypto: CryptoApi; device: Device; - onClick(): void; + onClick(this: void): void; } /** diff --git a/src/components/views/dialogs/devtools/WidgetExplorer.tsx b/apps/web/src/components/views/dialogs/devtools/WidgetExplorer.tsx similarity index 100% rename from src/components/views/dialogs/devtools/WidgetExplorer.tsx rename to apps/web/src/components/views/dialogs/devtools/WidgetExplorer.tsx diff --git a/src/components/views/dialogs/security/AccessSecretStorageDialog.tsx b/apps/web/src/components/views/dialogs/security/AccessSecretStorageDialog.tsx similarity index 100% rename from src/components/views/dialogs/security/AccessSecretStorageDialog.tsx rename to apps/web/src/components/views/dialogs/security/AccessSecretStorageDialog.tsx diff --git a/src/components/views/dialogs/security/InitialCryptoSetupDialog.tsx b/apps/web/src/components/views/dialogs/security/InitialCryptoSetupDialog.tsx similarity index 100% rename from src/components/views/dialogs/security/InitialCryptoSetupDialog.tsx rename to apps/web/src/components/views/dialogs/security/InitialCryptoSetupDialog.tsx diff --git a/src/components/views/dialogs/security/RestoreKeyBackupDialog.tsx b/apps/web/src/components/views/dialogs/security/RestoreKeyBackupDialog.tsx similarity index 100% rename from src/components/views/dialogs/security/RestoreKeyBackupDialog.tsx rename to apps/web/src/components/views/dialogs/security/RestoreKeyBackupDialog.tsx diff --git a/src/components/views/dialogs/security/SetupEncryptionDialog.tsx b/apps/web/src/components/views/dialogs/security/SetupEncryptionDialog.tsx similarity index 100% rename from src/components/views/dialogs/security/SetupEncryptionDialog.tsx rename to apps/web/src/components/views/dialogs/security/SetupEncryptionDialog.tsx diff --git a/src/components/views/dialogs/spotlight/Filter.ts b/apps/web/src/components/views/dialogs/spotlight/Filter.ts similarity index 100% rename from src/components/views/dialogs/spotlight/Filter.ts rename to apps/web/src/components/views/dialogs/spotlight/Filter.ts diff --git a/src/components/views/dialogs/spotlight/Option.tsx b/apps/web/src/components/views/dialogs/spotlight/Option.tsx similarity index 100% rename from src/components/views/dialogs/spotlight/Option.tsx rename to apps/web/src/components/views/dialogs/spotlight/Option.tsx diff --git a/src/components/views/dialogs/spotlight/PublicRoomResultDetails.tsx b/apps/web/src/components/views/dialogs/spotlight/PublicRoomResultDetails.tsx similarity index 100% rename from src/components/views/dialogs/spotlight/PublicRoomResultDetails.tsx rename to apps/web/src/components/views/dialogs/spotlight/PublicRoomResultDetails.tsx diff --git a/src/components/views/dialogs/spotlight/RoomResultContextMenus.tsx b/apps/web/src/components/views/dialogs/spotlight/RoomResultContextMenus.tsx similarity index 100% rename from src/components/views/dialogs/spotlight/RoomResultContextMenus.tsx rename to apps/web/src/components/views/dialogs/spotlight/RoomResultContextMenus.tsx diff --git a/src/components/views/dialogs/spotlight/SpotlightDialog.tsx b/apps/web/src/components/views/dialogs/spotlight/SpotlightDialog.tsx similarity index 99% rename from src/components/views/dialogs/spotlight/SpotlightDialog.tsx rename to apps/web/src/components/views/dialogs/spotlight/SpotlightDialog.tsx index 204c404fde..de68c42ee4 100644 --- a/src/components/views/dialogs/spotlight/SpotlightDialog.tsx +++ b/apps/web/src/components/views/dialogs/spotlight/SpotlightDialog.tsx @@ -106,7 +106,7 @@ const AVATAR_SIZE = "24px"; interface IProps { initialText?: string; initialFilter?: Filter; - onFinished(): void; + onFinished(this: void): void; } function nodeIsForRecentlyViewed(node?: HTMLElement): boolean { @@ -191,7 +191,7 @@ interface IResult extends IBaseResult { avatar: JSX.Element; name: string; description?: string; - onClick?(): void; + onClick?(this: void): void; } type Result = IRoomResult | IPublicRoomResult | IMemberResult | IResult; diff --git a/src/components/views/dialogs/spotlight/TooltipOption.tsx b/apps/web/src/components/views/dialogs/spotlight/TooltipOption.tsx similarity index 100% rename from src/components/views/dialogs/spotlight/TooltipOption.tsx rename to apps/web/src/components/views/dialogs/spotlight/TooltipOption.tsx diff --git a/src/components/views/directory/NetworkDropdown.tsx b/apps/web/src/components/views/directory/NetworkDropdown.tsx similarity index 100% rename from src/components/views/directory/NetworkDropdown.tsx rename to apps/web/src/components/views/directory/NetworkDropdown.tsx diff --git a/src/components/views/elements/AccessibleButton.tsx b/apps/web/src/components/views/elements/AccessibleButton.tsx similarity index 100% rename from src/components/views/elements/AccessibleButton.tsx rename to apps/web/src/components/views/elements/AccessibleButton.tsx diff --git a/src/components/views/elements/AppPermission.tsx b/apps/web/src/components/views/elements/AppPermission.tsx similarity index 100% rename from src/components/views/elements/AppPermission.tsx rename to apps/web/src/components/views/elements/AppPermission.tsx diff --git a/src/components/views/elements/AppTile.tsx b/apps/web/src/components/views/elements/AppTile.tsx similarity index 100% rename from src/components/views/elements/AppTile.tsx rename to apps/web/src/components/views/elements/AppTile.tsx diff --git a/src/components/views/elements/AppWarning.tsx b/apps/web/src/components/views/elements/AppWarning.tsx similarity index 100% rename from src/components/views/elements/AppWarning.tsx rename to apps/web/src/components/views/elements/AppWarning.tsx diff --git a/src/components/views/elements/BugReportDialogButton.tsx b/apps/web/src/components/views/elements/BugReportDialogButton.tsx similarity index 100% rename from src/components/views/elements/BugReportDialogButton.tsx rename to apps/web/src/components/views/elements/BugReportDialogButton.tsx diff --git a/src/components/views/elements/CopyableText.tsx b/apps/web/src/components/views/elements/CopyableText.tsx similarity index 100% rename from src/components/views/elements/CopyableText.tsx rename to apps/web/src/components/views/elements/CopyableText.tsx diff --git a/src/components/views/elements/DesktopCapturerSourcePicker.tsx b/apps/web/src/components/views/elements/DesktopCapturerSourcePicker.tsx similarity index 100% rename from src/components/views/elements/DesktopCapturerSourcePicker.tsx rename to apps/web/src/components/views/elements/DesktopCapturerSourcePicker.tsx diff --git a/src/components/views/elements/DialPadBackspaceButton.tsx b/apps/web/src/components/views/elements/DialPadBackspaceButton.tsx similarity index 100% rename from src/components/views/elements/DialPadBackspaceButton.tsx rename to apps/web/src/components/views/elements/DialPadBackspaceButton.tsx diff --git a/src/components/views/elements/DialogButtons.tsx b/apps/web/src/components/views/elements/DialogButtons.tsx similarity index 100% rename from src/components/views/elements/DialogButtons.tsx rename to apps/web/src/components/views/elements/DialogButtons.tsx diff --git a/src/components/views/elements/Draggable.tsx b/apps/web/src/components/views/elements/Draggable.tsx similarity index 100% rename from src/components/views/elements/Draggable.tsx rename to apps/web/src/components/views/elements/Draggable.tsx diff --git a/src/components/views/elements/Dropdown.tsx b/apps/web/src/components/views/elements/Dropdown.tsx similarity index 99% rename from src/components/views/elements/Dropdown.tsx rename to apps/web/src/components/views/elements/Dropdown.tsx index cc298cd2a6..6a4af20e94 100644 --- a/src/components/views/elements/Dropdown.tsx +++ b/apps/web/src/components/views/elements/Dropdown.tsx @@ -306,7 +306,7 @@ export default class Dropdown extends React.Component { return keys[index <= 0 ? keys.length - 1 : (index - 1) % keys.length]; } - private scrollIntoView(node: Element | null): void { + private scrollIntoView(this: void, node: Element | null): void { node?.scrollIntoView({ block: "nearest", behavior: "auto", diff --git a/src/components/views/elements/EditableItemList.tsx b/apps/web/src/components/views/elements/EditableItemList.tsx similarity index 100% rename from src/components/views/elements/EditableItemList.tsx rename to apps/web/src/components/views/elements/EditableItemList.tsx diff --git a/src/components/views/elements/EditableText.tsx b/apps/web/src/components/views/elements/EditableText.tsx similarity index 100% rename from src/components/views/elements/EditableText.tsx rename to apps/web/src/components/views/elements/EditableText.tsx diff --git a/src/components/views/elements/EffectsOverlay.tsx b/apps/web/src/components/views/elements/EffectsOverlay.tsx similarity index 100% rename from src/components/views/elements/EffectsOverlay.tsx rename to apps/web/src/components/views/elements/EffectsOverlay.tsx diff --git a/src/components/views/elements/ErrorBoundary.tsx b/apps/web/src/components/views/elements/ErrorBoundary.tsx similarity index 100% rename from src/components/views/elements/ErrorBoundary.tsx rename to apps/web/src/components/views/elements/ErrorBoundary.tsx diff --git a/src/components/views/elements/EventListSummary.tsx b/apps/web/src/components/views/elements/EventListSummary.tsx similarity index 100% rename from src/components/views/elements/EventListSummary.tsx rename to apps/web/src/components/views/elements/EventListSummary.tsx diff --git a/src/components/views/elements/EventTilePreview.tsx b/apps/web/src/components/views/elements/EventTilePreview.tsx similarity index 100% rename from src/components/views/elements/EventTilePreview.tsx rename to apps/web/src/components/views/elements/EventTilePreview.tsx diff --git a/src/components/views/elements/ExternalLink.tsx b/apps/web/src/components/views/elements/ExternalLink.tsx similarity index 100% rename from src/components/views/elements/ExternalLink.tsx rename to apps/web/src/components/views/elements/ExternalLink.tsx diff --git a/src/components/views/elements/FacePile.tsx b/apps/web/src/components/views/elements/FacePile.tsx similarity index 100% rename from src/components/views/elements/FacePile.tsx rename to apps/web/src/components/views/elements/FacePile.tsx diff --git a/src/components/views/elements/Field.tsx b/apps/web/src/components/views/elements/Field.tsx similarity index 100% rename from src/components/views/elements/Field.tsx rename to apps/web/src/components/views/elements/Field.tsx diff --git a/src/components/views/elements/FilterDropdown.tsx b/apps/web/src/components/views/elements/FilterDropdown.tsx similarity index 100% rename from src/components/views/elements/FilterDropdown.tsx rename to apps/web/src/components/views/elements/FilterDropdown.tsx diff --git a/src/components/views/elements/FilterTabGroup.tsx b/apps/web/src/components/views/elements/FilterTabGroup.tsx similarity index 100% rename from src/components/views/elements/FilterTabGroup.tsx rename to apps/web/src/components/views/elements/FilterTabGroup.tsx diff --git a/src/components/views/elements/GenericEventListSummary.tsx b/apps/web/src/components/views/elements/GenericEventListSummary.tsx similarity index 99% rename from src/components/views/elements/GenericEventListSummary.tsx rename to apps/web/src/components/views/elements/GenericEventListSummary.tsx index 3a6e377ba1..5b938d54a0 100644 --- a/src/components/views/elements/GenericEventListSummary.tsx +++ b/apps/web/src/components/views/elements/GenericEventListSummary.tsx @@ -31,7 +31,7 @@ interface IProps { // An array of EventTiles to render when expanded "children": ReactNode[] | null; // Called when the event list expansion is toggled - onToggle?(): void; + onToggle?(this: void): void; // The layout currently used "layout"?: Layout; "data-testid"?: string; diff --git a/src/components/views/elements/IRCTimelineProfileResizer.tsx b/apps/web/src/components/views/elements/IRCTimelineProfileResizer.tsx similarity index 100% rename from src/components/views/elements/IRCTimelineProfileResizer.tsx rename to apps/web/src/components/views/elements/IRCTimelineProfileResizer.tsx diff --git a/src/components/views/elements/ImageView.tsx b/apps/web/src/components/views/elements/ImageView.tsx similarity index 95% rename from src/components/views/elements/ImageView.tsx rename to apps/web/src/components/views/elements/ImageView.tsx index ac13f04bc3..983cd42575 100644 --- a/src/components/views/elements/ImageView.tsx +++ b/apps/web/src/components/views/elements/ImageView.tsx @@ -20,13 +20,13 @@ import { ZoomInIcon, ZoomOutIcon, } from "@vector-im/compound-design-tokens/assets/web/icons"; +import { useCreateAutoDisposedViewModel, MessageTimestampView } from "@element-hq/web-shared-components"; import { _t } from "../../../languageHandler"; import MemberAvatar from "../avatars/MemberAvatar"; import { ContextMenuTooltipButton } from "../../../accessibility/context_menu/ContextMenuTooltipButton"; import MessageContextMenu from "../context_menus/MessageContextMenu"; import { aboveLeftOf } from "../../structures/ContextMenu"; -import MessageTimestamp from "../messages/MessageTimestamp"; import SettingsStore from "../../../settings/SettingsStore"; import dis from "../../../dispatcher/dispatcher"; import { Action } from "../../../dispatcher/actions"; @@ -39,6 +39,10 @@ import { getKeyBindingsManager } from "../../../KeyBindingsManager"; import { presentableTextForFile } from "../../../utils/FileUtils"; import AccessibleButton from "./AccessibleButton"; import { useDownloadMedia } from "../../../hooks/useDownloadMedia.ts"; +import { + MessageTimestampViewModel, + type MessageTimestampViewModelProps, +} from "../../../viewmodels/message-body/MessageTimestampViewModel.ts"; // Max scale to keep gaps around the image const MAX_SCALE = 0.95; @@ -465,7 +469,7 @@ export default class ImageView extends React.Component { const senderName = mxEvent.sender?.name ?? mxEvent.getSender(); const sender =
    {senderName}
    ; const messageTimestamp = ( - = ({ url, fileName, m ); }; + +/** + * Wraps MessageTimestampView with a view model synced to the provided props. + * This wrapper can be removed after ImageView has been changed to a function component. + */ +function MessageTimestampWrapper(props: MessageTimestampViewModelProps): JSX.Element { + const vm = useCreateAutoDisposedViewModel(() => new MessageTimestampViewModel(props)); + useEffect(() => { + vm.setTimestamp(props.ts); + vm.setDisplayOptions({ + showTwelveHour: props.showTwelveHour, + showFullDate: props.showFullDate, + showSeconds: props.showSeconds, + }); + vm.setTooltipInhibited(props.inhibitTooltip); + vm.setHref(props.href); + vm.setHandlers({ onClick: props.onClick }); + }, [vm, props]); + return ; +} diff --git a/src/components/views/elements/InfoTooltip.tsx b/apps/web/src/components/views/elements/InfoTooltip.tsx similarity index 100% rename from src/components/views/elements/InfoTooltip.tsx rename to apps/web/src/components/views/elements/InfoTooltip.tsx diff --git a/src/components/views/elements/InlineSpinner.tsx b/apps/web/src/components/views/elements/InlineSpinner.tsx similarity index 100% rename from src/components/views/elements/InlineSpinner.tsx rename to apps/web/src/components/views/elements/InlineSpinner.tsx diff --git a/src/components/views/elements/InviteReason.tsx b/apps/web/src/components/views/elements/InviteReason.tsx similarity index 100% rename from src/components/views/elements/InviteReason.tsx rename to apps/web/src/components/views/elements/InviteReason.tsx diff --git a/src/components/views/elements/JoinRuleDropdown.tsx b/apps/web/src/components/views/elements/JoinRuleDropdown.tsx similarity index 98% rename from src/components/views/elements/JoinRuleDropdown.tsx rename to apps/web/src/components/views/elements/JoinRuleDropdown.tsx index f40493854e..df4a4521c2 100644 --- a/src/components/views/elements/JoinRuleDropdown.tsx +++ b/apps/web/src/components/views/elements/JoinRuleDropdown.tsx @@ -26,7 +26,7 @@ interface IProps { labelKnock?: string; labelPublic?: string; labelRestricted?: string; // if omitted then this option will be hidden, e.g if unsupported - onChange(value: JoinRule): void; + onChange(this: void, value: JoinRule): void; } const JoinRuleDropdown: React.FC = ({ diff --git a/src/components/views/elements/LabelledCheckbox.tsx b/apps/web/src/components/views/elements/LabelledCheckbox.tsx similarity index 96% rename from src/components/views/elements/LabelledCheckbox.tsx rename to apps/web/src/components/views/elements/LabelledCheckbox.tsx index 45cef43da9..231b8cf0d3 100644 --- a/src/components/views/elements/LabelledCheckbox.tsx +++ b/apps/web/src/components/views/elements/LabelledCheckbox.tsx @@ -21,7 +21,7 @@ interface IProps { // Whether or not to disable the checkbox disabled?: boolean; // The function to call when the value changes - onChange(checked: boolean): void; + onChange(this: void, checked: boolean): void; // Optional additional CSS class to apply to the label className?: string; // The id for the checkbox diff --git a/src/components/views/elements/LanguageDropdown.tsx b/apps/web/src/components/views/elements/LanguageDropdown.tsx similarity index 100% rename from src/components/views/elements/LanguageDropdown.tsx rename to apps/web/src/components/views/elements/LanguageDropdown.tsx diff --git a/src/components/views/elements/LazyRenderList.tsx b/apps/web/src/components/views/elements/LazyRenderList.tsx similarity index 100% rename from src/components/views/elements/LazyRenderList.tsx rename to apps/web/src/components/views/elements/LazyRenderList.tsx diff --git a/src/components/views/elements/LearnMore.tsx b/apps/web/src/components/views/elements/LearnMore.tsx similarity index 100% rename from src/components/views/elements/LearnMore.tsx rename to apps/web/src/components/views/elements/LearnMore.tsx diff --git a/src/components/views/elements/LinkWithTooltip.tsx b/apps/web/src/components/views/elements/LinkWithTooltip.tsx similarity index 100% rename from src/components/views/elements/LinkWithTooltip.tsx rename to apps/web/src/components/views/elements/LinkWithTooltip.tsx diff --git a/src/components/views/elements/Measured.tsx b/apps/web/src/components/views/elements/Measured.tsx similarity index 100% rename from src/components/views/elements/Measured.tsx rename to apps/web/src/components/views/elements/Measured.tsx diff --git a/src/components/views/elements/MiniAvatarUploader.tsx b/apps/web/src/components/views/elements/MiniAvatarUploader.tsx similarity index 96% rename from src/components/views/elements/MiniAvatarUploader.tsx rename to apps/web/src/components/views/elements/MiniAvatarUploader.tsx index fc9574b411..f7aea40751 100644 --- a/src/components/views/elements/MiniAvatarUploader.tsx +++ b/apps/web/src/components/views/elements/MiniAvatarUploader.tsx @@ -24,9 +24,9 @@ interface IProps { hasAvatar: boolean; noAvatarLabel?: string; hasAvatarLabel?: string; - setAvatarUrl(url: string): Promise; + setAvatarUrl(this: void, url: string): Promise; isUserAvatar?: boolean; - onClick?(ev: MouseEvent): void; + onClick?(this: void, ev: MouseEvent): void; children?: ReactNode; } diff --git a/src/components/views/elements/PersistedElement.tsx b/apps/web/src/components/views/elements/PersistedElement.tsx similarity index 100% rename from src/components/views/elements/PersistedElement.tsx rename to apps/web/src/components/views/elements/PersistedElement.tsx diff --git a/src/components/views/elements/PersistentApp.tsx b/apps/web/src/components/views/elements/PersistentApp.tsx similarity index 100% rename from src/components/views/elements/PersistentApp.tsx rename to apps/web/src/components/views/elements/PersistentApp.tsx diff --git a/src/components/views/elements/Pill.tsx b/apps/web/src/components/views/elements/Pill.tsx similarity index 100% rename from src/components/views/elements/Pill.tsx rename to apps/web/src/components/views/elements/Pill.tsx diff --git a/src/components/views/elements/PollCreateDialog.tsx b/apps/web/src/components/views/elements/PollCreateDialog.tsx similarity index 100% rename from src/components/views/elements/PollCreateDialog.tsx rename to apps/web/src/components/views/elements/PollCreateDialog.tsx diff --git a/src/components/views/elements/PowerSelector.tsx b/apps/web/src/components/views/elements/PowerSelector.tsx similarity index 100% rename from src/components/views/elements/PowerSelector.tsx rename to apps/web/src/components/views/elements/PowerSelector.tsx diff --git a/src/components/views/elements/ProgressBar.tsx b/apps/web/src/components/views/elements/ProgressBar.tsx similarity index 100% rename from src/components/views/elements/ProgressBar.tsx rename to apps/web/src/components/views/elements/ProgressBar.tsx diff --git a/src/components/views/elements/QRCode.tsx b/apps/web/src/components/views/elements/QRCode.tsx similarity index 100% rename from src/components/views/elements/QRCode.tsx rename to apps/web/src/components/views/elements/QRCode.tsx diff --git a/src/components/views/elements/ReplyChain.tsx b/apps/web/src/components/views/elements/ReplyChain.tsx similarity index 100% rename from src/components/views/elements/ReplyChain.tsx rename to apps/web/src/components/views/elements/ReplyChain.tsx diff --git a/src/components/views/elements/ResizeHandle.tsx b/apps/web/src/components/views/elements/ResizeHandle.tsx similarity index 100% rename from src/components/views/elements/ResizeHandle.tsx rename to apps/web/src/components/views/elements/ResizeHandle.tsx diff --git a/src/components/views/elements/RoomAliasField.tsx b/apps/web/src/components/views/elements/RoomAliasField.tsx similarity index 100% rename from src/components/views/elements/RoomAliasField.tsx rename to apps/web/src/components/views/elements/RoomAliasField.tsx diff --git a/src/components/views/elements/RoomFacePile.tsx b/apps/web/src/components/views/elements/RoomFacePile.tsx similarity index 100% rename from src/components/views/elements/RoomFacePile.tsx rename to apps/web/src/components/views/elements/RoomFacePile.tsx diff --git a/src/components/views/elements/RoomTopic.tsx b/apps/web/src/components/views/elements/RoomTopic.tsx similarity index 100% rename from src/components/views/elements/RoomTopic.tsx rename to apps/web/src/components/views/elements/RoomTopic.tsx diff --git a/src/components/views/elements/SSOButtons.tsx b/apps/web/src/components/views/elements/SSOButtons.tsx similarity index 73% rename from src/components/views/elements/SSOButtons.tsx rename to apps/web/src/components/views/elements/SSOButtons.tsx index 52fdef752c..9f321c42e2 100644 --- a/src/components/views/elements/SSOButtons.tsx +++ b/apps/web/src/components/views/elements/SSOButtons.tsx @@ -6,7 +6,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import React, { type JSX } from "react"; +import React, { type ComponentProps, type JSX } from "react"; import { chunk } from "lodash"; import classNames from "classnames"; import { @@ -18,12 +18,18 @@ import { DELEGATED_OIDC_COMPATIBILITY, } from "matrix-js-sdk/src/matrix"; import { type Signup } from "@matrix-org/analytics-events/types/typescript/Signup"; +import { Button, Tooltip } from "@vector-im/compound-web"; +import { MacIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; import PlatformPeg from "../../../PlatformPeg"; -import AccessibleButton from "./AccessibleButton"; import { _t } from "../../../languageHandler"; import { mediaFromMxc } from "../../../customisations/Media"; import { PosthogAnalytics } from "../../../PosthogAnalytics"; +import { Icon as FacebookIcon } from "../../../../res/img/element-icons/brands/facebook.svg"; +import { Icon as GithubIcon } from "../../../../res/img/element-icons/brands/github.svg"; +import { Icon as GitlabIcon } from "../../../../res/img/element-icons/brands/gitlab.svg"; +import { Icon as GoogleIcon } from "../../../../res/img/element-icons/brands/google.svg"; +import { Icon as TwitterIcon } from "../../../../res/img/element-icons/brands/twitter.svg"; interface ISSOButtonProps extends IProps { idp?: IIdentityProvider; @@ -31,24 +37,22 @@ interface ISSOButtonProps extends IProps { action?: SSOAction; } -const getIcon = (brand: IdentityProviderBrand | string): string | null => { +const getIcon = (brand: IdentityProviderBrand | string): typeof FacebookIcon | null => { switch (brand) { - /* eslint-disable @typescript-eslint/no-require-imports */ case IdentityProviderBrand.Apple: - return require("@vector-im/compound-design-tokens/icons/mac.svg").default; + return MacIcon; case IdentityProviderBrand.Facebook: - return require(`../../../../res/img/element-icons/brands/facebook.svg`).default; + return FacebookIcon; case IdentityProviderBrand.Github: - return require(`../../../../res/img/element-icons/brands/github.svg`).default; + return GithubIcon; case IdentityProviderBrand.Gitlab: - return require(`../../../../res/img/element-icons/brands/gitlab.svg`).default; + return GitlabIcon; case IdentityProviderBrand.Google: - return require(`../../../../res/img/element-icons/brands/google.svg`).default; + return GoogleIcon; case IdentityProviderBrand.Twitter: - return require(`../../../../res/img/element-icons/brands/twitter.svg`).default; + return TwitterIcon; default: return null; - /* eslint-enable @typescript-eslint/no-require-imports */ } }; @@ -78,10 +82,10 @@ const SSOButton: React.FC = ({ fragmentAfterLogin, idp, primary, - mini, + mini: iconOnly, action, flow, - ...props + disabled, }) => { let label: string; if (idp) { @@ -98,43 +102,43 @@ const SSOButton: React.FC = ({ PlatformPeg.get()?.startSingleSignOn(matrixClient, loginType, fragmentAfterLogin, idp?.id, action); }; + const commonProps: Partial> & Record<`data-${string}`, string> = { + iconOnly, + className: classNames("mx_SSOButton", { + mx_SSOButton_mini: iconOnly, + }), + onClick, + kind: primary ? "primary" : "secondary", + disabled, + }; + let icon: JSX.Element | undefined; - let brandClass: string | undefined; - const brandIcon = idp?.brand ? getIcon(idp.brand) : null; - if (idp?.brand && brandIcon) { + const BrandIcon = idp?.brand ? getIcon(idp.brand) : null; + if (idp?.brand && BrandIcon) { const brandName = idp.brand.split(".").pop(); - brandClass = `mx_SSOButton_brand_${brandName}`; - icon = {brandName}; + icon = ; + commonProps["data-testid"] = `idp-${idp.id}`; } else if (typeof idp?.icon === "string" && idp.icon.startsWith("mxc://")) { const src = mediaFromMxc(idp.icon, matrixClient).getSquareThumbnailHttp(24) ?? undefined; - icon = {idp.name}; + icon = {idp.name}; } - const brandPart = brandClass ? { [brandClass]: brandClass } : undefined; - const classes = classNames( - "mx_SSOButton", - { - mx_SSOButton_mini: mini, - mx_SSOButton_default: !idp, - mx_SSOButton_primary: primary, - }, - brandPart, - ); - - if (mini) { - // TODO fallback icon + // TODO fallback icon + if (iconOnly) { return ( - - {icon} - + + + ); } return ( - + ); }; diff --git a/src/components/views/elements/SearchWarning.tsx b/apps/web/src/components/views/elements/SearchWarning.tsx similarity index 100% rename from src/components/views/elements/SearchWarning.tsx rename to apps/web/src/components/views/elements/SearchWarning.tsx diff --git a/src/components/views/elements/ServerPicker.tsx b/apps/web/src/components/views/elements/ServerPicker.tsx similarity index 97% rename from src/components/views/elements/ServerPicker.tsx rename to apps/web/src/components/views/elements/ServerPicker.tsx index 1debb50645..fa25598c68 100644 --- a/src/components/views/elements/ServerPicker.tsx +++ b/apps/web/src/components/views/elements/ServerPicker.tsx @@ -23,7 +23,7 @@ interface IProps { dialogTitle?: string; serverConfig: ValidatedServerConfig; disabled?: boolean; - onServerConfigChange?(config: ValidatedServerConfig): void; + onServerConfigChange?(this: void, config: ValidatedServerConfig): void; } const showPickerDialog = ( diff --git a/src/components/views/elements/SettingsDropdown.tsx b/apps/web/src/components/views/elements/SettingsDropdown.tsx similarity index 98% rename from src/components/views/elements/SettingsDropdown.tsx rename to apps/web/src/components/views/elements/SettingsDropdown.tsx index db78e7cc36..85f448ea76 100644 --- a/src/components/views/elements/SettingsDropdown.tsx +++ b/apps/web/src/components/views/elements/SettingsDropdown.tsx @@ -21,7 +21,7 @@ interface Props { label?: string; isExplicit?: boolean; hideIfCannotSet?: boolean; - onChange?(option: string): void; + onChange?(this: void, option: string): void; } const SettingsDropdown = ({ diff --git a/src/components/views/elements/SettingsField.tsx b/apps/web/src/components/views/elements/SettingsField.tsx similarity index 97% rename from src/components/views/elements/SettingsField.tsx rename to apps/web/src/components/views/elements/SettingsField.tsx index d46b5b0f32..3ba2128347 100644 --- a/src/components/views/elements/SettingsField.tsx +++ b/apps/web/src/components/views/elements/SettingsField.tsx @@ -19,7 +19,7 @@ interface Props { roomId?: string; // for per-room settings label?: string; isExplicit?: boolean; - onChange?(value: string): void; + onChange?(this: void, value: string): void; } const SettingsField = ({ settingKey, level, roomId, isExplicit, label, onChange: _onSave }: Props): JSX.Element => { diff --git a/src/components/views/elements/SettingsFlag.tsx b/apps/web/src/components/views/elements/SettingsFlag.tsx similarity index 100% rename from src/components/views/elements/SettingsFlag.tsx rename to apps/web/src/components/views/elements/SettingsFlag.tsx diff --git a/src/components/views/elements/SpellCheckLanguagesDropdown.tsx b/apps/web/src/components/views/elements/SpellCheckLanguagesDropdown.tsx similarity index 98% rename from src/components/views/elements/SpellCheckLanguagesDropdown.tsx rename to apps/web/src/components/views/elements/SpellCheckLanguagesDropdown.tsx index ffcbf972d7..763fe4b5f8 100644 --- a/src/components/views/elements/SpellCheckLanguagesDropdown.tsx +++ b/apps/web/src/components/views/elements/SpellCheckLanguagesDropdown.tsx @@ -81,9 +81,9 @@ export default class SpellCheckLanguagesDropdown extends React.Component< } } - private onSearchChange(searchQuery: string): void { + private onSearchChange = (searchQuery: string): void => { this.setState({ searchQuery }); - } + }; public render(): React.ReactNode { if (!this.state.languages) { diff --git a/src/components/views/elements/Spinner.tsx b/apps/web/src/components/views/elements/Spinner.tsx similarity index 100% rename from src/components/views/elements/Spinner.tsx rename to apps/web/src/components/views/elements/Spinner.tsx diff --git a/src/components/views/elements/Spoiler.tsx b/apps/web/src/components/views/elements/Spoiler.tsx similarity index 100% rename from src/components/views/elements/Spoiler.tsx rename to apps/web/src/components/views/elements/Spoiler.tsx diff --git a/src/components/views/elements/StyledCheckbox.tsx b/apps/web/src/components/views/elements/StyledCheckbox.tsx similarity index 100% rename from src/components/views/elements/StyledCheckbox.tsx rename to apps/web/src/components/views/elements/StyledCheckbox.tsx diff --git a/src/components/views/elements/StyledRadioButton.tsx b/apps/web/src/components/views/elements/StyledRadioButton.tsx similarity index 100% rename from src/components/views/elements/StyledRadioButton.tsx rename to apps/web/src/components/views/elements/StyledRadioButton.tsx diff --git a/src/components/views/elements/StyledRadioGroup.tsx b/apps/web/src/components/views/elements/StyledRadioGroup.tsx similarity index 98% rename from src/components/views/elements/StyledRadioGroup.tsx rename to apps/web/src/components/views/elements/StyledRadioGroup.tsx index 1dba78d912..37da341bb4 100644 --- a/src/components/views/elements/StyledRadioGroup.tsx +++ b/apps/web/src/components/views/elements/StyledRadioGroup.tsx @@ -27,7 +27,7 @@ interface IProps { value?: T; // if not provided no options will be selected outlined?: boolean; disabled?: boolean; - onChange(newValue: T): void; + onChange(this: void, newValue: T): void; } function StyledRadioGroup({ diff --git a/src/components/views/elements/SyntaxHighlight.tsx b/apps/web/src/components/views/elements/SyntaxHighlight.tsx similarity index 100% rename from src/components/views/elements/SyntaxHighlight.tsx rename to apps/web/src/components/views/elements/SyntaxHighlight.tsx diff --git a/src/components/views/elements/Tag.tsx b/apps/web/src/components/views/elements/Tag.tsx similarity index 100% rename from src/components/views/elements/Tag.tsx rename to apps/web/src/components/views/elements/Tag.tsx diff --git a/src/components/views/elements/TagComposer.tsx b/apps/web/src/components/views/elements/TagComposer.tsx similarity index 100% rename from src/components/views/elements/TagComposer.tsx rename to apps/web/src/components/views/elements/TagComposer.tsx diff --git a/src/components/views/elements/TextWithTooltip.tsx b/apps/web/src/components/views/elements/TextWithTooltip.tsx similarity index 100% rename from src/components/views/elements/TextWithTooltip.tsx rename to apps/web/src/components/views/elements/TextWithTooltip.tsx diff --git a/src/components/views/elements/ToggleSwitch.tsx b/apps/web/src/components/views/elements/ToggleSwitch.tsx similarity index 96% rename from src/components/views/elements/ToggleSwitch.tsx rename to apps/web/src/components/views/elements/ToggleSwitch.tsx index 3f6548c7a0..6139b32669 100644 --- a/src/components/views/elements/ToggleSwitch.tsx +++ b/apps/web/src/components/views/elements/ToggleSwitch.tsx @@ -25,7 +25,7 @@ interface IProps { tooltip?: string; // Called when the checked state changes. First argument will be the new state. - onChange(checked: boolean): void; + onChange(this: void, checked: boolean): void; // id to bind with other elements id?: string; diff --git a/src/components/views/elements/TruncatedList.tsx b/apps/web/src/components/views/elements/TruncatedList.tsx similarity index 100% rename from src/components/views/elements/TruncatedList.tsx rename to apps/web/src/components/views/elements/TruncatedList.tsx diff --git a/src/components/views/elements/Validation.tsx b/apps/web/src/components/views/elements/Validation.tsx similarity index 97% rename from src/components/views/elements/Validation.tsx rename to apps/web/src/components/views/elements/Validation.tsx index ce1a9b457a..6346c22ffb 100644 --- a/src/components/views/elements/Validation.tsx +++ b/apps/web/src/components/views/elements/Validation.tsx @@ -33,7 +33,7 @@ interface IArgs { rules: IRule[]; description?(this: T, derivedData: D, results: IResult[]): ReactNode; hideDescriptionIfValid?: boolean; - deriveData?(data: Data): Promise; + deriveData?(this: T, data: Data): Promise; memoize?: boolean; } @@ -78,8 +78,10 @@ export interface IValidationResult { * the overall validity and a feedback UI that can be rendered for more detail. */ export default function withValidation({ + // eslint-disable-next-line @typescript-eslint/unbound-method description, hideDescriptionIfValid, + // eslint-disable-next-line @typescript-eslint/unbound-method deriveData, rules, memoize, diff --git a/src/components/views/elements/crypto/VerificationQRCode.tsx b/apps/web/src/components/views/elements/crypto/VerificationQRCode.tsx similarity index 100% rename from src/components/views/elements/crypto/VerificationQRCode.tsx rename to apps/web/src/components/views/elements/crypto/VerificationQRCode.tsx diff --git a/src/components/views/emojipicker/Category.tsx b/apps/web/src/components/views/emojipicker/Category.tsx similarity index 100% rename from src/components/views/emojipicker/Category.tsx rename to apps/web/src/components/views/emojipicker/Category.tsx diff --git a/src/components/views/emojipicker/Emoji.tsx b/apps/web/src/components/views/emojipicker/Emoji.tsx similarity index 100% rename from src/components/views/emojipicker/Emoji.tsx rename to apps/web/src/components/views/emojipicker/Emoji.tsx diff --git a/src/components/views/emojipicker/EmojiPicker.tsx b/apps/web/src/components/views/emojipicker/EmojiPicker.tsx similarity index 100% rename from src/components/views/emojipicker/EmojiPicker.tsx rename to apps/web/src/components/views/emojipicker/EmojiPicker.tsx diff --git a/src/components/views/emojipicker/Header.tsx b/apps/web/src/components/views/emojipicker/Header.tsx similarity index 100% rename from src/components/views/emojipicker/Header.tsx rename to apps/web/src/components/views/emojipicker/Header.tsx diff --git a/src/components/views/emojipicker/Preview.tsx b/apps/web/src/components/views/emojipicker/Preview.tsx similarity index 100% rename from src/components/views/emojipicker/Preview.tsx rename to apps/web/src/components/views/emojipicker/Preview.tsx diff --git a/src/components/views/emojipicker/QuickReactions.tsx b/apps/web/src/components/views/emojipicker/QuickReactions.tsx similarity index 100% rename from src/components/views/emojipicker/QuickReactions.tsx rename to apps/web/src/components/views/emojipicker/QuickReactions.tsx diff --git a/src/components/views/emojipicker/ReactionPicker.tsx b/apps/web/src/components/views/emojipicker/ReactionPicker.tsx similarity index 100% rename from src/components/views/emojipicker/ReactionPicker.tsx rename to apps/web/src/components/views/emojipicker/ReactionPicker.tsx diff --git a/src/components/views/emojipicker/Search.tsx b/apps/web/src/components/views/emojipicker/Search.tsx similarity index 100% rename from src/components/views/emojipicker/Search.tsx rename to apps/web/src/components/views/emojipicker/Search.tsx diff --git a/src/components/views/location/EnableLiveShare.tsx b/apps/web/src/components/views/location/EnableLiveShare.tsx similarity index 100% rename from src/components/views/location/EnableLiveShare.tsx rename to apps/web/src/components/views/location/EnableLiveShare.tsx diff --git a/src/components/views/location/LiveDurationDropdown.tsx b/apps/web/src/components/views/location/LiveDurationDropdown.tsx similarity index 100% rename from src/components/views/location/LiveDurationDropdown.tsx rename to apps/web/src/components/views/location/LiveDurationDropdown.tsx diff --git a/src/components/views/location/LocationButton.tsx b/apps/web/src/components/views/location/LocationButton.tsx similarity index 100% rename from src/components/views/location/LocationButton.tsx rename to apps/web/src/components/views/location/LocationButton.tsx diff --git a/src/components/views/location/LocationPicker.tsx b/apps/web/src/components/views/location/LocationPicker.tsx similarity index 100% rename from src/components/views/location/LocationPicker.tsx rename to apps/web/src/components/views/location/LocationPicker.tsx diff --git a/src/components/views/location/LocationShareMenu.tsx b/apps/web/src/components/views/location/LocationShareMenu.tsx similarity index 100% rename from src/components/views/location/LocationShareMenu.tsx rename to apps/web/src/components/views/location/LocationShareMenu.tsx diff --git a/src/components/views/location/LocationViewDialog.tsx b/apps/web/src/components/views/location/LocationViewDialog.tsx similarity index 100% rename from src/components/views/location/LocationViewDialog.tsx rename to apps/web/src/components/views/location/LocationViewDialog.tsx diff --git a/src/components/views/location/Map.tsx b/apps/web/src/components/views/location/Map.tsx similarity index 99% rename from src/components/views/location/Map.tsx rename to apps/web/src/components/views/location/Map.tsx index 998dff1d15..cb6f64ad83 100644 --- a/src/components/views/location/Map.tsx +++ b/apps/web/src/components/views/location/Map.tsx @@ -32,7 +32,7 @@ const useMapWithStyle = ({ }: { id: string; centerGeoUri?: string; - onError?(error: Error): void; + onError?(this: void, error: Error): void; interactive?: boolean; bounds?: Bounds; allowGeolocate?: boolean; diff --git a/src/components/views/location/MapError.tsx b/apps/web/src/components/views/location/MapError.tsx similarity index 100% rename from src/components/views/location/MapError.tsx rename to apps/web/src/components/views/location/MapError.tsx diff --git a/src/components/views/location/MapFallback.tsx b/apps/web/src/components/views/location/MapFallback.tsx similarity index 100% rename from src/components/views/location/MapFallback.tsx rename to apps/web/src/components/views/location/MapFallback.tsx diff --git a/src/components/views/location/Marker.tsx b/apps/web/src/components/views/location/Marker.tsx similarity index 100% rename from src/components/views/location/Marker.tsx rename to apps/web/src/components/views/location/Marker.tsx diff --git a/src/components/views/location/ShareDialogButtons.tsx b/apps/web/src/components/views/location/ShareDialogButtons.tsx similarity index 100% rename from src/components/views/location/ShareDialogButtons.tsx rename to apps/web/src/components/views/location/ShareDialogButtons.tsx diff --git a/src/components/views/location/ShareType.tsx b/apps/web/src/components/views/location/ShareType.tsx similarity index 100% rename from src/components/views/location/ShareType.tsx rename to apps/web/src/components/views/location/ShareType.tsx diff --git a/src/components/views/location/SmartMarker.tsx b/apps/web/src/components/views/location/SmartMarker.tsx similarity index 100% rename from src/components/views/location/SmartMarker.tsx rename to apps/web/src/components/views/location/SmartMarker.tsx diff --git a/src/components/views/location/ZoomButtons.tsx b/apps/web/src/components/views/location/ZoomButtons.tsx similarity index 100% rename from src/components/views/location/ZoomButtons.tsx rename to apps/web/src/components/views/location/ZoomButtons.tsx diff --git a/src/components/views/location/index.tsx b/apps/web/src/components/views/location/index.tsx similarity index 100% rename from src/components/views/location/index.tsx rename to apps/web/src/components/views/location/index.tsx diff --git a/src/components/views/location/shareLocation.ts b/apps/web/src/components/views/location/shareLocation.ts similarity index 100% rename from src/components/views/location/shareLocation.ts rename to apps/web/src/components/views/location/shareLocation.ts diff --git a/src/components/views/messages/CallEvent.tsx b/apps/web/src/components/views/messages/CallEvent.tsx similarity index 100% rename from src/components/views/messages/CallEvent.tsx rename to apps/web/src/components/views/messages/CallEvent.tsx diff --git a/src/components/views/messages/CodeBlock.tsx b/apps/web/src/components/views/messages/CodeBlock.tsx similarity index 99% rename from src/components/views/messages/CodeBlock.tsx rename to apps/web/src/components/views/messages/CodeBlock.tsx index 0a3a80fb89..026cbba886 100644 --- a/src/components/views/messages/CodeBlock.tsx +++ b/apps/web/src/components/views/messages/CodeBlock.tsx @@ -23,7 +23,7 @@ interface Props { const ExpandCollapseButton: React.FC<{ expanded: boolean; - onClick(): void; + onClick(this: void): void; }> = ({ expanded, onClick }) => { return ( diff --git a/src/components/views/messages/DateSeparator.tsx b/apps/web/src/components/views/messages/DateSeparator.tsx similarity index 100% rename from src/components/views/messages/DateSeparator.tsx rename to apps/web/src/components/views/messages/DateSeparator.tsx diff --git a/src/components/views/messages/DownloadActionButton.tsx b/apps/web/src/components/views/messages/DownloadActionButton.tsx similarity index 100% rename from src/components/views/messages/DownloadActionButton.tsx rename to apps/web/src/components/views/messages/DownloadActionButton.tsx diff --git a/src/components/views/messages/EditHistoryMessage.tsx b/apps/web/src/components/views/messages/EditHistoryMessage.tsx similarity index 100% rename from src/components/views/messages/EditHistoryMessage.tsx rename to apps/web/src/components/views/messages/EditHistoryMessage.tsx diff --git a/src/components/views/messages/EventContentBody.tsx b/apps/web/src/components/views/messages/EventContentBody.tsx similarity index 100% rename from src/components/views/messages/EventContentBody.tsx rename to apps/web/src/components/views/messages/EventContentBody.tsx diff --git a/src/components/views/messages/HiddenBody.tsx b/apps/web/src/components/views/messages/HiddenBody.tsx similarity index 100% rename from src/components/views/messages/HiddenBody.tsx rename to apps/web/src/components/views/messages/HiddenBody.tsx diff --git a/src/components/views/messages/HiddenMediaPlaceholder.tsx b/apps/web/src/components/views/messages/HiddenMediaPlaceholder.tsx similarity index 100% rename from src/components/views/messages/HiddenMediaPlaceholder.tsx rename to apps/web/src/components/views/messages/HiddenMediaPlaceholder.tsx diff --git a/src/components/views/messages/HideActionButton.tsx b/apps/web/src/components/views/messages/HideActionButton.tsx similarity index 100% rename from src/components/views/messages/HideActionButton.tsx rename to apps/web/src/components/views/messages/HideActionButton.tsx diff --git a/src/components/views/messages/IBodyProps.ts b/apps/web/src/components/views/messages/IBodyProps.ts similarity index 100% rename from src/components/views/messages/IBodyProps.ts rename to apps/web/src/components/views/messages/IBodyProps.ts diff --git a/src/components/views/messages/IMediaBody.ts b/apps/web/src/components/views/messages/IMediaBody.ts similarity index 100% rename from src/components/views/messages/IMediaBody.ts rename to apps/web/src/components/views/messages/IMediaBody.ts diff --git a/src/components/views/messages/JumpToDatePicker.tsx b/apps/web/src/components/views/messages/JumpToDatePicker.tsx similarity index 100% rename from src/components/views/messages/JumpToDatePicker.tsx rename to apps/web/src/components/views/messages/JumpToDatePicker.tsx diff --git a/src/components/views/messages/LegacyCallEvent.tsx b/apps/web/src/components/views/messages/LegacyCallEvent.tsx similarity index 100% rename from src/components/views/messages/LegacyCallEvent.tsx rename to apps/web/src/components/views/messages/LegacyCallEvent.tsx diff --git a/src/components/views/messages/MAudioBody.tsx b/apps/web/src/components/views/messages/MAudioBody.tsx similarity index 100% rename from src/components/views/messages/MAudioBody.tsx rename to apps/web/src/components/views/messages/MAudioBody.tsx diff --git a/src/components/views/messages/MBeaconBody.tsx b/apps/web/src/components/views/messages/MBeaconBody.tsx similarity index 100% rename from src/components/views/messages/MBeaconBody.tsx rename to apps/web/src/components/views/messages/MBeaconBody.tsx diff --git a/src/components/views/messages/MFileBody.tsx b/apps/web/src/components/views/messages/MFileBody.tsx similarity index 100% rename from src/components/views/messages/MFileBody.tsx rename to apps/web/src/components/views/messages/MFileBody.tsx diff --git a/src/components/views/messages/MImageBody.tsx b/apps/web/src/components/views/messages/MImageBody.tsx similarity index 100% rename from src/components/views/messages/MImageBody.tsx rename to apps/web/src/components/views/messages/MImageBody.tsx diff --git a/src/components/views/messages/MImageReplyBody.tsx b/apps/web/src/components/views/messages/MImageReplyBody.tsx similarity index 100% rename from src/components/views/messages/MImageReplyBody.tsx rename to apps/web/src/components/views/messages/MImageReplyBody.tsx diff --git a/src/components/views/messages/MJitsiWidgetEvent.tsx b/apps/web/src/components/views/messages/MJitsiWidgetEvent.tsx similarity index 100% rename from src/components/views/messages/MJitsiWidgetEvent.tsx rename to apps/web/src/components/views/messages/MJitsiWidgetEvent.tsx diff --git a/src/components/views/messages/MKeyVerificationRequest.tsx b/apps/web/src/components/views/messages/MKeyVerificationRequest.tsx similarity index 100% rename from src/components/views/messages/MKeyVerificationRequest.tsx rename to apps/web/src/components/views/messages/MKeyVerificationRequest.tsx diff --git a/src/components/views/messages/MLocationBody.tsx b/apps/web/src/components/views/messages/MLocationBody.tsx similarity index 100% rename from src/components/views/messages/MLocationBody.tsx rename to apps/web/src/components/views/messages/MLocationBody.tsx diff --git a/src/components/views/messages/MPollBody.tsx b/apps/web/src/components/views/messages/MPollBody.tsx similarity index 100% rename from src/components/views/messages/MPollBody.tsx rename to apps/web/src/components/views/messages/MPollBody.tsx diff --git a/src/components/views/messages/MStickerBody.tsx b/apps/web/src/components/views/messages/MStickerBody.tsx similarity index 100% rename from src/components/views/messages/MStickerBody.tsx rename to apps/web/src/components/views/messages/MStickerBody.tsx diff --git a/src/components/views/messages/MVideoBody.tsx b/apps/web/src/components/views/messages/MVideoBody.tsx similarity index 100% rename from src/components/views/messages/MVideoBody.tsx rename to apps/web/src/components/views/messages/MVideoBody.tsx diff --git a/src/components/views/messages/MVoiceMessageBody.tsx b/apps/web/src/components/views/messages/MVoiceMessageBody.tsx similarity index 100% rename from src/components/views/messages/MVoiceMessageBody.tsx rename to apps/web/src/components/views/messages/MVoiceMessageBody.tsx diff --git a/src/components/views/messages/MVoiceOrAudioBody.tsx b/apps/web/src/components/views/messages/MVoiceOrAudioBody.tsx similarity index 100% rename from src/components/views/messages/MVoiceOrAudioBody.tsx rename to apps/web/src/components/views/messages/MVoiceOrAudioBody.tsx diff --git a/src/components/views/messages/MessageActionBar.tsx b/apps/web/src/components/views/messages/MessageActionBar.tsx similarity index 100% rename from src/components/views/messages/MessageActionBar.tsx rename to apps/web/src/components/views/messages/MessageActionBar.tsx diff --git a/src/components/views/messages/MessageEvent.tsx b/apps/web/src/components/views/messages/MessageEvent.tsx similarity index 100% rename from src/components/views/messages/MessageEvent.tsx rename to apps/web/src/components/views/messages/MessageEvent.tsx diff --git a/src/components/views/messages/MjolnirBody.tsx b/apps/web/src/components/views/messages/MjolnirBody.tsx similarity index 100% rename from src/components/views/messages/MjolnirBody.tsx rename to apps/web/src/components/views/messages/MjolnirBody.tsx diff --git a/src/components/views/messages/PinnedMessageBadge.tsx b/apps/web/src/components/views/messages/PinnedMessageBadge.tsx similarity index 100% rename from src/components/views/messages/PinnedMessageBadge.tsx rename to apps/web/src/components/views/messages/PinnedMessageBadge.tsx diff --git a/src/components/views/messages/ReactionsRow.tsx b/apps/web/src/components/views/messages/ReactionsRow.tsx similarity index 82% rename from src/components/views/messages/ReactionsRow.tsx rename to apps/web/src/components/views/messages/ReactionsRow.tsx index 4ac68ede3e..ef21ad9e82 100644 --- a/src/components/views/messages/ReactionsRow.tsx +++ b/apps/web/src/components/views/messages/ReactionsRow.tsx @@ -6,22 +6,24 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import React, { type JSX, type SyntheticEvent } from "react"; +import React, { useEffect, type JSX, type SyntheticEvent } from "react"; import classNames from "classnames"; import { type MatrixEvent, MatrixEventEvent, type Relations, RelationsEvent } from "matrix-js-sdk/src/matrix"; import { uniqBy } from "lodash"; import { UnstableValue } from "matrix-js-sdk/src/NamespacedValue"; import { ReactionAddIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; +import { ReactionsRowButtonView, useCreateAutoDisposedViewModel } from "@element-hq/web-shared-components"; import { _t } from "../../../languageHandler"; import { isContentActionable } from "../../../utils/EventUtils"; import { ContextMenuTooltipButton } from "../../../accessibility/context_menu/ContextMenuTooltipButton"; import ContextMenu, { aboveLeftOf, useContextMenu } from "../../structures/ContextMenu"; import ReactionPicker from "../emojipicker/ReactionPicker"; -import ReactionsRowButton from "./ReactionsRowButton"; import RoomContext from "../../../contexts/RoomContext"; import AccessibleButton from "../elements/AccessibleButton"; import SettingsStore from "../../../settings/SettingsStore"; +import { ReactionsRowButtonViewModel } from "../../../viewmodels/message-body/ReactionsRowButtonViewModel"; +import { useMatrixClientContext } from "../../../contexts/MatrixClientContext"; // The maximum number of reactions to initially show on a message. const MAX_ITEMS_WHEN_LIMITED = 8; @@ -64,6 +66,52 @@ const ReactButton: React.FC = ({ mxEvent, reactions }) => { ); }; +interface ReactionsRowButtonItemProps { + mxEvent: MatrixEvent; + content: string; + count: number; + reactionEvents: MatrixEvent[]; + myReactionEvent?: MatrixEvent; + disabled?: boolean; + customReactionImagesEnabled?: boolean; +} + +const ReactionsRowButtonItem: React.FC = (props) => { + const client = useMatrixClientContext(); + + const vm = useCreateAutoDisposedViewModel( + () => + new ReactionsRowButtonViewModel({ + client, + mxEvent: props.mxEvent, + content: props.content, + count: props.count, + reactionEvents: props.reactionEvents, + myReactionEvent: props.myReactionEvent, + disabled: props.disabled, + customReactionImagesEnabled: props.customReactionImagesEnabled, + }), + ); + + useEffect(() => { + vm.setReactionData(props.content, props.reactionEvents, props.customReactionImagesEnabled); + }, [props.content, props.reactionEvents, props.customReactionImagesEnabled, vm]); + + useEffect(() => { + vm.setCount(props.count); + }, [props.count, vm]); + + useEffect(() => { + vm.setMyReactionEvent(props.myReactionEvent); + }, [props.myReactionEvent, vm]); + + useEffect(() => { + vm.setDisabled(props.disabled); + }, [props.disabled, vm]); + + return ; +}; + interface IProps { // The event we're displaying reactions for mxEvent: MatrixEvent; @@ -186,7 +234,7 @@ export default class ReactionsRow extends React.PureComponent { return mxEvent.getRelation()?.key === content; }); return ( - right.getTs() - left.getTs(); diff --git a/src/components/views/polls/pollHistory/PollHistoryList.tsx b/apps/web/src/components/views/polls/pollHistory/PollHistoryList.tsx similarity index 100% rename from src/components/views/polls/pollHistory/PollHistoryList.tsx rename to apps/web/src/components/views/polls/pollHistory/PollHistoryList.tsx diff --git a/src/components/views/polls/pollHistory/PollListItem.tsx b/apps/web/src/components/views/polls/pollHistory/PollListItem.tsx similarity index 100% rename from src/components/views/polls/pollHistory/PollListItem.tsx rename to apps/web/src/components/views/polls/pollHistory/PollListItem.tsx diff --git a/src/components/views/polls/pollHistory/PollListItemEnded.tsx b/apps/web/src/components/views/polls/pollHistory/PollListItemEnded.tsx similarity index 100% rename from src/components/views/polls/pollHistory/PollListItemEnded.tsx rename to apps/web/src/components/views/polls/pollHistory/PollListItemEnded.tsx diff --git a/src/components/views/polls/pollHistory/fetchPastPolls.ts b/apps/web/src/components/views/polls/pollHistory/fetchPastPolls.ts similarity index 100% rename from src/components/views/polls/pollHistory/fetchPastPolls.ts rename to apps/web/src/components/views/polls/pollHistory/fetchPastPolls.ts diff --git a/src/components/views/polls/pollHistory/types.ts b/apps/web/src/components/views/polls/pollHistory/types.ts similarity index 100% rename from src/components/views/polls/pollHistory/types.ts rename to apps/web/src/components/views/polls/pollHistory/types.ts diff --git a/src/components/views/polls/pollHistory/usePollHistory.ts b/apps/web/src/components/views/polls/pollHistory/usePollHistory.ts similarity index 100% rename from src/components/views/polls/pollHistory/usePollHistory.ts rename to apps/web/src/components/views/polls/pollHistory/usePollHistory.ts diff --git a/src/components/views/right_panel/BaseCard.tsx b/apps/web/src/components/views/right_panel/BaseCard.tsx similarity index 96% rename from src/components/views/right_panel/BaseCard.tsx rename to apps/web/src/components/views/right_panel/BaseCard.tsx index b308e1d973..e8b466ff44 100644 --- a/src/components/views/right_panel/BaseCard.tsx +++ b/apps/web/src/components/views/right_panel/BaseCard.tsx @@ -28,9 +28,9 @@ interface IProps { ariaLabelledBy?: string; withoutScrollContainer?: boolean; closeLabel?: string; - onClose?(ev: MouseEvent): void; - onBack?(ev: MouseEvent): void; - onKeyDown?(ev: KeyboardEvent): void; + onClose?(this: void, ev: MouseEvent): void; + onBack?(this: void, ev: MouseEvent): void; + onKeyDown?(this: void, ev: KeyboardEvent): void; cardState?: any; ref?: Ref; // Ref for the 'close' button the card diff --git a/src/components/views/right_panel/EmptyState.tsx b/apps/web/src/components/views/right_panel/EmptyState.tsx similarity index 100% rename from src/components/views/right_panel/EmptyState.tsx rename to apps/web/src/components/views/right_panel/EmptyState.tsx diff --git a/src/components/views/right_panel/EncryptionInfo.tsx b/apps/web/src/components/views/right_panel/EncryptionInfo.tsx similarity index 100% rename from src/components/views/right_panel/EncryptionInfo.tsx rename to apps/web/src/components/views/right_panel/EncryptionInfo.tsx diff --git a/src/components/views/right_panel/EncryptionPanel.tsx b/apps/web/src/components/views/right_panel/EncryptionPanel.tsx similarity index 100% rename from src/components/views/right_panel/EncryptionPanel.tsx rename to apps/web/src/components/views/right_panel/EncryptionPanel.tsx diff --git a/src/components/views/right_panel/ExtensionsCard.tsx b/apps/web/src/components/views/right_panel/ExtensionsCard.tsx similarity index 99% rename from src/components/views/right_panel/ExtensionsCard.tsx rename to apps/web/src/components/views/right_panel/ExtensionsCard.tsx index 9f1d1d0e02..4ee41642e4 100644 --- a/src/components/views/right_panel/ExtensionsCard.tsx +++ b/apps/web/src/components/views/right_panel/ExtensionsCard.tsx @@ -35,7 +35,7 @@ import { WidgetContextMenu } from "../../../viewmodels/right-panel/WidgetContext interface Props { room: Room; - onClose(): void; + onClose(this: void): void; } interface IAppRowProps { diff --git a/src/components/views/right_panel/PinnedMessagesCard.tsx b/apps/web/src/components/views/right_panel/PinnedMessagesCard.tsx similarity index 99% rename from src/components/views/right_panel/PinnedMessagesCard.tsx rename to apps/web/src/components/views/right_panel/PinnedMessagesCard.tsx index daea698edd..611b485b78 100644 --- a/src/components/views/right_panel/PinnedMessagesCard.tsx +++ b/apps/web/src/components/views/right_panel/PinnedMessagesCard.tsx @@ -44,7 +44,7 @@ interface PinnedMessagesCardProps { /** * Callback for when the card is closed. */ - onClose(): void; + onClose(this: void): void; } export function PinnedMessagesCard({ room, onClose, permalinkCreator }: PinnedMessagesCardProps): JSX.Element { diff --git a/src/components/views/right_panel/RoomSummaryCardView.tsx b/apps/web/src/components/views/right_panel/RoomSummaryCardView.tsx similarity index 96% rename from src/components/views/right_panel/RoomSummaryCardView.tsx rename to apps/web/src/components/views/right_panel/RoomSummaryCardView.tsx index be316fdd14..460f7859d2 100644 --- a/src/components/views/right_panel/RoomSummaryCardView.tsx +++ b/apps/web/src/components/views/right_panel/RoomSummaryCardView.tsx @@ -46,10 +46,10 @@ import { _t } from "../../../languageHandler.tsx"; import RoomAvatar from "../avatars/RoomAvatar.tsx"; import { E2EStatus } from "../../../utils/ShieldUtils.ts"; import { type RoomPermalinkCreator } from "../../../utils/permalinks/Permalinks.ts"; -import RoomName from "../elements/RoomName.tsx"; import { Linkify, topicToHtml } from "../../../HtmlUtils.tsx"; import { useRoomSummaryCardViewModel } from "../../viewmodels/right_panel/RoomSummaryCardViewModel.tsx"; import { useRoomTopicViewModel } from "../../viewmodels/right_panel/RoomSummaryCardTopicViewModel.tsx"; +import { useRoomName } from "../../../hooks/useRoomName.ts"; interface IProps { room: Room; @@ -131,6 +131,8 @@ const RoomSummaryCardView: React.FC = ({ searchTerm = "", }) => { const vm = useRoomSummaryCardViewModel(room, permalinkCreator, onSearchCancel); + // XXX: this name should be part of the view model + const name = useRoomName(room); // The search field is controlled and onSearchChange is debounced in RoomView, // so we need to set the value of the input right away @@ -142,19 +144,15 @@ const RoomSummaryCardView: React.FC = ({ const roomInfo = (
    - - {(name) => ( - - {name} - - )} - + + {name} + ; } diff --git a/src/components/views/right_panel/VerificationPanel.tsx b/apps/web/src/components/views/right_panel/VerificationPanel.tsx similarity index 100% rename from src/components/views/right_panel/VerificationPanel.tsx rename to apps/web/src/components/views/right_panel/VerificationPanel.tsx diff --git a/src/components/views/right_panel/WidgetCard.tsx b/apps/web/src/components/views/right_panel/WidgetCard.tsx similarity index 99% rename from src/components/views/right_panel/WidgetCard.tsx rename to apps/web/src/components/views/right_panel/WidgetCard.tsx index 7ae9ae1b21..30d9f38b22 100644 --- a/src/components/views/right_panel/WidgetCard.tsx +++ b/apps/web/src/components/views/right_panel/WidgetCard.tsx @@ -23,7 +23,7 @@ import { WidgetContextMenu } from "../../../viewmodels/right-panel/WidgetContext interface IProps { room: Room; widgetId: string; - onClose(): void; + onClose(this: void): void; } const WidgetCard: React.FC = ({ room, widgetId, onClose }) => { diff --git a/src/components/views/right_panel/context.ts b/apps/web/src/components/views/right_panel/context.ts similarity index 100% rename from src/components/views/right_panel/context.ts rename to apps/web/src/components/views/right_panel/context.ts diff --git a/src/components/views/right_panel/types.ts b/apps/web/src/components/views/right_panel/types.ts similarity index 100% rename from src/components/views/right_panel/types.ts rename to apps/web/src/components/views/right_panel/types.ts diff --git a/src/components/views/right_panel/user_info/UserInfoAdminToolsContainer.tsx b/apps/web/src/components/views/right_panel/user_info/UserInfoAdminToolsContainer.tsx similarity index 98% rename from src/components/views/right_panel/user_info/UserInfoAdminToolsContainer.tsx rename to apps/web/src/components/views/right_panel/user_info/UserInfoAdminToolsContainer.tsx index 1f3eeb706d..37b7a72b08 100644 --- a/src/components/views/right_panel/user_info/UserInfoAdminToolsContainer.tsx +++ b/apps/web/src/components/views/right_panel/user_info/UserInfoAdminToolsContainer.tsx @@ -33,8 +33,8 @@ const Container: React.FC<{ interface IBaseProps { member: RoomMember; isUpdating: boolean; - startUpdating(): void; - stopUpdating(): void; + startUpdating(this: void): void; + stopUpdating(this: void): void; } export const RoomKickButton = ({ diff --git a/src/components/views/right_panel/user_info/UserInfoBasicOptionsView.tsx b/apps/web/src/components/views/right_panel/user_info/UserInfoBasicOptionsView.tsx similarity index 100% rename from src/components/views/right_panel/user_info/UserInfoBasicOptionsView.tsx rename to apps/web/src/components/views/right_panel/user_info/UserInfoBasicOptionsView.tsx diff --git a/src/components/views/right_panel/user_info/UserInfoBasicView.tsx b/apps/web/src/components/views/right_panel/user_info/UserInfoBasicView.tsx similarity index 100% rename from src/components/views/right_panel/user_info/UserInfoBasicView.tsx rename to apps/web/src/components/views/right_panel/user_info/UserInfoBasicView.tsx diff --git a/src/components/views/right_panel/user_info/UserInfoHeaderVerificationView.tsx b/apps/web/src/components/views/right_panel/user_info/UserInfoHeaderVerificationView.tsx similarity index 100% rename from src/components/views/right_panel/user_info/UserInfoHeaderVerificationView.tsx rename to apps/web/src/components/views/right_panel/user_info/UserInfoHeaderVerificationView.tsx diff --git a/src/components/views/right_panel/user_info/UserInfoHeaderView.tsx b/apps/web/src/components/views/right_panel/user_info/UserInfoHeaderView.tsx similarity index 100% rename from src/components/views/right_panel/user_info/UserInfoHeaderView.tsx rename to apps/web/src/components/views/right_panel/user_info/UserInfoHeaderView.tsx diff --git a/src/components/views/right_panel/user_info/UserInfoIgnoreButtonView.tsx b/apps/web/src/components/views/right_panel/user_info/UserInfoIgnoreButtonView.tsx similarity index 100% rename from src/components/views/right_panel/user_info/UserInfoIgnoreButtonView.tsx rename to apps/web/src/components/views/right_panel/user_info/UserInfoIgnoreButtonView.tsx diff --git a/src/components/views/right_panel/user_info/UserInfoPowerLevels.tsx b/apps/web/src/components/views/right_panel/user_info/UserInfoPowerLevels.tsx similarity index 100% rename from src/components/views/right_panel/user_info/UserInfoPowerLevels.tsx rename to apps/web/src/components/views/right_panel/user_info/UserInfoPowerLevels.tsx diff --git a/src/components/views/room_settings/AliasSettings.tsx b/apps/web/src/components/views/room_settings/AliasSettings.tsx similarity index 100% rename from src/components/views/room_settings/AliasSettings.tsx rename to apps/web/src/components/views/room_settings/AliasSettings.tsx diff --git a/src/components/views/room_settings/RoomProfileSettings.tsx b/apps/web/src/components/views/room_settings/RoomProfileSettings.tsx similarity index 100% rename from src/components/views/room_settings/RoomProfileSettings.tsx rename to apps/web/src/components/views/room_settings/RoomProfileSettings.tsx diff --git a/src/components/views/room_settings/RoomPublishSetting.tsx b/apps/web/src/components/views/room_settings/RoomPublishSetting.tsx similarity index 100% rename from src/components/views/room_settings/RoomPublishSetting.tsx rename to apps/web/src/components/views/room_settings/RoomPublishSetting.tsx diff --git a/src/components/views/room_settings/UrlPreviewSettings.tsx b/apps/web/src/components/views/room_settings/UrlPreviewSettings.tsx similarity index 100% rename from src/components/views/room_settings/UrlPreviewSettings.tsx rename to apps/web/src/components/views/room_settings/UrlPreviewSettings.tsx diff --git a/src/components/views/rooms/AppsDrawer.tsx b/apps/web/src/components/views/rooms/AppsDrawer.tsx similarity index 100% rename from src/components/views/rooms/AppsDrawer.tsx rename to apps/web/src/components/views/rooms/AppsDrawer.tsx diff --git a/src/components/views/rooms/Autocomplete.tsx b/apps/web/src/components/views/rooms/Autocomplete.tsx similarity index 100% rename from src/components/views/rooms/Autocomplete.tsx rename to apps/web/src/components/views/rooms/Autocomplete.tsx diff --git a/src/components/views/rooms/AuxPanel.tsx b/apps/web/src/components/views/rooms/AuxPanel.tsx similarity index 100% rename from src/components/views/rooms/AuxPanel.tsx rename to apps/web/src/components/views/rooms/AuxPanel.tsx diff --git a/src/components/views/rooms/BasicMessageComposer.tsx b/apps/web/src/components/views/rooms/BasicMessageComposer.tsx similarity index 100% rename from src/components/views/rooms/BasicMessageComposer.tsx rename to apps/web/src/components/views/rooms/BasicMessageComposer.tsx diff --git a/src/components/views/rooms/CollapsibleButton.tsx b/apps/web/src/components/views/rooms/CollapsibleButton.tsx similarity index 100% rename from src/components/views/rooms/CollapsibleButton.tsx rename to apps/web/src/components/views/rooms/CollapsibleButton.tsx diff --git a/src/components/views/rooms/E2EIcon.tsx b/apps/web/src/components/views/rooms/E2EIcon.tsx similarity index 100% rename from src/components/views/rooms/E2EIcon.tsx rename to apps/web/src/components/views/rooms/E2EIcon.tsx diff --git a/src/components/views/rooms/EditMessageComposer.tsx b/apps/web/src/components/views/rooms/EditMessageComposer.tsx similarity index 100% rename from src/components/views/rooms/EditMessageComposer.tsx rename to apps/web/src/components/views/rooms/EditMessageComposer.tsx diff --git a/src/components/views/rooms/EmojiButton.tsx b/apps/web/src/components/views/rooms/EmojiButton.tsx similarity index 100% rename from src/components/views/rooms/EmojiButton.tsx rename to apps/web/src/components/views/rooms/EmojiButton.tsx diff --git a/src/components/views/rooms/EventPreview.tsx b/apps/web/src/components/views/rooms/EventPreview.tsx similarity index 100% rename from src/components/views/rooms/EventPreview.tsx rename to apps/web/src/components/views/rooms/EventPreview.tsx diff --git a/src/components/views/rooms/EventTile.tsx b/apps/web/src/components/views/rooms/EventTile.tsx similarity index 97% rename from src/components/views/rooms/EventTile.tsx rename to apps/web/src/components/views/rooms/EventTile.tsx index 6d1ed70a06..47741d3abb 100644 --- a/src/components/views/rooms/EventTile.tsx +++ b/apps/web/src/components/views/rooms/EventTile.tsx @@ -36,7 +36,11 @@ import { import { Tooltip } from "@vector-im/compound-web"; import { uniqueId } from "lodash"; import { CircleIcon, CheckCircleIcon, ThreadsIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; -import { useCreateAutoDisposedViewModel, DecryptionFailureBodyView } from "@element-hq/web-shared-components"; +import { + useCreateAutoDisposedViewModel, + DecryptionFailureBodyView, + MessageTimestampView, +} from "@element-hq/web-shared-components"; import { LocalDeviceVerificationStateContext } from "../../../contexts/LocalDeviceVerificationStateContext"; import ReplyChain from "../elements/ReplyChain"; @@ -58,7 +62,6 @@ import { Action } from "../../../dispatcher/actions"; import PlatformPeg from "../../../PlatformPeg"; import MemberAvatar from "../avatars/MemberAvatar"; import SenderProfile from "../messages/SenderProfile"; -import MessageTimestamp from "../messages/MessageTimestamp"; import { type IReadReceiptPosition } from "./ReadReceiptMarker"; import MessageActionBar from "../messages/MessageActionBar"; import ReactionsRow from "../messages/ReactionsRow"; @@ -81,6 +84,7 @@ import { isLocalRoom } from "../../../utils/localRoom/isLocalRoom"; import { UnreadNotificationBadge } from "./NotificationBadge/UnreadNotificationBadge"; import { EventTileThreadToolbar } from "./EventTile/EventTileThreadToolbar"; import { getLateEventInfo } from "../../structures/grouper/LateEventGrouper"; +import { Icon as LateIcon } from "../../../../res/img/sensor.svg"; import PinningUtils from "../../../utils/PinningUtils"; import { PinnedMessageBadge } from "../messages/PinnedMessageBadge"; import { EventPreview } from "./EventPreview"; @@ -88,6 +92,10 @@ import { ElementCallEventType } from "../../../call-types"; import { DecryptionFailureBodyViewModel } from "../../../viewmodels/message-body/DecryptionFailureBodyViewModel"; import { E2eMessageSharedIcon } from "./EventTile/E2eMessageSharedIcon.tsx"; import { E2ePadlock, E2ePadlockIcon } from "./EventTile/E2ePadlock.tsx"; +import { + MessageTimestampViewModel, + type MessageTimestampViewModelProps, +} from "../../../viewmodels/message-body/MessageTimestampViewModel.ts"; export type GetRelationsForEvent = ( eventId: string, @@ -1157,15 +1165,15 @@ export class UnwrappedEventTile extends React.Component ts = this.props.mxEvent.getTs(); } - const messageTimestampProps = { + const messageTimestampProps: MessageTimestampViewModelProps = { showRelative: this.context.timelineRenderingType === TimelineRenderingType.ThreadsList, showTwelveHour: this.props.isTwelveHour, ts, receivedTs: getLateEventInfo(this.props.mxEvent)?.received_ts, }; - const messageTimestamp = ; + const messageTimestamp = ; const linkedMessageTimestamp = ( - ; } + +/** + * Wraps MessageTimestampView with a view model synced to the provided props. + * This wrapper can be removed after EventTile has been changed to a function component. + */ +function MessageTimestampWrapper(props: MessageTimestampViewModelProps): JSX.Element { + const vm = useCreateAutoDisposedViewModel(() => new MessageTimestampViewModel(props)); + useEffect(() => { + vm.setTimestamp(props.ts); + vm.setReceivedTimestamp(props.receivedTs); + vm.setDisplayOptions({ + showTwelveHour: props.showTwelveHour, + showRelative: props.showRelative, + }); + vm.setHref(props.href); + vm.setHandlers({ onClick: props.onClick, onContextMenu: props.onContextMenu }); + }, [vm, props]); + + return ( + <> + {/* Render icon as described in, https://github.com/matrix-org/matrix-react-sdk/pull/11760 */} + {props.receivedTs ? ( + + ) : undefined} + + + ); +} diff --git a/src/components/views/rooms/EventTile/E2eMessageSharedIcon.tsx b/apps/web/src/components/views/rooms/EventTile/E2eMessageSharedIcon.tsx similarity index 100% rename from src/components/views/rooms/EventTile/E2eMessageSharedIcon.tsx rename to apps/web/src/components/views/rooms/EventTile/E2eMessageSharedIcon.tsx diff --git a/src/components/views/rooms/EventTile/E2ePadlock.tsx b/apps/web/src/components/views/rooms/EventTile/E2ePadlock.tsx similarity index 100% rename from src/components/views/rooms/EventTile/E2ePadlock.tsx rename to apps/web/src/components/views/rooms/EventTile/E2ePadlock.tsx diff --git a/src/components/views/rooms/EventTile/EventTileThreadToolbar.tsx b/apps/web/src/components/views/rooms/EventTile/EventTileThreadToolbar.tsx similarity index 100% rename from src/components/views/rooms/EventTile/EventTileThreadToolbar.tsx rename to apps/web/src/components/views/rooms/EventTile/EventTileThreadToolbar.tsx diff --git a/src/components/views/rooms/ExtraTile.tsx b/apps/web/src/components/views/rooms/ExtraTile.tsx similarity index 100% rename from src/components/views/rooms/ExtraTile.tsx rename to apps/web/src/components/views/rooms/ExtraTile.tsx diff --git a/src/components/views/rooms/HistoryTile.tsx b/apps/web/src/components/views/rooms/HistoryTile.tsx similarity index 100% rename from src/components/views/rooms/HistoryTile.tsx rename to apps/web/src/components/views/rooms/HistoryTile.tsx diff --git a/src/components/views/rooms/JumpToBottomButton.tsx b/apps/web/src/components/views/rooms/JumpToBottomButton.tsx similarity index 100% rename from src/components/views/rooms/JumpToBottomButton.tsx rename to apps/web/src/components/views/rooms/JumpToBottomButton.tsx diff --git a/src/components/views/rooms/LegacyRoomList.tsx b/apps/web/src/components/views/rooms/LegacyRoomList.tsx similarity index 100% rename from src/components/views/rooms/LegacyRoomList.tsx rename to apps/web/src/components/views/rooms/LegacyRoomList.tsx diff --git a/src/components/views/rooms/LegacyRoomListHeader.tsx b/apps/web/src/components/views/rooms/LegacyRoomListHeader.tsx similarity index 99% rename from src/components/views/rooms/LegacyRoomListHeader.tsx rename to apps/web/src/components/views/rooms/LegacyRoomListHeader.tsx index bf389c4b0c..6c9c15a778 100644 --- a/src/components/views/rooms/LegacyRoomListHeader.tsx +++ b/apps/web/src/components/views/rooms/LegacyRoomListHeader.tsx @@ -114,7 +114,7 @@ const usePendingActions = (): Map> => { }; interface IProps { - onVisibilityChange?(): void; + onVisibilityChange?(this: void): void; } const LegacyRoomListHeader: React.FC = ({ onVisibilityChange }) => { diff --git a/src/components/views/rooms/LinkPreviewGroup.tsx b/apps/web/src/components/views/rooms/LinkPreviewGroup.tsx similarity index 97% rename from src/components/views/rooms/LinkPreviewGroup.tsx rename to apps/web/src/components/views/rooms/LinkPreviewGroup.tsx index 471220bfeb..880bb3a24b 100644 --- a/src/components/views/rooms/LinkPreviewGroup.tsx +++ b/apps/web/src/components/views/rooms/LinkPreviewGroup.tsx @@ -24,7 +24,7 @@ const INITIAL_NUM_PREVIEWS = 2; interface IProps { links: string[]; // the URLs to be previewed mxEvent: MatrixEvent; // the Event associated with the preview - onCancelClick(): void; // called when the preview's cancel ('hide') button is clicked + onCancelClick(this: void): void; // called when the preview's cancel ('hide') button is clicked } const LinkPreviewGroup: React.FC = ({ links, mxEvent, onCancelClick }) => { diff --git a/src/components/views/rooms/LinkPreviewWidget.tsx b/apps/web/src/components/views/rooms/LinkPreviewWidget.tsx similarity index 100% rename from src/components/views/rooms/LinkPreviewWidget.tsx rename to apps/web/src/components/views/rooms/LinkPreviewWidget.tsx diff --git a/src/components/views/rooms/LiveContentSummary.tsx b/apps/web/src/components/views/rooms/LiveContentSummary.tsx similarity index 100% rename from src/components/views/rooms/LiveContentSummary.tsx rename to apps/web/src/components/views/rooms/LiveContentSummary.tsx diff --git a/src/components/views/rooms/MemberList/MemberListHeaderView.tsx b/apps/web/src/components/views/rooms/MemberList/MemberListHeaderView.tsx similarity index 100% rename from src/components/views/rooms/MemberList/MemberListHeaderView.tsx rename to apps/web/src/components/views/rooms/MemberList/MemberListHeaderView.tsx diff --git a/src/components/views/rooms/MemberList/MemberListView.tsx b/apps/web/src/components/views/rooms/MemberList/MemberListView.tsx similarity index 100% rename from src/components/views/rooms/MemberList/MemberListView.tsx rename to apps/web/src/components/views/rooms/MemberList/MemberListView.tsx diff --git a/src/components/views/rooms/MemberList/tiles/RoomMemberTileView.tsx b/apps/web/src/components/views/rooms/MemberList/tiles/RoomMemberTileView.tsx similarity index 100% rename from src/components/views/rooms/MemberList/tiles/RoomMemberTileView.tsx rename to apps/web/src/components/views/rooms/MemberList/tiles/RoomMemberTileView.tsx diff --git a/src/components/views/rooms/MemberList/tiles/ThreePidInviteTileView.tsx b/apps/web/src/components/views/rooms/MemberList/tiles/ThreePidInviteTileView.tsx similarity index 100% rename from src/components/views/rooms/MemberList/tiles/ThreePidInviteTileView.tsx rename to apps/web/src/components/views/rooms/MemberList/tiles/ThreePidInviteTileView.tsx diff --git a/src/components/views/rooms/MemberList/tiles/common/E2EIconView.tsx b/apps/web/src/components/views/rooms/MemberList/tiles/common/E2EIconView.tsx similarity index 100% rename from src/components/views/rooms/MemberList/tiles/common/E2EIconView.tsx rename to apps/web/src/components/views/rooms/MemberList/tiles/common/E2EIconView.tsx diff --git a/src/components/views/rooms/MemberList/tiles/common/InvitedIconView.tsx b/apps/web/src/components/views/rooms/MemberList/tiles/common/InvitedIconView.tsx similarity index 100% rename from src/components/views/rooms/MemberList/tiles/common/InvitedIconView.tsx rename to apps/web/src/components/views/rooms/MemberList/tiles/common/InvitedIconView.tsx diff --git a/src/components/views/rooms/MemberList/tiles/common/MemberTileView.tsx b/apps/web/src/components/views/rooms/MemberList/tiles/common/MemberTileView.tsx similarity index 100% rename from src/components/views/rooms/MemberList/tiles/common/MemberTileView.tsx rename to apps/web/src/components/views/rooms/MemberList/tiles/common/MemberTileView.tsx diff --git a/src/components/views/rooms/MemberList/tiles/common/PresenceIconView.tsx b/apps/web/src/components/views/rooms/MemberList/tiles/common/PresenceIconView.tsx similarity index 100% rename from src/components/views/rooms/MemberList/tiles/common/PresenceIconView.tsx rename to apps/web/src/components/views/rooms/MemberList/tiles/common/PresenceIconView.tsx diff --git a/src/components/views/rooms/MessageComposer.tsx b/apps/web/src/components/views/rooms/MessageComposer.tsx similarity index 100% rename from src/components/views/rooms/MessageComposer.tsx rename to apps/web/src/components/views/rooms/MessageComposer.tsx diff --git a/src/components/views/rooms/MessageComposerButtons.tsx b/apps/web/src/components/views/rooms/MessageComposerButtons.tsx similarity index 100% rename from src/components/views/rooms/MessageComposerButtons.tsx rename to apps/web/src/components/views/rooms/MessageComposerButtons.tsx diff --git a/src/components/views/rooms/MessageComposerFormatBar.tsx b/apps/web/src/components/views/rooms/MessageComposerFormatBar.tsx similarity index 100% rename from src/components/views/rooms/MessageComposerFormatBar.tsx rename to apps/web/src/components/views/rooms/MessageComposerFormatBar.tsx diff --git a/src/components/views/rooms/NewRoomIntro.tsx b/apps/web/src/components/views/rooms/NewRoomIntro.tsx similarity index 100% rename from src/components/views/rooms/NewRoomIntro.tsx rename to apps/web/src/components/views/rooms/NewRoomIntro.tsx diff --git a/src/components/views/rooms/NotificationBadge.tsx b/apps/web/src/components/views/rooms/NotificationBadge.tsx similarity index 100% rename from src/components/views/rooms/NotificationBadge.tsx rename to apps/web/src/components/views/rooms/NotificationBadge.tsx diff --git a/src/components/views/rooms/NotificationBadge/StatelessNotificationBadge.tsx b/apps/web/src/components/views/rooms/NotificationBadge/StatelessNotificationBadge.tsx similarity index 98% rename from src/components/views/rooms/NotificationBadge/StatelessNotificationBadge.tsx rename to apps/web/src/components/views/rooms/NotificationBadge/StatelessNotificationBadge.tsx index c217f71258..8db391f014 100644 --- a/src/components/views/rooms/NotificationBadge/StatelessNotificationBadge.tsx +++ b/apps/web/src/components/views/rooms/NotificationBadge/StatelessNotificationBadge.tsx @@ -36,7 +36,7 @@ interface ClickableProps extends Props { /** * If specified will return an AccessibleButton instead of a div. */ - onClick(ev: ButtonEvent): void; + onClick(this: void, ev: ButtonEvent): void; tabIndex?: number; } diff --git a/src/components/views/rooms/NotificationBadge/UnreadNotificationBadge.tsx b/apps/web/src/components/views/rooms/NotificationBadge/UnreadNotificationBadge.tsx similarity index 100% rename from src/components/views/rooms/NotificationBadge/UnreadNotificationBadge.tsx rename to apps/web/src/components/views/rooms/NotificationBadge/UnreadNotificationBadge.tsx diff --git a/src/components/views/rooms/NotificationDecoration.tsx b/apps/web/src/components/views/rooms/NotificationDecoration.tsx similarity index 100% rename from src/components/views/rooms/NotificationDecoration.tsx rename to apps/web/src/components/views/rooms/NotificationDecoration.tsx diff --git a/src/components/views/rooms/OverflowTileView.tsx b/apps/web/src/components/views/rooms/OverflowTileView.tsx similarity index 97% rename from src/components/views/rooms/OverflowTileView.tsx rename to apps/web/src/components/views/rooms/OverflowTileView.tsx index d082821dee..d1611468a2 100644 --- a/src/components/views/rooms/OverflowTileView.tsx +++ b/apps/web/src/components/views/rooms/OverflowTileView.tsx @@ -14,7 +14,7 @@ import AccessibleButton from "../elements/AccessibleButton"; interface Props { // The number of remaining items remaining: number; - onClick(): void; + onClick(this: void): void; } /** diff --git a/src/components/views/rooms/PinnedEventTile.tsx b/apps/web/src/components/views/rooms/PinnedEventTile.tsx similarity index 100% rename from src/components/views/rooms/PinnedEventTile.tsx rename to apps/web/src/components/views/rooms/PinnedEventTile.tsx diff --git a/src/components/views/rooms/PinnedMessageBanner.tsx b/apps/web/src/components/views/rooms/PinnedMessageBanner.tsx similarity index 100% rename from src/components/views/rooms/PinnedMessageBanner.tsx rename to apps/web/src/components/views/rooms/PinnedMessageBanner.tsx diff --git a/src/components/views/rooms/PresenceLabel.tsx b/apps/web/src/components/views/rooms/PresenceLabel.tsx similarity index 100% rename from src/components/views/rooms/PresenceLabel.tsx rename to apps/web/src/components/views/rooms/PresenceLabel.tsx diff --git a/src/components/views/rooms/ReadReceiptGroup.tsx b/apps/web/src/components/views/rooms/ReadReceiptGroup.tsx similarity index 100% rename from src/components/views/rooms/ReadReceiptGroup.tsx rename to apps/web/src/components/views/rooms/ReadReceiptGroup.tsx diff --git a/src/components/views/rooms/ReadReceiptMarker.tsx b/apps/web/src/components/views/rooms/ReadReceiptMarker.tsx similarity index 100% rename from src/components/views/rooms/ReadReceiptMarker.tsx rename to apps/web/src/components/views/rooms/ReadReceiptMarker.tsx diff --git a/src/components/views/rooms/ReplyPreview.tsx b/apps/web/src/components/views/rooms/ReplyPreview.tsx similarity index 100% rename from src/components/views/rooms/ReplyPreview.tsx rename to apps/web/src/components/views/rooms/ReplyPreview.tsx diff --git a/src/components/views/rooms/ReplyTile.tsx b/apps/web/src/components/views/rooms/ReplyTile.tsx similarity index 100% rename from src/components/views/rooms/ReplyTile.tsx rename to apps/web/src/components/views/rooms/ReplyTile.tsx diff --git a/src/components/views/rooms/RoomBreadcrumbs.tsx b/apps/web/src/components/views/rooms/RoomBreadcrumbs.tsx similarity index 100% rename from src/components/views/rooms/RoomBreadcrumbs.tsx rename to apps/web/src/components/views/rooms/RoomBreadcrumbs.tsx diff --git a/src/components/views/rooms/RoomContextDetails.tsx b/apps/web/src/components/views/rooms/RoomContextDetails.tsx similarity index 100% rename from src/components/views/rooms/RoomContextDetails.tsx rename to apps/web/src/components/views/rooms/RoomContextDetails.tsx diff --git a/src/components/views/rooms/RoomHeader/CallGuestLinkButton.tsx b/apps/web/src/components/views/rooms/RoomHeader/CallGuestLinkButton.tsx similarity index 99% rename from src/components/views/rooms/RoomHeader/CallGuestLinkButton.tsx rename to apps/web/src/components/views/rooms/RoomHeader/CallGuestLinkButton.tsx index 16ef5c2234..101a1afdf9 100644 --- a/src/components/views/rooms/RoomHeader/CallGuestLinkButton.tsx +++ b/apps/web/src/components/views/rooms/RoomHeader/CallGuestLinkButton.tsx @@ -96,7 +96,7 @@ export const CallGuestLinkButton: React.FC<{ room: Room }> = ({ room }) => { * @param onFinished Callback that is getting called if the dialog wants to close. */ export const JoinRuleDialog: React.FC<{ - onFinished(): void; + onFinished(this: void): void; room: Room; canInvite: boolean; }> = ({ onFinished, room, canInvite }) => { diff --git a/src/components/views/rooms/RoomHeader/RoomHeader.tsx b/apps/web/src/components/views/rooms/RoomHeader/RoomHeader.tsx similarity index 100% rename from src/components/views/rooms/RoomHeader/RoomHeader.tsx rename to apps/web/src/components/views/rooms/RoomHeader/RoomHeader.tsx diff --git a/src/components/views/rooms/RoomHeader/VideoRoomChatButton.tsx b/apps/web/src/components/views/rooms/RoomHeader/VideoRoomChatButton.tsx similarity index 100% rename from src/components/views/rooms/RoomHeader/VideoRoomChatButton.tsx rename to apps/web/src/components/views/rooms/RoomHeader/VideoRoomChatButton.tsx diff --git a/src/components/views/rooms/RoomHeader/toggle/ToggleableIcon.tsx b/apps/web/src/components/views/rooms/RoomHeader/toggle/ToggleableIcon.tsx similarity index 100% rename from src/components/views/rooms/RoomHeader/toggle/ToggleableIcon.tsx rename to apps/web/src/components/views/rooms/RoomHeader/toggle/ToggleableIcon.tsx diff --git a/src/components/views/rooms/RoomHeader/toggle/useToggled.tsx b/apps/web/src/components/views/rooms/RoomHeader/toggle/useToggled.tsx similarity index 100% rename from src/components/views/rooms/RoomHeader/toggle/useToggled.tsx rename to apps/web/src/components/views/rooms/RoomHeader/toggle/useToggled.tsx diff --git a/src/components/views/rooms/RoomInfoLine.tsx b/apps/web/src/components/views/rooms/RoomInfoLine.tsx similarity index 100% rename from src/components/views/rooms/RoomInfoLine.tsx rename to apps/web/src/components/views/rooms/RoomInfoLine.tsx diff --git a/src/components/views/rooms/RoomKnocksBar.tsx b/apps/web/src/components/views/rooms/RoomKnocksBar.tsx similarity index 100% rename from src/components/views/rooms/RoomKnocksBar.tsx rename to apps/web/src/components/views/rooms/RoomKnocksBar.tsx diff --git a/src/components/views/rooms/RoomListPanel/RoomListPanel.tsx b/apps/web/src/components/views/rooms/RoomListPanel/RoomListPanel.tsx similarity index 100% rename from src/components/views/rooms/RoomListPanel/RoomListPanel.tsx rename to apps/web/src/components/views/rooms/RoomListPanel/RoomListPanel.tsx diff --git a/src/components/views/rooms/RoomListPanel/RoomListSearch.tsx b/apps/web/src/components/views/rooms/RoomListPanel/RoomListSearch.tsx similarity index 100% rename from src/components/views/rooms/RoomListPanel/RoomListSearch.tsx rename to apps/web/src/components/views/rooms/RoomListPanel/RoomListSearch.tsx diff --git a/src/components/views/rooms/RoomListPanel/RoomListView.tsx b/apps/web/src/components/views/rooms/RoomListPanel/RoomListView.tsx similarity index 100% rename from src/components/views/rooms/RoomListPanel/RoomListView.tsx rename to apps/web/src/components/views/rooms/RoomListPanel/RoomListView.tsx diff --git a/src/components/views/rooms/RoomListPanel/index.ts b/apps/web/src/components/views/rooms/RoomListPanel/index.ts similarity index 100% rename from src/components/views/rooms/RoomListPanel/index.ts rename to apps/web/src/components/views/rooms/RoomListPanel/index.ts diff --git a/src/components/views/rooms/RoomPreviewBar.tsx b/apps/web/src/components/views/rooms/RoomPreviewBar.tsx similarity index 100% rename from src/components/views/rooms/RoomPreviewBar.tsx rename to apps/web/src/components/views/rooms/RoomPreviewBar.tsx diff --git a/src/components/views/rooms/RoomPreviewCard.tsx b/apps/web/src/components/views/rooms/RoomPreviewCard.tsx similarity index 97% rename from src/components/views/rooms/RoomPreviewCard.tsx rename to apps/web/src/components/views/rooms/RoomPreviewCard.tsx index 5ddce5264b..bfbc841ba0 100644 --- a/src/components/views/rooms/RoomPreviewCard.tsx +++ b/apps/web/src/components/views/rooms/RoomPreviewCard.tsx @@ -22,7 +22,6 @@ import { useRoomState } from "../../../hooks/useRoomState"; import { useMyRoomMembership } from "../../../hooks/useRoomMembers"; import AccessibleButton from "../elements/AccessibleButton"; import InlineSpinner from "../elements/InlineSpinner"; -import RoomName from "../elements/RoomName"; import RoomTopic from "../elements/RoomTopic"; import RoomFacePile from "../elements/RoomFacePile"; import RoomAvatar from "../avatars/RoomAvatar"; @@ -30,6 +29,7 @@ import MemberAvatar from "../avatars/MemberAvatar"; import { BetaPill } from "../beta/BetaCard"; import RoomInfoLine from "./RoomInfoLine"; import { isVideoRoom as calcIsVideoRoom } from "../../../utils/video-rooms"; +import { useRoomName } from "../../../hooks/useRoomName.ts"; interface IProps { room: Room; @@ -56,6 +56,7 @@ const RoomPreviewCard: FC = ({ room, onJoinButtonClicked, onRejectButton const joinRule = useRoomState(room, (state) => state.getJoinRule()); const cannotJoin = getEffectiveMembership(myMembership) === EffectiveMembership.Leave && joinRule !== JoinRule.Public; + const name = useRoomName(room); const viewLabs = (): void => defaultDispatcher.dispatch({ @@ -169,9 +170,7 @@ const RoomPreviewCard: FC = ({ room, onJoinButtonClicked, onRejectButton
    {inviterSection}
    {avatarRow}
    -

    - -

    +

    {name}

    {room.getJoinRule() === "public" && } diff --git a/src/components/views/rooms/RoomSearchAuxPanel.tsx b/apps/web/src/components/views/rooms/RoomSearchAuxPanel.tsx similarity index 96% rename from src/components/views/rooms/RoomSearchAuxPanel.tsx rename to apps/web/src/components/views/rooms/RoomSearchAuxPanel.tsx index be821c7de1..14c7ad511e 100644 --- a/src/components/views/rooms/RoomSearchAuxPanel.tsx +++ b/apps/web/src/components/views/rooms/RoomSearchAuxPanel.tsx @@ -20,8 +20,8 @@ import InlineSpinner from "../elements/InlineSpinner"; interface Props { searchInfo?: SearchInfo; isRoomEncrypted: boolean; - onSearchScopeChange(scope: SearchScope): void; - onCancelClick(): void; + onSearchScopeChange(this: void, scope: SearchScope): void; + onCancelClick(this: void): void; } const RoomSearchAuxPanel: React.FC = ({ searchInfo, isRoomEncrypted, onSearchScopeChange, onCancelClick }) => { diff --git a/src/components/views/rooms/RoomSublist.tsx b/apps/web/src/components/views/rooms/RoomSublist.tsx similarity index 99% rename from src/components/views/rooms/RoomSublist.tsx rename to apps/web/src/components/views/rooms/RoomSublist.tsx index ed3b13701c..049cb8e764 100644 --- a/src/components/views/rooms/RoomSublist.tsx +++ b/apps/web/src/components/views/rooms/RoomSublist.tsx @@ -705,7 +705,7 @@ export default class RoomSublist extends React.Component { ); } - private onScrollPrevent(e: Event): void { + private onScrollPrevent(this: void, e: Event): void { // the RoomTile calls scrollIntoView and the browser may scroll a div we do not wish to be scrollable // this fixes https://github.com/vector-im/element-web/issues/14413 (e.target as HTMLDivElement).scrollTop = 0; diff --git a/src/components/views/rooms/RoomTile.tsx b/apps/web/src/components/views/rooms/RoomTile.tsx similarity index 100% rename from src/components/views/rooms/RoomTile.tsx rename to apps/web/src/components/views/rooms/RoomTile.tsx diff --git a/src/components/views/rooms/RoomTileCallSummary.tsx b/apps/web/src/components/views/rooms/RoomTileCallSummary.tsx similarity index 100% rename from src/components/views/rooms/RoomTileCallSummary.tsx rename to apps/web/src/components/views/rooms/RoomTileCallSummary.tsx diff --git a/src/components/views/rooms/RoomTileSubtitle.tsx b/apps/web/src/components/views/rooms/RoomTileSubtitle.tsx similarity index 100% rename from src/components/views/rooms/RoomTileSubtitle.tsx rename to apps/web/src/components/views/rooms/RoomTileSubtitle.tsx diff --git a/src/components/views/rooms/RoomUpgradeWarningBar.tsx b/apps/web/src/components/views/rooms/RoomUpgradeWarningBar.tsx similarity index 100% rename from src/components/views/rooms/RoomUpgradeWarningBar.tsx rename to apps/web/src/components/views/rooms/RoomUpgradeWarningBar.tsx diff --git a/src/components/views/rooms/SearchResultTile.tsx b/apps/web/src/components/views/rooms/SearchResultTile.tsx similarity index 100% rename from src/components/views/rooms/SearchResultTile.tsx rename to apps/web/src/components/views/rooms/SearchResultTile.tsx diff --git a/src/components/views/rooms/SendMessageComposer.tsx b/apps/web/src/components/views/rooms/SendMessageComposer.tsx similarity index 100% rename from src/components/views/rooms/SendMessageComposer.tsx rename to apps/web/src/components/views/rooms/SendMessageComposer.tsx diff --git a/src/components/views/rooms/Stickerpicker.tsx b/apps/web/src/components/views/rooms/Stickerpicker.tsx similarity index 100% rename from src/components/views/rooms/Stickerpicker.tsx rename to apps/web/src/components/views/rooms/Stickerpicker.tsx diff --git a/src/components/views/rooms/ThirdPartyMemberInfo.tsx b/apps/web/src/components/views/rooms/ThirdPartyMemberInfo.tsx similarity index 100% rename from src/components/views/rooms/ThirdPartyMemberInfo.tsx rename to apps/web/src/components/views/rooms/ThirdPartyMemberInfo.tsx diff --git a/src/components/views/rooms/ThreadSummary.tsx b/apps/web/src/components/views/rooms/ThreadSummary.tsx similarity index 100% rename from src/components/views/rooms/ThreadSummary.tsx rename to apps/web/src/components/views/rooms/ThreadSummary.tsx diff --git a/src/components/views/rooms/TopUnreadMessagesBar.tsx b/apps/web/src/components/views/rooms/TopUnreadMessagesBar.tsx similarity index 100% rename from src/components/views/rooms/TopUnreadMessagesBar.tsx rename to apps/web/src/components/views/rooms/TopUnreadMessagesBar.tsx diff --git a/src/components/views/rooms/UserIdentityWarning.tsx b/apps/web/src/components/views/rooms/UserIdentityWarning.tsx similarity index 100% rename from src/components/views/rooms/UserIdentityWarning.tsx rename to apps/web/src/components/views/rooms/UserIdentityWarning.tsx diff --git a/src/components/views/rooms/VoiceRecordComposerTile.tsx b/apps/web/src/components/views/rooms/VoiceRecordComposerTile.tsx similarity index 100% rename from src/components/views/rooms/VoiceRecordComposerTile.tsx rename to apps/web/src/components/views/rooms/VoiceRecordComposerTile.tsx diff --git a/src/components/views/rooms/WhoIsTypingTile.tsx b/apps/web/src/components/views/rooms/WhoIsTypingTile.tsx similarity index 100% rename from src/components/views/rooms/WhoIsTypingTile.tsx rename to apps/web/src/components/views/rooms/WhoIsTypingTile.tsx diff --git a/src/components/views/rooms/wysiwyg_composer/ComposerContext.ts b/apps/web/src/components/views/rooms/wysiwyg_composer/ComposerContext.ts similarity index 100% rename from src/components/views/rooms/wysiwyg_composer/ComposerContext.ts rename to apps/web/src/components/views/rooms/wysiwyg_composer/ComposerContext.ts diff --git a/src/components/views/rooms/wysiwyg_composer/DynamicImportWysiwygComposer.tsx b/apps/web/src/components/views/rooms/wysiwyg_composer/DynamicImportWysiwygComposer.tsx similarity index 94% rename from src/components/views/rooms/wysiwyg_composer/DynamicImportWysiwygComposer.tsx rename to apps/web/src/components/views/rooms/wysiwyg_composer/DynamicImportWysiwygComposer.tsx index 3c9e30148f..3eb405a2ff 100644 --- a/src/components/views/rooms/wysiwyg_composer/DynamicImportWysiwygComposer.tsx +++ b/apps/web/src/components/views/rooms/wysiwyg_composer/DynamicImportWysiwygComposer.tsx @@ -37,7 +37,7 @@ export const dynamicImportConversionFunctions = async (): Promise<{ * `false` to format it for writing to an editor element. * @returns a string of plain text that may contain markdown */ - richToPlain(rich: string, inMessageFormat: boolean): Promise; + richToPlain(this: void, rich: string, inMessageFormat: boolean): Promise; /** * Creates a rust model from plain text input (interpreted as markdown) and uses it to generate the rich text @@ -49,7 +49,7 @@ export const dynamicImportConversionFunctions = async (): Promise<{ * `false` to format it for writing to an editor element. * @returns a string of html */ - plainToRich(plain: string, inMessageFormat: boolean): Promise; + plainToRich(this: void, plain: string, inMessageFormat: boolean): Promise; }> => { const { richToPlain, plainToRich } = await import("@vector-im/matrix-wysiwyg"); diff --git a/src/components/views/rooms/wysiwyg_composer/EditWysiwygComposer.tsx b/apps/web/src/components/views/rooms/wysiwyg_composer/EditWysiwygComposer.tsx similarity index 100% rename from src/components/views/rooms/wysiwyg_composer/EditWysiwygComposer.tsx rename to apps/web/src/components/views/rooms/wysiwyg_composer/EditWysiwygComposer.tsx diff --git a/src/components/views/rooms/wysiwyg_composer/SendWysiwygComposer.tsx b/apps/web/src/components/views/rooms/wysiwyg_composer/SendWysiwygComposer.tsx similarity index 100% rename from src/components/views/rooms/wysiwyg_composer/SendWysiwygComposer.tsx rename to apps/web/src/components/views/rooms/wysiwyg_composer/SendWysiwygComposer.tsx diff --git a/src/components/views/rooms/wysiwyg_composer/components/EditionButtons.tsx b/apps/web/src/components/views/rooms/wysiwyg_composer/components/EditionButtons.tsx similarity index 100% rename from src/components/views/rooms/wysiwyg_composer/components/EditionButtons.tsx rename to apps/web/src/components/views/rooms/wysiwyg_composer/components/EditionButtons.tsx diff --git a/src/components/views/rooms/wysiwyg_composer/components/Editor.tsx b/apps/web/src/components/views/rooms/wysiwyg_composer/components/Editor.tsx similarity index 100% rename from src/components/views/rooms/wysiwyg_composer/components/Editor.tsx rename to apps/web/src/components/views/rooms/wysiwyg_composer/components/Editor.tsx diff --git a/src/components/views/rooms/wysiwyg_composer/components/Emoji.tsx b/apps/web/src/components/views/rooms/wysiwyg_composer/components/Emoji.tsx similarity index 100% rename from src/components/views/rooms/wysiwyg_composer/components/Emoji.tsx rename to apps/web/src/components/views/rooms/wysiwyg_composer/components/Emoji.tsx diff --git a/src/components/views/rooms/wysiwyg_composer/components/FormattingButtons.tsx b/apps/web/src/components/views/rooms/wysiwyg_composer/components/FormattingButtons.tsx similarity index 100% rename from src/components/views/rooms/wysiwyg_composer/components/FormattingButtons.tsx rename to apps/web/src/components/views/rooms/wysiwyg_composer/components/FormattingButtons.tsx diff --git a/src/components/views/rooms/wysiwyg_composer/components/LinkModal.tsx b/apps/web/src/components/views/rooms/wysiwyg_composer/components/LinkModal.tsx similarity index 100% rename from src/components/views/rooms/wysiwyg_composer/components/LinkModal.tsx rename to apps/web/src/components/views/rooms/wysiwyg_composer/components/LinkModal.tsx diff --git a/src/components/views/rooms/wysiwyg_composer/components/PlainTextComposer.tsx b/apps/web/src/components/views/rooms/wysiwyg_composer/components/PlainTextComposer.tsx similarity index 94% rename from src/components/views/rooms/wysiwyg_composer/components/PlainTextComposer.tsx rename to apps/web/src/components/views/rooms/wysiwyg_composer/components/PlainTextComposer.tsx index aadb3c0e78..f45cc5d74f 100644 --- a/src/components/views/rooms/wysiwyg_composer/components/PlainTextComposer.tsx +++ b/apps/web/src/components/views/rooms/wysiwyg_composer/components/PlainTextComposer.tsx @@ -22,14 +22,14 @@ import { useSettingValue } from "../../../../../hooks/useSettings"; interface PlainTextComposerProps { disabled?: boolean; - onChange?: (content: string) => void; - onSend?: () => void; + onChange?: (this: void, content: string) => void; + onSend?: (this: void) => void; placeholder?: string; initialContent?: string; className?: string; leftComponent?: ReactNode; rightComponent?: ReactNode; - children?: (ref: RefObject, composerFunctions: ComposerFunctions) => ReactNode; + children?: (this: void, ref: RefObject, composerFunctions: ComposerFunctions) => ReactNode; eventRelation?: IEventRelation; } diff --git a/src/components/views/rooms/wysiwyg_composer/components/WysiwygAutocomplete.tsx b/apps/web/src/components/views/rooms/wysiwyg_composer/components/WysiwygAutocomplete.tsx similarity index 100% rename from src/components/views/rooms/wysiwyg_composer/components/WysiwygAutocomplete.tsx rename to apps/web/src/components/views/rooms/wysiwyg_composer/components/WysiwygAutocomplete.tsx diff --git a/src/components/views/rooms/wysiwyg_composer/components/WysiwygComposer.tsx b/apps/web/src/components/views/rooms/wysiwyg_composer/components/WysiwygComposer.tsx similarity index 100% rename from src/components/views/rooms/wysiwyg_composer/components/WysiwygComposer.tsx rename to apps/web/src/components/views/rooms/wysiwyg_composer/components/WysiwygComposer.tsx diff --git a/src/components/views/rooms/wysiwyg_composer/hooks/useComposerFunctions.ts b/apps/web/src/components/views/rooms/wysiwyg_composer/hooks/useComposerFunctions.ts similarity index 100% rename from src/components/views/rooms/wysiwyg_composer/hooks/useComposerFunctions.ts rename to apps/web/src/components/views/rooms/wysiwyg_composer/hooks/useComposerFunctions.ts diff --git a/src/components/views/rooms/wysiwyg_composer/hooks/useContainsCommand.ts b/apps/web/src/components/views/rooms/wysiwyg_composer/hooks/useContainsCommand.ts similarity index 100% rename from src/components/views/rooms/wysiwyg_composer/hooks/useContainsCommand.ts rename to apps/web/src/components/views/rooms/wysiwyg_composer/hooks/useContainsCommand.ts diff --git a/src/components/views/rooms/wysiwyg_composer/hooks/useEditing.ts b/apps/web/src/components/views/rooms/wysiwyg_composer/hooks/useEditing.ts similarity index 92% rename from src/components/views/rooms/wysiwyg_composer/hooks/useEditing.ts rename to apps/web/src/components/views/rooms/wysiwyg_composer/hooks/useEditing.ts index e48b00e82a..5ba54c015d 100644 --- a/src/components/views/rooms/wysiwyg_composer/hooks/useEditing.ts +++ b/apps/web/src/components/views/rooms/wysiwyg_composer/hooks/useEditing.ts @@ -20,9 +20,9 @@ export function useEditing( initialContent?: string, ): { isSaveDisabled: boolean; - onChange(content: string): void; - editMessage(): Promise; - endEditing(): void; + onChange(this: void, content: string): void; + editMessage(this: void): Promise; + endEditing(this: void): void; } { const roomContext = useScopedRoomContext("timelineRenderingType"); const mxClient = useMatrixClientContext(); diff --git a/src/components/views/rooms/wysiwyg_composer/hooks/useInitialContent.ts b/apps/web/src/components/views/rooms/wysiwyg_composer/hooks/useInitialContent.ts similarity index 100% rename from src/components/views/rooms/wysiwyg_composer/hooks/useInitialContent.ts rename to apps/web/src/components/views/rooms/wysiwyg_composer/hooks/useInitialContent.ts diff --git a/src/components/views/rooms/wysiwyg_composer/hooks/useInputEventProcessor.ts b/apps/web/src/components/views/rooms/wysiwyg_composer/hooks/useInputEventProcessor.ts similarity index 100% rename from src/components/views/rooms/wysiwyg_composer/hooks/useInputEventProcessor.ts rename to apps/web/src/components/views/rooms/wysiwyg_composer/hooks/useInputEventProcessor.ts diff --git a/src/components/views/rooms/wysiwyg_composer/hooks/useIsExpanded.ts b/apps/web/src/components/views/rooms/wysiwyg_composer/hooks/useIsExpanded.ts similarity index 100% rename from src/components/views/rooms/wysiwyg_composer/hooks/useIsExpanded.ts rename to apps/web/src/components/views/rooms/wysiwyg_composer/hooks/useIsExpanded.ts diff --git a/src/components/views/rooms/wysiwyg_composer/hooks/useIsFocused.ts b/apps/web/src/components/views/rooms/wysiwyg_composer/hooks/useIsFocused.ts similarity index 94% rename from src/components/views/rooms/wysiwyg_composer/hooks/useIsFocused.ts rename to apps/web/src/components/views/rooms/wysiwyg_composer/hooks/useIsFocused.ts index 57039d3599..eab9ff1db9 100644 --- a/src/components/views/rooms/wysiwyg_composer/hooks/useIsFocused.ts +++ b/apps/web/src/components/views/rooms/wysiwyg_composer/hooks/useIsFocused.ts @@ -10,7 +10,7 @@ import { type FocusEvent, useCallback, useEffect, useRef, useState } from "react export function useIsFocused(): { isFocused: boolean; - onFocus(event: FocusEvent): void; + onFocus(this: void, event: FocusEvent): void; } { const [isFocused, setIsFocused] = useState(false); const timeoutIDRef = useRef(undefined); diff --git a/src/components/views/rooms/wysiwyg_composer/hooks/usePlainTextInitialization.ts b/apps/web/src/components/views/rooms/wysiwyg_composer/hooks/usePlainTextInitialization.ts similarity index 100% rename from src/components/views/rooms/wysiwyg_composer/hooks/usePlainTextInitialization.ts rename to apps/web/src/components/views/rooms/wysiwyg_composer/hooks/usePlainTextInitialization.ts diff --git a/src/components/views/rooms/wysiwyg_composer/hooks/usePlainTextListeners.ts b/apps/web/src/components/views/rooms/wysiwyg_composer/hooks/usePlainTextListeners.ts similarity index 90% rename from src/components/views/rooms/wysiwyg_composer/hooks/usePlainTextListeners.ts rename to apps/web/src/components/views/rooms/wysiwyg_composer/hooks/usePlainTextListeners.ts index be91c9ccf3..81272f8b4b 100644 --- a/src/components/views/rooms/wysiwyg_composer/hooks/usePlainTextListeners.ts +++ b/apps/web/src/components/views/rooms/wysiwyg_composer/hooks/usePlainTextListeners.ts @@ -52,16 +52,16 @@ export function usePlainTextListeners( ref: RefObject; autocompleteRef: RefObject; content?: string; - onBeforeInput(event: SyntheticEvent): void; - onInput(event: SyntheticEvent): void; - onPaste(event: SyntheticEvent): void; - onKeyDown(event: KeyboardEvent): void; - setContent(text?: string): void; - handleMention: (link: string, text: string, attributes: AllowedMentionAttributes) => void; - handleAtRoomMention: (attributes: AllowedMentionAttributes) => void; - handleCommand: (text: string) => void; - handleEmoji: (emoji: string) => void; - onSelect: (event: SyntheticEvent) => void; + onBeforeInput(this: void, event: SyntheticEvent): void; + onInput(this: void, event: SyntheticEvent): void; + onPaste(this: void, event: SyntheticEvent): void; + onKeyDown(this: void, event: KeyboardEvent): void; + setContent(this: void, text?: string): void; + handleMention: (this: void, link: string, text: string, attributes: AllowedMentionAttributes) => void; + handleAtRoomMention: (this: void, attributes: AllowedMentionAttributes) => void; + handleCommand: (this: void, text: string) => void; + handleEmoji: (this: void, emoji: string) => void; + onSelect: (this: void, event: SyntheticEvent) => void; suggestion: MappedSuggestion | null; } { const roomContext = useScopedRoomContext("room", "timelineRenderingType", "replyToEvent"); diff --git a/src/components/views/rooms/wysiwyg_composer/hooks/useSelection.ts b/apps/web/src/components/views/rooms/wysiwyg_composer/hooks/useSelection.ts similarity index 98% rename from src/components/views/rooms/wysiwyg_composer/hooks/useSelection.ts rename to apps/web/src/components/views/rooms/wysiwyg_composer/hooks/useSelection.ts index 10686f1078..23a85a32bd 100644 --- a/src/components/views/rooms/wysiwyg_composer/hooks/useSelection.ts +++ b/apps/web/src/components/views/rooms/wysiwyg_composer/hooks/useSelection.ts @@ -29,7 +29,7 @@ function setSelectionContext(composerContext: ComposerContextState): void { } export function useSelection(): ReturnType[1] & { - onInput(): void; + onInput(this: void): void; } { const composerContext = useComposerContext(); const [isFocused, focusProps] = useFocus(); diff --git a/src/components/views/rooms/wysiwyg_composer/hooks/useSetCursorPosition.ts b/apps/web/src/components/views/rooms/wysiwyg_composer/hooks/useSetCursorPosition.ts similarity index 100% rename from src/components/views/rooms/wysiwyg_composer/hooks/useSetCursorPosition.ts rename to apps/web/src/components/views/rooms/wysiwyg_composer/hooks/useSetCursorPosition.ts diff --git a/src/components/views/rooms/wysiwyg_composer/hooks/useSuggestion.ts b/apps/web/src/components/views/rooms/wysiwyg_composer/hooks/useSuggestion.ts similarity index 100% rename from src/components/views/rooms/wysiwyg_composer/hooks/useSuggestion.ts rename to apps/web/src/components/views/rooms/wysiwyg_composer/hooks/useSuggestion.ts diff --git a/src/components/views/rooms/wysiwyg_composer/hooks/useWysiwygEditActionHandler.ts b/apps/web/src/components/views/rooms/wysiwyg_composer/hooks/useWysiwygEditActionHandler.ts similarity index 100% rename from src/components/views/rooms/wysiwyg_composer/hooks/useWysiwygEditActionHandler.ts rename to apps/web/src/components/views/rooms/wysiwyg_composer/hooks/useWysiwygEditActionHandler.ts diff --git a/src/components/views/rooms/wysiwyg_composer/hooks/useWysiwygSendActionHandler.ts b/apps/web/src/components/views/rooms/wysiwyg_composer/hooks/useWysiwygSendActionHandler.ts similarity index 100% rename from src/components/views/rooms/wysiwyg_composer/hooks/useWysiwygSendActionHandler.ts rename to apps/web/src/components/views/rooms/wysiwyg_composer/hooks/useWysiwygSendActionHandler.ts diff --git a/src/components/views/rooms/wysiwyg_composer/hooks/utils.ts b/apps/web/src/components/views/rooms/wysiwyg_composer/hooks/utils.ts similarity index 100% rename from src/components/views/rooms/wysiwyg_composer/hooks/utils.ts rename to apps/web/src/components/views/rooms/wysiwyg_composer/hooks/utils.ts diff --git a/src/components/views/rooms/wysiwyg_composer/index.ts b/apps/web/src/components/views/rooms/wysiwyg_composer/index.ts similarity index 100% rename from src/components/views/rooms/wysiwyg_composer/index.ts rename to apps/web/src/components/views/rooms/wysiwyg_composer/index.ts diff --git a/src/components/views/rooms/wysiwyg_composer/types.ts b/apps/web/src/components/views/rooms/wysiwyg_composer/types.ts similarity index 100% rename from src/components/views/rooms/wysiwyg_composer/types.ts rename to apps/web/src/components/views/rooms/wysiwyg_composer/types.ts diff --git a/src/components/views/rooms/wysiwyg_composer/utils/autocomplete.ts b/apps/web/src/components/views/rooms/wysiwyg_composer/utils/autocomplete.ts similarity index 100% rename from src/components/views/rooms/wysiwyg_composer/utils/autocomplete.ts rename to apps/web/src/components/views/rooms/wysiwyg_composer/utils/autocomplete.ts diff --git a/src/components/views/rooms/wysiwyg_composer/utils/createMessageContent.ts b/apps/web/src/components/views/rooms/wysiwyg_composer/utils/createMessageContent.ts similarity index 100% rename from src/components/views/rooms/wysiwyg_composer/utils/createMessageContent.ts rename to apps/web/src/components/views/rooms/wysiwyg_composer/utils/createMessageContent.ts diff --git a/src/components/views/rooms/wysiwyg_composer/utils/editing.ts b/apps/web/src/components/views/rooms/wysiwyg_composer/utils/editing.ts similarity index 100% rename from src/components/views/rooms/wysiwyg_composer/utils/editing.ts rename to apps/web/src/components/views/rooms/wysiwyg_composer/utils/editing.ts diff --git a/src/components/views/rooms/wysiwyg_composer/utils/event.ts b/apps/web/src/components/views/rooms/wysiwyg_composer/utils/event.ts similarity index 100% rename from src/components/views/rooms/wysiwyg_composer/utils/event.ts rename to apps/web/src/components/views/rooms/wysiwyg_composer/utils/event.ts diff --git a/src/components/views/rooms/wysiwyg_composer/utils/isContentModified.ts b/apps/web/src/components/views/rooms/wysiwyg_composer/utils/isContentModified.ts similarity index 100% rename from src/components/views/rooms/wysiwyg_composer/utils/isContentModified.ts rename to apps/web/src/components/views/rooms/wysiwyg_composer/utils/isContentModified.ts diff --git a/src/components/views/rooms/wysiwyg_composer/utils/message.ts b/apps/web/src/components/views/rooms/wysiwyg_composer/utils/message.ts similarity index 100% rename from src/components/views/rooms/wysiwyg_composer/utils/message.ts rename to apps/web/src/components/views/rooms/wysiwyg_composer/utils/message.ts diff --git a/src/components/views/rooms/wysiwyg_composer/utils/selection.ts b/apps/web/src/components/views/rooms/wysiwyg_composer/utils/selection.ts similarity index 100% rename from src/components/views/rooms/wysiwyg_composer/utils/selection.ts rename to apps/web/src/components/views/rooms/wysiwyg_composer/utils/selection.ts diff --git a/src/components/views/settings/AddPrivilegedUsers.tsx b/apps/web/src/components/views/settings/AddPrivilegedUsers.tsx similarity index 100% rename from src/components/views/settings/AddPrivilegedUsers.tsx rename to apps/web/src/components/views/settings/AddPrivilegedUsers.tsx diff --git a/src/components/views/settings/AddRemoveThreepids.tsx b/apps/web/src/components/views/settings/AddRemoveThreepids.tsx similarity index 100% rename from src/components/views/settings/AddRemoveThreepids.tsx rename to apps/web/src/components/views/settings/AddRemoveThreepids.tsx diff --git a/src/components/views/settings/AvatarSetting.tsx b/apps/web/src/components/views/settings/AvatarSetting.tsx similarity index 100% rename from src/components/views/settings/AvatarSetting.tsx rename to apps/web/src/components/views/settings/AvatarSetting.tsx diff --git a/src/components/views/settings/BridgeTile.tsx b/apps/web/src/components/views/settings/BridgeTile.tsx similarity index 100% rename from src/components/views/settings/BridgeTile.tsx rename to apps/web/src/components/views/settings/BridgeTile.tsx diff --git a/src/components/views/settings/ChangePassword.tsx b/apps/web/src/components/views/settings/ChangePassword.tsx similarity index 100% rename from src/components/views/settings/ChangePassword.tsx rename to apps/web/src/components/views/settings/ChangePassword.tsx diff --git a/src/components/views/settings/EventIndexPanel.tsx b/apps/web/src/components/views/settings/EventIndexPanel.tsx similarity index 100% rename from src/components/views/settings/EventIndexPanel.tsx rename to apps/web/src/components/views/settings/EventIndexPanel.tsx diff --git a/src/components/views/settings/FontScalingPanel.tsx b/apps/web/src/components/views/settings/FontScalingPanel.tsx similarity index 100% rename from src/components/views/settings/FontScalingPanel.tsx rename to apps/web/src/components/views/settings/FontScalingPanel.tsx diff --git a/src/components/views/settings/ImageSizePanel.tsx b/apps/web/src/components/views/settings/ImageSizePanel.tsx similarity index 100% rename from src/components/views/settings/ImageSizePanel.tsx rename to apps/web/src/components/views/settings/ImageSizePanel.tsx diff --git a/src/components/views/settings/IntegrationManager.tsx b/apps/web/src/components/views/settings/IntegrationManager.tsx similarity index 100% rename from src/components/views/settings/IntegrationManager.tsx rename to apps/web/src/components/views/settings/IntegrationManager.tsx diff --git a/src/components/views/settings/JoinRuleSettings.tsx b/apps/web/src/components/views/settings/JoinRuleSettings.tsx similarity index 98% rename from src/components/views/settings/JoinRuleSettings.tsx rename to apps/web/src/components/views/settings/JoinRuleSettings.tsx index f3189b3fcf..e5a51ca369 100644 --- a/src/components/views/settings/JoinRuleSettings.tsx +++ b/apps/web/src/components/views/settings/JoinRuleSettings.tsx @@ -32,9 +32,9 @@ import LabelledCheckbox from "../elements/LabelledCheckbox"; export interface JoinRuleSettingsProps { room: Room; promptUpgrade?: boolean; - closeSettingsFn(): void; - onError(error: unknown): void; - beforeChange?(joinRule: JoinRule): Promise; // if returns false then aborts the change + closeSettingsFn(this: void): void; + onError(this: void, error: unknown): void; + beforeChange?(this: void, joinRule: JoinRule): Promise; // if returns false then aborts the change disabledOptions?: Set; hiddenOptions?: Set; recommendedOption?: JoinRule; diff --git a/src/components/views/settings/KeyboardShortcut.tsx b/apps/web/src/components/views/settings/KeyboardShortcut.tsx similarity index 100% rename from src/components/views/settings/KeyboardShortcut.tsx rename to apps/web/src/components/views/settings/KeyboardShortcut.tsx diff --git a/src/components/views/settings/LayoutSwitcher.tsx b/apps/web/src/components/views/settings/LayoutSwitcher.tsx similarity index 100% rename from src/components/views/settings/LayoutSwitcher.tsx rename to apps/web/src/components/views/settings/LayoutSwitcher.tsx diff --git a/src/components/views/settings/Notifications.tsx b/apps/web/src/components/views/settings/Notifications.tsx similarity index 100% rename from src/components/views/settings/Notifications.tsx rename to apps/web/src/components/views/settings/Notifications.tsx diff --git a/src/components/views/settings/PowerLevelSelector.tsx b/apps/web/src/components/views/settings/PowerLevelSelector.tsx similarity index 100% rename from src/components/views/settings/PowerLevelSelector.tsx rename to apps/web/src/components/views/settings/PowerLevelSelector.tsx diff --git a/src/components/views/settings/SetIdServer.tsx b/apps/web/src/components/views/settings/SetIdServer.tsx similarity index 100% rename from src/components/views/settings/SetIdServer.tsx rename to apps/web/src/components/views/settings/SetIdServer.tsx diff --git a/src/components/views/settings/SetIntegrationManager.tsx b/apps/web/src/components/views/settings/SetIntegrationManager.tsx similarity index 100% rename from src/components/views/settings/SetIntegrationManager.tsx rename to apps/web/src/components/views/settings/SetIntegrationManager.tsx diff --git a/src/components/views/settings/SettingsFieldset.tsx b/apps/web/src/components/views/settings/SettingsFieldset.tsx similarity index 100% rename from src/components/views/settings/SettingsFieldset.tsx rename to apps/web/src/components/views/settings/SettingsFieldset.tsx diff --git a/src/components/views/settings/SettingsHeader.tsx b/apps/web/src/components/views/settings/SettingsHeader.tsx similarity index 100% rename from src/components/views/settings/SettingsHeader.tsx rename to apps/web/src/components/views/settings/SettingsHeader.tsx diff --git a/src/components/views/settings/SettingsSubheader.tsx b/apps/web/src/components/views/settings/SettingsSubheader.tsx similarity index 100% rename from src/components/views/settings/SettingsSubheader.tsx rename to apps/web/src/components/views/settings/SettingsSubheader.tsx diff --git a/src/components/views/settings/SpellCheckSettings.tsx b/apps/web/src/components/views/settings/SpellCheckSettings.tsx similarity index 100% rename from src/components/views/settings/SpellCheckSettings.tsx rename to apps/web/src/components/views/settings/SpellCheckSettings.tsx diff --git a/src/components/views/settings/ThemeChoicePanel.tsx b/apps/web/src/components/views/settings/ThemeChoicePanel.tsx similarity index 100% rename from src/components/views/settings/ThemeChoicePanel.tsx rename to apps/web/src/components/views/settings/ThemeChoicePanel.tsx diff --git a/src/components/views/settings/UpdateCheckButton.tsx b/apps/web/src/components/views/settings/UpdateCheckButton.tsx similarity index 100% rename from src/components/views/settings/UpdateCheckButton.tsx rename to apps/web/src/components/views/settings/UpdateCheckButton.tsx diff --git a/src/components/views/settings/UserPersonalInfoSettings.tsx b/apps/web/src/components/views/settings/UserPersonalInfoSettings.tsx similarity index 100% rename from src/components/views/settings/UserPersonalInfoSettings.tsx rename to apps/web/src/components/views/settings/UserPersonalInfoSettings.tsx diff --git a/src/components/views/settings/UserProfileSettings.tsx b/apps/web/src/components/views/settings/UserProfileSettings.tsx similarity index 100% rename from src/components/views/settings/UserProfileSettings.tsx rename to apps/web/src/components/views/settings/UserProfileSettings.tsx diff --git a/src/components/views/settings/devices/CurrentDeviceSection.tsx b/apps/web/src/components/views/settings/devices/CurrentDeviceSection.tsx similarity index 100% rename from src/components/views/settings/devices/CurrentDeviceSection.tsx rename to apps/web/src/components/views/settings/devices/CurrentDeviceSection.tsx diff --git a/src/components/views/settings/devices/DeviceDetailHeading.tsx b/apps/web/src/components/views/settings/devices/DeviceDetailHeading.tsx similarity index 100% rename from src/components/views/settings/devices/DeviceDetailHeading.tsx rename to apps/web/src/components/views/settings/devices/DeviceDetailHeading.tsx diff --git a/src/components/views/settings/devices/DeviceDetails.tsx b/apps/web/src/components/views/settings/devices/DeviceDetails.tsx similarity index 100% rename from src/components/views/settings/devices/DeviceDetails.tsx rename to apps/web/src/components/views/settings/devices/DeviceDetails.tsx diff --git a/src/components/views/settings/devices/DeviceExpandDetailsButton.tsx b/apps/web/src/components/views/settings/devices/DeviceExpandDetailsButton.tsx similarity index 100% rename from src/components/views/settings/devices/DeviceExpandDetailsButton.tsx rename to apps/web/src/components/views/settings/devices/DeviceExpandDetailsButton.tsx diff --git a/src/components/views/settings/devices/DeviceMetaData.tsx b/apps/web/src/components/views/settings/devices/DeviceMetaData.tsx similarity index 100% rename from src/components/views/settings/devices/DeviceMetaData.tsx rename to apps/web/src/components/views/settings/devices/DeviceMetaData.tsx diff --git a/src/components/views/settings/devices/DeviceSecurityCard.tsx b/apps/web/src/components/views/settings/devices/DeviceSecurityCard.tsx similarity index 100% rename from src/components/views/settings/devices/DeviceSecurityCard.tsx rename to apps/web/src/components/views/settings/devices/DeviceSecurityCard.tsx diff --git a/src/components/views/settings/devices/DeviceSecurityLearnMore.tsx b/apps/web/src/components/views/settings/devices/DeviceSecurityLearnMore.tsx similarity index 100% rename from src/components/views/settings/devices/DeviceSecurityLearnMore.tsx rename to apps/web/src/components/views/settings/devices/DeviceSecurityLearnMore.tsx diff --git a/src/components/views/settings/devices/DeviceTile.tsx b/apps/web/src/components/views/settings/devices/DeviceTile.tsx similarity index 100% rename from src/components/views/settings/devices/DeviceTile.tsx rename to apps/web/src/components/views/settings/devices/DeviceTile.tsx diff --git a/src/components/views/settings/devices/DeviceTypeIcon.tsx b/apps/web/src/components/views/settings/devices/DeviceTypeIcon.tsx similarity index 100% rename from src/components/views/settings/devices/DeviceTypeIcon.tsx rename to apps/web/src/components/views/settings/devices/DeviceTypeIcon.tsx diff --git a/src/components/views/settings/devices/DeviceVerificationStatusCard.tsx b/apps/web/src/components/views/settings/devices/DeviceVerificationStatusCard.tsx similarity index 100% rename from src/components/views/settings/devices/DeviceVerificationStatusCard.tsx rename to apps/web/src/components/views/settings/devices/DeviceVerificationStatusCard.tsx diff --git a/src/components/views/settings/devices/FilteredDeviceList.tsx b/apps/web/src/components/views/settings/devices/FilteredDeviceList.tsx similarity index 100% rename from src/components/views/settings/devices/FilteredDeviceList.tsx rename to apps/web/src/components/views/settings/devices/FilteredDeviceList.tsx diff --git a/src/components/views/settings/devices/FilteredDeviceListHeader.tsx b/apps/web/src/components/views/settings/devices/FilteredDeviceListHeader.tsx similarity index 100% rename from src/components/views/settings/devices/FilteredDeviceListHeader.tsx rename to apps/web/src/components/views/settings/devices/FilteredDeviceListHeader.tsx diff --git a/src/components/views/settings/devices/LoginWithQRSection.tsx b/apps/web/src/components/views/settings/devices/LoginWithQRSection.tsx similarity index 100% rename from src/components/views/settings/devices/LoginWithQRSection.tsx rename to apps/web/src/components/views/settings/devices/LoginWithQRSection.tsx diff --git a/src/components/views/settings/devices/OtherSessionsSectionHeading.tsx b/apps/web/src/components/views/settings/devices/OtherSessionsSectionHeading.tsx similarity index 100% rename from src/components/views/settings/devices/OtherSessionsSectionHeading.tsx rename to apps/web/src/components/views/settings/devices/OtherSessionsSectionHeading.tsx diff --git a/src/components/views/settings/devices/SecurityRecommendations.tsx b/apps/web/src/components/views/settings/devices/SecurityRecommendations.tsx similarity index 100% rename from src/components/views/settings/devices/SecurityRecommendations.tsx rename to apps/web/src/components/views/settings/devices/SecurityRecommendations.tsx diff --git a/src/components/views/settings/devices/SelectableDeviceTile.tsx b/apps/web/src/components/views/settings/devices/SelectableDeviceTile.tsx similarity index 100% rename from src/components/views/settings/devices/SelectableDeviceTile.tsx rename to apps/web/src/components/views/settings/devices/SelectableDeviceTile.tsx diff --git a/src/components/views/settings/devices/deleteDevices.tsx b/apps/web/src/components/views/settings/devices/deleteDevices.tsx similarity index 100% rename from src/components/views/settings/devices/deleteDevices.tsx rename to apps/web/src/components/views/settings/devices/deleteDevices.tsx diff --git a/src/components/views/settings/devices/filter.ts b/apps/web/src/components/views/settings/devices/filter.ts similarity index 100% rename from src/components/views/settings/devices/filter.ts rename to apps/web/src/components/views/settings/devices/filter.ts diff --git a/src/components/views/settings/devices/types.ts b/apps/web/src/components/views/settings/devices/types.ts similarity index 100% rename from src/components/views/settings/devices/types.ts rename to apps/web/src/components/views/settings/devices/types.ts diff --git a/src/components/views/settings/devices/useOwnDevices.ts b/apps/web/src/components/views/settings/devices/useOwnDevices.ts similarity index 100% rename from src/components/views/settings/devices/useOwnDevices.ts rename to apps/web/src/components/views/settings/devices/useOwnDevices.ts diff --git a/src/components/views/settings/discovery/DiscoverySettings.tsx b/apps/web/src/components/views/settings/discovery/DiscoverySettings.tsx similarity index 97% rename from src/components/views/settings/discovery/DiscoverySettings.tsx rename to apps/web/src/components/views/settings/discovery/DiscoverySettings.tsx index 8bfd7d144d..c6535188f3 100644 --- a/src/components/views/settings/discovery/DiscoverySettings.tsx +++ b/apps/web/src/components/views/settings/discovery/DiscoverySettings.tsx @@ -14,8 +14,6 @@ import { Alert } from "@vector-im/compound-web"; import { getThreepidsWithBindStatus } from "../../../../boundThreepids"; import { useMatrixClientContext } from "../../../../contexts/MatrixClientContext"; import { type ThirdPartyIdentifier } from "../../../../AddThreepid"; -import SettingsStore from "../../../../settings/SettingsStore"; -import { UIFeature } from "../../../../settings/UIFeature"; import { _t } from "../../../../languageHandler"; import SetIdServer from "../SetIdServer"; import { SettingsSubsection } from "../shared/SettingsSubsection"; @@ -124,8 +122,6 @@ export const DiscoverySettings: React.FC = () => { })(); }, [client, getThreepidState]); - if (!SettingsStore.getValue(UIFeature.ThirdPartyID)) return null; - if (mustAgreeToTerms && requiredPolicyInfo.policiesAndServices) { const intro = ( diff --git a/src/components/views/settings/encryption/AdvancedPanel.tsx b/apps/web/src/components/views/settings/encryption/AdvancedPanel.tsx similarity index 100% rename from src/components/views/settings/encryption/AdvancedPanel.tsx rename to apps/web/src/components/views/settings/encryption/AdvancedPanel.tsx diff --git a/src/components/views/settings/encryption/ChangeRecoveryKey.tsx b/apps/web/src/components/views/settings/encryption/ChangeRecoveryKey.tsx similarity index 100% rename from src/components/views/settings/encryption/ChangeRecoveryKey.tsx rename to apps/web/src/components/views/settings/encryption/ChangeRecoveryKey.tsx diff --git a/src/components/views/settings/encryption/DeleteKeyStoragePanel.tsx b/apps/web/src/components/views/settings/encryption/DeleteKeyStoragePanel.tsx similarity index 100% rename from src/components/views/settings/encryption/DeleteKeyStoragePanel.tsx rename to apps/web/src/components/views/settings/encryption/DeleteKeyStoragePanel.tsx diff --git a/src/components/views/settings/encryption/EncryptionCard.tsx b/apps/web/src/components/views/settings/encryption/EncryptionCard.tsx similarity index 100% rename from src/components/views/settings/encryption/EncryptionCard.tsx rename to apps/web/src/components/views/settings/encryption/EncryptionCard.tsx diff --git a/src/components/views/settings/encryption/EncryptionCardButtons.tsx b/apps/web/src/components/views/settings/encryption/EncryptionCardButtons.tsx similarity index 100% rename from src/components/views/settings/encryption/EncryptionCardButtons.tsx rename to apps/web/src/components/views/settings/encryption/EncryptionCardButtons.tsx diff --git a/src/components/views/settings/encryption/EncryptionCardEmphasisedContent.tsx b/apps/web/src/components/views/settings/encryption/EncryptionCardEmphasisedContent.tsx similarity index 100% rename from src/components/views/settings/encryption/EncryptionCardEmphasisedContent.tsx rename to apps/web/src/components/views/settings/encryption/EncryptionCardEmphasisedContent.tsx diff --git a/src/components/views/settings/encryption/KeyStoragePanel.tsx b/apps/web/src/components/views/settings/encryption/KeyStoragePanel.tsx similarity index 100% rename from src/components/views/settings/encryption/KeyStoragePanel.tsx rename to apps/web/src/components/views/settings/encryption/KeyStoragePanel.tsx diff --git a/src/components/views/settings/encryption/RecoveryPanel.tsx b/apps/web/src/components/views/settings/encryption/RecoveryPanel.tsx similarity index 100% rename from src/components/views/settings/encryption/RecoveryPanel.tsx rename to apps/web/src/components/views/settings/encryption/RecoveryPanel.tsx diff --git a/src/components/views/settings/encryption/RecoveryPanelOutOfSync.tsx b/apps/web/src/components/views/settings/encryption/RecoveryPanelOutOfSync.tsx similarity index 100% rename from src/components/views/settings/encryption/RecoveryPanelOutOfSync.tsx rename to apps/web/src/components/views/settings/encryption/RecoveryPanelOutOfSync.tsx diff --git a/src/components/views/settings/encryption/ResetIdentityBody.tsx b/apps/web/src/components/views/settings/encryption/ResetIdentityBody.tsx similarity index 100% rename from src/components/views/settings/encryption/ResetIdentityBody.tsx rename to apps/web/src/components/views/settings/encryption/ResetIdentityBody.tsx diff --git a/src/components/views/settings/encryption/ResetIdentityPanel.tsx b/apps/web/src/components/views/settings/encryption/ResetIdentityPanel.tsx similarity index 100% rename from src/components/views/settings/encryption/ResetIdentityPanel.tsx rename to apps/web/src/components/views/settings/encryption/ResetIdentityPanel.tsx diff --git a/src/components/views/settings/notifications/NotificationPusherSettings.tsx b/apps/web/src/components/views/settings/notifications/NotificationPusherSettings.tsx similarity index 100% rename from src/components/views/settings/notifications/NotificationPusherSettings.tsx rename to apps/web/src/components/views/settings/notifications/NotificationPusherSettings.tsx diff --git a/src/components/views/settings/notifications/NotificationSettings2.tsx b/apps/web/src/components/views/settings/notifications/NotificationSettings2.tsx similarity index 100% rename from src/components/views/settings/notifications/NotificationSettings2.tsx rename to apps/web/src/components/views/settings/notifications/NotificationSettings2.tsx diff --git a/src/components/views/settings/shared/SettingsBanner.tsx b/apps/web/src/components/views/settings/shared/SettingsBanner.tsx similarity index 100% rename from src/components/views/settings/shared/SettingsBanner.tsx rename to apps/web/src/components/views/settings/shared/SettingsBanner.tsx diff --git a/src/components/views/settings/shared/SettingsIndent.tsx b/apps/web/src/components/views/settings/shared/SettingsIndent.tsx similarity index 100% rename from src/components/views/settings/shared/SettingsIndent.tsx rename to apps/web/src/components/views/settings/shared/SettingsIndent.tsx diff --git a/src/components/views/settings/shared/SettingsSection.tsx b/apps/web/src/components/views/settings/shared/SettingsSection.tsx similarity index 100% rename from src/components/views/settings/shared/SettingsSection.tsx rename to apps/web/src/components/views/settings/shared/SettingsSection.tsx diff --git a/src/components/views/settings/shared/SettingsSubsection.tsx b/apps/web/src/components/views/settings/shared/SettingsSubsection.tsx similarity index 100% rename from src/components/views/settings/shared/SettingsSubsection.tsx rename to apps/web/src/components/views/settings/shared/SettingsSubsection.tsx diff --git a/src/components/views/settings/shared/SettingsSubsectionHeading.tsx b/apps/web/src/components/views/settings/shared/SettingsSubsectionHeading.tsx similarity index 100% rename from src/components/views/settings/shared/SettingsSubsectionHeading.tsx rename to apps/web/src/components/views/settings/shared/SettingsSubsectionHeading.tsx diff --git a/src/components/views/settings/tabs/SettingsTab.tsx b/apps/web/src/components/views/settings/tabs/SettingsTab.tsx similarity index 100% rename from src/components/views/settings/tabs/SettingsTab.tsx rename to apps/web/src/components/views/settings/tabs/SettingsTab.tsx diff --git a/src/components/views/settings/tabs/room/AdvancedRoomSettingsTab.tsx b/apps/web/src/components/views/settings/tabs/room/AdvancedRoomSettingsTab.tsx similarity index 100% rename from src/components/views/settings/tabs/room/AdvancedRoomSettingsTab.tsx rename to apps/web/src/components/views/settings/tabs/room/AdvancedRoomSettingsTab.tsx diff --git a/src/components/views/settings/tabs/room/BridgeSettingsTab.tsx b/apps/web/src/components/views/settings/tabs/room/BridgeSettingsTab.tsx similarity index 100% rename from src/components/views/settings/tabs/room/BridgeSettingsTab.tsx rename to apps/web/src/components/views/settings/tabs/room/BridgeSettingsTab.tsx diff --git a/src/components/views/settings/tabs/room/GeneralRoomSettingsTab.tsx b/apps/web/src/components/views/settings/tabs/room/GeneralRoomSettingsTab.tsx similarity index 100% rename from src/components/views/settings/tabs/room/GeneralRoomSettingsTab.tsx rename to apps/web/src/components/views/settings/tabs/room/GeneralRoomSettingsTab.tsx diff --git a/src/components/views/settings/tabs/room/NotificationSettingsTab.tsx b/apps/web/src/components/views/settings/tabs/room/NotificationSettingsTab.tsx similarity index 100% rename from src/components/views/settings/tabs/room/NotificationSettingsTab.tsx rename to apps/web/src/components/views/settings/tabs/room/NotificationSettingsTab.tsx diff --git a/src/components/views/settings/tabs/room/PeopleRoomSettingsTab.tsx b/apps/web/src/components/views/settings/tabs/room/PeopleRoomSettingsTab.tsx similarity index 100% rename from src/components/views/settings/tabs/room/PeopleRoomSettingsTab.tsx rename to apps/web/src/components/views/settings/tabs/room/PeopleRoomSettingsTab.tsx diff --git a/src/components/views/settings/tabs/room/PollHistoryTab.tsx b/apps/web/src/components/views/settings/tabs/room/PollHistoryTab.tsx similarity index 100% rename from src/components/views/settings/tabs/room/PollHistoryTab.tsx rename to apps/web/src/components/views/settings/tabs/room/PollHistoryTab.tsx diff --git a/src/components/views/settings/tabs/room/RolesRoomSettingsTab.tsx b/apps/web/src/components/views/settings/tabs/room/RolesRoomSettingsTab.tsx similarity index 100% rename from src/components/views/settings/tabs/room/RolesRoomSettingsTab.tsx rename to apps/web/src/components/views/settings/tabs/room/RolesRoomSettingsTab.tsx diff --git a/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx b/apps/web/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx similarity index 100% rename from src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx rename to apps/web/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx diff --git a/src/components/views/settings/tabs/room/VoipRoomSettingsTab.tsx b/apps/web/src/components/views/settings/tabs/room/VoipRoomSettingsTab.tsx similarity index 100% rename from src/components/views/settings/tabs/room/VoipRoomSettingsTab.tsx rename to apps/web/src/components/views/settings/tabs/room/VoipRoomSettingsTab.tsx diff --git a/src/components/views/settings/tabs/user/AccountUserSettingsTab.tsx b/apps/web/src/components/views/settings/tabs/user/AccountUserSettingsTab.tsx similarity index 100% rename from src/components/views/settings/tabs/user/AccountUserSettingsTab.tsx rename to apps/web/src/components/views/settings/tabs/user/AccountUserSettingsTab.tsx diff --git a/src/components/views/settings/tabs/user/AppearanceUserSettingsTab.tsx b/apps/web/src/components/views/settings/tabs/user/AppearanceUserSettingsTab.tsx similarity index 100% rename from src/components/views/settings/tabs/user/AppearanceUserSettingsTab.tsx rename to apps/web/src/components/views/settings/tabs/user/AppearanceUserSettingsTab.tsx diff --git a/src/components/views/settings/tabs/user/EncryptionUserSettingsTab.tsx b/apps/web/src/components/views/settings/tabs/user/EncryptionUserSettingsTab.tsx similarity index 97% rename from src/components/views/settings/tabs/user/EncryptionUserSettingsTab.tsx rename to apps/web/src/components/views/settings/tabs/user/EncryptionUserSettingsTab.tsx index 52ee2b1e60..a41e257b8c 100644 --- a/src/components/views/settings/tabs/user/EncryptionUserSettingsTab.tsx +++ b/apps/web/src/components/views/settings/tabs/user/EncryptionUserSettingsTab.tsx @@ -24,7 +24,7 @@ import { RecoveryPanelOutOfSync } from "../../encryption/RecoveryPanelOutOfSync" import { useTypedEventEmitterState } from "../../../../../hooks/useEventEmitter"; import { KeyStoragePanel } from "../../encryption/KeyStoragePanel"; import { DeleteKeyStoragePanel } from "../../encryption/DeleteKeyStoragePanel"; -import { DeviceListener, DeviceListenerEvents, type DeviceState } from "../../../../../device-listener"; +import { DeviceListener, CurrentDeviceEvents, type DeviceState } from "../../../../../device-listener"; import { useKeyStoragePanelViewModel } from "../../../../viewmodels/settings/encryption/KeyStoragePanelViewModel"; /** @@ -64,8 +64,8 @@ export function EncryptionUserSettingsTab({ initialState = "main" }: Readonly(initialState); const deviceState = useTypedEventEmitterState( - DeviceListener.sharedInstance(), - DeviceListenerEvents.DeviceState, + DeviceListener.sharedInstance().currentDeviceChangedEmitter, + CurrentDeviceEvents.DeviceStateChanged, (state?: DeviceState): DeviceState => { return state ?? DeviceListener.sharedInstance().getDeviceState(); }, diff --git a/src/components/views/settings/tabs/user/HelpUserSettingsTab.tsx b/apps/web/src/components/views/settings/tabs/user/HelpUserSettingsTab.tsx similarity index 100% rename from src/components/views/settings/tabs/user/HelpUserSettingsTab.tsx rename to apps/web/src/components/views/settings/tabs/user/HelpUserSettingsTab.tsx diff --git a/src/components/views/settings/tabs/user/InviteRulesAccountSettings.tsx b/apps/web/src/components/views/settings/tabs/user/InviteRulesAccountSettings.tsx similarity index 100% rename from src/components/views/settings/tabs/user/InviteRulesAccountSettings.tsx rename to apps/web/src/components/views/settings/tabs/user/InviteRulesAccountSettings.tsx diff --git a/src/components/views/settings/tabs/user/KeyboardUserSettingsTab.tsx b/apps/web/src/components/views/settings/tabs/user/KeyboardUserSettingsTab.tsx similarity index 100% rename from src/components/views/settings/tabs/user/KeyboardUserSettingsTab.tsx rename to apps/web/src/components/views/settings/tabs/user/KeyboardUserSettingsTab.tsx diff --git a/src/components/views/settings/tabs/user/LabsUserSettingsTab.tsx b/apps/web/src/components/views/settings/tabs/user/LabsUserSettingsTab.tsx similarity index 100% rename from src/components/views/settings/tabs/user/LabsUserSettingsTab.tsx rename to apps/web/src/components/views/settings/tabs/user/LabsUserSettingsTab.tsx diff --git a/src/components/views/settings/tabs/user/MediaPreviewAccountSettings.tsx b/apps/web/src/components/views/settings/tabs/user/MediaPreviewAccountSettings.tsx similarity index 100% rename from src/components/views/settings/tabs/user/MediaPreviewAccountSettings.tsx rename to apps/web/src/components/views/settings/tabs/user/MediaPreviewAccountSettings.tsx diff --git a/src/components/views/settings/tabs/user/MjolnirUserSettingsTab.tsx b/apps/web/src/components/views/settings/tabs/user/MjolnirUserSettingsTab.tsx similarity index 100% rename from src/components/views/settings/tabs/user/MjolnirUserSettingsTab.tsx rename to apps/web/src/components/views/settings/tabs/user/MjolnirUserSettingsTab.tsx diff --git a/src/components/views/settings/tabs/user/NotificationUserSettingsTab.tsx b/apps/web/src/components/views/settings/tabs/user/NotificationUserSettingsTab.tsx similarity index 100% rename from src/components/views/settings/tabs/user/NotificationUserSettingsTab.tsx rename to apps/web/src/components/views/settings/tabs/user/NotificationUserSettingsTab.tsx diff --git a/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.tsx b/apps/web/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.tsx similarity index 100% rename from src/components/views/settings/tabs/user/PreferencesUserSettingsTab.tsx rename to apps/web/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.tsx diff --git a/src/components/views/settings/tabs/user/SecurityUserSettingsTab.tsx b/apps/web/src/components/views/settings/tabs/user/SecurityUserSettingsTab.tsx similarity index 97% rename from src/components/views/settings/tabs/user/SecurityUserSettingsTab.tsx rename to apps/web/src/components/views/settings/tabs/user/SecurityUserSettingsTab.tsx index d301f9daab..f94b2842f8 100644 --- a/src/components/views/settings/tabs/user/SecurityUserSettingsTab.tsx +++ b/apps/web/src/components/views/settings/tabs/user/SecurityUserSettingsTab.tsx @@ -362,6 +362,21 @@ export default class SecurityUserSettingsTab extends React.Component; + } + + let privacySection; + if (discoverySection || posthogSection) { + privacySection = ( + + {discoverySection} + {posthogSection} + + ); + } + return ( {warning} @@ -370,10 +385,7 @@ export default class SecurityUserSettingsTab extends React.Component - - - {posthogSection} - + {privacySection} {advancedSection} ); diff --git a/src/components/views/settings/tabs/user/SessionManagerTab.tsx b/apps/web/src/components/views/settings/tabs/user/SessionManagerTab.tsx similarity index 100% rename from src/components/views/settings/tabs/user/SessionManagerTab.tsx rename to apps/web/src/components/views/settings/tabs/user/SessionManagerTab.tsx diff --git a/src/components/views/settings/tabs/user/SidebarUserSettingsTab.tsx b/apps/web/src/components/views/settings/tabs/user/SidebarUserSettingsTab.tsx similarity index 100% rename from src/components/views/settings/tabs/user/SidebarUserSettingsTab.tsx rename to apps/web/src/components/views/settings/tabs/user/SidebarUserSettingsTab.tsx diff --git a/src/components/views/settings/tabs/user/VoiceUserSettingsTab.tsx b/apps/web/src/components/views/settings/tabs/user/VoiceUserSettingsTab.tsx similarity index 100% rename from src/components/views/settings/tabs/user/VoiceUserSettingsTab.tsx rename to apps/web/src/components/views/settings/tabs/user/VoiceUserSettingsTab.tsx diff --git a/src/components/views/spaces/QuickSettingsButton.tsx b/apps/web/src/components/views/spaces/QuickSettingsButton.tsx similarity index 100% rename from src/components/views/spaces/QuickSettingsButton.tsx rename to apps/web/src/components/views/spaces/QuickSettingsButton.tsx diff --git a/src/components/views/spaces/QuickThemeSwitcher.tsx b/apps/web/src/components/views/spaces/QuickThemeSwitcher.tsx similarity index 100% rename from src/components/views/spaces/QuickThemeSwitcher.tsx rename to apps/web/src/components/views/spaces/QuickThemeSwitcher.tsx diff --git a/src/components/views/spaces/SpaceBasicSettings.tsx b/apps/web/src/components/views/spaces/SpaceBasicSettings.tsx similarity index 97% rename from src/components/views/spaces/SpaceBasicSettings.tsx rename to apps/web/src/components/views/spaces/SpaceBasicSettings.tsx index f00ab96521..ac363de115 100644 --- a/src/components/views/spaces/SpaceBasicSettings.tsx +++ b/apps/web/src/components/views/spaces/SpaceBasicSettings.tsx @@ -21,9 +21,9 @@ interface IProps { nameDisabled?: boolean; topic?: string; topicDisabled?: boolean; - setAvatar(avatar?: File): void; - setName(name: string): void; - setTopic(topic: string): void; + setAvatar(this: void, avatar?: File): void; + setName(this: void, name: string): void; + setTopic(this: void, topic: string): void; } export const SpaceAvatar: React.FC> = ({ diff --git a/src/components/views/spaces/SpaceChildrenPicker.tsx b/apps/web/src/components/views/spaces/SpaceChildrenPicker.tsx similarity index 97% rename from src/components/views/spaces/SpaceChildrenPicker.tsx rename to apps/web/src/components/views/spaces/SpaceChildrenPicker.tsx index 268b22d288..870108ff35 100644 --- a/src/components/views/spaces/SpaceChildrenPicker.tsx +++ b/apps/web/src/components/views/spaces/SpaceChildrenPicker.tsx @@ -27,7 +27,7 @@ interface ISpecificChildrenPickerProps { filterPlaceholder: string; rooms: Room[]; selected: Set; - onChange(selected: boolean, room: Room): void; + onChange(this: void, selected: boolean, room: Room): void; } const SpecificChildrenPicker: React.FC = ({ @@ -89,7 +89,7 @@ interface IProps { noneLabel?: string; allLabel: string; specificLabel: string; - onChange(rooms: Room[]): void; + onChange(this: void, rooms: Room[]): void; } const SpaceChildrenPicker: React.FC = ({ diff --git a/src/components/views/spaces/SpaceCreateMenu.tsx b/apps/web/src/components/views/spaces/SpaceCreateMenu.tsx similarity index 98% rename from src/components/views/spaces/SpaceCreateMenu.tsx rename to apps/web/src/components/views/spaces/SpaceCreateMenu.tsx index 8d2d619ee4..52831d1ee1 100644 --- a/src/components/views/spaces/SpaceCreateMenu.tsx +++ b/apps/web/src/components/views/spaces/SpaceCreateMenu.tsx @@ -113,8 +113,8 @@ interface ISpaceCreateFormProps extends BProps { aliasFieldRef: RefObject; showAliasField?: boolean; children?: ReactNode; - onSubmit(e: SyntheticEvent): void; - setAlias(alias: string): void; + onSubmit(this: void, e: SyntheticEvent): void; + setAlias(this: void, alias: string): void; } export const SpaceCreateForm: React.FC = ({ @@ -198,7 +198,7 @@ export const SpaceCreateForm: React.FC = ({ }; const SpaceCreateMenu: React.FC<{ - onFinished(): void; + onFinished(this: void): void; }> = ({ onFinished }) => { const cli = useMatrixClientContext(); const settingAllowPublicSpaces = useSettingValue(UIFeature.AllowCreatingPublicSpaces); diff --git a/src/components/views/spaces/SpacePanel.tsx b/apps/web/src/components/views/spaces/SpacePanel.tsx similarity index 100% rename from src/components/views/spaces/SpacePanel.tsx rename to apps/web/src/components/views/spaces/SpacePanel.tsx diff --git a/src/components/views/spaces/SpacePublicShare.tsx b/apps/web/src/components/views/spaces/SpacePublicShare.tsx similarity index 98% rename from src/components/views/spaces/SpacePublicShare.tsx rename to apps/web/src/components/views/spaces/SpacePublicShare.tsx index 18345ab230..e9203dfb57 100644 --- a/src/components/views/spaces/SpacePublicShare.tsx +++ b/apps/web/src/components/views/spaces/SpacePublicShare.tsx @@ -22,7 +22,7 @@ import SpacePillButton from "../../structures/SpacePillButton.tsx"; interface IProps { space: Room; - onFinished?(): void; + onFinished?(this: void): void; } const SpacePublicShare: React.FC = ({ space, onFinished }) => { diff --git a/src/components/views/spaces/SpaceSettingsGeneralTab.tsx b/apps/web/src/components/views/spaces/SpaceSettingsGeneralTab.tsx similarity index 100% rename from src/components/views/spaces/SpaceSettingsGeneralTab.tsx rename to apps/web/src/components/views/spaces/SpaceSettingsGeneralTab.tsx diff --git a/src/components/views/spaces/SpaceSettingsVisibilityTab.tsx b/apps/web/src/components/views/spaces/SpaceSettingsVisibilityTab.tsx similarity index 99% rename from src/components/views/spaces/SpaceSettingsVisibilityTab.tsx rename to apps/web/src/components/views/spaces/SpaceSettingsVisibilityTab.tsx index 893acf20f0..8aeae9234a 100644 --- a/src/components/views/spaces/SpaceSettingsVisibilityTab.tsx +++ b/apps/web/src/components/views/spaces/SpaceSettingsVisibilityTab.tsx @@ -32,7 +32,7 @@ import SettingsTab from "../settings/tabs/SettingsTab"; interface IProps { matrixClient: MatrixClient; space: Room; - closeSettingsFn(): void; + closeSettingsFn(this: void): void; } const SpaceSettingsVisibilityTab: React.FC = ({ matrixClient: cli, space, closeSettingsFn }) => { diff --git a/src/components/views/spaces/SpaceTreeLevel.tsx b/apps/web/src/components/views/spaces/SpaceTreeLevel.tsx similarity index 100% rename from src/components/views/spaces/SpaceTreeLevel.tsx rename to apps/web/src/components/views/spaces/SpaceTreeLevel.tsx diff --git a/src/components/views/spaces/threads-activity-centre/ThreadsActivityCentre.tsx b/apps/web/src/components/views/spaces/threads-activity-centre/ThreadsActivityCentre.tsx similarity index 100% rename from src/components/views/spaces/threads-activity-centre/ThreadsActivityCentre.tsx rename to apps/web/src/components/views/spaces/threads-activity-centre/ThreadsActivityCentre.tsx diff --git a/src/components/views/spaces/threads-activity-centre/ThreadsActivityCentreButton.tsx b/apps/web/src/components/views/spaces/threads-activity-centre/ThreadsActivityCentreButton.tsx similarity index 100% rename from src/components/views/spaces/threads-activity-centre/ThreadsActivityCentreButton.tsx rename to apps/web/src/components/views/spaces/threads-activity-centre/ThreadsActivityCentreButton.tsx diff --git a/src/components/views/spaces/threads-activity-centre/index.ts b/apps/web/src/components/views/spaces/threads-activity-centre/index.ts similarity index 100% rename from src/components/views/spaces/threads-activity-centre/index.ts rename to apps/web/src/components/views/spaces/threads-activity-centre/index.ts diff --git a/src/components/views/spaces/threads-activity-centre/useUnreadThreadRooms.ts b/apps/web/src/components/views/spaces/threads-activity-centre/useUnreadThreadRooms.ts similarity index 100% rename from src/components/views/spaces/threads-activity-centre/useUnreadThreadRooms.ts rename to apps/web/src/components/views/spaces/threads-activity-centre/useUnreadThreadRooms.ts diff --git a/src/components/views/terms/InlineTermsAgreement.tsx b/apps/web/src/components/views/terms/InlineTermsAgreement.tsx similarity index 100% rename from src/components/views/terms/InlineTermsAgreement.tsx rename to apps/web/src/components/views/terms/InlineTermsAgreement.tsx diff --git a/src/components/views/toasts/GenericExpiringToast.tsx b/apps/web/src/components/views/toasts/GenericExpiringToast.tsx similarity index 97% rename from src/components/views/toasts/GenericExpiringToast.tsx rename to apps/web/src/components/views/toasts/GenericExpiringToast.tsx index abbbacc5f8..a8e4fa0e44 100644 --- a/src/components/views/toasts/GenericExpiringToast.tsx +++ b/apps/web/src/components/views/toasts/GenericExpiringToast.tsx @@ -16,7 +16,7 @@ interface IProps extends IGenericToastProps { toastKey: string; numSeconds: number; dismissLabel: string; - onDismiss?(): void; + onDismiss?(this: void): void; } const SECOND = 1000; diff --git a/src/components/views/toasts/GenericToast.tsx b/apps/web/src/components/views/toasts/GenericToast.tsx similarity index 96% rename from src/components/views/toasts/GenericToast.tsx rename to apps/web/src/components/views/toasts/GenericToast.tsx index d57dddc705..75149cf87c 100644 --- a/src/components/views/toasts/GenericToast.tsx +++ b/apps/web/src/components/views/toasts/GenericToast.tsx @@ -17,14 +17,14 @@ export interface IProps { primaryLabel: string; PrimaryIcon?: ComponentType>; - onPrimaryClick(): void; + onPrimaryClick(this: void): void; } interface IPropsExtended extends IProps { secondaryLabel: string; SecondaryIcon?: ComponentType>; destructive?: "primary" | "secondary"; - onSecondaryClick(): void; + onSecondaryClick(this: void): void; // If set, this will override the max-width (of the description) making the toast wider or narrower than standard overrideWidth?: string; diff --git a/src/components/views/toasts/NonUrgentEchoFailureToast.tsx b/apps/web/src/components/views/toasts/NonUrgentEchoFailureToast.tsx similarity index 100% rename from src/components/views/toasts/NonUrgentEchoFailureToast.tsx rename to apps/web/src/components/views/toasts/NonUrgentEchoFailureToast.tsx diff --git a/src/components/views/toasts/VerificationRequestToast.tsx b/apps/web/src/components/views/toasts/VerificationRequestToast.tsx similarity index 100% rename from src/components/views/toasts/VerificationRequestToast.tsx rename to apps/web/src/components/views/toasts/VerificationRequestToast.tsx diff --git a/src/components/views/typography/Caption.tsx b/apps/web/src/components/views/typography/Caption.tsx similarity index 100% rename from src/components/views/typography/Caption.tsx rename to apps/web/src/components/views/typography/Caption.tsx diff --git a/src/components/views/typography/Heading.tsx b/apps/web/src/components/views/typography/Heading.tsx similarity index 100% rename from src/components/views/typography/Heading.tsx rename to apps/web/src/components/views/typography/Heading.tsx diff --git a/src/components/views/verification/VerificationCancelled.tsx b/apps/web/src/components/views/verification/VerificationCancelled.tsx similarity index 100% rename from src/components/views/verification/VerificationCancelled.tsx rename to apps/web/src/components/views/verification/VerificationCancelled.tsx diff --git a/src/components/views/verification/VerificationComplete.tsx b/apps/web/src/components/views/verification/VerificationComplete.tsx similarity index 100% rename from src/components/views/verification/VerificationComplete.tsx rename to apps/web/src/components/views/verification/VerificationComplete.tsx diff --git a/src/components/views/verification/VerificationShowSas.tsx b/apps/web/src/components/views/verification/VerificationShowSas.tsx similarity index 100% rename from src/components/views/verification/VerificationShowSas.tsx rename to apps/web/src/components/views/verification/VerificationShowSas.tsx diff --git a/src/components/views/voip/AudioFeed.tsx b/apps/web/src/components/views/voip/AudioFeed.tsx similarity index 100% rename from src/components/views/voip/AudioFeed.tsx rename to apps/web/src/components/views/voip/AudioFeed.tsx diff --git a/src/components/views/voip/AudioFeedArrayForLegacyCall.tsx b/apps/web/src/components/views/voip/AudioFeedArrayForLegacyCall.tsx similarity index 100% rename from src/components/views/voip/AudioFeedArrayForLegacyCall.tsx rename to apps/web/src/components/views/voip/AudioFeedArrayForLegacyCall.tsx diff --git a/src/components/views/voip/CallDuration.tsx b/apps/web/src/components/views/voip/CallDuration.tsx similarity index 100% rename from src/components/views/voip/CallDuration.tsx rename to apps/web/src/components/views/voip/CallDuration.tsx diff --git a/src/components/views/voip/CallView.tsx b/apps/web/src/components/views/voip/CallView.tsx similarity index 100% rename from src/components/views/voip/CallView.tsx rename to apps/web/src/components/views/voip/CallView.tsx diff --git a/src/components/views/voip/DialPad.tsx b/apps/web/src/components/views/voip/DialPad.tsx similarity index 100% rename from src/components/views/voip/DialPad.tsx rename to apps/web/src/components/views/voip/DialPad.tsx diff --git a/src/components/views/voip/DialPadModal.tsx b/apps/web/src/components/views/voip/DialPadModal.tsx similarity index 100% rename from src/components/views/voip/DialPadModal.tsx rename to apps/web/src/components/views/voip/DialPadModal.tsx diff --git a/src/components/views/voip/LegacyCallView.tsx b/apps/web/src/components/views/voip/LegacyCallView.tsx similarity index 100% rename from src/components/views/voip/LegacyCallView.tsx rename to apps/web/src/components/views/voip/LegacyCallView.tsx diff --git a/src/components/views/voip/LegacyCallView/LegacyCallViewButtons.tsx b/apps/web/src/components/views/voip/LegacyCallView/LegacyCallViewButtons.tsx similarity index 100% rename from src/components/views/voip/LegacyCallView/LegacyCallViewButtons.tsx rename to apps/web/src/components/views/voip/LegacyCallView/LegacyCallViewButtons.tsx diff --git a/src/components/views/voip/LegacyCallView/LegacyCallViewHeader.tsx b/apps/web/src/components/views/voip/LegacyCallView/LegacyCallViewHeader.tsx similarity index 100% rename from src/components/views/voip/LegacyCallView/LegacyCallViewHeader.tsx rename to apps/web/src/components/views/voip/LegacyCallView/LegacyCallViewHeader.tsx diff --git a/src/components/views/voip/LegacyCallViewForRoom.tsx b/apps/web/src/components/views/voip/LegacyCallViewForRoom.tsx similarity index 100% rename from src/components/views/voip/LegacyCallViewForRoom.tsx rename to apps/web/src/components/views/voip/LegacyCallViewForRoom.tsx diff --git a/src/components/views/voip/LegacyCallViewSidebar.tsx b/apps/web/src/components/views/voip/LegacyCallViewSidebar.tsx similarity index 100% rename from src/components/views/voip/LegacyCallViewSidebar.tsx rename to apps/web/src/components/views/voip/LegacyCallViewSidebar.tsx diff --git a/src/components/views/voip/VideoFeed.tsx b/apps/web/src/components/views/voip/VideoFeed.tsx similarity index 100% rename from src/components/views/voip/VideoFeed.tsx rename to apps/web/src/components/views/voip/VideoFeed.tsx diff --git a/src/contexts/CurrentRightPanelPhaseContext.tsx b/apps/web/src/contexts/CurrentRightPanelPhaseContext.tsx similarity index 100% rename from src/contexts/CurrentRightPanelPhaseContext.tsx rename to apps/web/src/contexts/CurrentRightPanelPhaseContext.tsx diff --git a/src/contexts/LocalDeviceVerificationStateContext.ts b/apps/web/src/contexts/LocalDeviceVerificationStateContext.ts similarity index 100% rename from src/contexts/LocalDeviceVerificationStateContext.ts rename to apps/web/src/contexts/LocalDeviceVerificationStateContext.ts diff --git a/src/contexts/MatrixClientContext.tsx b/apps/web/src/contexts/MatrixClientContext.tsx similarity index 100% rename from src/contexts/MatrixClientContext.tsx rename to apps/web/src/contexts/MatrixClientContext.tsx diff --git a/src/contexts/RoomContext.ts b/apps/web/src/contexts/RoomContext.ts similarity index 100% rename from src/contexts/RoomContext.ts rename to apps/web/src/contexts/RoomContext.ts diff --git a/src/contexts/SDKContext.ts b/apps/web/src/contexts/SDKContext.ts similarity index 100% rename from src/contexts/SDKContext.ts rename to apps/web/src/contexts/SDKContext.ts diff --git a/src/contexts/ScopedRoomContext.tsx b/apps/web/src/contexts/ScopedRoomContext.tsx similarity index 100% rename from src/contexts/ScopedRoomContext.tsx rename to apps/web/src/contexts/ScopedRoomContext.tsx diff --git a/src/contexts/ToastContext.tsx b/apps/web/src/contexts/ToastContext.tsx similarity index 100% rename from src/contexts/ToastContext.tsx rename to apps/web/src/contexts/ToastContext.tsx diff --git a/src/createRoom.ts b/apps/web/src/createRoom.ts similarity index 100% rename from src/createRoom.ts rename to apps/web/src/createRoom.ts diff --git a/src/customisations/Alias.ts b/apps/web/src/customisations/Alias.ts similarity index 100% rename from src/customisations/Alias.ts rename to apps/web/src/customisations/Alias.ts diff --git a/src/customisations/ChatExport.ts b/apps/web/src/customisations/ChatExport.ts similarity index 100% rename from src/customisations/ChatExport.ts rename to apps/web/src/customisations/ChatExport.ts diff --git a/src/customisations/ComponentVisibility.ts b/apps/web/src/customisations/ComponentVisibility.ts similarity index 100% rename from src/customisations/ComponentVisibility.ts rename to apps/web/src/customisations/ComponentVisibility.ts diff --git a/src/customisations/Directory.ts b/apps/web/src/customisations/Directory.ts similarity index 100% rename from src/customisations/Directory.ts rename to apps/web/src/customisations/Directory.ts diff --git a/src/customisations/Lifecycle.ts b/apps/web/src/customisations/Lifecycle.ts similarity index 100% rename from src/customisations/Lifecycle.ts rename to apps/web/src/customisations/Lifecycle.ts diff --git a/src/customisations/Media.ts b/apps/web/src/customisations/Media.ts similarity index 100% rename from src/customisations/Media.ts rename to apps/web/src/customisations/Media.ts diff --git a/src/customisations/README.md b/apps/web/src/customisations/README.md similarity index 100% rename from src/customisations/README.md rename to apps/web/src/customisations/README.md diff --git a/src/customisations/RoomList.ts b/apps/web/src/customisations/RoomList.ts similarity index 100% rename from src/customisations/RoomList.ts rename to apps/web/src/customisations/RoomList.ts diff --git a/src/customisations/UserIdentifier.ts b/apps/web/src/customisations/UserIdentifier.ts similarity index 100% rename from src/customisations/UserIdentifier.ts rename to apps/web/src/customisations/UserIdentifier.ts diff --git a/src/customisations/WidgetPermissions.ts b/apps/web/src/customisations/WidgetPermissions.ts similarity index 100% rename from src/customisations/WidgetPermissions.ts rename to apps/web/src/customisations/WidgetPermissions.ts diff --git a/src/customisations/WidgetVariables.ts b/apps/web/src/customisations/WidgetVariables.ts similarity index 100% rename from src/customisations/WidgetVariables.ts rename to apps/web/src/customisations/WidgetVariables.ts diff --git a/src/customisations/helpers/UIComponents.ts b/apps/web/src/customisations/helpers/UIComponents.ts similarity index 100% rename from src/customisations/helpers/UIComponents.ts rename to apps/web/src/customisations/helpers/UIComponents.ts diff --git a/src/customisations/models/IMediaEventContent.ts b/apps/web/src/customisations/models/IMediaEventContent.ts similarity index 100% rename from src/customisations/models/IMediaEventContent.ts rename to apps/web/src/customisations/models/IMediaEventContent.ts diff --git a/apps/web/src/device-listener/CurrentDeviceChangedEmitter.ts b/apps/web/src/device-listener/CurrentDeviceChangedEmitter.ts new file mode 100644 index 0000000000..bca2c57324 --- /dev/null +++ b/apps/web/src/device-listener/CurrentDeviceChangedEmitter.ts @@ -0,0 +1,36 @@ +/* +Copyright 2026 Element Creations Ltd. + +SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. +*/ + +import { TypedEventEmitter } from "matrix-js-sdk/src/matrix"; + +import { type DeviceState } from "."; + +/** + * The events emitted when the {@link DeviceState} of the current device + * changes. + */ +export const enum CurrentDeviceEvents { + DeviceStateChanged = "device_state", +} + +/** + * You must provide one of these if you listen to {@link CurrentDeviceEvents} + * emitted by {@link DeviceListenerCurrentDevice}. It specifies how to handle + * each type of event. + */ +type EventHandlerMap = { + [CurrentDeviceEvents.DeviceStateChanged]: (state: DeviceState) => void; +}; + +/** + * Emits events when the current device changes state. + */ +export class CurrentDeviceChangedEmitter extends TypedEventEmitter { + public onStateChanged(newState: DeviceState): void { + this.emit(CurrentDeviceEvents.DeviceStateChanged, newState); + } +} diff --git a/src/device-listener/DeviceListener.ts b/apps/web/src/device-listener/DeviceListener.ts similarity index 92% rename from src/device-listener/DeviceListener.ts rename to apps/web/src/device-listener/DeviceListener.ts index fed7b9ad5a..4d62bf0ab5 100644 --- a/src/device-listener/DeviceListener.ts +++ b/apps/web/src/device-listener/DeviceListener.ts @@ -7,7 +7,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import { type MatrixClient, ClientStoppedError, TypedEventEmitter } from "matrix-js-sdk/src/matrix"; +import { type MatrixClient, ClientStoppedError } from "matrix-js-sdk/src/matrix"; import { logger as baseLogger, LogSpan } from "matrix-js-sdk/src/logger"; import { type CryptoSessionStateChange } from "@matrix-org/analytics-events/types/typescript/CryptoSessionStateChange"; import { secureRandomString } from "matrix-js-sdk/src/randomstring"; @@ -20,22 +20,16 @@ import SdkConfig from "../SdkConfig"; import PlatformPeg from "../PlatformPeg"; import { recordClientInformation, removeClientInformation } from "../utils/device/clientInformation"; import SettingsStore, { type CallbackFn } from "../settings/SettingsStore"; -import { DeviceListenerOtherDevices, DeviceListenerCurrentDevice, type DeviceState } from "."; +import { + DeviceListenerOtherDevices, + DeviceListenerCurrentDevice, + type DeviceState, + CurrentDeviceChangedEmitter, +} from "."; const logger = baseLogger.getChild("DeviceListener:"); -/** - * The events emitted by {@link DeviceListener} - */ -export enum DeviceListenerEvents { - DeviceState = "device_state", -} - -type EventHandlerMap = { - [DeviceListenerEvents.DeviceState]: (state: DeviceState) => void; -}; - -export class DeviceListener extends TypedEventEmitter { +export class DeviceListener { private dispatcherRef?: string; /** @@ -44,11 +38,34 @@ export class DeviceListener extends TypedEventEmitter { + * return state ?? DeviceListener.sharedInstance().getDeviceState(); + * }, + * ); + * ``` + * + * Now `deviceState` will reflect the state of the current device and + * trigger an update when it changes. + */ + public currentDeviceChangedEmitter = new CurrentDeviceChangedEmitter(); + private running = false; // The client with which the instance is running. Only set if `running` is true, otherwise undefined. private client?: MatrixClient; diff --git a/src/device-listener/DeviceListenerCurrentDevice.ts b/apps/web/src/device-listener/DeviceListenerCurrentDevice.ts similarity index 99% rename from src/device-listener/DeviceListenerCurrentDevice.ts rename to apps/web/src/device-listener/DeviceListenerCurrentDevice.ts index d74ee76507..92895663b0 100644 --- a/src/device-listener/DeviceListenerCurrentDevice.ts +++ b/apps/web/src/device-listener/DeviceListenerCurrentDevice.ts @@ -18,7 +18,7 @@ import { ClientEvent, } from "matrix-js-sdk/src/matrix"; -import { type DeviceListener, type DeviceState, DeviceListenerEvents } from "."; +import { type DeviceListener, type DeviceState } from "."; import { hideToast as hideSetupEncryptionToast, showToast as showSetupEncryptionToast, @@ -263,7 +263,7 @@ export class DeviceListenerCurrentDevice { private async setDeviceState(newState: DeviceState, logSpan: LogSpan): Promise { this.deviceState = newState; - this.deviceListener.emit(DeviceListenerEvents.DeviceState, newState); + this.deviceListener.currentDeviceChangedEmitter.onStateChanged(newState); if (newState === "ok" || this.dismissedThisDeviceToast) { hideSetupEncryptionToast(); diff --git a/src/device-listener/DeviceListenerOtherDevices.ts b/apps/web/src/device-listener/DeviceListenerOtherDevices.ts similarity index 100% rename from src/device-listener/DeviceListenerOtherDevices.ts rename to apps/web/src/device-listener/DeviceListenerOtherDevices.ts diff --git a/src/device-listener/DeviceState.ts b/apps/web/src/device-listener/DeviceState.ts similarity index 100% rename from src/device-listener/DeviceState.ts rename to apps/web/src/device-listener/DeviceState.ts diff --git a/src/device-listener/index.ts b/apps/web/src/device-listener/index.ts similarity index 88% rename from src/device-listener/index.ts rename to apps/web/src/device-listener/index.ts index af45ea9af8..03af6adec6 100644 --- a/src/device-listener/index.ts +++ b/apps/web/src/device-listener/index.ts @@ -5,6 +5,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ +export * from "./CurrentDeviceChangedEmitter"; export * from "./DeviceListener"; export * from "./DeviceListenerCurrentDevice"; export * from "./DeviceListenerOtherDevices"; diff --git a/src/dispatcher/actions.ts b/apps/web/src/dispatcher/actions.ts similarity index 100% rename from src/dispatcher/actions.ts rename to apps/web/src/dispatcher/actions.ts diff --git a/src/dispatcher/dispatcher.ts b/apps/web/src/dispatcher/dispatcher.ts similarity index 100% rename from src/dispatcher/dispatcher.ts rename to apps/web/src/dispatcher/dispatcher.ts diff --git a/src/dispatcher/payloads.ts b/apps/web/src/dispatcher/payloads.ts similarity index 100% rename from src/dispatcher/payloads.ts rename to apps/web/src/dispatcher/payloads.ts diff --git a/src/dispatcher/payloads/ActiveRoomChangedPayload.ts b/apps/web/src/dispatcher/payloads/ActiveRoomChangedPayload.ts similarity index 100% rename from src/dispatcher/payloads/ActiveRoomChangedPayload.ts rename to apps/web/src/dispatcher/payloads/ActiveRoomChangedPayload.ts diff --git a/src/dispatcher/payloads/AfterForgetRoomPayload.ts b/apps/web/src/dispatcher/payloads/AfterForgetRoomPayload.ts similarity index 100% rename from src/dispatcher/payloads/AfterForgetRoomPayload.ts rename to apps/web/src/dispatcher/payloads/AfterForgetRoomPayload.ts diff --git a/src/dispatcher/payloads/AfterLeaveRoomPayload.ts b/apps/web/src/dispatcher/payloads/AfterLeaveRoomPayload.ts similarity index 100% rename from src/dispatcher/payloads/AfterLeaveRoomPayload.ts rename to apps/web/src/dispatcher/payloads/AfterLeaveRoomPayload.ts diff --git a/src/dispatcher/payloads/CancelAskToJoinPayload.ts b/apps/web/src/dispatcher/payloads/CancelAskToJoinPayload.ts similarity index 100% rename from src/dispatcher/payloads/CancelAskToJoinPayload.ts rename to apps/web/src/dispatcher/payloads/CancelAskToJoinPayload.ts diff --git a/src/dispatcher/payloads/CheckUpdatesPayload.ts b/apps/web/src/dispatcher/payloads/CheckUpdatesPayload.ts similarity index 100% rename from src/dispatcher/payloads/CheckUpdatesPayload.ts rename to apps/web/src/dispatcher/payloads/CheckUpdatesPayload.ts diff --git a/src/dispatcher/payloads/ComposerInsertPayload.ts b/apps/web/src/dispatcher/payloads/ComposerInsertPayload.ts similarity index 100% rename from src/dispatcher/payloads/ComposerInsertPayload.ts rename to apps/web/src/dispatcher/payloads/ComposerInsertPayload.ts diff --git a/src/dispatcher/payloads/DoAfterSyncPreparedPayload.ts b/apps/web/src/dispatcher/payloads/DoAfterSyncPreparedPayload.ts similarity index 100% rename from src/dispatcher/payloads/DoAfterSyncPreparedPayload.ts rename to apps/web/src/dispatcher/payloads/DoAfterSyncPreparedPayload.ts diff --git a/src/dispatcher/payloads/FocusComposerPayload.ts b/apps/web/src/dispatcher/payloads/FocusComposerPayload.ts similarity index 100% rename from src/dispatcher/payloads/FocusComposerPayload.ts rename to apps/web/src/dispatcher/payloads/FocusComposerPayload.ts diff --git a/src/dispatcher/payloads/FocusMessageSearchPayload.ts b/apps/web/src/dispatcher/payloads/FocusMessageSearchPayload.ts similarity index 100% rename from src/dispatcher/payloads/FocusMessageSearchPayload.ts rename to apps/web/src/dispatcher/payloads/FocusMessageSearchPayload.ts diff --git a/src/dispatcher/payloads/JoinRoomErrorPayload.ts b/apps/web/src/dispatcher/payloads/JoinRoomErrorPayload.ts similarity index 100% rename from src/dispatcher/payloads/JoinRoomErrorPayload.ts rename to apps/web/src/dispatcher/payloads/JoinRoomErrorPayload.ts diff --git a/src/dispatcher/payloads/JoinRoomPayload.ts b/apps/web/src/dispatcher/payloads/JoinRoomPayload.ts similarity index 100% rename from src/dispatcher/payloads/JoinRoomPayload.ts rename to apps/web/src/dispatcher/payloads/JoinRoomPayload.ts diff --git a/src/dispatcher/payloads/JoinRoomReadyPayload.ts b/apps/web/src/dispatcher/payloads/JoinRoomReadyPayload.ts similarity index 100% rename from src/dispatcher/payloads/JoinRoomReadyPayload.ts rename to apps/web/src/dispatcher/payloads/JoinRoomReadyPayload.ts diff --git a/src/dispatcher/payloads/OpenAddExistingToSpaceDialogPayload.ts b/apps/web/src/dispatcher/payloads/OpenAddExistingToSpaceDialogPayload.ts similarity index 100% rename from src/dispatcher/payloads/OpenAddExistingToSpaceDialogPayload.ts rename to apps/web/src/dispatcher/payloads/OpenAddExistingToSpaceDialogPayload.ts diff --git a/src/dispatcher/payloads/OpenForwardDialogPayload.ts b/apps/web/src/dispatcher/payloads/OpenForwardDialogPayload.ts similarity index 100% rename from src/dispatcher/payloads/OpenForwardDialogPayload.ts rename to apps/web/src/dispatcher/payloads/OpenForwardDialogPayload.ts diff --git a/src/dispatcher/payloads/OpenInviteDialogPayload.ts b/apps/web/src/dispatcher/payloads/OpenInviteDialogPayload.ts similarity index 100% rename from src/dispatcher/payloads/OpenInviteDialogPayload.ts rename to apps/web/src/dispatcher/payloads/OpenInviteDialogPayload.ts diff --git a/src/dispatcher/payloads/OpenReportEventDialogPayload.ts b/apps/web/src/dispatcher/payloads/OpenReportEventDialogPayload.ts similarity index 100% rename from src/dispatcher/payloads/OpenReportEventDialogPayload.ts rename to apps/web/src/dispatcher/payloads/OpenReportEventDialogPayload.ts diff --git a/src/dispatcher/payloads/OpenSpacePreferencesPayload.ts b/apps/web/src/dispatcher/payloads/OpenSpacePreferencesPayload.ts similarity index 100% rename from src/dispatcher/payloads/OpenSpacePreferencesPayload.ts rename to apps/web/src/dispatcher/payloads/OpenSpacePreferencesPayload.ts diff --git a/src/dispatcher/payloads/OpenSpaceSettingsPayload.ts b/apps/web/src/dispatcher/payloads/OpenSpaceSettingsPayload.ts similarity index 100% rename from src/dispatcher/payloads/OpenSpaceSettingsPayload.ts rename to apps/web/src/dispatcher/payloads/OpenSpaceSettingsPayload.ts diff --git a/src/dispatcher/payloads/OpenSpotlightPayload.ts b/apps/web/src/dispatcher/payloads/OpenSpotlightPayload.ts similarity index 100% rename from src/dispatcher/payloads/OpenSpotlightPayload.ts rename to apps/web/src/dispatcher/payloads/OpenSpotlightPayload.ts diff --git a/src/dispatcher/payloads/OpenToTabPayload.ts b/apps/web/src/dispatcher/payloads/OpenToTabPayload.ts similarity index 100% rename from src/dispatcher/payloads/OpenToTabPayload.ts rename to apps/web/src/dispatcher/payloads/OpenToTabPayload.ts diff --git a/src/dispatcher/payloads/OverwriteLoginPayload.ts b/apps/web/src/dispatcher/payloads/OverwriteLoginPayload.ts similarity index 100% rename from src/dispatcher/payloads/OverwriteLoginPayload.ts rename to apps/web/src/dispatcher/payloads/OverwriteLoginPayload.ts diff --git a/src/dispatcher/payloads/RecheckThemePayload.ts b/apps/web/src/dispatcher/payloads/RecheckThemePayload.ts similarity index 100% rename from src/dispatcher/payloads/RecheckThemePayload.ts rename to apps/web/src/dispatcher/payloads/RecheckThemePayload.ts diff --git a/src/dispatcher/payloads/SettingUpdatedPayload.ts b/apps/web/src/dispatcher/payloads/SettingUpdatedPayload.ts similarity index 100% rename from src/dispatcher/payloads/SettingUpdatedPayload.ts rename to apps/web/src/dispatcher/payloads/SettingUpdatedPayload.ts diff --git a/src/dispatcher/payloads/SharePayload.ts b/apps/web/src/dispatcher/payloads/SharePayload.ts similarity index 100% rename from src/dispatcher/payloads/SharePayload.ts rename to apps/web/src/dispatcher/payloads/SharePayload.ts diff --git a/src/dispatcher/payloads/ShowThreadPayload.ts b/apps/web/src/dispatcher/payloads/ShowThreadPayload.ts similarity index 100% rename from src/dispatcher/payloads/ShowThreadPayload.ts rename to apps/web/src/dispatcher/payloads/ShowThreadPayload.ts diff --git a/src/dispatcher/payloads/SubmitAskToJoinPayload.ts b/apps/web/src/dispatcher/payloads/SubmitAskToJoinPayload.ts similarity index 100% rename from src/dispatcher/payloads/SubmitAskToJoinPayload.ts rename to apps/web/src/dispatcher/payloads/SubmitAskToJoinPayload.ts diff --git a/src/dispatcher/payloads/SwitchSpacePayload.ts b/apps/web/src/dispatcher/payloads/SwitchSpacePayload.ts similarity index 100% rename from src/dispatcher/payloads/SwitchSpacePayload.ts rename to apps/web/src/dispatcher/payloads/SwitchSpacePayload.ts diff --git a/src/dispatcher/payloads/ThreadPayload.ts b/apps/web/src/dispatcher/payloads/ThreadPayload.ts similarity index 100% rename from src/dispatcher/payloads/ThreadPayload.ts rename to apps/web/src/dispatcher/payloads/ThreadPayload.ts diff --git a/src/dispatcher/payloads/UpdateFontSizeDeltaPayload.ts b/apps/web/src/dispatcher/payloads/UpdateFontSizeDeltaPayload.ts similarity index 100% rename from src/dispatcher/payloads/UpdateFontSizeDeltaPayload.ts rename to apps/web/src/dispatcher/payloads/UpdateFontSizeDeltaPayload.ts diff --git a/src/dispatcher/payloads/UpdateSystemFontPayload.ts b/apps/web/src/dispatcher/payloads/UpdateSystemFontPayload.ts similarity index 100% rename from src/dispatcher/payloads/UpdateSystemFontPayload.ts rename to apps/web/src/dispatcher/payloads/UpdateSystemFontPayload.ts diff --git a/src/dispatcher/payloads/UploadPayload.ts b/apps/web/src/dispatcher/payloads/UploadPayload.ts similarity index 100% rename from src/dispatcher/payloads/UploadPayload.ts rename to apps/web/src/dispatcher/payloads/UploadPayload.ts diff --git a/src/dispatcher/payloads/ViewHomePagePayload.ts b/apps/web/src/dispatcher/payloads/ViewHomePagePayload.ts similarity index 100% rename from src/dispatcher/payloads/ViewHomePagePayload.ts rename to apps/web/src/dispatcher/payloads/ViewHomePagePayload.ts diff --git a/src/dispatcher/payloads/ViewRoomDeltaPayload.ts b/apps/web/src/dispatcher/payloads/ViewRoomDeltaPayload.ts similarity index 100% rename from src/dispatcher/payloads/ViewRoomDeltaPayload.ts rename to apps/web/src/dispatcher/payloads/ViewRoomDeltaPayload.ts diff --git a/src/dispatcher/payloads/ViewRoomErrorPayload.ts b/apps/web/src/dispatcher/payloads/ViewRoomErrorPayload.ts similarity index 100% rename from src/dispatcher/payloads/ViewRoomErrorPayload.ts rename to apps/web/src/dispatcher/payloads/ViewRoomErrorPayload.ts diff --git a/src/dispatcher/payloads/ViewRoomPayload.ts b/apps/web/src/dispatcher/payloads/ViewRoomPayload.ts similarity index 100% rename from src/dispatcher/payloads/ViewRoomPayload.ts rename to apps/web/src/dispatcher/payloads/ViewRoomPayload.ts diff --git a/src/dispatcher/payloads/ViewStartChatOrReusePayload.ts b/apps/web/src/dispatcher/payloads/ViewStartChatOrReusePayload.ts similarity index 100% rename from src/dispatcher/payloads/ViewStartChatOrReusePayload.ts rename to apps/web/src/dispatcher/payloads/ViewStartChatOrReusePayload.ts diff --git a/src/dispatcher/payloads/ViewUserPayload.ts b/apps/web/src/dispatcher/payloads/ViewUserPayload.ts similarity index 100% rename from src/dispatcher/payloads/ViewUserPayload.ts rename to apps/web/src/dispatcher/payloads/ViewUserPayload.ts diff --git a/src/editor/autocomplete.ts b/apps/web/src/editor/autocomplete.ts similarity index 100% rename from src/editor/autocomplete.ts rename to apps/web/src/editor/autocomplete.ts diff --git a/src/editor/caret.ts b/apps/web/src/editor/caret.ts similarity index 100% rename from src/editor/caret.ts rename to apps/web/src/editor/caret.ts diff --git a/src/editor/commands.tsx b/apps/web/src/editor/commands.tsx similarity index 100% rename from src/editor/commands.tsx rename to apps/web/src/editor/commands.tsx diff --git a/src/editor/deserialize.ts b/apps/web/src/editor/deserialize.ts similarity index 100% rename from src/editor/deserialize.ts rename to apps/web/src/editor/deserialize.ts diff --git a/src/editor/diff.ts b/apps/web/src/editor/diff.ts similarity index 100% rename from src/editor/diff.ts rename to apps/web/src/editor/diff.ts diff --git a/src/editor/dom.ts b/apps/web/src/editor/dom.ts similarity index 100% rename from src/editor/dom.ts rename to apps/web/src/editor/dom.ts diff --git a/src/editor/history.ts b/apps/web/src/editor/history.ts similarity index 100% rename from src/editor/history.ts rename to apps/web/src/editor/history.ts diff --git a/src/editor/model.ts b/apps/web/src/editor/model.ts similarity index 100% rename from src/editor/model.ts rename to apps/web/src/editor/model.ts diff --git a/src/editor/offset.ts b/apps/web/src/editor/offset.ts similarity index 100% rename from src/editor/offset.ts rename to apps/web/src/editor/offset.ts diff --git a/src/editor/operations.ts b/apps/web/src/editor/operations.ts similarity index 100% rename from src/editor/operations.ts rename to apps/web/src/editor/operations.ts diff --git a/src/editor/parts.ts b/apps/web/src/editor/parts.ts similarity index 100% rename from src/editor/parts.ts rename to apps/web/src/editor/parts.ts diff --git a/src/editor/position.ts b/apps/web/src/editor/position.ts similarity index 100% rename from src/editor/position.ts rename to apps/web/src/editor/position.ts diff --git a/src/editor/range.ts b/apps/web/src/editor/range.ts similarity index 100% rename from src/editor/range.ts rename to apps/web/src/editor/range.ts diff --git a/src/editor/render.ts b/apps/web/src/editor/render.ts similarity index 100% rename from src/editor/render.ts rename to apps/web/src/editor/render.ts diff --git a/src/editor/serialize.ts b/apps/web/src/editor/serialize.ts similarity index 100% rename from src/editor/serialize.ts rename to apps/web/src/editor/serialize.ts diff --git a/src/effects/ICanvasEffect.ts b/apps/web/src/effects/ICanvasEffect.ts similarity index 100% rename from src/effects/ICanvasEffect.ts rename to apps/web/src/effects/ICanvasEffect.ts diff --git a/src/effects/confetti/index.ts b/apps/web/src/effects/confetti/index.ts similarity index 100% rename from src/effects/confetti/index.ts rename to apps/web/src/effects/confetti/index.ts diff --git a/src/effects/effect.ts b/apps/web/src/effects/effect.ts similarity index 100% rename from src/effects/effect.ts rename to apps/web/src/effects/effect.ts diff --git a/src/effects/fireworks/index.ts b/apps/web/src/effects/fireworks/index.ts similarity index 100% rename from src/effects/fireworks/index.ts rename to apps/web/src/effects/fireworks/index.ts diff --git a/src/effects/hearts/index.ts b/apps/web/src/effects/hearts/index.ts similarity index 100% rename from src/effects/hearts/index.ts rename to apps/web/src/effects/hearts/index.ts diff --git a/src/effects/index.ts b/apps/web/src/effects/index.ts similarity index 100% rename from src/effects/index.ts rename to apps/web/src/effects/index.ts diff --git a/src/effects/rainfall/index.ts b/apps/web/src/effects/rainfall/index.ts similarity index 100% rename from src/effects/rainfall/index.ts rename to apps/web/src/effects/rainfall/index.ts diff --git a/src/effects/snowfall/index.ts b/apps/web/src/effects/snowfall/index.ts similarity index 100% rename from src/effects/snowfall/index.ts rename to apps/web/src/effects/snowfall/index.ts diff --git a/src/effects/spaceinvaders/index.ts b/apps/web/src/effects/spaceinvaders/index.ts similarity index 100% rename from src/effects/spaceinvaders/index.ts rename to apps/web/src/effects/spaceinvaders/index.ts diff --git a/src/effects/utils.ts b/apps/web/src/effects/utils.ts similarity index 100% rename from src/effects/utils.ts rename to apps/web/src/effects/utils.ts diff --git a/src/email.ts b/apps/web/src/email.ts similarity index 100% rename from src/email.ts rename to apps/web/src/email.ts diff --git a/src/emojipicker/recent.ts b/apps/web/src/emojipicker/recent.ts similarity index 100% rename from src/emojipicker/recent.ts rename to apps/web/src/emojipicker/recent.ts diff --git a/src/events/EventTileFactory.tsx b/apps/web/src/events/EventTileFactory.tsx similarity index 95% rename from src/events/EventTileFactory.tsx rename to apps/web/src/events/EventTileFactory.tsx index 3c3735ab81..41286c5075 100644 --- a/src/events/EventTileFactory.tsx +++ b/apps/web/src/events/EventTileFactory.tsx @@ -17,7 +17,11 @@ import { M_POLL_END, M_POLL_START, } from "matrix-js-sdk/src/matrix"; -import { TextualEventView } from "@element-hq/web-shared-components"; +import { + EncryptionEventView, + TextualEventView, + useCreateAutoDisposedViewModel, +} from "@element-hq/web-shared-components"; import SettingsStore from "../settings/SettingsStore"; import type LegacyCallEventGrouper from "../components/structures/LegacyCallEventGrouper"; @@ -26,12 +30,12 @@ import { TimelineRenderingType } from "../contexts/RoomContext"; import MessageEvent from "../components/views/messages/MessageEvent"; import LegacyCallEvent from "../components/views/messages/LegacyCallEvent"; import { CallEvent } from "../components/views/messages/CallEvent"; -import EncryptionEvent from "../components/views/messages/EncryptionEvent"; import { RoomPredecessorTile } from "../components/views/messages/RoomPredecessorTile"; import RoomAvatarEvent from "../components/views/messages/RoomAvatarEvent"; import { WIDGET_LAYOUT_EVENT_TYPE } from "../stores/widgets/WidgetLayoutStore"; import { ALL_RULE_TYPES } from "../mjolnir/BanList"; import { MatrixClientPeg } from "../MatrixClientPeg"; +import { useMatrixClientContext } from "../contexts/MatrixClientContext"; import MKeyVerificationRequest from "../components/views/messages/MKeyVerificationRequest"; import { WidgetType } from "../widgets/WidgetType"; import MJitsiWidgetEvent from "../components/views/messages/MJitsiWidgetEvent"; @@ -42,6 +46,7 @@ import ViewSourceEvent from "../components/views/messages/ViewSourceEvent"; import { shouldDisplayAsBeaconTile } from "../utils/beacon/timeline"; import { type IBodyProps } from "../components/views/messages/IBodyProps"; import { ModuleApi } from "../modules/Api"; +import { EncryptionEventViewModel } from "../viewmodels/event-tiles/EncryptionEventViewModel"; import { TextualEventViewModel } from "../viewmodels/event-tiles/TextualEventViewModel"; import { ElementCallEventType } from "../call-types"; @@ -80,6 +85,14 @@ export const TextualEventFactory: Factory = (ref, props) => { const vm = new TextualEventViewModel(props); return ; }; +function EncryptionEventWrappedView({ mxEvent, ref }: IBodyProps): JSX.Element { + const cli = useMatrixClientContext(); + const vm = useCreateAutoDisposedViewModel(() => new EncryptionEventViewModel({ mxEvent, cli })); + return ; +} +const EncryptionEventFactory: Factory = (ref, props) => { + return ; +}; const VerificationReqFactory: Factory = (_ref, props) => ; const HiddenEventFactory: Factory = (ref, props) => ; @@ -99,7 +112,7 @@ const EVENT_TILE_TYPES = new Map([ ]); const STATE_EVENT_TILE_TYPES = new Map([ - [EventType.RoomEncryption, (ref, props) => ], + [EventType.RoomEncryption, EncryptionEventFactory], [EventType.RoomCanonicalAlias, TextualEventFactory], [EventType.RoomCreate, RoomCreateEventFactory], [EventType.RoomMember, TextualEventFactory], diff --git a/src/events/RelationsHelper.ts b/apps/web/src/events/RelationsHelper.ts similarity index 100% rename from src/events/RelationsHelper.ts rename to apps/web/src/events/RelationsHelper.ts diff --git a/src/events/forward/getForwardableEvent.ts b/apps/web/src/events/forward/getForwardableEvent.ts similarity index 100% rename from src/events/forward/getForwardableEvent.ts rename to apps/web/src/events/forward/getForwardableEvent.ts diff --git a/src/events/index.ts b/apps/web/src/events/index.ts similarity index 100% rename from src/events/index.ts rename to apps/web/src/events/index.ts diff --git a/src/events/location/getShareableLocationEvent.ts b/apps/web/src/events/location/getShareableLocationEvent.ts similarity index 100% rename from src/events/location/getShareableLocationEvent.ts rename to apps/web/src/events/location/getShareableLocationEvent.ts diff --git a/src/favicon.ts b/apps/web/src/favicon.ts similarity index 100% rename from src/favicon.ts rename to apps/web/src/favicon.ts diff --git a/src/hooks/right-panel/useCurrentPhase.ts b/apps/web/src/hooks/right-panel/useCurrentPhase.ts similarity index 100% rename from src/hooks/right-panel/useCurrentPhase.ts rename to apps/web/src/hooks/right-panel/useCurrentPhase.ts diff --git a/src/hooks/room/useGuestAccessInformation.ts b/apps/web/src/hooks/room/useGuestAccessInformation.ts similarity index 100% rename from src/hooks/room/useGuestAccessInformation.ts rename to apps/web/src/hooks/room/useGuestAccessInformation.ts diff --git a/src/hooks/room/useRoomCall.tsx b/apps/web/src/hooks/room/useRoomCall.tsx similarity index 98% rename from src/hooks/room/useRoomCall.tsx rename to apps/web/src/hooks/room/useRoomCall.tsx index 5d7784ed84..7c214bd019 100644 --- a/src/hooks/room/useRoomCall.tsx +++ b/apps/web/src/hooks/room/useRoomCall.tsx @@ -93,9 +93,9 @@ export const useRoomCall = ( room: Room | LocalRoom, ): { voiceCallDisabledReason: string | null; - voiceCallClick(evt: React.MouseEvent | undefined, selectedType: PlatformCallType): void; + voiceCallClick(this: void, evt: React.MouseEvent | undefined, selectedType: PlatformCallType): void; videoCallDisabledReason: string | null; - videoCallClick(evt: React.MouseEvent | undefined, selectedType: PlatformCallType): void; + videoCallClick(this: void, evt: React.MouseEvent | undefined, selectedType: PlatformCallType): void; toggleCallMaximized: () => void; isViewingCall: boolean; isConnectedToCall: boolean; diff --git a/src/hooks/room/useRoomIdName.ts b/apps/web/src/hooks/room/useRoomIdName.ts similarity index 100% rename from src/hooks/room/useRoomIdName.ts rename to apps/web/src/hooks/room/useRoomIdName.ts diff --git a/src/hooks/room/useRoomMemberProfile.ts b/apps/web/src/hooks/room/useRoomMemberProfile.ts similarity index 100% rename from src/hooks/room/useRoomMemberProfile.ts rename to apps/web/src/hooks/room/useRoomMemberProfile.ts diff --git a/src/hooks/room/useRoomThreadNotifications.ts b/apps/web/src/hooks/room/useRoomThreadNotifications.ts similarity index 100% rename from src/hooks/room/useRoomThreadNotifications.ts rename to apps/web/src/hooks/room/useRoomThreadNotifications.ts diff --git a/src/hooks/room/useTopic.ts b/apps/web/src/hooks/room/useTopic.ts similarity index 100% rename from src/hooks/room/useTopic.ts rename to apps/web/src/hooks/room/useTopic.ts diff --git a/src/hooks/spotlight/useDebouncedCallback.ts b/apps/web/src/hooks/spotlight/useDebouncedCallback.ts similarity index 100% rename from src/hooks/spotlight/useDebouncedCallback.ts rename to apps/web/src/hooks/spotlight/useDebouncedCallback.ts diff --git a/src/hooks/spotlight/useRecentSearches.ts b/apps/web/src/hooks/spotlight/useRecentSearches.ts similarity index 100% rename from src/hooks/spotlight/useRecentSearches.ts rename to apps/web/src/hooks/spotlight/useRecentSearches.ts diff --git a/src/hooks/useAccountData.ts b/apps/web/src/hooks/useAccountData.ts similarity index 100% rename from src/hooks/useAccountData.ts rename to apps/web/src/hooks/useAccountData.ts diff --git a/src/hooks/useAnimation.ts b/apps/web/src/hooks/useAnimation.ts similarity index 100% rename from src/hooks/useAnimation.ts rename to apps/web/src/hooks/useAnimation.ts diff --git a/src/hooks/useAsyncMemo.ts b/apps/web/src/hooks/useAsyncMemo.ts similarity index 100% rename from src/hooks/useAsyncMemo.ts rename to apps/web/src/hooks/useAsyncMemo.ts diff --git a/src/hooks/useAsyncRefreshMemo.ts b/apps/web/src/hooks/useAsyncRefreshMemo.ts similarity index 100% rename from src/hooks/useAsyncRefreshMemo.ts rename to apps/web/src/hooks/useAsyncRefreshMemo.ts diff --git a/src/hooks/useCall.ts b/apps/web/src/hooks/useCall.ts similarity index 100% rename from src/hooks/useCall.ts rename to apps/web/src/hooks/useCall.ts diff --git a/src/hooks/useDispatcher.ts b/apps/web/src/hooks/useDispatcher.ts similarity index 100% rename from src/hooks/useDispatcher.ts rename to apps/web/src/hooks/useDispatcher.ts diff --git a/src/hooks/useDownloadMedia.ts b/apps/web/src/hooks/useDownloadMedia.ts similarity index 100% rename from src/hooks/useDownloadMedia.ts rename to apps/web/src/hooks/useDownloadMedia.ts diff --git a/src/hooks/useEncryptionStatus.ts b/apps/web/src/hooks/useEncryptionStatus.ts similarity index 100% rename from src/hooks/useEncryptionStatus.ts rename to apps/web/src/hooks/useEncryptionStatus.ts diff --git a/src/hooks/useEventEmitter.ts b/apps/web/src/hooks/useEventEmitter.ts similarity index 100% rename from src/hooks/useEventEmitter.ts rename to apps/web/src/hooks/useEventEmitter.ts diff --git a/src/hooks/useFocus.ts b/apps/web/src/hooks/useFocus.ts similarity index 100% rename from src/hooks/useFocus.ts rename to apps/web/src/hooks/useFocus.ts diff --git a/src/hooks/useGlobalNotificationState.ts b/apps/web/src/hooks/useGlobalNotificationState.ts similarity index 100% rename from src/hooks/useGlobalNotificationState.ts rename to apps/web/src/hooks/useGlobalNotificationState.ts diff --git a/src/hooks/useHover.ts b/apps/web/src/hooks/useHover.ts similarity index 100% rename from src/hooks/useHover.ts rename to apps/web/src/hooks/useHover.ts diff --git a/src/hooks/useIsEncrypted.ts b/apps/web/src/hooks/useIsEncrypted.ts similarity index 100% rename from src/hooks/useIsEncrypted.ts rename to apps/web/src/hooks/useIsEncrypted.ts diff --git a/src/hooks/useIsReleaseAnnouncementOpen.ts b/apps/web/src/hooks/useIsReleaseAnnouncementOpen.ts similarity index 100% rename from src/hooks/useIsReleaseAnnouncementOpen.ts rename to apps/web/src/hooks/useIsReleaseAnnouncementOpen.ts diff --git a/src/hooks/useLatestResult.ts b/apps/web/src/hooks/useLatestResult.ts similarity index 100% rename from src/hooks/useLatestResult.ts rename to apps/web/src/hooks/useLatestResult.ts diff --git a/src/hooks/useLocalEcho.ts b/apps/web/src/hooks/useLocalEcho.ts similarity index 100% rename from src/hooks/useLocalEcho.ts rename to apps/web/src/hooks/useLocalEcho.ts diff --git a/src/hooks/useLocalStorageState.ts b/apps/web/src/hooks/useLocalStorageState.ts similarity index 100% rename from src/hooks/useLocalStorageState.ts rename to apps/web/src/hooks/useLocalStorageState.ts diff --git a/src/hooks/useMediaVisible.ts b/apps/web/src/hooks/useMediaVisible.ts similarity index 100% rename from src/hooks/useMediaVisible.ts rename to apps/web/src/hooks/useMediaVisible.ts diff --git a/src/hooks/useNotificationSettings.tsx b/apps/web/src/hooks/useNotificationSettings.tsx similarity index 100% rename from src/hooks/useNotificationSettings.tsx rename to apps/web/src/hooks/useNotificationSettings.tsx diff --git a/src/hooks/usePermalink.ts b/apps/web/src/hooks/usePermalink.ts similarity index 100% rename from src/hooks/usePermalink.ts rename to apps/web/src/hooks/usePermalink.ts diff --git a/src/hooks/usePermalinkEvent.ts b/apps/web/src/hooks/usePermalinkEvent.ts similarity index 100% rename from src/hooks/usePermalinkEvent.ts rename to apps/web/src/hooks/usePermalinkEvent.ts diff --git a/src/hooks/usePermalinkMember.ts b/apps/web/src/hooks/usePermalinkMember.ts similarity index 100% rename from src/hooks/usePermalinkMember.ts rename to apps/web/src/hooks/usePermalinkMember.ts diff --git a/src/hooks/usePermalinkTargetRoom.ts b/apps/web/src/hooks/usePermalinkTargetRoom.ts similarity index 100% rename from src/hooks/usePermalinkTargetRoom.ts rename to apps/web/src/hooks/usePermalinkTargetRoom.ts diff --git a/src/hooks/usePinnedEvents.ts b/apps/web/src/hooks/usePinnedEvents.ts similarity index 100% rename from src/hooks/usePinnedEvents.ts rename to apps/web/src/hooks/usePinnedEvents.ts diff --git a/src/hooks/useProfileInfo.ts b/apps/web/src/hooks/useProfileInfo.ts similarity index 96% rename from src/hooks/useProfileInfo.ts rename to apps/web/src/hooks/useProfileInfo.ts index 45500fac69..d0cfd4ab28 100644 --- a/src/hooks/useProfileInfo.ts +++ b/apps/web/src/hooks/useProfileInfo.ts @@ -25,7 +25,7 @@ export const useProfileInfo = (): { ready: boolean; loading: boolean; profile: IProfileInfo | null; - search(opts: IProfileInfoOpts): Promise; + search(this: void, opts: IProfileInfoOpts): Promise; } => { const [profile, setProfile] = useState(null); diff --git a/src/hooks/usePublicRoomDirectory.ts b/apps/web/src/hooks/usePublicRoomDirectory.ts similarity index 97% rename from src/hooks/usePublicRoomDirectory.ts rename to apps/web/src/hooks/usePublicRoomDirectory.ts index 530e61e070..dd6cd3382d 100644 --- a/src/hooks/usePublicRoomDirectory.ts +++ b/apps/web/src/hooks/usePublicRoomDirectory.ts @@ -44,8 +44,8 @@ export const usePublicRoomDirectory = (): { publicRooms: IPublicRoomsChunkRoom[]; protocols: Protocols | null; config?: IPublicRoomDirectoryConfig | null; - setConfig(config: IPublicRoomDirectoryConfig | null): void; - search(opts: IPublicRoomsOpts): Promise; + setConfig(this: void, config: IPublicRoomDirectoryConfig | null): void; + search(this: void, opts: IPublicRoomsOpts): Promise; error?: Error | true; // true if an unknown error is encountered } => { const [publicRooms, setPublicRooms] = useState([]); diff --git a/src/hooks/usePushers.ts b/apps/web/src/hooks/usePushers.ts similarity index 100% rename from src/hooks/usePushers.ts rename to apps/web/src/hooks/usePushers.ts diff --git a/src/hooks/useRoomMembers.ts b/apps/web/src/hooks/useRoomMembers.ts similarity index 100% rename from src/hooks/useRoomMembers.ts rename to apps/web/src/hooks/useRoomMembers.ts diff --git a/src/hooks/useRoomName.ts b/apps/web/src/hooks/useRoomName.ts similarity index 100% rename from src/hooks/useRoomName.ts rename to apps/web/src/hooks/useRoomName.ts diff --git a/src/hooks/useRoomNotificationState.ts b/apps/web/src/hooks/useRoomNotificationState.ts similarity index 100% rename from src/hooks/useRoomNotificationState.ts rename to apps/web/src/hooks/useRoomNotificationState.ts diff --git a/src/hooks/useRoomState.ts b/apps/web/src/hooks/useRoomState.ts similarity index 100% rename from src/hooks/useRoomState.ts rename to apps/web/src/hooks/useRoomState.ts diff --git a/src/hooks/useSettings.ts b/apps/web/src/hooks/useSettings.ts similarity index 100% rename from src/hooks/useSettings.ts rename to apps/web/src/hooks/useSettings.ts diff --git a/src/hooks/useSmoothAnimation.ts b/apps/web/src/hooks/useSmoothAnimation.ts similarity index 100% rename from src/hooks/useSmoothAnimation.ts rename to apps/web/src/hooks/useSmoothAnimation.ts diff --git a/src/hooks/useSpaceResults.ts b/apps/web/src/hooks/useSpaceResults.ts similarity index 100% rename from src/hooks/useSpaceResults.ts rename to apps/web/src/hooks/useSpaceResults.ts diff --git a/src/hooks/useStateArray.ts b/apps/web/src/hooks/useStateArray.ts similarity index 100% rename from src/hooks/useStateArray.ts rename to apps/web/src/hooks/useStateArray.ts diff --git a/src/hooks/useStateCallback.ts b/apps/web/src/hooks/useStateCallback.ts similarity index 100% rename from src/hooks/useStateCallback.ts rename to apps/web/src/hooks/useStateCallback.ts diff --git a/src/hooks/useStateToggle.ts b/apps/web/src/hooks/useStateToggle.ts similarity index 100% rename from src/hooks/useStateToggle.ts rename to apps/web/src/hooks/useStateToggle.ts diff --git a/src/hooks/useTheme.ts b/apps/web/src/hooks/useTheme.ts similarity index 100% rename from src/hooks/useTheme.ts rename to apps/web/src/hooks/useTheme.ts diff --git a/src/hooks/useThreepids.ts b/apps/web/src/hooks/useThreepids.ts similarity index 100% rename from src/hooks/useThreepids.ts rename to apps/web/src/hooks/useThreepids.ts diff --git a/src/hooks/useTimeout.ts b/apps/web/src/hooks/useTimeout.ts similarity index 100% rename from src/hooks/useTimeout.ts rename to apps/web/src/hooks/useTimeout.ts diff --git a/src/hooks/useTimeoutToggle.ts b/apps/web/src/hooks/useTimeoutToggle.ts similarity index 97% rename from src/hooks/useTimeoutToggle.ts rename to apps/web/src/hooks/useTimeoutToggle.ts index 91e0452da5..c1da8e8697 100644 --- a/src/hooks/useTimeoutToggle.ts +++ b/apps/web/src/hooks/useTimeoutToggle.ts @@ -19,7 +19,7 @@ export const useTimeoutToggle = ( timeoutMs: number, ): { value: boolean; - toggle(): void; + toggle(this: void): void; } => { const timeoutId = useRef(undefined); const [value, setValue] = useState(defaultValue); diff --git a/src/hooks/useUnreadNotifications.ts b/apps/web/src/hooks/useUnreadNotifications.ts similarity index 100% rename from src/hooks/useUnreadNotifications.ts rename to apps/web/src/hooks/useUnreadNotifications.ts diff --git a/src/hooks/useUserDirectory.ts b/apps/web/src/hooks/useUserDirectory.ts similarity index 96% rename from src/hooks/useUserDirectory.ts rename to apps/web/src/hooks/useUserDirectory.ts index 8599b2488a..6324e06f13 100644 --- a/src/hooks/useUserDirectory.ts +++ b/apps/web/src/hooks/useUserDirectory.ts @@ -21,7 +21,7 @@ export const useUserDirectory = (): { ready: boolean; loading: boolean; users: DirectoryMember[]; - search(opts: IUserDirectoryOpts): Promise; + search(this: void, opts: IUserDirectoryOpts): Promise; } => { const [users, setUsers] = useState([]); diff --git a/src/hooks/useUserTimezone.ts b/apps/web/src/hooks/useUserTimezone.ts similarity index 100% rename from src/hooks/useUserTimezone.ts rename to apps/web/src/hooks/useUserTimezone.ts diff --git a/src/hooks/useWindowWidth.ts b/apps/web/src/hooks/useWindowWidth.ts similarity index 100% rename from src/hooks/useWindowWidth.ts rename to apps/web/src/hooks/useWindowWidth.ts diff --git a/src/i18n/strings/cs.json b/apps/web/src/i18n/strings/cs.json similarity index 99% rename from src/i18n/strings/cs.json rename to apps/web/src/i18n/strings/cs.json index 709fc13629..b8986afb77 100644 --- a/src/i18n/strings/cs.json +++ b/apps/web/src/i18n/strings/cs.json @@ -482,7 +482,6 @@ "email_address": "E-mailová adresa", "emoji": "Emoji", "encrypted": "Šifrováno", - "encryption_enabled": "Šifrování je zapnuté", "error": "Chyba", "faq": "Často kladené dotazy (FAQ)", "favourites": "Oblíbené", @@ -3044,11 +3043,13 @@ "connection_section": "Připojení", "dialog_title": "Nastavení: Hlas a video", "echo_cancellation": "Potlačení ozvěny", + "echo_cancellation_description": "Odstraňuje ozvěnu z mikrofonu během hovorů. Toto nastavení se vztahuje také na Element Call.", "enable_fallback_ice_server": "Povolit záložní asistenční server hovorů (%(server)s)", "enable_fallback_ice_server_description": "Platí pouze v případě, že váš domovský server tuto možnost nenabízí. Vaše IP adresa bude během hovoru sdílena.", "mirror_local_feed": "Zrcadlit lokání video", "missing_permissions_prompt": "Pro práci se zvukem a videem je potřeba oprávnění. Klepněte na tlačítko a my o ně požádáme.", "noise_suppression": "Potlačení hluku", + "noise_suppression_description": "Snižuje šum na pozadí ve vstupu mikrofonu během hovorů. Toto nastavení se vztahuje také na Element Call.", "request_permissions": "Požádat o oprávnění k mikrofonu a kameře", "title": "Zvuk a video", "video_input_empty": "Nerozpoznány žádné webkamery", @@ -3466,16 +3467,6 @@ "unknown_predecessor": "Nepodařilo se najít starou verzi této místnosti (ID místnosti: %(roomId)s), a nebyl poskytnut parametr 'via_servers', který by umožnil její vyhledání.", "unknown_predecessor_guess_server": "Nepodařilo se najít starou verzi této místnosti (ID místnosti: %(roomId)s), a nebyl poskytnut parametr 'via_servers', který by umožnil její vyhledání. Je možné, že odhad serveru z ID místnosti bude fungovat. Pokud to chcete zkusit, klikněte na tento odkaz:" }, - "m.room.encryption": { - "disable_attempt": "Ignorovaný pokus o deaktivaci šifrování", - "disabled": "Šifrování je vypnuté", - "enabled": "Zprávy v této místnosti jsou koncově šifrovány. Když lidé vstoupí, můžete je ověřit v jejich profilu, stačí klepnout na jejich profilový obrázek.", - "enabled_dm": "Zprávy jsou zde koncově šifrovány. Ověřte %(displayName)s v jeho profilu - klepněte na jeho profilový obrázek.", - "enabled_local": "Zprávy v této místnosti budou koncově šifrovány.", - "parameters_changed": "Byly změněny některé parametry šifrování.", - "state_enabled": "Zprávy a události v této místnosti jsou koncově šifrovány. Když se lidé připojí, můžete je ověřit v jejich profilu, stačí klepnout na jejich profilový obrázek.", - "unsupported": "Šifrování používané v této místnosti není podporované." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s povolil(a) přístup hostům.", "forbidden": "%(senderDisplayName)s zakázal(a) přístup hostům.", @@ -3569,8 +3560,6 @@ "label": "Akce zprávy", "view_in_room": "Zobrazit v místnosti" }, - "message_timestamp_received_at": "Obnoveno v:%(dateTime)s", - "message_timestamp_sent_at": "Odesláno v: %(dateTime)s", "mjolnir": { "changed_rule_glob": "%(senderName)s změnil(a) blokovací pravidlo odpovídající %(oldGlob)s na odpovídající %(newGlob)s z důvodu %(reason)s", "changed_rule_rooms": "%(senderName)s změnil(a) pravidlo blokující místnosti odpovídající %(oldGlob)s na místnosti odpovídající %(newGlob)s z důvodu %(reason)s", diff --git a/src/i18n/strings/cy.json b/apps/web/src/i18n/strings/cy.json similarity index 99% rename from src/i18n/strings/cy.json rename to apps/web/src/i18n/strings/cy.json index a7a64e507d..414ec0585e 100644 --- a/src/i18n/strings/cy.json +++ b/apps/web/src/i18n/strings/cy.json @@ -485,7 +485,6 @@ "email_address": "Cyfeiriad e-bost", "emoji": "Emoji", "encrypted": "Wedi'i amgryptio", - "encryption_enabled": "Amgryptio wedi'i alluogi", "error": "Gwall", "faq": "Cwestiynau Cyffredin", "favourites": "Ffefrynnau", @@ -3461,16 +3460,6 @@ "unknown_predecessor": "Methu â dod o hyd i'r hen fersiwn o'r ystafell hon (ID ystafell: %(roomId)s), ac nid ydym wedi cael 'via_servers' i chwilio amdano.", "unknown_predecessor_guess_server": "Methu â dod o hyd i'r hen fersiwn o'r ystafell hon (ID ystafell: %(roomId)s), ac nid ydym wedi cael 'via_servers' i chwilio amdano. Mae'n bosibl y bydd dyfalu'r gweinydd o ID yr ystafell yn gweithio. Os ydych chi eisiau ceisio, cliciwch ar y ddolen hon:" }, - "m.room.encryption": { - "disable_attempt": "Wedi anwybyddu ymgais i analluogi amgryptio", - "disabled": "Nid yw amgryptio wedi'i alluogi", - "enabled": "Mae negeseuon yn yr ystafell hon wedi'u hamgryptio pen-i-ben. Pan fydd pobl yn ymuno, gallwch chi eu gwirio yn eu proffil, dim ond tapio ar eu llun proffil.", - "enabled_dm": "Mae negeseuon yma wedi'u hamgryptio o'r dechrau i'r diwedd. Dilyswch %(displayName)s yn eu proffil - tapiwch ar eu llun proffil.", - "enabled_local": "Bydd negeseuon yn y sgwrs hon yn cael eu hamgryptio o'r dechrau i'r diwedd.", - "parameters_changed": "Mae rhai paramedrau amgryptio wedi'u newid.", - "state_enabled": "Mae negeseuon a digwyddiadau cyflwr yn yr ystafell hon wedi'u hamgryptio o'r dechrau i'r diwedd. Pan fydd pobl yn ymuno, gallwch eu gwirio yn eu proffil, dim ond tapio ar eu llun proffil.", - "unsupported": "Nid yw'r amgryptio sy'n cael ei ddefnyddiogan yr ystafell hon yn cael ei gefnogi." - }, "m.room.guest_access": { "can_join": "Mae %(senderDisplayName)s wedi caniatáu i westeion ymuno â'r ystafell.", "forbidden": "Mae %(senderDisplayName)s wedi atal gwesteion rhag ymuno â'r ystafell.", @@ -3564,8 +3553,6 @@ "label": "Camau Gweithredu Neges", "view_in_room": "Golwg yn yr ystafell" }, - "message_timestamp_received_at": "Derbyniwyd am: %(dateTime)s", - "message_timestamp_sent_at": "Anfonwyd am: %(dateTime)s", "mjolnir": { "changed_rule_glob": "Mae %(senderName)s wedi diweddaru rheol gwahardd oedd yn cyfateb %(oldGlob)s i %(newGlob)s ar gyfer %(reason)s", "changed_rule_rooms": "Newidiodd %(senderName)s reol a oedd yn gwahardd ystafelloedd sy'n cyfateb i %(oldGlob)s i gyfateb %(newGlob)s am %(reason)s", diff --git a/src/i18n/strings/da.json b/apps/web/src/i18n/strings/da.json similarity index 99% rename from src/i18n/strings/da.json rename to apps/web/src/i18n/strings/da.json index 2e11d7e737..fbc3a79792 100644 --- a/src/i18n/strings/da.json +++ b/apps/web/src/i18n/strings/da.json @@ -454,7 +454,6 @@ "email_address": "E-mailadresse", "emoji": "Emoji", "encrypted": "Krypteret", - "encryption_enabled": "Kryptering aktiveret", "error": "Fejl", "faq": "Ofte stillede spørgsmål", "favourites": "Favoritter", @@ -2991,15 +2990,6 @@ "unknown_predecessor": "Kan ikke finde den gamle version af dette rum (rum-ID: %(roomId)s), og vi har ikke fået 'via_servers' til at kunne søge efter det med.", "unknown_predecessor_guess_server": "Kan ikke finde den gamle version af dette rum (rum-ID: %(roomId)s), og vi har ikke fået adgang til 'via_servers' for at kunne søge efter det. Det er muligt, at det vil fungere at gætte serveren ud fra rum-ID'et. Hvis du vil prøve, skal du klikke på dette link:" }, - "m.room.encryption": { - "disable_attempt": "Ignoreret forsøg på at deaktivere kryptering", - "disabled": "Kryptering er ikke aktiveret", - "enabled": "Beskeder i dette rum er end-to-end krypteret. Når folk tilmelder sig, kan du verificere dem via deres profil ved at trykke på deres profilbillede.", - "enabled_dm": "Beskeder her er end-to-end krypteret. Verificér %(displayName)s via deres profil – tryk på deres profilbillede.", - "enabled_local": "Beskeder i denne samtale vil blive krypteret fra ende til ende.", - "parameters_changed": "Nogle krypteringsparametre er blevet ændret.", - "unsupported": "Krypteringen, der bruges af dette rum, understøttes ikke." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s har givet gæster adgang til rummet.", "forbidden": "%(senderDisplayName)s har forhindret gæster i at tilgå rummet.", diff --git a/src/i18n/strings/de_DE.json b/apps/web/src/i18n/strings/de_DE.json similarity index 99% rename from src/i18n/strings/de_DE.json rename to apps/web/src/i18n/strings/de_DE.json index ff2d0cec75..17e0b39aaa 100644 --- a/src/i18n/strings/de_DE.json +++ b/apps/web/src/i18n/strings/de_DE.json @@ -482,7 +482,6 @@ "email_address": "E-Mail-Adresse", "emoji": "Emojis", "encrypted": "Verschlüsselt", - "encryption_enabled": "Verschlüsselung aktiviert", "error": "Fehler", "faq": "Häufige Fragen", "favourites": "Favoriten", @@ -3036,11 +3035,13 @@ "connection_section": "Verbindung", "dialog_title": "Einstellungen: Sprache und Video", "echo_cancellation": "Echounterdrückung", + "echo_cancellation_description": "Entfernt das Echo aus deinem Mikrofon während Anrufen. Diese Einstellung gilt auch für Element Call.", "enable_fallback_ice_server": "Ersatz-Anrufassistenz-Server erlauben (%(server)s)", "enable_fallback_ice_server_description": "Dieser wird nur verwendet, sollte dein Heim-Server keinen bieten. Deine IP-Adresse würde während eines Anrufs geteilt werden.", "mirror_local_feed": "Lokalen Video-Feed spiegeln", "missing_permissions_prompt": "Fehlende Medienberechtigungen, klicke auf die Schaltfläche unten, um sie anzufordern.", "noise_suppression": "Rauschreduzierung", + "noise_suppression_description": "Reduziert Hintergrundgeräusche in deinem Mikrofon während Anrufen. Diese Einstellung gilt auch für Element Call.", "request_permissions": "Medienberechtigungen anfordern", "title": "Anrufe", "video_input_empty": "Keine Webcam erkannt", @@ -3458,16 +3459,6 @@ "unknown_predecessor": "Die alte Version dieses Chats (ID: %(roomId)s) kann nicht gefunden werden. Es gibt auch keine „via_servers“ Information für eine Suche.", "unknown_predecessor_guess_server": "Die alte Version dieses Chats (ID: %(roomId)s) kann nicht gefunden werden. Es gibt auch keine „via_servers“ Information für eine Suche. Möglicherweise kann der Server auf Basis der ID erraten werden. Wenn du dies probieren möchtest, klicke diesen Link:" }, - "m.room.encryption": { - "disable_attempt": "Versuch, die Verschlüsselung zu deaktivieren, wurde ignoriert", - "disabled": "Verschlüsselung nicht aktiviert", - "enabled": "Nachrichten in diesem Chat sind Ende-zu-Ende-verschlüsselt. Wenn Personen beitreten, kannst du sie in ihrem Profil verifizieren, indem du auf deren Profilbild klickst.", - "enabled_dm": "Nachrichten hier sind Ende-zu-Ende-verschlüsselt. Verifiziere %(displayName)s in deren Profil – klicke auf deren Profilbild.", - "enabled_local": "Nachrichten in dieser Unterhaltung werden Ende-zu-Ende-verschlüsselt.", - "parameters_changed": "Einige Verschlüsselungsoptionen wurden geändert.", - "state_enabled": "Nachrichten und State-Events sind in diesem Chat Ende-zu-Ende verschlüsselt. Du kannst neue Mitglieder, die dem Chat beitreten, auf ihrem Profil verifizieren. Dies erreichst du durch Klick auf das Profilbild.", - "unsupported": "Die von diesem Chat verwendete Verschlüsselung wird nicht unterstützt." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s hat Gästen erlaubt, diesem Chat beizutreten.", "forbidden": "%(senderDisplayName)s hat Gästen verboten, diesem Chat beizutreten.", @@ -3561,8 +3552,6 @@ "label": "Nachrichtenaktionen", "view_in_room": "Im Chat anzeigen" }, - "message_timestamp_received_at": "Empfangen am: %(dateTime)s", - "message_timestamp_sent_at": "Gesendet am: %(dateTime)s", "mjolnir": { "changed_rule_glob": "%(senderName)s hat die Regel für Sperren von %(oldGlob)s auf %(newGlob)s aktualisiert. Grund: %(reason)s", "changed_rule_rooms": "%(senderName)s hat eine Sperr-Regel für Chats von %(oldGlob)s nach %(newGlob)s wegen %(reason)s geändert", diff --git a/src/i18n/strings/el.json b/apps/web/src/i18n/strings/el.json similarity index 99% rename from src/i18n/strings/el.json rename to apps/web/src/i18n/strings/el.json index f4c33619e6..0c847aba9c 100644 --- a/src/i18n/strings/el.json +++ b/apps/web/src/i18n/strings/el.json @@ -424,7 +424,6 @@ "email_address": "Ηλεκτρονική διεύθυνση", "emoji": "Εικονίδια", "encrypted": "Κρυπτογραφημένο", - "encryption_enabled": "Η κρυπτογράφηση ενεργοποιήθηκε", "error": "Σφάλμα", "faq": "Συχνές ερωτήσεις", "favourites": "Αγαπημένα", @@ -2725,12 +2724,6 @@ "continuation": "Αυτό το δωμάτιο είναι η συνέχεια μιας άλλης συνομιλίας.", "see_older_messages": "Κάντε κλικ εδώ για να δείτε παλαιότερα μηνύματα." }, - "m.room.encryption": { - "disable_attempt": "Αγνοήθηκε προσπάθεια απενεργοποίησης κρυπτογράφησης", - "disabled": "Η κρυπτογράφηση δεν ενεργοποιήθηκε", - "parameters_changed": "Ορισμένες παράμετροι κρυπτογράφησης έχουν αλλάξει.", - "unsupported": "Η κρυπτογράφηση που χρησιμοποιείται από αυτό το δωμάτιο δεν υποστηρίζεται." - }, "m.room.guest_access": { "can_join": "Ο %(senderDisplayName)s επέτρεψε τους επισκέπτες να μπαίνουν στο δωμάτιο.", "forbidden": "Ο %(senderDisplayName)s απέτρεψε τους επισκέπτες από το να μπαίνουν στο δωμάτιο.", diff --git a/src/i18n/strings/en_EN.json b/apps/web/src/i18n/strings/en_EN.json similarity index 99% rename from src/i18n/strings/en_EN.json rename to apps/web/src/i18n/strings/en_EN.json index d28e456bab..f31931b7b0 100644 --- a/src/i18n/strings/en_EN.json +++ b/apps/web/src/i18n/strings/en_EN.json @@ -482,7 +482,6 @@ "email_address": "Email address", "emoji": "Emoji", "encrypted": "Encrypted", - "encryption_enabled": "Encryption enabled", "error": "Error", "faq": "FAQ", "favourites": "Favourites", @@ -3461,16 +3460,6 @@ "unknown_predecessor": "Can't find the old version of this room (room ID: %(roomId)s), and we have not been provided with 'via_servers' to look for it.", "unknown_predecessor_guess_server": "Can't find the old version of this room (room ID: %(roomId)s), and we have not been provided with 'via_servers' to look for it. It's possible that guessing the server from the room ID will work. If you want to try, click this link:" }, - "m.room.encryption": { - "disable_attempt": "Ignored attempt to disable encryption", - "disabled": "Encryption not enabled", - "enabled": "Messages in this room are end-to-end encrypted. When people join, you can verify them in their profile, just tap on their profile picture.", - "enabled_dm": "Messages here are end-to-end encrypted. Verify %(displayName)s in their profile - tap on their profile picture.", - "enabled_local": "Messages in this chat will be end-to-end encrypted.", - "parameters_changed": "Some encryption parameters have been changed.", - "state_enabled": "Messages and state events in this room are end-to-end encrypted. When people join, you can verify them in their profile, just tap on their profile picture.", - "unsupported": "The encryption used by this room isn't supported." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s has allowed guests to join the room.", "forbidden": "%(senderDisplayName)s has prevented guests from joining the room.", @@ -3564,8 +3553,6 @@ "label": "Message Actions", "view_in_room": "View in room" }, - "message_timestamp_received_at": "Received at: %(dateTime)s", - "message_timestamp_sent_at": "Sent at: %(dateTime)s", "mjolnir": { "changed_rule_glob": "%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s for %(reason)s", "changed_rule_rooms": "%(senderName)s changed a rule that was banning rooms matching %(oldGlob)s to matching %(newGlob)s for %(reason)s", diff --git a/src/i18n/strings/eo.json b/apps/web/src/i18n/strings/eo.json similarity index 99% rename from src/i18n/strings/eo.json rename to apps/web/src/i18n/strings/eo.json index e93f3dea67..e39ebe1356 100644 --- a/src/i18n/strings/eo.json +++ b/apps/web/src/i18n/strings/eo.json @@ -349,7 +349,6 @@ "email_address": "Retpoŝtadreso", "emoji": "Mienetoj", "encrypted": "Ĉifrata", - "encryption_enabled": "Ĉifrado estas ŝaltita", "error": "Eraro", "faq": "Oftaj demandoj", "favourites": "Elstarigitaj", @@ -2133,12 +2132,6 @@ "continuation": "Ĉi tiu ĉambro estas daŭrigo de alia interparolo.", "see_older_messages": "Klaku ĉi tien por vidi pli malnovajn mesaĝojn." }, - "m.room.encryption": { - "disable_attempt": "Malatentis provon malŝalti ĉifradon", - "disabled": "Ĉifrado ne estas ŝaltita", - "parameters_changed": "Ŝanĝiĝis iuj parametroj de ĉifrado.", - "unsupported": "La ĉifro uzata de ĉi tiu ĉambro ne estas subtenata." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s permesis al gastoj aliĝi al la ĉambro.", "forbidden": "%(senderDisplayName)s malpermesis al gastoj aliĝi al la ĉambro.", diff --git a/src/i18n/strings/es.json b/apps/web/src/i18n/strings/es.json similarity index 99% rename from src/i18n/strings/es.json rename to apps/web/src/i18n/strings/es.json index bb62b15f1b..3ec61e11be 100644 --- a/src/i18n/strings/es.json +++ b/apps/web/src/i18n/strings/es.json @@ -482,7 +482,6 @@ "email_address": "Dirección de correo electrónico", "emoji": "Emoticono", "encrypted": "Cifrado", - "encryption_enabled": "El cifrado está activado", "error": "Error", "faq": "Preguntas frecuentes", "favourites": "Favoritos", @@ -2813,13 +2812,6 @@ "continuation": "Esta sala es una continuación de otra.", "see_older_messages": "Haz clic aquí para ver mensajes anteriores." }, - "m.room.encryption": { - "disable_attempt": "Se ha ignorado un intento de desactivar el cifrado", - "disabled": "El cifrado no está activado", - "enabled_local": "Los mensajes en esta conversación serán cifrados de extremo a extremo.", - "parameters_changed": "Algunos parámetros del cifrado han cambiado.", - "unsupported": "El cifrado usado por esta sala no es compatible." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s autorizó a unirse a la sala a personas todavía sin cuenta.", "forbidden": "%(senderDisplayName)s ha prohibido que los invitados se unan a la sala.", diff --git a/src/i18n/strings/et.json b/apps/web/src/i18n/strings/et.json similarity index 99% rename from src/i18n/strings/et.json rename to apps/web/src/i18n/strings/et.json index 0929dace82..967e4baf61 100644 --- a/src/i18n/strings/et.json +++ b/apps/web/src/i18n/strings/et.json @@ -482,7 +482,6 @@ "email_address": "E-posti aadress", "emoji": "Emotikon", "encrypted": "Krüptitud", - "encryption_enabled": "Krüptimine on kasutusel", "error": "Viga", "faq": "Korduma kippuvad küsimused", "favourites": "Lemmikud", @@ -3036,11 +3035,13 @@ "connection_section": "Ühendus", "dialog_title": "Seadistused: Heli ja video", "echo_cancellation": "Kaja eemaldamine", + "echo_cancellation_description": "Eemaldab kõnede ajal mikrofonisisendi taustamüra. See seadistus kehtib ka Element Calli puhul.", "enable_fallback_ice_server": "Varuvariandina luba kasutada ka teist kõnehõlbustusserverit (%(server)s)", "enable_fallback_ice_server_description": "On kasutusel vaid siis, kui sinu koduserver sellist teenust ei võimalda. Seeläbi jagatakse kõne ajal sinu seadme IP-aadressi.", "mirror_local_feed": "Peegelda kohalikku videovoogu", "missing_permissions_prompt": "Meediaga seotud õigused puuduvad. Nende nõutamiseks klõpsi järgnevat nuppu.", "noise_suppression": "Müra vähendamine", + "noise_suppression_description": "Vähendab kõnede ajal mikrofonisisendi taustamüra. See seadistus kehtib ka Element Calli puhul.", "request_permissions": "Nõuta meediaõigusi", "title": "Heli ja video", "video_input_empty": "Ei leidnud ühtegi veebikaamerat", @@ -3458,16 +3459,6 @@ "unknown_predecessor": "Me ei leia selle jututoa vana versiooni (jututoa tunnus: %(roomId)s) ja meil pole otsimiseks ka teavet „via_servers“ meetodi alusel.", "unknown_predecessor_guess_server": "Me ei leia selle jututoa vana versiooni (jututoa tunnus: %(roomId)s) ja meil pole otsimiseks ka teavet „via_servers“ meetodi alusel. Võimalik, et me suudame jututoa tunnuse alusel serveri nime välja mõelda. Kui tahad proovida, siis klõpsi seda linki:" }, - "m.room.encryption": { - "disable_attempt": "Eirasin katset lõpetada krüptimise kasutamine", - "disabled": "Krüptimine ei ole kasutusel", - "enabled": "Sõnumid siin jututoas on läbivalt krüptitud. Kui uued kasutajad liituvad, siis klõpsides nende tunnuspilti saad neid verifitseerida.", - "enabled_dm": "Sõnumid siin vestluses on läbivalt krüptitud. Klõpsides tunnuspilti saad verifitseerida kasutaja %(displayName)s.", - "enabled_local": "Sõnumid siin vestluses on läbivalt krüptitud.", - "parameters_changed": "Mõned krüptimise parameetrid on muutunud.", - "state_enabled": "Selle jututoa sõnumid ja olekusündmused on läbivalt krüptitud. Kui uued kasutajad liituvad, siis saad nad verifitseerida tunnuspildile klõpsates.", - "unsupported": "Selles jututoas kasutatud krüptimine ei ole toetatud." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s on lubanud külalistel jututoaga liituda.", "forbidden": "%(senderDisplayName)s on määranud et külalised ei saa jututoaga liituda.", @@ -3561,8 +3552,6 @@ "label": "Tegevused sõnumitega", "view_in_room": "Vaata jututoas" }, - "message_timestamp_received_at": "Saabumise aeg: %(dateTime)s", - "message_timestamp_sent_at": "Saatmise aeg: %(dateTime)s", "mjolnir": { "changed_rule_glob": "%(senderName)s muutis %(reason)s tõttu ligipääsukeelu reegli algset tingimust %(oldGlob)s uueks tingimuseks %(newGlob)s", "changed_rule_rooms": "%(senderName)s muutis %(reason)s tõttu jututubade ligipääsukeelu reegli algset tingimust %(oldGlob)s uueks tingimuseks %(newGlob)s", diff --git a/src/i18n/strings/fa.json b/apps/web/src/i18n/strings/fa.json similarity index 99% rename from src/i18n/strings/fa.json rename to apps/web/src/i18n/strings/fa.json index 99d74efaf1..c9618c2e0a 100644 --- a/src/i18n/strings/fa.json +++ b/apps/web/src/i18n/strings/fa.json @@ -337,7 +337,6 @@ "email_address": "آدرس ایمیل", "emoji": "شکلک", "encrypted": "رمزشده", - "encryption_enabled": "رمزگذاری فعال است", "error": "خطا", "faq": "سوالات پرتکرار", "favourites": "موردعلاقه‌ها", @@ -1848,11 +1847,6 @@ "continuation": "این اتاق ادامه گفتگوی دیگر است.", "see_older_messages": "برای دیدن پیام های قدیمی اینجا کلیک کنید." }, - "m.room.encryption": { - "disable_attempt": "تلاش برای غیرفعال کردن رمزگذاری نادیده گرفته شد", - "disabled": "رمزگذاری فعال نیست", - "unsupported": "رمزگذاری استفاده شده توسط این اتاق پشتیبانی نمی شود." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s به مهمانان اجازه عضویت در اتاق را داد.", "forbidden": "%(senderDisplayName)s از پیوستن مهمان به اتاق جلوگیری کرد.", diff --git a/src/i18n/strings/fi.json b/apps/web/src/i18n/strings/fi.json similarity index 95% rename from src/i18n/strings/fi.json rename to apps/web/src/i18n/strings/fi.json index 4b17c865e2..04bf988f50 100644 --- a/src/i18n/strings/fi.json +++ b/apps/web/src/i18n/strings/fi.json @@ -70,7 +70,7 @@ "ignore": "Sivuuta", "import": "Tuo", "invite": "Kutsu", - "invite_to_space": "Kutsu avaruuteen", + "invite_to_space": "Kutsu tilaan", "invites_list": "Kutsut", "join": "Liity", "learn_more": "Lue lisää", @@ -365,6 +365,7 @@ "password_prompt": "Vahvista henkilöllisyytesi syöttämällä tilisi salasana alle.", "recaptcha_missing_params": "Captchan julkinen avain puuttuu kotipalvelimen asetuksista. Ilmoita tämä kotipalvelimesi ylläpitäjälle.", "registration_token_label": "Rekisteröitymispoletti", + "registration_token_prompt": "Anna kotipalvelimen ylläpitäjän antama rekisteröitymispoletti.", "sso_body": "Vahvista tämän sähköpostiosoitteen lisääminen todistamalla henkilöllisyytesi kertakirjautumista käyttäen.", "sso_failed": "Jokin meni pieleen henkilöllisyyttä vahvistaessa. Peruuta ja yritä uudelleen.", "sso_postauth_body": "Napsauta alapuolella olevaa painiketta varmistaaksesi identiteettisi.", @@ -456,7 +457,6 @@ "email_address": "Sähköpostiosoite", "emoji": "Emoji", "encrypted": "Salattu", - "encryption_enabled": "Salaus käytössä", "error": "Virhe", "faq": "Usein kysytyt kysymykset", "favourites": "Suosikit", @@ -513,11 +513,11 @@ "privacy": "Tietosuoja", "private": "Yksityinen", "private_room": "Yksityinen huone", - "private_space": "Yksityinen avaruus", + "private_space": "Yksityinen tila", "profile": "Profiili", "public": "Julkinen", "public_room": "Julkinen huone", - "public_space": "Julkinen avaruus", + "public_space": "Julkinen tila", "qr_code": "QR-koodi", "random": "Satunnainen", "reactions": "Reaktiot", @@ -536,8 +536,8 @@ "setup_secure_messages": "Ota käyttöön salatut viestit", "show_more": "Näytä lisää", "someone": "Joku", - "space": "Avaruus", - "spaces": "Avaruudet", + "space": "Tila", + "spaces": "Tilat", "sticker": "Tarra", "stickerpack": "Tarrapaketti", "success": "Onnistui", @@ -552,7 +552,7 @@ "unencrypted": "Suojaamaton", "unmute": "Poista mykistys", "unnamed_room": "Nimeämätön huone", - "unnamed_space": "Nimetön avaruus", + "unnamed_space": "Nimetön tila", "unverified": "Vahvistamaton", "updating": "Päivitetään...", "user": "Käyttäjä", @@ -574,7 +574,7 @@ "notification_a11y": "Ilmoitusten automaattinen täydennys", "notification_description": "Huoneilmoitus", "room_a11y": "Huoneiden automaattinen täydennys", - "space_a11y": "Avaruuksien automaattinen täydennys", + "space_a11y": "Tilojen automaattinen täydennys", "user_a11y": "Käyttäjien automaattinen täydennys", "user_description": "Käyttäjät" }, @@ -636,9 +636,9 @@ "join_rule_invite": "Yksityinen huone (vain kutsulla)", "join_rule_invite_label": "Vain kutsutut ihmiset voivat löytää tämän huoneen ja liittyä siihen.", "join_rule_public_label": "Kuka tahansa voi löytää tämän huoneen ja liittyä siihen.", - "join_rule_public_parent_space_label": "Kuka tahansa voi löytää tämän huoneen ja liittyä siihen, ei pelkästään avaruuden jäsenet.", - "join_rule_restricted": "Näkyvissä avaruuden jäsenille", - "join_rule_restricted_label": "Kaikki avaruudessa voivat löytää tämän huoneen ja liittyä siihen.", + "join_rule_public_parent_space_label": "Kuka tahansa voi löytää tämän huoneen ja liittyä siihen, ei pelkästään tilan jäsenet.", + "join_rule_restricted": "Näkyvissä tilan jäsenille", + "join_rule_restricted_label": "Kaikki tilassa voivat löytää tämän huoneen ja liittyä siihen.", "name_validation_required": "Syötä huoneelle nimi", "room_visibility_label": "Huoneen näkyvyys", "title_private_room": "Luo yksityinen huone", @@ -653,34 +653,34 @@ "create_space": { "add_details_prompt": "Lisää joitain tietoja, jotta ihmiset tunnistavat sen.", "add_details_prompt_2": "Voit muuttaa näitä koska tahansa.", - "add_existing_rooms_description": "Valitse lisättävät huoneet tai keskustelut. Tämä avaruus on vain sinulle, kenellekään ei tiedoteta siitä. Voit lisätä lisää myöhemmin.", + "add_existing_rooms_description": "Valitse lisättävät huoneet tai keskustelut. Tämä tila on vain sinulle, kenellekään ei tiedoteta siitä. Voit lisätä lisää myöhemmin.", "add_existing_rooms_heading": "Mitä haluat järjestää?", "address_label": "Osoite", - "address_placeholder": "esim. minun-space", + "address_placeholder": "esim. minun-tila", "creating": "Luodaan…", "creating_rooms": "Luodaan huoneita…", - "done_action": "Mene avaruuteeni", + "done_action": "Mene tilaani", "done_action_first_room": "Mene ensimmäiseen huoneeseeni", - "explainer": "Avaruudet ovat uusi tapa ryhmitellä huoneita ja ihmisiä. Minkälaisen avaruuden sinä haluat luoda? Voit muuttaa tätä asetusta myöhemmin.", - "failed_create_initial_rooms": "Tapahtui virhe luodessa huoneita uutta avaruutta varten", - "failed_invite_users": "Seuraavien käyttäjien kutsuminen avaruuteen epäonnistui: %(csvUsers)s", + "explainer": "Tilat ovat uusi tapa ryhmitellä huoneita ja ihmisiä. Minkälaisen tilan sinä haluat luoda? Voit muuttaa tätä asetusta myöhemmin.", + "failed_create_initial_rooms": "Tapahtui virhe luodessa huoneita uutta tilaa varten", + "failed_invite_users": "Seuraavien käyttäjien kutsuminen tilaan epäonnistui: %(csvUsers)s", "invite_teammates_by_username": "Kutsu käyttäjänimellä", "invite_teammates_heading": "Kutsu tiimikaverit", "inviting_users": "Kutsutaan…", - "label": "Luo avaruus", - "name_required": "Anna nimi avaruudelle", + "label": "Luo tila", + "name_required": "Anna nimi tilalle", "personal_space": "Vain minä", - "personal_space_description": "Yksityinen avaruus, jolla voit järjestää huoneesi", + "personal_space_description": "Yksityinen tila, jolla voit järjestää huoneesi", "private_description": "Vain kutsulla, paras itsellesi tai tiimeille", - "private_heading": "Yksityinen avaruutesi", + "private_heading": "Yksityinen tilasi", "private_personal_heading": "Kenen kanssa työskentelet?", "private_space": "Minä ja tiimikaverit", - "private_space_description": "Yksityinen avaruus sinulle ja tiimikavereille", - "public_description": "Avoin avaruus kaikille, paras yhteisöille", - "public_heading": "Julkinen avaruutesi", - "search_public_button": "Etsi julkisia avaruuksia", + "private_space_description": "Yksityinen tila sinulle ja tiimikavereille", + "public_description": "Avoin tila kaikille, paras yhteisöille", + "public_heading": "Julkinen tilasi", + "search_public_button": "Etsi julkisia tiloja", "setup_rooms_community_description": "Tehdään huone jokaiselle.", - "setup_rooms_community_heading": "Mistä asioista haluat puhua avaruudessa %(spaceName)s?", + "setup_rooms_community_heading": "Mistä asioista haluat puhua tilassa %(spaceName)s?", "setup_rooms_description": "Voit lisätä niitä myöhemmin, mukaan lukien olemassa olevia.", "setup_rooms_private_description": "Luomme huoneet jokaiselle niistä.", "setup_rooms_private_heading": "Minkä projektien parissa tiimisi työskentelee?", @@ -688,14 +688,14 @@ "share_heading": "Jaa %(name)s", "skip_action": "Ohita tältä erää", "subspace_adding": "Lisätään…", - "subspace_beta_notice": "Lisää avaruus hallitsemaasi avaruuteen.", - "subspace_dropdown_title": "Luo avaruus", - "subspace_existing_space_prompt": "Haluatko sen sijaan lisätä olemassa olevan avaruuden?", - "subspace_join_rule_invite_description": "Vain kutsutut ihmiset voivat löytää tämän avaruuden ja liittyä siihen.", - "subspace_join_rule_invite_only": "Yksityinen avaruus (vain kutsulla)", - "subspace_join_rule_label": "Avaruuden näkyvyys", - "subspace_join_rule_public_description": "Kuka tahansa voi löytää tämän avaruuden ja liittyä siihen, ei pelkästään avaruuden jäsenet.", - "subspace_join_rule_restricted_description": "Kuka tahansa avaruudessa voi löytää ja liittyä." + "subspace_beta_notice": "Lisää tila hallitsemaasi tilaan.", + "subspace_dropdown_title": "Luo tila", + "subspace_existing_space_prompt": "Haluatko sen sijaan lisätä olemassa olevan tilan?", + "subspace_join_rule_invite_description": "Vain kutsutut ihmiset voivat löytää tämän tilan ja liittyä siihen.", + "subspace_join_rule_invite_only": "Yksityinen tila (vain kutsulla)", + "subspace_join_rule_label": "Tilan näkyvyys", + "subspace_join_rule_public_description": "Kuka tahansa voi löytää tämän tilan ja liittyä siihen, ei pelkästään tilan jäsenet.", + "subspace_join_rule_restricted_description": "Kuka tahansa tilassa voi löytää ja liittyä." }, "credits": { "default_cover_photo": "Oletuskansikuva © Jesús Roncero, käytössä CC-BY-SA 4.0:n ehtojen mukaisesti.", @@ -1079,11 +1079,11 @@ "url_field_label": "Syötä uusi identiteettipalvelin", "url_not_https": "Identiteettipalvelimen URL-osoitteen täytyy olla HTTPS-alkuinen" }, - "in_space": "Avaruudessa %(spaceName)s.", - "in_space1_and_space2": "Avaruuksissa %(space1Name)s ja %(space2Name)s.", + "in_space": "Tilassa %(spaceName)s.", + "in_space1_and_space2": "Tiloissa %(space1Name)s ja %(space2Name)s.", "in_space_and_n_other_spaces": { - "one": "Avaruudessa %(spaceName)s ja %(count)s muussa avaruudessa.", - "other": "Avaruudessa %(spaceName)s ja %(count)s muussa avaruudessa." + "one": "Tilassa %(spaceName)s ja yhdessä muussa tilassa.", + "other": "Tilassa %(spaceName)s ja %(count)s muussa tilassa." }, "incompatible_browser": { "continue": "Jatka silti", @@ -1116,9 +1116,9 @@ "email_use_default_is": "Käytä identiteettipalvelinta kutsuaksesi henkilöitä sähköpostilla. Käytä oletusta (%(defaultIdentityServerName)s) tai aseta toinen palvelin asetuksissa.", "email_use_is": "Käytä identiteettipalvelinta kutsuaksesi käyttäjiä sähköpostilla. Voit vaihtaa identiteettipalvelimen asetuksissa.", "error_already_invited_room": "Käyttäjä on jo kutsuttu huoneeseen", - "error_already_invited_space": "Käyttäjä on jo kutsuttu avaruuteen", + "error_already_invited_space": "Käyttäjä on jo kutsuttu tilaan", "error_already_joined_room": "Käyttäjä on jo huoneessa", - "error_already_joined_space": "Käyttäjä on jo avaruudessa", + "error_already_joined_space": "Käyttäjä on jo tilassa", "error_bad_state": "Käyttäjän porttikielto täytyy poistaa ennen kutsumista.", "error_dm": "Yksityisviestiä ei voitu luoda.", "error_find_room": "Käyttäjien kutsumisessa meni jotain pieleen.", @@ -1126,18 +1126,19 @@ "error_find_user_title": "Seuraavia käyttäjiä ei löytynyt", "error_invite": "Emme voineet kutsua kyseisiä käyttäjiä. Tarkista käyttäjät, jotka haluat kutsua ja yritä uudelleen.", "error_permissions_room": "Sinulla ei ole oikeuksia kutsua henkilöitä tähän huoneeseen.", - "error_permissions_space": "Sinulla ei ole oikeutta kutsua ihmisiä tähän avaruuteen.", + "error_permissions_space": "Sinulla ei ole oikeutta kutsua ihmisiä tähän tilaan.", "error_profile_undisclosed": "Käyttäjä on tai ei ole olemassa", "error_transfer_multiple_target": "Puhelun voi siirtää vain yhdelle käyttäjälle.", "error_unknown": "Tuntematon palvelinvirhe", "error_user_not_found": "Käyttäjää ei ole olemassa", "error_version_unsupported_room": "Käyttäjän kotipalvelin ei tue huoneen versiota.", - "error_version_unsupported_space": "Käyttäjän kotipalvelin ei tue avaruuden versiota.", + "error_version_unsupported_space": "Käyttäjän kotipalvelin ei tue tilan versiota.", "failed_generic": "Toiminto epäonnistui", "failed_title": "Kutsu epäonnistui", "invalid_address": "Osoitetta ei tunnistettu", "name_email_mxid_share_room": "Kutsu käyttäen nimeä, sähköpostiosoitetta, käyttäjänimeä (kuten ) tai
    jaa tämä huone.", - "name_email_mxid_share_space": "Kutsu käyttäen nimeä, sähköpostiosoitetta, käyttäjänimeä (kuten ) tai jaa tämä avaruus.", + "name_email_mxid_share_space": "Kutsu käyttäen nimeä, sähköpostiosoitetta, käyttäjänimeä (kuten ) tai jaa tämä tila.", + "name_mxid_share_space": "Kutsu käyttäen nimeä, käyttäjänimeä (kuten ) tai jaa tämä tila.", "recents_section": "Viimeaikaiset keskustelut", "room_failed_partial": "Lähetimme toisille, alla lista henkilöistä joita ei voitu kutsua ", "room_failed_partial_title": "Joitain kutsuja ei voitu lähettää", @@ -1149,7 +1150,7 @@ "suggestions_disclaimer_prompt": "Jos et näe henkilöä jota etsit, lähetä hänelle linkki alhaalta.", "suggestions_section": "Viimeaikaiset yksityisviestit", "to_room": "Kutsu huoneeseen %(roomName)s", - "to_space": "Kutsu avaruuteen %(spaceName)s", + "to_space": "Kutsu tilaan %(spaceName)s", "transfer_dial_pad_tab": "Näppäimistö", "transfer_user_directory_tab": "Käyttäjähakemisto", "unable_find_profiles_description_default": "Alla luetelluille Matrix ID:ille ei löytynyt profiileja. Haluaisitko kutsua ne siitä huolimatta?", @@ -1203,9 +1204,9 @@ "jump_room_search": "Siirry huonehakuun", "jump_to_read_marker": "Siirry vanhimpaan lukemattomaan viestiin", "keyboard_shortcuts_tab": "Avaa tämä asetusvälilehti", - "navigate_next_history": "Seuraava vierailtu huone tai avaruus", + "navigate_next_history": "Seuraava vierailtu huone tai tila", "navigate_next_message_edit": "Siirry seuraavaan viestiin muokataksesi", - "navigate_prev_history": "Edellinen vierailtu huone tai avaruus", + "navigate_prev_history": "Edellinen vierailtu huone tai tila", "navigate_prev_message_edit": "Siirry edelliseen viestiin muokataksesi", "next_room": "Seuraava huone tai yksityisviesti", "next_unread_room": "Seuraava lukematon huone tai yksityisviesti", @@ -1224,11 +1225,11 @@ "search": "Haku (pitää olla käytössä)", "send_sticker": "Lähetä tarra", "shift": "Vaihto", - "space": "Avaruus", - "switch_to_space": "Vaihda avaruuteen numerolla", + "space": "Välilyönti", + "switch_to_space": "Vaihda tilaan numerolla", "toggle_microphone_mute": "Mikrofonin mykistys päälle/pois", "toggle_right_panel": "Vaihda oikea paneeli", - "toggle_space_panel": "Avaruuspaneeli päälle/pois", + "toggle_space_panel": "Tilapaneeli päälle/pois", "toggle_top_left_menu": "Vaihda vasemman yläkulman valikkoa", "toggle_webcam_mute": "Kamera päälle/pois", "upload_file": "Lähetä tiedosto" @@ -1261,7 +1262,7 @@ "group_moderation": "Moderointi", "group_profile": "Profiili", "group_rooms": "Huoneet", - "group_spaces": "Avaruudet", + "group_spaces": "Tilat", "group_themes": "Teemat", "group_threads": "Ketjut", "group_ui": "Käyttöliittymä", @@ -1332,9 +1333,9 @@ "leave_room_dialog": { "last_person_warning": "Olet ainoa henkilö täällä. Jos lähdet, kukaan ei voi liittyä tulevaisuudessa, et myöskään sinä.", "leave_room_question": "Oletko varma että haluat poistua huoneesta '%(roomName)s'?", - "leave_space_question": "Haluatko varmasti poistua avaruudesta '%(spaceName)s'?", + "leave_space_question": "Haluatko varmasti poistua tilasta '%(spaceName)s'?", "room_rejoin_warning": "Tämä huone ei ole julkinen. Et voi liittyä uudelleen ilman kutsua.", - "space_rejoin_warning": "Tämä avaruus ei ole julkinen. Et voi liittyä uudelleen ilman kutsua." + "space_rejoin_warning": "Tämä tila ei ole julkinen. Et voi liittyä uudelleen ilman kutsua." }, "left_panel": { "open_dial_pad": "Avaa näppäimistö" @@ -1651,13 +1652,15 @@ "face_pile_tooltip_shortcut_joined": "Mukaan lukien sinä, %(commaSeparatedMembers)s", "failed_reject_invite": "Kutsun hylkääminen epäonnistui", "forget_room": "Unohda tämä huone", - "forget_space": "Unohda tämä avaruus", + "forget_space": "Unohda tämä tila", "header": { "room_is_public": "Tämä huone on julkinen" }, "header_avatar_open_settings_label": "Avaa huoneen asetukset", - "inaccessible": "Tämä huone tai avaruus ei ole käytettävissä juuri tällä hetkellä.", + "inaccessible": "Tämä huone tai tila ei ole käytettävissä juuri tällä hetkellä.", "inaccessible_name": "%(roomName)s ei ole saatavilla tällä hetkellä.", + "inaccessible_subtitle_1": "Yritä myöhemmin uudelleen tai pyydä huoneen tai tilan ylläpitäjää tarkistamaan, onko sinulla pääsyoikeus.", + "inaccessible_subtitle_2": "%(errcode)s palautettiin, kun yritit päästä huoneeseen tai tilaan. Jos luulet, että tämä viesti on virheellinen, lähetä vikailmoitus .", "intro": { "dm_caption": "Vain te kaksi olette tässä keskustelussa, ellei jompi kumpi kutsu muita.", "enable_encryption_prompt": "Ota salaus käyttöön asetuksissa.", @@ -1688,7 +1691,7 @@ "join_title_account": "Liity keskusteluun tilin avulla", "joining": "Liitytään…", "joining_room": "Liitytään huoneeseen…", - "joining_space": "Liitytään avaruuteen…", + "joining_space": "Liitytään tilaan…", "jump_read_marker": "Hyppää ensimmäiseen lukemattomaan viestiin.", "jump_to_bottom_button": "Vieritä tuoreimpiin viesteihin", "jump_to_date": "Siirry päivämäärään", @@ -1712,7 +1715,7 @@ "no_peek_join_prompt": "Huonetta %(roomName)s ei voi esikatsella. Haluatko liittyä siihen?", "no_peek_no_name_join_prompt": "Esikatselua ei ole. Haluaisitko liittyä?", "not_found_subtitle": "Oletko varma, että olet oikeassa paikassa?", - "not_found_title": "Tätä huonetta tai avaruutta ei ole olemassa.", + "not_found_title": "Tätä huonetta tai tilaa ei ole olemassa.", "not_found_title_name": "Huonetta %(roomName)s ei ole olemassa.", "peek_join_prompt": "Esikatselet huonetta %(roomName)s. Haluatko liittyä siihen?", "pinned_message_badge": "Kiinnitetty viesti", @@ -1755,7 +1758,7 @@ }, "room_list": { "add_room_label": "Lisää huone", - "add_space_label": "Lisää avaruus", + "add_space_label": "Lisää tila", "breadcrumbs_empty": "Ei hiljattain vierailtuja huoneita", "breadcrumbs_label": "Hiljattain vieraillut huoneet", "failed_add_tag": "Tagin %(tagName)s lisääminen huoneeseen epäonnistui", @@ -1791,21 +1794,21 @@ }, "room_settings": { "access": { - "description_space": "Päätä ketkä voivat katsella avaruutta %(spaceName)s ja liittyä siihen.", + "description_space": "Päätä ketkä voivat katsella tilaa %(spaceName)s ja liittyä siihen.", "title": "Pääsy" }, "advanced": { "error_upgrade_description": "Huoneen päivitystä ei voitu suorittaa", "error_upgrade_title": "Huoneen päivittäminen epäonnistui", "information_section_room": "Huoneen tiedot", - "information_section_space": "Avaruuden tiedot", + "information_section_space": "Tilan tiedot", "room_id": "Sisäinen huoneen ID-tunniste", "room_predecessor": "Näytä vanhemmat viestit huoneessa %(roomName)s.", "room_upgrade_button": "Päivitä tämä huone suositeltuun huoneversioon", "room_version": "Huoneen versio:", "room_version_section": "Huoneen versio", - "space_predecessor": "Näe avaruuden %(spaceName)s vanhempi versio.", - "space_upgrade_button": "Päivitä tämä avaruus suositeltuun huoneversioon", + "space_predecessor": "Näe tilan %(spaceName)s vanhempi versio.", + "space_upgrade_button": "Päivitä tämä tila suositeltuun huoneversioon", "unfederated": "Tähän huoneeseen ei pääse ulkopuolisilta Matrix-palvelimilta", "upgrade_button": "Päivitä tämä huone versioon %(version)s", "upgrade_dialog_description": "Tämän huoneen päivittäminen edellyttää huoneen nykyisen instanssin sulkemista ja uuden huoneen luomista sen tilalle. Jotta tämä kävisi huoneen jäsenten kannalta mahdollisimman sujuvasti, teemme seuraavaa:", @@ -1847,7 +1850,7 @@ "canonical_alias_field_label": "Pääosoite", "default_url_previews_off": "URL-esikatselut ovat oletuksena pois päältä tämän huoneen jäsenillä.", "default_url_previews_on": "URL-esikatselut on päällä oletusarvoisesti tämän huoneen jäsenillä.", - "description_space": "Muokkaa avaruuteesi liittyviä asetuksia.", + "description_space": "Muokkaa tilaasi liittyviä asetuksia.", "error_creating_alias_description": "Osoitetta luotaessa tapahtui virhe. Voi olla, että palvelin ei salli sitä tai kyseessä oli tilapäinen virhe.", "error_creating_alias_title": "Virhe osoitetta luotaessa", "error_deleting_alias_description": "Osoitetta poistaessa tapahtui virhe. Osoitetta ei ehkä ole enää olemassa tai kyseessä oli tilapäinen virhe.", @@ -1855,23 +1858,24 @@ "error_deleting_alias_title": "Virhe osoitetta poistettaessa", "error_publishing": "Huonetta ei voi julkaista", "error_publishing_detail": "Tämän huoneen julkaisemisessa tapahtui virhe", - "error_save_space_settings": "Avaruuden asetusten tallentaminen epäonnistui.", + "error_save_space_settings": "Tilan asetusten tallentaminen epäonnistui.", "error_updating_alias_description": "Huoneen vaihtoehtoisten osoitteiden päivittämisessä tapahtui virhe. Palvelin ei ehkä salli sitä tai kyseessä oli tilapäinen virhe.", "error_updating_canonical_alias_description": "Huoneen pääosoitteen päivityksessä tapahtui virhe. Se ei välttämättä ole sallittua tällä palvelimella tai kyseessä on väliaikainen virhe.", "error_updating_canonical_alias_title": "Pääosoitteen päivityksessä tapahtui virhe", - "leave_space": "Poistu avaruudesta", + "leave_space": "Poistu tilasta", "local_alias_field_label": "Paikallinen osoite", "local_aliases_explainer_room": "Aseta osoitteita tälle huoneelle, jotta käyttäjät löytävät tämän huoneen kotipalvelimeltasi (%(localDomain)s)", - "local_aliases_explainer_space": "Aseta osoitteita tälle avaruudelle, jotta käyttäjät löytävät tämän avaruuden kotipalvelimeltasi (%(localDomain)s)", + "local_aliases_explainer_space": "Aseta osoitteita tälle tilalle, jotta käyttäjät löytävät tämän tilan kotipalvelimeltasi (%(localDomain)s)", "local_aliases_section": "Paikalliset osoitteet", "name_field_label": "Huoneen nimi", "new_alias_placeholder": "Uusi julkaistu osoite (esim. #alias:palvelin)", "no_aliases_room": "Tällä huoneella ei ole paikallista osoitetta", - "no_aliases_space": "Tällä avaruudella ei ole paikallista osoitetta", + "no_aliases_space": "Tällä tilalla ei ole paikallista osoitetta", "other_section": "Muut", "publish_toggle": "Julkaise tämä huone verkkotunnuksen %(domain)s huoneluettelossa?", "published_aliases_description": "Osoitteen julkaisemiseksi se täytyy ensin asettaa paikalliseksi osoitteeksi.", "published_aliases_explainer_room": "Julkaistujen osoitteiden avulla kuka tahansa millä tahansa palvelimella voi liittyä huoneeseesi.", + "published_aliases_explainer_space": "Julkaistuja osoitteita voi käyttää kuka tahansa millä tahansa palvelimella liittyäkseen tilaasi.", "published_aliases_section": "Julkaistut osoitteet", "save": "Tallenna muutokset", "topic_field_label": "Huoneen aihe", @@ -1913,13 +1917,13 @@ "m.call.member": "Liity %(brand)s-puheluihin", "m.reaction": "Lähetä reaktioita", "m.room.avatar": "Vaihda huoneen kuva", - "m.room.avatar_space": "Vaihda avaruuden kuva", + "m.room.avatar_space": "Vaihda tilan kuva", "m.room.canonical_alias": "Vaihda huoneen pääosoite", - "m.room.canonical_alias_space": "Vaihda avaruuden pääosoite", + "m.room.canonical_alias_space": "Vaihda tilan pääosoite", "m.room.encryption": "Ota huoneen salaus käyttöön", "m.room.history_visibility": "Muuta keskusteluhistorian näkyvyyttä", "m.room.name": "Vaihda huoneen nimi", - "m.room.name_space": "Vaihda avaruuden nimi", + "m.room.name_space": "Vaihda tilan nimi", "m.room.pinned_events": "Hallitse kiinnitettyjä tapahtumia", "m.room.power_levels": "Muuta oikeuksia", "m.room.redaction": "Poista lähettämäni viestit", @@ -1927,14 +1931,14 @@ "m.room.tombstone": "Päivitä huone uuteen versioon", "m.room.topic": "Vaihda aihe", "m.room.topic_space": "Vaihda kuvaus", - "m.space.child": "Hallinnoi huoneita tässä avaruudessa", + "m.space.child": "Hallinnoi huoneita tässä tilassa", "m.widget": "Muokkaa sovelmia", "muted_users_section": "Mykistetyt käyttäjät", "no_privileged_users": "Kellään käyttäjällä ei ole erityisiä oikeuksia", "notifications.room": "Kiinnitä kaikkien huomio", "permissions_section": "Oikeudet", "permissions_section_description_room": "Valitse roolit, jotka vaaditaan huoneen eri osioiden muuttamiseen", - "permissions_section_description_space": "Valitse roolit, jotka vaaditaan avaruuden eri osioiden muuttamiseen", + "permissions_section_description_space": "Valitse roolit, jotka vaaditaan tilan eri osioiden muuttamiseen", "privileged_users_section": "Etuoikeutetut käyttäjät", "redact": "Poista toisten lähettämät viestit", "send_event_type": "Lähetä %(eventType)s-tapahtumat", @@ -1964,27 +1968,29 @@ "join_rule_invite": "Yksityinen (vain kutsulla)", "join_rule_invite_description": "Vain kutsutut ihmiset voivat liittyä.", "join_rule_public_description": "Kuka tahansa voi löytää ja liittyä.", - "join_rule_restricted": "Avaruuden jäsenet", - "join_rule_restricted_description": "Kuka tahansa avaruuden jäsen voi löytää ja liittyä. Muokkaa millä avaruuksilla on pääsyoikeus täällä.", - "join_rule_restricted_description_active_space": "Kuka tahansa avaruudessa voi löytää ja liittyä. Voit valita muitakin avaruuksia.", - "join_rule_restricted_description_prompt": "Kuka tahansa avaruudessa voi löytää ja liittyä. Voit valita monta avaruutta.", - "join_rule_restricted_description_spaces": "Avaruudet, joilla on pääsyoikeus", - "join_rule_restricted_dialog_description": "Valitse, millä avaruuksilla on pääsyoikeus tähän huoneeseen. Jos avaruus valitaan, sen jäsenet voivat löytää ja liittyä huoneeseen .", - "join_rule_restricted_dialog_filter_placeholder": "Etsi avaruuksia", - "join_rule_restricted_dialog_heading_other": "Muut avaruudet tai huoneet, joita et ehkä tunne", - "join_rule_restricted_dialog_heading_room": "Tuntemasi avaruudet, jotka sisältävät tämän huoneen", - "join_rule_restricted_dialog_heading_space": "Tuntemasi avaruudet, jotka sisältävät tämän avaruuden", - "join_rule_restricted_dialog_title": "Valitse avaruudet", + "join_rule_restricted": "Tilan jäsenet", + "join_rule_restricted_description": "Kuka tahansa tilan jäsen voi löytää ja liittyä. Muokkaa millä tiloilla on pääsyoikeus täällä.", + "join_rule_restricted_description_active_space": "Kuka tahansa tilassa voi löytää ja liittyä. Voit valita muitakin tiloja.", + "join_rule_restricted_description_prompt": "Kuka tahansa tilassa voi löytää ja liittyä. Voit valita useita tiloja.", + "join_rule_restricted_description_spaces": "Tilat, joilla on pääsyoikeus", + "join_rule_restricted_dialog_description": "Valitse, millä tiloilla on pääsyoikeus tähän huoneeseen. Jos tila valitaan, sen jäsenet voivat löytää ja liittyä huoneeseen .", + "join_rule_restricted_dialog_empty_warning": "Olet poistamassa kaikkia tiloja. Pääsy asetetaan vain kutsutuille.", + "join_rule_restricted_dialog_filter_placeholder": "Etsi tiloja", + "join_rule_restricted_dialog_heading_known": "Muita tuntemiasi tiloja", + "join_rule_restricted_dialog_heading_other": "Muut tilat tai huoneet, joita et ehkä tunne", + "join_rule_restricted_dialog_heading_room": "Tuntemasi tilat, jotka sisältävät tämän huoneen", + "join_rule_restricted_dialog_heading_space": "Tuntemasi tilat, jotka sisältävät tämän tilan", + "join_rule_restricted_dialog_title": "Valitse tilat", "join_rule_restricted_n_more": { "one": "& %(count)s lisää", "other": "& %(count)s lisää" }, "join_rule_restricted_summary": { - "one": "Tällä hetkellä yhdellä avaruudella on pääsyoikeus", - "other": "Tällä hetkellä %(count)s avaruudella on pääsyoikeus" + "one": "Tällä hetkellä yhdellä tilalla on pääsyoikeus", + "other": "Tällä hetkellä %(count)s tilalla on pääsyoikeus" }, - "join_rule_restricted_upgrade_description": "Tämä päivitys antaa valittujen avaruuksien jäsenten liittyä tähän huoneeseen ilman kutsua.", - "join_rule_restricted_upgrade_warning": "Tämä huone on joissain avaruuksissa, joissa et ole ylläpitäjänä. Ne avaruudet tulevat edelleen näyttämään vanhan huoneen, mutta ihmisiä kehotetaan liittymään uuteen.", + "join_rule_restricted_upgrade_description": "Tämä päivitys antaa valittujen tilojen jäsenten liittyä tähän huoneeseen ilman kutsua.", + "join_rule_restricted_upgrade_warning": "Tämä huone on joissain tiloissa, joissa et ole ylläpitäjänä. Ne tilat tulevat edelleen näyttämään vanhan huoneen, mutta ihmisiä kehotetaan liittymään uuteen.", "join_rule_upgrade_awaiting_room": "Ladataan uutta huonetta", "join_rule_upgrade_required": "Päivitys vaaditaan", "join_rule_upgrade_sending_invites": { @@ -1992,13 +1998,13 @@ "other": "Lähetetään kutsuja... (%(progress)s / %(count)s)" }, "join_rule_upgrade_updating_spaces": { - "one": "Päivitetään avaruutta...", - "other": "Päivitetään avaruuksia... (%(progress)s/%(count)s)" + "one": "Päivitetään tilaa...", + "other": "Päivitetään tiloja... (%(progress)s/%(count)s)" }, "join_rule_upgrade_upgrading_room": "Päivitetään huonetta", "public_without_alias_warning": "Lisää osoite linkittääksesi tähän huoneeseen.", "publish_room": "Aseta tämä huone näkyväksi julkisten huoneiden hakemistossa.", - "publish_space": "Tee tämä avaruus näkyväksi julkisten huoneiden hakemistossa.", + "publish_space": "Tee tämä tila näkyväksi julkisten huoneiden hakemistossa.", "strict_encryption": "Lähetä viestejä vain vahvistetuille käyttäjille.", "title": "Tietoturva ja yksityisyys" }, @@ -2006,14 +2012,14 @@ "upload_avatar_label": "Lähetä profiilikuva", "visibility": { "alias_section": "Osoite", - "error_failed_save": "Avaruuden näkyvyyden muuttaminen epäonnistui", + "error_failed_save": "Tilan näkyvyyden muuttaminen epäonnistui", "error_update_guest_access": "Vieraiden pääsyasetusten muuttaminen epäonnistui", "error_update_history_visibility": "Historian näkyvyysasetusten muuttaminen epäonnistui", - "guest_access_explainer": "Vieraat voivat liittyä avaruuteen ilman tiliä.", + "guest_access_explainer": "Vieraat voivat liittyä tilaan ilman tiliä. Tämä voi olla hyödyllinen julkisissa tiloissa.", "guest_access_label": "Ota käyttöön vieraiden pääsy", - "history_visibility_anyone_space": "Esikatsele avaruutta", - "history_visibility_anyone_space_description": "Salli ihmisten esikatsella avaruuttasi ennen liittymistä.", - "history_visibility_anyone_space_recommendation": "Suositeltu julkisiin avaruuksiin.", + "history_visibility_anyone_space": "Esikatsele tilaa", + "history_visibility_anyone_space_description": "Salli ihmisten esikatsella tilaasi ennen liittymistä.", + "history_visibility_anyone_space_recommendation": "Suositeltu julkisiin tiloihin.", "title": "Näkyvyys" }, "voip": { @@ -2488,15 +2494,15 @@ "dialog_title": "Asetukset: Sivupalkki", "metaspaces_favourites_description": "Ryhmitä kaikki suosimasi huoneet ja henkilöt yhteen paikkaan.", "metaspaces_home_all_rooms": "Näytä kaikki huoneet", - "metaspaces_home_all_rooms_description": "Näytä kaikki huoneesi etusivulla, vaikka ne olisivat jossain muussa avaruudessa.", + "metaspaces_home_all_rooms_description": "Näytä kaikki huoneesi etusivulla, vaikka ne olisivat jossain muussa tilassa.", "metaspaces_home_description": "Koti on hyödyllinen, sillä sieltä näet yleisnäkymän kaikkeen.", - "metaspaces_orphans": "Huoneet, jotka eivät kuulu mihinkään avaruuteen", - "metaspaces_orphans_description": "Ryhmitä kaikki huoneesi, jotka eivät ole osa avaruutta, yhteen paikkaan.", + "metaspaces_orphans": "Huoneet, jotka eivät kuulu mihinkään tilaan", + "metaspaces_orphans_description": "Ryhmitä kaikki huoneesi, jotka eivät ole osa tilaa, yhteen paikkaan.", "metaspaces_people_description": "Ryhmitä kaikki ihmiset yhteen paikkaan.", - "metaspaces_subsection": "Näytettävät avaruudet", + "metaspaces_subsection": "Näytettävät tilat", "metaspaces_video_rooms": "Videohuoneet ja konferenssit", "metaspaces_video_rooms_description": "Ryhmitä kaikki yksityiset videohuoneet ja konferenssit.", - "spaces_explainer": "Avaruudet ovat tapa ryhmitellä huoneita ja ihmisiä. Voit käyttää nykyisten avaruuksiesi lisäksi esivalmisteltuja avaruuksia.", + "spaces_explainer": "Tilat ovat tapa ryhmitellä huoneita ja ihmisiä. Voit käyttää nykyisten tilojesi lisäksi esivalmisteltuja tiloja.", "title": "Sivupalkki" }, "use_12_hour_format": "Näytä aikaleimat 12 tunnin muodossa (esim. 2:30pm)", @@ -2629,56 +2635,56 @@ "one": "Lisätään huonetta...", "other": "Lisätään huoneita... (%(progress)s/%(count)s)" }, - "space_dropdown_label": "Avaruuden valinta", + "space_dropdown_label": "Tilan valinta", "space_dropdown_title": "Lisää olemassa olevia huoneita", - "subspace_moved_note": "Avaruuksien lisääminen on siirtynyt." + "subspace_moved_note": "Tilojen lisääminen on siirtynyt." }, "add_existing_subspace": { - "create_button": "Luo uusi avaruus", - "create_prompt": "Haluatko lisätä sen sijaan uuden avaruuden?", - "filter_placeholder": "Etsi avaruuksia", - "space_dropdown_title": "Lisää olemassa oleva avaruus" + "create_button": "Luo uusi tila", + "create_prompt": "Haluatko lisätä sen sijaan uuden tilan?", + "filter_placeholder": "Etsi tiloja", + "space_dropdown_title": "Lisää olemassa oleva tila" }, "context_menu": { "devtools_open_timeline": "Näytä huoneen aikajana (devtools)", "explore": "Selaa huoneita", - "home": "Avaruuden koti", + "home": "Tilan koti", "manage_and_explore": "Hallitse ja selaa huoneita", - "options": "Avaruuden valinnat" + "options": "Tilan valinnat" }, "failed_load_rooms": "Huoneluettelon lataaminen epäonnistui.", "failed_remove_rooms": "Joitakin huoneita ei voitu poistaa. Yritä myöhemmin uudelleen", - "incompatible_server_hierarchy": "Palvelimesi ei tue avaruushierarkioiden esittämistä.", + "incompatible_server_hierarchy": "Palvelimesi ei tue tilahierarkioiden esittämistä.", "invite": "Kutsu ihmisiä", "invite_description": "Kutsu sähköpostiosoitteella tai käyttäjänimellä", "invite_link": "Jaa kutsulinkki", "joining_space": "Liitytään", "landing_welcome": "Tervetuloa, tämä on ", - "leave_dialog_action": "Poistu avaruudesta", - "leave_dialog_description": "Olet aikeissa poistua avaruudesta .", - "leave_dialog_only_admin_room_warning": "Olet ainoa ylläpitäjä joissain huoneissa tai avaruuksissa, joista haluat lähteä. Niistä lähteminen jättää ne ilman yhtään ylläpitäjää.", - "leave_dialog_only_admin_warning": "Olet tämän avaruuden ainoa ylläpitäjä. Avaruudesta lähteminen tarkoittaa, että kenelläkään ei ole oikeuksia hallita sitä.", + "leave_dialog_action": "Poistu tilasta", + "leave_dialog_description": "Olet aikeissa poistua tilasta .", + "leave_dialog_only_admin_room_warning": "Olet ainoa ylläpitäjä joissain huoneissa tai tiloissa, joista haluat lähteä. Niistä lähteminen jättää ne ilman yhtään ylläpitäjää.", + "leave_dialog_only_admin_warning": "Olet tämän tilan ainoa ylläpitäjä. Tilasta lähteminen tarkoittaa, että kenelläkään ei ole oikeuksia hallita sitä.", "leave_dialog_option_all": "Poistu kaikista huoneista", - "leave_dialog_option_intro": "Haluatko poistua tässä avaruudessa olevista huoneista?", + "leave_dialog_option_intro": "Haluatko poistua tässä tilassa olevista huoneista?", "leave_dialog_option_none": "Älä poistu mistään huoneesta", "leave_dialog_option_specific": "Poistu joistakin huoneista", "leave_dialog_public_rejoin_warning": "Et voi liittyä uudelleen, ellei sinua kutsuta uudelleen.", - "leave_dialog_title": "Poistu avaruudesta %(spaceName)s", + "leave_dialog_title": "Poistu tilasta %(spaceName)s", "mark_suggested": "Merkitse ehdotetuksi", "no_search_result_hint": "Kokeile eri hakua tai tarkista haku kirjoitusvirheiden varalta.", "preferences": { "sections_section": "Näytettävät osiot", - "show_people_in_space": "Tämä ryhmittelee yksityisviestisi avaruuden jäsenten kanssa. Tämän poistaminen päältä piilottaa kyseiset keskustelut sinun näkymästäsi avaruudessa %(spaceName)s." + "show_people_in_space": "Tämä ryhmittelee yksityisviestisi tilan jäsenten kanssa. Tämän poistaminen päältä piilottaa kyseiset keskustelut sinun näkymästäsi tilassa %(spaceName)s." }, "room_filter_placeholder": "Etsi huoneita", "search_children": "Etsi %(spaceName)s", "search_placeholder": "Etsi nimistä ja kuvauksista", "select_room_below": "Valitse ensin huone alta", - "share_public": "Jaa julkinen avaruutesi", + "share_public": "Jaa julkinen tilasi", "suggested": "Ehdotettu", "suggested_tooltip": "Tähän huoneeseen liittymistä suositellaan", "title_when_query_available": "Tulokset", - "title_when_query_unavailable": "Huoneet ja avaruudet", + "title_when_query_unavailable": "Huoneet ja tilat", "unmark_suggested": "Merkitse ei-ehdotetuksi", "user_lacks_permission": "Sinulla ei ole lupaa" }, @@ -2686,10 +2692,10 @@ "title": "Asetukset - %(spaceName)s" }, "spaces": { - "error_no_permission_add_room": "Sinulla ei ole oikeuksia lisätä huoneita tähän avaruuteen", - "error_no_permission_add_space": "Sinulla ei ole oikeuksia lisätä avaruuksia tähän avaruuteen", - "error_no_permission_create_room": "Sinulla ei ole oikeuksia luoda uusia huoneita tässä avaruudessa", - "error_no_permission_invite": "Sinulla ei ole oikeuksia kutsua ihmisiä tähän avaruuteen" + "error_no_permission_add_room": "Sinulla ei ole oikeuksia lisätä huoneita tähän tilaan", + "error_no_permission_add_space": "Sinulla ei ole oikeuksia lisätä tiloja tähän tilaan", + "error_no_permission_create_room": "Sinulla ei ole oikeuksia luoda uusia huoneita tässä tilassa", + "error_no_permission_invite": "Sinulla ei ole oikeuksia kutsua ihmisiä tähän tilaan" }, "spotlight": { "public_rooms": { @@ -2716,20 +2722,22 @@ "other": "%(count)s jäsentä" }, "create_new_room_button": "Luo uusi huone", + "failed_querying_public_rooms": "Julkisten huoneiden haku epäonnistui", + "failed_querying_public_spaces": "Julkisten tilojen haku epäonnistui", "group_chat_section_title": "Muut vaihtoehdot", "heading_with_query": "Etsitään \"%(query)s\"", "heading_without_query": "Etsittävät kohteet", "join_button_text": "Liity %(roomAddress)s", "keyboard_scroll_hint": "Käytä vierittääksesi", "messages_label": "Viestit", - "other_rooms_in_space": "Muut huoneet avaruudessa %(spaceName)s", + "other_rooms_in_space": "Muut huoneet tilassa %(spaceName)s", "public_rooms_label": "Julkiset huoneet", - "public_spaces_label": "Julkiset avaruudet", + "public_spaces_label": "Julkiset tilat", "recent_searches_section_title": "Viimeaikaiset haut", "recently_viewed_section_title": "Äskettäin katsottu", "result_may_be_hidden_privacy_warning": "Jotkin tulokset saatetaan piilottaa tietosuojan takia", "result_may_be_hidden_warning": "Jotkin tulokset saatetaan piilottaa", - "spaces_title": "Avaruudet, joissa olet", + "spaces_title": "Tilat, joissa olet", "start_group_chat_button": "Aloita ryhmäkeskustelu" }, "stickers": { @@ -2906,14 +2914,6 @@ "continuation": "Tämä huone on jatkumo toisesta keskustelusta.", "see_older_messages": "Napsauta tästä nähdäksesi vanhemmat viestit." }, - "m.room.encryption": { - "disable_attempt": "Ohitettu yritys poistaa salaus käytöstä", - "disabled": "Salaus pois käytöstä", - "enabled_dm": "Viestit ovat päästä päähän salattuja. Vahvista käyttäjä %(displayName)s hänen profiilissaan - napauta hänen profiilikuvaa.", - "enabled_local": "Tässä keskustelussa olevat viestit salataan päästä päähän.", - "parameters_changed": "Joitakin salausparametreja on muutettu.", - "unsupported": "Tämän huoneen käyttämää salausta ei tueta." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s salli vieraiden liittyvän huoneeseen.", "forbidden": "%(senderDisplayName)s on estänyt vieraiden liittymisen huoneeseen.", @@ -3006,8 +3006,6 @@ "label": "Viestitoiminnot", "view_in_room": "Näytä huoneessa" }, - "message_timestamp_received_at": "Vastaanotettu: %(dateTime)s", - "message_timestamp_sent_at": "Lähetetty: %(dateTime)s", "mjolnir": { "changed_rule_glob": "%(senderName)s muutti estosääntöä muodosta %(oldGlob)s muotoon %(newGlob)s. Syy: %(reason)s", "changed_rule_rooms": "%(senderName)s muutti sääntöä, joka esti huoneita säännöllä %(oldGlob)s muotoon %(newGlob)s. Syy: %(reason)s", @@ -3244,15 +3242,17 @@ "user_info": { "admin_tools_section": "Ylläpitotyökalut", "ban_button_room": "Anna porttikielto huoneeseen", + "ban_button_space": "Anna porttikielto tilasta", "ban_room_confirm_title": "Anna porttikielto huoneeseen %(roomName)s", "ban_space_everything": "Anna porttikielto kaikkeen, mihin pystyn", "deactivate_confirm_action": "Poista käyttäjä pysyvästi", "deactivate_confirm_description": "Käyttäjän poistaminen kirjaa hänet ulos ja estää häntä kirjautumasta takaisin sisään. Lisäksi hän poistuu kaikista huoneista, joissa hän on. Tätä toimintoa ei voi kumota. Oletko varma, että haluat pysyvästi poistaa tämän käyttäjän?", "deactivate_confirm_title": "Poista käyttäjä pysyvästi?", "demote_button": "Alenna", - "demote_self_confirm_description_space": "Et voi perua tätä muutosta, koska olet alentamassa itseäsi. Jos olet viimeinen oikeutettu henkilö tässä avaruudessa, oikeuksia ei voi enää saada takaisin.", + "demote_self_confirm_description_space": "Et voi perua tätä muutosta, koska olet alentamassa itseäsi. Jos olet viimeinen oikeutettu henkilö tässä tilassa, oikeuksia ei voi enää saada takaisin.", "demote_self_confirm_room": "Et voi perua tätä muutosta, koska olet alentamassa itseäsi. Jos olet viimeinen oikeutettu henkilö tässä huoneessa, oikeuksia ei voi enää saada takaisin.", "demote_self_confirm_title": "Alenna itsesi?", + "disinvite_button_space": "Peruuta kutsu tilaan", "error_ban_user": "Porttikiellon antaminen epäonnistui", "error_deactivate": "Käyttäjän poistaminen epäonnistui", "error_kicking_user": "Käyttäjän poistaminen epäonnistui", @@ -3265,7 +3265,7 @@ "jump_to_rr_button": "Hyppää lukukuittaukseen", "kick_button_room": "Poista huoneesta", "kick_button_room_name": "Poista huoneesta %(roomName)s", - "kick_button_space": "Poista avaruudesta", + "kick_button_space": "Poista tilasta", "kick_button_space_everything": "Poista kaikesta mihin pystyn", "promote_warning": "Et voi kumota tätä muutosta, koska olet ylentämässä käyttäjää samalle oikeustasolle kuin itsesi.", "redact": { @@ -3291,7 +3291,8 @@ "room_unencrypted_detail": "Salausta käyttävissä huoneissa viestisi on turvattu, ja vain sinulla ja vastaanottajilla on yksityiset avaimet viestien lukemiseen.", "send_message": "Lähetä viesti", "share_button": "Jaa profiili", - "unban_button_room": "Poista porttikielto huoneeseen", + "unban_button_room": "Poista porttikielto huoneesta", + "unban_button_space": "Poista porttikielto tilasta", "unban_room_confirm_title": "Poista porttikielto huoneeseen %(roomName)s", "unban_space_everything": "Poista porttikielto kaikesta, mihin pystyn", "verify_button": "Varmenna käyttäjä", diff --git a/src/i18n/strings/fr.json b/apps/web/src/i18n/strings/fr.json similarity index 99% rename from src/i18n/strings/fr.json rename to apps/web/src/i18n/strings/fr.json index 0656a11179..e31c0f0907 100644 --- a/src/i18n/strings/fr.json +++ b/apps/web/src/i18n/strings/fr.json @@ -482,7 +482,6 @@ "email_address": "Adresse e-mail", "emoji": "Émojis", "encrypted": "Chiffré", - "encryption_enabled": "Chiffrement activé", "error": "Erreur", "faq": "FAQ", "favourites": "Favoris", @@ -3460,16 +3459,6 @@ "unknown_predecessor": "L’ancienne version de ce salon (identifiant : %(roomId)s) est introuvable, et 'via_servers' ne nous a pas été fourni pour le trouver.", "unknown_predecessor_guess_server": "L’ancienne version de ce salon (identifiant : %(roomId)s) est introuvable, et 'via_servers' ne nous a pas été fourni pour le trouver. Il est possible que déduire le serveur à partir de l’identifiant de salon puisse marcher. Si vous voulez essayer, cliquez sur ce lien :" }, - "m.room.encryption": { - "disable_attempt": "Essai de désactiver le chiffrement ignoré", - "disabled": "Chiffrement non activé", - "enabled": "Les messages ici sont chiffrés de bout en bout. Quand les gens viennent, vous pouvez les vérifier dans leur profil, tapez simplement sur leur image de profil.", - "enabled_dm": "Les messages ici sont chiffrés de bout en bout. Vérifiez %(displayName)s dans son profil - cliquez sur son image de profil.", - "enabled_local": "Les messages de cette conversation seront chiffrés de bout en bout.", - "parameters_changed": "Certains paramètres de chiffrement ont été changés.", - "state_enabled": "Les messages et les événements de ce salon sont chiffrés de bout en bout. Lorsque des personnes rejoignent le salon, vous pouvez les vérifier dans leur profil en cliquant sur leur photo de profil.", - "unsupported": "Le chiffrement utilisé par ce salon n’est pas pris en charge." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s a autorisé les visiteurs à rejoindre le salon.", "forbidden": "%(senderDisplayName)s a empêché les visiteurs de rejoindre le salon.", @@ -3493,7 +3482,7 @@ "m.room.member": { "accepted_3pid_invite": "%(targetName)s a accepté l’invitation pour %(displayName)s", "accepted_invite": "%(targetName)s a accepté une invitation", - "ban": "%(senderName)s a banni %(targetName)s", + "ban": "%(senderName)s a banni un utilisateur", "ban_reason": "%(senderName)s a banni %(targetName)s : %(reason)s", "change_avatar": "%(senderName)s a changé son image de profil", "change_name": "%(oldDisplayName)s a changé son nom d’affichage en %(displayName)s", @@ -3563,8 +3552,6 @@ "label": "Actions de message", "view_in_room": "Voir dans le salon" }, - "message_timestamp_received_at": "Reçu à : %(dateTime)s", - "message_timestamp_sent_at": "Envoyé à : %(dateTime)s", "mjolnir": { "changed_rule_glob": "%(senderName)s a mis à jour une règle de bannissement correspondant à %(oldGlob)s vers une règle correspondant à %(newGlob)s pour %(reason)s", "changed_rule_rooms": "%(senderName)s a changé une règle qui bannit les salons correspondant à %(oldGlob)s vers une règle correspondant à %(newGlob)s pour %(reason)s", diff --git a/src/i18n/strings/gl.json b/apps/web/src/i18n/strings/gl.json similarity index 99% rename from src/i18n/strings/gl.json rename to apps/web/src/i18n/strings/gl.json index dc2b16bc04..97c2b567f0 100644 --- a/src/i18n/strings/gl.json +++ b/apps/web/src/i18n/strings/gl.json @@ -373,7 +373,6 @@ "edited": "editada", "email_address": "Enderezo de correo", "encrypted": "Cifrado", - "encryption_enabled": "Cifrado activado", "error": "Fallo", "faq": "PMF", "favourites": "Favoritas", @@ -2479,13 +2478,6 @@ "continuation": "Esta sala é continuación doutra conversa.", "see_older_messages": "Preme aquí para ver mensaxes antigas." }, - "m.room.encryption": { - "disable_attempt": "Intento ignorado de desactivar o cifrado", - "disabled": "Cifrado desactivado", - "enabled_local": "As mensaxes deste chat van estar cifrados de extremo-a-extremo.", - "parameters_changed": "Algún dos parámetros de cifrado foron cambiados.", - "unsupported": "O cifrado desta sala non está soportado." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s permite que as convidadas se unan a sala.", "forbidden": "%(senderDisplayName)s non permite que as convidadas se unan a sala.", diff --git a/src/i18n/strings/he.json b/apps/web/src/i18n/strings/he.json similarity index 99% rename from src/i18n/strings/he.json rename to apps/web/src/i18n/strings/he.json index ea1dcba2a7..5c92702538 100644 --- a/src/i18n/strings/he.json +++ b/apps/web/src/i18n/strings/he.json @@ -343,7 +343,6 @@ "email_address": "כתובת דוא\"ל", "emoji": "אימוג'י", "encrypted": "מוצפן", - "encryption_enabled": "הצפנה הופעלה", "error": "שגיאה", "faq": "שאלות נפוצות", "favourites": "מועדפים", @@ -2017,13 +2016,6 @@ "continuation": "החדר הזה הוא המשך לשיחה אחרת.", "see_older_messages": "לחץ כאן לראות הודעות ישנות." }, - "m.room.encryption": { - "disable_attempt": "התעלם מהניסיון להשבית את ההצפנה", - "disabled": "ההצפנה לא מופעלת", - "enabled_local": "הודעות בצ'אט זה יוצפו מקצה לקצה.", - "parameters_changed": "מספר פרמטרים של הצפנה שונו.", - "unsupported": "ההצפנה בה משתמשים בחדר זה אינה נתמכת." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s איפשר לאורחים להכנס אל החדר.", "forbidden": "%(senderDisplayName)s מנע אפשרות מאורחים להכנס אל החדר.", diff --git a/src/i18n/strings/hr.json b/apps/web/src/i18n/strings/hr.json similarity index 99% rename from src/i18n/strings/hr.json rename to apps/web/src/i18n/strings/hr.json index 6667d264ed..3fd595c0fd 100644 --- a/src/i18n/strings/hr.json +++ b/apps/web/src/i18n/strings/hr.json @@ -485,7 +485,6 @@ "email_address": "E-adresa", "emoji": "Emotikon", "encrypted": "Šifrirano", - "encryption_enabled": "Šifriranje je omogućeno", "error": "Geška", "faq": "Česta pitanja", "favourites": "Favoriti", @@ -3507,16 +3506,6 @@ "unknown_predecessor": "Nije moguće pronaći staru inačicu ove sobe (ID sobe: %(roomId)s), a nismo dobili ‘via_servers’ za pretraživanje.", "unknown_predecessor_guess_server": "Nije moguće pronaći staru inačicu ove sobe (ID sobe: %(roomId)s), a nismo dobili ‘via_servers’ za pretraživanje. Poslužitelj bi se mogao pronaći na temelju ID-a sobe. Ako želite pokušati, kliknite ovu poveznicu:" }, - "m.room.encryption": { - "disable_attempt": "Ignorirani pokušaj onemogućavanja šifriranja", - "disabled": "Šifriranje nije omogućeno", - "enabled": "Poruke u ovoj sobi sveobuhvatno su šifrirane. Kada se osobe pridruže, možete ih potvrditi u njihovu profilu, tako da samo dodirnete njihovu profilnu sliku.", - "enabled_dm": "Ovdje su poruke sveobuhvatno šifrirane. Potvrdite %(displayName)s u njihovu profilu – dodirnite njihovu profilnu sliku.", - "enabled_local": "Poruke u ovom razgovoru bit će sveobuhvatno šifrirane.", - "parameters_changed": "Neki parametri šifriranja su promijenjeni.", - "state_enabled": "Poruke i događaji u ovoj sobi sveobuhvatno su šifrirani. Kada se osobe pridruže, možete ih potvrditi u njihovu profilu, tako da samo dodirnete njihovu profilnu sliku.", - "unsupported": "Šifriranje kojim se koristi ova soba nije podržano." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s dopustio/la je gostima da se pridruže sobi.", "forbidden": "%(senderDisplayName)s spriječio/la je goste da se pridruže sobi.", @@ -3610,8 +3599,6 @@ "label": "Radnje s porukama", "view_in_room": "Pregled u sobi" }, - "message_timestamp_received_at": "Primljeno u: %(dateTime)s", - "message_timestamp_sent_at": "Poslano u: %(dateTime)s", "mjolnir": { "changed_rule_glob": "%(senderName)s ažurirao/la je pravilo kojim se zabranjuju korisnici koji odgovaraju %(oldGlob)s na one koji odgovaraju %(newGlob)s za %(reason)s", "changed_rule_rooms": "%(senderName)s promijenio/la je pravilo kojim se zabranjuju sobe koje odgovaraju %(oldGlob)s na one koje odgovaraju %(newGlob)s za %(reason)s", diff --git a/src/i18n/strings/hu.json b/apps/web/src/i18n/strings/hu.json similarity index 99% rename from src/i18n/strings/hu.json rename to apps/web/src/i18n/strings/hu.json index 41aedbf896..e4bc0d058e 100644 --- a/src/i18n/strings/hu.json +++ b/apps/web/src/i18n/strings/hu.json @@ -482,7 +482,6 @@ "email_address": "E-mail-cím", "emoji": "Emodzsi", "encrypted": "Titkosítva", - "encryption_enabled": "Titkosítás bekapcsolva", "error": "Hiba", "faq": "GYIK", "favourites": "Kedvencek", @@ -3431,16 +3430,6 @@ "unknown_predecessor": "A szoba régi verziója nem található (szobaazonosító: %(roomId)s), és a megkereséséhez nem lett megadva a „via_servers”.", "unknown_predecessor_guess_server": "A szoba régi verziója nem található (szobaazonosító: %(roomId)s), és a megkereséséhez nem lett megadva a „via_servers”. Lehetséges, hogy a szobaazonosító kitalálása működni fog. Ha meg akarja próbálni, kattintson erre a hivatkozásra:" }, - "m.room.encryption": { - "disable_attempt": "A titkosítás kikapcsolására tett kísérlet figyelmen kívül lett hagyva", - "disabled": "Titkosítás nincs engedélyezve", - "enabled": "Az ebben a szobában lévő üzenetek végpontok közti titkosítással rendelkeznek. Amikor valaki csatlakozik, akkor ellenőrizheti a profilján, csak koppintson a profilképére.", - "enabled_dm": "Az itt található üzenetek végpontok közti titkosítással rendelkeznek. Ellenőrizze %(displayName)s felhasználót a profilján – kattintson a a profilképére.", - "enabled_local": "Az üzenetek ebben a beszélgetésben végponti titkosítással vannak védve.", - "parameters_changed": "Néhány titkosítási paraméter megváltozott.", - "state_enabled": "Az ebben a szobában lévő üzenetek és állapotesemények végpontok közötti titkosítással vannak ellátva. Amikor valaki csatlakozik, ellenőrizheti a profiljában, csak koppintson a profilképére.", - "unsupported": "A szobában használt titkosítás nem támogatott." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s megengedte a vendégeknek, hogy beléphessenek a szobába.", "forbidden": "%(senderDisplayName)s megtiltotta a vendégeknek, hogy belépjenek a szobába.", @@ -3534,8 +3523,6 @@ "label": "Üzenetműveletek", "view_in_room": "Megjelenítés szobában" }, - "message_timestamp_received_at": "Érkezett: %(dateTime)s", - "message_timestamp_sent_at": "Elküldve:%(dateTime)s", "mjolnir": { "changed_rule_glob": "%(senderName)s megváltoztatta a kitiltó szabályt erről: %(oldGlob)s, erre: %(newGlob)s, ok: %(reason)s", "changed_rule_rooms": "%(senderName)s megváltoztatta a szobákat kitiltó szabályt erről: %(oldGlob)s, erre: %(newGlob)s, ok: %(reason)s", diff --git a/src/i18n/strings/hy.json b/apps/web/src/i18n/strings/hy.json similarity index 99% rename from src/i18n/strings/hy.json rename to apps/web/src/i18n/strings/hy.json index 9bbc3606ce..a6d02df7ef 100644 --- a/src/i18n/strings/hy.json +++ b/apps/web/src/i18n/strings/hy.json @@ -482,7 +482,6 @@ "email_address": "Էլ.փոստի հասցե", "emoji": "Էմոջի", "encrypted": "Ծածկագրված", - "encryption_enabled": "Գաղտնագրումը միացված է", "error": "Սխալ", "faq": "Հաճախ տրվող հարցեր", "favourites": "Ընտրյալներ", @@ -3363,15 +3362,6 @@ "unknown_predecessor": "Հնարավոր չէ գտնել այս սենյակի հին տարբերակը (սենյակի ID՝ %(roomId)s ), և մեզ չի տրամադրվել «via_servers»՝ այն փնտրելու համար։", "unknown_predecessor_guess_server": "Հնարավոր չէ գտնել այս սենյակի հին տարբերակը (սենյակի ID՝ %(roomId)s ), և մեզ չի տրամադրվել «via_servers»՝ այն որոնելու համար։ Հնարավոր է, որ սենյակի ID-ից սերվերը գուշակելը կստացվի։ Եթե ուզում եք փորձել, սեղմեք այս հղման վրա։" }, - "m.room.encryption": { - "disable_attempt": "Գաղտնագրումն անջատելու անտեսված փորձ", - "disabled": "Գաղտնագրումը միացված չէ", - "enabled": "Այս սենյակում հաղորդագրությունները ծայրից ծայր գաղտնագրված են։ Երբ մարդիկ միանում են, դուք կարող եք հաստատել նրանց իրենց էջում՝ պարզապես սեղմելով նրանց էջի նկարի վրա։", - "enabled_dm": "Այստեղ հաղորդագրությունները ծայրից ծայր գաղտնագրված են: Ստուգեք %(displayName)s-ին իր պրոֆիլում․ սեղմեք նրա պրոֆիլի նկարին:", - "enabled_local": "Այս զրույցի հաղորդագրությունները կլինեն ծայրից ծայր գաղտնագրված։", - "parameters_changed": "Որոշ գաղտնագրման պարամետրեր փոխվել են:", - "unsupported": "Այս սենյակի կողմից օգտագործվող գաղտնագրումը չի աջակցվում։" - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s-ը թույլ է տվել հյուրերին միանալ սենյակին:", "forbidden": "%(senderDisplayName)s-ը կանխել է հյուրերին միանալ սենյակին:", @@ -3465,8 +3455,6 @@ "label": "Հաղորդագրության գործողություններ", "view_in_room": "Դիտել սենյակում" }, - "message_timestamp_received_at": "Ստացվել է՝ %(dateTime)s-ին", - "message_timestamp_sent_at": "Ուղարկվել է՝ %(dateTime)s֊ին", "mjolnir": { "changed_rule_glob": "%(senderName)s թարմացրեց արգելքի կանոնը, որը նախկինում համապատասխանում էր %(oldGlob)s-ին, այժմ՝ %(newGlob)s-ին՝ %(reason)s պատճառով։", "changed_rule_rooms": "%(senderName)s փոխեց կանոնը, որը արգելափակում էր %(oldGlob)s համապատասխանող սենյակները, այժմ այն գործում է %(newGlob)s համապատասխանողների համար՝ %(reason)s պատճառով։", diff --git a/src/i18n/strings/id.json b/apps/web/src/i18n/strings/id.json similarity index 99% rename from src/i18n/strings/id.json rename to apps/web/src/i18n/strings/id.json index 629e3aa8bf..5f83e7db4c 100644 --- a/src/i18n/strings/id.json +++ b/apps/web/src/i18n/strings/id.json @@ -482,7 +482,6 @@ "email_address": "Alamat email", "emoji": "Emoji", "encrypted": "Terenkripsi", - "encryption_enabled": "Enkripsi diaktifkan", "error": "Kesalahan", "faq": "Pertanyaan Umum", "favourites": "Favorit", @@ -3447,16 +3446,6 @@ "unknown_predecessor": "Tidak dapat mencari versi lama ruangan ini (ID ruangan: %(roomId)s), dan kami tidak disediakan dengan 'via_servers' untuk mencarinya.", "unknown_predecessor_guess_server": "Tidak dapat mencari versi lama ruangan ini (ID ruangan: %(roomId)s), dan kami tidak disediakan dengan 'via_servers' untuk mencarinya. Ini mungkin bahwa menebak server dari ID ruangan akan bekerja. Jika Anda ingin mencoba, klik tautan berikut:" }, - "m.room.encryption": { - "disable_attempt": "Mengabaikan percobaan untuk menonaktifkan enkripsi", - "disabled": "Enkripsi tidak diaktifkan", - "enabled": "Pesan-pesan di ruangan ini dienkripsi secara ujung ke ujung. Ketika orang-orang bergabung, Anda dapat memverifikasi mereka di profil mereka dengan mengetuk pada foto profil mereka.", - "enabled_dm": "Pesan-pesan di sini dienkripsi secara ujung ke ujung. Verifikasi %(displayName)s di profilnya — ketuk pada profilnya.", - "enabled_local": "Pesan di obrolan ini akan dienkripsi secara ujung ke ujung.", - "parameters_changed": "Beberapa parameter enkripsi telah diubah.", - "state_enabled": "Pesan dan peristiwa status di ruangan ini dienkripsi secara ujung ke ujung. Saat orang bergabung, Anda dapat memverifikasi mereka di profil mereka, cukup ketuk gambar profil mereka.", - "unsupported": "Enkripsi yang digunakan di ruangan ini tidak didukung." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s telah mengizinkan tamu untuk bergabung dengan ruangan ini.", "forbidden": "%(senderDisplayName)s telah mencegah tamu untuk bergabung dengan ruangan ini.", @@ -3550,8 +3539,6 @@ "label": "Aksi Pesan", "view_in_room": "Tampilkan di ruangan" }, - "message_timestamp_received_at": "Diterima pada: %(dateTime)s", - "message_timestamp_sent_at": "Dikirim pada: %(dateTime)s", "mjolnir": { "changed_rule_glob": "%(senderName)s memperbarui sebuah peraturan pencekalan yang sebelumnya berisi %(oldGlob)s ke %(newGlob)s untuk %(reason)s", "changed_rule_rooms": "%(senderName)s mengubah sebuah peraturan pencekalan ruangan yang sebelumnya berisi %(oldGlob)s ke %(newGlob)s untuk %(reason)s", diff --git a/src/i18n/strings/is.json b/apps/web/src/i18n/strings/is.json similarity index 99% rename from src/i18n/strings/is.json rename to apps/web/src/i18n/strings/is.json index e961601cdf..b6b54fda07 100644 --- a/src/i18n/strings/is.json +++ b/apps/web/src/i18n/strings/is.json @@ -373,7 +373,6 @@ "email_address": "Tölvupóstfang", "emoji": "Tjáningartáknmynd", "encrypted": "Dulritað", - "encryption_enabled": "Dulritun virk", "error": "Villa", "faq": "Algengar spurningar", "favourites": "Eftirlæti", @@ -2415,12 +2414,6 @@ "continuation": "Þessi spjallrás er framhald af öðru samtali.", "see_older_messages": "Smelltu hér til að sjá eldri skilaboð." }, - "m.room.encryption": { - "disable_attempt": "Hunsaði tilraun til að gera dulritun óvirka", - "disabled": "Dulritun ekki virk", - "enabled_local": "Skilaboð í þessu spjalli verða enda-í-enda dulrituð.", - "unsupported": "Dulritunin sem notuð er í þessari spjallrás er ekki studd." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s hefur leyft gestum að koma inn á spjallrásina.", "forbidden": "%(senderDisplayName)s hefur bannað gestum að koma inn á spjallrásina.", diff --git a/src/i18n/strings/it.json b/apps/web/src/i18n/strings/it.json similarity index 99% rename from src/i18n/strings/it.json rename to apps/web/src/i18n/strings/it.json index a1fc8a4364..a656bd4186 100644 --- a/src/i18n/strings/it.json +++ b/apps/web/src/i18n/strings/it.json @@ -432,7 +432,6 @@ "email_address": "Indirizzo email", "emoji": "Emoji", "encrypted": "Crittografato", - "encryption_enabled": "Crittografia attivata", "error": "Errore", "faq": "Domande frequenti", "favourites": "Preferiti", @@ -2956,15 +2955,6 @@ "unknown_predecessor": "Impossibile trovare la vecchia versione della stanza (ID stanza: %(roomId)s) e non ci è stato fornito 'via_servers' per cercarla.", "unknown_predecessor_guess_server": "Impossibile trovare la vecchia versione della stanza (ID stanza: %(roomId)s) e non ci è stato fornito 'via_servers' per cercarla. È possibile che indovinare il server dall'ID della stanza possa funzionare. Se vuoi provare, clicca questo link:" }, - "m.room.encryption": { - "disable_attempt": "Tentativo di disattivare la crittografia ignorato", - "disabled": "Crittografia non attivata", - "enabled": "I messaggi in questa stanza sono cifrati end-to-end. Quando qualcuno entra puoi verificarlo nel suo profilo, ti basta toccare la sua immagine.", - "enabled_dm": "Qui i messaggi sono cifrati end-to-end. Verifica %(displayName)s nel suo profilo - tocca la sua immagine.", - "enabled_local": "I messaggi in questa conversazione saranno cifrati end-to-end.", - "parameters_changed": "Alcuni parametri di crittografia sono stati modificati.", - "unsupported": "La crittografia usata da questa stanza non è supportata." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s ha attivato l'accesso per ospiti alla stanza.", "forbidden": "%(senderDisplayName)s ha disattivato l'accesso per ospiti alla stanza.", @@ -3055,8 +3045,6 @@ "label": "Azioni messaggio", "view_in_room": "Vedi nella stanza" }, - "message_timestamp_received_at": "Ricevuto il: %(dateTime)s", - "message_timestamp_sent_at": "Inviato il: %(dateTime)s", "mjolnir": { "changed_rule_glob": "%(senderName)s ha modificato una regola di ban che corrispondeva a %(oldGlob)s per corrispondere a %(newGlob)s perchè %(reason)s", "changed_rule_rooms": "%(senderName)s ha modificato una regola che bandiva stanze corrispondenti a %(oldGlob)s per corrispondere a %(newGlob)s perchè %(reason)s", diff --git a/src/i18n/strings/ja.json b/apps/web/src/i18n/strings/ja.json similarity index 99% rename from src/i18n/strings/ja.json rename to apps/web/src/i18n/strings/ja.json index 7898377be9..3b552000fb 100644 --- a/src/i18n/strings/ja.json +++ b/apps/web/src/i18n/strings/ja.json @@ -413,7 +413,6 @@ "email_address": "メールアドレス", "emoji": "絵文字", "encrypted": "暗号化", - "encryption_enabled": "暗号化が有効です", "error": "エラー", "faq": "よくある質問", "favourites": "お気に入り", @@ -2698,13 +2697,6 @@ "continuation": "このルームは別の会話の続きです。", "see_older_messages": "ここをクリックすると、以前のメッセージを表示します。" }, - "m.room.encryption": { - "disable_attempt": "暗号化を無効にする試みを無視しました", - "disabled": "暗号化が有効になっていません", - "enabled_local": "このチャットのメッセージはエンドツーエンドで暗号化されます。", - "parameters_changed": "暗号化のパラメーターのいくつかが変更されました。", - "unsupported": "このルームで使用されている暗号化はサポートされていません。" - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)sがこのルームへのゲストによる参加を許可しました。", "forbidden": "%(senderDisplayName)sがこのルームへのゲストによる参加を拒否しました。", diff --git a/src/i18n/strings/ka.json b/apps/web/src/i18n/strings/ka.json similarity index 99% rename from src/i18n/strings/ka.json rename to apps/web/src/i18n/strings/ka.json index 7c40ab250d..7ccea2e5d6 100644 --- a/src/i18n/strings/ka.json +++ b/apps/web/src/i18n/strings/ka.json @@ -393,7 +393,6 @@ "email_address": "Ელექტრონული მისამართი", "emoji": "სიცილაკები", "encrypted": "დაშიფრულია", - "encryption_enabled": "დაშიფვრა ჩართულია", "error": "შეცდომა", "faq": "ხშირად დასმული კითხვები", "favourites": "რჩეულები", @@ -2312,15 +2311,6 @@ "unknown_predecessor": "ამ ოთახის ძველი ვერსია ვერ მოიძებნა (ოთახის ID:%(roomId)s ), და ჩვენ არ მოგვაწოდეს 'via_servers' მის მოსაძებნად.", "unknown_predecessor_guess_server": "ამ ოთახის ძველი ვერსია ვერ მოიძებნა (ოთახის ID:%(roomId)s ), და ჩვენ არ მოგვაწოდეს 'via_servers' მის მოსაძებნად. შესაძლებელია, რომ სერვერის გამოცნობა ოთახის ID-დან იმუშავებს. თუ გსურთ სცადოთ, დააწკაპუნეთ ამ ბმულზე:" }, - "m.room.encryption": { - "disable_attempt": "იგნორირებულია დაშიფვრის გამორთვის მცდელობა", - "disabled": "დაშიფვრა არ არის ჩართული", - "enabled": "ამ ოთახში შეტყობინებები დაშიფრულია ბოლომდე. როდესაც ადამიანები შეუერთდებიან, შეგიძლიათ დაადასტუროთ ისინი მათ პროფილში, უბრალოდ შეეხეთ მათი პროფილის სურათს.", - "enabled_dm": "შეტყობინებები აქ არის ბოლომდე დაშიფრული. გადაამოწმეთ%(displayName)s მათ პროფილში - შეეხეთ მათი პროფილის სურათს.", - "enabled_local": "შეტყობინებები ამ ჩეთში იქნება ბოლომდე დაშიფრული.", - "parameters_changed": "დაშიფვრის ზოგიერთი პარამეტრი შეიცვალა.", - "unsupported": "ამ ოთახის მიერ გამოყენებული დაშიფვრა მხარდაჭერილი არ არის." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)sსტუმრებს საშუალება მისცა შეუერთდნენ ოთახს.", "forbidden": "%(senderDisplayName)sხელი შეუშალა სტუმრებს ოთახში შეერთებაში.", diff --git a/src/i18n/strings/ko.json b/apps/web/src/i18n/strings/ko.json similarity index 99% rename from src/i18n/strings/ko.json rename to apps/web/src/i18n/strings/ko.json index afc0f81acf..fab0d0dbdd 100644 --- a/src/i18n/strings/ko.json +++ b/apps/web/src/i18n/strings/ko.json @@ -479,7 +479,6 @@ "email_address": "이메일 주소", "emoji": "이모지", "encrypted": "암호화됨", - "encryption_enabled": "암호화 활성화됨", "error": "오류", "faq": "자주 묻는 질문 (FAQ)", "favourites": "즐겨찾기", @@ -2978,11 +2977,13 @@ "connection_section": "연결", "dialog_title": "설정: 음성 및 영상", "echo_cancellation": "에코 제거", + "echo_cancellation_description": "통화 중 마이크 입력에서 에코를 제거합니다. 이 설정은 Element Call에도 적용됩니다.", "enable_fallback_ice_server": "대체 통화 지원 서버 허용 (%(server)s)", "enable_fallback_ice_server_description": "홈 서버에서 제공하지 않는 경우에만 적용됩니다. 통화 중 귀하의 IP 주소가 공유될 수 있습니다.", "mirror_local_feed": "보고 있는 비디오 전송 상태 비추기", "missing_permissions_prompt": "미디어 권한이 없습니다, 권한 요청을 보내려면 아래 버튼을 클릭하세요.", "noise_suppression": "잡음 억제", + "noise_suppression_description": "통화 중 마이크로 입력되는 주변 소음을 줄여줍니다. 이 설정은 Element Call에도 적용됩니다.", "request_permissions": "미디어 권한 요청", "title": "음성 & 영상", "video_input_empty": "카메라 감지 없음", @@ -3394,16 +3395,6 @@ "unknown_predecessor": "해당 방의 이전 버전(방 ID: %(roomId)s)을 찾을 수 없으며, 이를 검색할 수 있는 'via_servers' 정보도 제공받지 못했습니다.", "unknown_predecessor_guess_server": "해당 방의 이전 버전(방 ID: %(roomId)s)을 찾을 수 없으며, 이를 검색할 'via_servers' 정보도 제공받지 못했습니다. 방 ID로 서버를 추측하는 방법이 통할 수도 있습니다. 시도해 보시려면 이 링크를 클릭하세요:" }, - "m.room.encryption": { - "disable_attempt": "암호화 비활성화 시도가 무시됨", - "disabled": "암호화가 활성화되지 않았습니다", - "enabled": "이 방의 메시지는 종단 간 암호화됩니다. 사람들이 참여하면 프로필에서 확인할 수 있습니다. 프로필 사진을 탭하기만 하면 됩니다.", - "enabled_dm": "여기서 메시지는 종단 간 암호화됩니다. 상대방 프로필에서 %(displayName)s 를 확인하세요 - 프로필 사진을 탭하세요.", - "enabled_local": "이 채팅의 메시지는 종단 간 암호화됩니다.", - "parameters_changed": "일부 암호화 매개변수가 변경되었습니다.", - "state_enabled": "이 방의 메시지와 상태 이벤트는 종단간 암호화됩니다. 참여자의 프로필 사진을 누르면 신원을 검증할 수 있습니다.", - "unsupported": "이 방에서 사용하는 암호화 방식은 지원되지 않습니다." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s님이 손님이 방에 들어갈 수 있도록 허용했습니다.", "forbidden": "%(senderDisplayName)s님이 손님이 방에 들어가지 못하도록 했습니다.", @@ -3497,8 +3488,6 @@ "label": "메시지 동작", "view_in_room": "방에서 보기" }, - "message_timestamp_received_at": "수신시간: %(dateTime)s", - "message_timestamp_sent_at": "발송 시간: %(dateTime)s", "mjolnir": { "changed_rule_glob": "%(senderName)s님이 차단 규칙의 일치 패턴을 **'%(oldGlob)s'**에서 '%(newGlob)s'(으)로 '%(reason)s' 사유로 변경했습니다.", "changed_rule_rooms": "%(senderName)s님이 채팅방 차단 규칙의 일치 패턴을 **'%(oldGlob)s'**에서 '%(newGlob)s'(으)로 '%(reason)s' 사유로 변경했습니다.", diff --git a/src/i18n/strings/lo.json b/apps/web/src/i18n/strings/lo.json similarity index 99% rename from src/i18n/strings/lo.json rename to apps/web/src/i18n/strings/lo.json index bc3e410cb5..51c02ed64d 100644 --- a/src/i18n/strings/lo.json +++ b/apps/web/src/i18n/strings/lo.json @@ -372,7 +372,6 @@ "email_address": "ທີ່ຢູ່ອີເມວ", "emoji": "ອີໂມຈິ", "encrypted": "ເຂົ້າລະຫັດແລ້ວ", - "encryption_enabled": "ເປີດໃຊ້ການເຂົ້າລະຫັດແລ້ວ", "error": "ມີບັນຫາ", "faq": "ຄໍາຖາມທີ່ພົບເປັນປະຈໍາ", "favourites": "ລາຍການທີ່ມັກ", @@ -2383,12 +2382,6 @@ "continuation": "ຫ້ອງນີ້ແມ່ນສືບຕໍ່ການສົນທະນາອື່ນ.", "see_older_messages": "ກົດທີ່ນີ້ເພື່ອເບິ່ງຂໍ້ຄວາມເກົ່າ." }, - "m.room.encryption": { - "disable_attempt": "ປະຕິເສດຄວາມພະຍາຍາມປິດການເຂົ້າລະຫັດ", - "disabled": "ບໍ່ໄດ້ເປີດໃຊ້ການເຂົ້າລະຫັດ", - "parameters_changed": "ບາງຕົວກໍານົດການເຂົ້າລະຫັດໄດ້ຖືກປ່ຽນແປງ.", - "unsupported": "ບໍ່ຮອງຮັບການເຂົ້າລະຫັດທີ່ໃຊ້ໂດຍຫ້ອງນີ້." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s ໄດ້ອະນຸຍາດໃຫ້ແຂກເຂົ້າຮ່ວມຫ້ອງແລ້ວ.", "forbidden": "%(senderDisplayName)s ໄດ້ປ້ອງກັນບໍ່ໃຫ້ແຂກເຂົ້າຮ່ວມຫ້ອງ.", diff --git a/src/i18n/strings/lt.json b/apps/web/src/i18n/strings/lt.json similarity index 99% rename from src/i18n/strings/lt.json rename to apps/web/src/i18n/strings/lt.json index 5693c829a0..da17fac624 100644 --- a/src/i18n/strings/lt.json +++ b/apps/web/src/i18n/strings/lt.json @@ -307,7 +307,6 @@ "email_address": "El. pašto adresas", "emoji": "Jaustukai", "encrypted": "Užšifruota", - "encryption_enabled": "Šifravimas įjungtas", "error": "Klaida", "faq": "DUK", "favourites": "Mėgstami", @@ -1867,13 +1866,6 @@ "continuation": "Šis kambarys yra kito pokalbio pratęsimas.", "see_older_messages": "Spustelėkite čia, norėdami matyti senesnes žinutes." }, - "m.room.encryption": { - "disable_attempt": "Bandymas išjungti šifravimą buvo ignoruotas", - "disabled": "Šifravimas neįjungtas", - "enabled_local": "Žinutės šiame pokalbyje bus visapusiškai užšifruotos.", - "parameters_changed": "Pakeisti kai kurie šifravimo parametrai.", - "unsupported": "Šiame kambaryje naudojamas šifravimas nėra palaikomas." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s leido svečiams prisijungti prie kambario.", "forbidden": "%(senderDisplayName)s uždraudė svečiams prisijungti prie kambario.", diff --git a/src/i18n/strings/lv.json b/apps/web/src/i18n/strings/lv.json similarity index 99% rename from src/i18n/strings/lv.json rename to apps/web/src/i18n/strings/lv.json index fcbef37e5e..1a84881b50 100644 --- a/src/i18n/strings/lv.json +++ b/apps/web/src/i18n/strings/lv.json @@ -465,7 +465,6 @@ "email_address": "Epasta adrese", "emoji": "Emocijzīmes", "encrypted": "Šifrēts", - "encryption_enabled": "Šifrēšana iespējota", "error": "Kļūda", "faq": "BUJ", "favourites": "Izlase", @@ -2883,15 +2882,6 @@ "unknown_predecessor": "Nevar atrast veco šīs istabas versiju (istabas ID:%(roomId)s), un mums nav pieejams “via_servers”, lai to meklētu.", "unknown_predecessor_guess_server": "Nevar atrast šīs telpas veco versiju (istabas ID:%(roomId)s), un mums nav pieejams 'via_servers' , lai to meklētu. Iespējams, ka noderēs servera uzminēšana pēc istabas ID. Ja vēlaties izmēģināt, noklikšķiniet uz šīs saites:" }, - "m.room.encryption": { - "disable_attempt": "Vērā neņemts mēģinājums atspējot šifrēšanu", - "disabled": "Šifrēšana nav iespējota", - "enabled": "Ziņas šajā istabā ir pilnībā šifrētas. Kad cilvēki pievienosies, Tu vari apstiprināt viņus viņu profilā, ir tikai jāpiesit viņu profila attēlam.", - "enabled_dm": "Ziņas šeit ir pilnībā šifrētas. Apstiprini %(displayName)s viņa profilā - piesit viņa profila attēlam!", - "enabled_local": "Ziņām šajā istabā tiek piemērota pilnīga šifrēšana.", - "parameters_changed": "Daži šifrēšanas parametri ir mainīti.", - "unsupported": "Šajā telpā izmantotā šifrēšana netiek atbalstīta." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s atļāva viesiem pievienoties istabai.", "forbidden": "%(senderDisplayName)s aizliedza viesiem pievienoties istabai.", diff --git a/src/i18n/strings/mg_MG.json b/apps/web/src/i18n/strings/mg_MG.json similarity index 99% rename from src/i18n/strings/mg_MG.json rename to apps/web/src/i18n/strings/mg_MG.json index 2ccf34dfaf..6539522e4a 100644 --- a/src/i18n/strings/mg_MG.json +++ b/apps/web/src/i18n/strings/mg_MG.json @@ -429,7 +429,6 @@ "email_address": "Adiresy imailaka", "emoji": "Sary fanehoam-pietseam-po", "encrypted": "Nafenina", - "encryption_enabled": "Kilalao", "error": "Fahadisoana", "faq": "Soloky", "favourites": "Ankafizina", @@ -2939,15 +2938,6 @@ "unknown_predecessor": "Tsy hita ny dikan-teny taloha amin'ity efitrano ity ( ID efitrano:%(roomId)s ), ary tsy nomena via_servers izahay hitadiavana azy.", "unknown_predecessor_guess_server": "Tsy hita ny kinova tranainy an'ity efitrano ity ( ID efitrano:%(roomId)s ), ary tsy nomena via_servers izahay hitadiavana azy. Mety ho azo atao ny maminavina ny mpizara avy amin'ny ID efitrano. Raha te hanandrana ianao dia tsindrio ity rohy ity:" }, - "m.room.encryption": { - "disable_attempt": "Tsy noraharahiana ny fikasana hanafoana ny fanafenana", - "disabled": "Tsy mandeha ny encryption", - "enabled": "Ny hafatra ao amin'ity efitrano ity dia misy encryption. Rehefa miditra ny olona dia azonao atao ny manamarina azy ireo ao amin'ny mombamomba azy, tsindrio fotsiny ny sarin'ny mombamomba azy.", - "enabled_dm": "Ny hafatra eto dia misy encryption avy hatrany. manamarina%(displayName)s ao amin'ny mombamomba azy - tsindrio ny sarin'ny mombamomba azy.", - "enabled_local": "Ny hafatra ao amin'ity chat ity dia hatao encryption.", - "parameters_changed": "Misy masontsivana fanafenana novana.", - "unsupported": "Ny fanafenana ampiasain'ity efitrano ity dia tsy tohanana." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)sdia namela ny vahiny hanatevin-daharana ny efitrano.", "forbidden": "%(senderDisplayName)sdia nanakana ny vahiny tsy hiditra ao amin'ny efitrano.", @@ -3035,8 +3025,6 @@ "label": "Asa atao amin'ny hafatra", "view_in_room": "Jereo ao amin'ny" }, - "message_timestamp_received_at": "Voaray tamin'ny:%(dateTime)s", - "message_timestamp_sent_at": "Nalefa tamin'ny:%(dateTime)s", "mjolnir": { "changed_rule_glob": "%(senderName)snanavao ny fitsipika fandrarana izay nifanaraka%(oldGlob)s mifanaraka%(newGlob)s hoan'ny%(reason)s", "changed_rule_rooms": "%(senderName)snanova fitsipika mandràra ny fampifanarahana ny efitrano%(oldGlob)s mifanaraka%(newGlob)s hoan'ny%(reason)s", diff --git a/src/i18n/strings/nb_NO.json b/apps/web/src/i18n/strings/nb_NO.json similarity index 99% rename from src/i18n/strings/nb_NO.json rename to apps/web/src/i18n/strings/nb_NO.json index 9475ba4404..def49958ce 100644 --- a/src/i18n/strings/nb_NO.json +++ b/apps/web/src/i18n/strings/nb_NO.json @@ -482,7 +482,6 @@ "email_address": "E-postadresse", "emoji": "Emoji", "encrypted": "Kryptert", - "encryption_enabled": "Kryptering er skrudd på", "error": "Feil", "faq": "Ofte Stilte Spørsmål", "favourites": "Favoritter", @@ -3449,15 +3448,6 @@ "unknown_predecessor": "Finner ikke den gamle versjonen av dette rommet (rom-ID:%(roomId)s), og vi har ikke fått 'via_servers' for å lete etter det.", "unknown_predecessor_guess_server": "Finner ikke den gamle versjonen av dette rommet (rom-ID:%(roomId)s), og vi har ikke fått 'via_servers' for å lete etter det. Det er mulig at gjette serveren fra rom-ID-en vil fungere. Hvis du vil prøve, klikk på denne lenken:" }, - "m.room.encryption": { - "disable_attempt": "Ignorert forsøk på å deaktivere kryptering", - "disabled": "Kryptering er ikke skrudd på", - "enabled": "Meldinger i dette rommet er ende-til-ende-kryptert. Når folk blir med, kan du bekrefte dem i profilen deres, bare trykk på profilbildet deres.", - "enabled_dm": "Meldinger her er ende-til-ende-kryptert. Bekreft %(displayName)s i profilen deres - trykk på profilbildet deres.", - "enabled_local": "Meldinger i denne chatten vil være ende-til-ende-kryptert.", - "parameters_changed": "Noen krypteringsparametere er endret.", - "unsupported": "Krypteringen som brukes av dette rommet støttes ikke." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s har tillatt gjester å bli med i rommet.", "forbidden": "%(senderDisplayName)s har hindret gjester fra å bli med i rommet.", @@ -3551,8 +3541,6 @@ "label": "Meldingshandlinger", "view_in_room": "Vis i rom" }, - "message_timestamp_received_at": "Mottatt den: %(dateTime)s", - "message_timestamp_sent_at": "Sendt den: %(dateTime)s", "mjolnir": { "changed_rule_glob": "%(senderName)s oppdaterte en forbudsregel som matchet %(oldGlob)s til å matche %(newGlob)s for %(reason)s", "changed_rule_rooms": "%(senderName)s endret en regel som forbød rom som samsvarte %(oldGlob)s til å matche %(newGlob)s for %(reason)s", diff --git a/src/i18n/strings/nl.json b/apps/web/src/i18n/strings/nl.json similarity index 99% rename from src/i18n/strings/nl.json rename to apps/web/src/i18n/strings/nl.json index d338ba693d..c590bfb9e6 100644 --- a/src/i18n/strings/nl.json +++ b/apps/web/src/i18n/strings/nl.json @@ -395,7 +395,6 @@ "email_address": "E-mailadres", "emoji": "Emoji", "encrypted": "Versleuteld", - "encryption_enabled": "Versleuteling ingeschakeld", "error": "Fout", "faq": "FAQ", "favourites": "Favorieten", @@ -2530,13 +2529,6 @@ "continuation": "Deze kamer is een voortzetting van een ander gesprek.", "see_older_messages": "Klik hier om oudere berichten te bekijken." }, - "m.room.encryption": { - "disable_attempt": "Poging om versleuteling uit te schakelen genegeerd", - "disabled": "Versleuteling niet ingeschakeld", - "enabled_local": "Berichten in deze chat worden eind-tot-eind versleuteld.", - "parameters_changed": "Enkele versleutingsparameters zijn gewijzigd.", - "unsupported": "De versleuteling gebruikt in deze kamer wordt niet ondersteund." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s heeft gasten toegestaan de kamer te betreden.", "forbidden": "%(senderDisplayName)s heeft gasten de toegang tot de kamer ontzegd.", diff --git a/src/i18n/strings/pl.json b/apps/web/src/i18n/strings/pl.json similarity index 99% rename from src/i18n/strings/pl.json rename to apps/web/src/i18n/strings/pl.json index 78289814d7..845c1be318 100644 --- a/src/i18n/strings/pl.json +++ b/apps/web/src/i18n/strings/pl.json @@ -483,7 +483,6 @@ "email_address": "Adres e-mail", "emoji": "Emoji", "encrypted": "Szyfrowanie", - "encryption_enabled": "Włączono szyfrowanie", "error": "Błąd", "faq": "Najczęściej zadawane pytania", "favourites": "Ulubione", @@ -3418,15 +3417,6 @@ "unknown_predecessor": "Nie można znaleźć starej wersji tego pokoju (ID pokoju: %(roomId)s), a nie dostarczono nam 'via_servers', aby ją znaleźć.", "unknown_predecessor_guess_server": "Nie można znaleźć starej wersji tego pokoju (ID pokoju: %(roomId)s), a nie dostarczono nam 'via_servers', aby ją znaleźć. Można spróbować odgadnąć serwer na podstawie ID pokoju. Jeśli chcesz spróbować, kliknij ten link:" }, - "m.room.encryption": { - "disable_attempt": "Zignorowano próbę wyłączenia szyfrowania", - "disabled": "Nie włączono szyfrowania", - "enabled": "Wiadomości w tym pokoju są szyfrowane end-to-end. Możesz zweryfikować osoby, które dołączą klikając na ich zdjęcie profilowe.", - "enabled_dm": "Wiadomości tutaj są szyfrowane end-to-end. Aby zweryfikować profil %(displayName)s - kliknij na zdjęcie profilowe.", - "enabled_local": "Wiadomości na tym czacie będą szyfrowane end-to-end.", - "parameters_changed": "Niektóre parametry szyfrowania zostały zmienione.", - "unsupported": "Szyfrowanie wykorzystywane przez ten pokój nie jest obsługiwane." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s pozwolił, by goście dołączali do pokoju.", "forbidden": "%(senderDisplayName)s zabronił gościom dołączać do pokoju.", @@ -3520,8 +3510,6 @@ "label": "Działania na wiadomościach", "view_in_room": "Wyświetl w pokoju" }, - "message_timestamp_received_at": "Odebrano: %(dateTime)s", - "message_timestamp_sent_at": "Wysłano: %(dateTime)s", "mjolnir": { "changed_rule_glob": "%(senderName)s zaktualizował zasadę banowania z pasowania do %(oldGlob)s na %(newGlob)s ponieważ %(reason)s", "changed_rule_rooms": "%(senderName)s zmienił regułę banującą pokoje pasujące do wzorca na %(oldGlob)s ustawiając nowy wzorzec %(newGlob)s z powodu %(reason)s", diff --git a/src/i18n/strings/pt.json b/apps/web/src/i18n/strings/pt.json similarity index 99% rename from src/i18n/strings/pt.json rename to apps/web/src/i18n/strings/pt.json index 5547c6fc75..131b0660cd 100644 --- a/src/i18n/strings/pt.json +++ b/apps/web/src/i18n/strings/pt.json @@ -477,7 +477,6 @@ "email_address": "Endereço de email", "emoji": "Emoji", "encrypted": "Encriptado", - "encryption_enabled": "Encriptação ativada", "error": "Erro", "faq": "Perguntas frequentes", "favourites": "Favoritos", @@ -3273,15 +3272,6 @@ "unknown_predecessor": "Não é possível encontrar a versão antiga desta sala (ID da sala: %(roomId)s), e não nos foi fornecido o 'via_servers' para a procurar.", "unknown_predecessor_guess_server": "Não consegues encontrar a versão antiga desta sala (ID da sala: %(roomId)s), e não nos foi fornecido o 'via_servers' para a procurar. É possível que adivinhes o servidor a partir do ID da sala. Se quiseres tentar, clica neste link:" }, - "m.room.encryption": { - "disable_attempt": "Tentativa ignorada de desativar a encriptação", - "disabled": "Encriptação não ativada", - "enabled": "As mensagens nesta sala são encriptadas de ponta a ponta. Quando as pessoas se juntam a nós, podes verificá-las no seu perfil, basta tocares na fotografia de perfil.", - "enabled_dm": "As mensagens aqui são encriptadas de ponta a ponta. Verifica %(displayName)s no seu perfil - toca na fotografia de perfil.", - "enabled_local": "As mensagens neste chat serão encriptadas de ponta a ponta.", - "parameters_changed": "Alguns parâmetros de encriptação foram alterados.", - "unsupported": "A encriptação utilizada por esta sala não é suportada." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s permitiu que convidados entram na sala.", "forbidden": "%(senderDisplayName)s bloqueou que convidados entrem na sala.", @@ -3374,8 +3364,6 @@ "label": "Acções de mensagens", "view_in_room": "Vista na sala" }, - "message_timestamp_received_at": "Recebido em: %(dateTime)s", - "message_timestamp_sent_at": "Enviado em:%(dateTime)s", "mjolnir": { "changed_rule_glob": "%(senderName)s atualizou uma regra de banimento que correspondia a %(oldGlob)s à correspondência %(newGlob)s devido a %(reason)s", "changed_rule_rooms": "%(senderName)s alterou uma regra que proibia salas correspondentes a %(oldGlob)s para correspondência %(newGlob)s devido a %(reason)s", diff --git a/src/i18n/strings/pt_BR.json b/apps/web/src/i18n/strings/pt_BR.json similarity index 99% rename from src/i18n/strings/pt_BR.json rename to apps/web/src/i18n/strings/pt_BR.json index 4cc72e508b..22fb5f8f0a 100644 --- a/src/i18n/strings/pt_BR.json +++ b/apps/web/src/i18n/strings/pt_BR.json @@ -482,7 +482,6 @@ "email_address": "Endereço de e-mail", "emoji": "Emoji", "encrypted": "Criptografada", - "encryption_enabled": "Criptografia ativada", "error": "Erro", "faq": "Perguntas frequentes", "favourites": "Favoritos", @@ -2327,11 +2326,11 @@ "error_join_rule_change_title": "Falha ao atualizar as regras de entrada", "error_join_rule_change_unknown": "Falha desconhecida", "guest_access_warning": "Pessoas com clientes suportados poderão entrar na sala sem ter uma conta registrada.", - "history_visibility_invited": "Somente membros (desde que tenham sido convidados)", + "history_visibility_invited": "Membros desde que foram convidados", "history_visibility_legend": "Quem pode ler o histórico da sala?", - "history_visibility_shared": "Apenas participantes (a partir do momento em que esta opção for selecionada)", - "history_visibility_warning": "A visibilidade do histórico existente não será alterada.", - "history_visibility_world_readable": "Qualquer pessoa", + "history_visibility_shared": "Membros (histórico completo)", + "history_visibility_warning": "As alterações não afetarão as mensagens anteriores, apenas as novas. Saber mais", + "history_visibility_world_readable": "Qualquer pessoa (o histórico é público)", "join_rule_description": "Decida quem pode entrar em %(roomName)s.", "join_rule_invite": "Privado (convite apenas)", "join_rule_invite_description": "Apenas pessoas convidadas podem entrar.", @@ -3429,15 +3428,6 @@ "unknown_predecessor": "Não foi possível encontrar a versão antiga desta sala (ID da sala:%(roomId)s) e não recebemos 'via_servers' para procurá-la.", "unknown_predecessor_guess_server": "Não foi possível encontrar a versão antiga desta sala (ID da sala:%(roomId)s) e não recebemos 'via_servers' para procurá-la. É possível que adivinhar o servidor a partir do ID da sala funcione. Se você quiser tentar, clique neste link:" }, - "m.room.encryption": { - "disable_attempt": "A tentativa de desativar a criptografia foi ignorada", - "disabled": "Criptografia desativada", - "enabled": "As mensagens nesta sala são criptografadas de ponta a ponta. Quando as pessoas ingressam, você pode verificá-las em seus perfis, basta tocar na foto do perfil.", - "enabled_dm": "As mensagens aqui são criptografadas de ponta a ponta. Verifique %(displayName)s no perfil deles - toque na foto do perfil.", - "enabled_local": "As mensagens neste bate-papo serão criptografadas de ponta a ponta.", - "parameters_changed": "Alguns parâmetros de criptografia foram modificados.", - "unsupported": "A criptografia usada nesta sala não é suportada." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s permitiu que os convidados entrem na sala.", "forbidden": "%(senderDisplayName)s impediu que convidados entrassem na sala.", @@ -3531,8 +3521,6 @@ "label": "Ações da mensagem", "view_in_room": "Ver na sala" }, - "message_timestamp_received_at": "Recebido em: %(dateTime)s", - "message_timestamp_sent_at": "Enviado em: %(dateTime)s", "mjolnir": { "changed_rule_glob": "%(senderName)s alterou uma regra que bania o que correspondia a %(oldGlob)s para corresponder a %(newGlob)s devido à %(reason)s", "changed_rule_rooms": "%(senderName)s alterou uma regra que bania salas que correspondiam a %(oldGlob)s para corresponder a %(newGlob)s devido à %(reason)s", diff --git a/src/i18n/strings/ru.json b/apps/web/src/i18n/strings/ru.json similarity index 99% rename from src/i18n/strings/ru.json rename to apps/web/src/i18n/strings/ru.json index 96e7b4336e..74663f9fe6 100644 --- a/src/i18n/strings/ru.json +++ b/apps/web/src/i18n/strings/ru.json @@ -482,7 +482,6 @@ "email_address": "Электронная почта", "emoji": "Смайлы", "encrypted": "Зашифровано", - "encryption_enabled": "Шифрование включено", "error": "Ошибка", "faq": "Часто задаваемые вопросы", "favourites": "Избранные", @@ -3463,15 +3462,6 @@ "unknown_predecessor": "Не удалось найти старую версию этой комнаты (идентификатор комнаты:%(roomId)s) или нам не предоставили «via_servers» для ее поиска.", "unknown_predecessor_guess_server": "Не удалось найти старую версию этой комнаты (идентификатор комнаты:%(roomId)s) или нам не предоставили «via_servers» для ее поиска. Вполне возможно, что угадать сервер по идентификатору комнаты получится. Если вы хотите попробовать, нажмите на эту ссылку:" }, - "m.room.encryption": { - "disable_attempt": "Игнорируемая попытка отключить шифрование", - "disabled": "Шифрование не включено", - "enabled": "Сообщения в этой комнате полностью зашифрованы. Когда пользователи присоединяются, вы можете подтвердить их в их профиле, просто нажав на изображение профиля.", - "enabled_dm": "Сообщения полностью зашифрованы. Подтвердите %(displayName)s данные в профиле пользователя — нажмите на его изображение профиля.", - "enabled_local": "Сообщения в этой переписке будут защищены сквозным шифрованием.", - "parameters_changed": "Некоторые параметры шифрования были изменены.", - "unsupported": "Шифрование этой комнаты не поддерживается." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s разрешил(а) гостям входить в комнату.", "forbidden": "%(senderDisplayName)s запретил(а) гостям входить в комнату.", @@ -3565,8 +3555,6 @@ "label": "Сообщение действий", "view_in_room": "Просмотреть в комнате" }, - "message_timestamp_received_at": "Получено в: %(dateTime)s", - "message_timestamp_sent_at": "Отправлено в: %(dateTime)s", "mjolnir": { "changed_rule_glob": "%(senderName)s обновил(а) правило блокировки по шаблону %(oldGlob)s на шаблон %(newGlob)s за %(reason)s", "changed_rule_rooms": "%(senderName)s изменил(а) правило блокировки комнат по шаблону %(oldGlob)s на шаблон %(newGlob)s за %(reason)s", diff --git a/src/i18n/strings/sk.json b/apps/web/src/i18n/strings/sk.json similarity index 99% rename from src/i18n/strings/sk.json rename to apps/web/src/i18n/strings/sk.json index bd2c3121bc..2d73ab58e9 100644 --- a/src/i18n/strings/sk.json +++ b/apps/web/src/i18n/strings/sk.json @@ -485,7 +485,6 @@ "email_address": "Emailová adresa", "emoji": "Emotikon", "encrypted": "Zašifrované", - "encryption_enabled": "Šifrovanie zapnuté", "error": "Chyba", "faq": "Často kladené otázky (FAQ)", "favourites": "Obľúbené", @@ -3500,16 +3499,6 @@ "unknown_predecessor": "Nie je možné nájsť starú verziu tejto miestnosti (ID miestnosti: %(roomId)s) a nebol nám poskytnutý parameter 'via_servers' na jej vyhľadanie.", "unknown_predecessor_guess_server": "Nie je možné nájsť starú verziu tejto miestnosti (ID miestnosti: %(roomId)s) a nebol nám poskytnutý parameter 'via_servers' na jej vyhľadanie. Je možné, že uhádnutie servera na základe ID miestnosti bude fungovať. Ak to chcete skúsiť, kliknite na tento odkaz:" }, - "m.room.encryption": { - "disable_attempt": "Ignorovaný pokus o vypnutie šifrovania", - "disabled": "Šifrovanie nie je zapnuté", - "enabled": "Správy v tejto miestnosti sú šifrované od vás až k príjemcovi. Keď sa ľudia pridajú, môžete ich overiť v ich profile, stačí len ťuknúť na ich profilový obrázok.", - "enabled_dm": "Správy sú tu end-to-end šifrované. Overte %(displayName)s v ich profile - ťuknite na ich profilový obrázok.", - "enabled_local": "Správy v tejto konverzácii sú šifrované od vás až k príjemcovi.", - "parameters_changed": "Niektoré parametre šifrovania boli zmenené.", - "state_enabled": "Správy a udalosti v tejto miestnosti sú šifrované end-to-end. Keď sa ľudia pripoja, môžete ich overiť v ich profile, stačí ťuknúť na ich profilový obrázok.", - "unsupported": "Šifrovanie používané v tejto miestnosti nie je podporované." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s umožnil hosťom vstúpiť do miestnosti.", "forbidden": "%(senderDisplayName)s zamedzil hosťom vstúpiť do miestnosti.", @@ -3603,8 +3592,6 @@ "label": "Akcie správy", "view_in_room": "Zobraziť v miestnosti" }, - "message_timestamp_received_at": "Prijaté: %(dateTime)s", - "message_timestamp_sent_at": "Odoslané:%(dateTime)s", "mjolnir": { "changed_rule_glob": "%(senderName)s aktualizoval pravidlo zakázať vstúpiť pôvodne sa zhodujúce s %(oldGlob)s na %(newGlob)s, dôvod: %(reason)s", "changed_rule_rooms": "%(senderName)s zmenil pravidlo zakázať vstúpiť do miestností pôvodne zhodujúcich sa s %(oldGlob)s na miestnosti zhodujúce sa s %(newGlob)s, dôvod: %(reason)s", diff --git a/src/i18n/strings/sq.json b/apps/web/src/i18n/strings/sq.json similarity index 99% rename from src/i18n/strings/sq.json rename to apps/web/src/i18n/strings/sq.json index 34f50d0791..4f081a1eca 100644 --- a/src/i18n/strings/sq.json +++ b/apps/web/src/i18n/strings/sq.json @@ -414,7 +414,6 @@ "edited": "e përpunuar", "email_address": "Adresë email", "encrypted": "I fshehtëzuar", - "encryption_enabled": "Fshehtëzim i aktivizuar", "error": "Gabim", "favourites": "Të parapëlqyer", "feedback": "Mendime", @@ -2762,13 +2761,6 @@ "unknown_predecessor": "S’gjendet dot versioni i vjetër i kësaj dhome (ID dhome: %(roomId)s) dhe s’na është dhënë “via_servers” që të shohim për të.", "unknown_predecessor_guess_server": "S’gjendet dot versioni i vjetër i kësaj dhome (ID dhome: %(roomId)s) dhe s’na është dhënë “via_servers” që të shohim për të. Ka mundësi që hamendësimi i shërbyesit prej ID-së së dhomës të funksionojë. Nëse doni të provoni, klikoni këtë lidhje:" }, - "m.room.encryption": { - "disable_attempt": "U shpërfill përpjekje për të çaktivizuar fshehtëzimin", - "disabled": "Fshehtëzim jo i aktivizuar", - "enabled_local": "Mesazhet në këtë fjalosje do të jenë të fshehtëzuar skaj-më-skaj.", - "parameters_changed": "Janë ndryshuar disa parametra fshehtëzimi.", - "unsupported": "Fshehtëzimi i përdorur nga kjo dhomë nuk mbulohet." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s ka lejuar vizitorë të marrin pjesë në dhomë.", "forbidden": "%(senderDisplayName)s ka penguar vizitorë të marrin pjesë në dhomë.", diff --git a/src/i18n/strings/sv.json b/apps/web/src/i18n/strings/sv.json similarity index 99% rename from src/i18n/strings/sv.json rename to apps/web/src/i18n/strings/sv.json index 8e92386705..b8aef0a7c7 100644 --- a/src/i18n/strings/sv.json +++ b/apps/web/src/i18n/strings/sv.json @@ -482,7 +482,6 @@ "email_address": "E-postadress", "emoji": "Emoji", "encrypted": "Krypterat", - "encryption_enabled": "Kryptering aktiverad", "error": "Fel", "faq": "Vanliga frågor", "favourites": "Favoriter", @@ -3361,15 +3360,6 @@ "unknown_predecessor": "Kan inte hitta den gamla versionen av det här rummet (rums-ID: %(roomId)s), och vi har inte fått ”via_servers” för att leta efter det.", "unknown_predecessor_guess_server": "Kan inte hitta den gamla versionen av det här rummet (rums-ID: %(roomId)s), och vi har inte fått ”via_servers” för att leta efter det. Det är möjligt att det går att gissa servern från rums-ID:t. Om du vill pröva, klicka på den här länken:" }, - "m.room.encryption": { - "disable_attempt": "Ignorerade försök att inaktivera kryptering", - "disabled": "Kryptering är inte aktiverad", - "enabled": "Meddelanden i det här rummet är totalsträckskrypterade. När personer går med kan du verifiera dem i deras profil genom att trycka på deras profilbild.", - "enabled_dm": "Meddelanden här är totalsträckskrypterade. Verifiera %(displayName)s i deras profil - tryck på deras profilbild.", - "enabled_local": "Meddelanden i den här chatten kommer att vara totalsträckskypterade.", - "parameters_changed": "Vissa krypteringsparametrar har ändrats.", - "unsupported": "Krypteringen som används i det här rummet stöds inte." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s har tillåtit gäster att gå med i rummet.", "forbidden": "%(senderDisplayName)s har nekat gäster att gå med i rummet.", @@ -3463,8 +3453,6 @@ "label": "Meddelandeåtgärder", "view_in_room": "Visa i rum" }, - "message_timestamp_received_at": "Mottagen vid: %(dateTime)s", - "message_timestamp_sent_at": "Skickat vid: %(dateTime)s", "mjolnir": { "changed_rule_glob": "%(senderName)s uppdaterade en bannregel som matchade %(oldGlob)s till att matcha %(newGlob)s på grund av %(reason)s", "changed_rule_rooms": "%(senderName)s ändrade en regel som bannade rum som matchade %(oldGlob)s till att matcha %(newGlob)s på grund av %(reason)s", diff --git a/src/i18n/strings/tr.json b/apps/web/src/i18n/strings/tr.json similarity index 99% rename from src/i18n/strings/tr.json rename to apps/web/src/i18n/strings/tr.json index 636ce3b06a..8b702cf788 100644 --- a/src/i18n/strings/tr.json +++ b/apps/web/src/i18n/strings/tr.json @@ -475,7 +475,6 @@ "email_address": "E-posta Adresi", "emoji": "Emoji", "encrypted": "Şifrelenmiş", - "encryption_enabled": "Şifreleme etkin", "error": "Hata", "faq": "SSS", "favourites": "Favoriler", @@ -3263,15 +3262,6 @@ "unknown_predecessor": "Bu odanın eski sürümünü bulamıyoruz (oda kimliği: %(roomId)s) ve aramak için bize 'via_servers' sağlanmadı.", "unknown_predecessor_guess_server": "Bu odanın eski sürümünü bulamıyoruz (oda kimliği: %(roomId)s) ve bu sürümü aramamız için bize 'via_servers' sağlanmadı. Oda kimliğinden sunucuyu tahmin etmenin işe yaraması mümkün. Denemek isterseniz, bu bağlantıya tıklayın:" }, - "m.room.encryption": { - "disable_attempt": "Şifrelemeyi devre dışı bırakma denemesi yok sayıldı", - "disabled": "Şifreleme etkin değil", - "enabled": "Bu odadaki mesajlar uçtan uca şifrelenmiştir. Kullanıcılar katıldığında, profillerinde onları doğrulayabilirsiniz, profil resimlerine dokunmanız yeterlidir.", - "enabled_dm": "Buradaki mesajlar uçtan uca şifrelenir. Profilinden %(displayName)s'i doğrulayın - profil resmine dokunun.", - "enabled_local": "Bu sohbetteki mesajlar uçtan uca şifrelenecektir.", - "parameters_changed": "Bazı şifreleme parametreleri değiştirildi.", - "unsupported": "Bu odada kullanılan şifreleme desteklenmiyor." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s misafirlerin odaya katılmasına izin verdi.", "forbidden": "Odaya misafirlerin girişini engelleyen %(senderDisplayName)s.", @@ -3364,8 +3354,6 @@ "label": "Mesaj Eylemleri", "view_in_room": "Odada görüntüle" }, - "message_timestamp_received_at": "%(dateTime)s alındı", - "message_timestamp_sent_at": "Gönderildi: %(dateTime)s", "mjolnir": { "changed_rule_glob": "%(senderName)s %(oldGlob)s ile eşleşen banlama kuralını %(newGlob)s ile eşleşen olarak değiştirdi sebebi %(reason)s", "changed_rule_rooms": "%(senderName)s %(oldGlob)s ile eşleşen odaları banlama kuralını %(newGlob)s ile eşleşen olarak değiştirdi sebebi %(reason)s", diff --git a/src/i18n/strings/uk.json b/apps/web/src/i18n/strings/uk.json similarity index 99% rename from src/i18n/strings/uk.json rename to apps/web/src/i18n/strings/uk.json index 406505d7e7..0dc7919b09 100644 --- a/src/i18n/strings/uk.json +++ b/apps/web/src/i18n/strings/uk.json @@ -482,7 +482,6 @@ "email_address": "Адреса е-пошти", "emoji": "Емодзі", "encrypted": "Зашифроване", - "encryption_enabled": "Шифрування увімкнено", "error": "Помилка", "faq": "ЧаПи", "favourites": "Вибрані", @@ -3454,15 +3453,6 @@ "unknown_predecessor": "Не можемо знайти стару версію цієї кімнати (ідентифікатор кімнати: %(roomId)s), а нам не було надано 'via_servers', щоб знайти її.", "unknown_predecessor_guess_server": "Не можемо знайти стару версію цієї кімнати (ідентифікатор кімнати: %(roomId)s), а нам не було надано 'via_servers', щоб знайти її. Можливо, вам вдасться вгадати сервер за ID кімнати. Якщо ви хочете спробувати, натисніть на це посилання:" }, - "m.room.encryption": { - "disable_attempt": "Знехтувані спроби вимкнути шифрування", - "disabled": "Шифрування не ввімкнено", - "enabled": "Повідомлення в цій кімнаті наскрізно зашифровані. Коли люди приєднуються, ви можете перевірити їх у їхньому профілі, просто торкнувшись зображення профілю.", - "enabled_dm": "Повідомлення тут наскрізно зашифровані. Перевірте %(displayName)s у їхньому профілі - торкніться їхнього зображення профілю.", - "enabled_local": "Повідомлення в цій бесіді будуть захищені наскрізним шифруванням.", - "parameters_changed": "Деякі параметри шифрування змінилися.", - "unsupported": "Шифрування, використане цією кімнатою не підтримується." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s дозволяє гостям приєднуватися до кімнати.", "forbidden": "%(senderDisplayName)s забороняє гостям приєднуватися до кімнати.", @@ -3556,8 +3546,6 @@ "label": "Дії з повідомленням", "view_in_room": "Дивитися в кімнаті" }, - "message_timestamp_received_at": "Отримано: %(dateTime)s", - "message_timestamp_sent_at": "Надіслано: %(dateTime)s", "mjolnir": { "changed_rule_glob": "%(senderName)s змінює правило блокування зі збігу з %(oldGlob)s на збіг з %(newGlob)s через %(reason)s", "changed_rule_rooms": "%(senderName)s змінює правило блокування кімнат зі збігу з %(oldGlob)s на збіг з %(newGlob)s через %(reason)s", diff --git a/src/i18n/strings/vi.json b/apps/web/src/i18n/strings/vi.json similarity index 99% rename from src/i18n/strings/vi.json rename to apps/web/src/i18n/strings/vi.json index c295ed6b35..47a614413a 100644 --- a/src/i18n/strings/vi.json +++ b/apps/web/src/i18n/strings/vi.json @@ -395,7 +395,6 @@ "email_address": "Địa chỉ thư điện tử", "emoji": "Biểu tượng cảm xúc", "encrypted": "Được mã hóa", - "encryption_enabled": "Mã hóa được bật", "error": "Lỗi", "faq": "Câu hỏi thường gặp", "favourites": "Yêu thích", @@ -2708,13 +2707,6 @@ "continuation": "Căn phòng này là sự tiếp nối của một cuộc trò chuyện khác.", "see_older_messages": "Bấm vào đây để xem các tin nhắn cũ hơn." }, - "m.room.encryption": { - "disable_attempt": "Bỏ qua nỗ lực vô hiệu hóa mã hóa", - "disabled": "Mã hóa không được bật", - "enabled_local": "Tin nhắn trong phòng này sẽ được mã hóa đầu-cuối.", - "parameters_changed": "Một số thông số mã hóa vừa được thay đổi.", - "unsupported": "Mã hóa mà phòng này sử dụng không được hỗ trợ." - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s vừa cho phép khách có thể tham gia phòng.", "forbidden": "%(senderDisplayName)s vừa cấm khách có thể tham gia phòng.", diff --git a/src/i18n/strings/zh_Hans.json b/apps/web/src/i18n/strings/zh_Hans.json similarity index 99% rename from src/i18n/strings/zh_Hans.json rename to apps/web/src/i18n/strings/zh_Hans.json index 9be2666a7a..74f5d0c205 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/apps/web/src/i18n/strings/zh_Hans.json @@ -409,7 +409,6 @@ "email_address": "邮箱地址", "emoji": "表情符号", "encrypted": "已加密", - "encryption_enabled": "已启用加密", "error": "错误", "faq": "常见问答集", "favourites": "收藏夹", @@ -2632,14 +2631,6 @@ "continuation": "此房间是另一个对话的延续之处。", "see_older_messages": "点击这里以查看更早的消息。" }, - "m.room.encryption": { - "disable_attempt": "已忽略禁用加密的尝试", - "disabled": "未启用加密", - "enabled": "这个房间里的消息是端到端加密的。当人们加入时,你可以在他们的个人资料中验证他们,只需点击他们的个人资料图片即可。", - "enabled_local": "此聊天中的消息会被端到端加密。", - "parameters_changed": "一些加密参数已更改。", - "unsupported": "不支持此房间使用的加密方式。" - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s 将此房间改为允许游客加入。", "forbidden": "%(senderDisplayName)s 将此房间改为游客禁入。", diff --git a/src/i18n/strings/zh_Hant.json b/apps/web/src/i18n/strings/zh_Hant.json similarity index 99% rename from src/i18n/strings/zh_Hant.json rename to apps/web/src/i18n/strings/zh_Hant.json index bb554b6cdb..97d8309543 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/apps/web/src/i18n/strings/zh_Hant.json @@ -431,7 +431,6 @@ "email_address": "電子郵件地址", "emoji": "表情符號", "encrypted": "開啟加密", - "encryption_enabled": "加密已啟用", "error": "錯誤", "faq": "常見問答集", "favourites": "我的最愛", @@ -2952,15 +2951,6 @@ "unknown_predecessor": "找不到此聊天室的舊版本(聊天室 ID:%(roomId)s),且我們未提供「via_servers」來檢視它。", "unknown_predecessor_guess_server": "找不到此聊天室的舊版本(聊天室 ID:%(roomId)s),且我們未提供「via_servers」來檢視它。從聊天室 ID 猜測伺服器可能會有用。若您想嘗試,請點擊此連結:" }, - "m.room.encryption": { - "disable_attempt": "已忽略嘗試停用加密", - "disabled": "加密未啟用", - "enabled": "此聊天室中的訊息為端到端加密。當人們加入時,您可以在他們的個人檔案中驗證他們,點擊他們的個人檔案就可以了。", - "enabled_dm": "此處的訊息為端到端加密。請在其個人檔案中驗證 %(displayName)s - 點擊其個人檔案圖片。", - "enabled_local": "此聊天中的訊息將使用端對端加密。", - "parameters_changed": "部份加密參數已變更。", - "unsupported": "不支援此聊天室使用的加密。" - }, "m.room.guest_access": { "can_join": "%(senderDisplayName)s 已允許訪客加入聊天室。", "forbidden": "%(senderDisplayName)s 已拒絕訪客加入聊天室。", diff --git a/src/identifiers.ts b/apps/web/src/identifiers.ts similarity index 100% rename from src/identifiers.ts rename to apps/web/src/identifiers.ts diff --git a/src/index.ts b/apps/web/src/index.ts similarity index 100% rename from src/index.ts rename to apps/web/src/index.ts diff --git a/src/indexing/BaseEventIndexManager.ts b/apps/web/src/indexing/BaseEventIndexManager.ts similarity index 100% rename from src/indexing/BaseEventIndexManager.ts rename to apps/web/src/indexing/BaseEventIndexManager.ts diff --git a/src/indexing/EventIndex.ts b/apps/web/src/indexing/EventIndex.ts similarity index 99% rename from src/indexing/EventIndex.ts rename to apps/web/src/indexing/EventIndex.ts index ff06602687..97913bf845 100644 --- a/src/indexing/EventIndex.ts +++ b/apps/web/src/indexing/EventIndex.ts @@ -308,7 +308,7 @@ export default class EventIndex extends EventEmitter { * @returns {bool} Returns true if the event can be indexed, false * otherwise. */ - private isValidEvent(ev: MatrixEvent): boolean { + private isValidEvent(this: void, ev: MatrixEvent): boolean { const isUsefulType = [EventType.RoomMessage, EventType.RoomName, EventType.RoomTopic].includes( ev.getType() as EventType, ); diff --git a/src/indexing/EventIndexPeg.ts b/apps/web/src/indexing/EventIndexPeg.ts similarity index 100% rename from src/indexing/EventIndexPeg.ts rename to apps/web/src/indexing/EventIndexPeg.ts diff --git a/src/integrations/IntegrationManagerInstance.ts b/apps/web/src/integrations/IntegrationManagerInstance.ts similarity index 100% rename from src/integrations/IntegrationManagerInstance.ts rename to apps/web/src/integrations/IntegrationManagerInstance.ts diff --git a/src/integrations/IntegrationManagers.ts b/apps/web/src/integrations/IntegrationManagers.ts similarity index 100% rename from src/integrations/IntegrationManagers.ts rename to apps/web/src/integrations/IntegrationManagers.ts diff --git a/src/languageHandler.tsx b/apps/web/src/languageHandler.tsx similarity index 100% rename from src/languageHandler.tsx rename to apps/web/src/languageHandler.tsx diff --git a/src/linkify-matrix.ts b/apps/web/src/linkify-matrix.ts similarity index 100% rename from src/linkify-matrix.ts rename to apps/web/src/linkify-matrix.ts diff --git a/src/mjolnir/BanList.ts b/apps/web/src/mjolnir/BanList.ts similarity index 100% rename from src/mjolnir/BanList.ts rename to apps/web/src/mjolnir/BanList.ts diff --git a/src/mjolnir/ListRule.ts b/apps/web/src/mjolnir/ListRule.ts similarity index 100% rename from src/mjolnir/ListRule.ts rename to apps/web/src/mjolnir/ListRule.ts diff --git a/src/mjolnir/Mjolnir.ts b/apps/web/src/mjolnir/Mjolnir.ts similarity index 100% rename from src/mjolnir/Mjolnir.ts rename to apps/web/src/mjolnir/Mjolnir.ts diff --git a/src/models/Call.ts b/apps/web/src/models/Call.ts similarity index 99% rename from src/models/Call.ts rename to apps/web/src/models/Call.ts index cb9041bfec..535c04f2f2 100644 --- a/src/models/Call.ts +++ b/apps/web/src/models/Call.ts @@ -721,7 +721,6 @@ export class ElementCall extends Call { // We can pass the raw EW analyticsID here since we need to trust EC with not sending sensitive data to posthog (EC has access to more sensible data than the analyticsID e.g. the username) const analyticsID: string = accountAnalyticsData?.pseudonymousAnalyticsOptIn ? accountAnalyticsData?.id : ""; - params.append("analyticsID", analyticsID); // Legacy, deprecated in favour of posthogUserId params.append("posthogUserId", analyticsID); params.append("posthogApiHost", posthogConfig.api_host); params.append("posthogApiKey", posthogConfig.project_api_key); diff --git a/src/models/LocalRoom.ts b/apps/web/src/models/LocalRoom.ts similarity index 100% rename from src/models/LocalRoom.ts rename to apps/web/src/models/LocalRoom.ts diff --git a/src/models/RoomUpload.ts b/apps/web/src/models/RoomUpload.ts similarity index 100% rename from src/models/RoomUpload.ts rename to apps/web/src/models/RoomUpload.ts diff --git a/src/models/notificationsettings/NotificationSettings.ts b/apps/web/src/models/notificationsettings/NotificationSettings.ts similarity index 100% rename from src/models/notificationsettings/NotificationSettings.ts rename to apps/web/src/models/notificationsettings/NotificationSettings.ts diff --git a/src/models/notificationsettings/PushRuleDiff.ts b/apps/web/src/models/notificationsettings/PushRuleDiff.ts similarity index 100% rename from src/models/notificationsettings/PushRuleDiff.ts rename to apps/web/src/models/notificationsettings/PushRuleDiff.ts diff --git a/src/models/notificationsettings/PushRuleMap.ts b/apps/web/src/models/notificationsettings/PushRuleMap.ts similarity index 100% rename from src/models/notificationsettings/PushRuleMap.ts rename to apps/web/src/models/notificationsettings/PushRuleMap.ts diff --git a/src/models/notificationsettings/reconcileNotificationSettings.ts b/apps/web/src/models/notificationsettings/reconcileNotificationSettings.ts similarity index 100% rename from src/models/notificationsettings/reconcileNotificationSettings.ts rename to apps/web/src/models/notificationsettings/reconcileNotificationSettings.ts diff --git a/src/models/notificationsettings/toNotificationSettings.ts b/apps/web/src/models/notificationsettings/toNotificationSettings.ts similarity index 100% rename from src/models/notificationsettings/toNotificationSettings.ts rename to apps/web/src/models/notificationsettings/toNotificationSettings.ts diff --git a/src/models/rooms/PresenceState.ts b/apps/web/src/models/rooms/PresenceState.ts similarity index 100% rename from src/models/rooms/PresenceState.ts rename to apps/web/src/models/rooms/PresenceState.ts diff --git a/src/models/rooms/RoomMember.ts b/apps/web/src/models/rooms/RoomMember.ts similarity index 100% rename from src/models/rooms/RoomMember.ts rename to apps/web/src/models/rooms/RoomMember.ts diff --git a/src/models/rooms/ThreePIDInvite.ts b/apps/web/src/models/rooms/ThreePIDInvite.ts similarity index 100% rename from src/models/rooms/ThreePIDInvite.ts rename to apps/web/src/models/rooms/ThreePIDInvite.ts diff --git a/src/modules.d.ts b/apps/web/src/modules.d.ts similarity index 100% rename from src/modules.d.ts rename to apps/web/src/modules.d.ts diff --git a/src/modules/AccountDataApi.ts b/apps/web/src/modules/AccountDataApi.ts similarity index 100% rename from src/modules/AccountDataApi.ts rename to apps/web/src/modules/AccountDataApi.ts diff --git a/src/modules/Api.ts b/apps/web/src/modules/Api.ts similarity index 100% rename from src/modules/Api.ts rename to apps/web/src/modules/Api.ts diff --git a/src/modules/AppModule.ts b/apps/web/src/modules/AppModule.ts similarity index 100% rename from src/modules/AppModule.ts rename to apps/web/src/modules/AppModule.ts diff --git a/src/modules/Auth.ts b/apps/web/src/modules/Auth.ts similarity index 100% rename from src/modules/Auth.ts rename to apps/web/src/modules/Auth.ts diff --git a/src/modules/BuiltinsApi.tsx b/apps/web/src/modules/BuiltinsApi.tsx similarity index 100% rename from src/modules/BuiltinsApi.tsx rename to apps/web/src/modules/BuiltinsApi.tsx diff --git a/src/modules/ClientApi.ts b/apps/web/src/modules/ClientApi.ts similarity index 100% rename from src/modules/ClientApi.ts rename to apps/web/src/modules/ClientApi.ts diff --git a/src/modules/ConfigApi.ts b/apps/web/src/modules/ConfigApi.ts similarity index 100% rename from src/modules/ConfigApi.ts rename to apps/web/src/modules/ConfigApi.ts diff --git a/src/modules/Dialog.tsx b/apps/web/src/modules/Dialog.tsx similarity index 95% rename from src/modules/Dialog.tsx rename to apps/web/src/modules/Dialog.tsx index 97d2839f0f..ac1f7ae442 100644 --- a/src/modules/Dialog.tsx +++ b/apps/web/src/modules/Dialog.tsx @@ -20,7 +20,7 @@ const OuterDialog = ({ title: string; Dialog: ComponentType & P>; props: P; - onFinished(ok: boolean, model: M | null): void; + onFinished(this: void, ok: boolean, model: M | null): void; }): JSX.Element => { const close = useCallback(() => onFinished(false, null), [onFinished]); const submit = useCallback((model: M) => onFinished(true, model), [onFinished]); diff --git a/src/modules/ExtrasApi.ts b/apps/web/src/modules/ExtrasApi.ts similarity index 100% rename from src/modules/ExtrasApi.ts rename to apps/web/src/modules/ExtrasApi.ts diff --git a/src/modules/ModuleComponents.tsx b/apps/web/src/modules/ModuleComponents.tsx similarity index 100% rename from src/modules/ModuleComponents.tsx rename to apps/web/src/modules/ModuleComponents.tsx diff --git a/src/modules/ModuleFactory.ts b/apps/web/src/modules/ModuleFactory.ts similarity index 100% rename from src/modules/ModuleFactory.ts rename to apps/web/src/modules/ModuleFactory.ts diff --git a/src/modules/ModuleRunner.ts b/apps/web/src/modules/ModuleRunner.ts similarity index 100% rename from src/modules/ModuleRunner.ts rename to apps/web/src/modules/ModuleRunner.ts diff --git a/src/modules/Navigation.ts b/apps/web/src/modules/Navigation.ts similarity index 100% rename from src/modules/Navigation.ts rename to apps/web/src/modules/Navigation.ts diff --git a/src/modules/Profile.ts b/apps/web/src/modules/Profile.ts similarity index 100% rename from src/modules/Profile.ts rename to apps/web/src/modules/Profile.ts diff --git a/src/modules/ProxiedModuleApi.ts b/apps/web/src/modules/ProxiedModuleApi.ts similarity index 100% rename from src/modules/ProxiedModuleApi.ts rename to apps/web/src/modules/ProxiedModuleApi.ts diff --git a/src/modules/StoresApi.ts b/apps/web/src/modules/StoresApi.ts similarity index 100% rename from src/modules/StoresApi.ts rename to apps/web/src/modules/StoresApi.ts diff --git a/src/modules/components/ModuleNotificationDecoration.tsx b/apps/web/src/modules/components/ModuleNotificationDecoration.tsx similarity index 100% rename from src/modules/components/ModuleNotificationDecoration.tsx rename to apps/web/src/modules/components/ModuleNotificationDecoration.tsx diff --git a/src/modules/customComponentApi.ts b/apps/web/src/modules/customComponentApi.ts similarity index 100% rename from src/modules/customComponentApi.ts rename to apps/web/src/modules/customComponentApi.ts diff --git a/src/modules/models/Room.ts b/apps/web/src/modules/models/Room.ts similarity index 100% rename from src/modules/models/Room.ts rename to apps/web/src/modules/models/Room.ts diff --git a/src/notifications/ContentRules.ts b/apps/web/src/notifications/ContentRules.ts similarity index 100% rename from src/notifications/ContentRules.ts rename to apps/web/src/notifications/ContentRules.ts diff --git a/src/notifications/NotificationUtils.ts b/apps/web/src/notifications/NotificationUtils.ts similarity index 100% rename from src/notifications/NotificationUtils.ts rename to apps/web/src/notifications/NotificationUtils.ts diff --git a/src/notifications/PushRuleVectorState.ts b/apps/web/src/notifications/PushRuleVectorState.ts similarity index 100% rename from src/notifications/PushRuleVectorState.ts rename to apps/web/src/notifications/PushRuleVectorState.ts diff --git a/src/notifications/StandardActions.ts b/apps/web/src/notifications/StandardActions.ts similarity index 100% rename from src/notifications/StandardActions.ts rename to apps/web/src/notifications/StandardActions.ts diff --git a/src/notifications/VectorPushRulesDefinitions.ts b/apps/web/src/notifications/VectorPushRulesDefinitions.ts similarity index 100% rename from src/notifications/VectorPushRulesDefinitions.ts rename to apps/web/src/notifications/VectorPushRulesDefinitions.ts diff --git a/src/notifications/index.ts b/apps/web/src/notifications/index.ts similarity index 100% rename from src/notifications/index.ts rename to apps/web/src/notifications/index.ts diff --git a/src/performance/entry-names.ts b/apps/web/src/performance/entry-names.ts similarity index 100% rename from src/performance/entry-names.ts rename to apps/web/src/performance/entry-names.ts diff --git a/src/performance/index.ts b/apps/web/src/performance/index.ts similarity index 100% rename from src/performance/index.ts rename to apps/web/src/performance/index.ts diff --git a/src/phonenumber.ts b/apps/web/src/phonenumber.ts similarity index 100% rename from src/phonenumber.ts rename to apps/web/src/phonenumber.ts diff --git a/src/rageshake/rageshake.ts b/apps/web/src/rageshake/rageshake.ts similarity index 100% rename from src/rageshake/rageshake.ts rename to apps/web/src/rageshake/rageshake.ts diff --git a/src/rageshake/submit-rageshake.ts b/apps/web/src/rageshake/submit-rageshake.ts similarity index 100% rename from src/rageshake/submit-rageshake.ts rename to apps/web/src/rageshake/submit-rageshake.ts diff --git a/src/renderer/code-block.tsx b/apps/web/src/renderer/code-block.tsx similarity index 100% rename from src/renderer/code-block.tsx rename to apps/web/src/renderer/code-block.tsx diff --git a/src/renderer/index.ts b/apps/web/src/renderer/index.ts similarity index 100% rename from src/renderer/index.ts rename to apps/web/src/renderer/index.ts diff --git a/src/renderer/link-tooltip.tsx b/apps/web/src/renderer/link-tooltip.tsx similarity index 100% rename from src/renderer/link-tooltip.tsx rename to apps/web/src/renderer/link-tooltip.tsx diff --git a/src/renderer/pill.tsx b/apps/web/src/renderer/pill.tsx similarity index 100% rename from src/renderer/pill.tsx rename to apps/web/src/renderer/pill.tsx diff --git a/src/renderer/spoiler.tsx b/apps/web/src/renderer/spoiler.tsx similarity index 100% rename from src/renderer/spoiler.tsx rename to apps/web/src/renderer/spoiler.tsx diff --git a/src/renderer/utils.tsx b/apps/web/src/renderer/utils.tsx similarity index 100% rename from src/renderer/utils.tsx rename to apps/web/src/renderer/utils.tsx diff --git a/src/resizer/distributors/collapse.ts b/apps/web/src/resizer/distributors/collapse.ts similarity index 100% rename from src/resizer/distributors/collapse.ts rename to apps/web/src/resizer/distributors/collapse.ts diff --git a/src/resizer/distributors/fixed.ts b/apps/web/src/resizer/distributors/fixed.ts similarity index 100% rename from src/resizer/distributors/fixed.ts rename to apps/web/src/resizer/distributors/fixed.ts diff --git a/src/resizer/distributors/percentage.ts b/apps/web/src/resizer/distributors/percentage.ts similarity index 100% rename from src/resizer/distributors/percentage.ts rename to apps/web/src/resizer/distributors/percentage.ts diff --git a/src/resizer/index.ts b/apps/web/src/resizer/index.ts similarity index 100% rename from src/resizer/index.ts rename to apps/web/src/resizer/index.ts diff --git a/src/resizer/item.ts b/apps/web/src/resizer/item.ts similarity index 100% rename from src/resizer/item.ts rename to apps/web/src/resizer/item.ts diff --git a/src/resizer/resizer.ts b/apps/web/src/resizer/resizer.ts similarity index 100% rename from src/resizer/resizer.ts rename to apps/web/src/resizer/resizer.ts diff --git a/src/resizer/sizer.ts b/apps/web/src/resizer/sizer.ts similarity index 100% rename from src/resizer/sizer.ts rename to apps/web/src/resizer/sizer.ts diff --git a/src/sendTimePerformanceMetrics.ts b/apps/web/src/sendTimePerformanceMetrics.ts similarity index 100% rename from src/sendTimePerformanceMetrics.ts rename to apps/web/src/sendTimePerformanceMetrics.ts diff --git a/src/sentry.ts b/apps/web/src/sentry.ts similarity index 100% rename from src/sentry.ts rename to apps/web/src/sentry.ts diff --git a/src/serviceworker/index.ts b/apps/web/src/serviceworker/index.ts similarity index 100% rename from src/serviceworker/index.ts rename to apps/web/src/serviceworker/index.ts diff --git a/src/settings/SettingLevel.ts b/apps/web/src/settings/SettingLevel.ts similarity index 100% rename from src/settings/SettingLevel.ts rename to apps/web/src/settings/SettingLevel.ts diff --git a/src/settings/Settings.tsx b/apps/web/src/settings/Settings.tsx similarity index 99% rename from src/settings/Settings.tsx rename to apps/web/src/settings/Settings.tsx index b871152d8f..32b3a02bd9 100644 --- a/src/settings/Settings.tsx +++ b/apps/web/src/settings/Settings.tsx @@ -540,10 +540,13 @@ export const SETTINGS: Settings = { supportedLevelsAreOrdered: true, default: false, }, + // Defaulted to true Feb 26, intention is to remove entirely, all being well, + // as this fixes bugs where display name / avatar are missing and also makes + // Element Web consistent with Element X. "useOnlyCurrentProfiles": { supportedLevels: LEVELS_ACCOUNT_SETTINGS, displayName: _td("settings|disable_historical_profile"), - default: false, + default: true, }, "mjolnirRooms": { supportedLevels: [SettingLevel.ACCOUNT], diff --git a/src/settings/SettingsStore.ts b/apps/web/src/settings/SettingsStore.ts similarity index 100% rename from src/settings/SettingsStore.ts rename to apps/web/src/settings/SettingsStore.ts diff --git a/src/settings/UIFeature.ts b/apps/web/src/settings/UIFeature.ts similarity index 100% rename from src/settings/UIFeature.ts rename to apps/web/src/settings/UIFeature.ts diff --git a/src/settings/WatchManager.ts b/apps/web/src/settings/WatchManager.ts similarity index 100% rename from src/settings/WatchManager.ts rename to apps/web/src/settings/WatchManager.ts diff --git a/src/settings/controllers/AnalyticsController.ts b/apps/web/src/settings/controllers/AnalyticsController.ts similarity index 100% rename from src/settings/controllers/AnalyticsController.ts rename to apps/web/src/settings/controllers/AnalyticsController.ts diff --git a/src/settings/controllers/BlockInvitesConfigController.ts b/apps/web/src/settings/controllers/BlockInvitesConfigController.ts similarity index 68% rename from src/settings/controllers/BlockInvitesConfigController.ts rename to apps/web/src/settings/controllers/BlockInvitesConfigController.ts index dffcb0852b..a945dbb384 100644 --- a/src/settings/controllers/BlockInvitesConfigController.ts +++ b/apps/web/src/settings/controllers/BlockInvitesConfigController.ts @@ -5,8 +5,9 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ +import { EventType } from "matrix-js-sdk/src/matrix"; + import { type SettingLevel } from "../SettingLevel.ts"; -import { MSC4380_INVITE_RULES_ACCOUNT_DATA_TYPE } from "../../@types/invite-rules.ts"; import { _td } from "../../languageHandler.tsx"; import ServerSupportUnstableFeatureController from "./ServerSupportUnstableFeatureController.ts"; import { defaultWatchManager, type SettingKey } from "../Settings.tsx"; @@ -17,11 +18,17 @@ import { defaultWatchManager, type SettingKey } from "../Settings.tsx"; */ export default class BlockInvitesConfigController extends ServerSupportUnstableFeatureController { public constructor(settingName: SettingKey) { - super(settingName, defaultWatchManager, [["org.matrix.msc4380"]], undefined, _td("settings|not_supported")); + super( + settingName, + defaultWatchManager, + [["org.matrix.msc4380.stable"]], + "v1.18", + _td("settings|not_supported"), + ); } public getValueOverride(_level: SettingLevel): boolean { - const accountData = this.client?.getAccountData(MSC4380_INVITE_RULES_ACCOUNT_DATA_TYPE)?.getContent(); + const accountData = this.client?.getAccountData(EventType.InvitePermissionConfig)?.getContent(); return accountData?.default_action == "block"; } @@ -29,8 +36,8 @@ export default class BlockInvitesConfigController extends ServerSupportUnstableF if (!this.client) { return false; } - const newDefault = newValue ? "block" : "allow"; - await this.client.setAccountData(MSC4380_INVITE_RULES_ACCOUNT_DATA_TYPE, { default_action: newDefault }); + + await this.client.setAccountData(EventType.InvitePermissionConfig, newValue ? { default_action: "block" } : {}); return true; } } diff --git a/src/settings/controllers/DeviceIsolationModeController.ts b/apps/web/src/settings/controllers/DeviceIsolationModeController.ts similarity index 100% rename from src/settings/controllers/DeviceIsolationModeController.ts rename to apps/web/src/settings/controllers/DeviceIsolationModeController.ts diff --git a/src/settings/controllers/FallbackIceServerController.ts b/apps/web/src/settings/controllers/FallbackIceServerController.ts similarity index 100% rename from src/settings/controllers/FallbackIceServerController.ts rename to apps/web/src/settings/controllers/FallbackIceServerController.ts diff --git a/src/settings/controllers/FontSizeController.ts b/apps/web/src/settings/controllers/FontSizeController.ts similarity index 100% rename from src/settings/controllers/FontSizeController.ts rename to apps/web/src/settings/controllers/FontSizeController.ts diff --git a/src/settings/controllers/IncompatibleController.ts b/apps/web/src/settings/controllers/IncompatibleController.ts similarity index 100% rename from src/settings/controllers/IncompatibleController.ts rename to apps/web/src/settings/controllers/IncompatibleController.ts diff --git a/src/settings/controllers/InviteRulesConfigController.ts b/apps/web/src/settings/controllers/InviteRulesConfigController.ts similarity index 100% rename from src/settings/controllers/InviteRulesConfigController.ts rename to apps/web/src/settings/controllers/InviteRulesConfigController.ts diff --git a/src/settings/controllers/MatrixClientBackedController.ts b/apps/web/src/settings/controllers/MatrixClientBackedController.ts similarity index 100% rename from src/settings/controllers/MatrixClientBackedController.ts rename to apps/web/src/settings/controllers/MatrixClientBackedController.ts diff --git a/src/settings/controllers/MediaPreviewConfigController.ts b/apps/web/src/settings/controllers/MediaPreviewConfigController.ts similarity index 100% rename from src/settings/controllers/MediaPreviewConfigController.ts rename to apps/web/src/settings/controllers/MediaPreviewConfigController.ts diff --git a/src/settings/controllers/NotificationControllers.ts b/apps/web/src/settings/controllers/NotificationControllers.ts similarity index 100% rename from src/settings/controllers/NotificationControllers.ts rename to apps/web/src/settings/controllers/NotificationControllers.ts diff --git a/src/settings/controllers/ReducedMotionController.ts b/apps/web/src/settings/controllers/ReducedMotionController.ts similarity index 100% rename from src/settings/controllers/ReducedMotionController.ts rename to apps/web/src/settings/controllers/ReducedMotionController.ts diff --git a/src/settings/controllers/ReloadOnChangeController.ts b/apps/web/src/settings/controllers/ReloadOnChangeController.ts similarity index 100% rename from src/settings/controllers/ReloadOnChangeController.ts rename to apps/web/src/settings/controllers/ReloadOnChangeController.ts diff --git a/src/settings/controllers/ServerSupportUnstableFeatureController.ts b/apps/web/src/settings/controllers/ServerSupportUnstableFeatureController.ts similarity index 100% rename from src/settings/controllers/ServerSupportUnstableFeatureController.ts rename to apps/web/src/settings/controllers/ServerSupportUnstableFeatureController.ts diff --git a/src/settings/controllers/SettingController.ts b/apps/web/src/settings/controllers/SettingController.ts similarity index 100% rename from src/settings/controllers/SettingController.ts rename to apps/web/src/settings/controllers/SettingController.ts diff --git a/src/settings/controllers/SlidingSyncController.ts b/apps/web/src/settings/controllers/SlidingSyncController.ts similarity index 100% rename from src/settings/controllers/SlidingSyncController.ts rename to apps/web/src/settings/controllers/SlidingSyncController.ts diff --git a/src/settings/controllers/SystemFontController.ts b/apps/web/src/settings/controllers/SystemFontController.ts similarity index 100% rename from src/settings/controllers/SystemFontController.ts rename to apps/web/src/settings/controllers/SystemFontController.ts diff --git a/src/settings/controllers/ThemeController.ts b/apps/web/src/settings/controllers/ThemeController.ts similarity index 100% rename from src/settings/controllers/ThemeController.ts rename to apps/web/src/settings/controllers/ThemeController.ts diff --git a/src/settings/controllers/UIFeatureController.ts b/apps/web/src/settings/controllers/UIFeatureController.ts similarity index 100% rename from src/settings/controllers/UIFeatureController.ts rename to apps/web/src/settings/controllers/UIFeatureController.ts diff --git a/src/settings/enums/ImageSize.ts b/apps/web/src/settings/enums/ImageSize.ts similarity index 100% rename from src/settings/enums/ImageSize.ts rename to apps/web/src/settings/enums/ImageSize.ts diff --git a/src/settings/enums/Layout.ts b/apps/web/src/settings/enums/Layout.ts similarity index 100% rename from src/settings/enums/Layout.ts rename to apps/web/src/settings/enums/Layout.ts diff --git a/src/settings/handlers/AbstractLocalStorageSettingsHandler.ts b/apps/web/src/settings/handlers/AbstractLocalStorageSettingsHandler.ts similarity index 100% rename from src/settings/handlers/AbstractLocalStorageSettingsHandler.ts rename to apps/web/src/settings/handlers/AbstractLocalStorageSettingsHandler.ts diff --git a/src/settings/handlers/AccountSettingsHandler.ts b/apps/web/src/settings/handlers/AccountSettingsHandler.ts similarity index 100% rename from src/settings/handlers/AccountSettingsHandler.ts rename to apps/web/src/settings/handlers/AccountSettingsHandler.ts diff --git a/src/settings/handlers/ConfigSettingsHandler.ts b/apps/web/src/settings/handlers/ConfigSettingsHandler.ts similarity index 100% rename from src/settings/handlers/ConfigSettingsHandler.ts rename to apps/web/src/settings/handlers/ConfigSettingsHandler.ts diff --git a/src/settings/handlers/DefaultSettingsHandler.ts b/apps/web/src/settings/handlers/DefaultSettingsHandler.ts similarity index 100% rename from src/settings/handlers/DefaultSettingsHandler.ts rename to apps/web/src/settings/handlers/DefaultSettingsHandler.ts diff --git a/src/settings/handlers/DeviceSettingsHandler.ts b/apps/web/src/settings/handlers/DeviceSettingsHandler.ts similarity index 100% rename from src/settings/handlers/DeviceSettingsHandler.ts rename to apps/web/src/settings/handlers/DeviceSettingsHandler.ts diff --git a/src/settings/handlers/LocalEchoWrapper.ts b/apps/web/src/settings/handlers/LocalEchoWrapper.ts similarity index 100% rename from src/settings/handlers/LocalEchoWrapper.ts rename to apps/web/src/settings/handlers/LocalEchoWrapper.ts diff --git a/src/settings/handlers/MatrixClientBackedSettingsHandler.ts b/apps/web/src/settings/handlers/MatrixClientBackedSettingsHandler.ts similarity index 100% rename from src/settings/handlers/MatrixClientBackedSettingsHandler.ts rename to apps/web/src/settings/handlers/MatrixClientBackedSettingsHandler.ts diff --git a/src/settings/handlers/PlatformSettingsHandler.ts b/apps/web/src/settings/handlers/PlatformSettingsHandler.ts similarity index 100% rename from src/settings/handlers/PlatformSettingsHandler.ts rename to apps/web/src/settings/handlers/PlatformSettingsHandler.ts diff --git a/src/settings/handlers/RoomAccountSettingsHandler.ts b/apps/web/src/settings/handlers/RoomAccountSettingsHandler.ts similarity index 100% rename from src/settings/handlers/RoomAccountSettingsHandler.ts rename to apps/web/src/settings/handlers/RoomAccountSettingsHandler.ts diff --git a/src/settings/handlers/RoomDeviceSettingsHandler.ts b/apps/web/src/settings/handlers/RoomDeviceSettingsHandler.ts similarity index 100% rename from src/settings/handlers/RoomDeviceSettingsHandler.ts rename to apps/web/src/settings/handlers/RoomDeviceSettingsHandler.ts diff --git a/src/settings/handlers/RoomSettingsHandler.ts b/apps/web/src/settings/handlers/RoomSettingsHandler.ts similarity index 100% rename from src/settings/handlers/RoomSettingsHandler.ts rename to apps/web/src/settings/handlers/RoomSettingsHandler.ts diff --git a/src/settings/handlers/SettingsHandler.ts b/apps/web/src/settings/handlers/SettingsHandler.ts similarity index 100% rename from src/settings/handlers/SettingsHandler.ts rename to apps/web/src/settings/handlers/SettingsHandler.ts diff --git a/src/settings/watchers/FontWatcher.ts b/apps/web/src/settings/watchers/FontWatcher.ts similarity index 100% rename from src/settings/watchers/FontWatcher.ts rename to apps/web/src/settings/watchers/FontWatcher.ts diff --git a/src/settings/watchers/ThemeWatcher.ts b/apps/web/src/settings/watchers/ThemeWatcher.ts similarity index 92% rename from src/settings/watchers/ThemeWatcher.ts rename to apps/web/src/settings/watchers/ThemeWatcher.ts index d56ee559c2..9876dcfe6b 100644 --- a/src/settings/watchers/ThemeWatcher.ts +++ b/apps/web/src/settings/watchers/ThemeWatcher.ts @@ -13,7 +13,7 @@ import { TypedEventEmitter } from "matrix-js-sdk/src/matrix"; import SettingsStore from "../SettingsStore"; import dis from "../../dispatcher/dispatcher"; import { Action } from "../../dispatcher/actions"; -import { findHighContrastTheme } from "../../theme"; +import { findHighContrastTheme, getCustomTheme } from "../../theme"; import { type ActionPayload } from "../../dispatcher/payloads"; import { SettingLevel } from "../SettingLevel"; @@ -125,6 +125,17 @@ export default class ThemeWatcher extends TypedEventEmitter { } } - private async onDecryptionAttempt(ev: MatrixEvent): Promise { + private onDecryptionAttempt = async (ev: MatrixEvent): Promise => { if (!this.state.initialSyncCompleted) { return; } @@ -143,19 +143,19 @@ export default class AutoRageshakeStore extends AsyncStoreWithClient { new Map([[senderUserId, new Map([[messageContent.device_id, messageContent]])]]), ); } - } + }; - private async onSyncStateChange( + private onSyncStateChange = async ( _state: SyncState, _prevState: SyncState | null, data?: SyncStateData, - ): Promise { + ): Promise => { if (!this.state.initialSyncCompleted) { await this.updateState({ initialSyncCompleted: !!data?.nextSyncToken }); } - } + }; - private async onDeviceMessage(ev: MatrixEvent): Promise { + private onDeviceMessage = async (ev: MatrixEvent): Promise => { if (ev.getType() !== AUTO_RS_REQUEST) return; const messageContent = ev.getContent(); const recipientRageshake = messageContent["recipient_rageshake"] || ""; @@ -180,7 +180,7 @@ export default class AutoRageshakeStore extends AsyncStoreWithClient { `Not sending sender-side autorageshake for event ${messageContent["event_id"]}/session ${messageContent["session_id"]}: last rageshake was too recent`, ); } - } + }; } window.mxAutoRageshakeStore = AutoRageshakeStore.instance; diff --git a/src/stores/BreadcrumbsStore.ts b/apps/web/src/stores/BreadcrumbsStore.ts similarity index 100% rename from src/stores/BreadcrumbsStore.ts rename to apps/web/src/stores/BreadcrumbsStore.ts diff --git a/src/stores/CallStore.ts b/apps/web/src/stores/CallStore.ts similarity index 100% rename from src/stores/CallStore.ts rename to apps/web/src/stores/CallStore.ts diff --git a/src/stores/InitialCryptoSetupStore.ts b/apps/web/src/stores/InitialCryptoSetupStore.ts similarity index 100% rename from src/stores/InitialCryptoSetupStore.ts rename to apps/web/src/stores/InitialCryptoSetupStore.ts diff --git a/src/stores/LifecycleStore.ts b/apps/web/src/stores/LifecycleStore.ts similarity index 100% rename from src/stores/LifecycleStore.ts rename to apps/web/src/stores/LifecycleStore.ts diff --git a/src/stores/MemberListStore.ts b/apps/web/src/stores/MemberListStore.ts similarity index 100% rename from src/stores/MemberListStore.ts rename to apps/web/src/stores/MemberListStore.ts diff --git a/src/stores/ModalWidgetStore.ts b/apps/web/src/stores/ModalWidgetStore.ts similarity index 100% rename from src/stores/ModalWidgetStore.ts rename to apps/web/src/stores/ModalWidgetStore.ts diff --git a/src/stores/MultiRoomViewStore.ts b/apps/web/src/stores/MultiRoomViewStore.ts similarity index 100% rename from src/stores/MultiRoomViewStore.ts rename to apps/web/src/stores/MultiRoomViewStore.ts diff --git a/src/stores/NonUrgentToastStore.ts b/apps/web/src/stores/NonUrgentToastStore.ts similarity index 100% rename from src/stores/NonUrgentToastStore.ts rename to apps/web/src/stores/NonUrgentToastStore.ts diff --git a/src/stores/OwnBeaconStore.ts b/apps/web/src/stores/OwnBeaconStore.ts similarity index 100% rename from src/stores/OwnBeaconStore.ts rename to apps/web/src/stores/OwnBeaconStore.ts diff --git a/src/stores/OwnProfileStore.ts b/apps/web/src/stores/OwnProfileStore.ts similarity index 100% rename from src/stores/OwnProfileStore.ts rename to apps/web/src/stores/OwnProfileStore.ts diff --git a/src/stores/ReadyWatchingStore.ts b/apps/web/src/stores/ReadyWatchingStore.ts similarity index 100% rename from src/stores/ReadyWatchingStore.ts rename to apps/web/src/stores/ReadyWatchingStore.ts diff --git a/src/stores/ReleaseAnnouncementStore.ts b/apps/web/src/stores/ReleaseAnnouncementStore.ts similarity index 100% rename from src/stores/ReleaseAnnouncementStore.ts rename to apps/web/src/stores/ReleaseAnnouncementStore.ts diff --git a/src/stores/RoomScrollStateStore.ts b/apps/web/src/stores/RoomScrollStateStore.ts similarity index 100% rename from src/stores/RoomScrollStateStore.ts rename to apps/web/src/stores/RoomScrollStateStore.ts diff --git a/src/stores/RoomViewStore.tsx b/apps/web/src/stores/RoomViewStore.tsx similarity index 100% rename from src/stores/RoomViewStore.tsx rename to apps/web/src/stores/RoomViewStore.tsx diff --git a/src/stores/SetupEncryptionStore.ts b/apps/web/src/stores/SetupEncryptionStore.ts similarity index 100% rename from src/stores/SetupEncryptionStore.ts rename to apps/web/src/stores/SetupEncryptionStore.ts diff --git a/src/stores/ThreepidInviteStore.ts b/apps/web/src/stores/ThreepidInviteStore.ts similarity index 100% rename from src/stores/ThreepidInviteStore.ts rename to apps/web/src/stores/ThreepidInviteStore.ts diff --git a/src/stores/ToastStore.ts b/apps/web/src/stores/ToastStore.ts similarity index 100% rename from src/stores/ToastStore.ts rename to apps/web/src/stores/ToastStore.ts diff --git a/src/stores/TypingStore.ts b/apps/web/src/stores/TypingStore.ts similarity index 100% rename from src/stores/TypingStore.ts rename to apps/web/src/stores/TypingStore.ts diff --git a/src/stores/UIStore.ts b/apps/web/src/stores/UIStore.ts similarity index 100% rename from src/stores/UIStore.ts rename to apps/web/src/stores/UIStore.ts diff --git a/src/stores/UserProfilesStore.ts b/apps/web/src/stores/UserProfilesStore.ts similarity index 100% rename from src/stores/UserProfilesStore.ts rename to apps/web/src/stores/UserProfilesStore.ts diff --git a/src/stores/VoiceRecordingStore.ts b/apps/web/src/stores/VoiceRecordingStore.ts similarity index 100% rename from src/stores/VoiceRecordingStore.ts rename to apps/web/src/stores/VoiceRecordingStore.ts diff --git a/src/stores/WidgetEchoStore.ts b/apps/web/src/stores/WidgetEchoStore.ts similarity index 100% rename from src/stores/WidgetEchoStore.ts rename to apps/web/src/stores/WidgetEchoStore.ts diff --git a/src/stores/WidgetStore.ts b/apps/web/src/stores/WidgetStore.ts similarity index 100% rename from src/stores/WidgetStore.ts rename to apps/web/src/stores/WidgetStore.ts diff --git a/src/stores/local-echo/EchoChamber.ts b/apps/web/src/stores/local-echo/EchoChamber.ts similarity index 100% rename from src/stores/local-echo/EchoChamber.ts rename to apps/web/src/stores/local-echo/EchoChamber.ts diff --git a/src/stores/local-echo/EchoContext.ts b/apps/web/src/stores/local-echo/EchoContext.ts similarity index 100% rename from src/stores/local-echo/EchoContext.ts rename to apps/web/src/stores/local-echo/EchoContext.ts diff --git a/src/stores/local-echo/EchoStore.ts b/apps/web/src/stores/local-echo/EchoStore.ts similarity index 100% rename from src/stores/local-echo/EchoStore.ts rename to apps/web/src/stores/local-echo/EchoStore.ts diff --git a/src/stores/local-echo/EchoTransaction.ts b/apps/web/src/stores/local-echo/EchoTransaction.ts similarity index 100% rename from src/stores/local-echo/EchoTransaction.ts rename to apps/web/src/stores/local-echo/EchoTransaction.ts diff --git a/src/stores/local-echo/GenericEchoChamber.ts b/apps/web/src/stores/local-echo/GenericEchoChamber.ts similarity index 100% rename from src/stores/local-echo/GenericEchoChamber.ts rename to apps/web/src/stores/local-echo/GenericEchoChamber.ts diff --git a/src/stores/local-echo/RoomEchoChamber.ts b/apps/web/src/stores/local-echo/RoomEchoChamber.ts similarity index 100% rename from src/stores/local-echo/RoomEchoChamber.ts rename to apps/web/src/stores/local-echo/RoomEchoChamber.ts diff --git a/src/stores/local-echo/RoomEchoContext.ts b/apps/web/src/stores/local-echo/RoomEchoContext.ts similarity index 100% rename from src/stores/local-echo/RoomEchoContext.ts rename to apps/web/src/stores/local-echo/RoomEchoContext.ts diff --git a/src/stores/notifications/ListNotificationState.ts b/apps/web/src/stores/notifications/ListNotificationState.ts similarity index 100% rename from src/stores/notifications/ListNotificationState.ts rename to apps/web/src/stores/notifications/ListNotificationState.ts diff --git a/src/stores/notifications/NotificationLevel.ts b/apps/web/src/stores/notifications/NotificationLevel.ts similarity index 100% rename from src/stores/notifications/NotificationLevel.ts rename to apps/web/src/stores/notifications/NotificationLevel.ts diff --git a/src/stores/notifications/NotificationState.ts b/apps/web/src/stores/notifications/NotificationState.ts similarity index 100% rename from src/stores/notifications/NotificationState.ts rename to apps/web/src/stores/notifications/NotificationState.ts diff --git a/src/stores/notifications/RoomNotificationState.ts b/apps/web/src/stores/notifications/RoomNotificationState.ts similarity index 100% rename from src/stores/notifications/RoomNotificationState.ts rename to apps/web/src/stores/notifications/RoomNotificationState.ts diff --git a/src/stores/notifications/RoomNotificationStateStore.ts b/apps/web/src/stores/notifications/RoomNotificationStateStore.ts similarity index 100% rename from src/stores/notifications/RoomNotificationStateStore.ts rename to apps/web/src/stores/notifications/RoomNotificationStateStore.ts diff --git a/src/stores/notifications/SpaceNotificationState.ts b/apps/web/src/stores/notifications/SpaceNotificationState.ts similarity index 100% rename from src/stores/notifications/SpaceNotificationState.ts rename to apps/web/src/stores/notifications/SpaceNotificationState.ts diff --git a/src/stores/notifications/StaticNotificationState.ts b/apps/web/src/stores/notifications/StaticNotificationState.ts similarity index 100% rename from src/stores/notifications/StaticNotificationState.ts rename to apps/web/src/stores/notifications/StaticNotificationState.ts diff --git a/src/stores/notifications/SummarizedNotificationState.ts b/apps/web/src/stores/notifications/SummarizedNotificationState.ts similarity index 100% rename from src/stores/notifications/SummarizedNotificationState.ts rename to apps/web/src/stores/notifications/SummarizedNotificationState.ts diff --git a/src/stores/oidc/OidcClientStore.ts b/apps/web/src/stores/oidc/OidcClientStore.ts similarity index 100% rename from src/stores/oidc/OidcClientStore.ts rename to apps/web/src/stores/oidc/OidcClientStore.ts diff --git a/src/stores/right-panel/RightPanelStore.ts b/apps/web/src/stores/right-panel/RightPanelStore.ts similarity index 100% rename from src/stores/right-panel/RightPanelStore.ts rename to apps/web/src/stores/right-panel/RightPanelStore.ts diff --git a/src/stores/right-panel/RightPanelStoreIPanelState.ts b/apps/web/src/stores/right-panel/RightPanelStoreIPanelState.ts similarity index 100% rename from src/stores/right-panel/RightPanelStoreIPanelState.ts rename to apps/web/src/stores/right-panel/RightPanelStoreIPanelState.ts diff --git a/src/stores/right-panel/RightPanelStorePhases.ts b/apps/web/src/stores/right-panel/RightPanelStorePhases.ts similarity index 100% rename from src/stores/right-panel/RightPanelStorePhases.ts rename to apps/web/src/stores/right-panel/RightPanelStorePhases.ts diff --git a/src/stores/right-panel/action-handlers/View3pidInvite.ts b/apps/web/src/stores/right-panel/action-handlers/View3pidInvite.ts similarity index 100% rename from src/stores/right-panel/action-handlers/View3pidInvite.ts rename to apps/web/src/stores/right-panel/action-handlers/View3pidInvite.ts diff --git a/src/stores/right-panel/action-handlers/index.ts b/apps/web/src/stores/right-panel/action-handlers/index.ts similarity index 100% rename from src/stores/right-panel/action-handlers/index.ts rename to apps/web/src/stores/right-panel/action-handlers/index.ts diff --git a/src/stores/room-list-v3/RoomListStoreV3.ts b/apps/web/src/stores/room-list-v3/RoomListStoreV3.ts similarity index 100% rename from src/stores/room-list-v3/RoomListStoreV3.ts rename to apps/web/src/stores/room-list-v3/RoomListStoreV3.ts diff --git a/src/stores/room-list-v3/skip-list/Level.ts b/apps/web/src/stores/room-list-v3/skip-list/Level.ts similarity index 100% rename from src/stores/room-list-v3/skip-list/Level.ts rename to apps/web/src/stores/room-list-v3/skip-list/Level.ts diff --git a/src/stores/room-list-v3/skip-list/RoomNode.ts b/apps/web/src/stores/room-list-v3/skip-list/RoomNode.ts similarity index 100% rename from src/stores/room-list-v3/skip-list/RoomNode.ts rename to apps/web/src/stores/room-list-v3/skip-list/RoomNode.ts diff --git a/src/stores/room-list-v3/skip-list/RoomSkipList.ts b/apps/web/src/stores/room-list-v3/skip-list/RoomSkipList.ts similarity index 100% rename from src/stores/room-list-v3/skip-list/RoomSkipList.ts rename to apps/web/src/stores/room-list-v3/skip-list/RoomSkipList.ts diff --git a/src/stores/room-list-v3/skip-list/filters/FavouriteFilter.ts b/apps/web/src/stores/room-list-v3/skip-list/filters/FavouriteFilter.ts similarity index 100% rename from src/stores/room-list-v3/skip-list/filters/FavouriteFilter.ts rename to apps/web/src/stores/room-list-v3/skip-list/filters/FavouriteFilter.ts diff --git a/src/stores/room-list-v3/skip-list/filters/InvitesFilter.ts b/apps/web/src/stores/room-list-v3/skip-list/filters/InvitesFilter.ts similarity index 100% rename from src/stores/room-list-v3/skip-list/filters/InvitesFilter.ts rename to apps/web/src/stores/room-list-v3/skip-list/filters/InvitesFilter.ts diff --git a/src/stores/room-list-v3/skip-list/filters/LowPriorityFilter.ts b/apps/web/src/stores/room-list-v3/skip-list/filters/LowPriorityFilter.ts similarity index 100% rename from src/stores/room-list-v3/skip-list/filters/LowPriorityFilter.ts rename to apps/web/src/stores/room-list-v3/skip-list/filters/LowPriorityFilter.ts diff --git a/src/stores/room-list-v3/skip-list/filters/MentionsFilter.ts b/apps/web/src/stores/room-list-v3/skip-list/filters/MentionsFilter.ts similarity index 100% rename from src/stores/room-list-v3/skip-list/filters/MentionsFilter.ts rename to apps/web/src/stores/room-list-v3/skip-list/filters/MentionsFilter.ts diff --git a/src/stores/room-list-v3/skip-list/filters/PeopleFilter.ts b/apps/web/src/stores/room-list-v3/skip-list/filters/PeopleFilter.ts similarity index 100% rename from src/stores/room-list-v3/skip-list/filters/PeopleFilter.ts rename to apps/web/src/stores/room-list-v3/skip-list/filters/PeopleFilter.ts diff --git a/src/stores/room-list-v3/skip-list/filters/RoomsFilter.ts b/apps/web/src/stores/room-list-v3/skip-list/filters/RoomsFilter.ts similarity index 100% rename from src/stores/room-list-v3/skip-list/filters/RoomsFilter.ts rename to apps/web/src/stores/room-list-v3/skip-list/filters/RoomsFilter.ts diff --git a/src/stores/room-list-v3/skip-list/filters/UnreadFilter.ts b/apps/web/src/stores/room-list-v3/skip-list/filters/UnreadFilter.ts similarity index 100% rename from src/stores/room-list-v3/skip-list/filters/UnreadFilter.ts rename to apps/web/src/stores/room-list-v3/skip-list/filters/UnreadFilter.ts diff --git a/src/stores/room-list-v3/skip-list/filters/index.ts b/apps/web/src/stores/room-list-v3/skip-list/filters/index.ts similarity index 100% rename from src/stores/room-list-v3/skip-list/filters/index.ts rename to apps/web/src/stores/room-list-v3/skip-list/filters/index.ts diff --git a/src/stores/room-list-v3/skip-list/iterators.ts b/apps/web/src/stores/room-list-v3/skip-list/iterators.ts similarity index 100% rename from src/stores/room-list-v3/skip-list/iterators.ts rename to apps/web/src/stores/room-list-v3/skip-list/iterators.ts diff --git a/src/stores/room-list-v3/skip-list/sorters/AlphabeticSorter.ts b/apps/web/src/stores/room-list-v3/skip-list/sorters/AlphabeticSorter.ts similarity index 100% rename from src/stores/room-list-v3/skip-list/sorters/AlphabeticSorter.ts rename to apps/web/src/stores/room-list-v3/skip-list/sorters/AlphabeticSorter.ts diff --git a/src/stores/room-list-v3/skip-list/sorters/BaseRecencySorter.ts b/apps/web/src/stores/room-list-v3/skip-list/sorters/BaseRecencySorter.ts similarity index 100% rename from src/stores/room-list-v3/skip-list/sorters/BaseRecencySorter.ts rename to apps/web/src/stores/room-list-v3/skip-list/sorters/BaseRecencySorter.ts diff --git a/src/stores/room-list-v3/skip-list/sorters/RecencySorter.ts b/apps/web/src/stores/room-list-v3/skip-list/sorters/RecencySorter.ts similarity index 100% rename from src/stores/room-list-v3/skip-list/sorters/RecencySorter.ts rename to apps/web/src/stores/room-list-v3/skip-list/sorters/RecencySorter.ts diff --git a/src/stores/room-list-v3/skip-list/sorters/UnreadSorter.ts b/apps/web/src/stores/room-list-v3/skip-list/sorters/UnreadSorter.ts similarity index 100% rename from src/stores/room-list-v3/skip-list/sorters/UnreadSorter.ts rename to apps/web/src/stores/room-list-v3/skip-list/sorters/UnreadSorter.ts diff --git a/src/stores/room-list-v3/skip-list/sorters/index.ts b/apps/web/src/stores/room-list-v3/skip-list/sorters/index.ts similarity index 100% rename from src/stores/room-list-v3/skip-list/sorters/index.ts rename to apps/web/src/stores/room-list-v3/skip-list/sorters/index.ts diff --git a/src/stores/room-list-v3/skip-list/sorters/utils/getLastTimestamp.ts b/apps/web/src/stores/room-list-v3/skip-list/sorters/utils/getLastTimestamp.ts similarity index 100% rename from src/stores/room-list-v3/skip-list/sorters/utils/getLastTimestamp.ts rename to apps/web/src/stores/room-list-v3/skip-list/sorters/utils/getLastTimestamp.ts diff --git a/src/stores/room-list-v3/skip-list/utils.ts b/apps/web/src/stores/room-list-v3/skip-list/utils.ts similarity index 100% rename from src/stores/room-list-v3/skip-list/utils.ts rename to apps/web/src/stores/room-list-v3/skip-list/utils.ts diff --git a/src/stores/room-list/Interface.ts b/apps/web/src/stores/room-list/Interface.ts similarity index 100% rename from src/stores/room-list/Interface.ts rename to apps/web/src/stores/room-list/Interface.ts diff --git a/src/stores/room-list/ListLayout.ts b/apps/web/src/stores/room-list/ListLayout.ts similarity index 100% rename from src/stores/room-list/ListLayout.ts rename to apps/web/src/stores/room-list/ListLayout.ts diff --git a/src/stores/room-list/MessagePreviewStore.ts b/apps/web/src/stores/room-list/MessagePreviewStore.ts similarity index 100% rename from src/stores/room-list/MessagePreviewStore.ts rename to apps/web/src/stores/room-list/MessagePreviewStore.ts diff --git a/src/stores/room-list/RoomListLayoutStore.ts b/apps/web/src/stores/room-list/RoomListLayoutStore.ts similarity index 100% rename from src/stores/room-list/RoomListLayoutStore.ts rename to apps/web/src/stores/room-list/RoomListLayoutStore.ts diff --git a/src/stores/room-list/RoomListStore.ts b/apps/web/src/stores/room-list/RoomListStore.ts similarity index 100% rename from src/stores/room-list/RoomListStore.ts rename to apps/web/src/stores/room-list/RoomListStore.ts diff --git a/src/stores/room-list/SpaceWatcher.ts b/apps/web/src/stores/room-list/SpaceWatcher.ts similarity index 100% rename from src/stores/room-list/SpaceWatcher.ts rename to apps/web/src/stores/room-list/SpaceWatcher.ts diff --git a/src/stores/room-list/algorithms/Algorithm.ts b/apps/web/src/stores/room-list/algorithms/Algorithm.ts similarity index 100% rename from src/stores/room-list/algorithms/Algorithm.ts rename to apps/web/src/stores/room-list/algorithms/Algorithm.ts diff --git a/src/stores/room-list/algorithms/list-ordering/ImportanceAlgorithm.ts b/apps/web/src/stores/room-list/algorithms/list-ordering/ImportanceAlgorithm.ts similarity index 100% rename from src/stores/room-list/algorithms/list-ordering/ImportanceAlgorithm.ts rename to apps/web/src/stores/room-list/algorithms/list-ordering/ImportanceAlgorithm.ts diff --git a/src/stores/room-list/algorithms/list-ordering/NaturalAlgorithm.ts b/apps/web/src/stores/room-list/algorithms/list-ordering/NaturalAlgorithm.ts similarity index 100% rename from src/stores/room-list/algorithms/list-ordering/NaturalAlgorithm.ts rename to apps/web/src/stores/room-list/algorithms/list-ordering/NaturalAlgorithm.ts diff --git a/src/stores/room-list/algorithms/list-ordering/OrderingAlgorithm.ts b/apps/web/src/stores/room-list/algorithms/list-ordering/OrderingAlgorithm.ts similarity index 100% rename from src/stores/room-list/algorithms/list-ordering/OrderingAlgorithm.ts rename to apps/web/src/stores/room-list/algorithms/list-ordering/OrderingAlgorithm.ts diff --git a/src/stores/room-list/algorithms/list-ordering/index.ts b/apps/web/src/stores/room-list/algorithms/list-ordering/index.ts similarity index 100% rename from src/stores/room-list/algorithms/list-ordering/index.ts rename to apps/web/src/stores/room-list/algorithms/list-ordering/index.ts diff --git a/src/stores/room-list/algorithms/models.ts b/apps/web/src/stores/room-list/algorithms/models.ts similarity index 100% rename from src/stores/room-list/algorithms/models.ts rename to apps/web/src/stores/room-list/algorithms/models.ts diff --git a/src/stores/room-list/algorithms/tag-sorting/AlphabeticAlgorithm.ts b/apps/web/src/stores/room-list/algorithms/tag-sorting/AlphabeticAlgorithm.ts similarity index 100% rename from src/stores/room-list/algorithms/tag-sorting/AlphabeticAlgorithm.ts rename to apps/web/src/stores/room-list/algorithms/tag-sorting/AlphabeticAlgorithm.ts diff --git a/src/stores/room-list/algorithms/tag-sorting/IAlgorithm.ts b/apps/web/src/stores/room-list/algorithms/tag-sorting/IAlgorithm.ts similarity index 100% rename from src/stores/room-list/algorithms/tag-sorting/IAlgorithm.ts rename to apps/web/src/stores/room-list/algorithms/tag-sorting/IAlgorithm.ts diff --git a/src/stores/room-list/algorithms/tag-sorting/ManualAlgorithm.ts b/apps/web/src/stores/room-list/algorithms/tag-sorting/ManualAlgorithm.ts similarity index 100% rename from src/stores/room-list/algorithms/tag-sorting/ManualAlgorithm.ts rename to apps/web/src/stores/room-list/algorithms/tag-sorting/ManualAlgorithm.ts diff --git a/src/stores/room-list/algorithms/tag-sorting/RecentAlgorithm.ts b/apps/web/src/stores/room-list/algorithms/tag-sorting/RecentAlgorithm.ts similarity index 100% rename from src/stores/room-list/algorithms/tag-sorting/RecentAlgorithm.ts rename to apps/web/src/stores/room-list/algorithms/tag-sorting/RecentAlgorithm.ts diff --git a/src/stores/room-list/algorithms/tag-sorting/index.ts b/apps/web/src/stores/room-list/algorithms/tag-sorting/index.ts similarity index 100% rename from src/stores/room-list/algorithms/tag-sorting/index.ts rename to apps/web/src/stores/room-list/algorithms/tag-sorting/index.ts diff --git a/src/stores/room-list/filters/IFilterCondition.ts b/apps/web/src/stores/room-list/filters/IFilterCondition.ts similarity index 100% rename from src/stores/room-list/filters/IFilterCondition.ts rename to apps/web/src/stores/room-list/filters/IFilterCondition.ts diff --git a/src/stores/room-list/filters/SpaceFilterCondition.ts b/apps/web/src/stores/room-list/filters/SpaceFilterCondition.ts similarity index 100% rename from src/stores/room-list/filters/SpaceFilterCondition.ts rename to apps/web/src/stores/room-list/filters/SpaceFilterCondition.ts diff --git a/src/stores/room-list/filters/VisibilityProvider.ts b/apps/web/src/stores/room-list/filters/VisibilityProvider.ts similarity index 90% rename from src/stores/room-list/filters/VisibilityProvider.ts rename to apps/web/src/stores/room-list/filters/VisibilityProvider.ts index 178a1ed553..443c679db8 100644 --- a/src/stores/room-list/filters/VisibilityProvider.ts +++ b/apps/web/src/stores/room-list/filters/VisibilityProvider.ts @@ -38,9 +38,8 @@ export class VisibilityProvider { return false; } - const isVisibleFn = RoomListCustomisations.isRoomVisible; - if (isVisibleFn) { - return isVisibleFn(room); + if (RoomListCustomisations.isRoomVisible) { + return RoomListCustomisations.isRoomVisible(room); } return true; // default diff --git a/src/stores/room-list/models.ts b/apps/web/src/stores/room-list/models.ts similarity index 100% rename from src/stores/room-list/models.ts rename to apps/web/src/stores/room-list/models.ts diff --git a/src/stores/room-list/previews/IPreview.ts b/apps/web/src/stores/room-list/previews/IPreview.ts similarity index 100% rename from src/stores/room-list/previews/IPreview.ts rename to apps/web/src/stores/room-list/previews/IPreview.ts diff --git a/src/stores/room-list/previews/LegacyCallAnswerEventPreview.ts b/apps/web/src/stores/room-list/previews/LegacyCallAnswerEventPreview.ts similarity index 100% rename from src/stores/room-list/previews/LegacyCallAnswerEventPreview.ts rename to apps/web/src/stores/room-list/previews/LegacyCallAnswerEventPreview.ts diff --git a/src/stores/room-list/previews/LegacyCallHangupEvent.ts b/apps/web/src/stores/room-list/previews/LegacyCallHangupEvent.ts similarity index 100% rename from src/stores/room-list/previews/LegacyCallHangupEvent.ts rename to apps/web/src/stores/room-list/previews/LegacyCallHangupEvent.ts diff --git a/src/stores/room-list/previews/LegacyCallInviteEventPreview.ts b/apps/web/src/stores/room-list/previews/LegacyCallInviteEventPreview.ts similarity index 100% rename from src/stores/room-list/previews/LegacyCallInviteEventPreview.ts rename to apps/web/src/stores/room-list/previews/LegacyCallInviteEventPreview.ts diff --git a/src/stores/room-list/previews/MessageEventPreview.ts b/apps/web/src/stores/room-list/previews/MessageEventPreview.ts similarity index 100% rename from src/stores/room-list/previews/MessageEventPreview.ts rename to apps/web/src/stores/room-list/previews/MessageEventPreview.ts diff --git a/src/stores/room-list/previews/PollStartEventPreview.ts b/apps/web/src/stores/room-list/previews/PollStartEventPreview.ts similarity index 100% rename from src/stores/room-list/previews/PollStartEventPreview.ts rename to apps/web/src/stores/room-list/previews/PollStartEventPreview.ts diff --git a/src/stores/room-list/previews/ReactionEventPreview.ts b/apps/web/src/stores/room-list/previews/ReactionEventPreview.ts similarity index 100% rename from src/stores/room-list/previews/ReactionEventPreview.ts rename to apps/web/src/stores/room-list/previews/ReactionEventPreview.ts diff --git a/src/stores/room-list/previews/StickerEventPreview.ts b/apps/web/src/stores/room-list/previews/StickerEventPreview.ts similarity index 100% rename from src/stores/room-list/previews/StickerEventPreview.ts rename to apps/web/src/stores/room-list/previews/StickerEventPreview.ts diff --git a/src/stores/room-list/previews/utils.ts b/apps/web/src/stores/room-list/previews/utils.ts similarity index 100% rename from src/stores/room-list/previews/utils.ts rename to apps/web/src/stores/room-list/previews/utils.ts diff --git a/src/stores/room-list/utils/roomMute.ts b/apps/web/src/stores/room-list/utils/roomMute.ts similarity index 100% rename from src/stores/room-list/utils/roomMute.ts rename to apps/web/src/stores/room-list/utils/roomMute.ts diff --git a/src/stores/spaces/SpaceStore.ts b/apps/web/src/stores/spaces/SpaceStore.ts similarity index 100% rename from src/stores/spaces/SpaceStore.ts rename to apps/web/src/stores/spaces/SpaceStore.ts diff --git a/src/stores/spaces/SpaceTreeLevelLayoutStore.ts b/apps/web/src/stores/spaces/SpaceTreeLevelLayoutStore.ts similarity index 100% rename from src/stores/spaces/SpaceTreeLevelLayoutStore.ts rename to apps/web/src/stores/spaces/SpaceTreeLevelLayoutStore.ts diff --git a/src/stores/spaces/flattenSpaceHierarchy.ts b/apps/web/src/stores/spaces/flattenSpaceHierarchy.ts similarity index 96% rename from src/stores/spaces/flattenSpaceHierarchy.ts rename to apps/web/src/stores/spaces/flattenSpaceHierarchy.ts index ca393d841b..3b51032e57 100644 --- a/src/stores/spaces/flattenSpaceHierarchy.ts +++ b/apps/web/src/stores/spaces/flattenSpaceHierarchy.ts @@ -43,7 +43,7 @@ export const flattenSpaceHierarchy = ( flattenedSpaceIds.forEach((id) => { const roomIds = spaceEntityMap.get(id); - roomIds?.forEach(flattenedRooms.add, flattenedRooms); + roomIds?.forEach((roomId) => flattenedRooms.add(roomId), flattenedRooms); }); return flattenedRooms; diff --git a/src/stores/spaces/index.ts b/apps/web/src/stores/spaces/index.ts similarity index 100% rename from src/stores/spaces/index.ts rename to apps/web/src/stores/spaces/index.ts diff --git a/src/stores/widgets/ElementWidgetActions.ts b/apps/web/src/stores/widgets/ElementWidgetActions.ts similarity index 100% rename from src/stores/widgets/ElementWidgetActions.ts rename to apps/web/src/stores/widgets/ElementWidgetActions.ts diff --git a/src/stores/widgets/ElementWidgetCapabilities.ts b/apps/web/src/stores/widgets/ElementWidgetCapabilities.ts similarity index 100% rename from src/stores/widgets/ElementWidgetCapabilities.ts rename to apps/web/src/stores/widgets/ElementWidgetCapabilities.ts diff --git a/src/stores/widgets/ElementWidgetDriver.ts b/apps/web/src/stores/widgets/ElementWidgetDriver.ts similarity index 100% rename from src/stores/widgets/ElementWidgetDriver.ts rename to apps/web/src/stores/widgets/ElementWidgetDriver.ts diff --git a/src/stores/widgets/WidgetLayoutStore.ts b/apps/web/src/stores/widgets/WidgetLayoutStore.ts similarity index 100% rename from src/stores/widgets/WidgetLayoutStore.ts rename to apps/web/src/stores/widgets/WidgetLayoutStore.ts diff --git a/src/stores/widgets/WidgetMessaging.ts b/apps/web/src/stores/widgets/WidgetMessaging.ts similarity index 100% rename from src/stores/widgets/WidgetMessaging.ts rename to apps/web/src/stores/widgets/WidgetMessaging.ts diff --git a/src/stores/widgets/WidgetMessagingStore.ts b/apps/web/src/stores/widgets/WidgetMessagingStore.ts similarity index 100% rename from src/stores/widgets/WidgetMessagingStore.ts rename to apps/web/src/stores/widgets/WidgetMessagingStore.ts diff --git a/src/stores/widgets/WidgetPermissionStore.ts b/apps/web/src/stores/widgets/WidgetPermissionStore.ts similarity index 100% rename from src/stores/widgets/WidgetPermissionStore.ts rename to apps/web/src/stores/widgets/WidgetPermissionStore.ts diff --git a/src/stores/widgets/types.ts b/apps/web/src/stores/widgets/types.ts similarity index 100% rename from src/stores/widgets/types.ts rename to apps/web/src/stores/widgets/types.ts diff --git a/src/theme.ts b/apps/web/src/theme.ts similarity index 100% rename from src/theme.ts rename to apps/web/src/theme.ts diff --git a/src/toasts/AnalyticsToast.tsx b/apps/web/src/toasts/AnalyticsToast.tsx similarity index 100% rename from src/toasts/AnalyticsToast.tsx rename to apps/web/src/toasts/AnalyticsToast.tsx diff --git a/src/toasts/BulkUnverifiedSessionsToast.tsx b/apps/web/src/toasts/BulkUnverifiedSessionsToast.tsx similarity index 100% rename from src/toasts/BulkUnverifiedSessionsToast.tsx rename to apps/web/src/toasts/BulkUnverifiedSessionsToast.tsx diff --git a/src/toasts/DesktopNotificationsToast.ts b/apps/web/src/toasts/DesktopNotificationsToast.ts similarity index 100% rename from src/toasts/DesktopNotificationsToast.ts rename to apps/web/src/toasts/DesktopNotificationsToast.ts diff --git a/src/toasts/IncomingCallToast.tsx b/apps/web/src/toasts/IncomingCallToast.tsx similarity index 100% rename from src/toasts/IncomingCallToast.tsx rename to apps/web/src/toasts/IncomingCallToast.tsx diff --git a/src/toasts/IncomingLegacyCallToast.tsx b/apps/web/src/toasts/IncomingLegacyCallToast.tsx similarity index 100% rename from src/toasts/IncomingLegacyCallToast.tsx rename to apps/web/src/toasts/IncomingLegacyCallToast.tsx diff --git a/src/toasts/MobileGuideToast.ts b/apps/web/src/toasts/MobileGuideToast.ts similarity index 100% rename from src/toasts/MobileGuideToast.ts rename to apps/web/src/toasts/MobileGuideToast.ts diff --git a/src/toasts/ServerLimitToast.tsx b/apps/web/src/toasts/ServerLimitToast.tsx similarity index 100% rename from src/toasts/ServerLimitToast.tsx rename to apps/web/src/toasts/ServerLimitToast.tsx diff --git a/src/toasts/SetupEncryptionToast.tsx b/apps/web/src/toasts/SetupEncryptionToast.tsx similarity index 100% rename from src/toasts/SetupEncryptionToast.tsx rename to apps/web/src/toasts/SetupEncryptionToast.tsx diff --git a/src/toasts/UnverifiedSessionToast.tsx b/apps/web/src/toasts/UnverifiedSessionToast.tsx similarity index 100% rename from src/toasts/UnverifiedSessionToast.tsx rename to apps/web/src/toasts/UnverifiedSessionToast.tsx diff --git a/src/toasts/UpdateToast.tsx b/apps/web/src/toasts/UpdateToast.tsx similarity index 100% rename from src/toasts/UpdateToast.tsx rename to apps/web/src/toasts/UpdateToast.tsx diff --git a/src/usercontent/index.html b/apps/web/src/usercontent/index.html similarity index 100% rename from src/usercontent/index.html rename to apps/web/src/usercontent/index.html diff --git a/src/usercontent/index.ts b/apps/web/src/usercontent/index.ts similarity index 100% rename from src/usercontent/index.ts rename to apps/web/src/usercontent/index.ts diff --git a/src/utils/AnimationUtils.ts b/apps/web/src/utils/AnimationUtils.ts similarity index 100% rename from src/utils/AnimationUtils.ts rename to apps/web/src/utils/AnimationUtils.ts diff --git a/src/utils/AutoDiscoveryUtils.tsx b/apps/web/src/utils/AutoDiscoveryUtils.tsx similarity index 100% rename from src/utils/AutoDiscoveryUtils.tsx rename to apps/web/src/utils/AutoDiscoveryUtils.tsx diff --git a/src/utils/BrowserWorkarounds.ts b/apps/web/src/utils/BrowserWorkarounds.ts similarity index 100% rename from src/utils/BrowserWorkarounds.ts rename to apps/web/src/utils/BrowserWorkarounds.ts diff --git a/src/utils/DMRoomMap.ts b/apps/web/src/utils/DMRoomMap.ts similarity index 100% rename from src/utils/DMRoomMap.ts rename to apps/web/src/utils/DMRoomMap.ts diff --git a/src/utils/DecryptFile.ts b/apps/web/src/utils/DecryptFile.ts similarity index 100% rename from src/utils/DecryptFile.ts rename to apps/web/src/utils/DecryptFile.ts diff --git a/src/utils/DialogOpener.ts b/apps/web/src/utils/DialogOpener.ts similarity index 100% rename from src/utils/DialogOpener.ts rename to apps/web/src/utils/DialogOpener.ts diff --git a/src/utils/DirectoryUtils.ts b/apps/web/src/utils/DirectoryUtils.ts similarity index 100% rename from src/utils/DirectoryUtils.ts rename to apps/web/src/utils/DirectoryUtils.ts diff --git a/src/utils/EditorStateTransfer.ts b/apps/web/src/utils/EditorStateTransfer.ts similarity index 100% rename from src/utils/EditorStateTransfer.ts rename to apps/web/src/utils/EditorStateTransfer.ts diff --git a/src/utils/ErrorUtils.tsx b/apps/web/src/utils/ErrorUtils.tsx similarity index 100% rename from src/utils/ErrorUtils.tsx rename to apps/web/src/utils/ErrorUtils.tsx diff --git a/src/utils/EventRenderingUtils.ts b/apps/web/src/utils/EventRenderingUtils.ts similarity index 100% rename from src/utils/EventRenderingUtils.ts rename to apps/web/src/utils/EventRenderingUtils.ts diff --git a/src/utils/EventUtils.ts b/apps/web/src/utils/EventUtils.ts similarity index 100% rename from src/utils/EventUtils.ts rename to apps/web/src/utils/EventUtils.ts diff --git a/src/utils/Feedback.ts b/apps/web/src/utils/Feedback.ts similarity index 100% rename from src/utils/Feedback.ts rename to apps/web/src/utils/Feedback.ts diff --git a/src/utils/FileDownloader.ts b/apps/web/src/utils/FileDownloader.ts similarity index 100% rename from src/utils/FileDownloader.ts rename to apps/web/src/utils/FileDownloader.ts diff --git a/src/utils/FileUtils.ts b/apps/web/src/utils/FileUtils.ts similarity index 100% rename from src/utils/FileUtils.ts rename to apps/web/src/utils/FileUtils.ts diff --git a/src/utils/FixedRollingArray.ts b/apps/web/src/utils/FixedRollingArray.ts similarity index 100% rename from src/utils/FixedRollingArray.ts rename to apps/web/src/utils/FixedRollingArray.ts diff --git a/src/utils/FormattingUtils.ts b/apps/web/src/utils/FormattingUtils.ts similarity index 100% rename from src/utils/FormattingUtils.ts rename to apps/web/src/utils/FormattingUtils.ts diff --git a/src/utils/IDestroyable.ts b/apps/web/src/utils/IDestroyable.ts similarity index 100% rename from src/utils/IDestroyable.ts rename to apps/web/src/utils/IDestroyable.ts diff --git a/src/utils/IdentityServerUtils.ts b/apps/web/src/utils/IdentityServerUtils.ts similarity index 100% rename from src/utils/IdentityServerUtils.ts rename to apps/web/src/utils/IdentityServerUtils.ts diff --git a/src/utils/Image.ts b/apps/web/src/utils/Image.ts similarity index 100% rename from src/utils/Image.ts rename to apps/web/src/utils/Image.ts diff --git a/src/utils/JSON.ts b/apps/web/src/utils/JSON.ts similarity index 100% rename from src/utils/JSON.ts rename to apps/web/src/utils/JSON.ts diff --git a/src/utils/KeyVerificationStateObserver.ts b/apps/web/src/utils/KeyVerificationStateObserver.ts similarity index 100% rename from src/utils/KeyVerificationStateObserver.ts rename to apps/web/src/utils/KeyVerificationStateObserver.ts diff --git a/src/utils/LazyValue.ts b/apps/web/src/utils/LazyValue.ts similarity index 100% rename from src/utils/LazyValue.ts rename to apps/web/src/utils/LazyValue.ts diff --git a/src/utils/LruCache.ts b/apps/web/src/utils/LruCache.ts similarity index 100% rename from src/utils/LruCache.ts rename to apps/web/src/utils/LruCache.ts diff --git a/src/utils/MarkedExecution.ts b/apps/web/src/utils/MarkedExecution.ts similarity index 100% rename from src/utils/MarkedExecution.ts rename to apps/web/src/utils/MarkedExecution.ts diff --git a/src/utils/MatrixGlob.ts b/apps/web/src/utils/MatrixGlob.ts similarity index 100% rename from src/utils/MatrixGlob.ts rename to apps/web/src/utils/MatrixGlob.ts diff --git a/src/utils/MediaEventHelper.ts b/apps/web/src/utils/MediaEventHelper.ts similarity index 100% rename from src/utils/MediaEventHelper.ts rename to apps/web/src/utils/MediaEventHelper.ts diff --git a/src/utils/MegolmExportEncryption.ts b/apps/web/src/utils/MegolmExportEncryption.ts similarity index 100% rename from src/utils/MegolmExportEncryption.ts rename to apps/web/src/utils/MegolmExportEncryption.ts diff --git a/src/utils/MessageDiffUtils.tsx b/apps/web/src/utils/MessageDiffUtils.tsx similarity index 100% rename from src/utils/MessageDiffUtils.tsx rename to apps/web/src/utils/MessageDiffUtils.tsx diff --git a/src/utils/Mouse.ts b/apps/web/src/utils/Mouse.ts similarity index 100% rename from src/utils/Mouse.ts rename to apps/web/src/utils/Mouse.ts diff --git a/src/utils/MultiInviter.ts b/apps/web/src/utils/MultiInviter.ts similarity index 100% rename from src/utils/MultiInviter.ts rename to apps/web/src/utils/MultiInviter.ts diff --git a/src/utils/NativeEventUtils.ts b/apps/web/src/utils/NativeEventUtils.ts similarity index 100% rename from src/utils/NativeEventUtils.ts rename to apps/web/src/utils/NativeEventUtils.ts diff --git a/src/utils/PasswordScorer.ts b/apps/web/src/utils/PasswordScorer.ts similarity index 100% rename from src/utils/PasswordScorer.ts rename to apps/web/src/utils/PasswordScorer.ts diff --git a/src/utils/PhasedRolloutFeature.ts b/apps/web/src/utils/PhasedRolloutFeature.ts similarity index 100% rename from src/utils/PhasedRolloutFeature.ts rename to apps/web/src/utils/PhasedRolloutFeature.ts diff --git a/src/utils/PinningUtils.ts b/apps/web/src/utils/PinningUtils.ts similarity index 100% rename from src/utils/PinningUtils.ts rename to apps/web/src/utils/PinningUtils.ts diff --git a/src/utils/PreferredRoomVersions.ts b/apps/web/src/utils/PreferredRoomVersions.ts similarity index 100% rename from src/utils/PreferredRoomVersions.ts rename to apps/web/src/utils/PreferredRoomVersions.ts diff --git a/src/utils/ReactUtils.tsx b/apps/web/src/utils/ReactUtils.tsx similarity index 100% rename from src/utils/ReactUtils.tsx rename to apps/web/src/utils/ReactUtils.tsx diff --git a/src/utils/Reply.ts b/apps/web/src/utils/Reply.ts similarity index 100% rename from src/utils/Reply.ts rename to apps/web/src/utils/Reply.ts diff --git a/src/utils/ResizeNotifier.ts b/apps/web/src/utils/ResizeNotifier.ts similarity index 100% rename from src/utils/ResizeNotifier.ts rename to apps/web/src/utils/ResizeNotifier.ts diff --git a/src/utils/RoomUpgrade.ts b/apps/web/src/utils/RoomUpgrade.ts similarity index 100% rename from src/utils/RoomUpgrade.ts rename to apps/web/src/utils/RoomUpgrade.ts diff --git a/src/utils/SearchInput.ts b/apps/web/src/utils/SearchInput.ts similarity index 100% rename from src/utils/SearchInput.ts rename to apps/web/src/utils/SearchInput.ts diff --git a/src/utils/SessionLock.ts b/apps/web/src/utils/SessionLock.ts similarity index 100% rename from src/utils/SessionLock.ts rename to apps/web/src/utils/SessionLock.ts diff --git a/src/utils/ShieldUtils.ts b/apps/web/src/utils/ShieldUtils.ts similarity index 100% rename from src/utils/ShieldUtils.ts rename to apps/web/src/utils/ShieldUtils.ts diff --git a/src/utils/Singleflight.ts b/apps/web/src/utils/Singleflight.ts similarity index 100% rename from src/utils/Singleflight.ts rename to apps/web/src/utils/Singleflight.ts diff --git a/src/utils/SnakedObject.ts b/apps/web/src/utils/SnakedObject.ts similarity index 100% rename from src/utils/SnakedObject.ts rename to apps/web/src/utils/SnakedObject.ts diff --git a/src/utils/SortMembers.ts b/apps/web/src/utils/SortMembers.ts similarity index 100% rename from src/utils/SortMembers.ts rename to apps/web/src/utils/SortMembers.ts diff --git a/src/utils/StorageAccess.ts b/apps/web/src/utils/StorageAccess.ts similarity index 100% rename from src/utils/StorageAccess.ts rename to apps/web/src/utils/StorageAccess.ts diff --git a/src/utils/StorageManager.ts b/apps/web/src/utils/StorageManager.ts similarity index 100% rename from src/utils/StorageManager.ts rename to apps/web/src/utils/StorageManager.ts diff --git a/src/utils/Timer.ts b/apps/web/src/utils/Timer.ts similarity index 100% rename from src/utils/Timer.ts rename to apps/web/src/utils/Timer.ts diff --git a/src/utils/UrlUtils.ts b/apps/web/src/utils/UrlUtils.ts similarity index 100% rename from src/utils/UrlUtils.ts rename to apps/web/src/utils/UrlUtils.ts diff --git a/src/utils/ValidatedServerConfig.ts b/apps/web/src/utils/ValidatedServerConfig.ts similarity index 100% rename from src/utils/ValidatedServerConfig.ts rename to apps/web/src/utils/ValidatedServerConfig.ts diff --git a/src/utils/WellKnownUtils.ts b/apps/web/src/utils/WellKnownUtils.ts similarity index 100% rename from src/utils/WellKnownUtils.ts rename to apps/web/src/utils/WellKnownUtils.ts diff --git a/src/utils/Whenable.ts b/apps/web/src/utils/Whenable.ts similarity index 100% rename from src/utils/Whenable.ts rename to apps/web/src/utils/Whenable.ts diff --git a/src/utils/WidgetUtils-types.ts b/apps/web/src/utils/WidgetUtils-types.ts similarity index 100% rename from src/utils/WidgetUtils-types.ts rename to apps/web/src/utils/WidgetUtils-types.ts diff --git a/src/utils/WidgetUtils.ts b/apps/web/src/utils/WidgetUtils.ts similarity index 100% rename from src/utils/WidgetUtils.ts rename to apps/web/src/utils/WidgetUtils.ts diff --git a/src/utils/arrays.ts b/apps/web/src/utils/arrays.ts similarity index 100% rename from src/utils/arrays.ts rename to apps/web/src/utils/arrays.ts diff --git a/src/utils/beacon/bounds.ts b/apps/web/src/utils/beacon/bounds.ts similarity index 100% rename from src/utils/beacon/bounds.ts rename to apps/web/src/utils/beacon/bounds.ts diff --git a/src/utils/beacon/duration.ts b/apps/web/src/utils/beacon/duration.ts similarity index 100% rename from src/utils/beacon/duration.ts rename to apps/web/src/utils/beacon/duration.ts diff --git a/src/utils/beacon/geolocation.ts b/apps/web/src/utils/beacon/geolocation.ts similarity index 100% rename from src/utils/beacon/geolocation.ts rename to apps/web/src/utils/beacon/geolocation.ts diff --git a/src/utils/beacon/getShareableLocation.ts b/apps/web/src/utils/beacon/getShareableLocation.ts similarity index 100% rename from src/utils/beacon/getShareableLocation.ts rename to apps/web/src/utils/beacon/getShareableLocation.ts diff --git a/src/utils/beacon/index.ts b/apps/web/src/utils/beacon/index.ts similarity index 100% rename from src/utils/beacon/index.ts rename to apps/web/src/utils/beacon/index.ts diff --git a/src/utils/beacon/timeline.ts b/apps/web/src/utils/beacon/timeline.ts similarity index 100% rename from src/utils/beacon/timeline.ts rename to apps/web/src/utils/beacon/timeline.ts diff --git a/src/utils/beacon/useBeacon.ts b/apps/web/src/utils/beacon/useBeacon.ts similarity index 100% rename from src/utils/beacon/useBeacon.ts rename to apps/web/src/utils/beacon/useBeacon.ts diff --git a/src/utils/beacon/useLiveBeacons.ts b/apps/web/src/utils/beacon/useLiveBeacons.ts similarity index 100% rename from src/utils/beacon/useLiveBeacons.ts rename to apps/web/src/utils/beacon/useLiveBeacons.ts diff --git a/src/utils/beacon/useOwnLiveBeacons.ts b/apps/web/src/utils/beacon/useOwnLiveBeacons.ts similarity index 100% rename from src/utils/beacon/useOwnLiveBeacons.ts rename to apps/web/src/utils/beacon/useOwnLiveBeacons.ts diff --git a/src/utils/blobs.ts b/apps/web/src/utils/blobs.ts similarity index 100% rename from src/utils/blobs.ts rename to apps/web/src/utils/blobs.ts diff --git a/src/utils/colour.ts b/apps/web/src/utils/colour.ts similarity index 100% rename from src/utils/colour.ts rename to apps/web/src/utils/colour.ts diff --git a/src/utils/connection.ts b/apps/web/src/utils/connection.ts similarity index 100% rename from src/utils/connection.ts rename to apps/web/src/utils/connection.ts diff --git a/src/utils/createMatrixClient.ts b/apps/web/src/utils/createMatrixClient.ts similarity index 100% rename from src/utils/createMatrixClient.ts rename to apps/web/src/utils/createMatrixClient.ts diff --git a/src/utils/createVoiceMessageContent.ts b/apps/web/src/utils/createVoiceMessageContent.ts similarity index 100% rename from src/utils/createVoiceMessageContent.ts rename to apps/web/src/utils/createVoiceMessageContent.ts diff --git a/src/utils/crypto/deviceInfo.ts b/apps/web/src/utils/crypto/deviceInfo.ts similarity index 100% rename from src/utils/crypto/deviceInfo.ts rename to apps/web/src/utils/crypto/deviceInfo.ts diff --git a/src/utils/crypto/index.ts b/apps/web/src/utils/crypto/index.ts similarity index 100% rename from src/utils/crypto/index.ts rename to apps/web/src/utils/crypto/index.ts diff --git a/src/utils/crypto/resetKeyBackup.ts b/apps/web/src/utils/crypto/resetKeyBackup.ts similarity index 100% rename from src/utils/crypto/resetKeyBackup.ts rename to apps/web/src/utils/crypto/resetKeyBackup.ts diff --git a/src/utils/crypto/shouldForceDisableEncryption.ts b/apps/web/src/utils/crypto/shouldForceDisableEncryption.ts similarity index 100% rename from src/utils/crypto/shouldForceDisableEncryption.ts rename to apps/web/src/utils/crypto/shouldForceDisableEncryption.ts diff --git a/src/utils/crypto/shouldSkipSetupEncryption.ts b/apps/web/src/utils/crypto/shouldSkipSetupEncryption.ts similarity index 100% rename from src/utils/crypto/shouldSkipSetupEncryption.ts rename to apps/web/src/utils/crypto/shouldSkipSetupEncryption.ts diff --git a/src/utils/device/clientInformation.ts b/apps/web/src/utils/device/clientInformation.ts similarity index 100% rename from src/utils/device/clientInformation.ts rename to apps/web/src/utils/device/clientInformation.ts diff --git a/src/utils/device/dehydration.ts b/apps/web/src/utils/device/dehydration.ts similarity index 100% rename from src/utils/device/dehydration.ts rename to apps/web/src/utils/device/dehydration.ts diff --git a/src/utils/device/isDeviceVerified.ts b/apps/web/src/utils/device/isDeviceVerified.ts similarity index 100% rename from src/utils/device/isDeviceVerified.ts rename to apps/web/src/utils/device/isDeviceVerified.ts diff --git a/src/utils/device/parseUserAgent.ts b/apps/web/src/utils/device/parseUserAgent.ts similarity index 100% rename from src/utils/device/parseUserAgent.ts rename to apps/web/src/utils/device/parseUserAgent.ts diff --git a/src/utils/device/snoozeBulkUnverifiedDeviceReminder.ts b/apps/web/src/utils/device/snoozeBulkUnverifiedDeviceReminder.ts similarity index 100% rename from src/utils/device/snoozeBulkUnverifiedDeviceReminder.ts rename to apps/web/src/utils/device/snoozeBulkUnverifiedDeviceReminder.ts diff --git a/src/utils/device/types.ts b/apps/web/src/utils/device/types.ts similarity index 100% rename from src/utils/device/types.ts rename to apps/web/src/utils/device/types.ts diff --git a/src/utils/direct-messages.ts b/apps/web/src/utils/direct-messages.ts similarity index 100% rename from src/utils/direct-messages.ts rename to apps/web/src/utils/direct-messages.ts diff --git a/src/utils/dm/createDmLocalRoom.ts b/apps/web/src/utils/dm/createDmLocalRoom.ts similarity index 100% rename from src/utils/dm/createDmLocalRoom.ts rename to apps/web/src/utils/dm/createDmLocalRoom.ts diff --git a/src/utils/dm/filterValidMDirect.ts b/apps/web/src/utils/dm/filterValidMDirect.ts similarity index 100% rename from src/utils/dm/filterValidMDirect.ts rename to apps/web/src/utils/dm/filterValidMDirect.ts diff --git a/src/utils/dm/findDMForUser.ts b/apps/web/src/utils/dm/findDMForUser.ts similarity index 100% rename from src/utils/dm/findDMForUser.ts rename to apps/web/src/utils/dm/findDMForUser.ts diff --git a/src/utils/dm/findDMRoom.ts b/apps/web/src/utils/dm/findDMRoom.ts similarity index 100% rename from src/utils/dm/findDMRoom.ts rename to apps/web/src/utils/dm/findDMRoom.ts diff --git a/src/utils/dm/startDm.ts b/apps/web/src/utils/dm/startDm.ts similarity index 100% rename from src/utils/dm/startDm.ts rename to apps/web/src/utils/dm/startDm.ts diff --git a/src/utils/enums.ts b/apps/web/src/utils/enums.ts similarity index 100% rename from src/utils/enums.ts rename to apps/web/src/utils/enums.ts diff --git a/src/utils/event/getSenderName.ts b/apps/web/src/utils/event/getSenderName.ts similarity index 100% rename from src/utils/event/getSenderName.ts rename to apps/web/src/utils/event/getSenderName.ts diff --git a/src/utils/exportUtils/Exporter.ts b/apps/web/src/utils/exportUtils/Exporter.ts similarity index 99% rename from src/utils/exportUtils/Exporter.ts rename to apps/web/src/utils/exportUtils/Exporter.ts index 4085126491..185507e8cc 100644 --- a/src/utils/exportUtils/Exporter.ts +++ b/apps/web/src/utils/exportUtils/Exporter.ts @@ -59,7 +59,7 @@ export default abstract class Exporter { return this.makeFileNameNoExtension(SdkConfig.get().brand) + ".zip"; } - protected onBeforeUnload(e: BeforeUnloadEvent): string { + protected onBeforeUnload(this: void, e: BeforeUnloadEvent): string { e.preventDefault(); return (e.returnValue = _t("export_chat|unload_confirm")); } diff --git a/src/utils/exportUtils/HtmlExport.tsx b/apps/web/src/utils/exportUtils/HtmlExport.tsx similarity index 91% rename from src/utils/exportUtils/HtmlExport.tsx rename to apps/web/src/utils/exportUtils/HtmlExport.tsx index 20b7b681ac..cb5c3629c8 100644 --- a/src/utils/exportUtils/HtmlExport.tsx +++ b/apps/web/src/utils/exportUtils/HtmlExport.tsx @@ -13,6 +13,7 @@ import { renderToStaticMarkup } from "react-dom/server"; import { logger } from "matrix-js-sdk/src/logger"; import escapeHtml from "escape-html"; import { TooltipProvider } from "@vector-im/compound-web"; +import { I18nContext } from "@element-hq/web-shared-components"; import Exporter from "./Exporter"; import { mediaFromMxc } from "../../customisations/Media"; @@ -267,33 +268,36 @@ export default class HTMLExporter extends Exporter { public getEventTile(mxEv: MatrixEvent, continuation: boolean, ref?: () => void): JSX.Element { return (
    - - - - false} - isTwelveHour={false} - last={false} - lastInSection={false} - permalinkCreator={this.permalinkCreator} - lastSuccessful={false} - isSelectedEvent={false} - showReactions={true} - layout={Layout.Group} - showReadReceipts={false} - getRelationsForEvent={this.getRelationsForEvent} - ref={ref} - /> - - - + {/* Export rendering uses an isolated root, so provide I18nContext explicitly. */} + + + + + false} + isTwelveHour={false} + last={false} + lastInSection={false} + permalinkCreator={this.permalinkCreator} + lastSuccessful={false} + isSelectedEvent={false} + showReactions={true} + layout={Layout.Group} + showReadReceipts={false} + getRelationsForEvent={this.getRelationsForEvent} + ref={ref} + /> + + + +
    ); } diff --git a/src/utils/exportUtils/JSONExport.ts b/apps/web/src/utils/exportUtils/JSONExport.ts similarity index 100% rename from src/utils/exportUtils/JSONExport.ts rename to apps/web/src/utils/exportUtils/JSONExport.ts diff --git a/src/utils/exportUtils/PlainTextExport.ts b/apps/web/src/utils/exportUtils/PlainTextExport.ts similarity index 100% rename from src/utils/exportUtils/PlainTextExport.ts rename to apps/web/src/utils/exportUtils/PlainTextExport.ts diff --git a/src/utils/exportUtils/exportCSS.ts b/apps/web/src/utils/exportUtils/exportCSS.ts similarity index 100% rename from src/utils/exportUtils/exportCSS.ts rename to apps/web/src/utils/exportUtils/exportCSS.ts diff --git a/src/utils/exportUtils/exportCustomCSS.css b/apps/web/src/utils/exportUtils/exportCustomCSS.css similarity index 100% rename from src/utils/exportUtils/exportCustomCSS.css rename to apps/web/src/utils/exportUtils/exportCustomCSS.css diff --git a/src/utils/exportUtils/exportJS.js b/apps/web/src/utils/exportUtils/exportJS.js similarity index 100% rename from src/utils/exportUtils/exportJS.js rename to apps/web/src/utils/exportUtils/exportJS.js diff --git a/src/utils/exportUtils/exportUtils.ts b/apps/web/src/utils/exportUtils/exportUtils.ts similarity index 100% rename from src/utils/exportUtils/exportUtils.ts rename to apps/web/src/utils/exportUtils/exportUtils.ts diff --git a/src/utils/i18n-helpers.ts b/apps/web/src/utils/i18n-helpers.ts similarity index 100% rename from src/utils/i18n-helpers.ts rename to apps/web/src/utils/i18n-helpers.ts diff --git a/src/utils/image-media.ts b/apps/web/src/utils/image-media.ts similarity index 100% rename from src/utils/image-media.ts rename to apps/web/src/utils/image-media.ts diff --git a/src/utils/iterables.ts b/apps/web/src/utils/iterables.ts similarity index 100% rename from src/utils/iterables.ts rename to apps/web/src/utils/iterables.ts diff --git a/src/utils/leave-behaviour.ts b/apps/web/src/utils/leave-behaviour.ts similarity index 100% rename from src/utils/leave-behaviour.ts rename to apps/web/src/utils/leave-behaviour.ts diff --git a/src/utils/local-room.ts b/apps/web/src/utils/local-room.ts similarity index 100% rename from src/utils/local-room.ts rename to apps/web/src/utils/local-room.ts diff --git a/src/utils/localRoom/isLocalRoom.ts b/apps/web/src/utils/localRoom/isLocalRoom.ts similarity index 100% rename from src/utils/localRoom/isLocalRoom.ts rename to apps/web/src/utils/localRoom/isLocalRoom.ts diff --git a/src/utils/localRoom/isRoomReady.ts b/apps/web/src/utils/localRoom/isRoomReady.ts similarity index 100% rename from src/utils/localRoom/isRoomReady.ts rename to apps/web/src/utils/localRoom/isRoomReady.ts diff --git a/src/utils/location/LocationShareErrors.ts b/apps/web/src/utils/location/LocationShareErrors.ts similarity index 100% rename from src/utils/location/LocationShareErrors.ts rename to apps/web/src/utils/location/LocationShareErrors.ts diff --git a/src/utils/location/findMapStyleUrl.ts b/apps/web/src/utils/location/findMapStyleUrl.ts similarity index 100% rename from src/utils/location/findMapStyleUrl.ts rename to apps/web/src/utils/location/findMapStyleUrl.ts diff --git a/src/utils/location/index.ts b/apps/web/src/utils/location/index.ts similarity index 100% rename from src/utils/location/index.ts rename to apps/web/src/utils/location/index.ts diff --git a/src/utils/location/isSelfLocation.ts b/apps/web/src/utils/location/isSelfLocation.ts similarity index 100% rename from src/utils/location/isSelfLocation.ts rename to apps/web/src/utils/location/isSelfLocation.ts diff --git a/src/utils/location/links.ts b/apps/web/src/utils/location/links.ts similarity index 100% rename from src/utils/location/links.ts rename to apps/web/src/utils/location/links.ts diff --git a/src/utils/location/locationEventGeoUri.ts b/apps/web/src/utils/location/locationEventGeoUri.ts similarity index 100% rename from src/utils/location/locationEventGeoUri.ts rename to apps/web/src/utils/location/locationEventGeoUri.ts diff --git a/src/utils/location/map.ts b/apps/web/src/utils/location/map.ts similarity index 100% rename from src/utils/location/map.ts rename to apps/web/src/utils/location/map.ts diff --git a/src/utils/location/parseGeoUri.ts b/apps/web/src/utils/location/parseGeoUri.ts similarity index 100% rename from src/utils/location/parseGeoUri.ts rename to apps/web/src/utils/location/parseGeoUri.ts diff --git a/src/utils/location/positionFailureMessage.ts b/apps/web/src/utils/location/positionFailureMessage.ts similarity index 100% rename from src/utils/location/positionFailureMessage.ts rename to apps/web/src/utils/location/positionFailureMessage.ts diff --git a/src/utils/location/useMap.ts b/apps/web/src/utils/location/useMap.ts similarity index 100% rename from src/utils/location/useMap.ts rename to apps/web/src/utils/location/useMap.ts diff --git a/src/utils/maps.ts b/apps/web/src/utils/maps.ts similarity index 100% rename from src/utils/maps.ts rename to apps/web/src/utils/maps.ts diff --git a/src/utils/media/requestMediaPermissions.tsx b/apps/web/src/utils/media/requestMediaPermissions.tsx similarity index 100% rename from src/utils/media/requestMediaPermissions.tsx rename to apps/web/src/utils/media/requestMediaPermissions.tsx diff --git a/src/utils/membership.ts b/apps/web/src/utils/membership.ts similarity index 100% rename from src/utils/membership.ts rename to apps/web/src/utils/membership.ts diff --git a/src/utils/messages.ts b/apps/web/src/utils/messages.ts similarity index 100% rename from src/utils/messages.ts rename to apps/web/src/utils/messages.ts diff --git a/src/utils/notifications.ts b/apps/web/src/utils/notifications.ts similarity index 100% rename from src/utils/notifications.ts rename to apps/web/src/utils/notifications.ts diff --git a/src/utils/objects.ts b/apps/web/src/utils/objects.ts similarity index 100% rename from src/utils/objects.ts rename to apps/web/src/utils/objects.ts diff --git a/src/utils/oidc/TokenRefresher.ts b/apps/web/src/utils/oidc/TokenRefresher.ts similarity index 100% rename from src/utils/oidc/TokenRefresher.ts rename to apps/web/src/utils/oidc/TokenRefresher.ts diff --git a/src/utils/oidc/authorize.ts b/apps/web/src/utils/oidc/authorize.ts similarity index 100% rename from src/utils/oidc/authorize.ts rename to apps/web/src/utils/oidc/authorize.ts diff --git a/src/utils/oidc/error.ts b/apps/web/src/utils/oidc/error.ts similarity index 100% rename from src/utils/oidc/error.ts rename to apps/web/src/utils/oidc/error.ts diff --git a/src/utils/oidc/isUserRegistrationSupported.ts b/apps/web/src/utils/oidc/isUserRegistrationSupported.ts similarity index 100% rename from src/utils/oidc/isUserRegistrationSupported.ts rename to apps/web/src/utils/oidc/isUserRegistrationSupported.ts diff --git a/src/utils/oidc/persistOidcSettings.ts b/apps/web/src/utils/oidc/persistOidcSettings.ts similarity index 100% rename from src/utils/oidc/persistOidcSettings.ts rename to apps/web/src/utils/oidc/persistOidcSettings.ts diff --git a/src/utils/oidc/registerClient.ts b/apps/web/src/utils/oidc/registerClient.ts similarity index 100% rename from src/utils/oidc/registerClient.ts rename to apps/web/src/utils/oidc/registerClient.ts diff --git a/src/utils/oidc/urls.ts b/apps/web/src/utils/oidc/urls.ts similarity index 100% rename from src/utils/oidc/urls.ts rename to apps/web/src/utils/oidc/urls.ts diff --git a/src/utils/pages.ts b/apps/web/src/utils/pages.ts similarity index 67% rename from src/utils/pages.ts rename to apps/web/src/utils/pages.ts index 4181e987f9..ea5488e8d2 100644 --- a/src/utils/pages.ts +++ b/apps/web/src/utils/pages.ts @@ -6,7 +6,6 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import { logger } from "matrix-js-sdk/src/logger"; import { type MatrixClient } from "matrix-js-sdk/src/matrix"; import { type IConfigOptions } from "../IConfigOptions"; @@ -19,19 +18,6 @@ export function getHomePageUrl(appConfig: IConfigOptions, matrixClient: MatrixCl const pagesConfig = config.get("embedded_pages"); let pageUrl = pagesConfig ? new SnakedObject(pagesConfig).get("home_url") : null; - if (!pageUrl) { - // This is a deprecated config option for the home page - // (despite the name, given we also now have a welcome - // page, which is not the same). - pageUrl = (appConfig).welcomePageUrl; - if (pageUrl) { - logger.warn( - "You are using a deprecated config option: `welcomePageUrl`. Please use " + - "`embedded_pages.home_url` instead, per https://github.com/vector-im/element-web/issues/21428", - ); - } - } - if (!pageUrl) { pageUrl = getEmbeddedPagesWellKnown(matrixClient)?.home_url; } diff --git a/src/utils/permalinks/ElementPermalinkConstructor.ts b/apps/web/src/utils/permalinks/ElementPermalinkConstructor.ts similarity index 100% rename from src/utils/permalinks/ElementPermalinkConstructor.ts rename to apps/web/src/utils/permalinks/ElementPermalinkConstructor.ts diff --git a/src/utils/permalinks/MatrixSchemePermalinkConstructor.ts b/apps/web/src/utils/permalinks/MatrixSchemePermalinkConstructor.ts similarity index 100% rename from src/utils/permalinks/MatrixSchemePermalinkConstructor.ts rename to apps/web/src/utils/permalinks/MatrixSchemePermalinkConstructor.ts diff --git a/src/utils/permalinks/MatrixToPermalinkConstructor.ts b/apps/web/src/utils/permalinks/MatrixToPermalinkConstructor.ts similarity index 100% rename from src/utils/permalinks/MatrixToPermalinkConstructor.ts rename to apps/web/src/utils/permalinks/MatrixToPermalinkConstructor.ts diff --git a/src/utils/permalinks/PermalinkConstructor.ts b/apps/web/src/utils/permalinks/PermalinkConstructor.ts similarity index 100% rename from src/utils/permalinks/PermalinkConstructor.ts rename to apps/web/src/utils/permalinks/PermalinkConstructor.ts diff --git a/src/utils/permalinks/Permalinks.ts b/apps/web/src/utils/permalinks/Permalinks.ts similarity index 100% rename from src/utils/permalinks/Permalinks.ts rename to apps/web/src/utils/permalinks/Permalinks.ts diff --git a/src/utils/permalinks/navigator.ts b/apps/web/src/utils/permalinks/navigator.ts similarity index 100% rename from src/utils/permalinks/navigator.ts rename to apps/web/src/utils/permalinks/navigator.ts diff --git a/src/utils/presence.ts b/apps/web/src/utils/presence.ts similarity index 100% rename from src/utils/presence.ts rename to apps/web/src/utils/presence.ts diff --git a/src/utils/promise.ts b/apps/web/src/utils/promise.ts similarity index 100% rename from src/utils/promise.ts rename to apps/web/src/utils/promise.ts diff --git a/src/utils/pushRules/monitorSyncedPushRules.ts b/apps/web/src/utils/pushRules/monitorSyncedPushRules.ts similarity index 100% rename from src/utils/pushRules/monitorSyncedPushRules.ts rename to apps/web/src/utils/pushRules/monitorSyncedPushRules.ts diff --git a/src/utils/pushRules/updatePushRuleActions.ts b/apps/web/src/utils/pushRules/updatePushRuleActions.ts similarity index 100% rename from src/utils/pushRules/updatePushRuleActions.ts rename to apps/web/src/utils/pushRules/updatePushRuleActions.ts diff --git a/src/utils/read-receipts.ts b/apps/web/src/utils/read-receipts.ts similarity index 100% rename from src/utils/read-receipts.ts rename to apps/web/src/utils/read-receipts.ts diff --git a/src/utils/room/canInviteTo.ts b/apps/web/src/utils/room/canInviteTo.ts similarity index 100% rename from src/utils/room/canInviteTo.ts rename to apps/web/src/utils/room/canInviteTo.ts diff --git a/src/utils/room/getFunctionalMembers.ts b/apps/web/src/utils/room/getFunctionalMembers.ts similarity index 100% rename from src/utils/room/getFunctionalMembers.ts rename to apps/web/src/utils/room/getFunctionalMembers.ts diff --git a/src/utils/room/getJoinedNonFunctionalMembers.ts b/apps/web/src/utils/room/getJoinedNonFunctionalMembers.ts similarity index 100% rename from src/utils/room/getJoinedNonFunctionalMembers.ts rename to apps/web/src/utils/room/getJoinedNonFunctionalMembers.ts diff --git a/src/utils/room/inviteToRoom.ts b/apps/web/src/utils/room/inviteToRoom.ts similarity index 100% rename from src/utils/room/inviteToRoom.ts rename to apps/web/src/utils/room/inviteToRoom.ts diff --git a/src/utils/room/placeCall.ts b/apps/web/src/utils/room/placeCall.ts similarity index 100% rename from src/utils/room/placeCall.ts rename to apps/web/src/utils/room/placeCall.ts diff --git a/src/utils/room/shouldEncryptRoomWithSingle3rdPartyInvite.ts b/apps/web/src/utils/room/shouldEncryptRoomWithSingle3rdPartyInvite.ts similarity index 100% rename from src/utils/room/shouldEncryptRoomWithSingle3rdPartyInvite.ts rename to apps/web/src/utils/room/shouldEncryptRoomWithSingle3rdPartyInvite.ts diff --git a/src/utils/room/tagRoom.ts b/apps/web/src/utils/room/tagRoom.ts similarity index 100% rename from src/utils/room/tagRoom.ts rename to apps/web/src/utils/room/tagRoom.ts diff --git a/src/utils/rooms.ts b/apps/web/src/utils/rooms.ts similarity index 100% rename from src/utils/rooms.ts rename to apps/web/src/utils/rooms.ts diff --git a/src/utils/sets.ts b/apps/web/src/utils/sets.ts similarity index 100% rename from src/utils/sets.ts rename to apps/web/src/utils/sets.ts diff --git a/src/utils/space.tsx b/apps/web/src/utils/space.tsx similarity index 100% rename from src/utils/space.tsx rename to apps/web/src/utils/space.tsx diff --git a/src/utils/stringOrderField.ts b/apps/web/src/utils/stringOrderField.ts similarity index 100% rename from src/utils/stringOrderField.ts rename to apps/web/src/utils/stringOrderField.ts diff --git a/src/utils/strings.ts b/apps/web/src/utils/strings.ts similarity index 100% rename from src/utils/strings.ts rename to apps/web/src/utils/strings.ts diff --git a/src/utils/threepids.ts b/apps/web/src/utils/threepids.ts similarity index 100% rename from src/utils/threepids.ts rename to apps/web/src/utils/threepids.ts diff --git a/src/utils/tokens/pickling.ts b/apps/web/src/utils/tokens/pickling.ts similarity index 100% rename from src/utils/tokens/pickling.ts rename to apps/web/src/utils/tokens/pickling.ts diff --git a/src/utils/tokens/tokens.ts b/apps/web/src/utils/tokens/tokens.ts similarity index 100% rename from src/utils/tokens/tokens.ts rename to apps/web/src/utils/tokens/tokens.ts diff --git a/src/utils/units.ts b/apps/web/src/utils/units.ts similarity index 100% rename from src/utils/units.ts rename to apps/web/src/utils/units.ts diff --git a/src/utils/validate/index.ts b/apps/web/src/utils/validate/index.ts similarity index 100% rename from src/utils/validate/index.ts rename to apps/web/src/utils/validate/index.ts diff --git a/src/utils/validate/numberInRange.ts b/apps/web/src/utils/validate/numberInRange.ts similarity index 100% rename from src/utils/validate/numberInRange.ts rename to apps/web/src/utils/validate/numberInRange.ts diff --git a/src/utils/video-rooms.ts b/apps/web/src/utils/video-rooms.ts similarity index 100% rename from src/utils/video-rooms.ts rename to apps/web/src/utils/video-rooms.ts diff --git a/src/vector/app.tsx b/apps/web/src/vector/app.tsx similarity index 84% rename from src/vector/app.tsx rename to apps/web/src/vector/app.tsx index 84f9b18ec1..cc4da3373a 100644 --- a/src/vector/app.tsx +++ b/apps/web/src/vector/app.tsx @@ -14,14 +14,14 @@ Please see LICENSE files in the repository root for full details. import "matrix-js-sdk/src/browser-index"; import React, { type ReactElement, StrictMode } from "react"; import { logger } from "matrix-js-sdk/src/logger"; -import { createClient, AutoDiscovery, type ClientConfig } from "matrix-js-sdk/src/matrix"; +import { AutoDiscovery, type ClientConfig } from "matrix-js-sdk/src/matrix"; import { WrapperLifecycle, type WrapperOpts } from "@matrix-org/react-sdk-module-api/lib/lifecycles/WrapperLifecycle"; import type { QueryDict } from "matrix-js-sdk/src/utils"; import PlatformPeg from "../PlatformPeg"; import AutoDiscoveryUtils from "../utils/AutoDiscoveryUtils"; import * as Lifecycle from "../Lifecycle"; -import SdkConfig, { parseSsoRedirectOptions } from "../SdkConfig"; +import SdkConfig from "../SdkConfig"; import { type IConfigOptions } from "../IConfigOptions"; import { SnakedObject } from "../utils/SnakedObject"; import MatrixChat from "../components/structures/MatrixChat"; @@ -34,6 +34,8 @@ import { ModuleApi } from "../modules/Api"; import { RoomView } from "../components/structures/RoomView"; import RoomAvatar from "../components/views/avatars/RoomAvatar"; import { ModuleNotificationDecoration } from "../modules/components/ModuleNotificationDecoration"; +import Login from "../Login.ts"; +import { startOidcLogin } from "../utils/oidc/authorize.ts"; logger.log(`Application is running in ${process.env.NODE_ENV} mode`); @@ -56,6 +58,35 @@ function onTokenLoginCompleted(): void { window.history.replaceState(null, "", url.href); } +async function redirectToSso(config: ValidatedServerConfig): Promise { + logger.log("Bypassing app load to redirect to SSO"); + + try { + const login = new Login(config.hsUrl, config.isUrl, null, { + delegatedAuthentication: config.delegatedAuthentication, + }); + const flows = await login.getFlows(); + + const nativeOidcFlow = flows.find((flow) => "clientId" in flow); + if (nativeOidcFlow && config.delegatedAuthentication) { + await startOidcLogin(config.delegatedAuthentication, nativeOidcFlow.clientId, config.hsUrl, config.isUrl); + return true; + } + + const flow = flows.find((flow) => flow.type === "m.login.sso" || flow.type === "m.login.cas"); + PlatformPeg.get()!.startSingleSignOn( + login.createTemporaryClient(), + flow?.type === "m.login.cas" ? "cas" : "sso", + `/${getScreenFromLocation(window.location).screen}`, + ); + return true; + } catch (e) { + console.error("Error encountered during sso redirect", e); + } + + return false; +} + export async function loadApp(fragParams: QueryDict, matrixChatRef: React.Ref): Promise { // XXX: This lives here because certain components import so many things that importing it in a sensible place (eg. // the builtins module or init.tsx) causes a circular dependency. @@ -82,8 +113,8 @@ export async function loadApp(fragParams: QueryDict, matrixChatRef: React.Ref; + if (redirecting) { + return ; + } } const defaultDeviceName = snakedConfig.get("default_device_display_name") ?? platform?.getDefaultDeviceDisplayName(); - const initialScreenAfterLogin = getInitialScreenAfterLogin(window.location); - const wrapperOpts: WrapperOpts = { Wrapper: React.Fragment }; ModuleRunner.instance.invoke(WrapperLifecycle.Wrapper, wrapperOpts); diff --git a/src/vector/getconfig.ts b/apps/web/src/vector/getconfig.ts similarity index 100% rename from src/vector/getconfig.ts rename to apps/web/src/vector/getconfig.ts diff --git a/src/vector/index.html b/apps/web/src/vector/index.html similarity index 100% rename from src/vector/index.html rename to apps/web/src/vector/index.html diff --git a/src/vector/index.ts b/apps/web/src/vector/index.ts similarity index 100% rename from src/vector/index.ts rename to apps/web/src/vector/index.ts diff --git a/src/vector/init.tsx b/apps/web/src/vector/init.tsx similarity index 100% rename from src/vector/init.tsx rename to apps/web/src/vector/init.tsx diff --git a/src/vector/jitsi/index.html b/apps/web/src/vector/jitsi/index.html similarity index 100% rename from src/vector/jitsi/index.html rename to apps/web/src/vector/jitsi/index.html diff --git a/src/vector/jitsi/index.pcss b/apps/web/src/vector/jitsi/index.pcss similarity index 100% rename from src/vector/jitsi/index.pcss rename to apps/web/src/vector/jitsi/index.pcss diff --git a/src/vector/jitsi/index.ts b/apps/web/src/vector/jitsi/index.ts similarity index 100% rename from src/vector/jitsi/index.ts rename to apps/web/src/vector/jitsi/index.ts diff --git a/src/vector/localstorage-fix.ts b/apps/web/src/vector/localstorage-fix.ts similarity index 100% rename from src/vector/localstorage-fix.ts rename to apps/web/src/vector/localstorage-fix.ts diff --git a/src/vector/mobile_guide/assets/app-store-badge.svg b/apps/web/src/vector/mobile_guide/assets/app-store-badge.svg similarity index 100% rename from src/vector/mobile_guide/assets/app-store-badge.svg rename to apps/web/src/vector/mobile_guide/assets/app-store-badge.svg diff --git a/src/vector/mobile_guide/assets/bottom-gradient.svg b/apps/web/src/vector/mobile_guide/assets/bottom-gradient.svg similarity index 100% rename from src/vector/mobile_guide/assets/bottom-gradient.svg rename to apps/web/src/vector/mobile_guide/assets/bottom-gradient.svg diff --git a/src/vector/mobile_guide/assets/element-logo.svg b/apps/web/src/vector/mobile_guide/assets/element-logo.svg similarity index 100% rename from src/vector/mobile_guide/assets/element-logo.svg rename to apps/web/src/vector/mobile_guide/assets/element-logo.svg diff --git a/src/vector/mobile_guide/assets/google-play-badge.svg b/apps/web/src/vector/mobile_guide/assets/google-play-badge.svg similarity index 100% rename from src/vector/mobile_guide/assets/google-play-badge.svg rename to apps/web/src/vector/mobile_guide/assets/google-play-badge.svg diff --git a/src/vector/mobile_guide/index.css b/apps/web/src/vector/mobile_guide/index.css similarity index 100% rename from src/vector/mobile_guide/index.css rename to apps/web/src/vector/mobile_guide/index.css diff --git a/src/vector/mobile_guide/index.html b/apps/web/src/vector/mobile_guide/index.html similarity index 100% rename from src/vector/mobile_guide/index.html rename to apps/web/src/vector/mobile_guide/index.html diff --git a/src/vector/mobile_guide/index.ts b/apps/web/src/vector/mobile_guide/index.ts similarity index 100% rename from src/vector/mobile_guide/index.ts rename to apps/web/src/vector/mobile_guide/index.ts diff --git a/src/vector/mobile_guide/mobile-apps.ts b/apps/web/src/vector/mobile_guide/mobile-apps.ts similarity index 100% rename from src/vector/mobile_guide/mobile-apps.ts rename to apps/web/src/vector/mobile_guide/mobile-apps.ts diff --git a/src/vector/modernizr.cjs b/apps/web/src/vector/modernizr.cjs similarity index 100% rename from src/vector/modernizr.cjs rename to apps/web/src/vector/modernizr.cjs diff --git a/src/vector/platform/ElectronPlatform.tsx b/apps/web/src/vector/platform/ElectronPlatform.tsx similarity index 100% rename from src/vector/platform/ElectronPlatform.tsx rename to apps/web/src/vector/platform/ElectronPlatform.tsx diff --git a/src/vector/platform/IPCManager.ts b/apps/web/src/vector/platform/IPCManager.ts similarity index 100% rename from src/vector/platform/IPCManager.ts rename to apps/web/src/vector/platform/IPCManager.ts diff --git a/src/vector/platform/PWAPlatform.ts b/apps/web/src/vector/platform/PWAPlatform.ts similarity index 100% rename from src/vector/platform/PWAPlatform.ts rename to apps/web/src/vector/platform/PWAPlatform.ts diff --git a/src/vector/platform/SeshatIndexManager.ts b/apps/web/src/vector/platform/SeshatIndexManager.ts similarity index 100% rename from src/vector/platform/SeshatIndexManager.ts rename to apps/web/src/vector/platform/SeshatIndexManager.ts diff --git a/src/vector/platform/WebPlatform.ts b/apps/web/src/vector/platform/WebPlatform.ts similarity index 100% rename from src/vector/platform/WebPlatform.ts rename to apps/web/src/vector/platform/WebPlatform.ts diff --git a/src/vector/rageshakesetup.ts b/apps/web/src/vector/rageshakesetup.ts similarity index 100% rename from src/vector/rageshakesetup.ts rename to apps/web/src/vector/rageshakesetup.ts diff --git a/src/vector/routing.ts b/apps/web/src/vector/routing.ts similarity index 100% rename from src/vector/routing.ts rename to apps/web/src/vector/routing.ts diff --git a/src/vector/static/incompatible-browser.html b/apps/web/src/vector/static/incompatible-browser.html similarity index 100% rename from src/vector/static/incompatible-browser.html rename to apps/web/src/vector/static/incompatible-browser.html diff --git a/src/vector/static/unable-to-load.html b/apps/web/src/vector/static/unable-to-load.html similarity index 100% rename from src/vector/static/unable-to-load.html rename to apps/web/src/vector/static/unable-to-load.html diff --git a/src/vector/url_utils.ts b/apps/web/src/vector/url_utils.ts similarity index 100% rename from src/vector/url_utils.ts rename to apps/web/src/vector/url_utils.ts diff --git a/src/verification.ts b/apps/web/src/verification.ts similarity index 100% rename from src/verification.ts rename to apps/web/src/verification.ts diff --git a/src/viewmodels/audio/AudioPlayerViewModel.ts b/apps/web/src/viewmodels/audio/AudioPlayerViewModel.ts similarity index 100% rename from src/viewmodels/audio/AudioPlayerViewModel.ts rename to apps/web/src/viewmodels/audio/AudioPlayerViewModel.ts diff --git a/apps/web/src/viewmodels/event-tiles/EncryptionEventViewModel.ts b/apps/web/src/viewmodels/event-tiles/EncryptionEventViewModel.ts new file mode 100644 index 0000000000..03a840b621 --- /dev/null +++ b/apps/web/src/viewmodels/event-tiles/EncryptionEventViewModel.ts @@ -0,0 +1,122 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import { type JSX } from "react"; +import { RoomStateEvent, type MatrixClient, type MatrixEvent } from "matrix-js-sdk/src/matrix"; +import { + BaseViewModel, + EncryptionEventState, + type EncryptionEventViewSnapshot as EncryptionEventViewSnapshotInterface, + type EncryptionEventViewModel as EncryptionEventViewModelInterface, +} from "@element-hq/web-shared-components"; + +import type { RoomEncryptionEventContent } from "matrix-js-sdk/src/types"; +import DMRoomMap from "../../utils/DMRoomMap"; +import { MEGOLM_ENCRYPTION_ALGORITHM } from "../../utils/crypto"; +import { isLocalRoom } from "../../utils/localRoom/isLocalRoom"; +import { isRoomEncrypted } from "../../hooks/useIsEncrypted"; +import { objectHasDiff } from "../../utils/objects"; + +export interface EncryptionEventViewModelProps { + /** Caller-provided client. */ + cli: MatrixClient; + /** Encryption state event to derive tile state from. */ + mxEvent: MatrixEvent; + /** Optional timestamp element rendered in the tile footer slot. */ + timestamp?: JSX.Element; +} + +export class EncryptionEventViewModel + extends BaseViewModel + implements EncryptionEventViewModelInterface +{ + public constructor(props: EncryptionEventViewModelProps) { + super( + props, + EncryptionEventViewModel.calculateSnapshot(props, EncryptionEventViewModel.getInitialIsEncrypted(props)), + ); + void this.refreshSnapshotFromEvent(); + + const roomId = this.props.mxEvent.getRoomId()!; + const room = this.props.cli.getRoom(roomId); + if (room) { + // Recompute when room state changes (including encryption state updates). + this.disposables.trackListener(room, RoomStateEvent.Update, () => void this.refreshSnapshotFromEvent()); + } + } + + private refreshSnapshotFromEvent = async (): Promise => { + const roomId = this.props.mxEvent.getRoomId()!; + const room = this.props.cli.getRoom(roomId); + const crypto = this.props.cli.getCrypto(); + const isEncrypted = Boolean(room && crypto && (await isRoomEncrypted(room, crypto))); + const nextSnapshot = EncryptionEventViewModel.calculateSnapshot(this.props, isEncrypted); + + if (objectHasDiff(this.snapshot.current, nextSnapshot)) { + this.snapshot.set(nextSnapshot); + } + }; + + private static getInitialIsEncrypted(props: EncryptionEventViewModelProps): boolean { + const roomId = props.mxEvent.getRoomId()!; + const room = props.cli.getRoom(roomId); + if (!room) return false; + + if (isLocalRoom(room)) { + const localRoom = room as { isEncryptionEnabled?: () => boolean }; + return Boolean(localRoom.isEncryptionEnabled?.()); + } + + return room.hasEncryptionStateEvent(); + } + + private static calculateSnapshot( + props: EncryptionEventViewModelProps, + isEncrypted: boolean, + ): EncryptionEventViewSnapshotInterface { + // Keep legacy class names for compatibility with existing timeline layout and styling. + const newSnapshot: EncryptionEventViewSnapshotInterface = { + state: EncryptionEventState.CHANGED, + encryptedStateEvents: undefined, + userName: undefined, + timestamp: props.timestamp, + className: "mx_EventTileBubble mx_cryptoEvent mx_cryptoEvent_icon", + }; + + const content = props.mxEvent.getContent(); + if (isEncrypted && content.algorithm === MEGOLM_ENCRYPTION_ALGORITHM) { + const roomId = props.mxEvent.getRoomId()!; + const room = props.cli.getRoom(roomId); + const isRoomLocal = isLocalRoom(room); + const prevContent = props.mxEvent.getPrevContent() as RoomEncryptionEventContent; + const dmPartner = roomId ? DMRoomMap.shared().getUserIdForRoomId(roomId) : undefined; + const stateEncrypted = Boolean( + content["io.element.msc4362.encrypt_state_events"] && props.cli.enableEncryptedStateEvents, + ); + + newSnapshot.state = EncryptionEventState.ENABLED; + newSnapshot.encryptedStateEvents = stateEncrypted; + + if (prevContent.algorithm === MEGOLM_ENCRYPTION_ALGORITHM) { + newSnapshot.state = EncryptionEventState.CHANGED; + } else if (dmPartner) { + newSnapshot.state = EncryptionEventState.ENABLED_DM; + newSnapshot.userName = room?.getMember(dmPartner)?.rawDisplayName ?? dmPartner; + } else if (isRoomLocal) { + newSnapshot.state = EncryptionEventState.ENABLED_LOCAL; + } + } else if (isEncrypted) { + newSnapshot.state = EncryptionEventState.DISABLE_ATTEMPT; + } else { + newSnapshot.state = EncryptionEventState.UNSUPPORTED; + // Unsupported branch matches legacy EncryptionEvent class usage (no icon class). + newSnapshot.className = "mx_EventTileBubble mx_cryptoEvent"; + } + + return newSnapshot; + } +} diff --git a/src/viewmodels/event-tiles/TextualEventViewModel.ts b/apps/web/src/viewmodels/event-tiles/TextualEventViewModel.ts similarity index 100% rename from src/viewmodels/event-tiles/TextualEventViewModel.ts rename to apps/web/src/viewmodels/event-tiles/TextualEventViewModel.ts diff --git a/src/viewmodels/message-body/DecryptionFailureBodyViewModel.ts b/apps/web/src/viewmodels/message-body/DecryptionFailureBodyViewModel.ts similarity index 100% rename from src/viewmodels/message-body/DecryptionFailureBodyViewModel.ts rename to apps/web/src/viewmodels/message-body/DecryptionFailureBodyViewModel.ts diff --git a/apps/web/src/viewmodels/message-body/MessageTimestampViewModel.ts b/apps/web/src/viewmodels/message-body/MessageTimestampViewModel.ts new file mode 100644 index 0000000000..8d9299ba88 --- /dev/null +++ b/apps/web/src/viewmodels/message-body/MessageTimestampViewModel.ts @@ -0,0 +1,173 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import { type MouseEventHandler } from "react"; +import { + BaseViewModel, + type MessageTimestampViewSnapshot as MessageTimestampViewSnapshotInterface, + type MessageTimestampViewModel as MessageTimestampViewModelInterface, +} from "@element-hq/web-shared-components"; + +import { formatFullDate, formatTime, formatFullTime, formatRelativeTime } from "../../DateUtils"; +import { objectHasDiff } from "../../utils/objects"; + +export interface MessageTimestampViewModelProps { + /** + * Message timestamp in milliseconds since the Unix epoch. + */ + ts: number; + /** + * If specified will render both the sent-at and received-at timestamps in the tooltip + */ + receivedTs?: number; + /** + * If set, use a 12-hour clock for formatted times. + */ + showTwelveHour?: boolean; + /** + * If set, include the full date in the displayed timestamp. + */ + showFullDate?: boolean; + /** + * If set, include seconds in the displayed timestamp. + */ + showSeconds?: boolean; + /** + * If set, display a relative timestamp (e.g. "5 minutes ago"). + */ + showRelative?: boolean; + /** + * If set to true then no tooltip will be shown + */ + inhibitTooltip?: boolean; + /** + * If specified, will be rendered as an anchor bearing the href, a `span` element will be used otherwise + */ + href?: string; + /** + * Optional onClick handler to attach to the DOM element + */ + onClick?: MouseEventHandler; + /** + * Optional onContextMenu handler to attach to the DOM element + */ + onContextMenu?: MouseEventHandler; +} + +/** + * ViewModel for the message timestamp, providing the current state of the component. + */ +export class MessageTimestampViewModel + extends BaseViewModel + implements MessageTimestampViewModelInterface +{ + public onClick?: MouseEventHandler; + public onContextMenu?: MouseEventHandler; + + private static readonly computeSnapshot = ( + props: MessageTimestampViewModelProps, + ): MessageTimestampViewSnapshotInterface => { + const date = new Date(props.ts); + const sentAt = formatFullDate(date, props.showTwelveHour); + + let timestamp: string; + if (props.showRelative) { + timestamp = formatRelativeTime(date, props.showTwelveHour); + } else if (props.showFullDate) { + timestamp = formatFullDate(date, props.showTwelveHour, props.showSeconds); + } else if (props.showSeconds) { + timestamp = formatFullTime(date, props.showTwelveHour); + } else { + timestamp = formatTime(date, props.showTwelveHour); + } + + let receivedAt: string | undefined; + if (props.receivedTs !== undefined) { + const receivedDate = new Date(props.receivedTs); + receivedAt = formatFullDate(receivedDate, props.showTwelveHour); + } + + // Keep mx_MessageTimestamp for compatibility with the existing timeline and layout. + return { + ts: timestamp, + tsSentAt: sentAt, + tsReceivedAt: receivedAt, + inhibitTooltip: props.inhibitTooltip, + href: props.href, + className: "mx_MessageTimestamp", + }; + }; + + private updateProps(newProps: Partial): void { + const nextProps = { ...this.props, ...newProps }; + if (!objectHasDiff(this.props, nextProps)) return; + + this.props = nextProps; + this.onClick = this.props.onClick; + this.onContextMenu = this.props.onContextMenu; + this.snapshot.set(MessageTimestampViewModel.computeSnapshot(this.props)); + } + + /** + * Create a timestamp view model with initial props and snapshot. + */ + public constructor(props: MessageTimestampViewModelProps) { + super(props, MessageTimestampViewModel.computeSnapshot(props)); + this.onClick = props.onClick; + this.onContextMenu = props.onContextMenu; + } + + /** + * Update the base timestamp (milliseconds since Unix epoch). + */ + public setTimestamp(ts: number): void { + this.updateProps({ ts }); + } + + /** + * Update the optional received timestamp (milliseconds since Unix epoch). + */ + public setReceivedTimestamp(receivedTs?: number): void { + this.updateProps({ receivedTs }); + } + + /** + * Update display formatting options for the rendered timestamp. + */ + public setDisplayOptions(options: { + showTwelveHour?: boolean; + showFullDate?: boolean; + showSeconds?: boolean; + showRelative?: boolean; + }): void { + this.updateProps(options); + } + + /** + * Enable or disable the tooltip rendering. + */ + public setTooltipInhibited(inhibitTooltip?: boolean): void { + this.updateProps({ inhibitTooltip }); + } + + /** + * Update the optional href for link rendering. + */ + public setHref(href?: string): void { + this.updateProps({ href }); + } + + /** + * Update click and context-menu handlers for the rendered element. + */ + public setHandlers(handlers: { + onClick?: MouseEventHandler; + onContextMenu?: MouseEventHandler; + }): void { + this.updateProps(handlers); + } +} diff --git a/src/viewmodels/message-body/ReactionsRowButtonTooltipViewModel.ts b/apps/web/src/viewmodels/message-body/ReactionsRowButtonTooltipViewModel.ts similarity index 100% rename from src/viewmodels/message-body/ReactionsRowButtonTooltipViewModel.ts rename to apps/web/src/viewmodels/message-body/ReactionsRowButtonTooltipViewModel.ts diff --git a/apps/web/src/viewmodels/message-body/ReactionsRowButtonViewModel.ts b/apps/web/src/viewmodels/message-body/ReactionsRowButtonViewModel.ts new file mode 100644 index 0000000000..6435a38d6b --- /dev/null +++ b/apps/web/src/viewmodels/message-body/ReactionsRowButtonViewModel.ts @@ -0,0 +1,211 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import { EventType, type MatrixClient, type MatrixEvent, RelationType } from "matrix-js-sdk/src/matrix"; +import { + BaseViewModel, + type ReactionsRowButtonViewSnapshot, + type ReactionsRowButtonViewModel as ReactionsRowButtonViewModelInterface, +} from "@element-hq/web-shared-components"; + +import { mediaFromMxc } from "../../customisations/Media"; +import { _t } from "../../languageHandler"; +import { formatList } from "../../utils/FormattingUtils"; +import dis from "../../dispatcher/dispatcher"; +import { REACTION_SHORTCODE_KEY } from "../../components/views/messages/ReactionsRow"; +import { ReactionsRowButtonTooltipViewModel } from "./ReactionsRowButtonTooltipViewModel"; + +export interface ReactionsRowButtonViewModelProps { + /** + * The Matrix client instance. + */ + client: MatrixClient; + /** + * The event we're displaying reactions for. + */ + mxEvent: MatrixEvent; + /** + * The reaction content / key / emoji. + */ + content: string; + /** + * The count of votes for this key. + */ + count: number; + /** + * The CSS class name. + */ + className?: string; + /** + * A list of Matrix reaction events for this key. + */ + reactionEvents: MatrixEvent[]; + /** + * A possible Matrix event if the current user has voted for this type. + */ + myReactionEvent?: MatrixEvent; + /** + * Whether to prevent quick-reactions by clicking on this reaction. + */ + disabled?: boolean; + /** + * Whether to render custom image reactions. + */ + customReactionImagesEnabled?: boolean; +} + +export class ReactionsRowButtonViewModel + extends BaseViewModel + implements ReactionsRowButtonViewModelInterface +{ + private readonly tooltipVm: ReactionsRowButtonTooltipViewModel; + private static readonly getAriaLabel = (snapshot: ReactionsRowButtonViewSnapshot): string | undefined => + (snapshot as ReactionsRowButtonViewSnapshot & { ariaLabel?: string }).ariaLabel; + + private static readonly computeSnapshot = ( + props: ReactionsRowButtonViewModelProps, + tooltipVm: ReactionsRowButtonTooltipViewModel, + ): ReactionsRowButtonViewSnapshot => { + const { + client, + mxEvent, + content, + count, + className, + reactionEvents, + myReactionEvent, + disabled, + customReactionImagesEnabled, + } = props; + + const room = client.getRoom(mxEvent.getRoomId()); + let ariaLabel: string | undefined; + let customReactionName: string | undefined; + + if (room) { + const senders: string[] = []; + for (const reactionEvent of reactionEvents) { + const member = room.getMember(reactionEvent.getSender()!); + senders.push(member?.name || reactionEvent.getSender()!); + customReactionName = + (customReactionImagesEnabled && REACTION_SHORTCODE_KEY.findIn(reactionEvent.getContent())) || + undefined; + } + + const reactors = formatList(senders, 6); + if (content) { + ariaLabel = _t("timeline|reactions|label", { + reactors, + content: customReactionName || content, + }); + } else { + ariaLabel = reactors; + } + } + + let imageSrc: string | undefined; + let imageAlt: string | undefined; + if (customReactionImagesEnabled && content.startsWith("mxc://")) { + const resolved = mediaFromMxc(content).srcHttp; + if (resolved) { + imageSrc = resolved; + imageAlt = customReactionName || _t("timeline|reactions|custom_reaction_fallback_label"); + } + } + + const snapshot = { + content, + count, + className, + ariaLabel, + isSelected: !!myReactionEvent, + isDisabled: !!disabled, + imageSrc, + imageAlt, + tooltipVm, + }; + + return snapshot; + }; + + public constructor(props: ReactionsRowButtonViewModelProps) { + const tooltipVm = new ReactionsRowButtonTooltipViewModel({ + client: props.client, + mxEvent: props.mxEvent, + content: props.content, + reactionEvents: props.reactionEvents, + customReactionImagesEnabled: props.customReactionImagesEnabled, + }); + super(props, ReactionsRowButtonViewModel.computeSnapshot(props, tooltipVm)); + this.tooltipVm = tooltipVm; + this.disposables.track(tooltipVm); + } + + private setSnapshot(nextSnapshot: ReactionsRowButtonViewSnapshot): void { + const currentSnapshot = this.snapshot.current; + + if ( + nextSnapshot.content === currentSnapshot.content && + nextSnapshot.count === currentSnapshot.count && + ReactionsRowButtonViewModel.getAriaLabel(nextSnapshot) === + ReactionsRowButtonViewModel.getAriaLabel(currentSnapshot) && + nextSnapshot.isSelected === currentSnapshot.isSelected && + nextSnapshot.isDisabled === currentSnapshot.isDisabled && + nextSnapshot.imageSrc === currentSnapshot.imageSrc && + nextSnapshot.imageAlt === currentSnapshot.imageAlt + ) { + return; + } + + this.snapshot.set(nextSnapshot); + } + + public setReactionData( + content: string, + reactionEvents: MatrixEvent[], + customReactionImagesEnabled?: boolean, + ): void { + this.props = { ...this.props, content, reactionEvents, customReactionImagesEnabled }; + + this.tooltipVm.setProps({ content, reactionEvents, customReactionImagesEnabled }); + this.setSnapshot(ReactionsRowButtonViewModel.computeSnapshot(this.props, this.tooltipVm)); + } + + public setCount(count: number): void { + this.props = { ...this.props, count }; + this.snapshot.merge({ count }); + } + + public setMyReactionEvent(myReactionEvent?: MatrixEvent): void { + this.props = { ...this.props, myReactionEvent }; + this.snapshot.merge({ isSelected: !!myReactionEvent }); + } + + public setDisabled(disabled?: boolean): void { + this.props = { ...this.props, disabled }; + this.snapshot.merge({ isDisabled: !!disabled }); + } + + public onClick = (): void => { + const { client, mxEvent, myReactionEvent, content, disabled } = this.props; + if (disabled) return; + + if (myReactionEvent) { + client.redactEvent(mxEvent.getRoomId()!, myReactionEvent.getId()!); + return; + } + + client.sendEvent(mxEvent.getRoomId()!, EventType.Reaction, { + "m.relates_to": { + rel_type: RelationType.Annotation, + event_id: mxEvent.getId()!, + key: content, + }, + }); + dis.dispatch({ action: "message_sent" }); + }; +} diff --git a/src/viewmodels/profile/DisambiguatedProfileViewModel.ts b/apps/web/src/viewmodels/profile/DisambiguatedProfileViewModel.ts similarity index 98% rename from src/viewmodels/profile/DisambiguatedProfileViewModel.ts rename to apps/web/src/viewmodels/profile/DisambiguatedProfileViewModel.ts index 807ae20522..49a2db4e29 100644 --- a/src/viewmodels/profile/DisambiguatedProfileViewModel.ts +++ b/apps/web/src/viewmodels/profile/DisambiguatedProfileViewModel.ts @@ -141,7 +141,7 @@ export class DisambiguatedProfileViewModel this.snapshot.set(DisambiguatedProfileViewModel.computeSnapshot(this.props)); } - public onClick(evt: MouseEvent): void { + public onClick = (evt: MouseEvent): void => { this.props.onClick?.(evt); - } + }; } diff --git a/src/viewmodels/right-panel/WidgetContextMenuViewModel.tsx b/apps/web/src/viewmodels/right-panel/WidgetContextMenuViewModel.tsx similarity index 99% rename from src/viewmodels/right-panel/WidgetContextMenuViewModel.tsx rename to apps/web/src/viewmodels/right-panel/WidgetContextMenuViewModel.tsx index 0589e07efd..6bb482fafa 100644 --- a/src/viewmodels/right-panel/WidgetContextMenuViewModel.tsx +++ b/apps/web/src/viewmodels/right-panel/WidgetContextMenuViewModel.tsx @@ -238,10 +238,10 @@ interface WidgetContextMenuProps { menuDisplayed: boolean; trigger: ReactNode; // override delete handler - onDeleteClick?(): void; + onDeleteClick?(this: void): void; // override edit handler - onEditClick?(): void; - onFinished(): void; + onEditClick?(this: void): void; + onFinished(this: void): void; } export type WidgetContextMenuViewModelProps = WidgetContextMenuProps & { diff --git a/src/viewmodels/room-list/RoomListHeaderViewModel.ts b/apps/web/src/viewmodels/room-list/RoomListHeaderViewModel.ts similarity index 94% rename from src/viewmodels/room-list/RoomListHeaderViewModel.ts rename to apps/web/src/viewmodels/room-list/RoomListHeaderViewModel.ts index e99268190c..8a5547e6e9 100644 --- a/src/viewmodels/room-list/RoomListHeaderViewModel.ts +++ b/apps/web/src/viewmodels/room-list/RoomListHeaderViewModel.ts @@ -170,20 +170,26 @@ export class RoomListHeaderViewModel }; public sort = (option: SortOption): void => { - let sortingAlgorithm: SortingAlgorithm; + const oldSortingAlgorithm = RoomListStoreV3.instance.activeSortAlgorithm; + let newSortingAlgorithm: SortingAlgorithm; switch (option) { case "alphabetical": - sortingAlgorithm = SortingAlgorithm.Alphabetic; + newSortingAlgorithm = SortingAlgorithm.Alphabetic; break; case "recent": - sortingAlgorithm = SortingAlgorithm.Recency; + newSortingAlgorithm = SortingAlgorithm.Recency; break; case "unread-first": - sortingAlgorithm = SortingAlgorithm.Unread; + newSortingAlgorithm = SortingAlgorithm.Unread; break; } - RoomListStoreV3.instance.resort(sortingAlgorithm); + RoomListStoreV3.instance.resort(newSortingAlgorithm); this.snapshot.merge({ activeSortOption: option }); + + // Record analytics for this action + if (oldSortingAlgorithm) { + PosthogTrackers.trackRoomListSortingAlgorithmChange(oldSortingAlgorithm, newSortingAlgorithm); + } }; public toggleMessagePreview = (): void => { diff --git a/src/viewmodels/room-list/RoomListItemViewModel.ts b/apps/web/src/viewmodels/room-list/RoomListItemViewModel.ts similarity index 100% rename from src/viewmodels/room-list/RoomListItemViewModel.ts rename to apps/web/src/viewmodels/room-list/RoomListItemViewModel.ts diff --git a/src/viewmodels/room-list/RoomListSearchViewModel.ts b/apps/web/src/viewmodels/room-list/RoomListSearchViewModel.ts similarity index 100% rename from src/viewmodels/room-list/RoomListSearchViewModel.ts rename to apps/web/src/viewmodels/room-list/RoomListSearchViewModel.ts diff --git a/src/viewmodels/room-list/RoomListViewViewModel.ts b/apps/web/src/viewmodels/room-list/RoomListViewViewModel.ts similarity index 100% rename from src/viewmodels/room-list/RoomListViewViewModel.ts rename to apps/web/src/viewmodels/room-list/RoomListViewViewModel.ts diff --git a/src/viewmodels/room-list/utils.ts b/apps/web/src/viewmodels/room-list/utils.ts similarity index 100% rename from src/viewmodels/room-list/utils.ts rename to apps/web/src/viewmodels/room-list/utils.ts diff --git a/src/viewmodels/room/RoomStatusBar.ts b/apps/web/src/viewmodels/room/RoomStatusBar.ts similarity index 100% rename from src/viewmodels/room/RoomStatusBar.ts rename to apps/web/src/viewmodels/room/RoomStatusBar.ts diff --git a/src/viewmodels/room/WidgetPip.tsx b/apps/web/src/viewmodels/room/WidgetPip.tsx similarity index 100% rename from src/viewmodels/room/WidgetPip.tsx rename to apps/web/src/viewmodels/room/WidgetPip.tsx diff --git a/src/widgets/CapabilityText.tsx b/apps/web/src/widgets/CapabilityText.tsx similarity index 100% rename from src/widgets/CapabilityText.tsx rename to apps/web/src/widgets/CapabilityText.tsx diff --git a/src/widgets/Jitsi.ts b/apps/web/src/widgets/Jitsi.ts similarity index 100% rename from src/widgets/Jitsi.ts rename to apps/web/src/widgets/Jitsi.ts diff --git a/src/widgets/ManagedHybrid.ts b/apps/web/src/widgets/ManagedHybrid.ts similarity index 100% rename from src/widgets/ManagedHybrid.ts rename to apps/web/src/widgets/ManagedHybrid.ts diff --git a/src/widgets/WidgetType.ts b/apps/web/src/widgets/WidgetType.ts similarity index 100% rename from src/widgets/WidgetType.ts rename to apps/web/src/widgets/WidgetType.ts diff --git a/src/workers/blurhash.worker.ts b/apps/web/src/workers/blurhash.worker.ts similarity index 100% rename from src/workers/blurhash.worker.ts rename to apps/web/src/workers/blurhash.worker.ts diff --git a/src/workers/blurhashWorkerFactory.ts b/apps/web/src/workers/blurhashWorkerFactory.ts similarity index 100% rename from src/workers/blurhashWorkerFactory.ts rename to apps/web/src/workers/blurhashWorkerFactory.ts diff --git a/src/workers/indexeddb.worker.ts b/apps/web/src/workers/indexeddb.worker.ts similarity index 87% rename from src/workers/indexeddb.worker.ts rename to apps/web/src/workers/indexeddb.worker.ts index c712999d32..ebfc1b2700 100644 --- a/src/workers/indexeddb.worker.ts +++ b/apps/web/src/workers/indexeddb.worker.ts @@ -10,6 +10,7 @@ import { IndexedDBStoreWorker } from "matrix-js-sdk/src/indexeddb-worker"; const ctx: Worker = self as any; +// eslint-disable-next-line @typescript-eslint/unbound-method const remoteWorker = new IndexedDBStoreWorker(ctx.postMessage); ctx.onmessage = remoteWorker.onMessage; diff --git a/src/workers/indexeddbWorkerFactory.ts b/apps/web/src/workers/indexeddbWorkerFactory.ts similarity index 100% rename from src/workers/indexeddbWorkerFactory.ts rename to apps/web/src/workers/indexeddbWorkerFactory.ts diff --git a/src/workers/playback.worker.ts b/apps/web/src/workers/playback.worker.ts similarity index 100% rename from src/workers/playback.worker.ts rename to apps/web/src/workers/playback.worker.ts diff --git a/src/workers/playbackWorkerFactory.ts b/apps/web/src/workers/playbackWorkerFactory.ts similarity index 100% rename from src/workers/playbackWorkerFactory.ts rename to apps/web/src/workers/playbackWorkerFactory.ts diff --git a/src/workers/worker.ts b/apps/web/src/workers/worker.ts similarity index 100% rename from src/workers/worker.ts rename to apps/web/src/workers/worker.ts diff --git a/test/@types/common.ts b/apps/web/test/@types/common.ts similarity index 100% rename from test/@types/common.ts rename to apps/web/test/@types/common.ts diff --git a/test/CreateCrossSigning-test.ts b/apps/web/test/CreateCrossSigning-test.ts similarity index 100% rename from test/CreateCrossSigning-test.ts rename to apps/web/test/CreateCrossSigning-test.ts diff --git a/test/app-tests/server-config-test.ts b/apps/web/test/app-tests/server-config-test.ts similarity index 100% rename from test/app-tests/server-config-test.ts rename to apps/web/test/app-tests/server-config-test.ts diff --git a/test/app-tests/wrapper-test.tsx b/apps/web/test/app-tests/wrapper-test.tsx similarity index 100% rename from test/app-tests/wrapper-test.tsx rename to apps/web/test/app-tests/wrapper-test.tsx diff --git a/test/globalSetup.ts b/apps/web/test/globalSetup.ts similarity index 100% rename from test/globalSetup.ts rename to apps/web/test/globalSetup.ts diff --git a/test/jest-mocks.ts b/apps/web/test/jest-mocks.ts similarity index 100% rename from test/jest-mocks.ts rename to apps/web/test/jest-mocks.ts diff --git a/test/setup/mocks.ts b/apps/web/test/setup/mocks.ts similarity index 100% rename from test/setup/mocks.ts rename to apps/web/test/setup/mocks.ts diff --git a/test/setup/setupConfig.ts b/apps/web/test/setup/setupConfig.ts similarity index 100% rename from test/setup/setupConfig.ts rename to apps/web/test/setup/setupConfig.ts diff --git a/test/setup/setupLanguage.ts b/apps/web/test/setup/setupLanguage.ts similarity index 92% rename from test/setup/setupLanguage.ts rename to apps/web/test/setup/setupLanguage.ts index 705ffe039f..6e98061427 100644 --- a/test/setup/setupLanguage.ts +++ b/apps/web/test/setup/setupLanguage.ts @@ -15,9 +15,9 @@ import enElementWeb from "../../src/i18n/strings/en_EN.json"; import deElementWeb from "../../src/i18n/strings/de_DE.json"; // Cheat and import relatively here as these aren't exported by the module (should they be?) // eslint-disable-next-line no-restricted-imports -import enSharedComponents from "../../packages/shared-components/src/i18n/strings/en_EN.json"; +import enSharedComponents from "../../../../packages/shared-components/src/i18n/strings/en_EN.json"; // eslint-disable-next-line no-restricted-imports -import deSharedComponents from "../../packages/shared-components/src/i18n/strings/de_DE.json"; +import deSharedComponents from "../../../../packages/shared-components/src/i18n/strings/de_DE.json"; import { ModuleApi } from "../../src/modules/Api"; const lv = { diff --git a/test/setup/setupManualMocks.ts b/apps/web/test/setup/setupManualMocks.ts similarity index 100% rename from test/setup/setupManualMocks.ts rename to apps/web/test/setup/setupManualMocks.ts diff --git a/test/setupTests.ts b/apps/web/test/setupTests.ts similarity index 100% rename from test/setupTests.ts rename to apps/web/test/setupTests.ts diff --git a/test/slowReporter.cjs b/apps/web/test/slowReporter.cjs similarity index 100% rename from test/slowReporter.cjs rename to apps/web/test/slowReporter.cjs diff --git a/test/test-utils/audio.ts b/apps/web/test/test-utils/audio.ts similarity index 100% rename from test/test-utils/audio.ts rename to apps/web/test/test-utils/audio.ts diff --git a/test/test-utils/beacon.ts b/apps/web/test/test-utils/beacon.ts similarity index 100% rename from test/test-utils/beacon.ts rename to apps/web/test/test-utils/beacon.ts diff --git a/test/test-utils/call.ts b/apps/web/test/test-utils/call.ts similarity index 100% rename from test/test-utils/call.ts rename to apps/web/test/test-utils/call.ts diff --git a/test/test-utils/client.ts b/apps/web/test/test-utils/client.ts similarity index 100% rename from test/test-utils/client.ts rename to apps/web/test/test-utils/client.ts diff --git a/test/test-utils/composer.ts b/apps/web/test/test-utils/composer.ts similarity index 100% rename from test/test-utils/composer.ts rename to apps/web/test/test-utils/composer.ts diff --git a/test/test-utils/console.ts b/apps/web/test/test-utils/console.ts similarity index 100% rename from test/test-utils/console.ts rename to apps/web/test/test-utils/console.ts diff --git a/test/test-utils/date.ts b/apps/web/test/test-utils/date.ts similarity index 100% rename from test/test-utils/date.ts rename to apps/web/test/test-utils/date.ts diff --git a/test/test-utils/events.ts b/apps/web/test/test-utils/events.ts similarity index 100% rename from test/test-utils/events.ts rename to apps/web/test/test-utils/events.ts diff --git a/test/test-utils/index.ts b/apps/web/test/test-utils/index.ts similarity index 100% rename from test/test-utils/index.ts rename to apps/web/test/test-utils/index.ts diff --git a/test/test-utils/jest-matrix-react.tsx b/apps/web/test/test-utils/jest-matrix-react.tsx similarity index 100% rename from test/test-utils/jest-matrix-react.tsx rename to apps/web/test/test-utils/jest-matrix-react.tsx diff --git a/test/test-utils/location.ts b/apps/web/test/test-utils/location.ts similarity index 100% rename from test/test-utils/location.ts rename to apps/web/test/test-utils/location.ts diff --git a/test/test-utils/oidc.ts b/apps/web/test/test-utils/oidc.ts similarity index 100% rename from test/test-utils/oidc.ts rename to apps/web/test/test-utils/oidc.ts diff --git a/test/test-utils/platform.ts b/apps/web/test/test-utils/platform.ts similarity index 100% rename from test/test-utils/platform.ts rename to apps/web/test/test-utils/platform.ts diff --git a/test/test-utils/poll.ts b/apps/web/test/test-utils/poll.ts similarity index 100% rename from test/test-utils/poll.ts rename to apps/web/test/test-utils/poll.ts diff --git a/test/test-utils/predictableRandom.ts b/apps/web/test/test-utils/predictableRandom.ts similarity index 100% rename from test/test-utils/predictableRandom.ts rename to apps/web/test/test-utils/predictableRandom.ts diff --git a/test/test-utils/pushRules.ts b/apps/web/test/test-utils/pushRules.ts similarity index 100% rename from test/test-utils/pushRules.ts rename to apps/web/test/test-utils/pushRules.ts diff --git a/test/test-utils/relations.ts b/apps/web/test/test-utils/relations.ts similarity index 100% rename from test/test-utils/relations.ts rename to apps/web/test/test-utils/relations.ts diff --git a/test/test-utils/room.ts b/apps/web/test/test-utils/room.ts similarity index 100% rename from test/test-utils/room.ts rename to apps/web/test/test-utils/room.ts diff --git a/test/test-utils/test-utils.ts b/apps/web/test/test-utils/test-utils.ts similarity index 100% rename from test/test-utils/test-utils.ts rename to apps/web/test/test-utils/test-utils.ts diff --git a/test/test-utils/threads.ts b/apps/web/test/test-utils/threads.ts similarity index 100% rename from test/test-utils/threads.ts rename to apps/web/test/test-utils/threads.ts diff --git a/test/test-utils/utilities.ts b/apps/web/test/test-utils/utilities.ts similarity index 100% rename from test/test-utils/utilities.ts rename to apps/web/test/test-utils/utilities.ts diff --git a/test/test-utils/wrappers.tsx b/apps/web/test/test-utils/wrappers.tsx similarity index 100% rename from test/test-utils/wrappers.tsx rename to apps/web/test/test-utils/wrappers.tsx diff --git a/test/unit-tests/Avatar-test.ts b/apps/web/test/unit-tests/Avatar-test.ts similarity index 100% rename from test/unit-tests/Avatar-test.ts rename to apps/web/test/unit-tests/Avatar-test.ts diff --git a/test/unit-tests/ContentMessages-test.ts b/apps/web/test/unit-tests/ContentMessages-test.ts similarity index 100% rename from test/unit-tests/ContentMessages-test.ts rename to apps/web/test/unit-tests/ContentMessages-test.ts diff --git a/test/unit-tests/DecryptionFailureTracker-test.ts b/apps/web/test/unit-tests/DecryptionFailureTracker-test.ts similarity index 100% rename from test/unit-tests/DecryptionFailureTracker-test.ts rename to apps/web/test/unit-tests/DecryptionFailureTracker-test.ts diff --git a/test/unit-tests/DeviceListener-test.ts b/apps/web/test/unit-tests/DeviceListener-test.ts similarity index 100% rename from test/unit-tests/DeviceListener-test.ts rename to apps/web/test/unit-tests/DeviceListener-test.ts diff --git a/test/unit-tests/HtmlUtils-test.tsx b/apps/web/test/unit-tests/HtmlUtils-test.tsx similarity index 100% rename from test/unit-tests/HtmlUtils-test.tsx rename to apps/web/test/unit-tests/HtmlUtils-test.tsx diff --git a/test/unit-tests/Image-test.ts b/apps/web/test/unit-tests/Image-test.ts similarity index 100% rename from test/unit-tests/Image-test.ts rename to apps/web/test/unit-tests/Image-test.ts diff --git a/test/unit-tests/KeyBindingsManager-test.ts b/apps/web/test/unit-tests/KeyBindingsManager-test.ts similarity index 100% rename from test/unit-tests/KeyBindingsManager-test.ts rename to apps/web/test/unit-tests/KeyBindingsManager-test.ts diff --git a/test/unit-tests/LegacyCallHandler-test.ts b/apps/web/test/unit-tests/LegacyCallHandler-test.ts similarity index 100% rename from test/unit-tests/LegacyCallHandler-test.ts rename to apps/web/test/unit-tests/LegacyCallHandler-test.ts diff --git a/test/unit-tests/Lifecycle-test.ts b/apps/web/test/unit-tests/Lifecycle-test.ts similarity index 100% rename from test/unit-tests/Lifecycle-test.ts rename to apps/web/test/unit-tests/Lifecycle-test.ts diff --git a/test/unit-tests/Markdown-test.ts b/apps/web/test/unit-tests/Markdown-test.ts similarity index 100% rename from test/unit-tests/Markdown-test.ts rename to apps/web/test/unit-tests/Markdown-test.ts diff --git a/test/unit-tests/MatrixClientPeg-test.ts b/apps/web/test/unit-tests/MatrixClientPeg-test.ts similarity index 100% rename from test/unit-tests/MatrixClientPeg-test.ts rename to apps/web/test/unit-tests/MatrixClientPeg-test.ts diff --git a/test/unit-tests/MediaDeviceHandler-test.ts b/apps/web/test/unit-tests/MediaDeviceHandler-test.ts similarity index 100% rename from test/unit-tests/MediaDeviceHandler-test.ts rename to apps/web/test/unit-tests/MediaDeviceHandler-test.ts diff --git a/test/unit-tests/Modal-test.ts b/apps/web/test/unit-tests/Modal-test.ts similarity index 100% rename from test/unit-tests/Modal-test.ts rename to apps/web/test/unit-tests/Modal-test.ts diff --git a/test/unit-tests/Notifier-test.ts b/apps/web/test/unit-tests/Notifier-test.ts similarity index 96% rename from test/unit-tests/Notifier-test.ts rename to apps/web/test/unit-tests/Notifier-test.ts index 8813d4ab73..ee3a42dfda 100644 --- a/test/unit-tests/Notifier-test.ts +++ b/apps/web/test/unit-tests/Notifier-test.ts @@ -149,7 +149,7 @@ describe("Notifier", () => { MockPlatform = mockPlatformPeg({ supportsNotifications: jest.fn().mockReturnValue(true), maySendNotifications: jest.fn().mockReturnValue(true), - displayNotification: jest.fn(), + displayNotification: jest.fn().mockReturnValue({ close: jest.fn() }), loudNotification: jest.fn(), }); @@ -171,7 +171,7 @@ describe("Notifier", () => { const event = new MatrixEvent({ sender: "@alice:server.org", type: "m.room.message", - room_id: "!room:server.org", + room_id: roomId, content: { body: "hey", }, @@ -271,6 +271,21 @@ describe("Notifier", () => { expect(MockPlatform.displayNotification).toHaveBeenCalledWith(testRoom.name, "hey", null, testRoom, event); }); + it("closes a desktop notification when room is marked read", () => { + mockClient!.emit(ClientEvent.Sync, SyncState.Syncing, null); + emitLiveEvent(event); + + expect(MockPlatform.displayNotification).toHaveBeenCalledWith(testRoom.name, "hey", null, testRoom, event); + mockClient!.emit(RoomEvent.Receipt, event, testRoom); + expect( + ( + MockPlatform.displayNotification.mock.results[0].value as ReturnType< + typeof MockPlatform.displayNotification + > + ).close, + ).toHaveBeenCalled(); + }); + it("creates a loud notification when enabled", () => { mockClient!.emit(ClientEvent.Sync, SyncState.Syncing, null); emitLiveEvent(event); @@ -525,7 +540,8 @@ describe("Notifier", () => { content: {}, }), { - kind: "session", + // TODO: Once https://github.com/matrix-org/matrix-js-sdk/pull/5134 is merged this can be MembershipKind.Session + kind: "session" as any, data: { call_id: "123", application: "m.call", diff --git a/test/unit-tests/PosthogAnalytics-test.ts b/apps/web/test/unit-tests/PosthogAnalytics-test.ts similarity index 100% rename from test/unit-tests/PosthogAnalytics-test.ts rename to apps/web/test/unit-tests/PosthogAnalytics-test.ts diff --git a/test/unit-tests/PreferredRoomVersions-test.ts b/apps/web/test/unit-tests/PreferredRoomVersions-test.ts similarity index 100% rename from test/unit-tests/PreferredRoomVersions-test.ts rename to apps/web/test/unit-tests/PreferredRoomVersions-test.ts diff --git a/test/unit-tests/README.md b/apps/web/test/unit-tests/README.md similarity index 100% rename from test/unit-tests/README.md rename to apps/web/test/unit-tests/README.md diff --git a/test/unit-tests/RoomInvite-test.ts b/apps/web/test/unit-tests/RoomInvite-test.ts similarity index 100% rename from test/unit-tests/RoomInvite-test.ts rename to apps/web/test/unit-tests/RoomInvite-test.ts diff --git a/test/unit-tests/RoomNotifs-test.ts b/apps/web/test/unit-tests/RoomNotifs-test.ts similarity index 100% rename from test/unit-tests/RoomNotifs-test.ts rename to apps/web/test/unit-tests/RoomNotifs-test.ts diff --git a/test/unit-tests/Rooms-test.ts b/apps/web/test/unit-tests/Rooms-test.ts similarity index 100% rename from test/unit-tests/Rooms-test.ts rename to apps/web/test/unit-tests/Rooms-test.ts diff --git a/test/unit-tests/ScalarAuthClient-test.ts b/apps/web/test/unit-tests/ScalarAuthClient-test.ts similarity index 100% rename from test/unit-tests/ScalarAuthClient-test.ts rename to apps/web/test/unit-tests/ScalarAuthClient-test.ts diff --git a/test/unit-tests/SdkConfig-test.ts b/apps/web/test/unit-tests/SdkConfig-test.ts similarity index 100% rename from test/unit-tests/SdkConfig-test.ts rename to apps/web/test/unit-tests/SdkConfig-test.ts diff --git a/test/unit-tests/Searching-test.ts b/apps/web/test/unit-tests/Searching-test.ts similarity index 100% rename from test/unit-tests/Searching-test.ts rename to apps/web/test/unit-tests/Searching-test.ts diff --git a/test/unit-tests/SecurityManager-test.ts b/apps/web/test/unit-tests/SecurityManager-test.ts similarity index 100% rename from test/unit-tests/SecurityManager-test.ts rename to apps/web/test/unit-tests/SecurityManager-test.ts diff --git a/test/unit-tests/SlidingSyncManager-test.ts b/apps/web/test/unit-tests/SlidingSyncManager-test.ts similarity index 100% rename from test/unit-tests/SlidingSyncManager-test.ts rename to apps/web/test/unit-tests/SlidingSyncManager-test.ts diff --git a/test/unit-tests/SupportedBrowser-test.ts b/apps/web/test/unit-tests/SupportedBrowser-test.ts similarity index 100% rename from test/unit-tests/SupportedBrowser-test.ts rename to apps/web/test/unit-tests/SupportedBrowser-test.ts diff --git a/test/unit-tests/Terms-test.tsx b/apps/web/test/unit-tests/Terms-test.tsx similarity index 100% rename from test/unit-tests/Terms-test.tsx rename to apps/web/test/unit-tests/Terms-test.tsx diff --git a/test/unit-tests/TestSdkContext.ts b/apps/web/test/unit-tests/TestSdkContext.ts similarity index 100% rename from test/unit-tests/TestSdkContext.ts rename to apps/web/test/unit-tests/TestSdkContext.ts diff --git a/test/unit-tests/TextForEvent-test.ts b/apps/web/test/unit-tests/TextForEvent-test.tsx similarity index 100% rename from test/unit-tests/TextForEvent-test.ts rename to apps/web/test/unit-tests/TextForEvent-test.tsx diff --git a/test/unit-tests/TimezoneHandler-test.ts b/apps/web/test/unit-tests/TimezoneHandler-test.ts similarity index 100% rename from test/unit-tests/TimezoneHandler-test.ts rename to apps/web/test/unit-tests/TimezoneHandler-test.ts diff --git a/test/unit-tests/Unread-test.ts b/apps/web/test/unit-tests/Unread-test.ts similarity index 100% rename from test/unit-tests/Unread-test.ts rename to apps/web/test/unit-tests/Unread-test.ts diff --git a/test/unit-tests/UserActivity-test.ts b/apps/web/test/unit-tests/UserActivity-test.ts similarity index 100% rename from test/unit-tests/UserActivity-test.ts rename to apps/web/test/unit-tests/UserActivity-test.ts diff --git a/test/unit-tests/WorkerManager-test.ts b/apps/web/test/unit-tests/WorkerManager-test.ts similarity index 100% rename from test/unit-tests/WorkerManager-test.ts rename to apps/web/test/unit-tests/WorkerManager-test.ts diff --git a/test/unit-tests/__snapshots__/HtmlUtils-test.tsx.snap b/apps/web/test/unit-tests/__snapshots__/HtmlUtils-test.tsx.snap similarity index 100% rename from test/unit-tests/__snapshots__/HtmlUtils-test.tsx.snap rename to apps/web/test/unit-tests/__snapshots__/HtmlUtils-test.tsx.snap diff --git a/test/unit-tests/__snapshots__/Terms-test.tsx.snap b/apps/web/test/unit-tests/__snapshots__/Terms-test.tsx.snap similarity index 100% rename from test/unit-tests/__snapshots__/Terms-test.tsx.snap rename to apps/web/test/unit-tests/__snapshots__/Terms-test.tsx.snap diff --git a/test/unit-tests/__snapshots__/TextForEvent-test.ts.snap b/apps/web/test/unit-tests/__snapshots__/TextForEvent-test.tsx.snap similarity index 100% rename from test/unit-tests/__snapshots__/TextForEvent-test.ts.snap rename to apps/web/test/unit-tests/__snapshots__/TextForEvent-test.tsx.snap diff --git a/test/unit-tests/__snapshots__/favicon-test.ts.snap b/apps/web/test/unit-tests/__snapshots__/favicon-test.ts.snap similarity index 100% rename from test/unit-tests/__snapshots__/favicon-test.ts.snap rename to apps/web/test/unit-tests/__snapshots__/favicon-test.ts.snap diff --git a/test/unit-tests/__snapshots__/theme-test.ts.snap b/apps/web/test/unit-tests/__snapshots__/theme-test.ts.snap similarity index 100% rename from test/unit-tests/__snapshots__/theme-test.ts.snap rename to apps/web/test/unit-tests/__snapshots__/theme-test.ts.snap diff --git a/test/unit-tests/accessibility/KeyboardShortcutUtils-test.ts b/apps/web/test/unit-tests/accessibility/KeyboardShortcutUtils-test.ts similarity index 100% rename from test/unit-tests/accessibility/KeyboardShortcutUtils-test.ts rename to apps/web/test/unit-tests/accessibility/KeyboardShortcutUtils-test.ts diff --git a/test/unit-tests/accessibility/LandmarkNavigation-test.tsx b/apps/web/test/unit-tests/accessibility/LandmarkNavigation-test.tsx similarity index 100% rename from test/unit-tests/accessibility/LandmarkNavigation-test.tsx rename to apps/web/test/unit-tests/accessibility/LandmarkNavigation-test.tsx diff --git a/test/unit-tests/accessibility/RovingTabIndex-test.tsx b/apps/web/test/unit-tests/accessibility/RovingTabIndex-test.tsx similarity index 100% rename from test/unit-tests/accessibility/RovingTabIndex-test.tsx rename to apps/web/test/unit-tests/accessibility/RovingTabIndex-test.tsx diff --git a/test/unit-tests/actions/handlers/viewUserDeviceSettings-test.ts b/apps/web/test/unit-tests/actions/handlers/viewUserDeviceSettings-test.ts similarity index 100% rename from test/unit-tests/actions/handlers/viewUserDeviceSettings-test.ts rename to apps/web/test/unit-tests/actions/handlers/viewUserDeviceSettings-test.ts diff --git a/test/unit-tests/async-components/dialogs/security/NewRecoveryMethodDialog-test.tsx b/apps/web/test/unit-tests/async-components/dialogs/security/NewRecoveryMethodDialog-test.tsx similarity index 100% rename from test/unit-tests/async-components/dialogs/security/NewRecoveryMethodDialog-test.tsx rename to apps/web/test/unit-tests/async-components/dialogs/security/NewRecoveryMethodDialog-test.tsx diff --git a/test/unit-tests/async-components/dialogs/security/RecoveryMethodRemovedDialog-test.tsx b/apps/web/test/unit-tests/async-components/dialogs/security/RecoveryMethodRemovedDialog-test.tsx similarity index 100% rename from test/unit-tests/async-components/dialogs/security/RecoveryMethodRemovedDialog-test.tsx rename to apps/web/test/unit-tests/async-components/dialogs/security/RecoveryMethodRemovedDialog-test.tsx diff --git a/test/unit-tests/async-components/dialogs/security/__snapshots__/NewRecoveryMethodDialog-test.tsx.snap b/apps/web/test/unit-tests/async-components/dialogs/security/__snapshots__/NewRecoveryMethodDialog-test.tsx.snap similarity index 100% rename from test/unit-tests/async-components/dialogs/security/__snapshots__/NewRecoveryMethodDialog-test.tsx.snap rename to apps/web/test/unit-tests/async-components/dialogs/security/__snapshots__/NewRecoveryMethodDialog-test.tsx.snap diff --git a/test/unit-tests/async-components/structures/ErrorView-test.tsx b/apps/web/test/unit-tests/async-components/structures/ErrorView-test.tsx similarity index 100% rename from test/unit-tests/async-components/structures/ErrorView-test.tsx rename to apps/web/test/unit-tests/async-components/structures/ErrorView-test.tsx diff --git a/test/unit-tests/async-components/structures/__snapshots__/ErrorView-test.tsx.snap b/apps/web/test/unit-tests/async-components/structures/__snapshots__/ErrorView-test.tsx.snap similarity index 100% rename from test/unit-tests/async-components/structures/__snapshots__/ErrorView-test.tsx.snap rename to apps/web/test/unit-tests/async-components/structures/__snapshots__/ErrorView-test.tsx.snap diff --git a/test/unit-tests/audio/MockedPlayback.ts b/apps/web/test/unit-tests/audio/MockedPlayback.ts similarity index 100% rename from test/unit-tests/audio/MockedPlayback.ts rename to apps/web/test/unit-tests/audio/MockedPlayback.ts diff --git a/test/unit-tests/audio/Playback-test.ts b/apps/web/test/unit-tests/audio/Playback-test.ts similarity index 100% rename from test/unit-tests/audio/Playback-test.ts rename to apps/web/test/unit-tests/audio/Playback-test.ts diff --git a/test/unit-tests/audio/PlaybackQueue-test.ts b/apps/web/test/unit-tests/audio/PlaybackQueue-test.ts similarity index 100% rename from test/unit-tests/audio/PlaybackQueue-test.ts rename to apps/web/test/unit-tests/audio/PlaybackQueue-test.ts diff --git a/test/unit-tests/audio/VoiceMessageRecording-test.ts b/apps/web/test/unit-tests/audio/VoiceMessageRecording-test.ts similarity index 100% rename from test/unit-tests/audio/VoiceMessageRecording-test.ts rename to apps/web/test/unit-tests/audio/VoiceMessageRecording-test.ts diff --git a/test/unit-tests/audio/VoiceRecording-test.ts b/apps/web/test/unit-tests/audio/VoiceRecording-test.ts similarity index 100% rename from test/unit-tests/audio/VoiceRecording-test.ts rename to apps/web/test/unit-tests/audio/VoiceRecording-test.ts diff --git a/test/unit-tests/audio/compat-test.ts b/apps/web/test/unit-tests/audio/compat-test.ts similarity index 100% rename from test/unit-tests/audio/compat-test.ts rename to apps/web/test/unit-tests/audio/compat-test.ts diff --git a/test/unit-tests/autocomplete/CommandProvider-test.ts b/apps/web/test/unit-tests/autocomplete/CommandProvider-test.ts similarity index 100% rename from test/unit-tests/autocomplete/CommandProvider-test.ts rename to apps/web/test/unit-tests/autocomplete/CommandProvider-test.ts diff --git a/test/unit-tests/autocomplete/EmojiProvider-test.ts b/apps/web/test/unit-tests/autocomplete/EmojiProvider-test.ts similarity index 100% rename from test/unit-tests/autocomplete/EmojiProvider-test.ts rename to apps/web/test/unit-tests/autocomplete/EmojiProvider-test.ts diff --git a/test/unit-tests/autocomplete/QueryMatcher-test.ts b/apps/web/test/unit-tests/autocomplete/QueryMatcher-test.ts similarity index 100% rename from test/unit-tests/autocomplete/QueryMatcher-test.ts rename to apps/web/test/unit-tests/autocomplete/QueryMatcher-test.ts diff --git a/test/unit-tests/autocomplete/RoomProvider-test.ts b/apps/web/test/unit-tests/autocomplete/RoomProvider-test.ts similarity index 100% rename from test/unit-tests/autocomplete/RoomProvider-test.ts rename to apps/web/test/unit-tests/autocomplete/RoomProvider-test.ts diff --git a/test/unit-tests/autocomplete/SpaceProvider-test.ts b/apps/web/test/unit-tests/autocomplete/SpaceProvider-test.ts similarity index 100% rename from test/unit-tests/autocomplete/SpaceProvider-test.ts rename to apps/web/test/unit-tests/autocomplete/SpaceProvider-test.ts diff --git a/test/unit-tests/components/structures/AutocompleteInput-test.tsx b/apps/web/test/unit-tests/components/structures/AutocompleteInput-test.tsx similarity index 100% rename from test/unit-tests/components/structures/AutocompleteInput-test.tsx rename to apps/web/test/unit-tests/components/structures/AutocompleteInput-test.tsx diff --git a/test/unit-tests/components/structures/ContextMenu-test.ts b/apps/web/test/unit-tests/components/structures/ContextMenu-test.ts similarity index 100% rename from test/unit-tests/components/structures/ContextMenu-test.ts rename to apps/web/test/unit-tests/components/structures/ContextMenu-test.ts diff --git a/test/unit-tests/components/structures/FileDropTarget-test.tsx b/apps/web/test/unit-tests/components/structures/FileDropTarget-test.tsx similarity index 100% rename from test/unit-tests/components/structures/FileDropTarget-test.tsx rename to apps/web/test/unit-tests/components/structures/FileDropTarget-test.tsx diff --git a/test/unit-tests/components/structures/FilePanel-test.tsx b/apps/web/test/unit-tests/components/structures/FilePanel-test.tsx similarity index 100% rename from test/unit-tests/components/structures/FilePanel-test.tsx rename to apps/web/test/unit-tests/components/structures/FilePanel-test.tsx diff --git a/test/unit-tests/components/structures/GenericDropdownMenu-test.tsx b/apps/web/test/unit-tests/components/structures/GenericDropdownMenu-test.tsx similarity index 100% rename from test/unit-tests/components/structures/GenericDropdownMenu-test.tsx rename to apps/web/test/unit-tests/components/structures/GenericDropdownMenu-test.tsx diff --git a/test/unit-tests/components/structures/LargeLoader-test.tsx b/apps/web/test/unit-tests/components/structures/LargeLoader-test.tsx similarity index 100% rename from test/unit-tests/components/structures/LargeLoader-test.tsx rename to apps/web/test/unit-tests/components/structures/LargeLoader-test.tsx diff --git a/test/unit-tests/components/structures/LeftPanel-test.tsx b/apps/web/test/unit-tests/components/structures/LeftPanel-test.tsx similarity index 100% rename from test/unit-tests/components/structures/LeftPanel-test.tsx rename to apps/web/test/unit-tests/components/structures/LeftPanel-test.tsx diff --git a/test/unit-tests/components/structures/LegacyCallEventGrouper-test.ts b/apps/web/test/unit-tests/components/structures/LegacyCallEventGrouper-test.ts similarity index 100% rename from test/unit-tests/components/structures/LegacyCallEventGrouper-test.ts rename to apps/web/test/unit-tests/components/structures/LegacyCallEventGrouper-test.ts diff --git a/test/unit-tests/components/structures/LoggedInView-test.tsx b/apps/web/test/unit-tests/components/structures/LoggedInView-test.tsx similarity index 100% rename from test/unit-tests/components/structures/LoggedInView-test.tsx rename to apps/web/test/unit-tests/components/structures/LoggedInView-test.tsx diff --git a/test/unit-tests/components/structures/MainSplit-test.tsx b/apps/web/test/unit-tests/components/structures/MainSplit-test.tsx similarity index 100% rename from test/unit-tests/components/structures/MainSplit-test.tsx rename to apps/web/test/unit-tests/components/structures/MainSplit-test.tsx diff --git a/test/unit-tests/components/structures/MatrixChat-test.tsx b/apps/web/test/unit-tests/components/structures/MatrixChat-test.tsx similarity index 99% rename from test/unit-tests/components/structures/MatrixChat-test.tsx rename to apps/web/test/unit-tests/components/structures/MatrixChat-test.tsx index fe9676d753..0612ee2bb8 100644 --- a/test/unit-tests/components/structures/MatrixChat-test.tsx +++ b/apps/web/test/unit-tests/components/structures/MatrixChat-test.tsx @@ -1269,7 +1269,7 @@ describe("", () => { fireEvent.change(screen.getByLabelText("Password"), { target: { value: password } }); // sign in button is an input - fireEvent.click(screen.getByDisplayValue("Sign in")); + fireEvent.click(screen.getByRole("button", { name: "Sign in" })); }; beforeEach(() => { diff --git a/test/unit-tests/components/structures/MatrixClientContextProvider-test.tsx b/apps/web/test/unit-tests/components/structures/MatrixClientContextProvider-test.tsx similarity index 100% rename from test/unit-tests/components/structures/MatrixClientContextProvider-test.tsx rename to apps/web/test/unit-tests/components/structures/MatrixClientContextProvider-test.tsx diff --git a/test/unit-tests/components/structures/MessagePanel-test.tsx b/apps/web/test/unit-tests/components/structures/MessagePanel-test.tsx similarity index 100% rename from test/unit-tests/components/structures/MessagePanel-test.tsx rename to apps/web/test/unit-tests/components/structures/MessagePanel-test.tsx diff --git a/test/unit-tests/components/structures/PictureInPictureDragger-test.tsx b/apps/web/test/unit-tests/components/structures/PictureInPictureDragger-test.tsx similarity index 100% rename from test/unit-tests/components/structures/PictureInPictureDragger-test.tsx rename to apps/web/test/unit-tests/components/structures/PictureInPictureDragger-test.tsx diff --git a/test/unit-tests/components/structures/PipContainer-test.tsx b/apps/web/test/unit-tests/components/structures/PipContainer-test.tsx similarity index 100% rename from test/unit-tests/components/structures/PipContainer-test.tsx rename to apps/web/test/unit-tests/components/structures/PipContainer-test.tsx diff --git a/test/unit-tests/components/structures/ReleaseAnnouncement-test.tsx b/apps/web/test/unit-tests/components/structures/ReleaseAnnouncement-test.tsx similarity index 100% rename from test/unit-tests/components/structures/ReleaseAnnouncement-test.tsx rename to apps/web/test/unit-tests/components/structures/ReleaseAnnouncement-test.tsx diff --git a/test/unit-tests/components/structures/RightPanel-test.tsx b/apps/web/test/unit-tests/components/structures/RightPanel-test.tsx similarity index 100% rename from test/unit-tests/components/structures/RightPanel-test.tsx rename to apps/web/test/unit-tests/components/structures/RightPanel-test.tsx diff --git a/test/unit-tests/components/structures/RoomSearchView-test.tsx b/apps/web/test/unit-tests/components/structures/RoomSearchView-test.tsx similarity index 100% rename from test/unit-tests/components/structures/RoomSearchView-test.tsx rename to apps/web/test/unit-tests/components/structures/RoomSearchView-test.tsx diff --git a/test/unit-tests/components/structures/RoomView-test.tsx b/apps/web/test/unit-tests/components/structures/RoomView-test.tsx similarity index 100% rename from test/unit-tests/components/structures/RoomView-test.tsx rename to apps/web/test/unit-tests/components/structures/RoomView-test.tsx diff --git a/test/unit-tests/components/structures/SpaceHierarchy-test.tsx b/apps/web/test/unit-tests/components/structures/SpaceHierarchy-test.tsx similarity index 100% rename from test/unit-tests/components/structures/SpaceHierarchy-test.tsx rename to apps/web/test/unit-tests/components/structures/SpaceHierarchy-test.tsx diff --git a/test/unit-tests/components/structures/SpaceRoomView-test.tsx b/apps/web/test/unit-tests/components/structures/SpaceRoomView-test.tsx similarity index 100% rename from test/unit-tests/components/structures/SpaceRoomView-test.tsx rename to apps/web/test/unit-tests/components/structures/SpaceRoomView-test.tsx diff --git a/test/unit-tests/components/structures/TabbedView-test.tsx b/apps/web/test/unit-tests/components/structures/TabbedView-test.tsx similarity index 100% rename from test/unit-tests/components/structures/TabbedView-test.tsx rename to apps/web/test/unit-tests/components/structures/TabbedView-test.tsx diff --git a/test/unit-tests/components/structures/ThreadPanel-test.tsx b/apps/web/test/unit-tests/components/structures/ThreadPanel-test.tsx similarity index 100% rename from test/unit-tests/components/structures/ThreadPanel-test.tsx rename to apps/web/test/unit-tests/components/structures/ThreadPanel-test.tsx diff --git a/test/unit-tests/components/structures/ThreadView-test.tsx b/apps/web/test/unit-tests/components/structures/ThreadView-test.tsx similarity index 100% rename from test/unit-tests/components/structures/ThreadView-test.tsx rename to apps/web/test/unit-tests/components/structures/ThreadView-test.tsx diff --git a/test/unit-tests/components/structures/TimelinePanel-test.tsx b/apps/web/test/unit-tests/components/structures/TimelinePanel-test.tsx similarity index 100% rename from test/unit-tests/components/structures/TimelinePanel-test.tsx rename to apps/web/test/unit-tests/components/structures/TimelinePanel-test.tsx diff --git a/test/unit-tests/components/structures/UploadBar-test.tsx b/apps/web/test/unit-tests/components/structures/UploadBar-test.tsx similarity index 100% rename from test/unit-tests/components/structures/UploadBar-test.tsx rename to apps/web/test/unit-tests/components/structures/UploadBar-test.tsx diff --git a/test/unit-tests/components/structures/UserMenu-test.tsx b/apps/web/test/unit-tests/components/structures/UserMenu-test.tsx similarity index 84% rename from test/unit-tests/components/structures/UserMenu-test.tsx rename to apps/web/test/unit-tests/components/structures/UserMenu-test.tsx index 9f4bfd3d30..6581da3071 100644 --- a/test/unit-tests/components/structures/UserMenu-test.tsx +++ b/apps/web/test/unit-tests/components/structures/UserMenu-test.tsx @@ -7,7 +7,7 @@ Please see LICENSE files in the repository root for full details. */ import React from "react"; -import { render, screen, waitFor } from "jest-matrix-react"; +import { fireEvent, render, screen, waitFor } from "jest-matrix-react"; import { DEVICE_CODE_SCOPE, type MatrixClient, type Room } from "matrix-js-sdk/src/matrix"; import { type CryptoApi } from "matrix-js-sdk/src/crypto-api"; import { mocked } from "jest-mock"; @@ -22,6 +22,7 @@ import Modal from "../../../../src/Modal"; import { mockOpenIdConfiguration } from "../../../test-utils/oidc"; import { Action } from "../../../../src/dispatcher/actions"; import { UserTab } from "../../../../src/components/views/dialogs/UserTab"; +import SettingsStore from "../../../../src/settings/SettingsStore.ts"; describe("", () => { let client: MatrixClient; @@ -151,4 +152,26 @@ describe("", () => { }); }); }); + + it("should toggle theme on switcher click", async () => { + sdkContext.client = stubClient(); + const spy = jest.spyOn(SettingsStore, "setValue"); + + const UserMenu = wrapInSdkContext(UnwrappedUserMenu, sdkContext); + render(); + + screen.getByRole("button", { name: /User menu/i }).click(); + + const themeSwitchButton = await screen.findByRole("button", { name: "Switch to dark mode" }); + expect(themeSwitchButton).toBeInTheDocument(); + + expect(spy).not.toHaveBeenCalled(); + fireEvent.click(themeSwitchButton); + expect(spy).toHaveBeenCalledWith("use_system_theme", null, "device", false); + expect(spy).toHaveBeenCalledWith("theme", null, "device", "dark"); + + fireEvent.click(themeSwitchButton); + expect(spy).toHaveBeenCalledWith("use_system_theme", null, "device", false); + expect(spy).toHaveBeenCalledWith("theme", null, "device", "light"); + }); }); diff --git a/test/unit-tests/components/structures/ViewSource-test.tsx b/apps/web/test/unit-tests/components/structures/ViewSource-test.tsx similarity index 100% rename from test/unit-tests/components/structures/ViewSource-test.tsx rename to apps/web/test/unit-tests/components/structures/ViewSource-test.tsx diff --git a/test/unit-tests/components/structures/__snapshots__/FileDropTarget-test.tsx.snap b/apps/web/test/unit-tests/components/structures/__snapshots__/FileDropTarget-test.tsx.snap similarity index 100% rename from test/unit-tests/components/structures/__snapshots__/FileDropTarget-test.tsx.snap rename to apps/web/test/unit-tests/components/structures/__snapshots__/FileDropTarget-test.tsx.snap diff --git a/test/unit-tests/components/structures/__snapshots__/FilePanel-test.tsx.snap b/apps/web/test/unit-tests/components/structures/__snapshots__/FilePanel-test.tsx.snap similarity index 100% rename from test/unit-tests/components/structures/__snapshots__/FilePanel-test.tsx.snap rename to apps/web/test/unit-tests/components/structures/__snapshots__/FilePanel-test.tsx.snap diff --git a/test/unit-tests/components/structures/__snapshots__/GenericDropdownMenu-test.tsx.snap b/apps/web/test/unit-tests/components/structures/__snapshots__/GenericDropdownMenu-test.tsx.snap similarity index 100% rename from test/unit-tests/components/structures/__snapshots__/GenericDropdownMenu-test.tsx.snap rename to apps/web/test/unit-tests/components/structures/__snapshots__/GenericDropdownMenu-test.tsx.snap diff --git a/test/unit-tests/components/structures/__snapshots__/MainSplit-test.tsx.snap b/apps/web/test/unit-tests/components/structures/__snapshots__/MainSplit-test.tsx.snap similarity index 100% rename from test/unit-tests/components/structures/__snapshots__/MainSplit-test.tsx.snap rename to apps/web/test/unit-tests/components/structures/__snapshots__/MainSplit-test.tsx.snap diff --git a/test/unit-tests/components/structures/__snapshots__/MatrixChat-test.tsx.snap b/apps/web/test/unit-tests/components/structures/__snapshots__/MatrixChat-test.tsx.snap similarity index 100% rename from test/unit-tests/components/structures/__snapshots__/MatrixChat-test.tsx.snap rename to apps/web/test/unit-tests/components/structures/__snapshots__/MatrixChat-test.tsx.snap diff --git a/test/unit-tests/components/structures/__snapshots__/MessagePanel-test.tsx.snap b/apps/web/test/unit-tests/components/structures/__snapshots__/MessagePanel-test.tsx.snap similarity index 100% rename from test/unit-tests/components/structures/__snapshots__/MessagePanel-test.tsx.snap rename to apps/web/test/unit-tests/components/structures/__snapshots__/MessagePanel-test.tsx.snap diff --git a/test/unit-tests/components/structures/__snapshots__/PictureInPictureDragger-test.tsx.snap b/apps/web/test/unit-tests/components/structures/__snapshots__/PictureInPictureDragger-test.tsx.snap similarity index 100% rename from test/unit-tests/components/structures/__snapshots__/PictureInPictureDragger-test.tsx.snap rename to apps/web/test/unit-tests/components/structures/__snapshots__/PictureInPictureDragger-test.tsx.snap diff --git a/test/unit-tests/components/structures/__snapshots__/RoomView-test.tsx.snap b/apps/web/test/unit-tests/components/structures/__snapshots__/RoomView-test.tsx.snap similarity index 99% rename from test/unit-tests/components/structures/__snapshots__/RoomView-test.tsx.snap rename to apps/web/test/unit-tests/components/structures/__snapshots__/RoomView-test.tsx.snap index 537aa6b422..dd83b7d0c5 100644 --- a/test/unit-tests/components/structures/__snapshots__/RoomView-test.tsx.snap +++ b/apps/web/test/unit-tests/components/structures/__snapshots__/RoomView-test.tsx.snap @@ -213,12 +213,12 @@ exports[`RoomView for a local room in state ERROR should match the snapshot 1`]

    Could not start a chat with this user

    00:00
    Message #49
  • @user48:example.com
    00:00
    Message #48
  • @user47:example.com
    00:00
    Message #47
  • @user46:example.com
    00:00
    Message #46
  • @user45:example.com
    00:00
    Message #45
  • @user44:example.com
    00:00
    Message #44
  • @user43:example.com
    00:00
    Message #43
  • @user42:example.com
    00:00
    Message #42
  • @user41:example.com
    00:00
    Message #41
  • @user40:example.com
    00:00
    Message #40
  • @user39:example.com
    00:00
    Message #39
  • @user38:example.com
    00:00
    Message #38
  • @user37:example.com
    00:00
    Message #37
  • @user36:example.com
    00:00
    Message #36
  • @user35:example.com
    00:00
    Message #35
  • @user34:example.com
    00:00
    Message #34
  • @user33:example.com
    00:00
    Message #33
  • @user32:example.com
    00:00
    Message #32
  • @user31:example.com
    00:00
    Message #31
  • @user30:example.com
    00:00
    Message #30
  • @user29:example.com
    00:00
    Message #29
  • @user28:example.com
    00:00
    Message #28
  • @user27:example.com
    00:00
    Message #27
  • @user26:example.com
    00:00
    Message #26
  • @user25:example.com
    00:00
    Message #25
  • @user24:example.com
    00:00
    Message #24
  • @user23:example.com
    00:00
    Message #23
  • @user22:example.com
    00:00
    Message #22
  • @user21:example.com
    00:00
    Message #21
  • @user20:example.com
    00:00
    Message #20
  • @user19:example.com
    00:00
    Message #19
  • @user18:example.com
    00:00
    Message #18
  • @user17:example.com
    00:00
    Message #17
  • @user16:example.com
    00:00
    Message #16
  • @user15:example.com
    00:00
    Message #15
  • @user14:example.com
    00:00
    Message #14
  • @user13:example.com
    00:00
    Message #13
  • @user12:example.com
    00:00
    Message #12
  • @user11:example.com
    00:00
    Message #11
  • @user10:example.com
    00:00
    Message #10
  • @user9:example.com
    00:00
    Message #9
  • @user8:example.com
    00:00
    Message #8
  • @user7:example.com
    00:00
    Message #7
  • @user6:example.com
    00:00
    Message #6
  • @user5:example.com
    00:00
    Message #5
  • @user4:example.com
    00:00
    Message #4
  • @user3:example.com
    00:00
    Message #3
  • @user2:example.com
    00:00
    Message #2
  • @user1:example.com
    00:00
    Message #1
  • @user0:example.com
    00:00
    Message #0
  • + + + + +
    +
    +
    +
    +
    + + + + + + + +
    + + " +`; + +exports[`HTMLExport should have an SDK-branded destination file name 1`] = `"Element - My Test Room Welcome - Chat Export - 2022-11-17T16-58-32.517Z.zip"`; + +exports[`HTMLExport should have an SDK-branded destination file name 2`] = `"BrandedChatWithSlashesForFun - My Test Room Welcome - Chat Export - 2022-11-17T16-58-32.517Z.zip"`; diff --git a/test/unit-tests/utils/exportUtils/__snapshots__/JSONExport-test.ts.snap b/apps/web/test/unit-tests/utils/exportUtils/__snapshots__/JSONExport-test.ts.snap similarity index 100% rename from test/unit-tests/utils/exportUtils/__snapshots__/JSONExport-test.ts.snap rename to apps/web/test/unit-tests/utils/exportUtils/__snapshots__/JSONExport-test.ts.snap diff --git a/test/unit-tests/utils/exportUtils/__snapshots__/PlainTextExport-test.ts.snap b/apps/web/test/unit-tests/utils/exportUtils/__snapshots__/PlainTextExport-test.ts.snap similarity index 100% rename from test/unit-tests/utils/exportUtils/__snapshots__/PlainTextExport-test.ts.snap rename to apps/web/test/unit-tests/utils/exportUtils/__snapshots__/PlainTextExport-test.ts.snap diff --git a/test/unit-tests/utils/exportUtils/exportCSS-test.ts b/apps/web/test/unit-tests/utils/exportUtils/exportCSS-test.ts similarity index 100% rename from test/unit-tests/utils/exportUtils/exportCSS-test.ts rename to apps/web/test/unit-tests/utils/exportUtils/exportCSS-test.ts diff --git a/test/unit-tests/utils/generate-megolm-test-vectors.py b/apps/web/test/unit-tests/utils/generate-megolm-test-vectors.py similarity index 100% rename from test/unit-tests/utils/generate-megolm-test-vectors.py rename to apps/web/test/unit-tests/utils/generate-megolm-test-vectors.py diff --git a/test/unit-tests/utils/i18n-helpers-test.ts b/apps/web/test/unit-tests/utils/i18n-helpers-test.ts similarity index 100% rename from test/unit-tests/utils/i18n-helpers-test.ts rename to apps/web/test/unit-tests/utils/i18n-helpers-test.ts diff --git a/test/unit-tests/utils/iterables-test.ts b/apps/web/test/unit-tests/utils/iterables-test.ts similarity index 100% rename from test/unit-tests/utils/iterables-test.ts rename to apps/web/test/unit-tests/utils/iterables-test.ts diff --git a/test/unit-tests/utils/leave-behaviour-test.ts b/apps/web/test/unit-tests/utils/leave-behaviour-test.ts similarity index 100% rename from test/unit-tests/utils/leave-behaviour-test.ts rename to apps/web/test/unit-tests/utils/leave-behaviour-test.ts diff --git a/test/unit-tests/utils/local-room-test.ts b/apps/web/test/unit-tests/utils/local-room-test.ts similarity index 100% rename from test/unit-tests/utils/local-room-test.ts rename to apps/web/test/unit-tests/utils/local-room-test.ts diff --git a/test/unit-tests/utils/localRoom/isLocalRoom-test.ts b/apps/web/test/unit-tests/utils/localRoom/isLocalRoom-test.ts similarity index 100% rename from test/unit-tests/utils/localRoom/isLocalRoom-test.ts rename to apps/web/test/unit-tests/utils/localRoom/isLocalRoom-test.ts diff --git a/test/unit-tests/utils/localRoom/isRoomReady-test.ts b/apps/web/test/unit-tests/utils/localRoom/isRoomReady-test.ts similarity index 100% rename from test/unit-tests/utils/localRoom/isRoomReady-test.ts rename to apps/web/test/unit-tests/utils/localRoom/isRoomReady-test.ts diff --git a/test/unit-tests/utils/location/isSelfLocation-test.ts b/apps/web/test/unit-tests/utils/location/isSelfLocation-test.ts similarity index 100% rename from test/unit-tests/utils/location/isSelfLocation-test.ts rename to apps/web/test/unit-tests/utils/location/isSelfLocation-test.ts diff --git a/test/unit-tests/utils/location/locationEventGeoUri-test.ts b/apps/web/test/unit-tests/utils/location/locationEventGeoUri-test.ts similarity index 100% rename from test/unit-tests/utils/location/locationEventGeoUri-test.ts rename to apps/web/test/unit-tests/utils/location/locationEventGeoUri-test.ts diff --git a/test/unit-tests/utils/location/map-test.ts b/apps/web/test/unit-tests/utils/location/map-test.ts similarity index 100% rename from test/unit-tests/utils/location/map-test.ts rename to apps/web/test/unit-tests/utils/location/map-test.ts diff --git a/test/unit-tests/utils/location/parseGeoUri-test.ts b/apps/web/test/unit-tests/utils/location/parseGeoUri-test.ts similarity index 100% rename from test/unit-tests/utils/location/parseGeoUri-test.ts rename to apps/web/test/unit-tests/utils/location/parseGeoUri-test.ts diff --git a/test/unit-tests/utils/location/positionFailureMessage-test.ts b/apps/web/test/unit-tests/utils/location/positionFailureMessage-test.ts similarity index 100% rename from test/unit-tests/utils/location/positionFailureMessage-test.ts rename to apps/web/test/unit-tests/utils/location/positionFailureMessage-test.ts diff --git a/test/unit-tests/utils/maps-test.ts b/apps/web/test/unit-tests/utils/maps-test.ts similarity index 100% rename from test/unit-tests/utils/maps-test.ts rename to apps/web/test/unit-tests/utils/maps-test.ts diff --git a/test/unit-tests/utils/media/requestMediaPermissions-test.tsx b/apps/web/test/unit-tests/utils/media/requestMediaPermissions-test.tsx similarity index 100% rename from test/unit-tests/utils/media/requestMediaPermissions-test.tsx rename to apps/web/test/unit-tests/utils/media/requestMediaPermissions-test.tsx diff --git a/test/unit-tests/utils/membership-test.ts b/apps/web/test/unit-tests/utils/membership-test.ts similarity index 100% rename from test/unit-tests/utils/membership-test.ts rename to apps/web/test/unit-tests/utils/membership-test.ts diff --git a/test/unit-tests/utils/messages-test.ts b/apps/web/test/unit-tests/utils/messages-test.ts similarity index 100% rename from test/unit-tests/utils/messages-test.ts rename to apps/web/test/unit-tests/utils/messages-test.ts diff --git a/test/unit-tests/utils/notifications-test.ts b/apps/web/test/unit-tests/utils/notifications-test.ts similarity index 100% rename from test/unit-tests/utils/notifications-test.ts rename to apps/web/test/unit-tests/utils/notifications-test.ts diff --git a/test/unit-tests/utils/objects-test.ts b/apps/web/test/unit-tests/utils/objects-test.ts similarity index 100% rename from test/unit-tests/utils/objects-test.ts rename to apps/web/test/unit-tests/utils/objects-test.ts diff --git a/test/unit-tests/utils/oidc/TokenRefresher-test.ts b/apps/web/test/unit-tests/utils/oidc/TokenRefresher-test.ts similarity index 100% rename from test/unit-tests/utils/oidc/TokenRefresher-test.ts rename to apps/web/test/unit-tests/utils/oidc/TokenRefresher-test.ts diff --git a/test/unit-tests/utils/oidc/authorize-test.ts b/apps/web/test/unit-tests/utils/oidc/authorize-test.ts similarity index 100% rename from test/unit-tests/utils/oidc/authorize-test.ts rename to apps/web/test/unit-tests/utils/oidc/authorize-test.ts diff --git a/test/unit-tests/utils/oidc/persistOidcSettings-test.ts b/apps/web/test/unit-tests/utils/oidc/persistOidcSettings-test.ts similarity index 100% rename from test/unit-tests/utils/oidc/persistOidcSettings-test.ts rename to apps/web/test/unit-tests/utils/oidc/persistOidcSettings-test.ts diff --git a/test/unit-tests/utils/oidc/registerClient-test.ts b/apps/web/test/unit-tests/utils/oidc/registerClient-test.ts similarity index 100% rename from test/unit-tests/utils/oidc/registerClient-test.ts rename to apps/web/test/unit-tests/utils/oidc/registerClient-test.ts diff --git a/test/unit-tests/utils/oidc/urls-test.ts b/apps/web/test/unit-tests/utils/oidc/urls-test.ts similarity index 100% rename from test/unit-tests/utils/oidc/urls-test.ts rename to apps/web/test/unit-tests/utils/oidc/urls-test.ts diff --git a/test/unit-tests/utils/permalinks/MatrixSchemePermalinkConstructor-test.ts b/apps/web/test/unit-tests/utils/permalinks/MatrixSchemePermalinkConstructor-test.ts similarity index 100% rename from test/unit-tests/utils/permalinks/MatrixSchemePermalinkConstructor-test.ts rename to apps/web/test/unit-tests/utils/permalinks/MatrixSchemePermalinkConstructor-test.ts diff --git a/test/unit-tests/utils/permalinks/MatrixToPermalinkConstructor-test.ts b/apps/web/test/unit-tests/utils/permalinks/MatrixToPermalinkConstructor-test.ts similarity index 100% rename from test/unit-tests/utils/permalinks/MatrixToPermalinkConstructor-test.ts rename to apps/web/test/unit-tests/utils/permalinks/MatrixToPermalinkConstructor-test.ts diff --git a/test/unit-tests/utils/permalinks/Permalinks-test.ts b/apps/web/test/unit-tests/utils/permalinks/Permalinks-test.ts similarity index 100% rename from test/unit-tests/utils/permalinks/Permalinks-test.ts rename to apps/web/test/unit-tests/utils/permalinks/Permalinks-test.ts diff --git a/test/unit-tests/utils/promise-test.ts b/apps/web/test/unit-tests/utils/promise-test.ts similarity index 100% rename from test/unit-tests/utils/promise-test.ts rename to apps/web/test/unit-tests/utils/promise-test.ts diff --git a/test/unit-tests/utils/room/canInviteTo-test.ts b/apps/web/test/unit-tests/utils/room/canInviteTo-test.ts similarity index 100% rename from test/unit-tests/utils/room/canInviteTo-test.ts rename to apps/web/test/unit-tests/utils/room/canInviteTo-test.ts diff --git a/test/unit-tests/utils/room/getJoinedNonFunctionalMembers-test.ts b/apps/web/test/unit-tests/utils/room/getJoinedNonFunctionalMembers-test.ts similarity index 100% rename from test/unit-tests/utils/room/getJoinedNonFunctionalMembers-test.ts rename to apps/web/test/unit-tests/utils/room/getJoinedNonFunctionalMembers-test.ts diff --git a/test/unit-tests/utils/room/getRoomFunctionalMembers-test.ts b/apps/web/test/unit-tests/utils/room/getRoomFunctionalMembers-test.ts similarity index 100% rename from test/unit-tests/utils/room/getRoomFunctionalMembers-test.ts rename to apps/web/test/unit-tests/utils/room/getRoomFunctionalMembers-test.ts diff --git a/test/unit-tests/utils/room/inviteToRoom-test.ts b/apps/web/test/unit-tests/utils/room/inviteToRoom-test.ts similarity index 100% rename from test/unit-tests/utils/room/inviteToRoom-test.ts rename to apps/web/test/unit-tests/utils/room/inviteToRoom-test.ts diff --git a/test/unit-tests/utils/room/shouldEncryptRoomWithSingle3rdPartyInvite-test.ts b/apps/web/test/unit-tests/utils/room/shouldEncryptRoomWithSingle3rdPartyInvite-test.ts similarity index 100% rename from test/unit-tests/utils/room/shouldEncryptRoomWithSingle3rdPartyInvite-test.ts rename to apps/web/test/unit-tests/utils/room/shouldEncryptRoomWithSingle3rdPartyInvite-test.ts diff --git a/test/unit-tests/utils/room/tagRoom-test.ts b/apps/web/test/unit-tests/utils/room/tagRoom-test.ts similarity index 100% rename from test/unit-tests/utils/room/tagRoom-test.ts rename to apps/web/test/unit-tests/utils/room/tagRoom-test.ts diff --git a/test/unit-tests/utils/rooms-test.ts b/apps/web/test/unit-tests/utils/rooms-test.ts similarity index 100% rename from test/unit-tests/utils/rooms-test.ts rename to apps/web/test/unit-tests/utils/rooms-test.ts diff --git a/test/unit-tests/utils/sets-test.ts b/apps/web/test/unit-tests/utils/sets-test.ts similarity index 100% rename from test/unit-tests/utils/sets-test.ts rename to apps/web/test/unit-tests/utils/sets-test.ts diff --git a/test/unit-tests/utils/stringOrderField-test.ts b/apps/web/test/unit-tests/utils/stringOrderField-test.ts similarity index 100% rename from test/unit-tests/utils/stringOrderField-test.ts rename to apps/web/test/unit-tests/utils/stringOrderField-test.ts diff --git a/test/unit-tests/utils/threepids-test.ts b/apps/web/test/unit-tests/utils/threepids-test.ts similarity index 100% rename from test/unit-tests/utils/threepids-test.ts rename to apps/web/test/unit-tests/utils/threepids-test.ts diff --git a/test/unit-tests/utils/validate/numberInRange-test.ts b/apps/web/test/unit-tests/utils/validate/numberInRange-test.ts similarity index 100% rename from test/unit-tests/utils/validate/numberInRange-test.ts rename to apps/web/test/unit-tests/utils/validate/numberInRange-test.ts diff --git a/test/unit-tests/vector/__snapshots__/init-test.ts.snap b/apps/web/test/unit-tests/vector/__snapshots__/init-test.ts.snap similarity index 100% rename from test/unit-tests/vector/__snapshots__/init-test.ts.snap rename to apps/web/test/unit-tests/vector/__snapshots__/init-test.ts.snap diff --git a/apps/web/test/unit-tests/vector/app-test.ts b/apps/web/test/unit-tests/vector/app-test.ts new file mode 100644 index 0000000000..c2e9eb1cff --- /dev/null +++ b/apps/web/test/unit-tests/vector/app-test.ts @@ -0,0 +1,92 @@ +/** + * @jest-environment jest-fixed-jsdom + * @jest-environment-options {"url": "https://app.element.io/#/room/#room:server"} + */ + +/* +Copyright 2026 Element Creations Ltd. + +SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. +*/ + +import fetchMock from "@fetch-mock/jest"; +import { MatrixClient } from "matrix-js-sdk/src/matrix"; +import { Crypto } from "@peculiar/webcrypto"; + +import { loadApp } from "../../../src/vector/app.tsx"; +import SdkConfig from "../../../src/SdkConfig.ts"; +import PlatformPeg from "../../../src/PlatformPeg.ts"; +import { mockPlatformPeg, unmockPlatformPeg } from "../../test-utils"; +import { makeDelegatedAuthConfig } from "../../test-utils/oidc"; + +const defaultConfig = { + default_hs_url: "https://synapse", +}; +const issuer = "https://auth.org/"; +const webCrypto = new Crypto(); + +describe("sso_redirect_options", () => { + beforeAll(() => { + Object.defineProperty(window, "crypto", { + value: { + // Stable stub + getRandomValues: (arr: Uint8Array) => { + for (let i = 0; i < arr.length; i++) { + arr[i] = i; + } + return arr; + }, + subtle: webCrypto.subtle, + }, + }); + }); + + beforeEach(() => { + SdkConfig.reset(); + mockPlatformPeg({ getDefaultDeviceDisplayName: jest.fn(), startSingleSignOn: jest.fn() }); + }); + + afterAll(() => { + unmockPlatformPeg(); + }); + + describe("immediate", () => { + beforeEach(() => { + SdkConfig.put({ + ...defaultConfig, + sso_redirect_options: { immediate: true }, + // Avoid testing dynamic client registration + oidc_static_clients: { [issuer]: { client_id: "12345" } }, + }); + // Signal we support v1.1 to pass the minimum js-sdk compatibility bar + // Signal we support v1.15 to use stable Native OIDC support + fetchMock.get("https://synapse/_matrix/client/versions", { versions: ["v1.1", "v1.15"] }); + }); + + it("should redirect for legacy SSO", async () => { + fetchMock.getOnce("https://synapse/_matrix/client/v3/login", { + flows: [{ stages: ["m.login.sso"] }], + }); + + const startSingleSignOnSpy = jest.spyOn(PlatformPeg.get()!, "startSingleSignOn"); + + await loadApp({}, jest.fn()); + expect(startSingleSignOnSpy).toHaveBeenCalledWith(expect.any(MatrixClient), "sso", "/room/#room:server"); + }); + + it("should redirect for native OIDC", async () => { + const authConfig = makeDelegatedAuthConfig(issuer); + fetchMock.get("https://synapse/_matrix/client/v1/auth_metadata", authConfig); + fetchMock.get(`${authConfig.issuer}.well-known/openid-configuration`, authConfig); + fetchMock.get(authConfig.jwks_uri!, { keys: [] }); + + const startOidcLoginSpy = jest.spyOn(window.location, "href", "set"); + + await loadApp({}, jest.fn()); + expect(startOidcLoginSpy).toHaveBeenCalledWith( + "https://auth.org/auth?client_id=12345&redirect_uri=https%3A%2F%2Fapp.element.io%2F%3Fno_universal_links%3Dtrue&response_type=code&scope=openid+urn%3Amatrix%3Aorg.matrix.msc2967.client%3Aapi%3A*+urn%3Amatrix%3Aorg.matrix.msc2967.client%3Adevice%3AwKpa6hpi3Y&nonce=38QgU2Pomx&state=10000000100040008000100000000000&code_challenge=awE81eIsGff70JahvrTqWRbGKLI10ooyo_Xm1sxuZvU&code_challenge_method=S256&response_mode=query", + ); + }); + }); +}); diff --git a/test/unit-tests/vector/getconfig-test.ts b/apps/web/test/unit-tests/vector/getconfig-test.ts similarity index 100% rename from test/unit-tests/vector/getconfig-test.ts rename to apps/web/test/unit-tests/vector/getconfig-test.ts diff --git a/test/unit-tests/vector/init-test.ts b/apps/web/test/unit-tests/vector/init-test.ts similarity index 100% rename from test/unit-tests/vector/init-test.ts rename to apps/web/test/unit-tests/vector/init-test.ts diff --git a/test/unit-tests/vector/platform/ElectronPlatform-test.ts b/apps/web/test/unit-tests/vector/platform/ElectronPlatform-test.ts similarity index 100% rename from test/unit-tests/vector/platform/ElectronPlatform-test.ts rename to apps/web/test/unit-tests/vector/platform/ElectronPlatform-test.ts diff --git a/test/unit-tests/vector/platform/PWAPlatform-test.ts b/apps/web/test/unit-tests/vector/platform/PWAPlatform-test.ts similarity index 100% rename from test/unit-tests/vector/platform/PWAPlatform-test.ts rename to apps/web/test/unit-tests/vector/platform/PWAPlatform-test.ts diff --git a/test/unit-tests/vector/platform/WebPlatform-test.ts b/apps/web/test/unit-tests/vector/platform/WebPlatform-test.ts similarity index 100% rename from test/unit-tests/vector/platform/WebPlatform-test.ts rename to apps/web/test/unit-tests/vector/platform/WebPlatform-test.ts diff --git a/test/unit-tests/vector/rageshakesetup-test.ts b/apps/web/test/unit-tests/vector/rageshakesetup-test.ts similarity index 100% rename from test/unit-tests/vector/rageshakesetup-test.ts rename to apps/web/test/unit-tests/vector/rageshakesetup-test.ts diff --git a/test/unit-tests/vector/routing-test.ts b/apps/web/test/unit-tests/vector/routing-test.ts similarity index 100% rename from test/unit-tests/vector/routing-test.ts rename to apps/web/test/unit-tests/vector/routing-test.ts diff --git a/test/unit-tests/vector/url_utils-test.ts b/apps/web/test/unit-tests/vector/url_utils-test.ts similarity index 100% rename from test/unit-tests/vector/url_utils-test.ts rename to apps/web/test/unit-tests/vector/url_utils-test.ts diff --git a/test/unit-tests/widgets/ManagedHybrid-test.ts b/apps/web/test/unit-tests/widgets/ManagedHybrid-test.ts similarity index 100% rename from test/unit-tests/widgets/ManagedHybrid-test.ts rename to apps/web/test/unit-tests/widgets/ManagedHybrid-test.ts diff --git a/test/viewmodels/audio/AudioPlayerViewModel-test.tsx b/apps/web/test/viewmodels/audio/AudioPlayerViewModel-test.tsx similarity index 100% rename from test/viewmodels/audio/AudioPlayerViewModel-test.tsx rename to apps/web/test/viewmodels/audio/AudioPlayerViewModel-test.tsx diff --git a/apps/web/test/viewmodels/event-tiles/EncryptionEventViewModel-test.ts b/apps/web/test/viewmodels/event-tiles/EncryptionEventViewModel-test.ts new file mode 100644 index 0000000000..9da5bdd09c --- /dev/null +++ b/apps/web/test/viewmodels/event-tiles/EncryptionEventViewModel-test.ts @@ -0,0 +1,192 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import { waitFor } from "@testing-library/dom"; +import { mocked } from "jest-mock"; +import { RoomStateEvent, type MatrixClient, type MatrixEvent, type Room } from "matrix-js-sdk/src/matrix"; +import { EncryptionEventState } from "@element-hq/web-shared-components"; + +import type { RoomEncryptionEventContent } from "matrix-js-sdk/src/types"; +import { EncryptionEventViewModel } from "../../../src/viewmodels/event-tiles/EncryptionEventViewModel"; +import { LocalRoom } from "../../../src/models/LocalRoom"; +import DMRoomMap from "../../../src/utils/DMRoomMap"; +import { mkEvent, stubClient } from "../../test-utils"; + +describe("EncryptionEventViewModel", () => { + const roomId = "!room:example.com"; + const algorithm = "m.megolm.v1.aes-sha2"; + let client: MatrixClient; + let event: MatrixEvent; + let room: Room; + + beforeEach(() => { + jest.clearAllMocks(); + client = stubClient(); + room = client.getRoom(roomId)!; + mocked(client.getRoom).mockReturnValue(room); + event = mkEvent({ + event: true, + room: roomId, + user: client.getUserId()!, + type: "m.room.encryption", + content: { + algorithm, + }, + prev_content: {}, + }); + jest.spyOn(DMRoomMap, "shared").mockReturnValue({ + getUserIdForRoomId: jest.fn(), + } as unknown as DMRoomMap); + }); + + const setRoomEncrypted = (encrypted: boolean): void => { + const crypto = client.getCrypto()!; + mocked(crypto.isEncryptionEnabledInRoom).mockResolvedValue(encrypted); + }; + + const createVm = ( + props: Partial[0]> = {}, + ): EncryptionEventViewModel => + new EncryptionEventViewModel({ + mxEvent: event, + cli: client, + ...props, + }); + + it("sets ENABLED for encrypted room", async () => { + setRoomEncrypted(true); + + const vm = createVm(); + await waitFor(() => expect(vm.getSnapshot().state).toBe(EncryptionEventState.ENABLED)); + expect(vm.getSnapshot()).toMatchObject({ + state: EncryptionEventState.ENABLED, + className: "mx_EventTileBubble mx_cryptoEvent mx_cryptoEvent_icon", + encryptedStateEvents: false, + }); + }); + + it("uses synchronous room encryption state for the initial snapshot", () => { + jest.spyOn(room, "hasEncryptionStateEvent").mockReturnValue(true); + setRoomEncrypted(false); + + const vm = createVm(); + expect(vm.getSnapshot().state).toBe(EncryptionEventState.ENABLED); + }); + + it("sets ENABLED with encryptedStateEvents=true for encrypted state events", async () => { + setRoomEncrypted(true); + client.enableEncryptedStateEvents = true; + (event.getContent() as RoomEncryptionEventContent)["io.element.msc4362.encrypt_state_events"] = true; + + const vm = createVm(); + await waitFor(() => expect(vm.getSnapshot().state).toBe(EncryptionEventState.ENABLED)); + expect(vm.getSnapshot().encryptedStateEvents).toBe(true); + }); + + it("sets CHANGED when previous algorithm is already megolm", async () => { + setRoomEncrypted(true); + event = mkEvent({ + event: true, + room: roomId, + user: client.getUserId()!, + type: "m.room.encryption", + content: { + algorithm, + rotation_period_ms: 1, + }, + prev_content: { algorithm }, + }); + + const vm = createVm(); + await waitFor(() => expect(vm.getSnapshot().state).toBe(EncryptionEventState.CHANGED)); + }); + + it("sets DISABLE_ATTEMPT for unknown algorithm in encrypted room", async () => { + setRoomEncrypted(true); + event = mkEvent({ + event: true, + room: roomId, + user: client.getUserId()!, + type: "m.room.encryption", + content: { algorithm: "unknown" }, + prev_content: {}, + }); + + const vm = createVm(); + await waitFor(() => expect(vm.getSnapshot().state).toBe(EncryptionEventState.DISABLE_ATTEMPT)); + }); + + it("sets UNSUPPORTED for unencrypted room", async () => { + setRoomEncrypted(false); + + const vm = createVm(); + await waitFor(() => expect(vm.getSnapshot().state).toBe(EncryptionEventState.UNSUPPORTED)); + expect(vm.getSnapshot().className).toBe("mx_EventTileBubble mx_cryptoEvent"); + }); + + it("sets ENABLED_DM with partner display name", async () => { + setRoomEncrypted(true); + jest.spyOn(DMRoomMap, "shared").mockReturnValue({ + getUserIdForRoomId: jest.fn().mockReturnValue("@alice:example.com"), + } as unknown as DMRoomMap); + mocked(room.getMember).mockReturnValue({ + rawDisplayName: "Alice", + } as unknown as ReturnType); + + const vm = createVm(); + await waitFor(() => expect(vm.getSnapshot().state).toBe(EncryptionEventState.ENABLED_DM)); + expect(vm.getSnapshot().userName).toBe("Alice"); + }); + + it("sets ENABLED_LOCAL for encrypted local room", async () => { + const localRoomId = "local+123"; + const localRoom = new LocalRoom(localRoomId, client, client.getUserId()!); + jest.spyOn(localRoom, "isEncryptionEnabled").mockReturnValue(true); + mocked(client.getRoom).mockReturnValue(localRoom); + event = mkEvent({ + event: true, + room: localRoomId, + user: client.getUserId()!, + type: "m.room.encryption", + content: { algorithm }, + prev_content: {}, + }); + jest.spyOn(DMRoomMap, "shared").mockReturnValue({ + getUserIdForRoomId: jest.fn(), + } as unknown as DMRoomMap); + + const vm = createVm(); + await waitFor(() => expect(vm.getSnapshot().state).toBe(EncryptionEventState.ENABLED_LOCAL)); + expect(localRoom.isEncryptionEnabled).toHaveBeenCalled(); + }); + + it("recomputes snapshot on RoomStateEvent.Update", async () => { + setRoomEncrypted(false); + const vm = createVm(); + await waitFor(() => expect(vm.getSnapshot().state).toBe(EncryptionEventState.UNSUPPORTED)); + + setRoomEncrypted(true); + room.emit(RoomStateEvent.Update, room.currentState); + + await waitFor(() => expect(vm.getSnapshot().state).toBe(EncryptionEventState.ENABLED)); + }); + + it("does not emit updates when snapshot is unchanged", async () => { + setRoomEncrypted(true); + const vm = createVm(); + await waitFor(() => expect(vm.getSnapshot().state).toBe(EncryptionEventState.ENABLED)); + + const listener = jest.fn(); + const unsubscribe = vm.subscribe(listener); + + room.emit(RoomStateEvent.Update, room.currentState); + + await waitFor(() => expect(mocked(client.getCrypto()!.isEncryptionEnabledInRoom)).toHaveBeenCalledTimes(2)); + expect(listener).not.toHaveBeenCalled(); + unsubscribe(); + }); +}); diff --git a/test/viewmodels/event-tiles/TextualEventViewModel-test.ts b/apps/web/test/viewmodels/event-tiles/TextualEventViewModel-test.ts similarity index 100% rename from test/viewmodels/event-tiles/TextualEventViewModel-test.ts rename to apps/web/test/viewmodels/event-tiles/TextualEventViewModel-test.ts diff --git a/test/viewmodels/message-body/DecryptionFailureBodyViewModel-test.tsx b/apps/web/test/viewmodels/message-body/DecryptionFailureBodyViewModel-test.tsx similarity index 100% rename from test/viewmodels/message-body/DecryptionFailureBodyViewModel-test.tsx rename to apps/web/test/viewmodels/message-body/DecryptionFailureBodyViewModel-test.tsx diff --git a/apps/web/test/viewmodels/message-body/MessageTimestampViewModel-test.tsx b/apps/web/test/viewmodels/message-body/MessageTimestampViewModel-test.tsx new file mode 100644 index 0000000000..864d4ce622 --- /dev/null +++ b/apps/web/test/viewmodels/message-body/MessageTimestampViewModel-test.tsx @@ -0,0 +1,123 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import * as DateUtils from "../../../src/DateUtils"; +import { MessageTimestampViewModel } from "../../../src/viewmodels/message-body/MessageTimestampViewModel"; + +jest.mock("../../../src/settings/SettingsStore"); + +describe("MessageTimestampViewModel", () => { + // Friday Dec 17 2021, 9:09am + const nowDate = new Date("2021-12-17T08:09:00.000Z"); + const HOUR_MS = 3600000; + const DAY_MS = HOUR_MS * 24; + + afterEach(() => { + jest.restoreAllMocks(); + }); + + it("should return the snapshot", () => { + const vm = new MessageTimestampViewModel({ + ts: nowDate.getTime(), + }); + expect(vm.getSnapshot()).toMatchObject({ + ts: "08:09", + tsSentAt: "Fri, Dec 17, 2021, 08:09:00", + }); + }); + + it("should return the snapshot with tsReceivedAt", () => { + const vm = new MessageTimestampViewModel({ + ts: nowDate.getTime(), + receivedTs: nowDate.getTime() + DAY_MS, + }); + expect(vm.getSnapshot()).toMatchObject({ + ts: "08:09", + tsSentAt: "Fri, Dec 17, 2021, 08:09:00", + tsReceivedAt: "Sat, Dec 18, 2021, 08:09:00", + }); + }); + + it("should return the snapshot with extra class names", () => { + const vm = new MessageTimestampViewModel({ + ts: nowDate.getTime(), + }); + expect(vm.getSnapshot()).toMatchObject({ + ts: "08:09", + tsSentAt: "Fri, Dec 17, 2021, 08:09:00", + className: "mx_MessageTimestamp", + }); + }); + + it("should use formatRelativeTime when showRelative is true", () => { + jest.spyOn(DateUtils, "formatFullDate").mockReturnValue("SENT_AT"); + const formatRelativeTimeSpy = jest.spyOn(DateUtils, "formatRelativeTime").mockReturnValue("RELATIVE"); + + const vm = new MessageTimestampViewModel({ + ts: nowDate.getTime(), + showRelative: true, + showTwelveHour: true, + }); + + expect(vm.getSnapshot()).toMatchObject({ + ts: "RELATIVE", + tsSentAt: "SENT_AT", + }); + expect(formatRelativeTimeSpy).toHaveBeenCalledWith(expect.any(Date), true); + }); + + it("should use full date when showFullDate is true and respect showSeconds", () => { + const formatFullDateSpy = jest + .spyOn(DateUtils, "formatFullDate") + .mockImplementation((_date, _showTwelveHour, showSeconds) => + showSeconds === false ? "FULL_NO_SECONDS" : "SENT_AT", + ); + + const vm = new MessageTimestampViewModel({ + ts: nowDate.getTime(), + showFullDate: true, + showSeconds: false, + }); + + expect(vm.getSnapshot()).toMatchObject({ + ts: "FULL_NO_SECONDS", + tsSentAt: "SENT_AT", + }); + expect(formatFullDateSpy).toHaveBeenCalled(); + }); + + it("should use full time when showSeconds is true without full date", () => { + jest.spyOn(DateUtils, "formatFullDate").mockReturnValue("SENT_AT"); + const formatFullTimeSpy = jest.spyOn(DateUtils, "formatFullTime").mockReturnValue("FULL_TIME"); + const formatTimeSpy = jest.spyOn(DateUtils, "formatTime").mockReturnValue("TIME"); + + const vm = new MessageTimestampViewModel({ + ts: nowDate.getTime(), + showSeconds: true, + }); + + expect(vm.getSnapshot()).toMatchObject({ + ts: "FULL_TIME", + tsSentAt: "SENT_AT", + }); + expect(formatFullTimeSpy).toHaveBeenCalled(); + expect(formatTimeSpy).not.toHaveBeenCalled(); + }); + + it("should include tooltip inhibition and href in the snapshot", () => { + const vm = new MessageTimestampViewModel({ + ts: nowDate.getTime(), + inhibitTooltip: true, + href: "https://example.test", + }); + + expect(vm.getSnapshot()).toMatchObject({ + inhibitTooltip: true, + href: "https://example.test", + }); + }); +}); diff --git a/test/viewmodels/message-body/ReactionsRowButtonTooltipViewModel-test.tsx b/apps/web/test/viewmodels/message-body/ReactionsRowButtonTooltipViewModel-test.tsx similarity index 100% rename from test/viewmodels/message-body/ReactionsRowButtonTooltipViewModel-test.tsx rename to apps/web/test/viewmodels/message-body/ReactionsRowButtonTooltipViewModel-test.tsx diff --git a/apps/web/test/viewmodels/message-body/ReactionsRowButtonViewModel-test.tsx b/apps/web/test/viewmodels/message-body/ReactionsRowButtonViewModel-test.tsx new file mode 100644 index 0000000000..27aa901653 --- /dev/null +++ b/apps/web/test/viewmodels/message-body/ReactionsRowButtonViewModel-test.tsx @@ -0,0 +1,171 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import { EventType, type MatrixClient, type MatrixEvent, RelationType, type Room } from "matrix-js-sdk/src/matrix"; + +import { + ReactionsRowButtonViewModel, + type ReactionsRowButtonViewModelProps, +} from "../../../src/viewmodels/message-body/ReactionsRowButtonViewModel"; +import { type ReactionsRowButtonTooltipViewModel } from "../../../src/viewmodels/message-body/ReactionsRowButtonTooltipViewModel"; +import { createTestClient, mkEvent, mkStubRoom } from "../../test-utils"; +import dis from "../../../src/dispatcher/dispatcher"; + +jest.mock("../../../src/dispatcher/dispatcher"); + +describe("ReactionsRowButtonViewModel", () => { + let client: MatrixClient; + let room: Room; + let mxEvent: MatrixEvent; + + const createReactionEvent = (senderId: string, key = "👍"): MatrixEvent => { + return mkEvent({ + event: true, + type: "m.reaction", + room: room.roomId, + user: senderId, + content: { + "m.relates_to": { + rel_type: "m.annotation", + event_id: mxEvent.getId(), + key, + }, + }, + }); + }; + + const createProps = (overrides?: Partial): ReactionsRowButtonViewModelProps => ({ + client, + mxEvent, + content: "👍", + count: 2, + reactionEvents: [createReactionEvent("@alice:example.org"), createReactionEvent("@bob:example.org")], + disabled: false, + customReactionImagesEnabled: false, + ...overrides, + }); + + const getTooltipVm = (vm: ReactionsRowButtonViewModel): ReactionsRowButtonTooltipViewModel => + vm.getSnapshot().tooltipVm as ReactionsRowButtonTooltipViewModel; + const getAriaLabel = (vm: ReactionsRowButtonViewModel): string | undefined => + (vm.getSnapshot() as { ariaLabel?: string }).ariaLabel; + + beforeEach(() => { + jest.clearAllMocks(); + client = createTestClient(); + room = mkStubRoom("!room:example.org", "Test Room", client); + jest.spyOn(client, "getRoom").mockReturnValue(room); + mxEvent = mkEvent({ + event: true, + type: "m.room.message", + room: room.roomId, + user: "@sender:example.org", + content: { body: "Test message", msgtype: "m.text" }, + }); + }); + + it("updates count with merge and does not touch tooltip props", () => { + const vm = new ReactionsRowButtonViewModel(createProps()); + const tooltipSetPropsSpy = jest.spyOn(getTooltipVm(vm), "setProps"); + const listener = jest.fn(); + vm.subscribe(listener); + + vm.setCount(5); + + expect(vm.getSnapshot().count).toBe(5); + expect(listener).toHaveBeenCalledTimes(1); + expect(tooltipSetPropsSpy).not.toHaveBeenCalled(); + + vm.setCount(5); + + expect(listener).toHaveBeenCalledTimes(2); + }); + + it("includes an ariaLabel in the snapshot", () => { + const vm = new ReactionsRowButtonViewModel(createProps()); + + expect(getAriaLabel(vm)).toContain("reacted with 👍"); + }); + + it("updates selected state with myReactionEvent without touching tooltip props", () => { + const vm = new ReactionsRowButtonViewModel(createProps()); + const tooltipSetPropsSpy = jest.spyOn(getTooltipVm(vm), "setProps"); + const listener = jest.fn(); + vm.subscribe(listener); + const myReactionEvent = createReactionEvent("@me:example.org"); + + vm.setMyReactionEvent(myReactionEvent); + + expect(vm.getSnapshot().isSelected).toBe(true); + expect(listener).toHaveBeenCalledTimes(1); + expect(tooltipSetPropsSpy).not.toHaveBeenCalled(); + }); + + it("updates disabled state without touching tooltip props", () => { + const vm = new ReactionsRowButtonViewModel(createProps({ disabled: false })); + const tooltipSetPropsSpy = jest.spyOn(getTooltipVm(vm), "setProps"); + + vm.setDisabled(true); + + expect(vm.getSnapshot().isDisabled).toBe(true); + expect(tooltipSetPropsSpy).not.toHaveBeenCalled(); + }); + + it("setReactionData forwards to tooltip via setProps and updates snapshot content", () => { + const vm = new ReactionsRowButtonViewModel(createProps()); + const tooltipSetPropsSpy = jest.spyOn(getTooltipVm(vm), "setProps"); + const reactionEvents = [createReactionEvent("@carol:example.org", "👎")]; + + vm.setReactionData("👎", reactionEvents, false); + + expect(vm.getSnapshot().content).toBe("👎"); + expect(tooltipSetPropsSpy).toHaveBeenCalledWith({ + content: "👎", + reactionEvents, + customReactionImagesEnabled: false, + }); + + vm.setReactionData("👎", reactionEvents, false); + + expect(tooltipSetPropsSpy).toHaveBeenCalledTimes(2); + }); + + it("redacts reaction on click when myReactionEvent exists", () => { + const myReactionEvent = createReactionEvent("@me:example.org"); + const vm = new ReactionsRowButtonViewModel(createProps({ myReactionEvent })); + + vm.onClick(); + + expect(client.redactEvent).toHaveBeenCalledWith(room.roomId, myReactionEvent.getId()); + expect(client.sendEvent).not.toHaveBeenCalled(); + }); + + it("sends reaction and dispatches message_sent when no myReactionEvent exists", () => { + const vm = new ReactionsRowButtonViewModel(createProps()); + + vm.onClick(); + + expect(client.sendEvent).toHaveBeenCalledWith(room.roomId, EventType.Reaction, { + "m.relates_to": { + rel_type: RelationType.Annotation, + event_id: mxEvent.getId(), + key: "👍", + }, + }); + expect(dis.dispatch).toHaveBeenCalledWith({ action: "message_sent" }); + }); + + it("does nothing on click when disabled", () => { + const vm = new ReactionsRowButtonViewModel(createProps({ disabled: true })); + + vm.onClick(); + + expect(client.redactEvent).not.toHaveBeenCalled(); + expect(client.sendEvent).not.toHaveBeenCalled(); + expect(dis.dispatch).not.toHaveBeenCalled(); + }); +}); diff --git a/test/viewmodels/profile/DisambiguatedProfileViewModel-test.tsx b/apps/web/test/viewmodels/profile/DisambiguatedProfileViewModel-test.tsx similarity index 91% rename from test/viewmodels/profile/DisambiguatedProfileViewModel-test.tsx rename to apps/web/test/viewmodels/profile/DisambiguatedProfileViewModel-test.tsx index 270f3e66b4..faf2edecfd 100644 --- a/test/viewmodels/profile/DisambiguatedProfileViewModel-test.tsx +++ b/apps/web/test/viewmodels/profile/DisambiguatedProfileViewModel-test.tsx @@ -75,13 +75,27 @@ describe("DisambiguatedProfileViewModel", () => { const subscriber = jest.fn(); vm.subscribe(subscriber); - onClick({} as never); + vm.onClick?.({} as never); expect(onClick).toHaveBeenCalledTimes(1); expect(subscriber).not.toHaveBeenCalled(); expect(vm.getSnapshot()).toBe(prevSnapshot); }); + it("should keep onClick bound when extracted as a callback", () => { + const onClick = jest.fn(); + const vm = new DisambiguatedProfileViewModel({ + member, + fallbackName: "Fallback", + onClick, + }); + + const clickHandler = vm.onClick; + + expect(() => clickHandler?.({} as never)).not.toThrow(); + expect(onClick).toHaveBeenCalledTimes(1); + }); + it("should emit snapshot update when fallbackName changes", () => { const vm = new DisambiguatedProfileViewModel({ member: null, diff --git a/test/viewmodels/right-panel/WidgetContextMenuViewModel-test.tsx b/apps/web/test/viewmodels/right-panel/WidgetContextMenuViewModel-test.tsx similarity index 100% rename from test/viewmodels/right-panel/WidgetContextMenuViewModel-test.tsx rename to apps/web/test/viewmodels/right-panel/WidgetContextMenuViewModel-test.tsx diff --git a/test/viewmodels/room-list/RoomListHeaderViewModel-test.ts b/apps/web/test/viewmodels/room-list/RoomListHeaderViewModel-test.ts similarity index 94% rename from test/viewmodels/room-list/RoomListHeaderViewModel-test.ts rename to apps/web/test/viewmodels/room-list/RoomListHeaderViewModel-test.ts index 7025abe7c1..936389603d 100644 --- a/test/viewmodels/room-list/RoomListHeaderViewModel-test.ts +++ b/apps/web/test/viewmodels/room-list/RoomListHeaderViewModel-test.ts @@ -25,6 +25,7 @@ import { } from "../../../src/utils/space"; import { createTestClient, mkSpace } from "../../test-utils"; import { createRoom, hasCreateRoomRights } from "../../../src/viewmodels/room-list/utils"; +import PosthogTrackers from "../../../src/PosthogTrackers"; jest.mock("../../../src/PosthogTrackers", () => ({ trackInteraction: jest.fn(), @@ -276,10 +277,25 @@ describe("RoomListHeaderViewModel", () => { const resortSpy = jest.spyOn(RoomListStoreV3.instance, "resort").mockImplementation(jest.fn()); vm = new RoomListHeaderViewModel({ matrixClient, spaceStore: SpaceStore.instance }); vm.sort(option); - expect(resortSpy).toHaveBeenCalledWith(expectedAlgorithm); }); + it("should track analytics on resort", () => { + jest.spyOn(RoomListStoreV3.instance, "activeSortAlgorithm", "get").mockReturnValue( + SortingAlgorithm.Alphabetic, + ); + PosthogTrackers.trackRoomListSortingAlgorithmChange = jest.fn(); + + vm = new RoomListHeaderViewModel({ matrixClient, spaceStore: SpaceStore.instance }); + jest.spyOn(RoomListStoreV3.instance, "resort").mockImplementation(jest.fn()); + vm.sort("unread-first"); + + expect(PosthogTrackers.trackRoomListSortingAlgorithmChange).toHaveBeenCalledWith( + SortingAlgorithm.Alphabetic, + SortingAlgorithm.Unread, + ); + }); + it("should toggle message preview from enabled to disabled", () => { jest.spyOn(SettingsStore, "getValue").mockImplementation((settingName: string) => { if (settingName === "RoomList.showMessagePreview") return true; diff --git a/test/viewmodels/room-list/RoomListItemViewModel-test.tsx b/apps/web/test/viewmodels/room-list/RoomListItemViewModel-test.tsx similarity index 100% rename from test/viewmodels/room-list/RoomListItemViewModel-test.tsx rename to apps/web/test/viewmodels/room-list/RoomListItemViewModel-test.tsx diff --git a/test/viewmodels/room-list/RoomListSearchViewModel-test.ts b/apps/web/test/viewmodels/room-list/RoomListSearchViewModel-test.ts similarity index 100% rename from test/viewmodels/room-list/RoomListSearchViewModel-test.ts rename to apps/web/test/viewmodels/room-list/RoomListSearchViewModel-test.ts diff --git a/test/viewmodels/room-list/RoomListViewViewModel-test.tsx b/apps/web/test/viewmodels/room-list/RoomListViewViewModel-test.tsx similarity index 100% rename from test/viewmodels/room-list/RoomListViewViewModel-test.tsx rename to apps/web/test/viewmodels/room-list/RoomListViewViewModel-test.tsx diff --git a/test/viewmodels/room-list/utils-test.ts b/apps/web/test/viewmodels/room-list/utils-test.ts similarity index 100% rename from test/viewmodels/room-list/utils-test.ts rename to apps/web/test/viewmodels/room-list/utils-test.ts diff --git a/test/viewmodels/room/RoomStatusBar-test.ts b/apps/web/test/viewmodels/room/RoomStatusBar-test.ts similarity index 100% rename from test/viewmodels/room/RoomStatusBar-test.ts rename to apps/web/test/viewmodels/room/RoomStatusBar-test.ts diff --git a/tsconfig.json b/apps/web/tsconfig.json similarity index 86% rename from tsconfig.json rename to apps/web/tsconfig.json index b313ad09fb..70a03bcc8a 100644 --- a/tsconfig.json +++ b/apps/web/tsconfig.json @@ -18,11 +18,11 @@ "strict": true, "paths": { "jest-matrix-react": ["./test/test-utils/jest-matrix-react"], - "rollup/parseAst": ["./node_modules/rollup/dist/parseAst"] + "rollup/parseAst": ["../../node_modules/rollup/dist/parseAst"] } }, "include": [ - "./node_modules/matrix-js-sdk/src/@types/*.d.ts", + "../../node_modules/matrix-js-sdk/src/@types/*.d.ts", "./src/**/*.ts", "./src/**/*.tsx", "./test/**/*.ts", diff --git a/tsconfig.module_system.json b/apps/web/tsconfig.module_system.json similarity index 100% rename from tsconfig.module_system.json rename to apps/web/tsconfig.module_system.json diff --git a/webpack.config.ts b/apps/web/webpack.config.ts similarity index 99% rename from webpack.config.ts rename to apps/web/webpack.config.ts index 6a1abfc8cf..5595881b91 100644 --- a/webpack.config.ts +++ b/apps/web/webpack.config.ts @@ -91,7 +91,7 @@ try { // Get the root of a node_modules dependency the name of its import function getPackageRoot(dep: string, target = "package.json"): string { const targetPath = import.meta.resolve(`${dep}${target ? "/" + target : ""}`); - return path.dirname(targetPath.startsWith("file://") ? targetPath.slice(7) : targetPath); + return path.dirname(fileURLToPath(targetPath)); } function parseOverridesToReplacements(overrides: Record): webpack.NormalModuleReplacementPlugin[] { @@ -438,7 +438,7 @@ export default (env: string, argv: Record): webpack.Configuration = type: "javascript/auto", use: [ { - loader: path.resolve("./recorder-worklet-loader.cjs"), + loader: path.join(__dirname, "recorder-worklet-loader.cjs"), }, { loader: "babel-loader", diff --git a/developer_guide.md b/developer_guide.md index e7c9655b83..e6018fd7f5 100644 --- a/developer_guide.md +++ b/developer_guide.md @@ -32,11 +32,11 @@ pnpm install popd ``` -Clone the repo and switch to the `element-web` directory: +Clone the repo and switch to the `element-web/apps/web` directory: ```bash git clone https://github.com/element-hq/element-web.git -cd element-web +cd element-web/apps/web ``` Configure the app by copying `config.sample.json` to `config.json` and diff --git a/docs/MVVM.md b/docs/MVVM.md index d6f182bd2e..01efc71904 100644 --- a/docs/MVVM.md +++ b/docs/MVVM.md @@ -47,7 +47,7 @@ interface FooViewActions { // ViewModel is an object (usually a class) that implements both the interfaces listed above. // https://github.com/element-hq/element-web/blob/develop/packages/shared-components/src/ViewModel.ts -export type FooViewModel = ViewModel & FooViewActions; +export type FooViewModel = ViewModel; interface FooViewProps { // Ideally the view only depends on the view model i.e you don't expect any other props here. @@ -127,6 +127,20 @@ export class FooViewModel extends BaseViewModel implemen } ``` +#### 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 +public doSomething = (): 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.
    diff --git a/docs/config.md b/docs/config.md index a77884c212..f7b2fd6e8d 100644 --- a/docs/config.md +++ b/docs/config.md @@ -260,7 +260,7 @@ When Element is deployed alongside a homeserver with SSO-only login, some option 1. `logout_redirect_url`: Optional URL to redirect the user to after they have logged out. Some SSO systems support a page that the user can be sent to in order to log them out of that system too, making logout symmetric between Element and the SSO system. 2. `sso_redirect_options`: Options to define how to handle unauthenticated users. If the object contains `"immediate": true`, then - all unauthenticated users will be automatically redirected to the SSO system to start their login. If instead you'd only like to + all unauthenticated users will be automatically redirected to the SSO/OIDC system to start their login. If instead you'd only like to have users which land on the welcome page to be redirected, use `"on_welcome_page": true`. Additionally, there is an option to redirect anyone landing on the login page, by using `"on_login_page": true`. As an example: ```json @@ -276,8 +276,6 @@ When Element is deployed alongside a homeserver with SSO-only login, some option ## Native OIDC -Native OIDC support is currently in labs and is subject to change. - Static OIDC Client IDs are preferred and can be specified under `oidc_static_clients` as a mapping from `issuer` to configuration object containing `client_id`. Issuer must have a trailing forward slash. As an example: diff --git a/docs/monorepo.md b/docs/monorepo.md new file mode 100644 index 0000000000..9af7347484 --- /dev/null +++ b/docs/monorepo.md @@ -0,0 +1,45 @@ +## Monorepo + +Some words about the structure of monorepo we are using here. + +### Structure + +The monorepo is focused around multiple Typescript projects coming together to form an Element Web & Element Desktop app. +Some of the underlying typescript projects are useful for re-use elsewhere, +e.g. `@element-hq/web-shared-components` is reused by https://github.com/element-hq/aurora. + +- `apps` - this directory holds the apps we build, `element-web` & `element-desktop` + - Things in here are not published to npm + - Things in here have very non-standard publishing steps, e.g. Element Desktop `.deb` ships via reprepro. + - Things in here are in lock-step versions with each other + - Things in here are represented as a group in Immutable Github Releases + - Things in here support pre-releases & hotfixes +- `packages` - this directory holds some npm packages we maintain in order to build the `apps` + - Things in here are published to npm + - Things in here respect SemVer + - Things in here are independently versioned + - Things in here have a very simple publishing stage of `pnpm publish` + - Things in here do not support pre-releases & hotfixes +- `modules` - this directory will hold some Element Web/Desktop modules we maintain in order to add environment-specific functionalities atop Element + - Things in here are not published to npm + +### Branches + +- `develop` - this is the default branch and should always be buildable, this is what developers use as a base branch for their pull requests + - Deployed via CD to develop.element.io +- #TODO should we just use short-lived release branches? We'd need to effectively interlace them for the various packages which feels messy +- `staging` - this branch is used to build the latest/next release. + - During a normal release cycle, `develop` is merged into `staging` to "cut" a release candidate + - Additional changes such as version bumps & changelogs are committed on top + - During a hotfix/security release, changes are directly cherry-picked to `staging` to "cut" a release based on the last release rather than `develop` + - When a release is finished, i.e. we've shipped the final release for a given version, we merge `staging->develop` to maintain continuity +- `backport/*` - these branches are used for cherry-picking entire pull requests from `develop` to `staging`, either to patch a release candidate, or to perform a hotfix release +- `/*` - these feature branches are used for development, and may branch off `develop` or another feature branch + +### Tags + +- `v*` - these tags are used by the releases shown in the Github Releases UI, as in, the overall app release group +- `@*` - these tags represent the release state of an individual npm package from the `packages/*` dir + +Ultimately, the treatment of the 3 types of submodules we host in this repository is quite asymmetrical but this is by design, +to simplify processes around projects which do not need the complexities of element-web & element-desktop. diff --git a/knip.ts b/knip.ts index 42686dbd4a..ca0345dfd3 100644 --- a/knip.ts +++ b/knip.ts @@ -4,8 +4,27 @@ export default { workspaces: { "packages/shared-components": { entry: ["src/index.ts"], + ignoreBinaries: [ + // False positives + "vite", + "typedoc", + ], + ignoreDependencies: [ + // We import this in some tests, transitive dep of @playwright/test + "playwright-core", + // False positives + "@testing-library/jest-dom", + "@vitejs/plugin-react", + "expect", + "vitest-browser-react", + "vitest-sonar-reporter", + ], }, - ".": { + "packages/playwright-common": { + entry: ["playwright-screenshots.sh"], + ignoreDependencies: ["@playwright/test", "wait-on"], + }, + "apps/web": { entry: [ "src/serviceworker/index.ts", "src/workers/*.worker.ts", @@ -16,7 +35,6 @@ export default { "test/**", "res/decoder-ring/**", "res/jitsi_external_api.min.js", - "docs/**", ], ignore: [ // Keep for now @@ -24,43 +42,58 @@ export default { "src/hooks/useTimeout.ts", "src/components/views/elements/InfoTooltip.tsx", "src/components/views/elements/StyledCheckbox.tsx", + ], + ignoreBinaries: [ + // False positive + "webpack-dev-server", + ], + ignoreDependencies: [ + // Used by jest + "babel-jest", + // Used by babel + "@babel/runtime", + "@babel/plugin-transform-class-properties", + // Referenced in PCSS + "github-markdown-css", + // False positive + "sw.js", + // Used by webpack + "process", + "util", + // Embedded into webapp + "@element-hq/element-call-embedded", + // False-positive jest dep + "vitest-environment-jest-fixed-jsdom", - "packages/**/*", + // We import this in some tests, transitive dep of @playwright/test + "playwright-core", + + // Used by matrix-js-sdk, which means we have to include them as a + // dependency so that // we can run `tsc` (since we import the typescript + // source of js-sdk, rather than the transpiled and annotated JS like you + // would with a normal library). + "@types/content-type", + "@types/sdp-transform", + ], + }, + ".": { + entry: ["scripts/**", "docs/**"], + ignoreBinaries: ["lint:types", "lint:js", "lint:style"], + ignoreDependencies: [ + // Required for `action-validator` + "@action-validator/*", + // Used for git pre-commit hooks + "husky", ], }, }, - ignoreBinaries: ["test:storybook", "test:unit", "build:storybook"], - ignoreDependencies: [ - // Required for `action-validator` - "@action-validator/*", - // Used for git pre-commit hooks - "husky", - // Used by jest - "babel-jest", - // Used by babel - "@babel/runtime", - "@babel/plugin-transform-class-properties", - // Referenced in PCSS - "github-markdown-css", - // False positive - "sw.js", - // Used by webpack - "process", - "util", - // Embedded into webapp - "@element-hq/element-call-embedded", - // Transitive dep of jest - "vitest-environment-jest-fixed-jsdom", - - // We import this in some tests, transitive dep of @playwright/test - "playwright-core", - - // Used by matrix-js-sdk, which means we have to include them as a - // dependency so that // we can run `tsc` (since we import the typescript - // source of js-sdk, rather than the transpiled and annotated JS like you - // would with a normal library). - "@types/content-type", - "@types/sdp-transform", + ignoreBinaries: [ + // False positives + "playwright", + "build:storybook", + "test:storybook", + "test:unit", + "vendor:jitsi", ], ignoreExportsUsedInFile: true, nx: { diff --git a/localazy.json b/localazy.json index 669ac657c3..bd037af428 100644 --- a/localazy.json +++ b/localazy.json @@ -8,15 +8,15 @@ "features": ["plural_object", "filter_untranslated"], "files": [ { - "pattern": "src/i18n/strings/en_EN.json", + "pattern": "apps/web/src/i18n/strings/en_EN.json", "file": "element-web.json", "lang": "inherited" }, { "group": "existing", - "pattern": "src/i18n/strings/*.json", + "pattern": "apps/web/src/i18n/strings/*.json", "file": "element-web.json", - "excludes": ["src/i18n/strings/en_EN.json"], + "excludes": ["apps/web/src/i18n/strings/en_EN.json"], "lang": "${autodetectLang}" }, { @@ -38,7 +38,7 @@ "files": [ { "conditions": "equals: ${file}, element-web.json", - "output": "src/i18n/strings/${langLsrUnderscore}.json" + "output": "apps/web/src/i18n/strings/${langLsrUnderscore}.json" }, { "conditions": "equals: ${file}, shared-components.json", diff --git a/nx.json b/nx.json index fa9df91de7..58b3b014cd 100644 --- a/nx.json +++ b/nx.json @@ -5,5 +5,8 @@ "build": { "dependsOn": ["^build", "prebuild:*"] } + }, + "namedInputs": { + "src": ["{projectRoot}/src/**/*"] } } diff --git a/package.json b/package.json index f4c01f62a0..9460ea5a43 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "element-web", - "version": "1.12.10", + "name": "element-web-monorepo", + "version": "0.0.0", "description": "Element: the future of secure communication", "author": "New Vector Ltd.", "repository": { @@ -9,34 +9,15 @@ }, "license": "SEE LICENSE IN README.md", "type": "module", - "matrix_i18n_extra_translation_funcs": [ - "UserFriendlyError" - ], "scripts": { - "i18n": "matrix-gen-i18n src res && pnpm i18n:sort && pnpm i18n:lint", - "i18n:sort": "matrix-sort-i18n src/i18n/strings/en_EN.json && pnpm --dir packages/shared-components i18n:sort", - "i18n:lint": "matrix-i18n-lint && prettier --log-level=silent --write src/i18n/strings/ --ignore-path /dev/null && pnpm --dir packages/shared-components i18n:lint", - "i18n:diff": "cp src/i18n/strings/en_EN.json src/i18n/strings/en_EN_orig.json && pnpm i18n && matrix-compare-i18n-files src/i18n/strings/en_EN_orig.json src/i18n/strings/en_EN.json", - "rethemendex": "sh ./res/css/rethemendex.sh", - "build": "nx build", - "build-stats": "nx build --json=webpack-stats.json", - "vendor:modernizr": "modernizr -c .modernizr.json -d src/vector/modernizr.js && mv src/vector/modernizr.js src/vector/modernizr.cjs", - "vendor:jitsi": "curl -s https://meet.element.io/libs/external_api.min.js > ./res/jitsi_external_api.min.js", - "dist": "./scripts/package.sh", - "start": "nx start", - "lint": "pnpm lint:types && pnpm lint:js && pnpm lint:style && pnpm lint:workflows", - "lint:js": "eslint --max-warnings 0 src test playwright module_system && prettier --check .", - "lint:js-fix": "prettier --log-level=warn --write . && eslint --fix src test playwright module_system", - "lint:types": "nx lint:types", - "lint:style": "stylelint \"res/css/**/*.pcss\"", + "i18n": "pnpm -r i18n", + "i18n:sort": "pnpm -r i18n:sort", + "i18n:lint": "pnpm -r i18n:lint", + "lint": "pnpm -r lint:types && pnpm lint:prettier && pnpm -r lint:js && pnpm -r lint:style && pnpm lint:workflows && pnpm lint:knip", + "lint:prettier": "prettier --check .", + "lint:prettier-fix": "prettier --log-level=warn --write .", "lint:workflows": "find .github/workflows -type f \\( -iname '*.yaml' -o -iname '*.yml' \\) | xargs -I {} sh -c 'echo \"Linting {}\"; action-validator \"{}\"'", "lint:knip": "knip", - "test": "nx test:unit", - "test:playwright": "playwright test", - "test:playwright:open": "pnpm test:playwright --ui", - "test:playwright:screenshots": "playwright-screenshots-experimental pnpm playwright test --update-snapshots --project=Chrome --grep @screenshot", - "coverage": "pnpm test --coverage", - "analyse:webpack-bundles": "webpack-bundle-analyzer webpack-stats.json webapp", "postinstall": "node scripts/pnpm-link.ts" }, "resolutions": { @@ -46,227 +27,30 @@ "oidc-client-ts": "3.4.1", "jwt-decode": "4.0.0", "caniuse-lite": "1.0.30001766", + "markdown-it": "14.1.1", "testcontainers": "^11.0.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0", "wrap-ansi": "npm:wrap-ansi@^7.0.0", - "matrix-widget-api": "^1.16.1" - }, - "dependencies": { - "@babel/runtime": "^7.12.5", - "@element-hq/element-web-module-api": "catalog:", - "@element-hq/web-shared-components": "workspace:*", - "@fontsource/fira-code": "^5", - "@fontsource/inter": "^5", - "@formatjs/intl-segmenter": "^12.0.0", - "@matrix-org/analytics-events": "^0.31.0", - "@matrix-org/emojibase-bindings": "^1.5.0", - "@matrix-org/react-sdk-module-api": "^2.4.0", - "@sentry/browser": "^10.0.0", - "@types/png-chunks-extract": "^1.0.2", - "@vector-im/compound-design-tokens": "catalog:", - "@vector-im/compound-web": "catalog:", - "@vector-im/matrix-wysiwyg": "2.40.0", - "@zxcvbn-ts/core": "^3.0.4", - "@zxcvbn-ts/language-common": "^3.0.4", - "@zxcvbn-ts/language-en": "^3.0.2", - "await-lock": "^3.0.0", - "bloom-filters": "^3.0.3", - "blurhash": "^2.0.3", - "browserslist": "^4.23.2", - "classnames": "^2.2.6", - "commonmark": "^0.31.0", - "css-tree": "^3.0.0", - "diff-dom": "^5.0.0", - "diff-match-patch": "^1.0.5", - "domutils": "^3.2.2", - "emojibase-regex": "^17.0.0", - "escape-html": "^1.0.3", - "file-saver": "^2.0.5", - "filesize": "11.0.13", - "github-markdown-css": "^5.5.1", - "glob-to-regexp": "^0.4.1", - "highlight.js": "^11.3.1", - "html-entities": "^2.0.0", - "html-react-parser": "^5.2.2", - "is-ip": "^5.0.0", - "js-xxhash": "^5.0.0", - "jsrsasign": "^11.0.0", - "jszip": "^3.7.0", - "katex": "^0.16.0", - "linkify-html": "4.3.2", - "linkify-react": "4.3.2", - "linkify-string": "4.3.2", - "linkifyjs": "4.3.2", - "lodash": "npm:lodash-es@^4.17.21", - "maplibre-gl": "^5.0.0", - "matrix-encrypt-attachment": "^1.0.3", - "matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop", "matrix-widget-api": "^1.16.1", - "memoize-one": "^6.0.0", - "mime": "^4.0.4", - "oidc-client-ts": "^3.0.1", - "opus-recorder": "^8.0.3", - "pako": "^2.0.3", - "png-chunks-extract": "^1.0.0", - "posthog-js": "1.336.4", - "qrcode": "1.5.4", - "re-resizable": "6.11.2", - "react": "catalog:", - "react-beautiful-dnd": "^13.1.0", - "react-blurhash": "^0.3.0", - "react-dom": "catalog:", - "react-focus-lock": "^2.5.1", - "react-string-replace": "^2.0.0", - "react-transition-group": "^4.4.1", - "rfc4648": "^1.4.0", - "sanitize-filename": "^1.6.3", - "sanitize-html": "2.17.0", - "tar-js": "^0.3.0", - "ua-parser-js": "1.0.40", - "uuid": "^13.0.0", - "what-input": "^5.2.10" + "qs": "6.14.2" }, + "dependencies": {}, "devDependencies": { "@action-validator/cli": "^0.6.0", "@action-validator/core": "^0.6.0", - "@babel/core": "^7.12.10", - "@babel/eslint-parser": "^7.12.10", - "@babel/eslint-plugin": "^7.12.10", - "@babel/plugin-proposal-decorators": "^7.25.9", - "@babel/plugin-proposal-export-default-from": "^7.12.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-class-properties": "^7.12.1", - "@babel/plugin-transform-class-static-block": "^7.26.0", - "@babel/plugin-transform-logical-assignment-operators": "^7.20.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.12.1", - "@babel/plugin-transform-numeric-separator": "^7.12.7", - "@babel/plugin-transform-object-rest-spread": "^7.12.1", - "@babel/plugin-transform-optional-chaining": "^7.12.7", - "@babel/plugin-transform-runtime": "^7.12.10", - "@babel/preset-env": "^7.12.11", - "@babel/preset-react": "^7.12.10", - "@babel/preset-typescript": "^7.12.7", - "@babel/runtime": "^7.12.5", - "@casualbot/jest-sonar-reporter": "2.5.0", - "@element-hq/element-call-embedded": "0.16.3", - "@element-hq/element-web-playwright-common": "catalog:", - "@element-hq/element-web-playwright-common-local": "workspace:*", - "@fetch-mock/jest": "^0.2.20", - "@jest/globals": "^30.2.0", + "@nx-tools/nx-container": "^7.2.1", "@nx/jest": "^22.5.0", - "@peculiar/webcrypto": "^1.4.3", - "@playwright/test": "catalog:", - "@principalstudio/html-webpack-inject-preload": "^1.2.7", - "@sentry/webpack-plugin": "^4.0.0", - "@stylistic/eslint-plugin": "^5.0.0", - "@svgr/webpack": "^8.0.0", - "@testing-library/dom": "^10.4.0", - "@testing-library/jest-dom": "^6.4.8", - "@testing-library/react": "^16.0.0", - "@testing-library/user-event": "^14.5.2", - "@types/commonmark": "^0.27.4", - "@types/content-type": "^1.1.9", - "@types/counterpart": "^0.18.1", - "@types/css-tree": "^2.3.8", - "@types/diff-match-patch": "^1.0.32", - "@types/escape-html": "^1.0.1", - "@types/express": "^5.0.0", - "@types/file-saver": "^2.0.3", - "@types/glob-to-regexp": "^0.4.1", - "@types/jest": "30.0.0", - "@types/jitsi-meet": "^2.0.2", - "@types/jsrsasign": "^10.5.4", - "@types/lodash": "^4.14.168", - "@types/minimist": "^1.2.5", - "@types/modernizr": "^3.5.3", "@types/node": "22", - "@types/pako": "^2.0.0", - "@types/postcss-import": "^14.0.3", - "@types/qrcode": "^1.3.5", - "@types/react": "catalog:", - "@types/react-beautiful-dnd": "^13.0.0", - "@types/react-dom": "catalog:", - "@types/react-transition-group": "^4.4.0", - "@types/sanitize-html": "2.16.0", - "@types/sdp-transform": "^2.4.10", - "@types/semver": "^7.5.8", - "@types/tar-js": "^0.3.5", - "@types/ua-parser-js": "^0.7.36", - "@typescript-eslint/eslint-plugin": "^8.19.0", - "@typescript-eslint/parser": "^8.19.0", - "babel-jest": "^30.0.0", - "babel-loader": "^10.0.0", - "babel-plugin-jsx-remove-data-test-id": "^3.0.0", - "blob-polyfill": "^9.0.0", - "chokidar": "^5.0.0", - "copy-webpack-plugin": "^13.0.0", "cronstrue": "^3.0.0", - "css-loader": "^7.0.0", - "css-minimizer-webpack-plugin": "^7.0.0", - "dotenv": "^17.0.0", - "eslint": "8.57.1", - "eslint-config-google": "^0.14.0", - "eslint-config-prettier": "^10.0.0", - "eslint-plugin-deprecate": "0.8.7", - "eslint-plugin-import": "^2.25.4", - "eslint-plugin-jest": "^29.0.0", - "eslint-plugin-jsx-a11y": "^6.5.1", "eslint-plugin-matrix-org": "^3.0.0", - "eslint-plugin-react": "^7.28.0", - "eslint-plugin-react-compiler": "^19.0.0-beta-df7b47d-20241124", - "eslint-plugin-react-hooks": "^7.0.0", - "eslint-plugin-unicorn": "^56.0.0", - "express": "^5.0.0", - "fake-indexeddb": "^6.0.0", - "file-loader": "^6.0.0", - "html-webpack-plugin": "^5.5.3", "husky": "^9.0.0", - "identity-obj-proxy": "^3.0.0", - "jest": "^30.0.0", - "jest-canvas-mock": "^2.5.2", - "jest-environment-jsdom": "^30.2.0", - "jest-fixed-jsdom": "^0.0.11", - "jest-mock": "^30.0.0", - "jest-raw-loader": "^1.0.1", - "jsqr": "^1.4.0", "knip": "^5.36.2", "lint-staged": "^16.0.0", - "matrix-web-i18n": "catalog:", - "mini-css-extract-plugin": "2.10.0", + "lodash": "^4.17.21", "minimist": "^1.2.6", - "modernizr": "^3.12.0", - "nx": "22.5.0", - "postcss": "8.5.6", - "postcss-easings": "4.0.0", - "postcss-hexrgba": "2.1.0", - "postcss-import": "16.1.1", - "postcss-loader": "8.2.0", - "postcss-mixins": "12.0.0", - "postcss-nested": "7.0.2", - "postcss-preset-env": "11.1.1", - "postcss-scss": "4.0.9", - "postcss-simple-vars": "7.0.1", + "nx": "22.5.1", "prettier": "3.8.1", - "process": "^0.11.10", - "raw-loader": "^4.0.2", - "rimraf": "^6.0.0", - "semver": "^7.5.2", - "source-map-loader": "^5.0.0", - "stylelint": "^17.0.0", - "stylelint-config-standard": "^40.0.0", - "stylelint-scss": "^7.0.0", - "stylelint-value-no-unknown-custom-properties": "^6.0.1", - "terser-webpack-plugin": "^5.3.9", - "testcontainers": "^11.0.0", "typescript": "catalog:", - "util": "^0.12.5", - "web-streams-polyfill": "^4.0.0", - "webpack": "^5.89.0", - "webpack-bundle-analyzer": "^5.0.0", - "webpack-cli": "^6.0.0", - "webpack-dev-server": "^5.0.0", - "webpack-retry-chunk-load-plugin": "^3.1.1", - "webpack-version-file-plugin": "^0.5.0", "yaml": "^2.3.3" }, "pnpm": { @@ -300,14 +84,9 @@ "react-beautiful-dnd": "13" } }, - "@casualbot/jest-sonar-reporter": { - "outputDirectory": "coverage", - "outputName": "jest-sonar-report.xml", - "relativePaths": true - }, "engines": { "node": ">=22.18" }, - "packageManager": "pnpm@10.28.2+sha512.41872f037ad22f7348e3b1debbaf7e867cfd448f2726d9cf74c08f19507c31d2c8e7a11525b983febc2df640b5438dee6023ebb1f84ed43cc2d654d2bc326264", + "packageManager": "pnpm@10.29.3+sha512.498e1fb4cca5aa06c1dcf2611e6fafc50972ffe7189998c409e90de74566444298ffe43e6cd2acdc775ba1aa7cc5e092a8b7054c811ba8c5770f84693d33d2dc", "private": true } diff --git a/packages/playwright-common/package.json b/packages/playwright-common/package.json index 26b5447f70..be506ef6e6 100644 --- a/packages/playwright-common/package.json +++ b/packages/playwright-common/package.json @@ -16,6 +16,7 @@ "playwright-screenshots-experimental": "playwright-screenshots.sh" }, "devDependencies": { + "@playwright/test": "catalog:", "wait-on": "^9.0.4" } } diff --git a/packages/playwright-common/playwright-screenshots.sh b/packages/playwright-common/playwright-screenshots.sh index 8e2bb9306b..fc907c955d 100755 --- a/packages/playwright-common/playwright-screenshots.sh +++ b/packages/playwright-common/playwright-screenshots.sh @@ -2,19 +2,24 @@ set -e -# Handle symlinks here as we tend to be executed as an npm binary -SCRIPT_PATH=$(readlink -f "$0") -SCRIPT_DIR=$(dirname "$SCRIPT_PATH") +function build_image() { + local IMAGE_NAME="$1" + # Handle symlinks here as we tend to be executed as an npm binary + local SCRIPT_PATH=$(readlink -f "$0") + local SCRIPT_DIR=$(dirname "$SCRIPT_PATH") + + echo "Building $IMAGE_NAME image in $SCRIPT_DIR" + docker build -t "$IMAGE_NAME" --build-arg "PLAYWRIGHT_VERSION=${IMAGE_NAME#*:}" "$SCRIPT_DIR" +} -IMAGE_NAME="element-web-playwright-server" WS_PORT=3000 # Check the playwright version -PW_VERSION=$(npm exec --silent -- playwright --version | gcut -d" " -f2) -echo "Building $IMAGE_NAME:$PW_VERSION image in $SCRIPT_DIR" +PW_VERSION=$(pnpm --silent -- playwright --version | awk '{print $2}') +IMAGE_NAME="ghcr.io/element-hq/element-web/playwright-server:$PW_VERSION" -# Build the image -docker build -t "$IMAGE_NAME" --build-arg "PLAYWRIGHT_VERSION=$PW_VERSION" "$SCRIPT_DIR" +# Pull the image, failing that build the image +docker pull "$IMAGE_NAME" 2>/dev/null || build_image "$IMAGE_NAME" # Start the playwright-server in docker CONTAINER=$(docker run --network=host --rm -d -e PORT="$WS_PORT" "$IMAGE_NAME") diff --git a/packages/playwright-common/project.json b/packages/playwright-common/project.json new file mode 100644 index 0000000000..00db7a7534 --- /dev/null +++ b/packages/playwright-common/project.json @@ -0,0 +1,31 @@ +{ + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "projectType": "library", + "root": "packages/playwright-common", + "targets": { + "docker:prebuild": { + "cache": true, + "command": "echo PLAYWRIGHT_VERSION=$(pnpm --silent -- playwright --version | awk '{print $2}') > .env.docker:build", + "inputs": [{ "runtime": "pnpm --silent -- playwright --version" }], + "outputs": ["{projectRoot}/.env.docker:build"], + "options": { "cwd": "packages/playwright-common" } + }, + "docker:build": { + "executor": "@nx-tools/nx-container:build", + "dependsOn": ["docker:prebuild"], + "options": { + "load": true, + "engine": "docker", + "platforms": ["linux/amd64", "linux/arm64"], + "provenance": "true", + "sbom": true, + "build-args": ["PLAYWRIGHT_VERSION=$PLAYWRIGHT_VERSION"], + "context": "packages/playwright-common", + "metadata": { + "images": ["ghcr.io/element-hq/element-web/playwright-server"], + "tags": ["type=raw,enable=true,value=$PLAYWRIGHT_VERSION"] + } + } + } + } +} diff --git a/packages/shared-components/.eslintrc.cjs b/packages/shared-components/.eslintrc.cjs index 95fda95c64..4d77d48313 100644 --- a/packages/shared-components/.eslintrc.cjs +++ b/packages/shared-components/.eslintrc.cjs @@ -9,9 +9,10 @@ module.exports = { root: true, plugins: ["matrix-org", "eslint-plugin-react-compiler"], extends: [ - "plugin:matrix-org/babel", "plugin:matrix-org/react", "plugin:matrix-org/a11y", + "plugin:matrix-org/typescript", + "plugin:matrix-org/react", "plugin:storybook/recommended", ], parserOptions: { @@ -42,37 +43,36 @@ module.exports = { ], }, ], + + "@typescript-eslint/unbound-method": ["error", { ignoreStatic: true }], + "@typescript-eslint/explicit-function-return-type": [ + "error", + { + allowExpressions: true, + }, + ], + + // We're okay being explicit at the moment + // "@typescript-eslint/no-empty-interface": "off", + // We'd rather not do this but we do + // "@typescript-eslint/ban-ts-comment": "off", + // We're okay with assertion errors when we ask for them + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/no-empty-object-type": [ + "error", + { + // We do this sometimes to brand interfaces + allowInterfaces: "with-single-extends", + }, + ], + "storybook/meta-satisfies-type": "error", }, overrides: [ { - files: ["src/**/*.{ts,tsx}", "test/**/*.{ts,tsx}"], - extends: ["plugin:matrix-org/typescript", "plugin:matrix-org/react"], + files: ["src/**/*.test.{ts,tsx}"], rules: { - "@typescript-eslint/explicit-function-return-type": [ - "error", - { - allowExpressions: true, - }, - ], - - // Remove Babel things manually due to override limitations - "@babel/no-invalid-this": ["off"], - - // We're okay being explicit at the moment - "@typescript-eslint/no-empty-interface": "off", - // We disable this while we're transitioning + "@typescript-eslint/unbound-method": "off", "@typescript-eslint/no-explicit-any": "off", - // We'd rather not do this but we do - "@typescript-eslint/ban-ts-comment": "off", - // We're okay with assertion errors when we ask for them - "@typescript-eslint/no-non-null-assertion": "off", - "@typescript-eslint/no-empty-object-type": [ - "error", - { - // We do this sometimes to brand interfaces - allowInterfaces: "with-single-extends", - }, - ], }, }, ], diff --git a/packages/shared-components/.storybook/main.ts b/packages/shared-components/.storybook/main.ts index 834cd6dc5b..431e46b5f7 100644 --- a/packages/shared-components/.storybook/main.ts +++ b/packages/shared-components/.storybook/main.ts @@ -9,11 +9,13 @@ import type { StorybookConfig } from "@storybook/react-vite"; import fs from "node:fs"; import { nodePolyfills } from "vite-plugin-node-polyfills"; import { mergeConfig } from "vite"; -import { dirname } from "node:path"; +import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; +const __dirname = dirname(fileURLToPath(import.meta.url)); + // Get a list of available languages so the language selector can display them at runtime -const languageFiles = fs.readdirSync("src/i18n/strings").map((f) => f.slice(0, -5)); +const languageFiles = fs.readdirSync(join(__dirname, "..", "src", "i18n", "strings")).map((f) => f.slice(0, -5)); const languages: Record = {}; for (const lang of languageFiles) { @@ -49,6 +51,12 @@ const config: StorybookConfig = { }, typescript: { reactDocgen: "react-docgen-typescript", + reactDocgenTypescriptOptions: { + // The default exclude is ["**/**.stories.tsx"] which prevents + // docgen from extracting snapshot field descriptions from wrapper + // components defined in story files. + exclude: [], + }, }, async viteFinal(config) { return mergeConfig(config, { diff --git a/packages/shared-components/.storybook/preview.tsx b/packages/shared-components/.storybook/preview.tsx index f3be0a8e88..2fc4680148 100644 --- a/packages/shared-components/.storybook/preview.tsx +++ b/packages/shared-components/.storybook/preview.tsx @@ -1,4 +1,8 @@ import type { ArgTypes, Preview, Decorator, ReactRenderer, StrictArgs } from "@storybook/react-vite"; +import "@fontsource/inter/400.css"; +import "@fontsource/inter/500.css"; +import "@fontsource/inter/600.css"; +import "@fontsource/inter/700.css"; import "./compound.css"; import "./preview.css"; diff --git a/packages/shared-components/.storybook/withViewDocs.ts b/packages/shared-components/.storybook/withViewDocs.ts new file mode 100644 index 0000000000..75385830ee --- /dev/null +++ b/packages/shared-components/.storybook/withViewDocs.ts @@ -0,0 +1,62 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +/** + * Copies the component description and props documentation from a View's + * `__docgenInfo` (injected at build time by Storybook's react-docgen-typescript + * Vite plugin) onto the story wrapper component. + * + * This lets Storybook's default `extractComponentDescription` pick up the + * View's JSDoc and display per-field descriptions in the ArgTypes table. + * + * **Important:** the wrapper must be defined as a named variable *before* + * being passed here so that react-docgen-typescript can extract its props. + * + * @example + * ```ts + * const MyViewWrapperImpl = (props: MyViewProps) => { + * const vm = useMockedViewModel(props, {}); + * return ; + * }; + * const MyViewWrapper = withViewDocs(MyViewWrapperImpl, MyView); + * ``` + */ +export function withViewDocs unknown>(wrapper: T, view: object): T { + const viewInfo = (view as { __docgenInfo?: DocgenInfo }).__docgenInfo; + const viewDescription = viewInfo?.description; + if (!viewDescription) return wrapper; + + // The wrapper must be defined as a named variable (not inline) so that + // react-docgen-typescript can extract its props. The docgen Vite plugin + // appends a `Wrapper.__docgenInfo = { … }` assignment at the *end* of the + // module, which runs **after** this function. We install a setter trap so + // that the View's description is merged into the generated info. + let stored: DocgenInfo | undefined = (wrapper as { __docgenInfo?: DocgenInfo }).__docgenInfo; + Object.defineProperty(wrapper, "__docgenInfo", { + get() { + return stored; + }, + set(incoming: DocgenInfo) { + stored = { + ...incoming, + description: incoming.description || viewDescription, + }; + }, + configurable: true, + enumerable: true, + }); + + // Also apply immediately for the current state. + stored = { ...stored, description: viewDescription }; + + return wrapper; +} + +interface DocgenInfo { + description?: string; + props?: Record; +} diff --git a/packages/shared-components/README.md b/packages/shared-components/README.md index 993450a65f..3653bf9d21 100644 --- a/packages/shared-components/README.md +++ b/packages/shared-components/README.md @@ -68,7 +68,7 @@ instance should be provided as a prop. Here's a basic example: -```jsx +```tsx import { ViewExample } from "@element-hq/web-shared-components"; function MyApp() { @@ -180,27 +180,32 @@ export const Disabled: Story = { #### MVVM Component Stories -For MVVM components, create a wrapper component that uses `useMockedViewModel`: +For MVVM components, create a wrapper component that uses `useMockedViewModel` and `withViewDocs`: ```tsx import React, { type JSX } from "react"; import { fn } from "storybook/test"; -import type { Meta, StoryFn } from "@storybook/react-vite"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MyComponentView, type MyComponentViewSnapshot, type MyComponentViewActions } from "./MyComponentView"; -import { useMockedViewModel } from "../../useMockedViewModel"; +import { useMockedViewModel } from "../../viewmodel"; +import { withViewDocs } from "../../../.storybook/withViewDocs"; // Combine snapshot and actions for easier typing type MyComponentProps = MyComponentViewSnapshot & MyComponentViewActions; -// Wrapper component that creates a mocked ViewModel -const MyComponentViewWrapper = ({ onAction, ...rest }: MyComponentProps): JSX.Element => { +// Wrapper component that creates a mocked ViewModel. +// Must be a named variable (not inline) for docgen to extract its props. +const MyComponentViewWrapperImpl = ({ onAction, ...rest }: MyComponentProps): JSX.Element => { const vm = useMockedViewModel(rest, { onAction, }); return ; }; +// withViewDocs copies the View's JSDoc description onto the wrapper for Storybook autodocs +const MyComponentViewWrapper = withViewDocs(MyComponentViewWrapperImpl, MyComponentView); -export default { +// Must use `satisfies` (not `as` or `: Meta`) to preserve type info for docgen +const meta = { title: "Category/MyComponentView", component: MyComponentViewWrapper, tags: ["autodocs"], @@ -211,20 +216,29 @@ export default { // Action properties (callbacks) onAction: fn(), }, -} as Meta; +} satisfies Meta; -const Template: StoryFn = (args) => ; +export default meta; +type Story = StoryObj; -export const Default = Template.bind({}); +export const Default: Story = {}; -export const Loading = Template.bind({}); -Loading.args = { - isLoading: true, +export const Loading: Story = { + args: { + isLoading: true, + }, }; ``` Thanks to this approach, we can directly use primitives in the story arguments instead of a view model object. +> [!IMPORTANT] +> Three requirements must be met for snapshot field documentation to appear in Storybook's ArgTypes table: +> +> 1. **Named wrapper variable** — the wrapper must be assigned to a named `const` (e.g. `MyComponentViewWrapperImpl`) before being passed to `withViewDocs`, so that `react-docgen-typescript` can extract its props. +> 2. **`withViewDocs` call** — wraps the wrapper component with the original View to copy the View's JSDoc description. +> 3. **`satisfies Meta`** — the meta object must use `satisfies Meta<...>` (not `as Meta<...>` or `: Meta<...> =`). Type assertions and annotations erase the inferred component type that docgen relies on. + #### 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. @@ -239,7 +253,7 @@ This package uses [@storybook/addon-designs](https://github.com/storybookjs/addo Example with Figma integration: ```tsx -export default { +const meta = { title: "Room List/RoomListSearchView", component: RoomListSearchViewWrapper, tags: ["autodocs"], @@ -252,7 +266,9 @@ export default { url: "https://www.figma.com/design/vlmt46QDdE4dgXDiyBJXqp/ER-33-Left-Panel?node-id=98-1979", }, }, -} as Meta; +} satisfies Meta; + +export default meta; ``` The Figma design will appear in the "Design" tab in Storybook. diff --git a/packages/shared-components/__vis__/linux/__baselines__/audio/AudioPlayerView/AudioPlayerView.stories.tsx/default-auto.png b/packages/shared-components/__vis__/linux/__baselines__/audio/AudioPlayerView/AudioPlayerView.stories.tsx/default-auto.png index 7de0a32d50..db8f3f45ed 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/audio/AudioPlayerView/AudioPlayerView.stories.tsx/default-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/audio/AudioPlayerView/AudioPlayerView.stories.tsx/default-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/audio/AudioPlayerView/AudioPlayerView.stories.tsx/has-error-auto.png b/packages/shared-components/__vis__/linux/__baselines__/audio/AudioPlayerView/AudioPlayerView.stories.tsx/has-error-auto.png index 1b867daf22..9401c14c29 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/audio/AudioPlayerView/AudioPlayerView.stories.tsx/has-error-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/audio/AudioPlayerView/AudioPlayerView.stories.tsx/has-error-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/audio/AudioPlayerView/AudioPlayerView.stories.tsx/no-media-name-auto.png b/packages/shared-components/__vis__/linux/__baselines__/audio/AudioPlayerView/AudioPlayerView.stories.tsx/no-media-name-auto.png index da721483de..dbbb26e314 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/audio/AudioPlayerView/AudioPlayerView.stories.tsx/no-media-name-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/audio/AudioPlayerView/AudioPlayerView.stories.tsx/no-media-name-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/audio/AudioPlayerView/AudioPlayerView.stories.tsx/no-size-auto.png b/packages/shared-components/__vis__/linux/__baselines__/audio/AudioPlayerView/AudioPlayerView.stories.tsx/no-size-auto.png index 0e6321ef4a..0cd0c7b801 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/audio/AudioPlayerView/AudioPlayerView.stories.tsx/no-size-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/audio/AudioPlayerView/AudioPlayerView.stories.tsx/no-size-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/audio/Clock/Clock.stories.tsx/default-auto.png b/packages/shared-components/__vis__/linux/__baselines__/audio/Clock/Clock.stories.tsx/default-auto.png index f53a9d0f89..889a011878 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/audio/Clock/Clock.stories.tsx/default-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/audio/Clock/Clock.stories.tsx/default-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/audio/Clock/Clock.stories.tsx/lot-of-seconds-auto.png b/packages/shared-components/__vis__/linux/__baselines__/audio/Clock/Clock.stories.tsx/lot-of-seconds-auto.png index 34f40b8165..a36c7b9d2b 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/audio/Clock/Clock.stories.tsx/lot-of-seconds-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/audio/Clock/Clock.stories.tsx/lot-of-seconds-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/audio/SeekBar/SeekBar.stories.tsx/default-auto.png b/packages/shared-components/__vis__/linux/__baselines__/audio/SeekBar/SeekBar.stories.tsx/default-auto.png index 2d275e14bb..a2dc2cfb3d 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/audio/SeekBar/SeekBar.stories.tsx/default-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/audio/SeekBar/SeekBar.stories.tsx/default-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/audio/SeekBar/SeekBar.stories.tsx/disabled-auto.png b/packages/shared-components/__vis__/linux/__baselines__/audio/SeekBar/SeekBar.stories.tsx/disabled-auto.png index bd3a4ac90b..0c85645091 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/audio/SeekBar/SeekBar.stories.tsx/disabled-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/audio/SeekBar/SeekBar.stories.tsx/disabled-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/avatar/AvatarWithDetails/AvatarWithDetails.stories.tsx/default-auto.png b/packages/shared-components/__vis__/linux/__baselines__/avatar/AvatarWithDetails/AvatarWithDetails.stories.tsx/default-auto.png index 3733a95b01..498eadee7a 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/avatar/AvatarWithDetails/AvatarWithDetails.stories.tsx/default-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/avatar/AvatarWithDetails/AvatarWithDetails.stories.tsx/default-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/composer/Banner/Banner.stories.tsx/critical-auto.png b/packages/shared-components/__vis__/linux/__baselines__/composer/Banner/Banner.stories.tsx/critical-auto.png index afe84b3579..155515af35 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/composer/Banner/Banner.stories.tsx/critical-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/composer/Banner/Banner.stories.tsx/critical-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/composer/Banner/Banner.stories.tsx/default-auto.png b/packages/shared-components/__vis__/linux/__baselines__/composer/Banner/Banner.stories.tsx/default-auto.png index 3e3bca2a35..f0be1266dc 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/composer/Banner/Banner.stories.tsx/default-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/composer/Banner/Banner.stories.tsx/default-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/composer/Banner/Banner.stories.tsx/info-auto.png b/packages/shared-components/__vis__/linux/__baselines__/composer/Banner/Banner.stories.tsx/info-auto.png index 023e6af54c..9e45644442 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/composer/Banner/Banner.stories.tsx/info-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/composer/Banner/Banner.stories.tsx/info-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/composer/Banner/Banner.stories.tsx/success-auto.png b/packages/shared-components/__vis__/linux/__baselines__/composer/Banner/Banner.stories.tsx/success-auto.png index 9b6d88e610..b607ad24d0 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/composer/Banner/Banner.stories.tsx/success-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/composer/Banner/Banner.stories.tsx/success-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/composer/Banner/Banner.stories.tsx/with-action-auto.png b/packages/shared-components/__vis__/linux/__baselines__/composer/Banner/Banner.stories.tsx/with-action-auto.png index c2e523db13..0db399b5af 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/composer/Banner/Banner.stories.tsx/with-action-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/composer/Banner/Banner.stories.tsx/with-action-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/composer/Banner/Banner.stories.tsx/with-avatar-image-auto.png b/packages/shared-components/__vis__/linux/__baselines__/composer/Banner/Banner.stories.tsx/with-avatar-image-auto.png index 994a3426f6..6188892034 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/composer/Banner/Banner.stories.tsx/with-avatar-image-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/composer/Banner/Banner.stories.tsx/with-avatar-image-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/composer/Banner/Banner.stories.tsx/with-loads-of-content-auto.png b/packages/shared-components/__vis__/linux/__baselines__/composer/Banner/Banner.stories.tsx/with-loads-of-content-auto.png index 68d4d0f60e..e53356df7f 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/composer/Banner/Banner.stories.tsx/with-loads-of-content-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/composer/Banner/Banner.stories.tsx/with-loads-of-content-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/composer/Banner/Banner.stories.tsx/without-close-auto.png b/packages/shared-components/__vis__/linux/__baselines__/composer/Banner/Banner.stories.tsx/without-close-auto.png index 13a4980352..fd13d4ee0b 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/composer/Banner/Banner.stories.tsx/without-close-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/composer/Banner/Banner.stories.tsx/without-close-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/crypto/SasEmoji/SasEmoji.stories.tsx/default-auto.png b/packages/shared-components/__vis__/linux/__baselines__/crypto/SasEmoji/SasEmoji.stories.tsx/default-auto.png index 0c58b2b70c..2ec9a94fed 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/crypto/SasEmoji/SasEmoji.stories.tsx/default-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/crypto/SasEmoji/SasEmoji.stories.tsx/default-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/crypto/SasEmoji/SasEmoji.stories.tsx/worst-case-albanian-auto.png b/packages/shared-components/__vis__/linux/__baselines__/crypto/SasEmoji/SasEmoji.stories.tsx/worst-case-albanian-auto.png index c57847ce6b..f08fa23265 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/crypto/SasEmoji/SasEmoji.stories.tsx/worst-case-albanian-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/crypto/SasEmoji/SasEmoji.stories.tsx/worst-case-albanian-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/crypto/SasEmoji/SasEmoji.stories.tsx/worst-case-german-auto.png b/packages/shared-components/__vis__/linux/__baselines__/crypto/SasEmoji/SasEmoji.stories.tsx/worst-case-german-auto.png index e230daefef..a725c2d9bc 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/crypto/SasEmoji/SasEmoji.stories.tsx/worst-case-german-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/crypto/SasEmoji/SasEmoji.stories.tsx/worst-case-german-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EncryptionEventView/EncryptionEventView.stories.tsx/default-auto.png b/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EncryptionEventView/EncryptionEventView.stories.tsx/default-auto.png new file mode 100644 index 0000000000..b5461a95dd Binary files /dev/null and b/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EncryptionEventView/EncryptionEventView.stories.tsx/default-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EncryptionEventView/EncryptionEventView.stories.tsx/disable-attempt-auto.png b/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EncryptionEventView/EncryptionEventView.stories.tsx/disable-attempt-auto.png new file mode 100644 index 0000000000..3c5777ae66 Binary files /dev/null and b/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EncryptionEventView/EncryptionEventView.stories.tsx/disable-attempt-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EncryptionEventView/EncryptionEventView.stories.tsx/enabled-direct-message-auto.png b/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EncryptionEventView/EncryptionEventView.stories.tsx/enabled-direct-message-auto.png new file mode 100644 index 0000000000..b1ffac53cb Binary files /dev/null and b/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EncryptionEventView/EncryptionEventView.stories.tsx/enabled-direct-message-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EncryptionEventView/EncryptionEventView.stories.tsx/enabled-local-room-auto.png b/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EncryptionEventView/EncryptionEventView.stories.tsx/enabled-local-room-auto.png new file mode 100644 index 0000000000..713fc1b75b Binary files /dev/null and b/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EncryptionEventView/EncryptionEventView.stories.tsx/enabled-local-room-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EncryptionEventView/EncryptionEventView.stories.tsx/parameters-changed-auto.png b/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EncryptionEventView/EncryptionEventView.stories.tsx/parameters-changed-auto.png new file mode 100644 index 0000000000..3ee892122f Binary files /dev/null and b/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EncryptionEventView/EncryptionEventView.stories.tsx/parameters-changed-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EncryptionEventView/EncryptionEventView.stories.tsx/state-encryption-enabled-auto.png b/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EncryptionEventView/EncryptionEventView.stories.tsx/state-encryption-enabled-auto.png new file mode 100644 index 0000000000..e1327cdb5f Binary files /dev/null and b/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EncryptionEventView/EncryptionEventView.stories.tsx/state-encryption-enabled-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EncryptionEventView/EncryptionEventView.stories.tsx/unsupported-auto.png b/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EncryptionEventView/EncryptionEventView.stories.tsx/unsupported-auto.png new file mode 100644 index 0000000000..6d7e2c8a22 Binary files /dev/null and b/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EncryptionEventView/EncryptionEventView.stories.tsx/unsupported-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EncryptionEventView/EncryptionEventView.stories.tsx/with-timestamp-auto.png b/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EncryptionEventView/EncryptionEventView.stories.tsx/with-timestamp-auto.png new file mode 100644 index 0000000000..d1e0c0fcb3 Binary files /dev/null and b/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EncryptionEventView/EncryptionEventView.stories.tsx/with-timestamp-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EventTileBubble/EventTileBubble.stories.tsx/default-auto.png b/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EventTileBubble/EventTileBubble.stories.tsx/default-auto.png index 1bb98ff6da..93b9d23727 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EventTileBubble/EventTileBubble.stories.tsx/default-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EventTileBubble/EventTileBubble.stories.tsx/default-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EventTileBubble/EventTileBubble.stories.tsx/has-children-auto.png b/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EventTileBubble/EventTileBubble.stories.tsx/has-children-auto.png index b7509b00a1..253e153244 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EventTileBubble/EventTileBubble.stories.tsx/has-children-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EventTileBubble/EventTileBubble.stories.tsx/has-children-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EventTileBubble/EventTileBubble.stories.tsx/has-lock-solid-icon-auto.png b/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EventTileBubble/EventTileBubble.stories.tsx/has-lock-solid-icon-auto.png index 99683701c9..d873c99a20 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EventTileBubble/EventTileBubble.stories.tsx/has-lock-solid-icon-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EventTileBubble/EventTileBubble.stories.tsx/has-lock-solid-icon-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EventTileBubble/EventTileBubble.stories.tsx/is-crypto-event-bubble-auto.png b/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EventTileBubble/EventTileBubble.stories.tsx/is-crypto-event-bubble-auto.png index 2767b4dd1c..2d89f68c0a 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EventTileBubble/EventTileBubble.stories.tsx/is-crypto-event-bubble-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/event-tiles/EventTileBubble/EventTileBubble.stories.tsx/is-crypto-event-bubble-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/event-tiles/TextualEventView/TextualEventView.stories.tsx/default-auto.png b/packages/shared-components/__vis__/linux/__baselines__/event-tiles/TextualEventView/TextualEventView.stories.tsx/default-auto.png index 7f7b1736bc..cbd93adc65 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/event-tiles/TextualEventView/TextualEventView.stories.tsx/default-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/event-tiles/TextualEventView/TextualEventView.stories.tsx/default-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/message-body/DecryptionFailureBodyView/DecryptionFailureBodyView.stories.tsx/default-auto.png b/packages/shared-components/__vis__/linux/__baselines__/message-body/DecryptionFailureBodyView/DecryptionFailureBodyView.stories.tsx/default-auto.png index 78ab5b60ea..3e5ba0fdb5 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/message-body/DecryptionFailureBodyView/DecryptionFailureBodyView.stories.tsx/default-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/message-body/DecryptionFailureBodyView/DecryptionFailureBodyView.stories.tsx/default-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/message-body/DecryptionFailureBodyView/DecryptionFailureBodyView.stories.tsx/has-backup-configured-verified-false-auto.png b/packages/shared-components/__vis__/linux/__baselines__/message-body/DecryptionFailureBodyView/DecryptionFailureBodyView.stories.tsx/has-backup-configured-verified-false-auto.png index 5752391671..77a50c780a 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/message-body/DecryptionFailureBodyView/DecryptionFailureBodyView.stories.tsx/has-backup-configured-verified-false-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/message-body/DecryptionFailureBodyView/DecryptionFailureBodyView.stories.tsx/has-backup-configured-verified-false-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/message-body/DecryptionFailureBodyView/DecryptionFailureBodyView.stories.tsx/has-backup-configured-verified-true-auto.png b/packages/shared-components/__vis__/linux/__baselines__/message-body/DecryptionFailureBodyView/DecryptionFailureBodyView.stories.tsx/has-backup-configured-verified-true-auto.png index 78ab5b60ea..3e5ba0fdb5 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/message-body/DecryptionFailureBodyView/DecryptionFailureBodyView.stories.tsx/has-backup-configured-verified-true-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/message-body/DecryptionFailureBodyView/DecryptionFailureBodyView.stories.tsx/has-backup-configured-verified-true-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/message-body/DecryptionFailureBodyView/DecryptionFailureBodyView.stories.tsx/has-error-block-icon-auto.png b/packages/shared-components/__vis__/linux/__baselines__/message-body/DecryptionFailureBodyView/DecryptionFailureBodyView.stories.tsx/has-error-block-icon-auto.png index d1c5f6f7c0..a3334736f3 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/message-body/DecryptionFailureBodyView/DecryptionFailureBodyView.stories.tsx/has-error-block-icon-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/message-body/DecryptionFailureBodyView/DecryptionFailureBodyView.stories.tsx/has-error-block-icon-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/message-body/DecryptionFailureBodyView/DecryptionFailureBodyView.stories.tsx/has-error-class-name-auto.png b/packages/shared-components/__vis__/linux/__baselines__/message-body/DecryptionFailureBodyView/DecryptionFailureBodyView.stories.tsx/has-error-class-name-auto.png index b5f7f810de..ca9185e549 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/message-body/DecryptionFailureBodyView/DecryptionFailureBodyView.stories.tsx/has-error-class-name-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/message-body/DecryptionFailureBodyView/DecryptionFailureBodyView.stories.tsx/has-error-class-name-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/message-body/DecryptionFailureBodyView/DecryptionFailureBodyView.stories.tsx/has-extra-class-names-auto.png b/packages/shared-components/__vis__/linux/__baselines__/message-body/DecryptionFailureBodyView/DecryptionFailureBodyView.stories.tsx/has-extra-class-names-auto.png index 78ab5b60ea..3e5ba0fdb5 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/message-body/DecryptionFailureBodyView/DecryptionFailureBodyView.stories.tsx/has-extra-class-names-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/message-body/DecryptionFailureBodyView/DecryptionFailureBodyView.stories.tsx/has-extra-class-names-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/message-body/MediaBody/MediaBody.stories.tsx/default-auto.png b/packages/shared-components/__vis__/linux/__baselines__/message-body/MediaBody/MediaBody.stories.tsx/default-auto.png index e229052444..3497f14767 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/message-body/MediaBody/MediaBody.stories.tsx/default-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/message-body/MediaBody/MediaBody.stories.tsx/default-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/message-body/MessageTimestampView/MessageTimestampView.stories.tsx/default-auto.png b/packages/shared-components/__vis__/linux/__baselines__/message-body/MessageTimestampView/MessageTimestampView.stories.tsx/default-auto.png new file mode 100644 index 0000000000..9874621547 Binary files /dev/null and b/packages/shared-components/__vis__/linux/__baselines__/message-body/MessageTimestampView/MessageTimestampView.stories.tsx/default-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/message-body/MessageTimestampView/MessageTimestampView.stories.tsx/has-actions-auto.png b/packages/shared-components/__vis__/linux/__baselines__/message-body/MessageTimestampView/MessageTimestampView.stories.tsx/has-actions-auto.png new file mode 100644 index 0000000000..9b784175af Binary files /dev/null and b/packages/shared-components/__vis__/linux/__baselines__/message-body/MessageTimestampView/MessageTimestampView.stories.tsx/has-actions-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/message-body/MessageTimestampView/MessageTimestampView.stories.tsx/has-extra-class-names-auto.png b/packages/shared-components/__vis__/linux/__baselines__/message-body/MessageTimestampView/MessageTimestampView.stories.tsx/has-extra-class-names-auto.png new file mode 100644 index 0000000000..9b784175af Binary files /dev/null and b/packages/shared-components/__vis__/linux/__baselines__/message-body/MessageTimestampView/MessageTimestampView.stories.tsx/has-extra-class-names-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/message-body/MessageTimestampView/MessageTimestampView.stories.tsx/has-href-auto.png b/packages/shared-components/__vis__/linux/__baselines__/message-body/MessageTimestampView/MessageTimestampView.stories.tsx/has-href-auto.png new file mode 100644 index 0000000000..9b784175af Binary files /dev/null and b/packages/shared-components/__vis__/linux/__baselines__/message-body/MessageTimestampView/MessageTimestampView.stories.tsx/has-href-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/message-body/MessageTimestampView/MessageTimestampView.stories.tsx/has-inhibit-tooltip-auto.png b/packages/shared-components/__vis__/linux/__baselines__/message-body/MessageTimestampView/MessageTimestampView.stories.tsx/has-inhibit-tooltip-auto.png new file mode 100644 index 0000000000..9b784175af Binary files /dev/null and b/packages/shared-components/__vis__/linux/__baselines__/message-body/MessageTimestampView/MessageTimestampView.stories.tsx/has-inhibit-tooltip-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/message-body/MessageTimestampView/MessageTimestampView.stories.tsx/has-ts-received-at-auto.png b/packages/shared-components/__vis__/linux/__baselines__/message-body/MessageTimestampView/MessageTimestampView.stories.tsx/has-ts-received-at-auto.png new file mode 100644 index 0000000000..a08fe65499 Binary files /dev/null and b/packages/shared-components/__vis__/linux/__baselines__/message-body/MessageTimestampView/MessageTimestampView.stories.tsx/has-ts-received-at-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/message-body/ReactionsRowButton/ReactionsRowButton.stories.tsx/default-auto.png b/packages/shared-components/__vis__/linux/__baselines__/message-body/ReactionsRowButton/ReactionsRowButton.stories.tsx/default-auto.png new file mode 100644 index 0000000000..ac28ab0604 Binary files /dev/null and b/packages/shared-components/__vis__/linux/__baselines__/message-body/ReactionsRowButton/ReactionsRowButton.stories.tsx/default-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/message-body/ReactionsRowButton/ReactionsRowButton.stories.tsx/selected-auto.png b/packages/shared-components/__vis__/linux/__baselines__/message-body/ReactionsRowButton/ReactionsRowButton.stories.tsx/selected-auto.png new file mode 100644 index 0000000000..73cc856f91 Binary files /dev/null and b/packages/shared-components/__vis__/linux/__baselines__/message-body/ReactionsRowButton/ReactionsRowButton.stories.tsx/selected-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/message-body/ReactionsRowButton/ReactionsRowButton.stories.tsx/with-tooltip-auto.png b/packages/shared-components/__vis__/linux/__baselines__/message-body/ReactionsRowButton/ReactionsRowButton.stories.tsx/with-tooltip-auto.png new file mode 100644 index 0000000000..ec05cbd849 Binary files /dev/null and b/packages/shared-components/__vis__/linux/__baselines__/message-body/ReactionsRowButton/ReactionsRowButton.stories.tsx/with-tooltip-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/message-body/ReactionsRowButtonTooltip/ReactionsRowButtonTooltip.stories.tsx/default-auto.png b/packages/shared-components/__vis__/linux/__baselines__/message-body/ReactionsRowButtonTooltip/ReactionsRowButtonTooltip.stories.tsx/default-auto.png index 1bd6b0e55a..3bc6f2374b 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/message-body/ReactionsRowButtonTooltip/ReactionsRowButtonTooltip.stories.tsx/default-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/message-body/ReactionsRowButtonTooltip/ReactionsRowButtonTooltip.stories.tsx/default-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/message-body/ReactionsRowButtonTooltip/ReactionsRowButtonTooltip.stories.tsx/many-senders-auto.png b/packages/shared-components/__vis__/linux/__baselines__/message-body/ReactionsRowButtonTooltip/ReactionsRowButtonTooltip.stories.tsx/many-senders-auto.png index 8776eee112..5ec913f919 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/message-body/ReactionsRowButtonTooltip/ReactionsRowButtonTooltip.stories.tsx/many-senders-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/message-body/ReactionsRowButtonTooltip/ReactionsRowButtonTooltip.stories.tsx/many-senders-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/message-body/ReactionsRowButtonTooltip/ReactionsRowButtonTooltip.stories.tsx/no-tooltip-auto.png b/packages/shared-components/__vis__/linux/__baselines__/message-body/ReactionsRowButtonTooltip/ReactionsRowButtonTooltip.stories.tsx/no-tooltip-auto.png index 04edc17bee..8940f0d301 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/message-body/ReactionsRowButtonTooltip/ReactionsRowButtonTooltip.stories.tsx/no-tooltip-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/message-body/ReactionsRowButtonTooltip/ReactionsRowButtonTooltip.stories.tsx/no-tooltip-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/message-body/ReactionsRowButtonTooltip/ReactionsRowButtonTooltip.stories.tsx/without-caption-auto.png b/packages/shared-components/__vis__/linux/__baselines__/message-body/ReactionsRowButtonTooltip/ReactionsRowButtonTooltip.stories.tsx/without-caption-auto.png index 4d75f74cb5..5993999dfe 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/message-body/ReactionsRowButtonTooltip/ReactionsRowButtonTooltip.stories.tsx/without-caption-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/message-body/ReactionsRowButtonTooltip/ReactionsRowButtonTooltip.stories.tsx/without-caption-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/message-body/TimelineSeparator/TimelineSeparator.stories.tsx/default-auto.png b/packages/shared-components/__vis__/linux/__baselines__/message-body/TimelineSeparator/TimelineSeparator.stories.tsx/default-auto.png index 9cc04c2006..143e9cd1f8 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/message-body/TimelineSeparator/TimelineSeparator.stories.tsx/default-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/message-body/TimelineSeparator/TimelineSeparator.stories.tsx/default-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/message-body/TimelineSeparator/TimelineSeparator.stories.tsx/with-date-event-auto.png b/packages/shared-components/__vis__/linux/__baselines__/message-body/TimelineSeparator/TimelineSeparator.stories.tsx/with-date-event-auto.png index 88f95f804f..6b9d50031d 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/message-body/TimelineSeparator/TimelineSeparator.stories.tsx/with-date-event-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/message-body/TimelineSeparator/TimelineSeparator.stories.tsx/with-date-event-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/message-body/TimelineSeparator/TimelineSeparator.stories.tsx/with-html-child-auto.png b/packages/shared-components/__vis__/linux/__baselines__/message-body/TimelineSeparator/TimelineSeparator.stories.tsx/with-html-child-auto.png index 6be0311bab..569216ff1c 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/message-body/TimelineSeparator/TimelineSeparator.stories.tsx/with-html-child-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/message-body/TimelineSeparator/TimelineSeparator.stories.tsx/with-html-child-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/message-body/TimelineSeparator/TimelineSeparator.stories.tsx/with-late-event-auto.png b/packages/shared-components/__vis__/linux/__baselines__/message-body/TimelineSeparator/TimelineSeparator.stories.tsx/with-late-event-auto.png index a9d968d969..acc78bb9a4 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/message-body/TimelineSeparator/TimelineSeparator.stories.tsx/with-late-event-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/message-body/TimelineSeparator/TimelineSeparator.stories.tsx/with-late-event-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/pill-input/Pill/Pill.stories.tsx/default-auto.png b/packages/shared-components/__vis__/linux/__baselines__/pill-input/Pill/Pill.stories.tsx/default-auto.png index c849fa7c0e..7aa5d727f8 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/pill-input/Pill/Pill.stories.tsx/default-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/pill-input/Pill/Pill.stories.tsx/default-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/pill-input/Pill/Pill.stories.tsx/without-close-button-auto.png b/packages/shared-components/__vis__/linux/__baselines__/pill-input/Pill/Pill.stories.tsx/without-close-button-auto.png index c3f7c0d041..f62f538fd3 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/pill-input/Pill/Pill.stories.tsx/without-close-button-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/pill-input/Pill/Pill.stories.tsx/without-close-button-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/pill-input/PillInput/PillInput.stories.tsx/default-auto.png b/packages/shared-components/__vis__/linux/__baselines__/pill-input/PillInput/PillInput.stories.tsx/default-auto.png index 992bc2713c..79d66f2045 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/pill-input/PillInput/PillInput.stories.tsx/default-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/pill-input/PillInput/PillInput.stories.tsx/default-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/pill-input/PillInput/PillInput.stories.tsx/no-child-auto.png b/packages/shared-components/__vis__/linux/__baselines__/pill-input/PillInput/PillInput.stories.tsx/no-child-auto.png index cf7fd6ed38..0b2bf034da 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/pill-input/PillInput/PillInput.stories.tsx/no-child-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/pill-input/PillInput/PillInput.stories.tsx/no-child-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/profile/DisambiguatedProfile/DisambiguatedProfile.stories.tsx/default-auto.png b/packages/shared-components/__vis__/linux/__baselines__/profile/DisambiguatedProfile/DisambiguatedProfile.stories.tsx/default-auto.png index 4f21429863..215a6f1b35 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/profile/DisambiguatedProfile/DisambiguatedProfile.stories.tsx/default-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/profile/DisambiguatedProfile/DisambiguatedProfile.stories.tsx/default-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/profile/DisambiguatedProfile/DisambiguatedProfile.stories.tsx/emphasized-auto.png b/packages/shared-components/__vis__/linux/__baselines__/profile/DisambiguatedProfile/DisambiguatedProfile.stories.tsx/emphasized-auto.png index 8741845a45..caff645635 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/profile/DisambiguatedProfile/DisambiguatedProfile.stories.tsx/emphasized-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/profile/DisambiguatedProfile/DisambiguatedProfile.stories.tsx/emphasized-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/profile/DisambiguatedProfile/DisambiguatedProfile.stories.tsx/full-example-auto.png b/packages/shared-components/__vis__/linux/__baselines__/profile/DisambiguatedProfile/DisambiguatedProfile.stories.tsx/full-example-auto.png index 19129fa1ac..fcc6af53b3 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/profile/DisambiguatedProfile/DisambiguatedProfile.stories.tsx/full-example-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/profile/DisambiguatedProfile/DisambiguatedProfile.stories.tsx/full-example-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/profile/DisambiguatedProfile/DisambiguatedProfile.stories.tsx/with-color-class-auto.png b/packages/shared-components/__vis__/linux/__baselines__/profile/DisambiguatedProfile/DisambiguatedProfile.stories.tsx/with-color-class-auto.png index c8cc5574ee..08796c5a34 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/profile/DisambiguatedProfile/DisambiguatedProfile.stories.tsx/with-color-class-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/profile/DisambiguatedProfile/DisambiguatedProfile.stories.tsx/with-color-class-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/profile/DisambiguatedProfile/DisambiguatedProfile.stories.tsx/with-mxid-auto.png b/packages/shared-components/__vis__/linux/__baselines__/profile/DisambiguatedProfile/DisambiguatedProfile.stories.tsx/with-mxid-auto.png index 4758b37a5b..f3ffefb265 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/profile/DisambiguatedProfile/DisambiguatedProfile.stories.tsx/with-mxid-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/profile/DisambiguatedProfile/DisambiguatedProfile.stories.tsx/with-mxid-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/profile/DisambiguatedProfile/DisambiguatedProfile.stories.tsx/with-tooltip-auto.png b/packages/shared-components/__vis__/linux/__baselines__/profile/DisambiguatedProfile/DisambiguatedProfile.stories.tsx/with-tooltip-auto.png index d00a53f88e..6aebe33267 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/profile/DisambiguatedProfile/DisambiguatedProfile.stories.tsx/with-tooltip-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/profile/DisambiguatedProfile/DisambiguatedProfile.stories.tsx/with-tooltip-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/rich-list/RichItem/RichItem.stories.tsx/default-auto.png b/packages/shared-components/__vis__/linux/__baselines__/rich-list/RichItem/RichItem.stories.tsx/default-auto.png index 43df9d7ffc..bdc40f5c92 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/rich-list/RichItem/RichItem.stories.tsx/default-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/rich-list/RichItem/RichItem.stories.tsx/default-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/rich-list/RichItem/RichItem.stories.tsx/hover-auto.png b/packages/shared-components/__vis__/linux/__baselines__/rich-list/RichItem/RichItem.stories.tsx/hover-auto.png index 43df9d7ffc..bdc40f5c92 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/rich-list/RichItem/RichItem.stories.tsx/hover-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/rich-list/RichItem/RichItem.stories.tsx/hover-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/rich-list/RichItem/RichItem.stories.tsx/selected-auto.png b/packages/shared-components/__vis__/linux/__baselines__/rich-list/RichItem/RichItem.stories.tsx/selected-auto.png index 54f9f9d172..699f811329 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/rich-list/RichItem/RichItem.stories.tsx/selected-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/rich-list/RichItem/RichItem.stories.tsx/selected-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/rich-list/RichItem/RichItem.stories.tsx/separator-auto.png b/packages/shared-components/__vis__/linux/__baselines__/rich-list/RichItem/RichItem.stories.tsx/separator-auto.png index 277400aa56..45100e219c 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/rich-list/RichItem/RichItem.stories.tsx/separator-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/rich-list/RichItem/RichItem.stories.tsx/separator-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/rich-list/RichItem/RichItem.stories.tsx/without-timestamp-auto.png b/packages/shared-components/__vis__/linux/__baselines__/rich-list/RichItem/RichItem.stories.tsx/without-timestamp-auto.png index 815ab86b1d..4a11e617b5 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/rich-list/RichItem/RichItem.stories.tsx/without-timestamp-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/rich-list/RichItem/RichItem.stories.tsx/without-timestamp-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/rich-list/RichList/RichList.stories.tsx/default-auto.png b/packages/shared-components/__vis__/linux/__baselines__/rich-list/RichList/RichList.stories.tsx/default-auto.png index c91ac330b1..341955065c 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/rich-list/RichList/RichList.stories.tsx/default-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/rich-list/RichList/RichList.stories.tsx/default-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/rich-list/RichList/RichList.stories.tsx/empty-auto.png b/packages/shared-components/__vis__/linux/__baselines__/rich-list/RichList/RichList.stories.tsx/empty-auto.png index 7610eb2b09..9f3a4e8538 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/rich-list/RichList/RichList.stories.tsx/empty-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/rich-list/RichList/RichList.stories.tsx/empty-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/right-panel/WidgetContextMenu/WidgetContextMenuView.stories.tsx/default-auto.png b/packages/shared-components/__vis__/linux/__baselines__/right-panel/WidgetContextMenu/WidgetContextMenuView.stories.tsx/default-auto.png index 27dc35b48c..eed37c101a 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/right-panel/WidgetContextMenu/WidgetContextMenuView.stories.tsx/default-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/right-panel/WidgetContextMenu/WidgetContextMenuView.stories.tsx/default-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/right-panel/WidgetContextMenu/WidgetContextMenuView.stories.tsx/only-basic-modification-auto.png b/packages/shared-components/__vis__/linux/__baselines__/right-panel/WidgetContextMenu/WidgetContextMenuView.stories.tsx/only-basic-modification-auto.png index 1efbec2117..fcc53714a7 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/right-panel/WidgetContextMenu/WidgetContextMenuView.stories.tsx/only-basic-modification-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/right-panel/WidgetContextMenu/WidgetContextMenuView.stories.tsx/only-basic-modification-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListHeaderView/RoomListHeaderView.stories.tsx/default-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListHeaderView/RoomListHeaderView.stories.tsx/default-auto.png index 0510570c85..73a0414c77 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListHeaderView/RoomListHeaderView.stories.tsx/default-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListHeaderView/RoomListHeaderView.stories.tsx/default-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListHeaderView/RoomListHeaderView.stories.tsx/long-title-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListHeaderView/RoomListHeaderView.stories.tsx/long-title-auto.png new file mode 100644 index 0000000000..6556f221b8 Binary files /dev/null and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListHeaderView/RoomListHeaderView.stories.tsx/long-title-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListHeaderView/RoomListHeaderView.stories.tsx/no-compose-menu-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListHeaderView/RoomListHeaderView.stories.tsx/no-compose-menu-auto.png index 62a6db0401..650888bada 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListHeaderView/RoomListHeaderView.stories.tsx/no-compose-menu-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListHeaderView/RoomListHeaderView.stories.tsx/no-compose-menu-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListHeaderView/RoomListHeaderView.stories.tsx/no-space-menu-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListHeaderView/RoomListHeaderView.stories.tsx/no-space-menu-auto.png index 3396e4d7af..c161ca198e 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListHeaderView/RoomListHeaderView.stories.tsx/no-space-menu-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListHeaderView/RoomListHeaderView.stories.tsx/no-space-menu-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/NotificationDecoration/NotificationDecoration.stories.tsx/mention-with-count-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/NotificationDecoration/NotificationDecoration.stories.tsx/mention-with-count-auto.png index de18d302eb..f0653ae5ad 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/NotificationDecoration/NotificationDecoration.stories.tsx/mention-with-count-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/NotificationDecoration/NotificationDecoration.stories.tsx/mention-with-count-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/NotificationDecoration/NotificationDecoration.stories.tsx/notification-with-count-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/NotificationDecoration/NotificationDecoration.stories.tsx/notification-with-count-auto.png index 06aff02b98..0b0b025fd1 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/NotificationDecoration/NotificationDecoration.stories.tsx/notification-with-count-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/NotificationDecoration/NotificationDecoration.stories.tsx/notification-with-count-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/bold-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/bold-auto.png index aea65dfd2e..8e70220255 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/bold-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/bold-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/default-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/default-auto.png index c91eaae678..635921af21 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/default-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/default-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/first-item-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/first-item-auto.png new file mode 100644 index 0000000000..e9aa6176dd Binary files /dev/null and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/first-item-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/invitation-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/invitation-auto.png index 33a58c0186..0266dd1d1e 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/invitation-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/invitation-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/last-item-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/last-item-auto.png new file mode 100644 index 0000000000..44e9a3af0c Binary files /dev/null and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/last-item-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/long-content-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/long-content-auto.png new file mode 100644 index 0000000000..1097864034 Binary files /dev/null and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/long-content-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/no-message-preview-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/no-message-preview-auto.png index f550ca61ae..0bdabf8117 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/no-message-preview-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/no-message-preview-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/selected-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/selected-auto.png index aa8b1f52fb..44e9a3af0c 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/selected-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/selected-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/unsent-message-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/unsent-message-auto.png index 4cd7639e8d..ff5b404e62 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/unsent-message-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/unsent-message-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/with-hover-menu-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/with-hover-menu-auto.png index c91eaae678..635921af21 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/with-hover-menu-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/with-hover-menu-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/with-large-font-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/with-large-font-auto.png new file mode 100644 index 0000000000..9f0a3aab76 Binary files /dev/null and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/with-large-font-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/with-mention-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/with-mention-auto.png index d59c818760..0c6df34552 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/with-mention-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/with-mention-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/with-notification-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/with-notification-auto.png index c680323a32..ee37b5ae64 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/with-notification-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/with-notification-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/with-zoom-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/with-zoom-auto.png new file mode 100644 index 0000000000..5db8d9b294 Binary files /dev/null and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/with-zoom-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/without-hover-menu-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/without-hover-menu-auto.png index c91eaae678..635921af21 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/without-hover-menu-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListItemView/RoomListItemView.stories.tsx/without-hover-menu-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.stories.tsx/default-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.stories.tsx/default-auto.png index 95078643c6..09c4dac4e4 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.stories.tsx/default-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.stories.tsx/default-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.stories.tsx/narrow-container-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.stories.tsx/narrow-container-auto.png index 08f95e5684..a1233ad9f1 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.stories.tsx/narrow-container-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.stories.tsx/narrow-container-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.stories.tsx/narrow-with-active-wrapping-filter-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.stories.tsx/narrow-with-active-wrapping-filter-auto.png index a9d71aeb4f..4477462708 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.stories.tsx/narrow-with-active-wrapping-filter-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.stories.tsx/narrow-with-active-wrapping-filter-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.stories.tsx/people-selected-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.stories.tsx/people-selected-auto.png index 44c69d4b65..1e6e4d614c 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.stories.tsx/people-selected-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.stories.tsx/people-selected-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListSearchView/RoomListSearchView.stories.tsx/all-buttons-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListSearchView/RoomListSearchView.stories.tsx/all-buttons-auto.png index 3c16c7aac7..c659e1a656 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListSearchView/RoomListSearchView.stories.tsx/all-buttons-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListSearchView/RoomListSearchView.stories.tsx/all-buttons-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListSearchView/RoomListSearchView.stories.tsx/default-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListSearchView/RoomListSearchView.stories.tsx/default-auto.png index 0d390fb218..2b451b41e8 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListSearchView/RoomListSearchView.stories.tsx/default-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListSearchView/RoomListSearchView.stories.tsx/default-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListSearchView/RoomListSearchView.stories.tsx/with-dial-pad-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListSearchView/RoomListSearchView.stories.tsx/with-dial-pad-auto.png index 3c16c7aac7..c659e1a656 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListSearchView/RoomListSearchView.stories.tsx/with-dial-pad-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListSearchView/RoomListSearchView.stories.tsx/with-dial-pad-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListSearchView/RoomListSearchView.stories.tsx/without-explore-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListSearchView/RoomListSearchView.stories.tsx/without-explore-auto.png index 3fa2ac2799..56943ff8d8 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListSearchView/RoomListSearchView.stories.tsx/without-explore-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListSearchView/RoomListSearchView.stories.tsx/without-explore-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/default-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/default-auto.png index 980c20f8f5..eb90df57d3 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/default-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/default-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-auto.png index 65f8c7b203..e673af207f 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-favourite-filter-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-favourite-filter-auto.png index 6b342ecc84..10aa503a48 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-favourite-filter-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-favourite-filter-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-invites-filter-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-invites-filter-auto.png index f6e995e46b..99031eca29 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-invites-filter-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-invites-filter-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-low-priority-filter-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-low-priority-filter-auto.png index af7e857088..488dac68d1 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-low-priority-filter-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-low-priority-filter-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-mentions-filter-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-mentions-filter-auto.png index a654ab1e94..8c12c2b6f1 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-mentions-filter-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-mentions-filter-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-people-filter-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-people-filter-auto.png index 1ff8fed3ea..c653542504 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-people-filter-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-people-filter-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-rooms-filter-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-rooms-filter-auto.png index 5a6cbf6cae..a7bdb640db 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-rooms-filter-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-rooms-filter-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-unread-filter-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-unread-filter-auto.png index 2d829787b2..987b586d25 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-unread-filter-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-unread-filter-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-without-create-permission-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-without-create-permission-auto.png index fac07b40c4..8cb6617e1e 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-without-create-permission-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/empty-without-create-permission-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/large-list-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/large-list-auto.png index 980c20f8f5..eb90df57d3 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/large-list-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/large-list-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/loading-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/loading-auto.png index bace5dba52..921f023c6a 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/loading-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/loading-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/small-list-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/small-list-auto.png index dd4d0a4bac..d23566e44a 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/small-list-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/small-list-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/with-active-filter-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/with-active-filter-auto.png index c8087956e2..b1d5edefd7 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/with-active-filter-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/with-active-filter-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/with-selection-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/with-selection-auto.png index ba35806f60..0dea042486 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/with-selection-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/RoomListView/RoomListView.stories.tsx/with-selection-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room-list/VirtualizedRoomListView/VirtualizedRoomListView.stories.tsx/default-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room-list/VirtualizedRoomListView/VirtualizedRoomListView.stories.tsx/default-auto.png index 0447c2d348..b592c21df2 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room-list/VirtualizedRoomListView/VirtualizedRoomListView.stories.tsx/default-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room-list/VirtualizedRoomListView/VirtualizedRoomListView.stories.tsx/default-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room/HistoryVisibilityBadge/HistoryVisibilityBadge.stories.tsx/invited-history-visibility-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room/HistoryVisibilityBadge/HistoryVisibilityBadge.stories.tsx/invited-history-visibility-auto.png index 27ae2f14a1..0a00318e8c 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room/HistoryVisibilityBadge/HistoryVisibilityBadge.stories.tsx/invited-history-visibility-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room/HistoryVisibilityBadge/HistoryVisibilityBadge.stories.tsx/invited-history-visibility-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room/HistoryVisibilityBadge/HistoryVisibilityBadge.stories.tsx/joined-history-visibility-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room/HistoryVisibilityBadge/HistoryVisibilityBadge.stories.tsx/joined-history-visibility-auto.png index 086460d8e6..0a00318e8c 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room/HistoryVisibilityBadge/HistoryVisibilityBadge.stories.tsx/joined-history-visibility-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room/HistoryVisibilityBadge/HistoryVisibilityBadge.stories.tsx/joined-history-visibility-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room/HistoryVisibilityBadge/HistoryVisibilityBadge.stories.tsx/shared-history-visibility-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room/HistoryVisibilityBadge/HistoryVisibilityBadge.stories.tsx/shared-history-visibility-auto.png index 2b47574de8..087388ef90 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room/HistoryVisibilityBadge/HistoryVisibilityBadge.stories.tsx/shared-history-visibility-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room/HistoryVisibilityBadge/HistoryVisibilityBadge.stories.tsx/shared-history-visibility-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room/HistoryVisibilityBadge/HistoryVisibilityBadge.stories.tsx/world-readable-history-visibility-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room/HistoryVisibilityBadge/HistoryVisibilityBadge.stories.tsx/world-readable-history-visibility-auto.png index 76a4eaf89c..438606ccd5 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room/HistoryVisibilityBadge/HistoryVisibilityBadge.stories.tsx/world-readable-history-visibility-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room/HistoryVisibilityBadge/HistoryVisibilityBadge.stories.tsx/world-readable-history-visibility-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room/RoomStatusBar/RoomStatusBarView.stories.tsx/with-connection-lost-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room/RoomStatusBar/RoomStatusBarView.stories.tsx/with-connection-lost-auto.png index cf66b145d0..68a558f12f 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room/RoomStatusBar/RoomStatusBarView.stories.tsx/with-connection-lost-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room/RoomStatusBar/RoomStatusBarView.stories.tsx/with-connection-lost-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room/RoomStatusBar/RoomStatusBarView.stories.tsx/with-consent-link-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room/RoomStatusBar/RoomStatusBarView.stories.tsx/with-consent-link-auto.png index ec27e69163..b0e3cace8f 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room/RoomStatusBar/RoomStatusBarView.stories.tsx/with-consent-link-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room/RoomStatusBar/RoomStatusBarView.stories.tsx/with-consent-link-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room/RoomStatusBar/RoomStatusBarView.stories.tsx/with-local-room-retry-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room/RoomStatusBar/RoomStatusBarView.stories.tsx/with-local-room-retry-auto.png index eab66ee802..9ed87499a3 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room/RoomStatusBar/RoomStatusBarView.stories.tsx/with-local-room-retry-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room/RoomStatusBar/RoomStatusBarView.stories.tsx/with-local-room-retry-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room/RoomStatusBar/RoomStatusBarView.stories.tsx/with-resource-limit-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room/RoomStatusBar/RoomStatusBarView.stories.tsx/with-resource-limit-auto.png index 74ab83fab2..45073ab991 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room/RoomStatusBar/RoomStatusBarView.stories.tsx/with-resource-limit-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room/RoomStatusBar/RoomStatusBarView.stories.tsx/with-resource-limit-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room/RoomStatusBar/RoomStatusBarView.stories.tsx/with-unsent-messages-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room/RoomStatusBar/RoomStatusBarView.stories.tsx/with-unsent-messages-auto.png index a08a9d4155..5a6a9ad6f3 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room/RoomStatusBar/RoomStatusBarView.stories.tsx/with-unsent-messages-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room/RoomStatusBar/RoomStatusBarView.stories.tsx/with-unsent-messages-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/room/RoomStatusBar/RoomStatusBarView.stories.tsx/with-unsent-messages-sending-auto.png b/packages/shared-components/__vis__/linux/__baselines__/room/RoomStatusBar/RoomStatusBarView.stories.tsx/with-unsent-messages-sending-auto.png index 4c8736bcec..a285416893 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/room/RoomStatusBar/RoomStatusBarView.stories.tsx/with-unsent-messages-sending-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/room/RoomStatusBar/RoomStatusBarView.stories.tsx/with-unsent-messages-sending-auto.png differ diff --git a/packages/shared-components/__vis__/linux/__baselines__/utils/VirtualizedList/VirtualizedList.stories.tsx/default-auto.png b/packages/shared-components/__vis__/linux/__baselines__/utils/VirtualizedList/VirtualizedList.stories.tsx/default-auto.png index c71aaab6b1..9dc97a2cfd 100644 Binary files a/packages/shared-components/__vis__/linux/__baselines__/utils/VirtualizedList/VirtualizedList.stories.tsx/default-auto.png and b/packages/shared-components/__vis__/linux/__baselines__/utils/VirtualizedList/VirtualizedList.stories.tsx/default-auto.png differ diff --git a/packages/shared-components/package.json b/packages/shared-components/package.json index 3d009a5fcd..364cc37ffc 100644 --- a/packages/shared-components/package.json +++ b/packages/shared-components/package.json @@ -44,10 +44,10 @@ "build": "nx build", "prepack": "pnpm run build", "storybook": "storybook dev -p 6007", - "build:storybook": "pnpm build:doc && storybook build && node scripts/storybook-build-i18n.ts", - "build:doc": "typedoc", + "build:storybook": "nx run @element-hq/web-shared-components:storybook", + "build:doc": "nx run @element-hq/web-shared-components:typedoc", "lint": "pnpm lint:types && pnpm lint:js", - "lint:js": "eslint --max-warnings 0 src && prettier --check .", + "lint:js": "eslint --max-warnings 0 src", "lint:types": "tsc --noEmit && tsc --noEmit -p tsconfig.node.json" }, "dependencies": { @@ -65,6 +65,7 @@ "devDependencies": { "@element-hq/element-web-playwright-common-local": "workspace:*", "@fetch-mock/vitest": "^0.2.18", + "@fontsource/inter": "catalog:", "@matrix-org/react-sdk-module-api": "^2.5.0", "@playwright/test": "catalog:", "@storybook/addon-a11y": "^10.0.7", @@ -119,7 +120,7 @@ "engines": { "node": ">=20.0.0" }, - "packageManager": "pnpm@10.28.2+sha512.41872f037ad22f7348e3b1debbaf7e867cfd448f2726d9cf74c08f19507c31d2c8e7a11525b983febc2df640b5438dee6023ebb1f84ed43cc2d654d2bc326264", + "packageManager": "pnpm@10.29.3+sha512.498e1fb4cca5aa06c1dcf2611e6fafc50972ffe7189998c409e90de74566444298ffe43e6cd2acdc775ba1aa7cc5e092a8b7054c811ba8c5770f84693d33d2dc", "peerDependencies": { "@vector-im/compound-web": "^8.3.5" } diff --git a/packages/shared-components/patches/@matrix-org+react-sdk-module-api+2.5.0.patch b/packages/shared-components/patches/@matrix-org+react-sdk-module-api+2.5.0.patch new file mode 100644 index 0000000000..33338c0960 --- /dev/null +++ b/packages/shared-components/patches/@matrix-org+react-sdk-module-api+2.5.0.patch @@ -0,0 +1,99 @@ +diff --git a/node_modules/@matrix-org/react-sdk-module-api/lib/ModuleApi.d.ts b/node_modules/@matrix-org/react-sdk-module-api/lib/ModuleApi.d.ts +index 917a7fc..a2710c6 100644 +--- a/node_modules/@matrix-org/react-sdk-module-api/lib/ModuleApi.d.ts ++++ b/node_modules/@matrix-org/react-sdk-module-api/lib/ModuleApi.d.ts +@@ -37,7 +37,7 @@ export interface ModuleApi { + * @returns Whether the user submitted the dialog or closed it, and the model returned by the + * dialog component if submitted. + */ +- openDialog = DialogContent

    >(initialTitleOrOptions: string | ModuleUiDialogOptions, body: (props: P, ref: React.RefObject) => React.ReactNode, props?: Omit): Promise<{ ++ openDialog = DialogContent

    >(initialTitleOrOptions: string | ModuleUiDialogOptions, body: (props: P, ref: React.RefObject) => React.ReactNode, props?: Omit): Promise<{ + didOkOrSubmit: boolean; + model: M; + }>; +diff --git a/node_modules/@matrix-org/react-sdk-module-api/lib/lifecycles/CryptoSetupExtensions.d.ts b/node_modules/@matrix-org/react-sdk-module-api/lib/lifecycles/CryptoSetupExtensions.d.ts +index cb5f2e5..51daa51 100644 +--- a/node_modules/@matrix-org/react-sdk-module-api/lib/lifecycles/CryptoSetupExtensions.d.ts ++++ b/node_modules/@matrix-org/react-sdk-module-api/lib/lifecycles/CryptoSetupExtensions.d.ts +@@ -66,23 +66,23 @@ export interface SetupEncryptionStoreProjection { + export interface ProvideCryptoSetupExtensions { + examineLoginResponse(response: any, credentials: ExtendedMatrixClientCreds): void; + persistCredentials(credentials: ExtendedMatrixClientCreds): void; +- getSecretStorageKey(): Uint8Array | null; +- createSecretStorageKey(): Uint8Array | null; ++ getSecretStorageKey(): Uint8Array | null; ++ createSecretStorageKey(): Uint8Array | null; + catchAccessSecretStorageError(e: Error): void; + setupEncryptionNeeded: (args: CryptoSetupArgs) => boolean; + /** @deprecated This callback is no longer used by matrix-react-sdk */ +- getDehydrationKeyCallback(): ((keyInfo: SecretStorageKeyDescription, checkFunc: (key: Uint8Array) => void) => Promise) | null; ++ getDehydrationKeyCallback(): ((keyInfo: SecretStorageKeyDescription, checkFunc: (key: Uint8Array) => void) => Promise>) | null; + SHOW_ENCRYPTION_SETUP_UI: boolean; + } + export declare abstract class CryptoSetupExtensionsBase implements ProvideCryptoSetupExtensions { + abstract examineLoginResponse(response: any, credentials: ExtendedMatrixClientCreds): void; + abstract persistCredentials(credentials: ExtendedMatrixClientCreds): void; +- abstract getSecretStorageKey(): Uint8Array | null; +- abstract createSecretStorageKey(): Uint8Array | null; ++ abstract getSecretStorageKey(): Uint8Array | null; ++ abstract createSecretStorageKey(): Uint8Array | null; + abstract catchAccessSecretStorageError(e: Error): void; + abstract setupEncryptionNeeded(args: CryptoSetupArgs): boolean; + /** `getDehydrationKeyCallback` is no longer used; we provide an empty impl for type compatibility. */ +- getDehydrationKeyCallback(): ((keyInfo: SecretStorageKeyDescription, checkFunc: (key: Uint8Array) => void) => Promise) | null; ++ getDehydrationKeyCallback(): ((keyInfo: SecretStorageKeyDescription, checkFunc: (key: Uint8Array) => void) => Promise>) | null; + abstract SHOW_ENCRYPTION_SETUP_UI: boolean; + } + export interface CryptoSetupArgs { +@@ -98,9 +98,9 @@ export declare class DefaultCryptoSetupExtensions extends CryptoSetupExtensionsB + SHOW_ENCRYPTION_SETUP_UI: boolean; + examineLoginResponse(response: any, credentials: ExtendedMatrixClientCreds): void; + persistCredentials(credentials: ExtendedMatrixClientCreds): void; +- getSecretStorageKey(): Uint8Array | null; +- createSecretStorageKey(): Uint8Array | null; ++ getSecretStorageKey(): Uint8Array | null; ++ createSecretStorageKey(): Uint8Array | null; + catchAccessSecretStorageError(e: Error): void; + setupEncryptionNeeded(args: CryptoSetupArgs): boolean; +- getDehydrationKeyCallback(): ((keyInfo: SecretStorageKeyDescription, checkFunc: (key: Uint8Array) => void) => Promise) | null; ++ getDehydrationKeyCallback(): ((keyInfo: SecretStorageKeyDescription, checkFunc: (key: Uint8Array) => void) => Promise>) | null; + } +diff --git a/node_modules/@matrix-org/react-sdk-module-api/lib/lifecycles/CryptoSetupExtensions.js b/node_modules/@matrix-org/react-sdk-module-api/lib/lifecycles/CryptoSetupExtensions.js +index 5d422ed..011c19f 100644 +--- a/node_modules/@matrix-org/react-sdk-module-api/lib/lifecycles/CryptoSetupExtensions.js ++++ b/node_modules/@matrix-org/react-sdk-module-api/lib/lifecycles/CryptoSetupExtensions.js +@@ -124,34 +124,28 @@ var DefaultCryptoSetupExtensions = /*#__PURE__*/function (_CryptoSetupExtension) + (0, _createClass2["default"])(DefaultCryptoSetupExtensions, [{ + key: "examineLoginResponse", + value: function examineLoginResponse(response, credentials) { +- console.log("Default empty examineLoginResponse() => void"); + } + }, { + key: "persistCredentials", + value: function persistCredentials(credentials) { +- console.log("Default empty persistCredentials() => void"); + } + }, { + key: "getSecretStorageKey", + value: function getSecretStorageKey() { +- console.log("Default empty getSecretStorageKey() => null"); + return null; + } + }, { + key: "createSecretStorageKey", + value: function createSecretStorageKey() { +- console.log("Default empty createSecretStorageKey() => null"); + return null; + } + }, { + key: "catchAccessSecretStorageError", + value: function catchAccessSecretStorageError(e) { +- console.log("Default catchAccessSecretStorageError() => void"); + } + }, { + key: "setupEncryptionNeeded", + value: function setupEncryptionNeeded(args) { +- console.log("Default setupEncryptionNeeded() => false"); + return false; + } + }, { diff --git a/packages/shared-components/project.json b/packages/shared-components/project.json index 8d82188c83..8178db5582 100644 --- a/packages/shared-components/project.json +++ b/packages/shared-components/project.json @@ -5,7 +5,7 @@ "build": { "cache": true, "command": "vite build", - "inputs": ["{projectRoot}/src/**/*"], + "inputs": ["src"], "outputs": ["{projectRoot}/dist"], "options": { "cwd": "packages/shared-components" } }, @@ -13,6 +13,25 @@ "command": "vite build --watch", "options": { "cwd": "packages/shared-components" }, "continuous": true + }, + "typedoc": { + "cache": "true", + "command": "typedoc", + "inputs": ["src"], + "outputs": ["{projectRoot}/typedoc"], + "options": { "cwd": "packages/shared-components" } + }, + "storybook": { + "cache": "true", + "inputs": ["src", "{projectRoot}/.storybook", "{projectRoot}/typedoc"], + "outputs": ["{projectRoot}/storybook-static"], + "executor": "nx:run-commands", + "options": { + "commands": ["storybook build", "node scripts/storybook-build-i18n.ts"], + "parallel": false, + "cwd": "packages/shared-components" + }, + "dependsOn": ["build", "typedoc"] } } } diff --git a/packages/shared-components/src/audio/AudioPlayerView/AudioPlayerView.stories.tsx b/packages/shared-components/src/audio/AudioPlayerView/AudioPlayerView.stories.tsx index 8e2c91eadc..b81b79ea57 100644 --- a/packages/shared-components/src/audio/AudioPlayerView/AudioPlayerView.stories.tsx +++ b/packages/shared-components/src/audio/AudioPlayerView/AudioPlayerView.stories.tsx @@ -8,12 +8,18 @@ import React, { type JSX } from "react"; import { fn } from "storybook/test"; -import type { Meta, StoryFn } from "@storybook/react-vite"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { AudioPlayerView, type AudioPlayerViewActions, type AudioPlayerViewSnapshot } from "./AudioPlayerView"; import { useMockedViewModel } from "../../viewmodel"; +import { withViewDocs } from "../../../.storybook/withViewDocs"; type AudioPlayerProps = AudioPlayerViewSnapshot & AudioPlayerViewActions; -const AudioPlayerViewWrapper = ({ togglePlay, onKeyDown, onSeekbarChange, ...rest }: AudioPlayerProps): JSX.Element => { +const AudioPlayerViewWrapperImpl = ({ + togglePlay, + onKeyDown, + onSeekbarChange, + ...rest +}: AudioPlayerProps): JSX.Element => { const vm = useMockedViewModel(rest, { togglePlay, onKeyDown, @@ -21,8 +27,9 @@ const AudioPlayerViewWrapper = ({ togglePlay, onKeyDown, onSeekbarChange, ...res }); return ; }; +const AudioPlayerViewWrapper = withViewDocs(AudioPlayerViewWrapperImpl, AudioPlayerView); -export default { +const meta = { title: "Audio/AudioPlayerView", component: AudioPlayerViewWrapper, tags: ["autodocs"], @@ -44,23 +51,27 @@ export default { onKeyDown: fn(), onSeekbarChange: fn(), }, -} as Meta; +} satisfies Meta; -const Template: StoryFn = (args) => ; +export default meta; +type Story = StoryObj; -export const Default = Template.bind({}); +export const Default: Story = {}; -export const NoMediaName = Template.bind({}); -NoMediaName.args = { - mediaName: undefined, +export const NoMediaName: Story = { + args: { + mediaName: undefined, + }, }; -export const NoSize = Template.bind({}); -NoSize.args = { - sizeBytes: undefined, +export const NoSize: Story = { + args: { + sizeBytes: undefined, + }, }; -export const HasError = Template.bind({}); -HasError.args = { - error: true, +export const HasError: Story = { + args: { + error: true, + }, }; diff --git a/packages/shared-components/src/audio/AudioPlayerView/AudioPlayerView.tsx b/packages/shared-components/src/audio/AudioPlayerView/AudioPlayerView.tsx index b68e06d2aa..43afc231b8 100644 --- a/packages/shared-components/src/audio/AudioPlayerView/AudioPlayerView.tsx +++ b/packages/shared-components/src/audio/AudioPlayerView/AudioPlayerView.tsx @@ -70,7 +70,7 @@ export interface AudioPlayerViewActions { /** * The view model for the audio player. */ -export type AudioPlayerViewModel = ViewModel & AudioPlayerViewActions; +export type AudioPlayerViewModel = ViewModel; interface AudioPlayerViewProps { /** diff --git a/packages/shared-components/src/audio/Clock/Clock.stories.tsx b/packages/shared-components/src/audio/Clock/Clock.stories.tsx index e05ee086d9..df2fab9ffc 100644 --- a/packages/shared-components/src/audio/Clock/Clock.stories.tsx +++ b/packages/shared-components/src/audio/Clock/Clock.stories.tsx @@ -5,25 +5,25 @@ * Please see LICENSE files in the repository root for full details. */ -import React from "react"; - -import type { Meta, StoryFn } from "@storybook/react-vite"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Clock } from "./Clock"; -export default { +const meta = { title: "Audio/Clock", component: Clock, tags: ["autodocs"], args: { seconds: 20, }, -} as Meta; +} satisfies Meta; -const Template: StoryFn = (args) => ; +export default meta; +type Story = StoryObj; -export const Default = Template.bind({}); +export const Default: Story = {}; -export const LotOfSeconds = Template.bind({}); -LotOfSeconds.args = { - seconds: 99999999999999, +export const LotOfSeconds: Story = { + args: { + seconds: 99999999999999, + }, }; diff --git a/packages/shared-components/src/audio/SeekBar/SeekBar.stories.tsx b/packages/shared-components/src/audio/SeekBar/SeekBar.stories.tsx index 6a3ec48666..b8a0e63569 100644 --- a/packages/shared-components/src/audio/SeekBar/SeekBar.stories.tsx +++ b/packages/shared-components/src/audio/SeekBar/SeekBar.stories.tsx @@ -9,9 +9,9 @@ import React from "react"; import { useArgs } from "storybook/preview-api"; import { SeekBar } from "./SeekBar"; -import type { Meta, StoryFn } from "@storybook/react-vite"; +import type { Meta, StoryObj } from "@storybook/react-vite"; -export default { +const meta = { title: "Audio/SeekBar", component: SeekBar, tags: ["autodocs"], @@ -23,16 +23,19 @@ export default { args: { value: 50, }, -} as Meta; + render: function Render(args) { + const [, updateArgs] = useArgs(); + return updateArgs({ value: parseInt(evt.target.value, 10) })} {...args} />; + }, +} satisfies Meta; -const Template: StoryFn = (args) => { - const [, updateArgs] = useArgs(); - return updateArgs({ value: parseInt(evt.target.value, 10) })} {...args} />; -}; - -export const Default = Template.bind({}); - -export const Disabled = Template.bind({}); -Disabled.args = { - disabled: true, +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Disabled: Story = { + args: { + disabled: true, + }, }; diff --git a/packages/shared-components/src/composer/Banner/Banner.module.css b/packages/shared-components/src/composer/Banner/Banner.module.css index 9fb25049a9..33ba140c44 100644 --- a/packages/shared-components/src/composer/Banner/Banner.module.css +++ b/packages/shared-components/src/composer/Banner/Banner.module.css @@ -9,7 +9,6 @@ container-type: inline-size; container-name: banner; display: flex; - align-items: center; justify-content: start; gap: var(--cpd-space-3x); padding: var(--cpd-space-4x); @@ -24,7 +23,7 @@ .banner[data-type="critical"] { background: var(--cpd-color-gradient-critical-linear); - border-color: var(--cpd-color-border-critical-primary); + border-color: var(--cpd-color-border-critical-subtle); } .banner[data-type="info"] { @@ -49,19 +48,9 @@ } .icon { - /* lock icon dimensions */ - min-width: 32px; - min-height: 32px; - max-width: 32px; - max-height: 32px; - - margin: 4px; - - /* centre svg icons, as they are not full width */ - flex: 0; + width: 24px; display: flex; - align-items: center; - justify-content: center; + align-items: flex-start; } .icon img { @@ -74,7 +63,7 @@ flex: 0; display: flex; flex-direction: row; - gap: var(--cpd-space-1x); + gap: var(--cpd-space-4x); align-self: center; white-space: nowrap; diff --git a/packages/shared-components/src/composer/Banner/Banner.tsx b/packages/shared-components/src/composer/Banner/Banner.tsx index 377e18ac12..56d53f87ad 100644 --- a/packages/shared-components/src/composer/Banner/Banner.tsx +++ b/packages/shared-components/src/composer/Banner/Banner.tsx @@ -16,7 +16,7 @@ import React, { } from "react"; import { Button } from "@vector-im/compound-web"; import CheckCircleIcon from "@vector-im/compound-design-tokens/assets/web/icons/check-circle"; -import ErrorIcon from "@vector-im/compound-design-tokens/assets/web/icons/error-solid"; +import ErrorIcon from "@vector-im/compound-design-tokens/assets/web/icons/error"; import InfoIcon from "@vector-im/compound-design-tokens/assets/web/icons/info"; import styles from "./Banner.module.css"; diff --git a/packages/shared-components/src/composer/Banner/__snapshots__/Banner.test.tsx.snap b/packages/shared-components/src/composer/Banner/__snapshots__/Banner.test.tsx.snap index b438e18ec6..9cc4cd3666 100644 --- a/packages/shared-components/src/composer/Banner/__snapshots__/Banner.test.tsx.snap +++ b/packages/shared-components/src/composer/Banner/__snapshots__/Banner.test.tsx.snap @@ -123,7 +123,7 @@ exports[`AvatarWithDetails > renders a critical banner 1`] = ` xmlns="http://www.w3.org/2000/svg" >

    diff --git a/packages/shared-components/src/event-tiles/EncryptionEventView/EncryptionEventView.module.css b/packages/shared-components/src/event-tiles/EncryptionEventView/EncryptionEventView.module.css new file mode 100644 index 0000000000..a49c7f1b05 --- /dev/null +++ b/packages/shared-components/src/event-tiles/EncryptionEventView/EncryptionEventView.module.css @@ -0,0 +1,10 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +.error { + color: var(--cpd-color-icon-critical-primary); +} diff --git a/packages/shared-components/src/event-tiles/EncryptionEventView/EncryptionEventView.stories.tsx b/packages/shared-components/src/event-tiles/EncryptionEventView/EncryptionEventView.stories.tsx new file mode 100644 index 0000000000..8a41e47adf --- /dev/null +++ b/packages/shared-components/src/event-tiles/EncryptionEventView/EncryptionEventView.stories.tsx @@ -0,0 +1,92 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { type JSX } from "react"; + +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { EncryptionEventView, EncryptionEventState, type EncryptionEventViewSnapshot } from "./EncryptionEventView"; +import { useMockedViewModel } from "../../viewmodel/useMockedViewModel"; +import { withViewDocs } from "../../../.storybook/withViewDocs"; + +type EncryptionEventProps = EncryptionEventViewSnapshot; + +const EncryptionEventViewWrapperImpl = ({ ...rest }: EncryptionEventProps): JSX.Element => { + const vm = useMockedViewModel(rest, {}); + + return ; +}; +const EncryptionEventViewWrapper = withViewDocs(EncryptionEventViewWrapperImpl, EncryptionEventView); + +const meta = { + title: "Event/EncryptionEvent", + component: EncryptionEventViewWrapper, + tags: ["autodocs"], + argTypes: { + state: { + options: Object.entries(EncryptionEventState) + .filter(([key, value]) => key === value) + .map(([key]) => key), + control: { type: "select" }, + }, + }, + args: { + state: EncryptionEventState.ENABLED, + encryptedStateEvents: false, + userName: "Alice", + className: "", + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const StateEncryptionEnabled: Story = { + args: { + state: EncryptionEventState.ENABLED, + encryptedStateEvents: true, + }, +}; + +export const ParametersChanged: Story = { + args: { + state: EncryptionEventState.CHANGED, + }, +}; + +export const DisableAttempt: Story = { + args: { + state: EncryptionEventState.DISABLE_ATTEMPT, + }, +}; + +export const EnabledDirectMessage: Story = { + args: { + state: EncryptionEventState.ENABLED_DM, + userName: "Alice", + }, +}; + +export const EnabledLocalRoom: Story = { + args: { + state: EncryptionEventState.ENABLED_LOCAL, + }, +}; + +export const Unsupported: Story = { + args: { + state: EncryptionEventState.UNSUPPORTED, + }, +}; + +export const WithTimestamp: Story = { + args: { + state: EncryptionEventState.ENABLED, + timestamp: 14:56, + }, +}; diff --git a/packages/shared-components/src/event-tiles/EncryptionEventView/EncryptionEventView.test.tsx b/packages/shared-components/src/event-tiles/EncryptionEventView/EncryptionEventView.test.tsx new file mode 100644 index 0000000000..214890b8ee --- /dev/null +++ b/packages/shared-components/src/event-tiles/EncryptionEventView/EncryptionEventView.test.tsx @@ -0,0 +1,150 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import { render, screen } from "@test-utils"; +import { composeStories } from "@storybook/react-vite"; +import { describe, it, expect } from "vitest"; +import React from "react"; + +import { EncryptionEventState, EncryptionEventView } from "./EncryptionEventView"; +import * as stories from "./EncryptionEventView.stories"; +import { MockViewModel } from "../../viewmodel"; + +const { + Default, + StateEncryptionEnabled, + ParametersChanged, + DisableAttempt, + EnabledDirectMessage, + EnabledLocalRoom, + Unsupported, + WithTimestamp, +} = composeStories(stories); + +describe("EncryptionEventView", () => { + const renderView = ( + state: EncryptionEventState, + encryptedStateEvents?: boolean, + userName?: string, + className?: string, + ): void => { + const vm = new MockViewModel({ + state, + encryptedStateEvents, + userName, + className, + }); + render(); + }; + + it("renders Default story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders StateEncryptionEnabled story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders ParametersChanged story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders DisableAttempt story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders EnabledDirectMessage story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders EnabledLocalRoom story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders Unsupported story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders WithTimestamp story", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("shows enabled room encryption copy", () => { + renderView(EncryptionEventState.ENABLED); + + expect(screen.getByText("Encryption enabled")).toBeInTheDocument(); + expect( + screen.getByText( + "Messages in this room are end-to-end encrypted. When people join, you can verify them in their profile, just tap on their profile picture.", + ), + ).toBeInTheDocument(); + }); + + it("shows enabled state encryption copy", () => { + renderView(EncryptionEventState.ENABLED, true); + + expect(screen.getByText("Experimental state encryption enabled")).toBeInTheDocument(); + expect( + screen.getByText( + "Messages and state events in this room are end-to-end encrypted. When people join, you can verify them in their profile, just tap on their profile picture.", + ), + ).toBeInTheDocument(); + }); + + it("shows changed encryption parameters copy", () => { + renderView(EncryptionEventState.CHANGED); + + expect(screen.getByText("Encryption enabled")).toBeInTheDocument(); + expect(screen.getByText("Some encryption parameters have been changed.")).toBeInTheDocument(); + }); + + it("shows disable attempt copy", () => { + renderView(EncryptionEventState.DISABLE_ATTEMPT); + + expect(screen.getByText("Encryption enabled")).toBeInTheDocument(); + expect(screen.getByText("Ignored attempt to disable encryption")).toBeInTheDocument(); + }); + + it("shows unsupported encryption copy", () => { + renderView(EncryptionEventState.UNSUPPORTED); + + expect(screen.getByText("Encryption not enabled")).toBeInTheDocument(); + expect(screen.getByText("The encryption used by this room isn't supported.")).toBeInTheDocument(); + }); + + it("shows local room encryption copy", () => { + renderView(EncryptionEventState.ENABLED_LOCAL); + + expect(screen.getByText("Encryption enabled")).toBeInTheDocument(); + expect(screen.getByText("Messages in this chat will be end-to-end encrypted.")).toBeInTheDocument(); + }); + + it("shows dm room encryption copy with display name", () => { + renderView(EncryptionEventState.ENABLED_DM, false, "Alice"); + + expect(screen.getByText("Encryption enabled")).toBeInTheDocument(); + expect( + screen.getByText( + "Messages here are end-to-end encrypted. Verify Alice in their profile - tap on their profile picture.", + ), + ).toBeInTheDocument(); + }); + + it("renders additional class name on the event tile bubble", () => { + renderView(EncryptionEventState.ENABLED, false, undefined, "custom-class"); + + expect(screen.getByText("Encryption enabled").parentElement).toHaveClass("custom-class"); + }); +}); diff --git a/packages/shared-components/src/event-tiles/EncryptionEventView/EncryptionEventView.tsx b/packages/shared-components/src/event-tiles/EncryptionEventView/EncryptionEventView.tsx new file mode 100644 index 0000000000..218ae74da6 --- /dev/null +++ b/packages/shared-components/src/event-tiles/EncryptionEventView/EncryptionEventView.tsx @@ -0,0 +1,100 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { type JSX } from "react"; +import { LockSolidIcon, ErrorSolidIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; + +import { type ViewModel, useViewModel } from "../../viewmodel"; +import styles from "./EncryptionEventView.module.css"; +import { useI18n } from "../../utils/i18nContext"; +import { EventTileBubble } from "../EventTileBubble"; + +export enum EncryptionEventState { + /** Encryption settings changed while encryption stayed enabled. */ + CHANGED = "CHANGED", + /** Someone attempted to disable encryption in an encrypted room. */ + DISABLE_ATTEMPT = "DISABLE_ATTEMPT", + /** Encryption was enabled in a regular room. */ + ENABLED = "ENABLED", + /** Encryption was enabled in a DM room. */ + ENABLED_DM = "ENABLED_DM", + /** Encryption was enabled in a local room. */ + ENABLED_LOCAL = "ENABLED_LOCAL", + /** Encryption is unavailable/unsupported for this event context. */ + UNSUPPORTED = "UNSUPPORTED", +} + +export type EncryptionEventViewSnapshot = { + /** Which encryption event variant to render. */ + state: EncryptionEventState; + /** Whether state-event encryption messaging should be shown. */ + encryptedStateEvents?: boolean; + /** Display name for DM partner, used by ENABLED_DM subtitle text. */ + userName?: string; + /** Optional CSS classes passed through to EventTileBubble. */ + className?: string; + /** Optional timestamp element rendered in the EventTileBubble footer slot. */ + timestamp?: JSX.Element; +}; + +/** + * ViewModel contract consumed by {@link EncryptionEventView}. + */ +export type EncryptionEventViewModel = ViewModel; + +export interface EncryptionEventViewProps { + /** + * ViewModel providing the current encryption event snapshot. + */ + vm: ViewModel; + /** + * Ref forwarded to the root DOM element. + */ + ref?: React.RefObject; +} + +export function EncryptionEventView({ vm, ref }: Readonly): JSX.Element { + const { translate: _t } = useI18n(); + const { state, encryptedStateEvents, userName, className, timestamp } = useViewModel(vm); + + let icon = ; + let title = encryptedStateEvents ? _t("common|state_encryption_enabled") : _t("common|encryption_enabled"); + let subtitle = ""; + + switch (state) { + case EncryptionEventState.CHANGED: + subtitle = _t("timeline|m.room.encryption|parameters_changed"); + break; + case EncryptionEventState.DISABLE_ATTEMPT: + title = _t("common|encryption_enabled"); + subtitle = _t("timeline|m.room.encryption|disable_attempt"); + break; + case EncryptionEventState.ENABLED: + subtitle = encryptedStateEvents + ? _t("timeline|m.room.encryption|state_enabled") + : _t("timeline|m.room.encryption|enabled"); + break; + case EncryptionEventState.ENABLED_DM: + subtitle = _t("timeline|m.room.encryption|enabled_dm", { displayName: userName }); + break; + case EncryptionEventState.ENABLED_LOCAL: + subtitle = _t("timeline|m.room.encryption|enabled_local"); + break; + case EncryptionEventState.UNSUPPORTED: + default: + icon = ; + title = _t("timeline|m.room.encryption|disabled"); + subtitle = _t("timeline|m.room.encryption|unsupported"); + break; + } + + return ( + + {timestamp} + + ); +} diff --git a/packages/shared-components/src/event-tiles/EncryptionEventView/__snapshots__/EncryptionEventView.test.tsx.snap b/packages/shared-components/src/event-tiles/EncryptionEventView/__snapshots__/EncryptionEventView.test.tsx.snap new file mode 100644 index 0000000000..09e39927bb --- /dev/null +++ b/packages/shared-components/src/event-tiles/EncryptionEventView/__snapshots__/EncryptionEventView.test.tsx.snap @@ -0,0 +1,245 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`EncryptionEventView > renders Default story 1`] = ` +
    +
    + + + +
    + Encryption enabled +
    +
    + Messages in this room are end-to-end encrypted. When people join, you can verify them in their profile, just tap on their profile picture. +
    +
    +
    +`; + +exports[`EncryptionEventView > renders DisableAttempt story 1`] = ` +
    +
    + + + +
    + Encryption enabled +
    +
    + Ignored attempt to disable encryption +
    +
    +
    +`; + +exports[`EncryptionEventView > renders EnabledDirectMessage story 1`] = ` +
    +
    + + + +
    + Encryption enabled +
    +
    + Messages here are end-to-end encrypted. Verify Alice in their profile - tap on their profile picture. +
    +
    +
    +`; + +exports[`EncryptionEventView > renders EnabledLocalRoom story 1`] = ` +
    +
    + + + +
    + Encryption enabled +
    +
    + Messages in this chat will be end-to-end encrypted. +
    +
    +
    +`; + +exports[`EncryptionEventView > renders ParametersChanged story 1`] = ` +
    +
    + + + +
    + Encryption enabled +
    +
    + Some encryption parameters have been changed. +
    +
    +
    +`; + +exports[`EncryptionEventView > renders StateEncryptionEnabled story 1`] = ` +
    +
    + + + +
    + Experimental state encryption enabled +
    +
    + Messages and state events in this room are end-to-end encrypted. When people join, you can verify them in their profile, just tap on their profile picture. +
    +
    +
    +`; + +exports[`EncryptionEventView > renders Unsupported story 1`] = ` +
    +
    + + + +
    + Encryption not enabled +
    +
    + The encryption used by this room isn't supported. +
    +
    +
    +`; + +exports[`EncryptionEventView > renders WithTimestamp story 1`] = ` +
    +
    + + + +
    + Encryption enabled +
    +
    + Messages in this room are end-to-end encrypted. When people join, you can verify them in their profile, just tap on their profile picture. +
    + + 14:56 + +
    +
    +`; diff --git a/packages/shared-components/src/event-tiles/EncryptionEventView/index.ts b/packages/shared-components/src/event-tiles/EncryptionEventView/index.ts new file mode 100644 index 0000000000..746d62db4e --- /dev/null +++ b/packages/shared-components/src/event-tiles/EncryptionEventView/index.ts @@ -0,0 +1,13 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +export { + EncryptionEventView, + EncryptionEventState, + type EncryptionEventViewSnapshot, + type EncryptionEventViewModel, +} from "./EncryptionEventView"; diff --git a/packages/shared-components/src/event-tiles/EventTileBubble/EventTileBubble.stories.tsx b/packages/shared-components/src/event-tiles/EventTileBubble/EventTileBubble.stories.tsx index 9ad126da3c..08d8fd9b73 100644 --- a/packages/shared-components/src/event-tiles/EventTileBubble/EventTileBubble.stories.tsx +++ b/packages/shared-components/src/event-tiles/EventTileBubble/EventTileBubble.stories.tsx @@ -8,10 +8,10 @@ import React from "react"; import { LockSolidIcon, ErrorSolidIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; -import type { Meta, StoryFn } from "@storybook/react-vite"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { EventTileBubble } from "./EventTileBubble"; -export default { +const meta = { title: "Event/EventTileBubble", component: EventTileBubble, tags: ["autodocs"], @@ -21,29 +21,33 @@ export default { subtitle: "Subtitle goes here", className: "custom-class", }, -} as Meta; +} satisfies Meta; -const Template: StoryFn = (args) => ; +export default meta; +type Story = StoryObj; -export const Default = Template.bind({}); +export const Default: Story = {}; -export const HasLockSolidIcon = Template.bind({}); -HasLockSolidIcon.args = { - className: undefined, - icon: , - children: undefined, +export const HasLockSolidIcon: Story = { + args: { + className: undefined, + icon: , + children: undefined, + }, }; -export const HasChildren = Template.bind({}); -HasChildren.args = { - className: undefined, - children:
    children
    , +export const HasChildren: Story = { + args: { + className: undefined, + children:
    children
    , + }, }; -export const IsCryptoEventBubble = Template.bind({}); -IsCryptoEventBubble.args = { - className: undefined, - icon: , - title: "Encryption enabled", - subtitle: "Messages here are end-to-end encrypted. Verify XYZ in their profile - tap on their profile picture.", +export const IsCryptoEventBubble: Story = { + args: { + className: undefined, + icon: , + title: "Encryption enabled", + subtitle: "Messages here are end-to-end encrypted. Verify XYZ in their profile - tap on their profile picture.", + }, }; diff --git a/packages/shared-components/src/event-tiles/TextualEventView/TextualEventView.stories.tsx b/packages/shared-components/src/event-tiles/TextualEventView/TextualEventView.stories.tsx index 0c89ce24d6..501da92dc6 100644 --- a/packages/shared-components/src/event-tiles/TextualEventView/TextualEventView.stories.tsx +++ b/packages/shared-components/src/event-tiles/TextualEventView/TextualEventView.stories.tsx @@ -5,21 +5,21 @@ SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial Please see LICENSE files in the repository root for full details. */ -import React from "react"; -import { type Meta, type StoryFn } from "@storybook/react-vite"; +import { type Meta, type StoryObj } from "@storybook/react-vite"; import { TextualEventView as TextualEventComponent } from "./TextualEventView"; import { MockViewModel } from "../../viewmodel/MockViewModel"; -export default { +const meta = { title: "Event/TextualEvent", component: TextualEventComponent, tags: ["autodocs"], args: { vm: new MockViewModel({ content: "Dummy textual event text" }), }, -} as Meta; +} satisfies Meta; -const Template: StoryFn = (args) => ; +export default meta; +type Story = StoryObj; -export const Default = Template.bind({}); +export const Default: Story = {}; diff --git a/packages/shared-components/src/i18n/strings/cs.json b/packages/shared-components/src/i18n/strings/cs.json index c16a2e29b0..fa49afb956 100644 --- a/packages/shared-components/src/i18n/strings/cs.json +++ b/packages/shared-components/src/i18n/strings/cs.json @@ -20,11 +20,19 @@ "start_chat": "Zahájit konverzaci" }, "common": { - "preferences": "Předvolby" + "encryption_enabled": "Šifrování povoleno", + "preferences": "Předvolby", + "state_encryption_enabled": "Experimentální šifrování stavu povoleno" }, "left_panel": { "open_dial_pad": "Otevřít číselník" }, + "notifications": { + "all_messages": "Všechny zprávy", + "default_settings": "Shoda s výchozím nastavením", + "mentions_keywords": "Zmínky a klíčová slova", + "mute_room": "Ztlumit místnost" + }, "room": { "context_menu": { "title": "Možnosti místnosti" @@ -50,8 +58,65 @@ } }, "room_list": { + "a11y": { + "default": "Otevřít místnost %(roomName)s", + "invitation": "Otevřít pozvánku do místnosti %(roomName)s.", + "mention": { + "one": "Otevřít místnost %(roomName)s s 1 nepřečtenou zmínkou.", + "few": "", + "other": "Otevřít místnost %(roomName)s s %(count)s nepřečtenými zmínkami." + }, + "unread": { + "one": "Otevřít místnost %(roomName)s s 1 nepřečtenou zprávou.", + "few": "", + "other": "Otevřít místnost %(roomName)s s %(count)s nepřečtenými zprávami." + }, + "unsent_message": "Otevřít místnost %(roomName)s s neodeslanou zprávou." + }, "appearance": "Vzhled", + "collapse_filters": "Sbalit seznam filtrů", + "empty": { + "no_chats": "Zatím žádné chaty", + "no_chats_description": "Začněte tím, že někomu pošlete zprávu nebo vytvoříte místnost", + "no_chats_description_no_room_rights": "Začněte tím, že někomu napíšete zprávu", + "no_favourites": "Zatím nemáte žádné oblíbené chaty", + "no_favourites_description": "Chat si můžete přidat do oblíbených v nastavení chatu", + "no_invites": "Nemáte žádné nepřečtené pozvánky", + "no_lowpriority": "Nemáte žádné místnosti s nízkou prioritou", + "no_mentions": "Nemáte žádné nepřečtené zmínky", + "no_people": "Zatím s nikým nemáte přímé chaty", + "no_people_description": "Můžete zrušit výběr filtrů, abyste viděli ostatní chaty", + "no_rooms": "Ještě nejste v žádné místnosti", + "no_rooms_description": "Můžete zrušit výběr filtrů, abyste viděli ostatní chaty", + "no_unread": "Gratulujeme! Nemáte žádné nepřečtené zprávy", + "show_activity": "Zobrazit veškerou aktivitu", + "show_chats": "Zobrazit všechny chaty" + }, + "expand_filters": "Rozbalit seznam filtrů", + "filters": { + "favourite": "Oblíbené", + "invites": "Pozvánky", + "low_priority": "Nízká priorita", + "mentions": "Zmínky", + "people": "Lidé", + "rooms": "Místnosti", + "unread": "Nepřečtené" + }, + "list_title": "Seznam místností", + "more_options": { + "copy_link": "Kopírovat odkaz na místnost", + "favourited": "Oblíbené", + "leave_room": "Opustit místnost", + "low_priority": "Nízká priorita", + "mark_read": "Označit jako přečtené", + "mark_unread": "Označit jako nepřečtené" + }, + "notification_options": "Možnosti oznámení", "open_space_menu": "Otevřít nabídku prostoru", + "primary_filters": "Filtry seznamu místností", + "room": { + "more_options": "Více možností" + }, "room_options": "Možnosti místnosti", "show_message_previews": "Zobrazit náhledy zpráv", "sort": "Řadit", @@ -98,7 +163,19 @@ "audio_player": "Audio přehrávač", "error_downloading_audio": "Chyba při stahování audia", "unnamed_audio": "Nepojmenovaný audio soubor" - } + }, + "m.room.encryption": { + "disable_attempt": "Ignorovaný pokus o deaktivaci šifrování", + "disabled": "Šifrování není povoleno", + "enabled": "Zprávy v této místnosti jsou koncově šifrovány. Když lidé vstoupí, můžete je ověřit v jejich profilu, stačí klepnout na jejich profilový obrázek.", + "enabled_dm": "Zprávy jsou zde koncově šifrovány. Ověřte %(displayName)s v jeho profilu - klepněte na jeho profilový obrázek.", + "enabled_local": "Zprávy v tomto chatu budou koncově šifrovány.", + "parameters_changed": "Některé parametry šifrování byly změněny.", + "state_enabled": "Zprávy a události v této místnosti jsou koncově šifrovány. Když se lidé připojí, můžete je ověřit v jejich profilu, stačí klepnout na jejich profilový obrázek.", + "unsupported": "Šifrování používané v této místnosti není podporováno." + }, + "message_timestamp_received_at": "Přijato: %(dateTime)s", + "message_timestamp_sent_at": "Odesláno: %(dateTime)s" }, "widget": { "context_menu": { diff --git a/packages/shared-components/src/i18n/strings/da.json b/packages/shared-components/src/i18n/strings/da.json index 39eb6ccfa8..339d455faf 100644 --- a/packages/shared-components/src/i18n/strings/da.json +++ b/packages/shared-components/src/i18n/strings/da.json @@ -10,6 +10,9 @@ "play": "Afspil", "search": "Søg" }, + "notifications": { + "all_messages": "Alle beskeder" + }, "time": { "about_day_ago": "omkring en dag siden", "about_hour_ago": "for omkring en time siden", diff --git a/packages/shared-components/src/i18n/strings/de_DE.json b/packages/shared-components/src/i18n/strings/de_DE.json index 158c75e6d5..1983bf5744 100644 --- a/packages/shared-components/src/i18n/strings/de_DE.json +++ b/packages/shared-components/src/i18n/strings/de_DE.json @@ -19,11 +19,17 @@ "start_chat": "Neuer Chat" }, "common": { + "encryption_enabled": "Verschlüsselung aktiviert", "preferences": "Einstellungen" }, "left_panel": { "open_dial_pad": "Wähltastatur öffnen" }, + "notifications": { + "all_messages": "All Nachrichten", + "mentions_keywords": "Erwähnungen und Schlüsselwörter", + "mute_room": "Chat stummschalten" + }, "room": { "context_menu": { "title": "Chatoptionen" @@ -47,8 +53,63 @@ } }, "room_list": { + "a11y": { + "default": "Öffne den Chat %(roomName)s", + "invitation": "Öffne die Chat Einladung zu %(roomName)s", + "mention": { + "one": "Öffne die Chat Einladung zu %(roomName)s mit einer Erwähnung.", + "other": "Öffne die Chat Einladung zu %(roomName)s mit %(count)s Erwähnungen." + }, + "unread": { + "one": "Öffne den Chat %(roomName)s mit einer ungelesenen Nachricht.", + "other": "Öffne den Chat %(roomName)s mit %(count)s ungelesenen Nachrichten." + }, + "unsent_message": "Öffne den Chat %(roomName)s mit einer ungesendeten Nachricht." + }, "appearance": "Darstellung", + "collapse_filters": "Filter Liste einklappen", + "empty": { + "no_chats": "Bisher keine Chats", + "no_chats_description": "Lege los, indem du jemandem schreibst oder eine Gruppe erstellst", + "no_chats_description_no_room_rights": "Lege los, indem du jemandem schreibst", + "no_favourites": "Du hast noch keine Chats als Favorit markiert", + "no_favourites_description": "In den Chat Einstellungen kannst du einen Chat als Favorit markieren", + "no_invites": "Du hast keine ungelesenen Einladungen", + "no_lowpriority": "Du hast keine Chats mit niedriger Priorität.", + "no_mentions": "Du hast keine ungelesenen Erwähnungen", + "no_people": "Du hast noch keine Direktnachrichten", + "no_people_description": "Wähle Filter ab, um Chats zu sehen.", + "no_rooms": "Du bist noch in keinem Chat", + "no_rooms_description": "Wähle Filter ab, um Chats zu sehen.", + "no_unread": "Glückwunsch! Du hast keine ungelesenen Nachrichten.", + "show_activity": "Alle Aktivitäten ansehen", + "show_chats": "Alle Chats anzeigen" + }, + "expand_filters": "Filterliste ausklappen", + "filters": { + "favourite": "Favoriten", + "invites": "Einladungen", + "low_priority": "Niedrige Priorität", + "mentions": "Erwähnungen", + "people": "Personen", + "rooms": "Gruppen", + "unread": "Ungelesen" + }, + "list_title": "Chatliste", + "more_options": { + "copy_link": "Chatlink kopieren", + "favourited": "Favorisiert", + "leave_room": "Chat verlassen", + "low_priority": "Niedrige Priorität", + "mark_read": "Als gelesen markieren", + "mark_unread": "Als ungelesen markieren" + }, + "notification_options": "Benachrichtigungsoptionen", "open_space_menu": "Menü für Spaces öffnen", + "primary_filters": "Filter für die Chatliste", + "room": { + "more_options": "Weitere Optionen" + }, "room_options": "Chatoptionen", "show_message_previews": "Nachrichtenvorschau anzeigen", "sort": "Sortieren", @@ -95,6 +156,12 @@ "audio_player": "Audio-Player", "error_downloading_audio": "Fehler beim Herunterladen der Audiodatei", "unnamed_audio": "Unbenannte Audiodatei" + }, + "m.room.encryption": { + "disabled": "Verschlüsselung nicht aktiviert", + "enabled": "Nachrichten in diesem Chat sind Ende-zu-Ende-verschlüsselt. Wenn Personen beitreten, kannst du sie in ihrem Profil verifizieren, indem du auf deren Profilbild klickst.", + "enabled_dm": "Nachrichten hier sind Ende-zu-Ende-verschlüsselt. Verifiziere %(displayName)s in deren Profil – klicke auf deren Profilbild.", + "enabled_local": "Nachrichten in diesem Chat werden Ende-zu-Ende-verschlüsselt." } }, "widget": { diff --git a/packages/shared-components/src/i18n/strings/en_EN.json b/packages/shared-components/src/i18n/strings/en_EN.json index 2ba72dd1c5..ff13817fd1 100644 --- a/packages/shared-components/src/i18n/strings/en_EN.json +++ b/packages/shared-components/src/i18n/strings/en_EN.json @@ -20,7 +20,9 @@ "start_chat": "Start chat" }, "common": { - "preferences": "Preferences" + "encryption_enabled": "Encryption enabled", + "preferences": "Preferences", + "state_encryption_enabled": "Experimental state encryption enabled" }, "left_panel": { "open_dial_pad": "Open dial pad" @@ -117,7 +119,7 @@ "show_message_previews": "Show message previews", "sort": "Sort", "sort_type": { - "activity": "Activity", + "activity": "Latest activity", "atoz": "A-Z", "unread_first": "Unread first" }, @@ -159,7 +161,19 @@ "audio_player": "Audio player", "error_downloading_audio": "Error downloading audio", "unnamed_audio": "Unnamed audio" - } + }, + "m.room.encryption": { + "disable_attempt": "Ignored attempt to disable encryption", + "disabled": "Encryption not enabled", + "enabled": "Messages in this room are end-to-end encrypted. When people join, you can verify them in their profile, just tap on their profile picture.", + "enabled_dm": "Messages here are end-to-end encrypted. Verify %(displayName)s in their profile - tap on their profile picture.", + "enabled_local": "Messages in this chat will be end-to-end encrypted.", + "parameters_changed": "Some encryption parameters have been changed.", + "state_enabled": "Messages and state events in this room are end-to-end encrypted. When people join, you can verify them in their profile, just tap on their profile picture.", + "unsupported": "The encryption used by this room isn't supported." + }, + "message_timestamp_received_at": "Received at: %(dateTime)s", + "message_timestamp_sent_at": "Sent at: %(dateTime)s" }, "widget": { "context_menu": { diff --git a/packages/shared-components/src/i18n/strings/et.json b/packages/shared-components/src/i18n/strings/et.json index 3b5d6dd7cf..d267bc295a 100644 --- a/packages/shared-components/src/i18n/strings/et.json +++ b/packages/shared-components/src/i18n/strings/et.json @@ -20,7 +20,9 @@ "start_chat": "Alusta vestlust" }, "common": { - "preferences": "Eelistused" + "encryption_enabled": "Krüptimine on kasutusel", + "preferences": "Eelistused", + "state_encryption_enabled": "Katseline olekusündmuste krüptimine on kasutusel" }, "left_panel": { "open_dial_pad": "Ava numbriklahvistik" @@ -159,6 +161,16 @@ "audio_player": "Meediaesitaja", "error_downloading_audio": "Helifaili allalaadimine ei õnnestunud", "unnamed_audio": "Nimetu helifail" + }, + "m.room.encryption": { + "disable_attempt": "Eirasin katset lõpetada krüptimise kasutamine", + "disabled": "Krüptimine ei ole kasutusel", + "enabled": "Sõnumid siin jututoas on läbivalt krüptitud. Kui uued kasutajad liituvad, siis klõpsides nende tunnuspilti saad neid verifitseerida.", + "enabled_dm": "Sõnumid siin vestluses on läbivalt krüptitud. Klõpsides tunnuspilti saad verifitseerida kasutaja %(displayName)s.", + "enabled_local": "Sõnumid siin vestluses on läbivalt krüptitud.", + "parameters_changed": "Mõned krüptimise parameetrid on muutunud.", + "state_enabled": "Selle jututoa sõnumid ja olekusündmused on läbivalt krüptitud. Kui uued kasutajad liituvad, siis saad nad verifitseerida tunnuspildile klõpsates.", + "unsupported": "Selles jututoas kasutatud krüptimine ei ole toetatud." } }, "widget": { diff --git a/packages/shared-components/src/i18n/strings/fr.json b/packages/shared-components/src/i18n/strings/fr.json index 9bbb504ea2..90db859858 100644 --- a/packages/shared-components/src/i18n/strings/fr.json +++ b/packages/shared-components/src/i18n/strings/fr.json @@ -20,7 +20,9 @@ "start_chat": "Démarrer une discussion" }, "common": { - "preferences": "Préférences" + "encryption_enabled": "Chiffrement activé", + "preferences": "Préférences", + "state_encryption_enabled": "Chiffrement expérimental de l'état activé" }, "left_panel": { "open_dial_pad": "Ouvrir le pavé de numérotation" @@ -117,7 +119,7 @@ "show_message_previews": "Afficher les aperçus des messages", "sort": "Trier", "sort_type": { - "activity": "Activité", + "activity": "Dernière activité", "atoz": "A-Z", "unread_first": "Non-lus en premier" }, @@ -159,7 +161,19 @@ "audio_player": "Lecteur audio", "error_downloading_audio": "Erreur lors du téléchargement de l’audio", "unnamed_audio": "Audio sans nom" - } + }, + "m.room.encryption": { + "disable_attempt": "Essai de désactiver le chiffrement ignoré", + "disabled": "Chiffrement désactivé", + "enabled": "Les messages ici sont chiffrés de bout en bout. Quand les gens viennent, vous pouvez les vérifier dans leur profil, tapez simplement sur leur image de profil.", + "enabled_dm": "Les messages ici sont chiffrés de bout en bout. Vérifiez %(displayName)s dans son profil - cliquez sur son image de profil.", + "enabled_local": "Les messages de cette discussion seront chiffrés de bout en bout.", + "parameters_changed": "Certains paramètres de chiffrement ont été changés.", + "state_enabled": "Les messages et les événements de ce salon sont chiffrés de bout en bout. Lorsque des personnes rejoignent le salon, vous pouvez les vérifier dans leur profil en cliquant sur leur photo de profil.", + "unsupported": "Le chiffrement utilisé par ce salon n’est pas pris en charge." + }, + "message_timestamp_received_at": "Reçu à : %(dateTime)s", + "message_timestamp_sent_at": "Envoyé à : %(dateTime)s" }, "widget": { "context_menu": { diff --git a/packages/shared-components/src/i18n/strings/ko.json b/packages/shared-components/src/i18n/strings/ko.json index 8ad0e6eb37..78bf3866e5 100644 --- a/packages/shared-components/src/i18n/strings/ko.json +++ b/packages/shared-components/src/i18n/strings/ko.json @@ -20,7 +20,9 @@ "start_chat": "채팅 시작" }, "common": { - "preferences": "환경설정" + "encryption_enabled": "암호화 활성화됨", + "preferences": "환경설정", + "state_encryption_enabled": "실험적 상태 암호화가 활성화되었습니다." }, "left_panel": { "open_dial_pad": "다이얼 패드 열기" @@ -157,6 +159,16 @@ "audio_player": "오디오 플레이어", "error_downloading_audio": "오디오 다운로드 중 오류 발생", "unnamed_audio": "이름 없는 오디오" + }, + "m.room.encryption": { + "disable_attempt": "암호화를 비활성화하려는 시도가 무시되었습니다.", + "disabled": "암호화가 활성화되지 않았습니다", + "enabled": "이 방의 메시지는 종단간 암호화로 보호됩니다. 새로운 사용자가 참여하면 프로필 사진을 탭하여 신원을 인증할 수 있습니다.", + "enabled_dm": "이곳의 메시지는 종단간 암호화로 보호됩니다. 프로필 사진을 탭하여 %(displayName)s 님을 인증하세요.", + "enabled_local": "이 채팅의 메시지는 종단간 암호화됩니다.", + "parameters_changed": "일부 암호화 설정이 변경되었습니다.", + "state_enabled": "이 방의 메시지와 상태 이벤트는 종단간 암호화로 보호됩니다. 새로운 사용자가 참여하면 프로필 사진을 탭하여 신원을 인증할 수 있습니다.", + "unsupported": "이 방에서 사용 중인 암호화 방식은 지원되지 않습니다." } }, "widget": { diff --git a/packages/shared-components/src/i18n/strings/ru.json b/packages/shared-components/src/i18n/strings/ru.json index 3396855dfa..311fc39468 100644 --- a/packages/shared-components/src/i18n/strings/ru.json +++ b/packages/shared-components/src/i18n/strings/ru.json @@ -5,15 +5,33 @@ "action": { "delete": "Удалить", "dismiss": "Закрыть", + "edit": "Редактировать", "explore_rooms": "Обзор комнат", + "invite": "Пригласить", + "new_conversation": "Новый диалог", + "new_room": "Новая комната", + "new_video_room": "Новая видеокомната", + "open_menu": "Открыть меню", "pause": "Пауза", "play": "Воспроизведение", - "search": "Поиск" + "remove": "Удалить", + "retry": "Повторить", + "search": "Поиск", + "start_chat": "Начать чат" }, "left_panel": { "open_dial_pad": "Открыть панель набора номера" }, + "notifications": { + "all_messages": "Все сообщения", + "default_settings": "Соответствует настройкам по умолчанию", + "mentions_keywords": "Упоминания и ключевые слова", + "mute_room": "Заглушить комнату" + }, "room": { + "context_menu": { + "title": "Настройки комнаты" + }, "status_bar": { "delete_all": "Удалить всё", "exceeded_resource_limit_description": "Свяжись с администратором сервиса, чтобы продолжить пользоваться услугой.", @@ -29,6 +47,49 @@ "some_messages_not_sent": "Некоторые сообщения не были отправлены" } }, + "room_list": { + "appearance": "Внешний вид", + "collapse_filters": "Свернуть список фильтров", + "empty": { + "show_activity": "Посмотреть всю активность", + "show_chats": "Показать все чаты" + }, + "filters": { + "favourite": "Избранное", + "invites": "Приглашения", + "low_priority": "Низкий приоритет", + "mentions": "Упоминания", + "people": "Люди", + "rooms": "Комнаты", + "unread": "Непрочитанные" + }, + "list_title": "Список комнат", + "more_options": { + "copy_link": "Скопировать ссылку на комнату", + "favourited": "Избранное", + "leave_room": "Покинуть комнату", + "low_priority": "Низкий приоритет", + "mark_read": "Отметить как прочитанное", + "mark_unread": "Отметить как непрочитанное" + }, + "notification_options": "Параметры уведомлений", + "open_space_menu": "Открыть меню пространств", + "primary_filters": "Фильтры комнат", + "room": { + "more_options": "Другие параметры" + }, + "room_options": "Настройки комнаты", + "show_message_previews": "Показать предварительный просмотр сообщений", + "sort": "Сортировать", + "sort_type": { + "activity": "Последняя активность", + "unread_first": "Сначала непрочитанные" + }, + "space_menu": { + "home": "Пространство — Главная", + "space_settings": "Настройки Пространства" + } + }, "terms": { "tac_button": "Просмотр условий и положений" }, @@ -49,6 +110,9 @@ "n_minutes_ago": "%(num)s минут назад" }, "timeline": { + "decryption_failure": { + "sender_unsigned_device": "Отправлено с незащищенного устройства" + }, "m.audio": { "audio_player": "Аудиоплеер", "error_downloading_audio": "Ошибка загрузки аудио", diff --git a/packages/shared-components/src/index.ts b/packages/shared-components/src/index.ts index a63432564a..50bdd62288 100644 --- a/packages/shared-components/src/index.ts +++ b/packages/shared-components/src/index.ts @@ -13,11 +13,14 @@ export * from "./audio/SeekBar"; export * from "./avatar/AvatarWithDetails"; export * from "./composer/Banner"; export * from "./crypto/SasEmoji"; +export * from "./event-tiles/EncryptionEventView"; export * from "./event-tiles/EventTileBubble"; export * from "./event-tiles/TextualEventView"; export * from "./message-body/MediaBody"; +export * from "./message-body/MessageTimestampView"; export * from "./message-body/DecryptionFailureBodyView"; export * from "./message-body/ReactionsRowButtonTooltip"; +export * from "./message-body/ReactionsRowButton"; export * from "./message-body/TimelineSeparator/"; export * from "./pill-input/Pill"; export * from "./pill-input/PillInput"; diff --git a/packages/shared-components/src/message-body/DecryptionFailureBodyView/DecryptionFailureBodyView.stories.tsx b/packages/shared-components/src/message-body/DecryptionFailureBodyView/DecryptionFailureBodyView.stories.tsx index 741f7420de..590583a9f8 100644 --- a/packages/shared-components/src/message-body/DecryptionFailureBodyView/DecryptionFailureBodyView.stories.tsx +++ b/packages/shared-components/src/message-body/DecryptionFailureBodyView/DecryptionFailureBodyView.stories.tsx @@ -7,23 +7,25 @@ import React, { type JSX } from "react"; -import type { Meta, StoryFn } from "@storybook/react-vite"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { DecryptionFailureBodyView, DecryptionFailureReason, type DecryptionFailureBodyViewSnapshot, } from "./DecryptionFailureBodyView"; import { useMockedViewModel } from "../../viewmodel/useMockedViewModel"; +import { withViewDocs } from "../../../.storybook/withViewDocs"; type DecryptionFailureBodyProps = DecryptionFailureBodyViewSnapshot; -const DecryptionFailureBodyViewWrapper = ({ ...rest }: DecryptionFailureBodyProps): JSX.Element => { +const DecryptionFailureBodyViewWrapperImpl = ({ ...rest }: DecryptionFailureBodyProps): JSX.Element => { const vm = useMockedViewModel(rest, {}); return ; }; +const DecryptionFailureBodyViewWrapper = withViewDocs(DecryptionFailureBodyViewWrapperImpl, DecryptionFailureBodyView); -export default { +const meta = { title: "MessageBody/DecryptionFailureBodyView", component: DecryptionFailureBodyViewWrapper, tags: ["autodocs"], @@ -40,42 +42,46 @@ export default { isLocalDeviceVerified: true, extraClassNames: ["extra_class"], }, -} as Meta; +} satisfies Meta; -const Template: StoryFn = (args) => ( - -); +export default meta; +type Story = StoryObj; -export const Default = Template.bind({}); +export const Default: Story = {}; -export const HasExtraClassNames = Template.bind({}); -HasExtraClassNames.args = { - decryptionFailureReason: DecryptionFailureReason.UNABLE_TO_DECRYPT, - extraClassNames: ["extra_class_1", "extra_class_2"], +export const HasExtraClassNames: Story = { + args: { + decryptionFailureReason: DecryptionFailureReason.UNABLE_TO_DECRYPT, + extraClassNames: ["extra_class_1", "extra_class_2"], + }, }; -export const HasErrorClassName = Template.bind({}); -HasErrorClassName.args = { - decryptionFailureReason: DecryptionFailureReason.UNSIGNED_SENDER_DEVICE, - extraClassNames: undefined, +export const HasErrorClassName: Story = { + args: { + decryptionFailureReason: DecryptionFailureReason.UNSIGNED_SENDER_DEVICE, + extraClassNames: undefined, + }, }; -export const HasErrorBlockIcon = Template.bind({}); -HasErrorBlockIcon.args = { - decryptionFailureReason: DecryptionFailureReason.SENDER_IDENTITY_PREVIOUSLY_VERIFIED, - extraClassNames: undefined, +export const HasErrorBlockIcon: Story = { + args: { + decryptionFailureReason: DecryptionFailureReason.SENDER_IDENTITY_PREVIOUSLY_VERIFIED, + extraClassNames: undefined, + }, }; -export const HasBackupConfiguredVerifiedFalse = Template.bind({}); -HasBackupConfiguredVerifiedFalse.args = { - decryptionFailureReason: DecryptionFailureReason.HISTORICAL_MESSAGE_BACKUP_UNCONFIGURED, - isLocalDeviceVerified: false, - extraClassNames: undefined, +export const HasBackupConfiguredVerifiedFalse: Story = { + args: { + decryptionFailureReason: DecryptionFailureReason.HISTORICAL_MESSAGE_BACKUP_UNCONFIGURED, + isLocalDeviceVerified: false, + extraClassNames: undefined, + }, }; -export const HasBackupConfiguredVerifiedTrue = Template.bind({}); -HasBackupConfiguredVerifiedTrue.args = { - decryptionFailureReason: DecryptionFailureReason.HISTORICAL_MESSAGE_BACKUP_UNCONFIGURED, - isLocalDeviceVerified: true, - extraClassNames: undefined, +export const HasBackupConfiguredVerifiedTrue: Story = { + args: { + decryptionFailureReason: DecryptionFailureReason.HISTORICAL_MESSAGE_BACKUP_UNCONFIGURED, + isLocalDeviceVerified: true, + extraClassNames: undefined, + }, }; diff --git a/packages/shared-components/src/message-body/DecryptionFailureBodyView/DecryptionFailureBodyView.tsx b/packages/shared-components/src/message-body/DecryptionFailureBodyView/DecryptionFailureBodyView.tsx index 23b0d639d5..8ea36dc1b6 100644 --- a/packages/shared-components/src/message-body/DecryptionFailureBodyView/DecryptionFailureBodyView.tsx +++ b/packages/shared-components/src/message-body/DecryptionFailureBodyView/DecryptionFailureBodyView.tsx @@ -84,7 +84,7 @@ interface DecryptionFailureBodyViewProps { /** * React ref to attach to any React components returned */ - ref?: React.RefObject; + ref?: React.RefObject; } /** diff --git a/packages/shared-components/src/message-body/MediaBody/MediaBody.stories.tsx b/packages/shared-components/src/message-body/MediaBody/MediaBody.stories.tsx index ee90a37943..bc41f88754 100644 --- a/packages/shared-components/src/message-body/MediaBody/MediaBody.stories.tsx +++ b/packages/shared-components/src/message-body/MediaBody/MediaBody.stories.tsx @@ -5,20 +5,19 @@ * Please see LICENSE files in the repository root for full details. */ -import React from "react"; - import { MediaBody } from "./MediaBody"; -import type { Meta, StoryFn } from "@storybook/react-vite"; +import type { Meta, StoryObj } from "@storybook/react-vite"; -export default { +const meta = { title: "MessageBody/MediaBody", component: MediaBody, tags: ["autodocs"], args: { children: "Media content goes here", }, -} as Meta; +} satisfies Meta; -const Template: StoryFn = (args) => ; +export default meta; +type Story = StoryObj; -export const Default = Template.bind({}); +export const Default: Story = {}; diff --git a/packages/shared-components/src/message-body/MessageTimestampView/MessageTimestampView.module.css b/packages/shared-components/src/message-body/MessageTimestampView/MessageTimestampView.module.css new file mode 100644 index 0000000000..6ee9d62aa1 --- /dev/null +++ b/packages/shared-components/src/message-body/MessageTimestampView/MessageTimestampView.module.css @@ -0,0 +1,16 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +.content { + color: var(--cpd-color-text-secondary) !important; /* override anchor color */ + font-size: var(--cpd-font-size-body-xs); + font-variant-numeric: tabular-nums; + display: inline-block; + white-space: nowrap; + user-select: none; + text-decoration: none; +} diff --git a/packages/shared-components/src/message-body/MessageTimestampView/MessageTimestampView.stories.tsx b/packages/shared-components/src/message-body/MessageTimestampView/MessageTimestampView.stories.tsx new file mode 100644 index 0000000000..13077b6c03 --- /dev/null +++ b/packages/shared-components/src/message-body/MessageTimestampView/MessageTimestampView.stories.tsx @@ -0,0 +1,89 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { type ReactNode } from "react"; +import { expect, userEvent, within } from "storybook/test"; + +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { + MessageTimestampView, + type MessageTimestampViewActions, + type MessageTimestampViewSnapshot, +} from "./MessageTimestampView"; +import { useMockedViewModel } from "../../viewmodel/useMockedViewModel"; +import { withViewDocs } from "../../../.storybook/withViewDocs"; + +type MessageTimestampProps = MessageTimestampViewSnapshot & MessageTimestampViewActions; +const MessageTimestampWrapperImpl = ({ onClick, onContextMenu, ...rest }: MessageTimestampProps): ReactNode => { + const vm = useMockedViewModel(rest, { + onClick, + onContextMenu, + }); + return ; +}; +const MessageTimestampWrapper = withViewDocs(MessageTimestampWrapperImpl, MessageTimestampView); + +const meta = { + title: "MessageBody/MessageTimestamp", + component: MessageTimestampWrapper, + tags: ["autodocs"], + args: { + ts: "04:58", + tsSentAt: "Thu, 17 Nov 2022, 4:58:32 pm", + tsReceivedAt: "", + inhibitTooltip: false, + className: "", + href: "", + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + await userEvent.hover(canvas.getByText("04:58")); + await expect(within(canvasElement.ownerDocument.body).findByRole("tooltip")).resolves.toBeInTheDocument(); + }, +}; + +export const HasTsReceivedAt: Story = { + args: { + tsReceivedAt: "Thu, 17 Nov 2022, 4:58:33 pm", + }, + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + await userEvent.hover(canvas.getByText("04:58")); + await expect(within(canvasElement.ownerDocument.body).findByRole("tooltip")).resolves.toBeInTheDocument(); + }, +}; + +export const HasInhibitTooltip: Story = { + args: { + inhibitTooltip: true, + }, +}; + +export const HasExtraClassNames: Story = { + args: { + className: "extra_class_1 extra_class_2", + }, +}; + +export const HasHref: Story = { + args: { + href: "~", + }, +}; + +export const HasActions: Story = { + args: { + onClick: () => console.log("Clicked message timestamp"), + onContextMenu: () => console.log("Context menu on message timestamp"), + }, +}; diff --git a/packages/shared-components/src/message-body/MessageTimestampView/MessageTimestampView.test.tsx b/packages/shared-components/src/message-body/MessageTimestampView/MessageTimestampView.test.tsx new file mode 100644 index 0000000000..f51b7ecc8b --- /dev/null +++ b/packages/shared-components/src/message-body/MessageTimestampView/MessageTimestampView.test.tsx @@ -0,0 +1,231 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import { render, screen, fireEvent } from "@test-utils"; +import { composeStories } from "@storybook/react-vite"; +import React from "react"; +import userEvent from "@testing-library/user-event"; +import { describe, it, vi, afterEach, expect } from "vitest"; + +import * as stories from "./MessageTimestampView.stories.tsx"; +import { + MessageTimestampView, + type MessageTimestampViewActions, + type MessageTimestampViewSnapshot, +} from "./MessageTimestampView"; +import { MockViewModel } from "../../viewmodel/MockViewModel.ts"; +import { I18nContext } from "../../utils/i18nContext.ts"; +import { I18nApi } from "../../index.ts"; + +const { Default, HasHref, HasExtraClassNames } = composeStories(stories); + +const renderWithI18n = (ui: React.ReactElement): ReturnType => + render(ui, { + wrapper: ({ children }) => {children}, + }); + +describe("MessageTimestampView", () => { + afterEach(() => { + vi.clearAllMocks(); + }); + + it("renders the message timestamp in default state", async () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders the message timestamp with extra class names", async () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders the message timestamp with href", async () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + const onClick = vi.fn((event: React.MouseEvent) => event.preventDefault()); + const onContextMenu = vi.fn((event: React.MouseEvent) => event.preventDefault()); + + class MessageTimestampViewModel + extends MockViewModel + implements MessageTimestampViewActions + { + public onClick = onClick; + public onContextMenu = onContextMenu; + } + + it("should attach vm methods with href", async () => { + const vm = new MessageTimestampViewModel({ + ts: "04:58", + tsSentAt: "Thu, 17 Nov 2022, 4:58:32 pm", + href: "~", + }); + + renderWithI18n(); + + const target = screen.getByRole("link"); + + fireEvent.click(target); + expect(onClick).toHaveBeenCalled(); + + fireEvent.contextMenu(target); + expect(onContextMenu).toHaveBeenCalled(); + }); + + it("should attach vm methods without href", async () => { + const user = userEvent.setup(); + const vm = new MessageTimestampViewModel({ + ts: "04:58", + tsSentAt: "Thu, 17 Nov 2022, 4:58:32 pm", + }); + + renderWithI18n(); + + const target = screen.getByRole("link", { hidden: true }); + + await user.click(target); + expect(onClick).toHaveBeenCalled(); + + await user.pointer({ target, keys: "[MouseRight]" }); + expect(onContextMenu).toHaveBeenCalled(); + }); + + it("should show full date & time on hover", async () => { + const user = userEvent.setup(); + const vm = new MessageTimestampViewModel({ + ts: "08:09", + tsSentAt: "Fri, Dec 17, 2021, 08:09:00", + }); + + renderWithI18n(); + + await user.hover(screen.getByRole("link")); + expect((await screen.findByRole("tooltip")).textContent).toMatchInlineSnapshot(`"Fri, Dec 17, 2021, 08:09:00"`); + }); + + it("should show sent & received time on hover if passed", async () => { + const user = userEvent.setup(); + const vm = new MessageTimestampViewModel({ + ts: "08:09", + tsSentAt: "Fri, Dec 17, 2021, 08:09:00", + tsReceivedAt: "Received at: Sat, Dec 18, 2021, 08:09:00", + }); + + renderWithI18n(); + + await user.hover(screen.getByRole("link")); + expect((await screen.findByRole("tooltip")).textContent).toMatchInlineSnapshot( + `"Sent at: Fri, Dec 17, 2021, 08:09:00Received at: Received at: Sat, Dec 18, 2021, 08:09:00"`, + ); + }); + + it("handles keyboard activation on span when click handler is set", async () => { + const vm = new MessageTimestampViewModel({ + ts: "12:34", + tsSentAt: "Mon, Jan 1, 2024, 12:34:00", + }); + + renderWithI18n(); + + const target = screen.getByRole("link"); + fireEvent.keyDown(target, { key: "Enter" }); + fireEvent.keyDown(target, { key: " " }); + + expect(onClick).toHaveBeenCalledTimes(2); + }); + + it("ignores other keys when click handler is set", async () => { + const vm = new MessageTimestampViewModel({ + ts: "13:14", + tsSentAt: "Tue, Jun 6, 2023, 13:14:00", + }); + + renderWithI18n(); + + const target = screen.getByRole("link"); + fireEvent.keyDown(target, { key: "Escape" }); + + expect(onClick).not.toHaveBeenCalled(); + }); + + it("ignores keyboard activation when no click handler is provided", async () => { + const vm = new MessageTimestampViewModelNoActions({ + ts: "15:16", + tsSentAt: "Wed, Jul 7, 2021, 15:16:00", + }); + + renderWithI18n(); + + const target = screen.getByText("15:16"); + fireEvent.keyDown(target, { key: "Enter" }); + + expect(onClick).not.toHaveBeenCalled(); + }); + + it("does not wrap tooltip labels when received timestamp is empty", async () => { + const user = userEvent.setup(); + const vm = new MessageTimestampViewModel({ + ts: "09:10", + tsSentAt: "Tue, Feb 2, 2021, 09:10:00", + tsReceivedAt: "", + }); + + renderWithI18n(); + + await user.hover(screen.getByRole("link")); + expect((await screen.findByRole("tooltip")).textContent).toMatchInlineSnapshot(`"Tue, Feb 2, 2021, 09:10:00"`); + }); + + class MessageTimestampViewModelNoActions extends MockViewModel {} + + it("renders without tooltip when inhibited and no click handler is provided", async () => { + const vm = new MessageTimestampViewModelNoActions({ + ts: "07:08", + tsSentAt: "Wed, Mar 3, 2021, 07:08:00", + inhibitTooltip: true, + }); + + renderWithI18n(); + + const target = screen.getByText("07:08"); + expect(target).not.toHaveAttribute("role"); + expect(target).not.toHaveAttribute("tabindex"); + expect(screen.queryByRole("tooltip")).toBeNull(); + }); + + it("keeps link semantics when inhibited but click handler exists", async () => { + const vm = new MessageTimestampViewModel({ + ts: "11:12", + tsSentAt: "Thu, Apr 4, 2024, 11:12:00", + inhibitTooltip: true, + }); + + renderWithI18n(); + + const target = screen.getByRole("link"); + expect(target).toHaveAttribute("tabindex", "0"); + expect(screen.queryByRole("tooltip")).toBeNull(); + }); + + it("exposes focusable span when tooltip is enabled without click handler", async () => { + const user = userEvent.setup(); + const vm = new MessageTimestampViewModelNoActions({ + ts: "03:04", + tsSentAt: "Fri, May 5, 2023, 03:04:00", + }); + + renderWithI18n(); + + const target = screen.getByText("03:04"); + expect(target).toHaveAttribute("tabindex", "0"); + expect(target).not.toHaveAttribute("role"); + + await user.hover(target); + expect((await screen.findByRole("tooltip")).textContent).toMatchInlineSnapshot(`"Fri, May 5, 2023, 03:04:00"`); + }); +}); diff --git a/packages/shared-components/src/message-body/MessageTimestampView/MessageTimestampView.tsx b/packages/shared-components/src/message-body/MessageTimestampView/MessageTimestampView.tsx new file mode 100644 index 0000000000..7ddb4a082c --- /dev/null +++ b/packages/shared-components/src/message-body/MessageTimestampView/MessageTimestampView.tsx @@ -0,0 +1,140 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { type JSX, type MouseEventHandler, type KeyboardEvent, type MouseEvent } from "react"; +import classNames from "classnames"; +import { Tooltip } from "@vector-im/compound-web"; + +import styles from "./MessageTimestampView.module.css"; +import { type ViewModel } from "../../viewmodel/ViewModel"; +import { useViewModel } from "../../viewmodel/useViewModel"; +import { useI18n } from "../../utils/i18nContext"; + +export interface MessageTimestampViewSnapshot { + /** + * The localized timestamp to render in the component + */ + ts: string; + /** + * The localized sent timestamp formatted as full date + */ + tsSentAt: string; + /** + * The localized received timestamp formatted as full date + * If specified will render both the sent-at and received-at timestamps in the tooltip + */ + tsReceivedAt?: string; + /** + * If set to true then no tooltip will be shown + */ + inhibitTooltip?: boolean; + /** + * Extra class name to apply to the component + */ + className?: string; + /** + * If specified, will be rendered as an anchor bearing the href, a `span` element will be used otherwise + */ + href?: string; +} + +export interface MessageTimestampViewActions { + /** + * Optional onClick handler to attach to the DOM element + */ + onClick?: MouseEventHandler; + /** + * Optional onContextMenu handler to attach to the DOM element + */ + onContextMenu?: MouseEventHandler; +} + +/** + * The view model for the message timestamp. + */ +export type MessageTimestampViewModel = ViewModel & MessageTimestampViewActions; + +interface MessageTimestampViewProps { + /** + * The view model for the message timestamp. + */ + vm: MessageTimestampViewModel; +} + +/** + * Displays a message timestamp with optional tooltip details. + * + * The view model provides the timestamp values and display options. The component + * can render as a link when `href` is set, and can show both sent-at and received-at + * times in the tooltip when `tsReceivedAt` is provided. + * + * @example + * ```tsx + * + * ``` + */ +export function MessageTimestampView({ vm }: Readonly): JSX.Element { + const { translate: _t } = useI18n(); + + const { ts, tsSentAt, tsReceivedAt, inhibitTooltip, className, href } = useViewModel(vm); + + const onKeyDown = (event: KeyboardEvent): void => { + if (vm.onClick) { + if (event.key === "Enter" || event.key === " ") { + event.preventDefault(); + vm.onClick?.(event as unknown as MouseEvent); + } + } + }; + + let label = tsSentAt; + let caption: string | undefined; + if (tsReceivedAt && tsReceivedAt?.length > 0) { + label = _t("timeline|message_timestamp_sent_at", { dateTime: label }); + caption = _t("timeline|message_timestamp_received_at", { + dateTime: tsReceivedAt, + }); + } + + let content; + if (href) { + content = ( + + {ts} + + ); + } else { + content = ( + + {ts} + + ); + } + + if (inhibitTooltip) return content; + + return ( + + {content} + + ); +} diff --git a/packages/shared-components/src/message-body/MessageTimestampView/__snapshots__/MessageTimestampView.test.tsx.snap b/packages/shared-components/src/message-body/MessageTimestampView/__snapshots__/MessageTimestampView.test.tsx.snap new file mode 100644 index 0000000000..67ae66820e --- /dev/null +++ b/packages/shared-components/src/message-body/MessageTimestampView/__snapshots__/MessageTimestampView.test.tsx.snap @@ -0,0 +1,37 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`MessageTimestampView > renders the message timestamp in default state 1`] = ` +
    + + 04:58 + +
    +`; + +exports[`MessageTimestampView > renders the message timestamp with extra class names 1`] = ` +
    + + 04:58 + +
    +`; + +exports[`MessageTimestampView > renders the message timestamp with href 1`] = ` + +`; diff --git a/packages/shared-components/src/message-body/MessageTimestampView/index.tsx b/packages/shared-components/src/message-body/MessageTimestampView/index.tsx new file mode 100644 index 0000000000..7c2e6fa440 --- /dev/null +++ b/packages/shared-components/src/message-body/MessageTimestampView/index.tsx @@ -0,0 +1,14 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +export type { + MessageTimestampViewModel, + MessageTimestampViewSnapshot, + MessageTimestampViewActions, +} from "./MessageTimestampView"; + +export { MessageTimestampView } from "./MessageTimestampView"; diff --git a/packages/shared-components/src/message-body/ReactionsRowButton/ReactionsRowButton.module.css b/packages/shared-components/src/message-body/ReactionsRowButton/ReactionsRowButton.module.css new file mode 100644 index 0000000000..3d1af1a83d --- /dev/null +++ b/packages/shared-components/src/message-body/ReactionsRowButton/ReactionsRowButton.module.css @@ -0,0 +1,39 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +.reactionsRowButton { + display: inline-flex; + all: unset; + line-height: var(--cpd-font-size-heading-sm); + padding: 1px var(--cpd-space-1-5x); + border: 1px solid var(--cpd-color-gray-400); + border-radius: 10px; + background-color: var(--cpd-color-gray-200); + user-select: none; + align-items: center; +} + +.reactionsRowButtonSelected { + background-color: var(--cpd-color-green-300); + border-color: var(--cpd-color-green-800); +} + +.reactionsRowButtonDisabled { + cursor: not-allowed; +} + +.reactionsRowButtonContent { + max-width: 100px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + padding-right: var(--cpd-space-1x); +} + +.reactionsRowButtonCount { + white-space: nowrap; +} diff --git a/packages/shared-components/src/message-body/ReactionsRowButton/ReactionsRowButton.stories.tsx b/packages/shared-components/src/message-body/ReactionsRowButton/ReactionsRowButton.stories.tsx new file mode 100644 index 0000000000..9a2a680c32 --- /dev/null +++ b/packages/shared-components/src/message-body/ReactionsRowButton/ReactionsRowButton.stories.tsx @@ -0,0 +1,93 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { type JSX } from "react"; +import { fn } from "storybook/test"; + +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { useMockedViewModel } from "../../viewmodel"; +import { type ReactionsRowButtonTooltipViewSnapshot } from "../ReactionsRowButtonTooltip"; +import { + ReactionsRowButtonView, + type ReactionsRowButtonViewSnapshot, + type ReactionsRowButtonViewActions, +} from "./ReactionsRowButtonView"; + +type WrapperProps = Omit & + Partial & { + ariaLabel?: string; + tooltipFormattedSenders?: ReactionsRowButtonTooltipViewSnapshot["formattedSenders"]; + tooltipCaption?: ReactionsRowButtonTooltipViewSnapshot["caption"]; + tooltipOpen?: ReactionsRowButtonTooltipViewSnapshot["tooltipOpen"]; + }; + +const ReactionsRowButtonViewWrapper = ({ + tooltipFormattedSenders, + tooltipCaption, + tooltipOpen, + onClick, + ...snapshotProps +}: WrapperProps): JSX.Element => { + const tooltipVm = useMockedViewModel( + { + formattedSenders: tooltipFormattedSenders, + caption: tooltipCaption, + tooltipOpen, + }, + {}, + ); + + const vm = useMockedViewModel( + { + ...snapshotProps, + tooltipVm, + }, + { + onClick: onClick ?? fn(), + }, + ); + + return ; +}; + +const meta = { + title: "MessageBody/ReactionsRowButton", + component: ReactionsRowButtonViewWrapper, + tags: ["autodocs"], + args: { + content: "👍", + count: 2, + ariaLabel: "Alice and Bob reacted with 👍", + isSelected: false, + isDisabled: false, + imageSrc: undefined, + imageAlt: undefined, + tooltipFormattedSenders: undefined, + tooltipCaption: undefined, + tooltipOpen: true, + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const Selected: Story = { + args: { + isSelected: true, + }, +}; + +export const WithTooltip: Story = { + args: { + count: 3, + tooltipFormattedSenders: "Alice, Bob and Charlie", + tooltipCaption: ":thumbsup:", + tooltipOpen: true, + }, +}; diff --git a/packages/shared-components/src/message-body/ReactionsRowButton/ReactionsRowButton.test.tsx b/packages/shared-components/src/message-body/ReactionsRowButton/ReactionsRowButton.test.tsx new file mode 100644 index 0000000000..0e13963dac --- /dev/null +++ b/packages/shared-components/src/message-body/ReactionsRowButton/ReactionsRowButton.test.tsx @@ -0,0 +1,27 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import { composeStories } from "@storybook/react-vite"; +import { render } from "@test-utils"; +import React from "react"; +import { describe, it, expect } from "vitest"; + +import * as stories from "./ReactionsRowButton.stories"; + +const { Default, Selected } = composeStories(stories); + +describe("ReactionsRowButton", () => { + it("renders the default reaction button", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders the selected reaction button", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); +}); diff --git a/packages/shared-components/src/message-body/ReactionsRowButton/ReactionsRowButtonView.tsx b/packages/shared-components/src/message-body/ReactionsRowButton/ReactionsRowButtonView.tsx new file mode 100644 index 0000000000..a4ca3d18e5 --- /dev/null +++ b/packages/shared-components/src/message-body/ReactionsRowButton/ReactionsRowButtonView.tsx @@ -0,0 +1,104 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { type HTMLAttributes, type JSX } from "react"; +import classNames from "classnames"; + +import { type ViewModel, useViewModel } from "../../viewmodel"; +import { ReactionsRowButtonTooltipView, type ReactionsRowButtonTooltipViewModel } from "../ReactionsRowButtonTooltip"; +import styles from "./ReactionsRowButton.module.css"; + +export interface ReactionsRowButtonViewSnapshot extends Pick< + HTMLAttributes, + "className" | "aria-label" +> { + /** + * The reaction content to display when not using a custom image. + */ + content?: string; + /** + * The total number of reactions for this content. + */ + count: number; + /** + * Whether the reaction button is selected by the current user. + */ + isSelected: boolean; + /** + * Whether the reaction button is disabled. + * @default false + */ + isDisabled?: boolean; + /** + * The image URL to render when using a custom reaction image. + */ + imageSrc?: string; + /** + * The alt text for the custom reaction image. + */ + imageAlt?: string; + /** + * View model for the tooltip wrapper. + */ + tooltipVm: ReactionsRowButtonTooltipViewModel; +} + +export interface ReactionsRowButtonViewActions { + /** + * Called when the user activates the reaction button. + */ + onClick: () => void; +} + +export type ReactionsRowButtonViewModel = ViewModel & ReactionsRowButtonViewActions; + +interface ReactionsRowButtonViewProps { + /** + * The view model for the reactions row button. + */ + vm: ReactionsRowButtonViewModel; +} + +/** + * Renders the reaction button in a reactions row. + */ +export function ReactionsRowButtonView({ vm }: Readonly): JSX.Element { + const snapshot = useViewModel(vm) as ReactionsRowButtonViewSnapshot & { ariaLabel?: string }; + const { content, count, className, isSelected, isDisabled, imageSrc, imageAlt, tooltipVm } = snapshot; + const ariaLabel = snapshot["aria-label"] ?? snapshot.ariaLabel; + const ariaDisabled = isDisabled ? true : undefined; + const classes = classNames(className, styles.reactionsRowButton, { + [styles.reactionsRowButtonSelected]: isSelected, + [styles.reactionsRowButtonDisabled]: isDisabled, + }); + + const reactionContent = imageSrc ? ( + {imageAlt + ) : ( + + ); + + return ( + + + + ); +} diff --git a/packages/shared-components/src/message-body/ReactionsRowButton/__snapshots__/ReactionsRowButton.test.tsx.snap b/packages/shared-components/src/message-body/ReactionsRowButton/__snapshots__/ReactionsRowButton.test.tsx.snap new file mode 100644 index 0000000000..acd1740f5f --- /dev/null +++ b/packages/shared-components/src/message-body/ReactionsRowButton/__snapshots__/ReactionsRowButton.test.tsx.snap @@ -0,0 +1,49 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`ReactionsRowButton > renders the default reaction button 1`] = ` +
    + +
    +`; + +exports[`ReactionsRowButton > renders the selected reaction button 1`] = ` +
    + +
    +`; diff --git a/packages/shared-components/src/message-body/ReactionsRowButton/index.tsx b/packages/shared-components/src/message-body/ReactionsRowButton/index.tsx new file mode 100644 index 0000000000..85ff09404a --- /dev/null +++ b/packages/shared-components/src/message-body/ReactionsRowButton/index.tsx @@ -0,0 +1,13 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +export { + ReactionsRowButtonView, + type ReactionsRowButtonViewSnapshot, + type ReactionsRowButtonViewModel, + type ReactionsRowButtonViewActions, +} from "./ReactionsRowButtonView"; diff --git a/packages/shared-components/src/message-body/ReactionsRowButtonTooltip/ReactionsRowButtonTooltip.stories.tsx b/packages/shared-components/src/message-body/ReactionsRowButtonTooltip/ReactionsRowButtonTooltip.stories.tsx index ff8fa315b5..4d5095e334 100644 --- a/packages/shared-components/src/message-body/ReactionsRowButtonTooltip/ReactionsRowButtonTooltip.stories.tsx +++ b/packages/shared-components/src/message-body/ReactionsRowButtonTooltip/ReactionsRowButtonTooltip.stories.tsx @@ -7,8 +7,9 @@ import React, { type JSX, type PropsWithChildren } from "react"; -import type { Meta, StoryFn } from "@storybook/react-vite"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { useMockedViewModel } from "../../viewmodel"; +import { withViewDocs } from "../../../.storybook/withViewDocs"; import { ReactionsRowButtonTooltipView, type ReactionsRowButtonTooltipViewSnapshot, @@ -16,12 +17,16 @@ import { type WrapperProps = ReactionsRowButtonTooltipViewSnapshot & PropsWithChildren; -const ReactionsRowButtonTooltipViewWrapper = ({ children, ...snapshotProps }: WrapperProps): JSX.Element => { +const ReactionsRowButtonTooltipViewWrapperImpl = ({ children, ...snapshotProps }: WrapperProps): JSX.Element => { const vm = useMockedViewModel(snapshotProps, {}); return {children}; }; +const ReactionsRowButtonTooltipViewWrapper = withViewDocs( + ReactionsRowButtonTooltipViewWrapperImpl, + ReactionsRowButtonTooltipView, +); -export default { +const meta = { title: "MessageBody/ReactionsRowButtonTooltip", component: ReactionsRowButtonTooltipViewWrapper, tags: ["autodocs"], @@ -32,38 +37,41 @@ export default { args: { children: , }, -} as Meta; +} satisfies Meta; -const Template: StoryFn = (args) => ( - -); +export default meta; +type Story = StoryObj; -export const Default = Template.bind({}); -Default.args = { - formattedSenders: "Alice, Bob and Charlie", - caption: ":thumbsup:", - tooltipOpen: true, +export const Default: Story = { + args: { + formattedSenders: "Alice, Bob and Charlie", + caption: ":thumbsup:", + tooltipOpen: true, + }, }; -export const ManySenders = Template.bind({}); -ManySenders.args = { - formattedSenders: "Alice, Bob, Charlie, David, Eve, Frank and 2 others", - caption: ":heart:", - children: , - tooltipOpen: true, +export const ManySenders: Story = { + args: { + formattedSenders: "Alice, Bob, Charlie, David, Eve, Frank and 2 others", + caption: ":heart:", + children: , + tooltipOpen: true, + }, }; -export const WithoutCaption = Template.bind({}); -WithoutCaption.args = { - formattedSenders: "Alice and Bob", - caption: undefined, - children: , - tooltipOpen: true, +export const WithoutCaption: Story = { + args: { + formattedSenders: "Alice and Bob", + caption: undefined, + children: , + tooltipOpen: true, + }, }; -export const NoTooltip = Template.bind({}); -NoTooltip.args = { - formattedSenders: undefined, - caption: undefined, - children: , +export const NoTooltip: Story = { + args: { + formattedSenders: undefined, + caption: undefined, + children: , + }, }; diff --git a/packages/shared-components/src/message-body/TimelineSeparator/TimelineSeparator.stories.tsx b/packages/shared-components/src/message-body/TimelineSeparator/TimelineSeparator.stories.tsx index cf067f4ecd..c103b96028 100644 --- a/packages/shared-components/src/message-body/TimelineSeparator/TimelineSeparator.stories.tsx +++ b/packages/shared-components/src/message-body/TimelineSeparator/TimelineSeparator.stories.tsx @@ -7,11 +7,11 @@ import React from "react"; -import type { Meta, StoryFn } from "@storybook/react-vite"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import TimelineSeparator from "./TimelineSeparator"; import styles from "./TimelineSeparator.module.css"; -export default { +const meta = { title: "MessageBody/TimelineSeparator", component: TimelineSeparator, tags: ["autodocs"], @@ -19,36 +19,41 @@ export default { label: "Label Separator", children: "Timeline Separator", }, -} as Meta; +} satisfies Meta; -const Template: StoryFn = (args) => ; +export default meta; +type Story = StoryObj; -export const Default = Template.bind({}); +export const Default: Story = {}; -export const WithHtmlChild = Template.bind({}); -WithHtmlChild.args = { - label: "Custom Label", - children: ( - - ), +export const WithHtmlChild: Story = { + args: { + label: "Custom Label", + children: ( + + ), + }, }; -export const WithDateEvent = Template.bind({}); -WithDateEvent.args = { - label: "Date Event Separator", - children: "Wednesday", +export const WithDateEvent: Story = { + args: { + label: "Date Event Separator", + children: "Wednesday", + }, }; -export const WithLateEvent = Template.bind({}); -WithLateEvent.args = { - label: "Late Event Separator", - children: "Fri, Jan 9, 2026", +export const WithLateEvent: Story = { + args: { + label: "Late Event Separator", + children: "Fri, Jan 9, 2026", + }, }; -export const WithoutChildren = Template.bind({}); -WithoutChildren.args = { - children: undefined, - label: "Separator without children", +export const WithoutChildren: Story = { + args: { + children: undefined, + label: "Separator without children", + }, }; diff --git a/packages/shared-components/src/profile/DisambiguatedProfile/DisambiguatedProfile.stories.tsx b/packages/shared-components/src/profile/DisambiguatedProfile/DisambiguatedProfile.stories.tsx index 1f9128d3e0..b3231a5f75 100644 --- a/packages/shared-components/src/profile/DisambiguatedProfile/DisambiguatedProfile.stories.tsx +++ b/packages/shared-components/src/profile/DisambiguatedProfile/DisambiguatedProfile.stories.tsx @@ -8,22 +8,24 @@ import React, { type JSX } from "react"; import { fn } from "storybook/test"; -import type { Meta, StoryFn } from "@storybook/react-vite"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { DisambiguatedProfileView, type DisambiguatedProfileViewSnapshot, type DisambiguatedProfileViewActions, } from "./DisambiguatedProfileView"; import { useMockedViewModel } from "../../viewmodel"; +import { withViewDocs } from "../../../.storybook/withViewDocs"; type DisambiguatedProfileProps = DisambiguatedProfileViewSnapshot & DisambiguatedProfileViewActions; -const DisambiguatedProfileViewWrapper = ({ onClick, ...rest }: DisambiguatedProfileProps): JSX.Element => { +const DisambiguatedProfileViewWrapperImpl = ({ onClick, ...rest }: DisambiguatedProfileProps): JSX.Element => { const vm = useMockedViewModel(rest, { onClick }); return ; }; +const DisambiguatedProfileViewWrapper = withViewDocs(DisambiguatedProfileViewWrapperImpl, DisambiguatedProfileView); -export default { +const meta = { title: "Profile/DisambiguatedProfile", component: DisambiguatedProfileViewWrapper, tags: ["autodocs"], @@ -40,44 +42,48 @@ export default { emphasizeDisplayName: true, onClick: fn(), }, -} as Meta; +} satisfies Meta; -const Template: StoryFn = (args) => ( - -); +export default meta; +type Story = StoryObj; -export const Default = Template.bind({}); +export const Default: Story = {}; -export const WithMxid = Template.bind({}); -WithMxid.args = { - displayName: "Alice", - displayIdentifier: "@alice:example.org", - colorClass: "mx_Username_color1", +export const WithMxid: Story = { + args: { + displayName: "Alice", + displayIdentifier: "@alice:example.org", + colorClass: "mx_Username_color1", + }, }; -export const WithColorClass = Template.bind({}); -WithColorClass.args = { - displayName: "Bob", - colorClass: "mx_Username_color3", +export const WithColorClass: Story = { + args: { + displayName: "Bob", + colorClass: "mx_Username_color3", + }, }; -export const Emphasized = Template.bind({}); -Emphasized.args = { - displayName: "Charlie", - emphasizeDisplayName: true, +export const Emphasized: Story = { + args: { + displayName: "Charlie", + emphasizeDisplayName: true, + }, }; -export const WithTooltip = Template.bind({}); -WithTooltip.args = { - displayName: "Diana", - title: "Diana (@diana:example.org)", +export const WithTooltip: Story = { + args: { + displayName: "Diana", + title: "Diana (@diana:example.org)", + }, }; -export const FullExample = Template.bind({}); -FullExample.args = { - displayName: "Eve", - displayIdentifier: "@eve:matrix.org", - colorClass: "mx_Username_color5", - title: "Eve (@eve:matrix.org)", - emphasizeDisplayName: true, +export const FullExample: Story = { + args: { + displayName: "Eve", + displayIdentifier: "@eve:matrix.org", + colorClass: "mx_Username_color5", + title: "Eve (@eve:matrix.org)", + emphasizeDisplayName: true, + }, }; diff --git a/packages/shared-components/src/profile/DisambiguatedProfile/DisambiguatedProfileView.tsx b/packages/shared-components/src/profile/DisambiguatedProfile/DisambiguatedProfileView.tsx index df5128b2d8..3489541cfd 100644 --- a/packages/shared-components/src/profile/DisambiguatedProfile/DisambiguatedProfileView.tsx +++ b/packages/shared-components/src/profile/DisambiguatedProfile/DisambiguatedProfileView.tsx @@ -57,8 +57,10 @@ export interface DisambiguatedProfileViewActions { /** * The view model for DisambiguatedProfileView. */ -export type DisambiguatedProfileViewModel = ViewModel & - DisambiguatedProfileViewActions; +export type DisambiguatedProfileViewModel = ViewModel< + DisambiguatedProfileViewSnapshot, + DisambiguatedProfileViewActions +>; interface DisambiguatedProfileViewProps { /** diff --git a/packages/shared-components/src/rich-list/RichItem/RichItem.stories.tsx b/packages/shared-components/src/rich-list/RichItem/RichItem.stories.tsx index 11834bf6c4..ffa63a1903 100644 --- a/packages/shared-components/src/rich-list/RichItem/RichItem.stories.tsx +++ b/packages/shared-components/src/rich-list/RichItem/RichItem.stories.tsx @@ -8,12 +8,12 @@ import React from "react"; import { fn } from "storybook/test"; -import type { Meta, StoryFn } from "@storybook/react-vite"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { RichItem } from "./RichItem"; const currentTimestamp = new Date("2025-03-09T12:00:00Z").getTime(); -export default { +const meta = { title: "RichList/RichItem", component: RichItem, tags: ["autodocs"], @@ -32,33 +32,39 @@ export default { context: "button", }, }, -} as Meta; + render: (args) => ( +
      + +
    + ), +} satisfies Meta; -const Template: StoryFn = (args) => ( -
      - -
    -); +export default meta; +type Story = StoryObj; -export const Default = Template.bind({}); +export const Default: Story = {}; -export const Selected = Template.bind({}); -Selected.args = { - selected: true, +export const Selected: Story = { + args: { + selected: true, + }, }; -export const WithoutTimestamp = Template.bind({}); -WithoutTimestamp.args = { - timestamp: undefined, +export const WithoutTimestamp: Story = { + args: { + timestamp: undefined, + }, }; -export const Hover = Template.bind({}); -Hover.parameters = { pseudo: { hover: true } }; +export const Hover: Story = { + parameters: { pseudo: { hover: true } }, +}; -const TemplateSeparator: StoryFn = (args) => ( -
      - - -
    -); -export const Separator = TemplateSeparator.bind({}); +export const Separator: Story = { + render: (args) => ( +
      + + +
    + ), +}; diff --git a/packages/shared-components/src/right-panel/WidgetContextMenu/WidgetContextMenuView.stories.tsx b/packages/shared-components/src/right-panel/WidgetContextMenu/WidgetContextMenuView.stories.tsx index 87d3515d0c..3e3c2daeeb 100644 --- a/packages/shared-components/src/right-panel/WidgetContextMenu/WidgetContextMenuView.stories.tsx +++ b/packages/shared-components/src/right-panel/WidgetContextMenu/WidgetContextMenuView.stories.tsx @@ -10,17 +10,18 @@ import { fn } from "storybook/test"; import { IconButton } from "@vector-im/compound-web"; import TriggerIcon from "@vector-im/compound-design-tokens/assets/web/icons/overflow-horizontal"; -import type { Meta, StoryFn } from "@storybook/react-vite"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { type WidgetContextMenuAction, type WidgetContextMenuSnapshot, WidgetContextMenuView, } from "./WidgetContextMenuView"; import { useMockedViewModel } from "../../viewmodel/useMockedViewModel"; +import { withViewDocs } from "../../../.storybook/withViewDocs"; type WidgetContextMenuViewModelProps = WidgetContextMenuSnapshot & WidgetContextMenuAction; -const WidgetContextMenuViewWrapper = ({ +const WidgetContextMenuViewWrapperImpl = ({ onStreamAudioClick, onEditClick, onSnapshotClick, @@ -41,8 +42,9 @@ const WidgetContextMenuViewWrapper = ({ }); return ; }; +const WidgetContextMenuViewWrapper = withViewDocs(WidgetContextMenuViewWrapperImpl, WidgetContextMenuView); -export default { +const meta = { title: "RightPanel/WidgetContextMenuView", component: WidgetContextMenuViewWrapper, tags: ["autodocs"], @@ -54,7 +56,6 @@ export default { showSnapshotButton: true, showMoveButtons: [true, true], canModify: true, - widgetMessaging: undefined, isMenuOpened: true, trigger: ( @@ -69,16 +70,18 @@ export default { onFinished: fn(), onMoveButton: fn(), }, -} as Meta; +} satisfies Meta; -const Template: StoryFn = (args) => ; +export default meta; +type Story = StoryObj; -export const Default = Template.bind({}); +export const Default: Story = {}; -export const OnlyBasicModification = Template.bind({}); -OnlyBasicModification.args = { - showSnapshotButton: false, - showMoveButtons: [false, false], - showStreamAudioStreamButton: false, - showEditButton: false, +export const OnlyBasicModification: Story = { + args: { + showSnapshotButton: false, + showMoveButtons: [false, false], + showStreamAudioStreamButton: false, + showEditButton: false, + }, }; diff --git a/packages/shared-components/src/right-panel/WidgetContextMenu/WidgetContextMenuView.tsx b/packages/shared-components/src/right-panel/WidgetContextMenu/WidgetContextMenuView.tsx index c8a150e041..9143ec6691 100644 --- a/packages/shared-components/src/right-panel/WidgetContextMenu/WidgetContextMenuView.tsx +++ b/packages/shared-components/src/right-panel/WidgetContextMenu/WidgetContextMenuView.tsx @@ -89,7 +89,7 @@ export interface WidgetContextMenuAction { onMoveButton: (direction: number) => void; } -export type WidgetContextMenuViewModel = ViewModel & WidgetContextMenuAction; +export type WidgetContextMenuViewModel = ViewModel; interface WidgetContextMenuViewProps { vm: WidgetContextMenuViewModel; diff --git a/packages/shared-components/src/room-list/RoomListHeaderView/RoomListHeaderView.module.css b/packages/shared-components/src/room-list/RoomListHeaderView/RoomListHeaderView.module.css index 0ed647c777..e7932ba81e 100644 --- a/packages/shared-components/src/room-list/RoomListHeaderView/RoomListHeaderView.module.css +++ b/packages/shared-components/src/room-list/RoomListHeaderView/RoomListHeaderView.module.css @@ -6,8 +6,14 @@ */ .header { - flex: 0 0 60px; - padding: 0 var(--cpd-space-3x); + min-height: 60px; + padding: 0 var(--cpd-space-4x) 0 var(--cpd-space-3x); +} + +.container { + flex: 1; + padding-bottom: var(--cpd-space-3x); + min-width: 0; } .title { diff --git a/packages/shared-components/src/room-list/RoomListHeaderView/RoomListHeaderView.stories.tsx b/packages/shared-components/src/room-list/RoomListHeaderView/RoomListHeaderView.stories.tsx index bca9e709d2..591f24c0cf 100644 --- a/packages/shared-components/src/room-list/RoomListHeaderView/RoomListHeaderView.stories.tsx +++ b/packages/shared-components/src/room-list/RoomListHeaderView/RoomListHeaderView.stories.tsx @@ -8,18 +8,19 @@ import React, { type JSX } from "react"; import { fn } from "storybook/test"; -import type { Meta, StoryFn } from "@storybook/react-vite"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { RoomListHeaderView, type RoomListHeaderViewActions, type RoomListHeaderViewSnapshot, } from "./RoomListHeaderView"; import { useMockedViewModel } from "../../viewmodel"; +import { withViewDocs } from "../../../.storybook/withViewDocs"; import { defaultSnapshot } from "./default-snapshot"; type RoomListHeaderProps = RoomListHeaderViewSnapshot & RoomListHeaderViewActions; -const RoomListHeaderViewWrapper = ({ +const RoomListHeaderViewWrapperImpl = ({ createChatRoom, createRoom, createVideoRoom, @@ -44,8 +45,9 @@ const RoomListHeaderViewWrapper = ({ }); return ; }; +const RoomListHeaderViewWrapper = withViewDocs(RoomListHeaderViewWrapperImpl, RoomListHeaderView); -export default { +const meta = { title: "Room List/RoomListHeaderView", component: RoomListHeaderViewWrapper, tags: ["autodocs"], @@ -67,18 +69,34 @@ export default { url: "https://www.figma.com/design/vlmt46QDdE4dgXDiyBJXqp/ER-33-Left-Panel?node-id=2925-19173", }, }, -} as Meta; +} satisfies Meta; -const Template: StoryFn = (args) => ; +export default meta; +type Story = StoryObj; -export const Default = Template.bind({}); +export const Default: Story = {}; -export const NoSpaceMenu = Template.bind({}); -NoSpaceMenu.args = { - displaySpaceMenu: false, +export const NoSpaceMenu: Story = { + args: { + displaySpaceMenu: false, + }, }; -export const NoComposeMenu = Template.bind({}); -NoComposeMenu.args = { - displayComposeMenu: false, +export const NoComposeMenu: Story = { + args: { + displayComposeMenu: false, + }, +}; + +export const LongTitle: Story = { + decorators: [ + (Story) => ( +
    + +
    + ), + ], + args: { + title: "Loooooooooooooooooooooooooooooooooooooong title", + }, }; diff --git a/packages/shared-components/src/room-list/RoomListHeaderView/RoomListHeaderView.tsx b/packages/shared-components/src/room-list/RoomListHeaderView/RoomListHeaderView.tsx index 5b75de23b5..ead33d7f81 100644 --- a/packages/shared-components/src/room-list/RoomListHeaderView/RoomListHeaderView.tsx +++ b/packages/shared-components/src/room-list/RoomListHeaderView/RoomListHeaderView.tsx @@ -103,7 +103,7 @@ export interface RoomListHeaderViewActions { /** * The view model for the room list header component. */ -export type RoomListHeaderViewModel = ViewModel & RoomListHeaderViewActions; +export type RoomListHeaderViewModel = ViewModel; interface RoomListHeaderViewProps { /** @@ -130,30 +130,33 @@ export function RoomListHeaderView({ vm }: Readonly): J as="header" className={styles.header} aria-label={_t("room|context_menu|title")} - justify="space-between" - align="center" + align="end" data-testid="room-list-header" > - -

    - {title} -

    - {displaySpaceMenu && } -
    - - + + +

    + {title} +

    + {displaySpaceMenu && } +
    + + - {/* If we don't display the compose menu, it means that the user can only send DM */} - {displayComposeMenu ? ( - - ) : ( - vm.createChatRoom(e.nativeEvent)} - tooltip={_t("action|new_conversation")} - > - - - )} + {/* If we don't display the compose menu, it means that the user can only send DM */} + {displayComposeMenu ? ( + + ) : ( + vm.createChatRoom(e.nativeEvent)} + tooltip={_t("action|new_conversation")} + > + + + )} +
    ); diff --git a/packages/shared-components/src/room-list/RoomListHeaderView/__snapshots__/RoomListHeaderView.test.tsx.snap b/packages/shared-components/src/room-list/RoomListHeaderView/__snapshots__/RoomListHeaderView.test.tsx.snap index bd1cb09e56..9aeef5522c 100644 --- a/packages/shared-components/src/room-list/RoomListHeaderView/__snapshots__/RoomListHeaderView.test.tsx.snap +++ b/packages/shared-components/src/room-list/RoomListHeaderView/__snapshots__/RoomListHeaderView.test.tsx.snap @@ -6,123 +6,128 @@ exports[`RoomListHeaderView > renders the default state 1`] = ` aria-label="Room options" class="flex header" data-testid="room-list-header" - style="--mx-flex-display: flex; --mx-flex-direction: row; --mx-flex-align: center; --mx-flex-justify: space-between; --mx-flex-gap: 0; --mx-flex-wrap: nowrap;" + style="--mx-flex-display: flex; --mx-flex-direction: row; --mx-flex-align: end; --mx-flex-justify: start; --mx-flex-gap: 0; --mx-flex-wrap: nowrap;" >
    -

    - Rooms -

    - -
    -
    -
    - - + +
    - - + + + +
    + + + @@ -134,118 +139,123 @@ exports[`RoomListHeaderView > renders without compose menu 1`] = ` aria-label="Room options" class="flex header" data-testid="room-list-header" - style="--mx-flex-display: flex; --mx-flex-direction: row; --mx-flex-align: center; --mx-flex-justify: space-between; --mx-flex-gap: 0; --mx-flex-wrap: nowrap;" + style="--mx-flex-display: flex; --mx-flex-direction: row; --mx-flex-align: end; --mx-flex-justify: start; --mx-flex-gap: 0; --mx-flex-wrap: nowrap;" >
    -

    - Rooms -

    - -
    -
    -
    - - + +
    - - + + + +
    + + + @@ -257,92 +267,97 @@ exports[`RoomListHeaderView > renders without space menu 1`] = ` aria-label="Room options" class="flex header" data-testid="room-list-header" - style="--mx-flex-display: flex; --mx-flex-direction: row; --mx-flex-align: center; --mx-flex-justify: space-between; --mx-flex-gap: 0; --mx-flex-wrap: nowrap;" + style="--mx-flex-display: flex; --mx-flex-direction: row; --mx-flex-align: end; --mx-flex-justify: start; --mx-flex-gap: 0; --mx-flex-wrap: nowrap;" >
    -

    - Rooms -

    -
    -
    - -
    +
    - - + + + +
    + + + diff --git a/packages/shared-components/src/room-list/RoomListHeaderView/menu/ComposeMenuView.tsx b/packages/shared-components/src/room-list/RoomListHeaderView/menu/ComposeMenuView.tsx index 1da96cf3e4..c7faf630ca 100644 --- a/packages/shared-components/src/room-list/RoomListHeaderView/menu/ComposeMenuView.tsx +++ b/packages/shared-components/src/room-list/RoomListHeaderView/menu/ComposeMenuView.tsx @@ -45,8 +45,8 @@ export function ComposeMenuView({ vm }: ComposeMenuViewProps): JSX.Element { title={_t("action|open_menu")} align="start" trigger={ - // 36px button with a 24px icon - + // 28px button with a 20px icon + } diff --git a/packages/shared-components/src/room-list/RoomListHeaderView/menu/OptionMenuView.test.tsx b/packages/shared-components/src/room-list/RoomListHeaderView/menu/OptionMenuView.test.tsx index f961d83109..894065a06d 100644 --- a/packages/shared-components/src/room-list/RoomListHeaderView/menu/OptionMenuView.test.tsx +++ b/packages/shared-components/src/room-list/RoomListHeaderView/menu/OptionMenuView.test.tsx @@ -36,7 +36,7 @@ describe("", () => { await user.click(button); expect(screen.getByRole("menuitemradio", { name: "A-Z" })).toBeChecked(); - expect(screen.getByRole("menuitemradio", { name: "Activity" })).not.toBeChecked(); + expect(screen.getByRole("menuitemradio", { name: "Latest activity" })).not.toBeChecked(); expect(screen.getByRole("menuitemradio", { name: "Unread first" })).not.toBeChecked(); }); @@ -52,7 +52,7 @@ describe("", () => { expect(screen.getByRole("menuitemradio", { name: "A-Z" })).not.toBeChecked(); expect(screen.getByRole("menuitemradio", { name: "Unread first" })).not.toBeChecked(); - expect(screen.getByRole("menuitemradio", { name: "Activity" })).toBeChecked(); + expect(screen.getByRole("menuitemradio", { name: "Latest activity" })).toBeChecked(); }); it("should show `Unread First` selected if activeSortOption is unread-first", async () => { @@ -66,7 +66,7 @@ describe("", () => { await user.click(button); expect(screen.getByRole("menuitemradio", { name: "A-Z" })).not.toBeChecked(); - expect(screen.getByRole("menuitemradio", { name: "Activity" })).not.toBeChecked(); + expect(screen.getByRole("menuitemradio", { name: "Latest activity" })).not.toBeChecked(); expect(screen.getByRole("menuitemradio", { name: "Unread first" })).toBeChecked(); }); @@ -91,7 +91,7 @@ describe("", () => { await user.click(screen.getByRole("button", { name: "Room Options" })); - await user.click(screen.getByRole("menuitemradio", { name: "Activity" })); + await user.click(screen.getByRole("menuitemradio", { name: "Latest activity" })); expect(vm.sort).toHaveBeenCalledWith("recent"); }); diff --git a/packages/shared-components/src/room-list/RoomListHeaderView/menu/__snapshots__/ComposeMenuView.test.tsx.snap b/packages/shared-components/src/room-list/RoomListHeaderView/menu/__snapshots__/ComposeMenuView.test.tsx.snap index 01097e411a..d269845351 100644 --- a/packages/shared-components/src/room-list/RoomListHeaderView/menu/__snapshots__/ComposeMenuView.test.tsx.snap +++ b/packages/shared-components/src/room-list/RoomListHeaderView/menu/__snapshots__/ComposeMenuView.test.tsx.snap @@ -12,7 +12,7 @@ exports[` > should match snapshot 1`] = ` data-state="closed" id="radix-_r_0_" role="button" - style="--cpd-icon-button-size: 36px; padding: 6px;" + style="--cpd-icon-button-size: 28px; padding: 4px;" tabindex="0" type="button" > diff --git a/packages/shared-components/src/room-list/RoomListItemView/RoomListItemMoreOptionsMenu.tsx b/packages/shared-components/src/room-list/RoomListItemView/RoomListItemMoreOptionsMenu.tsx index 10f7df2414..62571baf4b 100644 --- a/packages/shared-components/src/room-list/RoomListItemView/RoomListItemMoreOptionsMenu.tsx +++ b/packages/shared-components/src/room-list/RoomListItemView/RoomListItemMoreOptionsMenu.tsx @@ -25,7 +25,7 @@ import type { RoomListItemSnapshot, RoomListItemActions } from "./RoomListItemVi /** * View model type for room list item */ -export type RoomItemViewModel = ViewModel & RoomListItemActions; +export type RoomItemViewModel = ViewModel; /** * Props for RoomListItemMoreOptionsMenu component @@ -54,6 +54,7 @@ export function RoomListItemMoreOptionsMenu({ vm }: RoomListItemMoreOptionsMenuP tooltip={_t("room_list|room|more_options")} aria-label={_t("room_list|room|more_options")} size="24px" + style={{ padding: "2px" }} > diff --git a/packages/shared-components/src/room-list/RoomListItemView/RoomListItemNotificationMenu.tsx b/packages/shared-components/src/room-list/RoomListItemView/RoomListItemNotificationMenu.tsx index 1011bac4ff..db5ae2cf63 100644 --- a/packages/shared-components/src/room-list/RoomListItemView/RoomListItemNotificationMenu.tsx +++ b/packages/shared-components/src/room-list/RoomListItemView/RoomListItemNotificationMenu.tsx @@ -21,7 +21,7 @@ import type { RoomListItemSnapshot, RoomListItemActions } from "./RoomListItemVi /** * View model type for room list item */ -export type RoomItemViewModel = ViewModel & RoomListItemActions; +export type RoomItemViewModel = ViewModel; /** * Props for RoomListItemNotificationMenu component @@ -51,6 +51,7 @@ export function RoomListItemNotificationMenu({ vm }: RoomListItemNotificationMen trigger={ diff --git a/packages/shared-components/src/room-list/RoomListItemView/RoomListItemView.module.css b/packages/shared-components/src/room-list/RoomListItemView/RoomListItemView.module.css index 008a4462ac..50b72d2429 100644 --- a/packages/shared-components/src/room-list/RoomListItemView/RoomListItemView.module.css +++ b/packages/shared-components/src/room-list/RoomListItemView/RoomListItemView.module.css @@ -5,29 +5,28 @@ * Please see LICENSE files in the repository root for full details. */ -/** - * The RoomListItem has the following structure: - * button--------------------------------------------------| - * | <-12px-> container------------------------------------| - * | | room avatar <-8px-> content----------------| - * | | | room_name <- 20px ->| - * | | | --------------------| <-- border - * |-------------------------------------------------------| - */ .roomListItem { /* Remove button default style */ background: unset; border: none; - padding: 0; text-align: unset; + /* Needed to position the selected marker */ + position: relative; cursor: pointer; - height: 48px; width: 100%; - padding-left: var(--cpd-space-3x); + /* Gap between items, accounted for in ROOM_LIST_ITEM_HEIGHT */ + --padding-top: var(--cpd-space-1x); + --padding-bottom: var(--cpd-space-1x); + padding: var(--padding-top) 0 var(--padding-bottom) 0; + + /* 44px height + padding */ + min-height: calc(44px + var(--padding-top) + var(--padding-bottom)); + font: var(--cpd-font-body-md-regular); - color: var(--cpd-color-text-primary); + letter-spacing: var(--cpd-font-letter-spacing-body-md); + color: var(--cpd-color-text-secondary); /* Hide the menu by default */ .hoverMenu { @@ -42,7 +41,16 @@ .roomListItem[data-state="open"], /* When the options and notifications menu are opened */ .roomListItem:has(.hoverMenu > button[data-state="open"]) { - background-color: var(--cpd-color-bg-action-secondary-hovered); + color: var(--cpd-color-text-primary); + + .container { + background-color: var(--cpd-color-bg-action-tertiary-hovered); + } + + /* Preserve selected background on hover/focus/menu-open states */ + &.selected .container { + background-color: var(--cpd-color-bg-action-tertiary-selected); + } .hoverMenu { display: flex; @@ -52,55 +60,70 @@ .notificationDecoration { display: none; } +} - /** - * The figma uses 16px padding (--cpd-space-4x) but due to https://github.com/element-hq/compound-web/issues/331 - * the icon size of the menu is 18px instead of 20px with a different internal padding - * We need to use 18px to align the icon with the others icons - * 18px is not available in compound spacing - */ - .content { - padding-right: 18px; - } +.container { + flex: 1; + margin: 0 var(--cpd-space-3x); + padding: 0 var(--cpd-space-2x); + border-radius: 8px; + min-width: 0; } .content { - height: 100%; flex: 1; - /* The border is only under the room name and the future hover menu */ - border-bottom: var(--cpd-border-width-0-5) solid var(--cpd-color-bg-subtle-secondary); - box-sizing: border-box; min-width: 0; - padding-right: var(--cpd-space-5x); } .text { min-width: 0; } +.ellipsis, .roomName { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } -.messagePreview { - font: var(--cpd-font-body-sm-regular); - color: var(--cpd-color-text-secondary); - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - .selected { - background-color: var(--cpd-color-bg-action-secondary-pressed); + .container { + background-color: var(--cpd-color-bg-action-tertiary-selected); + color: var(--cpd-color-text-primary); + } + + /* Visual marker at the left on the container when the room is selected */ + .container::before { + content: ""; + position: absolute; + /* Marker height is 34px, room list item height is 44px. So position is at 5px at and bottom + padding */ + top: calc(5px + var(--padding-top)); + bottom: calc(5px + var(--padding-bottom)); + left: 0; + width: 4px; + background-color: var(--cpd-color-bg-accent-rest); + border-radius: 0 8px 8px 0; + } } .bold .roomName { font: var(--cpd-font-body-md-semibold); + color: var(--cpd-color-text-primary); } /* Set icon color for hover menu buttons */ .hoverMenu svg { fill: var(--cpd-color-icon-primary); } + +/* + * Remove top padding for the first item and bottom padding for the last item to align them with the container border. + * And adjust the selected marker position accordingly. + */ +.firstItem { + --padding-top: 0px; +} + +.lastItem { + --padding-bottom: 0px; +} diff --git a/packages/shared-components/src/room-list/RoomListItemView/RoomListItemView.stories.tsx b/packages/shared-components/src/room-list/RoomListItemView/RoomListItemView.stories.tsx index dc2428d823..b422647c33 100644 --- a/packages/shared-components/src/room-list/RoomListItemView/RoomListItemView.stories.tsx +++ b/packages/shared-components/src/room-list/RoomListItemView/RoomListItemView.stories.tsx @@ -5,13 +5,14 @@ * Please see LICENSE files in the repository root for full details. */ -import React, { type JSX } from "react"; +import React, { type JSX, useEffect } from "react"; import { fn } from "storybook/test"; import type { Meta, StoryObj } from "@storybook/react-vite"; import type { Room } from "./RoomListItemView"; import { RoomListItemView, type RoomListItemSnapshot, type RoomListItemActions } from "./RoomListItemView"; import { useMockedViewModel } from "../../viewmodel"; +import { withViewDocs } from "../../../.storybook/withViewDocs"; import { defaultSnapshot } from "./default-snapshot"; import { renderAvatar } from "../story-mocks"; @@ -26,7 +27,7 @@ type RoomListItemProps = RoomListItemSnapshot & }; // Wrapper component that creates a mocked ViewModel -const RoomListItemWrapper = ({ +const RoomListItemWrapperImpl = ({ onOpenRoom, onMarkAsRead, onMarkAsUnread, @@ -67,6 +68,7 @@ const RoomListItemWrapper = ({ /> ); }; +const RoomListItemWrapper = withViewDocs(RoomListItemWrapperImpl, RoomListItemView); const meta = { title: "Room List/RoomListItemView", @@ -85,7 +87,7 @@ const meta = { ...defaultSnapshot, isSelected: false, isFocused: false, - roomIndex: 0, + roomIndex: 1, roomCount: 10, onOpenRoom: fn(), onMarkAsRead: fn(), @@ -102,7 +104,7 @@ const meta = { parameters: { design: { type: "figma", - url: "https://www.figma.com/design/vlmt46QDdE4dgXDiyBJXqp/ER-33-Left-Panel?node-id=101-13062", + url: "https://www.figma.com/design/rTaQE2nIUSLav4Tg3nozq7/Compound-Web-Components?node-id=10800-21153&t=gFDc2D7TMEffSSCo-0", }, }, } satisfies Meta; @@ -112,6 +114,13 @@ type Story = StoryObj; export const Default: Story = {}; +export const LongContent: Story = { + args: { + name: "Loooooooooooooooooooooooooooooooooooooong name", + messagePreview: "Loooooooooooooooooooooooooooooooooooooong preview", + }, +}; + export const Selected: Story = { args: { isSelected: true, @@ -211,3 +220,57 @@ export const WithoutHoverMenu: Story = { showMoreOptionsMenu: false, }, }; + +export const WithLargeFont: Story = { + args: { + isSelected: true, + }, + // Render the story in an iframe to avoid affecting other story + parameters: { + docs: { + story: { + inline: false, + iframeHeight: 170, + }, + }, + }, + decorators: [ + (Story) => { + useEffect(() => { + const originalFontSize = getComputedStyle(document.documentElement).fontSize; + document.documentElement.style.setProperty("font-size", "36px"); + return () => { + document.documentElement.style.setProperty("font-size", originalFontSize); + }; + }, []); + return ; + }, + ], +}; + +export const WithZoom: Story = { + args: { + isSelected: true, + }, + decorators: [ + (Story, context) => ( +
    + +
    + ), + ], +}; + +export const FirstItem: Story = { + args: { + roomIndex: 0, + isSelected: true, + }, +}; + +export const LastItem: Story = { + args: { + roomIndex: 9, + isSelected: true, + }, +}; diff --git a/packages/shared-components/src/room-list/RoomListItemView/RoomListItemView.tsx b/packages/shared-components/src/room-list/RoomListItemView/RoomListItemView.tsx index e4da17e3ee..1a7f75216b 100644 --- a/packages/shared-components/src/room-list/RoomListItemView/RoomListItemView.tsx +++ b/packages/shared-components/src/room-list/RoomListItemView/RoomListItemView.tsx @@ -7,6 +7,7 @@ import React, { type JSX, memo, useEffect, useRef, type ReactNode } from "react"; import classNames from "classnames"; +import { Text } from "@vector-im/compound-web"; import { Flex } from "../../utils/Flex"; import { NotificationDecoration, type NotificationDecorationData } from "./NotificationDecoration"; @@ -104,7 +105,7 @@ export interface RoomListItemActions { /** * The view model type for a room list item */ -export type RoomItemViewModel = ViewModel & RoomListItemActions; +export type RoomItemViewModel = ViewModel; /** * Props for RoomListItemView component @@ -159,10 +160,12 @@ export const RoomListItemView = memo(function RoomListItemView({ className={classNames(styles.roomListItem, "mx_RoomListItemView", { [styles.selected]: isSelected, [styles.bold]: item.isBold, + [styles.firstItem]: roomIndex === 0, + [styles.lastItem]: roomIndex === roomCount - 1, mx_RoomListItemView_selected: isSelected, })} gap="var(--cpd-space-3x)" - align="center" + align="stretch" type="button" role="option" aria-posinset={roomIndex + 1} @@ -174,31 +177,33 @@ export const RoomListItemView = memo(function RoomListItemView({ tabIndex={isFocused ? 0 : -1} {...props} > - {renderAvatar(item.room)} - - {/* We truncate the room name when too long. Title here is to show the full name on hover */} -
    -
    - {item.name} -
    - {item.messagePreview && ( -
    - {item.messagePreview} + + {renderAvatar(item.room)} + + {/* We truncate the room name when too long. Title here is to show the full name on hover */} +
    +
    + {item.name}
    + {item.messagePreview && ( + + {item.messagePreview} + + )} +
    + {(item.showMoreOptionsMenu || item.showNotificationMenu) && ( + )} -
    - {(item.showMoreOptionsMenu || item.showNotificationMenu) && ( - - )} - {/* aria-hidden because we summarise the unread count/notification status in a11yLabel */} -
    - -
    + {/* aria-hidden because we summarise the unread count/notification status in a11yLabel */} +
    + +
    + ); diff --git a/packages/shared-components/src/room-list/RoomListItemView/__snapshots__/RoomListItemView.test.tsx.snap b/packages/shared-components/src/room-list/RoomListItemView/__snapshots__/RoomListItemView.test.tsx.snap index ff1ccad613..1482f8c7e4 100644 --- a/packages/shared-components/src/room-list/RoomListItemView/__snapshots__/RoomListItemView.test.tsx.snap +++ b/packages/shared-components/src/room-list/RoomListItemView/__snapshots__/RoomListItemView.test.tsx.snap @@ -12,117 +12,122 @@ exports[` > renders Bold story 1`] = ` - +
    +
    + + +
    + - @@ -142,117 +147,122 @@ exports[` > renders Default story 1`] = ` - + +
    + + +
    + - @@ -272,133 +282,138 @@ exports[` > renders Invitation story 1`] = ` + + + - @@ -420,111 +435,116 @@ exports[` > renders NoMessagePreview story 1`] = ` - + + + + + + + + - @@ -544,117 +564,122 @@ exports[` > renders Selected story 1`] = ` - + +
    + + +
    + - @@ -674,133 +699,138 @@ exports[` > renders UnsentMessage story 1`] = ` + + + - @@ -822,117 +852,122 @@ exports[` > renders WithHoverMenu story 1`] = ` - + +
    + + +
    + - @@ -952,138 +987,143 @@ exports[` > renders WithMention story 1`] = ` + + + - @@ -1105,127 +1145,132 @@ exports[` > renders WithNotification story 1`] = ` - - - +
    + + +
    + diff --git a/packages/shared-components/src/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.module.css b/packages/shared-components/src/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.module.css index 29db6d1bd6..7bb7cd8006 100644 --- a/packages/shared-components/src/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.module.css +++ b/packages/shared-components/src/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.module.css @@ -6,7 +6,7 @@ */ .roomListPrimaryFilters { - padding: var(--cpd-space-2x) var(--cpd-space-4x) var(--cpd-space-2x) var(--cpd-space-3x); + padding: 0 var(--cpd-space-4x) var(--cpd-space-5x) var(--cpd-space-3x); } /* Hide filters that are wrapping when collapsed */ diff --git a/packages/shared-components/src/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.stories.tsx b/packages/shared-components/src/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.stories.tsx index a1a80334b9..cba4514419 100644 --- a/packages/shared-components/src/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.stories.tsx +++ b/packages/shared-components/src/room-list/RoomListPrimaryFilters/RoomListPrimaryFilters.stories.tsx @@ -12,7 +12,7 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; import { RoomListPrimaryFilters } from "./RoomListPrimaryFilters"; import type { FilterId } from "./useVisibleFilters"; -const meta: Meta = { +const meta = { title: "Room List/RoomListPrimaryFilters", component: RoomListPrimaryFilters, tags: ["autodocs"], @@ -25,10 +25,10 @@ const meta: Meta = { url: "https://www.figma.com/design/vlmt46QDdE4dgXDiyBJXqp/ER-33-Left-Panel-2025?node-id=98-1979&t=vafb4zoYMNLRuAbh-4", }, }, -}; +} satisfies Meta; export default meta; -type Story = StoryObj; +type Story = StoryObj; // All available filter IDs const allFilterIds: FilterId[] = ["unread", "people", "rooms", "favourite", "mentions", "invites", "low_priority"]; diff --git a/packages/shared-components/src/room-list/RoomListSearchView/RoomListSearchView.stories.tsx b/packages/shared-components/src/room-list/RoomListSearchView/RoomListSearchView.stories.tsx index d862cc4295..ff9578f2fb 100644 --- a/packages/shared-components/src/room-list/RoomListSearchView/RoomListSearchView.stories.tsx +++ b/packages/shared-components/src/room-list/RoomListSearchView/RoomListSearchView.stories.tsx @@ -8,17 +8,18 @@ import React, { type JSX } from "react"; import { fn } from "storybook/test"; -import type { Meta, StoryFn } from "@storybook/react-vite"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { RoomListSearchView, type RoomListSearchViewActions, type RoomListSearchViewSnapshot, } from "./RoomListSearchView"; import { useMockedViewModel } from "../../viewmodel"; +import { withViewDocs } from "../../../.storybook/withViewDocs"; type RoomListSearchProps = RoomListSearchViewSnapshot & RoomListSearchViewActions; -const RoomListSearchViewWrapper = ({ +const RoomListSearchViewWrapperImpl = ({ onSearchClick, onDialPadClick, onExploreClick, @@ -31,8 +32,9 @@ const RoomListSearchViewWrapper = ({ }); return ; }; +const RoomListSearchViewWrapper = withViewDocs(RoomListSearchViewWrapperImpl, RoomListSearchView); -export default { +const meta = { title: "Room List/RoomListSearchView", component: RoomListSearchViewWrapper, tags: ["autodocs"], @@ -50,25 +52,29 @@ export default { url: "https://www.figma.com/design/vlmt46QDdE4dgXDiyBJXqp/ER-33-Left-Panel-2025?node-id=98-1979&t=vafb4zoYMNLRuAbh-4", }, }, -} as Meta; +} satisfies Meta; -const Template: StoryFn = (args) => ; +export default meta; +type Story = StoryObj; -export const Default = Template.bind({}); +export const Default: Story = {}; -export const WithDialPad = Template.bind({}); -WithDialPad.args = { - displayDialButton: true, +export const WithDialPad: Story = { + args: { + displayDialButton: true, + }, }; -export const WithoutExplore = Template.bind({}); -WithoutExplore.args = { - displayExploreButton: false, +export const WithoutExplore: Story = { + args: { + displayExploreButton: false, + }, }; -export const AllButtons = Template.bind({}); -AllButtons.args = { - displayExploreButton: true, - displayDialButton: true, - searchShortcut: "⌘ K", +export const AllButtons: Story = { + args: { + displayExploreButton: true, + displayDialButton: true, + searchShortcut: "⌘ K", + }, }; diff --git a/packages/shared-components/src/room-list/RoomListSearchView/RoomListSearchView.tsx b/packages/shared-components/src/room-list/RoomListSearchView/RoomListSearchView.tsx index 3b4218e02e..7d45b09c29 100644 --- a/packages/shared-components/src/room-list/RoomListSearchView/RoomListSearchView.tsx +++ b/packages/shared-components/src/room-list/RoomListSearchView/RoomListSearchView.tsx @@ -50,7 +50,7 @@ export interface RoomListSearchViewActions { /** * The view model for the room list search component. */ -export type RoomListSearchViewModel = ViewModel & RoomListSearchViewActions; +export type RoomListSearchViewModel = ViewModel; interface RoomListSearchViewProps { /** diff --git a/packages/shared-components/src/room-list/RoomListView/RoomListView.stories.tsx b/packages/shared-components/src/room-list/RoomListView/RoomListView.stories.tsx index 8e183fff4a..05fb9af6cc 100644 --- a/packages/shared-components/src/room-list/RoomListView/RoomListView.stories.tsx +++ b/packages/shared-components/src/room-list/RoomListView/RoomListView.stories.tsx @@ -13,6 +13,7 @@ import type { Room } from "../RoomListItemView"; import type { FilterId } from "../RoomListPrimaryFilters"; import { RoomListView, type RoomListSnapshot, type RoomListViewActions } from "./RoomListView"; import { useMockedViewModel } from "../../viewmodel"; +import { withViewDocs } from "../../../.storybook/withViewDocs"; import { renderAvatar, createGetRoomItemViewModel, @@ -26,7 +27,7 @@ type RoomListViewProps = RoomListSnapshot & RoomListViewActions & { renderAvatar const mockFilterIds: FilterId[] = ["unread", "people", "rooms", "favourite"]; // Wrapper component that creates a mocked ViewModel -const RoomListViewWrapper = ({ +const RoomListViewWrapperImpl = ({ onToggleFilter, createChatRoom, createRoom, @@ -44,6 +45,7 @@ const RoomListViewWrapper = ({ }); return ; }; +const RoomListViewWrapper = withViewDocs(RoomListViewWrapperImpl, RoomListView); const meta = { title: "Room List/RoomListView", diff --git a/packages/shared-components/src/room-list/RoomListView/RoomListView.test.tsx b/packages/shared-components/src/room-list/RoomListView/RoomListView.test.tsx index 15237eed7e..fcafa06124 100644 --- a/packages/shared-components/src/room-list/RoomListView/RoomListView.test.tsx +++ b/packages/shared-components/src/room-list/RoomListView/RoomListView.test.tsx @@ -34,7 +34,7 @@ const { const renderWithMockContext = (component: React.ReactElement): ReturnType => { return render(component, { wrapper: ({ children }) => ( - + {children} ), diff --git a/packages/shared-components/src/room-list/RoomListView/RoomListView.tsx b/packages/shared-components/src/room-list/RoomListView/RoomListView.tsx index 1a08813f24..e72e9fb3ec 100644 --- a/packages/shared-components/src/room-list/RoomListView/RoomListView.tsx +++ b/packages/shared-components/src/room-list/RoomListView/RoomListView.tsx @@ -12,7 +12,7 @@ import { RoomListPrimaryFilters, type FilterId } from "../RoomListPrimaryFilters import { RoomListLoadingSkeleton } from "./RoomListLoadingSkeleton"; import { RoomListEmptyStateView } from "./RoomListEmptyStateView"; import { VirtualizedRoomListView, type RoomListViewState } from "../VirtualizedRoomListView"; -import { type Room } from "../RoomListItemView"; +import { type Room, type RoomItemViewModel } from "../RoomListItemView"; /** * Snapshot for the room list view @@ -49,7 +49,7 @@ export interface RoomListViewActions { /** Called to create a new room */ createRoom: () => void; /** Get view model for a specific room (virtualization API) */ - getRoomItemViewModel: (roomId: string) => any; + getRoomItemViewModel: (roomId: string) => RoomItemViewModel; /** Called when the visible range changes (virtualization API) */ updateVisibleRooms: (startIndex: number, endIndex: number) => void; } @@ -57,7 +57,7 @@ export interface RoomListViewActions { /** * The view model type for the room list view */ -export type RoomListViewModel = ViewModel & RoomListViewActions; +export type RoomListViewModel = ViewModel; /** * Props for RoomListView component diff --git a/packages/shared-components/src/room-list/RoomListView/__snapshots__/RoomListView.test.tsx.snap b/packages/shared-components/src/room-list/RoomListView/__snapshots__/RoomListView.test.tsx.snap index c518632039..f2e461abc5 100644 --- a/packages/shared-components/src/room-list/RoomListView/__snapshots__/RoomListView.test.tsx.snap +++ b/packages/shared-components/src/room-list/RoomListView/__snapshots__/RoomListView.test.tsx.snap @@ -76,7 +76,7 @@ exports[` > renders Default story 1`] = `
    +
    + + +
    + - @@ -220,7 +225,7 @@ exports[` > renders Default story 1`] = `
    - +
    - + + + + + + + -
    - +
    +
    + + +
    + -
    - +
    - + + + + + + + -
    - +
    +
    + + +
    + -
    - -
    - + @@ -840,7 +870,7 @@ exports[` > renders Default story 1`] = `
    - +
    +
    + + +
    + -
    - +
    - + + + + + + + -
    - +
    +
    + + +
    + -
    - +
    - + + + + + + + -
    +
    + + +
    + - @@ -1466,7 +1521,7 @@ exports[` > renders Default story 1`] = `
    - +
    - + + + + + + + -
    - +
    +
    + + +
    + -
    - +
    - + + + + + + + -
    - +
    +
    + + +
    + -
    - -
    - + @@ -2086,7 +2166,7 @@ exports[` > renders Default story 1`] = `
    - +
    +
    + + +
    + -
    - +
    - + + + + + + + -
    - +
    +
    + + +
    + -
    - +
    - + + + + + + + - @@ -2708,7 +2808,7 @@ exports[` > renders EmptyFavouriteFilter story 1`] = `
    @@ -2767,7 +2867,7 @@ exports[` > renders EmptyInvitesFilter story 1`] = `
    @@ -2830,7 +2930,7 @@ exports[` > renders EmptyLowPriorityFilter story 1`] = `
    @@ -2893,7 +2993,7 @@ exports[` > renders EmptyMentionsFilter story 1`] = `
    @@ -2956,7 +3056,7 @@ exports[` > renders EmptyPeopleFilter story 1`] = `
    @@ -3015,7 +3115,7 @@ exports[` > renders EmptyRoomsFilter story 1`] = `
    @@ -3074,7 +3174,7 @@ exports[` > renders EmptyUnreadFilter story 1`] = `
    @@ -3297,12 +3397,12 @@ exports[` > renders LargeList story 1`] = ` >
    +
    + + +
    + -
    @@ -3446,7 +3551,7 @@ exports[` > renders LargeList story 1`] = `
    - +
    - + + + +
    + +
    + -
    - +
    +
    + + +
    + -
    - +
    - + + + +
    + +
    + -
    - +
    +
    + + +
    + -
    - -
    - + @@ -4066,7 +4196,7 @@ exports[` > renders LargeList story 1`] = `
    - +
    +
    + + +
    + -
    - +
    - + + + + + + + -
    - +
    +
    + + +
    + -
    - +
    - + + + + + + + -
    +
    + + +
    + - @@ -4692,7 +4847,7 @@ exports[` > renders LargeList story 1`] = `
    - +
    - + + + + + + + -
    - +
    +
    + + +
    + -
    - +
    - + + + + + + + -
    - +
    +
    + + +
    + -
    - -
    - + @@ -5312,7 +5492,7 @@ exports[` > renders LargeList story 1`] = `
    - +
    +
    + + +
    + -
    - +
    - + + + + + + + -
    - +
    +
    + + +
    + -
    - +
    - + + + + + + + -
    +
    + + +
    + - @@ -5938,7 +6143,7 @@ exports[` > renders LargeList story 1`] = `
    - +
    - + + + + + + + -
    - +
    +
    + + +
    + -
    - +
    - + + + + + + + -
    - +
    +
    + + +
    + -
    - -
    - + @@ -6558,7 +6788,7 @@ exports[` > renders LargeList story 1`] = `
    - +
    +
    + + +
    + -
    - +
    - + + + + + + + -
    - +
    +
    + + +
    + -
    - +
    - + + + + + + + -
    +
    + + +
    + - @@ -7184,7 +7439,7 @@ exports[` > renders LargeList story 1`] = `
    - +
    - + + + + + + + -
    - +
    +
    + + +
    + -
    - +
    - + + + + + + + -
    - +
    +
    + + +
    + -
    - -
    - + @@ -7804,7 +8084,7 @@ exports[` > renders LargeList story 1`] = `
    +
    - -
    - - -
    - - - -
    - - -
    - @@ -8188,7 +8356,7 @@ exports[` > renders SmallList story 1`] = `
    +
    + + +
    + - @@ -8332,7 +8505,7 @@ exports[` > renders SmallList story 1`] = `
    - +
    - + + + + + + + -
    - +
    +
    + + +
    + -
    - +
    - + + + + + + + -
    - +
    +
    + + +
    + - @@ -8892,7 +9085,7 @@ exports[` > renders WithActiveFilter story 1`] = `
    +
    + + +
    + - @@ -9036,7 +9234,7 @@ exports[` > renders WithActiveFilter story 1`] = `
    - +
    - + + + + + + + -
    - +
    +
    + + +
    + -
    - +
    - + + + + + + + -
    - +
    +
    + + +
    + -
    - -
    - + @@ -9656,7 +9879,7 @@ exports[` > renders WithActiveFilter story 1`] = `
    - +
    +
    + + +
    + -
    - +
    - + + + + + + + -
    - +
    +
    + + +
    + -
    - +
    - + + + + + + + -
    +
    + + +
    + - @@ -10282,7 +10530,7 @@ exports[` > renders WithActiveFilter story 1`] = `
    - +
    - + + + + + + + -
    - +
    +
    + + +
    + -
    - +
    - + + + + + + + -
    - +
    +
    + + +
    + -
    - -
    - + @@ -10902,7 +11175,7 @@ exports[` > renders WithActiveFilter story 1`] = `
    - +
    +
    + + +
    + -
    - +
    - + + + + + + + -
    - +
    +
    + + +
    + -
    - +
    - + + + + + + + - diff --git a/packages/shared-components/src/room-list/VirtualizedRoomListView/VirtualizedRoomListView.stories.tsx b/packages/shared-components/src/room-list/VirtualizedRoomListView/VirtualizedRoomListView.stories.tsx index aa12524a97..ff2d7a3cd6 100644 --- a/packages/shared-components/src/room-list/VirtualizedRoomListView/VirtualizedRoomListView.stories.tsx +++ b/packages/shared-components/src/room-list/VirtualizedRoomListView/VirtualizedRoomListView.stories.tsx @@ -13,6 +13,7 @@ import type { Room } from "../RoomListItemView"; import { VirtualizedRoomListView, type RoomListViewState } from "./VirtualizedRoomListView"; import type { RoomListSnapshot, RoomListViewActions } from "../RoomListView"; import { useMockedViewModel } from "../../viewmodel"; +import { withViewDocs } from "../../../.storybook/withViewDocs"; import type { FilterId } from "../RoomListPrimaryFilters"; import { renderAvatar, createGetRoomItemViewModel, mockRoomIds } from "../story-mocks"; @@ -22,7 +23,7 @@ type RoomListStoryProps = RoomListSnapshot & RoomListViewActions & { renderAvata const storyRoomIds = mockRoomIds.slice(0, 10); // Wrapper component that creates a mocked ViewModel -const RoomListWrapper = ({ +const RoomListWrapperImpl = ({ onToggleFilter, createChatRoom, createRoom, @@ -45,6 +46,7 @@ const RoomListWrapper = ({ ); }; +const RoomListWrapper = withViewDocs(RoomListWrapperImpl, VirtualizedRoomListView); const mockFilterIds: FilterId[] = ["unread", "people"]; @@ -54,7 +56,7 @@ const defaultRoomListState: RoomListViewState = { filterKeys: undefined, }; -const meta: Meta = { +const meta = { title: "Room List/VirtualizedRoomListView", component: RoomListWrapper, tags: ["autodocs"], @@ -86,9 +88,9 @@ const meta: Meta = { ), ], -}; +} satisfies Meta; export default meta; -type Story = StoryObj; +type Story = StoryObj; export const Default: Story = {}; diff --git a/packages/shared-components/src/room-list/VirtualizedRoomListView/VirtualizedRoomListView.test.tsx b/packages/shared-components/src/room-list/VirtualizedRoomListView/VirtualizedRoomListView.test.tsx index 23f384554d..2d5ff3ed34 100644 --- a/packages/shared-components/src/room-list/VirtualizedRoomListView/VirtualizedRoomListView.test.tsx +++ b/packages/shared-components/src/room-list/VirtualizedRoomListView/VirtualizedRoomListView.test.tsx @@ -18,7 +18,7 @@ const { Default } = composeStories(stories); const renderWithMockContext = (component: React.ReactElement): ReturnType => { return render(component, { wrapper: ({ children }) => ( - + {children} ), diff --git a/packages/shared-components/src/room-list/VirtualizedRoomListView/VirtualizedRoomListView.tsx b/packages/shared-components/src/room-list/VirtualizedRoomListView/VirtualizedRoomListView.tsx index 4ef430520a..6a4ec3cb9e 100644 --- a/packages/shared-components/src/room-list/VirtualizedRoomListView/VirtualizedRoomListView.tsx +++ b/packages/shared-components/src/room-list/VirtualizedRoomListView/VirtualizedRoomListView.tsx @@ -53,8 +53,8 @@ export interface VirtualizedRoomListViewProps { onKeyDown?: (e: React.KeyboardEvent) => void; } -/** Height of a single room list item in pixels */ -const ROOM_LIST_ITEM_HEIGHT = 48; +/** Height of a single room list item in pixels (44px item + 8px padding bottom) */ +const ROOM_LIST_ITEM_HEIGHT = 52; /** * Type for context used in ListView @@ -177,11 +177,12 @@ export function VirtualizedRoomListView({ vm, renderAvatar, onKeyDown }: Virtual > renders Default story 1`] = `
    +
    + + +
    + - @@ -171,7 +176,7 @@ exports[` > renders Default story 1`] = `
    - +
    - + + + + + + + -
    - +
    +
    + + +
    + -
    - +
    - + + + + + + + -
    - +
    +
    + + +
    + -
    - -
    - + @@ -791,7 +821,7 @@ exports[` > renders Default story 1`] = `
    - +
    +
    + + +
    + -
    - +
    - + + + + + + + -
    - +
    +
    + + +
    + -
    - +
    - + + + + + + + - diff --git a/packages/shared-components/src/room-list/story-mocks.tsx b/packages/shared-components/src/room-list/story-mocks.tsx index de2a4262f4..1958a06419 100644 --- a/packages/shared-components/src/room-list/story-mocks.tsx +++ b/packages/shared-components/src/room-list/story-mocks.tsx @@ -8,7 +8,7 @@ import React from "react"; import { fn } from "storybook/test"; -import { type Room, type RoomListItemSnapshot, RoomNotifState } from "./RoomListItemView"; +import { type Room, type RoomItemViewModel, type RoomListItemSnapshot, RoomNotifState } from "./RoomListItemView"; /** * Mock avatar component for stories @@ -39,6 +39,7 @@ export const mockAvatar = (name: string): React.ReactElement => ( */ export const renderAvatar = (room: Room): React.ReactElement => { // Cast to any to access properties - in real usage, the room object from the SDK will have these + // eslint-disable-next-line @typescript-eslint/no-explicit-any return mockAvatar((room as any)?.name || "Room"); }; @@ -102,8 +103,8 @@ export const createMockRoomSnapshot = (id: string, name: string, index: number): /** * Create a mock getRoomItemViewModel function for stories */ -export const createGetRoomItemViewModel = (roomIds: string[]): ((roomId: string) => any) => { - const viewModels = new Map(); +export const createGetRoomItemViewModel = (roomIds: string[]): ((roomId: string) => RoomItemViewModel) => { + const viewModels = new Map(); roomIds.forEach((roomId, index) => { const name = roomNames[index % roomNames.length]; const snapshot = createMockRoomSnapshot(roomId, name, index); @@ -125,7 +126,7 @@ export const createGetRoomItemViewModel = (roomIds: string[]): ((roomId: string) viewModels.set(roomId, mockViewModel); }); - return (roomId: string) => viewModels.get(roomId); + return (roomId: string) => viewModels.get(roomId)!; }; /** diff --git a/packages/shared-components/src/room/RoomStatusBar/RoomStatusBarView.module.css b/packages/shared-components/src/room/RoomStatusBar/RoomStatusBarView.module.css index b0e85609b6..8780b0cf66 100644 --- a/packages/shared-components/src/room/RoomStatusBar/RoomStatusBarView.module.css +++ b/packages/shared-components/src/room/RoomStatusBar/RoomStatusBarView.module.css @@ -6,6 +6,18 @@ } } -.description { - color: var(--cpd-color-text-secondary); +.secondaryAction svg { + color: var(--cpd-color-text-secondary) !important; +} + +.primaryAction svg { + color: var(--cpd-color-text-on-solid-primary) !important; +} + +.title { + color: var(--cpd-color-text-critical-primary); +} + +.description { + color: var(--cpd-color-text-primary); } diff --git a/packages/shared-components/src/room/RoomStatusBar/RoomStatusBarView.stories.tsx b/packages/shared-components/src/room/RoomStatusBar/RoomStatusBarView.stories.tsx index 07b890139e..4a891645c3 100644 --- a/packages/shared-components/src/room/RoomStatusBar/RoomStatusBarView.stories.tsx +++ b/packages/shared-components/src/room/RoomStatusBar/RoomStatusBarView.stories.tsx @@ -4,11 +4,12 @@ * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial * Please see LICENSE files in the repository root for full details. */ -import { type Meta, type StoryFn } from "@storybook/react-vite"; +import { type Meta, type StoryObj } from "@storybook/react-vite"; import React, { type JSX } from "react"; import { fn } from "storybook/test"; import { useMockedViewModel } from "../../viewmodel"; +import { withViewDocs } from "../../../.storybook/withViewDocs"; import { RoomStatusBarState, RoomStatusBarView, @@ -18,7 +19,7 @@ import { type RoomStatusBarProps = RoomStatusBarViewSnapshot & RoomStatusBarViewActions; -const RoomStatusBarViewWrapper = ({ +const RoomStatusBarViewWrapperImpl = ({ onResendAllClick, onDeleteAllClick, onRetryRoomCreationClick, @@ -33,8 +34,9 @@ const RoomStatusBarViewWrapper = ({ }); return ; }; +const RoomStatusBarViewWrapper = withViewDocs(RoomStatusBarViewWrapperImpl, RoomStatusBarView); -export default { +const meta = { title: "room/RoomStatusBarView", component: RoomStatusBarViewWrapper, tags: ["autodocs"], @@ -45,61 +47,75 @@ export default { onRetryRoomCreationClick: fn(), onTermsAndConditionsClicked: fn(), }, -} as Meta; + parameters: { + design: { + type: "figma", + url: "https://www.figma.com/design/rTaQE2nIUSLav4Tg3nozq7/Compound-Web-Components?node-id=11019-2353&t=p8SkJGh9tJx09MTJ-4", + }, + }, +} satisfies Meta; -const Template: StoryFn = (args) => ; +export default meta; +type Story = StoryObj; /** * Rendered when the client has lost connection with the server. */ -export const WithConnectionLost = Template.bind({}); -WithConnectionLost.args = { - state: RoomStatusBarState.ConnectionLost, +export const WithConnectionLost: Story = { + args: { + state: RoomStatusBarState.ConnectionLost, + }, }; /** * Rendered when the client needs the user to consent to some terms and conditions before * they can perform any room actions. */ -export const WithConsentLink = Template.bind({}); -WithConsentLink.args = { - state: RoomStatusBarState.NeedsConsent, - consentUri: "#example", +export const WithConsentLink: Story = { + args: { + state: RoomStatusBarState.NeedsConsent, + consentUri: "#example", + }, }; /** * Rendered when the server has hit a usage limit and is forbidding the user from performing * any actions in the room. There is an optional parameter to link to an admin to contact. */ -export const WithResourceLimit = Template.bind({}); -WithResourceLimit.args = { - state: RoomStatusBarState.ResourceLimited, - resourceLimit: "hs_disabled", - adminContactHref: "#example", +export const WithResourceLimit: Story = { + args: { + state: RoomStatusBarState.ResourceLimited, + resourceLimit: "hs_disabled", + adminContactHref: "#example", + }, }; /** * Rendered when the client has some unsent messages in the room, stored locally. */ -export const WithUnsentMessages = Template.bind({}); -WithUnsentMessages.args = { - state: RoomStatusBarState.UnsentMessages, - isResending: false, +export const WithUnsentMessages: Story = { + args: { + state: RoomStatusBarState.UnsentMessages, + isResending: false, + }, }; /** * Rendered when the client has some unsent messages in the room, stored locally and is * trying to send them. */ -export const WithUnsentMessagesSending = Template.bind({}); -WithUnsentMessagesSending.args = { - state: RoomStatusBarState.UnsentMessages, - isResending: true, +export const WithUnsentMessagesSending: Story = { + args: { + state: RoomStatusBarState.UnsentMessages, + isResending: true, + }, }; + /** * Rendered when a local room has failed to be created. */ -export const WithLocalRoomRetry = Template.bind({}); -WithLocalRoomRetry.args = { - state: RoomStatusBarState.LocalRoomFailed, +export const WithLocalRoomRetry: Story = { + args: { + state: RoomStatusBarState.LocalRoomFailed, + }, }; diff --git a/packages/shared-components/src/room/RoomStatusBar/RoomStatusBarView.tsx b/packages/shared-components/src/room/RoomStatusBar/RoomStatusBarView.tsx index 9746321616..b5ed34f1db 100644 --- a/packages/shared-components/src/room/RoomStatusBar/RoomStatusBarView.tsx +++ b/packages/shared-components/src/room/RoomStatusBar/RoomStatusBarView.tsx @@ -100,7 +100,7 @@ export type RoomStatusBarViewSnapshot = /** * The view model for RoomStatusBarView. */ -export type RoomStatusBarViewModel = ViewModel & RoomStatusBarViewActions; +export type RoomStatusBarViewModel = ViewModel; interface RoomStatusBarViewProps { /** @@ -161,10 +161,10 @@ export function RoomStatusBarView({ vm }: Readonly): JSX return (
    - + {_t("room|status_bar|server_connectivity_lost_title")} - + {_t("room|status_bar|server_connectivity_lost_description")}
    @@ -179,7 +179,8 @@ export function RoomStatusBarView({ vm }: Readonly): JSX actions={ } > - + {_t("room|status_bar|failed_to_create_room_title")}
    @@ -267,9 +268,10 @@ export function RoomStatusBarView({ vm }: Readonly): JSX {vm.onDeleteAllClick && ( @@ -293,12 +295,10 @@ export function RoomStatusBarView({ vm }: Readonly): JSX aria-labelledby={bannerTitleId} >
    - + {_t("room|status_bar|some_messages_not_sent")} - - {_t("room|status_bar|select_messages_to_retry")} - + {_t("room|status_bar|select_messages_to_retry")}
    ); diff --git a/packages/shared-components/src/room/RoomStatusBar/__snapshots__/RoomStatusBarView.test.tsx.snap b/packages/shared-components/src/room/RoomStatusBar/__snapshots__/RoomStatusBarView.test.tsx.snap index 71bf744b3b..46fbdd824c 100644 --- a/packages/shared-components/src/room/RoomStatusBar/__snapshots__/RoomStatusBarView.test.tsx.snap +++ b/packages/shared-components/src/room/RoomStatusBar/__snapshots__/RoomStatusBarView.test.tsx.snap @@ -20,7 +20,7 @@ exports[`RoomStatusBarView > renders connection lost 1`] = ` xmlns="http://www.w3.org/2000/svg" > @@ -31,13 +31,13 @@ exports[`RoomStatusBarView > renders connection lost 1`] = ` class="container" >

    Connectivity to the server has been lost.

    Sent messages will be stored until your connection has returned.

    @@ -70,7 +70,7 @@ exports[`RoomStatusBarView > renders consent link 1`] = ` xmlns="http://www.w3.org/2000/svg" > @@ -81,7 +81,7 @@ exports[`RoomStatusBarView > renders consent link 1`] = ` class="container" >

    You can't send any messages until you review and agree to our terms and conditions. @@ -92,8 +92,8 @@ exports[`RoomStatusBarView > renders consent link 1`] = ` class="actions" > renders local room error 1`] = ` xmlns="http://www.w3.org/2000/svg" > @@ -136,7 +136,7 @@ exports[`RoomStatusBarView > renders local room error 1`] = ` class="content" >

    Could not start a chat with this user @@ -146,8 +146,8 @@ exports[`RoomStatusBarView > renders local room error 1`] = ` class="actions" > + ); + }, isItemFocusable: () => true, getItemKey: (item) => item.id, style: { height: "400px" }, diff --git a/packages/shared-components/src/utils/VirtualizedList/VirtualizedList.test.tsx b/packages/shared-components/src/utils/VirtualizedList/VirtualizedList.test.tsx index 4dd5125b6f..e6564f3f43 100644 --- a/packages/shared-components/src/utils/VirtualizedList/VirtualizedList.test.tsx +++ b/packages/shared-components/src/utils/VirtualizedList/VirtualizedList.test.tsx @@ -6,7 +6,7 @@ */ import React, { type PropsWithChildren } from "react"; -import { render, screen, fireEvent } from "@test-utils"; +import { render, screen, fireEvent, waitFor, act } from "@test-utils"; import { VirtuosoMockContext } from "react-virtuoso"; import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; @@ -492,4 +492,171 @@ describe("VirtualizedList", () => { expectAttribute(container, "aria-label", "Custom list label"); }); }); + + describe("Focus preservation during keyboard navigation", () => { + /** + * Renders a 50-item list using real Virtuoso (no mock context) inside a + * fixed-height container. Because the tests run in real Chromium, + * Virtuoso will measure the viewport, virtualise items, and honour + * scrollIntoView calls exactly as it does in production. + */ + const ITEM_HEIGHT = 52; + const VIEWPORT_HEIGHT = 400; + + const renderRealVirtualizedList = (): ReturnType => { + const largeItems: TestItemWithSeparator[] = Array.from({ length: 50 }, (_, i) => ({ + id: `item-${i}`, + name: `Item ${i}`, + })); + + mockIsItemFocusable.mockReturnValue(true); + + mockGetItemComponent.mockImplementation( + ( + index: number, + item: TestItemWithSeparator, + context: any, + onFocus: (item: TestItemWithSeparator, e: React.FocusEvent) => void, + ) => { + const itemKey = typeof item === "string" ? item : item.id; + const isFocused = context.tabIndexKey === itemKey; + return ( + + ); + }, + ); + + return render( + (typeof item === "string" ? item : item.id)} + role="grid" + style={{ height: `${VIEWPORT_HEIGHT}px` }} + fixedItemHeight={ITEM_HEIGHT} + />, + ); + }; + + it("should scroll down through many items with ArrowDown and virtualise earlier items out of the DOM", async () => { + const { container } = renderRealVirtualizedList(); + const listContainer = screen.getByRole("grid"); + + // Wait for Virtuoso to finish its initial render. + await waitFor(() => { + expect(screen.getByTestId("row-0")).toBeDefined(); + }); + + fireEvent.focus(listContainer); + + const TARGET_INDEX = 20; + + // Press ArrowDown many times — each press calls scrollIntoView which + // makes Virtuoso scroll and re-virtualise automatically. + for (let i = 0; i < TARGET_INDEX; i++) { + await act(async () => { + fireEvent.keyDown(listContainer, { code: "ArrowDown" }); + }); + } + + // The focused item should be item-20. + await waitFor(() => { + const focused = Array.from(container.querySelectorAll(".mx_item")).find( + (el) => el.getAttribute("tabindex") === "0", + ); + expect(focused).toBeDefined(); + expect(focused!.textContent).toBe(`Item ${TARGET_INDEX}`); + }); + + // The first item should have been virtualised out of the DOM. + expect(container.querySelector("[data-testid='row-0']")).toBeNull(); + }); + + it("should move focus from a focused child element to the scroller on keyboard navigation", async () => { + renderRealVirtualizedList(); + const listContainer = screen.getByRole("grid"); + + // Wait for Virtuoso to finish its initial render. + await waitFor(() => { + expect(screen.getByTestId("row-0")).toBeDefined(); + }); + + // Directly focus a child button (not the scroller itself). + // This simulates a user clicking/tabbing into a button inside the list. + const firstButton = screen.getByTestId("row-0"); + await act(async () => { + firstButton.focus(); + }); + + // Verify the child button has DOM focus, not the scroller. + expect(document.activeElement).toBe(firstButton); + expect(document.activeElement).not.toBe(listContainer); + + // Press ArrowDown — the handler should detect that a child element + // has focus and move it to the scroller before scrolling, so that + // Virtuoso unmounting the child doesn't send focus to . + await act(async () => { + fireEvent.keyDown(listContainer, { code: "ArrowDown" }); + }); + + // After the keyDown, focus should have moved to the scroller element + // (not remain on the child button, and not escape to ). + expect(document.activeElement).toBe(listContainer); + }); + + it("should scroll up through many items with ArrowUp and virtualise later items out of the DOM", async () => { + const { container } = renderRealVirtualizedList(); + const listContainer = screen.getByRole("grid"); + + await waitFor(() => { + expect(screen.getByTestId("row-0")).toBeDefined(); + }); + + fireEvent.focus(listContainer); + + // First navigate down to item-30. + for (let i = 0; i < 30; i++) { + await act(async () => { + fireEvent.keyDown(listContainer, { code: "ArrowDown" }); + }); + } + + await waitFor(() => { + const focused = Array.from(container.querySelectorAll(".mx_item")).find( + (el) => el.getAttribute("tabindex") === "0", + ); + expect(focused!.textContent).toBe("Item 30"); + }); + + // Now navigate back up 20 times to item-10. + for (let i = 0; i < 20; i++) { + await act(async () => { + fireEvent.keyDown(listContainer, { code: "ArrowUp" }); + }); + } + + // The focused item should be item-10. + await waitFor(() => { + const focused = Array.from(container.querySelectorAll(".mx_item")).find( + (el) => el.getAttribute("tabindex") === "0", + ); + expect(focused).toBeDefined(); + expect(focused!.textContent).toBe("Item 10"); + }); + + // Items near the bottom (e.g. item-30) should have been virtualised out. + expect(container.querySelector("[data-testid='row-30']")).toBeNull(); + }); + }); }); diff --git a/packages/shared-components/src/utils/VirtualizedList/VirtualizedList.tsx b/packages/shared-components/src/utils/VirtualizedList/VirtualizedList.tsx index adea593d07..67fc1b6d02 100644 --- a/packages/shared-components/src/utils/VirtualizedList/VirtualizedList.tsx +++ b/packages/shared-components/src/utils/VirtualizedList/VirtualizedList.tsx @@ -113,7 +113,7 @@ export interface IVirtualizedListProps extends Omit< /** * Utility type for the prop scrollIntoViewOnChange allowing it to be memoised by a caller without repeating types */ -export type ScrollIntoViewOnChange = NonNullable< +export type ScrollIntoViewOnChange = NonNullable< VirtuosoProps>["scrollIntoViewOnChange"] >; @@ -124,7 +124,7 @@ export type ScrollIntoViewOnChange = NonNullable< * @template Item - The type of data items in the list * @template Context - The type of additional context data passed to items */ -export function VirtualizedList(props: IVirtualizedListProps): React.ReactElement { +export function VirtualizedList(props: IVirtualizedListProps): React.ReactElement { // Extract our custom props to avoid conflicts with Virtuoso props const { items, @@ -149,8 +149,6 @@ export function VirtualizedList(props: IVirtualizedListProp const [visibleRange, setVisibleRange] = useState(undefined); /** Map from item keys to their indices in the items array */ const [keyToIndexMap, setKeyToIndexMap] = useState>(new Map()); - /** Whether the list is currently scrolling to an item */ - const isScrollingToItem = useRef(false); /** Whether the list is currently focused */ const [isFocused, setIsFocused] = useState(false); @@ -173,28 +171,20 @@ export function VirtualizedList(props: IVirtualizedListProp /** * Scrolls to a specific item index and sets it as focused. - * Uses Virtuoso's scrollIntoView method for smooth scrolling. + * Updates tabIndexKey immediately so the UI reflects the new focus + * synchronously, then asks Virtuoso to scroll the item into view. */ const scrollToIndex = useCallback( (index: number, align?: "center" | "end" | "start"): void => { // Ensure index is within bounds const clampedIndex = Math.max(0, Math.min(index, items.length - 1)); - if (isScrollingToItem.current) { - // If already scrolling to an item drop this request. Adding further requests - // causes the event to bubble up and be handled by other components(unintentional timeline scrolling was observed). - return; - } if (items[clampedIndex]) { const key = getItemKey(items[clampedIndex]); - isScrollingToItem.current = true; + setTabIndexKey(key); virtuosoHandleRef.current?.scrollIntoView({ index: clampedIndex, align: align, behavior: "auto", - done: () => { - setTabIndexKey(key); - isScrollingToItem.current = false; - }, }); } }, @@ -266,6 +256,17 @@ export function VirtualizedList(props: IVirtualizedListProp } if (handled) { + // If a child element (e.g. a button) currently has DOM focus rather than the + // scroller itself, move focus to the scroller before the scroll takes effect. + // Without this, when Virtuoso unmounts the focused child because it has been + // scrolled out of the visible range, the browser moves focus to and + // subsequent keyboard events no longer reach this handler. + if (virtuosoDomRef.current instanceof HTMLElement) { + const activeEl = document.activeElement; + if (activeEl && activeEl !== virtuosoDomRef.current && virtuosoDomRef.current.contains(activeEl)) { + virtuosoDomRef.current.focus({ preventScroll: true }); + } + } e.stopPropagation(); e.preventDefault(); } else { diff --git a/packages/shared-components/src/utils/VirtualizedList/story-mock.module.css b/packages/shared-components/src/utils/VirtualizedList/story-mock.module.css new file mode 100644 index 0000000000..87a9346ef4 --- /dev/null +++ b/packages/shared-components/src/utils/VirtualizedList/story-mock.module.css @@ -0,0 +1,17 @@ +/* + * Copyright 2025 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +.item { + all: unset; + width: 100%; + padding: 12px 16px; + border-bottom: 1px solid #e0e0e0; +} + +.itemSelected { + background-color: #559f24; +} diff --git a/packages/shared-components/src/viewmodel/ViewModel.ts b/packages/shared-components/src/viewmodel/ViewModel.ts index 9f088c4300..cbc19aafb9 100644 --- a/packages/shared-components/src/viewmodel/ViewModel.ts +++ b/packages/shared-components/src/viewmodel/ViewModel.ts @@ -9,15 +9,22 @@ Please see LICENSE files in the repository root for full details. * The interface for a generic View Model passed to the shared components. * The snapshot is of type T which is a type specifying a snapshot for the view in question. */ -export interface ViewModel { + +// Utility type to map all VM actions to unbound functions so that they do not have +// to be called with the correct 'this' context. This prevents "cannot read X of undefined" bugs. +type MapToVoidThis = { + [K in keyof T]: T[K] extends (...args: infer A) => infer R ? (this: void, ...args: A) => R : T[K]; +}; + +export type ViewModel = { /** * The current snapshot of the view model. */ - getSnapshot: () => T; + getSnapshot: () => Snapshot; /** * Subscribes to changes in the view model. * The listener will be called whenever the snapshot changes. */ subscribe: (listener: () => void) => () => void; -} +} & MapToVoidThis; diff --git a/packages/shared-components/src/viewmodel/useViewModel.ts b/packages/shared-components/src/viewmodel/useViewModel.ts index ef7b8ec0da..9a5a9a8662 100644 --- a/packages/shared-components/src/viewmodel/useViewModel.ts +++ b/packages/shared-components/src/viewmodel/useViewModel.ts @@ -14,7 +14,7 @@ import { type ViewModel } from "./ViewModel"; * @param vm The view model to use * @returns The current snapshot */ -export function useViewModel(vm: ViewModel): T { +export function useViewModel(vm: ViewModel): T { // We need to pass the same getSnapshot function as getServerSnapshot as this // is used when making the HTML chat export. return useSyncExternalStore(vm.subscribe, vm.getSnapshot, vm.getSnapshot); diff --git a/playwright/snapshots/composer/CIDER.spec.ts/mention-linux.png b/playwright/snapshots/composer/CIDER.spec.ts/mention-linux.png deleted file mode 100644 index 8098757aba..0000000000 Binary files a/playwright/snapshots/composer/CIDER.spec.ts/mention-linux.png and /dev/null differ diff --git a/playwright/snapshots/forgot-password/forgot-password.spec.ts/forgot-password-linux.png b/playwright/snapshots/forgot-password/forgot-password.spec.ts/forgot-password-linux.png deleted file mode 100644 index e9eb06375f..0000000000 Binary files a/playwright/snapshots/forgot-password/forgot-password.spec.ts/forgot-password-linux.png and /dev/null differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/collapsed-primary-filters-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/collapsed-primary-filters-linux.png deleted file mode 100644 index 1d5a8ae87a..0000000000 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/collapsed-primary-filters-linux.png and /dev/null differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/expanded-primary-filters-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/expanded-primary-filters-linux.png deleted file mode 100644 index 3bafa521b7..0000000000 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/expanded-primary-filters-linux.png and /dev/null differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/room-panel-empty-room-list-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/room-panel-empty-room-list-linux.png deleted file mode 100644 index 64d49f10bc..0000000000 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/room-panel-empty-room-list-linux.png and /dev/null differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/unread-dm-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/unread-dm-linux.png deleted file mode 100644 index 6968a4f134..0000000000 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/unread-dm-linux.png and /dev/null differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/unread-primary-filters-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/unread-primary-filters-linux.png deleted file mode 100644 index ac8abd60ad..0000000000 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/unread-primary-filters-linux.png and /dev/null differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/unselected-primary-filters-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/unselected-primary-filters-linux.png deleted file mode 100644 index 0b879c18fe..0000000000 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list-filter-sort.spec.ts/unselected-primary-filters-linux.png and /dev/null differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-header-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-header-linux.png deleted file mode 100644 index 8256ddbe61..0000000000 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-header-linux.png and /dev/null differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-header-space-menu-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-header-space-menu-linux.png deleted file mode 100644 index 583b9f36f9..0000000000 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-header-space-menu-linux.png and /dev/null differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-space-header-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-space-header-linux.png deleted file mode 100644 index 008c9076b3..0000000000 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list-header.spec.ts/room-list-space-header-linux.png and /dev/null differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list-panel.spec.ts/room-list-panel-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list-panel.spec.ts/room-list-panel-linux.png deleted file mode 100644 index 269c64d00c..0000000000 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list-panel.spec.ts/room-list-panel-linux.png and /dev/null differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list-panel.spec.ts/room-list-panel-smallscreen-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list-panel.spec.ts/room-list-panel-smallscreen-linux.png deleted file mode 100644 index 3fa9fd4b0b..0000000000 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list-panel.spec.ts/room-list-panel-smallscreen-linux.png and /dev/null differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-activity-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-activity-linux.png deleted file mode 100644 index ac0ee1ad6c..0000000000 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-activity-linux.png and /dev/null differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-hover-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-hover-linux.png deleted file mode 100644 index c3b5f34feb..0000000000 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-hover-linux.png and /dev/null differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-hover-silent-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-hover-silent-linux.png deleted file mode 100644 index bc2085b205..0000000000 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-hover-silent-linux.png and /dev/null differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-invited-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-invited-linux.png deleted file mode 100644 index b024c0729c..0000000000 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-invited-linux.png and /dev/null differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-low-priority-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-low-priority-linux.png deleted file mode 100644 index c9dd4b6bd8..0000000000 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-low-priority-linux.png and /dev/null differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-mark-as-unread-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-mark-as-unread-linux.png deleted file mode 100644 index ee778c6871..0000000000 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-mark-as-unread-linux.png and /dev/null differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-mention-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-mention-linux.png deleted file mode 100644 index 4b3c7fc1d1..0000000000 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-mention-linux.png and /dev/null differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-message-preview-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-message-preview-linux.png deleted file mode 100644 index 7042a7078e..0000000000 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-message-preview-linux.png and /dev/null differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-notification-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-notification-linux.png deleted file mode 100644 index 4a92165c46..0000000000 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-notification-linux.png and /dev/null differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-more-options-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-more-options-linux.png deleted file mode 100644 index 3e68b09ad6..0000000000 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-more-options-linux.png and /dev/null differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-notification-options-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-notification-options-linux.png deleted file mode 100644 index 68762d038d..0000000000 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-notification-options-linux.png and /dev/null differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-notification-options-selection-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-notification-options-selection-linux.png deleted file mode 100644 index cdebb2131d..0000000000 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-open-notification-options-selection-linux.png and /dev/null differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-public-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-public-linux.png deleted file mode 100644 index ad64e0c526..0000000000 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-public-linux.png and /dev/null differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-silent-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-silent-linux.png deleted file mode 100644 index d9deb6cb1c..0000000000 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-silent-linux.png and /dev/null differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-video-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-video-linux.png deleted file mode 100644 index c3d6f5f952..0000000000 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-item-video-linux.png and /dev/null differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-linux.png deleted file mode 100644 index 896af9eff7..0000000000 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-linux.png and /dev/null differ diff --git a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-scrolled-linux.png b/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-scrolled-linux.png deleted file mode 100644 index 81f3af0cb6..0000000000 Binary files a/playwright/snapshots/left-panel/room-list-panel/room-list.spec.ts/room-list-scrolled-linux.png and /dev/null differ diff --git a/playwright/snapshots/register/register.spec.ts/email-prompt-linux.png b/playwright/snapshots/register/register.spec.ts/email-prompt-linux.png deleted file mode 100644 index e49db5d408..0000000000 Binary files a/playwright/snapshots/register/register.spec.ts/email-prompt-linux.png and /dev/null differ diff --git a/playwright/snapshots/register/register.spec.ts/registration-linux.png b/playwright/snapshots/register/register.spec.ts/registration-linux.png deleted file mode 100644 index 1cca0eb56b..0000000000 Binary files a/playwright/snapshots/register/register.spec.ts/registration-linux.png and /dev/null differ diff --git a/playwright/snapshots/room/room-status-bar.spec.ts/connectivity-lost-linux.png b/playwright/snapshots/room/room-status-bar.spec.ts/connectivity-lost-linux.png deleted file mode 100644 index 0568892b39..0000000000 Binary files a/playwright/snapshots/room/room-status-bar.spec.ts/connectivity-lost-linux.png and /dev/null differ diff --git a/playwright/snapshots/room/room-status-bar.spec.ts/consent-linux.png b/playwright/snapshots/room/room-status-bar.spec.ts/consent-linux.png deleted file mode 100644 index c528eb619a..0000000000 Binary files a/playwright/snapshots/room/room-status-bar.spec.ts/consent-linux.png and /dev/null differ diff --git a/playwright/snapshots/room/room-status-bar.spec.ts/local-room-create-failed-linux.png b/playwright/snapshots/room/room-status-bar.spec.ts/local-room-create-failed-linux.png deleted file mode 100644 index 304a425466..0000000000 Binary files a/playwright/snapshots/room/room-status-bar.spec.ts/local-room-create-failed-linux.png and /dev/null differ diff --git a/playwright/snapshots/room/room-status-bar.spec.ts/message-failed-linux.png b/playwright/snapshots/room/room-status-bar.spec.ts/message-failed-linux.png deleted file mode 100644 index fe23d40790..0000000000 Binary files a/playwright/snapshots/room/room-status-bar.spec.ts/message-failed-linux.png and /dev/null differ diff --git a/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/appearance-tab-linux.png b/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/appearance-tab-linux.png deleted file mode 100644 index dc019d4fd5..0000000000 Binary files a/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/appearance-tab-linux.png and /dev/null differ diff --git a/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/window-12px-linux.png b/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/window-12px-linux.png deleted file mode 100644 index c86f95ee29..0000000000 Binary files a/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/window-12px-linux.png and /dev/null differ diff --git a/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/window-after-switch-linux.png b/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/window-after-switch-linux.png deleted file mode 100644 index cdb4586302..0000000000 Binary files a/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/window-after-switch-linux.png and /dev/null differ diff --git a/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/window-before-switch-linux.png b/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/window-before-switch-linux.png deleted file mode 100644 index bc78959225..0000000000 Binary files a/playwright/snapshots/settings/appearance-user-settings-tab/appearance-user-settings-tab.spec.ts/window-before-switch-linux.png and /dev/null differ diff --git a/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/window-custom-theme-linux.png b/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/window-custom-theme-linux.png deleted file mode 100644 index 66963ae433..0000000000 Binary files a/playwright/snapshots/settings/appearance-user-settings-tab/theme-choice-panel.spec.ts/window-custom-theme-linux.png and /dev/null differ diff --git a/playwright/snapshots/settings/preferences-user-settings-tab.spec.ts/Preferences-user-settings-tab-should-be-rendered-properly-1-linux.png b/playwright/snapshots/settings/preferences-user-settings-tab.spec.ts/Preferences-user-settings-tab-should-be-rendered-properly-1-linux.png deleted file mode 100644 index ac54127655..0000000000 Binary files a/playwright/snapshots/settings/preferences-user-settings-tab.spec.ts/Preferences-user-settings-tab-should-be-rendered-properly-1-linux.png and /dev/null differ diff --git a/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-room-tree-no-avatar-linux.png b/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-room-tree-no-avatar-linux.png deleted file mode 100644 index f3478d05aa..0000000000 Binary files a/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-room-tree-no-avatar-linux.png and /dev/null differ diff --git a/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-room-tree-with-avatar-linux.png b/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-room-tree-with-avatar-linux.png deleted file mode 100644 index 7555a90440..0000000000 Binary files a/playwright/snapshots/timeline/media-preview-settings.spec.ts/invite-room-tree-with-avatar-linux.png and /dev/null differ diff --git a/playwright/snapshots/timeline/timeline.spec.ts/hidden-event-line-zero-padding-irc-layout-linux.png b/playwright/snapshots/timeline/timeline.spec.ts/hidden-event-line-zero-padding-irc-layout-linux.png deleted file mode 100644 index 6b864dc8c0..0000000000 Binary files a/playwright/snapshots/timeline/timeline.spec.ts/hidden-event-line-zero-padding-irc-layout-linux.png and /dev/null differ diff --git a/playwright/snapshots/timeline/timeline.spec.ts/url-preview-linux.png b/playwright/snapshots/timeline/timeline.spec.ts/url-preview-linux.png deleted file mode 100644 index 0f7d951d69..0000000000 Binary files a/playwright/snapshots/timeline/timeline.spec.ts/url-preview-linux.png and /dev/null differ diff --git a/playwright/snapshots/user-menu/user-menu.spec.ts/user-menu-linux.png b/playwright/snapshots/user-menu/user-menu.spec.ts/user-menu-linux.png deleted file mode 100644 index a911341579..0000000000 Binary files a/playwright/snapshots/user-menu/user-menu.spec.ts/user-menu-linux.png and /dev/null differ diff --git a/playwright/snapshots/voip/element-call.spec.ts/incoming-call-dm-voice-toast-linux.png b/playwright/snapshots/voip/element-call.spec.ts/incoming-call-dm-voice-toast-linux.png deleted file mode 100644 index 34ddc1b02f..0000000000 Binary files a/playwright/snapshots/voip/element-call.spec.ts/incoming-call-dm-voice-toast-linux.png and /dev/null differ diff --git a/playwright/snapshots/voip/element-call.spec.ts/incoming-call-group-voice-toast-linux.png b/playwright/snapshots/voip/element-call.spec.ts/incoming-call-group-voice-toast-linux.png deleted file mode 100644 index 6703827c6d..0000000000 Binary files a/playwright/snapshots/voip/element-call.spec.ts/incoming-call-group-voice-toast-linux.png and /dev/null differ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 74878c99d5..20153f0339 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,17 +7,20 @@ settings: catalogs: default: '@element-hq/element-web-module-api': - specifier: 1.9.0 - version: 1.9.0 + specifier: 1.9.1 + version: 1.9.1 '@element-hq/element-web-playwright-common': specifier: 2.2.7 version: 2.2.7 + '@fontsource/inter': + specifier: 5.2.8 + version: 5.2.8 '@playwright/test': - specifier: 1.58.1 - version: 1.58.1 + specifier: 1.58.2 + version: 1.58.2 '@vector-im/compound-design-tokens': - specifier: 6.9.0 - version: 6.9.0 + specifier: 6.10.0 + version: 6.10.0 '@vector-im/compound-web': specifier: 8.3.6 version: 8.3.6 @@ -41,10 +44,12 @@ overrides: oidc-client-ts: 3.4.1 jwt-decode: 4.0.0 caniuse-lite: 1.0.30001766 + markdown-it: 14.1.1 testcontainers: ^11.0.0 wrap-ansi-cjs: npm:wrap-ansi@^7.0.0 wrap-ansi: npm:wrap-ansi@^7.0.0 matrix-widget-api: ^1.16.1 + qs: 6.14.2 packageExtensionsChecksum: sha256-OFePh8Fn8A1ZEWgJF51vTMPT/HEVyXQyj6YGIztPb0w= @@ -80,28 +85,79 @@ patchedDependencies: importers: .: + devDependencies: + '@action-validator/cli': + specifier: ^0.6.0 + version: 0.6.0(@action-validator/core@0.6.0) + '@action-validator/core': + specifier: ^0.6.0 + version: 0.6.0 + '@nx-tools/nx-container': + specifier: ^7.2.1 + version: 7.2.1(@nx/devkit@22.5.1(nx@22.5.1))(@nx/js@22.5.1(@babel/traverse@7.29.0)(nx@22.5.1))(dotenv@17.3.1)(nx@22.5.1)(tslib@2.8.1) + '@nx/jest': + specifier: ^22.5.0 + version: 22.5.1(@babel/traverse@7.29.0)(@types/node@22.19.11)(babel-plugin-macros@3.1.0)(nx@22.5.1)(typescript@5.9.3) + '@types/node': + specifier: '22' + version: 22.19.11 + cronstrue: + specifier: ^3.0.0 + version: 3.12.0 + eslint-plugin-matrix-org: + specifier: ^3.0.0 + version: 3.0.0(8064d09a0e89f811cb4abdd560a53405) + husky: + specifier: ^9.0.0 + version: 9.1.7 + knip: + specifier: ^5.36.2 + version: 5.83.1(@types/node@22.19.11)(typescript@5.9.3) + lint-staged: + specifier: ^16.0.0 + version: 16.2.7 + lodash: + specifier: ^4.17.21 + version: 4.17.23 + minimist: + specifier: ^1.2.6 + version: 1.2.8 + nx: + specifier: 22.5.1 + version: 22.5.1 + prettier: + specifier: 3.8.1 + version: 3.8.1 + typescript: + specifier: 'catalog:' + version: 5.9.3 + yaml: + specifier: ^2.3.3 + version: 2.8.2 + + apps/web: dependencies: '@babel/runtime': specifier: ^7.12.5 version: 7.28.6 '@element-hq/element-web-module-api': specifier: 'catalog:' - version: 1.9.0(@matrix-org/react-sdk-module-api@2.5.0(patch_hash=016146c9cc96e6363609d2b2ac0896ccef567882eb1d73b75a77b8a30929de96)(react@19.2.4))(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(matrix-web-i18n@3.6.0)(react@19.2.4) + version: 1.9.1(@matrix-org/react-sdk-module-api@2.5.0(patch_hash=016146c9cc96e6363609d2b2ac0896ccef567882eb1d73b75a77b8a30929de96)(react@19.2.4))(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(matrix-web-i18n@3.6.0)(react@19.2.4) '@element-hq/web-shared-components': specifier: workspace:* - version: link:packages/shared-components + version: link:../../packages/shared-components '@fontsource/fira-code': specifier: ^5 version: 5.2.7 '@fontsource/inter': - specifier: ^5 + specifier: 'catalog:' version: 5.2.8 '@formatjs/intl-segmenter': specifier: ^12.0.0 version: 12.1.1 '@matrix-org/analytics-events': - specifier: ^0.31.0 - version: 0.31.0 + specifier: ^0.32.0 + version: 0.32.0 '@matrix-org/emojibase-bindings': specifier: ^1.5.0 version: 1.5.0 @@ -116,10 +172,10 @@ importers: version: 1.0.2 '@vector-im/compound-design-tokens': specifier: 'catalog:' - version: 6.9.0(@types/react@19.2.10)(react@19.2.4) + version: 6.10.0(@types/react@19.2.10)(react@19.2.4) '@vector-im/compound-web': specifier: 'catalog:' - version: 8.3.6(@fontsource/inconsolata@5.2.8)(@fontsource/inter@5.2.8)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(@vector-im/compound-design-tokens@6.9.0(@types/react@19.2.10)(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 8.3.6(@fontsource/inconsolata@5.2.8)(@fontsource/inter@5.2.8)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(@vector-im/compound-design-tokens@6.10.0(@types/react@19.2.10)(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@vector-im/matrix-wysiwyg': specifier: 2.40.0 version: 2.40.0(patch_hash=7bdf6150f2905bc2f055a6bcaa7b9d78fa7ffde82e800bcc454ac7b0096bd65e)(react@19.2.4) @@ -188,7 +244,7 @@ importers: version: 2.6.0 html-react-parser: specifier: ^5.2.2 - version: 5.2.16(@types/react@19.2.10)(react@19.2.4) + version: 5.2.17(@types/react@19.2.10)(react@19.2.4) is-ip: specifier: ^5.0.0 version: 5.0.1 @@ -221,13 +277,13 @@ importers: version: lodash-es@4.17.23 maplibre-gl: specifier: ^5.0.0 - version: 5.17.0 + version: 5.18.0 matrix-encrypt-attachment: specifier: ^1.0.3 version: 1.0.3 matrix-js-sdk: specifier: github:matrix-org/matrix-js-sdk#develop - version: https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/e74eb4928e748194165b7200afe48e582bdc1fd7 + version: https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/5739b59faaf33fa55457dcaa76ffebe0506d1466 matrix-widget-api: specifier: ^1.16.1 version: 1.17.0 @@ -250,8 +306,8 @@ importers: specifier: ^1.0.0 version: 1.0.0 posthog-js: - specifier: 1.336.4 - version: 1.336.4 + specifier: 1.347.2 + version: 1.347.2 qrcode: specifier: 1.5.4 version: 1.5.4 @@ -301,12 +357,6 @@ importers: specifier: ^5.2.10 version: 5.2.12 devDependencies: - '@action-validator/cli': - specifier: ^0.6.0 - version: 0.6.0(@action-validator/core@0.6.0) - '@action-validator/core': - specifier: ^0.6.0 - version: 0.6.0 '@babel/core': specifier: ^7.12.10 version: 7.29.0 @@ -366,34 +416,31 @@ importers: version: 0.16.3 '@element-hq/element-web-playwright-common': specifier: 'catalog:' - version: 2.2.7(@element-hq/element-web-module-api@1.9.0(@matrix-org/react-sdk-module-api@2.5.0(patch_hash=016146c9cc96e6363609d2b2ac0896ccef567882eb1d73b75a77b8a30929de96)(react@19.2.4))(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(matrix-web-i18n@3.6.0)(react@19.2.4))(@playwright/test@1.58.1)(playwright-core@1.58.1) + version: 2.2.7(@element-hq/element-web-module-api@1.9.1(@matrix-org/react-sdk-module-api@2.5.0(patch_hash=016146c9cc96e6363609d2b2ac0896ccef567882eb1d73b75a77b8a30929de96)(react@19.2.4))(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(matrix-web-i18n@3.6.0)(react@19.2.4))(@playwright/test@1.58.2)(playwright-core@1.58.2) '@element-hq/element-web-playwright-common-local': specifier: workspace:* - version: link:packages/playwright-common + version: link:../../packages/playwright-common '@fetch-mock/jest': specifier: ^0.2.20 - version: 0.2.20(@jest/globals@30.2.0)(jest@30.2.0(@types/node@22.19.8)(babel-plugin-macros@3.1.0)) + version: 0.2.20(@jest/globals@30.2.0)(jest@30.2.0(@types/node@22.19.11)(babel-plugin-macros@3.1.0)) '@jest/globals': specifier: ^30.2.0 version: 30.2.0 - '@nx/jest': - specifier: ^22.5.0 - version: 22.5.0(@babel/traverse@7.29.0)(@types/node@22.19.8)(babel-plugin-macros@3.1.0)(nx@22.5.0)(typescript@5.9.3) '@peculiar/webcrypto': specifier: ^1.4.3 version: 1.5.0 '@playwright/test': specifier: 'catalog:' - version: 1.58.1 + version: 1.58.2 '@principalstudio/html-webpack-inject-preload': specifier: ^1.2.7 - version: 1.2.7(html-webpack-plugin@5.6.6(webpack@5.105.0))(webpack@5.105.0) + version: 1.2.7(html-webpack-plugin@5.6.6(webpack@5.105.2))(webpack@5.105.2) '@sentry/webpack-plugin': specifier: ^4.0.0 - version: 4.9.0(encoding@0.1.13)(webpack@5.105.0) + version: 4.9.1(encoding@0.1.13)(webpack@5.105.2) '@stylistic/eslint-plugin': specifier: ^5.0.0 - version: 5.7.1(eslint@8.57.1) + version: 5.8.0(eslint@8.57.1) '@svgr/webpack': specifier: ^8.0.0 version: 8.1.0(typescript@5.9.3) @@ -456,7 +503,7 @@ importers: version: 3.5.6 '@types/node': specifier: '22' - version: 22.19.8 + version: 22.19.11 '@types/pako': specifier: ^2.0.0 version: 2.0.4 @@ -495,16 +542,16 @@ importers: version: 0.7.39 '@typescript-eslint/eslint-plugin': specifier: ^8.19.0 - version: 8.54.0(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + version: 8.55.0(@typescript-eslint/parser@8.55.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: ^8.19.0 - version: 8.54.0(eslint@8.57.1)(typescript@5.9.3) + version: 8.55.0(eslint@8.57.1)(typescript@5.9.3) babel-jest: specifier: ^30.0.0 version: 30.2.0(@babel/core@7.29.0) babel-loader: specifier: ^10.0.0 - version: 10.0.0(@babel/core@7.29.0)(webpack@5.105.0) + version: 10.0.0(@babel/core@7.29.0)(webpack@5.105.2) babel-plugin-jsx-remove-data-test-id: specifier: ^3.0.0 version: 3.0.0(@babel/core@7.29.0) @@ -516,19 +563,16 @@ importers: version: 5.0.0 copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.1(webpack@5.105.0) - cronstrue: - specifier: ^3.0.0 - version: 3.11.0 + version: 13.0.1(webpack@5.105.2) css-loader: specifier: ^7.0.0 - version: 7.1.3(webpack@5.105.0) + version: 7.1.3(webpack@5.105.2) css-minimizer-webpack-plugin: specifier: ^7.0.0 - version: 7.0.4(webpack@5.105.0) + version: 7.0.4(webpack@5.105.2) dotenv: specifier: ^17.0.0 - version: 17.2.3 + version: 17.3.1 eslint: specifier: 8.57.1 version: 8.57.1 @@ -543,16 +587,16 @@ importers: version: 0.8.7(eslint@8.57.1) eslint-plugin-import: specifier: ^2.25.4 - version: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1) + version: 2.32.0(@typescript-eslint/parser@8.55.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1) eslint-plugin-jest: specifier: ^29.0.0 - version: 29.12.2(@typescript-eslint/eslint-plugin@8.54.0(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(jest@30.2.0(@types/node@22.19.8)(babel-plugin-macros@3.1.0))(typescript@5.9.3) + version: 29.15.0(@typescript-eslint/eslint-plugin@8.55.0(@typescript-eslint/parser@8.55.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(jest@30.2.0(@types/node@22.19.11)(babel-plugin-macros@3.1.0))(typescript@5.9.3) eslint-plugin-jsx-a11y: specifier: ^6.5.1 version: 6.10.2(eslint@8.57.1) eslint-plugin-matrix-org: specifier: ^3.0.0 - version: 3.0.0(6db84371ed43b4e24329a3ce8b8ba2e5) + version: 3.0.0(8064d09a0e89f811cb4abdd560a53405) eslint-plugin-react: specifier: ^7.28.0 version: 7.37.5(eslint@8.57.1) @@ -573,19 +617,16 @@ importers: version: 6.2.5 file-loader: specifier: ^6.0.0 - version: 6.2.0(webpack@5.105.0) + version: 6.2.0(webpack@5.105.2) html-webpack-plugin: specifier: ^5.5.3 - version: 5.6.6(webpack@5.105.0) - husky: - specifier: ^9.0.0 - version: 9.1.7 + version: 5.6.6(webpack@5.105.2) identity-obj-proxy: specifier: ^3.0.0 version: 3.0.0 jest: specifier: ^30.0.0 - version: 30.2.0(@types/node@22.19.8)(babel-plugin-macros@3.1.0) + version: 30.2.0(@types/node@22.19.11)(babel-plugin-macros@3.1.0) jest-canvas-mock: specifier: ^2.5.2 version: 2.5.2 @@ -604,27 +645,18 @@ importers: jsqr: specifier: ^1.4.0 version: 1.4.0 - knip: - specifier: ^5.36.2 - version: 5.83.0(@types/node@22.19.8)(typescript@5.9.3) - lint-staged: - specifier: ^16.0.0 - version: 16.2.7 matrix-web-i18n: specifier: 'catalog:' version: 3.6.0 mini-css-extract-plugin: specifier: 2.10.0 - version: 2.10.0(webpack@5.105.0) + version: 2.10.0(webpack@5.105.2) minimist: specifier: ^1.2.6 version: 1.2.8 modernizr: specifier: ^3.12.0 version: 3.13.1 - nx: - specifier: 22.5.0 - version: 22.5.0 postcss: specifier: 8.5.6 version: 8.5.6 @@ -639,7 +671,7 @@ importers: version: 16.1.1(postcss@8.5.6) postcss-loader: specifier: 8.2.0 - version: 8.2.0(postcss@8.5.6)(typescript@5.9.3)(webpack@5.105.0) + version: 8.2.0(postcss@8.5.6)(typescript@5.9.3)(webpack@5.105.2) postcss-mixins: specifier: 12.0.0 version: 12.0.0(postcss@8.5.6) @@ -663,31 +695,28 @@ importers: version: 0.11.10 raw-loader: specifier: ^4.0.2 - version: 4.0.2(webpack@5.105.0) - rimraf: - specifier: ^6.0.0 - version: 6.1.2 + version: 4.0.2(webpack@5.105.2) semver: specifier: ^7.5.2 - version: 7.7.3 + version: 7.7.4 source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.105.0) + version: 5.0.0(webpack@5.105.2) stylelint: specifier: ^17.0.0 - version: 17.1.1(typescript@5.9.3) + version: 17.3.0(typescript@5.9.3) stylelint-config-standard: specifier: ^40.0.0 - version: 40.0.0(stylelint@17.1.1(typescript@5.9.3)) + version: 40.0.0(stylelint@17.3.0(typescript@5.9.3)) stylelint-scss: specifier: ^7.0.0 - version: 7.0.0(stylelint@17.1.1(typescript@5.9.3)) + version: 7.0.0(stylelint@17.3.0(typescript@5.9.3)) stylelint-value-no-unknown-custom-properties: specifier: ^6.0.1 - version: 6.1.1(stylelint@17.1.1(typescript@5.9.3)) + version: 6.1.1(stylelint@17.3.0(typescript@5.9.3)) terser-webpack-plugin: specifier: ^5.3.9 - version: 5.3.16(webpack@5.105.0) + version: 5.3.16(webpack@5.105.2) testcontainers: specifier: ^11.0.0 version: 11.11.0 @@ -702,28 +731,31 @@ importers: version: 4.2.0 webpack: specifier: ^5.89.0 - version: 5.105.0(webpack-cli@6.0.1) + version: 5.105.2(webpack-cli@6.0.1) webpack-bundle-analyzer: specifier: ^5.0.0 version: 5.2.0 webpack-cli: specifier: ^6.0.0 - version: 6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.0) + version: 6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.2) webpack-dev-server: specifier: ^5.0.0 - version: 5.2.3(tslib@2.8.1)(webpack-cli@6.0.1)(webpack@5.105.0) + version: 5.2.3(tslib@2.8.1)(webpack-cli@6.0.1)(webpack@5.105.2) webpack-retry-chunk-load-plugin: specifier: ^3.1.1 - version: 3.1.1(webpack@5.105.0) + version: 3.1.1(webpack@5.105.2) webpack-version-file-plugin: specifier: ^0.5.0 - version: 0.5.0(webpack@5.105.0) + version: 0.5.0(webpack@5.105.2) yaml: specifier: ^2.3.3 version: 2.8.2 packages/playwright-common: devDependencies: + '@playwright/test': + specifier: 'catalog:' + version: 1.58.2 wait-on: specifier: ^9.0.4 version: 9.0.4 @@ -732,13 +764,13 @@ importers: dependencies: '@element-hq/element-web-module-api': specifier: 'catalog:' - version: 1.9.0(@matrix-org/react-sdk-module-api@2.5.0(patch_hash=016146c9cc96e6363609d2b2ac0896ccef567882eb1d73b75a77b8a30929de96)(react@19.2.4))(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(matrix-web-i18n@3.6.0)(react@19.2.4) + version: 1.9.1(@matrix-org/react-sdk-module-api@2.5.0(patch_hash=016146c9cc96e6363609d2b2ac0896ccef567882eb1d73b75a77b8a30929de96)(react@19.2.4))(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(matrix-web-i18n@3.6.0)(react@19.2.4) '@matrix-org/spec': specifier: ^1.7.0 version: 1.16.0 '@vector-im/compound-design-tokens': specifier: 'catalog:' - version: 6.9.0(@types/react@19.2.10)(react@19.2.4) + version: 6.10.0(@types/react@19.2.10)(react@19.2.4) classnames: specifier: ^2.5.1 version: 2.5.1 @@ -767,33 +799,36 @@ importers: '@fetch-mock/vitest': specifier: ^0.2.18 version: 0.2.18(vitest@4.0.18) + '@fontsource/inter': + specifier: 'catalog:' + version: 5.2.8 '@matrix-org/react-sdk-module-api': specifier: ^2.5.0 version: 2.5.0(patch_hash=016146c9cc96e6363609d2b2ac0896ccef567882eb1d73b75a77b8a30929de96)(react@19.2.4) '@playwright/test': specifier: 'catalog:' - version: 1.58.1 + version: 1.58.2 '@storybook/addon-a11y': specifier: ^10.0.7 - version: 10.2.5(storybook@10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + version: 10.2.9(storybook@10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) '@storybook/addon-designs': specifier: ^11.0.1 - version: 11.1.1(@storybook/addon-docs@10.2.5(@types/react@19.2.10)(esbuild@0.27.2)(rollup@4.57.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.0(esbuild@0.27.2)(webpack-cli@6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.0))))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + version: 11.1.2(@storybook/addon-docs@10.2.9(@types/react@19.2.10)(esbuild@0.27.3)(rollup@4.57.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.2(esbuild@0.27.3)))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) '@storybook/addon-docs': specifier: ^10.0.7 - version: 10.2.5(@types/react@19.2.10)(esbuild@0.27.2)(rollup@4.57.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.0(esbuild@0.27.2)(webpack-cli@6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.0))) + version: 10.2.9(@types/react@19.2.10)(esbuild@0.27.3)(rollup@4.57.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.2(esbuild@0.27.3)) '@storybook/addon-vitest': specifier: ^10.1.11 - version: 10.2.5(@vitest/browser-playwright@4.0.18)(@vitest/browser@4.0.18(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18))(@vitest/runner@4.0.18)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vitest@4.0.18) + version: 10.2.9(@vitest/browser-playwright@4.0.18)(@vitest/browser@4.0.18(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18))(@vitest/runner@4.0.18)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vitest@4.0.18) '@storybook/icons': specifier: ^2.0.0 version: 2.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@storybook/react-vite': specifier: ^10.0.7 - version: 10.2.5(esbuild@0.27.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.57.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.0(esbuild@0.27.2)(webpack-cli@6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.0))) + version: 10.2.9(esbuild@0.27.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.57.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.2(esbuild@0.27.3)) '@stylistic/eslint-plugin': specifier: ^5.7.0 - version: 5.7.1(eslint@8.57.1) + version: 5.8.0(eslint@8.57.1) '@testing-library/dom': specifier: ^10.4.1 version: 10.4.1 @@ -820,19 +855,19 @@ importers: version: 19.2.3(@types/react@19.2.10) '@typescript-eslint/eslint-plugin': specifier: ^8.53.1 - version: 8.54.0(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + version: 8.55.0(@typescript-eslint/parser@8.55.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: ^8.53.1 - version: 8.54.0(eslint@8.57.1)(typescript@5.9.3) + version: 8.55.0(eslint@8.57.1)(typescript@5.9.3) '@vector-im/compound-web': specifier: 'catalog:' - version: 8.3.6(@fontsource/inconsolata@5.2.8)(@fontsource/inter@5.2.8)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(@vector-im/compound-design-tokens@6.9.0(@types/react@19.2.10)(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 8.3.6(@fontsource/inconsolata@5.2.8)(@fontsource/inter@5.2.8)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(@vector-im/compound-design-tokens@6.10.0(@types/react@19.2.10)(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@vitejs/plugin-react': specifier: ^5.1.2 - version: 5.1.3(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + version: 5.1.4(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) '@vitest/browser-playwright': specifier: ^4.0.17 - version: 4.0.18(playwright@1.58.1)(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18) + version: 4.0.18(playwright@1.58.2)(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18) '@vitest/coverage-v8': specifier: ^4.0.17 version: 4.0.18(@vitest/browser@4.0.18(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18))(vitest@4.0.18) @@ -853,13 +888,13 @@ importers: version: 0.8.7(eslint@8.57.1) eslint-plugin-import: specifier: ^2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1) + version: 2.32.0(@typescript-eslint/parser@8.55.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1) eslint-plugin-jsx-a11y: specifier: ^6.10.2 version: 6.10.2(eslint@8.57.1) eslint-plugin-matrix-org: specifier: ^3.0.0 - version: 3.0.0(0699af949871f0c7d06fd35b98c746d0) + version: 3.0.0(88cf2a0369f0febb2d3aa37ceb59305d) eslint-plugin-react: specifier: ^7.37.5 version: 7.37.5(eslint@8.57.1) @@ -871,7 +906,7 @@ importers: version: 7.0.1(eslint@8.57.1) eslint-plugin-storybook: specifier: ^10.0.7 - version: 10.2.5(eslint@8.57.1)(storybook@10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) + version: 10.2.10(eslint@8.57.1)(storybook@10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) eslint-plugin-unicorn: specifier: ^56.0.0 version: 56.0.1(eslint@8.57.1) @@ -883,10 +918,10 @@ importers: version: 3.8.1 storybook: specifier: ^10.0.7 - version: 10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) storybook-addon-vis: specifier: ^3.1.2 - version: 3.1.2(@storybook/addon-vitest@10.2.5(@vitest/browser-playwright@4.0.18)(@vitest/browser@4.0.18(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18))(@vitest/runner@4.0.18)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vitest@4.0.18))(@vitest/browser-playwright@4.0.18)(@vitest/browser@4.0.18(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18))(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vitest@4.0.18) + version: 3.1.2(@storybook/addon-vitest@10.2.9(@vitest/browser-playwright@4.0.18)(@vitest/browser@4.0.18(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18))(@vitest/runner@4.0.18)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vitest@4.0.18))(@vitest/browser-playwright@4.0.18)(@vitest/browser@4.0.18(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18))(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vitest@4.0.18) typedoc: specifier: ^0.28.16 version: 0.28.16(typescript@5.9.3) @@ -929,6 +964,15 @@ packages: '@action-validator/core@0.6.0': resolution: {integrity: sha512-tPglwCr8Mm8SWzwnVewwFmqRx91F0WvMsM0BRAqH4CLalyGndm53Xvp+UcUSzswpk1wkjIDYI7RyEhWMLyPkig==} + '@actions/github@6.0.1': + resolution: {integrity: sha512-xbZVcaqD4XnQAe35qSQqskb3SqIAfRyLBrHMd/8TuL7hJSz2QtbDwnNM8zWx4zO5l2fnGtseNE3MbEvD7BxVMw==} + + '@actions/http-client@2.2.3': + resolution: {integrity: sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA==} + + '@actions/io@1.1.3': + resolution: {integrity: sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==} + '@adobe/css-tools@4.4.4': resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} @@ -1643,8 +1687,8 @@ packages: '@cacheable/memory@2.0.7': resolution: {integrity: sha512-RbxnxAMf89Tp1dLhXMS7ceft/PGsDl1Ip7T20z5nZ+pwIAsQ1p2izPjVG69oCLv/jfQ7HDPHTWK0c9rcAWXN3A==} - '@cacheable/utils@2.3.3': - resolution: {integrity: sha512-JsXDL70gQ+1Vc2W/KUFfkAJzgb4puKwwKehNLuB+HrNKWf91O736kGfxn4KujXCCSuh6mRRL4XEB0PkAFjWS0A==} + '@cacheable/utils@2.3.4': + resolution: {integrity: sha512-knwKUJEYgIfwShABS1BX6JyJJTglAFcEU7EXqzTdiGCXur4voqkiJkdgZIQtWNFhynzDWERcTYv/sETMu3uJWA==} '@casualbot/jest-sonar-reporter@2.5.0': resolution: {integrity: sha512-2/kaSndRYHPqxrnWLszHCzKD5kkmoDq9X54x68ghSxLWzLDEwKzTRiJcRsjRHtqOeMJmwf0EgS/nuv/1BDGI8g==} @@ -1672,8 +1716,8 @@ packages: '@csstools/css-parser-algorithms': ^3.0.5 '@csstools/css-tokenizer': ^3.0.4 - '@csstools/css-calc@3.0.0': - resolution: {integrity: sha512-q4d82GTl8BIlh/dTnVsWmxnbWJeb3kiU8eUH71UxlxnS+WIaALmtzTL8gR15PkYOexMQYVk0CO4qIG93C1IvPA==} + '@csstools/css-calc@3.1.1': + resolution: {integrity: sha512-HJ26Z/vmsZQqs/o3a6bgKslXGFAungXGbinULZO3eMsOyNJHeBBZfup5FiZInOghgoM4Hwnmw+OgbJCNg1wwUQ==} engines: {node: '>=20.19.0'} peerDependencies: '@csstools/css-parser-algorithms': ^4.0.0 @@ -1705,8 +1749,8 @@ packages: peerDependencies: '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.0.26': - resolution: {integrity: sha512-6boXK0KkzT5u5xOgF6TKB+CLq9SOpEGmkZw0g5n9/7yg85wab3UzSxB8TxhLJ31L4SGJ6BCFRw/iftTha1CJXA==} + '@csstools/css-syntax-patches-for-csstree@1.0.27': + resolution: {integrity: sha512-sxP33Jwg1bviSUXAV43cVYdmjt2TLnLXNqCWl9xmxHawWVjGz/kEbdkr7F9pxJNBN2Mh+dq0crgItbW6tQvyow==} '@csstools/css-tokenizer@3.0.4': resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} @@ -1998,8 +2042,8 @@ packages: '@element-hq/element-call-embedded@0.16.3': resolution: {integrity: sha512-OViKJonDaDNVBUW9WdV9mk78/Ruh34C7XsEgt3O8D9z+64C39elbIgllHSoH5S12IRlv9RYrrV37FZLo6QWsDQ==} - '@element-hq/element-web-module-api@1.9.0': - resolution: {integrity: sha512-Ao/V9w+wysZK4bh61LlKlznF10n2ZbD6KcUI46/zUMttXbmJn3ahvbzhEpwYcD+Cjy3ag5ycxLIIGkKV/fncXg==} + '@element-hq/element-web-module-api@1.9.1': + resolution: {integrity: sha512-eCHHBkaDWc7Ai10b2VmOAkWIQAsur+YZ2kpFrPFVG41wMXn0PbFL+n6wvpbN+mU5Mg7uVIqXhQn4jflHESBUrA==} engines: {node: '>=20.0.0'} peerDependencies: '@matrix-org/react-sdk-module-api': '*' @@ -2031,158 +2075,158 @@ packages: '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} - '@esbuild/aix-ppc64@0.27.2': - resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} + '@esbuild/aix-ppc64@0.27.3': + resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.27.2': - resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} + '@esbuild/android-arm64@0.27.3': + resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.27.2': - resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} + '@esbuild/android-arm@0.27.3': + resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.27.2': - resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} + '@esbuild/android-x64@0.27.3': + resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.27.2': - resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} + '@esbuild/darwin-arm64@0.27.3': + resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.27.2': - resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} + '@esbuild/darwin-x64@0.27.3': + resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.27.2': - resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} + '@esbuild/freebsd-arm64@0.27.3': + resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.2': - resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} + '@esbuild/freebsd-x64@0.27.3': + resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.27.2': - resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} + '@esbuild/linux-arm64@0.27.3': + resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.27.2': - resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} + '@esbuild/linux-arm@0.27.3': + resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.27.2': - resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} + '@esbuild/linux-ia32@0.27.3': + resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.27.2': - resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} + '@esbuild/linux-loong64@0.27.3': + resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.27.2': - resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} + '@esbuild/linux-mips64el@0.27.3': + resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.27.2': - resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} + '@esbuild/linux-ppc64@0.27.3': + resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.27.2': - resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} + '@esbuild/linux-riscv64@0.27.3': + resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.27.2': - resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} + '@esbuild/linux-s390x@0.27.3': + resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.27.2': - resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} + '@esbuild/linux-x64@0.27.3': + resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.27.2': - resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} + '@esbuild/netbsd-arm64@0.27.3': + resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.2': - resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} + '@esbuild/netbsd-x64@0.27.3': + resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.27.2': - resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} + '@esbuild/openbsd-arm64@0.27.3': + resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.2': - resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} + '@esbuild/openbsd-x64@0.27.3': + resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.27.2': - resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} + '@esbuild/openharmony-arm64@0.27.3': + resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.27.2': - resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} + '@esbuild/sunos-x64@0.27.3': + resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.27.2': - resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} + '@esbuild/win32-arm64@0.27.3': + resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.27.2': - resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} + '@esbuild/win32-ia32@0.27.3': + resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.27.2': - resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} + '@esbuild/win32-x64@0.27.3': + resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -2205,6 +2249,10 @@ packages: resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@fastify/busboy@2.1.1': + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + '@fetch-mock/jest@0.2.20': resolution: {integrity: sha512-DGX2bhBInodaWPMV3+UZ530aVM3wDj16sAPjFzkrwb0JwNWIQK07CNbYprQ3Tmd2ixDJeaNx2E0aNb+hRb8FFA==} engines: {node: '>=18.11.0'} @@ -2330,6 +2378,10 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@isaacs/cliui@9.0.0': + resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} + engines: {node: '>=18'} + '@istanbuljs/load-nyc-config@1.1.0': resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -2430,8 +2482,8 @@ packages: resolution: {integrity: sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@joshwooding/vite-plugin-react-docgen-typescript@0.6.3': - resolution: {integrity: sha512-9TGZuAX+liGkNKkwuo3FYJu7gHWT0vkBcf7GkOe7s7fmC19XwH/4u5u7sDIFrMooe558ORcmuBvBz7Ur5PlbHw==} + '@joshwooding/vite-plugin-react-docgen-typescript@0.6.4': + resolution: {integrity: sha512-6PyZBYKnnVNqOSB0YFly+62R7dmov8segT27A+RVTBVd4iAE6kbW9QBJGlyR2yG4D4ohzhZSTIu7BK1UTtmFFA==} peerDependencies: typescript: '>= 4.3.x' vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -2632,14 +2684,14 @@ packages: resolution: {integrity: sha512-UKhA4qv1h30XT768ccSv5NjNCX+dgfoq2qlLVmKejspPcSQTYD4SrVucgqegmYcKcmwf06wcNAa/kRd0NHWbUg==} hasBin: true - '@maplibre/mlt@1.1.5': - resolution: {integrity: sha512-HjoAIOYAfZo2El/tHBnvWpCRlodWgWLZ/tyO4Wrw0LVY2bkQz1+pwAwDvmgSRvfkSkSzWnqJJd1JwgCrq/60HQ==} + '@maplibre/mlt@1.1.6': + resolution: {integrity: sha512-rgtY3x65lrrfXycLf6/T22ZnjTg5WgIOsptOIoCaMZy4O4UAKTyZlYY0h6v8le721pTptF94U65yMDQkug+URw==} '@maplibre/vt-pbf@4.2.1': resolution: {integrity: sha512-IxZBGq/+9cqf2qdWlFuQ+ZfoMhWpxDUGQZ/poPHOJBvwMUT1GuxLo6HgYTou+xxtsOsjfbcjI8PZaPCtmt97rA==} - '@matrix-org/analytics-events@0.31.0': - resolution: {integrity: sha512-rZrtHt6X1cnleWPPSp56fngYBiq2Db1jQt+bATEUlDwwiMCrG3D5ojYqOQ03MlgySLIZLBAAam//bZAqiGWOwQ==} + '@matrix-org/analytics-events@0.32.0': + resolution: {integrity: sha512-Z5hl4wJdIvskFCOzHAh/7tQKlyvJ/5/JdvfTTySuJ/v47VmkCGvkdDD6ODT9+15psj3O8Cc2Ofgh2KqDJjd6kg==} '@matrix-org/emojibase-bindings@1.5.0': resolution: {integrity: sha512-+W9/ow2Z3iQa7ZOF698PBhwNcgGkn36B5Sr8VDPx8N8CH7+Uw+7TrtbtKPZVdgf4m/THmgmfX40jS5YDBsLaYg==} @@ -2703,78 +2755,159 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nx/devkit@22.5.0': - resolution: {integrity: sha512-CLHu+zoZW8szUc0aoSrDc8P8UkWsCCoSJoa3mHsw1rYxyvFv8ufKBMmIN/jUKNx+q/XJmGivymcNI1z3vpql0w==} + '@nx-tools/ci-context@7.2.1': + resolution: {integrity: sha512-w1w3AYZbIM+yOcOqFQ2E5nzzg9GCgSZ5bFhVflL6o5UmucrW7Sb4LHeLqSFSa4gUaGN0kWnmDNH/dlF9u8Ngqg==} + engines: {node: '>=20.19.0 <21 || >=22.12.0 <23 || >=24.0.0'} + peerDependencies: + tslib: ^2.6.0 + + '@nx-tools/container-metadata@7.2.1': + resolution: {integrity: sha512-cXFJeVCwfeFlPZAoYgN013B6tf9b1P9wdVllHWTDn+v4gMHYcQ0DmySteZeD41ain1III3bHQZL+vc7Js3XHSA==} + engines: {node: '>=20.19.0 <21 || >=22.12.0 <23 || >=24.0.0'} + peerDependencies: + '@nx/devkit': '>=18.0.0 <23.0.0' + tslib: ^2.6.0 + + '@nx-tools/core@7.2.1': + resolution: {integrity: sha512-zuZJ2eQ9E8vCqPCO/M4gvGM5Pj2gdU5XvFXXVifFs1v5tKaC7ainayLoH2sdodMTMRMyzXl1E6F4OvVrrESEsg==} + engines: {node: '>=20.19.0 <21 || >=22.12.0 <23 || >=24.0.0'} + peerDependencies: + '@nx/devkit': '>=18.0.0 <23.0.0' + tslib: ^2.6.0 + + '@nx-tools/nx-container@7.2.1': + resolution: {integrity: sha512-S1IdAwPqCnPw1mj49QvpJAM350j/xug+VU/1xJ0f/Keq+9G3b1OnTi/EoB6PwhNLWM0QY6PXQ/enpGS5SFdbtQ==} + engines: {node: '>=20.19.0 <21 || >=22.12.0 <23 || >=24.0.0'} + peerDependencies: + '@nx/devkit': '>=18.0.0 <23.0.0' + '@nx/js': '>=18.0.0 <23.0.0' + dotenv: '>=16.0.0' + nx: '>=18.0.0 <23.0.0' + tslib: ^2.6.0 + + '@nx/devkit@22.5.1': + resolution: {integrity: sha512-1ZJ8pCB+6EWC8X6q8tfBweg92WzFAwliBhtBkOPP8Li8GQq71ulPWRdY4lDd5pH3Ea1zKqhOtBKWdOlyDPOKYA==} peerDependencies: nx: '>= 21 <= 23 || ^22.0.0-0' - '@nx/jest@22.5.0': - resolution: {integrity: sha512-ISuI5K1Cg/CHcL94zQbj4r/3+I9/IdeBxX7iRpzYV1ZtYhk/Wt9DEFwX/6CveBNl70RpMCw+PLRKkWoJhYvbew==} + '@nx/jest@22.5.1': + resolution: {integrity: sha512-pzynR/D61JJV21UEtsIsNRFQ4JvFGckxmMa31ndCfRJKBRVIJVTICdrrga/pls5vjII/K3nNaz/QBQqTOvHNLQ==} - '@nx/js@22.5.0': - resolution: {integrity: sha512-+RZAdUwxJNENEtrkwGUMSqQ4f3Vipn0ERZI0EB04rq4QlET30fcUa8yfBf/QYll4LOZ//Ej4vD3TjyWtoJ+dFw==} + '@nx/js@22.5.1': + resolution: {integrity: sha512-g/0x9P7e2KDsY5po9RxvsNR2Z8xPWpWqTs82gll1G/h5Jot2QJ6oIuZTfjdHramVXWd6pi6KoruxThnNv5DmYQ==} peerDependencies: verdaccio: ^6.0.5 peerDependenciesMeta: verdaccio: optional: true - '@nx/nx-darwin-arm64@22.5.0': - resolution: {integrity: sha512-MHnzv6tzucvLsh4oS9FTepj+ct/o8/DPXrQow+9Jid7GSgY59xrDX/8CleJOrwL5lqKEyGW7vv8TR+4wGtEWTA==} + '@nx/nx-darwin-arm64@22.5.1': + resolution: {integrity: sha512-DuvOwhXPO6l9W7/zM4/BaAbGTIXFyHVcbbCD1c7HfgZ3VfJPmcE7H4+TuQH0cigHHtpg/eGqV100NQbd7N4zwg==} cpu: [arm64] os: [darwin] - '@nx/nx-darwin-x64@22.5.0': - resolution: {integrity: sha512-/0w43hbR5Kia0XeCDZHDt/18FHhpwQs+Y+8TO8/ZsF1RgCI0knJDCyJieYk1yEZAq6E8dStAJnuzxK9uvETs4A==} + '@nx/nx-darwin-x64@22.5.1': + resolution: {integrity: sha512-81Lb7+rp3Qltpgy33Kc1qxk+8IWqZLhqvdLdRFSVV1FN1pPSJDFKyPjCn9oMpRryNPSJ8DgZDpfIaVVyP85rUw==} cpu: [x64] os: [darwin] - '@nx/nx-freebsd-x64@22.5.0': - resolution: {integrity: sha512-d4Pd1VFpD272R7kJTWm/Pj49BIz44GZ+QIVSfxlx3GWxyaPd25X9GBanUngL6qpactS+aLTwcoBmnSbZ4PEcEQ==} + '@nx/nx-freebsd-x64@22.5.1': + resolution: {integrity: sha512-Ig8yQN3lSz9R+Zf3NQWcvEnIzwDX4NSeaFtEliPnC3OHlQXGNXbOUfkExa0U0UUgyxa4rgnCgefmwuc12H9q2Q==} cpu: [x64] os: [freebsd] - '@nx/nx-linux-arm-gnueabihf@22.5.0': - resolution: {integrity: sha512-cCyG23PikIlqE7I6s9j0aHJSqIxnpdOjFOXyRd224XmFyAB8tOyKl7vDD/WugcpAceos28i+Rgz4na189zm48A==} + '@nx/nx-linux-arm-gnueabihf@22.5.1': + resolution: {integrity: sha512-C7tGoLnR9MjKLJsLMF2VsKcDChPiygAsw6dSVgU4B650H7sBWmkEHM/QjvyRvkcZuoQBDamS/eVs/UaJu9wNhA==} cpu: [arm] os: [linux] - '@nx/nx-linux-arm64-gnu@22.5.0': - resolution: {integrity: sha512-vkQw8737fpta6oVEEqskzwq+d0GeZkGhtyl+U3pAcuUcYTdqbsZaofSQACFnGfngsqpYmlJCWJGU5Te00qcPQw==} + '@nx/nx-linux-arm64-gnu@22.5.1': + resolution: {integrity: sha512-GNxei+lwhzhrO9m+nNkibgxLhbkYKyFXPSRpOKLwv9VavNzJn5UmLfKJyhjNQPBOSYuNhiVPbU1Ja/qOBcozYw==} cpu: [arm64] os: [linux] libc: [glibc] - '@nx/nx-linux-arm64-musl@22.5.0': - resolution: {integrity: sha512-BkEsFBsnKrDK11N914rr5YKyIJwYoSVItJ7VzsQZIqAX0C7PdJeQ7KzqOGwoezbabdLmzFOBNg6s/o1ujoEYxw==} + '@nx/nx-linux-arm64-musl@22.5.1': + resolution: {integrity: sha512-VDJtdJP2nCgS8ommbfWFAKjoZCE51VH7tZyIfh8RFI5fxwoB3Pk6d6f6cmNHI/1t98YI3V7Onuf3Y9KBkYtyfQ==} cpu: [arm64] os: [linux] libc: [musl] - '@nx/nx-linux-x64-gnu@22.5.0': - resolution: {integrity: sha512-Dsqoz4hWmqehMMm8oJY6Q0ckEUeeHz4+T/C8nHyDaaj/REKCSmqYf/+QV6f2Z5Up/CsQ/hoAsWYEhCHZ0tcSFg==} + '@nx/nx-linux-x64-gnu@22.5.1': + resolution: {integrity: sha512-BZ/i+KTplEJmE8ZHKgPGD513Zl86DuSGyRAvbDZ7Qf19Tei7Of6vxW+ypvVDIwmDbyXfe13u54M5gDt8iiqFGQ==} cpu: [x64] os: [linux] libc: [glibc] - '@nx/nx-linux-x64-musl@22.5.0': - resolution: {integrity: sha512-Lcj/61BpsT85Qhm3hNTwQFrqGtsjLC+y4Kk21dh22d1/E5pOdVAwPXBuWrSPNo4lX+ESNoKmwxWjfgW3uoB05g==} + '@nx/nx-linux-x64-musl@22.5.1': + resolution: {integrity: sha512-e0VdiV6fe88Dbhill2gUjYAD9jMhHjYsafGOPR+/uaGMAYPoI1jKur6uPGY+ik6fvwvDFFl0VT2+HACKVn7RoA==} cpu: [x64] os: [linux] libc: [musl] - '@nx/nx-win32-arm64-msvc@22.5.0': - resolution: {integrity: sha512-0DlnBDLvqNtseCyBBoBst0gwux+N91RBc4E41JDDcLcWpfntcwCQM39D6lA5qdma/0L7U0PUM7MYV9Q6igJMkQ==} + '@nx/nx-win32-arm64-msvc@22.5.1': + resolution: {integrity: sha512-3vWZO9y7uHKeyepcU55pE8VQTKGome3mLdicvx1TCoKKl0cA3bTR341Jdo2Zl4Waa2ENk7pGQbLWRQ3ZkaA92A==} cpu: [arm64] os: [win32] - '@nx/nx-win32-x64-msvc@22.5.0': - resolution: {integrity: sha512-kMMsU4PxKQ76NvmPFKT0/RlzRTiuUfuNWVJUmsWF1onVcBkXgQNKkmLcSJk3wGwML5/tHChjtlI7Hpo705Uv/g==} + '@nx/nx-win32-x64-msvc@22.5.1': + resolution: {integrity: sha512-4e5LduuhpBx96JgD1J3fHUGCwC+/lL+tvXp3UVtjh/AOdINGsyI+scinT3uaI9vcB5GKBcybTxbBZzwcH50w9g==} cpu: [x64] os: [win32] - '@nx/workspace@22.5.0': - resolution: {integrity: sha512-kFXSMV7eGVBSJlfPtbIDrlUFYDspFpwHcsYFU+qwyg/b5R8lNfYKlSC0ypL2XyG4kwCMoTr4BDEaY5nYRWW3Lw==} + '@nx/workspace@22.5.1': + resolution: {integrity: sha512-IZJ440ITiNpswacrTGGpo46adOszLAAZM9RYYvQg5ak8kZDmmrskTm0SWWVgZCuiJazw8s23vqDLQ07TN/t1NQ==} + + '@octokit/auth-token@4.0.0': + resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==} + engines: {node: '>= 18'} + + '@octokit/core@5.2.2': + resolution: {integrity: sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==} + engines: {node: '>= 18'} + + '@octokit/endpoint@9.0.6': + resolution: {integrity: sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==} + engines: {node: '>= 18'} + + '@octokit/graphql@7.1.1': + resolution: {integrity: sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==} + engines: {node: '>= 18'} + + '@octokit/openapi-types@20.0.0': + resolution: {integrity: sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==} + + '@octokit/openapi-types@22.2.0': + resolution: {integrity: sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==} + + '@octokit/openapi-types@24.2.0': + resolution: {integrity: sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==} + + '@octokit/plugin-paginate-rest@9.2.2': + resolution: {integrity: sha512-u3KYkGF7GcZnSD/3UP0S7K5XUFT2FkOQdcfXZGZQPGv3lm4F2Xbf71lvjldr8c1H3nNbF+33cLEkWYbokGWqiQ==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '5' + + '@octokit/plugin-rest-endpoint-methods@10.4.1': + resolution: {integrity: sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '5' + + '@octokit/request-error@5.1.1': + resolution: {integrity: sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==} + engines: {node: '>= 18'} + + '@octokit/request@8.4.1': + resolution: {integrity: sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==} + engines: {node: '>= 18'} + + '@octokit/types@12.6.0': + resolution: {integrity: sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==} + + '@octokit/types@13.10.0': + resolution: {integrity: sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==} '@opentelemetry/api-logs@0.208.0': resolution: {integrity: sha512-CjruKY9V6NMssL/T1kAFgzosF1v9o6oeN+aX5JB/C/xPNtmgIJqcXHG7fA82Ou1zCpWGl4lROQUKwUNE1pMCyg==} @@ -2848,111 +2981,111 @@ packages: resolution: {integrity: sha512-R5R9tb2AXs2IRLNKLBJDynhkfmx7mX0vi8NkhZb3gUkPWHn6HXk5J8iQ/dql0U3ApfWym4kXXmBDRGO+oeOfjg==} engines: {node: '>=14'} - '@oxc-resolver/binding-android-arm-eabi@11.17.0': - resolution: {integrity: sha512-kVnY21v0GyZ/+LG6EIO48wK3mE79BUuakHUYLIqobO/Qqq4mJsjuYXMSn3JtLcKZpN1HDVit4UHpGJHef1lrlw==} + '@oxc-resolver/binding-android-arm-eabi@11.17.1': + resolution: {integrity: sha512-+VuZyMYYaap5uDAU1xDU3Kul0FekLqpBS8kI5JozlWfYQKnc/HsZg2gHPkQrj0SC9lt74WMNCfOzZZJlYXSdEQ==} cpu: [arm] os: [android] - '@oxc-resolver/binding-android-arm64@11.17.0': - resolution: {integrity: sha512-Pf8e3XcsK9a8RHInoAtEcrwf2vp7V9bSturyUUYxw9syW6E7cGi7z9+6ADXxm+8KAevVfLA7pfBg8NXTvz/HOw==} + '@oxc-resolver/binding-android-arm64@11.17.1': + resolution: {integrity: sha512-YlDDTjvOEKhom/cRSVsXsMVeXVIAM9PJ/x2mfe08rfuS0iIEfJd8PngKbEIhG72WPxleUa+vkEZj9ncmC14z3Q==} cpu: [arm64] os: [android] - '@oxc-resolver/binding-darwin-arm64@11.17.0': - resolution: {integrity: sha512-lVSgKt3biecofXVr8e1hnfX0IYMd4A6VCxmvOmHsFt5Zbmt0lkO4S2ap2bvQwYDYh5ghUNamC7M2L8K6vishhQ==} + '@oxc-resolver/binding-darwin-arm64@11.17.1': + resolution: {integrity: sha512-HOYYLSY4JDk14YkXaz/ApgJYhgDP4KsG8EZpgpOxdszGW9HmIMMY/vXqVKYW74dSH+GQkIXYxBrEh3nv+XODVg==} cpu: [arm64] os: [darwin] - '@oxc-resolver/binding-darwin-x64@11.17.0': - resolution: {integrity: sha512-+/raxVJE1bo7R4fA9Yp0wm3slaCOofTEeUzM01YqEGcRDLHB92WRGjRhagMG2wGlvqFuSiTp81DwSbBVo/g6AQ==} + '@oxc-resolver/binding-darwin-x64@11.17.1': + resolution: {integrity: sha512-JHPJbsa5HvPq2/RIdtGlqfaG9zV2WmgvHrKTYmlW0L5esqtKCBuetFudXTBzkNcyD69kSZLzH92AzTr6vFHMFg==} cpu: [x64] os: [darwin] - '@oxc-resolver/binding-freebsd-x64@11.17.0': - resolution: {integrity: sha512-x9Ks56n+n8h0TLhzA6sJXa2tGh3uvMGpBppg6PWf8oF0s5S/3p/J6k1vJJ9lIUtTmenfCQEGKnFokpRP4fLTLg==} + '@oxc-resolver/binding-freebsd-x64@11.17.1': + resolution: {integrity: sha512-UD1FRC8j8xZstFXYsXwQkNmmg7vUbee006IqxokwDUUA+xEgKZDpLhBEiVKM08Urb+bn7Q0gn6M1pyNR0ng5mg==} cpu: [x64] os: [freebsd] - '@oxc-resolver/binding-linux-arm-gnueabihf@11.17.0': - resolution: {integrity: sha512-Wf3w07Ow9kXVJrS0zmsaFHKOGhXKXE8j1tNyy+qIYDsQWQ4UQZVx5SjlDTcqBnFerlp3Z3Is0RjmVzgoLG3qkA==} + '@oxc-resolver/binding-linux-arm-gnueabihf@11.17.1': + resolution: {integrity: sha512-wFWC1wyf2ROFWTxK5x0Enm++DSof3EBQ/ypyAesMDLiYxOOASDoMOZG1ylWUnlKaCt5W7eNOWOzABpdfFf/ssA==} cpu: [arm] os: [linux] - '@oxc-resolver/binding-linux-arm-musleabihf@11.17.0': - resolution: {integrity: sha512-N0OKA1al1gQ5Gm7Fui1RWlXaHRNZlwMoBLn3TVtSXX+WbnlZoVyDqqOqFL8+pVEHhhxEA2LR8kmM0JO6FAk6dg==} + '@oxc-resolver/binding-linux-arm-musleabihf@11.17.1': + resolution: {integrity: sha512-k/hUif0GEBk/csSqCfTPXb8AAVs1NNWCa/skBghvNbTtORcWfOVqJ3mM+2pE189+enRm4UnryLREu5ysI0kXEQ==} cpu: [arm] os: [linux] - '@oxc-resolver/binding-linux-arm64-gnu@11.17.0': - resolution: {integrity: sha512-wdcQ7Niad9JpjZIGEeqKJnTvczVunqlZ/C06QzR5zOQNeLVRScQ9S5IesKWUAPsJQDizV+teQX53nTK+Z5Iy+g==} + '@oxc-resolver/binding-linux-arm64-gnu@11.17.1': + resolution: {integrity: sha512-Cwm6A071ww60QouJ9LoHAwBgEoZzHQ0Qaqk2E7WLfBdiQN9mLXIDhnrpn04hlRElRPhLiu/dtg+o5PPLvaINXQ==} cpu: [arm64] os: [linux] libc: [glibc] - '@oxc-resolver/binding-linux-arm64-musl@11.17.0': - resolution: {integrity: sha512-65B2/t39HQN5AEhkLsC+9yBD1iRUkKOIhfmJEJ7g6wQ9kylra7JRmNmALFjbsj0VJsoSQkpM8K07kUZuNJ9Kxw==} + '@oxc-resolver/binding-linux-arm64-musl@11.17.1': + resolution: {integrity: sha512-+hwlE2v3m0r3sk93SchJL1uyaKcPjf+NGO/TD2DZUDo+chXx7FfaEj0nUMewigSt7oZ2sQN9Z4NJOtUa75HE5Q==} cpu: [arm64] os: [linux] libc: [musl] - '@oxc-resolver/binding-linux-ppc64-gnu@11.17.0': - resolution: {integrity: sha512-kExgm3TLK21dNMmcH+xiYGbc6BUWvT03PUZ2aYn8mUzGPeeORklBhg3iYcaBI3ZQHB25412X1Z6LLYNjt4aIaA==} + '@oxc-resolver/binding-linux-ppc64-gnu@11.17.1': + resolution: {integrity: sha512-bO+rsaE5Ox8cFyeL5Ct5tzot1TnQpFa/Wmu5k+hqBYSH2dNVDGoi0NizBN5QV8kOIC6O5MZr81UG4yW/2FyDTA==} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxc-resolver/binding-linux-riscv64-gnu@11.17.0': - resolution: {integrity: sha512-1utUJC714/ydykZQE8c7QhpEyM4SaslMfRXxN9G61KYazr6ndt85LaubK3EZCSD50vVEfF4PVwFysCSO7LN9uA==} + '@oxc-resolver/binding-linux-riscv64-gnu@11.17.1': + resolution: {integrity: sha512-B/P+hxKQ1oX4YstI9Lyh4PGzqB87Ddqj/A4iyRBbPdXTcxa+WW3oRLx1CsJKLmHPdDk461Hmbghq1Bm3pl+8Aw==} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxc-resolver/binding-linux-riscv64-musl@11.17.0': - resolution: {integrity: sha512-mayiYOl3LMmtO2CLn4I5lhanfxEo0LAqlT/EQyFbu1ZN3RS+Xa7Q3JEM0wBpVIyfO/pqFrjvC5LXw/mHNDEL7A==} + '@oxc-resolver/binding-linux-riscv64-musl@11.17.1': + resolution: {integrity: sha512-ulp2H3bFXzd/th2maH+QNKj5qgOhJ3v9Yspdf1svTw3CDOuuTl6sRKsWQ7MUw0vnkSNvQndtflBwVXgzZvURsQ==} cpu: [riscv64] os: [linux] libc: [musl] - '@oxc-resolver/binding-linux-s390x-gnu@11.17.0': - resolution: {integrity: sha512-Ow/yI+CrUHxIIhn/Y1sP/xoRKbCC3x9O1giKr3G/pjMe+TCJ5ZmfqVWU61JWwh1naC8X5Xa7uyLnbzyYqPsHfg==} + '@oxc-resolver/binding-linux-s390x-gnu@11.17.1': + resolution: {integrity: sha512-LAXYVe3rKk09Zo9YKF2ZLBcH8sz8Oj+JIyiUxiHtq0hiYLMsN6dOpCf2hzQEjPAmsSEA/hdC1PVKeXo+oma8mQ==} cpu: [s390x] os: [linux] libc: [glibc] - '@oxc-resolver/binding-linux-x64-gnu@11.17.0': - resolution: {integrity: sha512-Z4J7XlPMQOLPANyu6y3B3V417Md4LKH5bV6bhqgaG99qLHmU5LV2k9ErV14fSqoRc/GU/qOpqMdotxiJqN/YWg==} + '@oxc-resolver/binding-linux-x64-gnu@11.17.1': + resolution: {integrity: sha512-3RAhxipMKE8RCSPn7O//sj440i+cYTgYbapLeOoDvQEt6R1QcJjTsFgI4iz99FhVj3YbPxlZmcLB5VW+ipyRTA==} cpu: [x64] os: [linux] libc: [glibc] - '@oxc-resolver/binding-linux-x64-musl@11.17.0': - resolution: {integrity: sha512-0effK+8lhzXsgsh0Ny2ngdnTPF30v6QQzVFApJ1Ctk315YgpGkghkelvrLYYgtgeFJFrzwmOJ2nDvCrUFKsS2Q==} + '@oxc-resolver/binding-linux-x64-musl@11.17.1': + resolution: {integrity: sha512-wpjMEubGU8r9VjZTLdZR3aPHaBqTl8Jl8F4DBbgNoZ+yhkhQD1/MGvY70v2TLnAI6kAHSvcqgfvaqKDa2iWsPQ==} cpu: [x64] os: [linux] libc: [musl] - '@oxc-resolver/binding-openharmony-arm64@11.17.0': - resolution: {integrity: sha512-kFB48dRUW6RovAICZaxHKdtZe+e94fSTNA2OedXokzMctoU54NPZcv0vUX5PMqyikLIKJBIlW7laQidnAzNrDA==} + '@oxc-resolver/binding-openharmony-arm64@11.17.1': + resolution: {integrity: sha512-XIE4w17RYAVIgx+9Gs3deTREq5tsmalbatYOOBGNdH7n0DfTE600c7wYXsp7ANc3BPDXsInnOzXDEPCvO1F6cg==} cpu: [arm64] os: [openharmony] - '@oxc-resolver/binding-wasm32-wasi@11.17.0': - resolution: {integrity: sha512-a3elKSBLPT0OoRPxTkCIIc+4xnOELolEBkPyvdj01a6PSdSmyJ1NExWjWLaXnT6wBMblvKde5RmSwEi3j+jZpg==} + '@oxc-resolver/binding-wasm32-wasi@11.17.1': + resolution: {integrity: sha512-Lqi5BlHX3zS4bpSOkIbOKVf7DIk6Gvmdifr2OuOI58eUUyP944M8/OyaB09cNpPy9Vukj7nmmhOzj8pwLgAkIg==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@oxc-resolver/binding-win32-arm64-msvc@11.17.0': - resolution: {integrity: sha512-4eszUsSDb9YVx0RtYkPWkxxtSZIOgfeiX//nG5cwRRArg178w4RCqEF1kbKPud9HPrp1rXh7gE4x911OhvTnPg==} + '@oxc-resolver/binding-win32-arm64-msvc@11.17.1': + resolution: {integrity: sha512-l6lTcLBQVj1HNquFpXSsrkCIM8X5Hlng5YNQJrg00z/KyovvDV5l3OFhoRyZ+aLBQ74zUnMRaJZC7xcBnHyeNg==} cpu: [arm64] os: [win32] - '@oxc-resolver/binding-win32-ia32-msvc@11.17.0': - resolution: {integrity: sha512-t946xTXMmR7yGH0KAe9rB055/X4EPIu93JUvjchl2cizR5QbuwkUV7vLS2BS6x6sfvDoQb6rWYnV1HCci6tBSg==} + '@oxc-resolver/binding-win32-ia32-msvc@11.17.1': + resolution: {integrity: sha512-VTzVtfnCCsU/6GgvursWoyZrhe3Gj/RyXzDWmh4/U1Y3IW0u1FZbp+hCIlBL16pRPbDc5YvXVtCOnA41QOrOoQ==} cpu: [ia32] os: [win32] - '@oxc-resolver/binding-win32-x64-msvc@11.17.0': - resolution: {integrity: sha512-pX6s2kMXLQg+hlqKk5UqOW09iLLxnTkvn8ohpYp2Mhsm2yzDPCx9dyOHiB/CQixLzTkLQgWWJykN4Z3UfRKW4Q==} + '@oxc-resolver/binding-win32-x64-msvc@11.17.1': + resolution: {integrity: sha512-jRPVU+6/12baj87q2+UGRh30FBVBzqKdJ7rP/mSqiL1kpNQB9yZ1j0+m3sru1m+C8hiFK7lBFwjUtYUBI7+UpQ==} cpu: [x64] os: [win32] @@ -3011,19 +3144,19 @@ packages: resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@playwright/test@1.58.1': - resolution: {integrity: sha512-6LdVIUERWxQMmUSSQi0I53GgCBYgM2RpGngCPY7hSeju+VrKjq3lvs7HpJoPbDiY5QM5EYRtRX5fvrinnMAz3w==} + '@playwright/test@1.58.2': + resolution: {integrity: sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==} engines: {node: '>=18'} hasBin: true '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} - '@posthog/core@1.17.0': - resolution: {integrity: sha512-8pDNL+/u9ojzXloA5wILVDXBCV5daJ7w2ipCALQlEEZmL752cCKhRpbyiHn3tjKXh3Hy6aOboJneYa1JdlVHrQ==} + '@posthog/core@1.22.0': + resolution: {integrity: sha512-WkmOnq95aAOu6yk6r5LWr5cfXsQdpVbWDCwOxQwxSne8YV6GuZET1ziO5toSQXgrgbdcjrSz2/GopAfiL6iiAA==} - '@posthog/types@1.336.4': - resolution: {integrity: sha512-BY3cq/8segbXEvHbEXx9SWmaKJEM0AGgsOgMFH2yy13AV+rUHsGcp4Z5LDI5pU25DURN9EAZvzcoVyYy/Iokmw==} + '@posthog/types@1.347.2': + resolution: {integrity: sha512-aT+r/7jXOzPmUHO6sutoWzczPcYIZyhmWt1f1OvY4zKC7Pwp/ZsJWKFTxjV02p0PZz96AE83eLTe7w7b6tjhIw==} '@principalstudio/html-webpack-inject-preload@1.2.7': resolution: {integrity: sha512-KJKkiKG63ugBjf8U0e9jUcI9CLPTFIsxXplEDE0oi3mPpxd90X9SJovo3W2l7yh/ARKIYXhQq8fSXUN7M29TzQ==} @@ -3437,8 +3570,12 @@ packages: '@radix-ui/rect@1.1.1': resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} - '@rolldown/pluginutils@1.0.0-rc.2': - resolution: {integrity: sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==} + '@renovatebot/pep440@4.2.1': + resolution: {integrity: sha512-2FK1hF93Fuf1laSdfiEmJvSJPVIDHEUTz68D3Fi9s0IZrrpaEcj6pTFBTbYvsgC5du4ogrtf5re7yMMvrKNgkw==} + engines: {node: ^20.9.0 || ^22.11.0 || ^24, pnpm: ^10.0.0} + + '@rolldown/pluginutils@1.0.0-rc.3': + resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} '@rollup/plugin-inject@5.0.5': resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} @@ -3645,16 +3782,16 @@ packages: resolution: {integrity: sha512-YWIkL6/dnaiQyFiZXJ/nN+NXGv/15z45ia86bE/TMq01CubX/DUOilgsFz0pk2v/pg3tp/U2MskLO9Hz0cnqeg==} engines: {node: '>=18'} - '@sentry/babel-plugin-component-annotate@4.9.0': - resolution: {integrity: sha512-TJ7sVoa2Bf36lpJjBAzpNDC5Hg+evjsQnqUPeDx9Nz/YFw0u9rK1cwvi95gVWpx7PJSDCkljIv3aw0m4RatHpQ==} + '@sentry/babel-plugin-component-annotate@4.9.1': + resolution: {integrity: sha512-0gEoi2Lb54MFYPOmdTfxlNKxI7kCOvNV7gP8lxMXJ7nCazF5OqOOZIVshfWjDLrc0QrSV6XdVvwPV9GDn4wBMg==} engines: {node: '>= 14'} '@sentry/browser@10.38.0': resolution: {integrity: sha512-3phzp1YX4wcQr9mocGWKbjv0jwtuoDBv7+Y6Yfrys/kwyaL84mDLjjQhRf4gL5SX7JdYkhBp4WaiNlR0UC4kTA==} engines: {node: '>=18'} - '@sentry/bundler-plugin-core@4.9.0': - resolution: {integrity: sha512-gOVgHG5BrxCFmZow1XovlDr1FH/gO/LfD8OKci1rryeqHVBLr3+S4yS4ACl+E5lfQPym8Ve1BKh793d1rZ0dyA==} + '@sentry/bundler-plugin-core@4.9.1': + resolution: {integrity: sha512-moii+w7N8k8WdvkX7qCDY9iRBlhgHlhTHTUQwF2FNMhBHuqlNpVcSJJqJMjFUQcjYMBDrZgxhfKV18bt5ixwlQ==} engines: {node: '>= 14'} '@sentry/cli-darwin@2.58.4': @@ -3713,8 +3850,8 @@ packages: resolution: {integrity: sha512-1pubWDZE5y5HZEPMAZERP4fVl2NH3Ihp1A+vMoVkb3Qc66Diqj1WierAnStlZP7tCx0TBa0dK85GTW/ZFYyB9g==} engines: {node: '>=18'} - '@sentry/webpack-plugin@4.9.0': - resolution: {integrity: sha512-2usiAS8vVBb24DXMYHtHsuCasnxo5uJMO6tpGPCMpyLYVooq5ypNvV+egiwlO6Dmyp9/BFK2hcK1vPRL5K5Trw==} + '@sentry/webpack-plugin@4.9.1': + resolution: {integrity: sha512-Ssx2lHiq8VWywUGd/hmW3U3VYBC0Up7D6UzUiDAWvy18PbTCVszaa54fKMFEQ1yIBg/ePRET53pIzfkcZgifmQ==} engines: {node: '>= 14'} peerDependencies: webpack: '>=4.40.0' @@ -3750,13 +3887,13 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - '@storybook/addon-a11y@10.2.5': - resolution: {integrity: sha512-Fkrfl8QhjkbYl4pYZQpkJ2zDVdRGLmmqL/Gj+79phVNNfiOP1SSoXdUt7eqHWMNIRla8rLXhZEJRdXHDC+aaTg==} + '@storybook/addon-a11y@10.2.9': + resolution: {integrity: sha512-oWho1jJXS1QfjShin9yC2o60pvkPskgpqUDB5Of4XHFpOaV4hVfoqS1HjhZBQyjWZkN64EE42X3HVlwUwToPfg==} peerDependencies: - storybook: ^10.2.5 + storybook: ^10.2.9 - '@storybook/addon-designs@11.1.1': - resolution: {integrity: sha512-1KAmTzoW/qw4RfR8uft3pBgsdWHoQiMp9rt+nzhFLEBPd1Ru3YiTnVL/JBEiJkGXsQfQxMnAYRRwYgf+HTr4yw==} + '@storybook/addon-designs@11.1.2': + resolution: {integrity: sha512-d9tOOJSNrUOshK0hvnDtR17uk/gfDAbs0DKGRaKe0VacUVLJkJEPor4OpxKKFG59qtSi4iU1FYyb668hfMdCdw==} peerDependencies: '@storybook/addon-docs': ^10.0.0 || ^10.0.0-0 || ^10.1.0-0 || ^10.2.0-0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -3770,18 +3907,18 @@ packages: react-dom: optional: true - '@storybook/addon-docs@10.2.5': - resolution: {integrity: sha512-gRWGyyWQW0LwiQOoFZxg1v8/U43aDZLuljGJmtr/l655fZi0pdDKCFy+97EBx3yrmuNNoQFP0yUGUZZD+ZH0Ew==} + '@storybook/addon-docs@10.2.9': + resolution: {integrity: sha512-rPUSyymt6IDI8PbZVEXPnqOysstp+mKeZiPRxcKIklecDhLUiy5Yc2PQneYY//Gp7Z/CEe54tJHr+WpFgtLPYg==} peerDependencies: - storybook: ^10.2.5 + storybook: ^10.2.9 - '@storybook/addon-vitest@10.2.5': - resolution: {integrity: sha512-MY4bxapGvHj4E0DeRlvFAMf/ZhMLOWkwAPdB8e5eq+S4X19DBikXRJ6gTdBxZQkbJv7WzwUQiYfYMybMmFT51g==} + '@storybook/addon-vitest@10.2.9': + resolution: {integrity: sha512-KZViI6jfE4lZb8lfti4sSb2mEj3jXGRy/d6fQxTM6gheS2A6WWuV5LmSArCMz9KqhSitu1Vy+rYhwkz97fecGw==} peerDependencies: '@vitest/browser': ^3.0.0 || ^4.0.0 '@vitest/browser-playwright': ^4.0.0 '@vitest/runner': ^3.0.0 || ^4.0.0 - storybook: ^10.2.5 + storybook: ^10.2.9 vitest: ^3.0.0 || ^4.0.0 peerDependenciesMeta: '@vitest/browser': @@ -3793,18 +3930,18 @@ packages: vitest: optional: true - '@storybook/builder-vite@10.2.5': - resolution: {integrity: sha512-BmntBWLxa/CTx0QJvF53HYcvblXNoBR0JtAQonuTxRX6daYEjBOGGYFrU09ADz72XkHAaC1Yb9YZNQgKF4+1kA==} + '@storybook/builder-vite@10.2.9': + resolution: {integrity: sha512-01DvThkchYqHh2GzqFTNrrNsrn3URuHXfHlDt2u+ggqiBKjObxeRhlgZN0ntG9w41Y05mhWH9pRAKbPMGDBIwQ==} peerDependencies: - storybook: ^10.2.5 + storybook: ^10.2.9 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 - '@storybook/csf-plugin@10.2.5': - resolution: {integrity: sha512-YBWzaKlI06ZsFlTF5eDp7HHchyDsvmrUpTBtpPfpHyf9a/PqZp6qztKUx6VIRypJjm/JoMxYPgxWKA8z5nwRhg==} + '@storybook/csf-plugin@10.2.9': + resolution: {integrity: sha512-vfGZeszuDZc742eQgpA/W6ok54ePYPYz9MLdM6u3XBHJXmNhsjbcwSFTXZHrxjyDn88vXdo+Frg3HBKkOQBnbQ==} peerDependencies: esbuild: '*' rollup: '*' - storybook: ^10.2.5 + storybook: ^10.2.9 vite: '*' webpack: '*' peerDependenciesMeta: @@ -3826,34 +3963,34 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@storybook/react-dom-shim@10.2.5': - resolution: {integrity: sha512-pkl77sBBVKPAPfki1A2VyzIOrSV67KwvuvI7rBdP+EdXxdSD6eS2O+8wRnjPhOlXGdVUUXSeIyWyJSf7/zVJ3Q==} + '@storybook/react-dom-shim@10.2.9': + resolution: {integrity: sha512-hlvFl0ylK/RZ4GxOXcBfzQNoOm3/x0LEgaPYlkR2/P4CTbKKTc+fHRsZMpFgP/X0g8oZmfm93mdhQdX0zlF8JQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.2.5 + storybook: ^10.2.9 - '@storybook/react-vite@10.2.5': - resolution: {integrity: sha512-C5xRmQChry+DGnT1achrWyWsZIDJN3alSpDQej3rJpuBomB4rxQe4aKma1fmcvuifmcb3BVCPXZHKlUXPf7Ynw==} + '@storybook/react-vite@10.2.9': + resolution: {integrity: sha512-uDuo8TeBc3E519xQQGGGaH43TaCEbEgNjDV3vX/G6ikWgJoYzFFILO4EKhKKsf7t3dJl+FIXJEcvPw7Azd0VPw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.2.5 + storybook: ^10.2.9 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 - '@storybook/react@10.2.5': - resolution: {integrity: sha512-aTlEcT0hhBR7zjEJB8NYa5fX4XGvCK3N3w/deVl8GNmIxvo0cRh9FbF8Wb06zE8d7gGUFvHVylwXeVy60sfwag==} + '@storybook/react@10.2.9': + resolution: {integrity: sha512-cYJroaHWHmauPO8EcfpDTU3Odc7z5/DbuLO+jQ4SAaoupwnE35HNe8WAdpD3jpmI20cqKauqOENIT/+HjxhlYA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.2.5 + storybook: ^10.2.9 typescript: '>= 4.9.x' peerDependenciesMeta: typescript: optional: true - '@stylistic/eslint-plugin@5.7.1': - resolution: {integrity: sha512-zjTUwIsEfT+k9BmXwq1QEFYsb4afBlsI1AXFyWQBgggMzwBFOuu92pGrE5OFx90IOjNl+lUbQoTG7f8S0PkOdg==} + '@stylistic/eslint-plugin@5.8.0': + resolution: {integrity: sha512-WNPVF/FfBAjyi3OA7gok8swRiImNLKI4dmV3iK/GC/0xSJR7eCzBFsw9hLZVgb1+MYNLy7aDsjohxN1hA/FIfQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=9.0.0' @@ -4139,8 +4276,8 @@ packages: '@types/node@18.19.130': resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} - '@types/node@22.19.8': - resolution: {integrity: sha512-ebO/Yl+EAvVe8DnMfi+iaAyIqYdK0q/q0y0rw82INWEKJOBe6b/P3YWE8NW7oOlF/nXFNrHwhARrN/hdgDkraA==} + '@types/node@22.19.11': + resolution: {integrity: sha512-BH7YwL6rA93ReqeQS1c4bsPpcfOmJasG+Fkr6Y59q83f9M1WcBRHR2vM+P9eOisYRcN3ujQoiZY8uk5W+1WL8w==} '@types/node@24.10.13': resolution: {integrity: sha512-oH72nZRfDv9lADUBSo104Aq7gPHpQZc4BTx38r9xf9pg5LfP6EzSyH2n7qFmmxRQXh7YlUXODcYsg6PuTDSxGg==} @@ -4266,63 +4403,100 @@ packages: '@types/yargs@17.0.35': resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} - '@typescript-eslint/eslint-plugin@8.54.0': - resolution: {integrity: sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==} + '@typescript-eslint/eslint-plugin@8.55.0': + resolution: {integrity: sha512-1y/MVSz0NglV1ijHC8OT49mPJ4qhPYjiK08YUQVbIOyu+5k862LKUHFkpKHWu//zmr7hDR2rhwUm6gnCGNmGBQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.54.0 + '@typescript-eslint/parser': ^8.55.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.54.0': - resolution: {integrity: sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==} + '@typescript-eslint/parser@8.55.0': + resolution: {integrity: sha512-4z2nCSBfVIMnbuu8uinj+f0o4qOeggYJLbjpPHka3KH1om7e+H9yLKTYgksTaHcGco+NClhhY2vyO3HsMH1RGw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.54.0': - resolution: {integrity: sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==} + '@typescript-eslint/project-service@8.55.0': + resolution: {integrity: sha512-zRcVVPFUYWa3kNnjaZGXSu3xkKV1zXy8M4nO/pElzQhFweb7PPtluDLQtKArEOGmjXoRjnUZ29NjOiF0eCDkcQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.54.0': - resolution: {integrity: sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/tsconfig-utils@8.54.0': - resolution: {integrity: sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==} + '@typescript-eslint/project-service@8.56.0': + resolution: {integrity: sha512-M3rnyL1vIQOMeWxTWIW096/TtVP+8W3p/XnaFflhmcFp+U4zlxUxWj4XwNs6HbDeTtN4yun0GNTTDBw/SvufKg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.54.0': - resolution: {integrity: sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==} + '@typescript-eslint/scope-manager@8.55.0': + resolution: {integrity: sha512-fVu5Omrd3jeqeQLiB9f1YsuK/iHFOwb04bCtY4BSCLgjNbOD33ZdV6KyEqplHr+IlpgT0QTZ/iJ+wT7hvTx49Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/scope-manager@8.56.0': + resolution: {integrity: sha512-7UiO/XwMHquH+ZzfVCfUNkIXlp/yQjjnlYUyYz7pfvlK3/EyyN6BK+emDmGNyQLBtLGaYrTAI6KOw8tFucWL2w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.55.0': + resolution: {integrity: sha512-1R9cXqY7RQd7WuqSN47PK9EDpgFUK3VqdmbYrvWJZYDd0cavROGn+74ktWBlmJ13NXUQKlZ/iAEQHI/V0kKe0Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/tsconfig-utils@8.56.0': + resolution: {integrity: sha512-bSJoIIt4o3lKXD3xmDh9chZcjCz5Lk8xS7Rxn+6l5/pKrDpkCwtQNQQwZ2qRPk7TkUYhrq3WPIHXOXlbXP0itg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@8.55.0': + resolution: {integrity: sha512-x1iH2unH4qAt6I37I2CGlsNs+B9WGxurP2uyZLRz6UJoZWDBx9cJL1xVN/FiOmHEONEg6RIufdvyT0TEYIgC5g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.54.0': - resolution: {integrity: sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==} + '@typescript-eslint/types@8.55.0': + resolution: {integrity: sha512-ujT0Je8GI5BJWi+/mMoR0wxwVEQaxM+pi30xuMiJETlX80OPovb2p9E8ss87gnSVtYXtJoU9U1Cowcr6w2FE0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.54.0': - resolution: {integrity: sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==} + '@typescript-eslint/types@8.56.0': + resolution: {integrity: sha512-DBsLPs3GsWhX5HylbP9HNG15U0bnwut55Lx12bHB9MpXxQ+R5GC8MwQe+N1UFXxAeQDvEsEDY6ZYwX03K7Z6HQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.55.0': + resolution: {integrity: sha512-EwrH67bSWdx/3aRQhCoxDaHM+CrZjotc2UCCpEDVqfCE+7OjKAGWNY2HsCSTEVvWH2clYQK8pdeLp42EVs+xQw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.54.0': - resolution: {integrity: sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==} + '@typescript-eslint/typescript-estree@8.56.0': + resolution: {integrity: sha512-ex1nTUMWrseMltXUHmR2GAQ4d+WjkZCT4f+4bVsps8QEdh0vlBsaCokKTPlnqBFqqGaxilDNJG7b8dolW2m43Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/utils@8.55.0': + resolution: {integrity: sha512-BqZEsnPGdYpgyEIkDC1BadNY8oMwckftxBT+C8W0g1iKPdeqKZBtTfnvcq0nf60u7MkjFO8RBvpRGZBPw4L2ow==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.54.0': - resolution: {integrity: sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==} + '@typescript-eslint/utils@8.56.0': + resolution: {integrity: sha512-RZ3Qsmi2nFGsS+n+kjLAYDPVlrzf7UhTffrDIKr+h2yzAlYP/y5ZulU0yeDEPItos2Ph46JAL5P/On3pe7kDIQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/visitor-keys@8.55.0': + resolution: {integrity: sha512-AxNRwEie8Nn4eFS1FzDMJWIISMGoXMb037sgCBJ3UR6o0fQTzr2tqN9WT+DkWJPhIdQCfV7T6D387566VtnCJA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/visitor-keys@8.56.0': + resolution: {integrity: sha512-q+SL+b+05Ud6LbEE35qe4A99P+htKTKVbyiNEe45eCbJFyh/HVK9QXwlrbz+Q4L8SOW4roxSVwXYj4DMBT7Ieg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.3.0': @@ -4431,8 +4605,8 @@ packages: cpu: [x64] os: [win32] - '@vector-im/compound-design-tokens@6.9.0': - resolution: {integrity: sha512-LFmJW77wdV/b8ii/R2nrpge4ewtM/tSC3krDGFhENVNgYqbKUz00adZhKXAufJANxzGdAd4PsiFGa16YRlVLrQ==} + '@vector-im/compound-design-tokens@6.10.0': + resolution: {integrity: sha512-2dg0Rv1J5xlPNfUW5EX6wIMUmTlkqScmXKxytKwfIPrVZzMTgpbktblU1dU8KcNJ6ga+a6SzpR7bPNu8tOOTbQ==} peerDependencies: '@types/react': ^19.2.10 react: ^17 || ^18 || ^19.0.0 @@ -4461,8 +4635,8 @@ packages: bundledDependencies: - '@vector-im/matrix-wysiwyg-wasm' - '@vitejs/plugin-react@5.1.3': - resolution: {integrity: sha512-NVUnA6gQCl8jfoYqKqQU5Clv0aPw14KkZYCsX6T9Lfu9slI0LOU10OTwFHS/WmptsMMpshNd/1tuWsHQ2Uk+cg==} + '@vitejs/plugin-react@5.1.4': + resolution: {integrity: sha512-VIcFLdRi/VYRU8OL/puL7QXMYafHmqOnwTZY50U1JPlCNj30PxCMx65c494b1K9be9hX83KVt0+gTEwTWLqToA==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -4685,8 +4859,8 @@ packages: resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} engines: {node: '>=0.4.0'} hasBin: true @@ -4745,8 +4919,8 @@ packages: ajv@8.13.0: resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} - ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + ajv@8.18.0: + resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} alien-signals@0.4.14: resolution: {integrity: sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==} @@ -4917,9 +5091,6 @@ packages: resolution: {integrity: sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==} engines: {node: '>=4'} - axios@1.13.4: - resolution: {integrity: sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg==} - axios@1.13.5: resolution: {integrity: sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==} @@ -5017,6 +5188,10 @@ packages: resolution: {integrity: sha512-vjtV3hiLqYDNRoiAv0zC4QaGAMPomEoq83PRmYIofPswwZurCeWR5LByXm7SyoL0Zh5+2z0+HC7jG8gSZJUh0w==} engines: {node: '>= 16'} + balanced-match@4.0.2: + resolution: {integrity: sha512-x0K50QvKQ97fdEz2kPehIerj+YTeptKF9hyYkKf6egnwmMWAkADiO0QCzSp0R5xN8FTZgYaBfSaue46Ej62nMg==} + engines: {node: 20 || >=22} + bare-events@2.8.2: resolution: {integrity: sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==} peerDependencies: @@ -5075,6 +5250,9 @@ packages: bcrypt-pbkdf@1.0.2: resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + before-after-hook@2.2.3: + resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} + big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} @@ -5121,6 +5299,10 @@ packages: brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@5.0.2: + resolution: {integrity: sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==} + engines: {node: 20 || >=22} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -5529,8 +5711,8 @@ packages: create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - cronstrue@3.11.0: - resolution: {integrity: sha512-nXST7NEkjPF6loOTJtCwbLHB6cOVR5Ofuq/VZ4UGsZw/0HTvxy6mRCrDHOJ4xoLPcuS3ooruBLyUk3INaidKwg==} + cronstrue@3.12.0: + resolution: {integrity: sha512-k9oiM4G7U1GEEktOGfZabldP0gtFWTsaRVqq9X06ifytr73mpSYYdt+zGZBeS5lRCsqMfq0y7oSHycWGIJSo6g==} hasBin: true cross-spawn@7.0.6: @@ -5556,9 +5738,9 @@ packages: peerDependencies: postcss: ^8.0.9 - css-functions-list@3.2.3: - resolution: {integrity: sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==} - engines: {node: '>=12 || >=16'} + css-functions-list@3.3.3: + resolution: {integrity: sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg==} + engines: {node: '>=12'} css-has-pseudo@8.0.0: resolution: {integrity: sha512-Uz/bsHRbOeir/5Oeuz85tq/yLJLxX+3dpoRdjNTshs6jjqwUg8XaEZGDd0ci3fw7l53Srw0EkJ8mYan0eW5uGQ==} @@ -5674,6 +5856,9 @@ packages: csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + csv-parse@5.6.0: + resolution: {integrity: sha512-l3nz3euub2QMg5ouu5U09Ew9Wf6/wQ8I++ch1loQ0ljmzhmfZYrH9fflS22i/PQEvsPvxCwxgz5q7UB8K1JO4Q==} + cuint@0.2.2: resolution: {integrity: sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==} @@ -5795,6 +5980,9 @@ packages: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} + deprecation@2.3.1: + resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} + dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -5918,8 +6106,8 @@ packages: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} - dotenv@17.2.3: - resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} + dotenv@17.3.1: + resolution: {integrity: sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==} engines: {node: '>=12'} dunder-proto@1.0.1: @@ -6067,8 +6255,8 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - esbuild@0.27.2: - resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} + esbuild@0.27.3: + resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} engines: {node: '>=18'} hasBin: true @@ -6142,12 +6330,12 @@ packages: '@typescript-eslint/parser': optional: true - eslint-plugin-jest@29.12.2: - resolution: {integrity: sha512-IIRg0IZ5yuERfzOZrKuNScxk9yeuKo0M4Urx7RZcthK5HE/8gJUY518bdi7picLRBJVctjOW3yVx0zyBp4Cq+g==} + eslint-plugin-jest@29.15.0: + resolution: {integrity: sha512-ZCGr7vTH2WSo2hrK5oM2RULFmMruQ7W3cX7YfwoTiPfzTGTFBMmrVIz45jZHd++cGKj/kWf02li/RhTGcANJSA==} engines: {node: ^20.12.0 || ^22.0.0 || >=24.0.0} peerDependencies: '@typescript-eslint/eslint-plugin': ^8.0.0 - eslint: ^8.57.0 || ^9.0.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 jest: '*' typescript: '>=4.8.4 <6.0.0' peerDependenciesMeta: @@ -6210,11 +6398,11 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-storybook@10.2.5: - resolution: {integrity: sha512-osUY7B0dNDWrdV5pCp1m7yqG6jYmkLcmuKHcE6NyhvTtgoFxW2h2fFDtNQDEEDc1EOkMAbp/K3UotslevAoNjg==} + eslint-plugin-storybook@10.2.10: + resolution: {integrity: sha512-aWkoh2rhTaEsMA4yB1iVIcISM5wb0uffp09ZqhwpoD4GAngCs131uq6un+QdnOMc7vXyAnBBfsuhtOj8WwCUgw==} peerDependencies: eslint: '>=8' - storybook: ^10.2.5 + storybook: ^10.2.10 eslint-plugin-unicorn@56.0.1: resolution: {integrity: sha512-FwVV0Uwf8XPfVnKSGpMg7NtlZh0G0gBarCaFcMUOoqPxXryxdYxTRRv4kH6B9TFCVIrjRXG+emcxIk2ayZilog==} @@ -6246,6 +6434,10 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + eslint@8.57.1: resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -6638,15 +6830,9 @@ packages: deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true - glob@11.1.0: - resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} - engines: {node: 20 || >=22} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - hasBin: true - - glob@13.0.1: - resolution: {integrity: sha512-B7U/vJpE3DkJ5WXTgTpTRN63uV42DseiXXKMwG14LQBXmsdeIoHAPbU/MEo6II0k5ED74uc2ZGTC6MwHFQhF6w==} - engines: {node: 20 || >=22} + glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} @@ -6692,6 +6878,11 @@ packages: handle-thing@2.0.1: resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + harmony-reflect@1.6.2: resolution: {integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==} @@ -6770,8 +6961,8 @@ packages: hpack.js@2.1.6: resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} - html-dom-parser@5.1.7: - resolution: {integrity: sha512-Sn+6S3Z8P3P12qqUm4+9wnchC3Bjc4DHp60fgnUdgeiy6e3EbECFWdrmyTBuphxJA5Is7V400+v7ct/Ix2pJFw==} + html-dom-parser@5.1.8: + resolution: {integrity: sha512-MCIUng//mF2qTtGHXJWr6OLfHWmg3Pm8ezpfiltF83tizPWY17JxT4dRLE8lykJ5bChJELoY3onQKPbufJHxYA==} html-encoding-sniffer@4.0.0: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} @@ -6788,8 +6979,8 @@ packages: engines: {node: '>=12'} hasBin: true - html-react-parser@5.2.16: - resolution: {integrity: sha512-1S6KLse1hKWOXYL/PSnZhsARJBE6eIO93CjPlDKMneO0wz8YTnzTfc9Yw4mWsCk2kcB9IrU+R0W6Rdi4N7YfJw==} + html-react-parser@5.2.17: + resolution: {integrity: sha512-m+K/7Moq1jodAB4VL0RXSOmtwLUYoAsikZhwd+hGQe5Vtw2dbWfpFd60poxojMU0Tsh9w59mN1QLEcoHz0Dx9w==} peerDependencies: '@types/react': ^19.2.10 react: 0.14 || 15 || 16 || 17 || 18 || 19 @@ -7181,8 +7372,8 @@ packages: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} - is-wsl@3.1.0: - resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + is-wsl@3.1.1: + resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} engines: {node: '>=16'} isarray@1.0.0: @@ -7229,8 +7420,8 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jackspeak@4.1.1: - resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} + jackspeak@4.2.3: + resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} engines: {node: 20 || >=22} jake@10.9.4: @@ -7505,8 +7696,8 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - knip@5.83.0: - resolution: {integrity: sha512-FfmaHMntpZB13B1oJQMSs1hTOZxd0TOn+FYB3oWEI02XlxTW3RH4H7d8z5Us3g0ziHCYyl7z0B1xi8ENP3QEKA==} + knip@5.83.1: + resolution: {integrity: sha512-av3ZG/Nui6S/BNL8Tmj12yGxYfTnwWnslouW97m40him7o8MwiMjZBY9TPvlEWUci45aVId0/HbgTwSKIDGpMw==} engines: {node: '>=18.18.0'} hasBin: true peerDependencies: @@ -7560,9 +7751,6 @@ packages: peerDependencies: linkifyjs: ^4.0.0 - linkify-it@4.0.1: - resolution: {integrity: sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==} - linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} @@ -7661,8 +7849,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.2.5: - resolution: {integrity: sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==} + lru-cache@11.2.6: + resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==} engines: {node: 20 || >=22} lru-cache@5.1.1: @@ -7700,16 +7888,12 @@ packages: makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - maplibre-gl@5.17.0: - resolution: {integrity: sha512-gwS6NpXBfWD406dtT5YfEpl2hmpMm+wcPqf04UAez/TxY1OBjiMdK2ZoMGcNIlGHelKc4+Uet6zhDdDEnlJVHA==} + maplibre-gl@5.18.0: + resolution: {integrity: sha512-UtWxPBpHuFvEkM+5FVfcFG9ZKEWZQI6+PZkvLErr8Zs5ux+O7/KQ3JjSUvAfOlMeMgd/77qlHpOw0yHL7JU5cw==} engines: {node: '>=16.14.0', npm: '>=8.1.0'} - markdown-it@13.0.2: - resolution: {integrity: sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==} - hasBin: true - - markdown-it@14.1.0: - resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + markdown-it@14.1.1: + resolution: {integrity: sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==} hasBin: true math-intrinsics@1.1.0: @@ -7726,9 +7910,9 @@ packages: matrix-events-sdk@0.0.1: resolution: {integrity: sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA==} - matrix-js-sdk@https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/e74eb4928e748194165b7200afe48e582bdc1fd7: - resolution: {tarball: https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/e74eb4928e748194165b7200afe48e582bdc1fd7} - version: 40.2.0 + matrix-js-sdk@https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/5739b59faaf33fa55457dcaa76ffebe0506d1466: + resolution: {tarball: https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/5739b59faaf33fa55457dcaa76ffebe0506d1466} + version: 41.0.0 engines: {node: '>=22.0.0'} matrix-web-i18n@3.6.0: @@ -7870,9 +8054,9 @@ packages: resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} engines: {node: 20 || >=22} - minimatch@10.1.2: - resolution: {integrity: sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==} - engines: {node: 20 || >=22} + minimatch@10.2.2: + resolution: {integrity: sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==} + engines: {node: 18 || 20 || >=22} minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -7888,8 +8072,8 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} mkdirp-classic@0.5.3: @@ -7917,6 +8101,12 @@ packages: engines: {node: '>=8'} hasBin: true + moment-timezone@0.5.48: + resolution: {integrity: sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw==} + + moment@2.30.1: + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} + moo-color@1.0.3: resolution: {integrity: sha512-i/+ZKXMDf6aqYtBhuOcej71YSlbjT3wCO/4H1j8rPvxDJEifdwgg5MaFyu6iYAT8GBZJg2z0dkgK4YMzvURALQ==} @@ -8017,8 +8207,8 @@ packages: nwsapi@2.2.23: resolution: {integrity: sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==} - nx@22.5.0: - resolution: {integrity: sha512-GOHhDHXvuscD28Hpj1bP38oVrCgZ/+5UWjA8R/VkpbtkfMHgRZ0uHlfKLYXQAZIsjmTq7Tr+e4QchJt0e76n0w==} + nx@22.5.1: + resolution: {integrity: sha512-KIQqOSdoshkav9JuoH/+Vp42niA5MTRtACupe+q8CaB7bHiLsWr5nctQVC7ul3NauAmsoqNWH7t5CIi8KgrPIQ==} hasBin: true peerDependencies: '@swc-node/register': 1.11.1 @@ -8124,8 +8314,8 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} - oxc-resolver@11.17.0: - resolution: {integrity: sha512-R5P2Tw6th+nQJdNcZGfuppBS/sM0x1EukqYffmlfX2xXLgLGCCPwu4ruEr9Sx29mrpkHgITc130Qps2JR90NdQ==} + oxc-resolver@11.17.1: + resolution: {integrity: sha512-pyRXK9kH81zKlirHufkFhOFBZRks8iAMLwPH8gU7lvKFiuzUH9L8MxDEllazwOb8fjXMcWjY1PMDfMJ2/yh5cw==} p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} @@ -8217,9 +8407,9 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} - path-scurry@2.0.1: - resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} - engines: {node: 20 || >=22} + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} path-to-regexp@0.1.12: resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} @@ -8296,13 +8486,13 @@ packages: resolution: {integrity: sha512-+KD8hJtqQMYoTuL1bbGOqxb4z+nZkTAwVdNtWwe8Tc2xNbEmdJYIYoc6Qt0uF55e6YW6KuTHw1DjQ18gMhzepw==} engines: {node: '>=16.0.0'} - playwright-core@1.58.1: - resolution: {integrity: sha512-bcWzOaTxcW+VOOGBCQgnaKToLJ65d6AqfLVKEWvexyS3AS6rbXl+xdpYRMGSRBClPvyj44njOWoxjNdL/H9UNg==} + playwright-core@1.58.2: + resolution: {integrity: sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==} engines: {node: '>=18'} hasBin: true - playwright@1.58.1: - resolution: {integrity: sha512-+2uTZHxSCcxjvGc5C891LrS1/NlxglGxzrC4seZiVjcYVQfUa87wBL6rTDqzGjuoWNjnBzRqKmF6zRYGMvQUaQ==} + playwright@1.58.2: + resolution: {integrity: sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==} engines: {node: '>=18'} hasBin: true @@ -8750,8 +8940,8 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - posthog-js@1.336.4: - resolution: {integrity: sha512-NX81XaqOjS/gue3UsbAAuJxi6vD0AGy1HUvywBIhAArCwbTXKS04NhEFwUcYJdrmwXUf94MntEIWGoc1pTFDtg==} + posthog-js@1.347.2: + resolution: {integrity: sha512-hDbsSU30gfNhC11cBYSPpwUYB4DglbCN2G8W8NPIR/KXhT03shmuxabra/uaoI4blkr8SSSpxwvYV4gGa3hXrA==} potpack@2.1.0: resolution: {integrity: sha512-pcaShQc1Shq0y+E7GqJqvZj8DTthWV1KeHGdi0Z6IAin2Oi3JnLCOfwnCo84qc+HAp52wT9nK9H7FAJp5a44GQ==} @@ -8801,6 +8991,9 @@ packages: proper-lockfile@4.1.2: resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + properties-file@3.6.4: + resolution: {integrity: sha512-oRVnENV7YP9aYRrjSmYptqFiDpbPy4SuTvW1mKvs4ZCi4QWhJSvOOHIWsyScFsfOwTQ2fynFZ3uG8un2Hm1XjA==} + properties-reader@2.3.0: resolution: {integrity: sha512-z597WicA7nDZxK12kZqHr2TcvwNU1GCfA5UwfDY/HDp3hXPoPlb5rlEx9bwGTiJnc0OqbBTkU975jDToth8Gxw==} engines: {node: '>=14'} @@ -8855,8 +9048,8 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - qs@6.14.1: - resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==} + qs@6.14.2: + resolution: {integrity: sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==} engines: {node: '>=0.6'} quansync@0.2.11: @@ -9321,8 +9514,8 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.7.3: - resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} engines: {node: '>=10'} hasBin: true @@ -9535,8 +9728,8 @@ packages: storybook: ^10.1.10 vitest: ^4 - storybook@10.2.5: - resolution: {integrity: sha512-H0vjXGjdFtWmb0et5QleeelwUc/rzcXmtTyB+sV7/QUvNhtCFCu46sj2FMBgdSncyNrlJFDFdRxXHFdAv9ToIA==} + storybook@10.2.10: + resolution: {integrity: sha512-N4U42qKgzMHS7DjqLz5bY4P7rnvJtYkWFCyKspZr3FhPUuy6CWOae3aYC2BjXkHrdug0Jyta6VxFTuB1tYUKhg==} hasBin: true peerDependencies: prettier: ^2 || ^3 @@ -9606,8 +9799,8 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.2: - resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} engines: {node: '>=12'} strip-bom@3.0.0: @@ -9674,8 +9867,8 @@ packages: peerDependencies: stylelint: '>=16' - stylelint@17.1.1: - resolution: {integrity: sha512-SBHVcLEcRF1M9OkD3oT0hT2PayDNLw2hd+aovmzfNQ2ys4Xd3oS9ZNizILWqhQvW802AqKN/vUTMwJqQYMBlWw==} + stylelint@17.3.0: + resolution: {integrity: sha512-1POV91lcEMhj6SLVaOeA0KlS9yattS+qq+cyWqP/nYzWco7K5jznpGH1ExngvPlTM9QF1Kjd2bmuzJu9TH2OcA==} engines: {node: '>=20.19.0'} hasBin: true @@ -9940,6 +10133,10 @@ packages: tty-browserify@0.0.1: resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} + tunnel@0.0.6: + resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} + engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} + tweetnacl@0.14.5: resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} @@ -10026,15 +10223,17 @@ packages: resolution: {integrity: sha512-z6PJ8Lml+v3ichVojCiB8toQJBuwR42ySM4ezjXIqXK3M0HczmKQ3LF4rhU55PfD99KEEXQG6yb7iOMyvYuHew==} hasBin: true - uc.micro@1.0.6: - resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} - uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} ufo@1.6.3: resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} @@ -10051,6 +10250,10 @@ packages: undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + undici@5.29.0: + resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} + engines: {node: '>=14.0'} + undici@7.20.0: resolution: {integrity: sha512-MJZrkjyd7DeC+uPZh+5/YaMDxFiiEEaDgbUSVMXayofAkDWF1088CDo+2RPg7B1BuS1qf1vgNE7xqwPxE0DuSQ==} engines: {node: '>=20.18.1'} @@ -10078,6 +10281,9 @@ packages: resolution: {integrity: sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==} engines: {node: '>=20'} + universal-user-agent@6.0.1: + resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} + universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -10415,8 +10621,8 @@ packages: peerDependencies: webpack: '>=5.0.0' - webpack-sources@3.3.3: - resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} + webpack-sources@3.3.4: + resolution: {integrity: sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==} engines: {node: '>=10.13.0'} webpack-version-file-plugin@0.5.0: @@ -10430,8 +10636,8 @@ packages: webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - webpack@5.105.0: - resolution: {integrity: sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==} + webpack@5.105.2: + resolution: {integrity: sha512-dRXm0a2qcHPUBEzVk8uph0xWSjV/xZxenQQbLwnwP7caQCYpqG1qddwlyEkIDkYn0K8tvmcrZ+bOrzoQ3HxCDw==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -10507,6 +10713,9 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -10628,6 +10837,23 @@ snapshots: '@action-validator/core@0.6.0': {} + '@actions/github@6.0.1': + dependencies: + '@actions/http-client': 2.2.3 + '@octokit/core': 5.2.2 + '@octokit/plugin-paginate-rest': 9.2.2(@octokit/core@5.2.2) + '@octokit/plugin-rest-endpoint-methods': 10.4.1(@octokit/core@5.2.2) + '@octokit/request': 8.4.1 + '@octokit/request-error': 5.1.1 + undici: 5.29.0 + + '@actions/http-client@2.2.3': + dependencies: + tunnel: 0.0.6 + undici: 5.29.0 + + '@actions/io@1.1.3': {} + '@adobe/css-tools@4.4.4': {} '@asamuzakjp/css-color@3.2.0': @@ -10638,10 +10864,10 @@ snapshots: '@csstools/css-tokenizer': 3.0.4 lru-cache: 10.4.3 - '@axe-core/playwright@4.11.1(playwright-core@1.58.1)': + '@axe-core/playwright@4.11.1(playwright-core@1.58.2)': dependencies: axe-core: 4.11.1 - playwright-core: 1.58.1 + playwright-core: 1.58.2 '@babel/code-frame@7.29.0': dependencies: @@ -11521,12 +11747,12 @@ snapshots: '@cacheable/memory@2.0.7': dependencies: - '@cacheable/utils': 2.3.3 + '@cacheable/utils': 2.3.4 '@keyv/bigmap': 1.3.1(keyv@5.6.0) hookified: 1.15.1 keyv: 5.6.0 - '@cacheable/utils@2.3.3': + '@cacheable/utils@2.3.4': dependencies: hashery: 1.4.0 keyv: 5.6.0 @@ -11551,7 +11777,7 @@ snapshots: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/css-calc@3.0.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + '@csstools/css-calc@3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 @@ -11566,7 +11792,7 @@ snapshots: '@csstools/css-color-parser@4.0.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: '@csstools/color-helpers': 6.0.1 - '@csstools/css-calc': 3.0.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-calc': 3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 @@ -11578,7 +11804,7 @@ snapshots: dependencies: '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.0.26': {} + '@csstools/css-syntax-patches-for-csstree@1.0.27': {} '@csstools/css-tokenizer@3.0.4': {} @@ -11659,7 +11885,7 @@ snapshots: '@csstools/postcss-exponential-functions@3.0.0(postcss@8.5.6)': dependencies: - '@csstools/css-calc': 3.0.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-calc': 3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 postcss: 8.5.6 @@ -11745,7 +11971,7 @@ snapshots: '@csstools/postcss-media-minmax@3.0.0(postcss@8.5.6)': dependencies: - '@csstools/css-calc': 3.0.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-calc': 3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 '@csstools/media-query-list-parser': 5.0.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) @@ -11801,7 +12027,7 @@ snapshots: '@csstools/postcss-random-function@3.0.0(postcss@8.5.6)': dependencies: - '@csstools/css-calc': 3.0.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-calc': 3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 postcss: 8.5.6 @@ -11822,14 +12048,14 @@ snapshots: '@csstools/postcss-sign-functions@2.0.0(postcss@8.5.6)': dependencies: - '@csstools/css-calc': 3.0.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-calc': 3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 postcss: 8.5.6 '@csstools/postcss-stepped-value-functions@5.0.0(postcss@8.5.6)': dependencies: - '@csstools/css-calc': 3.0.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-calc': 3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 postcss: 8.5.6 @@ -11853,7 +12079,7 @@ snapshots: '@csstools/postcss-trigonometric-functions@5.0.0(postcss@8.5.6)': dependencies: - '@csstools/css-calc': 3.0.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-calc': 3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 postcss: 8.5.6 @@ -11880,7 +12106,7 @@ snapshots: '@element-hq/element-call-embedded@0.16.3': {} - '@element-hq/element-web-module-api@1.9.0(@matrix-org/react-sdk-module-api@2.5.0(patch_hash=016146c9cc96e6363609d2b2ac0896ccef567882eb1d73b75a77b8a30929de96)(react@19.2.4))(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(matrix-web-i18n@3.6.0)(react@19.2.4)': + '@element-hq/element-web-module-api@1.9.1(@matrix-org/react-sdk-module-api@2.5.0(patch_hash=016146c9cc96e6363609d2b2ac0896ccef567882eb1d73b75a77b8a30929de96)(react@19.2.4))(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(matrix-web-i18n@3.6.0)(react@19.2.4)': dependencies: '@types/react': 19.2.10 '@types/react-dom': 19.2.3(@types/react@19.2.10) @@ -11889,17 +12115,17 @@ snapshots: '@matrix-org/react-sdk-module-api': 2.5.0(patch_hash=016146c9cc96e6363609d2b2ac0896ccef567882eb1d73b75a77b8a30929de96)(react@19.2.4) matrix-web-i18n: 3.6.0 - '@element-hq/element-web-playwright-common@2.2.7(@element-hq/element-web-module-api@1.9.0(@matrix-org/react-sdk-module-api@2.5.0(patch_hash=016146c9cc96e6363609d2b2ac0896ccef567882eb1d73b75a77b8a30929de96)(react@19.2.4))(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(matrix-web-i18n@3.6.0)(react@19.2.4))(@playwright/test@1.58.1)(playwright-core@1.58.1)': + '@element-hq/element-web-playwright-common@2.2.7(@element-hq/element-web-module-api@1.9.1(@matrix-org/react-sdk-module-api@2.5.0(patch_hash=016146c9cc96e6363609d2b2ac0896ccef567882eb1d73b75a77b8a30929de96)(react@19.2.4))(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(matrix-web-i18n@3.6.0)(react@19.2.4))(@playwright/test@1.58.2)(playwright-core@1.58.2)': dependencies: - '@axe-core/playwright': 4.11.1(playwright-core@1.58.1) - '@element-hq/element-web-module-api': 1.9.0(@matrix-org/react-sdk-module-api@2.5.0(patch_hash=016146c9cc96e6363609d2b2ac0896ccef567882eb1d73b75a77b8a30929de96)(react@19.2.4))(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(matrix-web-i18n@3.6.0)(react@19.2.4) - '@playwright/test': 1.58.1 + '@axe-core/playwright': 4.11.1(playwright-core@1.58.2) + '@element-hq/element-web-module-api': 1.9.1(@matrix-org/react-sdk-module-api@2.5.0(patch_hash=016146c9cc96e6363609d2b2ac0896ccef567882eb1d73b75a77b8a30929de96)(react@19.2.4))(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(matrix-web-i18n@3.6.0)(react@19.2.4) + '@playwright/test': 1.58.2 '@testcontainers/postgresql': 11.11.0 - glob: 13.0.1 + glob: 13.0.6 lodash-es: 4.17.23 mailpit-api: 1.7.0 - playwright-core: 1.58.1 - strip-ansi: 7.1.2 + playwright-core: 1.58.2 + strip-ansi: 7.2.0 testcontainers: 11.11.0 yaml: 2.8.2 transitivePeerDependencies: @@ -11924,82 +12150,82 @@ snapshots: dependencies: tslib: 2.8.1 - '@esbuild/aix-ppc64@0.27.2': + '@esbuild/aix-ppc64@0.27.3': optional: true - '@esbuild/android-arm64@0.27.2': + '@esbuild/android-arm64@0.27.3': optional: true - '@esbuild/android-arm@0.27.2': + '@esbuild/android-arm@0.27.3': optional: true - '@esbuild/android-x64@0.27.2': + '@esbuild/android-x64@0.27.3': optional: true - '@esbuild/darwin-arm64@0.27.2': + '@esbuild/darwin-arm64@0.27.3': optional: true - '@esbuild/darwin-x64@0.27.2': + '@esbuild/darwin-x64@0.27.3': optional: true - '@esbuild/freebsd-arm64@0.27.2': + '@esbuild/freebsd-arm64@0.27.3': optional: true - '@esbuild/freebsd-x64@0.27.2': + '@esbuild/freebsd-x64@0.27.3': optional: true - '@esbuild/linux-arm64@0.27.2': + '@esbuild/linux-arm64@0.27.3': optional: true - '@esbuild/linux-arm@0.27.2': + '@esbuild/linux-arm@0.27.3': optional: true - '@esbuild/linux-ia32@0.27.2': + '@esbuild/linux-ia32@0.27.3': optional: true - '@esbuild/linux-loong64@0.27.2': + '@esbuild/linux-loong64@0.27.3': optional: true - '@esbuild/linux-mips64el@0.27.2': + '@esbuild/linux-mips64el@0.27.3': optional: true - '@esbuild/linux-ppc64@0.27.2': + '@esbuild/linux-ppc64@0.27.3': optional: true - '@esbuild/linux-riscv64@0.27.2': + '@esbuild/linux-riscv64@0.27.3': optional: true - '@esbuild/linux-s390x@0.27.2': + '@esbuild/linux-s390x@0.27.3': optional: true - '@esbuild/linux-x64@0.27.2': + '@esbuild/linux-x64@0.27.3': optional: true - '@esbuild/netbsd-arm64@0.27.2': + '@esbuild/netbsd-arm64@0.27.3': optional: true - '@esbuild/netbsd-x64@0.27.2': + '@esbuild/netbsd-x64@0.27.3': optional: true - '@esbuild/openbsd-arm64@0.27.2': + '@esbuild/openbsd-arm64@0.27.3': optional: true - '@esbuild/openbsd-x64@0.27.2': + '@esbuild/openbsd-x64@0.27.3': optional: true - '@esbuild/openharmony-arm64@0.27.2': + '@esbuild/openharmony-arm64@0.27.3': optional: true - '@esbuild/sunos-x64@0.27.2': + '@esbuild/sunos-x64@0.27.3': optional: true - '@esbuild/win32-arm64@0.27.2': + '@esbuild/win32-arm64@0.27.3': optional: true - '@esbuild/win32-ia32@0.27.2': + '@esbuild/win32-ia32@0.27.3': optional: true - '@esbuild/win32-x64@0.27.2': + '@esbuild/win32-x64@0.27.3': optional: true '@eslint-community/eslint-utils@4.9.1(eslint@8.57.1)': @@ -12025,11 +12251,13 @@ snapshots: '@eslint/js@8.57.1': {} - '@fetch-mock/jest@0.2.20(@jest/globals@30.2.0)(jest@30.2.0(@types/node@22.19.8)(babel-plugin-macros@3.1.0))': + '@fastify/busboy@2.1.1': {} + + '@fetch-mock/jest@0.2.20(@jest/globals@30.2.0)(jest@30.2.0(@types/node@22.19.11)(babel-plugin-macros@3.1.0))': dependencies: '@jest/globals': 30.2.0 fetch-mock: 12.6.0 - jest: 30.2.0(@types/node@22.19.8)(babel-plugin-macros@3.1.0) + jest: 30.2.0(@types/node@22.19.11)(babel-plugin-macros@3.1.0) '@fetch-mock/vitest@0.2.18(vitest@4.0.18)': dependencies: @@ -12164,11 +12392,13 @@ snapshots: dependencies: string-width: 5.1.2 string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.2 + strip-ansi: 7.2.0 strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 7.0.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@isaacs/cliui@9.0.0': {} + '@istanbuljs/load-nyc-config@1.1.0': dependencies: camelcase: 5.3.1 @@ -12182,7 +12412,7 @@ snapshots: '@jest/console@30.2.0': dependencies: '@jest/types': 30.2.0 - '@types/node': 22.19.8 + '@types/node': 22.19.11 chalk: 4.1.2 jest-message-util: 30.2.0 jest-util: 30.2.0 @@ -12196,14 +12426,14 @@ snapshots: '@jest/test-result': 30.2.0 '@jest/transform': 30.2.0 '@jest/types': 30.2.0 - '@types/node': 22.19.8 + '@types/node': 22.19.11 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 4.4.0 exit-x: 0.2.2 graceful-fs: 4.2.11 jest-changed-files: 30.2.0 - jest-config: 30.2.0(@types/node@22.19.8)(babel-plugin-macros@3.1.0) + jest-config: 30.2.0(@types/node@22.19.11)(babel-plugin-macros@3.1.0) jest-haste-map: 30.2.0 jest-message-util: 30.2.0 jest-regex-util: 30.0.1 @@ -12232,7 +12462,7 @@ snapshots: '@jest/fake-timers': 30.2.0 '@jest/types': 30.2.0 '@types/jsdom': 21.1.7 - '@types/node': 22.19.8 + '@types/node': 22.19.11 jest-mock: 30.2.0 jest-util: 30.2.0 jsdom: 26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f) @@ -12241,7 +12471,7 @@ snapshots: dependencies: '@jest/fake-timers': 30.2.0 '@jest/types': 30.2.0 - '@types/node': 22.19.8 + '@types/node': 22.19.11 jest-mock: 30.2.0 '@jest/expect-utils@30.2.0': @@ -12259,7 +12489,7 @@ snapshots: dependencies: '@jest/types': 30.2.0 '@sinonjs/fake-timers': 13.0.5 - '@types/node': 22.19.8 + '@types/node': 22.19.11 jest-message-util: 30.2.0 jest-mock: 30.2.0 jest-util: 30.2.0 @@ -12277,7 +12507,7 @@ snapshots: '@jest/pattern@30.0.1': dependencies: - '@types/node': 22.19.8 + '@types/node': 22.19.11 jest-regex-util: 30.0.1 '@jest/reporters@30.2.0': @@ -12288,7 +12518,7 @@ snapshots: '@jest/transform': 30.2.0 '@jest/types': 30.2.0 '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 22.19.8 + '@types/node': 22.19.11 chalk: 4.1.2 collect-v8-coverage: 1.0.3 exit-x: 0.2.2 @@ -12365,13 +12595,13 @@ snapshots: '@jest/schemas': 30.0.5 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.19.8 + '@types/node': 22.19.11 '@types/yargs': 17.0.35 chalk: 4.1.2 - '@joshwooding/vite-plugin-react-docgen-typescript@0.6.3(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.6.4(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: - glob: 11.1.0 + glob: 13.0.6 react-docgen-typescript: 2.4.0(typescript@5.9.3) vite: 7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) optionalDependencies: @@ -12583,7 +12813,7 @@ snapshots: rw: 1.3.3 tinyqueue: 3.0.0 - '@maplibre/mlt@1.1.5': + '@maplibre/mlt@1.1.6': dependencies: '@mapbox/point-geometry': 1.1.0 @@ -12597,7 +12827,7 @@ snapshots: pbf: 4.0.1 supercluster: 8.0.1 - '@matrix-org/analytics-events@0.31.0': {} + '@matrix-org/analytics-events@0.32.0': {} '@matrix-org/emojibase-bindings@1.5.0': dependencies: @@ -12693,32 +12923,79 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@nx/devkit@22.5.0(nx@22.5.0)': + '@nx-tools/ci-context@7.2.1(@nx/devkit@22.5.1(nx@22.5.1))(tslib@2.8.1)': + dependencies: + '@actions/github': 6.0.1 + '@nx-tools/core': 7.2.1(@nx/devkit@22.5.1(nx@22.5.1))(tslib@2.8.1) + '@octokit/openapi-types': 22.2.0 + properties-file: 3.6.4 + std-env: 3.10.0 + tslib: 2.8.1 + transitivePeerDependencies: + - '@nx/devkit' + + '@nx-tools/container-metadata@7.2.1(@nx/devkit@22.5.1(nx@22.5.1))(tslib@2.8.1)': + dependencies: + '@nx-tools/ci-context': 7.2.1(@nx/devkit@22.5.1(nx@22.5.1))(tslib@2.8.1) + '@nx-tools/core': 7.2.1(@nx/devkit@22.5.1(nx@22.5.1))(tslib@2.8.1) + '@nx/devkit': 22.5.1(nx@22.5.1) + '@renovatebot/pep440': 4.2.1 + csv-parse: 5.6.0 + handlebars: 4.7.8 + moment-timezone: 0.5.48 + semver: 7.7.4 + tslib: 2.8.1 + + '@nx-tools/core@7.2.1(@nx/devkit@22.5.1(nx@22.5.1))(tslib@2.8.1)': + dependencies: + '@actions/io': 1.1.3 + '@nx/devkit': 22.5.1(nx@22.5.1) + csv-parse: 5.6.0 + std-env: 3.10.0 + tinyexec: 1.0.2 + tinyrainbow: 3.0.3 + tslib: 2.8.1 + + '@nx-tools/nx-container@7.2.1(@nx/devkit@22.5.1(nx@22.5.1))(@nx/js@22.5.1(@babel/traverse@7.29.0)(nx@22.5.1))(dotenv@17.3.1)(nx@22.5.1)(tslib@2.8.1)': + dependencies: + '@nx-tools/container-metadata': 7.2.1(@nx/devkit@22.5.1(nx@22.5.1))(tslib@2.8.1) + '@nx-tools/core': 7.2.1(@nx/devkit@22.5.1(nx@22.5.1))(tslib@2.8.1) + '@nx/devkit': 22.5.1(nx@22.5.1) + '@nx/js': 22.5.1(@babel/traverse@7.29.0)(nx@22.5.1) + csv-parse: 5.6.0 + dotenv: 17.3.1 + handlebars: 4.7.8 + nx: 22.5.1 + semver: 7.7.4 + tmp: 0.2.5 + tslib: 2.8.1 + + '@nx/devkit@22.5.1(nx@22.5.1)': dependencies: '@zkochan/js-yaml': 0.0.7 ejs: 3.1.10 enquirer: 2.3.6 minimatch: 10.1.1 - nx: 22.5.0 - semver: 7.7.3 + nx: 22.5.1 + semver: 7.7.4 tslib: 2.8.1 yargs-parser: 21.1.1 - '@nx/jest@22.5.0(@babel/traverse@7.29.0)(@types/node@22.19.8)(babel-plugin-macros@3.1.0)(nx@22.5.0)(typescript@5.9.3)': + '@nx/jest@22.5.1(@babel/traverse@7.29.0)(@types/node@22.19.11)(babel-plugin-macros@3.1.0)(nx@22.5.1)(typescript@5.9.3)': dependencies: '@jest/reporters': 30.2.0 '@jest/test-result': 30.2.0 - '@nx/devkit': 22.5.0(nx@22.5.0) - '@nx/js': 22.5.0(@babel/traverse@7.29.0)(nx@22.5.0) + '@nx/devkit': 22.5.1(nx@22.5.1) + '@nx/js': 22.5.1(@babel/traverse@7.29.0)(nx@22.5.1) '@phenomnomnominal/tsquery': 6.1.4(typescript@5.9.3) identity-obj-proxy: 3.0.0 - jest-config: 30.2.0(@types/node@22.19.8)(babel-plugin-macros@3.1.0) + jest-config: 30.2.0(@types/node@22.19.11)(babel-plugin-macros@3.1.0) jest-resolve: 30.2.0 jest-util: 30.2.0 minimatch: 10.1.1 picocolors: 1.1.1 resolve.exports: 2.0.3 - semver: 7.7.3 + semver: 7.7.4 tslib: 2.8.1 yargs-parser: 21.1.1 transitivePeerDependencies: @@ -12736,7 +13013,7 @@ snapshots: - typescript - verdaccio - '@nx/js@22.5.0(@babel/traverse@7.29.0)(nx@22.5.0)': + '@nx/js@22.5.1(@babel/traverse@7.29.0)(nx@22.5.1)': dependencies: '@babel/core': 7.29.0 '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.29.0) @@ -12745,8 +13022,8 @@ snapshots: '@babel/preset-env': 7.29.0(@babel/core@7.29.0) '@babel/preset-typescript': 7.28.5(@babel/core@7.29.0) '@babel/runtime': 7.28.6 - '@nx/devkit': 22.5.0(nx@22.5.0) - '@nx/workspace': 22.5.0 + '@nx/devkit': 22.5.1(nx@22.5.1) + '@nx/workspace': 22.5.1 '@zkochan/js-yaml': 0.0.7 babel-plugin-const-enum: 1.2.0(@babel/core@7.29.0) babel-plugin-macros: 3.1.0 @@ -12760,7 +13037,7 @@ snapshots: npm-run-path: 4.0.1 picocolors: 1.1.1 picomatch: 4.0.2 - semver: 7.7.3 + semver: 7.7.4 source-map-support: 0.5.19 tinyglobby: 0.2.15 tslib: 2.8.1 @@ -12772,45 +13049,45 @@ snapshots: - nx - supports-color - '@nx/nx-darwin-arm64@22.5.0': + '@nx/nx-darwin-arm64@22.5.1': optional: true - '@nx/nx-darwin-x64@22.5.0': + '@nx/nx-darwin-x64@22.5.1': optional: true - '@nx/nx-freebsd-x64@22.5.0': + '@nx/nx-freebsd-x64@22.5.1': optional: true - '@nx/nx-linux-arm-gnueabihf@22.5.0': + '@nx/nx-linux-arm-gnueabihf@22.5.1': optional: true - '@nx/nx-linux-arm64-gnu@22.5.0': + '@nx/nx-linux-arm64-gnu@22.5.1': optional: true - '@nx/nx-linux-arm64-musl@22.5.0': + '@nx/nx-linux-arm64-musl@22.5.1': optional: true - '@nx/nx-linux-x64-gnu@22.5.0': + '@nx/nx-linux-x64-gnu@22.5.1': optional: true - '@nx/nx-linux-x64-musl@22.5.0': + '@nx/nx-linux-x64-musl@22.5.1': optional: true - '@nx/nx-win32-arm64-msvc@22.5.0': + '@nx/nx-win32-arm64-msvc@22.5.1': optional: true - '@nx/nx-win32-x64-msvc@22.5.0': + '@nx/nx-win32-x64-msvc@22.5.1': optional: true - '@nx/workspace@22.5.0': + '@nx/workspace@22.5.1': dependencies: - '@nx/devkit': 22.5.0(nx@22.5.0) + '@nx/devkit': 22.5.1(nx@22.5.1) '@zkochan/js-yaml': 0.0.7 chalk: 4.1.2 enquirer: 2.3.6 - nx: 22.5.0 + nx: 22.5.1 picomatch: 4.0.2 - semver: 7.7.3 + semver: 7.7.4 tslib: 2.8.1 yargs-parser: 21.1.1 transitivePeerDependencies: @@ -12818,6 +13095,66 @@ snapshots: - '@swc/core' - debug + '@octokit/auth-token@4.0.0': {} + + '@octokit/core@5.2.2': + dependencies: + '@octokit/auth-token': 4.0.0 + '@octokit/graphql': 7.1.1 + '@octokit/request': 8.4.1 + '@octokit/request-error': 5.1.1 + '@octokit/types': 13.10.0 + before-after-hook: 2.2.3 + universal-user-agent: 6.0.1 + + '@octokit/endpoint@9.0.6': + dependencies: + '@octokit/types': 13.10.0 + universal-user-agent: 6.0.1 + + '@octokit/graphql@7.1.1': + dependencies: + '@octokit/request': 8.4.1 + '@octokit/types': 13.10.0 + universal-user-agent: 6.0.1 + + '@octokit/openapi-types@20.0.0': {} + + '@octokit/openapi-types@22.2.0': {} + + '@octokit/openapi-types@24.2.0': {} + + '@octokit/plugin-paginate-rest@9.2.2(@octokit/core@5.2.2)': + dependencies: + '@octokit/core': 5.2.2 + '@octokit/types': 12.6.0 + + '@octokit/plugin-rest-endpoint-methods@10.4.1(@octokit/core@5.2.2)': + dependencies: + '@octokit/core': 5.2.2 + '@octokit/types': 12.6.0 + + '@octokit/request-error@5.1.1': + dependencies: + '@octokit/types': 13.10.0 + deprecation: 2.3.1 + once: 1.4.0 + + '@octokit/request@8.4.1': + dependencies: + '@octokit/endpoint': 9.0.6 + '@octokit/request-error': 5.1.1 + '@octokit/types': 13.10.0 + universal-user-agent: 6.0.1 + + '@octokit/types@12.6.0': + dependencies: + '@octokit/openapi-types': 20.0.0 + + '@octokit/types@13.10.0': + dependencies: + '@octokit/openapi-types': 24.2.0 + '@opentelemetry/api-logs@0.208.0': dependencies: '@opentelemetry/api': 1.9.0 @@ -12894,66 +13231,66 @@ snapshots: '@opentelemetry/semantic-conventions@1.39.0': {} - '@oxc-resolver/binding-android-arm-eabi@11.17.0': + '@oxc-resolver/binding-android-arm-eabi@11.17.1': optional: true - '@oxc-resolver/binding-android-arm64@11.17.0': + '@oxc-resolver/binding-android-arm64@11.17.1': optional: true - '@oxc-resolver/binding-darwin-arm64@11.17.0': + '@oxc-resolver/binding-darwin-arm64@11.17.1': optional: true - '@oxc-resolver/binding-darwin-x64@11.17.0': + '@oxc-resolver/binding-darwin-x64@11.17.1': optional: true - '@oxc-resolver/binding-freebsd-x64@11.17.0': + '@oxc-resolver/binding-freebsd-x64@11.17.1': optional: true - '@oxc-resolver/binding-linux-arm-gnueabihf@11.17.0': + '@oxc-resolver/binding-linux-arm-gnueabihf@11.17.1': optional: true - '@oxc-resolver/binding-linux-arm-musleabihf@11.17.0': + '@oxc-resolver/binding-linux-arm-musleabihf@11.17.1': optional: true - '@oxc-resolver/binding-linux-arm64-gnu@11.17.0': + '@oxc-resolver/binding-linux-arm64-gnu@11.17.1': optional: true - '@oxc-resolver/binding-linux-arm64-musl@11.17.0': + '@oxc-resolver/binding-linux-arm64-musl@11.17.1': optional: true - '@oxc-resolver/binding-linux-ppc64-gnu@11.17.0': + '@oxc-resolver/binding-linux-ppc64-gnu@11.17.1': optional: true - '@oxc-resolver/binding-linux-riscv64-gnu@11.17.0': + '@oxc-resolver/binding-linux-riscv64-gnu@11.17.1': optional: true - '@oxc-resolver/binding-linux-riscv64-musl@11.17.0': + '@oxc-resolver/binding-linux-riscv64-musl@11.17.1': optional: true - '@oxc-resolver/binding-linux-s390x-gnu@11.17.0': + '@oxc-resolver/binding-linux-s390x-gnu@11.17.1': optional: true - '@oxc-resolver/binding-linux-x64-gnu@11.17.0': + '@oxc-resolver/binding-linux-x64-gnu@11.17.1': optional: true - '@oxc-resolver/binding-linux-x64-musl@11.17.0': + '@oxc-resolver/binding-linux-x64-musl@11.17.1': optional: true - '@oxc-resolver/binding-openharmony-arm64@11.17.0': + '@oxc-resolver/binding-openharmony-arm64@11.17.1': optional: true - '@oxc-resolver/binding-wasm32-wasi@11.17.0': + '@oxc-resolver/binding-wasm32-wasi@11.17.1': dependencies: '@napi-rs/wasm-runtime': 1.1.1 optional: true - '@oxc-resolver/binding-win32-arm64-msvc@11.17.0': + '@oxc-resolver/binding-win32-arm64-msvc@11.17.1': optional: true - '@oxc-resolver/binding-win32-ia32-msvc@11.17.0': + '@oxc-resolver/binding-win32-ia32-msvc@11.17.1': optional: true - '@oxc-resolver/binding-win32-x64-msvc@11.17.0': + '@oxc-resolver/binding-win32-x64-msvc@11.17.1': optional: true '@peculiar/asn1-cms@2.6.0': @@ -13069,22 +13406,22 @@ snapshots: '@pkgr/core@0.2.9': {} - '@playwright/test@1.58.1': + '@playwright/test@1.58.2': dependencies: - playwright: 1.58.1 + playwright: 1.58.2 '@polka/url@1.0.0-next.29': {} - '@posthog/core@1.17.0': + '@posthog/core@1.22.0': dependencies: cross-spawn: 7.0.6 - '@posthog/types@1.336.4': {} + '@posthog/types@1.347.2': {} - '@principalstudio/html-webpack-inject-preload@1.2.7(html-webpack-plugin@5.6.6(webpack@5.105.0))(webpack@5.105.0)': + '@principalstudio/html-webpack-inject-preload@1.2.7(html-webpack-plugin@5.6.6(webpack@5.105.2))(webpack@5.105.2)': dependencies: - html-webpack-plugin: 5.6.6(webpack@5.105.0) - webpack: 5.105.0(webpack-cli@6.0.1) + html-webpack-plugin: 5.6.6(webpack@5.105.2) + webpack: 5.105.2(webpack-cli@6.0.1) '@protobufjs/aspromise@1.1.2': {} @@ -13449,7 +13786,9 @@ snapshots: '@radix-ui/rect@1.1.1': {} - '@rolldown/pluginutils@1.0.0-rc.2': {} + '@renovatebot/pep440@4.2.1': {} + + '@rolldown/pluginutils@1.0.0-rc.3': {} '@rollup/plugin-inject@5.0.5(rollup@4.57.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))': dependencies: @@ -13601,7 +13940,7 @@ snapshots: '@sentry-internal/browser-utils': 10.38.0 '@sentry/core': 10.38.0 - '@sentry/babel-plugin-component-annotate@4.9.0': {} + '@sentry/babel-plugin-component-annotate@4.9.1': {} '@sentry/browser@10.38.0': dependencies: @@ -13611,10 +13950,10 @@ snapshots: '@sentry-internal/replay-canvas': 10.38.0 '@sentry/core': 10.38.0 - '@sentry/bundler-plugin-core@4.9.0(encoding@0.1.13)': + '@sentry/bundler-plugin-core@4.9.1(encoding@0.1.13)': dependencies: '@babel/core': 7.29.0 - '@sentry/babel-plugin-component-annotate': 4.9.0 + '@sentry/babel-plugin-component-annotate': 4.9.1 '@sentry/cli': 2.58.4(encoding@0.1.13) dotenv: 16.6.1 find-up: 5.0.0 @@ -13671,12 +14010,12 @@ snapshots: '@sentry/core@10.38.0': {} - '@sentry/webpack-plugin@4.9.0(encoding@0.1.13)(webpack@5.105.0)': + '@sentry/webpack-plugin@4.9.1(encoding@0.1.13)(webpack@5.105.2)': dependencies: - '@sentry/bundler-plugin-core': 4.9.0(encoding@0.1.13) + '@sentry/bundler-plugin-core': 4.9.1(encoding@0.1.13) unplugin: 1.0.1 uuid: 9.0.1 - webpack: 5.105.0(webpack-cli@6.0.1) + webpack: 5.105.2(webpack-cli@6.0.1) transitivePeerDependencies: - encoding - supports-color @@ -13715,32 +14054,32 @@ snapshots: '@standard-schema/spec@1.1.0': {} - '@storybook/addon-a11y@10.2.5(storybook@10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': + '@storybook/addon-a11y@10.2.9(storybook@10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': dependencies: '@storybook/global': 5.0.0 axe-core: 4.11.1 - storybook: 10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + storybook: 10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@storybook/addon-designs@11.1.1(@storybook/addon-docs@10.2.5(@types/react@19.2.10)(esbuild@0.27.2)(rollup@4.57.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.0(esbuild@0.27.2)(webpack-cli@6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.0))))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': + '@storybook/addon-designs@11.1.2(@storybook/addon-docs@10.2.9(@types/react@19.2.10)(esbuild@0.27.3)(rollup@4.57.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.2(esbuild@0.27.3)))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': dependencies: '@figspec/react': 2.0.1(@types/react@19.2.10)(react@19.2.4) - storybook: 10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + storybook: 10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) optionalDependencies: - '@storybook/addon-docs': 10.2.5(@types/react@19.2.10)(esbuild@0.27.2)(rollup@4.57.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.0(esbuild@0.27.2)(webpack-cli@6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.0))) + '@storybook/addon-docs': 10.2.9(@types/react@19.2.10)(esbuild@0.27.3)(rollup@4.57.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.2(esbuild@0.27.3)) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) transitivePeerDependencies: - '@types/react' - '@storybook/addon-docs@10.2.5(@types/react@19.2.10)(esbuild@0.27.2)(rollup@4.57.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.0(esbuild@0.27.2)(webpack-cli@6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.0)))': + '@storybook/addon-docs@10.2.9(@types/react@19.2.10)(esbuild@0.27.3)(rollup@4.57.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.2(esbuild@0.27.3))': dependencies: '@mdx-js/react': 3.1.1(@types/react@19.2.10)(react@19.2.4) - '@storybook/csf-plugin': 10.2.5(esbuild@0.27.2)(rollup@4.57.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.0(esbuild@0.27.2)(webpack-cli@6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.0))) + '@storybook/csf-plugin': 10.2.9(esbuild@0.27.3)(rollup@4.57.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.2(esbuild@0.27.3)) '@storybook/icons': 2.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@storybook/react-dom-shim': 10.2.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + '@storybook/react-dom-shim': 10.2.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - storybook: 10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + storybook: 10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' @@ -13749,24 +14088,24 @@ snapshots: - vite - webpack - '@storybook/addon-vitest@10.2.5(@vitest/browser-playwright@4.0.18)(@vitest/browser@4.0.18(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18))(@vitest/runner@4.0.18)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vitest@4.0.18)': + '@storybook/addon-vitest@10.2.9(@vitest/browser-playwright@4.0.18)(@vitest/browser@4.0.18(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18))(@vitest/runner@4.0.18)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vitest@4.0.18)': dependencies: '@storybook/global': 5.0.0 '@storybook/icons': 2.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - storybook: 10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + storybook: 10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) optionalDependencies: '@vitest/browser': 4.0.18(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18) - '@vitest/browser-playwright': 4.0.18(playwright@1.58.1)(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18) + '@vitest/browser-playwright': 4.0.18(playwright@1.58.2)(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18) '@vitest/runner': 4.0.18 vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.13)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.6.1)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - react - react-dom - '@storybook/builder-vite@10.2.5(esbuild@0.27.2)(rollup@4.57.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.0(esbuild@0.27.2)(webpack-cli@6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.0)))': + '@storybook/builder-vite@10.2.9(esbuild@0.27.3)(rollup@4.57.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.2(esbuild@0.27.3))': dependencies: - '@storybook/csf-plugin': 10.2.5(esbuild@0.27.2)(rollup@4.57.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.0(esbuild@0.27.2)(webpack-cli@6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.0))) - storybook: 10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@storybook/csf-plugin': 10.2.9(esbuild@0.27.3)(rollup@4.57.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.2(esbuild@0.27.3)) + storybook: 10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) ts-dedent: 2.2.0 vite: 7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: @@ -13774,15 +14113,15 @@ snapshots: - rollup - webpack - '@storybook/csf-plugin@10.2.5(esbuild@0.27.2)(rollup@4.57.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.0(esbuild@0.27.2)(webpack-cli@6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.0)))': + '@storybook/csf-plugin@10.2.9(esbuild@0.27.3)(rollup@4.57.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.2(esbuild@0.27.3))': dependencies: - storybook: 10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + storybook: 10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) unplugin: 2.3.11 optionalDependencies: - esbuild: 0.27.2 + esbuild: 0.27.3 rollup: 4.57.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8) vite: 7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) - webpack: 5.105.0(esbuild@0.27.2)(webpack-cli@6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.0)) + webpack: 5.105.2(esbuild@0.27.3) '@storybook/global@5.0.0': {} @@ -13791,25 +14130,25 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - '@storybook/react-dom-shim@10.2.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': + '@storybook/react-dom-shim@10.2.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': dependencies: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - storybook: 10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + storybook: 10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@storybook/react-vite@10.2.5(esbuild@0.27.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.57.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.0(esbuild@0.27.2)(webpack-cli@6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.0)))': + '@storybook/react-vite@10.2.9(esbuild@0.27.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.57.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.2(esbuild@0.27.3))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.3(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.4(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) '@rollup/pluginutils': 5.3.0(rollup@4.57.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8)) - '@storybook/builder-vite': 10.2.5(esbuild@0.27.2)(rollup@4.57.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.0(esbuild@0.27.2)(webpack-cli@6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.0))) - '@storybook/react': 10.2.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) + '@storybook/builder-vite': 10.2.9(esbuild@0.27.3)(rollup@4.57.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.2(esbuild@0.27.3)) + '@storybook/react': 10.2.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) empathic: 2.0.0 magic-string: 0.30.21 react: 19.2.4 react-docgen: 8.0.2 react-dom: 19.2.4(react@19.2.4) resolve: 1.22.11 - storybook: 10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + storybook: 10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) tsconfig-paths: 4.2.0 vite: 7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: @@ -13819,23 +14158,23 @@ snapshots: - typescript - webpack - '@storybook/react@10.2.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)': + '@storybook/react@10.2.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)': dependencies: '@storybook/global': 5.0.0 - '@storybook/react-dom-shim': 10.2.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + '@storybook/react-dom-shim': 10.2.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) react: 19.2.4 react-docgen: 8.0.2 react-dom: 19.2.4(react@19.2.4) - storybook: 10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + storybook: 10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@stylistic/eslint-plugin@5.7.1(eslint@8.57.1)': + '@stylistic/eslint-plugin@5.8.0(eslint@8.57.1)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) - '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/types': 8.56.0 eslint: 8.57.1 eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -14017,11 +14356,11 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.19.8 + '@types/node': 22.19.11 '@types/bonjour@3.5.13': dependencies: - '@types/node': 22.19.8 + '@types/node': 22.19.11 '@types/chai@5.2.3': dependencies: @@ -14033,11 +14372,11 @@ snapshots: '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 5.1.1 - '@types/node': 22.19.8 + '@types/node': 22.19.11 '@types/connect@3.4.38': dependencies: - '@types/node': 22.19.8 + '@types/node': 22.19.11 '@types/content-type@1.1.9': {} @@ -14051,13 +14390,13 @@ snapshots: '@types/docker-modem@3.0.6': dependencies: - '@types/node': 22.19.8 + '@types/node': 22.19.11 '@types/ssh2': 1.15.5 '@types/dockerode@3.3.47': dependencies: '@types/docker-modem': 3.0.6 - '@types/node': 22.19.8 + '@types/node': 22.19.11 '@types/ssh2': 1.15.5 '@types/doctrine@0.0.9': {} @@ -14084,14 +14423,14 @@ snapshots: '@types/express-serve-static-core@4.19.8': dependencies: - '@types/node': 22.19.8 + '@types/node': 22.19.11 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 '@types/express-serve-static-core@5.1.1': dependencies: - '@types/node': 22.19.8 + '@types/node': 22.19.11 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 @@ -14130,7 +14469,7 @@ snapshots: '@types/http-proxy@1.17.17': dependencies: - '@types/node': 22.19.8 + '@types/node': 22.19.11 '@types/istanbul-lib-coverage@2.0.6': {} @@ -14151,7 +14490,7 @@ snapshots: '@types/jsdom@21.1.7': dependencies: - '@types/node': 22.19.8 + '@types/node': 22.19.11 '@types/tough-cookie': 4.0.5 parse5: 7.3.0 @@ -14175,7 +14514,7 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/node@22.19.8': + '@types/node@22.19.11': dependencies: undici-types: 6.21.0 @@ -14200,7 +14539,7 @@ snapshots: '@types/qrcode@1.5.6': dependencies: - '@types/node': 22.19.8 + '@types/node': 22.19.11 '@types/qs@6.14.0': {} @@ -14246,11 +14585,11 @@ snapshots: '@types/send@0.17.6': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.19.8 + '@types/node': 22.19.11 '@types/send@1.2.1': dependencies: - '@types/node': 22.19.8 + '@types/node': 22.19.11 '@types/serve-index@1.9.4': dependencies: @@ -14259,25 +14598,25 @@ snapshots: '@types/serve-static@1.15.10': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 22.19.8 + '@types/node': 22.19.11 '@types/send': 0.17.6 '@types/serve-static@2.2.0': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 22.19.8 + '@types/node': 22.19.11 '@types/sockjs@0.3.36': dependencies: - '@types/node': 22.19.8 + '@types/node': 22.19.11 '@types/ssh2-streams@0.1.13': dependencies: - '@types/node': 22.19.8 + '@types/node': 22.19.11 '@types/ssh2@0.5.52': dependencies: - '@types/node': 22.19.8 + '@types/node': 22.19.11 '@types/ssh2-streams': 0.1.13 '@types/ssh2@1.15.5': @@ -14303,7 +14642,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 22.19.8 + '@types/node': 22.19.11 '@types/yargs-parser@21.0.3': {} @@ -14311,14 +14650,14 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.54.0(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.55.0(@typescript-eslint/parser@8.55.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.54.0(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.54.0 - '@typescript-eslint/type-utils': 8.54.0(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/utils': 8.54.0(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.54.0 + '@typescript-eslint/parser': 8.55.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.55.0 + '@typescript-eslint/type-utils': 8.55.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.55.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.55.0 eslint: 8.57.1 ignore: 7.0.5 natural-compare: 1.4.0 @@ -14327,41 +14666,59 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/parser@8.55.0(eslint@8.57.1)(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.54.0 - '@typescript-eslint/types': 8.54.0 - '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.54.0 + '@typescript-eslint/scope-manager': 8.55.0 + '@typescript-eslint/types': 8.55.0 + '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.55.0 debug: 4.4.3 eslint: 8.57.1 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.54.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.55.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.54.0(typescript@5.9.3) - '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/tsconfig-utils': 8.56.0(typescript@5.9.3) + '@typescript-eslint/types': 8.56.0 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.54.0': + '@typescript-eslint/project-service@8.56.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.54.0 - '@typescript-eslint/visitor-keys': 8.54.0 + '@typescript-eslint/tsconfig-utils': 8.56.0(typescript@5.9.3) + '@typescript-eslint/types': 8.56.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color - '@typescript-eslint/tsconfig-utils@8.54.0(typescript@5.9.3)': + '@typescript-eslint/scope-manager@8.55.0': + dependencies: + '@typescript-eslint/types': 8.55.0 + '@typescript-eslint/visitor-keys': 8.55.0 + + '@typescript-eslint/scope-manager@8.56.0': + dependencies: + '@typescript-eslint/types': 8.56.0 + '@typescript-eslint/visitor-keys': 8.56.0 + + '@typescript-eslint/tsconfig-utils@8.55.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.54.0(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.56.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.54.0 - '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.54.0(eslint@8.57.1)(typescript@5.9.3) + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.55.0(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.55.0 + '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.55.0(eslint@8.57.1)(typescript@5.9.3) debug: 4.4.3 eslint: 8.57.1 ts-api-utils: 2.4.0(typescript@5.9.3) @@ -14369,39 +14726,72 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.54.0': {} + '@typescript-eslint/types@8.55.0': {} - '@typescript-eslint/typescript-estree@8.54.0(typescript@5.9.3)': + '@typescript-eslint/types@8.56.0': {} + + '@typescript-eslint/typescript-estree@8.55.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.54.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.54.0(typescript@5.9.3) - '@typescript-eslint/types': 8.54.0 - '@typescript-eslint/visitor-keys': 8.54.0 + '@typescript-eslint/project-service': 8.55.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.55.0(typescript@5.9.3) + '@typescript-eslint/types': 8.55.0 + '@typescript-eslint/visitor-keys': 8.55.0 debug: 4.4.3 minimatch: 9.0.5 - semver: 7.7.3 + semver: 7.7.4 tinyglobby: 0.2.15 ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.54.0(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.56.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.56.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.56.0(typescript@5.9.3) + '@typescript-eslint/types': 8.56.0 + '@typescript-eslint/visitor-keys': 8.56.0 + debug: 4.4.3 + minimatch: 9.0.5 + semver: 7.7.4 + tinyglobby: 0.2.15 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.55.0(eslint@8.57.1)(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.54.0 - '@typescript-eslint/types': 8.54.0 - '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.55.0 + '@typescript-eslint/types': 8.55.0 + '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) eslint: 8.57.1 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.54.0': + '@typescript-eslint/utils@8.56.0(eslint@8.57.1)(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.54.0 + '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + '@typescript-eslint/scope-manager': 8.56.0 + '@typescript-eslint/types': 8.56.0 + '@typescript-eslint/typescript-estree': 8.56.0(typescript@5.9.3) + eslint: 8.57.1 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.55.0': + dependencies: + '@typescript-eslint/types': 8.55.0 eslint-visitor-keys: 4.2.1 + '@typescript-eslint/visitor-keys@8.56.0': + dependencies: + '@typescript-eslint/types': 8.56.0 + eslint-visitor-keys: 5.0.1 + '@ungap/structured-clone@1.3.0': {} '@unrs/resolver-binding-android-arm-eabi@1.11.1': @@ -14463,12 +14853,12 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vector-im/compound-design-tokens@6.9.0(@types/react@19.2.10)(react@19.2.4)': + '@vector-im/compound-design-tokens@6.10.0(@types/react@19.2.10)(react@19.2.4)': optionalDependencies: '@types/react': 19.2.10 react: 19.2.4 - '@vector-im/compound-web@8.3.6(@fontsource/inconsolata@5.2.8)(@fontsource/inter@5.2.8)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(@vector-im/compound-design-tokens@6.9.0(@types/react@19.2.10)(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@vector-im/compound-web@8.3.6(@fontsource/inconsolata@5.2.8)(@fontsource/inter@5.2.8)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(@vector-im/compound-design-tokens@6.10.0(@types/react@19.2.10)(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@floating-ui/react': 0.27.17(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@fontsource/inconsolata': 5.2.8 @@ -14479,7 +14869,7 @@ snapshots: '@radix-ui/react-progress': 1.1.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-separator': 1.1.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-slot': 1.2.4(@types/react@19.2.10)(react@19.2.4) - '@vector-im/compound-design-tokens': 6.9.0(@types/react@19.2.10)(react@19.2.4) + '@vector-im/compound-design-tokens': 6.10.0(@types/react@19.2.10)(react@19.2.4) classnames: 2.5.1 react: 19.2.4 vaul: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -14493,23 +14883,23 @@ snapshots: dependencies: react: 19.2.4 - '@vitejs/plugin-react@5.1.3(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': + '@vitejs/plugin-react@5.1.4(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.29.0) - '@rolldown/pluginutils': 1.0.0-rc.2 + '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 vite: 7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - '@vitest/browser-playwright@4.0.18(playwright@1.58.1)(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18)': + '@vitest/browser-playwright@4.0.18(playwright@1.58.2)(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18)': dependencies: '@vitest/browser': 4.0.18(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18) '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) - playwright: 1.58.1 + playwright: 1.58.2 tinyrainbow: 3.0.3 vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.13)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.6.1)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: @@ -14744,22 +15134,22 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.105.0)': + '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.105.2)': dependencies: - webpack: 5.105.0(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.0) + webpack: 5.105.2(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.2) - '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.105.0)': + '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.105.2)': dependencies: - webpack: 5.105.0(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.0) + webpack: 5.105.2(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.2) - '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack@5.105.0)': + '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack@5.105.2)': dependencies: - webpack: 5.105.0(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.0) + webpack: 5.105.2(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.2) optionalDependencies: - webpack-dev-server: 5.2.3(tslib@2.8.1)(webpack-cli@6.0.1)(webpack@5.105.0) + webpack-dev-server: 5.2.3(tslib@2.8.1)(webpack-cli@6.0.1)(webpack@5.105.2) '@xtuc/ieee754@1.2.0': {} @@ -14798,19 +15188,19 @@ snapshots: mime-types: 3.0.2 negotiator: 1.0.0 - acorn-import-phases@1.0.4(acorn@8.15.0): + acorn-import-phases@1.0.4(acorn@8.16.0): dependencies: - acorn: 8.15.0 + acorn: 8.16.0 - acorn-jsx@5.3.2(acorn@8.15.0): + acorn-jsx@5.3.2(acorn@8.16.0): dependencies: - acorn: 8.15.0 + acorn: 8.16.0 acorn-walk@8.3.4: dependencies: - acorn: 8.15.0 + acorn: 8.16.0 - acorn@8.15.0: {} + acorn@8.16.0: {} address@1.2.2: {} @@ -14826,9 +15216,9 @@ snapshots: optionalDependencies: ajv: 8.13.0 - ajv-formats@2.1.1(ajv@8.17.1): + ajv-formats@2.1.1(ajv@8.18.0): optionalDependencies: - ajv: 8.17.1 + ajv: 8.18.0 ajv-formats@3.0.1(ajv@8.13.0): optionalDependencies: @@ -14838,9 +15228,9 @@ snapshots: dependencies: ajv: 6.12.6 - ajv-keywords@5.1.0(ajv@8.17.1): + ajv-keywords@5.1.0(ajv@8.18.0): dependencies: - ajv: 8.17.1 + ajv: 8.18.0 fast-deep-equal: 3.1.3 ajv@6.12.6: @@ -14864,7 +15254,7 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 - ajv@8.17.1: + ajv@8.18.0: dependencies: fast-deep-equal: 3.1.3 fast-uri: 3.1.0 @@ -15077,14 +15467,6 @@ snapshots: axe-core@4.11.1: {} - axios@1.13.4: - dependencies: - follow-redirects: 1.15.11 - form-data: 4.0.5 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - axios@1.13.5: dependencies: follow-redirects: 1.15.11 @@ -15110,11 +15492,11 @@ snapshots: transitivePeerDependencies: - supports-color - babel-loader@10.0.0(@babel/core@7.29.0)(webpack@5.105.0): + babel-loader@10.0.0(@babel/core@7.29.0)(webpack@5.105.2): dependencies: '@babel/core': 7.29.0 find-up: 5.0.0 - webpack: 5.105.0(webpack-cli@6.0.1) + webpack: 5.105.2(webpack-cli@6.0.1) babel-plugin-const-enum@1.2.0(@babel/core@7.29.0): dependencies: @@ -15217,6 +15599,10 @@ snapshots: balanced-match@3.0.1: {} + balanced-match@4.0.2: + dependencies: + jackspeak: 4.2.3 + bare-events@2.8.2: {} bare-fs@4.5.3: @@ -15268,6 +15654,8 @@ snapshots: dependencies: tweetnacl: 0.14.5 + before-after-hook@2.2.3: {} + big.js@5.2.2: {} binary-extensions@2.3.0: {} @@ -15307,7 +15695,7 @@ snapshots: http-errors: 2.0.1 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.14.1 + qs: 6.14.2 raw-body: 2.5.3 type-is: 1.6.18 unpipe: 1.0.0 @@ -15322,7 +15710,7 @@ snapshots: http-errors: 2.0.1 iconv-lite: 0.7.2 on-finished: 2.4.1 - qs: 6.14.1 + qs: 6.14.2 raw-body: 3.0.2 type-is: 2.0.1 transitivePeerDependencies: @@ -15344,6 +15732,10 @@ snapshots: dependencies: balanced-match: 1.0.2 + brace-expansion@5.0.2: + dependencies: + balanced-match: 4.0.2 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -15450,7 +15842,7 @@ snapshots: cacheable@2.3.2: dependencies: '@cacheable/memory': 2.0.7 - '@cacheable/utils': 2.3.3 + '@cacheable/utils': 2.3.4 hookified: 1.15.1 keyv: 5.6.0 qified: 0.6.0 @@ -15691,14 +16083,14 @@ snapshots: cookie@0.7.2: {} - copy-webpack-plugin@13.0.1(webpack@5.105.0): + copy-webpack-plugin@13.0.1(webpack@5.105.2): dependencies: glob-parent: 6.0.2 normalize-path: 3.0.0 schema-utils: 4.3.3 serialize-javascript: 6.0.2 tinyglobby: 0.2.15 - webpack: 5.105.0(webpack-cli@6.0.1) + webpack: 5.105.2(webpack-cli@6.0.1) core-js-compat@3.48.0: dependencies: @@ -15781,7 +16173,7 @@ snapshots: create-require@1.1.1: {} - cronstrue@3.11.0: {} + cronstrue@3.12.0: {} cross-spawn@7.0.6: dependencies: @@ -15817,7 +16209,7 @@ snapshots: dependencies: postcss: 8.5.6 - css-functions-list@3.2.3: {} + css-functions-list@3.3.3: {} css-has-pseudo@8.0.0(postcss@8.5.6): dependencies: @@ -15826,7 +16218,7 @@ snapshots: postcss-selector-parser: 7.1.1 postcss-value-parser: 4.2.0 - css-loader@7.1.3(webpack@5.105.0): + css-loader@7.1.3(webpack@5.105.2): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -15835,11 +16227,11 @@ snapshots: postcss-modules-scope: 3.2.1(postcss@8.5.6) postcss-modules-values: 4.0.0(postcss@8.5.6) postcss-value-parser: 4.2.0 - semver: 7.7.3 + semver: 7.7.4 optionalDependencies: - webpack: 5.105.0(webpack-cli@6.0.1) + webpack: 5.105.2(webpack-cli@6.0.1) - css-minimizer-webpack-plugin@7.0.4(webpack@5.105.0): + css-minimizer-webpack-plugin@7.0.4(webpack@5.105.2): dependencies: '@jridgewell/trace-mapping': 0.3.31 cssnano: 7.1.2(postcss@8.5.6) @@ -15847,7 +16239,7 @@ snapshots: postcss: 8.5.6 schema-utils: 4.3.3 serialize-javascript: 6.0.2 - webpack: 5.105.0(webpack-cli@6.0.1) + webpack: 5.105.2(webpack-cli@6.0.1) css-prefers-color-scheme@11.0.0(postcss@8.5.6): dependencies: @@ -15949,6 +16341,8 @@ snapshots: csstype@3.2.3: {} + csv-parse@5.6.0: {} + cuint@0.2.2: {} damerau-levenshtein@1.0.8: {} @@ -16041,6 +16435,8 @@ snapshots: depd@2.0.0: {} + deprecation@2.3.1: {} + dequal@2.0.3: {} des.js@1.1.0: @@ -16180,7 +16576,7 @@ snapshots: dotenv@16.6.1: {} - dotenv@17.2.3: {} + dotenv@17.3.1: {} dunder-proto@1.0.1: dependencies: @@ -16373,34 +16769,34 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild@0.27.2: + esbuild@0.27.3: optionalDependencies: - '@esbuild/aix-ppc64': 0.27.2 - '@esbuild/android-arm': 0.27.2 - '@esbuild/android-arm64': 0.27.2 - '@esbuild/android-x64': 0.27.2 - '@esbuild/darwin-arm64': 0.27.2 - '@esbuild/darwin-x64': 0.27.2 - '@esbuild/freebsd-arm64': 0.27.2 - '@esbuild/freebsd-x64': 0.27.2 - '@esbuild/linux-arm': 0.27.2 - '@esbuild/linux-arm64': 0.27.2 - '@esbuild/linux-ia32': 0.27.2 - '@esbuild/linux-loong64': 0.27.2 - '@esbuild/linux-mips64el': 0.27.2 - '@esbuild/linux-ppc64': 0.27.2 - '@esbuild/linux-riscv64': 0.27.2 - '@esbuild/linux-s390x': 0.27.2 - '@esbuild/linux-x64': 0.27.2 - '@esbuild/netbsd-arm64': 0.27.2 - '@esbuild/netbsd-x64': 0.27.2 - '@esbuild/openbsd-arm64': 0.27.2 - '@esbuild/openbsd-x64': 0.27.2 - '@esbuild/openharmony-arm64': 0.27.2 - '@esbuild/sunos-x64': 0.27.2 - '@esbuild/win32-arm64': 0.27.2 - '@esbuild/win32-ia32': 0.27.2 - '@esbuild/win32-x64': 0.27.2 + '@esbuild/aix-ppc64': 0.27.3 + '@esbuild/android-arm': 0.27.3 + '@esbuild/android-arm64': 0.27.3 + '@esbuild/android-x64': 0.27.3 + '@esbuild/darwin-arm64': 0.27.3 + '@esbuild/darwin-x64': 0.27.3 + '@esbuild/freebsd-arm64': 0.27.3 + '@esbuild/freebsd-x64': 0.27.3 + '@esbuild/linux-arm': 0.27.3 + '@esbuild/linux-arm64': 0.27.3 + '@esbuild/linux-ia32': 0.27.3 + '@esbuild/linux-loong64': 0.27.3 + '@esbuild/linux-mips64el': 0.27.3 + '@esbuild/linux-ppc64': 0.27.3 + '@esbuild/linux-riscv64': 0.27.3 + '@esbuild/linux-s390x': 0.27.3 + '@esbuild/linux-x64': 0.27.3 + '@esbuild/netbsd-arm64': 0.27.3 + '@esbuild/netbsd-x64': 0.27.3 + '@esbuild/openbsd-arm64': 0.27.3 + '@esbuild/openbsd-x64': 0.27.3 + '@esbuild/openharmony-arm64': 0.27.3 + '@esbuild/sunos-x64': 0.27.3 + '@esbuild/win32-arm64': 0.27.3 + '@esbuild/win32-ia32': 0.27.3 + '@esbuild/win32-x64': 0.27.3 escalade@3.2.0: {} @@ -16428,11 +16824,11 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.55.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.54.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.55.0(eslint@8.57.1)(typescript@5.9.3) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: @@ -16442,7 +16838,7 @@ snapshots: dependencies: eslint: 8.57.1 - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.55.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -16453,7 +16849,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.55.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -16465,29 +16861,29 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.54.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.55.0(eslint@8.57.1)(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest@29.12.2(@typescript-eslint/eslint-plugin@8.54.0(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(jest@30.2.0(@types/node@22.19.8)(babel-plugin-macros@3.1.0))(typescript@5.9.3): + eslint-plugin-jest@29.15.0(@typescript-eslint/eslint-plugin@8.55.0(@typescript-eslint/parser@8.55.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(jest@30.2.0(@types/node@22.19.11)(babel-plugin-macros@3.1.0))(typescript@5.9.3): dependencies: - '@typescript-eslint/utils': 8.54.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.56.0(eslint@8.57.1)(typescript@5.9.3) eslint: 8.57.1 optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.54.0(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) - jest: 30.2.0(@types/node@22.19.8)(babel-plugin-macros@3.1.0) + '@typescript-eslint/eslint-plugin': 8.55.0(@typescript-eslint/parser@8.55.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + jest: 30.2.0(@types/node@22.19.11)(babel-plugin-macros@3.1.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color - eslint-plugin-jest@29.12.2(@typescript-eslint/eslint-plugin@8.54.0(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(jest@30.2.0(@types/node@24.10.13)(babel-plugin-macros@3.1.0))(typescript@5.9.3): + eslint-plugin-jest@29.15.0(@typescript-eslint/eslint-plugin@8.55.0(@typescript-eslint/parser@8.55.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(jest@30.2.0(@types/node@24.10.13)(babel-plugin-macros@3.1.0))(typescript@5.9.3): dependencies: - '@typescript-eslint/utils': 8.54.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.56.0(eslint@8.57.1)(typescript@5.9.3) eslint: 8.57.1 optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.54.0(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.55.0(@typescript-eslint/parser@8.55.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) jest: 30.2.0(@types/node@24.10.13)(babel-plugin-macros@3.1.0) typescript: 5.9.3 transitivePeerDependencies: @@ -16512,20 +16908,20 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-matrix-org@3.0.0(0699af949871f0c7d06fd35b98c746d0): + eslint-plugin-matrix-org@3.0.0(8064d09a0e89f811cb4abdd560a53405): dependencies: '@babel/core': 7.29.0 '@babel/eslint-parser': 7.28.6(@babel/core@7.29.0)(eslint@8.57.1) '@babel/eslint-plugin': 7.27.1(@babel/eslint-parser@7.28.6(@babel/core@7.29.0)(eslint@8.57.1))(eslint@8.57.1) - '@stylistic/eslint-plugin': 5.7.1(eslint@8.57.1) - '@typescript-eslint/eslint-plugin': 8.54.0(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/parser': 8.54.0(eslint@8.57.1)(typescript@5.9.3) + '@stylistic/eslint-plugin': 5.8.0(eslint@8.57.1) + '@typescript-eslint/eslint-plugin': 8.55.0(@typescript-eslint/parser@8.55.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.55.0(eslint@8.57.1)(typescript@5.9.3) eslint: 8.57.1 eslint-config-google: 0.14.0(eslint@8.57.1) eslint-config-prettier: 10.1.8(eslint@8.57.1) eslint-plugin-deprecate: 0.8.7(eslint@8.57.1) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1) - eslint-plugin-jest: 29.12.2(@typescript-eslint/eslint-plugin@8.54.0(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(jest@30.2.0(@types/node@24.10.13)(babel-plugin-macros@3.1.0))(typescript@5.9.3) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.55.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1) + eslint-plugin-jest: 29.15.0(@typescript-eslint/eslint-plugin@8.55.0(@typescript-eslint/parser@8.55.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(jest@30.2.0(@types/node@22.19.11)(babel-plugin-macros@3.1.0))(typescript@5.9.3) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) eslint-plugin-react: 7.37.5(eslint@8.57.1) eslint-plugin-react-hooks: 7.0.1(eslint@8.57.1) @@ -16533,20 +16929,20 @@ snapshots: prettier: 3.8.1 typescript: 5.9.3 - eslint-plugin-matrix-org@3.0.0(6db84371ed43b4e24329a3ce8b8ba2e5): + eslint-plugin-matrix-org@3.0.0(88cf2a0369f0febb2d3aa37ceb59305d): dependencies: '@babel/core': 7.29.0 '@babel/eslint-parser': 7.28.6(@babel/core@7.29.0)(eslint@8.57.1) '@babel/eslint-plugin': 7.27.1(@babel/eslint-parser@7.28.6(@babel/core@7.29.0)(eslint@8.57.1))(eslint@8.57.1) - '@stylistic/eslint-plugin': 5.7.1(eslint@8.57.1) - '@typescript-eslint/eslint-plugin': 8.54.0(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/parser': 8.54.0(eslint@8.57.1)(typescript@5.9.3) + '@stylistic/eslint-plugin': 5.8.0(eslint@8.57.1) + '@typescript-eslint/eslint-plugin': 8.55.0(@typescript-eslint/parser@8.55.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.55.0(eslint@8.57.1)(typescript@5.9.3) eslint: 8.57.1 eslint-config-google: 0.14.0(eslint@8.57.1) eslint-config-prettier: 10.1.8(eslint@8.57.1) eslint-plugin-deprecate: 0.8.7(eslint@8.57.1) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1) - eslint-plugin-jest: 29.12.2(@typescript-eslint/eslint-plugin@8.54.0(@typescript-eslint/parser@8.54.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(jest@30.2.0(@types/node@22.19.8)(babel-plugin-macros@3.1.0))(typescript@5.9.3) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.55.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1) + eslint-plugin-jest: 29.15.0(@typescript-eslint/eslint-plugin@8.55.0(@typescript-eslint/parser@8.55.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(jest@30.2.0(@types/node@24.10.13)(babel-plugin-macros@3.1.0))(typescript@5.9.3) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) eslint-plugin-react: 7.37.5(eslint@8.57.1) eslint-plugin-react-hooks: 7.0.1(eslint@8.57.1) @@ -16611,11 +17007,11 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-storybook@10.2.5(eslint@8.57.1)(storybook@10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3): + eslint-plugin-storybook@10.2.10(eslint@8.57.1)(storybook@10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3): dependencies: - '@typescript-eslint/utils': 8.54.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.56.0(eslint@8.57.1)(typescript@5.9.3) eslint: 8.57.1 - storybook: 10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + storybook: 10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) transitivePeerDependencies: - supports-color - typescript @@ -16637,7 +17033,7 @@ snapshots: read-pkg-up: 7.0.1 regexp-tree: 0.1.27 regjsparser: 0.10.0 - semver: 7.7.3 + semver: 7.7.4 strip-indent: 3.0.0 eslint-rule-composer@0.3.0: {} @@ -16658,6 +17054,8 @@ snapshots: eslint-visitor-keys@4.2.1: {} + eslint-visitor-keys@5.0.1: {} + eslint@8.57.1: dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) @@ -16703,14 +17101,14 @@ snapshots: espree@10.4.0: dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) eslint-visitor-keys: 4.2.1 espree@9.6.1: dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -16810,7 +17208,7 @@ snapshots: parseurl: 1.3.3 path-to-regexp: 0.1.12 proxy-addr: 2.0.7 - qs: 6.14.1 + qs: 6.14.2 range-parser: 1.2.1 safe-buffer: 5.2.1 send: 0.19.2 @@ -16845,7 +17243,7 @@ snapshots: once: 1.4.0 parseurl: 1.3.3 proxy-addr: 2.0.7 - qs: 6.14.1 + qs: 6.14.2 range-parser: 1.2.1 router: 2.2.0 send: 1.2.1 @@ -16927,11 +17325,11 @@ snapshots: dependencies: flat-cache: 3.2.0 - file-loader@6.2.0(webpack@5.105.0): + file-loader@6.2.0(webpack@5.105.2): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.105.0(webpack-cli@6.0.1) + webpack: 5.105.2(webpack-cli@6.0.1) file-saver@2.0.5: {} @@ -17138,24 +17536,15 @@ snapshots: foreground-child: 3.3.1 jackspeak: 3.4.3 minimatch: 9.0.5 - minipass: 7.1.2 + minipass: 7.1.3 package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - glob@11.1.0: + glob@13.0.6: dependencies: - foreground-child: 3.3.1 - jackspeak: 4.1.1 - minimatch: 10.1.2 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 2.0.1 - - glob@13.0.1: - dependencies: - minimatch: 10.1.2 - minipass: 7.1.2 - path-scurry: 2.0.1 + minimatch: 10.2.2 + minipass: 7.1.3 + path-scurry: 2.0.2 glob@7.2.3: dependencies: @@ -17206,6 +17595,15 @@ snapshots: handle-thing@2.0.1: {} + handlebars@4.7.8: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + harmony-reflect@1.6.2: {} has-bigints@1.1.0: {} @@ -17284,7 +17682,7 @@ snapshots: readable-stream: 2.3.8 wbuf: 1.7.3 - html-dom-parser@5.1.7: + html-dom-parser@5.1.8: dependencies: domhandler: 5.0.3 htmlparser2: 10.1.0 @@ -17307,10 +17705,10 @@ snapshots: relateurl: 0.2.7 terser: 5.46.0 - html-react-parser@5.2.16(@types/react@19.2.10)(react@19.2.4): + html-react-parser@5.2.17(@types/react@19.2.10)(react@19.2.4): dependencies: domhandler: 5.0.3 - html-dom-parser: 5.1.7 + html-dom-parser: 5.1.8 react: 19.2.4 react-property: 2.0.2 style-to-js: 1.1.21 @@ -17319,7 +17717,7 @@ snapshots: html-tags@5.1.0: {} - html-webpack-plugin@5.6.6(webpack@5.105.0): + html-webpack-plugin@5.6.6(webpack@5.105.2): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -17327,7 +17725,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.3.0 optionalDependencies: - webpack: 5.105.0(webpack-cli@6.0.1) + webpack: 5.105.2(webpack-cli@6.0.1) htmlparser2@10.1.0: dependencies: @@ -17677,7 +18075,7 @@ snapshots: dependencies: is-docker: 2.2.1 - is-wsl@3.1.0: + is-wsl@3.1.1: dependencies: is-inside-container: 1.0.0 @@ -17699,7 +18097,7 @@ snapshots: '@babel/parser': 7.29.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.7.3 + semver: 7.7.4 transitivePeerDependencies: - supports-color @@ -17737,9 +18135,9 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jackspeak@4.1.1: + jackspeak@4.2.3: dependencies: - '@isaacs/cliui': 8.0.2 + '@isaacs/cliui': 9.0.0 jake@10.9.4: dependencies: @@ -17764,7 +18162,7 @@ snapshots: '@jest/expect': 30.2.0 '@jest/test-result': 30.2.0 '@jest/types': 30.2.0 - '@types/node': 22.19.8 + '@types/node': 22.19.11 chalk: 4.1.2 co: 4.6.0 dedent: 1.7.1(babel-plugin-macros@3.1.0) @@ -17784,7 +18182,7 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@30.2.0(@types/node@22.19.8)(babel-plugin-macros@3.1.0): + jest-cli@30.2.0(@types/node@22.19.11)(babel-plugin-macros@3.1.0): dependencies: '@jest/core': 30.2.0(babel-plugin-macros@3.1.0) '@jest/test-result': 30.2.0 @@ -17792,7 +18190,7 @@ snapshots: chalk: 4.1.2 exit-x: 0.2.2 import-local: 3.2.0 - jest-config: 30.2.0(@types/node@22.19.8)(babel-plugin-macros@3.1.0) + jest-config: 30.2.0(@types/node@22.19.11)(babel-plugin-macros@3.1.0) jest-util: 30.2.0 jest-validate: 30.2.0 yargs: 17.7.2 @@ -17823,7 +18221,7 @@ snapshots: - ts-node optional: true - jest-config@30.2.0(@types/node@22.19.8)(babel-plugin-macros@3.1.0): + jest-config@30.2.0(@types/node@22.19.11)(babel-plugin-macros@3.1.0): dependencies: '@babel/core': 7.29.0 '@jest/get-type': 30.1.0 @@ -17850,7 +18248,7 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 22.19.8 + '@types/node': 22.19.11 transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -17912,7 +18310,7 @@ snapshots: '@jest/environment': 30.2.0 '@jest/environment-jsdom-abstract': 30.2.0(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f)) '@types/jsdom': 21.1.7 - '@types/node': 22.19.8 + '@types/node': 22.19.11 jsdom: 26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f) transitivePeerDependencies: - bufferutil @@ -17924,7 +18322,7 @@ snapshots: '@jest/environment': 30.2.0 '@jest/fake-timers': 30.2.0 '@jest/types': 30.2.0 - '@types/node': 22.19.8 + '@types/node': 22.19.11 jest-mock: 30.2.0 jest-util: 30.2.0 jest-validate: 30.2.0 @@ -17936,7 +18334,7 @@ snapshots: jest-haste-map@30.2.0: dependencies: '@jest/types': 30.2.0 - '@types/node': 22.19.8 + '@types/node': 22.19.11 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -17975,7 +18373,7 @@ snapshots: jest-mock@30.2.0: dependencies: '@jest/types': 30.2.0 - '@types/node': 22.19.8 + '@types/node': 22.19.11 jest-util: 30.2.0 jest-pnp-resolver@1.2.3(jest-resolve@30.2.0): @@ -18011,7 +18409,7 @@ snapshots: '@jest/test-result': 30.2.0 '@jest/transform': 30.2.0 '@jest/types': 30.2.0 - '@types/node': 22.19.8 + '@types/node': 22.19.11 chalk: 4.1.2 emittery: 0.13.1 exit-x: 0.2.2 @@ -18040,7 +18438,7 @@ snapshots: '@jest/test-result': 30.2.0 '@jest/transform': 30.2.0 '@jest/types': 30.2.0 - '@types/node': 22.19.8 + '@types/node': 22.19.11 chalk: 4.1.2 cjs-module-lexer: 2.2.0 collect-v8-coverage: 1.0.3 @@ -18079,7 +18477,7 @@ snapshots: jest-message-util: 30.2.0 jest-util: 30.2.0 pretty-format: 30.2.0 - semver: 7.7.3 + semver: 7.7.4 synckit: 0.11.12 transitivePeerDependencies: - supports-color @@ -18087,7 +18485,7 @@ snapshots: jest-util@30.2.0: dependencies: '@jest/types': 30.2.0 - '@types/node': 22.19.8 + '@types/node': 22.19.11 chalk: 4.1.2 ci-info: 4.4.0 graceful-fs: 4.2.11 @@ -18106,7 +18504,7 @@ snapshots: dependencies: '@jest/test-result': 30.2.0 '@jest/types': 30.2.0 - '@types/node': 22.19.8 + '@types/node': 22.19.11 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -18115,24 +18513,24 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 22.19.8 + '@types/node': 22.19.11 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@30.2.0: dependencies: - '@types/node': 22.19.8 + '@types/node': 22.19.11 '@ungap/structured-clone': 1.3.0 jest-util: 30.2.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@30.2.0(@types/node@22.19.8)(babel-plugin-macros@3.1.0): + jest@30.2.0(@types/node@22.19.11)(babel-plugin-macros@3.1.0): dependencies: '@jest/core': 30.2.0(babel-plugin-macros@3.1.0) '@jest/types': 30.2.0 import-local: 3.2.0 - jest-cli: 30.2.0(@types/node@22.19.8)(babel-plugin-macros@3.1.0) + jest-cli: 30.2.0(@types/node@22.19.11)(babel-plugin-macros@3.1.0) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -18276,16 +18674,16 @@ snapshots: kind-of@6.0.3: {} - knip@5.83.0(@types/node@22.19.8)(typescript@5.9.3): + knip@5.83.1(@types/node@22.19.11)(typescript@5.9.3): dependencies: '@nodelib/fs.walk': 1.2.8 - '@types/node': 22.19.8 + '@types/node': 22.19.11 fast-glob: 3.3.3 formatly: 0.3.0 jiti: 2.6.1 js-yaml: 4.1.1 minimist: 1.2.8 - oxc-resolver: 11.17.0 + oxc-resolver: 11.17.1 picocolors: 1.1.1 picomatch: 4.0.3 smol-toml: 1.6.0 @@ -18333,10 +18731,6 @@ snapshots: dependencies: linkifyjs: 4.3.2 - linkify-it@4.0.1: - dependencies: - uc.micro: 1.0.6 - linkify-it@5.0.0: dependencies: uc.micro: 2.1.0 @@ -18419,7 +18813,7 @@ snapshots: ansi-escapes: 7.2.0 cli-cursor: 5.0.0 slice-ansi: 7.1.2 - strip-ansi: 7.1.2 + strip-ansi: 7.2.0 wrap-ansi: 7.0.0 loglevel@1.9.2: {} @@ -18438,7 +18832,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.2.5: {} + lru-cache@11.2.6: {} lru-cache@5.1.1: dependencies: @@ -18478,13 +18872,13 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.3 + semver: 7.7.4 makeerror@1.0.12: dependencies: tmpl: 1.0.5 - maplibre-gl@5.17.0: + maplibre-gl@5.18.0: dependencies: '@mapbox/geojson-rewind': 0.5.2 '@mapbox/jsonlint-lines-primitives': 2.0.2 @@ -18495,7 +18889,7 @@ snapshots: '@mapbox/whoots-js': 3.1.0 '@maplibre/geojson-vt': 5.0.4 '@maplibre/maplibre-gl-style-spec': 24.4.1 - '@maplibre/mlt': 1.1.5 + '@maplibre/mlt': 1.1.6 '@maplibre/vt-pbf': 4.2.1 '@types/geojson': 7946.0.16 '@types/supercluster': 7.1.3 @@ -18509,15 +18903,7 @@ snapshots: supercluster: 8.0.1 tinyqueue: 3.0.0 - markdown-it@13.0.2: - dependencies: - argparse: 2.0.1 - entities: 3.0.1 - linkify-it: 4.0.1 - mdurl: 1.0.1 - uc.micro: 1.0.6 - - markdown-it@14.1.0: + markdown-it@14.1.1: dependencies: argparse: 2.0.1 entities: 4.5.0 @@ -18534,7 +18920,7 @@ snapshots: matrix-events-sdk@0.0.1: {} - matrix-js-sdk@https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/e74eb4928e748194165b7200afe48e582bdc1fd7: + matrix-js-sdk@https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/5739b59faaf33fa55457dcaa76ffebe0506d1466: dependencies: '@babel/runtime': 7.28.6 '@matrix-org/matrix-sdk-crypto-wasm': 17.1.0 @@ -18657,11 +19043,11 @@ snapshots: min-indent@1.0.1: {} - mini-css-extract-plugin@2.10.0(webpack@5.105.0): + mini-css-extract-plugin@2.10.0(webpack@5.105.2): dependencies: schema-utils: 4.3.3 tapable: 2.3.0 - webpack: 5.105.0(webpack-cli@6.0.1) + webpack: 5.105.2(webpack-cli@6.0.1) minimalistic-assert@1.0.1: {} @@ -18675,9 +19061,9 @@ snapshots: dependencies: '@isaacs/brace-expansion': 5.0.1 - minimatch@10.1.2: + minimatch@10.2.2: dependencies: - '@isaacs/brace-expansion': 5.0.1 + brace-expansion: 5.0.2 minimatch@3.1.2: dependencies: @@ -18693,7 +19079,7 @@ snapshots: minimist@1.2.8: {} - minipass@7.1.2: {} + minipass@7.1.3: {} mkdirp-classic@0.5.3: {} @@ -18707,7 +19093,7 @@ snapshots: mlly@1.8.0: dependencies: - acorn: 8.15.0 + acorn: 8.16.0 pathe: 2.0.3 pkg-types: 1.3.1 ufo: 1.6.3 @@ -18717,11 +19103,17 @@ snapshots: doctrine: 3.0.0 file: 0.2.2 lodash: 4.17.23 - markdown-it: 13.0.2 + markdown-it: 14.1.1 mkdirp: 0.5.6 requirejs: 2.3.8 yargs: 15.4.1 + moment-timezone@0.5.48: + dependencies: + moment: 2.30.1 + + moment@2.30.1: {} + moo-color@1.0.3: dependencies: color-name: 1.1.4 @@ -18826,13 +19218,13 @@ snapshots: nwsapi@2.2.23: {} - nx@22.5.0: + nx@22.5.1: dependencies: '@napi-rs/wasm-runtime': 0.2.4 '@yarnpkg/lockfile': 1.1.0 '@yarnpkg/parsers': 3.0.2 '@zkochan/js-yaml': 0.0.7 - axios: 1.13.4 + axios: 1.13.5 cli-cursor: 3.1.0 cli-spinners: 2.6.1 cliui: 8.0.1 @@ -18854,7 +19246,7 @@ snapshots: ora: 5.3.0 picocolors: 1.1.1 resolve.exports: 2.0.3 - semver: 7.7.3 + semver: 7.7.4 string-width: 4.2.3 tar-stream: 2.2.0 tmp: 0.2.5 @@ -18865,16 +19257,16 @@ snapshots: yargs: 17.7.2 yargs-parser: 21.1.1 optionalDependencies: - '@nx/nx-darwin-arm64': 22.5.0 - '@nx/nx-darwin-x64': 22.5.0 - '@nx/nx-freebsd-x64': 22.5.0 - '@nx/nx-linux-arm-gnueabihf': 22.5.0 - '@nx/nx-linux-arm64-gnu': 22.5.0 - '@nx/nx-linux-arm64-musl': 22.5.0 - '@nx/nx-linux-x64-gnu': 22.5.0 - '@nx/nx-linux-x64-musl': 22.5.0 - '@nx/nx-win32-arm64-msvc': 22.5.0 - '@nx/nx-win32-x64-msvc': 22.5.0 + '@nx/nx-darwin-arm64': 22.5.1 + '@nx/nx-darwin-x64': 22.5.1 + '@nx/nx-freebsd-x64': 22.5.1 + '@nx/nx-linux-arm-gnueabihf': 22.5.1 + '@nx/nx-linux-arm64-gnu': 22.5.1 + '@nx/nx-linux-arm64-musl': 22.5.1 + '@nx/nx-linux-x64-gnu': 22.5.1 + '@nx/nx-linux-x64-musl': 22.5.1 + '@nx/nx-win32-arm64-msvc': 22.5.1 + '@nx/nx-win32-x64-msvc': 22.5.1 transitivePeerDependencies: - debug @@ -18996,28 +19388,28 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - oxc-resolver@11.17.0: + oxc-resolver@11.17.1: optionalDependencies: - '@oxc-resolver/binding-android-arm-eabi': 11.17.0 - '@oxc-resolver/binding-android-arm64': 11.17.0 - '@oxc-resolver/binding-darwin-arm64': 11.17.0 - '@oxc-resolver/binding-darwin-x64': 11.17.0 - '@oxc-resolver/binding-freebsd-x64': 11.17.0 - '@oxc-resolver/binding-linux-arm-gnueabihf': 11.17.0 - '@oxc-resolver/binding-linux-arm-musleabihf': 11.17.0 - '@oxc-resolver/binding-linux-arm64-gnu': 11.17.0 - '@oxc-resolver/binding-linux-arm64-musl': 11.17.0 - '@oxc-resolver/binding-linux-ppc64-gnu': 11.17.0 - '@oxc-resolver/binding-linux-riscv64-gnu': 11.17.0 - '@oxc-resolver/binding-linux-riscv64-musl': 11.17.0 - '@oxc-resolver/binding-linux-s390x-gnu': 11.17.0 - '@oxc-resolver/binding-linux-x64-gnu': 11.17.0 - '@oxc-resolver/binding-linux-x64-musl': 11.17.0 - '@oxc-resolver/binding-openharmony-arm64': 11.17.0 - '@oxc-resolver/binding-wasm32-wasi': 11.17.0 - '@oxc-resolver/binding-win32-arm64-msvc': 11.17.0 - '@oxc-resolver/binding-win32-ia32-msvc': 11.17.0 - '@oxc-resolver/binding-win32-x64-msvc': 11.17.0 + '@oxc-resolver/binding-android-arm-eabi': 11.17.1 + '@oxc-resolver/binding-android-arm64': 11.17.1 + '@oxc-resolver/binding-darwin-arm64': 11.17.1 + '@oxc-resolver/binding-darwin-x64': 11.17.1 + '@oxc-resolver/binding-freebsd-x64': 11.17.1 + '@oxc-resolver/binding-linux-arm-gnueabihf': 11.17.1 + '@oxc-resolver/binding-linux-arm-musleabihf': 11.17.1 + '@oxc-resolver/binding-linux-arm64-gnu': 11.17.1 + '@oxc-resolver/binding-linux-arm64-musl': 11.17.1 + '@oxc-resolver/binding-linux-ppc64-gnu': 11.17.1 + '@oxc-resolver/binding-linux-riscv64-gnu': 11.17.1 + '@oxc-resolver/binding-linux-riscv64-musl': 11.17.1 + '@oxc-resolver/binding-linux-s390x-gnu': 11.17.1 + '@oxc-resolver/binding-linux-x64-gnu': 11.17.1 + '@oxc-resolver/binding-linux-x64-musl': 11.17.1 + '@oxc-resolver/binding-openharmony-arm64': 11.17.1 + '@oxc-resolver/binding-wasm32-wasi': 11.17.1 + '@oxc-resolver/binding-win32-arm64-msvc': 11.17.1 + '@oxc-resolver/binding-win32-ia32-msvc': 11.17.1 + '@oxc-resolver/binding-win32-x64-msvc': 11.17.1 p-limit@2.3.0: dependencies: @@ -19107,12 +19499,12 @@ snapshots: path-scurry@1.11.1: dependencies: lru-cache: 10.4.3 - minipass: 7.1.2 + minipass: 7.1.3 - path-scurry@2.0.1: + path-scurry@2.0.2: dependencies: - lru-cache: 11.2.5 - minipass: 7.1.2 + lru-cache: 11.2.6 + minipass: 7.1.3 path-to-regexp@0.1.12: {} @@ -19184,11 +19576,11 @@ snapshots: pvutils: 1.1.5 tslib: 2.8.1 - playwright-core@1.58.1: {} + playwright-core@1.58.2: {} - playwright@1.58.1: + playwright@1.58.2: dependencies: - playwright-core: 1.58.1 + playwright-core: 1.58.2 optionalDependencies: fsevents: 2.3.2 @@ -19366,14 +19758,14 @@ snapshots: '@csstools/utilities': 3.0.0(postcss@8.5.6) postcss: 8.5.6 - postcss-loader@8.2.0(postcss@8.5.6)(typescript@5.9.3)(webpack@5.105.0): + postcss-loader@8.2.0(postcss@8.5.6)(typescript@5.9.3)(webpack@5.105.2): dependencies: cosmiconfig: 9.0.0(typescript@5.9.3) jiti: 2.6.1 postcss: 8.5.6 - semver: 7.7.3 + semver: 7.7.4 optionalDependencies: - webpack: 5.105.0(webpack-cli@6.0.1) + webpack: 5.105.2(webpack-cli@6.0.1) transitivePeerDependencies: - typescript @@ -19672,15 +20064,15 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - posthog-js@1.336.4: + posthog-js@1.347.2: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/api-logs': 0.208.0 '@opentelemetry/exporter-logs-otlp-http': 0.208.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.5.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-logs': 0.208.0(@opentelemetry/api@1.9.0) - '@posthog/core': 1.17.0 - '@posthog/types': 1.336.4 + '@posthog/core': 1.22.0 + '@posthog/types': 1.347.2 core-js: 3.48.0 dompurify: 3.3.1 fflate: 0.4.8 @@ -19733,6 +20125,8 @@ snapshots: retry: 0.12.0 signal-exit: 3.0.7 + properties-file@3.6.4: {} + properties-reader@2.3.0: dependencies: mkdirp: 1.0.4 @@ -19749,7 +20143,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 22.19.8 + '@types/node': 22.19.11 long: 5.3.2 protocol-buffers-schema@3.6.0: {} @@ -19799,7 +20193,7 @@ snapshots: pngjs: 5.0.0 yargs: 15.4.1 - qs@6.14.1: + qs@6.14.2: dependencies: side-channel: 1.1.0 @@ -19840,11 +20234,11 @@ snapshots: iconv-lite: 0.7.2 unpipe: 1.0.0 - raw-loader@4.0.2(webpack@5.105.0): + raw-loader@4.0.2(webpack@5.105.2): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.105.0(webpack-cli@6.0.1) + webpack: 5.105.2(webpack-cli@6.0.1) re-resizable@6.11.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: @@ -20182,7 +20576,7 @@ snapshots: rimraf@6.1.2: dependencies: - glob: 13.0.1 + glob: 13.0.6 package-json-from-dist: 1.0.1 ripemd160@2.0.3: @@ -20300,9 +20694,9 @@ snapshots: schema-utils@4.3.3: dependencies: '@types/json-schema': 7.0.15 - ajv: 8.17.1 - ajv-formats: 2.1.1(ajv@8.17.1) - ajv-keywords: 5.1.0(ajv@8.17.1) + ajv: 8.18.0 + ajv-formats: 2.1.1(ajv@8.18.0) + ajv-keywords: 5.1.0(ajv@8.18.0) sdp-transform@3.0.0: {} @@ -20323,7 +20717,7 @@ snapshots: dependencies: lru-cache: 6.0.0 - semver@7.7.3: {} + semver@7.7.4: {} send@0.19.2: dependencies: @@ -20509,11 +20903,11 @@ snapshots: source-map-js@1.2.1: {} - source-map-loader@5.0.0(webpack@5.105.0): + source-map-loader@5.0.0(webpack@5.105.2): dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.105.0(webpack-cli@6.0.1) + webpack: 5.105.2(webpack-cli@6.0.1) source-map-support@0.5.13: dependencies: @@ -20603,16 +20997,16 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 - storybook-addon-vis@3.1.2(@storybook/addon-vitest@10.2.5(@vitest/browser-playwright@4.0.18)(@vitest/browser@4.0.18(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18))(@vitest/runner@4.0.18)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vitest@4.0.18))(@vitest/browser-playwright@4.0.18)(@vitest/browser@4.0.18(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18))(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vitest@4.0.18): + storybook-addon-vis@3.1.2(@storybook/addon-vitest@10.2.9(@vitest/browser-playwright@4.0.18)(@vitest/browser@4.0.18(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18))(@vitest/runner@4.0.18)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vitest@4.0.18))(@vitest/browser-playwright@4.0.18)(@vitest/browser@4.0.18(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18))(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vitest@4.0.18): dependencies: - '@storybook/addon-vitest': 10.2.5(@vitest/browser-playwright@4.0.18)(@vitest/browser@4.0.18(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18))(@vitest/runner@4.0.18)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vitest@4.0.18) + '@storybook/addon-vitest': 10.2.9(@vitest/browser-playwright@4.0.18)(@vitest/browser@4.0.18(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18))(@vitest/runner@4.0.18)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vitest@4.0.18) '@storybook/icons': 2.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@vitest/browser': 4.0.18(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18) - glob: 13.0.1 + glob: 13.0.6 is-ci: 4.1.0 memoize: 10.2.0 pathe: 2.0.3 - storybook: 10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + storybook: 10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) type-plus: 8.0.0-beta.7 vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.13)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.6.1)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) vitest-plugin-vis: 4.1.0(@vitest/browser-playwright@4.0.18)(@vitest/browser@4.0.18(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18))(babel-plugin-macros@3.1.0)(vitest@4.0.18) @@ -20623,7 +21017,7 @@ snapshots: - react - react-dom - storybook@10.2.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + storybook@10.2.10(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: '@storybook/global': 5.0.0 '@storybook/icons': 2.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -20631,10 +21025,10 @@ snapshots: '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) '@vitest/expect': 3.2.4 '@vitest/spy': 3.2.4 - esbuild: 0.27.2 + esbuild: 0.27.3 open: 10.2.0 recast: 0.23.11 - semver: 7.7.3 + semver: 7.7.4 use-sync-external-store: 1.6.0(react@19.2.4) ws: 8.19.0 optionalDependencies: @@ -20684,12 +21078,12 @@ snapshots: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 - strip-ansi: 7.1.2 + strip-ansi: 7.2.0 string-width@8.1.1: dependencies: get-east-asian-width: 1.4.0 - strip-ansi: 7.1.2 + strip-ansi: 7.2.0 string.prototype.includes@2.0.1: dependencies: @@ -20753,7 +21147,7 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.2: + strip-ansi@7.2.0: dependencies: ansi-regex: 6.2.2 @@ -20787,16 +21181,16 @@ snapshots: postcss: 8.5.6 postcss-selector-parser: 7.1.1 - stylelint-config-recommended@18.0.0(stylelint@17.1.1(typescript@5.9.3)): + stylelint-config-recommended@18.0.0(stylelint@17.3.0(typescript@5.9.3)): dependencies: - stylelint: 17.1.1(typescript@5.9.3) + stylelint: 17.3.0(typescript@5.9.3) - stylelint-config-standard@40.0.0(stylelint@17.1.1(typescript@5.9.3)): + stylelint-config-standard@40.0.0(stylelint@17.3.0(typescript@5.9.3)): dependencies: - stylelint: 17.1.1(typescript@5.9.3) - stylelint-config-recommended: 18.0.0(stylelint@17.1.1(typescript@5.9.3)) + stylelint: 17.3.0(typescript@5.9.3) + stylelint-config-recommended: 18.0.0(stylelint@17.3.0(typescript@5.9.3)) - stylelint-scss@7.0.0(stylelint@17.1.1(typescript@5.9.3)): + stylelint-scss@7.0.0(stylelint@17.3.0(typescript@5.9.3)): dependencies: css-tree: 3.1.0 is-plain-object: 5.0.0 @@ -20806,18 +21200,19 @@ snapshots: postcss-resolve-nested-selector: 0.1.6 postcss-selector-parser: 7.1.1 postcss-value-parser: 4.2.0 - stylelint: 17.1.1(typescript@5.9.3) + stylelint: 17.3.0(typescript@5.9.3) - stylelint-value-no-unknown-custom-properties@6.1.1(stylelint@17.1.1(typescript@5.9.3)): + stylelint-value-no-unknown-custom-properties@6.1.1(stylelint@17.3.0(typescript@5.9.3)): dependencies: postcss-value-parser: 4.2.0 resolve: 1.22.11 - stylelint: 17.1.1(typescript@5.9.3) + stylelint: 17.3.0(typescript@5.9.3) - stylelint@17.1.1(typescript@5.9.3): + stylelint@17.3.0(typescript@5.9.3): dependencies: + '@csstools/css-calc': 3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-syntax-patches-for-csstree': 1.0.26 + '@csstools/css-syntax-patches-for-csstree': 1.0.27 '@csstools/css-tokenizer': 4.0.0 '@csstools/media-query-list-parser': 5.0.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) '@csstools/selector-resolve-nested': 4.0.0(postcss-selector-parser@7.1.1) @@ -20825,7 +21220,7 @@ snapshots: balanced-match: 3.0.1 colord: 2.9.3 cosmiconfig: 9.0.0(typescript@5.9.3) - css-functions-list: 3.2.3 + css-functions-list: 3.3.3 css-tree: 3.1.0 debug: 4.4.3 fast-glob: 3.3.3 @@ -20923,7 +21318,7 @@ snapshots: table@6.9.0: dependencies: - ajv: 8.17.1 + ajv: 8.18.0 lodash.truncate: 4.4.2 slice-ansi: 4.0.0 string-width: 4.2.3 @@ -20975,37 +21370,37 @@ snapshots: temporal-spec@0.3.0: {} - terser-webpack-plugin@5.3.16(esbuild@0.27.2)(webpack@5.105.0(esbuild@0.27.2)(webpack-cli@6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.0))): + terser-webpack-plugin@5.3.16(esbuild@0.27.3)(webpack@5.105.2(esbuild@0.27.3)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 6.0.2 terser: 5.46.0 - webpack: 5.105.0(esbuild@0.27.2)(webpack-cli@6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.0)) + webpack: 5.105.2(esbuild@0.27.3) optionalDependencies: - esbuild: 0.27.2 + esbuild: 0.27.3 optional: true - terser-webpack-plugin@5.3.16(webpack@5.105.0): + terser-webpack-plugin@5.3.16(webpack@5.105.2): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 6.0.2 terser: 5.46.0 - webpack: 5.105.0(webpack-cli@6.0.1) + webpack: 5.105.2(webpack-cli@6.0.1) terser@5.46.0: dependencies: '@jridgewell/source-map': 0.3.11 - acorn: 8.15.0 + acorn: 8.16.0 commander: 2.20.3 source-map-support: 0.5.21 tersify@3.12.1: dependencies: - acorn: 8.15.0 + acorn: 8.16.0 is-buffer: 2.0.5 unpartial: 1.0.5 @@ -21148,7 +21543,7 @@ snapshots: tsx@4.21.0: dependencies: - esbuild: 0.27.2 + esbuild: 0.27.3 get-tsconfig: 4.13.6 optionalDependencies: fsevents: 2.3.3 @@ -21160,6 +21555,8 @@ snapshots: tty-browserify@0.0.1: {} + tunnel@0.0.6: {} + tweetnacl@0.14.5: {} type-check@0.4.0: @@ -21237,7 +21634,7 @@ snapshots: dependencies: '@gerrit0/mini-shiki': 3.22.0 lunr: 2.3.9 - markdown-it: 14.1.0 + markdown-it: 14.1.1 minimatch: 9.0.5 typescript: 5.9.3 yaml: 2.8.2 @@ -21248,12 +21645,13 @@ snapshots: ua-parser-js@1.0.40: {} - uc.micro@1.0.6: {} - uc.micro@2.1.0: {} ufo@1.6.3: {} + uglify-js@3.19.3: + optional: true + unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 @@ -21270,6 +21668,10 @@ snapshots: undici-types@7.16.0: optional: true + undici@5.29.0: + dependencies: + '@fastify/busboy': 2.1.1 + undici@7.20.0: {} unhomoglyph@1.0.6: {} @@ -21287,6 +21689,8 @@ snapshots: unicorn-magic@0.4.0: {} + universal-user-agent@6.0.1: {} + universalify@2.0.1: {} unpartial@1.0.5: {} @@ -21295,15 +21699,15 @@ snapshots: unplugin@1.0.1: dependencies: - acorn: 8.15.0 + acorn: 8.16.0 chokidar: 3.6.0 - webpack-sources: 3.3.3 + webpack-sources: 3.3.4 webpack-virtual-modules: 0.5.0 unplugin@2.3.11: dependencies: '@jridgewell/remapping': 2.3.5 - acorn: 8.15.0 + acorn: 8.16.0 picomatch: 4.0.3 webpack-virtual-modules: 0.6.2 @@ -21344,7 +21748,7 @@ snapshots: url@0.11.4: dependencies: punycode: 1.4.1 - qs: 6.14.1 + qs: 6.14.2 use-callback-ref@1.3.3(@types/react@19.2.10)(react@19.2.4): dependencies: @@ -21444,7 +21848,7 @@ snapshots: vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2): dependencies: - esbuild: 0.27.2 + esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 @@ -21472,7 +21876,7 @@ snapshots: dependencies: '@vitest/browser': 4.0.18(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18) dedent: 1.7.1(babel-plugin-macros@3.1.0) - glob: 13.0.1 + glob: 13.0.6 is-ci: 4.1.0 mkdirp: 3.0.1 pathe: 2.0.3 @@ -21483,7 +21887,7 @@ snapshots: type-plus: 8.0.0-beta.7 vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.13)(@vitest/browser-playwright@4.0.18)(@vitest/ui@4.0.18)(jiti@2.6.1)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) optionalDependencies: - '@vitest/browser-playwright': 4.0.18(playwright@1.58.1)(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18) + '@vitest/browser-playwright': 4.0.18(playwright@1.58.2)(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18) transitivePeerDependencies: - babel-plugin-macros @@ -21516,7 +21920,7 @@ snapshots: optionalDependencies: '@opentelemetry/api': 1.9.0 '@types/node': 24.10.13 - '@vitest/browser-playwright': 4.0.18(playwright@1.58.1)(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18) + '@vitest/browser-playwright': 4.0.18(playwright@1.58.2)(vite@7.3.1(@types/node@24.10.13)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))(vitest@4.0.18) '@vitest/ui': 4.0.18(vitest@4.0.18) jsdom: 26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f) transitivePeerDependencies: @@ -21592,7 +21996,7 @@ snapshots: webpack-bundle-analyzer@5.2.0: dependencies: '@discoveryjs/json-ext': 0.5.7 - acorn: 8.15.0 + acorn: 8.16.0 acorn-walk: 8.3.4 commander: 7.2.0 debounce: 1.2.1 @@ -21606,12 +22010,12 @@ snapshots: - bufferutil - utf-8-validate - webpack-cli@6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.0): + webpack-cli@6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.2): dependencies: '@discoveryjs/json-ext': 0.6.3 - '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.105.0) - '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.105.0) - '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack@5.105.0) + '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.105.2) + '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.105.2) + '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack@5.105.2) colorette: 2.0.20 commander: 12.1.0 cross-spawn: 7.0.6 @@ -21620,13 +22024,13 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.105.0(webpack-cli@6.0.1) + webpack: 5.105.2(webpack-cli@6.0.1) webpack-merge: 6.0.1 optionalDependencies: webpack-bundle-analyzer: 5.2.0 - webpack-dev-server: 5.2.3(tslib@2.8.1)(webpack-cli@6.0.1)(webpack@5.105.0) + webpack-dev-server: 5.2.3(tslib@2.8.1)(webpack-cli@6.0.1)(webpack@5.105.2) - webpack-dev-middleware@7.4.5(tslib@2.8.1)(webpack@5.105.0): + webpack-dev-middleware@7.4.5(tslib@2.8.1)(webpack@5.105.2): dependencies: colorette: 2.0.20 memfs: 4.56.10(tslib@2.8.1) @@ -21635,11 +22039,11 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.105.0(webpack-cli@6.0.1) + webpack: 5.105.2(webpack-cli@6.0.1) transitivePeerDependencies: - tslib - webpack-dev-server@5.2.3(tslib@2.8.1)(webpack-cli@6.0.1)(webpack@5.105.0): + webpack-dev-server@5.2.3(tslib@2.8.1)(webpack-cli@6.0.1)(webpack@5.105.2): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -21667,11 +22071,11 @@ snapshots: serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.105.0) + webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.105.2) ws: 8.19.0 optionalDependencies: - webpack: 5.105.0(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.0) + webpack: 5.105.2(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.2) transitivePeerDependencies: - bufferutil - debug @@ -21685,25 +22089,25 @@ snapshots: flat: 5.0.2 wildcard: 2.0.1 - webpack-retry-chunk-load-plugin@3.1.1(webpack@5.105.0): + webpack-retry-chunk-load-plugin@3.1.1(webpack@5.105.2): dependencies: prettier: 2.8.8 - webpack: 5.105.0(webpack-cli@6.0.1) + webpack: 5.105.2(webpack-cli@6.0.1) - webpack-sources@3.3.3: {} + webpack-sources@3.3.4: {} - webpack-version-file-plugin@0.5.0(webpack@5.105.0): + webpack-version-file-plugin@0.5.0(webpack@5.105.2): dependencies: ejs: 3.1.10 fs: 0.0.1-security underscore: 1.13.7 - webpack: 5.105.0(webpack-cli@6.0.1) + webpack: 5.105.2(webpack-cli@6.0.1) webpack-virtual-modules@0.5.0: {} webpack-virtual-modules@0.6.2: {} - webpack@5.105.0(esbuild@0.27.2)(webpack-cli@6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.0)): + webpack@5.105.2(esbuild@0.27.3): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -21711,8 +22115,8 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.15.0 - acorn-import-phases: 1.0.4(acorn@8.15.0) + acorn: 8.16.0 + acorn-import-phases: 1.0.4(acorn@8.16.0) browserslist: 4.28.1 chrome-trace-event: 1.0.4 enhanced-resolve: 5.19.0 @@ -21727,18 +22131,16 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(esbuild@0.27.2)(webpack@5.105.0(esbuild@0.27.2)(webpack-cli@6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.0))) + terser-webpack-plugin: 5.3.16(esbuild@0.27.3)(webpack@5.105.2(esbuild@0.27.3)) watchpack: 2.5.1 - webpack-sources: 3.3.3 - optionalDependencies: - webpack-cli: 6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.0) + webpack-sources: 3.3.4 transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js optional: true - webpack@5.105.0(webpack-cli@6.0.1): + webpack@5.105.2(webpack-cli@6.0.1): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -21746,8 +22148,8 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.15.0 - acorn-import-phases: 1.0.4(acorn@8.15.0) + acorn: 8.16.0 + acorn-import-phases: 1.0.4(acorn@8.16.0) browserslist: 4.28.1 chrome-trace-event: 1.0.4 enhanced-resolve: 5.19.0 @@ -21762,11 +22164,11 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(webpack@5.105.0) + terser-webpack-plugin: 5.3.16(webpack@5.105.2) watchpack: 2.5.1 - webpack-sources: 3.3.3 + webpack-sources: 3.3.4 optionalDependencies: - webpack-cli: 6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.0) + webpack-cli: 6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.3)(webpack@5.105.2) transitivePeerDependencies: - '@swc/core' - esbuild @@ -21858,6 +22260,8 @@ snapshots: word-wrap@1.2.5: {} + wordwrap@1.0.0: {} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -21880,7 +22284,7 @@ snapshots: wsl-utils@0.1.0: dependencies: - is-wsl: 3.1.0 + is-wsl: 3.1.1 xml-name-validator@5.0.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index ba9482d91d..6bfe3e5ef0 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,7 +1,7 @@ nodeLinker: hoisted linkWorkspacePackages: true packages: - - "." + - "apps/*" - "packages/*" cleanupUnusedCatalogs: true catalog: @@ -14,14 +14,16 @@ catalog: "@types/react-dom": ^19.2.3 # playwright "@element-hq/element-web-playwright-common": 2.2.7 - "@playwright/test": 1.58.1 + "@playwright/test": 1.58.2 # Module API - "@element-hq/element-web-module-api": 1.9.0 + "@element-hq/element-web-module-api": 1.9.1 # Compound - "@vector-im/compound-design-tokens": 6.9.0 + "@vector-im/compound-design-tokens": 6.10.0 "@vector-im/compound-web": 8.3.6 # i18n matrix-web-i18n: 3.6.0 + # fonts + "@fontsource/inter": 5.2.8 packageExtensions: fdir: dependencies: diff --git a/res/css/views/elements/_SSOButtons.pcss b/res/css/views/elements/_SSOButtons.pcss deleted file mode 100644 index 7b4d2c973f..0000000000 --- a/res/css/views/elements/_SSOButtons.pcss +++ /dev/null @@ -1,69 +0,0 @@ -/* -Copyright 2024 New Vector Ltd. -Copyright 2020 The Matrix.org Foundation C.I.C. - -SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial -Please see LICENSE files in the repository root for full details. -*/ - -.mx_SSOButtons { - display: flex; - flex-wrap: wrap; - justify-content: center; - - .mx_SSOButtons_row { - & + .mx_SSOButtons_row { - margin-top: 16px; - } - } - - .mx_SSOButton { - position: relative; - width: 100%; - padding: 7px 32px; - text-align: center; - border-radius: 8px; - display: inline-block; - font: var(--cpd-font-body-md-semibold); - border: 1px solid $input-border-color; - color: $primary-content; - - > img { - object-fit: contain; - position: absolute; - left: 8px; - top: 4px; - } - } - - .mx_SSOButton:hover { - background-color: $panel-actions; - } - - .mx_SSOButton_default { - color: $accent; - background-color: $button-secondary-bg-color; - border-color: $accent; - } - .mx_SSOButton_default.mx_SSOButton_primary { - color: $button-primary-fg-color; - background-color: $accent; - } - - .mx_SSOButton_mini { - box-sizing: border-box; - width: 50px; /* 48px + 1px border on all sides */ - height: 50px; /* 48px + 1px border on all sides */ - min-width: 50px; /* prevent crushing by the flexbox */ - padding: 12px; - - > img { - left: 12px; - top: 12px; - } - - & + .mx_SSOButton_mini { - margin-left: 16px; - } - } -} diff --git a/res/css/views/messages/_MessageTimestamp.pcss b/res/css/views/messages/_MessageTimestamp.pcss deleted file mode 100644 index d5dda3272d..0000000000 --- a/res/css/views/messages/_MessageTimestamp.pcss +++ /dev/null @@ -1,32 +0,0 @@ -/* -Copyright 2024 New Vector Ltd. -Copyright 2015, 2016 OpenMarket Ltd - -SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial -Please see LICENSE files in the repository root for full details. -*/ - -:root { - --MessageTimestamp-width: 46px; /* 8 + 30 (avatar) + 8 */ - --MessageTimestamp-max-width: 80px; - --MessageTimestamp-color: $event-timestamp-color; -} - -.mx_MessageTimestamp { - color: var(--MessageTimestamp-color) !important; /* override anchor color */ - font-size: $font-10px; - font-variant-numeric: tabular-nums; - display: block; /* enable the width setting below */ - width: var(--MessageTimestamp-width); - white-space: nowrap; - user-select: none; - text-decoration: none; -} - -.mx_MessageTimestamp_lateIcon { - position: absolute; - right: 100%; - top: 50%; - transform: translateY(-50%); - color: inherit; -} diff --git a/res/css/views/messages/_ReactionsRowButton.pcss b/res/css/views/messages/_ReactionsRowButton.pcss deleted file mode 100644 index 917bcfbb84..0000000000 --- a/res/css/views/messages/_ReactionsRowButton.pcss +++ /dev/null @@ -1,34 +0,0 @@ -/* -Copyright 2019-2024 New Vector Ltd. - -SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial -Please see LICENSE files in the repository root for full details. -*/ - -.mx_ReactionsRowButton { - display: inline-flex; - line-height: $font-20px; - padding: 1px 6px; - border: 1px solid var(--cpd-color-gray-400); - border-radius: 10px; - background-color: var(--cpd-color-gray-200); - user-select: none; - align-items: center; - - &.mx_ReactionsRowButton_selected { - background-color: $accent-300; - border-color: $accent-800; - } - - &.mx_AccessibleButton_disabled { - cursor: not-allowed; - } - - .mx_ReactionsRowButton_content { - max-width: 100px; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - padding-right: 4px; - } -} diff --git a/scripts/docker-package.sh b/scripts/docker-package.sh index 00a7381bd7..b9b6b6c284 100755 --- a/scripts/docker-package.sh +++ b/scripts/docker-package.sh @@ -18,4 +18,4 @@ fi DIST_VERSION=$("$DIR"/normalize-version.sh "$DIST_VERSION") -VERSION=$DIST_VERSION pnpm build +VERSION=$DIST_VERSION pnpm --dir apps/web build diff --git a/scripts/get-version-from-git.sh b/scripts/get-version-from-git.sh index 90de770478..7b2e594307 100755 --- a/scripts/get-version-from-git.sh +++ b/scripts/get-version-from-git.sh @@ -6,6 +6,6 @@ set -e # Since the deps are fetched from git & linked, we can rev-parse -JSSDK_SHA=$(git -C node_modules/matrix-js-sdk rev-parse --short=12 HEAD) +JSSDK_SHA=$(git -C $(pnpm -w root)/matrix-js-sdk rev-parse --short=12 HEAD) VECTOR_SHA=$(git rev-parse --short=12 HEAD) # use the ACTUAL SHA rather than assume develop echo "$VECTOR_SHA-js-$JSSDK_SHA" diff --git a/scripts/layered.sh b/scripts/layered.sh index cee172e6cf..6e5c91be29 100755 --- a/scripts/layered.sh +++ b/scripts/layered.sh @@ -20,27 +20,21 @@ pnpm install --frozen-lockfile export PR_ORG=element-hq export PR_REPO=element-web -# Set up the js-sdk first -scripts/fetchdep.sh matrix-org matrix-js-sdk develop -pushd matrix-js-sdk -[ -n "$JS_SDK_GITHUB_BASE_REF" ] && git fetch --depth 1 origin $JS_SDK_GITHUB_BASE_REF && git checkout $JS_SDK_GITHUB_BASE_REF -pnpm link -pnpm install --frozen-lockfile -popd +js_sdk_dep=$(jq -r '.dependencies["matrix-js-sdk"]' < $(pnpm -w root)/../apps/web/package.json) -# Also set up matrix-analytics-events for branch with matching name -scripts/fetchdep.sh matrix-org matrix-analytics-events -# We don't pass a default branch so cloning may fail when we are not in a PR -# This is expected as this project does not share a release cycle but we still branch match it -if [ -d matrix-analytics-events ]; then - pushd matrix-analytics-events +# Set up the js-sdk first (unless package.json pins a specific version) +if [ "$js_sdk_dep" = "github:matrix-org/matrix-js-sdk#develop" ]; then + scripts/fetchdep.sh matrix-org matrix-js-sdk develop + pushd matrix-js-sdk + [ -n "$JS_SDK_GITHUB_BASE_REF" ] && git fetch --depth 1 origin $JS_SDK_GITHUB_BASE_REF && git checkout $JS_SDK_GITHUB_BASE_REF pnpm link pnpm install --frozen-lockfile - pnpm build:ts popd + + # Link into into element-web + pnpm link matrix-js-sdk +else + echo "Skipping matrix-js-sdk fetch and link as package.json pins $js_sdk_dep" fi -# Link the layers into element-web -pnpm link matrix-js-sdk -[ -d matrix-analytics-events ] && pnpm link @matrix-org/analytics-events pnpm install --frozen-lockfile $@ diff --git a/scripts/pnpm-link.ts b/scripts/pnpm-link.ts index 5aac78f2cb..d26875622f 100755 --- a/scripts/pnpm-link.ts +++ b/scripts/pnpm-link.ts @@ -27,6 +27,7 @@ try { const configFile = await fs.readFile(configPath, "utf-8"); for (const line of configFile.trim().split("\n")) { + if (!line || line.startsWith("#")) continue; const [dependency, path] = line.split("="); const dependencyPath = join(nodeModulesPath, dependency); diff --git a/sonar-project.properties b/sonar-project.properties index 26970ca7f4..cb41f78e4e 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -4,23 +4,23 @@ sonar.organization=element-hq # Encoding of the source code. Default is default system encoding #sonar.sourceEncoding=UTF-8 -sonar.sources=src,res,packages/shared-components/src -sonar.tests=test,playwright,src,packages -sonar.test.inclusions=test/*,playwright/*,src/**/*.test.*,packages/*/src/**/*.test.*,packages/*/src/test/**/* -sonar.exclusions=__mocks__,docs,element.io,nginx,src/vector/modernizr.cjs +sonar.sources=apps/web/src,apps/web/res,packages/shared-components/src +sonar.tests=apps/web/test,apps/web/playwright,packages +sonar.test.inclusions=apps/web/test/*,apps/web/playwright/*,packages/*/src/**/*.test.*,packages/*/src/test/**/* +sonar.exclusions=apps/web/__mocks__,docs,apps/web/element.io,apps/web/nginx,apps/web/src/vector/modernizr.cjs -sonar.cpd.exclusions=src/i18n/strings/*.json -sonar.typescript.tsconfigPath=./tsconfig.json -sonar.javascript.lcov.reportPaths=coverage/lcov.info,packages/shared-components/coverage/lcov.info +sonar.cpd.exclusions=apps/web/src/i18n/strings/*.json,packages/*/src/i18n/strings/*.json +sonar.javascript.lcov.reportPaths=apps/web/coverage/lcov.info,packages/shared-components/coverage/lcov.info sonar.coverage.exclusions=\ - test/**/*,\ - playwright/**/*,\ - res/**/*,\ + apps/web/test/**/*,\ + apps/web/playwright/**/*,\ + apps/web/res/**/*,\ + apps/web/scripts/**/*,\ scripts/**/*,\ - src/components/views/dialogs/devtools/**/*,\ - src/utils/SessionLock.ts,\ - src/**/*.d.ts,\ - src/vector/mobile_guide/**/*,\ + apps/web/src/components/views/dialogs/devtools/**/*,\ + apps/web/src/utils/SessionLock.ts,\ + apps/web/src/**/*.d.ts,\ + apps/web/src/vector/mobile_guide/**/*,\ packages/shared-components/src/test/**/*,\ packages/shared-components/src/**/*.stories.tsx -sonar.testExecutionReportPaths=coverage/jest-sonar-report.xml +sonar.testExecutionReportPaths=apps/web/coverage/jest-sonar-report.xml diff --git a/src/components/views/elements/RoomName.tsx b/src/components/views/elements/RoomName.tsx deleted file mode 100644 index 1ff0fc628e..0000000000 --- a/src/components/views/elements/RoomName.tsx +++ /dev/null @@ -1,35 +0,0 @@ -/* -Copyright 2024 New Vector Ltd. -Copyright 2021 The Matrix.org Foundation C.I.C. - -SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial -Please see LICENSE files in the repository root for full details. -*/ - -import React, { type JSX, useEffect, useState } from "react"; -import { type Room, RoomEvent } from "matrix-js-sdk/src/matrix"; - -import { useTypedEventEmitter } from "../../../hooks/useEventEmitter"; - -interface IProps { - room?: Room; - children?(name: string): JSX.Element; -} - -/** - * @deprecated use `useRoomName.ts` instead - */ -const RoomName = ({ room, children }: IProps): JSX.Element => { - const [name, setName] = useState(room?.name); - useTypedEventEmitter(room, RoomEvent.Name, () => { - setName(room?.name); - }); - useEffect(() => { - setName(room?.name); - }, [room]); - - if (children) return children(name ?? ""); - return <>{name || ""}; -}; - -export default RoomName; diff --git a/src/components/views/messages/EncryptionEvent.tsx b/src/components/views/messages/EncryptionEvent.tsx deleted file mode 100644 index a8467e0519..0000000000 --- a/src/components/views/messages/EncryptionEvent.tsx +++ /dev/null @@ -1,98 +0,0 @@ -/* -Copyright 2024 New Vector Ltd. -Copyright 2020 The Matrix.org Foundation C.I.C. - -SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial -Please see LICENSE files in the repository root for full details. -*/ - -import React, { type JSX, type ReactNode } from "react"; -import { type MatrixEvent } from "matrix-js-sdk/src/matrix"; -import { ErrorSolidIcon, LockSolidIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; -import { EventTileBubble } from "@element-hq/web-shared-components"; - -import type { RoomEncryptionEventContent } from "matrix-js-sdk/src/types"; -import { _t } from "../../../languageHandler"; -import { useMatrixClientContext } from "../../../contexts/MatrixClientContext"; -import DMRoomMap from "../../../utils/DMRoomMap"; -import { objectHasDiff } from "../../../utils/objects"; -import { isLocalRoom } from "../../../utils/localRoom/isLocalRoom"; -import { MEGOLM_ENCRYPTION_ALGORITHM } from "../../../utils/crypto"; -import { useIsEncrypted } from "../../../hooks/useIsEncrypted.ts"; - -interface IProps { - mxEvent: MatrixEvent; - timestamp?: JSX.Element; - ref?: React.RefObject; -} - -const EncryptionEvent = ({ mxEvent, timestamp, ref }: IProps): ReactNode => { - const cli = useMatrixClientContext(); - const roomId = mxEvent.getRoomId()!; - const isRoomEncrypted = useIsEncrypted(cli, cli.getRoom(roomId) || undefined); - - const prevContent = mxEvent.getPrevContent() as RoomEncryptionEventContent; - const content = mxEvent.getContent(); - - // if no change happened then skip rendering this, a shallow check is enough as all known fields are top-level. - if (!objectHasDiff(prevContent, content)) return null; // nop - - if (content.algorithm === MEGOLM_ENCRYPTION_ALGORITHM && isRoomEncrypted) { - let subtitle: string; - const dmPartner = DMRoomMap.shared().getUserIdForRoomId(roomId); - const room = cli?.getRoom(roomId); - - const stateEncrypted = content["io.element.msc4362.encrypt_state_events"] && cli.enableEncryptedStateEvents; - - if (prevContent.algorithm === MEGOLM_ENCRYPTION_ALGORITHM) { - subtitle = _t("timeline|m.room.encryption|parameters_changed"); - } else if (dmPartner) { - const displayName = room?.getMember(dmPartner)?.rawDisplayName || dmPartner; - subtitle = _t("timeline|m.room.encryption|enabled_dm", { displayName }); - } else if (room && isLocalRoom(room)) { - subtitle = _t("timeline|m.room.encryption|enabled_local"); - } else if (stateEncrypted) { - subtitle = _t("timeline|m.room.encryption|state_enabled"); - } else { - subtitle = _t("timeline|m.room.encryption|enabled"); - } - - return ( - } - className="mx_EventTileBubble mx_cryptoEvent mx_cryptoEvent_icon" - title={stateEncrypted ? _t("common|state_encryption_enabled") : _t("common|encryption_enabled")} - subtitle={subtitle} - > - {timestamp} - - ); - } - - if (isRoomEncrypted) { - return ( - } - className="mx_EventTileBubble mx_cryptoEvent mx_cryptoEvent_icon" - title={_t("common|encryption_enabled")} - subtitle={_t("timeline|m.room.encryption|disable_attempt")} - > - {timestamp} - - ); - } - - return ( - } - className="mx_EventTileBubble mx_cryptoEvent" - title={_t("timeline|m.room.encryption|disabled")} - subtitle={_t("timeline|m.room.encryption|unsupported")} - ref={ref} - > - {timestamp} - - ); -}; - -export default EncryptionEvent; diff --git a/src/components/views/messages/MessageTimestamp.tsx b/src/components/views/messages/MessageTimestamp.tsx deleted file mode 100644 index c2f26f1ffc..0000000000 --- a/src/components/views/messages/MessageTimestamp.tsx +++ /dev/null @@ -1,111 +0,0 @@ -/* -Copyright 2024 New Vector Ltd. -Copyright 2018 Michael Telatynski <7t3chguy@gmail.com> -Copyright 2015, 2016 OpenMarket Ltd - -SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial -Please see LICENSE files in the repository root for full details. -*/ - -import React, { type ReactNode } from "react"; -import { Tooltip } from "@vector-im/compound-web"; - -import { formatFullDate, formatTime, formatFullTime, formatRelativeTime } from "../../../DateUtils"; -import { _t } from "../../../languageHandler"; -import { Icon as LateIcon } from "../../../../res/img/sensor.svg"; - -interface IProps { - ts: number; - /** - * If specified will render both the sent-at and received-at timestamps in the tooltip - */ - receivedTs?: number; - showTwelveHour?: boolean; - showFullDate?: boolean; - showSeconds?: boolean; - showRelative?: boolean; - - /** - * If set to true then no tooltip will be shown - */ - inhibitTooltip?: boolean; - - /** - * If specified, will be rendered as an anchor bearing the href, a `span` element will be used otherwise - */ - href?: string; - /** - * Optional onClick handler to attach to the DOM element - */ - onClick?: React.MouseEventHandler; - /** - * Optional onContextMenu handler to attach to the DOM element - */ - onContextMenu?: React.MouseEventHandler; -} - -export default class MessageTimestamp extends React.Component { - public render(): React.ReactNode { - const date = new Date(this.props.ts); - let timestamp: string; - if (this.props.showRelative) { - timestamp = formatRelativeTime(date, this.props.showTwelveHour); - } else if (this.props.showFullDate) { - timestamp = formatFullDate(date, this.props.showTwelveHour, this.props.showSeconds); - } else if (this.props.showSeconds) { - timestamp = formatFullTime(date, this.props.showTwelveHour); - } else { - timestamp = formatTime(date, this.props.showTwelveHour); - } - - let label = formatFullDate(date, this.props.showTwelveHour); - let caption: string | undefined; - let icon: ReactNode | undefined; - if (this.props.receivedTs !== undefined) { - label = _t("timeline|message_timestamp_sent_at", { dateTime: label }); - const receivedDate = new Date(this.props.receivedTs); - caption = _t("timeline|message_timestamp_received_at", { - dateTime: formatFullDate(receivedDate, this.props.showTwelveHour), - }); - icon = ; - } - - let content; - if (this.props.href) { - content = ( - - {icon} - {timestamp} - - ); - } else { - content = ( - - {icon} - {timestamp} - - ); - } - - if (this.props.inhibitTooltip) return content; - - return ( - - {content} - - ); - } -} diff --git a/src/components/views/messages/ReactionsRowButton.tsx b/src/components/views/messages/ReactionsRowButton.tsx deleted file mode 100644 index 9147d7c1fc..0000000000 --- a/src/components/views/messages/ReactionsRowButton.tsx +++ /dev/null @@ -1,164 +0,0 @@ -/* -Copyright 2024 New Vector Ltd. -Copyright 2019-2021 The Matrix.org Foundation C.I.C. - -SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial -Please see LICENSE files in the repository root for full details. -*/ - -import React from "react"; -import classNames from "classnames"; -import { EventType, type MatrixEvent, RelationType } from "matrix-js-sdk/src/matrix"; -import { ReactionsRowButtonTooltipView } from "@element-hq/web-shared-components"; - -import { mediaFromMxc } from "../../../customisations/Media"; -import { _t } from "../../../languageHandler"; -import { formatList } from "../../../utils/FormattingUtils"; -import dis from "../../../dispatcher/dispatcher"; -import { ReactionsRowButtonTooltipViewModel } from "../../../viewmodels/message-body/ReactionsRowButtonTooltipViewModel"; -import AccessibleButton from "../elements/AccessibleButton"; -import MatrixClientContext from "../../../contexts/MatrixClientContext"; -import { REACTION_SHORTCODE_KEY } from "./ReactionsRow"; - -export interface IProps { - // The event we're displaying reactions for - mxEvent: MatrixEvent; - // The reaction content / key / emoji - content: string; - // The count of votes for this key - count: number; - // A list of Matrix reaction events for this key - reactionEvents: MatrixEvent[]; - // A possible Matrix event if the current user has voted for this type - myReactionEvent?: MatrixEvent; - // Whether to prevent quick-reactions by clicking on this reaction - disabled?: boolean; - // Whether to render custom image reactions - customReactionImagesEnabled?: boolean; -} - -export default class ReactionsRowButton extends React.PureComponent { - public static contextType = MatrixClientContext; - declare public context: React.ContextType; - - private reactionsRowButtonTooltipViewModel: ReactionsRowButtonTooltipViewModel; - - public constructor(props: IProps, context: React.ContextType) { - super(props, context); - this.reactionsRowButtonTooltipViewModel = new ReactionsRowButtonTooltipViewModel({ - client: context, - mxEvent: props.mxEvent, - content: props.content, - reactionEvents: props.reactionEvents, - customReactionImagesEnabled: props.customReactionImagesEnabled, - }); - } - - public componentDidUpdate(prevProps: IProps): void { - if ( - prevProps.mxEvent !== this.props.mxEvent || - prevProps.content !== this.props.content || - prevProps.reactionEvents !== this.props.reactionEvents || - prevProps.customReactionImagesEnabled !== this.props.customReactionImagesEnabled - ) { - // View model bails out if derived snapshot hasn't changed. - this.reactionsRowButtonTooltipViewModel.setProps({ - client: this.context, - mxEvent: this.props.mxEvent, - content: this.props.content, - reactionEvents: this.props.reactionEvents, - customReactionImagesEnabled: this.props.customReactionImagesEnabled, - }); - } - } - - public componentWillUnmount(): void { - this.reactionsRowButtonTooltipViewModel.dispose(); - } - - public onClick = (): void => { - const { mxEvent, myReactionEvent, content } = this.props; - if (myReactionEvent) { - this.context.redactEvent(mxEvent.getRoomId()!, myReactionEvent.getId()!); - } else { - this.context.sendEvent(mxEvent.getRoomId()!, EventType.Reaction, { - "m.relates_to": { - rel_type: RelationType.Annotation, - event_id: mxEvent.getId()!, - key: content, - }, - }); - dis.dispatch({ action: "message_sent" }); - } - }; - - public render(): React.ReactNode { - const { mxEvent, content, count, reactionEvents, myReactionEvent } = this.props; - - const classes = classNames({ - mx_ReactionsRowButton: true, - mx_ReactionsRowButton_selected: !!myReactionEvent, - }); - - const room = this.context.getRoom(mxEvent.getRoomId()); - let label: string | undefined; - let customReactionName: string | undefined; - if (room) { - const senders: string[] = []; - for (const reactionEvent of reactionEvents) { - const member = room.getMember(reactionEvent.getSender()!); - senders.push(member?.name || reactionEvent.getSender()!); - customReactionName = - (this.props.customReactionImagesEnabled && - REACTION_SHORTCODE_KEY.findIn(reactionEvent.getContent())) || - undefined; - } - - const reactors = formatList(senders, 6); - if (content) { - label = _t("timeline|reactions|label", { - reactors, - content: customReactionName || content, - }); - } else { - label = reactors; - } - } - - let reactionContent = ( - - ); - if (this.props.customReactionImagesEnabled && content.startsWith("mxc://")) { - const imageSrc = mediaFromMxc(content).srcHttp; - if (imageSrc) { - reactionContent = ( - {customReactionName - ); - } - } - - return ( - - - {reactionContent} - - - - ); - } -} diff --git a/test/unit-tests/components/views/messages/EncryptionEvent-test.tsx b/test/unit-tests/components/views/messages/EncryptionEvent-test.tsx deleted file mode 100644 index 3375b6b0b5..0000000000 --- a/test/unit-tests/components/views/messages/EncryptionEvent-test.tsx +++ /dev/null @@ -1,145 +0,0 @@ -/* -Copyright 2024 New Vector Ltd. -Copyright 2022 The Matrix.org Foundation C.I.C. - -SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial -Please see LICENSE files in the repository root for full details. -*/ - -import React from "react"; -import { mocked } from "jest-mock"; -import { type MatrixClient, type MatrixEvent, Room } from "matrix-js-sdk/src/matrix"; -import { render, screen } from "jest-matrix-react"; -import { waitFor } from "@testing-library/dom"; - -import EncryptionEvent from "../../../../../src/components/views/messages/EncryptionEvent"; -import { createTestClient, mkMessage } from "../../../../test-utils"; -import { MatrixClientPeg } from "../../../../../src/MatrixClientPeg"; -import { LocalRoom } from "../../../../../src/models/LocalRoom"; -import DMRoomMap from "../../../../../src/utils/DMRoomMap"; -import MatrixClientContext from "../../../../../src/contexts/MatrixClientContext"; - -const renderEncryptionEvent = (client: MatrixClient, event: MatrixEvent) => { - render( - - - , - ); -}; - -const checkTexts = async (title: string, subTitle: string) => { - await screen.findByText(title); - await screen.findByText(subTitle); -}; - -describe("EncryptionEvent", () => { - const roomId = "!room:example.com"; - const algorithm = "m.megolm.v1.aes-sha2"; - let client: MatrixClient; - let event: MatrixEvent; - - beforeEach(() => { - jest.clearAllMocks(); - client = createTestClient(); - jest.spyOn(MatrixClientPeg, "get").mockReturnValue(client); - jest.spyOn(MatrixClientPeg, "safeGet").mockReturnValue(client); - event = mkMessage({ - event: true, - room: roomId, - user: client.getUserId()!, - }); - jest.spyOn(DMRoomMap, "shared").mockReturnValue({ - getUserIdForRoomId: jest.fn(), - } as unknown as DMRoomMap); - }); - - describe("for an encrypted room", () => { - beforeEach(() => { - event.event.content!.algorithm = algorithm; - jest.spyOn(client.getCrypto()!, "isEncryptionEnabledInRoom").mockResolvedValue(true); - const room = new Room(roomId, client, client.getUserId()!); - mocked(client.getRoom).mockReturnValue(room); - }); - - it("should show the expected texts", async () => { - renderEncryptionEvent(client, event); - await waitFor(() => - checkTexts( - "Encryption enabled", - "Messages in this room are end-to-end encrypted. " + - "When people join, you can verify them in their profile, just tap on their profile picture.", - ), - ); - }); - - it("should show the expected texts for experimental state event encryption", async () => { - client.enableEncryptedStateEvents = true; - event.event.content!["io.element.msc4362.encrypt_state_events"] = true; - renderEncryptionEvent(client, event); - await waitFor(() => - checkTexts( - "Experimental state encryption enabled", - "Messages and state events in this room are end-to-end encrypted. " + - "When people join, you can verify them in their profile, " + - "just tap on their profile picture.", - ), - ); - }); - - describe("with same previous algorithm", () => { - beforeEach(() => { - jest.spyOn(event, "getPrevContent").mockReturnValue({ - algorithm: algorithm, - }); - }); - - it("should show the expected texts", async () => { - renderEncryptionEvent(client, event); - await waitFor(() => checkTexts("Encryption enabled", "Some encryption parameters have been changed.")); - }); - }); - - describe("with unknown algorithm", () => { - beforeEach(() => { - event.event.content!.algorithm = "unknown"; - }); - - it("should show the expected texts", async () => { - renderEncryptionEvent(client, event); - await waitFor(() => checkTexts("Encryption enabled", "Ignored attempt to disable encryption")); - }); - }); - }); - - describe("for an unencrypted room", () => { - beforeEach(() => { - jest.spyOn(client.getCrypto()!, "isEncryptionEnabledInRoom").mockResolvedValue(false); - renderEncryptionEvent(client, event); - }); - - it("should show the expected texts", async () => { - expect(client.getCrypto()!.isEncryptionEnabledInRoom).toHaveBeenCalledWith(roomId); - await waitFor(() => - checkTexts("Encryption not enabled", "The encryption used by this room isn't supported."), - ); - }); - }); - - describe("for an encrypted local room", () => { - let localRoom: LocalRoom; - - beforeEach(() => { - event.event.content!.algorithm = algorithm; - // jest.spyOn(client.getCrypto()!, "isEncryptionEnabledInRoom").mockResolvedValue(true); - localRoom = new LocalRoom(roomId, client, client.getUserId()!); - jest.spyOn(localRoom, "isEncryptionEnabled").mockReturnValue(true); - mocked(client.getRoom).mockReturnValue(localRoom); - renderEncryptionEvent(client, event); - }); - - it("should show the expected texts", async () => { - expect(localRoom.isEncryptionEnabled).toHaveBeenCalled(); - await checkTexts("Encryption enabled", "Messages in this chat will be end-to-end encrypted."); - }); - }); -}); diff --git a/test/unit-tests/components/views/messages/MessageTimestamp-test.tsx b/test/unit-tests/components/views/messages/MessageTimestamp-test.tsx deleted file mode 100644 index ceaad8ea01..0000000000 --- a/test/unit-tests/components/views/messages/MessageTimestamp-test.tsx +++ /dev/null @@ -1,55 +0,0 @@ -/* -Copyright 2024 New Vector Ltd. -Copyright 2023 The Matrix.org Foundation C.I.C. - -SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial -Please see LICENSE files in the repository root for full details. -*/ - -import React from "react"; -import { render, screen } from "jest-matrix-react"; -import userEvent from "@testing-library/user-event"; - -import MessageTimestamp from "../../../../../src/components/views/messages/MessageTimestamp"; - -jest.mock("../../../../../src/settings/SettingsStore"); - -describe("MessageTimestamp", () => { - // Friday Dec 17 2021, 9:09am - const nowDate = new Date("2021-12-17T08:09:00.000Z"); - - const HOUR_MS = 3600000; - const DAY_MS = HOUR_MS * 24; - - it("should render HH:MM", () => { - const { asFragment } = render(); - expect(asFragment()).toMatchInlineSnapshot(` - - - -`); - }); - - it("should show full date & time on hover", async () => { - const { container } = render(); - await userEvent.hover(container.querySelector(".mx_MessageTimestamp")!); - expect((await screen.findByRole("tooltip")).textContent).toMatchInlineSnapshot(`"Fri, Dec 17, 2021, 08:09:00"`); - }); - - it("should show sent & received time on hover if passed", async () => { - const { container } = render( - , - ); - await userEvent.hover(container.querySelector(".mx_MessageTimestamp")!); - expect((await screen.findByRole("tooltip")).textContent).toMatchInlineSnapshot( - `"Sent at: Fri, Dec 17, 2021, 08:09:00Received at: Sat, Dec 18, 2021, 08:09:00"`, - ); - }); -}); diff --git a/test/unit-tests/components/views/messages/ReactionsRowButton-test.tsx b/test/unit-tests/components/views/messages/ReactionsRowButton-test.tsx deleted file mode 100644 index ef6fa3ba61..0000000000 --- a/test/unit-tests/components/views/messages/ReactionsRowButton-test.tsx +++ /dev/null @@ -1,546 +0,0 @@ -/* -Copyright 2024 New Vector Ltd. -Copyright 2023 Beeper - -SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial -Please see LICENSE files in the repository root for full details. -*/ - -import React from "react"; -import { EventType, type IContent, MatrixEvent, RelationType, Room } from "matrix-js-sdk/src/matrix"; -import { fireEvent, render } from "jest-matrix-react"; - -import MatrixClientContext from "../../../../../src/contexts/MatrixClientContext"; -import { getMockClientWithEventEmitter } from "../../../../test-utils"; -import ReactionsRowButton, { type IProps } from "../../../../../src/components/views/messages/ReactionsRowButton"; -import dis from "../../../../../src/dispatcher/dispatcher"; -import { type Media, mediaFromMxc } from "../../../../../src/customisations/Media"; - -jest.mock("../../../../../src/dispatcher/dispatcher"); - -jest.mock("../../../../../src/customisations/Media", () => ({ - mediaFromMxc: jest.fn(), -})); - -jest.mock("@element-hq/web-shared-components", () => { - const actual = jest.requireActual("@element-hq/web-shared-components"); - return { - ...actual, - ReactionsRowButtonTooltipView: ({ children }: { children: React.ReactNode }) => <>{children}, - }; -}); - -const mockMediaFromMxc = mediaFromMxc as jest.MockedFunction; - -describe("ReactionsRowButton", () => { - const userId = "@alice:server"; - const roomId = "!randomcharacters:aser.ver"; - const mockClient = getMockClientWithEventEmitter({ - getRoom: jest.fn(), - sendEvent: jest.fn().mockResolvedValue({ event_id: "$sent_event" }), - redactEvent: jest.fn().mockResolvedValue({}), - }); - const room = new Room(roomId, mockClient, userId); - - const createProps = (relationContent: IContent): IProps => ({ - mxEvent: new MatrixEvent({ - room_id: roomId, - event_id: "$test:example.com", - content: { body: "test" }, - }), - content: relationContent["m.relates_to"]?.key || "", - count: 2, - reactionEvents: [ - new MatrixEvent({ - type: "m.reaction", - sender: "@user1:example.com", - content: relationContent, - }), - new MatrixEvent({ - type: "m.reaction", - sender: "@user2:example.com", - content: relationContent, - }), - ], - customReactionImagesEnabled: true, - }); - - beforeEach(function () { - jest.clearAllMocks(); - mockClient.credentials = { userId: userId }; - mockClient.getRoom.mockImplementation((roomId: string): Room | null => { - return roomId === room.roomId ? room : null; - }); - // Default mock for mediaFromMxc - mockMediaFromMxc.mockReturnValue({ - srcHttp: "https://not.a.real.url", - } as unknown as Media); - }); - - it("renders reaction row button emojis correctly", () => { - const props = createProps({ - "m.relates_to": { - event_id: "$user2:example.com", - key: "👍", - rel_type: "m.annotation", - }, - }); - const root = render( - - - , - ); - expect(root.asFragment()).toMatchSnapshot(); - - // Try hover and make sure that the ReactionsRowButtonTooltip works - const reactionButton = root.getByRole("button"); - const event = new MouseEvent("mouseover", { - bubbles: true, - cancelable: true, - }); - reactionButton.dispatchEvent(event); - - expect(root.asFragment()).toMatchSnapshot(); - }); - - it("renders reaction row button custom image reactions correctly", () => { - const props = createProps({ - "com.beeper.reaction.shortcode": ":test:", - "shortcode": ":test:", - "m.relates_to": { - event_id: "$user1:example.com", - key: "mxc://example.com/123456789", - rel_type: "m.annotation", - }, - }); - - const root = render( - - - , - ); - expect(root.asFragment()).toMatchSnapshot(); - - // Try hover and make sure that the ReactionsRowButtonTooltip works - const reactionButton = root.getByRole("button"); - const event = new MouseEvent("mouseover", { - bubbles: true, - cancelable: true, - }); - reactionButton.dispatchEvent(event); - - expect(root.asFragment()).toMatchSnapshot(); - }); - - it("renders without a room", () => { - mockClient.getRoom.mockImplementation(() => null); - - const props = createProps({}); - - const root = render( - - - , - ); - - expect(root.asFragment()).toMatchSnapshot(); - }); - - it("calls setProps on ViewModel when props change", () => { - const props = createProps({ - "m.relates_to": { - event_id: "$user1:example.com", - key: "👍", - rel_type: "m.annotation", - }, - }); - - const { rerender, container } = render( - - - , - ); - - // Create new props with different values - const newMxEvent = new MatrixEvent({ - room_id: roomId, - event_id: "$test2:example.com", - content: { body: "test2" }, - }); - - const newReactionEvents = [ - new MatrixEvent({ - type: "m.reaction", - sender: "@user3:example.com", - content: { - "m.relates_to": { - event_id: "$user3:example.com", - key: "👎", - rel_type: "m.annotation", - }, - }, - }), - ]; - - const updatedProps: IProps = { - ...props, - mxEvent: newMxEvent, - content: "👎", - reactionEvents: newReactionEvents, - customReactionImagesEnabled: false, - }; - - rerender( - - - , - ); - - // The component should have updated - verify by checking the rendered content - expect(container.querySelector(".mx_ReactionsRowButton_content")?.textContent).toBe("👎"); - }); - - it("disposes ViewModel on unmount", () => { - const props = createProps({ - "m.relates_to": { - event_id: "$user1:example.com", - key: "👍", - rel_type: "m.annotation", - }, - }); - - const { unmount } = render( - - - , - ); - - // Unmount should not throw - expect(() => unmount()).not.toThrow(); - }); - - it("redacts reaction when clicking with myReactionEvent", () => { - const myReactionEvent = new MatrixEvent({ - type: "m.reaction", - sender: userId, - event_id: "$my_reaction:example.com", - content: { - "m.relates_to": { - event_id: "$user1:example.com", - key: "👍", - rel_type: "m.annotation", - }, - }, - }); - - const props: IProps = { - ...createProps({ - "m.relates_to": { - event_id: "$user1:example.com", - key: "👍", - rel_type: "m.annotation", - }, - }), - myReactionEvent, - }; - - const root = render( - - - , - ); - - const button = root.getByRole("button"); - fireEvent.click(button); - - expect(mockClient.redactEvent).toHaveBeenCalledWith(roomId, "$my_reaction:example.com"); - }); - - it("sends reaction when clicking without myReactionEvent", () => { - const props = createProps({ - "m.relates_to": { - event_id: "$test:example.com", - key: "👍", - rel_type: "m.annotation", - }, - }); - - const root = render( - - - , - ); - - const button = root.getByRole("button"); - fireEvent.click(button); - - expect(mockClient.sendEvent).toHaveBeenCalledWith(roomId, EventType.Reaction, { - "m.relates_to": { - rel_type: RelationType.Annotation, - event_id: "$test:example.com", - key: "👍", - }, - }); - expect(dis.dispatch).toHaveBeenCalledWith({ action: "message_sent" }); - }); - - it("uses reactors as label when content is empty", () => { - const props: IProps = { - mxEvent: new MatrixEvent({ - room_id: roomId, - event_id: "$test:example.com", - content: { body: "test" }, - }), - content: "", // Empty content - count: 2, - reactionEvents: [ - new MatrixEvent({ - type: "m.reaction", - sender: "@user1:example.com", - content: {}, - }), - new MatrixEvent({ - type: "m.reaction", - sender: "@user2:example.com", - content: {}, - }), - ], - customReactionImagesEnabled: true, - }; - - const root = render( - - - , - ); - - // The button should still render - const button = root.getByRole("button"); - expect(button).toBeInTheDocument(); - }); - - it("renders custom image reaction with fallback label when no shortcode", () => { - const props: IProps = { - mxEvent: new MatrixEvent({ - room_id: roomId, - event_id: "$test:example.com", - content: { body: "test" }, - }), - content: "mxc://example.com/custom_image", - count: 1, - reactionEvents: [ - new MatrixEvent({ - type: "m.reaction", - sender: "@user1:example.com", - content: { - "m.relates_to": { - event_id: "$test:example.com", - key: "mxc://example.com/custom_image", - rel_type: "m.annotation", - }, - }, - }), - ], - customReactionImagesEnabled: true, - }; - - const root = render( - - - , - ); - - // Should render an image element for custom reaction - const img = root.container.querySelector("img.mx_ReactionsRowButton_content"); - expect(img).toBeInTheDocument(); - expect(img).toHaveAttribute("src", "https://not.a.real.url"); - }); - - it("falls back to text when mxc URL cannot be converted to HTTP", () => { - // Make mediaFromMxc return null srcHttp to simulate failed conversion - mockMediaFromMxc.mockReturnValueOnce({ - srcHttp: null, - } as unknown as Media); - - const props: IProps = { - mxEvent: new MatrixEvent({ - room_id: roomId, - event_id: "$test:example.com", - content: { body: "test" }, - }), - content: "mxc://example.com/invalid_image", - count: 1, - reactionEvents: [ - new MatrixEvent({ - type: "m.reaction", - sender: "@user1:example.com", - content: { - "m.relates_to": { - event_id: "$test:example.com", - key: "mxc://example.com/invalid_image", - rel_type: "m.annotation", - }, - }, - }), - ], - customReactionImagesEnabled: true, - }; - - const root = render( - - - , - ); - - // Should render span (not img) when imageSrc is null - const span = root.container.querySelector("span.mx_ReactionsRowButton_content"); - expect(span).toBeInTheDocument(); - const img = root.container.querySelector("img.mx_ReactionsRowButton_content"); - expect(img).not.toBeInTheDocument(); - }); - - it("updates ViewModel when only mxEvent changes", () => { - const props = createProps({ - "m.relates_to": { - event_id: "$user1:example.com", - key: "👍", - rel_type: "m.annotation", - }, - }); - - const { rerender } = render( - - - , - ); - - // Only change mxEvent - const newMxEvent = new MatrixEvent({ - room_id: roomId, - event_id: "$test2:example.com", - content: { body: "test2" }, - }); - - expect(() => - rerender( - - - , - ), - ).not.toThrow(); - }); - - it("updates ViewModel when only content changes", () => { - const props = createProps({ - "m.relates_to": { - event_id: "$user1:example.com", - key: "👍", - rel_type: "m.annotation", - }, - }); - - const { rerender, container } = render( - - - , - ); - - // Only change content - rerender( - - - , - ); - - expect(container.querySelector(".mx_ReactionsRowButton_content")?.textContent).toBe("👎"); - }); - - it("updates ViewModel when only reactionEvents changes", () => { - const props = createProps({ - "m.relates_to": { - event_id: "$user1:example.com", - key: "👍", - rel_type: "m.annotation", - }, - }); - - const { rerender } = render( - - - , - ); - - // Only change reactionEvents - const newReactionEvents = [ - new MatrixEvent({ - type: "m.reaction", - sender: "@user3:example.com", - content: { - "m.relates_to": { - event_id: "$user1:example.com", - key: "👍", - rel_type: "m.annotation", - }, - }, - }), - ]; - - expect(() => - rerender( - - - , - ), - ).not.toThrow(); - }); - - it("updates ViewModel when only customReactionImagesEnabled changes", () => { - const props = createProps({ - "m.relates_to": { - event_id: "$user1:example.com", - key: "👍", - rel_type: "m.annotation", - }, - }); - - const { rerender } = render( - - - , - ); - - // Only change customReactionImagesEnabled - expect(() => - rerender( - - - , - ), - ).not.toThrow(); - }); - - it("does not update ViewModel when props stay the same", () => { - const props = createProps({ - "m.relates_to": { - event_id: "$user1:example.com", - key: "👍", - rel_type: "m.annotation", - }, - }); - - const { rerender } = render( - - - , - ); - - // Rerender with same props - setProps should not be called - expect(() => - rerender( - - - , - ), - ).not.toThrow(); - }); -}); diff --git a/test/unit-tests/components/views/messages/__snapshots__/ReactionsRowButton-test.tsx.snap b/test/unit-tests/components/views/messages/__snapshots__/ReactionsRowButton-test.tsx.snap deleted file mode 100644 index db868189dd..0000000000 --- a/test/unit-tests/components/views/messages/__snapshots__/ReactionsRowButton-test.tsx.snap +++ /dev/null @@ -1,120 +0,0 @@ -// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing - -exports[`ReactionsRowButton renders reaction row button custom image reactions correctly 1`] = ` - -

    - :test: - -
    - -`; - -exports[`ReactionsRowButton renders reaction row button custom image reactions correctly 2`] = ` - -
    - :test: - -
    -
    -`; - -exports[`ReactionsRowButton renders reaction row button emojis correctly 1`] = ` - -
    - - -
    -
    -`; - -exports[`ReactionsRowButton renders reaction row button emojis correctly 2`] = ` - -
    - - -
    -
    -`; - -exports[`ReactionsRowButton renders without a room 1`] = ` - -
    -
    -
    -`; diff --git a/test/unit-tests/utils/exportUtils/__snapshots__/HTMLExport-test.ts.snap b/test/unit-tests/utils/exportUtils/__snapshots__/HTMLExport-test.ts.snap deleted file mode 100644 index 115385f2e4..0000000000 --- a/test/unit-tests/utils/exportUtils/__snapshots__/HTMLExport-test.ts.snap +++ /dev/null @@ -1,84 +0,0 @@ -// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing - -exports[`HTMLExport should export 1`] = ` -" - - - - - - - - - Exported Data - - -
    -
    -
    -
    -
    - ! -
    -
    - - !myroom:example.org - -
    -
    -
    - -
    -
    -
    -
    -
    -
      -
      - ! -

      !myroom:example.org

      -

      created this room.

      This is the start of export of !myroom:example.org. Exported by @userId:matrix.org at 11/17/2022.

      -
      -

      -
      -
    1. @user49:example.com
      00:00
      Message #49
    2. @user48:example.com
      00:00
      Message #48
    3. @user47:example.com
      00:00
      Message #47
    4. @user46:example.com
      00:00
      Message #46
    5. @user45:example.com
      00:00
      Message #45
    6. @user44:example.com
      00:00
      Message #44
    7. @user43:example.com
      00:00
      Message #43
    8. @user42:example.com
      00:00
      Message #42
    9. @user41:example.com
      00:00
      Message #41
    10. @user40:example.com
      00:00
      Message #40
    11. @user39:example.com
      00:00
      Message #39
    12. @user38:example.com
      00:00
      Message #38
    13. @user37:example.com
      00:00
      Message #37
    14. @user36:example.com
      00:00
      Message #36
    15. @user35:example.com
      00:00
      Message #35
    16. @user34:example.com
      00:00
      Message #34
    17. @user33:example.com
      00:00
      Message #33
    18. @user32:example.com
      00:00
      Message #32
    19. @user31:example.com
      00:00
      Message #31
    20. @user30:example.com
      00:00
      Message #30
    21. @user29:example.com
      00:00
      Message #29
    22. @user28:example.com
      00:00
      Message #28
    23. @user27:example.com
      00:00
      Message #27
    24. @user26:example.com
      00:00
      Message #26
    25. @user25:example.com
      00:00
      Message #25
    26. @user24:example.com
      00:00
      Message #24
    27. @user23:example.com
      00:00
      Message #23
    28. @user22:example.com
      00:00
      Message #22
    29. @user21:example.com
      00:00
      Message #21
    30. @user20:example.com
      00:00
      Message #20
    31. @user19:example.com
      00:00
      Message #19
    32. @user18:example.com
      00:00
      Message #18
    33. @user17:example.com
      00:00
      Message #17
    34. @user16:example.com
      00:00
      Message #16
    35. @user15:example.com
      00:00
      Message #15
    36. @user14:example.com
      00:00
      Message #14
    37. @user13:example.com
      00:00
      Message #13
    38. @user12:example.com
      00:00
      Message #12
    39. @user11:example.com
      00:00
      Message #11
    40. @user10:example.com
      00:00
      Message #10
    41. @user9:example.com
      00:00
      Message #9
    42. @user8:example.com
      00:00
      Message #8
    43. @user7:example.com
      00:00
      Message #7
    44. @user6:example.com
      00:00
      Message #6
    45. @user5:example.com
      00:00
      Message #5
    46. @user4:example.com
      00:00
      Message #4
    47. @user3:example.com
      00:00
      Message #3
    48. @user2:example.com
      00:00
      Message #2
    49. @user1:example.com
      00:00
      Message #1
    50. @user0:example.com
      00:00
      Message #0
    51. -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    - - " -`; - -exports[`HTMLExport should have an SDK-branded destination file name 1`] = `"Element - My Test Room Welcome - Chat Export - 2022-11-17T16-58-32.517Z.zip"`; - -exports[`HTMLExport should have an SDK-branded destination file name 2`] = `"BrandedChatWithSlashesForFun - My Test Room Welcome - Chat Export - 2022-11-17T16-58-32.517Z.zip"`;