From 42b9cc2b64d2a06e07fef952253b080c7292faf7 Mon Sep 17 00:00:00 2001 From: Lotus Bot Date: Thu, 21 May 2026 20:49:33 -0400 Subject: [PATCH] chore: prettier format all files, brotli, Sentry release tagging, CI gates Prettier: auto-formatted 103 files to fix baseline. Prettier check in CI is now a hard gate (removed continue-on-error). Brotli: installed libnginx-mod-http-brotli-filter/static. Enabled in nginx with brotli_static on for pre-compressed assets and comp_level 6. Sentry releases: deploy script now exports VITE_APP_VERSION= before building so each Sentry release maps to an exact commit. CI also passes github.sha as VITE_APP_VERSION. Co-Authored-By: Claude Sonnet 4.6 --- .cinny-config.json | 6 +- .eslintrc.cjs | 54 +- .gitea/workflows/ci.yml | 2 +- .github/DISCUSSION_TEMPLATE/issue-triage.yml | 14 +- .github/dependabot.yml | 28 +- .github/workflows/build-pull-request.yml | 2 +- .github/workflows/deploy-pull-request.yml | 12 +- .github/workflows/docker-pr.yml | 2 +- .github/workflows/lockfile.yml | 2 +- .github/workflows/netlify-dev.yml | 2 +- .github/workflows/prod-deploy.yml | 4 +- CODE_OF_CONDUCT.md | 22 +- CONTRIBUTING.md | 9 +- config.json | 4 +- index.html | 19 +- package-lock.json | 775 +++++------ package.json | 4 +- public/config.json | 4 +- public/manifest.json | 6 +- scripts/patch-folds.mjs | 4 +- scripts/update-version.js | 24 +- src/app/components/CallEmbedProvider.tsx | 295 +++- src/app/components/DeviceVerification.tsx | 11 +- .../components/DeviceVerificationSetup.tsx | 8 +- src/app/components/GifPicker.tsx | 33 +- src/app/components/LogoutDialog.tsx | 4 +- src/app/components/RoomSkeleton.tsx | 46 +- src/app/components/editor/Editor.preview.tsx | 13 +- src/app/components/editor/Toolbar.tsx | 62 +- .../components/event-readers/EventReaders.tsx | 36 +- .../join-address-prompt/JoinAddressPrompt.tsx | 4 +- .../leave-room-prompt/LeaveRoomPrompt.tsx | 4 +- .../leave-space-prompt/LeaveSpacePrompt.tsx | 4 +- src/app/components/message/FileHeader.tsx | 8 +- .../components/message/MsgTypeRenderers.tsx | 4 +- src/app/components/message/Reaction.tsx | 3 +- .../message/content/FallbackContent.tsx | 4 +- .../message/content/PollContent.tsx | 22 +- .../ReadReceiptAvatars.tsx | 7 +- src/app/components/uia-stages/DummyStage.tsx | 4 +- src/app/components/uia-stages/EmailStage.tsx | 15 +- .../components/uia-stages/PasswordStage.tsx | 4 +- .../uia-stages/RegistrationTokenStage.tsx | 11 +- src/app/components/uia-stages/SSOStage.tsx | 4 +- src/app/components/uia-stages/TermsStage.tsx | 4 +- src/app/components/url-preview/UrlPreview.tsx | 8 +- src/app/components/user-profile/PowerChip.tsx | 8 +- src/app/features/add-existing/AddExisting.tsx | 4 +- src/app/features/call/CallControls.tsx | 80 +- src/app/features/call/Controls.tsx | 4 +- src/app/features/call/PrescreenControls.tsx | 5 +- .../general/RoomEncryption.tsx | 11 +- .../common-settings/general/RoomUpgrade.tsx | 4 +- .../create-space/CreateSpaceModal.tsx | 4 +- src/app/features/lobby/LobbyHero.tsx | 4 +- src/app/features/lotus/chatBackground.ts | 6 +- src/app/features/room-nav/RoomNavItem.tsx | 2 +- .../features/room-settings/RoomSettings.tsx | 6 +- src/app/features/room/CallChatView.tsx | 7 +- src/app/features/room/RoomInput.tsx | 99 +- src/app/features/room/RoomTimeline.tsx | 424 ++++-- src/app/features/room/RoomView.tsx | 7 +- src/app/features/room/RoomViewHeader.tsx | 26 +- src/app/features/room/RoomViewTyping.tsx | 8 +- .../room/message/ForwardMessageDialog.tsx | 13 +- src/app/features/room/message/Message.tsx | 1238 +++++++++-------- src/app/features/settings/Settings.tsx | 6 +- src/app/features/settings/account/Profile.tsx | 7 +- src/app/features/settings/general/General.tsx | 70 +- .../notifications/KeywordMessages.tsx | 9 +- .../features/space-settings/SpaceSettings.tsx | 6 +- src/app/hooks/useCallEmbed.ts | 26 +- src/app/hooks/useForceUpdate.js | 9 +- src/app/hooks/usePan.ts | 13 +- src/app/hooks/useRoomReadPositions.ts | 4 +- src/app/hooks/useTheme.ts | 15 +- src/app/pages/Router.tsx | 153 +- src/app/pages/ThemeManager.tsx | 8 +- src/app/pages/auth/AuthFooter.tsx | 8 +- src/app/pages/auth/AuthLayout.tsx | 4 +- .../pages/auth/login/PasswordLoginForm.tsx | 10 +- src/app/pages/auth/login/loginUtil.ts | 4 +- src/app/pages/client/ClientLayout.tsx | 16 +- src/app/pages/client/SpecVersions.tsx | 3 +- src/app/pages/client/WelcomePage.tsx | 10 +- src/app/pages/client/direct/Direct.tsx | 8 +- src/app/pages/client/explore/Explore.tsx | 19 +- src/app/pages/client/explore/Featured.tsx | 8 +- src/app/pages/client/explore/Server.tsx | 4 +- src/app/pages/client/home/Home.tsx | 8 +- src/app/pages/client/inbox/Invites.tsx | 12 +- src/app/pages/client/sidebar/SpaceTabs.tsx | 8 +- src/app/pages/client/space/Space.tsx | 12 +- src/app/plugins/call/CallControl.ts | 17 +- src/app/plugins/react-custom-html-parser.tsx | 4 +- src/app/state/list.ts | 13 +- src/app/state/room/roomInputDrafts.ts | 4 +- src/app/state/settings.ts | 25 +- src/app/utils/sanitize.ts | 20 +- src/colors.css.ts | 1 - src/lotus-terminal.css.ts | 356 ++--- src/types/matrix/common.ts | 3 +- src/util/colorMXID.js | 2 +- src/util/cryptE2ERoomKeys.js | 83 +- vite.config.js | 34 +- 105 files changed, 2749 insertions(+), 1850 deletions(-) diff --git a/.cinny-config.json b/.cinny-config.json index 98cdf7505..cf911647a 100644 --- a/.cinny-config.json +++ b/.cinny-config.json @@ -1,8 +1,6 @@ { "defaultHomeserver": 0, - "homeserverList": [ - "matrix.lotusguild.org" - ], + "homeserverList": ["matrix.lotusguild.org"], "allowCustomHomeservers": false, "featuredCommunities": { "openAsDefault": false, @@ -14,4 +12,4 @@ "enabled": false, "basename": "/" } -} \ No newline at end of file +} diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 9d5a27d90..16a0eb96e 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -4,15 +4,15 @@ module.exports = { es2021: true, }, extends: [ - "eslint:recommended", - "plugin:react/recommended", - "plugin:react-hooks/recommended", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended", + 'eslint:recommended', + 'plugin:react/recommended', + 'plugin:react-hooks/recommended', + 'plugin:@typescript-eslint/eslint-recommended', + 'plugin:@typescript-eslint/recommended', 'airbnb', 'prettier', ], - parser: "@typescript-eslint/parser", + parser: '@typescript-eslint/parser', parserOptions: { ecmaFeatures: { jsx: true, @@ -20,46 +20,40 @@ module.exports = { ecmaVersion: 'latest', sourceType: 'module', }, - "globals": { - JSX: "readonly" + globals: { + JSX: 'readonly', }, - plugins: [ - 'react', - '@typescript-eslint' - ], + plugins: ['react', '@typescript-eslint'], rules: { 'linebreak-style': 0, 'no-underscore-dangle': 0, - "no-shadow": "off", + 'no-shadow': 'off', - "import/prefer-default-export": "off", - "import/extensions": "off", - "import/no-unresolved": "off", - "import/no-extraneous-dependencies": [ - "error", + 'import/prefer-default-export': 'off', + 'import/extensions': 'off', + 'import/no-unresolved': 'off', + 'import/no-extraneous-dependencies': [ + 'error', { devDependencies: true, }, ], - 'react/no-unstable-nested-components': [ + 'react/no-unstable-nested-components': ['error', { allowAsProps: true }], + 'react/jsx-filename-extension': [ 'error', - { allowAsProps: true }, - ], - "react/jsx-filename-extension": [ - "error", { - extensions: [".tsx", ".jsx"], + extensions: ['.tsx', '.jsx'], }, ], - "react/require-default-props": "off", - "react/jsx-props-no-spreading": "off", - "react-hooks/rules-of-hooks": "error", - "react-hooks/exhaustive-deps": "error", + 'react/require-default-props': 'off', + 'react/jsx-props-no-spreading': 'off', + 'react-hooks/rules-of-hooks': 'error', + 'react-hooks/exhaustive-deps': 'error', - "@typescript-eslint/no-unused-vars": "error", - "@typescript-eslint/no-shadow": "error" + '@typescript-eslint/no-unused-vars': 'error', + '@typescript-eslint/no-shadow': 'error', }, overrides: [ { diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 6a8a0b9f8..cfa08a5fd 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -29,6 +29,7 @@ jobs: env: NODE_OPTIONS: "--max_old_space_size=4096" SENTRY_AUTH_TOKEN: "" + VITE_APP_VERSION: ${{ github.sha }} # ── Quality checks (informational — pre-existing issues exist) ─────── - name: TypeScript @@ -41,7 +42,6 @@ jobs: - name: Prettier run: npm run check:prettier - continue-on-error: true # ── Security ───────────────────────────────────────────────────────── - name: Audit (high/critical) diff --git a/.github/DISCUSSION_TEMPLATE/issue-triage.yml b/.github/DISCUSSION_TEMPLATE/issue-triage.yml index 7c8ded3d4..6d154d323 100644 --- a/.github/DISCUSSION_TEMPLATE/issue-triage.yml +++ b/.github/DISCUSSION_TEMPLATE/issue-triage.yml @@ -1,4 +1,4 @@ -labels: ["needs-confirmation"] +labels: ['needs-confirmation'] body: - type: markdown #add faqs in future attributes: @@ -7,7 +7,7 @@ body: > Please read through [the Discussion rules](https://github.com/cinnyapp/cinny/discussions/2653) and check for both existing [Discussions](https://github.com/cinnyapp/cinny/discussions?discussions_q=) and [Issues](https://github.com/cinnyapp/cinny/issues?q=sort%3Areactions-desc) prior to opening a new Discussion. - type: markdown attributes: - value: "# Issue Details" + value: '# Issue Details' - type: textarea attributes: label: Issue Description @@ -64,7 +64,7 @@ body: - Browser: - Cinny Web Version: (app.cinny.in or self hosted) - Cinny desktop Version: (appimage or deb or flatpak) - - Matrix Homeserver: + - Matrix Homeserver: placeholder: | - OS: Windows 11 - Browser: Chrome 120.0.6099.109 @@ -80,12 +80,12 @@ body: label: Relevant Logs description: | If applicable, add browser console logs to help explain your problem. - + **To get browser console logs:** - Chrome/Edge: Press F12 → Console tab - Firefox: Press F12 → Console tab - Safari: Develop → Show Web Inspector → Console - + Please wrap large log outputs in code blocks with triple backticks (```). placeholder: | ``` @@ -98,7 +98,7 @@ body: render: shell validations: required: false - - type: textarea + - type: textarea attributes: label: Additional context description: | @@ -119,7 +119,7 @@ body: > Use these links to review the existing Cinny [Discussions](https://github.com/cinnyapp/cinny/discussions?discussions_q=) and [Issues](https://github.com/cinnyapp/cinny/issues?q=sort%3Areactions-desc). - type: checkboxes #add faqs in future attributes: - label: "I acknowledge that:" + label: 'I acknowledge that:' options: - label: I have searched the Cinny repository (both open and closed Discussions and Issues) and confirm this is not a duplicate of an existing issue or discussion. required: true diff --git a/.github/dependabot.yml b/.github/dependabot.yml index c5a31bb7b..d59f55cc4 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -2,29 +2,29 @@ version: 2 updates: -# - package-ecosystem: npm -# directory: / -# schedule: -# interval: weekly -# day: "tuesday" -# time: "01:00" -# timezone: "Asia/Kolkata" -# open-pull-requests-limit: 15 + # - package-ecosystem: npm + # directory: / + # schedule: + # interval: weekly + # day: "tuesday" + # time: "01:00" + # timezone: "Asia/Kolkata" + # open-pull-requests-limit: 15 - package-ecosystem: github-actions directory: / schedule: interval: weekly - day: "tuesday" - time: "01:00" - timezone: "Asia/Kolkata" + day: 'tuesday' + time: '01:00' + timezone: 'Asia/Kolkata' open-pull-requests-limit: 5 - package-ecosystem: docker directory: / schedule: interval: weekly - day: "tuesday" - time: "01:00" - timezone: "Asia/Kolkata" + day: 'tuesday' + time: '01:00' + timezone: 'Asia/Kolkata' open-pull-requests-limit: 5 diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index ca1ecbb43..02d7898be 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -16,7 +16,7 @@ jobs: - name: Setup node uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: - node-version-file: ".node-version" + node-version-file: '.node-version' package-manager-cache: false - name: Install dependencies run: npm ci diff --git a/.github/workflows/deploy-pull-request.yml b/.github/workflows/deploy-pull-request.yml index 8d731782a..05aa8cabc 100644 --- a/.github/workflows/deploy-pull-request.yml +++ b/.github/workflows/deploy-pull-request.yml @@ -1,10 +1,10 @@ name: Deploy PR to Netlify -run-name: "Deploy PR to Netlify (${{ github.event.workflow_run.head_branch }})" +run-name: 'Deploy PR to Netlify (${{ github.event.workflow_run.head_branch }})' on: workflow_run: - workflows: ["Build pull request"] - types: [completed] + workflows: ['Build pull request'] + types: [completed] jobs: deploy-pull-request: @@ -42,7 +42,7 @@ jobs: uses: nwtgck/actions-netlify@4cbaf4c08f1a7bfa537d6113472ef4424e4eb654 # v3.0.0 with: publish-dir: dist - deploy-message: "Deploy PR ${{ steps.pr.outputs.id }}" + deploy-message: 'Deploy PR ${{ steps.pr.outputs.id }}' alias: ${{ steps.pr.outputs.id }} # These don't work because we're in workflow_run enable-pull-request-comment: false @@ -59,5 +59,5 @@ jobs: pr-number: ${{ steps.pr.outputs.id }} comment-tag: ${{ steps.pr.outputs.id }} message: | - Preview: ${{ steps.netlify.outputs.deploy-url }} - ⚠️ Exercise caution. Use test accounts. ⚠️ + Preview: ${{ steps.netlify.outputs.deploy-url }} + ⚠️ Exercise caution. Use test accounts. ⚠️ diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index 0ebe56e4b..19237f95a 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -20,7 +20,7 @@ jobs: - name: Set up QEMU uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3.7.0 - + - name: Set up Docker Buildx uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0 diff --git a/.github/workflows/lockfile.yml b/.github/workflows/lockfile.yml index 0e700bfca..559bccaef 100644 --- a/.github/workflows/lockfile.yml +++ b/.github/workflows/lockfile.yml @@ -23,4 +23,4 @@ jobs: collapsibleThreshold: 25 failOnDowngrade: false path: package-lock.json - updateComment: true \ No newline at end of file + updateComment: true diff --git a/.github/workflows/netlify-dev.yml b/.github/workflows/netlify-dev.yml index 6c4301876..686019e06 100644 --- a/.github/workflows/netlify-dev.yml +++ b/.github/workflows/netlify-dev.yml @@ -15,7 +15,7 @@ jobs: - name: Setup node uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: - node-version-file: ".node-version" + node-version-file: '.node-version' package-manager-cache: false - name: Install dependencies run: npm ci diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml index 706de1ebe..a0f688b46 100644 --- a/.github/workflows/prod-deploy.yml +++ b/.github/workflows/prod-deploy.yml @@ -17,7 +17,7 @@ jobs: - name: Setup node uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: - node-version-file: ".node-version" + node-version-file: '.node-version' package-manager-cache: false - name: Install dependencies run: npm ci @@ -118,4 +118,4 @@ jobs: platforms: linux/amd64,linux/arm64 push: true tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} \ No newline at end of file + labels: ${{ steps.meta.outputs.labels }} diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index f1ef5d468..37a7e9c8b 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -17,23 +17,23 @@ diverse, inclusive, and healthy community. Examples of behavior that contributes to a positive environment for our community include: -* Demonstrating empathy and kindness toward other people -* Being respectful of differing opinions, viewpoints, and experiences -* Giving and gracefully accepting constructive feedback -* Accepting responsibility and apologizing to those affected by our mistakes, +- Demonstrating empathy and kindness toward other people +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience -* Focusing on what is best not just for us as individuals, but for the +- Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: -* The use of sexualized language or imagery, and sexual attention or +- The use of sexualized language or imagery, and sexual attention or advances of any kind -* Trolling, insulting or derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or email +- Trolling, insulting or derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or email address, without their explicit permission -* Other conduct which could reasonably be considered inappropriate in a +- Other conduct which could reasonably be considered inappropriate in a professional setting ## Enforcement Responsibilities @@ -106,7 +106,7 @@ Violating these terms may lead to a permanent ban. ### 4. Permanent Ban **Community Impact**: Demonstrating a pattern of violation of community -standards, including sustained inappropriate behavior, harassment of an +standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. **Consequence**: A permanent ban from any sort of public interaction within diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 75cdaceec..3081723bf 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,6 +5,7 @@ First off, thanks for taking the time to contribute! ❤️ All types of contributions are encouraged and valued. Please make sure to read the relevant section before making your contribution. It will make it a lot easier for us maintainers and smooth out the experience for all involved. The community looks forward to your contributions. 🎉 > And if you like the project, but just don't have time to contribute, that's fine. There are other easy ways to support the project and show your appreciation, which we would also be very happy about: +> > - Star the project > - Tweet about it (tag @cinnyapp) > - Refer this project in your project's readme @@ -18,6 +19,7 @@ Bug reports and feature suggestions must use descriptive and concise titles and ## Pull requests > ### Legal Notice +> > When contributing to this project, you must agree that you have authored 100% of the content, that you have the necessary rights to the content and that the content you contribute may be provided under the project license. You will also be asked to [sign the CLA](https://github.com/cinnyapp/cla) upon submiting your pull request. **NOTE: If you want to add new features, please discuss with maintainers before coding or opening a pull request.** This is to ensure that we are on same track and following our roadmap. @@ -26,9 +28,9 @@ Bug reports and feature suggestions must use descriptive and concise titles and Example: -|Not ideal|Better| -|---|----| -|Fixed markAllAsRead in RoomTimeline|Fix read marker when paginating room timeline| +| Not ideal | Better | +| ----------------------------------- | --------------------------------------------- | +| Fixed markAllAsRead in RoomTimeline | Fix read marker when paginating room timeline | It is not always possible to phrase every change in such a manner, but it is desired. @@ -39,6 +41,7 @@ Also, we use [ESLint](https://eslint.org/) for clean and stylistically consisten **For any query or design discussion, join our [Matrix room](https://matrix.to/#/#cinny:matrix.org).** ## Helpful links + - [BEM methodology](http://getbem.com/introduction/) - [Atomic design](https://bradfrost.com/blog/post/atomic-web-design/) - [Matrix JavaScript SDK documentation](https://matrix-org.github.io/matrix-js-sdk/index.html) diff --git a/config.json b/config.json index e82b5b4fa..58aa9a4f8 100644 --- a/config.json +++ b/config.json @@ -1,8 +1,6 @@ { "defaultHomeserver": 0, - "homeserverList": [ - "matrix.lotusguild.org" - ], + "homeserverList": ["matrix.lotusguild.org"], "allowCustomHomeservers": false, "featuredCommunities": { "openAsDefault": false, diff --git a/index.html b/index.html index 4acd99a29..0d8e9039e 100644 --- a/index.html +++ b/index.html @@ -11,15 +11,15 @@ name="description" content="Lotus Chat — the Lotus Guild Matrix client. Secure, fast, and built for our community." /> - + - + - - - + + + diff --git a/package-lock.json b/package-lock.json index 81f48d2f7..24e09eec2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "@fontsource/inter": "4.5.14", "@giphy/js-fetch-api": "5.8.0", "@giphy/js-types": "5.1.0", - "@giphy/react-components": "10.1.2", + "@giphy/react-components": "1.6.0", "@sentry/react": "10.53.1", "@tanstack/react-query": "5.24.1", "@tanstack/react-query-devtools": "5.24.1", @@ -109,7 +109,7 @@ "vite": "6.4.2", "vite-plugin-pwa": "1.3.0", "vite-plugin-static-copy": "4.1.0", - "vite-plugin-top-level-await": "1.6.0" + "vite-plugin-top-level-await": "1.2.2" }, "engines": { "node": ">=16.0.0" @@ -213,7 +213,6 @@ "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", @@ -278,7 +277,6 @@ "version": "7.29.1", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.29.0", @@ -405,7 +403,6 @@ "version": "7.28.0", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -428,7 +425,6 @@ "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/traverse": "^7.28.6", @@ -529,7 +525,6 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -539,7 +534,6 @@ "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -587,7 +581,6 @@ "version": "7.29.3", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.29.0" @@ -1704,7 +1697,6 @@ "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.28.6", @@ -1719,7 +1711,6 @@ "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.0", @@ -1738,7 +1729,6 @@ "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -1918,6 +1908,18 @@ "tslib": "^2.4.0" } }, + "node_modules/@emotion/cache": { + "version": "10.0.29", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.29.tgz", + "integrity": "sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==", + "license": "MIT", + "dependencies": { + "@emotion/sheet": "0.9.4", + "@emotion/stylis": "0.8.5", + "@emotion/utils": "0.11.3", + "@emotion/weak-memoize": "0.2.5" + } + }, "node_modules/@emotion/hash": { "version": "0.9.2", "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", @@ -1939,6 +1941,67 @@ "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", "license": "MIT" }, + "node_modules/@emotion/serialize": { + "version": "0.11.16", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.16.tgz", + "integrity": "sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "0.8.0", + "@emotion/memoize": "0.7.4", + "@emotion/unitless": "0.7.5", + "@emotion/utils": "0.11.3", + "csstype": "^2.5.7" + } + }, + "node_modules/@emotion/serialize/node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", + "license": "MIT" + }, + "node_modules/@emotion/serialize/node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "license": "MIT" + }, + "node_modules/@emotion/serialize/node_modules/csstype": { + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", + "license": "MIT" + }, + "node_modules/@emotion/sheet": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-0.9.4.tgz", + "integrity": "sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==", + "license": "MIT" + }, + "node_modules/@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", + "license": "MIT" + }, + "node_modules/@emotion/utils": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz", + "integrity": "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", + "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==", + "license": "MIT" + }, "node_modules/@esbuild-plugins/node-globals-polyfill": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.2.3.tgz", @@ -2491,22 +2554,64 @@ "tslib": "2" } }, - "node_modules/@giphy/colors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@giphy/colors/-/colors-1.0.1.tgz", - "integrity": "sha512-CMUY2UR8Ujl/wTRVjwu9spss6Cf2qkQNATKfoWCTWQp7CXdSfPWUDepp0c0/F0n7lYphLFvD9qzOC4NSdBt7nw==", - "license": "MIT" - }, "node_modules/@giphy/js-analytics": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@giphy/js-analytics/-/js-analytics-5.0.0.tgz", - "integrity": "sha512-jBZG6OqyMWB6meLi8Sz3iLplXYnhkbj+DJhS4ChmRX8Y6UA7i5dbbsUN/So1s7tTjhZOvu0rxA6rWJE73S1FvQ==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@giphy/js-analytics/-/js-analytics-1.8.1.tgz", + "integrity": "sha512-62J4adqtgDGSlLxt6uWOSf2aLi/2H8dE6sQniH8ksVVUFILEhbl/iH3YYNCrJIAebGS2S74tMcQ6jxXbyEfI1A==", "license": "MIT", "dependencies": { - "@giphy/js-types": "*", - "@giphy/js-util": "*", + "@giphy/js-types": "^2.1.0", + "@giphy/js-util": "^1.10.0", + "@types/uuid": "^8.3.0", "append-query": "^2.1.0", - "throttle-debounce": "^3.0.1" + "throttle-debounce": "^2.3.0", + "uuid": "^8.3.0" + } + }, + "node_modules/@giphy/js-analytics/node_modules/@giphy/js-types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@giphy/js-types/-/js-types-2.1.0.tgz", + "integrity": "sha512-s67HZskpuIEViUTTdpoZk4LMwjaU7M0ZbMZuG2ZAzlSIgsJHH0AbrR2U+0DU93oKVY3uJThqGMDrSyDz6GCNjQ==", + "license": "MIT" + }, + "node_modules/@giphy/js-analytics/node_modules/@giphy/js-util": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@giphy/js-util/-/js-util-1.10.0.tgz", + "integrity": "sha512-i5wPJ8ljaoNAOSrqeapdD7u0jtb8IdRbgm0HUHFRKv5zWn2qy3zfs/YpN4cR1SZ9uDFP9gesO2dRL0Pqso7rpQ==", + "license": "MIT", + "dependencies": { + "@giphy/js-types": "^2.1.0", + "dompurify": "^2.0.12", + "uuid": "^8.3.0" + } + }, + "node_modules/@giphy/js-analytics/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@giphy/js-brand": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@giphy/js-brand/-/js-brand-2.3.2.tgz", + "integrity": "sha512-mclG3NI3cpeVEnacum8Hq4+Ste0yF/TIu+cs7VgLlJMybE6K+cvShsz6JiXkyvi8csP7DhFJlbeXERhgV5yFOQ==", + "license": "MIT", + "dependencies": { + "emotion": "10.0.27" + } + }, + "node_modules/@giphy/js-brand/node_modules/emotion": { + "version": "10.0.27", + "resolved": "https://registry.npmjs.org/emotion/-/emotion-10.0.27.tgz", + "integrity": "sha512-2xdDzdWWzue8R8lu4G76uWX5WhyQuzATon9LmNeCy/2BHVC6dsEpfhN1a0qhELgtDVdjyEA6J8Y/VlI5ZnaH0g==", + "license": "MIT", + "dependencies": { + "babel-plugin-emotion": "^10.0.27", + "create-emotion": "^10.0.27" } }, "node_modules/@giphy/js-fetch-api": { @@ -2535,40 +2640,64 @@ "uuid": "^9.0.0" } }, - "node_modules/@giphy/js-util/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "node_modules/@giphy/react-components": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@giphy/react-components/-/react-components-1.6.0.tgz", + "integrity": "sha512-wjBXUvtT28pp6R3WBcCXYcjy2mnk6zJUJLABZz8TA0Jm//TTYhjArFWPfyWHnB16dTkmQ5CGohxUgQ5TJLpjuw==", + "license": "MIT", + "dependencies": { + "@giphy/js-analytics": "^1.7.4", + "@giphy/js-brand": "^2.0.0", + "@giphy/js-fetch-api": "^1.6.1", + "@giphy/js-types": "^2.0.2", + "@giphy/js-util": "^1.9.1", + "bricks.js": "^1.8.0", + "emotion": "10.0.9", + "intersection-observer": "^0.7.0", + "throttle-debounce": "^2.1.0" + }, + "peerDependencies": { + "react": "^16.8.3" + } + }, + "node_modules/@giphy/react-components/node_modules/@giphy/js-fetch-api": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@giphy/js-fetch-api/-/js-fetch-api-1.8.1.tgz", + "integrity": "sha512-8xr888QCYvtEiguAoS+rOLj8lLposvxFORAmwfW/MEqLYM9baCS7anydweaV9AuNO1CUQdf8IE/vLPfYlhZeOQ==", + "license": "MIT", + "dependencies": { + "@giphy/js-types": "^2.1.0", + "@giphy/js-util": "^1.10.0", + "qs": "^6.9.4" + } + }, + "node_modules/@giphy/react-components/node_modules/@giphy/js-types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@giphy/js-types/-/js-types-2.1.0.tgz", + "integrity": "sha512-s67HZskpuIEViUTTdpoZk4LMwjaU7M0ZbMZuG2ZAzlSIgsJHH0AbrR2U+0DU93oKVY3uJThqGMDrSyDz6GCNjQ==", + "license": "MIT" + }, + "node_modules/@giphy/react-components/node_modules/@giphy/js-util": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@giphy/js-util/-/js-util-1.10.0.tgz", + "integrity": "sha512-i5wPJ8ljaoNAOSrqeapdD7u0jtb8IdRbgm0HUHFRKv5zWn2qy3zfs/YpN4cR1SZ9uDFP9gesO2dRL0Pqso7rpQ==", + "license": "MIT", + "dependencies": { + "@giphy/js-types": "^2.1.0", + "dompurify": "^2.0.12", + "uuid": "^8.3.0" + } + }, + "node_modules/@giphy/react-components/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, - "node_modules/@giphy/react-components": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/@giphy/react-components/-/react-components-10.1.2.tgz", - "integrity": "sha512-DVyIgf5az0uzHwnkS8tUaqO4qNx8DoxJupnRLhOl8M5CcvV9ykeZBLDxLj+jyDTySPYaIIJtrlR+8SeV2dHZwQ==", - "license": "MIT", - "dependencies": { - "@giphy/colors": "*", - "@giphy/js-analytics": "*", - "@giphy/js-fetch-api": "*", - "@giphy/js-types": "*", - "@giphy/js-util": "*", - "intersection-observer": "^0.12.2", - "react-use": "17.6.0", - "throttle-debounce": "^3.0.1" - }, - "peerDependencies": { - "react": "18 - 19", - "styled-components": ">= 5" - } - }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", @@ -2651,7 +2780,6 @@ "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", @@ -2673,7 +2801,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -2699,7 +2826,6 @@ "version": "0.3.31", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -4825,23 +4951,6 @@ } } }, - "node_modules/@rollup/plugin-virtual": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-virtual/-/plugin-virtual-3.0.2.tgz", - "integrity": "sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A==", - "dev": true, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, "node_modules/@rollup/plugin-wasm": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-wasm/-/plugin-wasm-6.1.1.tgz", @@ -6619,13 +6728,6 @@ "@swc/counter": "^0.1.3" } }, - "node_modules/@swc/wasm": { - "version": "1.15.33", - "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.15.33.tgz", - "integrity": "sha512-uZPBvYMwjvTtyNm018KFV6ino5ZL4z9riN/tBsfTSgbfONW9Jn+ca88+UeEIdMOZY5Dm+y2OBf6o0kxa1wfD0A==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/@tanstack/query-core": { "version": "5.24.1", "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.24.1.tgz", @@ -6815,12 +6917,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/js-cookie": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.7.tgz", - "integrity": "sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==", - "license": "MIT" - }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -6846,6 +6942,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, "node_modules/@types/prismjs": { "version": "1.26.0", "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.0.tgz", @@ -6934,6 +7036,12 @@ "integrity": "sha512-N1rW+njavs70y2cApeIw1vLMYXRwfBy+7trgavGuuTfOd7j1Yh7QTRc/yqsPl6ncokt72ZXuxEU0PiCp9bSwNQ==", "dev": true }, + "node_modules/@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", + "license": "MIT" + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.46.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.46.1.tgz", @@ -7249,12 +7357,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@xobotyi/scrollbar-width": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz", - "integrity": "sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==", - "license": "MIT" - }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -7676,6 +7778,105 @@ "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", "dev": true }, + "node_modules/babel-plugin-emotion": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.2.2.tgz", + "integrity": "sha512-SMSkGoqTbTyUTDeuVuPIWifPdUGkTk1Kf9BWRiXIOIcuyMfsdp2EjeiiFvOzX8NOBvEh/ypKYvUh2rkgAJMCLA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@emotion/hash": "0.8.0", + "@emotion/memoize": "0.7.4", + "@emotion/serialize": "^0.11.16", + "babel-plugin-macros": "^2.0.0", + "babel-plugin-syntax-jsx": "^6.18.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^1.0.5", + "find-root": "^1.1.0", + "source-map": "^0.5.7" + } + }, + "node_modules/babel-plugin-emotion/node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", + "license": "MIT" + }, + "node_modules/babel-plugin-emotion/node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "license": "MIT" + }, + "node_modules/babel-plugin-emotion/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/babel-plugin-emotion/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/babel-plugin-emotion/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" + } + }, + "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-macros/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.4.12", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", @@ -7724,6 +7925,12 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==", + "license": "MIT" + }, "node_modules/badwords-list": { "version": "2.0.1-4", "resolved": "https://registry.npmjs.org/badwords-list/-/badwords-list-2.0.1-4.tgz", @@ -7858,6 +8065,15 @@ "node": ">=8" } }, + "node_modules/bricks.js": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/bricks.js/-/bricks.js-1.8.0.tgz", + "integrity": "sha512-XJsIGxoixpMDo/KoLXR+uQizFVGWNAQy1lLoIwXKxm6/Zpd9QQLSUd0otybbK7wjqX23ZvCXFxnIw+uCXJHo0A==", + "license": "MIT", + "dependencies": { + "knot.js": "^1.1.5" + } + }, "node_modules/browser-encrypt-attachment": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/browser-encrypt-attachment/-/browser-encrypt-attachment-0.3.0.tgz", @@ -7977,7 +8193,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", - "dev": true, "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -7990,7 +8205,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", - "dev": true, "dependencies": { "call-bind-apply-helpers": "^1.0.1", "get-intrinsic": "^1.2.6" @@ -8006,7 +8220,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "engines": { "node": ">=6" } @@ -8640,15 +8853,6 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, - "node_modules/copy-to-clipboard": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", - "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", - "license": "MIT", - "dependencies": { - "toggle-selection": "^1.0.6" - } - }, "node_modules/core-js-compat": { "version": "3.40.0", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.40.0.tgz", @@ -8746,6 +8950,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/create-emotion": { + "version": "10.0.27", + "resolved": "https://registry.npmjs.org/create-emotion/-/create-emotion-10.0.27.tgz", + "integrity": "sha512-fIK73w82HPPn/RsAij7+Zt8eCE8SptcJ3WoRMfxMtjteYxud8GDTKKld7MYwAX2TVhrw29uR1N/bVGxeStHILg==", + "license": "MIT", + "dependencies": { + "@emotion/cache": "^10.0.27", + "@emotion/serialize": "^0.11.15", + "@emotion/sheet": "0.9.4", + "@emotion/utils": "0.11.3" + } + }, "node_modules/cross-fetch": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", @@ -8787,15 +9003,6 @@ "node": ">=4" } }, - "node_modules/css-in-js-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz", - "integrity": "sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==", - "license": "MIT", - "dependencies": { - "hyphenate-style-name": "^1.0.3" - } - }, "node_modules/css-to-react-native": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", @@ -8807,28 +9014,6 @@ "postcss-value-parser": "^4.0.2" } }, - "node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/css-tree/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/css-what": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", @@ -9021,7 +9206,6 @@ "version": "4.4.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "devOptional": true, "dependencies": { "ms": "^2.1.3" }, @@ -9252,6 +9436,12 @@ "url": "https://github.com/fb55/domhandler?sponsor=1" } }, + "node_modules/dompurify": { + "version": "2.5.9", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.5.9.tgz", + "integrity": "sha512-i6mvVmWN4xo9LrhCOZrDgSs9noW6nOahbrmzjRbPF36YPyj5Ue5lgok0MHDWkG7xzpWFO2OYttXdzM7rJxHvNA==", + "license": "(MPL-2.0 OR Apache-2.0)" + }, "node_modules/domutils": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", @@ -9305,7 +9495,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -9421,6 +9610,16 @@ "dev": true, "license": "MIT" }, + "node_modules/emotion": { + "version": "10.0.9", + "resolved": "https://registry.npmjs.org/emotion/-/emotion-10.0.9.tgz", + "integrity": "sha512-IMFwwWlU2TDt7eh4v6dm58E8VHAYOitqRbVoazQdxIu9/0CAH4a3UrTMnZSlWQAo09MrRRlKfgQFHswnj40meQ==", + "license": "MIT", + "dependencies": { + "babel-plugin-emotion": "^10.0.9", + "create-emotion": "^10.0.9" + } + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -9617,21 +9816,11 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "dev": true, "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, - "node_modules/error-stack-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", - "license": "MIT", - "dependencies": { - "stackframe": "^1.3.4" - } - }, "node_modules/es-abstract": { "version": "1.23.9", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", @@ -9701,7 +9890,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, "engines": { "node": ">= 0.4" } @@ -9710,7 +9898,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, "engines": { "node": ">= 0.4" } @@ -9726,7 +9913,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, "dependencies": { "es-errors": "^1.3.0" }, @@ -10494,7 +10680,8 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "node_modules/fast-glob": { "version": "3.3.3", @@ -10536,11 +10723,6 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, - "node_modules/fast-shallow-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz", - "integrity": "sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==" - }, "node_modules/fast-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", @@ -10558,12 +10740,6 @@ ], "license": "BSD-3-Clause" }, - "node_modules/fastest-stable-stringify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-2.0.2.tgz", - "integrity": "sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==", - "license": "MIT" - }, "node_modules/fastq": { "version": "1.18.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", @@ -10684,7 +10860,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "dev": true, "license": "MIT" }, "node_modules/find-up": { @@ -10963,7 +11138,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -11065,7 +11239,6 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", - "dev": true, "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-define-property": "^1.0.1", @@ -11095,7 +11268,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -11317,7 +11489,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -11430,7 +11601,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -11463,7 +11633,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -11681,12 +11850,6 @@ "url": "https://github.com/sponsors/typicode" } }, - "node_modules/hyphenate-style-name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz", - "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==", - "license": "BSD-3-Clause" - }, "node_modules/i18next": { "version": "23.12.2", "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.12.2.tgz", @@ -11788,7 +11951,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -11890,15 +12052,6 @@ "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" }, - "node_modules/inline-style-prefixer": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-7.0.1.tgz", - "integrity": "sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw==", - "license": "MIT", - "dependencies": { - "css-in-js-utils": "^3.1.0" - } - }, "node_modules/inquirer": { "version": "8.2.5", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", @@ -11967,11 +12120,11 @@ } }, "node_modules/intersection-observer": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.12.2.tgz", - "integrity": "sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.7.0.tgz", + "integrity": "sha512-Id0Fij0HsB/vKWGeBe9PxeY45ttRiBmhFyyt/geBdDHBYNctMRTE3dC1U3ujzz3lap+hVXlEcVaB56kZP/eEUg==", "deprecated": "The Intersection Observer polyfill is no longer needed and can safely be removed. Intersection Observer has been Baseline since 2019.", - "license": "Apache-2.0" + "license": "W3C-20150513" }, "node_modules/intl-messageformat": { "version": "10.7.12", @@ -12022,7 +12175,6 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, "license": "MIT" }, "node_modules/is-async-function": { @@ -12102,7 +12254,6 @@ "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, "dependencies": { "hasown": "^2.0.2" }, @@ -12605,12 +12756,6 @@ } } }, - "node_modules/js-cookie": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", - "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==", - "license": "MIT" - }, "node_modules/js-sdsl": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.2.tgz", @@ -12643,7 +12788,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, "bin": { "jsesc": "bin/jsesc" }, @@ -12668,7 +12812,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, "license": "MIT" }, "node_modules/json-schema": { @@ -12762,6 +12905,12 @@ "json-buffer": "3.0.1" } }, + "node_modules/knot.js": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/knot.js/-/knot.js-1.1.5.tgz", + "integrity": "sha512-ptGtvTrgLNtQj9ilUR+tSyHWTCPp2xu/EHkeo3OvpczzNqBSwjQKz8G7vUhzlRbasXVULBWSejsj6QRQb1pakw==", + "license": "MIT" + }, "node_modules/language-subtag-registry": { "version": "0.3.23", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", @@ -13088,7 +13237,6 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, "license": "MIT" }, "node_modules/linkify-react": { @@ -13822,7 +13970,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, "engines": { "node": ">= 0.4" } @@ -13881,12 +14028,6 @@ "events": "^3.2.0" } }, - "node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "license": "CC0-1.0" - }, "node_modules/media-query-parser": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/media-query-parser/-/media-query-parser-2.0.2.tgz", @@ -14117,8 +14258,7 @@ "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "devOptional": true + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/mute-stream": { "version": "0.0.8", @@ -14145,26 +14285,6 @@ "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==", "optional": true }, - "node_modules/nano-css": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/nano-css/-/nano-css-5.6.2.tgz", - "integrity": "sha512-+6bHaC8dSDGALM1HJjOHVXpuastdu2xFoZlC77Jh4cg+33Zcgm+Gxd+1xsnpZK14eyHObSp82+ll5y3SX75liw==", - "license": "Unlicense", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15", - "css-tree": "^1.1.2", - "csstype": "^3.1.2", - "fastest-stable-stringify": "^2.0.2", - "inline-style-prefixer": "^7.0.1", - "rtl-css-js": "^1.16.1", - "stacktrace-js": "^2.0.2", - "stylis": "^4.3.0" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, "node_modules/nanoid": { "version": "3.3.12", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", @@ -16346,7 +16466,6 @@ "version": "1.13.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -16748,7 +16867,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "dependencies": { "callsites": "^3.0.0" }, @@ -16869,8 +16987,7 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-scurry": { "version": "2.0.2", @@ -16913,7 +17030,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, "engines": { "node": ">=8" } @@ -17217,6 +17333,21 @@ "node": ">=6" } }, + "node_modules/qs": { + "version": "6.15.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", + "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -17481,41 +17612,6 @@ "react-dom": ">=16.8" } }, - "node_modules/react-universal-interface": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/react-universal-interface/-/react-universal-interface-0.6.2.tgz", - "integrity": "sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==", - "peerDependencies": { - "react": "*", - "tslib": "*" - } - }, - "node_modules/react-use": { - "version": "17.6.0", - "resolved": "https://registry.npmjs.org/react-use/-/react-use-17.6.0.tgz", - "integrity": "sha512-OmedEScUMKFfzn1Ir8dBxiLLSOzhKe/dPZwVxcujweSj45aNM7BEGPb9BEVIgVEqEXx6f3/TsXzwIktNgUR02g==", - "license": "Unlicense", - "dependencies": { - "@types/js-cookie": "^2.2.6", - "@xobotyi/scrollbar-width": "^1.9.5", - "copy-to-clipboard": "^3.3.1", - "fast-deep-equal": "^3.1.3", - "fast-shallow-equal": "^1.0.0", - "js-cookie": "^2.2.1", - "nano-css": "^5.6.2", - "react-universal-interface": "^0.6.2", - "resize-observer-polyfill": "^1.5.1", - "screenfull": "^5.1.0", - "set-harmonic-interval": "^1.0.1", - "throttle-debounce": "^3.0.1", - "ts-easing": "^0.2.0", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" - } - }, "node_modules/read-package-up": { "version": "12.0.0", "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-12.0.0.tgz", @@ -17805,17 +17901,10 @@ "node": "*" } }, - "node_modules/resize-observer-polyfill": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", - "license": "MIT" - }, "node_modules/resolve": { "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "dev": true, "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", @@ -17849,7 +17938,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "engines": { "node": ">=4" } @@ -17989,15 +18077,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/rtl-css-js": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz", - "integrity": "sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.1.2" - } - }, "node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -18143,18 +18222,6 @@ "loose-envify": "^1.1.0" } }, - "node_modules/screenfull": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-5.2.0.tgz", - "integrity": "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/scroll-into-view-if-needed": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", @@ -18512,15 +18579,6 @@ "node": ">= 0.4" } }, - "node_modules/set-harmonic-interval": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz", - "integrity": "sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==", - "license": "Unlicense", - "engines": { - "node": ">=6.9" - } - }, "node_modules/set-proto": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", @@ -18560,7 +18618,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dev": true, "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", @@ -18579,7 +18636,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dev": true, "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" @@ -18595,7 +18651,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -18613,7 +18668,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -19025,51 +19079,6 @@ "through2": "~2.0.0" } }, - "node_modules/stack-generator": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz", - "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==", - "license": "MIT", - "dependencies": { - "stackframe": "^1.3.4" - } - }, - "node_modules/stackframe": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "license": "MIT" - }, - "node_modules/stacktrace-gps": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz", - "integrity": "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==", - "license": "MIT", - "dependencies": { - "source-map": "0.5.6", - "stackframe": "^1.3.4" - } - }, - "node_modules/stacktrace-gps/node_modules/source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stacktrace-js": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz", - "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==", - "license": "MIT", - "dependencies": { - "error-stack-parser": "^2.0.6", - "stack-generator": "^2.0.5", - "stacktrace-gps": "^3.0.4" - } - }, "node_modules/stream-combiner2": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", @@ -19367,12 +19376,6 @@ "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", "license": "MIT" }, - "node_modules/stylis": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.4.0.tgz", - "integrity": "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==", - "license": "MIT" - }, "node_modules/super-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-1.1.0.tgz", @@ -19424,7 +19427,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -19549,12 +19551,12 @@ } }, "node_modules/throttle-debounce": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz", - "integrity": "sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-2.3.0.tgz", + "integrity": "sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ==", "license": "MIT", "engines": { - "node": ">=10" + "node": ">=8" } }, "node_modules/through": { @@ -19689,12 +19691,6 @@ "node": ">=8.0" } }, - "node_modules/toggle-selection": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==", - "license": "MIT" - }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -19713,12 +19709,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ts-easing": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz", - "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==", - "license": "Unlicense" - }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -20121,14 +20111,15 @@ "devOptional": true }, "node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "dev": true, + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -20375,16 +20366,13 @@ } }, "node_modules/vite-plugin-top-level-await": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/vite-plugin-top-level-await/-/vite-plugin-top-level-await-1.6.0.tgz", - "integrity": "sha512-bNhUreLamTIkoulCR9aDXbTbhLk6n1YE8NJUTTxl5RYskNRtzOR0ASzSjBVRtNdjIfngDXo11qOsybGLNsrdww==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/vite-plugin-top-level-await/-/vite-plugin-top-level-await-1.2.2.tgz", + "integrity": "sha512-JBuY9X5KCxZyzwQUOIBpgX0Jbe2BECxwElWPeyrdRC5xaWzDibTG65QBW25COmwqHBeVlV04u8GTlJkuOWhfgw==", "dev": true, "license": "MIT", "dependencies": { - "@rollup/plugin-virtual": "^3.0.2", - "@swc/core": "^1.12.14", - "@swc/wasm": "^1.12.14", - "uuid": "10.0.0" + "@swc/core": "^1.3.10" }, "peerDependencies": { "vite": ">=2.8" @@ -21414,6 +21402,15 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, + "node_modules/yaml": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", diff --git a/package.json b/package.json index 8bd80ab4f..aea401e8f 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "@fontsource/inter": "4.5.14", "@giphy/js-fetch-api": "5.8.0", "@giphy/js-types": "5.1.0", - "@giphy/react-components": "10.1.2", + "@giphy/react-components": "1.6.0", "@sentry/react": "10.53.1", "@tanstack/react-query": "5.24.1", "@tanstack/react-query-devtools": "5.24.1", @@ -162,6 +162,6 @@ "vite": "6.4.2", "vite-plugin-pwa": "1.3.0", "vite-plugin-static-copy": "4.1.0", - "vite-plugin-top-level-await": "1.6.0" + "vite-plugin-top-level-await": "1.2.2" } } diff --git a/public/config.json b/public/config.json index e82b5b4fa..58aa9a4f8 100644 --- a/public/config.json +++ b/public/config.json @@ -1,8 +1,6 @@ { "defaultHomeserver": 0, - "homeserverList": [ - "matrix.lotusguild.org" - ], + "homeserverList": ["matrix.lotusguild.org"], "allowCustomHomeservers": false, "featuredCommunities": { "openAsDefault": false, diff --git a/public/manifest.json b/public/manifest.json index d618559d8..3e1378bbd 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -56,11 +56,7 @@ "type": "image/png" } ], - "categories": [ - "social", - "communication", - "productivity" - ], + "categories": ["social", "communication", "productivity"], "shortcuts": [ { "name": "New Message", diff --git a/scripts/patch-folds.mjs b/scripts/patch-folds.mjs index 19132afb1..d3427e8e6 100644 --- a/scripts/patch-folds.mjs +++ b/scripts/patch-folds.mjs @@ -7,11 +7,11 @@ const foldsPath = join(__dirname, '../node_modules/folds/dist/index.js'); try { let content = readFileSync(foldsPath, 'utf8'); - + // Defensive guard: if src is not a function, render null instead of crashing const original = 'children: src(filled)'; const patched = 'children: typeof src === "function" ? src(filled) : null'; - + if (content.includes(patched)) { console.log('folds patch already applied.'); } else if (content.includes(original)) { diff --git a/scripts/update-version.js b/scripts/update-version.js index d3ef1baec..f6256935b 100644 --- a/scripts/update-version.js +++ b/scripts/update-version.js @@ -1,7 +1,7 @@ -import fs from "fs"; -import path from "path"; -import { execSync } from "child_process"; -import { fileURLToPath } from "url"; +import fs from 'fs'; +import path from 'path'; +import { execSync } from 'child_process'; +import { fileURLToPath } from 'url'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -9,26 +9,26 @@ const __dirname = path.dirname(__filename); const version = process.argv[2]; if (!version) { - console.error("Version argument missing"); + console.error('Version argument missing'); process.exit(1); } -const root = path.resolve(__dirname, ".."); +const root = path.resolve(__dirname, '..'); const newVersionTag = `v${version}`; // Update package.json + package-lock.json safely execSync(`npm version ${version} --no-git-tag-version`, { cwd: root, - stdio: "inherit", + stdio: 'inherit', }); console.log(`Updated package.json and package-lock.json → ${version}`); // Update UI version references const files = [ - "src/app/features/settings/about/About.tsx", - "src/app/pages/auth/AuthFooter.tsx", - "src/app/pages/client/WelcomePage.tsx", + 'src/app/features/settings/about/About.tsx', + 'src/app/pages/auth/AuthFooter.tsx', + 'src/app/pages/client/WelcomePage.tsx', ]; files.forEach((filePath) => { @@ -39,10 +39,10 @@ files.forEach((filePath) => { return; } - const content = fs.readFileSync(absPath, "utf8"); + const content = fs.readFileSync(absPath, 'utf8'); const updated = content.replace(/v\d+\.\d+\.\d+/g, newVersionTag); fs.writeFileSync(absPath, updated); console.log(`Updated ${filePath} → ${newVersionTag}`); -}); \ No newline at end of file +}); diff --git a/src/app/components/CallEmbedProvider.tsx b/src/app/components/CallEmbedProvider.tsx index 8051299d4..36864324e 100644 --- a/src/app/components/CallEmbedProvider.tsx +++ b/src/app/components/CallEmbedProvider.tsx @@ -137,7 +137,10 @@ function IncomingCall({ dm, info, onIgnore, onAnswer, onReject }: IncomingCallPr useEffect(() => { const remaining = info.senderTs + info.lifetime - Date.now(); - if (remaining <= 0) { onIgnore(); return; } + if (remaining <= 0) { + onIgnore(); + return; + } const id = setTimeout(onIgnore, remaining); return () => clearTimeout(id); }, [info.senderTs, info.lifetime, onIgnore]); @@ -157,7 +160,9 @@ function IncomingCall({ dm, info, onIgnore, onAnswer, onReject }: IncomingCallPr - {getMemberDisplayName(info.room, info.sender) ?? getMxIdLocalPart(info.sender) ?? info.sender} + {getMemberDisplayName(info.room, info.sender) ?? + getMxIdLocalPart(info.sender) ?? + info.sender} @@ -294,7 +299,8 @@ function IncomingCallListener({ callEmbed, joined }: IncomingCallListenerProps) const refEventId = relation?.event_id; const mention = - content['m.mentions']?.room || content['m.mentions']?.user_ids?.includes(mx.getSafeUserId()); + content['m.mentions']?.room || + content['m.mentions']?.user_ids?.includes(mx.getSafeUserId()); if (!sender || !refEventId || !mention || Date.now() >= senderTs + lifetime) { return; } @@ -410,10 +416,19 @@ export function CallEmbedProvider({ children }: CallEmbedProviderProps) { const { navigateRoom } = useRoomNavigate(); const pipDragRef = React.useRef<{ - startX: number; startY: number; origLeft: number; origTop: number; dragged: boolean; + startX: number; + startY: number; + origLeft: number; + origTop: number; + dragged: boolean; } | null>(null); const activeDragCleanupRef = React.useRef<(() => void) | null>(null); - React.useEffect(() => () => { activeDragCleanupRef.current?.(); }, []); + React.useEffect( + () => () => { + activeDragCleanupRef.current?.(); + }, + [] + ); // Track previous pipMode to only reset position when first entering pip (not on callVisible changes) const prevPipModeRef = React.useRef(false); @@ -422,16 +437,35 @@ export function CallEmbedProvider({ children }: CallEmbedProviderProps) { if (!el) return; if (pipMode) { if (!prevPipModeRef.current) { - el.style.top = 'auto'; el.style.left = 'auto'; - el.style.bottom = '72px'; el.style.right = '16px'; - el.style.width = '280px'; el.style.height = '158px'; - el.style.borderRadius = '12px'; el.style.overflow = 'hidden'; - el.style.zIndex = '99'; el.style.boxShadow = '0 8px 32px rgba(0,0,0,0.55)'; + el.style.top = 'auto'; + el.style.left = 'auto'; + el.style.bottom = '72px'; + el.style.right = '16px'; + el.style.width = '280px'; + el.style.height = '158px'; + el.style.borderRadius = '12px'; + el.style.overflow = 'hidden'; + el.style.zIndex = '99'; + el.style.boxShadow = '0 8px 32px rgba(0,0,0,0.55)'; el.style.border = '1px solid rgba(255,255,255,0.1)'; } el.style.visibility = 'visible'; } else { - ['top','left','bottom','right','width','height','borderRadius','overflow','zIndex','boxShadow','border'].forEach(p => { (el.style as any)[p] = ''; }); + [ + 'top', + 'left', + 'bottom', + 'right', + 'width', + 'height', + 'borderRadius', + 'overflow', + 'zIndex', + 'boxShadow', + 'border', + ].forEach((p) => { + (el.style as any)[p] = ''; + }); el.style.visibility = callVisible ? '' : 'hidden'; } prevPipModeRef.current = pipMode; @@ -444,30 +478,66 @@ export function CallEmbedProvider({ children }: CallEmbedProviderProps) { if (!el) return; const l = parseFloat(el.style.left); const t = parseFloat(el.style.top); - if (!isNaN(l)) el.style.left = `${Math.max(0, Math.min(l, window.innerWidth - el.offsetWidth))}px`; - if (!isNaN(t)) el.style.top = `${Math.max(0, Math.min(t, window.innerHeight - el.offsetHeight))}px`; + if (!isNaN(l)) + el.style.left = `${Math.max(0, Math.min(l, window.innerWidth - el.offsetWidth))}px`; + if (!isNaN(t)) + el.style.top = `${Math.max(0, Math.min(t, window.innerHeight - el.offsetHeight))}px`; }; window.addEventListener('resize', onPipWindowResize); return () => window.removeEventListener('resize', onPipWindowResize); }, [pipMode, callEmbedRef]); const handlePipMouseDown = (e: React.MouseEvent) => { - const el = callEmbedRef.current; if (!el) return; + const el = callEmbedRef.current; + if (!el) return; const rect = el.getBoundingClientRect(); - pipDragRef.current = { startX: e.clientX, startY: e.clientY, origLeft: rect.left, origTop: rect.top, dragged: false }; + pipDragRef.current = { + startX: e.clientX, + startY: e.clientY, + origLeft: rect.left, + origTop: rect.top, + dragged: false, + }; const onMove = (ev: MouseEvent) => { if (!pipDragRef.current || !el) return; - const dx = ev.clientX - pipDragRef.current.startX, dy = ev.clientY - pipDragRef.current.startY; - if (!pipDragRef.current.dragged && Math.abs(dx)+Math.abs(dy) > 5) { pipDragRef.current.dragged = true; document.body.style.cursor = 'grabbing'; document.body.style.userSelect = 'none'; } + const dx = ev.clientX - pipDragRef.current.startX, + dy = ev.clientY - pipDragRef.current.startY; + if (!pipDragRef.current.dragged && Math.abs(dx) + Math.abs(dy) > 5) { + pipDragRef.current.dragged = true; + document.body.style.cursor = 'grabbing'; + document.body.style.userSelect = 'none'; + } if (pipDragRef.current.dragged) { - el.style.left = `${Math.max(0, Math.min(window.innerWidth-el.offsetWidth, pipDragRef.current.origLeft+dx))}px`; - el.style.top = `${Math.max(0, Math.min(window.innerHeight-el.offsetHeight, pipDragRef.current.origTop+dy))}px`; - el.style.right = 'auto'; el.style.bottom = 'auto'; + el.style.left = `${Math.max( + 0, + Math.min(window.innerWidth - el.offsetWidth, pipDragRef.current.origLeft + dx) + )}px`; + el.style.top = `${Math.max( + 0, + Math.min(window.innerHeight - el.offsetHeight, pipDragRef.current.origTop + dy) + )}px`; + el.style.right = 'auto'; + el.style.bottom = 'auto'; } }; - const onUp = () => { document.removeEventListener('mousemove', onMove); document.removeEventListener('mouseup', onUp); document.body.style.cursor = ''; document.body.style.userSelect = ''; activeDragCleanupRef.current = null; setTimeout(() => { if (pipDragRef.current) pipDragRef.current.dragged = false; }, 0); }; - activeDragCleanupRef.current = () => { document.removeEventListener('mousemove', onMove); document.removeEventListener('mouseup', onUp); document.body.style.cursor = ''; document.body.style.userSelect = ''; }; - document.addEventListener('mousemove', onMove); document.addEventListener('mouseup', onUp); + const onUp = () => { + document.removeEventListener('mousemove', onMove); + document.removeEventListener('mouseup', onUp); + document.body.style.cursor = ''; + document.body.style.userSelect = ''; + activeDragCleanupRef.current = null; + setTimeout(() => { + if (pipDragRef.current) pipDragRef.current.dragged = false; + }, 0); + }; + activeDragCleanupRef.current = () => { + document.removeEventListener('mousemove', onMove); + document.removeEventListener('mouseup', onUp); + document.body.style.cursor = ''; + document.body.style.userSelect = ''; + }; + document.addEventListener('mousemove', onMove); + document.addEventListener('mouseup', onUp); }; const handlePipTouchStart = (e: React.TouchEvent) => { @@ -475,50 +545,115 @@ export function CallEmbedProvider({ children }: CallEmbedProviderProps) { if (!el || e.touches.length !== 1) return; const touch = e.touches[0]; const rect = el.getBoundingClientRect(); - pipDragRef.current = { startX: touch.clientX, startY: touch.clientY, origLeft: rect.left, origTop: rect.top, dragged: false }; + pipDragRef.current = { + startX: touch.clientX, + startY: touch.clientY, + origLeft: rect.left, + origTop: rect.top, + dragged: false, + }; const onTouchMove = (ev: TouchEvent) => { if (!pipDragRef.current || !el || ev.touches.length !== 1) return; ev.preventDefault(); const t = ev.touches[0]; const dx = t.clientX - pipDragRef.current.startX; const dy = t.clientY - pipDragRef.current.startY; - if (!pipDragRef.current.dragged && Math.abs(dx) + Math.abs(dy) > 5) pipDragRef.current.dragged = true; + if (!pipDragRef.current.dragged && Math.abs(dx) + Math.abs(dy) > 5) + pipDragRef.current.dragged = true; if (pipDragRef.current.dragged) { - el.style.left = `${Math.max(0, Math.min(window.innerWidth - el.offsetWidth, pipDragRef.current.origLeft + dx))}px`; - el.style.top = `${Math.max(0, Math.min(window.innerHeight - el.offsetHeight, pipDragRef.current.origTop + dy))}px`; - el.style.right = 'auto'; el.style.bottom = 'auto'; + el.style.left = `${Math.max( + 0, + Math.min(window.innerWidth - el.offsetWidth, pipDragRef.current.origLeft + dx) + )}px`; + el.style.top = `${Math.max( + 0, + Math.min(window.innerHeight - el.offsetHeight, pipDragRef.current.origTop + dy) + )}px`; + el.style.right = 'auto'; + el.style.bottom = 'auto'; } }; const onTouchEnd = () => { document.removeEventListener('touchmove', onTouchMove); document.removeEventListener('touchend', onTouchEnd); activeDragCleanupRef.current = null; - setTimeout(() => { if (pipDragRef.current) pipDragRef.current.dragged = false; }, 0); + setTimeout(() => { + if (pipDragRef.current) pipDragRef.current.dragged = false; + }, 0); + }; + activeDragCleanupRef.current = () => { + document.removeEventListener('touchmove', onTouchMove); + document.removeEventListener('touchend', onTouchEnd); }; - activeDragCleanupRef.current = () => { document.removeEventListener('touchmove', onTouchMove); document.removeEventListener('touchend', onTouchEnd); }; document.addEventListener('touchmove', onTouchMove, { passive: false }); document.addEventListener('touchend', onTouchEnd); }; const handleResizeMouseDown = (e: React.MouseEvent, corner: Corner) => { - e.stopPropagation(); e.preventDefault(); - const el = callEmbedRef.current; if (!el) return; + e.stopPropagation(); + e.preventDefault(); + const el = callEmbedRef.current; + if (!el) return; normaliseToTopLeft(el); - const sx = e.clientX, sy = e.clientY, sw = el.offsetWidth, sh = el.offsetHeight; - const sl = parseFloat(el.style.left), st = parseFloat(el.style.top); - document.body.style.cursor = `${corner}-resize`; document.body.style.userSelect = 'none'; + const sx = e.clientX, + sy = e.clientY, + sw = el.offsetWidth, + sh = el.offsetHeight; + const sl = parseFloat(el.style.left), + st = parseFloat(el.style.top); + document.body.style.cursor = `${corner}-resize`; + document.body.style.userSelect = 'none'; const onMove = (ev: MouseEvent) => { - const dx = ev.clientX-sx, dy = ev.clientY-sy; - let w = sw, h = sh, l = sl, t = st; - if (corner==='se'){w=sw+dx;h=sh+dy;} if (corner==='sw'){w=sw-dx;h=sh+dy;l=sl+sw-Math.max(PIP_MIN_W,w);} - if (corner==='ne'){w=sw+dx;h=sh-dy;t=st+sh-Math.max(PIP_MIN_H,h);} if (corner==='nw'){w=sw-dx;h=sh-dy;l=sl+sw-Math.max(PIP_MIN_W,w);t=st+sh-Math.max(PIP_MIN_H,h);} - w=Math.max(PIP_MIN_W,Math.min(w,window.innerWidth)); h=Math.max(PIP_MIN_H,Math.min(h,window.innerHeight)); - l=Math.max(0,Math.min(l,window.innerWidth-PIP_MIN_W)); t=Math.max(0,Math.min(t,window.innerHeight-PIP_MIN_H)); - el.style.width=`${w}px`; el.style.height=`${h}px`; el.style.left=`${l}px`; el.style.top=`${t}px`; + const dx = ev.clientX - sx, + dy = ev.clientY - sy; + let w = sw, + h = sh, + l = sl, + t = st; + if (corner === 'se') { + w = sw + dx; + h = sh + dy; + } + if (corner === 'sw') { + w = sw - dx; + h = sh + dy; + l = sl + sw - Math.max(PIP_MIN_W, w); + } + if (corner === 'ne') { + w = sw + dx; + h = sh - dy; + t = st + sh - Math.max(PIP_MIN_H, h); + } + if (corner === 'nw') { + w = sw - dx; + h = sh - dy; + l = sl + sw - Math.max(PIP_MIN_W, w); + t = st + sh - Math.max(PIP_MIN_H, h); + } + w = Math.max(PIP_MIN_W, Math.min(w, window.innerWidth)); + h = Math.max(PIP_MIN_H, Math.min(h, window.innerHeight)); + l = Math.max(0, Math.min(l, window.innerWidth - PIP_MIN_W)); + t = Math.max(0, Math.min(t, window.innerHeight - PIP_MIN_H)); + el.style.width = `${w}px`; + el.style.height = `${h}px`; + el.style.left = `${l}px`; + el.style.top = `${t}px`; }; - const onUp = () => { document.removeEventListener('mousemove', onMove); document.removeEventListener('mouseup', onUp); document.body.style.cursor=''; document.body.style.userSelect=''; activeDragCleanupRef.current = null; }; - activeDragCleanupRef.current = () => { document.removeEventListener('mousemove', onMove); document.removeEventListener('mouseup', onUp); document.body.style.cursor=''; document.body.style.userSelect=''; }; - document.addEventListener('mousemove', onMove); document.addEventListener('mouseup', onUp); + const onUp = () => { + document.removeEventListener('mousemove', onMove); + document.removeEventListener('mouseup', onUp); + document.body.style.cursor = ''; + document.body.style.userSelect = ''; + activeDragCleanupRef.current = null; + }; + activeDragCleanupRef.current = () => { + document.removeEventListener('mousemove', onMove); + document.removeEventListener('mouseup', onUp); + document.body.style.cursor = ''; + document.body.style.userSelect = ''; + }; + document.addEventListener('mousemove', onMove); + document.addEventListener('mouseup', onUp); }; return ( @@ -548,25 +683,71 @@ export function CallEmbedProvider({ children }: CallEmbedProviderProps) { aria-label="Return to call" onMouseDown={handlePipMouseDown} onTouchStart={handlePipTouchStart} - onClick={() => { if (!pipDragRef.current?.dragged) navigateRoom(callEmbed.roomId); }} + onClick={() => { + if (!pipDragRef.current?.dragged) navigateRoom(callEmbed.roomId); + }} onKeyDown={(e) => e.key === 'Enter' && navigateRoom(callEmbed.roomId)} - style={{ position:'absolute', inset:0, zIndex:1, background:'transparent', cursor:'grab', display:'flex', alignItems:'flex-start', justifyContent:'flex-end', padding:'6px' }} + style={{ + position: 'absolute', + inset: 0, + zIndex: 1, + background: 'transparent', + cursor: 'grab', + display: 'flex', + alignItems: 'flex-start', + justifyContent: 'flex-end', + padding: '6px', + }} > -
+
↗ Return to call
- {(['se','sw','ne','nw'] as Corner[]).map((corner) => { - const s = corner.includes('s'); const e2 = corner.includes('e'); - const dots = [[2,2],[2,7],[7,2]].map(([a,b]) => ({ - position:'absolute' as const, width:4, height:4, borderRadius:'50%', - background:'rgba(255,255,255,0.45)', - [s?'bottom':'top']:a, [e2?'right':'left']:b, + {(['se', 'sw', 'ne', 'nw'] as Corner[]).map((corner) => { + const s = corner.includes('s'); + const e2 = corner.includes('e'); + const dots = [ + [2, 2], + [2, 7], + [7, 2], + ].map(([a, b]) => ({ + position: 'absolute' as const, + width: 4, + height: 4, + borderRadius: '50%', + background: 'rgba(255,255,255,0.45)', + [s ? 'bottom' : 'top']: a, + [e2 ? 'right' : 'left']: b, })); return ( -
handleResizeMouseDown(ev, corner)} onClick={(ev) => ev.stopPropagation()} - style={{ position:'absolute', width:'18px', height:'18px', [s?'bottom':'top']:0, [e2?'right':'left']:0, cursor:`${corner}-resize`, zIndex:2 }}> - {dots.map((style, i) =>
)} +
handleResizeMouseDown(ev, corner)} + onClick={(ev) => ev.stopPropagation()} + style={{ + position: 'absolute', + width: '18px', + height: '18px', + [s ? 'bottom' : 'top']: 0, + [e2 ? 'right' : 'left']: 0, + cursor: `${corner}-resize`, + zIndex: 2, + }} + > + {dots.map((style, i) => ( +
+ ))}
); })} diff --git a/src/app/components/DeviceVerification.tsx b/src/app/components/DeviceVerification.tsx index 5db4aa2e7..4bdba9adb 100644 --- a/src/app/components/DeviceVerification.tsx +++ b/src/app/components/DeviceVerification.tsx @@ -259,9 +259,16 @@ export function DeviceVerification({ request, onExit }: DeviceVerificationProps)
- Device Verification + + Device Verification + - +
diff --git a/src/app/components/DeviceVerificationSetup.tsx b/src/app/components/DeviceVerificationSetup.tsx index e782ce69c..d92f14bb2 100644 --- a/src/app/components/DeviceVerificationSetup.tsx +++ b/src/app/components/DeviceVerificationSetup.tsx @@ -299,7 +299,9 @@ export const DeviceVerificationSetup = forwardRef - Setup Device Verification + + Setup Device Verification + @@ -334,7 +336,9 @@ export const DeviceVerificationReset = forwardRef - Reset Device Verification + + Reset Device Verification + diff --git a/src/app/components/GifPicker.tsx b/src/app/components/GifPicker.tsx index bd403cd5e..cb96c7423 100644 --- a/src/app/components/GifPicker.tsx +++ b/src/app/components/GifPicker.tsx @@ -8,7 +8,6 @@ import { settingsAtom } from '../state/settings'; const PICKER_WIDTH = 312; - type GifPickerInnerProps = { onSelect: (url: string, width: number, height: number) => void; requestClose: () => void; @@ -34,23 +33,27 @@ function GifPickerInner({ onSelect, requestClose, lotusTerminal }: GifPickerInne return ( {lotusTerminal && ( -
+
// GIF_SEARCH
)} -
+
- + diff --git a/src/app/components/LogoutDialog.tsx b/src/app/components/LogoutDialog.tsx index 3cba32f80..a948ca401 100644 --- a/src/app/components/LogoutDialog.tsx +++ b/src/app/components/LogoutDialog.tsx @@ -43,7 +43,9 @@ export const LogoutDialog = forwardRef( size="500" > - Logout + + Logout + diff --git a/src/app/components/RoomSkeleton.tsx b/src/app/components/RoomSkeleton.tsx index 1528596cb..d3f60e6a8 100644 --- a/src/app/components/RoomSkeleton.tsx +++ b/src/app/components/RoomSkeleton.tsx @@ -22,7 +22,8 @@ export function RoomSkeleton() { `; const shimmer = { - background: 'linear-gradient(90deg, var(--skeleton-base) 25%, var(--skeleton-shine) 50%, var(--skeleton-base) 75%)', + background: + 'linear-gradient(90deg, var(--skeleton-base) 25%, var(--skeleton-shine) 50%, var(--skeleton-base) 75%)', backgroundSize: '800px 100%', animation: `shimmer-${id} 1.6s ease-in-out infinite`, borderRadius: '4px', @@ -32,16 +33,18 @@ export function RoomSkeleton() { <>
{/* Header — matches PageHeader size="600" (56px) */}
{/* Avatar */} -
+
{/* Room name */}
{/* Spacer */} @@ -70,7 +81,16 @@ export function RoomSkeleton() {
{MESSAGES.map((msg, i) => ( // eslint-disable-next-line react/no-array-index-key -
+
{/* Avatar — only shown on first message in a group */}
{msg.showAvatar && ( diff --git a/src/app/components/editor/Editor.preview.tsx b/src/app/components/editor/Editor.preview.tsx index 92371f8f3..eb263da15 100644 --- a/src/app/components/editor/Editor.preview.tsx +++ b/src/app/components/editor/Editor.preview.tsx @@ -23,7 +23,11 @@ export function EditorPreview() { return ( <> - setOpen(!open)}> + setOpen(!open)} + > }> @@ -58,7 +62,12 @@ export function EditorPreview() { > - + diff --git a/src/app/components/editor/Toolbar.tsx b/src/app/components/editor/Toolbar.tsx index d98080205..da1cedfe4 100644 --- a/src/app/components/editor/Toolbar.tsx +++ b/src/app/components/editor/Toolbar.tsx @@ -279,44 +279,42 @@ export function Toolbar() { } + tooltip={} /> } + tooltip={} /> } + tooltip={ + + } /> } + tooltip={ + + } /> } + tooltip={ + + } /> } + tooltip={} /> @@ -325,30 +323,34 @@ export function Toolbar() { } + tooltip={ + + } /> } + tooltip={ + + } /> } + tooltip={ + + } /> } + tooltip={ + + } /> diff --git a/src/app/components/event-readers/EventReaders.tsx b/src/app/components/event-readers/EventReaders.tsx index 58b1f56ea..37ef858c5 100644 --- a/src/app/components/event-readers/EventReaders.tsx +++ b/src/app/components/event-readers/EventReaders.tsx @@ -68,10 +68,30 @@ export const EventReaders = as<'div', EventReadersProps>( className={css.Header} variant="Surface" size="600" - style={lotusTerminal ? { borderBottom: '1px solid rgba(0,212,255,0.30)', boxShadow: '0 2px 12px rgba(0,212,255,0.08)' } : undefined} + style={ + lotusTerminal + ? { + borderBottom: '1px solid rgba(0,212,255,0.30)', + boxShadow: '0 2px 12px rgba(0,212,255,0.08)', + } + : undefined + } > - Seen by + + Seen by + @@ -120,9 +140,15 @@ export const EventReaders = as<'div', EventReadersProps>( {receiptTs !== undefined && ( {formatReadTs(receiptTs, hour24Clock)} diff --git a/src/app/components/join-address-prompt/JoinAddressPrompt.tsx b/src/app/components/join-address-prompt/JoinAddressPrompt.tsx index 1a5d7c3f0..672a932bb 100644 --- a/src/app/components/join-address-prompt/JoinAddressPrompt.tsx +++ b/src/app/components/join-address-prompt/JoinAddressPrompt.tsx @@ -80,7 +80,9 @@ export function JoinAddressPrompt({ onOpen, onCancel }: JoinAddressProps) { size="500" > - Join with Address + + Join with Address + diff --git a/src/app/components/leave-room-prompt/LeaveRoomPrompt.tsx b/src/app/components/leave-room-prompt/LeaveRoomPrompt.tsx index 2573b6345..c84480b19 100644 --- a/src/app/components/leave-room-prompt/LeaveRoomPrompt.tsx +++ b/src/app/components/leave-room-prompt/LeaveRoomPrompt.tsx @@ -66,7 +66,9 @@ export function LeaveRoomPrompt({ roomId, onDone, onCancel }: LeaveRoomPromptPro size="500" > - Leave Room + + Leave Room + diff --git a/src/app/components/leave-space-prompt/LeaveSpacePrompt.tsx b/src/app/components/leave-space-prompt/LeaveSpacePrompt.tsx index 612c41117..d4c59e379 100644 --- a/src/app/components/leave-space-prompt/LeaveSpacePrompt.tsx +++ b/src/app/components/leave-space-prompt/LeaveSpacePrompt.tsx @@ -66,7 +66,9 @@ export function LeaveSpacePrompt({ roomId, onDone, onCancel }: LeaveSpacePromptP size="500" > - Leave Space + + Leave Space + diff --git a/src/app/components/message/FileHeader.tsx b/src/app/components/message/FileHeader.tsx index 542bd515e..44ce4d384 100644 --- a/src/app/components/message/FileHeader.tsx +++ b/src/app/components/message/FileHeader.tsx @@ -48,7 +48,13 @@ export function FileDownloadButton({ filename, url, mimeType, encInfo }: FileDow variant={hasError ? 'Critical' : 'SurfaceVariant'} size="300" radii="300" - aria-label={downloading ? 'Downloading...' : hasError ? 'Download failed, click to retry' : 'Download file'} + aria-label={ + downloading + ? 'Downloading...' + : hasError + ? 'Download failed, click to retry' + : 'Download file' + } > {downloading ? ( diff --git a/src/app/components/message/MsgTypeRenderers.tsx b/src/app/components/message/MsgTypeRenderers.tsx index d7dceef3c..8f152c2da 100644 --- a/src/app/components/message/MsgTypeRenderers.tsx +++ b/src/app/components/message/MsgTypeRenderers.tsx @@ -394,7 +394,9 @@ export function MLocation({ content }: MLocationProps) { const lat = parseFloat(location.latitude); const lon = parseFloat(location.longitude); if (!isFinite(lat) || !isFinite(lon)) return ; - const mapSrc = `https://www.openstreetmap.org/export/embed.html?bbox=${lon - 0.007},${lat - 0.004},${lon + 0.007},${lat + 0.004}&layer=mapnik&marker=${lat},${lon}`; + const mapSrc = `https://www.openstreetmap.org/export/embed.html?bbox=${lon - 0.007},${ + lat - 0.004 + },${lon + 0.007},${lat + 0.004}&layer=mapnik&marker=${lat},${lon}`; return ( diff --git a/src/app/components/message/Reaction.tsx b/src/app/components/message/Reaction.tsx index 93180e405..34b2dc6e5 100644 --- a/src/app/components/message/Reaction.tsx +++ b/src/app/components/message/Reaction.tsx @@ -29,8 +29,7 @@ export const Reaction = as< {reaction.startsWith('mxc://') ? ( {reaction} ) : ( diff --git a/src/app/components/message/content/FallbackContent.tsx b/src/app/components/message/content/FallbackContent.tsx index f917b09db..a1988fe4a 100644 --- a/src/app/components/message/content/FallbackContent.tsx +++ b/src/app/components/message/content/FallbackContent.tsx @@ -8,7 +8,9 @@ export const MessageDeletedContent = as<'div', { children?: never; reason?: stri ({ reason, ...props }, ref) => ( - {reason ? `This message has been deleted — ${reason}` : 'This message has been deleted'} + + {reason ? `This message has been deleted — ${reason}` : 'This message has been deleted'} + ) ); diff --git a/src/app/components/message/content/PollContent.tsx b/src/app/components/message/content/PollContent.tsx index 1aaa5b46f..7fc408196 100644 --- a/src/app/components/message/content/PollContent.tsx +++ b/src/app/components/message/content/PollContent.tsx @@ -105,9 +105,9 @@ export function PollContent({ const mx = useMatrixClient(); const isStable = !!content['m.poll']; - const poll = ( - content['m.poll'] ?? content['org.matrix.msc3381.poll.start'] - ) as PollData | undefined; + const poll = (content['m.poll'] ?? content['org.matrix.msc3381.poll.start']) as + | PollData + | undefined; const [votes, setVotes] = useState(() => { if (!roomId || !eventId) return { counts: new Map(), myVote: null, total: 0 }; @@ -259,7 +259,9 @@ export function PollContent({ padding: '7px 12px', borderRadius: '8px', background: selected ? 'var(--bg-surface-active)' : 'var(--bg-surface-low)', - border: `1px solid ${selected ? 'var(--text-primary)' : 'var(--bg-surface-border)'}`, + border: `1px solid ${ + selected ? 'var(--text-primary)' : 'var(--bg-surface-border)' + }`, fontSize: '0.88rem', lineHeight: 1.4, textAlign: 'left', @@ -281,23 +283,21 @@ export function PollContent({ position: 'absolute', inset: 0, width: `${pct}%`, - background: selected - ? 'rgba(255,255,255,0.10)' - : 'rgba(255,255,255,0.05)', + background: selected ? 'rgba(255,255,255,0.10)' : 'rgba(255,255,255,0.05)', borderRadius: '8px', pointerEvents: 'none', }} /> )} - + {text} {selected && ( )} {total > 0 && ( - - {pct}% - + {pct}% )} diff --git a/src/app/components/read-receipt-avatars/ReadReceiptAvatars.tsx b/src/app/components/read-receipt-avatars/ReadReceiptAvatars.tsx index eec087186..7e3ed08be 100644 --- a/src/app/components/read-receipt-avatars/ReadReceiptAvatars.tsx +++ b/src/app/components/read-receipt-avatars/ReadReceiptAvatars.tsx @@ -79,7 +79,9 @@ export function ReadReceiptAvatars({ style={{ display: 'flex', alignItems: 'center', - backgroundColor: lotusTerminal ? 'rgba(0,212,255,0.07)' : color.SurfaceVariant.Container, + backgroundColor: lotusTerminal + ? 'rgba(0,212,255,0.07)' + : color.SurfaceVariant.Container, border: lotusTerminal ? '1px solid rgba(0,212,255,0.30)' : '1px solid transparent', boxShadow: lotusTerminal ? '0 0 10px rgba(0,212,255,0.12)' : 'none', borderRadius: '999px', @@ -88,8 +90,7 @@ export function ReadReceiptAvatars({ }} > {displayed.map((userId) => { - const name = - getMemberDisplayName(room, userId) ?? getMxIdLocalPart(userId) ?? userId; + const name = getMemberDisplayName(room, userId) ?? getMxIdLocalPart(userId) ?? userId; const avatarMxc = room.getMember(userId)?.getMxcAvatarUrl(); const avatarUrl = avatarMxc ? mxcUrlToHttp(mx, avatarMxc, useAuthentication, 32, 32, 'crop') ?? undefined diff --git a/src/app/components/uia-stages/DummyStage.tsx b/src/app/components/uia-stages/DummyStage.tsx index 97a79803c..46f5490e3 100644 --- a/src/app/components/uia-stages/DummyStage.tsx +++ b/src/app/components/uia-stages/DummyStage.tsx @@ -18,7 +18,9 @@ function DummyErrorDialog({ - {title} + + {title} + {message} } /> @@ -894,7 +925,6 @@ function Calls() { ); } - function ChatBgGrid() { const [chatBackground, setChatBackground] = useSetting(settingsAtom, 'chatBackground'); const theme = useTheme(); @@ -915,18 +945,16 @@ function ChatBgGrid() { height: toRem(50), borderRadius: toRem(8), cursor: 'pointer', - border: chatBackground === opt.value - ? '2px solid #980000' - : '2px solid rgba(128,128,128,0.25)', + border: + chatBackground === opt.value + ? '2px solid #980000' + : '2px solid rgba(128,128,128,0.25)', padding: 0, overflow: 'hidden', ...getChatBg(opt.value as ChatBackground, isDark), }} /> - + {opt.label} diff --git a/src/app/features/settings/notifications/KeywordMessages.tsx b/src/app/features/settings/notifications/KeywordMessages.tsx index cfb15cb43..301505a1d 100644 --- a/src/app/features/settings/notifications/KeywordMessages.tsx +++ b/src/app/features/settings/notifications/KeywordMessages.tsx @@ -120,7 +120,14 @@ function KeywordCross({ pushRule }: PushRulesProps) { const removing = removeState.status === AsyncStatus.Loading; return ( - + {removing ? : } ); diff --git a/src/app/features/space-settings/SpaceSettings.tsx b/src/app/features/space-settings/SpaceSettings.tsx index de93ba025..e641516b4 100644 --- a/src/app/features/space-settings/SpaceSettings.tsx +++ b/src/app/features/space-settings/SpaceSettings.tsx @@ -117,7 +117,11 @@ export function SpaceSettings({ initialPage, requestClose }: SpaceSettingsProps) {screenSize === ScreenSize.Mobile && ( - + )} diff --git a/src/app/hooks/useCallEmbed.ts b/src/app/hooks/useCallEmbed.ts index f322a196e..1aac656ae 100644 --- a/src/app/hooks/useCallEmbed.ts +++ b/src/app/hooks/useCallEmbed.ts @@ -53,10 +53,19 @@ export const createCallEmbed = ( MatrixRTCSession.sessionMembershipsForRoom(room, rtcSession.sessionDescription).length > 0; const intent = CallEmbed.getIntent(dm, ongoing, pref?.video); - const initialAudio = forceAudioOff ? false : (pref?.microphone ?? true); + const initialAudio = forceAudioOff ? false : pref?.microphone ?? true; const initialVideo = pref?.video ?? false; - const widget = CallEmbed.getWidget(mx, room, intent, themeKind, noiseSuppression, initialAudio, initialVideo); - const controlState = pref && new CallControlState(forceAudioOff ? false : pref.microphone, pref.video, pref.sound); + const widget = CallEmbed.getWidget( + mx, + room, + intent, + themeKind, + noiseSuppression, + initialAudio, + initialVideo + ); + const controlState = + pref && new CallControlState(forceAudioOff ? false : pref.microphone, pref.video, pref.sound); const embed = new CallEmbed(mx, room, widget, container, controlState); @@ -77,7 +86,16 @@ export const useCallStart = (dm = false) => { if (!container) { throw new Error('Failed to start call, No embed container element found!'); } - const callEmbed = createCallEmbed(mx, room, dm, theme.kind, container, pref, callNoiseSuppression ?? true, !!pttMode); + const callEmbed = createCallEmbed( + mx, + room, + dm, + theme.kind, + container, + pref, + callNoiseSuppression ?? true, + !!pttMode + ); setCallEmbed(callEmbed); }, diff --git a/src/app/hooks/useForceUpdate.js b/src/app/hooks/useForceUpdate.js index bea9b3c78..2244c5293 100644 --- a/src/app/hooks/useForceUpdate.js +++ b/src/app/hooks/useForceUpdate.js @@ -4,7 +4,10 @@ import { useState } from 'react'; export function useForceUpdate() { const [data, setData] = useState(null); - return [data, function forceUpdateHook() { - setData({}); - }]; + return [ + data, + function forceUpdateHook() { + setData({}); + }, + ]; } diff --git a/src/app/hooks/usePan.ts b/src/app/hooks/usePan.ts index 6e1ae48ae..5c0734cb7 100644 --- a/src/app/hooks/usePan.ts +++ b/src/app/hooks/usePan.ts @@ -55,11 +55,14 @@ export const usePan = (active: boolean) => { }, [active]); // Clean up document listeners if component unmounts during an active drag - useEffect(() => () => { - document.removeEventListener('mousemove', handleMouseMove); - document.removeEventListener('mouseup', handleMouseUp); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); + useEffect( + () => () => { + document.removeEventListener('mousemove', handleMouseMove); + document.removeEventListener('mouseup', handleMouseUp); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, + [] + ); return { pan, diff --git a/src/app/hooks/useRoomReadPositions.ts b/src/app/hooks/useRoomReadPositions.ts index 8ae7c30ee..87c28b02b 100644 --- a/src/app/hooks/useRoomReadPositions.ts +++ b/src/app/hooks/useRoomReadPositions.ts @@ -23,9 +23,7 @@ function computePositions(room: Room, myUserId: string): Map { const map = new Map(); const liveEvents = room.getLiveTimeline().getEvents(); // Build O(1) index once instead of O(T) findIndex per member - const eventIndex = new Map( - liveEvents.map((e, i) => [e.getId() ?? '', i]) - ); + const eventIndex = new Map(liveEvents.map((e, i) => [e.getId() ?? '', i])); for (const member of room.getJoinedMembers()) { if (member.userId === myUserId) continue; const evtId = room.getEventReadUpTo(member.userId); diff --git a/src/app/hooks/useTheme.ts b/src/app/hooks/useTheme.ts index 923f8e226..d7626c979 100644 --- a/src/app/hooks/useTheme.ts +++ b/src/app/hooks/useTheme.ts @@ -1,7 +1,13 @@ import { lightTheme } from 'folds'; import { createContext, useContext, useEffect, useMemo, useState } from 'react'; import { onDarkFontWeight, onLightFontWeight } from '../../config.css'; -import { butterTheme, darkTheme, lotusTerminalLightTheme, lotusTerminalTheme, silverTheme } from '../../colors.css'; +import { + butterTheme, + darkTheme, + lotusTerminalLightTheme, + lotusTerminalTheme, + silverTheme, +} from '../../colors.css'; import { settingsAtom } from '../state/settings'; import { useSetting } from '../state/hooks/settings'; @@ -45,7 +51,12 @@ export const LotusTerminalTheme: Theme = { export const LotusTerminalLightTheme: Theme = { id: 'lotus-terminal-light-theme', kind: ThemeKind.Light, - classNames: ['lotus-terminal-light-theme', lotusTerminalLightTheme, onLightFontWeight, 'prism-light'], + classNames: [ + 'lotus-terminal-light-theme', + lotusTerminalLightTheme, + onLightFontWeight, + 'prism-light', + ], }; export const useThemes = (): Theme[] => { diff --git a/src/app/pages/Router.tsx b/src/app/pages/Router.tsx index faf621ac6..2ffecd6ca 100644 --- a/src/app/pages/Router.tsx +++ b/src/app/pages/Router.tsx @@ -10,10 +10,12 @@ import { } from 'react-router-dom'; import { ClientConfig } from '../hooks/useClientConfig'; -const AuthLayout = React.lazy(() => import('./auth').then(m => ({ default: m.AuthLayout }))); -const Login = React.lazy(() => import('./auth').then(m => ({ default: m.Login }))); -const Register = React.lazy(() => import('./auth').then(m => ({ default: m.Register }))); -const ResetPassword = React.lazy(() => import('./auth').then(m => ({ default: m.ResetPassword }))); +const AuthLayout = React.lazy(() => import('./auth').then((m) => ({ default: m.AuthLayout }))); +const Login = React.lazy(() => import('./auth').then((m) => ({ default: m.Login }))); +const Register = React.lazy(() => import('./auth').then((m) => ({ default: m.Register }))); +const ResetPassword = React.lazy(() => + import('./auth').then((m) => ({ default: m.ResetPassword })) +); import { DIRECT_PATH, EXPLORE_PATH, @@ -48,9 +50,8 @@ import { Home, HomeRouteRoomProvider, HomeSearch } from './client/home'; import { Direct, DirectCreate, DirectRouteRoomProvider } from './client/direct'; import { RouteSpaceProvider, Space, SpaceRouteRoomProvider, SpaceSearch } from './client/space'; - import { setAfterLoginRedirectPath } from './afterLoginRedirectPath'; -const Room = React.lazy(() => import('../features/room').then(m => ({ default: m.Room }))); +const Room = React.lazy(() => import('../features/room').then((m) => ({ default: m.Room }))); import { WelcomePage } from './client/WelcomePage'; import { SidebarNav } from './client/SidebarNav'; @@ -62,22 +63,38 @@ import { ClientNonUIFeatures } from './client/ClientNonUIFeatures'; import { AuthRouteThemeManager, UnAuthRouteThemeManager } from './ThemeManager'; import { ReceiveSelfDeviceVerification } from '../components/DeviceVerification'; import { AutoRestoreBackupOnVerification } from '../components/BackupRestore'; -const RoomSettingsRenderer = React.lazy(() => import('../features/room-settings').then(m => ({ default: m.RoomSettingsRenderer }))); +const RoomSettingsRenderer = React.lazy(() => + import('../features/room-settings').then((m) => ({ default: m.RoomSettingsRenderer })) +); import { ClientRoomsNotificationPreferences } from './client/ClientRoomsNotificationPreferences'; -const SpaceSettingsRenderer = React.lazy(() => import('../features/space-settings').then(m => ({ default: m.SpaceSettingsRenderer }))); +const SpaceSettingsRenderer = React.lazy(() => + import('../features/space-settings').then((m) => ({ default: m.SpaceSettingsRenderer })) +); import { UserRoomProfileRenderer } from '../components/UserRoomProfileRenderer'; -const CreateRoomModalRenderer = React.lazy(() => import('../features/create-room').then(m => ({ default: m.CreateRoomModalRenderer }))); +const CreateRoomModalRenderer = React.lazy(() => + import('../features/create-room').then((m) => ({ default: m.CreateRoomModalRenderer })) +); import { HomeCreateRoom } from './client/home/CreateRoom'; import { Create } from './client/create'; -const CreateSpaceModalRenderer = React.lazy(() => import('../features/create-space').then(m => ({ default: m.CreateSpaceModalRenderer }))); -const SearchModalRenderer = React.lazy(() => import('../features/search').then(m => ({ default: m.SearchModalRenderer }))); -const Explore = React.lazy(() => import('./client/explore').then(m => ({ default: m.Explore }))); -const FeaturedRooms = React.lazy(() => import('./client/explore').then(m => ({ default: m.FeaturedRooms }))); -const PublicRooms = React.lazy(() => import('./client/explore').then(m => ({ default: m.PublicRooms }))); -const Notifications = React.lazy(() => import('./client/inbox').then(m => ({ default: m.Notifications }))); -const Inbox = React.lazy(() => import('./client/inbox').then(m => ({ default: m.Inbox }))); -const Invites = React.lazy(() => import('./client/inbox').then(m => ({ default: m.Invites }))); -const Lobby = React.lazy(() => import('../features/lobby').then(m => ({ default: m.Lobby }))); +const CreateSpaceModalRenderer = React.lazy(() => + import('../features/create-space').then((m) => ({ default: m.CreateSpaceModalRenderer })) +); +const SearchModalRenderer = React.lazy(() => + import('../features/search').then((m) => ({ default: m.SearchModalRenderer })) +); +const Explore = React.lazy(() => import('./client/explore').then((m) => ({ default: m.Explore }))); +const FeaturedRooms = React.lazy(() => + import('./client/explore').then((m) => ({ default: m.FeaturedRooms })) +); +const PublicRooms = React.lazy(() => + import('./client/explore').then((m) => ({ default: m.PublicRooms })) +); +const Notifications = React.lazy(() => + import('./client/inbox').then((m) => ({ default: m.Notifications })) +); +const Inbox = React.lazy(() => import('./client/inbox').then((m) => ({ default: m.Inbox }))); +const Invites = React.lazy(() => import('./client/inbox').then((m) => ({ default: m.Invites }))); +const Lobby = React.lazy(() => import('../features/lobby').then((m) => ({ default: m.Lobby }))); import { getFallbackSession } from '../state/sessions'; import { CallStatusRenderer } from './CallStatusRenderer'; import { CallEmbedProvider } from '../components/CallEmbedProvider'; @@ -112,9 +129,30 @@ export const createRouter = (clientConfig: ClientConfig, screenSize: ScreenSize) } > - } /> - } /> - } /> + + + + } + /> + + + + } + /> + + + + } + /> - + + + - - - - + + + + + + + + + + + + @@ -250,7 +298,14 @@ export const createRouter = (clientConfig: ClientConfig, screenSize: ScreenSize) element={} /> )} - } /> + + + + } + /> } /> - + + + } > @@ -284,8 +341,22 @@ export const createRouter = (clientConfig: ClientConfig, screenSize: ScreenSize) element={} /> )} - } /> - } /> + + + + } + /> + + + + } + /> } /> - + + + } > @@ -309,8 +382,22 @@ export const createRouter = (clientConfig: ClientConfig, screenSize: ScreenSize) element={} /> )} - } /> - } /> + + + + } + /> + + + + } + /> Page not found

} /> diff --git a/src/app/pages/ThemeManager.tsx b/src/app/pages/ThemeManager.tsx index 45d110894..f95e07210 100644 --- a/src/app/pages/ThemeManager.tsx +++ b/src/app/pages/ThemeManager.tsx @@ -25,7 +25,9 @@ export function UnAuthRouteThemeManager() { if (lotusTerminal) { const isLight = systemThemeKind === ThemeKind.Light; document.documentElement.setAttribute('data-theme', isLight ? 'light' : 'dark'); - document.body.classList.add(...(isLight ? LotusTerminalLightTheme : LotusTerminalTheme).classNames); + document.body.classList.add( + ...(isLight ? LotusTerminalLightTheme : LotusTerminalTheme).classNames + ); document.body.classList.add(lotusTerminalBodyClass); } else { document.documentElement.removeAttribute('data-theme'); @@ -47,7 +49,9 @@ export function AuthRouteThemeManager({ children }: { children: ReactNode }) { const terminalIsLight = lotusTerminal && activeTheme.kind === ThemeKind.Light; const effectiveTheme = lotusTerminal - ? (terminalIsLight ? LotusTerminalLightTheme : LotusTerminalTheme) + ? terminalIsLight + ? LotusTerminalLightTheme + : LotusTerminalTheme : activeTheme; // Boot animation only fires when lotusTerminal is toggled on, not on every theme change diff --git a/src/app/pages/auth/AuthFooter.tsx b/src/app/pages/auth/AuthFooter.tsx index c958b8f4f..6103f6b66 100644 --- a/src/app/pages/auth/AuthFooter.tsx +++ b/src/app/pages/auth/AuthFooter.tsx @@ -18,7 +18,13 @@ export function AuthFooter() { > v{pkg.version} - + Community diff --git a/src/app/pages/auth/AuthLayout.tsx b/src/app/pages/auth/AuthLayout.tsx index 050902562..ec14c610f 100644 --- a/src/app/pages/auth/AuthLayout.tsx +++ b/src/app/pages/auth/AuthLayout.tsx @@ -135,7 +135,9 @@ export function AuthLayout() {
Lotus Chat Logo - Lotus Chat + + Lotus Chat +
diff --git a/src/app/pages/auth/login/PasswordLoginForm.tsx b/src/app/pages/auth/login/PasswordLoginForm.tsx index c802fe714..49529f7fc 100644 --- a/src/app/pages/auth/login/PasswordLoginForm.tsx +++ b/src/app/pages/auth/login/PasswordLoginForm.tsx @@ -230,7 +230,15 @@ export function PasswordLoginForm({ defaultUsername, defaultEmail }: PasswordLog Password - + {loginState.status === AsyncStatus.Error && ( <> diff --git a/src/app/pages/auth/login/loginUtil.ts b/src/app/pages/auth/login/loginUtil.ts index 6ecfe7a94..6c99a0d2e 100644 --- a/src/app/pages/auth/login/loginUtil.ts +++ b/src/app/pages/auth/login/loginUtil.ts @@ -118,8 +118,8 @@ export const useLoginComplete = (data?: CustomLoginResponse) => { const afterLoginRedirectUrl = getAfterLoginRedirectPath(); deleteAfterLoginRedirectPath(); const _redir = afterLoginRedirectUrl; - const _safePath = (_redir && /^\/(?!\/)/.test(_redir)) ? _redir : getHomePath(); - navigate(_safePath, { replace: true }); + const _safePath = _redir && /^\/(?!\/)/.test(_redir) ? _redir : getHomePath(); + navigate(_safePath, { replace: true }); } }, [data, navigate]); }; diff --git a/src/app/pages/client/ClientLayout.tsx b/src/app/pages/client/ClientLayout.tsx index d136d0f99..68cb3615a 100644 --- a/src/app/pages/client/ClientLayout.tsx +++ b/src/app/pages/client/ClientLayout.tsx @@ -21,14 +21,22 @@ export function ClientLayout({ nav, children }: ClientLayoutProps) { borderRadius: '0 0 4px 0', transition: 'top 0.1s', }} - onFocus={(e) => { (e.currentTarget as HTMLElement).style.top = '0'; }} - onBlur={(e) => { (e.currentTarget as HTMLElement).style.top = '-40px'; }} + onFocus={(e) => { + (e.currentTarget as HTMLElement).style.top = '0'; + }} + onBlur={(e) => { + (e.currentTarget as HTMLElement).style.top = '-40px'; + }} > Skip to main content - {nav} - {children} + + {nav} + + + {children} + ); diff --git a/src/app/pages/client/SpecVersions.tsx b/src/app/pages/client/SpecVersions.tsx index 84eecf7d8..5dbecacfd 100644 --- a/src/app/pages/client/SpecVersions.tsx +++ b/src/app/pages/client/SpecVersions.tsx @@ -22,7 +22,8 @@ export function SpecVersions({ baseUrl, children }: { baseUrl: string; children: - Unable to connect to the homeserver. The homeserver or your internet connection may be down. + Unable to connect to the homeserver. The homeserver or your internet connection + may be down.