From aadf760e3c82e5d26c6c31856830fbfe09892fcf Mon Sep 17 00:00:00 2001 From: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> Date: Thu, 16 Apr 2026 17:19:52 +0100 Subject: [PATCH 01/11] Factor DMRoomTile out to its own file (#33170) I'm going to use this from a new component --- .../components/views/dialogs/InviteDialog.tsx | 63 +--------------- .../views/dialogs/invite/DMRoomTile.tsx | 74 +++++++++++++++++++ 2 files changed, 76 insertions(+), 61 deletions(-) create mode 100644 apps/web/src/components/views/dialogs/invite/DMRoomTile.tsx diff --git a/apps/web/src/components/views/dialogs/InviteDialog.tsx b/apps/web/src/components/views/dialogs/InviteDialog.tsx index 94b6365774..be208b24a2 100644 --- a/apps/web/src/components/views/dialogs/InviteDialog.tsx +++ b/apps/web/src/components/views/dialogs/InviteDialog.tsx @@ -12,10 +12,9 @@ import { KnownMembership } from "matrix-js-sdk/src/types"; import { type MatrixCall } from "matrix-js-sdk/src/webrtc/call"; import { logger } from "matrix-js-sdk/src/logger"; import { uniqBy } from "lodash"; -import { RichList, RichItem, PillInput, Pill } from "@element-hq/web-shared-components"; +import { Pill, PillInput, RichList } from "@element-hq/web-shared-components"; import { DialPadIcon, UserProfileSolidIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; -import { Icon as EmailPillAvatarIcon } from "../../../../res/img/icon-email-pill-avatar.svg"; import { _t, _td } from "../../../languageHandler"; import { MatrixClientPeg } from "../../../MatrixClientPeg"; import { makeRoomPermalink, makeUserPermalink } from "../../../utils/permalinks/Permalinks"; @@ -31,8 +30,6 @@ import { DefaultTagID } from "../../../stores/room-list-v3/skip-list/tag"; import RoomListStore from "../../../stores/room-list/RoomListStore"; import SettingsStore from "../../../settings/SettingsStore"; import { UIFeature } from "../../../settings/UIFeature"; -import { mediaFromMxc } from "../../../customisations/Media"; -import BaseAvatar from "../avatars/BaseAvatar"; import { SearchResultAvatar } from "../avatars/SearchResultAvatar"; import AccessibleButton, { type ButtonEvent } from "../elements/AccessibleButton"; import { selectText } from "../../../utils/strings"; @@ -43,7 +40,6 @@ import QuestionDialog from "./QuestionDialog"; import BaseDialog from "./BaseDialog"; import DialPadBackspaceButton from "../elements/DialPadBackspaceButton"; import LegacyCallHandler from "../../../LegacyCallHandler"; -import UserIdentifierCustomisations from "../../../customisations/UserIdentifier"; import CopyableText from "../elements/CopyableText"; import { type ScreenName } from "../../../PosthogTrackers"; import { KeyBindingAction } from "../../../accessibility/KeyboardShortcuts"; @@ -64,6 +60,7 @@ import { SdkContextClass } from "../../../contexts/SDKContext"; import { type UserProfilesStore } from "../../../stores/UserProfilesStore"; import InviteProgressBody from "./InviteProgressBody.tsx"; import MultiInviter, { type CompletionStates as MultiInviterCompletionStates } from "../../../utils/MultiInviter.ts"; +import { DMRoomTile } from "./invite/DMRoomTile.tsx"; interface Result { userId: string; @@ -114,62 +111,6 @@ const toMember = (member: RoomMember | Member): Member => { : member; }; -interface IDMRoomTileProps { - member: Member; - lastActiveTs?: number; - onToggle(member: Member): void; - isSelected: boolean; -} - -class DMRoomTile extends React.PureComponent { - private onClick = (e: ButtonEvent): void => { - // Stop the browser from highlighting text - e.preventDefault(); - e.stopPropagation(); - - this.props.onToggle(this.props.member); - }; - - public render(): React.ReactNode { - const avatarSize = "32px"; - const avatar = (this.props.member as ThreepidMember).isEmail ? ( - - ) : ( - - ); - - const userIdentifier = UserIdentifierCustomisations.getDisplayUserIdentifier(this.props.member.userId, { - withDisplayName: true, - }); - - const caption = (this.props.member as ThreepidMember).isEmail - ? _t("invite|email_caption") - : userIdentifier || this.props.member.userId; - - return ( - - ); - } -} - interface BaseProps { // Takes a boolean which is true if a user / users were invited / // a call transfer was initiated or false if the dialog was cancelled diff --git a/apps/web/src/components/views/dialogs/invite/DMRoomTile.tsx b/apps/web/src/components/views/dialogs/invite/DMRoomTile.tsx new file mode 100644 index 0000000000..954e792b17 --- /dev/null +++ b/apps/web/src/components/views/dialogs/invite/DMRoomTile.tsx @@ -0,0 +1,74 @@ +/* + Copyright 2026 Element Creations Ltd. + + SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + Please see LICENSE files in the repository root for full details. + */ + +import React from "react"; +import { RichItem } from "@element-hq/web-shared-components"; + +import { type Member, type ThreepidMember } from "../../../../utils/direct-messages.ts"; +import type { ButtonEvent } from "../../elements/AccessibleButton.tsx"; +import BaseAvatar from "../../avatars/BaseAvatar.tsx"; +import { mediaFromMxc } from "../../../../customisations/Media.ts"; +import UserIdentifierCustomisations from "../../../../customisations/UserIdentifier.ts"; +import { _t } from "../../../../languageHandler.tsx"; +import { Icon as EmailPillAvatarIcon } from "../../../../../res/img/icon-email-pill-avatar.svg"; + +interface IDMRoomTileProps { + member: Member; + lastActiveTs?: number; + onToggle(member: Member): void; + isSelected: boolean; +} + +/** A tile representing a single user in the "suggestions"/"recents" section of the invite dialog. */ +export class DMRoomTile extends React.PureComponent { + private onClick = (e: ButtonEvent): void => { + // Stop the browser from highlighting text + e.preventDefault(); + e.stopPropagation(); + + this.props.onToggle(this.props.member); + }; + + public render(): React.ReactNode { + const avatarSize = "32px"; + const avatar = (this.props.member as ThreepidMember).isEmail ? ( + + ) : ( + + ); + + const userIdentifier = UserIdentifierCustomisations.getDisplayUserIdentifier(this.props.member.userId, { + withDisplayName: true, + }); + + const caption = (this.props.member as ThreepidMember).isEmail + ? _t("invite|email_caption") + : userIdentifier || this.props.member.userId; + + return ( + + ); + } +} From cf4b8744ab17d943ddbf8ab573524defba889c91 Mon Sep 17 00:00:00 2001 From: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> Date: Thu, 16 Apr 2026 17:29:32 +0100 Subject: [PATCH 02/11] Configuration for nx output under playwright (#33177) When playwright starts the development web server, have it tell nx to use the `stream` output style, which is somewhat clearer than the default. (Specifically, it distinguishes between output from different tasks, so you can see where any errors are coming from.) --- apps/web/playwright.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/playwright.config.ts b/apps/web/playwright.config.ts index f6d15f4e79..6120557148 100644 --- a/apps/web/playwright.config.ts +++ b/apps/web/playwright.config.ts @@ -91,7 +91,7 @@ export default defineConfig<{}, WorkerOptions>({ trace: "on-first-retry", }, webServer: { - command: process.env.CI ? "npx serve -p 8080 -L ./webapp" : "pnpm start", + command: process.env.CI ? "npx serve -p 8080 -L ./webapp" : "nx --outputStyle stream start", url: `${baseURL}/config.json`, reuseExistingServer: true, timeout: (process.env.CI ? 30 : 120) * 1000, From 3b1b39f822a0b75d74d3fb22ca4ac8c1cf86666b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 16 Apr 2026 22:59:40 +0100 Subject: [PATCH 03/11] Update dependency sanitize-html to v2.17.3 [SECURITY] (#33180) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- apps/web/package.json | 2 +- pnpm-lock.yaml | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/apps/web/package.json b/apps/web/package.json index d724f50fd4..63cbb7d742 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -101,7 +101,7 @@ "react-transition-group": "^4.4.1", "rfc4648": "^1.4.0", "sanitize-filename": "^1.6.3", - "sanitize-html": "2.17.2", + "sanitize-html": "2.17.3", "tar-js": "^0.3.0", "ua-parser-js": "1.0.40", "uuid": "^13.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4f9f199841..661f27c438 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -457,7 +457,7 @@ importers: version: 1.0.3 matrix-js-sdk: specifier: github:matrix-org/matrix-js-sdk#develop - version: https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/3879111850603f676b875ee202409059298446ef + version: https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/ca5655bced1cbb215ac1c18e179384a069d98b0a matrix-widget-api: specifier: ^1.17.0 version: 1.17.0 @@ -516,8 +516,8 @@ importers: specifier: ^1.6.3 version: 1.6.3 sanitize-html: - specifier: 2.17.2 - version: 2.17.2 + specifier: 2.17.3 + version: 2.17.3 tar-js: specifier: ^0.3.0 version: 0.3.0 @@ -9911,8 +9911,8 @@ packages: matrix-events-sdk@0.0.1: resolution: {integrity: sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA==} - matrix-js-sdk@https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/3879111850603f676b875ee202409059298446ef: - resolution: {tarball: https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/3879111850603f676b875ee202409059298446ef} + matrix-js-sdk@https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/ca5655bced1cbb215ac1c18e179384a069d98b0a: + resolution: {tarball: https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/ca5655bced1cbb215ac1c18e179384a069d98b0a} version: 41.3.0 engines: {node: '>=22.0.0'} @@ -11747,8 +11747,8 @@ packages: sanitize-filename@1.6.3: resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==} - sanitize-html@2.17.2: - resolution: {integrity: sha512-EnffJUl46VE9uvZ0XeWzObHLurClLlT12gsOk1cHyP2Ol1P0BnBnsXmShlBmWVJM+dKieQI68R0tsPY5m/B+Jg==} + sanitize-html@2.17.3: + resolution: {integrity: sha512-Kn4srCAo2+wZyvCNKCSyB2g8RQ8IkX/gQs2uqoSRNu5t9I2qvUyAVvRDiFUVAiX3N3PNuwStY0eNr+ooBHVWEg==} sax@1.6.0: resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} @@ -23616,7 +23616,7 @@ snapshots: matrix-events-sdk@0.0.1: {} - matrix-js-sdk@https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/3879111850603f676b875ee202409059298446ef: + matrix-js-sdk@https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/ca5655bced1cbb215ac1c18e179384a069d98b0a: dependencies: '@babel/runtime': 7.29.2 '@matrix-org/matrix-sdk-crypto-wasm': 18.0.0 @@ -25786,7 +25786,7 @@ snapshots: dependencies: truncate-utf8-bytes: 1.0.2 - sanitize-html@2.17.2: + sanitize-html@2.17.3: dependencies: deepmerge: 4.3.1 escape-string-regexp: 4.0.0 From c3e82cf33b242ad433738619600420e6969eaf7c Mon Sep 17 00:00:00 2001 From: ElementRobot Date: Fri, 17 Apr 2026 09:08:28 +0200 Subject: [PATCH 04/11] [create-pull-request] automated change (#33182) Co-authored-by: t3chguy <2403652+t3chguy@users.noreply.github.com> --- apps/desktop/src/i18n/strings/zh_Hans.json | 30 +- apps/web/src/i18n/strings/zh_Hans.json | 4646 ++++++++++------- .../src/i18n/strings/fr.json | 1 + .../src/i18n/strings/zh_Hans.json | 180 +- 4 files changed, 2989 insertions(+), 1868 deletions(-) diff --git a/apps/desktop/src/i18n/strings/zh_Hans.json b/apps/desktop/src/i18n/strings/zh_Hans.json index 448412456d..077a5d036d 100644 --- a/apps/desktop/src/i18n/strings/zh_Hans.json +++ b/apps/desktop/src/i18n/strings/zh_Hans.json @@ -22,7 +22,9 @@ "about": "关于", "brand_help": "%(brand)s帮助", "help": "帮助", - "preferences": "偏好" + "no": "不", + "preferences": "偏好", + "yes": "是" }, "confirm_quit": "你确定要退出吗?", "edit_menu": { @@ -30,9 +32,20 @@ "speech_start_speaking": "开始讲话", "speech_stop_speaking": "停止讲话" }, + "eol": { + "no_more_updates": "您正在使用不受支持的macOS版本。请升级以获取%(brand)s 更新。", + "title": "系统不支持", + "warning": "您正在使用不受支持的macOS版本。请升级系统以确保%(brand)s 能持续正常运行。" + }, "file_menu": { "label": "文件" }, + "icon_overlay": { + "description_error": "错误", + "description_notifications": { + "other": "您有%(count)s 条未读通知。" + } + }, "menu": { "hide": "隐藏", "hide_others": "隐藏其他", @@ -49,6 +62,21 @@ "save_image_as_error_description": "图片保存失败", "save_image_as_error_title": "图片保存失败" }, + "store": { + "error": { + "backend_changed": "清除数据并重新加载?", + "backend_changed_detail": "无法从系统密钥环访问密钥,该密钥似乎已被更改。", + "backend_changed_title": "数据库加载失败", + "backend_no_encryption": "您的系统支持密钥环,但加密功能不可用。", + "backend_no_encryption_detail": "Electron检测到您的密钥环%(backend)s 不支持加密功能。请确保已安装该密钥环。若已安装,请重启设备后重试。您也可选择允许%(brand)s 使用较弱的加密方式。", + "backend_no_encryption_title": "不支持加密", + "unsupported_keyring": "您的系统存在未受支持的密钥环,这意味着无法打开数据库。", + "unsupported_keyring_detail": "Electron的密钥环检测未找到受支持的后端。您可以尝试通过命令行参数启动%(brand)s 来手动配置后端,此操作仅需执行一次。详情请参阅:%(link)s 。", + "unsupported_keyring_title": "系统不支持", + "unsupported_keyring_use_basic_text": "使用较弱的加密", + "unsupported_keyring_use_plaintext": "不使用加密" + } + }, "view_menu": { "actual_size": "实际大小", "toggle_developer_tools": "切换开发者工具", diff --git a/apps/web/src/i18n/strings/zh_Hans.json b/apps/web/src/i18n/strings/zh_Hans.json index baa3c19ae0..bc5eeb0696 100644 --- a/apps/web/src/i18n/strings/zh_Hans.json +++ b/apps/web/src/i18n/strings/zh_Hans.json @@ -1,24 +1,29 @@ { "a11y": { - "jump_first_invite": "跳转至第一个邀请。", + "emoji_picker": "Emoji 选择器", + "jump_first_invite": "跳转到首个邀请", + "message_composer": "消息编辑器", "n_unread_messages": { - "other": "%(count)s 个未读消息。", - "one": "1 个未读消息。" + "one": "1 个未读消息", + "other": "%(count)s 个未读消息。" }, "n_unread_messages_mentions": { - "other": "包括提及在内有 %(count)s 个未读消息。", - "one": "1 个未读提及。" + "one": "1 个未读提及", + "other": "%(count)s 个包含提及在内的未读消息" }, + "recent_rooms": "最近的房间", "room_name": "房间 %(name)s", + "room_status_bar": "房间状态栏", + "seek_bar_label": "音频搜索栏", "unread_messages": "未读消息。", "user_menu": "用户菜单" }, - "a11y_jump_first_unread_room": "跳转至第一个未读房间。", + "a11y_jump_first_unread_room": "跳转到首个未读房间。", "action": { "accept": "接受", "add": "添加", - "add_existing_room": "添加现有的房间", - "add_people": "加人", + "add_existing_room": "添加现有房间", + "add_people": "添加人员", "apply": "应用", "approve": "批准", "ask_to_join": "申请加入", @@ -39,6 +44,8 @@ "create_a_room": "创建房间", "create_account": "创建账户", "decline": "拒绝", + "decline_and_block": "拒绝并屏蔽", + "decline_invite": "拒绝邀请", "delete": "删除", "deny": "拒绝", "disable": "禁用", @@ -51,15 +58,15 @@ "enter_fullscreen": "进入全屏", "exit_fullscreeen": "退出全屏", "expand": "展开", - "explore_public_rooms": "查找公开房间", + "explore_public_rooms": "浏览公共房间", "explore_rooms": "查找房间", "export": "导出", "forward": "转发", "go": "前往", - "go_back": "返回", - "got_it": "知道了", - "hide_advanced": "隐藏高级", - "hold": "挂起", + "go_back": "后退", + "got_it": "明白", + "hide_advanced": "隐藏高级选项", + "hold": "保持", "ignore": "忽略", "import": "导入", "invite": "邀请", @@ -69,7 +76,7 @@ "learn_more": "了解更多", "leave": "离开", "leave_room": "离开房间", - "logout": "登出", + "logout": "注销", "manage": "管理", "maximise": "最大化", "mention": "提及", @@ -77,53 +84,56 @@ "new_room": "新建房间", "new_video_room": "新视频房间", "next": "下一个", - "no": "不", + "no": "否", "ok": "确定", "open": "打开", - "pin": "别针", + "pin": "置顶", "proceed": "继续", - "quote": "引述", + "quote": "引用", "react": "回应", "refresh": "刷新", "register": "注册", - "reload": "重加载", + "reload": "重新载入", "remove": "移除", "rename": "重命名", "reply": "回复", "reply_in_thread": "在消息列中回复", "report_content": "举报内容", + "report_room": "举报房间", "resend": "重新发送", "reset": "重置", "resume": "恢复", "retry": "重试", - "review": "开始验证", - "revoke": "撤销", + "review": "审阅", + "revoke": "撤消", "save": "保存", "search": "搜索", - "send_report": "发送报告", + "send_report": "发送举报", + "set_avatar": "设置个人资料图像", "share": "分享", "show": "显示", - "show_advanced": "显示高级", + "show_advanced": "显示高级选项", "show_all": "显示全部", "sign_in": "登录", - "sign_out": "注销", + "sign_out": "移除此设备", "skip": "跳过", "start": "开始", "start_chat": "开始聊天", - "start_new_chat": "开始新的聊天", + "start_new_chat": "开始新聊天", "stop": "停止", "submit": "提交", "subscribe": "订阅", "transfer": "传输", "trust": "信任", "try_again": "重试", - "unban": "解除封禁", - "unignore": "取消忽略", + "unban": "解封", + "unignore": "解除忽略", "unpin": "取消置顶", - "unsubscribe": "取消订阅", + "unsubscribe": "退订", "update": "更新", - "upgrade": "升级加密", + "upgrade": "升级", "upload": "上传", + "upload_file": "上传文件", "verify": "验证", "view": "查看", "view_all": "查看全部", @@ -131,334 +141,398 @@ "view_message": "查看消息", "view_source": "查看源码", "yes": "是", + "yes_dismiss": "是,忽略", "zoom_in": "放大", "zoom_out": "缩小" }, "analytics": { - "accept_button": "没问题", - "bullet_1": "我们不会记录或配置任何账户数据", - "bullet_2": "我们不会与第三方共享信息", - "consent_migration": "你之前同意与我们分享匿名使用数据。我们正在更新其工作方式。", - "disable_prompt": "您可以随时在设置中关闭此功能", + "accept_button": "良好", + "bullet_1": "我们记录或分析任何个人数据", + "bullet_2": "我们分享数据给第三方", + "consent_migration": "你已于之前同意我们分享匿名使用情况数据。我们正在更新其运作方式。", + "disable_prompt": "你可以随时在设置中关闭此选项。", "enable_prompt": "帮助改进 %(analyticsOwner)s", - "learn_more": "共享匿名数据帮助我们发现问题。无个人数据。 没有第三方。了解更多", - "privacy_policy": "你可以在此处阅读我们所有的条款", - "pseudonymous_usage_data": "通过共享匿名使用数据,帮助我们发现问题并改进%(analyticsOwner)s。为了了解人们如何使用多台设备,我们将生成一个由您的设备共享的随机标识符。", - "shared_data_heading": "以下数据之一可能被分享:" + "learn_more": "分享匿名数据已帮助我们识别问题。不涉及个人隐私及第三方。了解更多", + "privacy_policy": "你可以阅读我们的所有条款 点击此处", + "pseudonymous_usage_data": "通过分享匿名使用数据,帮助我们发现问题并改进 %(analyticsOwner)s。为了解用户如何使用多台设备,我们将生成一个由你的设备共享的随机标识符。", + "shared_data_heading": "以下任何数据都可能被分享:" }, "auth": { - "3pid_in_use": "该电子邮件地址或电话号码已被使用。", - "account_clash": "你的新账户(%(newAccountId)s)已注册,但你已经登录了一个不同的账户(%(loggedInUserId)s)。", - "account_clash_previous_account": "用之前的账户继续", + "3pid_in_use": "该邮件地址或电话号码已被使用。", + "account_clash": "你的新账户 (%(newAccountId)s) 已注册,但你已登录到其它账户 (%(loggedInUserId)s)。", + "account_clash_previous_account": "使用上一个账户继续", "account_deactivated": "此账户已被停用。", - "autodiscovery_generic_failure": "从服务器获取自动发现配置时失败", - "autodiscovery_hs_incompatible": "您的服务器版本太旧,不支持所需的最低API版本。请与服务器所有者联系,或者升级您的服务器。", - "autodiscovery_invalid": "无效的家服务器搜索响应", - "autodiscovery_invalid_hs": "家服务器链接不像是有效的 Matrix 家服务器", - "autodiscovery_invalid_hs_base_url": "m.homeserver 的 base_url 无效", - "autodiscovery_invalid_is": "身份服务器链接不像是有效的身份服务器", - "autodiscovery_invalid_is_base_url": "m.identity_server 的 base_url 无效", - "autodiscovery_invalid_is_response": "无效的身份服务器搜索响应", - "autodiscovery_invalid_json": "无效的 JSON", - "autodiscovery_no_well_known": "找不到.well-known JSON文件", - "autodiscovery_unexpected_error_hs": "解析家服务器配置时发生未知错误", - "autodiscovery_unexpected_error_is": "解析身份服务器配置时发生未知错误", - "captcha_description": "此家服务器想要确认你不是机器人。", - "change_password_action": "修改密码", - "change_password_confirm_invalid": "密码不匹配", + "autodiscovery_generic_failure": "从服务器获取自动发现配置失败", + "autodiscovery_hs_incompatible": "你的主服务器版本太旧,不支持所需的最低 API 版本。请联系你的服务器所有者或升级你的服务器。", + "autodiscovery_invalid": "主服务器发现响应无效", + "autodiscovery_invalid_hs": "主服务器 URL 似乎不是有效的 Matrix 主服务器", + "autodiscovery_invalid_hs_base_url": "“m.homeserver”中的“base_url”无效", + "autodiscovery_invalid_is": "身份服务器 URL 似乎不是有效的身份服务器", + "autodiscovery_invalid_is_base_url": "“m.identity_server”中的“base_url”无效", + "autodiscovery_invalid_is_response": "身份服务器发现响应无效", + "autodiscovery_invalid_json": "JSON 无效", + "autodiscovery_no_well_known": ".well-known JSON 文件未找到", + "autodiscovery_unexpected_error_hs": "解析主服务器配置时出现未知错误", + "autodiscovery_unexpected_error_is": "解析身份服务器配置时出现未知错误", + "captcha_description": "此主服务器需要确认你是否为机器人。", + "change_password_action": "更改密码", + "change_password_confirm_invalid": "两次输入的密码不匹配", "change_password_confirm_label": "确认密码", "change_password_current_label": "当前密码", "change_password_empty": "密码不能为空", "change_password_error": "更改密码时出错:%(error)s", - "change_password_mismatch": "两次输入的新密码不符", - "change_password_new_label": "新密码", - "check_email_explainer": "按已发到%(email)s的说明操作", - "check_email_resend_prompt": "没收到?", - "check_email_resend_tooltip": "验证链接电子邮件已重新发送!", - "check_email_wrong_email_button": "重新输入电子邮件地址", - "check_email_wrong_email_prompt": "电子邮件地址错误?", + "change_password_mismatch": "新密码不匹配", + "change_password_new_label": "新密码不匹配", + "check_email_explainer": "按说明发送到 %(email)s", + "check_email_resend_prompt": "未收到?", + "check_email_resend_tooltip": "验证链接邮件已重新发送!", + "check_email_wrong_email_button": "重新输入邮件地址", + "check_email_wrong_email_prompt": "邮件地址有误?", "continue_with_idp": "使用 %(provider)s 继续", "continue_with_sso": "使用 %(ssoButtons)s 继续", - "country_dropdown": "国家下拉菜单", + "country_dropdown": "国家与地区下拉菜单", "create_account_prompt": "新来的?创建账户", "create_account_title": "创建账户", - "email_discovery_text": "使用电子邮箱以选择性地被现有联系人搜索。", - "email_field_label": "电子邮箱", - "email_field_label_invalid": "看起来不像有效的邮件地址", - "email_field_label_required": "输入邮箱地址", - "email_help_text": "添加电子邮箱以重置你的密码。", - "email_phone_discovery_text": "使用电子邮箱或电话以选择性地被现有联系人搜索。", - "enter_email_explainer": "%(homeserver)s 会向您发送一个验证链接,让您重置密码。", - "enter_email_heading": "输入您的邮箱以重置您的密码", - "failed_connect_identity_server": "无法连接到身份服务器", - "failed_connect_identity_server_other": "你可以登录,但部分功能在身份服务器重新上线之前不可用。如果持续看到此警告,请检查配置或联系服务器管理员。", - "failed_connect_identity_server_register": "你可以注册,但部分功能在身份服务器重新上线之前不可用。如果持续看到此警告,请检查配置或联系服务器管理员。", - "failed_connect_identity_server_reset_password": "你可以重置密码,但部分功能在身份服务器重新上线之前不可用。如果持续看到此警告,请检查配置或联系服务器管理员。", - "failed_homeserver_discovery": "无法执行家服务器搜索", + "email_discovery_text": "使用邮件可选择让现有联系人发现。", + "email_field_label": "邮件", + "email_field_label_invalid": "似乎不是有效的邮件地址", + "email_field_label_required": "输入邮件地址", + "email_help_text": "添加邮件地址以用于重置密码", + "email_phone_discovery_text": "使用邮件地址或电话号码可选择让现有联系人发现。", + "enter_email_explainer": "%(homeserver)s 将向你发送验证链接以重置密码。", + "enter_email_heading": "输入邮件地址以重置密码", + "failed_connect_identity_server": "无法连接身份服务器", + "failed_connect_identity_server_other": "你可以登录,但某些功能在身份服务器恢复正常之前将不可用。如果你持续看到此警告,请检查你的配置或联系服务器管理员。", + "failed_connect_identity_server_register": "你可以注册,但某些功能在身份服务器恢复正常之前将不可用。如果你持续看到此警告,请检查你的配置或联系服务器管理员。", + "failed_connect_identity_server_reset_password": "你可以重置密码,但某些功能在身份服务器恢复正常之前将不可用。如果你持续看到此警告,请检查你的配置或联系服务器管理员。", + "failed_homeserver_discovery": "无法执行主服务器发现", "failed_query_registration_methods": "无法查询支持的注册方法。", "failed_soft_logout_auth": "重新认证失败", - "failed_soft_logout_homeserver": "由于家服务器的问题,重新认证失败", - "forgot_password_email_invalid": "电子邮件地址似乎无效。", - "forgot_password_email_required": "必须输入和你账户关联的邮箱地址。", - "forgot_password_prompt": "忘记你的密码了吗?", - "forgot_password_send_email": "发送重置连接", - "identifier_label": "登录方式", + "failed_soft_logout_homeserver": "由于服务器的问题,重新认证失败", + "forgot_password_email_invalid": "邮件地址似乎无效。", + "forgot_password_email_required": "必须输入与你的账户关联的邮件地址", + "forgot_password_prompt": "忘记密码?", + "forgot_password_send_email": "发送邮件", + "identifier_label": "登录选项", "incorrect_credentials": "用户名或密码错误。", - "incorrect_credentials_detail": "请注意,你正在登录 %(hs)s,而非 matrix.org。", - "incorrect_password": "密码错误", + "incorrect_credentials_detail": "请留意你登录的服务器为 %(hs)s 而不是 matrix.org", + "incorrect_password": "密码不正确", "log_in_new_account": "登录到你的新账户。", "logout_dialog": { - "description": "你确定要登出吗?", + "description": "你确定要注销吗?", "megolm_export": "手动导出密钥", - "setup_key_backup_title": "你将失去你的加密消息的访问权", - "setup_secure_backup_description_1": "加密消息已使用端到端加密保护。只有你和拥有密钥的收件人可以阅读这些消息。", - "setup_secure_backup_description_2": "当你登出时,这些密钥会从此设备删除。这意味着你将无法查阅已加密消息,除非你在其他设备上有那些消息的密钥,或者已将其备份到服务器。", - "skip_key_backup": "我不想要我的加密消息" + "setup_key_backup_title": "你将失去加密消息的访问权", + "setup_secure_backup_description_1": "加密消息采用端到端加密技术确保安全。只有你与收件人拥有读取这些消息的密钥。", + "setup_secure_backup_description_2": "当你移除此设备时,这些密钥将从此设备中删除,这意味着你将无法读取加密消息,除非你在其他设备上拥有这些密钥,或者将它们备份到服务器。", + "skip_key_backup": "我要丢弃加密消息" }, - "misconfigured_body": "跟你的%(brand)s管理员确认你的配置不正确或重复的条目。", - "misconfigured_title": "你的 %(brand)s 配置有错误", - "msisdn_field_description": "别的用户可以使用你的联系人详情邀请你加入房间", + "misconfigured_body": "请 %(brand)s 的管理员检查你的配置中是否存在错误或重复的条目。", + "misconfigured_title": "你的 %(brand)s 配置错误", + "mobile_create_account_title": "你即将在 %(hsName)s 创建账户", + "msisdn_field_description": "其他用户可以使用你的联系方式邀请你进入房间", "msisdn_field_label": "电话", - "msisdn_field_number_invalid": "电话号码看起来不太对,请检查并重试", + "msisdn_field_number_invalid": "电话号码看起来不正确,请检查并重试", "msisdn_field_required_invalid": "输入电话号码", - "no_hs_url_provided": "未输入家服务器链接", + "no_hs_url_provided": "未提供主服务器 URL", "oidc": { - "error_title": "我们无法使你登入", - "generic_auth_error": "验证时出了问题。前往登录页面并重试。", - "missing_or_invalid_stored_state": "我们已要求浏览器记住你使用的家服务器,但不幸的是你的浏览器已忘记。请前往登录页面重试。" + "error_title": "我们无法让你登录", + "generic_auth_error": "身份验证期间出现问题。请转到登录页面并重试。", + "missing_or_invalid_stored_state": "我们要求浏览器记住你用于登录的主服务器,但很遗憾,你的浏览器忘记了它。请转到登录页面并重试。" }, - "password_field_keep_going_prompt": "继续前进……", + "password_field_keep_going_prompt": "保持…", "password_field_label": "输入密码", - "password_field_strong_label": "不错,是个强密码!", - "password_field_weak_label": "密码允许但不安全", + "password_field_strong_label": "很好,高强度密码!", + "password_field_weak_label": "允许使用密码,但不安全", "phone_label": "电话", "phone_optional_label": "电话号码(可选)", "qr_code_login": { - "completing_setup": "完成新设备的设置" + "check_code_explainer": "这将验证与其它设备的关联是否安全。", + "check_code_heading": "输入其它设备上显示的数字", + "check_code_input_label": "2 位数代码", + "check_code_mismatch": "数字不匹配", + "completing_setup": "完成新设备的设置", + "error_etag_missing": "发生意外错误。这可能是由于浏览器扩展、代理服务器或服务器配置错误造成的。", + "error_expired": "登录已过期。请重试。", + "error_expired_title": "登录未及时完成", + "error_insecure_channel_detected": "无法与新设备建立安全连接。你的现有设备仍然安全,无需担心。", + "error_insecure_channel_detected_instructions": "现在怎么办?", + "error_insecure_channel_detected_instructions_1": "如果是网络问题,请尝试使用二维码再次登录到其它设备。", + "error_insecure_channel_detected_instructions_2": "如果你遇到同样的问题,请尝试其它 Wi-Fi 网络或使用移动数据流量。", + "error_insecure_channel_detected_instructions_3": "如果未能生效,请手动登录", + "error_insecure_channel_detected_title": "不安全连接", + "error_other_device_already_signed_in": "你不需要做其他任何事情。", + "error_other_device_already_signed_in_title": "你的其它设备已登录", + "error_rate_limited": "短时间内尝试次数过多。请稍后再试。", + "error_unexpected": "发生意外错误。连接你其它设备的请求已被取消。", + "error_unsupported_protocol": "此设备不支持使用二维码登录其它设备。", + "error_unsupported_protocol_title": "其它设备不兼容", + "error_user_cancelled": "已在另一设备上取消登录。", + "error_user_cancelled_title": "登录请求已取消", + "error_user_declined": "你或账户提供者拒绝了登录请求。", + "error_user_declined_title": "登录被拒绝", + "follow_remaining_instructions": "按剩余说明操作", + "open_element_other_device": "在你的其它设备上打开 %(brand)s", + "point_the_camera": "扫描此处显示的二维码", + "scan_code_instruction": "使用其它设备扫描二维码", + "scan_qr_code": "使用二维码登录", + "security_code": "安全代码", + "security_code_prompt": "如有要求,请在其它设备上输入以下代码。", + "select_qr_code": "选择“%(scanQRCode)s”", + "unsupported_explainer": "你的账户提供者不支持通过二维码登录到新设备。", + "unsupported_heading": "二维码不受支持", + "waiting_for_device": "等待设备登录" }, "register_action": "创建账户", "registration": { - "continue_without_email_description": "请注意,如果你不添加电子邮箱并且忘记密码,你将永远失去对你账户的访问权。", - "continue_without_email_field_label": "电子邮箱(可选)", - "continue_without_email_title": "不使用电子邮箱并继续" + "continue_without_email_description": "请注意,如果你未添加邮件地址并忘记了密码,你可能会永久失去账户访问权。", + "continue_without_email_field_label": "邮件地址(可选)", + "continue_without_email_title": "在不使用邮件的情况下继续" }, - "registration_disabled": "此家服务器已禁止注册。", - "registration_msisdn_field_required_invalid": "输入电话号码(此家服务器上必须)", + "registration_disabled": "此主服务器已禁用注册。", + "registration_msisdn_field_required_invalid": "输入电话号码(在此主服务器为必需)", "registration_successful": "注册成功", - "registration_username_in_use": "该名称已被占用。 尝试另一个,或者如果是您,请在下面登录。", - "registration_username_unable_check": "无法检查用户名是否已被使用。稍后再试。", - "registration_username_validation": "仅使用小写字母,数字,横杠和下划线", + "registration_username_in_use": "该用户名已被使用。请尝试其它用户名,如果是你本人,请在下方登录。", + "registration_username_unable_check": "无法检查用户名是否被占用。稍后再试。", + "registration_username_validation": "只能使用小写字母、数字、破折号与下划线", "reset_password": { - "devices_logout_success": "你已登出全部设备,并将不再收到推送通知。要重新启用通知,请在每台设备上再次登入。", - "other_devices_logout_warning_1": "登出你的设备会删除存储在其上的消息加密密钥,使加密的聊天历史不可读。", - "other_devices_logout_warning_2": "若想保留对加密房间的聊天历史的访问权,请设置密钥备份或从其他设备导出消息密钥,然后再继续。", + "confirm_new_password": "确认新密码", + "devices_logout_success": "你已移除所有设备,将不再接收推送通知。要重新启用通知,请在每台设备上重新登录。", + "other_devices_logout_warning_1": "移除设备将删除存储在其中的消息加密密钥,从而使加密的聊天历史无法读取。", + "other_devices_logout_warning_2": "如果你想保留对加密房间中聊天记录的访问权限,请获取恢复密钥或从其它设备导出消息密钥,然后再继续。", "password_not_entered": "必须输入新密码。", - "passwords_mismatch": "新密码必须互相匹配。", - "reset_successful": "你的密码已重置。", - "return_to_login": "返回登录页面" + "passwords_mismatch": "两次输入的新密码必须匹配。", + "rate_limit_error": "短时间内尝试次数过多。请稍后再试。", + "rate_limit_error_with_time": "短时间内尝试次数过多。请于 %(timeout)s 秒后重试。", + "reset_successful": "密码已被重置。", + "return_to_login": "回到登录屏幕", + "sign_out_other_devices": "移除其它设备" }, + "reset_password_action": "重置密码", "reset_password_button": "忘记密码?", - "reset_password_email_field_description": "使用邮件地址恢复你的账户", - "reset_password_email_field_required_invalid": "输入邮件地址(此家服务器上必须)", - "reset_password_email_not_associated": "你的电子邮件地址似乎未与服务器上的Matrix ID关联。", - "reset_password_email_not_found_title": "未找到此邮箱地址", - "server_picker_custom": "其他自定义服务器", - "server_picker_description": "你可以使用自定义服务器选项来指定不同的家服务器URL以登录其他Matrix服务器。这让你能把%(brand)s和不同家服务器上的已有Matrix账户搭配使用。", - "server_picker_description_matrix.org": "免费加入最大的公共服务器,成为数百万用户中的一员", - "server_picker_dialog_title": "决定账户托管位置", - "server_picker_explainer": "使用你的Matrix服务器,或自己架设一个。", - "server_picker_failed_validate_homeserver": "无法验证家服务器", - "server_picker_intro": "我们将您可以托管账户的地方称为“服务器组”。", - "server_picker_invalid_url": "URL 无效", - "server_picker_learn_more": "关于家服务器", - "server_picker_matrix.org": "Matrix.org 是世界上最大的公共家服务器,因此对许多人来说是一个好地方。", - "server_picker_required": "指定家服务器", - "server_picker_title": "登录你的家服务器", + "reset_password_email_field_description": "使用邮件地址以恢复账户", + "reset_password_email_field_required_invalid": "输入邮件地址(在该主服务器为必需)", + "reset_password_email_not_associated": "你的邮件地址似乎未与此主服务器上的 Matrix ID 关联。", + "reset_password_email_not_found_title": "此邮件地址未找到", + "reset_password_title": "重置密码", + "server_picker_custom": "其它主服务器", + "server_picker_description": "你可以使用自定义服务器选项,通过指定不同的主服务器网址登录其它 Matrix 服务器。这样你就可以通过现有的 Matrix 账户在其它主服务器上使用 %(brand)s。", + "server_picker_description_matrix.org": "免费加入数百万人规模,最大的公共服务器", + "server_picker_dialog_title": "决定你的账户托管在哪里", + "server_picker_explainer": "如果有首选的 Matrix 主服务器,请使用它,或托管自己的服务器。", + "server_picker_failed_validate_homeserver": "无法验证主服务器", + "server_picker_intro": "我们将可以托管账户的地方称为 “主服务器”。", + "server_picker_invalid_url": "无效 URL", + "server_picker_learn_more": "关于主服务器", + "server_picker_matrix.org": "Matrix.org 是世界上最大的公共主服务器,因此对许多人来说都是一个不错的选择。", + "server_picker_required": "指定主服务器", + "server_picker_title": "登录到主服务器", "server_picker_title_default": "服务器选项", "server_picker_title_registration": "账户托管于", - "session_logged_out_description": "出于安全考虑,此会话已被注销。请重新登录。", - "session_logged_out_title": "已退出登录", + "session_logged_out_description": "为安全起见,此设备已被移除。请重新登录。", + "session_logged_out_title": "会话已移除", "set_email": { - "description": "这将允许你重置你的密码和接收通知。", - "verification_pending_description": "请检查你的电子邮箱并点击里面包含的链接。完成时请点击继续。", - "verification_pending_title": "验证等待中" + "description": "这将允许你重置密码并接收通知。", + "verification_pending_description": "请查看邮件并点击其中的链接。完成后点击“继续”。", + "verification_pending_title": "等待验证" }, - "set_email_prompt": "你想要设置一个邮箱地址吗?", - "sign_in_description": "使用你的账户继续。", - "sign_in_instead": "跳转到登录", - "sign_in_instead_prompt": "已有账户?在此登录", + "set_email_prompt": "你要设置邮件地址吗?", + "sign_in_description": "使用你的账户以继续。", + "sign_in_instead": "其它登录方式", + "sign_in_instead_prompt": "已有账户?登录", "sign_in_or_register": "登录或创建账户", - "sign_in_or_register_description": "使用已有账户或创建一个新账户。", - "sign_in_prompt": "有账户了?登录", - "sign_in_with_sso": "使用单点登录", + "sign_in_or_register_description": "使用你的现有账户或创建一个新账户继续。", + "sign_in_prompt": "已有账户?登录", + "sign_in_with_sso": "以单点模式登录", + "signing_in": "正在登录…", "soft_logout": { "clear_data_button": "清除所有数据", - "clear_data_description": "清除此设备中的所有数据是永久的。加密消息会丢失,除非其密钥已被备份。", - "clear_data_title": "是否清除此设备中的所有数据?" + "clear_data_description": "清除此会话中的所有数据是永久性的。除非备份了密钥,否则加密消息将会丢失。", + "clear_data_title": "清除此会话中的所有数据?" }, - "soft_logout_heading": "你已登出", - "soft_logout_intro_password": "输入你的密码以登录并重新获取访问你账户的权限。", - "soft_logout_intro_sso": "请登录以重新获取访问你账户的权限。", - "soft_logout_intro_unsupported_auth": "你不能登录到你的账户。请联系你的家服务器管理员以获取更多信息。", + "soft_logout_heading": "你已注销", + "soft_logout_intro_password": "输入密码登录并重新访问你的账户。", + "soft_logout_intro_sso": "登录并重新获得对账户的访问权。", + "soft_logout_intro_unsupported_auth": "你无法登录账户。请联系主服务器管理员了解更多信息。", "soft_logout_subheading": "清除个人数据", + "soft_logout_warning": "警告:你的个人数据(包括加密密钥)仍存储在此会话中。如果你结束使用此会话或想要登录其它账户,请清除它。", "sso": "单点登录", - "sso_complete_in_browser_dialog_title": "转到您的浏览器以完成登录", - "sso_failed_missing_storage": "我们已请求浏览器记住你使用的服务器,但是你的浏览器貌似已经忘记了。请前往登录页面重试。", + "sso_complete_in_browser_dialog_title": "转到浏览器以完成登录", + "sso_failed_missing_storage": "我们要求浏览器记住你用于登录的主服务器,但很遗憾,你的浏览器忘记了它。请转到登录页面并重试。", "sso_or_username_password": "%(ssoButtons)s 或 %(usernamePassword)s", - "sync_footer_subtitle": "如果你加入了很多房间,可能会消耗一些时间", + "sync_footer_subtitle": "如果你加入了很多房间,这可能需要一段时间。", + "syncing": "正在同步…", "uia": { "code": "代码", - "email": "要创建账户,请打开我们刚刚发送到%(emailAddress)s的电子邮件里的链接。", - "email_auth_header": "检查你的电子邮件以继续", - "email_resend_prompt": "没收到吗?重新发送", - "email_resent": "已重新发送!", + "email": "要创建你的账户,请打开我们刚刚发送至 %(emailAddress)s 的邮件中的链接。", + "email_auth_header": "查看邮箱以继续", + "email_resend_prompt": "没有收到?重新发送", + "email_resent": "重新发送!", "fallback_button": "开始认证", - "msisdn": "一封短信已发送到 %(msisdn)s", - "msisdn_token_incorrect": "令牌错误", - "msisdn_token_prompt": "请输入其包含的代码:", - "password_prompt": "在下方输入账户密码以确认你的身份。", - "recaptcha_missing_params": "在服务器配置中缺少验证码公钥。请将此问题报告给你的服务器管理员。", - "registration_token_prompt": "输入由服务器管理员所提供的注册密钥。", - "sso_body": "使用单一登入证明你的身份,以确认添加此电子邮件地址。", - "sso_failed": "确认你的身份时出了一点问题。取消并重试。", - "sso_postauth_body": "点击下方按钮确认你的身份。", + "mas_cross_signing_reset_cta": "在账户中继续", + "mas_cross_signing_reset_description": "你即将前往 %(serverName)s 账户重置数字身份。完成账户重置后,请返回此处并点击“重试”。", + "mas_cross_signing_reset_title": "转到你的账户以重置数字身份", + "msisdn": "已向 %(msisdn)s 发送文本消息", + "msisdn_token_incorrect": "Token 不正确", + "msisdn_token_prompt": "请输入其中包含的代码:", + "password_prompt": "请在下面输入账户密码以确认身份。", + "recaptcha_missing_params": "主服务器配置中缺少 CAPTCHA 公钥。请将此问题报告给主服务器管理员。", + "registration_token_label": "注册 Token", + "registration_token_prompt": "输入主服务器管理员提供的注册 Token。", + "sso_body": "请确认使用单点登录添加此邮件地址以证明身份。", + "sso_failed": "确认身份时出现问题。取消并重试。", + "sso_postauth_body": "点击以下按钮确认身份。", "sso_postauth_title": "确认以继续", - "sso_preauth_body": "要继续,请使用单点登录证明你的身份。", + "sso_preauth_body": "要继续,请使用单点登录以证明身份。", "sso_title": "使用单点登录继续", - "terms": "请阅读并接受此服务器的政策:", - "terms_invalid": "请阅读并接受此服务器的所有政策" + "terms": "请阅读并接受主服务器的政策:", + "terms_invalid": "请阅读并接受主服务器的所有政策" }, - "unsupported_auth": "此服务器未提供客户端支持的任何登录流程。", - "unsupported_auth_email": "此家服务器不支持使用电子邮箱地址登录。", - "unsupported_auth_msisdn": "此服务器不支持使用电话号码认证。", + "unsupported_auth": "此主服务器不提供此客户端支持的任何登录流程。", + "unsupported_auth_email": "此主服务器不支持使用邮件地址登录。", + "unsupported_auth_msisdn": "此服务器不支持使用电话号码进行身份验证。", "username_field_required_invalid": "输入用户名", - "username_in_use": "用户名已被占用,请尝试使用其他用户名。" + "username_in_use": "此用户名已被使用,请更换。", + "verify_email_explainer": "在重置密码之前,我们需要确认你的身份。请点击我们刚刚发送到 %(email)s 中的链接。", + "verify_email_heading": "验证邮件地址以继续" }, "bug_reporting": { - "additional_context": "如果有额外的上下文可以帮助我们分析问题,比如你当时在做什么、房间 ID、用户 ID 等等,请将其列于此处。", - "before_submitting": "在提交日志之前,你必须创建一个GitHub issue 来描述你的问题。", - "collecting_information": "正在收集应用版本信息", + "additional_context": "如果有其它有助于分析问题的上下文(例如你当时在做什么、房间 ID、用户 ID 等),请在此处包含这些内容。", + "before_submitting": "建议你创建 GitHub Issue,以确保你的报告被审核。", + "collecting_information": "正在收集 App 版本信息", "collecting_logs": "正在收集日志", - "create_new_issue": "请在 GitHub 上创建一个新 issue 以便我们调查此错误。", - "description": "调试日志包含应用使用数据,其中包括你的用户名、你访问过的房间的别名或ID、你上次与哪些UI元素互动、还有其它用户的用户名。但不包含消息。", + "create_new_issue": "请在 GitHub 上创建新 issue,以便我们调查此错误。", + "description": "调试日志包含 App 使用数据、你的用户名、访问过的房间 ID 或其别名、上次与之交互的 UI 元素以及其他用户的用户名。它们不包含消息。", "download_logs": "下载日志", "downloading_logs": "正在下载日志", - "error_empty": "请告诉我们哪里出错了,或最好创建一个 GitHub issue 来描述此问题。", + "error_empty": "请告诉我们出了什么问题,或者更好的做法是创建一个 GitHub issue 来描述问题。", + "failed_download_logs": "调试日志下载失败: ", + "failed_send_logs_causes": { + "disallowed_app": "你的 Bug 报告已被拒绝。Rageshake 服务器不支持此应用程序。", + "rejected_generic": "你的 Bug 报告已被拒绝。Rageshake 服务器由于策略原因拒绝了报告内容。", + "rejected_recovery_key": "你的 Bug 报告由于安全原因被拒绝,因为它包含恢复密钥。", + "rejected_version": "你的 Bug 报告被拒绝,因为你正在运行的版本太旧。", + "server_unknown_error": "Rageshake 服务器遇到未知错误,无法处理报告。", + "unknown_error": "日志发送失败。" + }, "github_issue": "GitHub 上的 issue", - "introduction": "若你通过GitHub提交bug,则调试日志能帮助我们追踪问题。 ", - "log_request": "要帮助我们防止其以后发生,请给我们发送日志。", - "logs_sent": "日志已发送", - "matrix_security_issue": "要报告 Matrix 相关的安全问题,请阅读 Matrix.org 的安全公开策略。", - "preparing_download": "正在准备下载日志", + "introduction": "如果你通过 GitHub 提交 bug,调试日志可以帮助我们跟踪问题。", + "log_request": "为帮助我们今后避免这种情况,请向我们发送日志。", + "logs_sent": "发送日志", + "matrix_security_issue": "要报告与 Matrix 相关的安全问题,请阅读 Matrix.org 安全披露政策。", + "preparing_download": "准备下载日志", "preparing_logs": "正在准备发送日志", "send_logs": "发送日志", "submit_debug_logs": "提交调试日志", - "textarea_label": "提示", + "textarea_label": "内容", "thank_you": "谢谢!", - "title": "错误上报", - "unsupported_browser": "提醒:你的浏览器不被支持,所以你的体验可能不可预料。", + "title": "Bug 报告", + "unsupported_browser": "提醒:你的浏览器不受支持,因此你的使用体验可能无法预测。", "uploading_logs": "正在上传日志", - "waiting_for_server": "正在等待服务器响应" + "waiting_for_server": "等待服务器响应" }, - "cannot_invite_without_identity_server": "无法在未设置身份服务器时邀请用户,你可以在“设置”里连接一个。", - "cannot_reach_homeserver": "无法连接到家服务器", - "cannot_reach_homeserver_detail": "确保你的网络连接稳定,或与服务器管理员联系", - "cant_load_page": "无法加载页面", - "chat_card_back_action_label": "返回聊天", + "cannot_invite_without_identity_server": "如果没有身份服务器,则无法通过邮件邀请用户。您可以连接到“设置”下的服务器。", + "cannot_reach_homeserver": "无法连接主服务器", + "cannot_reach_homeserver_detail": "确保具有良好的 Internet 连接,或联系服务器管理员", + "cant_load_page": "无法载入页面", + "chat_card_back_action_label": "回到聊天", "chat_effects": { - "confetti_description": "附加五彩纸屑发送", - "confetti_message": "发送五彩纸屑", - "fireworks_description": "附加烟火发送", - "fireworks_message": "发送烟火", - "hearts_description": "与爱心一起发送给定的消息", - "hearts_message": "发送爱心", - "rainfall_description": "附加降雨发送给定的消息", - "rainfall_message": "发送降雨", - "snowfall_description": "发送附加雪球的给定信息", - "snowfall_message": "发送雪球", - "spaceinvaders_description": "此消息带有空间主题化效果", - "spaceinvaders_message": "发送空间入侵者" + "confetti_description": "向指定消息发送“五彩纸屑”", + "confetti_message": "发送了“五彩纸屑”", + "fireworks_description": "向指定消息发送“烟花”", + "fireworks_message": "发送了“烟花”", + "hearts_description": "向指定消息发送“爱心”", + "hearts_message": "发送了“爱心”", + "rainfall_description": "向指定消息发送“下雨”", + "rainfall_message": "发送了“下雨”", + "snowfall_description": "向指定消息发送“下雪”", + "snowfall_message": "发送了“下雪”", + "spaceinvaders_description": "向指定消息发送具有“太空主题”的特效", + "spaceinvaders_message": "发送了“太空侵略者”" }, "common": { - "access_token": "访问令牌", - "accessibility": "无障碍功能", + "access_token": "访问 Token", + "accessibility": "易用性", "advanced": "高级", - "analytics": "统计分析服务", + "all_chats": "所有聊天", + "analytics": "分析", "and_n_others": { - "other": "和其他%(count)s个人……", - "one": "和其它一个..." + "one": "与另一个…", + "other": "以及剩余 %(count)s 个…" }, "appearance": "外观", "application": "应用", - "are_you_sure": "你确定吗?", + "are_you_sure": "是否确定?", "attachment": "附件", "authentication": "认证", "avatar": "头像", "beta": "beta", - "camera": "摄像头", + "camera": "相机", "cameras": "相机", - "capabilities": "功能", + "cancel": "取消", + "capabilities": "能力", "copied": "已复制!", - "credits": "感谢", + "credits": "鸣谢", "dark": "深色", "description": "描述", "deselect_all": "取消全选", "device": "设备", "edited": "已编辑", - "email_address": "邮箱地址", + "email_address": "邮件地址", "emoji": "表情符号", "encrypted": "已加密", "error": "错误", "faq": "常见问答集", - "favourites": "收藏夹", + "favourites": "收藏", "feedback": "反馈", - "filter_results": "过滤结果", + "filter_results": "筛选结果", "forward_message": "转发消息", "general": "通用", - "go_to_settings": "打开设置", - "guest": "游客", + "go_to_settings": "转到设置", + "guest": "访客", "help": "帮助", "historical": "历史", "home": "主页", - "homeserver": "家服务器", + "homeserver": "主服务器", "identity_server": "身份服务器", - "image": "图片", + "image": "图像", "integration_manager": "集成管理器", "joined": "已加入", "labs": "实验室", - "legal": "法律信息", + "legal": "法律", "light": "浅色", - "loading": "加载中...", + "loading": "正在载入…", "location": "位置", "low_priority": "低优先级", "matrix": "Matrix", "message": "消息", "message_layout": "消息布局", + "message_timestamp_invalid": "无效时间戳", "microphone": "麦克风", "model": "模型", + "moderation_and_safety": "尺度与安全", "modern": "现代", - "mute": "静音", + "mute": "静默", "n_members": { "one": "%(count)s 位成员", - "other": "%(count)s 位成员" + "other": "%(count)s 个成员" }, "n_rooms": { "one": "%(count)s 个房间", "other": "%(count)s 个房间" }, "name": "名称", - "no_results": "没有更多结果", - "no_results_found": "找不到结果", - "not_trusted": "不受信任的", - "off": "关闭", + "no_results": "没有结果", + "no_results_found": "未找到结果", + "not_trusted": "未被信任", + "off": "关", "offline": "离线", - "on": "打开", + "on": "开", "options": "选项", - "orphan_rooms": "其他房间", + "orphan_rooms": "其它房间", "password": "密码", - "people": "联系人", + "people": "人员", "preferences": "偏好", - "presence": "在线", + "presence": "线上状态", "preview_message": "嘿。你是最棒的!", "privacy": "隐私", "private": "私有", @@ -467,67 +541,74 @@ "profile": "个人资料", "public": "公共", "public_room": "公共房间", - "public_space": "公开空间", + "public_space": "公共空间", "qr_code": "二维码", "random": "随机", "reactions": "反应", - "report_a_bug": "反馈问题", + "recommended": "推荐", + "report_a_bug": "报告 Bug", "room": "房间", "room_name": "房间名称", "rooms": "房间", + "save": "保存", + "saved": "已保存", + "saving": "正在保存…", "secure_backup": "安全备份", "select_all": "全选", "server": "服务器", "settings": "设置", - "setup_secure_messages": "设置安全消息", + "setup_secure_messages": "设置安全消息传递", "show_more": "显示更多", - "someone": "某位用户", - "space": "空格", + "someone": "某人", + "space": "空间", "spaces": "空间", "sticker": "贴纸", "stickerpack": "贴纸包", "success": "成功", "suggestions": "建议", "support": "支持", - "system_alerts": "系统警告", + "system_alerts": "系统警报", "theme": "主题", "thread": "消息列", "threads": "消息列", "timeline": "时间线", + "unavailable": "不可用", "unencrypted": "未加密", - "unmute": "取消静音", - "unnamed_room": "未命名的房间", + "unmute": "取消静默", + "unnamed_room": "未命名房间", "unnamed_space": "未命名空间", "unverified": "未验证", + "updating": "正在更新…", "user": "用户", - "user_avatar": "头像", + "user_avatar": "个人资料图像", "username": "用户名", "verified": "已验证", "version": "版本", "video": "视频", "video_room": "视频房间", "view_message": "查看消息", + "voice": "语音", "warning": "警告" }, "composer": { "autocomplete": { "@room_description": "通知房间全体成员", "command_a11y": "命令自动补全", - "command_description": "命令", - "emoji_a11y": "表情符号自动补全", + "command_description": "指令", + "emoji_a11y": "Emoji 自动补全", "notification_a11y": "通知自动补全", "notification_description": "房间通知", "room_a11y": "房间自动补全", - "space_a11y": "空间自动完成", + "space_a11y": "空间自动补全", "user_a11y": "用户自动补全", "user_description": "用户" }, "close_sticker_picker": "隐藏贴纸", "edit_composer_label": "编辑消息", - "format_bold": "粗体", + "format_bold": "加粗", "format_code_block": "代码块", "format_decrease_indent": "减少缩进", - "format_increase_indent": "添加缩进", + "format_increase_indent": "增加缩进", "format_inline_code": "代码", "format_insert_link": "插入链接", "format_italic": "斜体", @@ -536,181 +617,319 @@ "format_ordered_list": "有序列表", "format_strikethrough": "删除线", "format_underline": "下划线", - "format_unordered_list": "无序列表", + "format_unordered_list": "项目符号列表", + "formatting_toolbar_label": "格式化", "link_modal": { - "link_field_label": "链接" + "link_field_label": "链接", + "text_field_label": "文本", + "title_create": "创建链接", + "title_edit": "编辑链接" }, - "no_perms_notice": "你没有在此房间发送消息的权限", + "mode_plain": "隐藏文字格式化选项", + "mode_rich_text": "显示文字格式化选项", + "no_perms_notice": "你无权在此房间发送消息", "placeholder": "发送消息…", - "placeholder_encrypted": "发送加密消息……", + "placeholder_encrypted": "发送加密消息…", "placeholder_reply": "发送回复…", "placeholder_reply_encrypted": "发送加密回复…", - "placeholder_thread": "回复消息列……", - "placeholder_thread_encrypted": "回复加密的消息列……", + "placeholder_thread": "在消息列中回复…", + "placeholder_thread_encrypted": "回复加密消息列…", "poll_button": "投票", "poll_button_no_perms_description": "你无权在此房间启动投票。", "poll_button_no_perms_title": "需要权限", "replying_title": "正在回复", - "room_upgraded_link": "对话在这里继续。", - "room_upgraded_notice": "此房间已被取代,且不再活跃。", + "room_unencrypted": "位于此房间的消息非端到端加密", + "room_upgraded_link": "对话在此处继续。", + "room_upgraded_notice": "此房间已被取代,不再活跃。", "send_button_title": "发送消息", "send_button_voice_message": "发送语音消息", "send_voice_message": "发送语音消息", - "stop_voice_message": "停止录制", + "stop_voice_message": "停止录音", "voice_message_button": "语音消息" }, - "console_dev_note": "若你知道你正在做什么,Element是开源的,请务必看看我们的GitHub(https://github.com/vector-im/element-web/)并贡献!", - "console_scam_warning": "若某人告诉你在这里复制/粘贴某物,那你极有可能正被欺骗!", - "console_wait": "等等!", + "console_dev_note": "如果你知道你在做什么,Element 是开源的,请务必查看我们的 GitHub(https://github.com/vector-im/element-web/)并做出贡献!", + "console_scam_warning": "如果有人告诉你在这里复制或粘贴某些内容,那么你很有可能被诈骗!", + "console_wait": "请三思!", "create_room": { "action_create_room": "创建房间", "action_create_video_room": "创建视频房间", - "encrypted_video_room_warning": "你以后无法停用。房间将会加密但是嵌入的通话不会。", - "encrypted_warning": "之后你无法停用。桥接和大多数机器人也不能工作。", - "encryption_forced": "你的服务器要求私有房间得启用加密。", + "encrypted_video_room_warning": "你以后无法禁用此功能。房间将被加密,但嵌入式通话不会加密。", + "encrypted_warning": "此项之后无法禁用。会导致桥接器与大多数机器人暂不可用。", + "encryption_forced": "服务器要求在私有房间中启用加密。", "encryption_label": "启用端到端加密", - "error_title": "创建房间失败", - "generic_error": "当前服务器可能处于不可用或过载状态,或者你遇到了一个 bug。", - "join_rule_change_notice": "你可以随时从房间设置中更改此设置。", + "error_title": "房间创建失败", + "generic_error": "服务器可能不可用、超载或遇到错误。", + "join_rule_change_notice": "你可以随时在房间设置中更改此项。", "join_rule_invite": "私有房间(仅邀请)", - "join_rule_invite_label": "只有被邀请的人才能找到并加入这个房间。", - "join_rule_public_label": "任何人都可以找到并加入这个房间。", - "join_rule_public_parent_space_label": "任何人都可以找到并加入这个房间,而不仅仅是 的成员。", - "join_rule_restricted": "对空间成员可见", - "join_rule_restricted_label": " 中的每个人都可以找到并加入这个房间。", - "name_validation_required": "请输入房间名称", - "room_visibility_label": "房间可见度", - "title_private_room": "创建一个私人房间", - "title_public_room": "创建公开房间", + "join_rule_invite_label": "只有受邀人员才能找到并加入此房间。", + "join_rule_knock_label": "任何人都可以申请加入,但管理员或协管员需要授予访问权限。你可以稍后更改此设置。", + "join_rule_public_label": "任何人都可以找到并加入此房间。", + "join_rule_public_parent_space_label": "任何人都可以找到并加入此房间,而不仅限于 中的成员。", + "join_rule_restricted": "标准", + "join_rule_restricted_label": "任何位于 中的人都可以加入。", + "name_validation_required": "为房间输入名称", + "room_visibility_label": "房间可见性", + "state_encrypted_warning": "启用加密状态事件的实验性支持,此功能会对服务器隐藏房间名称与主题等元数据。这些元数据对之后加入房间的用户与不支持 MSC4362 的客户端隐藏。", + "state_encryption_label": "加密状态事件", + "title_private_room": "创建私有房间", + "title_public_room": "创建公共房间", "title_video_room": "创建视频房间", - "topic_label": "话题(可选)", - "unfederated": "阻住任何不属于 %(serverName)s 的人加入此房间。", - "unfederated_label_default_off": "你可以启用此选项如果此房间将仅用于你的家服务器上的内部团队协作。此选项之后无法更改。", - "unfederated_label_default_on": "若房间将用于与拥有自己的家服务器的外部团队协作,则你可禁用此功能。这无法在以后更改。", + "topic_label": "主题(可选)", + "unfederated": "阻止任何不属于 %(serverName)s 的人员加入此房间。", + "unfederated_label_default_off": "如果房间仅用于与主服务器上的内部团队协作,则可以启用此项。一旦启用就无法更改。", + "unfederated_label_default_on": "如果此房间将用于与拥有自己主服务器的外部团队协作,你可以禁用此功能。此设置以后无法更改。", "unsupported_version": "服务器不支持指定的房间版本。" }, "create_space": { - "add_details_prompt": "添加一些细节,以便人们辨识你的社群。", - "add_details_prompt_2": "你随时可以更改它们。", - "add_existing_rooms_description": "选择要添加的房间或对话。这是专属于你的空间,不会有人被通知。你稍后可以再增加更多。", - "add_existing_rooms_heading": "你想要组织什么?", + "add_details_prompt": "添加一些信息以便人们识别。", + "add_details_prompt_2": "你可以随时更改。", + "add_existing_rooms_description": "选择要添加的房间或对话。这只是一个供你使用的空间,不会通知任何人。你可以稍后添加更多空间。", + "add_existing_rooms_heading": "你想组织哪些内容?", "address_label": "地址", "address_placeholder": "例如:my-space", - "done_action": "前往我的空间", - "done_action_first_room": "前往我的第一个房间", - "explainer": "空间是将房间和人分组的一种新方式。你想创建什么类型的空间?你可以在以后更改。", - "failed_create_initial_rooms": "创建初始空间房间失败", - "failed_invite_users": "邀请以下用户加入你的空间失败:%(csvUsers)s", - "invite_teammates_by_username": "按照用户名邀请", - "invite_teammates_description": "确保对的人可以访问。稍后你可以邀请更多人。", - "invite_teammates_heading": "邀请你的伙伴", + "creating": "正在创建…", + "creating_rooms": "正在创建房间…", + "done_action": "转到我的空间", + "done_action_first_room": "转到我的首个房间", + "explainer": "空间是发现并组织房间的一种方式。你想创建什么样的空间?", + "failed_create_initial_rooms": "创建初始空间失败", + "failed_invite_users": "邀请以下用户到空间失败:%(csvUsers)s", + "invite_teammates_by_username": "通过用户名邀请", + "invite_teammates_description": "确保认识的人可以访问。你可以稍后再邀请其他人。", + "invite_teammates_heading": "邀请同事", + "inviting_users": "正在邀请…", "label": "创建空间", "name_required": "请输入空间名称", - "personal_space": "仅有我", - "personal_space_description": "用于整理你房间的私有空间", - "private_description": "仅邀请,适合你自己或团队", + "personal_space": "只有我", + "personal_space_description": "一个用于组织你的房间的私有空间", + "private_description": "仅限邀请,适用于个人或团队", "private_heading": "你的私有空间", - "private_personal_description": "确保对的人有权访问 %(name)s", - "private_personal_heading": "你与谁一同工作?", - "private_space": "我和我的伙伴", - "private_space_description": "供你和你的伙伴使用的私有空间", - "public_description": "适合每一个人的开放空间,社群的理想选择", + "private_only_heading": "你的空间", + "private_personal_description": "确保受你期许的人员可以访问 %(name)s", + "private_personal_heading": "你与谁合作?", + "private_space": "我与我的同事", + "private_space_description": "你与同事的私有空间", + "public_description": "任何人都可以加入,适用于社区", "public_heading": "你的公共空间", - "setup_rooms_community_description": "让我们为每个主题都创建一个房间吧。", - "setup_rooms_community_heading": "你想在 %(spaceName)s 中讨论什么?", - "setup_rooms_description": "稍后你可以添加更多房间,包括现有的。", - "setup_rooms_private_heading": "你的团队正在进行什么项目?", - "share_description": "当前仅有你一人,与人同道而行会更好。", + "search_public_button": "在公共空间中搜索", + "setup_rooms_community_description": "创建一些房间以入门。", + "setup_rooms_community_heading": "你想在 %(spaceName)s 中讨论哪些内容?", + "setup_rooms_description": "你可以稍后添加更多房间到空间,包括现有房间。", + "setup_rooms_private_description": "创建一些房间以入门。", + "setup_rooms_private_heading": "你的团队正在进行哪些项目?", + "share_description": "目前只有你一人,如果有其他人,效果会更好。", "share_heading": "分享 %(name)s", "skip_action": "暂时跳过", - "subspace_beta_notice": "向你管理的空间添加空间。", + "subspace_adding": "正在添加…", + "subspace_beta_notice": "在受你管理的空间中添加子空间。", "subspace_dropdown_title": "创建空间", "subspace_existing_space_prompt": "想要添加现有空间?", - "subspace_join_rule_invite_description": "只有受邀者才能找到并加入此空间。", + "subspace_join_rule_invite_description": "只有受邀人员才能找到并加入此空间。", "subspace_join_rule_invite_only": "私有空间(仅邀请)", - "subspace_join_rule_label": "空间可见度", - "subspace_join_rule_public_description": "任何人都可以找到并加入这个空间,而不仅仅是 的成员。", - "subspace_join_rule_restricted_description": " 中的任何人都可以找到并加入。" + "subspace_join_rule_label": "空间可见性", + "subspace_join_rule_public_description": "任何人都可以找到并加入此空间,而不仅是 的成员。", + "subspace_join_rule_restricted_description": "位于 中的任何人都可以加入。" }, "credits": { - "default_cover_photo": "默认封面照片 ©Jesús Roncero 根据CC-BY-SA 4.0 条款使用。", - "twemoji": "Twemoji emoji art ©Twitter, Inc 和其他贡献者 根据CC-BY 4.0 条款使用。", - "twemoji_colr": "twemoji-colr 字体 ©Mozilla Foundation 根据Apache 2.0 条款使用。" + "default_cover_photo": "默认封面照片 © Jesús Roncero,根据 CC-BY-SA 4.0 的条款使用。", + "twemoji": "Twemoji Emoji 艺术 © Twitter, Inc 及其他贡献者 根据 CC-BY 4.0 的条款使用。", + "twemoji_colr": "twemoji-colr 样式 © Mozilla Foundation,根据 Apache 2.0 的条款使用。" + }, + "decline_invitation_dialog": { + "confirm": "你确定要拒绝 %(roomName)s 的加入邀请?", + "ignore_user_help": "你将看不到来自该用户的任何消息或房间邀请。", + "reason_description": "描述举报房间的理由。", + "report_room_description": "向账户提供者举报此房间。", + "title": "拒绝邀请" }, "desktop_default_device_name": "%(brand)s桌面版:%(platformName)s", "devtools": { - "active_widgets": "已启用的挂件", - "category_other": "其他", + "active_widgets": "激活小部件", + "category_other": "其它", "category_room": "房间", "caution_colon": "警告:", + "checking_sticky_events_support": "正在检查是否支持黏着事件…", "client_versions": "客户端版本", + "crypto": { + "4s_public_key_in_account_data": "在账户数据中", + "4s_public_key_not_in_account_data": "未找到", + "4s_public_key_status": "秘密存储公钥:", + "backup_key_cached": "本地缓存", + "backup_key_cached_status": "密钥缓存:", + "backup_key_not_stored": "未存储", + "backup_key_stored": "在秘密存储中", + "backup_key_stored_status": "密钥存储:", + "backup_key_unexpected_type": "意外类型", + "backup_key_well_formed": "良好", + "cross_signing": "交叉签名", + "cross_signing_cached": "本地缓存", + "cross_signing_not_ready": "交叉签名未设置", + "cross_signing_private_keys_in_storage": "在秘密存储中", + "cross_signing_private_keys_in_storage_status": "交叉签名私钥:", + "cross_signing_private_keys_not_in_storage": "存储中未找到", + "cross_signing_public_keys_on_device": "在内存中", + "cross_signing_public_keys_on_device_status": "交叉签名公钥:", + "cross_signing_ready": "交叉签名已就绪。", + "cross_signing_status": "交叉签名状态:", + "cross_signing_untrusted": "你的账户在秘密存储中拥有数字身份,但尚未被此会话信任。", + "crypto_not_available": "密码学模块不可用", + "device_id": "设备 ID", + "key_backup_active_version": "活跃的备份版本:", + "key_backup_active_version_none": "无", + "key_backup_inactive_warning": "你的密钥尚未在此会话中备份。", + "key_backup_latest_version": "服务器上的最新备份版本:", + "key_storage": "密钥存储", + "master_private_key_cached_status": "主私钥:", + "not_found": "未找到", + "not_found_locally": "本地未找到", + "secret_storage_not_ready": "未就绪", + "secret_storage_ready": "就绪", + "secret_storage_status": "秘密存储:", + "self_signing_private_key_cached_status": "自签名私钥:", + "session": "会话", + "session_fingerprint": "指纹(会话密钥)", + "title": "端到端加密", + "user_signing_private_key_cached_status": "用户签名私钥:" + }, "developer_mode": "开发者模式", "developer_tools": "开发者工具", + "device_dehydrated_no": "脱水:否", + "device_dehydrated_yes": "脱水:是", + "device_id": "设备 ID:%(deviceId)s", + "device_keys": "设备密钥", + "device_verification_status": { + "signed_by_owner": "验证状态: 经所有者签名", + "unknown": "验证状态:未知", + "unverified": "验证状态: 未经所有者签名", + "verified": "验证状态: 经交叉签名验证" + }, + "devices": "%(count)s 个密码学设备", "edit_setting": "编辑设置", "edit_values": "编辑值", "empty_string": "<空字符串>", + "error_sticky_duration_must_be_a_number": "stickyDuration 必须是数字", + "error_sticky_duration_out_of_range": "stickyDuration 取值范围必须在 0 ~ 36000 毫秒(1 小时)", "event_content": "事件内容", - "event_id": "事件ID:%(eventId)s", + "event_id": "事件 ID:%(eventId)s", "event_sent": "事件已发送!", "event_type": "事件类型", - "explore_room_state": "查找房间状态", - "failed_to_find_widget": "查找此挂件时出现错误。", + "expired": "已过期", + "expires_in": "剩余", + "explore_account_data": "浏览账户数据", + "explore_room_account_data": "浏览房间内账户数据", + "explore_room_state": "浏览房间状态", + "explore_sticky_state": "浏览黏着状态", + "failed_to_find_widget": "查找此小部件时出错。", "failed_to_load": "载入失败。", - "failed_to_save": "保存设置失败。", - "failed_to_send": "发送事件失败!", - "invalid_json": "看起来不像有效的JSON。", + "failed_to_save": "设置保存失败。", + "failed_to_send": "事件发送失败!", + "id": "ID:", + "invalid_device_key_id": "设备密钥 ID 无效", + "invalid_json": "JSON 似乎无效", "level": "层级", - "low_bandwidth_mode": "低带宽模式", - "low_bandwidth_mode_description": "需要兼容的家服务器。", - "number_of_users": "用户数", - "original_event_source": "原始事件源码", - "room_id": "房间ID: %(roomId)s", + "low_bandwidth_mode": "禁用对带宽有刚需的功能", + "low_bandwidth_mode_description": "禁用加密、状态、已读回执与键入通知", + "main_timeline": "主要时间线", + "manual_device_verification": "手动设备验证", + "no_receipt_found": "未找到回执", + "no_sticky_events": "此房间暂无黏着事件。", + "notification_state": "通知状态为 %(notificationState)s", + "notifications_debug": "通知调试", + "number_of_users": "用户数量", + "only_joined_members": "仅限已加入的用户", + "original_event_source": "原始事件源代码", + "restore_from_backup": "从备份恢复", + "room_encrypted": "房间已加密 ✅", + "room_id": "房间 ID:%(roomId)s", + "room_not_encrypted": "此房间未加密🚨", + "room_notifications_dot": "圆点:", + "room_notifications_highlight": "高亮:", + "room_notifications_last_event": "最新事件:", + "room_notifications_sender": "发送者:", + "room_notifications_thread_id": "消息列 ID:", + "room_notifications_total": "总数:", + "room_notifications_type": "类型:", + "room_status": "房间状态", + "room_unread_status_count": { + "one": "房间未读状态:%(status)s,数量:%(count)s", + "other": "房间未读状态:%(status)s,数量:%(count)s" + }, "save_setting_values": "保存设置值", + "see_history": "查看历史", "send_custom_account_data_event": "发送自定义账户数据事件", - "send_custom_room_account_data_event": "发送自定义房间账户资料事件", + "send_custom_room_account_data_event": "发送自定义房间账户数据事件", "send_custom_state_event": "发送自定义状态事件", + "send_custom_sticky_event": "发送自定义黏着事件", "send_custom_timeline_event": "发送自定义时间线事件", "server_info": "服务器信息", "server_versions": "服务器版本", - "settable_global": "全局可设置性", - "settable_room": "房间可设置性", + "settable_global": "全局可设置", + "settable_room": "可在房间内设置", "setting_colon": "设置:", "setting_definition": "设置定义:", "setting_id": "设置 ID", - "show_hidden_events": "显示时间线中的隐藏事件", + "settings": { + "elementCallUrl": "Element Call URL" + }, + "settings_explorer": "设置浏览器", + "show_empty_content_events": "以空白内容显示事件", + "show_hidden_events": "在时间线显示隐藏事件", "spaces": { - "one": "<空间>", - "other": "<%(count)s个空间>" + "one": "", + "other": "<%(count)s 个空间>" }, "state_key": "状态键(State Key)", + "sticky_duration": "黏着持续时间(毫秒)", + "sticky_events_not_supported": "你的主服务器不支持黏着事件。", + "thread_root_id": "消息列根 ID:%(threadRootId)s", + "threads_timeline": "消息列时间线", "title": "开发者工具", "toggle_event": "切换事件", "toolbox": "工具箱", - "use_at_own_risk": "此界面不会检查值的类型。使用风险自负。", + "use_at_own_risk": "此 UI 不检查值的数据类型。需自行承担使用风险。", + "user_avatar": "头像:%(avatar)s", + "user_displayname": "显示名称:%(displayname)s", + "user_id": "用户 ID:%(userId)s", + "user_no_avatar": "头像:", + "user_no_displayname": "显示名称:", + "user_read_up_to": "用户阅读到:", + "user_read_up_to_ignore_synthetic": "用户阅读到(ignoreSynthetic): ", + "user_read_up_to_private": "用户阅读到(m.read.private): ", + "user_read_up_to_private_ignore_synthetic": "用户阅读到(m.read.private;ignoreSynthetic):", + "user_room_membership": "成员资格", + "user_verification_status": { + "identity_changed": "验证状态: 未验证且已更改数字身份", + "unverified": "验证状态: 未验证", + "verified": "验证状态: 已验证", + "was_verified": "验证状态: 已验证但已更改数字身份" + }, + "users": "用户", "value": "值", "value_colon": "值:", - "value_in_this_room": "此房间中的值", + "value_in_this_room": "在此房间的值", "value_this_room_colon": "此房间中的值:", - "values_explicit": "各层级的值", - "values_explicit_colon": "各层级的值:", - "values_explicit_room": "此房间中各层级的值", - "values_explicit_this_room_colon": "此房间中各层级的值:", - "view_source_decrypted_event_source": "解密的事件源码", - "widget_screenshots": "对支持的挂件启用挂件截图" + "values_explicit": "显式值", + "values_explicit_colon": "显式值:", + "values_explicit_room": "此房间中的显式值", + "values_explicit_this_room_colon": "此房间中的显式值:", + "view_servers_in_room": "在房间中查看服务器", + "view_source_decrypted_event_source": "解密的事件源代码", + "view_source_decrypted_event_source_unavailable": "解密源代码不可用", + "widget_screenshots": "为支持的小部件启用“小部件屏幕截图”" }, "dialog_close_label": "关闭对话框", "download_completed": "下载完成", "emoji": { "categories": "类别", - "category_activities": "活动", - "category_animals_nature": "动物和自然", - "category_flags": "旗", - "category_food_drink": "食物和饮料", + "category_activities": "节假日", + "category_animals_nature": "动物与自然", + "category_flags": "旗帜", + "category_food_drink": "饮食", "category_frequently_used": "经常使用", - "category_objects": "物体", - "category_smileys_people": "表情和人", + "category_objects": "日常物品", + "category_smileys_people": "人与表情", "category_symbols": "符号", - "category_travel_places": "旅行和地点", + "category_travel_places": "文旅景点", "quick_reactions": "快速反应" }, "emoji_picker": { @@ -720,383 +939,498 @@ "empty_room_was_name": "空房间(曾是%(oldName)s)", "encryption": { "access_secret_storage_dialog": { + "alternatives": "如果你有安全密钥或安全口令,这也会起作用。", "key_validation_text": { - "wrong_security_key": "安全密钥错误" + "wrong_security_key": "你输入的恢复密钥不正确。" }, + "privacy_warning": "确保此时无人窥视此屏幕!", "restoring": "从备份恢复密钥", - "security_key_title": "安全密钥" + "security_key_label": "恢复密钥", + "security_key_title": "输入恢复密钥" }, "bootstrap_title": "设置密钥", - "confirm_encryption_setup_body": "点击下方按钮以确认设置加密。", + "confirm_encryption_setup_body": "点击以下按钮确认加密设置。", "confirm_encryption_setup_title": "确认加密设置", - "cross_signing_room_normal": "此房间是端到端加密的", - "cross_signing_room_verified": "房间中所有人都已被验证", - "cross_signing_room_warning": "有人在使用未知会话", - "cross_signing_user_normal": "你没有验证此用户。", - "cross_signing_user_verified": "你验证了此用户。此用户已验证了其全部会话。", - "cross_signing_user_warning": "此用户没有验证其全部会话。", - "event_shield_reason_authenticity_not_guaranteed": "此加密消息的真实性无法在此设备上保证。", + "continue_with_reset": "继续重置", + "cross_signing_room_normal": "此房间已端到端加密", + "cross_signing_room_verified": "此房间中的每个成员都已验证", + "cross_signing_room_warning": "有人正在使用未知会话", + "cross_signing_user_normal": "你尚未验证此用户。", + "cross_signing_user_verified": "你已验证此用户。此用户已验证其所有会话。", + "cross_signing_user_warning": "该用户尚未验证其所有会话。", + "enter_recovery_key": "输入恢复密钥", + "event_shield_reason_authenticity_not_guaranteed": "此设备无法保证此加密消息的真实性。", + "event_shield_reason_mismatched_sender": "事件的发送者与发送该事件的设备的所有者不匹配。", "event_shield_reason_mismatched_sender_key": "由未验证的会话加密", + "event_shield_reason_unknown_device": "由未知或已被删除的设备加密。", + "event_shield_reason_unsigned_device": "由未经所有者验证的设备加密。", + "event_shield_reason_unverified_identity": "由未经验证的用户加密。", "export_unsupported": "你的浏览器不支持所需的密码学扩展", + "forgot_recovery_key": "忘记恢复密钥?", + "identity_needs_reset_description": "你必须重置数字身份才能确保访问消息历史", "import_invalid_keyfile": "不是有效的 %(brand)s 密钥文件", - "import_invalid_passphrase": "身份验证失败:密码错误?", + "import_invalid_passphrase": "身份验证检查失败:密码不正确?", + "key_storage_out_of_sync": "你的密钥存储不同步。", + "key_storage_out_of_sync_description": "请确认恢复密钥,以保持对密钥存储与消息历史记录的访问权。", + "message_shared_by": "由于此消息在发送时你不位于此房间,%(displayName)s(%(userId)s)共享了此消息。", "messages_not_secure": { - "cause_1": "你的家服务器", - "cause_2": "你正在验证的用户所连接的家服务器", - "cause_3": "你或其他用户的互联网连接", + "cause_1": "你的主服务器版本太旧,不支持所需的最低 API 版本。请联系你的服务器所有者或升级你的服务器。", + "cause_2": "你正在验证的用户所连接的主服务器", + "cause_3": "你或其他用户的 Internet 连接", "cause_4": "你或其他用户的会话", - "heading": "以下之一可能被损害:", - "title": "你的消息不安全" + "heading": "下列中的某项可能已泄露:", + "title": "你的消息传递不安全" }, "new_recovery_method_detected": { - "description_1": "检测到新的安全短语和安全消息密钥。", - "description_2": "此会话正在使用新的恢复方法加密历史。", - "title": "新恢复方式", - "warning": "如果你没有设置新恢复方式,可能有攻击者正试图侵入你的账户。请立即更改你的账户密码并在设置中设定一个新恢复方式。" + "description_1": "已检测到用于安全信息的新安全口令与密钥。", + "description_2": "此会话正在使用新的恢复方法加密历史记录。", + "title": "新的恢复方法", + "warning": "如果你未设置新的恢复方法,攻击者可能正在尝试访问你的账户。请立即在“设置”中更改你的账户密码并设置新的恢复方法。" }, + "pinned_identity_changed": "%(displayName)s (%(userId)s) 的数字身份已重置。了解更多", + "pinned_identity_changed_no_displayname": "%(userId)s的数字身份已重置。了解更多", "recovery_method_removed": { - "description_1": "此会话已检测到你的安全短语和安全消息密钥被移除。", - "description_2": "如果你出于意外这样做了,你可以在此会话上设置安全消息,以使用新的加密方式重新加密此会话的消息历史。", - "title": "恢复方式已移除", - "warning": "如果你没有移除此恢复方式,可能有攻击者正试图侵入你的账户。请立即更改你的账户密码并在设置中设定一个新的恢复方式。" + "description_1": "此会话检测到你的安全口令与安全消息密钥已被移除。", + "description_2": "如果不慎执行了此操作,你可以为此会话设置安全消息传递,它将使用新的恢复方法重新加密此会话的消息历史。", + "title": "恢复方法已移除", + "warning": "如果你未移除恢复方法,攻击者可能正在尝试访问你的账户。请立即在“设置”中更改你的账户密码并设置新的恢复方法。" }, + "set_up_recovery": "备份聊天", + "set_up_recovery_toast_description": "你的聊天已被端到端加密自动备份。如果你无法访问所有设备,则需要使用恢复密钥并保留数字身份。", "set_up_toast_title": "设置安全备份", "setup_secure_backup": { - "explainer": "在登出之前请备份密钥以免丢失。" + "explainer": "移除此设备前备份密钥以防止丢失。" }, + "turn_on_key_storage": "启用密钥存储", + "turn_on_key_storage_description": "这将允许你在新设备上查看聊天历史, 这是备份聊天与数字身份所必需的。", "udd": { - "interactive_verification_button": "用表情符号交互式验证", - "other_ask_verify_text": "要求此用户验证其会话,或在下面手动进行验证。", - "other_new_session_text": "%(name)s(%(userId)s)登录到未验证的新会话:", - "own_ask_verify_text": "使用以下选项之一验证你的其他会话。", - "own_new_session_text": "你登录了未经过验证的新会话:", - "title": "不可信任" + "interactive_verification_button": "使用 Emoji 交互式验证", + "other_ask_verify_text": "请该用户验证其会话,或在下面手动验证。", + "other_new_session_text": "%(name)s(%(userId)s)在未验证的情况下登录了一个新会话:", + "own_ask_verify_text": "请使用以下选项之一验证你的其它会话。", + "own_new_session_text": "你在未验证的情况下登录了新会话:", + "title": "未被信任" }, "unable_to_setup_keys_error": "无法设置密钥", "verification": { - "accepting": "正在接受……", + "accepting": "正在接受…", "after_new_login": { "device_verified": "设备已验证", "skip_verification": "暂时跳过验证", "verify_this_device": "验证此设备" }, - "cancelling": "正在取消……", - "complete_action": "收到", + "cancelled_verification": "请求超时、被拒绝或验证结果不匹配。", + "cancelling": "正在取消…", + "cant_confirm": "无法确认?", + "complete_action": "明白", "complete_description": "你已成功验证此用户。", "complete_title": "已验证!", - "explainer": "此用户的安全消息是端到端加密的,不能被第三方读取。", - "in_person": "为了安全,请当面完成或使用信任的方法交流。", - "incoming_sas_device_dialog_text_1": "验证此设备以将其标记为已信任。在收发端到端加密消息时,信任设备可让你与其他用户更加放心。", - "incoming_sas_device_dialog_text_2": "验证此设备会将其标记为已信任,与此同时,其他验证了你的用户也会信任此设备。", - "incoming_sas_dialog_title": "收到验证请求", - "incoming_sas_user_dialog_text_1": "验证此用户并将其标记为已信任。在收发端到端加密消息时,信任用户可让你更加放心。", - "incoming_sas_user_dialog_text_2": "验证此用户会将其会话标记为已信任,与此同时,你的会话也会被此用户标记为已信任。", - "no_support_qr_emoji": "你正在尝试验证的设备不支持扫码QR码或表情符号验证,这是%(brand)s所支持的。用不同的客户端试试。", - "other_party_cancelled": "另一方取消了验证。", - "prompt_encrypted": "验证房间中所有用户以确保其安全。", - "prompt_unencrypted": "在加密房间中,验证所有用户以确保其安全。", - "qr_or_sas": "%(qrCode)s或%(emojiCompare)s", + "confirm_identity_description": "验证此设备以设置安全消息传递", + "confirm_identity_title": "确认你的数字身份", + "confirm_the_emojis": "确认以下 Emoji 与你其它设备上显示的相符。", + "error_starting_description": "我们无法与其他用户开始聊天。", + "error_starting_title": "开始验证时出错", + "explainer": "与此用户的安全消息已进行端到端加密,第三方无法读取。", + "in_person": "为了安全起见,请亲自执行此操作或使用受信任的通信方式。", + "incoming_sas_device_dialog_text_1": "验证此设备并将其标记为受信任。信任此设备可让你和其它用户在使用端到端加密消息时更加安心。", + "incoming_sas_device_dialog_text_2": "验证此设备会将其标记为受信任,并且已与你验证过的用户将信任此设备。", + "incoming_sas_dialog_title": "验证请求传入", + "incoming_sas_dialog_waiting": "等待对方确认…", + "incoming_sas_user_dialog_text_1": "验证此用户并将其标记为受信任的用户。其可以让你在使用端到端加密消息时更加安心。", + "incoming_sas_user_dialog_text_2": "验证此用户会将他们的会话标记为受信任,也会将你的会话标记为对他们受信任。", + "manual": { + "already_verified": "此设备已经过验证", + "already_verified_and_wrong_fingerprint": "提供的指纹不匹配,但设备已验证!", + "device_id": "设备 ID", + "failure_description": "“%(deviceId)s”验证失败:%(error)s", + "failure_title": "验证失败", + "fingerprint": "指纹(会话密钥)", + "no_crypto": "无法验证设备:加密组件未启用", + "no_device": "无法验证设备:设备“%(deviceId)s”未找到", + "no_userid": "无法验证设备:无法找到用户 ID", + "success_description": "此设备(%(deviceId)s)已交叉签名", + "success_title": "验证成功", + "text": "请提供你自己的一台设备的 ID 和指纹进行验证。请注意,这将允许其它设备以你的身份发送和接收消息。如果有人告诉你在此处粘贴内容,你很可能被诈骗!", + "wrong_fingerprint": "无法验证设备“%(deviceId)s”:提供的指纹“%(fingerprint)s”与设备指纹“%(fprint)s”不匹配。" + }, + "no_support_qr_emoji": "你尝试验证的设备不支持扫描二维码或 Emoji 验证,而 %(brand)s 支持这些功能。请尝试使用其它客户端。", + "now_you_can": "现在你可以安全地读取或发送消息,并且与你聊天的任何人也可以信任此设备。", + "once_accepted_can_continue": "一旦被接受,你将可以继续验证。", + "other_party_cancelled": "对方已取消验证。", + "prompt_encrypted": "验证房间中的所有用户以确保安全。", + "prompt_unencrypted": "在加密房间中验证所有用户以确保安全。", + "qr_or_sas": "%(qrCode)s 或 %(emojiCompare)s", "qr_prompt": "扫描此唯一代码", - "qr_reciprocate_same_shield_user": "快完成了!%(displayName)s 显示了同样的盾牌吗?", + "qr_reciprocate_check_again_device": "再次在你的其它设备上检查以完成验证。", + "qr_reciprocate_no": "否,我没有看到绿色盾牌", + "qr_reciprocate_same_shield_user": "即将完成!%(displayName)s 显示的是相同的盾牌吗?", + "qr_reciprocate_yes": "是,我看到了绿色盾牌", + "request_toast_accept_user": "验证用户", + "request_toast_decline_counter": "忽略(剩余 %(counter)s 秒)", "request_toast_detail": "来自 %(ip)s 的 %(deviceId)s", - "sas_caption_self": "确认屏幕上出现以下数字,以验证设备。", - "sas_caption_user": "通过在其屏幕上显示以下数字来验证此用户。", - "sas_description": "若你在两个设备上都没有相机,比较唯一一组表情符号", - "sas_emoji_caption_user": "通过在其屏幕上显示以下表情符号来验证此用户。", - "sas_match": "它们匹配", - "sas_no_match": "它们不匹配", - "sas_prompt": "比较唯一表情符号", - "scan_qr": "扫码验证", - "scan_qr_explainer": "请 %(displayName)s 扫描你的代码:", + "request_toast_start_verification": "开始验证", + "sas_caption_self": "通过确认以下数字出现在设备屏幕上以验证此设备。", + "sas_caption_user": "通过确认以下数字出现在用户的屏幕上已验证此用户。", + "sas_description": "如果两台设备都没有摄像头,请比较一组唯一的 Emoji", + "sas_emoji_caption_user": "通过确认以下 Emoji 是否出现在对方的屏幕上从而验证此用户。", + "sas_match": "匹配", + "sas_no_match": "不匹配", + "sas_prompt": "比较唯一 Emoji", + "scan_qr": "通过扫描验证", + "scan_qr_explainer": "请求 %(displayName)s 扫描代码:", "start_button": "开始验证", - "successful_user": "你成功验证了 %(displayName)s!", - "unsupported_method": "无法找到支持的验证方法。", - "unverified_session_toast_title": "现在登录。请问是你本人吗?", - "unverified_sessions_toast_description": "检查以确保你的账户是安全的", - "unverified_sessions_toast_reject": "稍后再说", + "successful_user": "你已成功验证 %(displayName)s!", + "unsupported_method": "无法找到受支持的验证方法。", + "unverified_session_toast_accept": "是我", + "unverified_session_toast_title": "有新登录。是否为本人?", + "unverified_sessions_toast_description": "审阅以确保你的账户安全", + "unverified_sessions_toast_reject": "稍后", "unverified_sessions_toast_title": "你有未验证的会话", - "verification_dialog_title_device": "验证其他设备", + "use_another_device": "使用另一设备", + "use_recovery_key": "使用恢复密钥", + "verification_dialog_title_choose": "选择验证方式", + "verification_dialog_title_compare_emojis": "比较 Emoji", + "verification_dialog_title_confirm_green_shield": "确认你在其它设备上看到了绿色盾牌。", + "verification_dialog_title_device": "验证其它设备", + "verification_dialog_title_failed": "验证失败", + "verification_dialog_title_start_on_other_device": "在其它设备上开始验证", "verification_dialog_title_user": "验证请求", - "verification_skip_warning": "如果不进行验证,您将无法访问您的所有消息,并且在其他人看来可能不受信任。", - "verification_success_with_backup": "你的新设备已通过验证。它现在可以访问你的加密消息,并且其它用户会将其视为受信任的。", - "verification_success_without_backup": "你的新设备现已验证。其他用户将会视其为受信任的。", - "verify_emoji": "通过表情符号验证", - "verify_emoji_prompt": "通过比较唯一的表情符号来验证。", - "verify_emoji_prompt_qr": "如果你不能扫描以上代码,请通过比较唯一的表情符号来验证。", - "verify_later": "我稍后进行验证", - "waiting_for_user_accept": "正在等待%(displayName)s接受……", - "waiting_other_device": "正等待你在其它设备上验证……", - "waiting_other_device_details": "正等待你在其它设备上验证,%(deviceName)s(%(deviceId)s)……", - "waiting_other_user": "正在等待%(displayName)s进行验证……" + "verification_dialog_title_verified": "设备已验证", + "verification_skip_warning": "在没有验证的情况下你将无法访问所有消息,并且无法被其他人信任。", + "verification_success_with_backup": "你的新设备现已验证。它可以访问你的加密消息,其他用户将视其为受信任的设备。", + "verification_success_without_backup": "你的新设备已通过验证。其他用户将看到它是受信任的。", + "verify_by_completing_one_of": "完成以下任一方式进行验证:", + "verify_emoji": "使用 Emoji 验证", + "verify_emoji_prompt": "通过比较唯一的 Emoji 进行验证。", + "verify_emoji_prompt_qr": "如果无法扫描上述二维码,可通过比较唯一的 Emoji 验证。", + "verify_later": "稍后验证", + "waiting_for_user_accept": "正在等待 %(displayName)s 接受…", + "waiting_other_device": "正在等待其它设备验证…", + "waiting_other_device_details": "等待你在另一台设备上验证,%(deviceName)s(%(deviceId)s)…", + "waiting_other_user": "正在等待 %(displayName)s 验证…" }, "verification_requested_toast_title": "已请求验证", - "verify_toast_description": "其他用户可能不信任它", - "verify_toast_title": "验证此会话" + "verified_identity_changed": "%(displayName)s (%(userId)s) 的数字身份已重置。了解更多", + "verified_identity_changed_no_displayname": "%(userId)s的数字身份已重置。了解更多", + "verify_toast_description": "可能不受其他用户信任", + "verify_toast_title": "验证此设备", + "withdraw_verification_action": "撤消验证" }, "error": { - "admin_contact": "请 联系你的服务管理员 以继续使用本服务。", - "admin_contact_short": "请联系你的服务器管理员。", - "app_launch_unexpected_error": "准备软件时出现意外错误,详细信息请查看控制台。", - "cannot_load_config": "无法加载配置文件:请刷新页面以重试。", - "connection": "与家服务器通讯时出现问题,请稍后再试。", - "dialog_description_default": "发生了一个错误。", - "edit_history_unsupported": "你的家服务器似乎不支持此功能。", + "admin_contact": "请联系服务管理员以继续使用此服务。", + "admin_contact_short": "联系你的服务器管理员。", + "app_launch_unexpected_error": "准备 App 时发生意外错误。详情请查看控制台。", + "cannot_load_config": "无法加载配置文件:请刷新页面重试。", + "connection": "与主服务器通信时出现问题,请稍后重试。", + "dialog_description_default": "发生错误。", + "download_media": "下载源媒体失败,未找到源 URL", + "edit_history_unsupported": "你的主服务器似乎不支持此功能。", "failed_copy": "复制失败", - "hs_blocked": "此 homeserver 已被其管理员屏蔽。", - "invalid_configuration_mixed_server": "配置无效:无法与 default_server_name 或 default_server_config 一起指定 default_hs_url", - "invalid_configuration_no_server": "配置无效:没有指定默认服务器。", - "invalid_json": "Element 配置文件中包含无效的 JSON。请改正错误并重新加载页面。", + "hs_blocked": "此主服务器已被其管理员屏蔽。", + "invalid_configuration_mixed_server": "配置无效:“default_hs_url”不能与“default_server_name”或“default_server_config”同时指定。", + "invalid_configuration_no_server": "配置无效:未指定默认服务器。", + "invalid_json": "你的 Element 配置包含无效的 JSON。请修正此问题并重载页面。", "invalid_json_detail": "来自解析器的消息:%(message)s", - "invalid_json_generic": "无效的 JSON", - "mau": "此家服务器已达到其每月活跃用户限制。", + "invalid_json_generic": "无效 JSON", + "mau": "此主服务器已达到每月活跃用户数量限制。", "misconfigured": "Element 配置错误", - "mixed_content": "当浏览器地址栏里有 HTTPS 的 URL 时,不能使用 HTTP 连接家服务器。请使用 HTTPS 或者允许不安全的脚本。", - "non_urgent_echo_failure_toast": "你的服务器没有响应一些请求。", - "resource_limits": "本服务器已达到其使用量限制之一。", + "mixed_content": "当浏览器地址栏中显示 HTTPS 网址时,无法通过 HTTP 连接到主服务器。请使用 HTTPS 或启用不安全的脚本。", + "non_urgent_echo_failure_toast": "你的服务器不响应某些请求。", + "resource_limits": "该主服务器已超出其资源限制。", "session_restore": { - "clear_storage_button": "清除存储并登出", - "clear_storage_description": "登出并删除加密密钥?", - "description_1": "我们在尝试恢复你先前的会话时遇到了错误。", - "description_2": "如果你之前使用过较新版本的 %(brand)s,则你的会话可能与当前版本不兼容。请关闭此窗口并使用最新版本。", - "description_3": "清除本页储存在你浏览器上的数据或许能修复此问题,但也会导致你退出登录并无法读取任何已加密的聊天记录。", + "clear_storage_button": "移除此设备", + "clear_storage_description": "移除此设备的同时包括其加密密钥?", + "description_1": "尝试恢复之前的会话时出错。", + "description_2": "如果你之前使用过较新版本的 %(brand)s,你的会话可能与此版本不兼容。请关闭此窗口并返回到较新的版本。", + "description_3": "清除浏览器的存储空间或许可以解决问题,但会将此设备移除,并导致所有加密的聊天历史无法读取。", "title": "无法恢复会话" }, - "something_went_wrong": "出了点问题!", - "storage_evicted_description_1": "一些会话数据,包括加密消息密钥,已缺失。要修复此问题,登出并重新登录,然后从备份恢复密钥。", - "storage_evicted_description_2": "你的浏览器可能在磁盘空间不足时删除了此数据。", - "storage_evicted_title": "缺失会话数据", - "sync": "服务器连接失败,正在重试……", - "tls": "无法连接家服务器 - 请检查网络连接,确保你的家服务器 SSL 证书被信任,且没有浏览器插件拦截请求。", + "something_went_wrong": "出现问题!", + "storage_evicted_description_1": "包括加密消息密钥在内的部分会话数据丢失。请注销并重新登录以修复此问题,并从备份中恢复密钥。", + "storage_evicted_description_2": "你的浏览器可能在磁盘空间不足时移除了这些数据。", + "storage_evicted_title": "会话数据缺失", + "sync": "无法连接到主服务器,正在重试…", + "tls": "无法连接到主服务器,请检查网络连接,确保主服务器的 SSL 证书受信任,并且浏览器扩展程序未阻止请求。", "unknown": "未知错误", "unknown_error_code": "未知错误代码", - "update_power_level": "权力级别修改失败" + "update_history_visibility": "历史可见性更改失败", + "update_power_level": "权力值更改失败" }, - "error_app_opened_in_another_window": "%(brand)s已在另一个窗口中打开。单击“%(label)s”以在此处使用%(brand)s并断开其他窗口的连接。", - "error_database_closed_title": "数据库意外关闭", + "error_app_open_in_another_tab": "切换到其它标签页以连接到 %(brand)s。现在可以关闭此标签页。", + "error_app_open_in_another_tab_title": "%(brand)s 已在其它标签页中打开", + "error_app_opened_in_another_window": "%(brand)s 已在另一个窗口中打开。点击“%(label)s”即可在此处使用 %(brand)s 并断开与另一个窗口的连接。", + "error_database_closed_description": { + "for_desktop": "你的磁盘可能已满。请清理空间并重新加载。", + "for_web": "如果你清除了浏览数据,则预计会出现此消息。%(brand)s 可能也在另一个标签页中打开,或者你的磁盘已满。请清理一些空间并重载。" + }, + "error_database_closed_title": "%(brand)s 已停止工作", "error_dialog": { "copy_room_link_failed": { - "description": "无法将房间的链接复制到剪贴板。", + "description": "无法复制房间链接到剪贴板。", "title": "无法复制房间链接" }, - "error_loading_user_profile": "无法加载用户资料", - "forget_room_failed": "忘记房间失败,错误代码: %(errCode)s" + "error_loading_user_profile": "无法载入用户资料", + "forget_room_failed": "忘记房间 %(errCode)s 失败" }, "error_user_not_logged_in": "用户未登录", "event_preview": { "m.call.answer": { - "dm": "通话中", - "user": "%(senderName)s加入通话", - "you": "你加入通话" + "dm": "通话进行中", + "user": "%(senderName)s 已加入通话", + "you": "你已加入通话" }, "m.call.hangup": { "user": "%(senderName)s 结束了通话", "you": "你结束了通话" }, "m.call.invite": { - "dm_receive": "%(senderName)s正在通话", - "dm_send": "正在等待接听", - "user": "%(senderName)s开始了通话", + "dm_receive": "%(senderName)s 正在通话", + "dm_send": "等待接听", + "user": "%(senderName)s 开始了通话", "you": "你开始了通话" - } + }, + "m.emote": "* %(senderName)s %(emote)s", + "m.reaction": { + "user": "%(sender)s 使用 %(reaction)s 对 %(message)s 作出反应", + "you": "你使用了 %(reaction)s 对 %(message)s 作出反应" + }, + "m.sticker": "%(senderName)s:%(stickerName)s", + "m.text": "%(senderName)s:%(message)s", + "prefix": { + "audio": "音频", + "file": "文件", + "image": "图像", + "poll": "投票", + "video": "视频" + }, + "preview": "%(prefix)s:%(preview)s" }, "export_chat": { - "cancelled": "导出已取消", - "cancelled_detail": "成功取消了导出", - "confirm_stop": "您确定要停止导出数据吗?如果你这样做了,你需要重新开始。", - "creating_html": "正在创建 HTML...", - "creating_output": "正在创建输出...", + "cancelled": "已取消导出", + "cancelled_detail": "导出已被取消", + "confirm_stop": "你确定要停止导出数据?继而导致需要重新开始。", + "creating_html": "正在创建 HTML…", + "creating_output": "正在创建输出…", "creator_summary": "%(creatorName)s 创建了此房间。", "current_timeline": "当前时间线", - "enter_number_between_min_max": "输入一个 %(min)s 和 %(max)s 之间的数字", - "error_fetching_file": "获取文件出错", - "export_info": "这是 导出的开始。导出人 ,导出日期 %(exportDate)s。", - "export_successful": "成功导出!", + "enter_number_between_min_max": "输入 %(min)s 到 %(max)s 之间的数字", + "error_fetching_file": "获取文件时出错", + "export_info": "这是 导出的开始。由 导出于 %(exportDate)s。", + "export_successful": "导出成功!", "exported_n_events_in_time": { "one": "在 %(seconds)s 秒内导出了 %(count)s 个事件", "other": "在 %(seconds)s 秒内导出了 %(count)s 个事件" }, "exporting_your_data": "导出你的数据", "fetched_n_events": { - "one": "迄今获取了 %(count)s 事件", - "other": "迄今获取了 %(count)s 事件" + "one": "已获取距今 %(count)s 个事件", + "other": "已获取 %(count)s 个事件" }, "fetched_n_events_in_time": { - "one": "%(seconds)s 秒内获取了 %(count)s 个事件", - "other": "%(seconds)s 秒内获取了 %(count)s 个事件" + "one": "于 %(seconds)ss 内已获取 %(count)s 个事件", + "other": "于 %(seconds)ss 内已获取 %(count)s 个事件" }, "fetched_n_events_with_total": { - "one": "已获取总共 %(total)s 事件中的 %(count)s 个", - "other": "已获取 %(total)s 事件中的 %(count)s 个" + "one": "已获取 %(total)s 个事件中的 %(count)s 个", + "other": "已获取 %(total)s 个事件中的 %(count)s 个" }, - "fetching_events": "正在获取事件...", - "file_attached": "已附加文件", + "fetching_events": "正在获取事件…", + "file_attached": "附加文件", "format": "格式", "from_the_beginning": "从开头", - "generating_zip": "生成 ZIP", + "generating_zip": "生成 ZIP 压缩文件", "html": "HTML", - "html_title": "导出的数据", - "include_attachments": "包括附件", + "html_title": "已导出的数据", + "include_attachments": "包含附件", "json": "JSON", - "media_omitted": "省略了媒体文件", - "media_omitted_file_size": "省略了媒体文件 - 超出了文件大小限制", + "media_omitted": "媒体已被省略", + "media_omitted_file_size": "媒体已被省略,文件大小超过限制", "messages": "消息", "next_page": "下一组消息", - "num_messages": "消息数", - "num_messages_min_max": "消息数只能是一个介于 %(min)s 和 %(max)s 之间的整数", - "number_of_messages": "指定消息数", - "previous_page": "上一组信息", - "processing_event_n": "正在处理总共 %(total)s 事件中的事件 %(number)s", - "select_option": "从下面的选项中选择以从时间线导出聊天", + "num_messages": "消息数量", + "num_messages_min_max": "消息数量只能是 %(min)s 到 %(max)s 之间的数字", + "number_of_messages": "指定消息数量", + "previous_page": "上一组消息", + "processing": "正在处理…", + "processing_event_n": "处理 %(total)s 个事件中的 %(number)s 个", + "select_option": "选择以下选项以导出时间线中的聊天历史", "size_limit": "大小限制", - "size_limit_min_max": "大小只能是 %(min)sMB 和 %(max)sMB 之间的一个数字", - "starting_export": "正在导出...", - "successful": "成功导出", - "successful_detail": "导出成功了。你可以在下载文件夹中找到导出文件。", + "size_limit_min_max": "大小只能是介于 %(min)s MB 到 %(max)s MB 之间的数字", + "size_limit_postfix": "MB", + "starting_export": "正在开始导出…", + "successful": "导出成功", + "successful_detail": "导出成功。可以在“下载”文件夹中找到。", "text": "纯文本", "title": "导出聊天", - "topic": "话题:%(topic)s", - "unload_confirm": "你确定要在导出过程中退出吗?" + "topic": "主题:%(topic)s", + "unload_confirm": "你确定要在导出期间退出?" }, - "failed_load_async_component": "无法加载!请检查你的网络连接并重试。", + "failed_load_async_component": "无法加载!请检查网络连接并重试。", "feedback": { - "can_contact_label": "如果你有任何后续问题,可以联系我", - "comment_label": "备注", - "existing_issue_link": "请先查找一下 Github 上已有的问题,以免重复。找不到重复问题?发起一个吧。", - "may_contact_label": "如果您想跟进或让我测试即将到来的想法,您可以与我联系", - "platform_username": "我们将会记录你的平台及用户名,以帮助我们尽我们所能地使用你的反馈。", - "pro_type": "专业建议:如果你要发起新问题,请一并提交调试日志,以便我们找出问题根源。", + "can_contact_label": "后续有任何问题时可以联系我", + "comment_label": "评论", + "existing_issue_link": "请先查找 Github Issue 是否有与你同样的问题,如果不存在可以创建一个。", + "may_contact_label": "若要跟进或让我测试新推出的想法时可以联系我", + "platform_username": "我们会记录你的平台与用户名,以帮助我们尽可能多地利用你的反馈。", + "pro_type": "专业建议:若要开始提交 Bug,请同时附上调试日志以便我们确定问题的根源。", "send_feedback_action": "发送反馈", - "sent": "反馈已发送" + "sent": "反馈已发送!谢谢,我们已经收到!" }, "file_panel": { - "empty_description": "从聊天中附加文件或将文件拖放到房间的任何地方。", - "empty_heading": "此房间中没有文件可见", - "guest_note": "你必须 注册 以使用此功能", - "peek_note": "你必须加入房间以看到它的文件" + "empty_description": "在聊天中附加文件或要拖放文件到此房间的任意位置。", + "empty_heading": "此房间暂无可见的文件", + "guest_note": "你必须注册才能使用此功能", + "peek_note": "你必须加入此房间才能其中的文件" }, "forward": { - "filter_placeholder": "搜索房间或用户", + "filter_placeholder": "搜索房间或人员", "message_preview_heading": "消息预览", - "no_perms_title": "你无权执行此操作", + "no_perms_title": "你没有权限执行此操作。", "open_room": "打开房间", "send_label": "发送", "sending": "正在发送", - "sent": "已发送" + "sent": "发送" }, "identity_server": { "change": "更改身份服务器", - "change_prompt": "从身份服务器断开连接而连接到吗?", - "change_server_prompt": "如果你不想使用 以发现你认识的现存联系人并被其发现,请在下方输入另一个身份服务器。", - "checking": "检查服务器", - "description_connected": "你正在使用来发现你认识的现存联系人,同时也让他们可以发现你。你可以在下方更改你的身份服务器。", - "description_disconnected": "你现在没有使用身份服务器。若想发现你认识的现存联系人并被其发现,请在下方添加一个身份服务器。", - "description_optional": "使用身份服务器是可选的。如果你选择不使用身份服务器,你将不能被别的用户发现,也不能用邮箱或电话邀请别人。", - "disconnect": "断开身份服务器连接", - "disconnect_anyway": "仍然断开连接", - "disconnect_offline_warning": "断开连接前,你应从身份服务器删除你的个人数据。不幸的是,身份服务器当前处于离线状态或无法访问。", - "disconnect_personal_data_warning_1": "你仍然在身份服务器 共享你的个人数据。", - "disconnect_personal_data_warning_2": "我们推荐你在断开连接前从身份服务器上删除你的邮箱地址和电话号码。", - "disconnect_server": "从身份服务器 断开连接吗?", - "disconnect_warning": "断开身份服务器连接意味着你将无法被其他用户发现,同时你也将无法使用电子邮件或电话邀请别人。", + "change_prompt": "断开连接身份服务器 并连接到 ?", + "change_server_prompt": "如果你不想使用 来发现你认识的现有联系人,并使其无法被发现,请在下方输入另一个身份服务器。", + "changed": "身份服务器已更改", + "checking": "正在检查服务器", + "description_connected": "你目前正在使用 来发现你认识的现有联系人,并使其能够被你发现。你可以在下面更改你的身份服务器。", + "description_disconnected": "你尚未使用身份服务器。要发现联系人并使其可以被发现,请在下面添加。", + "description_optional": "使用身份服务器是可选的。如果你选择不使用身份服务器,其他用户将无法发现你,也无法通过邮件地址或电话号码邀请其他人。", + "disconnect": "断开身份服务器", + "disconnect_anyway": "强制断开", + "disconnect_offline_warning": "断开连接前你应该从身份服务器 移除个人数据。很遗憾,身份服务器 当前处于离线状态或无法访问。", + "disconnect_personal_data_warning_1": "你仍在身份服务器 分享个人数据。", + "disconnect_personal_data_warning_2": "我们建议你在断开连接之前,从身份服务器中删除邮件地址与电话号码。", + "disconnect_server": "断开身份服务器 ?", + "disconnect_warning": "断开连接身份服务器意味着其他用户将无法发现你,并且你将无法通过邮件地址或电话号码邀请其他人。", "do_not_use": "不使用身份服务器", - "error_connection": "无法连接到身份服务器", - "error_invalid": "身份服务器无效(状态码 %(code)s)", - "error_invalid_or_terms": "服务协议未同意或身份服务器无效。", - "no_terms": "你选择的身份服务器没有服务协议。", - "suggestions": "你应该:", - "suggestions_1": "检查你的浏览器是否安装有可能屏蔽身份服务器的插件(例如 Privacy Badger)", + "error_connection": "无法连接身份服务器", + "error_invalid": "不是有效的身份服务器(状态码 %(code)s)", + "error_invalid_or_terms": "未接受服务条款或身份服务器无效。", + "no_terms": "你选择的身份服务器没有任何服务条款。", + "suggestions": "你应:", + "suggestions_1": "检查你的浏览器扩展是否有任何可能阻止身份服务器(例如 Privacy Badger)。", "suggestions_2": "联系身份服务器 的管理员", - "suggestions_3": "等待并稍后重试", + "suggestions_3": "稍后再试", "url": "身份服务器(%(server)s)", - "url_field_label": "输入一个新的身份服务器", - "url_not_https": "身份服务器URL必须是HTTPS" + "url_field_label": "输入新的身份服务器", + "url_not_https": "身份服务器 URL 必须为 HTTPS" }, - "in_space": "在 %(spaceName)s 空间。", - "in_space1_and_space2": "在 %(space1Name)s 和 %(space2Name)s 空间。", + "in_space": "位于 %(spaceName)s。", + "in_space1_and_space2": "位于空间 %(space1Name)s 与 %(space2Name)s。", "in_space_and_n_other_spaces": { - "one": "在 %(spaceName)s 和其他 %(count)s 个空间。", - "other": "在 %(spaceName)s 和其他 %(count)s 个空间。" + "one": "%(spaceName)s 与剩余 1 个空间。", + "other": "位于 %(spaceName)s 与其余 %(count)s 个空间。" }, "incompatible_browser": { - "title": "不支持的浏览器" + "continue": "强制继续", + "description": "%(brand)s 使用了一些当前浏览器中不可用的浏览器功能。%(detail)s", + "detail_can_continue": "如果你继续操作,某些功能可能会停止运行,并且未来可能会丢失数据。", + "detail_no_continue": "如果你使用的不是最新版本,请尝试更新浏览器然后重试。", + "learn_more": "了解更多", + "linux": "Linux", + "macos": "Mac", + "supported_browsers": "为了获得最佳体验,请使用 ChromeFirefoxEdgeSafari。", + "title": "%(brand)s 不支持此浏览器", + "use_desktop_heading": "请改用 %(brand)s 桌面应用", + "use_mobile_heading": "在手机上换用 %(brand)s", + "use_mobile_heading_after_desktop": "或使用移动 App", + "windows_64bit": "Windows (64 位)", + "windows_arm_64bit": "Windows (ARM 64 位)" }, "info_tooltip_title": "信息", "integration_manager": { - "error_connecting": "此集成管理器为离线状态或者其不能访问你的家服务器。", - "error_connecting_heading": "不能连接到集成管理器", - "explainer": "集成管理器接收配置数据,并可以以你的名义修改挂件、发送房间邀请及设置权力级别。", + "connecting": "正在连接到集成管理器…", + "error_connecting": "集成管理器处于离线状态或其无法连接到你的主服务器。", + "error_connecting_heading": "无法连接到集成管理器", + "explainer": "集成管理器可接收配置数据, 并可以代表你修改小部件、发送房间邀请与设置权力值。", "manage_title": "管理集成", - "use_im": "使用集成管理器管理机器人、挂件和贴纸包。", - "use_im_default": "使用集成管理器(%(serverName)s)管理机器人、挂件和贴纸包。" + "toggle_label": "启用集成管理器", + "use_im": "使用集成管理器管理机器人、小部件与贴纸包。", + "use_im_default": "使用集成管理器 (%(serverName)s) 管理机器人、小部件与贴纸包。" }, "integrations": { - "disabled_dialog_title": "集成已禁用", - "impossible_dialog_description": "你的 %(brand)s 不允许你使用集成管理器来完成此操作,请联系管理员。", - "impossible_dialog_title": "集成未被允许" + "disabled_dialog_description": "在设置中启用“%(manageIntegrations)s”以执行此操作。", + "disabled_dialog_title": "集成已被禁用", + "impossible_dialog_description": "%(brand)s 不允许使用集成管理器执行此操作。请联系管理员。", + "impossible_dialog_title": "不允许集成" }, "invite": { - "email_caption": "通过邮箱邀请", - "email_use_default_is": "使用一个身份服务器以通过邮箱邀请。使用默认(%(defaultIdentityServerName)s)或在设置中管理。", - "email_use_is": "使用一个身份服务器以通过邮箱邀请。在设置中管理。", - "error_already_invited_room": "用户已被邀请至房间", - "error_already_invited_space": "用户已被邀请至空间", - "error_already_joined_room": "用户已在房间中", - "error_already_joined_space": "用户已在空间中", - "error_bad_state": "用户必须先解封才能被邀请。", - "error_dm": "我们无法创建你的私聊。", - "error_find_room": "尝试邀请用户时出错。", - "error_find_user_description": "下列用户可能不存在或无效,因此不能被邀请:%(csvNames)s", - "error_find_user_title": "寻找以下用户失败", - "error_invite": "我们不能邀请这些用户。请检查你想邀请的用户并重试。", - "error_permissions_room": "你没有权限将其他用户邀请至本房间。", - "error_permissions_space": "你无权邀请他人加入此空间。", - "error_profile_undisclosed": "用户可能存在页可能不存在", - "error_transfer_multiple_target": "通话只能转移到单个用户。", + "email_caption": "通过邮件邀请", + "email_limit_one": "通过邮件发送邀请一次只能发送一个", + "email_use_default_is": "使用身份服务器通过邮件地址邀请。使用默认的 (%(defaultIdentityServerName)s) 或在 设置 中进行管理。", + "email_use_is": "使用身份服务器通过邮件地址邀请。请在 “设置” 中进行管理。", + "error_already_invited_room": "用户已被邀请到房间", + "error_already_invited_space": "用户已被邀请到空间", + "error_already_joined_room": "用户已位于此房间", + "error_already_joined_space": "用户已位于此空间", + "error_bad_state": "该用户必须先被解封才能被邀请。", + "error_dm": "无法创建私聊。", + "error_find_room": "在邀请用户时出现问题。", + "error_find_user_description": "以下用户可能不存在或无效,因此无法被邀请:%(csvNames)s", + "error_find_user_title": "以下用户查找失败", + "error_invite": "我们无法邀请这些用户。请检查你要邀请的用户,然后重试。", + "error_permissions_room": "你无权邀请人员进入此房间。", + "error_permissions_space": "你无权邀请人员访问此空间。", + "error_profile_undisclosed": "用户既有可能存在,也有可能不存在", + "error_transfer_multiple_target": "通话只能转接到单个用户。", + "error_unfederated_room": "此房间为非联合房间。你不能从外部服务器邀请人员。", + "error_unfederated_space": "此空间未联合。你无法邀请人员到外部服务器。", "error_unknown": "未知服务器错误", "error_user_not_found": "用户不存在", - "error_version_unsupported_room": "用户的家服务器不支持此房间版本。", - "error_version_unsupported_space": "用户的家服务器版本不支持空间。", + "error_version_unsupported_room": "用户的主服务器不支持此房间的版本。", + "error_version_unsupported_space": "此主服务器不支持使用电话号码进行身份验证。", "failed_generic": "操作失败", "failed_title": "邀请失败", - "invalid_address": "无法识别地址", - "name_email_mxid_share_room": "使用名字、电子邮件地址、用户名(如)邀请某人或分享此房间。", - "name_email_mxid_share_space": "使用某人的名字、电子邮箱地址或用户名(如 )邀请他们,或分享此空间。", - "name_mxid_share_room": "使用某人的名字、用户名(如 )或分享此房间来邀请他们。", - "name_mxid_share_space": "使用某人的名字、用户名(如 )邀请他们,或分享此空间。", + "invalid_address": "未识别的地址", + "name_email_mxid_share_room": "使用对方的名称、邮件地址、用户名(例如 )或分享此房间。", + "name_email_mxid_share_space": "使用对方的名称、邮件地址、用户名(例如 )邀请,或分享此房间。", + "name_mxid_share_room": "请使用名称、用户名(例如 )邀请他人,或分享此房间。", + "name_mxid_share_space": "请使用名称、用户名(例如 )邀请他人,或分享此空间。", + "progress": { + "dont_close": "在完成前请勿退出 app。", + "preparing": "正在准备邀请…" + }, "recents_section": "最近对话", - "room_failed_partial": "我们已向其他人发送邀请,但无法邀请以下人员至", + "room_failed_partial": "我们已邀请其他人加入,但以下人员无法受邀加入 。", "room_failed_partial_title": "部分邀请无法发送", - "room_failed_title": "未能邀请用户加入 %(roomName)s", + "room_failed_title": "无法邀请用户到 %(roomName)s", "send_link_prompt": "或发送邀请链接", - "start_conversation_name_email_mxid_prompt": "使用某人的名称、电子邮箱地址或用户名来与其开始对话(如 )。", - "start_conversation_name_mxid_prompt": "使用某人的名字或用户名(如 )开始与其进行对话。", - "suggestions_disclaimer": "出于隐私考虑,部分建议可能会被隐藏。", - "suggestions_disclaimer_prompt": "如果您看不到您要找的人,请将您的邀请链接发送给他们。", - "suggestions_section": "最近私聊", - "to_room": "邀请至 %(roomName)s", - "to_space": "邀请至 %(spaceName)s", + "start_conversation_name_email_mxid_prompt": "要与某人开始对话,请使用其名称、邮件地址或用户名(例如 )。", + "start_conversation_name_mxid_prompt": "使用名称或用户名(例如 )与他人开始对话。", + "suggestions_disclaimer": "由于隐私原因,某些建议可能被隐藏。", + "suggestions_disclaimer_prompt": "如果你看不到要找的人员,请复制并向其发送以下邀请链接。", + "suggestions_section": "最近的私聊", + "to_room": "邀请到 %(roomName)s", + "to_space": "邀请到 %(spaceName)s", "transfer_dial_pad_tab": "拨号盘", - "transfer_user_directory_tab": "用户目录", - "unable_find_profiles_description_default": "找不到下列 Matrix ID 的用户资料,你还是要邀请吗?", - "unable_find_profiles_invite_label_default": "还是邀请", - "unable_find_profiles_invite_never_warn_label_default": "还是邀请,不用再提醒我", - "unable_find_profiles_title": "以下用户可能不存在" + "transfer_user_directory_tab": "用户名册", + "unable_find_profiles_description_default": "无法找到下列 Matrix ID 的个人资料,你是否仍然要邀请?", + "unable_find_profiles_invite_label_default": "强制邀请", + "unable_find_profiles_invite_never_warn_label_default": "强制邀请并不再警告", + "unable_find_profiles_title": "以下用户可能不存在", + "unban_first_title": "除非被解封否则用户无法被邀请" }, - "inviting_user1_and_user2": "正在邀请 %(user1)s 与 %(user2)s", + "inviting_user1_and_user2": "邀请 %(user1)s 与 %(user2)s", "inviting_user_and_n_others": { - "one": "正在邀请%(user)s和另外1个人", - "other": "正在邀请%(user)s和其他%(count)s人" + "one": "邀请 %(user)s 及剩余 1 个", + "other": "邀请了 %(user)s 与剩余 %(count)s 个" }, "items_and_n_others": { - "other": " 和其他 %(count)s 人", - "one": " 与另一个人" + "one": " 以及剩余 1 个", + "other": " 以及剩余 %(count)s 个" }, "keyboard": { - "activate_button": "激活选中的按钮", + "activate_button": "激活选择的按钮", + "alt": "Alt", "autocomplete_cancel": "取消自动补全", "autocomplete_force": "强制完成", - "autocomplete_navigate_next": "下个自动完成建议", - "autocomplete_navigate_prev": "上个自动完成建议", + "autocomplete_navigate_next": "下一个自动补全建议", + "autocomplete_navigate_prev": "上一个自动补全建议", "backspace": "", "cancel_reply": "取消回复消息", "category_autocomplete": "自动补全", @@ -1104,393 +1438,510 @@ "category_navigation": "导航", "category_room_list": "房间列表", "close_dialog_menu": "关闭对话框或上下文菜单", - "composer_jump_end": "跳至编辑器尾部", - "composer_jump_start": "跳至编辑器的开头", - "composer_navigate_next_history": "导航到编辑器历史里的下条消息", - "composer_navigate_prev_history": "导航到编辑器历史里的上条消息", - "composer_new_line": "换行", + "composer_jump_end": "跳转到编辑器末尾", + "composer_jump_start": "跳转到编辑器开头", + "composer_navigate_next_history": "导航到下一个消息编辑器历史", + "composer_navigate_prev_history": "导航到上一个消息编辑器历史", + "composer_new_line": "另起一行", "composer_redo": "重做编辑", "composer_toggle_bold": "切换粗体", "composer_toggle_code_block": "切换代码块", "composer_toggle_italics": "切换斜体", "composer_toggle_link": "切换链接", "composer_toggle_quote": "切换引用", - "composer_undo": "撤销编辑", + "composer_undo": "撤消编辑", + "control": "Ctrl", "dismiss_read_marker_and_jump_bottom": "忽略已读标记并跳转到底部", - "enter": "回车", - "go_home_view": "转到主视图", - "home": "主页", - "jump_first_message": "跳转至第一条消息", - "jump_last_message": "跳转至最后一条消息", + "end": "结束", + "enter": "", + "escape": "Esc", + "go_home_view": "转到主页视图", + "home": "", + "jump_first_message": "跳转到首个消息", + "jump_last_message": "跳转到最新消息", "jump_room_search": "跳转到房间搜索", "jump_to_read_marker": "跳转到最旧的未读消息", - "keyboard_shortcuts_tab": "打开此设置标签页", - "navigate_next_history": "下个最近访问过的房间或空间", - "navigate_next_message_edit": "导航到下条要编辑的消息", - "navigate_prev_history": "上个最近访问过的房间或空间", - "navigate_prev_message_edit": "导航到上条要编辑的消息", - "next_room": "下个房间或私聊", - "next_unread_room": "下个未读房间或私聊", + "keyboard_shortcuts_tab": "打开此设置页", + "navigate_next_history": "下一个最近访问的房间或空间", + "navigate_next_message_edit": "导航到下一条要编辑的消息", + "navigate_prev_history": "上一个最近访问的房间或空间", + "navigate_prev_message_edit": "导航到上一条要编辑的消息", + "next_landmark": "转到下一个焦点", + "next_room": "下一个房间或私聊", + "next_unread_room": "下一个未读房间或私聊", + "number": "[数字]", "open_user_settings": "打开用户设置", "page_down": "", "page_up": "", - "prev_room": "上个房间或私聊", - "prev_unread_room": "上个未读房间或私聊", - "room_list_collapse_section": "折叠房间列表段", - "room_list_expand_section": "展开房间列表段", - "room_list_navigate_down": "在房间列表中向下导航", - "room_list_navigate_up": "在房间列表中向上导航", - "room_list_select_room": "从房间列表选择房间", - "scroll_down_timeline": "在时间线里向下滚动", - "scroll_up_timeline": "在时间线里向上滚动", - "search": "搜索(必须启用)", + "prev_landmark": "转到上一个焦点", + "prev_room": "上一个房间或私聊", + "prev_unread_room": "上一个未读房间或私聊", + "room_list_collapse_section": "折叠房间列表部分", + "room_list_expand_section": "展开房间列表部分", + "room_list_navigate_down": "向下导航到房间列表", + "room_list_navigate_up": "向上导航到房间列表", + "room_list_select_room": "从房间列表中选择房间", + "save": "保存", + "scroll_down_timeline": "向下滚动时间线", + "scroll_up_timeline": "向上滚动时间线", + "search": "搜索(要使其生效必须启用相关功能)", "send_sticker": "发送贴纸", + "shift": "Shift", "space": "空格", - "switch_to_space": "按数字切换到空间", - "toggle_hidden_events": "切换隐藏事件可见性", + "switch_to_space": "使用数字切换空间", + "toggle_hidden_events": "切换隐藏事件的可见性", "toggle_microphone_mute": "切换麦克风静音", "toggle_right_panel": "切换右侧面板", - "toggle_space_panel": "切换空间仪表盘", - "toggle_top_left_menu": "切换左上方的菜单", - "toggle_webcam_mute": "切换网络相机开/关", + "toggle_space_panel": "切换空间面板", + "toggle_top_left_menu": "切换左上角菜单", + "toggle_webcam_mute": "切换摄像头开/关", "upload_file": "上传文件" }, "labs": { - "ask_to_join": "启用 “需要验证加入请求”", - "beta_description": "%(brand)s的下一步是什么?实验室是早期获得东西、测试新功能和在它们发布前帮助塑造的最好方式。", - "beta_feature": "这是beta功能", - "beta_feedback_leave_button": "要离开beta,请访问你的设置。", - "beta_feedback_title": "%(featureName)sBeta反馈", - "beta_section": "即将到来的功能", - "bridge_state": "在房间设置中显示桥接信息", + "ask_to_join": "启用申请加入", + "beta_description": "%(brand)s 的下一步是什么?实验室是提前获取信息、测试新功能并在其正式推出之前帮助其完善的最佳途径。", + "beta_feature": "此为 Beta 功能", + "beta_feedback_leave_button": "要退出 Beta 测试,请访问设置。", + "beta_feedback_title": "%(featureName)s Beta 功能反馈", + "beta_section": "即将推出的功能", + "bridge_state": "在房间设置中显示桥接器信息", "bridge_state_channel": "频道:", - "bridge_state_creator": "此桥曾由提供。", - "bridge_state_manager": "此桥接由 管理。", - "bridge_state_workspace": "工作空间:", - "click_for_info": "点击获取更多信息", - "currently_experimental": "目前是实验性的。", + "bridge_state_creator": "此桥接器由 提供。", + "bridge_state_manager": "此桥接器由 管理。", + "bridge_state_workspace": "工作区: ", + "click_for_info": "点击显示更多信息", + "currently_experimental": "当前为实验性。", "custom_themes": "支持添加自定义主题", - "element_call_video_rooms": "Element通话视频房间", - "experimental_description": "想要做点实验?试试我们开发中的最新点子。这些功能尚未确定;它们可能不稳定,可能会变动,也可能被完全丢弃。了解更多。", + "dynamic_room_predecessors": "动态房间前身", + "dynamic_room_predecessors_description": "需要启用 MSC3946 以支持“迟到房间归档”。", + "element_call_video_rooms": "Element Call 视频房间", + "encrypted_state_events": "已加密的状态事件", + "encrypted_state_events_description": "启用加密状态事件的实验性支持,此功能会对服务器隐藏房间名称与主题等元数据。这些元数据对之后加入房间的用户与不支持 MSC4362 的客户端隐藏。", + "exclude_insecure_devices": "发送或接收消息时排除不安全的设备", + "exclude_insecure_devices_description": "此模式启用后,加密消息将不会分享给未验证的设备,并且来自未验证设备的消息将显示为“错误”。注意:如果启用此模式,则可能无法与尚未验证其设备的用户通信。", + "experimental_description": "感觉很有实验性?试试我们正在开发的最新创意。这些功能尚未最终确定;它们可能不稳定,可能会改变,也可能被完全放弃。了解更多。", "experimental_section": "早期预览", - "feature_wysiwyg_composer_description": "在消息编辑器中使用富文本代替 Markdown。", - "group_calls": "新的群通话体验", + "extended_profiles_msc_support": "需要服务器支持 MSC4133", + "feature_disable_call_per_sender_encryption": "为 Element Call 禁用“按每个发送者加密”", + "feature_wysiwyg_composer_description": "在消息编辑器中使用富文本取代 Markdown。", + "group_calls": "新的群呼体验", "group_developer": "开发者", "group_encryption": "加密", "group_experimental": "实验性", "group_messaging": "消息传递", - "group_moderation": "审核", + "group_moderation": "管理", "group_profile": "个人资料", "group_rooms": "房间", "group_spaces": "空间", "group_themes": "主题", - "group_voip": "语音和视频", - "group_widgets": "挂件", - "hidebold": "隐藏通知的点标记(仅显示计数标记)", - "html_topic": "显示房间话题的HTML表现形式", - "join_beta": "加入beta", - "join_beta_reload": "加入beta会重载%(brand)s。", - "jump_to_date": "跳至日期(新增 /jumptodate 并跳至日期标头)", - "jump_to_date_msc_support": "需要您的服务器支持 MSC3030", - "latex_maths": "在消息中渲染LaTeX数学", - "leave_beta": "离开beta", - "leave_beta_reload": "离开beta会重载%(brand)s。", - "location_share_live": "实时位置共享", - "location_share_live_description": "临时的实现。位置在房间历史中持续保留。", - "mjolnir": "忽略他人的新方式", - "msc3531_hide_messages_pending_moderation": "让协管员隐藏等待审核的消息。", - "notification_settings": "通知设置", - "notification_settings_beta_caption": "引入一种更简单的方式来更改通知设置。以你喜欢的方式定制%(brand)s。", + "group_threads": "消息列", + "group_ui": "用户界面", + "group_voip": "语音与视频", + "group_widgets": "小部件", + "hidebold": "隐藏通知圆点(仅显示计数器徽章)", + "html_topic": "以 HTML 格式显示房间主题", + "join_beta": "参与 Beta 测试", + "join_beta_reload": "参与 Beta 测试将重载 %(brand)s。", + "jump_to_date": "跳转到日期(在编辑器中输入指令“/jumptodate”可以跳转到当天的消息开头)", + "jump_to_date_msc_support": "需要服务器支持 MSC3030", + "latex_maths": "在消息中渲染 LaTeX 数学公式", + "leave_beta": "退出 Beta 测试", + "leave_beta_reload": "退出 Beta 测试将重载 %(brand)s。", + "location_share_live": "分享实时位置", + "location_share_live_description": "临时实现。位置将持续保留于房间历史。", + "mjolnir": "忽略人员的新方式", + "msc3531_hide_messages_pending_moderation": "允许协管员隐藏等待审核的消息", + "new_room_list": "启用新的房间列表", + "notification_settings": "新的通知设置", + "notification_settings_beta_caption": "介绍一种更简单的方法来更改通知设置。就像你喜欢的那样定制 %(brand)s。", "notification_settings_beta_title": "通知设置", - "report_to_moderators": "报告给协管员", - "report_to_moderators_description": "在支持审核的房间中,“报告”按钮将让你向房间协管员举报滥用行为。", + "notifications": "在房间标题处启用通知面板", + "render_reaction_images": "在反应中渲染自定义图像", + "render_reaction_images_description": "有时被称为“自定义 Emoji”。", + "report_to_moderators": "向协管员举报", + "report_to_moderators_description": "在支持审核的房间中,“举报”按钮可以让你向房间协管员举报滥用行为。", + "room_list_sections": "房间列表区域", + "share_history_on_invite": "与新成员分享加密历史", + "share_history_on_invite_description": "当邀请用户进入历史可见性设为“共享”的加密房间时与该用户共享加密的历史消息,同时你被邀请加入此类房间时接收加密的历史消息。", + "share_history_on_invite_warning": "此功能目前处于实验阶段,并且尚未实践所有安全预防措施。请勿为生产账户启用。", "sliding_sync": "滑动同步模式", - "sliding_sync_description": "正在积极开发中,不能禁用。", - "sliding_sync_server_no_support": "你的服务器缺少原生支持", - "under_active_development": "积极开发中。", + "sliding_sync_description": "正在处于开发中,并且一旦启用就无法禁用。当前与 Element Call 不兼容。", + "sliding_sync_disabled_notice": "重新登录以禁用", + "sliding_sync_server_no_support": "服务器缺少支持", + "under_active_development": "正在处于开发中。", + "unrealiable_e2e": "在加密房间中不可靠", "video_rooms": "视频房间", - "video_rooms_a_new_way_to_chat": "在 %(brand)s 中使用语音和视频的新方式。", - "video_rooms_always_on_voip_channels": "视频房间是嵌入在%(brand)s房间内的总是开启的VoIP频道。", - "video_rooms_beta": "视频房间是beta功能", - "video_rooms_faq1_answer": "使用左侧面板房间部分的“+”按钮。", - "video_rooms_faq1_question": "我如何创建视频房间?", - "video_rooms_faq2_answer": "是的,聊天时间线显示在视频旁。", - "video_rooms_faq2_question": "我能在视频通话的同时使用文字聊天吗?", + "video_rooms_a_new_way_to_chat": "在 %(brand)s 中语音与视频聊天的新方式。", + "video_rooms_always_on_voip_channels": "视频房间是嵌入到 %(brand)s 并始终在线的 VoIP 渠道。", + "video_rooms_beta": "视频房间是 Beta 功能", + "video_rooms_faq1_answer": "在左侧面板的“房间”部分点击“+”按钮。", + "video_rooms_faq1_question": "如何创建视频房间?", + "video_rooms_faq2_answer": "可以,时间线会显示在视频房间的一侧。", + "video_rooms_faq2_question": "我是否可以在视频房间中使用文字聊天?", + "video_rooms_feedbackSubheading": "感谢你试用 Beta 功能,请尽可能详细地描述以便我们改进它。", "wysiwyg_composer": "富文本编辑器" }, "labs_mjolnir": { - "advanced_warning": "⚠ 这些设置是为高级用户准备的。", - "ban_reason": "已忽略/已屏蔽", - "error_adding_ignore": "添加已忽略的用户/服务器时出现错误", + "advanced_warning": "⚠ 以下设置面向高级用户。", + "ban_reason": "已忽略或已屏蔽", + "error_adding_ignore": "添加忽略的用户/服务器时出错", "error_adding_list_description": "请验证房间 ID 或地址并重试。", - "error_adding_list_title": "订阅列表时出现错误", - "error_removing_ignore": "移除已忽略用户/服务器时出现错误", - "error_removing_list_description": "请重试或查看你的终端以获得提示。", - "error_removing_list_title": "取消订阅列表时出现错误", - "explainer_1": "在此处添加你想忽略的用户和服务器。使用星号以使%(brand)s匹配任何字符。例如,@bot:*会忽略全部在任何服务器上以“bot”为名的用户。", - "explainer_2": "忽略人是通过含有封禁规则的封禁列表来完成的。订阅一个封禁列表意味着被此列表阻止的用户/服务器将会对你隐藏。", - "lists": "你正在订阅:", - "lists_description_1": "订阅一个封禁列表会使你加入它!", - "lists_description_2": "如果这不是你想要的,请使用别的的工具来忽略用户。", - "lists_heading": "订阅的列表", - "lists_new_label": "封禁列表的房间 ID 或地址", + "error_adding_list_title": "订阅列表时出错", + "error_removing_ignore": "移除已忽略的用户/服务器时出错", + "error_removing_list_description": "请重试或查看控制台中的提示。", + "error_removing_list_title": "退订列表时出错", + "explainer_1": "在此处添加要忽略的用户与服务器。使用“*”可让 %(brand)s 匹配任何字符。例如 @bot:* 将忽略任何服务器上名称为“bot”的所有用户。", + "explainer_2": "忽略人员是通过“封禁列表”完成的,封禁列表包含谁被封禁的规则。订阅封禁列表意味着位于该列表的用户/服务器将对你隐藏。", + "lists": "你当前已订阅:", + "lists_description_1": "你订阅封禁列表意味着此列表将作为房间加入!", + "lists_description_2": "如果这不是你想要的,请使用其它工具忽略用户。", + "lists_heading": "已订阅的列表", + "lists_new_label": "封禁列表中的房间 ID 或地址", "no_lists": "你没有订阅任何列表", - "personal_empty": "你没有忽略任何人。", - "personal_heading": "个人封禁列表", - "personal_new_label": "要忽略的服务器或用户 ID", - "personal_new_placeholder": "例如: @bot:* 或 example.org", - "personal_section": "你正在忽略:", + "personal_description": "个性化封禁列表包含你不想看到其消息的所有用户/服务器。忽略第一个用户/服务器后,你的房间列表中将出现一个名为“%(myBanList)s”的新房间。请留在该房间确保封禁列表持续生效。", + "personal_empty": "你尚未忽略任何人。", + "personal_heading": "个性化封禁列表", + "personal_new_label": "要忽略的用户 ID 或服务器", + "personal_new_placeholder": "例如 @bot:* 或 example.org", + "personal_section": "你当前忽略:", "room_name": "我的封禁列表", - "room_topic": "这是你屏蔽的用户/服务器的列表——不要离开此房间!", + "room_topic": "此房间包含你已屏蔽的用户与服务器。要使封禁列表生效,请勿离开房间!", "rules_empty": "无", "rules_server": "服务器规则", - "rules_title": "封禁列表规则 - %(roomName)s", + "rules_title": "封禁列表规则:%(roomName)s", "rules_user": "用户规则", - "something_went_wrong": "出现问题。请重试或查看你的终端以获得提示。", + "something_went_wrong": "出现问题。请重试或查看控制台提示。", "title": "已忽略的用户", "view_rules": "查看规则" }, "language_dropdown_label": "语言下拉菜单", "leave_room_dialog": { - "last_person_warning": "你是这里唯一的人。如果你离开了,以后包括你在内任何人都将无法加入。", - "leave_room_question": "你确定要离开房间 “%(roomName)s” 吗?", - "leave_space_question": "你确定要离开空间「%(spaceName)s」吗?", - "room_rejoin_warning": "此房间不是公开房间。如果没有成员邀请,你将无法重新加入。", - "space_rejoin_warning": "此空间并不公开。在没有得到邀请的情况下,你将无法重新加入。" + "last_person_warning": "你是此处唯一的用户。如果你离开,以后将没有人能加入,包括你自己。", + "leave_room_question": "你确定要离开房间“%(roomName)s”?", + "leave_space_question": "你确定要离开空间“%(spaceName)s”?", + "room_leave_admin_warning": "你是此房间的唯一管理员。如果你离开,任何人都将无法更改房间设置或执行其它重要操作。", + "room_leave_mod_warning": "你是此房间的唯一管理员。如果你离开,任何人都将无法更改房间设置或执行其它重要操作。", + "room_rejoin_warning": "此房间非公共房间。你无法在未被邀请的情况下重新加入。", + "space_rejoin_warning": "此空间非公开。未经邀请,你将无法重新加入。" }, "left_panel": { "open_dial_pad": "打开拨号键盘" }, "lightbox": { "rotate_left": "向左旋转", - "rotate_right": "向右旋转" + "rotate_right": "向右旋转", + "title": "图像查看" }, "location_sharing": { - "MapStyleUrlNotConfigured": "此家服务器未配置显示地图。", - "MapStyleUrlNotReachable": "此家服务器未正确配置,故无法显示地图,亦或所配置的地图服务器无法使用。", - "click_drop_pin": "点击以放置图钉", - "click_move_pin": "点击以移动图钉", - "close_sidebar": "关闭侧边栏", + "MapStyleUrlNotConfigured": "此主服务器未配置地图显示。", + "MapStyleUrlNotReachable": "此主服务器的配置不正确,无法显示地图,或者配置的地图服务器可能无法访问。", + "WebGLNotEnabled": "显示地图需要 WebGL,请在浏览器设置中启用。", + "click_drop_pin": "点击以放置锚点", + "click_move_pin": "点击以移动锚点", + "close_sidebar": "关闭边栏", "error_fetch_location": "无法获取位置", - "error_no_perms_description": "你需要拥有正确的权限才能在此房间中共享位置。", - "error_no_perms_title": "你没有权限分享位置", - "error_send_description": "%(brand)s无法发送你的位置。请稍后再试。", + "error_no_perms_description": "你需要拥有合适的权限才能在此房间中分享位置。", + "error_no_perms_title": "你无权分享位置", + "error_send_description": "%(brand)s 无法发送你的位置。请稍后再试。", "error_send_title": "我们无法发送你的位置", "error_sharing_live_location": "分享实时位置时出错", "error_stopping_live_location": "停止实时位置时出错", "expand_map": "展开地图", - "failed_generic": "获取你的位置失败。请之后再试。", - "failed_load_map": "无法加载地图", - "failed_permission": "%(brand)s was denied permission to fetch your location. 请在你的浏览器中允许位置访问。", - "failed_timeout": "尝试获取你的位置超时。请之后再试。", - "failed_unknown": "获取位置时发生错误。请之后再试。", + "failed_generic": "无法获取你的位置。请稍后再试。", + "failed_load_map": "无法载入地图", + "failed_permission": "%(brand)s 被拒绝获取位置信息。请在浏览器设置中允许访问位置信息。", + "failed_timeout": "尝试获取位置超时。请稍后再试。", + "failed_unknown": "获取位置时出现未知错误。请稍后再试。", "find_my_location": "查找我的位置", - "live_description": "%(displayName)s的实时位置", - "live_enable_description": "请注意:这是使用临时实现的实验室功能。这意味着你无法删除你的位置历史,并且甚至在你停止与此房间分享实时位置后,高级用户将仍能查看你的位置历史。", - "live_enable_heading": "实时位置分享", - "live_location_active": "你正在分享你的实时位置", + "live_description": "%(displayName)s 的事实位置", + "live_enable_description": "请注意:这是一项使用临时实施方案的实验室功能。这意味着你将无法删除你的位置记录,即使你停止与此房间共享实时位置,高级用户仍然可以看到你的位置记录。", + "live_enable_heading": "分享实时位置", + "live_location_active": "你正在分享实时位置", "live_location_enabled": "实时位置已启用", "live_location_ended": "实时位置已结束", - "live_location_error": "实时位置错误", + "live_location_error": "实时位置出错", "live_locations_empty": "无实时位置", - "live_share_button": "分享%(duration)s", + "live_share_button": "分享 %(duration)s", "live_toggle_label": "启用实时位置分享", - "live_until": "实时分享直至%(expiryTime)s", + "live_until": "直播直到 %(expiryTime)s", + "live_update_time": "已更新 %(humanizedUpdateTime)s", + "loading_live_location": "正在加载实时位置…", "location_not_available": "位置不可用", "map_feedback": "地图反馈", "mapbox_logo": "Mapbox 图标", - "reset_bearing": "重置为向北方位", - "share_button": "共享位置", + "reset_bearing": "重置方向为正北", + "share_button": "分享位置", "share_type_live": "我的实时位置", - "share_type_own": "我当前的位置", - "share_type_pin": "放置图钉", - "share_type_prompt": "你想分享什么位置类型?", + "share_type_own": "我的当前位置", + "share_type_pin": "放置锚点", + "share_type_prompt": "你想分享的位置的类型?", "toggle_attribution": "切换属性" }, "member_list": { - "filter_placeholder": "过滤房间成员" + "count": { + "one": "%(count)s 位成员", + "other": "%(count)s 个成员" + }, + "filter_placeholder": "搜索房间内成员", + "invite_button_no_perms_tooltip": "你无权邀请用户", + "invited_label": "已邀请", + "list_title": "成员列表", + "no_matches": "不匹配" }, "member_list_back_action_label": "房间成员", - "message_edit_dialog_title": "消息编辑历史", + "message_edit_dialog_title": "消息编辑", + "migrating_crypto": "请稍候。我们正在更新 %(brand)s,以使加密更快、更可靠。", "mobile_guide": { - "toast_accept": "使用 app", - "toast_description": "在移动网页浏览器中 %(brand)s 是实验性功能。为了获取更好的体验和最新功能,请使用我们的免费原生应用。", - "toast_title": "使用 app 以获得更好的体验" + "toast_accept": "使用 App", + "toast_description": "%(brand)s 在移动 Web 浏览器上处于实验阶段。为了获得更好的体验和最新功能,请使用我们的免费原生应用。", + "toast_title": "使用 App 以获得更好的体验" }, - "name_and_id": "%(name)s%(userId)s", + "name_and_id": "%(name)s(%(userId)s)", "no_more_results": "没有更多结果", "notif_panel": { - "empty_description": "你没有可见的通知。", - "empty_heading": "一切完毕" + "empty_description": "你没有可见通知。", + "empty_heading": "你已阅读所有消息" }, "notifications": { "all_messages": "全部消息", - "all_messages_description": "获得每条消息的通知", + "all_messages_description": "接收每个消息的通知", "class_global": "全局", - "class_other": "其他", + "class_other": "其它", "default": "默认", - "enable_prompt_toast_description": "开启桌面通知", + "email_pusher_app_display_name": "邮件通知", + "enable_prompt_toast_description": "启用桌面通知", "enable_prompt_toast_title": "通知", "enable_prompt_toast_title_from_message_send": "不要错过任何回复", - "error_change_title": "修改通知设置", + "error_change_title": "更改通知设置", "keyword": "关键词", "keyword_new": "新的关键词", - "mark_all_read": "标记所有为已读", - "mentions_and_keywords": "@提及和关键词", - "mentions_and_keywords_description": "如设置中设定的那样仅通知提及和关键词", - "mentions_keywords": "提及&关键词", - "message_didnt_send": "消息没有发送。点击查看信息。", + "level_activity": "活动", + "level_highlight": "高亮", + "level_muted": "已静默", + "level_none": "无", + "level_notification": "通知", + "level_unsent": "未发送", + "mark_all_read": "全部设为已读", + "mentions_and_keywords": "提及与关键词", + "mentions_and_keywords_description": "仅按设置中的配置获取提及与关键词", + "mentions_keywords": "提及与关键词", + "message_didnt_send": "消息未发送。点击以获取信息。", "mute_description": "你不会收到任何通知" }, "notifier": { "m.key.verification.request": "%(name)s 正在请求验证" }, "onboarding": { - "create_room": "创建一个群聊", - "explore_rooms": "探索公共房间", - "has_avatar_label": "很好,这样大家就知道是你了", - "intro_byline": "拥有您的对话。", - "intro_welcome": "欢迎来到 %(appName)s", - "no_avatar_label": "添加照片,让人们知道这是你。", + "create_room": "创建群聊", + "explore_rooms": "浏览公共房间", + "has_avatar_label": "很好,这将有助于人们确认是你", + "intro_byline": "掌控你的对话。", + "intro_welcome": "欢迎使用 %(appName)s", + "no_avatar_label": "添加照片让别人知道这是你。", "send_dm": "发送私聊", - "welcome_detail": "现在,让我们协助你开始", + "welcome_detail": "协助你开始", "welcome_user": "欢迎 %(name)s" }, + "pill": { + "permalink_other_room": "一个位于 %(room)s 的消息", + "permalink_this_room": "来自 %(user)s 的消息" + }, "poll": { "create_poll_action": "创建投票", "create_poll_title": "创建投票", - "disclosed_notes": "投票者一投完票就能看到结果", + "disclosed_notes": "结果将在参与者投票后立即可见", "edit_poll_title": "编辑投票", - "end_description": "您确定要结束此投票吗? 这将显示投票的最终结果并阻止人们投票。", - "end_message": "投票已经结束。 得票最多答案:%(topAnswer)s", - "end_message_no_votes": "投票已经结束。 没有投票。", + "end_description": "你确定要结束此投票?此操作将显示最终结果并阻止人员投票。", + "end_message": "投票已结束。热门答案:%(topAnswer)s", + "end_message_no_votes": "投票已结束。无人投票。", "end_title": "结束投票", - "error_ending_description": "抱歉,投票没有结束。 请再试一次。", + "ended_poll_label": "投票已结束", + "error_ending_description": "抱歉,投票尚未结束。请重试。", "error_ending_title": "结束投票失败", - "error_voting_description": "抱歉,你的投票未登记。请重试。", - "error_voting_title": "投票未登记", - "failed_send_poll_description": "抱歉,您尝试创建的投票未被发布。", + "error_voting_description": "抱歉,你的投票尚未注册。请重试。", + "error_voting_title": "投票未注册", + "failed_send_poll_description": "抱歉,你尝试创建的投票未能发布。", "failed_send_poll_title": "发布投票失败", - "notes": "结果仅在你结束投票后展示", + "notes": "结果仅在结束投票时显示", + "option_label": "选项 %(number)s,%(answer)s", + "option_label_winning_with_total": { + "one": "选项 %(number),%(answer)s,领先,%(count)s 票", + "other": "选项 %(number),%(answer)s,领先,%(count)s 票" + }, + "option_label_with_total": { + "one": "选项 %(number),%(answer)s,%(count)s 票", + "other": "选项 %(number),%(answer)s,%(count)s 票" + }, "options_add_button": "添加选项", "options_heading": "创建选项", "options_label": "选项 %(number)s", - "options_placeholder": "写个选项", - "topic_heading": "你的投票问题或主题是什么?", - "topic_label": "问题或主题", + "options_placeholder": "撰写选项", + "poll_label": "投票", + "topic_heading": "投票中的提问或主题?", + "topic_label": "提问或主题", + "topic_placeholder": "撰写内容…", + "total_decryption_errors": "由于解密错误可能无法统计某些投票", "total_n_votes": { - "one": "票数已达 %(count)s 票。要查看结果请亲自投票", - "other": "票数已达 %(count)s 票。要查看结果请亲自投票" + "one": "已有 %(count)s 个投票。投票以查看结果", + "other": "已有 %(count)s 个投票。投票以查看结果" }, "total_n_votes_voted": { - "one": "基于 %(count)s 票", - "other": "基于 %(count)s 票" + "one": "基于 %(count)s 个投票", + "other": "基于 %(count)s 个投票" }, - "total_no_votes": "尚无投票", - "total_not_ended": "结果将在投票结束时可见", + "total_no_votes": "暂无人投票", + "total_not_ended": "结果将于投票结束后可见。", "type_closed": "封闭式投票", "type_heading": "投票类型", "type_open": "开放式投票", - "unable_edit_description": "抱歉,你无法在有人投票后编辑投票。", + "unable_edit_description": "抱歉,已有投票的情况下你无法再编辑投票。", "unable_edit_title": "无法编辑投票" }, "power_level": { "admin": "管理员", + "creator": "所有者", "custom": "自定义(%(level)s)", - "custom_level": "自定义级别", + "custom_level": "自定义权力值", "default": "默认", - "label": "权力级别", + "label": "权力值", "moderator": "协管员", - "restricted": "受限" + "restricted": "已受限" }, - "powered_by_matrix": "由 Matrix 驱动", - "powered_by_matrix_with_logo": "去中心化、加密的聊天与协作,由 $matrixLogo 驱动", + "powered_by_matrix": "由 Matrix 提供底层支持", + "powered_by_matrix_with_logo": "由 $matrixLogo 驱动的去中心化、加密聊天与协作", "presence": { "away": "离开", - "busy": "忙", + "busy": "忙碌", "idle": "空闲", - "idle_for": "已闲置 %(duration)s", + "idle_for": "已空闲 %(duration)s", "offline": "离线", - "offline_for": "已离线 %(duration)s", + "offline_for": "离线 %(duration)s", "online": "在线", - "online_for": "已上线 %(duration)s", - "unknown": "未知的", - "unknown_for": "未知状态已持续 %(duration)s" + "online_for": "已在线 %(duration)s", + "unknown": "未知", + "unknown_for": "未知 %(duration)s", + "unreachable": "无法访问用户的服务器" }, "quick_settings": { "all_settings": "所有设置", - "metaspace_section": "固定到侧边栏", + "metaspace_section": "钉在边栏", "sidebar_settings": "更多选项", "title": "快速设置" }, "quit_warning": { - "call_in_progress": "你似乎正在通话,确定要退出吗?", - "file_upload_in_progress": "你似乎正在上传文件,确定要退出吗?" + "call_in_progress": "你似乎正在通话,你确定要退出?", + "file_upload_in_progress": "你似乎正在上传文件,你确定要退出?" }, "redact": { "confirm_button": "确认移除", - "error": "你无法删除这条消息。(%(code)s)", + "confirm_description": "你确定要移除(删除)此事件?", + "confirm_description_state": "请注意,如此移除房间更改可能会使更改失效。", + "error": "你无法删除此消息。(%(code)s)", "ongoing": "正在移除…", "reason_label": "理由(可选)" }, "report_content": { - "description": "举报此消息会将其唯一的“事件ID”发送给你的家服务器的管理员。如果此房间中的消息是加密的,则你的家服务器管理员将无法阅读消息文本,也无法查看任何文件或图片。", + "description": "举报此消息会将其唯一的“事件 ID”发送给服务器管理员。如果此房间中的消息已加密,则服务器管理员将无法查看消息文本、任何文件或图像。", "disagree": "不同意", - "hide_messages_from_user": "若想隐藏来自此用户的全部当前和未来的消息,请打勾。", + "error_create_room_moderation_bot": "无法使用协管机器人创建房间", + "hide_messages_from_user": "如果你想隐藏此用户当前及未来的所有消息,请选中此项。", "ignore_user": "忽略用户", - "illegal_content": "违法内容", - "missing_reason": "请填写你为何做此报告。", - "nature": "请选择性质并描述为什么此消息是滥用。", - "nature_disagreement": "此用户所写的是错误内容。\n这将会报告给房间协管员。", - "nature_illegal": "此用户正在做出违法行为,如对他人施暴,或威胁使用暴力。\n这将报告给房间协管员,他们可能会将其报告给执法部门。", - "nature_nonstandard_admin": "该房间专用于非法或不良内容,或者版主未能对非法或不良内容进行管理。\n这将报告给%(homeserver)s 的管理员。", - "nature_nonstandard_admin_encrypted": "该房间专用于非法或不良内容,或者版主未能对非法或不良内容进行管理。\n这将报告给 %(homeserver)s 的管理员。管理员无法读取此房间的加密内容。", - "nature_other": "任何其他原因。请描述问题。\n这将报告给房间协管员。", - "nature_spam": "此用户正在房间中滥发广告、广告链接或宣传。\n这将报告给房间协管员。", - "other_label": "其他", - "report_content_to_homeserver": "向你的家服务器管理员举报内容", - "report_entire_room": "报告整个房间", - "spam_or_propaganda": "垃圾信息或宣传", - "toxic_behaviour": "不良行为" + "illegal_content": "非法内容", + "missing_reason": "请填写举报理由。", + "nature": "请选择一种性质,并描述该消息为何具有滥用性。", + "nature_disagreement": "此用户输入的内容有误。\n此问题将报告给房间协管员。", + "nature_illegal": "此用户存在违法行为,例如人肉搜索或威胁使用暴力。\n我们会将此情况报告给房间管理员,管理员可能会将此问题上报给法律部门。", + "nature_nonstandard_admin": "此房间专门用于非法或有害内容,或者管理员未能审核非法或有害内容。\n此问题将报告给 %(homeserver)s 的管理员。", + "nature_nonstandard_admin_encrypted": "此房间专门发布非法或有害内容,或者管理员未能审核非法或有害内容。\n此问题将报告给 %(homeserver)s 的管理员。管理员将无法阅读此房间的加密内容。", + "nature_other": "任何其它原因。请描述问题。\n这将报告给房间管理员。", + "nature_spam": "此用户正在向房间发送垃圾广告、广告链接或推广内容。\n我们将向房间管理员报告此问题。", + "nature_toxic": "此用户表现不良,例如辱骂其他用户、在家庭友好型房间分享仅限成人的内容或以其它方式违反此房间的规则。\n将向房间管理员举报。", + "other_label": "其它", + "report_content_to_homeserver": "向服务器管理员举报此内容", + "report_entire_room": "举报整个房间", + "spam_or_propaganda": "垃圾内容或广告", + "toxic_behaviour": "有害行为" + }, + "report_room": { + "description": "向服务器管理员举报此房间。如果消息已被加密,则管理员无法看到它们。", + "reason_label": "描述理由" }, "restore_key_backup_dialog": { "count_of_decryption_failures": "%(failedCount)s 个会话解密失败!", - "count_of_successfully_restored_keys": "成功恢复了 %(sessionCount)s 个密钥", - "enter_key_description": "通过输入你的安全密钥来访问你的安全消息历史记录并设置安全通信。", - "enter_key_title": "输入安全密钥", - "enter_phrase_description": "无法通过你的安全短语访问你的安全消息历史记录并设置安全通信。", - "enter_phrase_title": "输入安全短语", - "incorrect_security_phrase_dialog": "无法使用此安全短语解密备份:请确认你是否输入了正确的安全短语。", - "incorrect_security_phrase_title": "安全短语错误", - "key_backup_warning": "警告:你应此只在受信任的电脑上设置密钥备份。", - "key_forgotten_text": "如果你忘记了你的安全密钥,你可以", - "key_is_invalid": "安全密钥无效", - "key_is_valid": "看起来是有效的安全密钥!", - "keys_restored_title": "已恢复密钥", - "load_error_content": "无法获取备份状态", - "load_keys_progress": "%(total)s 个密钥中之 %(completed)s 个已恢复", - "no_backup_error": "找不到备份!", - "phrase_forgotten_text": "如果你忘记了你的安全短语,你可以使用你的安全密钥设置新的恢复选项", - "recovery_key_mismatch_description": "无法使用此安全密钥解密备份:请检查你输入的安全密钥是否正确。", - "recovery_key_mismatch_title": "安全密钥不符", - "restore_failed_error": "无法还原备份" + "count_of_successfully_restored_keys": "成功恢复 %(sessionCount)s 个密钥", + "enter_key_description": "访问你的安全消息历史记录并通过输入恢复密钥来设置安全消息传递。", + "enter_key_title": "输入恢复密钥", + "enter_phrase_description": "访问你的安全消息历史记录,并通过输入你的安全口令来设置安全消息传递。", + "enter_phrase_title": "输入安全口令", + "incorrect_security_phrase_dialog": "无法使用此安全口令解密备份:请确认你输入的安全口令是否正确。", + "incorrect_security_phrase_title": "安全口令不正确", + "key_backup_warning": "警告:你应仅从受信任的计算机设置密钥备份。", + "key_fetch_in_progress": "从服务器获取密钥", + "key_forgotten_text": "如果你忘记了恢复密钥,你可以。", + "key_is_invalid": "非有效的恢复密钥", + "key_is_valid": "似乎是有效的恢复密钥!", + "keys_restored_title": "密钥已恢复", + "load_error_content": "无法载入备份状态", + "load_keys_progress": "已恢复 %(total)s 个密钥中的 %(completed)s 个", + "no_backup_error": "未找到备份!", + "phrase_forgotten_text": "如果你忘记了安全口令,你可以使用恢复密钥设置新的恢复选项。", + "recovery_key_mismatch_description": "无法使用此恢复密钥解密备份:请确认输入了正确的恢复密钥。", + "recovery_key_mismatch_title": "恢复密钥不正确", + "restore_failed_error": "无法恢复备份" }, "right_panel": { - "add_integrations": "添加挂件、桥接和机器人", + "add_integrations": "添加扩展", + "add_topic": "添加主题", + "extensions_button": "扩展", + "extensions_empty_description": "选择“%(addIntegrations)s”以浏览并添加扩展到此房间。", + "extensions_empty_title": "使用更多工具、小部件与机器人提高生产力", "files_button": "文件", "pinned_messages": { + "empty_description": "选择一个消息并点击“%(pinAction)s”以包含在此处。", + "empty_title": "置顶重要的消息以便于发现", + "header": { + "one": "1 个已置顶的消息", + "other": "%(count)s 个已置顶的消息", + "zero": "已置顶的消息" + }, "limits": { - "other": "你仅能固定 %(count)s 个挂件" - } + "other": "你最多只能钉住 %(count)s 个小部件" + }, + "menu": "打开菜单", + "reply_thread": "回复 消息列中的消息", + "unpin_all": { + "button": "取消置顶所有消息", + "content": "确实要移除所有已置顶的消息?此操作无法撤消。", + "title": "取消置顶所有消息?" + }, + "view": "在时间线中查看" }, - "pinned_messages_button": "已固定", + "pinned_messages_button": "已置顶的消息", "poll": { + "active_heading": "进行中的投票", + "empty_active": "此房间暂无进行中的投票", + "empty_active_load_more": "暂无进行中的投票。加载更多投票以查看过去几个月的投票。", + "empty_active_load_more_n_days": { + "one": "过去 1 天暂无进行中的投票。载入更多投票以获取过去几个月的投票", + "other": "过去 %(count)s 天暂无进行中的投票。载入更多投票以获取过去几个月的投票" + }, + "empty_past": "此房间暂无过往投票", + "empty_past_load_more": "暂无过往投票。载入更多投票以获取过去几个月的投票", + "empty_past_load_more_n_days": { + "one": "过去 1 天没有过往投票。加载更多投票以查看过去几个月的投票。", + "other": "过去 %(count)s 天暂无过往的投票。载入更多投票以获取过去几个月的投票" + }, "final_result": { - "one": "基于 %(count)s 票数的最终结果", - "other": "基于 %(count)s 票数的最终结果" - } + "one": "基于 %(count)s 个投票的最终结果", + "other": "基于 %(count)s 个投票的最终结果" + }, + "load_more": "载入更多投票", + "loading": "正在载入投票", + "past_heading": "过往的投票", + "view_in_timeline": "在时间线中查看投票", + "view_poll": "查看投票" }, - "polls_button": "投票历史", + "polls_button": "投票", "room_summary_card": { "title": "房间信息" }, @@ -1502,745 +1953,1100 @@ } }, "room": { - "3pid_invite_email_not_found_account": "该邀请被发送到了与你的账户无关的 %(email)s", - "3pid_invite_email_not_found_account_room": "这个到 %(roomName)s 的邀请是发送给 %(email)s 的,而此邮箱没有关联你的账户", - "3pid_invite_error_description": "尝试验证你的邀请时返回错误(%(errcode)s)。你可以尝试把这个信息传给邀请你的人。", - "3pid_invite_error_invite_action": "仍然尝试加入", - "3pid_invite_error_invite_subtitle": "你只能通过有效邀请加入。", - "3pid_invite_error_public_subtitle": "你依旧可以加入这里。", - "3pid_invite_error_title": "你的邀请出了问题。", - "3pid_invite_error_title_room": "你到 %(roomName)s 的邀请出错", - "3pid_invite_no_is_subtitle": "要直接在 %(brand)s 中接收邀请,请在设置中使用一个身份服务器。", - "banned_by": "你被 %(memberName)s 封禁", - "banned_from_room_by": "你被 %(memberName)s 从 %(roomName)s 封禁了", + "3pid_invite_email_not_found_account": "此邀请已发送到 %(email)s,但该邮箱地址与你的账户无关。", + "3pid_invite_email_not_found_account_room": "%(roomName)s 的邀请已发送到 %(email)s,该邮箱与你的账户无关。", + "3pid_invite_error_description": "尝试验证邀请时出错(%(errcode)s)。你可以尝试将此信息转发给邀请你的人员。", + "3pid_invite_error_invite_action": "尝试强制加入", + "3pid_invite_error_invite_subtitle": "你只能使用有效的邀请加入。", + "3pid_invite_error_public_subtitle": "你仍然可以加入。", + "3pid_invite_error_title": "你的邀请出现问题。", + "3pid_invite_error_title_room": "你对 %(roomName)s 的邀请出现问题", + "3pid_invite_no_is_subtitle": "使用“设置”中的身份服务器,可直接在 %(brand)s 中接收邀请。", + "banned_by": "你已被 %(memberName)s 封禁", + "banned_from_room_by": "你已被 %(memberName)s 禁止进入 %(roomName)s", "context_menu": { "copy_link": "复制房间链接", "favourite": "收藏", "forget": "忘记房间", "low_priority": "低优先级", + "mark_read": "设为已读", + "mark_unread": "设为未读", + "notifications_default": "跟随系统设置", + "notifications_mute": "静默房间", "title": "房间选项", "unfavourite": "已收藏" }, - "creating_room_text": "正在创建房间%(names)s", + "creating_room_text": "正在以 %(names)s 为名称创建房间", "dm_invite_action": "开始聊天", - "dm_invite_subtitle": " 想聊天", - "dm_invite_title": "你想和 %(user)s 聊天吗?", - "drop_file_prompt": "把文件拖到这里以上传", - "edit_topic": "编辑话题", - "error_join_404_invite": "邀请你的人已经离开了,亦或是他们的家服务器离线了。", - "error_join_404_invite_same_hs": "邀请你的人已经离开了。", - "error_join_connection": "加入时发生错误。", - "error_join_incompatible_version_1": "抱歉,你的家服务器过旧,故无法参与其中。", - "error_join_incompatible_version_2": "请 联系你的家服务器管理员。", + "dm_invite_subtitle": " 想要聊天", + "dm_invite_title": "你想与 %(user)s 聊天吗?", + "drop_file_prompt": "拖放文件到此处以上传", + "edit_topic": "编辑主题", + "error_cancel_knock_title": "取消失败", + "error_join_403": "你需要被邀请才能访问此房间。", + "error_join_404_1": "你尝试使用房间 ID 加入,但未提供要加入的服务器列表。房间 ID 是内部标识符,如果没有其它信息,则无法用于加入房间。", + "error_join_404_2": "如果你知道房间地址,请尝试通过该地址加入。", + "error_join_404_invite": "邀请你的人已离开,或其服务器已离线。", + "error_join_404_invite_same_hs": "邀请你的人已离开。", + "error_join_connection": "加入时出错。", + "error_join_incompatible_version_1": "抱歉,你的主服务器太旧,无法在此处参与。", + "error_join_incompatible_version_2": "请联系主服务器管理员。", "error_join_title": "加入失败", - "error_jump_to_date_connection": "在尝试查找并跳转到给定日期时发生网络错误。你的服务器可能出现了故障,或者你的网络暂时出现了问题。请再试一次。如果依然发生这种情况,请联系您的服务器管理员", + "error_join_unknown": "发生未知错误。", + "error_jump_to_date": "服务器返回 %(statusCode)s,错误代码为 %(errorCode)s", + "error_jump_to_date_connection": "尝试查找并跳转到指定日期时出现网络错误。主服务器可能已关闭,或互联网连接只是暂时出现问题。请重试。如果此问题持续存在,请联系主服务器管理员。", + "error_jump_to_date_details": "错误详细信息", + "error_jump_to_date_not_found": "我们找不到从 %(dateString)s 开始的后续活动。请尝试选择更早的日期。", + "error_jump_to_date_send_logs_prompt": "请提交调试日志以帮助我们追踪问题。", + "error_jump_to_date_title": "无法找到该日期的事件", "face_pile_summary": { - "one": "已有你所认识的 %(count)s 个人加入", - "other": "已有你所认识的 %(count)s 个人加入" + "one": "你认识的 %(count)s 个人已加入", + "other": "%(count)s 个你认识的人已加入" }, "face_pile_tooltip_label": { - "one": "查看 1 位成员", - "other": "查看全部 %(count)s 位成员" + "one": "查看 1 个成员", + "other": "查看全部 %(count)s 个成员" }, "face_pile_tooltip_shortcut": "包括 %(commaSeparatedMembers)s", "face_pile_tooltip_shortcut_joined": "包括你,%(commaSeparatedMembers)s", - "failed_reject_invite": "拒绝邀请失败", + "failed_determine_user": "由于成员事件已更改,无法确定要忽略哪个用户。", + "failed_reject_invite": "邀请拒绝失败", "forget_room": "忘记此房间", "forget_space": "忘记此空间", "header": { - "room_is_public": "此房间为公共的" + "join_video_call": "加入视频通话", + "join_voice_call": "加入语音通话", + "n_people_asking_to_join": { + "one": "申请加入", + "other": "%(count)s 个人员申请加入" + }, + "room_is_public": "此为公共房间", + "shared_history_tooltip": "新成员可以看到历史", + "world_readable_history_tooltip": "任何人都可以看到历史" }, - "inaccessible": "这个房间或空间当前不可访问。", - "inaccessible_name": "%(roomName)s 此时无法访问。", - "inaccessible_subtitle_1": "等一会儿再试或联系管理员检查你是否拥有访问权限。", - "inaccessible_subtitle_2": "尝试访问房间或空间时返回%(errcode)s。若你认为你看到这条消息是有问题的,请提交bug报告。", + "header_avatar_open_settings_label": "打开房间设置", + "header_face_pile_tooltip": "人员", + "header_untrusted_label": "不受信任", + "inaccessible": "此房间或空间暂时无法访问。", + "inaccessible_name": "目前无法访问 %(roomName)s。", + "inaccessible_subtitle_1": "请稍后重试,或联系房间或空间管理员检查你是否有权访问。", + "inaccessible_subtitle_2": "尝试访问房间或空间时返回了 %(errcode)s。如果认为此消息有误,请提交 Bug 报告。", "intro": { - "dm_caption": "除非你们其中一个邀请了别人加入,否则将仅有你们两个人在此对话中。", + "display_topic": "主题:", + "dm_caption": "除非两者之一邀请他人加入,否则此处只有你们两个人的对话。", + "edit_topic": "主题:编辑)", "enable_encryption_prompt": "在设置中启用加密。", - "no_avatar_label": "添加图片,让人们一眼就能看到你的房间。", - "no_topic": "添加话题,让大家知道这里是讨论什么的。", - "private_unencrypted_warning": "你的私人消息通常是加密的,但此房间不是。这通常是因为使用了不受支持的设备或方法,例如电子邮件邀请。", - "room_invite": "仅邀请至此房间", - "send_message_start_dm": "发送你的第一条消息邀请来聊天", - "start_of_dm_history": "这是你与的私聊历史的开端。", - "start_of_room": "这里是 的开始。", - "unencrypted_warning": "未启用端到端加密", + "encrypted_3pid_dm_pending_join": "一旦所有人都加入,你就可以开始聊天", + "no_avatar_label": "添加一张照片,这样别人就能很容易地找到你的房间。", + "no_topic": "添加主题有助于人们了解此房间与哪些事物相关。", + "private_unencrypted_warning": "你的私有消息通常是加密的,但此房间不是。通常这是由于使用了不受支持的设备或方法,例如通过邮件地址邀请。", + "room_invite": "仅邀请到此房间", + "send_message_start_dm": "发送第一个消息以邀请 聊天", + "start_of_dm_history": "此处是你与 的私聊历史的开头。", + "start_of_room": "这是 的开始。", + "unencrypted_warning": "端到端加密未启用", "user_created": "%(displayName)s 创建了此房间。", "you_created": "你创建了此房间。" }, - "invite_email_mismatch_suggestion": "要在 %(brand)s 中直接接收邀请,请在设置中共享此邮箱。", - "invite_sent_to_email": "邀请已被发送到 %(email)s", - "invite_sent_to_email_room": "这个到 %(roomName)s 的邀请是发送给 %(email)s 的", - "invite_subtitle": " 邀请了你", + "invite_email_mismatch_suggestion": "在“设置 ”中分享此邮件,以便直接在 %(brand)s 中接收邀请。", + "invite_sent_to_email": "此邀请已发送至 %(email)s", + "invite_sent_to_email_room": "到 %(roomName)s 的邀请已发送到 %(email)s", + "invite_subtitle": "由 邀请", "invite_this_room": "邀请到此房间", "invite_title": "你想加入 %(roomName)s 吗?", - "inviter_unknown": "未知的", + "inviter_unknown": "未知", "invites_you_text": " 邀请了你", "join_button_account": "注册", - "join_failed_needs_invite": "你需要一个邀请来查看 %(roomName)s", + "join_failed_needs_invite": "要查看 %(roomName)s,你需要被邀请", "join_the_discussion": "加入讨论", "join_title": "加入房间以参与", - "join_title_account": "使用一个账户加入对话", - "joining": "加入中…", - "jump_read_marker": "跳到第一条未读消息。", + "join_title_account": "通过账户加入对话", + "joining": "正在加入…", + "joining_room": "正在加入房间…", + "joining_space": "加入空间", + "jump_read_marker": "跳转到首个未读消息。", "jump_to_bottom_button": "滚动到最近的消息", "kick_reason": "原因:%(reason)s", - "kicked_by": "%(memberName)s 将你移出了这里", - "kicked_from_room_by": "%(memberName)s 将你移出了 %(roomName)s", + "kicked_by": "你已被 %(memberName)s 移除", + "kicked_from_room_by": "你已被 %(memberName)s 从 %(roomName)s 移除", + "knock_cancel_action": "取消请求", + "knock_denied_subtitle": "由于你被拒绝访问,除非收到群组管理员或协管员的邀请,否则你无法重新加入。", + "knock_denied_title": "你已被拒绝访问", + "knock_message_field_placeholder": "消息(可选)", + "knock_prompt": "申请加入?", + "knock_prompt_name": "申请加入 %(roomName)s?", + "knock_send_action": "请求访问", + "knock_sent": "已发送加入申请", + "knock_sent_subtitle": "你的加入请求正在等待处理。", + "knock_subtitle": "你需要获得此房间的访问权限才能查看或参与对话。你可以在下方发送加入申请。", "leave_error_title": "离开房间时出错", - "leave_server_notices_description": "此房间是用于发布来自家服务器的重要讯息的,所以你不能退出它。", - "leave_server_notices_title": "无法退出服务器公告房间", - "leave_unexpected_error": "试图离开房间时发生意外服务器错误", - "link_email_to_receive_3pid_invite": "要在 %(brand)s 中直接接收邀请,请在设置中将你的账户连接到此邮箱。", - "loading_preview": "加载预览中", - "no_peek_join_prompt": "%(roomName)s 不能被预览。你想加入吗?", - "no_peek_no_name_join_prompt": "这里没有预览, 你是否要加入?", - "not_found_subtitle": "你确定你位于正确的地方?", - "not_found_title": "这个房间或空间不存在。", - "not_found_title_name": "%(roomName)s 不存在。", - "peek_join_prompt": "你正在预览 %(roomName)s。想加入吗?", - "read_topic": "点击阅读话题", - "rejoin_button": "重新加入", - "unread_notifications_predecessor": { - "other": "你在此房间的先前版本中有 %(count)s 条未读通知。", - "one": "你在此房间的先前版本中有 %(count)s 条未读通知。" + "leave_server_notices_description": "此房间用于存储来自主服务器的重要消息,因此你无法离开。", + "leave_server_notices_title": "无法离开“服务器通知”房间", + "leave_unexpected_error": "尝试离开房间时出现意外服务器错误", + "link_email_to_receive_3pid_invite": "请在“设置”中将此邮件地址与你的账户关联,以便直接在 %(brand)s 中接收邀请。", + "loading_preview": "正在载入预览", + "no_peek_join_prompt": "%(roomName)s 无法预览。是否加入?", + "no_peek_no_name_join_prompt": "暂无预览,是否加入?", + "not_found_subtitle": "你确定来对地方了吗?", + "not_found_title": "此房间或空间不存在。", + "not_found_title_name": "%(roomName)s 不存在。 ", + "peek_join_prompt": "你正在预览 %(roomName)s。是否加入?", + "pinned_message_banner": { + "button_close_list": "关闭列表", + "button_view_all": "查看全部", + "description": "此房间包含已置顶的消息。点击查看。", + "go_to_newest_message": "在此处查看时间线中的置顶消息和最新的置顶消息", + "go_to_next_message": "在此处查看时间线中的置顶消息和下一条最早的置顶消息", + "title": "第 %(index)s 个已置顶的消息,共 %(length)s 个" }, - "upgrade_error_description": "请再次检查你的服务器是否支持所选房间版本,然后再试一次。", - "upgrade_error_title": "升级房间时发生错误", - "upgrade_warning_bar": "升级此房间将会关闭房间的当前实例并创建一个具有相同名称的升级版房间。", - "upgrade_warning_bar_admins": "此警告仅房间管理员可见", - "upgrade_warning_bar_unstable": "此房间运行的房间版本是 ,此版本已被家服务器标记为 不稳定 。", - "upgrade_warning_bar_upgraded": "此房间已经被升级。", + "read_topic": "点击阅读主题", + "rejecting": "正在拒绝邀请…", + "rejoin_button": "重新加入", + "room_content": "房间内容", + "room_is_low_priority": "此为低优先级房间", + "search": { + "all_rooms_button": "搜索所有房间", + "placeholder": "搜索消息…", + "summary": { + "one": "为“”找到 1 个结果", + "other": "根据关键词“”找到 %(count)s 个结果" + }, + "this_room_button": "搜索此房间" + }, + "unknown_status_code_for_timeline_jump": "未知状态码", + "unread_notifications_predecessor": { + "one": "你的 %(count)s 个未读通知在此房间的上一版本中。", + "other": "你在此房间的上一版本中有 %(count)s 个未读通知。" + }, + "upgrade_error_description": "请仔细检查你的服务器是否支持所选的房间版本,然后重试。", + "upgrade_error_title": "升级房间时出错", + "upgrade_warning_bar": "升级此房间将关闭当前的房间实例,并创建一个同名的已升级房间。", + "upgrade_warning_bar_admins": "仅房间管理员可以看到此警告", + "upgrade_warning_bar_unstable": "此房间正在运行房间版本 ,此主服务器已将其标记为不稳定。", + "upgrade_warning_bar_upgraded": "此房间已升级过。", "upload": { "uploading_multiple_file": { - "other": "正在上传 %(filename)s 与其他 %(count)s 个文件", - "one": "正在上传 %(filename)s 与其他 %(count)s 个文件" + "one": "正在上传 %(filename)s 与剩余 %(count)s 个文件", + "other": "正在上传 %(filename)s 与剩余 %(count)s 个文件" }, "uploading_single_file": "正在上传 %(filename)s" - } + }, + "video_room": "此房间为视频房间", + "waiting_for_join_subtitle": "受邀用户加入 %(brand)s 后,你将能够聊天,并且房间将端到端加密。", + "waiting_for_join_title": "等待用户加入 %(brand)s" }, "room_list": { "add_room_label": "添加房间", "add_space_label": "添加空间", - "breadcrumbs_empty": "没有最近访问过的房间", + "breadcrumbs_empty": "暂无最近访问的房间", "breadcrumbs_label": "最近访问的房间", - "failed_add_tag": "无法为房间新增标签 %(tagName)s", - "failed_remove_tag": "移除房间标签 %(tagName)s 失败", - "failed_set_dm_tag": "设置私聊标签失败", + "failed_add_tag": "为房间添加标签 %(tagName)s 失败", + "failed_remove_tag": "从房间移除标签 %(tagName)s 失败", + "failed_set_dm_tag": "私聊标签设置失败", "home_menu_label": "主页选项", "join_public_room_label": "加入公共房间", "joining_rooms_status": { - "one": "目前正在加入 %(count)s 个房间", - "other": "目前正在加入 %(count)s 个房间" + "one": "当前正在加入 %(count)s 个房间", + "other": "当前加入了 %(count)s 个房间" + }, + "list_title": "房间列表", + "more_options": { + "leave_room": "离开房间" }, "notification_options": "通知选项", "redacting_messages_status": { - "one": "目前正在移除%(count)s个房间中的消息", - "other": "目前正在移除%(count)s个房间中的消息" + "one": "正在移除房间中的 %(count)s 个消息", + "other": "正在移除房间中的 %(count)s 个消息" + }, + "section": { + "chats": "聊天", + "favourites": "收藏", + "low_priority": "低优先级" }, "show_less": "显示更少", "show_n_more": { - "other": "多显示 %(count)s 个", - "one": "多显示 %(count)s 个" + "one": "显示剩余 %(count)s 个", + "other": "显示剩余 %(count)s 个" }, "show_previews": "显示消息预览", "sort_by": "排序", "sort_by_activity": "活动", "sort_by_alphabet": "字典顺序", - "sort_unread_first": "优先显示有未读消息的房间", - "space_menu_label": "%(spaceName)s菜单", + "sort_unread_first": "优先显示包含未读消息的房间", + "space_menu_label": "%(spaceName)s 菜单", "sublist_options": "列表选项", "suggested_rooms_heading": "建议的房间" }, "room_settings": { "access": { - "description_space": "决定谁可以查看和加入 %(spaceName)s。", + "description_space": "决定谁可以查看并加入 %(spaceName)s。", "title": "访问" }, "advanced": { - "error_upgrade_description": "房间可能没有完整地升级", + "error_upgrade_description": "无法完成升级此房间", "error_upgrade_title": "房间升级失败", "information_section_room": "房间信息", "information_section_space": "空间信息", - "room_id": "内部房间ID", - "room_predecessor": "查看%(roomName)s里更旧的消息。", - "room_upgrade_button": "升级此房间至推荐版本", + "room_id": "内部房间 ID", + "room_predecessor": "在 %(roomName)s 中查看更早的消息", + "room_upgrade_button": "将此房间升级到推荐的房间版本", + "room_upgrade_warning": "警告:升级房间不会自动将房间成员迁移到新版本房间。我们会在旧版本房间中发布新房间的链接 - 房间成员必须点击此链接才能加入新房间。", "room_version": "房间版本:", "room_version_section": "房间版本", - "space_predecessor": "查看%(spaceName)s的旧版本。", + "space_predecessor": "在 %(spaceName)s 中查看更旧的版本。", "space_upgrade_button": "将此空间升级到推荐的房间版本", - "unfederated": "此房间无法被远程 Matrix 服务器访问", - "upgrade_button": "升级此房间至版本 %(version)s", - "upgrade_dialog_description": "升级此房间需要关闭此房间的当前实例并创建一个新的房间代替它。为了给房间成员最好的体验,我们会:", - "upgrade_dialog_description_1": "创建一个拥有相同的名称、描述与头像的新房间", - "upgrade_dialog_description_2": "更新所有本地房间别名以使其指向新房间", - "upgrade_dialog_description_3": "阻止用户在旧房间中发言,并发送消息建议用户迁移至新房间", - "upgrade_dialog_description_4": "在新房间的开始处发送一条指回旧房间的链接,这样用户可以查看旧消息", - "upgrade_dialog_title": "更新房间版本", - "upgrade_dwarning_ialog_title_public": "更新公共房间", - "upgrade_warning_dialog_description": "更新房间是高级操作,通常建议在房间由于错误、缺失功能或安全漏洞而不稳定时使用。", - "upgrade_warning_dialog_explainer": "请注意升级将使这个房间有一个新版本。所有当前的消息都将保留在此存档房间中。", - "upgrade_warning_dialog_footer": "你将把此房间从 升级至 。", - "upgrade_warning_dialog_invite_label": "自动邀请该房间的成员加入新房间", - "upgrade_warning_dialog_report_bug_prompt": "这通常仅影响服务器如何处理房间。如果你的 %(brand)s 遇到问题,请回报错误。", - "upgrade_warning_dialog_report_bug_prompt_link": "通常这只影响房间在服务器上的处理方式。如果你对你的 %(brand)s 有问题,请报告一个错误。", - "upgrade_warning_dialog_title_private": "更新私人房间" + "unfederated": "远程 Matrix 服务器无法访问此房间", + "upgrade_button": "升级此房间到版本 %(version)s", + "upgrade_dialog_description": "升级此房间需要关闭当前的房间实例并创建一个新的房间来代替它。为了给房间成员提供最佳体验,我们将:", + "upgrade_dialog_description_1": "创建一个具有相同名称、描述与头像的新房间", + "upgrade_dialog_description_2": "更新任意本地房间别名以使其指向新房间", + "upgrade_dialog_description_3": "阻止用户在旧版本房间发言,并发送消息建议用户迁移到新房间。", + "upgrade_dialog_description_4": "在新房间的开头添加返回旧房间的链接,以便其他人可以查看旧消息。", + "upgrade_dialog_title": "升级房间版本", + "upgrade_dwarning_ialog_title_public": "升级公共房间", + "upgrade_warning_dialog_description": "升级房间是一项高级操作,通常建议在房间由于错误、功能缺失或安全漏洞而不稳定时执行此操作。", + "upgrade_warning_dialog_explainer": "请注意,升级将生成新版本的房间。所有当前消息都将保留在此已存档的房间中。", + "upgrade_warning_dialog_footer": "你将升级此房间的版本从 。", + "upgrade_warning_dialog_invite_label": "自动将此房间的成员邀请到新房间", + "upgrade_warning_dialog_report_bug_prompt": "这通常只会影响房间在服务器上的处理方式。如果你的 %(brand)s 出现问题,请报告 Bug。", + "upgrade_warning_dialog_report_bug_prompt_link": "这通常只会影响服务器上对房间的处理方式。如果你在使用 %(brand)s 时遇到问题,请报告 Bug。", + "upgrade_warning_dialog_title": "升级房间", + "upgrade_warning_dialog_title_private": "升级私有房间" }, "alias_not_specified": "未指定", "bridges": { - "description": "此房间正桥接消息到以下平台。了解更多。", - "empty": "这个房间不会将消息桥接到任何平台。了解更多", - "title": "桥接" + "description": "此房间正在将消息桥接到以下平台。了解详情", + "empty": "此房间不会将消息桥接到任何平台。了解更多", + "title": "桥接器" }, "delete_avatar_label": "删除头像", "general": { - "alias_field_has_domain_invalid": "缺少域分隔符,例子(:domain.org)", - "alias_field_has_localpart_invalid": "缺少房间名称或分隔符,例子(my-room:domain.org)", - "alias_field_matches_invalid": "此地址不指向此房间", - "alias_field_placeholder_default": "例如 my-room", + "alias_field_has_domain_invalid": "缺少域名分隔符。例如(:domain.org)", + "alias_field_has_localpart_invalid": "缺少房间名称或分隔符,例如(my-room:domain.org)", + "alias_field_matches_invalid": "此地址未指向此房间", + "alias_field_placeholder_default": "例如:my-room", "alias_field_required_invalid": "请提供地址", - "alias_field_safe_localpart_invalid": "不允许使用某些字符", - "alias_field_taken_invalid": "此地址的服务器无效或已被使用", + "alias_field_safe_localpart_invalid": "某些字符不被允许", + "alias_field_taken_invalid": "此地址指向的服务器无效或已被使用", "alias_field_taken_invalid_domain": "此地址已被使用", - "alias_field_taken_valid": "此地址可用", + "alias_field_taken_valid": "此地址可供使用", "alias_heading": "房间地址", - "aliases_items_label": "其他公布的地址:", - "aliases_no_items_label": "还没有其他公布的地址,在下方添加一个", + "aliases_items_label": "其它已发布地址:", + "aliases_no_items_label": "暂无其它已发布的地址,可以在下面添加。", "aliases_section": "房间地址", "avatar_field_label": "房间头像", "canonical_alias_field_label": "主要地址", - "description_space": "编辑关于你的空间的设置。", - "error_creating_alias_description": "创建地址时出现错误。可能是服务器不允许,也可能是出现了一个暂时的错误。", - "error_creating_alias_title": "创建地址时出现错误", - "error_deleting_alias_description": "删除那个地址时出现错误。可能它已不存在,也可能出现了一个暂时的错误。", - "error_deleting_alias_description_forbidden": "你没有权限删除此地址。", - "error_deleting_alias_title": "删除地址时出现错误", - "error_save_space_settings": "空间设置保存失败。", - "error_updating_alias_description": "更新此房间的备用地址时出现错误。可能是服务器不允许,也可能是出现了一个暂时的错误。", - "error_updating_canonical_alias_description": "更新房间的主要地址时发生错误。可能是此服务器不允许,也可能是出现了一个临时错误。", - "error_updating_canonical_alias_title": "更新主要地址时发生错误", + "description_space": "编辑空间相关设置。", + "error_creating_alias_description": "创建该地址时出错。服务器可能不允许该地址,或者发生了临时故障。", + "error_creating_alias_title": "创建地址时出错", + "error_deleting_alias_description": "移除此地址时出错。它可能不再存在或临时出错。", + "error_deleting_alias_description_forbidden": "你无权删除地址。", + "error_deleting_alias_title": "移除地址时出错", + "error_publishing": "无法发布房间", + "error_publishing_detail": "发布此房间时出错", + "error_save_space_settings": "保存空间设置时出错", + "error_updating_alias_description": "更新房间的备选地址时出错。服务器可能不允许此操作,或者发生了临时故障。", + "error_updating_canonical_alias_description": "更新房间主要地址时出错。服务器可能不允许这样做,或者发生了临时故障。", + "error_updating_canonical_alias_title": "更新主要地址时出错", "leave_space": "离开空间", "local_alias_field_label": "本地地址", - "local_aliases_explainer_room": "为此房间设置地址以便用户通过你的家服务器(%(localDomain)s)找到此房间", - "local_aliases_explainer_space": "设置此空间的地址,这样用户就能通过你的家服务器找到此空间(%(localDomain)s)", + "local_aliases_explainer_room": "为此房间设置地址,以便用户通过主服务器找到此房间。", + "local_aliases_explainer_space": "设置此空间的地址以便用户可以通过主服务器(%(localDomain)s)找到此空间", "local_aliases_section": "本地地址", "name_field_label": "房间名称", - "new_alias_placeholder": "新的公布的地址(例如 #alias:server)", + "new_alias_placeholder": "新的发布地址(例如:#alias:server)", "no_aliases_room": "此房间没有本地地址", "no_aliases_space": "此空间没有本地地址", - "other_section": "其他", - "publish_toggle": "是否将此房间发布至 %(domain)s 的房间目录中?", - "published_aliases_description": "要公布地址,首先需要将其设为本地地址。", - "published_aliases_explainer_room": "任何服务器上的人均可通过公布的地址加入你的房间。", - "published_aliases_explainer_space": "任何服务器上的人均可通过公布的地址加入你的空间。", - "published_aliases_section": "公布的地址", - "save": "保存修改", - "topic_field_label": "房间话题" + "other_section": "其它", + "publish_toggle": "发布此房间到 %(domain)s 的房间目录?", + "publish_warn_invite_only": "你无法发布被设为仅限邀请的房间。", + "publish_warn_no_canonical_permission": "你必须拥有设置主要地址的权限才能发布房间。", + "published_aliases_description": "要发布地址,首先需要将其设置为本地地址。", + "published_aliases_explainer_room": "任何服务器上的任何人都可以使用已发布的地址加入此房间。", + "published_aliases_explainer_space": "任何服务器上的任何人都可以使用已发布的地址加入此空间。", + "published_aliases_section": "发布的地址", + "save": "保存更改", + "topic_field_label": "房间主题" }, "notifications": { "browse_button": "浏览", "custom_sound_prompt": "设置新的自定义声音", "notification_sound": "通知声音", - "settings_link": "如设置中设定的那样获取通知", + "settings_link": "按设置中的配置获取通知", "sounds_section": "声音", + "upload_sound_label": "上传自定义声音", "uploaded_sound": "已上传的声音" }, + "people": { + "knock_empty": "暂无请求", + "knock_section": "申请加入", + "see_less": "查看更少", + "see_more": "查看更多" + }, "permissions": { - "add_privileged_user_description": "授权给该房间内的某人或某些人", - "add_privileged_user_filter_placeholder": "搜索该房间内的用户……", + "add_privileged_user_description": "授予此房间中一个或多个用户更多特权", + "add_privileged_user_filter_placeholder": "在此房间中搜索用户…", "add_privileged_user_heading": "添加特权用户", "ban": "封禁用户", "ban_reason": "理由", "banned_by": "被 %(displayName)s 封禁", - "banned_users_section": "被封禁的用户", - "error_changing_pl_description": "更改此用户的权力级别时出错。请确保你有足够权限后重试。", - "error_changing_pl_reqs_description": "更改此房间的权力级别需求时出错。请确保你有足够的权限后重试。", - "error_changing_pl_reqs_title": "更改权力级别需求时出错", - "error_changing_pl_title": "更改权力级别时出错", - "error_unbanning": "解除封禁失败", + "banned_users_section": "已被封禁的用户", + "error_changing_pl_description": "更改用户权力值时出错。请确保你拥有足够的权限并重试。", + "error_changing_pl_reqs_description": "更改房间权力值要求时出错。请确保你拥有足够的权限并重试。", + "error_changing_pl_reqs_title": "更改权力值要求时出错", + "error_changing_pl_title": "更改权力值时出错", + "error_unbanning": "解封失败", "events_default": "发送消息", "invite": "邀请用户", "kick": "移除用户", - "m.call": "开始%(brand)s呼叫", - "m.call.member": "加入%(brand)s呼叫", + "m.call": "开始 %(brand)s 通话", + "m.call.member": "加入 %(brand)s 通话", "m.reaction": "发送反应", "m.room.avatar": "更改房间头像", "m.room.avatar_space": "更改空间头像", - "m.room.canonical_alias": "更改房间主要地址", - "m.room.canonical_alias_space": "更改空间主地址", + "m.room.canonical_alias": "更改房间的主要地址", + "m.room.canonical_alias_space": "更改空间的主要地址", "m.room.encryption": "启用房间加密", - "m.room.history_visibility": "更改历史记录可见性", + "m.room.history_visibility": "更改历史可见性", "m.room.name": "更改房间名称", "m.room.name_space": "更改空间名称", - "m.room.pinned_events": "管理置顶事件", + "m.room.pinned_events": "管理已置顶事件", "m.room.power_levels": "更改权限", "m.room.redaction": "移除我发送的消息", - "m.room.server_acl": "更改服务器访问控制列表", - "m.room.tombstone": "更新房间", - "m.room.topic": "更改话题", + "m.room.server_acl": "更改服务器 ACL", + "m.room.tombstone": "升级房间", + "m.room.topic": "更改主题", "m.room.topic_space": "更改描述", - "m.space.child": "管理此空间中的房间", - "m.widget": "修改挂件", - "muted_users_section": "被禁言的用户", - "no_privileged_users": "此房间中没有用户有特殊权限", - "notifications.room": "通知每个人", + "m.space.child": "在此空间中管理房间", + "m.widget": "修改小部件", + "muted_users_section": "已被静默的用户", + "no_privileged_users": "此房间中的用户均无特定权限", + "notifications.room": "通知所有人", "permissions_section": "权限", - "permissions_section_description_room": "选择更改房间各个部分所需的角色", - "permissions_section_description_space": "选择改变空间各个部分所需的角色", + "permissions_section_description_room": "选择更改房间各部分所需的角色", + "permissions_section_description_space": "选择更改空间各部分所需的角色", "privileged_users_section": "特权用户", - "redact": "移除其他人的消息", + "redact": "移除其他人发送的消息", "send_event_type": "发送 %(eventType)s 事件", "state_default": "更改设置", "title": "角色与权限", "users_default": "默认角色" }, "security": { - "enable_encryption_confirm_description": "房间加密一经启用,便无法禁用。在加密房间中,发送的消息无法被服务器看到,只能被房间的参与者看到。启用加密可能会使许多机器人和桥接无法正常运作。 详细了解加密。", + "cannot_change_to_private_due_to_missing_history_visiblity_permissions": { + "description": "您没有权限更改该频道的历史记录可见性。此操作存在风险,可能导致未加入频道的用户读取消息。", + "title": "无法将房间设为私有房间" + }, + "enable_encryption_confirm_description": "房间的加密一旦启用就无法禁用。服务器无法看到在加密房间中发送的消息,只有房间内的参与者才能看到。启用加密可能会阻止大多数机器人与桥接器正常工作。了解更多加密相关", "enable_encryption_confirm_title": "启用加密?", - "enable_encryption_public_room_confirm_description_1": "不建议为公共房间添加加密。任何人都能找到并加入公共房间,所以任何人都能阅读其中的消息。你不会获得加密的任何好处,并且之后你无法将其关闭。在公共房间中加密消息会使接收和发送消息变慢。", - "enable_encryption_public_room_confirm_description_2": "为避免这些问题,请为计划中的对话创建一个新的加密房间。", - "enable_encryption_public_room_confirm_title": "你确定要为此公开房间开启加密吗?", - "encrypted_room_public_confirm_description_1": "不建议公开加密房间。这意味着任何人都可以找到并加入房间,因此任何人都可以阅读消息。你将不会得到任何加密带来的好处。在公共房间加密消息还会拖慢收发消息的速度。", - "encrypted_room_public_confirm_description_2": "为避免这些问题,请为计划中的对话创建一个新的加密房间。", - "encrypted_room_public_confirm_title": "你确定要公开此加密房间吗?", - "encryption_permanent": "加密一经启用,便无法禁用。", - "error_join_rule_change_title": "未能更新加入列表", - "error_join_rule_change_unknown": "未知失败", - "guest_access_warning": "拥有受支持客户端的人无需注册账户即可加入房间。", - "history_visibility_invited": "只有成员(从他们被邀请开始)", - "history_visibility_legend": "谁可以阅读历史消息?", - "history_visibility_shared": "仅成员(从选中此选项时开始)", - "history_visibility_warning": "历史记录阅读权限的更改只会应用到此房间中将来的消息。既有历史记录的可见性将不会更改。", - "history_visibility_world_readable": "任何人", + "enable_encryption_public_room_confirm_description_1": "不建议为公共房间启用加密。任何人都可以找到并加入公共房间,因此任何人都可以阅读其中的消息。这种情况下你将无法受益于加密,并且以后也无法关闭加密功能。在公共房间中,加密消息会降低消息的收发效率。", + "enable_encryption_public_room_confirm_description_2": "为避免这些问题,请为你计划进行的对话创建一个新的加密房间。", + "enable_encryption_public_room_confirm_title": "你确定要为此公共房间添加加密功能?", + "encrypted_room_public_confirm_description_1": "不建将加密房间设为公开。这意味着任何人都可以找到并加入公共房间,因此任何人都可以阅读其中的消息。这种情况下你将无法受益于加密。在公共房间中,加密消息会降低消息的收发效率。", + "encrypted_room_public_confirm_description_2": "为避免这些问题,请为你计划进行的对话创建一个新的公共房间。", + "encrypted_room_public_confirm_title": "你确定要公开此加密房间?", + "encryption_forced": "服务器要求禁用加密。", + "encryption_permanent": "加密一旦启用就无法禁用。", + "error_join_rule_change_title": "连接规则更新失败", + "error_join_rule_change_unknown": "未知故障", + "guest_access_warning": "使用受支持的客户端的人员无需注册账户即可加入房间。", + "history_visibility_invited": "自成员被邀请时起", + "history_visibility_legend": "谁可以查看历史?", + "history_visibility_shared": "成员(完整历史)", + "history_visibility_warning": "此更改不会影响过去的消息,而只会影响新消息。了解更多", + "history_visibility_world_readable": "任何人(公开历史)", "join_rule_description": "决定谁可以加入 %(roomName)s。", - "join_rule_invite": "私有(仅邀请)", - "join_rule_invite_description": "只有受邀的人才能加入。", + "join_rule_invite": "仅限邀请", + "join_rule_invite_description": "仅限被邀请的人员加入", "join_rule_knock": "申请加入", - "join_rule_public_description": "任何人都可以找到并加入。", + "join_rule_knock_description": "除非被授予权限, 否则人员无法加入。", + "join_rule_public": "任何人", + "join_rule_public_description": "任何人都可以加入。", "join_rule_restricted": "空间成员", - "join_rule_restricted_description": "空间中的任何人都可以找到并加入。在此处编辑哪些空间可以访问。", - "join_rule_restricted_description_active_space": " 中的任何人都可以寻找和加入。你也可以选择其他空间。", - "join_rule_restricted_description_prompt": "空间中的任何人都可以找到并加入。你可以选择多个空间。", - "join_rule_restricted_description_spaces": "可访问的空间", - "join_rule_restricted_dialog_description": "决定哪些空间可以访问这个房间。如果一个空间被选中,它的成员可以找到并加入。", - "join_rule_restricted_dialog_empty_warning": "你正在移除所有空间。访问权限将预设为仅邀请", + "join_rule_restricted_description": "位于被授权的空间的任何人无需邀请即可加入。管理空间", + "join_rule_restricted_description_active_space": "任何在 中的成员都可以加入。", + "join_rule_restricted_description_prompt": "在空间中的任何人都可以加入。", + "join_rule_restricted_description_spaces": "被授权的空间", + "join_rule_restricted_dialog_description": "无需邀请即可加入 。", + "join_rule_restricted_dialog_empty_warning": "你将移除所有已授权的空间。访问权将默认变更为“仅邀请”。", "join_rule_restricted_dialog_filter_placeholder": "搜索空间", - "join_rule_restricted_dialog_heading_other": "你可能不知道的其他空间或房间", - "join_rule_restricted_dialog_heading_room": "你知道的包含此房间的空间", - "join_rule_restricted_dialog_heading_space": "你知道的包含这个空间的空间", - "join_rule_restricted_dialog_heading_unknown": "这些可能是其他房间管理员的一部分。", - "join_rule_restricted_dialog_title": "选择空间", + "join_rule_restricted_dialog_heading_known": "此房间未被包含在你的空间", + "join_rule_restricted_dialog_heading_other": "其它你并非其成员的空间", + "join_rule_restricted_dialog_heading_room": "包含此房间的空间", + "join_rule_restricted_dialog_heading_space": "你已知包含到此空间的子空间", + "join_rule_restricted_dialog_heading_unknown": "这些可能是其他房间管理员参与的房间。", + "join_rule_restricted_dialog_title": "管理空间", "join_rule_restricted_n_more": { - "other": "以及另 %(count)s", - "one": "& 另外 %(count)s" + "one": "与更多 %(count)s 个", + "other": "与更多 %(count)s 个" }, "join_rule_restricted_summary": { - "other": "目前,%(count)s 个空间可以访问", - "one": "目前,一个空间有访问权限" + "one": "当前已授权 1 个空间", + "other": "当前已授权 %(count)s 个空间" }, - "join_rule_restricted_upgrade_description": "此升级将允许选定的空间成员无需邀请即可访问此房间。", - "join_rule_restricted_upgrade_warning": "这个房间位于你不是管理员的某些空间中。 在这些空间中,旧房间仍将显示,但系统会提示人们加入新房间。", - "join_rule_upgrade_awaiting_room": "正在加载新房间", + "join_rule_restricted_upgrade_description": "此升级将允许选定空间的成员无需邀请即可访问此房间。", + "join_rule_restricted_upgrade_warning": "此房间位于你并非管理员的某些空间中。在这些空间中,旧房间仍会显示,但系统会提示用户加入新房间。", + "join_rule_upgrade_awaiting_room": "正在载入新房间", "join_rule_upgrade_required": "需要升级", "join_rule_upgrade_sending_invites": { "one": "正在发送邀请…", - "other": "正在发送邀请… (%(count)s 中的 %(progress)s)" + "other": "正在发送邀请…(%(count)s 个中的第 %(progress)s 个)" }, "join_rule_upgrade_updating_spaces": { - "other": "正在更新房间… (%(count)s 中的 %(progress)s)", - "one": "正在更新空间…" + "one": "正在升级空间…", + "other": "正在更新空间…(%(count)s 个中的第 %(progress)s 个)" }, "join_rule_upgrade_upgrading_room": "正在升级房间", - "public_without_alias_warning": "要链接至此房间,请添加一个地址。", - "publish_room": "使此房间在公共房间目录中可见。", - "publish_space": "使此空间在公共房间目录中可见。", - "strict_encryption": "永不从此会话向此房间中未验证的会话发送加密消息", - "title": "隐私安全" + "join_rule_world_readable_description": "更改谁可以加入房间也会更改未来消息的可见性。", + "public_without_alias_warning": "要关联到此房间,请添加地址。", + "publish_room": "使此房间在公共房间目录可见。", + "publish_space": "使此空间在公共房间目录可见。", + "strict_encryption": "仅发送消息到已验证的用户。", + "title": "安全与隐私" }, - "title": "房间设置 - %(roomName)s", + "title": "房间设置:%(roomName)s", "upload_avatar_label": "上传头像", "visibility": { "alias_section": "地址", - "error_failed_save": "更新此空间的可见性失败", - "error_update_guest_access": "更新此空间的游客访问权限失败", - "error_update_history_visibility": "更新此空间的历史记录可见性失败", - "guest_access_explainer": "游客无需账户即可加入空间。", - "guest_access_label": "启用游客访问权限", + "error_failed_save": "此空间的设置更新失败", + "error_update_guest_access": "此空间的访客访问更新失败", + "error_update_history_visibility": "此空间的历史可见性更新失败", + "guest_access_disabled": "你无权更改访客访问。", + "guest_access_explainer": "访客可以在没有账户的情况下加入。这将对公共空间有用。", + "guest_access_label": "启用访客访问", "history_visibility_anyone_space": "预览空间", - "history_visibility_anyone_space_description": "允许人们在加入前预览你的空间。", - "history_visibility_anyone_space_recommendation": "建议用于公开空间。", - "title": "可见性" + "history_visibility_anyone_space_description": "允许人员在加入前预览空间。", + "history_visibility_anyone_space_disabled": "你无权更改历史可见性。", + "history_visibility_anyone_space_recommendation": "推荐用于公共空间。", + "title": "安全与隐私" }, "voip": { "call_type_section": "通话类型", - "enable_element_call_caption": "%(brand)s是端到端加密的,但是目前仅限于少数用户。", - "enable_element_call_label": "启用%(brand)s作为此房间的额外通话选项", - "enable_element_call_no_permissions_tooltip": "你没有足够的权限更改这个。" + "enable_element_call_caption": "%(brand)s 为端到端加密,但当前仅限少数用户。", + "enable_element_call_label": "在此房间启用 %(brand)s 作为额外通话选项", + "enable_element_call_no_permissions_tooltip": "你无权更改此设置。" } }, "room_summary_card_back_action_label": "房间信息", "scalar": { - "error_create": "无法创建挂件。", - "error_membership": "你不在此房间中。", - "error_missing_room_id": "缺少roomId。", - "error_missing_room_id_request": "请求中缺少room_id", - "error_missing_user_id_request": "请求中缺少user_id", - "error_permission": "你没有权限在此房间进行那个操作。", - "error_power_level_invalid": "权力级别必须是正整数。", - "error_room_not_visible": "房间%(roomId)s不可见", + "error_create": "无法创建小部件。", + "error_membership": "你不在此房间。", + "error_missing_room_id": "缺少房间 ID.", + "error_missing_room_id_request": "请求中缺少“room_id”", + "error_missing_user_id_request": "请求中缺少“user_id”", + "error_permission": "你无权在此房间内执行此操作。", + "error_power_level_invalid": "权力值必须为正整数。", + "error_room_not_visible": "房间 %(roomId)s 不可见", "error_room_unknown": "无法识别此房间。", "error_send_request": "请求发送失败。", - "failed_read_event": "读取时间失败", - "failed_send_event": "发送事件失败" + "failed_read_event": "事件读取失败", + "failed_send_event": "事件发送失败" }, "server_offline": { - "description": "你的服务器未响应你的一些请求。下方是一些最可能的原因。", - "description_1": "服务器(%(serverName)s)花了太长时间响应。", - "description_2": "你的防火墙或防病毒软件阻止了此请求。", - "description_3": "一个浏览器扩展阻止了此请求。", - "description_4": "此服务器为离线状态。", - "description_5": "此服务器拒绝了你的请求。", - "description_6": "你的区域难以连接上互联网。", - "description_7": "尝试联系服务器时出现连接错误。", - "description_8": "服务器没有配置为提示错误是什么(CORS)。", - "empty_timeline": "全数阅毕。", - "recent_changes_heading": "尚未被接受的最近更改", + "description": "服务器未响应你的某些请求。以下是一些最可能的原因。", + "description_1": "服务器(%(serverName)s)响应时间过长。", + "description_2": "你的防火墙或杀毒软件阻止了请求。", + "description_3": "浏览器扩展阻止了该请求。", + "description_4": "此服务器已离线。", + "description_5": "服务器已拒绝你的请求。", + "description_6": "你所在的区域在连接 Internet 时遇到困难。", + "description_7": "尝试联系服务器时发生连接错误。", + "description_8": "服务器的配置未能说明问题原因(CORS)。", + "empty_timeline": "你已阅读所有消息", + "recent_changes_heading": "尚未收到最近的更改", "title": "服务器未响应" }, + "service_worker_error": { + "description": "%(brand)s 需要一个 Service Worker 来从 Matrix 内容存储库加载经过身份验证的媒体。当前浏览器不支持此功能,因此你可能会遇到媒体加载失败的情况。", + "title": "Services Worker 载入失败" + }, "seshat": { - "error_initialising": "消息搜索初始化失败,请检查你的设置以获取更多信息", - "reset_button": "重置活动存储", - "reset_description": "你大概率不想重置你的活动缩影存储", - "reset_explainer": "如果这样做,请注意你的消息并不会被删除,但在重新建立索引时,搜索体验可能会降低片刻", - "reset_title": "重置活动存储?", - "warning_kind_files": "当前版本的 %(brand)s 不支持查看某些加密文件", - "warning_kind_files_app": "使用桌面端应用来查看所有加密文件", - "warning_kind_search": "当前版本的 %(brand)s 不支持搜索加密消息", - "warning_kind_search_app": "使用桌面端英语来搜索加密消息" + "error_initialising": "消息搜索初始化失败,请检查设置了解更多信息。", + "reset_button": "重置事件存储", + "reset_description": "你很可能不想重置事件索引存储", + "reset_explainer": "如果你这样做,请注意,你的任何消息都不会被删除,但在重新创建索引期间,搜索体验可能会暂时下降。", + "reset_title": "重置事件存储?", + "warning_kind_files": "此版本的 %(brand)s 不支持查看某些加密文件", + "warning_kind_files_app": "使用桌面 App 查看所有加密文件", + "warning_kind_search": "此版本的 %(brand)s 不支持搜索加密消息", + "warning_kind_search_app": "使用桌面 App 搜索加密消息" }, "setting": { "help_about": { - "access_token_detail": "你的访问令牌可以完全访问你的账户。不要将其与任何人分享。", + "access_token_detail": "访问 Token 可以完全控制账户,请勿分享给任何人。", "brand_version": "%(brand)s 版本:", - "clear_cache_reload": "清理缓存并重载", - "help_link": "关于 %(brand)s 的使用说明。", - "homeserver": "服务器介绍:%(homeserverUrl)s", - "title": "帮助及关于", + "clear_cache_reload": "清除缓存并重载", + "crypto_version": "加密组件版本:", + "dialog_title": "设置:帮助与关于", + "help_link": "点击此处获取有关使用 %(brand)s 的帮助。", + "homeserver": "主服务器 URL:%(homeserverUrl)s", + "identity_server": "身份服务器为 %(identityServerUrl)s", + "title": "帮助与关于", "versions": "版本" } }, "settings": { + "account": { + "dialog_title": "设置:账户", + "title": "账户" + }, "all_rooms_home": "在主页显示所有房间", - "all_rooms_home_description": "你加入的所有房间都会显示在主页。", - "always_show_message_timestamps": "总是显示消息时间戳", + "all_rooms_home_description": "你加入的所有房间都将显示在主页。", + "always_show_message_timestamps": "始终显示消息时间戳", "appearance": { + "bundled_emoji_font": "使用内置的 Emoji 样式", + "compact_layout": "显示紧凑文字及消息", + "compact_layout_description": "必须选择“现代布局”以启用此功能。", "custom_font": "使用系统字体", - "custom_font_description": "设置一个安装在你的系统上的字体名称,%(brand)s 会尝试使用它。", + "custom_font_description": "设置当前系统已安装的字体名称,%(brand)s 将尝试使用该字体。", "custom_font_name": "系统字体名称", - "custom_font_size": "使用自定义大小", - "custom_theme_error_downloading": "下载主题信息时发生错误。", - "custom_theme_invalid": "主题方案无效。", - "font_size": "字体大小", + "custom_font_size": "使用自定义字号", + "custom_theme_add": "添加自定义主题", + "custom_theme_downloading": "正在下载自定义主题…", + "custom_theme_error_downloading": "下载主题时出错", + "custom_theme_help": "输入要应用的自定义主题的 URL。", + "custom_theme_invalid": "主题协议无效。", + "dialog_title": "设置:外观", + "font_size": "文字大小", + "font_size_default": "%(fontSize)s(默认)", + "high_contrast": "高对比度", "image_size_default": "默认", - "image_size_large": "大", + "image_size_large": "大型", "layout_bubbles": "消息气泡", "layout_irc": "IRC(实验性)", - "match_system_theme": "匹配系统主题", - "timeline_image_size": "时间线中的图像大小" + "match_system_theme": "跟随系统主题", + "timeline_image_size": "时间线中的图像尺寸" }, - "automatic_language_detection_syntax_highlight": "启用语法高亮的自动语言检测", + "automatic_language_detection_syntax_highlight": "启用“自动检测语法高亮中的编程语言”", "autoplay_gifs": "自动播放 GIF", "autoplay_videos": "自动播放视频", - "big_emoji": "在聊天中启用大型表情符号", + "big_emoji": "在聊天中启用加大的 Emoji", "code_block_expand_default": "默认展开代码块", - "code_block_line_numbers": "在代码块中显示行号", - "disable_historical_profile": "在消息历史记录中显示用户当前的头像和姓名", - "emoji_autocomplete": "启用实时表情符号建议", - "enable_markdown": "启用Markdown", - "enable_markdown_description": "以/plain 开始发送 Markdown 格式的信息。", + "code_block_line_numbers": "显示代码块中的行号", + "disable_historical_profile": "在消息历史中显示用户当前名称与个人资料图像", + "discovery": { + "title": "如何找到你" + }, + "emoji_autocomplete": "在键入期间启用 Emoji 建议", + "enable_markdown": "启用 Markdown", + "enable_markdown_description": "在消息开头输入 /plain 以临时禁用 Markdown。", + "encryption": { + "advanced": { + "breadcrumb_first_description": "你的账户的详细信息、联系人、偏好设置与聊天列表将被保留", + "breadcrumb_page": "重置加密", + "breadcrumb_second_description": "你将丢失所有仅存储在服务器上的消息历史", + "breadcrumb_third_description": "你将需要再次验证你的所有设备与联系人", + "breadcrumb_title": "你确定要重置数字身份?", + "breadcrumb_title_cant_confirm": "你需要重置数字身份", + "breadcrumb_title_forgot": "忘记恢复密钥?你需要重置数字身份。", + "breadcrumb_title_sync_failed": "同步密钥存储失败。你需要重置数字身份。", + "breadcrumb_warning": "仅当你认为账户被盗时才这么做。", + "details_title": "加密详细信息", + "do_not_close_warning": "在重置完成之前请勿关闭此窗口", + "export_keys": "导出密钥", + "import_keys": "导入密钥", + "other_people_device_description": "警告:未向你明确验证(例如使用 Emoji)的用户、已验证用户的未验证设备都将不会收到你的加密消息。要使此更改生效需要重新启动应用程序。", + "other_people_device_label": "在加密房间中仅发送消息到已验证的用户", + "other_people_device_title": "其他人的设备", + "reset_identity": "重置密码学身份", + "reset_in_progress": "正在重置…", + "session_id": "会话 ID:", + "session_key": "会话密钥:", + "title": "高级" + }, + "confirm_key_storage_off": "你确定要持续关闭密钥存储?", + "confirm_key_storage_off_description": "如果你移除所有设备将丢失消息历史,并需要重新验证所有现有联系人。了解更多", + "delete_key_storage": { + "breadcrumb_page": "删除密钥存储", + "confirm": "删除密钥存储", + "description": "删除密钥存储将从服务器中移除密码学身份与消息密钥,并关闭以下安全功能:", + "list_first": "你将不会在新设备上拥有加密消息历史", + "list_second": "如果你不再登录任何设备,你将丢失对加密消息的访问权。", + "title": "你确定要关闭密钥存储并将其删除?" + }, + "device_not_verified_button": "验证此设备", + "device_not_verified_description": "你需要验证此设备才能查看加密设置。", + "device_not_verified_title": "设备未验证", + "dialog_title": "设置:加密", + "key_storage": { + "allow_key_storage": "允许密钥存储", + "description": "这将允许你在任意新设备上查看聊天历史,这对备份聊天和数字身份是必需的。", + "title": "密钥存储" + }, + "recovery": { + "change_recovery_confirm_button": "确认新的恢复密钥", + "change_recovery_confirm_description": "请在下面输入新的恢复密钥以完成验证。你的旧密钥将不再有效。", + "change_recovery_confirm_title": "输入新的恢复密钥", + "change_recovery_key": "更改恢复密钥", + "change_recovery_key_description": "在安全的地方记下新的恢复密钥。点击“继续”按钮以确认更改。", + "change_recovery_key_title": "更改恢复密钥?", + "description": "你的聊天已被端到端加密自动备份。如果你无法访问所有设备,则需要使用恢复密钥恢复备份并保留数字身份。", + "enter_key_error": "你输入的恢复密钥不正确。", + "enter_recovery_key": "输入恢复密钥", + "forgot_recovery_key": "忘记恢复密钥?", + "key_storage_warning": "你的密钥存储不同步。点击以下按钮之一即可修复此问题。", + "save_key_description": "不要与任何人分享!", + "save_key_title": "恢复密钥", + "set_up_recovery": "获取恢复密钥", + "set_up_recovery_confirm_button": "完成设置", + "set_up_recovery_confirm_description": "请输入上一屏幕显示的恢复密钥以完成恢复设置。", + "set_up_recovery_confirm_title": "输入恢复密钥以确认", + "set_up_recovery_description": "你的密钥存储受恢复密钥保护。如果设置后需要新的恢复密钥,可以选择“%(changeRecoveryKeyButton)s”重新创建。", + "set_up_recovery_save_key_description": "请将此恢复密钥保存到安全的地方,例如密码管理器、加密笔记或物理保险箱。", + "set_up_recovery_save_key_title": "保存恢复密钥到安全的地方", + "set_up_recovery_secondary_description": "点击“继续”后,我们将生成恢复密钥。", + "title": "备份" + }, + "title": "加密" + }, "general": { "account_management_section": "账户管理", "account_section": "账户", - "add_email_dialog_title": "添加邮箱", - "add_email_failed_verification": "邮箱验证失败:请确保你已点击邮件中的链接", - "add_email_instructions": "我们已向你发送了一封电子邮件,以验证你的地址。 请按照里面的说明操作,然后单击下面的按钮。", - "add_msisdn_confirm_body": "点击下面的按钮,以确认添加此电话号码。", + "add_email_dialog_title": "添加邮件地址", + "add_email_failed_verification": "邮件地址验证失败:请确保点击了邮件中的链接。", + "add_email_instructions": "我们已向你发送了一封邮件,用于验证你的地址。请按照邮件中的说明操作,然后点击以下按钮。", + "add_msisdn_confirm_body": "点击以下按钮确认添加此电话号码。", "add_msisdn_confirm_button": "确认添加电话号码", - "add_msisdn_confirm_sso_button": "通过单点登录以证明你的身份,并确认添加此电话号码。", + "add_msisdn_confirm_sso_button": "请确认使用单点登录添加此电话号码以证明身份。", "add_msisdn_dialog_title": "添加电话号码", - "add_msisdn_instructions": "一封短信已发送至 +%(msisdn)s。请输入其中包含的验证码。", - "add_msisdn_misconfigured": "MSISDN的新增/绑定流程配置错误", - "confirm_adding_email_body": "点击下面的按钮,以确认添加此邮箱地址。", - "confirm_adding_email_title": "确认添加邮箱", - "deactivate_confirm_body": "你确定要停用你的账户吗?此操作不可逆。", - "deactivate_confirm_body_sso": "通过单点登录证明你的身份并确认停用你的账户。", - "deactivate_confirm_content_1": "你将无法重新激活你的账户", - "deactivate_confirm_continue": "确认账户停用", + "add_msisdn_instructions": "一条短信已发送到 +%(msisdn)s。请输入短信中包含的验证码。", + "add_msisdn_misconfigured": "添加或绑定 MSISDN 流程配置错误", + "allow_spellcheck": "允许拼写检查", + "application_language": "应用程序语言", + "application_language_reload_hint": "选择另一种语言将重载 App", + "avatar_open_menu": "打开头像菜单", + "avatar_remove_progress": "正在移除图像…", + "avatar_save_progress": "正在上传图像…", + "avatar_upload_error_text": "不支持的文件格式或图像大于 %(size)s。", + "avatar_upload_error_text_generic": "文件格式可能不受支持。", + "avatar_upload_error_title": "无法上传头像", + "confirm_adding_email_body": "点击以下按钮确认添加此邮件地址。", + "confirm_adding_email_title": "确认添加邮件", + "deactivate_confirm_body": "你确定要停用账户?这将不可逆转。", + "deactivate_confirm_body_sso": "要确认停用你的账户,请使用单点登录以证明身份。", + "deactivate_confirm_content": "确认要停用你的账户。如果你继续:", + "deactivate_confirm_content_1": "你将无法重新激活账户", + "deactivate_confirm_content_2": "你将无法再登录", + "deactivate_confirm_content_3": "任何人都无法重复使用你的用户名 (MXID),包括你自己:此用户名将保持不可用状态。", + "deactivate_confirm_content_4": "你将离开你所在的所有房间与私聊", + "deactivate_confirm_content_5": "你将被从身份服务器中移除:你的好友将无法再通过你的邮件地址或电话号码找到你。", + "deactivate_confirm_content_6": "你的旧消息仍然会被接收者看到,就像你过去发送的邮件一样。是否对以后加入房间的人员隐藏你发送的消息?", + "deactivate_confirm_continue": "确认停用账户", + "deactivate_confirm_erase_label": "隐藏我的信息不被新加入者看到", "deactivate_section": "停用账户", - "deactivate_warning": "停用你的账户是永久性动作——小心!", - "discovery_email_empty": "你在上方添加邮箱后发现选项将会出现。", - "discovery_email_verification_instructions": "验证你的收件箱中的链接", - "discovery_msisdn_empty": "你添加电话号码后发现选项将会出现。", - "discovery_needs_terms": "同意身份服务器(%(serverName)s)的服务协议以允许自己被通过邮件地址或电话号码发现。", - "email_address_in_use": "此邮箱地址已被使用", - "email_address_label": "电子邮箱地址", - "email_not_verified": "你的邮件地址尚未被验证", - "email_verification_instructions": "点击你所收到的电子邮件中的链接进行验证,然后再次点击继续。", - "emails_heading": "电子邮箱地址", - "error_add_email": "无法添加邮箱地址", - "error_deactivate_communication": "联系服务器时出现问题。请重试。", - "error_deactivate_invalid_auth": "服务器未返回有效认证信息。", - "error_deactivate_no_auth": "服务器不要求任何认证", - "error_email_verification": "无法验证邮箱地址。", - "error_invalid_email": "邮箱地址格式错误", - "error_invalid_email_detail": "这似乎不是有效的邮箱地址", + "deactivate_warning": "停用账户是一项永久性操作,请务必小心!", + "discovery_email_empty": "添加邮件后,将出现发现选项。", + "discovery_email_verification_instructions": "验证收件箱中的链接", + "discovery_msisdn_empty": "添加电话号码后将出现发现选项。", + "discovery_needs_terms": "同意身份服务器 (%(serverName)s) 的服务条款,以便允许他人通过邮件地址或电话号码找到你。", + "discovery_needs_terms_title": "让人们找到你", + "display_name": "显示名称", + "display_name_error": "无法设置显示名称", + "email_adding_unsupported_by_hs": "此主服务器不支持向账户添加邮件地址。", + "email_address_in_use": "此邮件地址已被使用", + "email_address_label": "邮件地址", + "email_not_verified": "你的邮件地址尚未经过验证", + "email_verification_instructions": "点击你收到的邮件中的链接进行验证,然后再次点击“继续”。", + "emails_heading": "邮件地址", + "error_add_email": "无法添加邮件地址", + "error_deactivate_communication": "与服务器通信时出现问题。请重试。", + "error_deactivate_invalid_auth": "服务器未能返回有效的身份验证信息。", + "error_deactivate_no_auth": "服务器无需任何身份验证", + "error_email_verification": "无法验证邮件地址。", + "error_invalid_email": "无效邮件地址", + "error_invalid_email_detail": "这似乎不是有效的邮件地址", "error_msisdn_verification": "无法验证电话号码。", - "error_password_change_403": "修改密码失败。确认原密码输入正确吗?", + "error_password_change_403": "密码更改失败。密码是否正确?", + "error_password_change_http": "%(errorMessage)s(HTTP 状态码 %(httpStatus)s)", + "error_password_change_title": "更改密码时出错", + "error_password_change_unknown": "更改密码时出现未知错误 (%(stringifiedError)s)", "error_remove_3pid": "无法移除联系人信息", - "error_revoke_email_discovery": "无法撤消电子邮件地址共享", - "error_revoke_msisdn_discovery": "无法撤销电话号码共享", - "error_share_email_discovery": "无法共享邮件地址", - "error_share_msisdn_discovery": "无法共享电话号码", - "identity_server_no_token": "找不到身份访问令牌", - "identity_server_not_set": "身份服务器未设置", - "language_section": "语言与地区", + "error_revoke_email_discovery": "无法撤消分享的邮件地址", + "error_revoke_msisdn_discovery": "无法找到与此电话号码对应的分享", + "error_share_email_discovery": "无法分享邮件地址", + "error_share_msisdn_discovery": "无法分享电话号码", + "identity_server_no_token": "未找到身份访问 Token", + "identity_server_not_set": "未设置身份服务器", + "invalid_phone_number": "提供的电话号码似乎无效。", + "language_section": "语言", + "msisdn_adding_unsupported_by_hs": "此主服务器不支持向账户添加电话号码。", "msisdn_in_use": "此电话号码已被使用", "msisdn_label": "电话号码", "msisdn_verification_field_label": "验证码", - "msisdn_verification_instructions": "请输入短信中发送的验证码。", + "msisdn_verification_instructions": "请输入通过短信发送的验证码。", "msisdns_heading": "电话号码", - "password_change_section": "设置一个新密码", - "password_change_success": "你的密码已成功更改。", - "remove_email_prompt": "删除 %(email)s 吗?", - "remove_msisdn_prompt": "删除 %(phone)s 吗?", - "spell_check_locale_placeholder": "选择区域设置" + "oidc_manage_button": "管理账户", + "password_change_section": "设置新的账户密码…", + "password_change_success": "密码已成功更改。", + "personal_info": "个人信息", + "profile_subtitle": "这是你在 App 上向他人展示的形象。", + "profile_subtitle_oidc": "你的账户由身份提供者单独管理,因此某些个人信息无法在此处更改。", + "remove_email_prompt": "移除 %(email)s?", + "remove_msisdn_prompt": "移除 %(phone)s?", + "spell_check_locale_placeholder": "选择区域", + "unable_to_load_emails": "无法加载邮件地址", + "unable_to_load_msisdns": "无法载入电话号码", + "username": "用户名" }, - "inline_url_previews_default": "默认启用行内URL预览", - "insert_trailing_colon_mentions": "在消息开头的提及用户的地方后面插入尾随冒号", - "jump_to_bottom_on_send": "发送消息时跳转到时间线底部", + "inline_url_previews_default": "启用预览", + "inline_url_previews_encrypted": "在加密房间启用 URL 预览", + "insert_trailing_colon_mentions": "在位于消息开头的用户提及后插入一个冒号", + "invite_controls": { + "default_label": "允许用户邀请你到房间" + }, + "jump_to_bottom_on_send": "发送消息后跳转到时间线末尾", "key_backup": { "setup_secure_backup": { - "cancel_warning": "如果你现在取消,你可能会丢失加密的消息和数据,如果你丢失了登录信息的话。", - "confirm_security_phrase": "确认你的安全短语", - "description": "通过在你的服务器上备份加密密钥来防止丢失你对加密消息和数据的访问权。", - "download_or_copy": "%(downloadButton)s或%(copyButton)s", - "enter_phrase_title": "输入安全短语", - "enter_phrase_to_confirm": "再次输入你的安全短语进行确认。", - "generate_security_key_description": "我们将为您生成一个安全密钥,将其存储在安全的地方,例如密码管理器或保险箱。", - "generate_security_key_title": "生成一个安全密钥", - "pass_phrase_match_failed": "不匹配。", - "pass_phrase_match_success": "匹配成功!", - "phrase_strong_enough": "棒!这个安全短语看着够强。", + "backup_setup_success_description": "你的密钥正在从此设备备份。", + "backup_setup_success_title": "安全备份成功", + "cancel_warning": "如果你现在取消,在无法访问登录信息的情况下,可能会丢失加密消息与数据。", + "confirm_security_phrase": "确认安全口令", + "description": "通过在服务器上备份加密密钥,防止丢失对加密消息和数据的访问权。", + "download_or_copy": "%(downloadButton)s 或 %(copyButton)s", + "enter_phrase_description": "输入只有你知道的安全口令用于保护你的数据。为了安全起见,请勿重复使用账户密码。", + "enter_phrase_title": "输入安全口令", + "enter_phrase_to_confirm": "再次输入安全口令以确认。", + "generate_security_key_description": "我们将为你生成一个恢复密钥,以便你将其存储在安全的地方,例如密码管理器或保险箱。", + "generate_security_key_title": "生成恢复密钥", + "pass_phrase_match_failed": "不匹配", + "pass_phrase_match_success": "匹配!", + "phrase_strong_enough": "很好!此口令看起来足够强。", "secret_storage_query_failure": "无法查询秘密存储状态", - "security_key_safety_reminder": "将您的安全密钥存放在安全的地方,例如密码管理器或保险箱,因为它用于保护您的加密数据。", - "set_phrase_again": "返回重新设置。", - "settings_reminder": "你也可以在设置中设置安全备份并管理你的密钥。", - "title_confirm_phrase": "确认安全密码", - "title_save_key": "保存你的安全密钥", - "title_set_phrase": "设置一个安全密码", + "security_key_safety_reminder": "请将恢复密钥存储在安全的地方,例如密码管理器或保险箱,因为它用于保护你的加密数据。", + "set_phrase_again": "返回以再次设置。", + "settings_reminder": "你还可以在“设置”中设置安全备份与管理密钥。", + "title_confirm_phrase": "确认安全口令", + "title_save_key": "保存恢复密钥", + "title_set_phrase": "设置安全口令", "unable_to_setup": "无法设置秘密存储", - "use_different_passphrase": "使用不同的口令词组?", - "use_phrase_only_you_know": "使用一个只有你知道的密码,你也可以保存安全密钥以供备份使用。" + "use_different_passphrase": "使用不同的口令?", + "use_phrase_only_you_know": "使用只有你知道的密码,并可选择保存恢复密钥以用于备份。" } }, "key_export_import": { - "confirm_passphrase": "确认口令词组", - "enter_passphrase": "输入口令词组", - "export_description_1": "此操作允许你将加密房间中收到的消息的密钥导出为本地文件。你可以将文件导入其他 Matrix 客户端,以便让别的客户端在未收到密钥的情况下解密这些消息。", + "confirm_passphrase": "确认口令", + "enter_passphrase": "输入口令", + "export_description_1": "此过程允许你将加密房间中收到的消息的密钥导出到本地文件。你之后可以将该文件导入到另一个 Matrix 客户端以便该客户端也能解密这些消息。", + "export_description_2": "导出的文件将允许任何可以读取它的人解密你可以看到的任何加密消息,应小心确保其安全。为此你应该在下面输入一个唯一的口令,该口令仅用于加密导出的数据,并且只能使用相同的口令导入数据。", "export_title": "导出房间密钥", "file_to_import": "要导入的文件", - "import_description_1": "此操作允许你导入之前从另一个 Matrix 客户端中导出的加密密钥文件。导入完成后,你将能够解密那个客户端可以解密的加密消息。", - "import_description_2": "导出文件受口令词组保护。你应该在此输入口令词组以解密此文件。", + "import_description_1": "此过程允许你导入以前从其它 Matrix 客户端导出的加密密钥,然后你将能够解密其它客户端可以解密的任何消息。", + "import_description_2": "已导出的文件使用口令进行保护。你应该在此处输入口令来解密此文件。", "import_title": "导入房间密钥", - "phrase_cannot_be_empty": "口令词组不能为空", - "phrase_must_match": "口令词组必须匹配" + "phrase_cannot_be_empty": "口令不能为空", + "phrase_must_match": "口令必须匹配", + "phrase_strong_enough": "很好!此口令看起来足够强" }, "keyboard": { + "dialog_title": "设置:键盘", "title": "键盘" }, + "labs": { + "dialog_title": "设置:实验室" + }, + "labs_mjolnir": { + "dialog_title": "设置:已忽略的用户" + }, + "media_preview": { + "hide_avatars": "隐藏房间与邀请者的头像", + "hide_media": "始终隐藏", + "media_preview_description": "点击隐藏的媒体即可将其恢复显示", + "media_preview_label": "在时间线上显示媒体", + "show_in_private": "在私有房间", + "show_media": "始终显示" + }, + "not_supported": "服务器尚未实现此功能。", "notifications": { - "enable_audible_notifications_session": "为此会话启用声音通知", + "default_setting_description": "此设置将默认应用于你的所有房间。", + "default_setting_section": "要接收的通知类型(默认设置)", + "desktop_notification_message_preview": "在桌面通知中显示消息预览", + "dialog_title": "设置:通知", + "email_description": "接收错过的通知的邮件摘要", + "email_section": "邮件摘要", + "email_select": "选择要向其发送摘要的邮件地址。可以在中管理邮件地址。", + "enable_audible_notifications_session": "为此会话的通知启用声音", "enable_desktop_notifications_session": "为此会话启用桌面通知", - "enable_email_notifications": "为 %(email)s 启用电子邮件通知", + "enable_email_notifications": "为 %(email)s 启用邮件通知", "enable_notifications_account": "为此账户启用通知", - "enable_notifications_account_detail": "关闭以在你全部设备和会话上停用通知", - "enable_notifications_device": "为此设备启用通知", - "error_loading": "加载你的通知设置时出错。", - "error_permissions_denied": "%(brand)s 没有通知发送权限 - 请检查你的浏览器设置", - "error_permissions_missing": "%(brand)s 没有通知发送权限 - 请重试", - "error_saving": "保存通知偏好时出错", - "error_saving_detail": "保存你的通知偏好时出错。", + "enable_notifications_account_detail": "关闭此选项将禁用你所有设备及会话的通知", + "enable_notifications_device": "启用此设备的通知", + "error_loading": "加载通知设置时出错。", + "error_permissions_denied": "%(brand)s 无权向你发送通知,请检查浏览器设置。", + "error_permissions_missing": "%(brand)s 未被授予发送通知的权限,请重试。", + "error_saving": "保存通知设置时出错", + "error_saving_detail": "保存通知偏好时出错。", "error_title": "无法启用通知", - "messages_containing_keywords": "当消息包含关键词时", + "error_updating": "更新通知首选项时出错。请尝试再次切换选项。", + "invites": "邀请到房间", + "keywords": "在房间中使用特定关键词时显示 标记。", + "keywords_prompt": "在此处输入关键词、拼写变体或昵称", + "labs_notice_prompt": "更新:我们简化了通知设置使选项更易于查找。你曾经选择的某些自定义设置不会在此处显示,但它们仍然处于活动状态。如果继续,你的某些设置可能会更改。了解更多", + "mentions_keywords": "提及与关键词", + "mentions_keywords_only": "仅提及与关键词", + "messages_containing_keywords": "消息包含的关键词", "noisy": "响铃", + "notices": "由机器人发送的消息", + "notify_at_room": "当有人提及使用“@room”时通知", + "notify_keyword": "当有人使用关键字时通知", + "notify_mention": "当有人提及使用“@displayname”或“%(mxid)s”时通知", + "other_section": "你可能感兴趣的其它内容:", + "people_mentions_keywords": "人员、提及与关键词", + "play_sound_for_description": "此设置将默认应用于你所有设备中的所有房间。", + "play_sound_for_section": "播放声音", "push_targets": "通知目标", - "rule_call": "当受到通话邀请时", - "rule_contains_display_name": "当消息包含我的显示名称时", - "rule_contains_user_name": "当消息包含我的用户名时", + "quick_actions_mark_all_read": "所有消息设为已读", + "quick_actions_reset": "重置为默认设置", + "quick_actions_section": "快速设置", + "room_activity": "新产生的房间活动、升级与状态消息", + "rule_call": "通话邀请", + "rule_contains_display_name": "包含我的显示名称的消息", + "rule_contains_user_name": "包含我的用户名的消息", "rule_encrypted": "群聊中的加密消息", - "rule_encrypted_room_one_to_one": "私聊中的加密消息", - "rule_invite_for_me": "当我被邀请进入房间", + "rule_encrypted_room_one_to_one": "一对一聊天中的加密消息", + "rule_invite_for_me": "当我受邀到房间", "rule_message": "群聊中的消息", - "rule_room_one_to_one": "私聊中的消息", - "rule_roomnotif": "当消息包含 @room 时", - "rule_suppress_notices": "由机器人发出的消息", - "rule_tombstone": "当房间升级时", - "show_message_desktop_notification": "在桌面通知中显示消息" + "rule_room_one_to_one": "一对一聊天中的消息", + "rule_roomnotif": "包含 @room 的消息", + "rule_suppress_notices": "由机器人发送的消息", + "rule_tombstone": "当房间升级时。", + "show_message_desktop_notification": "在桌面通知中显示消息内容", + "voip": "音频与视频通话" }, "preferences": { - "always_show_menu_bar": "总是显示窗口菜单栏", - "autocomplete_delay": "自动完成延迟(毫秒)", + "Electron.enableContentProtection": "阻止窗口内容被其它应用程序捕获", + "Electron.enableHardwareAcceleration": "启用硬件加速(需要重新启动 %(appName)s 以生效)", + "always_show_menu_bar": "始终显示窗口菜单栏", + "autocomplete_delay": "自动补全延时(毫秒)", "code_blocks_heading": "代码块", - "compact_modern": "使用更紧凑的“现代”布局", + "compact_modern": "使用更简洁的“现代”布局", "composer_heading": "编辑器", + "default_timezone": "浏览器默认(%(timezone)s)", + "dialog_title": "设置:偏好", + "enable_content_protection": "启用内容保护", "enable_hardware_acceleration": "启用硬件加速", - "enable_tray_icon": "显示托盘图标并在关闭时最小化窗口至托盘", + "enable_tray_icon": "当窗口关闭时最小化其到托盘", "keyboard_heading": "键盘快捷键", - "keyboard_view_shortcuts_button": "要查看所有的键盘快捷键,点击此处。", - "media_heading": "图片、GIF 和视频", - "presence_description": "与别人分享你的活动和状态。", - "rm_lifetime": "已读标记生存期(毫秒)", - "rm_lifetime_offscreen": "已读标记屏幕外生存期(毫秒)", + "keyboard_view_shortcuts_button": "要查看所有键盘快捷键请点击此处。", + "link_previews_description": "在消息下方显示链接相关信息", + "link_previews_heading": "链接预览", + "media_heading": "图像、GIF 与视频", + "presence_description": "向其他人分享你的活跃情况。", + "publish_timezone": "在公开资料上公布时区", + "rm_lifetime": "已读标记生存时间(毫秒)", + "rm_lifetime_offscreen": "已读标记屏外生存时间(毫秒)", + "room_directory_heading": "房间目录", "room_list_heading": "房间列表", + "show_avatars_pills": "在用户、房间与事件提及中显示头像", "show_polls_button": "显示投票按钮", - "surround_text": "输入特殊字符时圈出选定的文本", - "time_heading": "显示的时间戳" + "startup_window_behaviour_label": "启动时的窗口行为", + "surround_text": "当键入特殊字符时圈选文字", + "time_heading": "显示时间", + "user_timezone": "设置时区" }, - "prompt_invite": "在发送邀请之前提示可能无效的 Matrix ID", - "replace_plain_emoji": "自动取代纯文本为表情符号", + "prompt_invite": "向可能无效的 Matrix ID 发送邀请前提示", + "replace_plain_emoji": "自动替换纯文本 Emoji", "security": { - "bulk_options_accept_all_invites": "接受所有 %(invitedRooms)s 邀请", - "bulk_options_reject_all_invites": "拒绝所有 %(invitedRooms)s 的邀请", + "analytics_description": "分享匿名数据已帮助我们识别问题。不涉及个人隐私及第三方。", + "bulk_options_accept_all_invites": "接受所有 %(invitedRooms)s 的邀请", + "bulk_options_reject_all_invites": "拒绝所有 %(invitedRooms)s 邀请", "bulk_options_section": "批量选择", - "e2ee_default_disabled_warning": "你的服务器管理员默认关闭了私人房间和私聊中的端到端加密。", - "enable_message_search": "在加密房间中启用消息搜索", + "dehydrated_device_description": "离线设备功能允许你即使未登录任何设备也能接收加密消息。", + "dehydrated_device_enabled": "离线设备已启用", + "dialog_title": "设置:安全与隐私", + "e2ee_default_disabled_warning": "私有房间与私聊默认的端到端加密已被服务器管理员禁用。", + "enable_message_search": "在加密房间启用消息搜索", "encryption_section": "加密", - "ignore_users_empty": "你没有设置忽略用户。", + "ignore_users_empty": "暂无已忽略的用户", "ignore_users_section": "已忽略的用户", "key_backup_algorithm": "算法:", - "message_search_disable_warning": "如果被禁用,加密房间内的消息不会显示在搜索结果中。", - "message_search_disabled": "在本地安全地缓存加密消息以使其出现在搜索结果中。", + "message_search_disable_warning": "如果停用此功能,来自加密房间的消息将不会显示在搜索结果中。", + "message_search_disabled": "在安全地在本地缓存加密消息以使其出现在搜索结果中。", "message_search_enabled": { - "one": "使用%(size)s存储%(rooms)s个房间的消息。在本地安全地缓存已加密的消息以使其出现在搜索结果中。", - "other": "使用%(size)s存储%(rooms)s个房间的消息。在本地安全地缓存已加密的消息以使其出现在搜索结果中。" + "one": "占用 %(size)s 的空间以存储来自 %(rooms)s 个房间的消息,加密消息已安全地在本地缓存,并可以使其显示在搜索结果中。", + "other": "占用 %(size)s 的空间以存储来自 %(rooms)s 个房间的消息,加密消息已安全地在本地缓存,并可以使其显示在搜索结果中。" }, "message_search_failed": "消息搜索初始化失败", "message_search_indexed_messages": "已索引的消息:", "message_search_indexed_rooms": "已索引的房间:", - "message_search_indexing": "正在索引:%(currentRoom)s", - "message_search_indexing_idle": "现在没有为任何房间索引消息。", + "message_search_indexing": "当前正在索引:%(currentRoom)s", + "message_search_indexing_idle": "尚未为任何房间索引消息。", "message_search_intro": "%(brand)s 正在安全地在本地缓存加密消息以使其出现在搜索结果中:", - "message_search_room_progress": "%(totalRooms)s 中之 %(doneRooms)s", + "message_search_pending_rooms": "等待索引的房间:%(pendingRooms)s", + "message_search_room_progress": "%(doneRooms)s 个房间中的 %(totalRooms)s 个", "message_search_section": "消息搜索", - "message_search_sleep_time": "消息下载速度。", + "message_search_sleep_time": "消息下载速度", "message_search_space_used": "已使用空间:", - "message_search_unsupported": "%(brand)s缺少安全地在本地缓存加密信息所必须的部件。如果你想实验此功能,请构建一个自定义的带有搜索部件的%(brand)s桌面版。", - "message_search_unsupported_web": "%(brand)s 在浏览器中运行时不能安全地在本地缓存加密信息。请使用%(brand)s 桌面版以使加密信息出现在搜索结果中。", - "record_session_details": "记录客户端名称、版本和url以便在会话管理器里更易识别", - "send_analytics": "发送统计数据", - "strict_encryption": "永不从本会话向未验证的会话发送加密消息" + "message_search_unsupported": "%(brand)s 缺少一些在本地安全缓存加密消息所需的组件。如果你想试用此功能,请构建一个自定义的 %(brand)s 桌面,并添加搜索组件。", + "message_search_unsupported_web": "%(brand)s 在 Web 浏览器中运行时无法安全地在本地缓存加密消息。请使用 %(brand)s Desktop 使加密消息出现在搜索结果中。", + "record_session_details": "在会话管理器中记录客户端名称、版本及 URL 以更易于识别", + "send_analytics": "发送分析数据", + "strict_encryption": "仅向已验证用户发送信息" }, "send_read_receipts": "发送已读回执", "send_read_receipts_unsupported": "你的服务器不支持禁用发送已读回执。", - "send_typing_notifications": "发送正在输入通知", + "send_typing_notifications": "发送键入通知", "sessions": { - "best_security_note": "为获得最佳安全性,请验证您的设备并把您不再信任或使用的设备注销。", + "best_security_note": "为了最佳的安全性请验证此会话,并移除任何你不认识或不再使用的会话。", + "browser": "浏览器", "confirm_sign_out": { - "one": "确认登出此设备", - "other": "确认登出这些设备" + "one": "确认移除此设备", + "other": "确认移除这些设备" }, "confirm_sign_out_body": { - "one": "单击下面的按钮以确认登出此设备。", - "other": "单击下面的按钮以确认登出这些设备。" + "one": "点击以下按钮确认移除此设备", + "other": "点击以下按钮确认移除这些设备" }, "confirm_sign_out_continue": { - "one": "注销设备", - "other": "注销设备" + "one": "移除设备", + "other": "移除设备" }, "confirm_sign_out_sso": { - "one": "确认注销此设备需要使用单点登录来证明您的身份。", - "other": "确认注销这些设备需要使用单点登录来证明你的身份。" + "one": "通过使用单点登录验证您的身份以确认移除此设备。", + "other": "通过使用单点登录验证您的身份以确认移除这些设备。" }, "current_session": "当前会话", - "details_heading": "会话详情", - "device_unverified_description": "验证此会话或从之登出,以取得最佳安全性和可靠性。", - "device_verified_description": "此会话已准备好进行安全的消息传输。", + "desktop_session": "桌面会话", + "details_heading": "会话详细信息", + "device_unverified_description": "验证或注销此会话以获得最佳安全性与可靠性。", + "device_unverified_description_current": "验证当前会话以增强安全消息传递。", + "device_verified_description": "此会话的安全消息传递已就绪。", + "device_verified_description_current": "当前会话的安全消息传递已就绪。", + "dialog_title": "设置:会话", + "error_pusher_state": "设置推送机制失败", + "error_set_name": "设置会话名称失败", "filter_all": "全部", - "filter_inactive": "不活跃", - "filter_inactive_description": "%(inactiveAgeDays)s天或更久不活跃", + "filter_inactive": "静默", + "filter_inactive_description": "处于静默状态 %(inactiveAgeDays)s 天甚至更长时间", "filter_label": "筛选设备", - "filter_unverified_description": "尚未准备好安全通信", - "filter_verified_description": "准备好进行安全通信了", - "inactive_days": "%(inactiveAgeDays)s+天不活跃", - "inactive_sessions": "不活跃的会话", - "ip": "IP地址", - "last_activity": "上次活动", - "no_inactive_sessions": "未找到不活跃的会话。", + "filter_unverified_description": "安全消息传递未就绪", + "filter_verified_description": "安全消息传递已就绪", + "hide_details": "隐藏详细信息", + "inactive_days": "已持续静默至少 %(inactiveAgeDays)s 天", + "inactive_sessions": "静默会话", + "inactive_sessions_explainer_1": "静默会话是指你一段时间内未使用,但仍会继续接收加密密钥的会话。", + "inactive_sessions_explainer_2": "移除静默会话可提高安全性与性能,并让你更容易识别新的会话是否可疑。", + "inactive_sessions_list_description": "考虑移除不再使用的旧会话(%(inactiveAgeDays)s 天或更早)。", + "ip": "IP 地址", + "last_activity": "最后活跃于", + "manage": "管理此会话", + "mobile_session": "移动端会话", + "n_sessions_selected": { + "one": "已选择 %(count)s 个会话", + "other": "已选择 %(count)s 个会话" + }, + "no_inactive_sessions": "未找到静默的会话。", "no_sessions": "未找到会话。", "no_unverified_sessions": "未找到未验证的会话。", "no_verified_sessions": "未找到已验证的会话。", - "other_sessions_heading": "其他会话", + "os": "操作系统", + "other_sessions_heading": "其它会话", + "push_heading": "推送通知", + "push_subheading": "允许此会话接收通知推送", + "push_toggle": "切换此会话的推送通知。", + "rename_form_caption": "请注意,会话名称也对与你通信的人可见。", "rename_form_heading": "重命名会话", + "rename_form_learn_more": "正在重命名会话", + "rename_form_learn_more_description_1": "你加入的私聊与房间中的其他用户可以查看你的完整会话列表。", + "rename_form_learn_more_description_2": "这不仅能使其确信自己确实在与你通话,还能看到你在此处输入的会话名称。", "security_recommendations": "安全建议", - "security_recommendations_description": "按照以下建议来提高您的帐户安全性。", + "security_recommendations_description": "通过以下建议增强账户安全性", "session_id": "会话 ID", + "show_details": "显示详细信息", + "sign_in_with_qr": "关联新设备", + "sign_in_with_qr_button": "显示二维码", + "sign_in_with_qr_description": "使用二维码登录到另一设备并设置安全消息传递。", + "sign_in_with_qr_unsupported": "账户提供者不支持", + "sign_out": "移除此会话", + "sign_out_all_other_sessions": "移除所有其它会话(%(otherSessionsCount)s)", "sign_out_confirm_description": { - "other": "你确定要从这 %(count)s 个会话中退出吗?" + "one": "你确定要移除 %(count)s 个会话?", + "other": "你确定要移除 %(count)s 个会话?" + }, + "sign_out_n_sessions": { + "one": "移除 %(count)s 个会话", + "other": "移除 %(count)s 个会话" }, "title": "会话", + "unknown_session": "未知会话类型", "unverified_session": "未验证的会话", + "unverified_session_explainer_1": "此会话不支持加密,因此无法验证。", + "unverified_session_explainer_2": "使用此会话时,你将无法加入启用加密的房间。", + "unverified_session_explainer_3": "为了获得最佳的安全性与隐私性,建议使用支持加密的 Matrix 客户端。", "unverified_sessions": "未验证的会话", - "unverified_sessions_list_description": "验证你的会话以增强消息传输的安全性,或从那些你不认识或不再使用的会话登出。", + "unverified_sessions_explainer_1": "未验证的会话是指已使用你的凭据登录但尚未通过你的数字身份确认的会话。", + "unverified_sessions_explainer_2": "你应特别确认自己能够识别这些会话,因为它们可能代表你的账户被未经授权使用。", + "unverified_sessions_list_description": "验证此会话以强化安全消息传递,或移除你不认识或不再使用的会话。", + "url": "URL", "verified_session": "已验证的会话", "verified_sessions": "已验证的会话", - "verified_sessions_list_description": "为了最佳安全性,请从任何不认识或不再使用的会话登出。", - "verify_session": "验证会话" + "verified_sessions_explainer_1": "已验证会话是指已经过你的数字身份确认的会话。", + "verified_sessions_explainer_2": "这意味着你拥有解锁加密消息所需的所有密钥,并向其他用户确认你信任此会话。", + "verified_sessions_list_description": "为了最佳的安全性,请移除任何你不认识或不再使用的会话。", + "verify_session": "验证会话", + "web_session": "Web 会话" }, - "show_avatar_changes": "显示个人头像变更", - "show_breadcrumbs": "在房间列表上方显示最近浏览过的房间的快捷方式", - "show_chat_effects": "显示聊天特效(如收到五彩纸屑时的动画效果)", - "show_displayname_changes": "显示显示名称更改", - "show_join_leave": "显示加入/离开消息(邀请/移除/封禁不受影响)", + "show_avatar_changes": "显示个人资料图像更改", + "show_breadcrumbs": "在房间列表之上显示最近访问的房间的捷径", + "show_chat_effects": "显示聊天特效(例如当收到“五彩纸屑”时)", + "show_displayname_changes": "显示用户的“显示名称更改”", + "show_join_leave": "显示加入及离开消息(邀请、移除及封禁不受影响)", + "show_message_previews": "显示消息预览", "show_nsfw_content": "显示 NSFW 内容", - "show_read_receipts": "显示其他用户发送的已读回执", - "show_redaction_placeholder": "已移除的消息显示为一个占位符", + "show_read_receipts": "显示其他用户的已读回执", + "show_redaction_placeholder": "为已被移除的消息显示占位符", "show_stickers_button": "显示贴纸按钮", - "show_typing_notifications": "显示正在输入通知", + "show_typing_notifications": "显示用户的键入通知", + "showbold": "在房间列表上显示所有活动(用于未读消息的圆点与数字)", "sidebar": { - "metaspaces_favourites_description": "将所有你最爱的房间和人集中在一处。", + "dialog_title": "设置:边栏", + "metaspaces_favourites_description": "集中所有设为收藏的房间与人员分组在一处。", "metaspaces_home_all_rooms": "显示所有房间", - "metaspaces_home_all_rooms_description": "在主页展示你所有的房间,即使它们是在一个空间里。", - "metaspaces_home_description": "对于了解所有事情的概况来说,主页很有用。", - "metaspaces_orphans": "空间之外的房间", - "metaspaces_orphans_description": "将所有你那些不属于某个空间的房间集中一处。", - "metaspaces_people_description": "将你所有的联系人集中一处。", + "metaspaces_home_all_rooms_description": "在主页显示所有房间,即使它们位于不同的空间。", + "metaspaces_home_description": "主页有助于概览所有对话。", + "metaspaces_orphans": "空间外的房间", + "metaspaces_orphans_description": "集中所有不属于任何空间的房间在一处。", + "metaspaces_people_description": "集中所有人员在一处。", "metaspaces_subsection": "要显示的空间", - "title": "侧边栏" + "metaspaces_video_rooms": "视频房间与会议", + "metaspaces_video_rooms_description": "集中所有私有视频房间与会议在一处。", + "metaspaces_video_rooms_description_invite_extension": "在会议中,你可以邀请 Matrix 生态以外的人。", + "spaces_explainer": "空间是对房间与人员分组的方式,除了你所在的空间,还可以使用一些预置空间。", + "title": "边栏" }, - "use_12_hour_format": "使用 12 小时制显示时间戳 (下午 2:30)", - "use_command_enter_send_message": "使用 Command + Enter 发送消息", - "use_command_f_search": "使用 Command + F 搜索时间线", - "use_control_enter_send_message": "使用Ctrl + Enter发送消息", - "use_control_f_search": "使用 Ctrl + F 搜索时间线", + "start_automatically": { + "disabled": "否", + "enabled": "是", + "label": "登录时启动 %(brand)s", + "minimised": "最小化" + }, + "tac_only_notifications": "仅在消息列中枢显示通知", + "use_12_hour_format": "以 12 小时制显示时间戳(例如:下午 2:30)", + "use_command_enter_send_message": "按 Command + Enter 发送消息", + "use_command_f_search": "允许按 Command + F 搜索时间线", + "use_control_enter_send_message": "允许按 Ctrl + Enter 发送消息", + "use_control_f_search": "允许按 Ctrl + F 搜索时间线", "voip": { - "allow_p2p": "允许1:1通话的点对点", - "allow_p2p_description": "启用后,对方可能能看到你的IP地址", + "allow_p2p": "允许点对点进行一对一通话", + "allow_p2p_description": "启用此项后, 第三方可能会看到你的 IP 地址", "audio_input_empty": "未检测到麦克风", "audio_output": "音频输出", - "audio_output_empty": "未检测到可用的音频输出方式", - "auto_gain_control": "自动获得控制权", + "audio_output_empty": "未检测到音频输出", + "auto_gain_control": "自动增益控制", "connection_section": "连接", + "dialog_title": "设置:语音与视频", "echo_cancellation": "回声消除", - "enable_fallback_ice_server": "允许使用官方的ICE辅助服务器 (%(server)s)", - "enable_fallback_ice_server_description": "仅当你的服务器不提供时才会使用。你的IP地址在通话期间会被知晓。", + "echo_cancellation_description": "在通话期间移除回声。此设置亦将应用于 Element Call。", + "enable_fallback_ice_server": "允许备选的通话辅助服务器", + "enable_fallback_ice_server_description": "仅用于你所在的主服务器不提供时。你的 IP 地址会在通话期间被分享。", "mirror_local_feed": "镜像本地视频源", - "missing_permissions_prompt": "缺少媒体权限,点击下面的按钮以请求权限。", - "noise_suppression": "噪音抑制", + "missing_permissions_prompt": "缺少媒体权限,点击按钮以请求。", + "noise_suppression": "降噪", + "noise_suppression_description": "在通话期间降低背景噪音。此设置亦将应用于 Element Call。", "request_permissions": "请求媒体权限", - "title": "语音和视频", + "title": "语音与视频", "video_input_empty": "未检测到摄像头", "video_section": "视频设置", - "voice_agc": "自动调整话筒音量", + "voice_agc": "自动调整麦克风音量", "voice_processing": "语音处理", "voice_section": "语音设置" }, @@ -2248,623 +3054,678 @@ "warning": "警告:" }, "share": { - "permalink_message": "选中消息的链接", - "permalink_most_recent": "最新消息的链接", - "title_message": "分享房间消息", + "link_copied": "链接已复制", + "permalink_message": "链接可指向所选消息", + "permalink_most_recent": "链接到最近消息", + "share_call": "会议邀请链接", + "share_call_subtitle": "外部用户无需 Matrix 账户即可加入通话的链接:", + "title_link": "分享链接", + "title_message": "分享房间中的消息", "title_room": "分享房间", "title_user": "分享用户" }, "slash_command": { - "addwidget": "通过URL添加自定义挂件到房间", - "addwidget_iframe_missing_src": "iframe无src属性", - "addwidget_invalid_protocol": "请提供一个 https:// 或 http:// 挂件URL", - "addwidget_missing_url": "请提供一个挂件URL或嵌入代码", - "addwidget_no_permissions": "你无法修改此房间的插件。", - "ban": "按照 ID 封禁用户", - "category_actions": "动作", + "addwidget": "添加自定义小部件", + "addwidget_iframe_missing_src": "“iframe”没有“src”属性", + "addwidget_invalid_protocol": "请提供“http://”或“https://”开头的小部件 URL", + "addwidget_missing_url": "请提供小部件 URL 或其嵌入式代码", + "addwidget_no_permissions": "你在此房间无法修改小部件。", + "ban": "使用指定 ID 封禁用户", + "category_actions": "操作", "category_admin": "管理员", "category_advanced": "高级", - "category_effects": "效果", + "category_effects": "特效", "category_messages": "消息", - "category_other": "其他", - "command_error": "命令错误", - "converttodm": "将此房间会话转化为私聊会话", - "converttoroom": "将此私聊会话转化为房间会话", + "category_other": "其它", + "command_error": "指令出错", + "converttodm": "转换房间到私聊", + "converttoroom": "转换私聊到房间", "could_not_find_room": "无法找到房间", - "deop": "按照 ID 取消特定用户的管理员权限", - "devtools": "打开开发者工具窗口", - "discardsession": "强制丢弃加密房间中的当前出站群组会话", - "error_invalid_rendering_type": "命令错误:无法找到渲染类型(%(renderingType)s)", - "error_invalid_runfn": "命令错误:无法处理斜杠命令。", - "help": "显示指令清单与其描述和用法", + "deop": "通过指定的 ID 降权用户", + "devtools": "打开开发者工具对话框", + "discardsession": "强制丢弃加密房间中当前的出站组会话", + "error_invalid_rendering_type": "指令错误:无法找到修饰类型(%(renderingType)s)", + "error_invalid_room": "指令执行失败: 无法找到房间(%(roomId)s)", + "error_invalid_runfn": "指令错误:无法处理斜杠指令。", + "error_invalid_user_in_room": "在房间中无法找到用户", + "help": "将指令与其对应的用法、说明显示为一个列表", "help_dialog_title": "命令帮助", - "holdcall": "挂起当前房间的通话", - "html": "以 html 格式发送消息,不将其作为 markdown 处理", - "ignore": "忽略用户,隐藏他们发送的消息", - "ignore_dialog_description": "你忽略了 %(userId)s", + "holdcall": "将当前房间中的通话置于保持状态", + "html": "作为 HTML 发送消息,而不是将其解释为 Markdown", + "ignore": "忽略用户以为你隐藏其消息", + "ignore_dialog_description": "你正在忽略 %(userId)s", "ignore_dialog_title": "已忽略的用户", - "invite": "邀请指定ID的用户到当前房间", - "invite_3pid_needs_is_error": "使用身份服务器以通过电子邮件邀请其他用户。在设置中进行管理。", + "invite": "通过指定的 ID 邀请用户到当前房间", + "invite_3pid_needs_is_error": "使用身份服务器以通过邮件发出邀请。在设置中进行管理。", "invite_3pid_use_default_is_title": "使用身份服务器", - "invite_3pid_use_default_is_title_description": "使用身份服务器以通过电子邮件邀请其他用户。单击继续以使用默认身份服务器(%(defaultIdentityServerName)s),或在设置中进行管理。", - "invite_failed": "用户(%(user)s)最终未被邀请到%(roomId)s,但邀请工具没给出错误", - "join": "使用指定地址加入房间", - "jumptodate": "跳转到时间线中的给定日期", - "jumptodate_invalid_input": "我们无法理解给定日期 (%(inputDate)s)。尝试使用如下格式 YYYY-MM-DD。", - "lenny": "在纯文本消息开头添加 ( ͡° ͜ʖ ͡°)", + "invite_3pid_use_default_is_title_description": "使用身份服务器通过邮件地址邀请。点击“继续”以使用默认身份服务器 (%(defaultIdentityServerName)s),或在“设置”中管理。", + "invite_failed": "用户(%(user)s)最终未被邀请加入 %(roomId)s,但邀请程序未显示任何错误。", + "join": "通过指定的房间地址加入", + "jumptodate": "在时间线中跳转到指定日期", + "jumptodate_invalid_input": "我们无法理解指定的日期 (%(inputDate)s)。尝试使用 YYYY-MM-DD 格式。", + "lenny": "附加“( ͡° ͜ʖ ͡°)”到纯文本消息", + "manual_device_verification_confirm_description": "这将允许其它设备以你的身份发送和接收消息。如果有人告诉你在此处粘贴内容,你很可能被诈骗!你确定要验证此设备?", + "manual_device_verification_confirm_title": "警告:手动设备验证", "me": "显示操作", - "msg": "向指定用户发消息", - "myavatar": "在所有房间中更新您的头像", - "myroomavatar": "仅在当前房间中更改您的头像", - "myroomnick": "仅更改当前房间中的显示昵称", - "nick": "修改显示昵称", - "no_active_call": "此房间未有活跃中的通话", - "op": "定义一名用户的权力级别", + "msg": "向指定用户发送信息", + "myavatar": "更改个人资料图像(应用于所有房间)", + "myroomavatar": "仅更改我在当前房间内的个人资料图像", + "myroomnick": "仅更改我在当前房间内的显示名称", + "nick": "更改显示名称", + "no_active_call": "此房间没有活跃的通话", + "op": "定义用户的权力值", "part_unknown_alias": "无法识别的房间地址:%(roomAlias)s", - "plain": "以纯文本形式发送消息,不将其作为 markdown 处理", - "query": "与指定用户发起聊天", - "query_not_found_phone_number": "未能找到与此手机号码关联的 Matrix ID", - "rageshake": "发送带日志的错误报告", - "rainbow": "此消息以彩虹色进行渲染", - "rainbowme": "以彩虹色发送给定表情符号", - "remove": "将给定 ID 的用户移除此房间", - "roomavatar": "更改当前房间头像", + "plain": "作为纯文本发送消息,而不是将其解释为 Markdown", + "query": "打开与指定用户的聊天", + "query_not_found_phone_number": "无法找到与此电话号码对应的 Matrix ID", + "rageshake": "通过日志发送 Bug 报告", + "rainbow": "发送一个渲染为彩虹色的消息", + "rainbowme": "发送一个带有我的显示名称与渲染为彩虹色的消息", + "remove": "通过指定的 ID 从当前房间移除用户", + "roomavatar": "更改当前房间的头像", "roomname": "设置房间名称", "server_error": "服务器错误", - "server_error_detail": "服务器不可用、超载或其他东西出错了。", - "shrug": "在纯文本消息开头添加 ¯\\_(ツ)_/¯", - "spoiler": "此消息包含剧透", - "tableflip": "在纯文本消息开头添加 (╯°□°)╯︵ ┻━┻", - "topic": "获取或设置房间话题", - "topic_none": "此房间没有话题。", - "topic_room_error": "获取房间话题失败:无法找到房间(%(roomId)s)", - "unban": "按照 ID 解封用户", - "unflip": "在纯文本消息开头添加 ┬──┬ ノ( ゜-゜ノ)", - "unholdcall": "解除挂起当前房间的通话", - "unignore": "解除忽略用户,显示他们的消息", - "unignore_dialog_description": "你不再忽视 %(userId)s", - "unignore_dialog_title": "未忽略的用户", - "unknown_command": "未知命令", + "server_error_detail": "服务器不可用、超载或出现其它问题。", + "shrug": "附加“ˉ\\_(ツ)_/ˉ”到纯文本消息", + "spoiler": "作为剧透发送指定消息", + "tableflip": "附加“(╯°□°)╯︵ ┻━┻”到纯文本消息", + "topic": "获取或设置房间主题", + "topic_none": "此房间没有主题", + "topic_room_error": "获取房间主题失败:无法找到房间(%(roomId)s)", + "unban": "使用指定的 ID 解封用户", + "unflip": "附加“┬──┬ ノ( ゜-゜ノ)”到纯文本消息", + "unholdcall": "取消当前房间中的通话保持状态", + "unignore": "解除忽略用户,向你显示其未来的消息", + "unignore_dialog_description": "你不再忽略 %(userId)s", + "unignore_dialog_title": "已解除忽略的用户", + "unknown_command": "未知指令", "unknown_command_button": "作为消息发送", - "unknown_command_detail": "未识别的命令:%(commandText)s", - "unknown_command_help": "你可以使用 /help 列出可用命令。你是否要将其作为消息发送?", - "unknown_command_hint": "提示:以 // 开始你的消息来使其以一个斜杠开始。", + "unknown_command_detail": "无法识别的指令:%(commandText)s", + "unknown_command_help": "你可以使用 /help 列出可用的指令。是否将此文本作为消息发送?", + "unknown_command_hint": "提示:请以 / 开头。", "upgraderoom": "将房间升级到新版本", - "upgraderoom_permission_error": "你没有权限使用此命令。", + "upgraderoom_permission_error": "你无权使用此命令。", "usage": "用法", - "verify": "验证用户、会话和公钥元组", - "whois": "显示关于用户的信息" + "verify": "手动验证一个你拥有的设备", + "view": "通过指定的地址查看房间", + "whois": "显示用户信息" }, + "sliding_sync_legacy_no_longer_supported": "旧版滑动同步不再受支持:请重新登录以启用新的滑动同步标志", "space": { "add_existing_room_space": { - "create": "想要添加一个新的房间吗?", + "create": "想要添加新房间?", "create_prompt": "创建新房间", "dm_heading": "私聊", - "error_heading": "并非所有选中的都被添加", + "error_heading": "并非所有选定项都已添加", "progress_text": { - "one": "正在新增房间……", - "other": "正在新增房间……(%(count)s 中的第 %(progress)s 个)" + "one": "正在添加房间…", + "other": "正在添加房间…(%(count)s 中的 %(progress)s 个)" }, "space_dropdown_label": "空间选择", "space_dropdown_title": "添加现有房间", - "subspace_moved_note": "新增空间已移动。" + "subspace_moved_note": "添加的空间已移动。" }, "add_existing_subspace": { "create_button": "创建新空间", - "create_prompt": "想要添加一个新空间?", + "create_prompt": "添加一个新空间?", "filter_placeholder": "搜索空间", - "space_dropdown_title": "增加现有的空间" + "space_dropdown_title": "添加现有空间" }, "context_menu": { - "devtools_open_timeline": "查看房间时间线(开发工具)", - "explore": "探索房间", - "home": "空间首页", - "manage_and_explore": "管理并探索房间", + "devtools_open_timeline": "查看房间时间线(开发者工具)", + "explore": "浏览房间", + "home": "空间主页", + "manage_and_explore": "房间浏览与管理", "options": "空间选项" }, - "failed_load_rooms": "加载房间列表失败。", - "failed_remove_rooms": "无法移除某些房间。请稍后再试", - "incompatible_server_hierarchy": "你的服务器不支持显示空间层次结构。", - "invite": "邀请人们", - "invite_description": "使用邮箱或者用户名邀请", + "failed_load_rooms": "载入房间列表失败。", + "failed_remove_rooms": "某些房间移除失败。请稍后再试。", + "incompatible_server_hierarchy": "你的服务器不支持显示空间层级。", + "invite": "邀请人员", + "invite_description": "通过电话号码或邮件地址邀请", "invite_link": "分享邀请链接", - "joining_space": "加入中", + "joining_space": "正在加入", "landing_welcome": "欢迎来到 ", "leave_dialog_action": "离开空间", "leave_dialog_description": "你即将离开 。", - "leave_dialog_only_admin_room_warning": "你是某些要离开的房间或空间的唯一管理员。离开将使它们没有任何管理员。", - "leave_dialog_only_admin_warning": "你是此空间的唯一管理员。离开它将意味着没有人可以控制它。", + "leave_dialog_only_admin_room_warning": "对于你想要离开的某些房间或空间,你是其唯一的管理员。离开这些房间或空间将使其失去任何管理角色。", + "leave_dialog_only_admin_warning": "你是此空间的唯一管理员。离开后,任何人都无法控制它。", "leave_dialog_option_all": "离开所有房间", - "leave_dialog_option_intro": "你想俩开此空间内的房间吗?", - "leave_dialog_option_none": "不离开任何房间", - "leave_dialog_option_specific": "离开一些房间", - "leave_dialog_public_rejoin_warning": "除非你被重新邀请,否则你将无法重新加入。", + "leave_dialog_option_intro": "你确定要离开此空间中的房间?", + "leave_dialog_option_none": "不要离开任何房间", + "leave_dialog_option_specific": "离开房间", + "leave_dialog_public_rejoin_warning": "除非重新被邀请,否则你将无法重新加入。", "leave_dialog_title": "离开 %(spaceName)s", - "mark_suggested": "标记为建议", - "no_search_result_hint": "你可能要尝试其他搜索或检查是否有错别字。", + "mark_suggested": "设为建议", + "no_search_result_hint": "你可能需要尝试不同的搜索或检查错别字。", "preferences": { "sections_section": "要显示的部分", - "show_people_in_space": "将您与该空间的成员的聊天进行分组。关闭这个后你将无法在 %(spaceName)s 内看到这些聊天。" + "show_people_in_space": "这会将你的聊天与此空间的成员分组。关闭此项将在 %(spaceName)s 视图中隐藏这些聊天。" }, "room_filter_placeholder": "搜索房间", "search_children": "搜索 %(spaceName)s", - "search_placeholder": "搜索名称和描述", - "select_room_below": "首先选择一个房间", - "share_public": "分享你的公共空间", + "search_placeholder": "搜索名称与描述", + "select_room_below": "首选以下房间", + "share_public": "分享公共空间", "suggested": "建议", - "suggested_tooltip": "此房间很适合加入", + "suggested_tooltip": "建议加入此房间", "title_when_query_available": "结果", "title_when_query_unavailable": "房间与空间", - "unmark_suggested": "标记为不建议", + "unmark_suggested": "设为不建议", "user_lacks_permission": "你没有权限" }, "space_settings": { - "title": "设置 - %(spaceName)s" + "title": "设置:%(spaceName)s" }, "spaces": { - "error_no_permission_add_room": "你没有权限添加房间至此空间", - "error_no_permission_add_space": "你没有权限向此空间添加空间", - "error_no_permission_create_room": "你没有权限在此空间内创建新的房间", - "error_no_permission_invite": "你无权邀请他人加入此空间" + "error_no_permission_add_room": "你无权在此空间添加房间", + "error_no_permission_add_space": "你无权在此空间中添加空间", + "error_no_permission_create_room": "你无权在此空间创建新房间", + "error_no_permission_invite": "你无权邀请人员访问此空间" }, "spotlight": { "public_rooms": { - "network_dropdown_add_dialog_description": "输入你想探索的新服务器的服务器名。", - "network_dropdown_add_dialog_placeholder": "服务器名", - "network_dropdown_add_dialog_title": "添加新服务器", - "network_dropdown_add_server_option": "添加新的服务器…", - "network_dropdown_available_invalid": "找不到此服务器或其房间列表", + "network_dropdown_add_dialog_description": "输入要浏览的新服务器名称。", + "network_dropdown_add_dialog_placeholder": "服务器名称", + "network_dropdown_add_dialog_title": "添加新服务器…", + "network_dropdown_add_server_option": "添加新服务器…", + "network_dropdown_available_invalid": "无法找到此服务器或其房间列表", "network_dropdown_available_invalid_forbidden": "你不被允许查看此服务器的房间列表", - "network_dropdown_available_valid": "看着不错", + "network_dropdown_available_valid": "良好", "network_dropdown_remove_server_adornment": "移除服务器“%(roomServer)s”", - "network_dropdown_required_invalid": "请输入服务器名", - "network_dropdown_selected_label": "显示:Matrix房间", - "network_dropdown_selected_label_instance": "显示:%(instance)s房间(%(server)s)", + "network_dropdown_required_invalid": "输入服务器名称", + "network_dropdown_selected_label": "显示:Matrix 房间", + "network_dropdown_selected_label_instance": "显示 %(instance)s 房间(%(server)s)", "network_dropdown_your_server_description": "你的服务器" } }, "spotlight_dialog": { - "cant_find_person_helpful_hint": "若你无法看到你正在查找的人,给他们发送你的邀请链接。", - "cant_find_room_helpful_hint": "若你找不到要找的房间,请请求邀请或创建新房间。", + "cant_find_person_helpful_hint": "如果你看不到要找的人员,请复制并向其发送以下邀请链接。", + "cant_find_room_helpful_hint": "如果你找不到所需的房间,请向其申请加入或创建新房间。", "copy_link_text": "复制邀请链接", "count_of_members": { - "one": "%(count)s个成员", - "other": "%(count)s个成员" + "one": "%(count)s 位成员", + "other": "%(count)s 个成员" }, "create_new_room_button": "创建新房间", - "failed_querying_public_rooms": "查询公开房间失败", - "group_chat_section_title": "其他选项", - "heading_with_query": "使用 \"%(query)s\" 来搜索", - "heading_without_query": "搜索", - "join_button_text": "加入%(roomAddress)s", - "keyboard_scroll_hint": "用来滚动", - "other_rooms_in_space": "%(spaceName)s 中的其他房间", + "failed_querying_public_rooms": "公共房间查询失败", + "failed_querying_public_spaces": "公共空间查询失败", + "group_chat_section_title": "其它选项", + "heading_with_query": "使用“%(query)s”搜索", + "heading_without_query": "搜索类型", + "join_button_text": "加入 %(roomAddress)s", + "keyboard_scroll_hint": "使用 滚动", + "messages_label": "消息", + "other_rooms_in_space": "%(spaceName)s 中的其它房间", "public_rooms_label": "公共房间", "public_spaces_label": "公共空间", - "recent_searches_section_title": "最近的搜索", + "recent_searches_section_title": "最近搜索", "recently_viewed_section_title": "最近查看", - "remove_filter": "移除%(filter)s搜索过滤条件", - "result_may_be_hidden_privacy_warning": "为保护隐私,一些结果可能被隐藏", - "result_may_be_hidden_warning": "一些结果可能被隐藏", - "search_dialog": "搜索对话", + "remove_filter": "移除筛选 %(filter)s 的搜索", + "result_may_be_hidden_privacy_warning": "由于隐私原因,某些结果可能被隐藏。", + "result_may_be_hidden_warning": "某些结果可能被隐藏", + "search_dialog": "搜索对话框", "spaces_title": "你所在的空间", - "start_group_chat_button": "发起群聊天" + "start_group_chat_button": "开始群聊" }, "stickers": { - "empty": "你目前未启用任何贴纸包", + "empty": "你当前未启用任何贴纸包", "empty_add_prompt": "立即添加" }, "terms": { "column_document": "文档", "column_service": "服务", - "column_summary": "总结", - "identity_server_no_terms_description_1": "此操作需要访问默认的身份服务器 以验证邮箱或电话号码,但此服务器无任何服务条款。", - "identity_server_no_terms_description_2": "只有在你信任服务器所有者后才能继续。", - "identity_server_no_terms_title": "身份服务器无服务条款", + "column_summary": "摘要", + "identity_server_no_terms_description_1": "此操作需要访问默认身份服务器 以验证邮件地址或电话号码,但该服务器没有任何服务条款。", + "identity_server_no_terms_description_2": "只有在你信任服务器所有者的情况下才能继续。", + "identity_server_no_terms_title": "身份服务器暂无服务条款", "inline_intro_text": "接受 以继续:", - "integration_manager": "使用机器人、桥接、挂件和贴纸包", - "intro": "要继续,你需要接受此服务协议。", - "summary_identity_server_1": "通过电话或邮箱寻找别人", - "summary_identity_server_2": "通过电话或邮箱被寻找", + "integration_manager": "使用机器人、桥接器、小部件与贴纸包", + "intro": "若要继续,你必须接受此服务的条款。", + "summary_identity_server_1": "通过电话号码或邮件地址查找", + "summary_identity_server_2": "通过电话号码或邮件地址查找", "tac_button": "浏览条款与要求", - "tac_description": "若要继续使用家服务器 %(homeserverDomain)s,你必须浏览并同意我们的条款与要求。", - "tac_title": "条款与要求", - "tos": "服务协议" + "tac_description": "要继续使用主服务器 %(homeserverDomain)s,你必须查看并同意我们的条款和条件。", + "tac_title": "条款与条件", + "tos": "服务条款" }, "theme": { - "light_high_contrast": "浅色高对比", - "match_system": "匹配系统" + "light_high_contrast": "高对比度浅色", + "match_system": "跟随系统" }, - "thread_view_back_action_label": "返回消息列", + "thread_view_back_action_label": "回到消息列", "threads": { "all_threads": "所有消息列", "all_threads_description": "显示当前房间的所有消息列", "count_of_reply": { - "one": "%(count)s 条回复", - "other": "%(count)s 条回复" + "one": "%(count)s 个回复", + "other": "%(count)s 个回复" }, + "empty_description": "将鼠标指针悬停在某个消息上并点击“%(replyInThread)s”。", + "empty_title": "消息列有助于持续并跟进题内的对话。", + "mark_all_read": "全部设为已读", "my_threads": "我的消息列", - "my_threads_description": "显示您参与的所有消息列", + "my_threads_description": "显示你参与的所有消息列", "open_thread": "打开消息列", "show_thread_filter": "显示:" }, + "threads_activity_centre": { + "header": "消息列活动", + "no_rooms_with_threads_notifs": "暂无包含消息列通知的房间。", + "no_rooms_with_unread_threads": "暂无包含未读消息列的房间。" + }, "time": { "date_at_time": "%(date)s 的 %(time)s", - "hours_minutes_seconds_left": "剩余%(hours)s小时%(minutes)s分钟%(seconds)s秒", - "left": "剩余%(timeRemaining)s", - "minutes_seconds_left": "剩余%(minutes)s分钟%(seconds)s秒", - "seconds_left": "剩余 %(seconds)s 秒", + "hours_minutes_seconds_left": "已离开 %(hours)s 小时 %(minutes)s 分钟 %(seconds)s 秒", + "left": "剩余 %(timeRemaining)s", + "minutes_seconds_left": "已离开 %(minutes)s 分钟 %(seconds)ss 秒", + "seconds_left": "已离开 %(seconds)ss 秒", "short_days": "%(value)s 天", - "short_days_hours_minutes_seconds": "%(days)s天%(hours)s小时%(minutes)s分钟%(seconds)s秒", + "short_days_hours_minutes_seconds": "%(days)s 天 %(hours)s 小时 %(minutes)s 分钟 %(seconds)s 秒", "short_hours": "%(value)s 小时", - "short_hours_minutes_seconds": "%(hours)s小时%(minutes)s分钟%(seconds)s秒", + "short_hours_minutes_seconds": "%(hours)s 小时 %(minutes)s 分钟 %(seconds)ss 秒", "short_minutes": "%(value)s 分钟", - "short_minutes_seconds": "%(minutes)s分钟%(seconds)s秒", + "short_minutes_seconds": "%(minutes)s 分钟 %(seconds)s 秒", "short_seconds": "%(value)s 秒" }, "timeline": { "context_menu": { "collapse_reply_thread": "折叠回复消息列", - "external_url": "源网址", + "external_url": "源 URL", "open_in_osm": "在 OpenStreetMap 中打开", "report": "举报", - "resent_unsent_reactions": "重新发送%(unsentCount)s个反应", + "resent_unsent_reactions": "重新发送 %(unsentCount)s 的反应", "show_url_preview": "显示预览", "view_related_event": "查看相关事件", "view_source": "查看源代码" }, - "creation_summary_dm": "%(creator)s 创建了此私聊。", + "creation_summary_dm": "%(creator)s 创建了私聊。", "creation_summary_room": "%(creator)s 创建并配置了此房间。", - "download_action_downloading": "下载中", - "edits": { - "tooltip_label": "编辑于 %(date)s。点击以查看编辑历史。", - "tooltip_sub": "点击查看编辑历史", - "tooltip_title": "编辑于 %(date)s" + "decryption_failure": { + "sender_identity_previously_verified": "发件人已验证的身份已被重置", + "unable_to_decrypt": "无法解密消息" }, - "error_no_renderer": "无法显示此事件", + "disambiguated_profile": "%(displayName)s(%(matrixId)s)", + "download_action_downloading": "下载中", + "download_failed": "下载失败", + "download_failed_description": "下载此文件时出错", + "e2e_state": "端到端加密状态", + "edits": { + "tooltip_label": "编辑于 %(date)s,点击查看编辑历史。", + "tooltip_sub": "点击查看编辑历史", + "tooltip_title": "最后编辑于 %(date)s" + }, + "error_no_renderer": "此事件无法显示", "error_rendering_message": "无法加载此消息", - "historical_messages_unavailable": "你不能查看更早的消息", + "historical_messages_unavailable": "你无法查看之前的消息", + "in_room_name": "位于 %(room)s", "io.element.widgets.layout": "%(senderName)s 更新了房间布局", + "late_event_separator": "原定发送于 %(dateTime)s", "load_error": { - "no_permission": "尝试了加载此房间时间线上的特定点,但你没有查看相关消息的权限。", - "title": "加载时间线位置失败", - "unable_to_find": "尝试加载此房间的时间线的特定时间点,但是无法找到。" + "no_permission": "尝试加载此房间时间线中的特定时间点,但你无权查看相关消息。", + "title": "时间线位置加载失败", + "unable_to_find": "尝试加载此房间时间线中的特定时间点,但无法找到。" }, "m.audio": { "error_downloading_audio": "下载音频时出错", "error_processing_audio": "处理音频消息时出错", - "error_processing_voice_message": "处理语音消息时发生错误" + "error_processing_voice_message": "处理语音消息时出错" }, "m.beacon_info": { "view_live_location": "查看实时位置" }, "m.call": { - "video_call_started": "%(roomName)s里的视频通话开始了。", - "video_call_started_unsupported": "%(roomName)s里的视频通话开始了。(此浏览器不支持)" + "video_call_ended": "视频通话已结束", + "video_call_started": "在 %(roomName)s 开始视频通话。", + "video_call_started_text": "%(name)s 已开始视频通话", + "video_call_started_unsupported": "已在 %(roomName)s 开始视频通话。(此浏览器不支持)" }, "m.call.hangup": { - "dm": "通话结束" + "dm": "通话已结束" }, "m.call.invite": { + "answered_elsewhere": "已在别处接听", "call_back_prompt": "回拨", - "declined": "拒绝通话", + "declined": "来电被拒接", "failed_connect_media": "无法连接媒体", "failed_connection": "连接失败", - "failed_opponent_media": "他们的设备无法启动摄像头或麦克风", + "failed_opponent_media": "其设备无法开启摄像头或麦克风", "missed_call": "未接来电", - "no_answer": "无响应", - "unknown_error": "出现未知错误", + "no_answer": "未接听", + "unknown_error": "发生未知错误", "unknown_failure": "未知错误:%(reason)s", "unknown_state": "通话处于未知状态!", - "video_call": "%(senderName)s 发起了视频通话。", - "video_call_unsupported": "%(senderName)s 发起了视频通话。(此浏览器不支持)", - "voice_call": "%(senderName)s 发起了语音通话。", - "voice_call_unsupported": "%(senderName)s 发起了语音通话。(此浏览器不支持)" + "video_call": "来自 %(senderName)s 的视频通话。", + "video_call_unsupported": "%(senderName)s 已开始视频通话。(此浏览器不支持)", + "voice_call": "来自 %(senderName)s 的语音通话。", + "voice_call_unsupported": "%(senderName)s 已开始语音通话。(此浏览器不支持)" }, "m.file": { "error_decrypting": "解密附件时出错" }, "m.image": { + "error": "由于错误无法显示图片", "error_decrypting": "解密图像时出错", - "sent": "%(senderDisplayName)s 发送了一张图片。", + "error_downloading": "下载图像时出错", + "sent": "%(senderDisplayName)s 发送了一个图像。", "show_image": "显示图像" }, "m.key.verification.request": { "user_wants_to_verify": "%(name)s 想要验证", - "you_started": "你发送了一个验证请求" + "you_started": "你发送了验证请求" }, "m.location": { - "full": "%(senderName)s 分享了他们的位置", - "location": "分享了位置: ", - "self_location": "分享了他们的位置: " + "full": "%(senderName)s 分享了其位置", + "location": "分享位置:", + "self_location": "已分享其位置:" }, "m.poll": { "count_of_votes": { - "one": "%(count)s 票", - "other": "%(count)s 票" + "one": "%(count)s 个投票", + "other": "%(count)s 个投票" } }, "m.poll.end": { "sender_ended": "%(senderName)s 结束了投票" }, - "m.poll.start": "%(senderName)s 发起了投票:%(pollQuestion)s", + "m.poll.start": "%(senderName)s 发起投票: %(pollQuestion)s", "m.room.avatar": { - "changed": "%(senderDisplayName)s 更改了房间头像。", - "changed_img": "%(senderDisplayName)s 将房间的头像更改为 ", - "lightbox_title": "%(senderDisplayName)s 修改了 %(roomName)s 的头像", - "removed": "%(senderDisplayName)s 移除了房间头像。" + "changed": "%(senderDisplayName)s 已更改房间头像。", + "changed_img": "%(senderDisplayName)s 已将房间头像更改为 ", + "lightbox_title": "%(senderDisplayName)s 已更改房间 %(roomName)s 中的头像", + "removed": "%(senderDisplayName)s 已移除房间头像。" }, "m.room.canonical_alias": { "alt_added": { - "other": "%(senderName)s 为此房间添加备用地址 %(addresses)s。", - "one": "%(senderName)s 为此房间添加了备用地址 %(addresses)s。" + "one": "%(senderName)s 为此房间添加了备选地址 %(address)s。", + "other": "%(senderName)s 已为此房间添加了备用地址 %(addresses)s。" }, "alt_removed": { - "other": "%(senderName)s 为此房间移除了备用地址 %(addresses)s。", - "one": "%(senderName)s 为此房间移除了备用地址 %(addresses)s。" + "one": "%(senderName)s 已移除此房间的备选地址 %(address)s。", + "other": "%(senderName)s 已移除此房间的备选地址 %(addresses)s。" }, "changed": "%(senderName)s 更改了此房间的地址。", - "changed_alternative": "%(senderName)s 更改了此房间的备用地址。", - "changed_main_and_alternative": "%(senderName)s 更改了此房间的主要地址与备用地址。", - "removed": "%(senderName)s 移除了此房间的主要地址。", - "set": "%(senderName)s 将此房间的主要地址设为了 %(address)s。" + "changed_alternative": "%(senderName)s 更改了此房间的备选地址。", + "changed_main_and_alternative": "%(senderName)s 已更改此房间的主要地址与备用地址。", + "removed": "%(senderName)s 已移除此房间的主地址。", + "set": "%(senderName)s 已将此房间的主地址设置为 %(address)s。" }, "m.room.create": { - "continuation": "此房间是另一个对话的延续之处。", - "see_older_messages": "点击这里以查看更早的消息。" + "continuation": "此房间是另一个对话的延续。", + "see_older_messages": "点击此处查看更旧的消息。", + "unknown_predecessor": "找不到此房间的旧版本(房间 ID:%(roomId)s),并且我们未提供“via_servers”来查找它。", + "unknown_predecessor_guess_server": "无法找到此房间(房间 ID:%(roomId)s)的旧版本,并且尚未提供“via_servers”用于查找。根据房间 ID 猜测服务器或许可行。要尝试请点击此链接:" }, "m.room.guest_access": { - "can_join": "%(senderDisplayName)s 将此房间改为允许游客加入。", - "forbidden": "%(senderDisplayName)s 将此房间改为游客禁入。", - "unknown": "%(senderDisplayName)s 将此房间的游客加入规则改为 %(rule)s" + "can_join": "%(senderDisplayName)s 配置此房间为允许访客加入。", + "forbidden": "%(senderDisplayName)s 已阻止访客加入房间。", + "unknown": "%(senderDisplayName)s 已将访客的访问权限更改为 %(rule)s" }, "m.room.history_visibility": { - "invited": "%(senderName)s使未来的房间历史对所有房间成员从他们被邀请开始可见。", - "joined": "%(senderName)s使未来的房间历史对所有房间成员从他们加入开始可见。", - "shared": "%(senderName)s使未来的房间历史对所有房间成员可见。", - "unknown": "%(senderName)s使未来的房间历史对未知(%(visibility)s)可见。", - "world_readable": "%(senderName)s使未来的房间历史对任何人可见。" + "invited": "%(senderName)s 为此房间的所有成员调整了未来房间历史的可见性(自新成员被邀请进入时起)。", + "joined": "%(senderName)s 已将未来的房间历史记录对所有成员可见,自其加入房间时起。", + "shared": "%(senderName)s 使所有房间成员都能看到未来的房间历史记录。", + "unknown": "%(senderName)s 已将未来的房间历史记录对未知用户可见(%(visibility)s)。", + "world_readable": "%(senderName)s 调整了未来房间历史的可见性(对任何人可见)。" }, "m.room.join_rules": { - "invite": "%(senderDisplayName)s 将此房间改为仅限邀请。", - "knock": "%(senderDisplayName)s 将加入规则更改为 ”需要验证加入请求“。", - "public": "%(senderDisplayName)s 将此房间对知道此房间链接的人公开。", - "restricted": "%(senderDisplayName)s 更改了谁能加入这个房间。", - "restricted_settings": "%(senderDisplayName)s 更改了谁能加入这个房间。查看设置。", - "unknown": "%(senderDisplayName)s 将加入规则改为 %(rule)s" + "invite": "%(senderDisplayName)s 配置此房间为仅限邀请。", + "knock": "%(senderDisplayName)s 更改了加入规则以申请加入。", + "public": "%(senderDisplayName)s 向知道链接的人公开了房间。", + "restricted": "%(senderDisplayName)s 更改了允许加入此房间的人员。", + "restricted_settings": "%(senderDisplayName)s 已更改谁可以加入此房间。查看设置", + "unknown": "%(senderDisplayName)s 已将加入规则更改为 %(rule)s" }, "m.room.member": { - "accepted_3pid_invite": "%(targetName)s 已接受 %(displayName)s 的邀请", + "accepted_3pid_invite": "%(targetName)s 接受了 %(displayName)s 的邀请", "accepted_invite": "%(targetName)s 已接受邀请", - "ban": "%(senderName)s 已封禁 %(targetName)s", - "ban_reason": "%(senderName)s 已封禁 %(targetName)s: %(reason)s", - "change_avatar": "%(senderName)s 已更改他们的资料图片", - "change_name": "%(oldDisplayName)s将其显示名称改为%(displayName)s", - "change_name_avatar": "%(oldDisplayName)s更改了其显示名称和用户资料图片", - "invite": "%(senderName)s 已邀请 %(targetName)s", + "ban": "%(senderName)s 已封禁 1 个用户", + "ban_reason": "%(senderName)s 已封禁 1 个用户: %(reason)s", + "ban_reason_spoiler": "%(senderName)s 已封禁 ", + "ban_spoiler": "%(senderName)s 已封禁 : %(reason)s", + "change_avatar": "%(senderName)s 已更改其个人资料图像", + "change_name": "%(oldDisplayName)s 已将其显示名称更改为 %(displayName)s", + "change_name_avatar": "%(oldDisplayName)s 已更改其显示名称与个人资料图片", + "invite": "%(senderName)s 邀请了 %(targetName)s", "join": "%(targetName)s 已加入房间", - "kick": "%(senderName)s 移除了 %(targetName)s", - "kick_reason": "%(senderName)s 移除了 %(targetName)s:%(reason)s", - "left": "%(targetName)s 已离开房间", - "left_reason": "%(targetName)s 已离开房间:%(reason)s", - "no_change": "%(senderName)s 未发生更改", + "kick": "%(senderName)s 已移除 %(targetName)s", + "kick_reason": "%(senderName)s 已移除 %(targetName)s: %(reason)s", + "left": "%(targetName)s 离开了房间", + "left_reason": "%(targetName)s 离开了房间:%(reason)s", + "no_change": "%(senderName)s 未产生任何更改", "reject_invite": "%(targetName)s 已拒绝邀请", - "remove_avatar": "%(senderName)s 已移除他们的资料图片", - "remove_name": "%(senderName)s已移除他们的显示名称(%(oldDisplayName)s)", - "set_avatar": "%(senderName)s 已设置资料图片", - "set_name": "%(senderName)s已将他们的显示名称设置为%(displayName)s", - "unban": "%(senderName)s 已取消封禁 %(targetName)s", - "withdrew_invite": "%(senderName)s 已撤回向 %(targetName)s 的邀请", - "withdrew_invite_reason": "%(senderName)s 已撤回向 %(targetName)s 的邀请:%(reason)s" + "reject_invite_reason": "%(targetName)s 拒绝了邀请:%(reason)s", + "remove_avatar": "%(senderName)s 已移除其个人资料图像", + "remove_name": "%(senderName)s 已移除其显示名称(%(oldDisplayName)s)", + "set_avatar": "%(senderName)s 设置了个人资料图像", + "set_name": "%(senderName)s 已设置其显示名称为 %(displayName)s", + "unban": "%(senderName)s 解封了 %(targetName)s", + "withdrew_invite": "%(senderName)s 撤消了 %(targetName)s 的邀请", + "withdrew_invite_reason": "%(senderName)s 已撤消对 %(targetName)s 的邀请:%(reason)s" }, "m.room.name": { - "change": "%(senderDisplayName)s 将房间名称从 %(oldRoomName)s 改为 %(newRoomName)s。", - "remove": "%(senderDisplayName)s 移除了房间名称。", - "set": "%(senderDisplayName)s 将房间名称改为 %(roomName)s。" + "change": "%(senderDisplayName)s 已更改房间名称从 %(oldRoomName)s 到 %(newRoomName)s。", + "remove": "%(senderDisplayName)s 已移除房间名称。", + "set": "%(senderDisplayName)s 更改房间名称为 %(roomName)s。" }, "m.room.pinned_events": { - "changed": "%(senderName)s 更改了房间的置顶消息。", - "changed_link": "%(senderName)s 已更改此房间的固定消息。", - "pinned": "%(senderName)s将一条消息固定到此房间。查看所有固定消息。", - "pinned_link": "%(senderName)s 将一条消息固定到此房间。查看所有固定消息。", - "unpinned": "%(senderName)s从此房间中取消固定了一条消息。查看所有固定消息。", - "unpinned_link": "%(senderName)s 从此房间中取消固定了一条消息。查看所有固定消息。" + "changed": "%(senderName)s 已更改此房间已置顶的消息。", + "changed_link": "%(senderName)s 更改了房间的已置顶消息。", + "pinned": "%(senderName)s 将一个消息置顶到此房间。查看所有已置顶的消息。", + "pinned_link": "%(senderName)s 已在此房间置顶了一个消息。 查看所有已置顶的消息。", + "unpinned": "%(senderName)s 已在此房间取消置顶一个消息。查看所有已置顶的消息。", + "unpinned_link": "%(senderName)s 已在此房间取消置顶了一个消息。 查看所有已置顶的消息。" }, "m.room.power_levels": { - "changed": "%(senderName)s更改了%(powerLevelDiffText)s的权力级别。", - "user_from_to": "%(userId)s 从 %(fromPowerLevel)s 变为 %(toPowerLevel)s" + "changed": "%(senderName)s 已更改 %(powerLevelDiffText)s。", + "user_from_to": "%(userId)s 的权力值从 %(fromPowerLevel)s 到 %(toPowerLevel)s" }, "m.room.third_party_invite": { - "revoked": "%(senderName)s 撤销了对 %(targetDisplayName)s 加入房间的邀请。", - "sent": "%(senderName)s 向 %(targetDisplayName)s 发了加入房间的邀请。" + "revoked": "%(senderName)s 已撤消 %(targetDisplayName)s 加入房间的邀请。", + "sent": "%(senderName)s 已向 %(targetDisplayName)s 发送了加入房间的邀请。" }, - "m.room.tombstone": "%(senderDisplayName)s 升级了此房间。", + "m.room.tombstone": "%(senderDisplayName)s 已升级此房间。", "m.room.topic": { - "changed": "%(senderDisplayName)s 将话题修改为 “%(topic)s”。" + "changed": "%(senderDisplayName)s 已更改主题为“%(topic)s”。", + "removed": "%(senderDisplayName)s 已移除房间主题。" }, - "m.sticker": "%(senderDisplayName)s 发送了一张贴纸。", + "m.sticker": "%(senderDisplayName)s 发送了一个贴纸。", "m.video": { - "error_decrypting": "解密视频时出错" + "error_decrypting": "解密视频时出错", + "show_video": "显示视频" }, "m.widget": { - "added": "%(senderName)s 添加了 %(widgetName)s 挂件", - "jitsi_ended": "由 %(senderName)s 结束的视频会议", + "added": "%(senderName)s 添加了小部件:%(widgetName)s", + "jitsi_ended": "%(senderName)s 结束了视频会议", "jitsi_join_right_prompt": "从右侧的房间信息卡片加入会议", - "jitsi_join_top_prompt": "点击房间顶部加入会议", - "jitsi_started": "由 %(senderName)s 发起的视频会议", - "jitsi_updated": "由 %(senderName)s 更新的视频会议", - "modified": "%(senderName)s 修改了 %(widgetName)s 挂件", - "removed": "%(senderName)s 移除了 %(widgetName)s 挂件" + "jitsi_join_top_prompt": "在此房间加入会议的前排", + "jitsi_started": "%(senderName)s 已开始视频会议", + "jitsi_updated": "%(senderName)s 已更新视频会议", + "modified": "小部件 %(widgetName)s 已被 %(senderName)s 修改", + "removed": "%(senderName)s 已移除小部件:%(widgetName)s" }, "mab": { "copy_link_thread": "复制到消息列的链接", "view_in_room": "在房间内查看" }, "mjolnir": { - "changed_rule_glob": "%(senderName)s 更新了一个由于%(reason)s而禁止%(oldGlob)s跟%(newGlob)s匹配的规则", - "changed_rule_rooms": "%(senderName)s更改了一个由于%(reason)s而禁止房间%(oldGlob)s跟%(newGlob)s匹配的规则", - "changed_rule_servers": "%(senderName)s 更新了一个由于%(reason)s而禁止服务器%(oldGlob)s跟%(newGlob)s匹配的规则", - "changed_rule_users": "%(senderName)s 更改了一个由于%(reason)s而禁止用户%(oldGlob)s跟%(newGlob)s匹配的规则", - "created_rule": "%(senderName)s 创建了由于%(reason)s而禁止匹配%(glob)s的规则", - "created_rule_rooms": "%(senderName)s 创建了由于%(reason)s而禁止房间匹配%(glob)s的规则", - "created_rule_servers": "%(senderName)s 创建了由于%(reason)s而禁止服务器匹配%(glob)s的规则", - "created_rule_users": "%(senderName)s 创建了因为%(reason)s而禁止用户匹配%(glob)s的规则", - "message_hidden": "你已忽略此用户,所以其消息已被隐藏。仍然显示。", - "removed_rule": "%(senderName)s 移除了禁止匹配 %(glob)s 的规则", - "removed_rule_rooms": "%(senderName)s 删除了禁止房间匹配%(glob)s的规则", - "removed_rule_servers": "%(senderName)s 移除了禁止匹配 %(glob)s 的服务器的规则", - "removed_rule_users": "%(senderName)s 移除了禁止匹配 %(glob)s 的用户的规则", - "updated_invalid_rule": "%(senderName)s 更新了一个无效的禁止规则", - "updated_rule": "%(senderName)s 更新了由于%(reason)s而禁止匹配%(glob)s的规则", - "updated_rule_rooms": "%(senderName)s 更新了由于%(reason)s而禁止房间匹配%(glob)s的规则", - "updated_rule_servers": "%(senderName)s 更新了由于%(reason)s而禁止服务器匹配%(glob)s的规则", - "updated_rule_users": "%(senderName)s 更新了由于%(reason)s 而禁止用户匹配%(glob)s的规则" + "changed_rule_glob": "%(senderName)s 已更新一条与 %(oldGlob)s 匹配的封禁规则,曾经为 %(newGlob)s,原因:%(reason)s", + "changed_rule_rooms": "%(senderName)s 已更改一条与 %(newGlob)s 匹配的房间封禁规则,曾经为 %(oldGlob)s,原因:%(reason)s", + "changed_rule_servers": "%(senderName)s 已更改一条与 %(newGlob)s 匹配的服务器封禁规则,曾经为 %(oldGlob)s,原因:%(reason)s", + "changed_rule_users": "%(senderName)s 已更改一条与 %(newGlob)s 匹配的用户封禁规则,曾经为 %(oldGlob)s,原因:%(reason)s", + "created_rule": "%(senderName)s 为 %(reason)s 创建了一条与 %(glob)s 匹配的封禁规则", + "created_rule_rooms": "%(senderName)s 已创建一条与 %(glob)s 匹配的房间封禁规则,原因:%(reason)s", + "created_rule_servers": "%(senderName)s 已创建一条与 %(glob)s 匹配的服务器封禁规则,原因:%(reason)s", + "created_rule_users": "%(senderName)s 已创建一条与 %(glob)s 匹配的用户封禁规则,原因:%(reason)s", + "message_hidden": "你已忽略此用户,因此其消息已被隐藏。仍然显示。", + "removed_rule": "%(senderName)s 已移除一条与 %(glob)s 匹配的封禁规则", + "removed_rule_rooms": "%(senderName)s 已移除匹配 %(glob)s 的房间封禁规则。", + "removed_rule_servers": "%(senderName)s 已移除与 %(glob)s 匹配的服务器封禁规则", + "removed_rule_users": "%(senderName)s 已移除匹配 %(glob)s 的用户封禁规则。", + "updated_invalid_rule": "%(senderName)s 更新了无效的封禁规则", + "updated_rule": "%(senderName)s 已更新一条与 %(glob)s 匹配的封禁规则", + "updated_rule_rooms": "%(senderName)s 已更新一条与 %(glob)s 匹配的房间封禁规则,原因:%(reason)s", + "updated_rule_servers": "%(senderName)s 已更新与 %(glob)s 匹配的服务器封禁规则,原因:%(reason)s。", + "updated_rule_users": "%(senderName)s 已更新一条与 %(glob)s 匹配的用户封禁规则,原因:%(reason)s" }, - "no_permission_messages_before_invite": "你没有权限查看你被邀请之前的消息。", - "no_permission_messages_before_join": "你没有权限查看你加入前的消息。", - "pending_moderation": "待审核的消息", - "pending_moderation_reason": "消息待审核:%(reason)s", + "no_permission_messages_before_invite": "你无权查看你被邀请前的消息。", + "no_permission_messages_before_join": "你无权查看你加入前的消息。", + "pending_moderation": "消息等待审核", + "pending_moderation_reason": "消息等待审核:%(reason)s", "reactions": { "add_reaction_prompt": "添加反应", - "label": "%(reactors)s做出了%(content)s的反应" + "custom_reaction_fallback_label": "自定义反应", + "label": "%(reactors)s 使用 %(content)s 作出反应", + "tooltip_caption": "已使用 %(shortName)s 作出反应" }, "read_receipt_title": { - "one": "已被%(count)s人查看", - "other": "已被%(count)s人查看" + "one": "已被 %(count)s 个人查看", + "other": "已被 %(count)s 个人查看" }, "read_receipts_label": "已读回执", "redacted": { - "tooltip": "消息于 %(date)s 被删除" + "tooltip": "消息已于 %(date)s 删除" }, - "redaction": "消息被 %(name)s 删除", + "redaction": "消息已被 %(name)s 删除", "reply": { - "error_loading": "无法加载被回复的事件,它可能不存在,也可能是你没有权限查看它。", - "in_reply_to": "答复 ", - "in_reply_to_for_export": "答复此消息" + "error_loading": "无法加载已回复的事件,该事件可能不存在或你无权查看。", + "in_reply_to": "回复给 ", + "in_reply_to_for_export": "回复此消息" }, "scalar_starter_link": { - "dialog_description": "你将被带到一个第三方网站以便验证你的账户来使用 %(integrationsUrl)s 提供的集成。你希望继续吗?", + "dialog_description": "你将被带到第三方网站,以便验证你的账户是否可用于 %(integrationsUrl)s。是否继续?", "dialog_title": "添加集成" }, - "self_redaction": "消息已删除", + "self_redaction": "消息已被删除", + "send_state_encrypting": "正在解密消息…", "send_state_failed": "发送失败", + "send_state_sending": "发送消息…", "send_state_sent": "消息已发送", "summary": { "banned": { - "other": "被封禁 %(count)s 次", - "one": "被封禁" + "one": "已被封禁", + "other": "已被封禁 %(count)s 次" }, "banned_multiple": { - "other": "被封禁 %(count)s 次", - "one": "被封禁" + "one": "已被封禁", + "other": "已被封禁 %(count)s 次" + }, + "changed_avatar": { + "one": "%(oneUser)s 已更改其个人资料图像", + "other": "%(oneUser)s 已更改其个人资料图像 %(count)s 次" + }, + "changed_avatar_multiple": { + "one": "%(severalUsers)s 已更改其个人资料图像", + "other": "%(severalUsers)s 已更改其个人资料图像 %(count)s 次" }, "changed_name": { - "other": "%(oneUser)s 修改了自己的名称 %(count)s 次", - "one": "%(oneUser)s 修改了自己的名称" + "one": "%(oneUser)s 已更改其名称", + "other": "%(oneUser)s 已更改其名称 %(count)s 次" }, "changed_name_multiple": { - "other": "%(severalUsers)s 修改了他们的名称 %(count)s 次", - "one": "%(severalUsers)s 修改了他们的名称" + "one": "%(severalUsers)s 已更改其名称", + "other": "%(severalUsers)s 更改了其名称 %(count)s 次" }, + "format": "%(nameList)s %(transitionList)s", "hidden_event": { - "other": "%(oneUser)s发送了%(count)s条隐藏消息", - "one": "%(oneUser)s发送了一条隐藏消息" + "one": "%(oneUser)s 发送了一个隐藏消息", + "other": "%(oneUser)s 发送了 %(count)s 个隐藏消息" }, "hidden_event_multiple": { - "one": "%(severalUsers)s发送了一条隐藏消息", - "other": "%(severalUsers)s发送了%(count)s条隐藏消息" + "one": "%(severalUsers)s 发送了一个隐藏事件", + "other": "%(severalUsers)s 发送了 %(count)s 个隐藏消息" }, "invite_withdrawn": { - "other": "%(oneUser)s 撤回了他们的邀请共 %(count)s 次", - "one": "%(oneUser)s 撤回了他们的邀请" + "one": "%(oneUser)s 已撤消其邀请", + "other": "%(oneUser)s 已撤消其邀请 %(count)s 次" }, "invite_withdrawn_multiple": { - "other": "%(severalUsers)s 撤回了他们的邀请共 %(count)s 次", - "one": "%(severalUsers)s 撤回了他们的邀请" + "one": "已撤消 %(severalUsers)s 的邀请", + "other": "%(severalUsers)s 已撤消其邀请 %(count)s 次" }, "invited": { - "other": "被邀请 %(count)s 次", - "one": "被邀请" + "one": "被邀请", + "other": "已被邀请 %(count)s 次" }, "invited_multiple": { - "other": "被邀请 %(count)s 次", - "one": "被邀请" + "one": "已被邀请", + "other": "被邀请 %(count)s 次" }, "joined": { - "other": "%(oneUser)s 已加入 %(count)s 次", - "one": "%(oneUser)s 已加入" + "one": "%(oneUser)s 已加入", + "other": "%(oneUser)s 加入了 %(count)s 次" }, "joined_and_left": { - "other": "%(oneUser)s加入并离开了%(count)s次", - "one": "%(oneUser)s加入并离开了" + "one": "%(oneUser)s 已加入并离开", + "other": "%(oneUser)s 加入并离开了 %(count)s 次" }, "joined_and_left_multiple": { - "other": "%(severalUsers)s加入并离开了%(count)s次", - "one": "%(severalUsers)s加入并离开了" + "one": "%(severalUsers)s 加入并离开", + "other": "%(severalUsers)s 加入并离开 %(count)s 次" }, "joined_multiple": { - "other": "%(severalUsers)s 已加入 %(count)s 次", - "one": "%(severalUsers)s 已加入" + "one": "%(severalUsers)s 已加入", + "other": "%(severalUsers)s 加入了 %(count)s 次" }, "kicked": { "one": "被移除", - "other": "被移除%(count)s次" + "other": "已被移除 %(count)s 次" }, "kicked_multiple": { - "one": "被移除", - "other": "被移除了%(count)s次" + "one": "已被移除", + "other": "被移除 %(count)s 次" }, "left": { - "other": "%(oneUser)s 已离开 %(count)s 次", - "one": "%(oneUser)s 已离开" + "one": "%(oneUser)s 已离开", + "other": "%(oneUser)s 离开 %(count)s 次" }, "left_multiple": { - "other": "%(severalUsers)s 已离开 %(count)s 次", - "one": "%(severalUsers)s 已离开" + "one": "%(severalUsers)s 已离开", + "other": "%(severalUsers)s 离开 %(count)s 次" }, "no_change": { - "other": "%(oneUser)s 未做更改 %(count)s 次", - "one": "%(oneUser)s 未做更改" + "one": "%(oneUser)s 未产生任何更改", + "other": "%(oneUser)s未产生任何更改 %(count)s 次" }, "no_change_multiple": { - "other": "%(severalUsers)s 未做更改 %(count)s 次", - "one": "%(severalUsers)s 未做更改" + "one": "%(severalUsers)s 未产生任何更改", + "other": "%(severalUsers)s 未产生任何更改 %(count)s 次" }, "pinned_events": { - "one": "%(oneUser)s更改了房间的固定消息", - "other": "%(oneUser)s更改了房间的固定消息%(count)s次" + "one": "%(oneUser)s 更改了此房间的已置顶消息", + "other": "%(oneUser)s 已更改房间内的 已置顶消息 %(count)s 次" }, "pinned_events_multiple": { - "one": "%(severalUsers)s更改了房间的固定消息", - "other": "%(severalUsers)s更改了房间的固定消息%(count)s次" + "one": "%(severalUsers)s 已更改房间的 已置顶消息", + "other": "%(severalUsers) 已更改该房间的已置顶消息 %(count)s 次。" }, "redacted": { - "one": "%(oneUser)s移除了一条消息", - "other": "%(oneUser)s移除了%(count)s条消息" + "one": "%(oneUser)s 已移除一个消息", + "other": "%(oneUser)s 已移除 %(count)s 个消息" }, "redacted_multiple": { - "one": "%(severalUsers)s移除了1条消息", - "other": "%(severalUsers)s移除了%(count)s条消息" + "one": "%(severalUsers)s 已移除一个消息", + "other": "%(severalUsers)s 已移除 %(count)s 个消息" }, "rejected_invite": { - "other": "%(oneUser)s 拒绝了他们的邀请共 %(count)s 次", - "one": "%(oneUser)s 拒绝了他们的邀请" + "one": "%(oneUser)s 已拒绝其邀请", + "other": "%(oneUser)s 已拒绝其邀请 %(count)s 次" }, "rejected_invite_multiple": { - "one": "%(severalUsers)s 拒绝了他们的邀请", - "other": "%(severalUsers)s 拒绝了他们的邀请共 %(count)s 次" + "one": "%(severalUsers)s 已拒绝其邀请", + "other": "%(severalUsers)s 已拒绝其邀请 %(count)s 次" }, "rejoined": { - "other": "%(oneUser)s离开并重新加入了%(count)s次", - "one": "%(oneUser)s离开并重新加入了" + "one": "%(oneUser)s 离开并重新加入", + "other": "%(oneUser)s 离开并重新加入了 %(count)s 次" }, "rejoined_multiple": { - "other": "%(severalUsers)s离开并重新加入了%(count)s次", - "one": "%(severalUsers)s离开并重新加入了" + "one": "%(severalUsers)s 离开并重新加入", + "other": "%(severalUsers)s 离开并重新加入了 %(count)s 次" }, "unbanned": { - "other": "被解封 %(count)s 次", - "one": "被解封" + "one": "已被解封", + "other": "被解封 %(count)s 次" }, "unbanned_multiple": { "other": "被解封 %(count)s 次", @@ -2874,274 +3735,323 @@ "thread_info_basic": "来自消息列", "typing_indicator": { "more_users": { - "other": "%(names)s 与其他 %(count)s 位正在输入…", - "one": "%(names)s 与另一位正在输入…" + "one": "%(name)s 与剩余 1 个用户正在输入...", + "other": "%(names)s 与其他 %(count)s 个人正在输入…" }, "one_user": "%(displayName)s 正在输入…", - "two_users": "%(names)s和%(lastPerson)s正在输入……" - } + "two_users": "%(names)s 与其他 %(lastPerson)s 个人正在输入…" + }, + "undecryptable_tooltip": "此消息无法解密" }, "truncated_list_n_more": { - "other": "和 %(count)s 个其他…" + "other": "以及剩余 %(count)s 个…" }, + "unsupported_browser": { + "description": "如果继续,某些功能可能会停止运行,并且你将来可能会丢失数据。请更新浏览器以继续使用 %(brand)s。", + "title": "%(brand)s 不支持此浏览器" + }, + "unsupported_server_description": "此服务器正在使用旧版本的 Matrix。请升级到 Matrix %(version)s 以正常使用 %(brand)s。", + "unsupported_server_title": "服务器不支持", "update": { "changelog": "更改日志", "check_action": "检查更新", - "error_encountered": "遇到错误 (%(errorDetail)s)。", - "error_unable_load_commit": "无法加载提交详情:%(msg)s", - "new_version_available": "新版本可用。现在更新。", - "no_update": "没有可用更新。", - "release_notes_toast_title": "更新内容", - "see_changes_button": "有何新变动?", - "toast_description": "%(brand)s 有新版本可用", + "checking": "正在检查更新…", + "downloading": "正在下载更新…", + "error_encountered": "遇到错误(%(errorDetail)s)。", + "error_unable_load_commit": "无法载入提交的详细信息: %(msg)s", + "new_version_available": "有新版本可用。立即更新", + "no_update": "无可用更新。", + "release_notes_toast_title": "新特性", + "see_changes_button": "新增内容?", + "toast_description": "%(brand)s 有新版本可供更新", "toast_title": "更新 %(brand)s", - "unavailable": "无法获得" + "unavailable": "不可用" }, - "upload_failed_generic": "文件《%(fileName)s》上传失败。", - "upload_failed_size": "文件“%(fileName)s”超过了此家服务器的上传大小限制", + "update_room_access_modal": { + "description": "要创建共享链接,请将此房间设为公开,或启用用户申请加入的选项。这样,访客无需邀请即可加入。", + "dont_change_description": "如果你不想更改此房间的访问权限,你可以为通话链接创建一个新的房间。", + "no_change": "我不想更改访问权力。", + "revert_access_description": "(可在“房间设置”中将其恢复为先前的值:安全与隐私/访问)", + "title": "允许访客加入此房间" + }, + "upload_failed_generic": "文件“%(fileName)s”上传失败。", + "upload_failed_size": "文件“%(fileName)s”超出了此主服务器的上传大小限制", "upload_failed_title": "上传失败", "upload_file": { "cancel_all_button": "全部取消", - "error_file_too_large": "此文件过大而不能上传。文件大小限制是 %(limit)s 但此文件为 %(sizeOfThisFile)s。", - "error_files_too_large": "这些文件过大而不能上传。文件大小限制为 %(limit)s。", - "error_some_files_too_large": "一些文件过大而不能上传。文件大小限制为 %(limit)s。", - "error_title": "上传错误", + "error_file_too_large": "此文件太大,无法上传。文件大小限制为 %(limit)s,但此文件为 %(sizeOfThisFile)s。", + "error_files_too_large": "这些文件太大,无法上传。文件大小限制为 %(limit)s。", + "error_some_files_too_large": "某些文件过大,无法上传。文件大小限制为 %(limit)s。", + "error_title": "上传出错", + "not_image": "你选择的文件不是有效的图像文件。", "title": "上传文件", - "title_progress": "上传文件(%(total)s 中之 %(current)s)", + "title_progress": "上传文件(%(total)s 个中的第 %(current)s 个)", "upload_all_button": "全部上传", "upload_n_others_button": { - "other": "上传 %(count)s 个别的文件", - "one": "上传 %(count)s 个别的文件" + "one": "上传剩余 %(count)s 个文件", + "other": "上传剩余 %(count)s 个文件" } }, "user_info": { "admin_tools_section": "管理员工具", "ban_button_room": "从房间封禁", "ban_button_space": "从空间封禁", - "ban_room_confirm_title": "禁止进入 %(roomName)s", - "ban_space_everything": "禁止这些人做任何我有权决定的事", + "ban_room_confirm_title": "在 %(roomName)s 中封禁", + "ban_space_everything": "禁止他们访问我所能访问的一切", "ban_space_specific": "禁止这些人做某些我有权决定的事", "deactivate_confirm_action": "停用用户", - "deactivate_confirm_description": "停用此用户将会使其登出并阻止其再次登入。而且此用户也会离开其所在的所有房间。此操作不可逆。你确定要停用此用户吗?", - "deactivate_confirm_title": "停用用户吗?", + "deactivate_confirm_description": "停用此用户将移除其设备,并且无法重新登录。同时将离开其所在的所有房间。此操作无法撤消。你确定要停用此用户?", + "deactivate_confirm_title": "停用用户?", "demote_button": "降权", - "demote_self_confirm_description_space": "当你将自己降级后,你将无法撤销此更改。如果你是此空间的最后一名拥有权限的用户,则无法重新获得权限。", - "demote_self_confirm_room": "如果你是房间中最后一位拥有权限的用户,在你降低自己的权限等级后将无法撤销此修改,你将无法重新获得权限。", - "demote_self_confirm_title": "是否降低你自己的权限?", - "disinvite_button_room": "从房间取消邀请", - "disinvite_button_room_name": "取消邀请加入 %(roomName)s", - "disinvite_button_space": "从空间取消邀请", - "error_ban_user": "封禁失败", - "error_deactivate": "停用用户失败", - "error_kicking_user": "移除用户失败", - "error_mute_user": "禁言用户失败", - "error_revoke_3pid_invite_description": "无法撤销邀请。此服务器可能出现了临时错误,或者你没有足够的权限来撤销邀请。", - "error_revoke_3pid_invite_title": "撤销邀请失败", - "invited_by": "被 %(sender)s 邀请", - "jump_to_rr_button": "跳到阅读回执", + "demote_self_confirm_description_space": "由于你正在降级自身,因此无法撤消此更改。如果你是房间中最后一个拥有特权的用户,则无法重新获得特权。", + "demote_self_confirm_room": "由于你正在降级自身,因此无法撤消此更改。如果你是房间中最后一个拥有特权的用户,则无法重新获得特权。", + "demote_self_confirm_title": "降级自身?", + "disinvite_button_room": "撤消邀请", + "disinvite_button_room_name": "从 %(roomName)s 取消邀请", + "disinvite_button_space": "取消邀请", + "error_ban_user": "封禁用户失败", + "error_deactivate": "用户停用失败", + "error_kicking_user": "用户移除失败", + "error_mute_user": "静默用户失败", + "error_revoke_3pid_invite_description": "无法撤消邀请。服务器可能出现临时问题,或者你没有足够的权限撤消邀请。", + "error_revoke_3pid_invite_title": "邀请撤消失败", + "ignore_button": "忽略", + "ignore_confirm_description": "来自此用户的所有消息与邀请都将被隐藏。你确定要忽略?", + "ignore_confirm_title": "忽略 %(user)s", + "invited_by": "由 %(sender)s 邀请", + "jump_to_rr_button": "跳转到已读回执", "kick_button_room": "从房间移除", - "kick_button_room_name": "从%(roomName)s移除", + "kick_button_room_name": "从 %(roomName)s 移除", "kick_button_space": "从空间移除", - "kick_space_warning": "他们仍然可以访问任何你不是管理员的地方。", - "promote_warning": "你将无法撤回此修改,因为此用户的权力级别将与你相同。", + "kick_button_space_everything": "从我所能及的一切中将它们移除", + "kick_space_specific": "将它们从我能够处理的特定事物中移除", + "kick_space_warning": "他们仍然可以访问任何你不是管理员的空间。", + "promote_warning": "由于你正在将该用户提升为与你相同的权力值,因此你将无法撤消此更改。", "redact": { "confirm_button": { - "other": "删除 %(count)s 条消息", - "one": "删除 1 条消息" + "one": "移除 1 个消息", + "other": "移除 %(count)s 个消息" }, - "confirm_description_2": "对于大量消息,可能会消耗一段时间。在此期间请不要刷新你的客户端。", - "confirm_keep_state_explainer": "若你也想移除关于此用户的系统消息(例如,成员更改、用户资料更改……),则取消勾选", + "confirm_description_1": { + "one": "即将移除 %(user)s 发送的 %(count)s 个消息。这将永久删除对话中所有参与者的消息。是否继续?", + "other": "即将移除 %(user)s 发送的 %(count)s 个消息。这将永久删除对话中所有参与者的消息。是否继续?" + }, + "confirm_description_2": "如果消息量较大,这可能需要一些时间。在此期间请勿刷新客户端。", + "confirm_keep_state_explainer": "如果你还想移除此用户的系统消息(例如,成员关系变更、个人资料变更等),请取消选中。", "confirm_keep_state_label": "保留系统消息", - "confirm_title": "删除 %(user)s 最近发送的消息", - "no_recent_messages_description": "请尝试在时间线中向上滚动以查看是否有更早的。", - "no_recent_messages_title": "没有找到 %(user)s 最近发送的消息" + "confirm_title": "移除 %(user)s 最近的信息", + "no_recent_messages_description": "尝试向上滚动时间线,查看是否有更早的消息。", + "no_recent_messages_title": "未找到 %(user)s 的最近信息" }, - "redact_button": "移除最近消息", - "revoke_invite": "撤销邀请", - "room_encrypted": "此房间内的消息端到端加密。", - "room_encrypted_detail": "你的消息是安全的,只有你和接收者有解开它们的唯一密钥。", - "room_unencrypted": "此房间内的消息未端到端加密。", - "room_unencrypted_detail": "在加密房间中,你的消息是安全的,只有你和接收者有解开它们的唯一密钥。", - "share_button": "分享链接给其他用户", - "unban_button_room": "从房间取消解封", - "unban_button_space": "从空间取消封锁", - "unban_room_confirm_title": "解除 %(roomName)s 禁令", + "redact_button": "移除消息", + "revoke_invite": "撤消申请", + "room_encrypted": "此处的消息是端到端加密的。", + "room_encrypted_detail": "你的消息是安全的,只有你与对方拥有解锁它们的唯一密钥。", + "room_unencrypted": "在此房间中的消息非端到端加密。", + "room_unencrypted_detail": "在加密房间中你的消息是安全的,只有你与收件人拥有解密它们的唯一密钥。", + "send_message": "发送消息", + "share_button": "分享个人资料", + "unban_button_room": "从房间解封", + "unban_button_space": "从空间解封", + "unban_room_confirm_title": "从 %(roomName)s 解封", "unban_space_everything": "解除我权限范围内对这些人的所有禁令", "unban_space_specific": "解除我权限范围内对这些人的某些禁令", - "unban_space_warning": "他们将无法访问你不是管理员的一切。", + "unban_space_warning": "如果你不是管理员,他们将无法访问。", + "unignore_button": "取消忽略", + "verification_unavailable": "用户验证不可用", "verify_button": "验证用户", - "verify_explainer": "为了更加安全,在你两个设备上检查一次性代码来验证此用户。" + "verify_explainer": "为了提高安全性,请通过检查两台设备上的一次性代码来验证此用户。" }, "user_menu": { + "link_new_device": "关联新设备", "settings": "所有设置", - "switch_theme_dark": "切换到深色模式", - "switch_theme_light": "切换到浅色模式" + "switch_theme_dark": "切换为深色模式", + "switch_theme_light": "切换为浅色模式" }, "voip": { - "already_in_call": "正在通话中", - "already_in_call_person": "你正在与其通话。", + "already_in_call": "已在通话中", + "already_in_call_person": "你已正在与此人通话。", "answered_elsewhere": "已在别处接听", - "answered_elsewhere_description": "已在另一台设备上接听了此通话。", - "call_failed": "呼叫失败", + "answered_elsewhere_description": "通话已在其它设备上接听。", + "call_failed": "通话失败", "call_failed_description": "无法建立通话", - "call_failed_media": "通话失败,因为无法使用摄像头或麦克风。请检查:", - "call_failed_media_applications": "没有其他应用程序正在使用摄像头", - "call_failed_media_connected": "已插入并正确设置麦克风和摄像头", - "call_failed_media_permissions": "授权使用摄像头", - "call_failed_microphone": "呼叫失败,因为无法使用任何麦克风。 检查是否已插入并正确设置麦克风。", - "call_held": "%(peerName)s 挂起了通话", - "call_held_resume": "你挂起了通话 恢复", - "call_held_switch": "你挂起了通话 切换", + "call_failed_media": "通话失败,因为无法访问摄像头或麦克风。请检查:", + "call_failed_media_applications": "无其它应用程序使用摄像头", + "call_failed_media_connected": "麦克风与摄像头已插入并正确设置", + "call_failed_media_permissions": "已授予摄像头使用权", + "call_failed_microphone": "通话失败,因为无法访问麦克风。请检查麦克风是否已插入并正确设置。", + "call_held": "%(peerName)s 已挂起通话", + "call_held_resume": "你正在通话 恢复", + "call_held_switch": "你正在通话 切换", "call_toast_unknown_room": "未知房间", - "camera_disabled": "你的摄像头已关闭", - "camera_enabled": "你的摄像头仍然处于启用状态", - "cannot_call_yourself_description": "你不能打给自己。", - "connecting": "连接中", - "connection_lost": "已丢失与服务器的连接", - "connection_lost_description": "你不能在未连接到服务器时进行呼叫。", - "consulting": "与 %(transferTarget)s 进行协商。转让至 %(transferee)s", + "camera_disabled": "摄像头已关闭", + "camera_enabled": "摄像头仍处于开启状态", + "cannot_call_yourself_description": "你无法与自己通话。", + "close_lobby": "关闭大厅", + "connecting": "正在连接", + "connection_lost": "与服务器的连接已丢失", + "connection_lost_description": "在未连接到服务器的情况下,你无法拨打电话。", + "consulting": "正在与 %(transferTarget)s 协商。转接到 %(transferee)s", + "decline_call": "拒绝", "default_device": "默认设备", "dial": "拨号", "dialpad": "拨号盘", - "disable_camera": "关闭相机", + "disable_camera": "关闭摄像头", "disable_microphone": "静音麦克风", - "disabled_no_perms_start_video_call": "你没有权限开始视频通话", - "disabled_no_perms_start_voice_call": "你没有权限开始语音通话", - "disabled_ongoing_call": "正在进行的通话", - "enable_camera": "启动相机", + "disabled_no_perms_start_video_call": "你无权发起视频通话", + "disabled_no_perms_start_voice_call": "你无权发起语音通话", + "disabled_ongoing_call": "通话中", + "element_call": "Element Call", + "enable_camera": "打开摄像头", "enable_microphone": "取消静音麦克风", - "expand": "返回通话", + "expand": "返回到通话", + "get_call_link": "分享通话链接", "hangup": "挂断", - "hide_sidebar_button": "隐藏侧边栏", + "hide_sidebar_button": "隐藏边栏", "input_devices": "输入设备", - "maximise": "填满屏幕", - "misconfigured_server": "服务器配置错误导致通话失败", - "misconfigured_server_description": "请联系你的家服务器(%(homeserverDomain)s)的管理员配置 TURN 服务器,以确保通话过程稳定。", + "jitsi_call": "Jitsi 会议", + "legacy_call": "旧版通话", + "maximise": "填充屏幕", + "maximise_call": "最大化", + "metaspace_video_rooms": { + "conference_room_section": "会议" + }, + "minimise_call": "最小化", + "misconfigured_server": "由于服务器配置错误,通话失败", + "misconfigured_server_description": "请要求主服务器 (%(homeserverDomain)s) 的管理员配置 TURN 服务器,以确保通话可靠运行。", + "misconfigured_server_fallback": "或者,你可以尝试使用位于 的公共服务器,但这不完全可靠,并且会与该服务器共享 IP 地址。你也可以在“设置”中管理此设置。", + "misconfigured_server_fallback_accept": "尝试使用 %(server)s", "more_button": "更多", "msisdn_lookup_failed": "无法查询电话号码", - "msisdn_lookup_failed_description": "查询电话号码时发生错误", - "msisdn_transfer_failed": "无法转移通话", + "msisdn_lookup_failed_description": "查询电话号码时出错", + "msisdn_transfer_failed": "无法转接通话", "n_people_joined": { - "one": "%(count)s个人已加入", - "other": "%(count)s个人已加入" + "one": "%(count)s 个人已加入", + "other": "%(count)s 个人已加入" }, - "no_audio_input_description": "我们没能在你的设备上找到麦克风。请检查设置并重试。", + "no_audio_input_description": "我们未在此设备上找到麦克风。请检查设置并重试。", "no_audio_input_title": "未找到麦克风", - "no_media_perms_description": "你可能需要手动授权 %(brand)s 使用你的麦克风或摄像头", - "no_media_perms_title": "没有媒体存取权限", + "no_media_perms_description": "你可能需要手动允许 %(brand)s 访问你的麦克风或摄像头。", + "no_media_perms_title": "无媒体权限", "no_permission_conference": "需要权限", - "no_permission_conference_description": "你没有在此房间发起通话会议的权限", + "no_permission_conference_description": "你无权在此房间启动会议通话", "on_hold": "保留 %(name)s", "output_devices": "输出设备", "screenshare_monitor": "分享整个屏幕", "screenshare_title": "分享内容", "screenshare_window": "应用程序窗口", - "show_sidebar_button": "显示侧边栏", - "silence": "通话静音", + "show_sidebar_button": "显示边栏", + "silence": "静音通话", "silenced": "通知已静音", - "start_screenshare": "开始分享你的屏幕", - "stop_screenshare": "停止分享你的屏幕", - "too_many_calls": "太多通话", + "skip_lobby_toggle_option": "立即加入", + "start_screenshare": "开始分享屏幕", + "stop_screenshare": "停止分享屏幕", + "too_many_calls": "呼叫频繁", "too_many_calls_description": "你已达到同时通话的最大数量。", - "transfer_consult_first_label": "先询问", - "transfer_failed": "转移失败", - "transfer_failed_description": "通话转移失败", - "unable_to_access_audio_input_description": "我们无法访问你的麦克风。 请检查浏览器设置并重试。", + "transfer_consult_first_label": "优先咨询", + "transfer_failed": "传输失败", + "transfer_failed_description": "通话转接失败", + "unable_to_access_audio_input_description": "我们无法访问麦克风。请检查浏览器设置并重试。", "unable_to_access_audio_input_title": "无法访问你的麦克风", - "unable_to_access_media": "无法使用摄像头/麦克风", - "unable_to_access_microphone": "无法使用麦克风", - "unknown_caller": "未知来电人", - "unknown_person": "陌生人", + "unable_to_access_media": "无法访问摄像头或麦克风", + "unable_to_access_microphone": "无法访问麦克风", + "unknown_caller": "未知呼叫方", + "unknown_person": "未知人员", "unsilence": "开启声音", - "unsupported": "不支持通话", - "unsupported_browser": "你无法在此浏览器中进行呼叫。", - "user_busy": "用户正忙", - "user_busy_description": "你所呼叫的用户正忙。", - "user_is_presenting": "%(sharerName)s 正在展示", + "unsupported": "不支持的通话", + "unsupported_browser": "你无法在此浏览器中执行通话。", + "user_busy": "用户忙", + "user_busy_description": "你呼叫的用户正忙。", + "user_is_presenting": "%(sharerName)s 正在分享", "video_call": "视频通话", - "video_call_started": "视频通话已开始", + "video_call_incoming": "视频通话来电", + "video_call_started": "已开始视频通话", + "video_call_using": "视频通话时使用:", "voice_call": "语音通话", - "you_are_presenting": "你正在展示" + "voice_call_incoming": "语音通话来电", + "voice_call_using": "语音通话时使用:", + "you_are_presenting": "你正在演示" }, - "web_default_device_name": "%(appName)s:%(browserName)s在%(osName)s", - "welcome_to_element": "欢迎来到 Element", + "web_default_device_name": "%(appName)s:%(browserName)s 运行于 %(osName)s", + "welcome_to_element": "欢迎使用 Element", "widget": { - "added_by": "挂件添加者", + "added_by": "小部件添加者:", "capabilities_dialog": { - "content_starting_text": "此挂件想要:", + "content_starting_text": "此小部件期望:", "decline_all_permission": "全部拒绝", - "remember_Selection": "记住我对此挂件的选择", - "title": "批准挂件权限" + "remember_Selection": "记住我对此小部件的选择", + "title": "批准小部件权限" }, "capability": { - "always_on_screen_generic": "运行时始终保留在你的屏幕上", - "always_on_screen_viewing_another_room": "运行时始终保留在你的屏幕上,即使你在浏览其它房间", - "any_room": "以上,但也包括你加入或被邀请的任何房间中", - "byline_empty_state_key": "附带一个空的状态键(state key)", + "always_on_screen_generic": "运行期间持续显示于屏幕", + "always_on_screen_viewing_another_room": "正在运行并且正在查看另一个房间时持续保留在屏幕上", + "any_room": "同上,但在任何你加入或被邀请到的房间中也是如此", + "byline_empty_state_key": "使用空状态值", "byline_state_key": "附带有状态键(state key)%(stateKey)s", - "capability": "%(capability)s 容量", + "capability": "%(capability)s 能力", "change_avatar_active_room": "更改活跃房间的头像", - "change_avatar_this_room": "更改当前房间的头像", + "change_avatar_this_room": "更改此房间的头像", "change_name_active_room": "更改活跃房间的名称", - "change_name_this_room": "更改当前房间的名称", - "change_topic_active_room": "更改当前活跃房间的话题", - "change_topic_this_room": "更改当前房间的话题", - "receive_membership_active_room": "查看人们何时加入、离开或被邀请到你所活跃的房间", - "receive_membership_this_room": "查看人们加入、离开或被邀请到此房间的时间", - "remove_ban_invite_leave_active_room": "移除、封禁或邀请他人加入你的活跃房间,方可离开", - "remove_ban_invite_leave_this_room": "移除、封禁或邀请他人加入此房间,方可离开", - "see_avatar_change_active_room": "查看你的活跃房间的头像何时修改", - "see_avatar_change_this_room": "查看此房间的头像何时被修改", - "see_event_type_sent_active_room": "查看你的活跃房间中发送的 %(eventType)s 事件", - "see_event_type_sent_this_room": "查看此房间中发送的 %(eventType)s 事件", - "see_images_sent_active_room": "查看发布到你所活跃的房间的图片", - "see_images_sent_this_room": "查看发布到此房间的图片", - "see_messages_sent_active_room": "查看发布到你所活跃的房间的消息", + "change_name_this_room": "更改在此房间的名称", + "change_topic_active_room": "更改活跃房间的主题", + "change_topic_this_room": "更改此房间的主题", + "download_file": "从媒体仓库下载文件", + "receive_membership_active_room": "查看活跃房间何时有人加入、离开或被邀请", + "receive_membership_this_room": "查看此房间何时有人加入、离开或被邀请", + "remove_ban_invite_leave_active_room": "移除、禁止或邀请他人进入活跃房间并使你离开", + "remove_ban_invite_leave_this_room": "移除、禁止或邀请他人进入此房间并使你离开", + "see_avatar_change_active_room": "查看活跃房间中的头像何时被更改", + "see_avatar_change_this_room": "查看此房间的头像何时被更改", + "see_event_type_sent_active_room": "查看发布到活跃房间的 %(eventType)s 事件", + "see_event_type_sent_this_room": "查看发布到此房间的 %(eventType)s 事件", + "see_images_sent_active_room": "查看发送到活跃房间的图像", + "see_images_sent_this_room": "查看发布到此房间的图像", + "see_messages_sent_active_room": "查看发送到活跃房间的消息", "see_messages_sent_this_room": "查看发布到此房间的消息", - "see_msgtype_sent_active_room": "查看发布到你所活跃的房间的 %(msgtype)s 消息", + "see_msgtype_sent_active_room": "查看发布活跃房间的 %(msgtype)s 消息", "see_msgtype_sent_this_room": "查看发布到此房间的 %(msgtype)s 消息", - "see_name_change_active_room": "查看你的活跃房间的名称何时被修改", - "see_name_change_this_room": "查看此房间的名称何时被修改", - "see_sent_emotes_active_room": "查看发布到你所活跃的房间的表情", + "see_name_change_active_room": "查看活跃房间中的名称何时被更改", + "see_name_change_this_room": "查看此房间的名称何时被更改", + "see_sent_emotes_active_room": "查看发送到活跃房间的表情", "see_sent_emotes_this_room": "查看发布到此房间的表情", - "see_sent_files_active_room": "查看发布到你所活跃的房间的一般性文件", - "see_sent_files_this_room": "查看发布到此房间的一般性文件", - "see_sticker_posted_active_room": "查看何时有人发送贴纸到你所活跃的房间", - "see_sticker_posted_this_room": "查看此房间中何时有人发送贴纸", - "see_text_messages_sent_active_room": "查看发布到你所活跃的房间的文本消息", - "see_text_messages_sent_this_room": "查看发布到此房间的文本消息", - "see_topic_change_active_room": "查看你的活跃房间的话题何时被修改", - "see_topic_change_this_room": "查看此房间的话题何时被修改", - "see_videos_sent_active_room": "查看发布到你所活跃的房间的视频", + "see_sent_files_active_room": "查看发布到活跃房间的普通文件", + "see_sent_files_this_room": "查看发送到此房间的普通文件", + "see_sticker_posted_active_room": "查看任何人发布到活跃房间的贴纸", + "see_sticker_posted_this_room": "查看此房间的贴纸何时被发送", + "see_text_messages_sent_active_room": "查看发布到活跃房间的文本消息", + "see_text_messages_sent_this_room": "查看发送到活跃房间的文本消息", + "see_topic_change_active_room": "查看活跃房间中的主题何时被更改", + "see_topic_change_this_room": "查看此房间的主题何时被更改", + "see_videos_sent_active_room": "查看发送到活跃房间的视频", "see_videos_sent_this_room": "查看发布到此房间的视频", - "send_emotes_active_room": "在你所活跃的房间以你的身份发送表情", - "send_emotes_this_room": "在此房间以你的身份发送表情", - "send_event_type_active_room": "以你的身份在你的活跃房间发送%(eventType)s事件", + "send_emotes_active_room": "以你的身份在活跃房间发送表情", + "send_emotes_this_room": "以你的身份在此房间发送表情", + "send_event_type_active_room": "以你的身份在活跃房间中发送%(eventType)s事件", "send_event_type_this_room": "以你的身份在此房间发送 %(eventType)s 事件", - "send_files_active_room": "在你所活跃的房间以你的身份发送一般性文件", - "send_files_this_room": "查看发布到此房间的一般性文件", - "send_images_active_room": "在你所活跃的房间以你的身份发送图片", - "send_images_this_room": "在此房间以你的身份发送图片", - "send_messages_active_room": "在你所活跃的房间以你的身份发送消息", - "send_messages_this_room": "在此房间以你的身份发送消息", - "send_msgtype_active_room": "在你所活跃的房间以你的身份发送 %(msgtype)s 消息", - "send_msgtype_this_room": "在此房间以你的身份发送 %(msgtype)s 消息", - "send_stickers_active_room": "发送贴纸到你的活跃房间", - "send_stickers_active_room_as_you": "发送贴纸到你所活跃的房间", - "send_stickers_this_room": "发送贴纸到此房间", - "send_stickers_this_room_as_you": "以你的身份发送贴纸到此房间", - "send_text_messages_active_room": "在你所活跃的房间以你的身份发送文本消息", - "send_text_messages_this_room": "在此房间以你的身份发送文本消息", - "send_videos_active_room": "查看发布到你所活跃的房间的视频", - "send_videos_this_room": "查看发布到此房间的视频", + "send_files_active_room": "以你的身份在活跃房间发送普通文件", + "send_files_this_room": "以你的身份在此房间发送普通文件", + "send_images_active_room": "以你的身份在活跃房间发送图像", + "send_images_this_room": "以你的身份在此房间发送图片", + "send_messages_active_room": "以你的身份在活跃房间发送消息", + "send_messages_this_room": "以你的身份在此房间中发送信息", + "send_msgtype_active_room": "以你的身份在活跃房间中发送%(msgtype)s消息", + "send_msgtype_this_room": "以你的身份在此房间发送 %(msgtype)s 消息", + "send_stickers_active_room": "向你的活跃房间发送贴纸", + "send_stickers_active_room_as_you": "以你的身份在活跃房间发送贴纸", + "send_stickers_this_room": "在此房间发送贴纸", + "send_stickers_this_room_as_you": "以你的身份在此房间中发送贴纸", + "send_text_messages_active_room": "以你的身份在活跃房间发送文本消息", + "send_text_messages_this_room": "以你的身份在此房间发送文本消息", + "send_videos_active_room": "以你的身份在活跃房间发送视频", + "send_videos_this_room": "以你的身份在此房间发送视频", "specific_room": "以上,但也包括 ", - "switch_room": "更改当前正在查看哪个房间", - "switch_room_message_user": "更改当前正在查看哪个房间、消息或用户" + "switch_room": "更改你正在查看的房间", + "switch_room_message_user": "更改正在查看的房间、消息或用户" }, - "close_to_view_right_panel": "关闭此小部件以在此面板中查看", + "close_to_view_right_panel": "关闭此小部件以在此面板查看", "context_menu": { - "delete": "删除挂件", - "delete_warning": "删除挂件时将为房间中的所有成员删除。你确定要删除此挂件吗?", + "delete": "删除小部件", + "delete_warning": "删除小部件的同时会为该房间中的所有用户删除。你确定要删除此小部件?", "move_left": "向左移动", "move_right": "向右移动", "remove": "为所有人删除", @@ -3149,71 +4059,75 @@ "screenshot": "拍照", "start_audio_stream": "开始音频流" }, - "cookie_warning": "此挂件可能使用 cookie。", - "error_hangup_description": "你已断开通话。(错误:%(message)s)", + "cookie_warning": "此小部件可能会使用 Cookies。", + "error_hangup_description": "通话已中断。(错误:(message)s)", "error_hangup_title": "连接丢失", - "error_loading": "加载挂件时发生错误", - "error_mixed_content": "错误 - 混合内容", - "error_need_invite_permission": "你需要有邀请用户的权限才能进行此操作。", - "error_need_kick_permission": "你需要能够移除用户才能做到那件事。", + "error_loading": "载入小部件时出错", + "error_mixed_content": "错误:混合内容", + "error_need_invite_permission": "你需要能邀请用户才能验证。", + "error_need_kick_permission": "你需要能踢出用户以执行此操作。", "error_need_to_be_logged_in": "你需要登录。", - "error_unable_start_audio_stream_description": "无法开始音频流媒体。", - "error_unable_start_audio_stream_title": "开始流直播失败", - "modal_data_warning": "此屏幕上的数据与%(widgetDomain)s分享", - "modal_title_default": "模态框挂件(Modal Widget)", - "no_name": "未知应用", + "error_unable_start_audio_stream_description": "无法开始音频串流。", + "error_unable_start_audio_stream_title": "无法开始直播", + "modal_data_warning": "以下数据将分享给 %(widgetDomain)s", + "modal_title_default": "模态窗口小部件", + "no_name": "未知 App", "open_id_permissions_dialog": { - "remember_selection": "记住", - "starting_text": "挂件将会验证你的用户 ID,但将无法为你执行动作:", - "title": "允许此挂件验证你的身份" + "remember_selection": "记住我的选择", + "starting_text": "此小部件将验证你的用户 ID,但无法为你执行以下操作:", + "title": "允许此小部件验证你的身份" }, - "popout": "在弹出式窗口中打开挂件", - "set_room_layout": "将我的房间布局设置给所有人", - "shared_data_avatar": "您的个人资料图片URL", - "shared_data_device_id": "你的设备ID", + "popout": "弹出小部件", + "set_room_layout": "为所有人布局", + "shared_data_avatar": "个人资料图像 URL", + "shared_data_device_id": "你的设备 ID", + "shared_data_lang": "你的语言", "shared_data_mxid": "你的用户 ID", "shared_data_name": "你的显示名称", "shared_data_room_id": "房间 ID", "shared_data_theme": "你的主题", "shared_data_url": "%(brand)s 的链接", - "shared_data_warning": "使用此挂件可能会和 %(widgetDomain)s 共享数据 。", - "shared_data_warning_im": "使用此挂件可能会与 %(widgetDomain)s 及您的集成管理器共享数据 。", - "shared_data_widget_id": "挂件 ID", - "unencrypted_warning": "挂件不适用消息加密。", - "unmaximise": "取消最大化", - "unpin_to_view_right_panel": "取消固定此小部件以在此面板中查看" + "shared_data_warning": "使用此小部件可能会与 %(widgetDomain)s 共享数据 。", + "shared_data_warning_im": "使用此小部件可能会与 %(widgetDomain)s 与你的集成管理器共享数据 。", + "shared_data_widget_id": "小部件 ID", + "unencrypted_warning": "小部件不使用消息加密。", + "unmaximise": "还原尺寸", + "unpin_to_view_right_panel": "取消钉住此小部件以在此面板中查看" }, "zxcvbn": { "suggestions": { - "allUppercase": "全大写的密码通常比全小写的更容易猜测", - "anotherWord": "再加一两个词。不常见的词更好。", - "associatedYears": "避免与你相关联的年份", - "capitalization": "大写字母并没有很大的作用", - "dates": "避免与你相关联的日期与年份", - "l33t": "可预见的替换如将 '@' 替换为 'a' 并不会有太大效果", - "longerKeyboardPattern": "使用变化更丰富的字符组合方式", - "noNeed": "不一定要有符号、数字或大写字母", - "recentYears": "避免年份", - "repeated": "避免重复词语与字符", - "reverseWords": "把单词倒过来不会比原来的难猜很多", - "sequences": "避免递增或递减的序列", - "useWords": "用一些字符,避免常用短语" + "allUppercase": "全大写几乎与全小写一样容易被猜测到", + "anotherWord": "再加一两个词。不常用的词更好。", + "associatedYears": "避免与你相关的年份", + "capitalization": "大写字母对密码强度的帮助不大", + "dates": "避免使用与你相关的日期与年份", + "l33t": "像用“@”代替“a”这样可预料的替换行为并没有什么帮助", + "longerKeyboardPattern": "使用更复杂的击键序列", + "noNeed": "不需要符号、数字或大写字母", + "pwned": "如果你在其它地方使用此密码,则应进行更改。", + "recentYears": "避免近些年", + "repeated": "避免重复的单词与字符", + "reverseWords": "颠倒的单词很难被猜测到", + "sequences": "避免使用序列", + "useWords": "使用若干单词,避免常用口令" }, "warnings": { - "common": "这是一个非常常见的密码", - "commonNames": "常用姓名和姓氏很容易被猜到", - "dates": "日期通常很容易被猜到", - "extendedRepeat": "像 “abcabcabc” 这样的重复字符也只比 “abc” 稍微难猜一点点", - "keyPattern": "键位短序列很容易被猜到", - "namesByThemselves": "姓名和姓氏本身很容易被猜到", - "recentYears": "最近的年份很容易被猜到", - "sequences": "像 abc 或 6543 这样的序列很容易被猜到", - "similarToCommon": "这类似于一个常用密码", - "simpleRepeat": "像 “aaa” 这样的重复字符很容易被猜到", - "straightRow": "键位在一条直线上的组合很容易被猜到", - "topHundred": "这是百大常用密码之一", - "topTen": "这是十大常用密码之一", - "wordByItself": "单词本身很容易被猜到" + "common": "此为常见密码", + "commonNames": "常用姓、名容易被猜测到", + "dates": "日期通常容易被猜测到", + "extendedRepeat": "像“abcabcabc”之类的重复单词比“abc”更难猜测到。", + "keyPattern": "简短的击键序列容易被猜测到", + "namesByThemselves": "姓、名容易被猜测到", + "pwned": "你的密码因 Internet 上的数据泄露而暴露。", + "recentYears": "近年来很容易猜到", + "sequences": "像“abc”或“6543”之类的序列容易被猜测到", + "similarToCommon": "这像是常用密码", + "simpleRepeat": "像“aaa”之类的重复的字符容易被猜测到", + "straightRow": "在同一列且连续的字母容易被猜测到", + "topHundred": "这是百大常用密码", + "topTen": "这是十大常用密码", + "userInputs": "不应有任何个人或页面相关数据。", + "wordByItself": "单词很容易猜测到" } } } diff --git a/packages/shared-components/src/i18n/strings/fr.json b/packages/shared-components/src/i18n/strings/fr.json index b9583de5b4..6ca3001216 100644 --- a/packages/shared-components/src/i18n/strings/fr.json +++ b/packages/shared-components/src/i18n/strings/fr.json @@ -34,6 +34,7 @@ "common": { "attachment": "Pièce jointe", "encryption_enabled": "Chiffrement activé", + "loading": "Chargement…", "options": "Options", "preferences": "Préférences", "state_encryption_enabled": "Chiffrement expérimental de l'état activé" diff --git a/packages/shared-components/src/i18n/strings/zh_Hans.json b/packages/shared-components/src/i18n/strings/zh_Hans.json index 7377fbbf45..ddb7ab1c4c 100644 --- a/packages/shared-components/src/i18n/strings/zh_Hans.json +++ b/packages/shared-components/src/i18n/strings/zh_Hans.json @@ -1,15 +1,141 @@ { + "a11y": { + "seek_bar_label": "音频定位栏" + }, "action": { + "back": "返回", + "click": "点击", + "collapse": "折叠", "delete": "删除", "dismiss": "忽略", + "download": "下载", + "edit": "编辑", "explore_rooms": "查找房间", + "go": "转到", + "hide": "隐藏", + "invite": "邀请", + "new_room": "新房间", + "new_video_room": "新视频房间", "pause": "暂停", + "pin": "置顶", "play": "播放", - "search": "搜索" + "react": "反应", + "remove": "移除", + "reply": "回复", + "reply_in_thread": "在消息列中回复", + "retry": "重试", + "search": "搜索", + "start_chat": "开始聊天", + "unpin": "取消置顶", + "view_source": "查看源代码" + }, + "common": { + "attachment": "附件", + "encryption_enabled": "加密已启用", + "options": "选项", + "preferences": "偏好", + "state_encryption_enabled": "实验性的状态加密已启用" }, "left_panel": { "open_dial_pad": "打开拨号键盘" }, + "notifications": { + "all_messages": "所有消息", + "default_settings": "跟随系统设置", + "mentions_keywords": "提及与关键词", + "mute_room": "静默房间" + }, + "room": { + "context_menu": { + "title": "房间选项" + }, + "history_visibility_badge": { + "private": "新成员不能看到历史", + "shared": "新成员可以看到历史", + "world_readable": "任何人都可以看到历史" + }, + "jump_to_date": "跳转到日期", + "jump_to_date_beginning": "房间的开头", + "jump_to_date_prompt": "选择日期以跳转", + "pinned_message_badge": "已被置顶的消息", + "status_bar": { + "delete_all": "全部删除", + "exceeded_resource_limit_description": "要继续使用此服务请联系服务器管理员。", + "exceeded_resource_limit_title": "你的消息未能发送,因为此服务器已超出资源限制。", + "failed_to_create_room_title": "无法与此用户开始聊天", + "homeserver_blocked_title": "你的消息未能发送,因为此服务器已被其管理员屏蔽。", + "monthly_user_limit_reached_title": "你的消息未能发送,因为此服务器已达到每月活跃用户上限。", + "requires_consent_agreement_title": "你需要同意我们的条款与条件才能发送任意消息。", + "retry_all": "全部重试", + "select_messages_to_retry": "你可以选择全部或个别消息以重试或删除。", + "server_connectivity_lost_description": "已发送的消息将保存直到恢复连接。", + "server_connectivity_lost_title": "已断开与服务器的连接。", + "some_messages_not_sent": "你的某些消息未能发送。" + } + }, + "room_list": { + "appearance": "外观", + "collapse_filters": "折叠过滤器列表", + "empty": { + "no_chats": "暂无聊天", + "no_chats_description": "首先向人们发送消息或创建房间。", + "no_chats_description_no_room_rights": "开始向某人发送消息", + "no_favourites": "你还没有收藏聊天", + "no_favourites_description": "你可以在聊天设置中将聊天添加到收藏夹", + "no_invites": "你没有任何未读邀请", + "no_lowpriority": "你没有任何低优先级房间", + "no_mentions": "你没有任何未读提及", + "no_people": "你尚未与任何人私聊", + "no_people_description": "你可以取消选择筛选条件,以便查看其它聊天记录", + "no_rooms": "尚未处于任何房间", + "no_rooms_description": "你可以取消选择筛选条件,以便查看其它聊天记录", + "no_unread": "恭喜!你没有任何未读消息", + "show_activity": "查看所有活动", + "show_chats": "显示所有聊天" + }, + "expand_filters": "展开过滤器列表", + "filters": { + "favourite": "收藏", + "invites": "邀请", + "low_priority": "低优先级", + "mentions": "提及", + "people": "人员", + "rooms": "房间", + "unread": "未读" + }, + "list_title": "房间列表", + "more_options": { + "copy_link": "复制房间链接", + "favourited": "已收藏", + "leave_room": "离开房间", + "low_priority": "低优先级", + "mark_read": "设为已读", + "mark_unread": "设为未读" + }, + "notification_options": "通知选项", + "open_space_menu": "打开空间菜单", + "primary_filters": "房间列表筛选器", + "room": { + "more_options": "更多选项" + }, + "room_options": "房间选项", + "show_message_previews": "显示消息预览", + "sort": "排序", + "sort_type": { + "activity": "活动", + "unread_first": "未读优先" + }, + "space_menu": { + "home": "空间主页", + "space_settings": "空间设置" + } + }, + "terms": { + "tac_button": "阅读条款与条件" + }, + "threads": { + "error_start_thread_existing_relation": "无法从现有相关的事件中创建消息列" + }, "time": { "about_day_ago": "约一天前", "about_hour_ago": "约一小时前", @@ -27,9 +153,61 @@ "n_minutes_ago": "%(num)s分钟前" }, "timeline": { + "decryption_failure": { + "blocked": "由于你的设备未经验证,发件人已阻止你接收此消息。", + "historical_event_no_key_backup": "消息历史在此设备上不可用", + "historical_event_unverified_device": "你需要验证此设备才能访问历史消息", + "historical_event_user_not_joined": "你无权访问此消息", + "sender_identity_previously_verified": "发送者的数字身份已重置。", + "sender_unsigned_device": "从不安全的设备发送。", + "unable_to_decrypt": "无法解密消息" + }, + "download_action_decrypting": "正在解密", + "download_action_downloading": "正在下载", "m.audio": { + "audio_player": "音频播放器", "error_downloading_audio": "下载音频时出错", "unnamed_audio": "未命名的音频" + }, + "m.file": { + "error_invalid": "无效文件" + }, + "m.room.encryption": { + "disable_attempt": "已忽略尝试禁用加密", + "disabled": "加密未启用", + "enabled": "此处的消息是端到端加密的。当人员加入时,你可以在其个人资料中点击其头像验证。", + "enabled_dm": "此处的消息是端到端加密的。点击其个人资料图像以验证 %(displayName)s。", + "enabled_local": "此聊天中的消息将被端到端加密。", + "parameters_changed": "某些加密参数已被更改。", + "state_enabled": "此房间内的消息与状态事件已被端到端加密。当人员加入时,你可以点击他们的头像以验证其身份。", + "unsupported": "该房间使用的加密方式不受支持。" + }, + "mab": { + "collapse_reply_chain": "折叠引用", + "copy_link_thread": "复制关联到此消息列的链接", + "expand_reply_chain": "展开引用", + "label": "消息操作", + "view_in_room": "在房间中查看" + }, + "message_timestamp_received_at": "接收于 %(dateTime)s", + "message_timestamp_sent_at": "发送于 %(dateTime)s", + "url_preview": { + "close": "关闭预览", + "show_n_more": { + "one": "显示剩余 %(count)s 个预览", + "other": "显示剩余 %(count)s 个预览" + }, + "view_image": "查看图像" + } + }, + "widget": { + "context_menu": { + "move_left": "向左移动", + "move_right": "向右移动", + "remove": "为所有人移除", + "revoke": "撤消权限", + "screenshot": "拍摄照片", + "start_audio_stream": "开始音频串流" } } } From 4afba408c056347754c12f0974328604c2c1745e Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 17 Apr 2026 10:01:27 +0100 Subject: [PATCH 05/11] Satisfy pnpm audit (#33142) --- package.json | 31 +- pnpm-lock.yaml | 2058 ++++++++++++++++++++++--------------------- pnpm-workspace.yaml | 4 + 3 files changed, 1048 insertions(+), 1045 deletions(-) diff --git a/package.json b/package.json index 5a69e3d1bf..026c4b4b03 100644 --- a/package.json +++ b/package.json @@ -93,37 +93,22 @@ "testcontainers": "^11.0.0", "matrix-widget-api": "^1.17.0", "qs": "6.15.0", - "serialize-javascript": "7.0.5", - "atomically": "2.1.1", "@types/node": "18.19.130", "config-file-ts": "0.2.8-rc1", "node-abi": "4.27.0", "@types/pg-pool": "2.0.7", - "flatted@3.4.1": "3.4.2", "ajv@6.12.6": "6.14.0", "ajv@>=8 <8.18.0": "8.18.0", - "bn.js@4.12.2": "4.12.3", - "bn.js@5.2.2": "5.2.3", - "brace-expansion@1.1.12": "1.1.13", - "brace-expansion@2.0.2": "2.0.3", - "brace-expansion@5.0.4": "5.0.5", - "handlebars@4.7.8": "4.7.9", - "path-to-regexp@0.1.12": "1.9.0", - "path-to-regexp@8.3.0": "8.4.2", - "picomatch@2.3.1": "2.3.2", - "picomatch@4.0": "4.0.4", - "rollup@4.57.1": "4.60.1", - "smol-toml@1.6.0": "1.6.1", - "svgo@3.3.2": "3.3.3", - "svgo@4.0.0": "4.0.1", - "underscore@1.13.7": "1.13.8", - "yaml@1.10.2": "1.10.3", - "yaml@2.8.2": "2.8.3", - "undici@7.22.2": "7.24.7", - "@xmldom/xmldom@0.8.11": "0.9.9", + "axios@>1.0.0 <1.15.0": "1.15.0", + "picomatch@>=4.0.0 <4.0.4": "4.0.4", "esbuild@<=0.24.2": "0.27.4", "esbuild@~0.27.0": "0.27.4", - "minimatch@>=10.0.0 <10.2.3": ">=10.2.3" + "minimatch@>=10.0.0 <10.2.3": ">=10.2.3", + "lodash@4.17.23": "4.18.1", + "follow-redirects@1.15.11": "1.16.0", + "@actions/github@6.0.1": "8.0.1", + "dompurify@>=3.0.0 <=3.3.3": "3.4.0", + "protobufjs@>=7.0.0 <7.5.5": "7.5.5" } }, "engines": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 661f27c438..66831ca077 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,10 +26,10 @@ catalogs: version: 1.59.1 react: specifier: ^19.0.0 - version: 19.2.5 + version: 19.2.4 react-dom: specifier: ^19.0.0 - version: 19.2.5 + version: 19.2.4 typescript: specifier: 5.9.3 version: 5.9.3 @@ -45,39 +45,24 @@ overrides: testcontainers: ^11.0.0 matrix-widget-api: ^1.17.0 qs: 6.15.0 - serialize-javascript: 7.0.5 - atomically: 2.1.1 '@types/node': 18.19.130 config-file-ts: 0.2.8-rc1 node-abi: 4.27.0 '@types/pg-pool': 2.0.7 - flatted@3.4.1: 3.4.2 ajv@6.12.6: 6.14.0 ajv@>=8 <8.18.0: 8.18.0 - bn.js@4.12.2: 4.12.3 - bn.js@5.2.2: 5.2.3 - brace-expansion@1.1.12: 1.1.13 - brace-expansion@2.0.2: 2.0.3 - brace-expansion@5.0.4: 5.0.5 - handlebars@4.7.8: 4.7.9 - path-to-regexp@0.1.12: 1.9.0 - path-to-regexp@8.3.0: 8.4.2 - picomatch@2.3.1: 2.3.2 - picomatch@4.0: 4.0.4 - rollup@4.57.1: 4.60.1 - smol-toml@1.6.0: 1.6.1 - svgo@3.3.2: 3.3.3 - svgo@4.0.0: 4.0.1 - underscore@1.13.7: 1.13.8 - yaml@1.10.2: 1.10.3 - yaml@2.8.2: 2.8.3 - undici@7.22.2: 7.24.7 - '@xmldom/xmldom@0.8.11': 0.9.9 + axios@>1.0.0 <1.15.0: 1.15.0 + picomatch@>=4.0.0 <4.0.4: 4.0.4 esbuild@<=0.24.2: 0.27.4 esbuild@~0.27.0: 0.27.4 minimatch@>=10.0.0 <10.2.3: '>=10.2.3' + lodash@4.17.23: 4.18.1 + follow-redirects@1.15.11: 1.16.0 + '@actions/github@6.0.1': 8.0.1 + dompurify@>=3.0.0 <=3.3.3: 3.4.0 + protobufjs@>=7.0.0 <7.5.5: 7.5.5 -packageExtensionsChecksum: sha256-OFePh8Fn8A1ZEWgJF51vTMPT/HEVyXQyj6YGIztPb0w= +packageExtensionsChecksum: sha256-EMEi1vcyzQthk7O/0AcntvnHgJaKCoFBlzp6iX/qNYk= patchedDependencies: '@matrix-org/react-sdk-module-api': @@ -135,10 +120,10 @@ importers: version: 0.6.0 '@nx-tools/nx-container': specifier: ^7.2.1 - version: 7.2.1(@nx/devkit@22.6.5(nx@22.6.5))(@nx/js@22.6.5(@babel/traverse@7.29.0)(nx@22.6.5))(dotenv@17.4.0)(nx@22.6.5)(tslib@2.8.1) + version: 7.2.1(@nx/devkit@22.5.3(nx@22.6.5))(@nx/js@22.5.3(@babel/traverse@7.29.0)(nx@22.6.5))(dotenv@17.4.0)(nx@22.6.5)(tslib@2.8.1) '@nx/jest': specifier: ^22.5.0 - version: 22.6.5(@babel/traverse@7.29.0)(@types/node@18.19.130)(babel-plugin-macros@3.1.0)(nx@22.6.5)(typescript@5.9.3) + version: 22.5.3(@babel/traverse@7.29.0)(@types/node@18.19.130)(babel-plugin-macros@3.1.0)(nx@22.6.5)(typescript@5.9.3) '@playwright/test': specifier: 'catalog:' version: 1.59.1 @@ -150,18 +135,18 @@ importers: version: 3.14.0 eslint-plugin-matrix-org: specifier: ^3.0.0 - version: 3.0.0(882721dbd3307f2fde4046d20d66d9fc) + version: 3.0.0(d28b6cfeddcbcf776e114e7554fcab7e) husky: specifier: ^9.0.0 version: 9.1.7 knip: specifier: 6.3.0 - version: 6.3.0(patch_hash=9ee905cce2466e391db69dfcea905b0fe2502afd935d1dc6a6ac94ffe2855c28)(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + version: 6.3.0(patch_hash=9ee905cce2466e391db69dfcea905b0fe2502afd935d1dc6a6ac94ffe2855c28)(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1) lint-staged: specifier: ^16.0.0 version: 16.4.0 lodash: - specifier: ^4.17.21 + specifier: 4.18.1 version: 4.18.1 mermaid: specifier: ^11.13.0 @@ -185,7 +170,7 @@ importers: specifier: ^2.0.17 version: 2.0.17(mermaid@11.14.0)(vitepress@1.6.4(@algolia/client-search@5.50.0)(@types/node@18.19.130)(@types/react@19.2.10)(axios@1.15.0)(jwt-decode@4.0.0)(lightningcss@1.32.0)(postcss@8.5.8)(qrcode@1.5.4)(search-insights@2.17.3)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(typescript@5.9.3)) yaml: - specifier: 2.8.3 + specifier: ^2.3.3 version: 2.8.3 apps/desktop: @@ -220,7 +205,7 @@ importers: version: 7.29.0 '@babel/preset-env': specifier: ^7.18.10 - version: 7.29.2(@babel/core@7.29.0) + version: 7.29.0(@babel/core@7.29.0) '@babel/preset-typescript': specifier: ^7.18.6 version: 7.28.5(@babel/core@7.29.0) @@ -232,7 +217,7 @@ importers: version: 1.59.1 '@stylistic/eslint-plugin': specifier: ^5.0.0 - version: 5.10.0(eslint@8.57.1) + version: 5.9.0(eslint@8.57.1) '@types/auto-launch': specifier: ^5.0.1 version: 5.0.5(patch_hash=b60dc9846a11a1684ce52c55493f29ea398d3dc44b88f66ab44e9843d6c01538) @@ -250,7 +235,7 @@ importers: version: 11.1.8 '@typescript-eslint/eslint-plugin': specifier: ^8.0.0 - version: 8.58.1(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + version: 8.57.2(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: ^8.0.0 version: 8.58.0(eslint@8.57.1)(typescript@5.9.3) @@ -289,7 +274,7 @@ importers: version: 2.32.0(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1) eslint-plugin-matrix-org: specifier: ^3.0.0 - version: 3.0.0(882721dbd3307f2fde4046d20d66d9fc) + version: 3.0.0(d28b6cfeddcbcf776e114e7554fcab7e) eslint-plugin-n: specifier: ^17.12.0 version: 17.24.0(eslint@8.57.1)(typescript@5.9.3) @@ -325,7 +310,7 @@ importers: dependencies: '@babel/runtime': specifier: ^7.12.5 - version: 7.29.2 + version: 7.28.6 '@element-hq/element-web-module-api': specifier: workspace:* version: link:../../packages/module-api @@ -349,7 +334,7 @@ importers: version: 1.5.0 '@matrix-org/react-sdk-module-api': specifier: ^2.4.0 - version: 2.5.0(patch_hash=016146c9cc96e6363609d2b2ac0896ccef567882eb1d73b75a77b8a30929de96)(react@19.2.5) + version: 2.5.0(patch_hash=016146c9cc96e6363609d2b2ac0896ccef567882eb1d73b75a77b8a30929de96)(react@19.2.4) '@sentry/browser': specifier: ^10.0.0 version: 10.47.0 @@ -358,13 +343,13 @@ importers: version: 1.0.2 '@vector-im/compound-design-tokens': specifier: 'catalog:' - version: 10.1.0(@types/react@19.2.10)(react@19.2.5) + version: 10.1.0(@types/react@19.2.10)(react@19.2.4) '@vector-im/compound-web': specifier: 'catalog:' - version: 9.1.0(@fontsource/inconsolata@5.2.8)(@fontsource/inter@5.2.8)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(@vector-im/compound-design-tokens@10.1.0(@types/react@19.2.10)(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + version: 9.1.0(@fontsource/inconsolata@5.2.8)(@fontsource/inter@5.2.8)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(@vector-im/compound-design-tokens@10.1.0(@types/react@19.2.10)(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@vector-im/matrix-wysiwyg': specifier: 2.40.0 - version: 2.40.0(patch_hash=7bdf6150f2905bc2f055a6bcaa7b9d78fa7ffde82e800bcc454ac7b0096bd65e)(react@19.2.5) + version: 2.40.0(patch_hash=7bdf6150f2905bc2f055a6bcaa7b9d78fa7ffde82e800bcc454ac7b0096bd65e)(react@19.2.4) '@zxcvbn-ts/core': specifier: ^3.0.4 version: 3.0.4 @@ -430,7 +415,7 @@ importers: version: 2.6.0 html-react-parser: specifier: ^5.2.2 - version: 5.2.17(@types/react@19.2.10)(react@19.2.5) + version: 5.2.17(@types/react@19.2.10)(react@19.2.4) is-ip: specifier: ^5.0.0 version: 5.0.1 @@ -457,7 +442,7 @@ importers: version: 1.0.3 matrix-js-sdk: specifier: github:matrix-org/matrix-js-sdk#develop - version: https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/ca5655bced1cbb215ac1c18e179384a069d98b0a + version: https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/eb7acfb810d2989c0fe61c490083ff9d72c44013 matrix-widget-api: specifier: ^1.17.0 version: 1.17.0 @@ -487,28 +472,28 @@ importers: version: 1.5.4 re-resizable: specifier: 6.11.2 - version: 6.11.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + version: 6.11.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: specifier: 'catalog:' - version: 19.2.5 + version: 19.2.4 react-beautiful-dnd: specifier: ^13.1.0 - version: 13.1.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + version: 13.1.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react-blurhash: specifier: ^0.3.0 - version: 0.3.0(patch_hash=58bc7f075478017ce27bcc252e8509876390db106246bd5b0a7446642cc4b505)(blurhash@2.0.5)(react@19.2.5) + version: 0.3.0(patch_hash=58bc7f075478017ce27bcc252e8509876390db106246bd5b0a7446642cc4b505)(blurhash@2.0.5)(react@19.2.4) react-dom: specifier: 'catalog:' - version: 19.2.5(react@19.2.5) + version: 19.2.4(react@19.2.4) react-focus-lock: specifier: ^2.5.1 - version: 2.13.7(@types/react@19.2.10)(react@19.2.5) + version: 2.13.7(@types/react@19.2.10)(react@19.2.4) react-string-replace: specifier: ^2.0.0 version: 2.0.1 react-transition-group: specifier: ^4.4.1 - version: 4.4.5(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + version: 4.4.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) rfc4648: specifier: ^1.4.0 version: 1.5.4 @@ -575,7 +560,7 @@ importers: version: 7.29.0(@babel/core@7.29.0) '@babel/preset-env': specifier: ^7.12.11 - version: 7.29.2(@babel/core@7.29.0) + version: 7.29.0(@babel/core@7.29.0) '@babel/preset-react': specifier: ^7.12.10 version: 7.28.5(@babel/core@7.29.0) @@ -611,7 +596,7 @@ importers: version: 5.1.1(encoding@0.1.13)(webpack@5.105.4) '@stylistic/eslint-plugin': specifier: ^5.0.0 - version: 5.10.0(eslint@8.57.1) + version: 5.9.0(eslint@8.57.1) '@svgr/webpack': specifier: ^8.0.0 version: 8.1.0(typescript@5.9.3) @@ -623,7 +608,7 @@ importers: version: 6.9.1 '@testing-library/react': specifier: ^16.0.0 - version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@testing-library/user-event': specifier: ^14.5.2 version: 14.6.1(@testing-library/dom@10.4.1) @@ -710,7 +695,7 @@ importers: version: 0.7.39 '@typescript-eslint/eslint-plugin': specifier: ^8.19.0 - version: 8.58.1(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + version: 8.57.2(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: ^8.19.0 version: 8.58.0(eslint@8.57.1)(typescript@5.9.3) @@ -755,13 +740,13 @@ importers: version: 2.32.0(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1) eslint-plugin-jest: specifier: ^29.0.0 - version: 29.15.2(@typescript-eslint/eslint-plugin@8.58.1(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(jest@30.3.0(@types/node@18.19.130)(babel-plugin-macros@3.1.0))(typescript@5.9.3) + version: 29.15.0(@typescript-eslint/eslint-plugin@8.57.2(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(jest@30.3.0(@types/node@18.19.130)(babel-plugin-macros@3.1.0))(typescript@5.9.3) eslint-plugin-jsx-a11y: specifier: ^6.5.1 version: 6.10.2(eslint@8.57.1) eslint-plugin-matrix-org: specifier: ^3.0.0 - version: 3.0.0(882721dbd3307f2fde4046d20d66d9fc) + version: 3.0.0(d28b6cfeddcbcf776e114e7554fcab7e) eslint-plugin-react: specifier: ^7.28.0 version: 7.37.5(eslint@8.57.1) @@ -913,7 +898,7 @@ importers: specifier: ^0.5.0 version: 0.5.0(webpack@5.105.4) yaml: - specifier: 2.8.3 + specifier: ^2.3.3 version: 2.8.3 packages/module-api: @@ -923,11 +908,11 @@ importers: version: 3.6.0 react: specifier: ^19 - version: 19.2.5 + version: 19.2.4 devDependencies: '@matrix-org/react-sdk-module-api': specifier: ^2.5.0 - version: 2.5.0(patch_hash=016146c9cc96e6363609d2b2ac0896ccef567882eb1d73b75a77b8a30929de96)(react@19.2.5) + version: 2.5.0(patch_hash=016146c9cc96e6363609d2b2ac0896ccef567882eb1d73b75a77b8a30929de96)(react@19.2.4) '@microsoft/api-extractor': specifier: ^7.49.1 version: 7.56.0(@types/node@18.19.130) @@ -1001,7 +986,7 @@ importers: specifier: ^11.0.0 version: 11.14.0 yaml: - specifier: 2.8.3 + specifier: ^2.7.0 version: 2.8.3 devDependencies: '@element-hq/element-web-module-api': @@ -1027,7 +1012,7 @@ importers: version: 1.16.0 '@vector-im/compound-design-tokens': specifier: 'catalog:' - version: 10.1.0(@types/react@19.2.10)(react@19.2.5) + version: 10.1.0(@types/react@19.2.10)(react@19.2.4) classnames: specifier: ^2.5.1 version: 2.5.1 @@ -1036,13 +1021,13 @@ importers: version: 0.18.6 html-react-parser: specifier: ^5.2.2 - version: 5.2.17(@types/react@19.2.10)(react@19.2.5) + version: 5.2.17(@types/react@19.2.10)(react@19.2.4) linkify-html: specifier: 4.3.2 version: 4.3.2(patch_hash=1761c1eabe25d9fae83f74f27a20b3d24515840a4a8747bb04828df46bcfdea2)(linkifyjs@4.3.2) linkify-react: specifier: 4.3.2 - version: 4.3.2(linkifyjs@4.3.2)(react@19.2.5) + version: 4.3.2(linkifyjs@4.3.2)(react@19.2.4) linkify-string: specifier: 4.3.2 version: 4.3.2(linkifyjs@4.3.2) @@ -1057,16 +1042,16 @@ importers: version: 3.6.0 react-blurhash: specifier: ^0.3.0 - version: 0.3.0(patch_hash=58bc7f075478017ce27bcc252e8509876390db106246bd5b0a7446642cc4b505)(blurhash@2.0.5)(react@19.2.5) + version: 0.3.0(patch_hash=58bc7f075478017ce27bcc252e8509876390db106246bd5b0a7446642cc4b505)(blurhash@2.0.5)(react@19.2.4) react-merge-refs: specifier: ^3.0.2 - version: 3.0.2(react@19.2.5) + version: 3.0.2(react@19.2.4) react-resizable-panels: specifier: ^4.6.5 - version: 4.7.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + version: 4.7.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react-virtuoso: specifier: ^4.14.0 - version: 4.18.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + version: 4.18.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) temporal-polyfill: specifier: ^0.3.0 version: 0.3.2 @@ -1082,37 +1067,37 @@ importers: version: 5.2.8 '@matrix-org/react-sdk-module-api': specifier: ^2.5.0 - version: 2.5.0(patch_hash=016146c9cc96e6363609d2b2ac0896ccef567882eb1d73b75a77b8a30929de96)(react@19.2.5) + version: 2.5.0(patch_hash=016146c9cc96e6363609d2b2ac0896ccef567882eb1d73b75a77b8a30929de96)(react@19.2.4) '@playwright/test': specifier: 'catalog:' version: 1.59.1 '@storybook/addon-a11y': specifier: ^10.0.7 - version: 10.3.5(storybook@10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)) + version: 10.2.19(storybook@10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) '@storybook/addon-designs': specifier: ^11.0.1 - version: 11.1.3(@storybook/addon-docs@10.3.5(@types/react@19.2.10)(esbuild@0.27.4)(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.27.4)))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)) + version: 11.1.2(@storybook/addon-docs@10.2.19(@types/react@19.2.10)(esbuild@0.27.4)(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.27.4)))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) '@storybook/addon-docs': specifier: ^10.0.7 - version: 10.3.5(@types/react@19.2.10)(esbuild@0.27.4)(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.27.4)) + version: 10.2.19(@types/react@19.2.10)(esbuild@0.27.4)(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.27.4)) '@storybook/addon-vitest': specifier: ^10.1.11 - version: 10.3.5(@vitest/browser-playwright@4.1.2)(@vitest/browser@4.1.2(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2))(@vitest/runner@4.1.2)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vitest@4.1.2) + version: 10.2.19(@vitest/browser-playwright@4.1.2)(@vitest/browser@4.1.2(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2))(@vitest/runner@4.1.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vitest@4.1.2) '@storybook/icons': specifier: ^2.0.0 - version: 2.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + version: 2.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@storybook/react-vite': specifier: ^10.0.7 - version: 10.3.5(esbuild@0.27.4)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(typescript@5.9.3)(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.27.4)) + version: 10.2.19(esbuild@0.27.4)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.27.4)) '@stylistic/eslint-plugin': specifier: ^5.7.0 - version: 5.10.0(eslint@8.57.1) + version: 5.9.0(eslint@8.57.1) '@testing-library/dom': specifier: ^10.4.1 version: 10.4.1 '@testing-library/react': specifier: ^16.3.2 - version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@testing-library/user-event': specifier: ^14.6.1 version: 14.6.1(@testing-library/dom@10.4.1) @@ -1130,19 +1115,19 @@ importers: version: 19.2.3(@types/react@19.2.10) '@typescript-eslint/eslint-plugin': specifier: ^8.53.1 - version: 8.58.1(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + version: 8.57.2(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': specifier: ^8.53.1 version: 8.58.0(eslint@8.57.1)(typescript@5.9.3) '@vector-im/compound-web': specifier: 'catalog:' - version: 9.1.0(@fontsource/inconsolata@5.2.8)(@fontsource/inter@5.2.8)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(@vector-im/compound-design-tokens@10.1.0(@types/react@19.2.10)(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + version: 9.1.0(@fontsource/inconsolata@5.2.8)(@fontsource/inter@5.2.8)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(@vector-im/compound-design-tokens@10.1.0(@types/react@19.2.10)(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@vitest/browser-playwright': specifier: ^4.0.17 - version: 4.1.2(playwright@1.59.1)(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2) + version: 4.1.2(playwright@1.59.1)(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2) '@vitest/coverage-v8': specifier: ^4.0.17 - version: 4.1.2(@vitest/browser@4.1.2(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2))(vitest@4.1.2) + version: 4.1.2(@vitest/browser@4.1.2(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2))(vitest@4.1.2) eslint: specifier: '8' version: 8.57.1 @@ -1163,7 +1148,7 @@ importers: version: 6.10.2(eslint@8.57.1) eslint-plugin-matrix-org: specifier: ^3.0.0 - version: 3.0.0(882721dbd3307f2fde4046d20d66d9fc) + version: 3.0.0(d28b6cfeddcbcf776e114e7554fcab7e) eslint-plugin-react: specifier: ^7.37.5 version: 7.37.5(eslint@8.57.1) @@ -1175,7 +1160,7 @@ importers: version: 7.0.1(eslint@8.57.1) eslint-plugin-storybook: specifier: ^10.0.7 - version: 10.3.5(eslint@8.57.1)(storybook@10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(typescript@5.9.3) + version: 10.2.13(eslint@8.57.1)(storybook@10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) eslint-plugin-unicorn: specifier: ^56.0.0 version: 56.0.1(eslint@8.57.1) @@ -1184,10 +1169,10 @@ importers: version: 3.8.1 storybook: specifier: ^10.0.7 - version: 10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + version: 10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) storybook-addon-vis: specifier: ^3.1.2 - version: 3.1.5(@storybook/addon-vitest@10.3.5(@vitest/browser-playwright@4.1.2)(@vitest/browser@4.1.2(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2))(@vitest/runner@4.1.2)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vitest@4.1.2))(@vitest/browser-playwright@4.1.2)(@vitest/browser@4.1.2(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2))(babel-plugin-macros@3.1.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(typescript@5.9.3)(vitest@4.1.2) + version: 3.1.2(@storybook/addon-vitest@10.2.19(@vitest/browser-playwright@4.1.2)(@vitest/browser@4.1.2(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2))(@vitest/runner@4.1.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vitest@4.1.2))(@vitest/browser-playwright@4.1.2)(@vitest/browser@4.1.2(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2))(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vitest@4.1.2) typedoc: specifier: ^0.28.16 version: 0.28.18(typescript@5.9.3) @@ -1202,16 +1187,16 @@ importers: version: 5.9.3 vite: specifier: ^8.0.0 - version: 8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + version: 8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) vite-plugin-dts: specifier: ^4.5.4 - version: 4.5.4(@types/node@18.19.130)(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(typescript@5.9.3)(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.5.4(@types/node@18.19.130)(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(typescript@5.9.3)(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) vite-plugin-node-polyfills: specifier: ^0.26.0 - version: 0.26.0(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 0.26.0(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) vitest: specifier: ^4.0.18 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@18.19.130)(@vitest/browser-playwright@4.1.2)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@18.19.130)(@vitest/browser-playwright@4.1.2)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) vitest-sonar-reporter: specifier: ^3.0.0 version: 3.0.0(vitest@4.1.2) @@ -1230,11 +1215,11 @@ packages: '@action-validator/core@0.6.0': resolution: {integrity: sha512-tPglwCr8Mm8SWzwnVewwFmqRx91F0WvMsM0BRAqH4CLalyGndm53Xvp+UcUSzswpk1wkjIDYI7RyEhWMLyPkig==} - '@actions/github@6.0.1': - resolution: {integrity: sha512-xbZVcaqD4XnQAe35qSQqskb3SqIAfRyLBrHMd/8TuL7hJSz2QtbDwnNM8zWx4zO5l2fnGtseNE3MbEvD7BxVMw==} + '@actions/github@8.0.1': + resolution: {integrity: sha512-cue7mS+kx1/2Dnc/094pitRUm+0uPXVXYVaqOdZwD15BsXATWYHW3idJDYOlyBc5gJlzAQ/w5YLU4LR8D7hjVg==} - '@actions/http-client@2.2.3': - resolution: {integrity: sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA==} + '@actions/http-client@3.0.2': + resolution: {integrity: sha512-JP38FYYpyqvUsz+Igqlc/JG6YO9PaKuvqjM3iGvaLqFnJ7TFmcLyy2IDrY0bI0qCQug8E9K+elv5ZNfw62ZJzA==} '@actions/io@1.1.3': resolution: {integrity: sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==} @@ -1379,8 +1364,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-define-polyfill-provider@0.6.8': - resolution: {integrity: sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==} + '@babel/helper-define-polyfill-provider@0.6.6': + resolution: {integrity: sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -1968,8 +1953,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/preset-env@7.29.2': - resolution: {integrity: sha512-DYD23veRYGvBFhcTY1iUvJnDNpuqNd/BzBwCvzOTKUnJjKg5kpUBh3/u9585Agdkgj+QuygG7jLfOPWMa2KVNw==} + '@babel/preset-env@7.29.0': + resolution: {integrity: sha512-fNEdfc0yi16lt6IZo2Qxk3knHVdfMYX33czNb4v8yWhemoBhibCpQK/uYHtSKIiO+p/zd3+8fYVXhQdOVV608w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1991,8 +1976,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.29.2': - resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} + '@babel/runtime@7.28.6': + resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} engines: {node: '>=6.9.0'} '@babel/template@7.28.6': @@ -2482,14 +2467,14 @@ packages: '@element-hq/element-call-embedded@0.18.0': resolution: {integrity: sha512-Fg2VlORZWkQ9t9OJTcWFXCwVzlHVLtkaiCF0qFTCOZSYYHlA3kXDRM8TagjLkIoOVR6y+9xZldbwejgKYUS9xw==} - '@emnapi/core@1.9.2': - resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} + '@emnapi/core@1.8.1': + resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} - '@emnapi/runtime@1.9.2': - resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} + '@emnapi/runtime@1.8.1': + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} - '@emnapi/wasi-threads@1.2.1': - resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} '@esbuild/aix-ppc64@0.27.4': resolution: {integrity: sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==} @@ -2665,10 +2650,6 @@ packages: resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@fastify/busboy@2.1.1': - resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} - engines: {node: '>=14'} - '@fastify/otel@0.16.0': resolution: {integrity: sha512-2304BdM5Q/kUvQC9qJO1KZq3Zn1WWsw+WWkVmFEaj1UE2hEIiuFqrPeglQOwEtw/ftngisqfQ3v70TWMmwhhHA==} peerDependencies: @@ -2815,8 +2796,8 @@ packages: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} - '@istanbuljs/schema@0.1.6': - resolution: {integrity: sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==} + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} '@jest/console@30.3.0': @@ -2911,11 +2892,11 @@ packages: resolution: {integrity: sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@joshwooding/vite-plugin-react-docgen-typescript@0.7.0': - resolution: {integrity: sha512-qvsTEwEFefhdirGOPnu9Wp6ChfIwy2dBCRuETU3uE+4cC+PFoxMSiiEhxk4lOluA34eARHA0OxqsEUYDqRMgeQ==} + '@joshwooding/vite-plugin-react-docgen-typescript@0.6.4': + resolution: {integrity: sha512-6PyZBYKnnVNqOSB0YFly+62R7dmov8segT27A+RVTBVd4iAE6kbW9QBJGlyR2yG4D4ohzhZSTIu7BK1UTtmFFA==} peerDependencies: typescript: '>= 4.3.x' - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 peerDependenciesMeta: typescript: optional: true @@ -3278,129 +3259,177 @@ packages: nx: '>=18.0.0 <23.0.0' tslib: ^2.6.0 - '@nx/devkit@22.6.5': - resolution: {integrity: sha512-9kvAI+kk2pfEXLqS8OyjI9XvWmp+Gdn7jPfxDAz8BOqxMyPy3p5hYl+jc4TIsLOWunAFl8azqrcYsHzEpaWCIA==} + '@nx/devkit@22.5.3': + resolution: {integrity: sha512-zhRNTFsi4pbwg7L/zhBHtTOSevlgwm1iKlhPlQWoOv2PR6b+3JvjL8o4P1MbkIkut3Lsn+oTuJJ1LUPlr5vprg==} peerDependencies: nx: '>= 21 <= 23 || ^22.0.0-0' - '@nx/jest@22.6.5': - resolution: {integrity: sha512-Px+ROXwl3s8tjS3OEVMtNY5krQ2zAWyK7s922zmtbXjNKGZ8bg6krnkq7n5XpQwyXTZNVxku8TXcN7jXZECGFQ==} + '@nx/jest@22.5.3': + resolution: {integrity: sha512-4yaGlApTR09zdz4fC4Ep0aENcaon5rDRDOUnEJblU67ik35jds9mczHq2rBMJO4Cnjj1pM9acm08Vb0Wg+9cuQ==} - '@nx/js@22.6.5': - resolution: {integrity: sha512-bmikz6qaBHfuAgsqPB/TfLIKfvI4g+EKIRAiU2FHnEtVWOKDAmSQXHFwE3rMS49jl2JLgxkdNjZHpg4g/OLy0g==} + '@nx/js@22.5.3': + resolution: {integrity: sha512-gglQYL6GeSH0mt6NpEFTXMFFFePU3B7TEyZq7LLUYZDH5y65izgNpdSAuEqYR7xHLtahVnesDlhPw3rtRiwMwA==} peerDependencies: verdaccio: ^6.0.5 peerDependenciesMeta: verdaccio: optional: true + '@nx/nx-darwin-arm64@22.5.3': + resolution: {integrity: sha512-cKXBq5bJanXp8uv6+wPvx/G4q4oFpOxMSPGaeFOVhbul2QHGGq+XMcSo+D8aYJCsk1YnbyAnnQ8r8RH/kTK5Mw==} + cpu: [arm64] + os: [darwin] + '@nx/nx-darwin-arm64@22.6.5': resolution: {integrity: sha512-qT77Omkg5xQuL2+pDbneX2tI+XW5ZeayMylu7UUgK8OhTrAkJLKjpuYRH4xT5XBipxbDtlxmO3aLS3Ib1pKzJQ==} cpu: [arm64] os: [darwin] + '@nx/nx-darwin-x64@22.5.3': + resolution: {integrity: sha512-mToS41o8I+8CfxYVRMTISkgT7I1cnazgwMf7U9DoLqKOwOZzj9WD3NmsWc1h69QNJPltbeRPS8y/wnhu7RHzRA==} + cpu: [x64] + os: [darwin] + '@nx/nx-darwin-x64@22.6.5': resolution: {integrity: sha512-9jICxb7vfJ56y/7Yuh3b/n1QJqWxO9xnXKYEs6SO8xPoW/KomVckILGc1C6RQSs6/3ixVJC7k1Dh1wm5tKPFrg==} cpu: [x64] os: [darwin] + '@nx/nx-freebsd-x64@22.5.3': + resolution: {integrity: sha512-CAWysdFSZVbTfdjNXojd9TgXbZiK9i0k3njROeV+jORsDWw4Eth3PDmK94Wk916b3n2hS0UjyI6RZaMy2GEqzA==} + cpu: [x64] + os: [freebsd] + '@nx/nx-freebsd-x64@22.6.5': resolution: {integrity: sha512-6B1wEKpqz5dI3AGMqttAVnA6M3DB/besAtuGyQiymK9ROlta1iuWgCcIYwcCQyhLn2Rx7vqj447KKcgCa8HlVw==} cpu: [x64] os: [freebsd] + '@nx/nx-linux-arm-gnueabihf@22.5.3': + resolution: {integrity: sha512-PRjPrijQQbdrvYwNuA3xQ3VXEQ4zfhnPjy+S2ZlQZqhFI4mlP22xfhOH1bQ7pIfzCNC2f/J9UMNYOrq/bEFjBg==} + cpu: [arm] + os: [linux] + '@nx/nx-linux-arm-gnueabihf@22.6.5': resolution: {integrity: sha512-xV50B8mnDPboct7JkAHftajI02s+8FszA8WTzhore+YGR+lEKHTLpucwGEaQuMlSdLplH7pQix4B4uK5pcMhZw==} cpu: [arm] os: [linux] + '@nx/nx-linux-arm64-gnu@22.5.3': + resolution: {integrity: sha512-dmDBio/5z4Zch2VlRMdgBPm53d8xwq1l7xLj1dFMKjfE7ByfPukjPM7ZEYBiPckfiQfJBRh6HKDN7uEkA/y8CQ==} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@nx/nx-linux-arm64-gnu@22.6.5': resolution: {integrity: sha512-2JkWuMGj+HpW6oPAvU5VdAx1afTnEbiM10Y3YOrl3fipWV4BiP5VDx762QTrfCraP4hl6yqTgvTe7F9xaby+jQ==} cpu: [arm64] os: [linux] libc: [glibc] + '@nx/nx-linux-arm64-musl@22.5.3': + resolution: {integrity: sha512-E81ET/MnnKfuLhKiovF5ueJirHOMjhC1eK0MDM2Do9wdPyusZzfGSVFQ9DOHtg7L37dAE95NNd1lCVO8gJ96vg==} + cpu: [arm64] + os: [linux] + libc: [musl] + '@nx/nx-linux-arm64-musl@22.6.5': resolution: {integrity: sha512-Z/zMqFClnEyqDXouJKEPoWVhMQIif5F0YuECWBYjd3ZLwQsXGTItoh+6Wm3XF/nGMA2uLOHyTq/X7iFXQY3RzA==} cpu: [arm64] os: [linux] libc: [musl] + '@nx/nx-linux-x64-gnu@22.5.3': + resolution: {integrity: sha512-AgXCsPCzC0sAu2VRclMjs7LrvPQfqS3sFiehlXWTbNHQitPZLuAmQGb2l4T8lbMOs0Xn3EIrg6BF6/ntTTp6Xg==} + cpu: [x64] + os: [linux] + libc: [glibc] + '@nx/nx-linux-x64-gnu@22.6.5': resolution: {integrity: sha512-FlotSyqNnaXSn0K+yWw+hRdYBwusABrPgKLyixfJIYRzsy+xPKN6pON6vZfqGwzuWF/9mEGReRz+iM8PiW0XSg==} cpu: [x64] os: [linux] libc: [glibc] + '@nx/nx-linux-x64-musl@22.5.3': + resolution: {integrity: sha512-sKs4bFQRu8Btxf5rMYKPsRVNxkQ2ey8sqoCyhJj8fwJF05DayK2ErJAR/rhtBK0c1NV7kQiKJA8nWBV3jnCdsg==} + cpu: [x64] + os: [linux] + libc: [musl] + '@nx/nx-linux-x64-musl@22.6.5': resolution: {integrity: sha512-RVOe2qcwhoIx6mxQURPjUfAW5SEOmT2gdhewvdcvX9ICq1hj5B2VarmkhTg0qroO7xiyqOqwq26mCzoV2I3NgQ==} cpu: [x64] os: [linux] libc: [musl] + '@nx/nx-win32-arm64-msvc@22.5.3': + resolution: {integrity: sha512-KOCQLakSO5vl4D6et9qPytOAmkgq2IIuhI8A/g0xbD1LqrIlRPa+bdkZqOGpODYAk3NyKAk7hWHsqfXKHwwX6w==} + cpu: [arm64] + os: [win32] + '@nx/nx-win32-arm64-msvc@22.6.5': resolution: {integrity: sha512-ZqurqI8VuYnsr2Kn4K4t+Gx6j/BZdf6qz/6Tv4A7XQQ6oNYVQgTqoNEFj+CCkVaIe6aIdCWpousFLqs+ZgBqYQ==} cpu: [arm64] os: [win32] + '@nx/nx-win32-x64-msvc@22.5.3': + resolution: {integrity: sha512-a6ZB2La82RIHcz4nrt3H6RZaOa+xkC2IPzhU9hMo2gbkLdIxn8wyof8uGA0frncmIVHuLc3nFAhpBOgf4j6tMA==} + cpu: [x64] + os: [win32] + '@nx/nx-win32-x64-msvc@22.6.5': resolution: {integrity: sha512-i2QFBJIuaYg9BHxrrnBV4O7W9rVL2k0pSIdk/rRp3EYJEU93iUng+qbZiY9wh1xvmXuUCE2G7TRd+8/SG/RFKg==} cpu: [x64] os: [win32] - '@nx/workspace@22.6.5': - resolution: {integrity: sha512-/CZtv1ESSfZ1MVqSlCsmnBWysU1z5VdNlwANlqL6BV2X6RUHKDPVj4YuNPvCK+0LsqyzfJdUt3pcnBYxnT5TIg==} + '@nx/workspace@22.5.3': + resolution: {integrity: sha512-pioGwlt5zKB9PhX36I5KAeSml19Mq+g2KyQ9mh3F+3Lvft2JM4nIMELBaUfwPicPAOwNmrsx806IXO67Q4UHxQ==} - '@octokit/auth-token@4.0.0': - resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==} - engines: {node: '>= 18'} + '@octokit/auth-token@6.0.0': + resolution: {integrity: sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==} + engines: {node: '>= 20'} - '@octokit/core@5.2.2': - resolution: {integrity: sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==} - engines: {node: '>= 18'} + '@octokit/core@7.0.6': + resolution: {integrity: sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==} + engines: {node: '>= 20'} - '@octokit/endpoint@9.0.6': - resolution: {integrity: sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==} - engines: {node: '>= 18'} + '@octokit/endpoint@11.0.3': + resolution: {integrity: sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag==} + engines: {node: '>= 20'} - '@octokit/graphql@7.1.1': - resolution: {integrity: sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==} - engines: {node: '>= 18'} - - '@octokit/openapi-types@20.0.0': - resolution: {integrity: sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==} + '@octokit/graphql@9.0.3': + resolution: {integrity: sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==} + engines: {node: '>= 20'} '@octokit/openapi-types@22.2.0': resolution: {integrity: sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==} - '@octokit/openapi-types@24.2.0': - resolution: {integrity: sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==} + '@octokit/openapi-types@27.0.0': + resolution: {integrity: sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==} - '@octokit/plugin-paginate-rest@9.2.2': - resolution: {integrity: sha512-u3KYkGF7GcZnSD/3UP0S7K5XUFT2FkOQdcfXZGZQPGv3lm4F2Xbf71lvjldr8c1H3nNbF+33cLEkWYbokGWqiQ==} - engines: {node: '>= 18'} + '@octokit/plugin-paginate-rest@14.0.0': + resolution: {integrity: sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==} + engines: {node: '>= 20'} peerDependencies: - '@octokit/core': '5' + '@octokit/core': '>=6' - '@octokit/plugin-rest-endpoint-methods@10.4.1': - resolution: {integrity: sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==} - engines: {node: '>= 18'} + '@octokit/plugin-rest-endpoint-methods@17.0.0': + resolution: {integrity: sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw==} + engines: {node: '>= 20'} peerDependencies: - '@octokit/core': '5' + '@octokit/core': '>=6' - '@octokit/request-error@5.1.1': - resolution: {integrity: sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==} - engines: {node: '>= 18'} + '@octokit/request-error@7.1.0': + resolution: {integrity: sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==} + engines: {node: '>= 20'} - '@octokit/request@8.4.1': - resolution: {integrity: sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==} - engines: {node: '>= 18'} + '@octokit/request@10.0.8': + resolution: {integrity: sha512-SJZNwY9pur9Agf7l87ywFi14W+Hd9Jg6Ifivsd33+/bGUQIjNujdFiXII2/qSlN2ybqUHfp5xpekMEjIBTjlSw==} + engines: {node: '>= 20'} - '@octokit/types@12.6.0': - resolution: {integrity: sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==} - - '@octokit/types@13.10.0': - resolution: {integrity: sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==} + '@octokit/types@16.0.0': + resolution: {integrity: sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==} '@opentelemetry/api-logs@0.207.0': resolution: {integrity: sha512-lAb0jQRVyleQQGiuuvCOTDVspc14nx6XJjP4FspJ1sNARo3Regq4ZZbrc3rN4b1TYSuUCvgH+UXUPug4SLOqEQ==} @@ -4493,7 +4522,7 @@ packages: resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: 4.60.1 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true @@ -4502,7 +4531,7 @@ packages: resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: 4.60.1 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true @@ -4921,13 +4950,13 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - '@storybook/addon-a11y@10.3.5': - resolution: {integrity: sha512-5k6lpgfIeLxvNhE8v3wEzdiu73ONKjF4gmH1AHvfqYd8kIVzQJai0KCDxgvqNncXHQhIWkaf1fg6+9hKaYJyaw==} + '@storybook/addon-a11y@10.2.19': + resolution: {integrity: sha512-SJGf1ghCoRVlwyiRwz5GiHuNvu7C5iCDNIRJW8WGOJlnoQa3rYaY7WJ/8a/eT9N8buIscL9AYWudhh5zsI1W3g==} peerDependencies: - storybook: ^10.3.5 + storybook: ^10.2.19 - '@storybook/addon-designs@11.1.3': - resolution: {integrity: sha512-AK+ij478Y6S16TCNPwm7H90OipVe2wZApOlHjC6qDvMW61zyd4yP1icrRtjehSadw5SCoz8HcAmIYfQCOY6E4A==} + '@storybook/addon-designs@11.1.2': + resolution: {integrity: sha512-d9tOOJSNrUOshK0hvnDtR17uk/gfDAbs0DKGRaKe0VacUVLJkJEPor4OpxKKFG59qtSi4iU1FYyb668hfMdCdw==} peerDependencies: '@storybook/addon-docs': ^10.0.0 || ^10.0.0-0 || ^10.1.0-0 || ^10.2.0-0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -4941,18 +4970,18 @@ packages: react-dom: optional: true - '@storybook/addon-docs@10.3.5': - resolution: {integrity: sha512-WuHbxia/o5TX4Rg/IFD0641K5qId/Nk0dxhmAUNoFs5L0+yfZUwh65XOBbzXqrkYmYmcVID4v7cgDRmzstQNkA==} + '@storybook/addon-docs@10.2.19': + resolution: {integrity: sha512-tXugthdzjX5AkGWDSP4pnRgA/CWlOaEKp/+y9JOGXHLQmm1GHjW+4brNvNkKbjBl06LALXwlcTOyU4lyVRDLAw==} peerDependencies: - storybook: ^10.3.5 + storybook: ^10.2.19 - '@storybook/addon-vitest@10.3.5': - resolution: {integrity: sha512-PQDeeMwoF55kvzlhFqVKOryBJskkVk71AbDh7F0y8PdRRxlGbTvIUkKXktHZWBdESo0dV6BkeVxGQ4ZpiFxirg==} + '@storybook/addon-vitest@10.2.19': + resolution: {integrity: sha512-mx7B8QBT4YFLJ6+30rVxRfJNMDrIfVjJBWtdhP4mbZCS2IuoKAqf28KaC4ZZ4/UWAxjA/8VSQrV9CpXArepMlg==} peerDependencies: '@vitest/browser': ^3.0.0 || ^4.0.0 '@vitest/browser-playwright': ^4.0.0 '@vitest/runner': ^3.0.0 || ^4.0.0 - storybook: ^10.3.5 + storybook: ^10.2.19 vitest: ^3.0.0 || ^4.0.0 peerDependenciesMeta: '@vitest/browser': @@ -4964,18 +4993,18 @@ packages: vitest: optional: true - '@storybook/builder-vite@10.3.5': - resolution: {integrity: sha512-i4KwCOKbhtlbQIbhm53+Kk7bMnxa0cwTn1pxmtA/x5wm1Qu7FrrBQV0V0DNjkUqzcSKo1CjspASJV/HlY0zYlw==} + '@storybook/builder-vite@10.2.19': + resolution: {integrity: sha512-a59xALzM9GeYh6p+wzAeBbDyIe+qyrC4nxS3QNzb5i2ZOhrq1iIpvnDaOWe80NC8mV3IlqUEGY8Uawkf//1Rmg==} peerDependencies: - storybook: ^10.3.5 + storybook: ^10.2.19 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - '@storybook/csf-plugin@10.3.5': - resolution: {integrity: sha512-qlEzNKxOjq86pvrbuMwiGD/bylnsXk1dg7ve0j77YFjEEchqtl7qTlrXvFdNaLA89GhW6D/EV6eOCu/eobPDgw==} + '@storybook/csf-plugin@10.2.19': + resolution: {integrity: sha512-BpjYIOdyQn/Rm6MjUAc5Gl8HlARZrskD/OhUNShiOh2fznb523dHjiE5mbU1kKM/+L1uvRlEqqih40rTx+xCrg==} peerDependencies: esbuild: 0.27.4 - rollup: 4.60.1 - storybook: ^10.3.5 + rollup: '*' + storybook: ^10.2.19 vite: '*' webpack: '*' peerDependenciesMeta: @@ -4997,34 +5026,34 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@storybook/react-dom-shim@10.3.5': - resolution: {integrity: sha512-Gw8R7XZm0zSUH0XAuxlQJhmizsLzyD6x00KOlP6l7oW9eQHXGfxg3seNDG3WrSAcW07iP1/P422kuiriQlOv7g==} + '@storybook/react-dom-shim@10.2.19': + resolution: {integrity: sha512-BXCEfBGVBRYBTYeBeH/PJsy0Bq5MERe/HiaylR+ah/XrvIr2Z9bkne1J8yYiXCjiyq5HQa7Bj11roz0+vyUaEw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.3.5 + storybook: ^10.2.19 - '@storybook/react-vite@10.3.5': - resolution: {integrity: sha512-UB5sJHeh26bfd8sNMx2YPGYRYmErIdTRaLOT28m4bykQIa1l9IgVktsYg/geW7KsJU0lXd3oTbnUjLD+enpi3w==} + '@storybook/react-vite@10.2.19': + resolution: {integrity: sha512-2/yMKrK4IqMIZicRpPMoIg+foBuWnkaEWt0R4V4hjErDj/SC3D9ov+GUqhjKJ81TegijhKzNpwnSD7Nf87haKw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.3.5 + storybook: ^10.2.19 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - '@storybook/react@10.3.5': - resolution: {integrity: sha512-tpLTLaVGoA6fLK3ReyGzZUricq7lyPaV2hLPpj5wqdXLV/LpRtAHClUpNoPDYSBjlnSjL81hMZijbkGC3mA+gw==} + '@storybook/react@10.2.19': + resolution: {integrity: sha512-gm2qxLyYSsGp7fee5i+d8jSVUKMla8yRaTJ1wxPEnyaJMd0QUu6U2v3p2rW7PH1DWop3D6NqWOY8kmZjmSZKlA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.3.5 + storybook: ^10.2.19 typescript: '>= 4.9.x' peerDependenciesMeta: typescript: optional: true - '@stylistic/eslint-plugin@5.10.0': - resolution: {integrity: sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==} + '@stylistic/eslint-plugin@5.9.0': + resolution: {integrity: sha512-FqqSkvDMYJReydrMhlugc71M76yLLQWNfmGq+SIlLa7N3kHp8Qq8i2PyWrVNAfjOyOIY+xv9XaaYwvVW7vroMA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^9.0.0 || ^10.0.0 @@ -5613,13 +5642,13 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@8.58.1': - resolution: {integrity: sha512-eSkwoemjo76bdXl2MYqtxg51HNwUSkWfODUOQ3PaTLZGh9uIWWFZIjyjaJnex7wXDu+TRx+ATsnSxdN9YWfRTQ==} + '@typescript-eslint/eslint-plugin@8.57.2': + resolution: {integrity: sha512-NZZgp0Fm2IkD+La5PR81sd+g+8oS6JwJje+aRWsDocxHkjyRw0J5L5ZTlN3LI1LlOcGL7ph3eaIUmTXMIjLk0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.58.1 + '@typescript-eslint/parser': ^8.57.2 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/parser@8.58.0': resolution: {integrity: sha512-rLoGZIf9afaRBYsPUMtvkDWykwXwUPL60HebR4JgTI8mxfFe2cQTu3AGitANp4b9B2QlVru6WzjgB2IzJKiCSA==} @@ -5628,35 +5657,31 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/project-service@8.57.2': + resolution: {integrity: sha512-FuH0wipFywXRTHf+bTTjNyuNQQsQC3qh/dYzaM4I4W0jrCqjCVuUh99+xd9KamUfmCGPvbO8NDngo/vsnNVqgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/project-service@8.58.0': resolution: {integrity: sha512-8Q/wBPWLQP1j16NxoPNIKpDZFMaxl7yWIoqXWYeWO+Bbd2mjgvoF0dxP2jKZg5+x49rgKdf7Ck473M8PC3V9lg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.58.1': - resolution: {integrity: sha512-gfQ8fk6cxhtptek+/8ZIqw8YrRW5048Gug8Ts5IYcMLCw18iUgrZAEY/D7s4hkI0FxEfGakKuPK/XUMPzPxi5g==} + '@typescript-eslint/scope-manager@8.57.2': + resolution: {integrity: sha512-snZKH+W4WbWkrBqj4gUNRIGb/jipDW3qMqVJ4C9rzdFc+wLwruxk+2a5D+uoFcKPAqyqEnSb4l2ULuZf95eSkw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/project-service@8.58.2': - resolution: {integrity: sha512-Cq6UfpZZk15+r87BkIh5rDpi38W4b+Sjnb8wQCPPDDweS/LRCFjCyViEbzHk5Ck3f2QDfgmlxqSa7S7clDtlfg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' '@typescript-eslint/scope-manager@8.58.0': resolution: {integrity: sha512-W1Lur1oF50FxSnNdGp3Vs6P+yBRSmZiw4IIjEeYxd8UQJwhUF0gDgDD/W/Tgmh73mxgEU3qX0Bzdl/NGuSPEpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.58.1': - resolution: {integrity: sha512-TPYUEqJK6avLcEjumWsIuTpuYODTTDAtoMdt8ZZa93uWMTX13Nb8L5leSje1NluammvU+oI3QRr5lLXPgihX3w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/scope-manager@8.58.2': - resolution: {integrity: sha512-SgmyvDPexWETQek+qzZnrG6844IaO02UVyOLhI4wpo82dpZJY9+6YZCKAMFzXb7qhx37mFK1QcPQ18tud+vo6Q==} + '@typescript-eslint/tsconfig-utils@8.57.2': + resolution: {integrity: sha512-3Lm5DSM+DCowsUOJC+YqHHnKEfFh5CoGkj5Z31NQSNF4l5wdOwqGn99wmwN/LImhfY3KJnmordBq/4+VDe2eKw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/tsconfig-utils@8.58.0': resolution: {integrity: sha512-doNSZEVJsWEu4htiVC+PR6NpM+pa+a4ClH9INRWOWCUzMst/VA9c4gXq92F8GUD1rwhNvRLkgjfYtFXegXQF7A==} @@ -5664,36 +5689,26 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/tsconfig-utils@8.58.1': - resolution: {integrity: sha512-JAr2hOIct2Q+qk3G+8YFfqkqi7sC86uNryT+2i5HzMa2MPjw4qNFvtjnw1IiA1rP7QhNKVe21mSSLaSjwA1Olw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/tsconfig-utils@8.58.2': - resolution: {integrity: sha512-3SR+RukipDvkkKp/d0jP0dyzuls3DbGmwDpVEc5wqk5f38KFThakqAAO0XMirWAE+kT00oTauTbzMFGPoAzB0A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/type-utils@8.58.1': - resolution: {integrity: sha512-HUFxvTJVroT+0rXVJC7eD5zol6ID+Sn5npVPWoFuHGg9Ncq5Q4EYstqR+UOqaNRFXi5TYkpXXkLhoCHe3G0+7w==} + '@typescript-eslint/type-utils@8.57.2': + resolution: {integrity: sha512-Co6ZCShm6kIbAM/s+oYVpKFfW7LBc6FXoPXjTRQ449PPNBY8U0KZXuevz5IFuuUj2H9ss40atTaf9dlGLzbWZg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/types@8.57.2': + resolution: {integrity: sha512-/iZM6FnM4tnx9csuTxspMW4BOSegshwX5oBDznJ7S4WggL7Vczz5d2W11ecc4vRrQMQHXRSxzrCsyG5EsPPTbA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/types@8.58.0': resolution: {integrity: sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.58.1': - resolution: {integrity: sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/types@8.58.2': - resolution: {integrity: sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ==} + '@typescript-eslint/typescript-estree@8.57.2': + resolution: {integrity: sha512-2MKM+I6g8tJxfSmFKOnHv2t8Sk3T6rF20A1Puk0svLK+uVapDZB/4pfAeB7nE83uAZrU6OxW+HmOd5wHVdXwXA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/typescript-estree@8.58.0': resolution: {integrity: sha512-7vv5UWbHqew/dvs+D3e1RvLv1v2eeZ9txRHPnEEBUgSNLx5ghdzjHa0sgLWYVKssH+lYmV0JaWdoubo0ncGYLA==} @@ -5701,44 +5716,21 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/typescript-estree@8.58.1': - resolution: {integrity: sha512-w4w7WR7GHOjqqPnvAYbazq+Y5oS68b9CzasGtnd6jIeOIeKUzYzupGTB2T4LTPSv4d+WPeccbxuneTFHYgAAWg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/typescript-estree@8.58.2': - resolution: {integrity: sha512-ELGuoofuhhoCvNbQjFFiobFcGgcDCEm0ThWdmO4Z0UzLqPXS3KFvnEZ+SHewwOYHjM09tkzOWXNTv9u6Gqtyuw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/utils@8.58.1': - resolution: {integrity: sha512-Ln8R0tmWC7pTtLOzgJzYTXSCjJ9rDNHAqTaVONF4FEi2qwce8mD9iSOxOpLFFvWp/wBFlew0mjM1L1ihYWfBdQ==} + '@typescript-eslint/utils@8.57.2': + resolution: {integrity: sha512-krRIbvPK1ju1WBKIefiX+bngPs+odIQUtR7kymzPfo1POVw3jlF+nLkmexdSSd4UCbDcQn+wMBATOOmpBbqgKg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.58.2': - resolution: {integrity: sha512-QZfjHNEzPY8+l0+fIXMvuQ2sJlplB4zgDZvA+NmvZsZv3EQwOcc1DuIU1VJUTWZ/RKouBMhDyNaBMx4sWvrzRA==} + '@typescript-eslint/visitor-keys@8.57.2': + resolution: {integrity: sha512-zhahknjobV2FiD6Ee9iLbS7OV9zi10rG26odsQdfBO/hjSzUQbkIYgda+iNKK1zNiW2ey+Lf8MU5btN17V3dUw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' '@typescript-eslint/visitor-keys@8.58.0': resolution: {integrity: sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.58.1': - resolution: {integrity: sha512-y+vH7QE8ycjoa0bWciFg7OpFcipUuem1ujhrdLtq1gByKwfbC7bPeKsiny9e0urg93DqwGcHey+bGRKCnF1nZQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/visitor-keys@8.58.2': - resolution: {integrity: sha512-f1WO2Lx8a9t8DARmcWAUPJbu0G20bJlj8L4z72K00TMeJAoyLr/tHhI/pzYBLrR4dXWkcxO1cWYZEOX8DKHTqA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} @@ -6011,7 +6003,7 @@ packages: resolution: {integrity: sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==} peerDependencies: async-validator: ^4 - axios: ^1 + axios: 1.15.0 change-case: ^5 drauu: ^0.4 focus-trap: ^7 @@ -6099,12 +6091,9 @@ packages: '@webassemblyjs/wast-printer@1.14.1': resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} - '@webcontainer/env@1.1.1': - resolution: {integrity: sha512-6aN99yL695Hi9SuIk1oC88l9o0gmxL1nGWWQ/kNy81HigJ0FoaoTXpytCj6ItzgyCEwA9kF1wixsTuv5cjsgng==} - - '@xmldom/xmldom@0.9.9': - resolution: {integrity: sha512-qycIHAucxy/LXAYIjmLmtQ8q9GPnMbnjG1KXhWm9o5sCr6pOYDATkMPiTNa6/v8eELyqOQ2FsEqeoFYmgv/gJg==} - engines: {node: '>=14.6'} + '@xmldom/xmldom@0.8.12': + resolution: {integrity: sha512-9k/gHF6n/pAi/9tqr3m3aqkuiNosYTurLLUtc7xQ9sxB/wm7WPygCv8GYa6mS0fLJEHhqMC1ATYhz++U/lRHqg==} + engines: {node: '>=10.0.0'} '@xtuc/ieee754@1.2.0': resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} @@ -6430,8 +6419,8 @@ packages: await-lock@3.0.0: resolution: {integrity: sha512-eO6fLiSnrJrMdjWMNK8zbVRXPs2TKJg78iKZd9wDpN3na5tcoV6EoeiOlMgk2QaAQ1gIrK1YuMsJHXWqz89tSA==} - axe-core@4.11.3: - resolution: {integrity: sha512-zBQouZixDTbo3jMGqHKyePxYxr1e5W8UdTmBQ7sNtaA9M2bE32daxxPLS/jojhKOHxQ7LWwPjfiwf/fhaJWzlg==} + axe-core@4.11.1: + resolution: {integrity: sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==} engines: {node: '>=4'} axios@1.15.0: @@ -6484,8 +6473,8 @@ packages: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} - babel-plugin-polyfill-corejs2@0.4.17: - resolution: {integrity: sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==} + babel-plugin-polyfill-corejs2@0.4.15: + resolution: {integrity: sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -6494,13 +6483,13 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-corejs3@0.14.2: - resolution: {integrity: sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==} + babel-plugin-polyfill-corejs3@0.14.0: + resolution: {integrity: sha512-AvDcMxJ34W4Wgy4KBIIePQTAOP1Ie2WFwkQp3dB7FQ/f0lI5+nM96zUnYEOE1P9sEg0es5VCP0HxiWu5fUHZAQ==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-regenerator@0.6.8: - resolution: {integrity: sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==} + babel-plugin-polyfill-regenerator@0.6.6: + resolution: {integrity: sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -6593,8 +6582,8 @@ packages: bcrypt-pbkdf@1.0.2: resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} - before-after-hook@2.2.3: - resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} + before-after-hook@4.0.0: + resolution: {integrity: sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==} big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} @@ -7083,8 +7072,8 @@ packages: peerDependencies: webpack: ^5.1.0 - core-js-compat@3.49.0: - resolution: {integrity: sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==} + core-js-compat@3.48.0: + resolution: {integrity: sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==} core-js@3.48.0: resolution: {integrity: sha512-zpEHTy1fjTMZCKLHUZoVeylt9XrzaIN2rbPXEt0k+q7JE5CkCZdo6bNq55bn24a69CH7ErAVLKijxJja4fw+UQ==} @@ -7601,9 +7590,6 @@ packages: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} - deprecation@2.3.1: - resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} - dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -7734,8 +7720,8 @@ packages: resolution: {integrity: sha512-gYzvtM72ZtxQO0T048kd6HWSbbGCNOUwcnfQ01cqIJ4X2IYKFFHZ5mKvrQETcFXxsRObZulDaKmy//R7TPtsBg==} engines: {node: '>=20.19.0'} - dompurify@3.3.3: - resolution: {integrity: sha512-Oj6pzI2+RqBfFG+qOaOLbFXLQ90ARpcGG6UePL82bJLtdsa6CYJD7nmiU8MW9nQNOtCHV3lZ/Bzq1X0QYbBZCA==} + dompurify@3.4.0: + resolution: {integrity: sha512-nolgK9JcaUXMSmW+j1yaSvaEaoXYHwWyGJlkoCTghc97KgGDDSnpoU/PlEnw63Ah+TGKFOyY+X5LnxaWbCSfXg==} domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} @@ -8060,14 +8046,14 @@ packages: '@typescript-eslint/parser': optional: true - eslint-plugin-jest@29.15.2: - resolution: {integrity: sha512-kEN4r9RZl1xcsb4arGq89LrcVdOUFII/JSCwtTPJyv16mDwmPrcuEQwpxqZHeINvcsd7oK5O/rhdGlxFRaZwvQ==} + eslint-plugin-jest@29.15.0: + resolution: {integrity: sha512-ZCGr7vTH2WSo2hrK5oM2RULFmMruQ7W3cX7YfwoTiPfzTGTFBMmrVIz45jZHd++cGKj/kWf02li/RhTGcANJSA==} engines: {node: ^20.12.0 || ^22.0.0 || >=24.0.0} peerDependencies: '@typescript-eslint/eslint-plugin': ^8.0.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 jest: '*' - typescript: '>=4.8.4 <7.0.0' + typescript: '>=4.8.4 <6.0.0' peerDependenciesMeta: '@typescript-eslint/eslint-plugin': optional: true @@ -8134,11 +8120,11 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-storybook@10.3.5: - resolution: {integrity: sha512-rEFkfU3ypF44GpB4tiJ9EFDItueoGvGi3+weLHZax2ON2MB7VIDsxdSUGvIU5tMURg+oWYlpzCyLm4TpDq2deA==} + eslint-plugin-storybook@10.2.13: + resolution: {integrity: sha512-ftNfZVL5zXhGMPEy/7PTCEriVH0zCBI89uiYYgSSTtM1b4l++VP+/MzJ17U1R1/jgENsp9LJm+jwRJnViv79RQ==} peerDependencies: eslint: '>=8' - storybook: ^10.3.5 + storybook: ^10.2.13 eslint-plugin-unicorn@56.0.1: resolution: {integrity: sha512-FwVV0Uwf8XPfVnKSGpMg7NtlZh0G0gBarCaFcMUOoqPxXryxdYxTRRv4kH6B9TFCVIrjRXG+emcxIk2ayZilog==} @@ -8295,6 +8281,9 @@ packages: resolution: {integrity: sha512-CGnyrvbhPlWYMngksqrSSUT1BAVP49dZocrHuK0SvtR0D5TMs5wP0o3j7jexDJW01KSadjBp1M/71o/KR3nD1w==} engines: {node: '>=18'} + fast-content-type-parse@3.0.0: + resolution: {integrity: sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -8421,8 +8410,8 @@ packages: focus-trap@7.8.0: resolution: {integrity: sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==} - follow-redirects@1.15.11: - resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + follow-redirects@1.16.0: + resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -8579,9 +8568,6 @@ packages: get-tsconfig@4.13.7: resolution: {integrity: sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==} - get-tsconfig@4.14.0: - resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} - github-markdown-css@5.9.0: resolution: {integrity: sha512-tmT5sY+zvg2302XLYEfH2mtkViIM1SWf2nvYoF5N1ZsO0V6B2qZTiw3GOzw4vpjLygK/KG35qRlPFweHqfzz5w==} engines: {node: '>=10'} @@ -9235,9 +9221,6 @@ packages: resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} engines: {node: '>=16'} - isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} @@ -9531,6 +9514,9 @@ packages: json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + json-with-bigint@3.5.8: + resolution: {integrity: sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw==} + json5@1.0.2: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true @@ -9796,9 +9782,6 @@ packages: lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} - lodash@4.17.23: - resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} - lodash@4.18.1: resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} @@ -9911,8 +9894,8 @@ packages: matrix-events-sdk@0.0.1: resolution: {integrity: sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA==} - matrix-js-sdk@https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/ca5655bced1cbb215ac1c18e179384a069d98b0a: - resolution: {tarball: https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/ca5655bced1cbb215ac1c18e179384a069d98b0a} + matrix-js-sdk@https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/eb7acfb810d2989c0fe61c490083ff9d72c44013: + resolution: {tarball: https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/eb7acfb810d2989c0fe61c490083ff9d72c44013} version: 41.3.0 engines: {node: '>=22.0.0'} @@ -9963,9 +9946,9 @@ packages: memoize-one@6.0.0: resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} - memoize@11.0.0: - resolution: {integrity: sha512-cjsfZaC9b1clqPeIVMbb5dLHSXgdgGWGxdAU3oTUUkHiwWTKTBNnSmcqWJncNjYtBi3S8Rp0c5GIiyGztR8TRA==} - engines: {node: '>=22'} + memoize@10.2.0: + resolution: {integrity: sha512-DeC6b7QBrZsRs3Y02A6A7lQyzFbsQbqgjI6UW0GigGWV+u1s25TycMr0XHZE4cJce7rY/vyw2ctMQqfDkIhUEA==} + engines: {node: '>=18'} meow@14.1.0: resolution: {integrity: sha512-EDYo6VlmtnumlcBCbh1gLJ//9jvM/ndXHfVXIFrZVr6fGcwTUyCTFNTLCKuY3ffbK8L/+3Mzqnd58RojiZqHVw==} @@ -10269,6 +10252,9 @@ packages: node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + node-machine-id@1.1.12: + resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} + node-releases@2.0.37: resolution: {integrity: sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==} @@ -10338,6 +10324,18 @@ packages: nwsapi@2.2.23: resolution: {integrity: sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==} + nx@22.5.3: + resolution: {integrity: sha512-IaEPqdgaFBIr0Bfmnt6WAcX3t660sOuDXQ71lpoS8GgpD8cqX1LIW2ZyzEAdOvCP1iD6HCZehpofcVvaaL1GNQ==} + hasBin: true + peerDependencies: + '@swc-node/register': ^1.11.1 + '@swc/core': ^1.15.8 + peerDependenciesMeta: + '@swc-node/register': + optional: true + '@swc/core': + optional: true + nx@22.6.5: resolution: {integrity: sha512-VRKhDAt684dXNSz9MNjE7MekkCfQF41P2PSx5jEWQjDEP1Z4jFZbyeygWs5ZyOroG7/n0MoWAJTe6ftvIcBOAg==} hasBin: true @@ -10568,8 +10566,8 @@ packages: resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} engines: {node: 18 || 20 || >=22} - path-to-regexp@1.9.0: - resolution: {integrity: sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==} + path-to-regexp@0.1.13: + resolution: {integrity: sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==} path-to-regexp@8.4.2: resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} @@ -11218,8 +11216,8 @@ packages: property-information@7.1.0: resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} - protobufjs@7.5.4: - resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} + protobufjs@7.5.5: + resolution: {integrity: sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg==} engines: {node: '>=12.0.0'} protocol-buffers-schema@3.6.1: @@ -11356,10 +11354,10 @@ packages: resolution: {integrity: sha512-aEZ9qP+/M+58x2qgfSFEWH1BxLyHe5+qkLNJOZQb5iGS017jpbRnoKhNRrXPeA6RfBrZO5wZrT9DMC1UqE1f1w==} engines: {node: ^20.9.0 || >=22} - react-dom@19.2.5: - resolution: {integrity: sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==} + react-dom@19.2.4: + resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} peerDependencies: - react: ^19.2.5 + react: ^19.2.4 react-focus-lock@2.13.7: resolution: {integrity: sha512-20lpZHEQrXPb+pp1tzd4ULL6DyO5D2KnR0G69tTDdydrmNhU7pdFmbQUYVyHUgp+xN29IuFR0PVuhOmvaZL9Og==} @@ -11453,8 +11451,8 @@ packages: react: '>=16 || >=17 || >= 18 || >= 19' react-dom: '>=16 || >=17 || >= 18 || >=19' - react@19.2.5: - resolution: {integrity: sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==} + react@19.2.4: + resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} engines: {node: '>=0.10.0'} read-binary-file-arch@1.0.6: @@ -11621,8 +11619,8 @@ packages: resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} engines: {node: '>=10'} - resolve@1.22.12: - resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} engines: {node: '>= 0.4'} hasBin: true @@ -11693,7 +11691,7 @@ packages: rollup-plugin-external-globals@0.13.0: resolution: {integrity: sha512-wBS3hmoF0OtEnA0lWsmTC6Nhnkk2zjZbfhaX2gLo8VnfNGFdGhiYKwMpIPQPrYbAw+mAYUYmoHYktAl1eZHgVw==} peerDependencies: - rollup: 4.60.1 + rollup: ^2.25.0 || ^3.3.0 || ^4.1.4 rollup@4.60.1: resolution: {integrity: sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==} @@ -12072,16 +12070,16 @@ packages: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} - storybook-addon-vis@3.1.5: - resolution: {integrity: sha512-NE5NlnLqCtrWF82ZyF4YVG5TKJTPYRV8QRRhzNCjOQpTLVqiIPlN2QR1xjWp9SaYEamuMbSXNcYSOGdeRy3IUA==} + storybook-addon-vis@3.1.2: + resolution: {integrity: sha512-eq+HQzjktd7L2onLPhYzC1j5k3j93ZbweQSN6PRvkrsUWSeUTcRNYEIq80zQlH6vcI88+hp/SoAB4FrteEYFRw==} peerDependencies: '@storybook/addon-vitest': ^10.1.10 '@vitest/browser': ^4 storybook: ^10.1.10 vitest: ^4 - storybook@10.3.5: - resolution: {integrity: sha512-uBSZu/GZa9aEIW3QMGvdQPMZWhGxSe4dyRWU8B3/Vd47Gy/XLC7tsBxRr13txmmPOEDHZR94uLuq0H50fvuqBw==} + storybook@10.2.19: + resolution: {integrity: sha512-UUm5eGSm6BLhkcFP0WbxkmAHJZfVN2ViLpIZOqiIPS++q32VYn+CLFC0lrTYTDqYvaG7i4BK4uowXYujzE4NdQ==} hasBin: true peerDependencies: prettier: ^2 || ^3 @@ -12426,8 +12424,8 @@ packages: resolution: {integrity: sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==} engines: {node: '>=18'} - tinyglobby@0.2.16: - resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} tinyqueue@3.0.0: @@ -12600,10 +12598,8 @@ packages: resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} engines: {node: '>= 0.6'} - type-plus@8.0.0-beta.8: - resolution: {integrity: sha512-egrpXQq2tV0abCf99+n4SCD/stT76qEwPBI1q7BqiVUe5pHWc+bm4vsOiNR84SmZTv4SoEl9UOZUdkEbS3POdw==} - peerDependencies: - typescript: '>= 5.6.0' + type-plus@8.0.0-beta.7: + resolution: {integrity: sha512-LTV9UqBJ20I48Ba2L8N25EOowtrs40MLzsqQFfvAXnPAN9z0ny4CjduFfNIfW7euZ6wr6ImShEtrhR1virHiNw==} typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} @@ -12682,9 +12678,9 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - undici@5.29.0: - resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} - engines: {node: '>=14.0'} + undici@6.25.0: + resolution: {integrity: sha512-ZgpWDC5gmNiuY9CnLVXEH8rl50xhRCuLNA97fAUnKi8RRuV4E6KG31pDTsLVUKnohJE0I3XDrTeEydAXRw47xg==} + engines: {node: '>=18.17'} undici@7.25.0: resolution: {integrity: sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==} @@ -12736,8 +12732,8 @@ packages: unist-util-visit@5.1.0: resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} - universal-user-agent@6.0.1: - resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} + universal-user-agent@7.0.3: + resolution: {integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==} universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} @@ -12939,7 +12935,7 @@ packages: sugarss: ^5.0.0 terser: ^5.16.0 tsx: ^4.8.1 - yaml: 2.8.3 + yaml: ^2.4.2 peerDependenciesMeta: '@types/node': optional: true @@ -12980,7 +12976,7 @@ packages: sugarss: ^5.0.0 terser: ^5.16.0 tsx: ^4.8.1 - yaml: 2.8.3 + yaml: ^2.4.2 peerDependenciesMeta: '@types/node': optional: true @@ -13025,8 +13021,8 @@ packages: postcss: optional: true - vitest-plugin-vis@4.2.2: - resolution: {integrity: sha512-j4komd9ZUZwQppOGr0v+rBWx47pZ92g+Ps+pWmvPwkIR5W5cAZIOJDMR80EFhtluy+Cpp850FAq4QZUmE4+fCw==} + vitest-plugin-vis@4.1.0: + resolution: {integrity: sha512-wEYILWeax3hMUNMLMJzZ0dwtasy/YKAZz5/pyqK+0tyETjNBhtdrWiRLZc6OktOMZJk2YPlpjSOB/qqldAlvMQ==} peerDependencies: '@vitest/browser': ^4 '@vitest/browser-playwright': ^4 @@ -13466,20 +13462,20 @@ snapshots: '@action-validator/core@0.6.0': {} - '@actions/github@6.0.1': + '@actions/github@8.0.1': dependencies: - '@actions/http-client': 2.2.3 - '@octokit/core': 5.2.2 - '@octokit/plugin-paginate-rest': 9.2.2(@octokit/core@5.2.2) - '@octokit/plugin-rest-endpoint-methods': 10.4.1(@octokit/core@5.2.2) - '@octokit/request': 8.4.1 - '@octokit/request-error': 5.1.1 - undici: 5.29.0 + '@actions/http-client': 3.0.2 + '@octokit/core': 7.0.6 + '@octokit/plugin-paginate-rest': 14.0.0(@octokit/core@7.0.6) + '@octokit/plugin-rest-endpoint-methods': 17.0.0(@octokit/core@7.0.6) + '@octokit/request': 10.0.8 + '@octokit/request-error': 7.1.0 + undici: 6.25.0 - '@actions/http-client@2.2.3': + '@actions/http-client@3.0.2': dependencies: tunnel: 0.0.6 - undici: 5.29.0 + undici: 6.25.0 '@actions/io@1.1.3': {} @@ -13612,7 +13608,7 @@ snapshots: '@axe-core/playwright@4.11.1(playwright-core@1.59.1)': dependencies: - axe-core: 4.11.3 + axe-core: 4.11.1 playwright-core: 1.59.1 '@babel/code-frame@7.29.0': @@ -13697,14 +13693,14 @@ snapshots: regexpu-core: 6.4.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.29.0)': + '@babel/helper-define-polyfill-provider@0.6.6(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 debug: 4.4.3 lodash.debounce: 4.0.8 - resolve: 1.22.12 + resolve: 1.22.11 transitivePeerDependencies: - supports-color @@ -14275,9 +14271,9 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-module-imports': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.0) + babel-plugin-polyfill-corejs2: 0.4.15(@babel/core@7.29.0) babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.29.0) - babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.0) + babel-plugin-polyfill-regenerator: 0.6.6(@babel/core@7.29.0) semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -14344,7 +14340,7 @@ snapshots: '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 - '@babel/preset-env@7.29.2(@babel/core@7.29.0)': + '@babel/preset-env@7.29.0(@babel/core@7.29.0)': dependencies: '@babel/compat-data': 7.29.0 '@babel/core': 7.29.0 @@ -14412,10 +14408,10 @@ snapshots: '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.29.0) '@babel/plugin-transform-unicode-sets-regex': 7.28.6(@babel/core@7.29.0) '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.29.0) - babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.0) - babel-plugin-polyfill-corejs3: 0.14.2(@babel/core@7.29.0) - babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.0) - core-js-compat: 3.49.0 + babel-plugin-polyfill-corejs2: 0.4.15(@babel/core@7.29.0) + babel-plugin-polyfill-corejs3: 0.14.0(@babel/core@7.29.0) + babel-plugin-polyfill-regenerator: 0.6.6(@babel/core@7.29.0) + core-js-compat: 3.48.0 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -14450,7 +14446,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/runtime@7.29.2': {} + '@babel/runtime@7.28.6': {} '@babel/template@7.28.6': dependencies: @@ -15008,16 +15004,16 @@ snapshots: '@element-hq/element-call-embedded@0.18.0': {} - '@emnapi/core@1.9.2': + '@emnapi/core@1.8.1': dependencies: - '@emnapi/wasi-threads': 1.2.1 + '@emnapi/wasi-threads': 1.1.0 tslib: 2.8.1 - '@emnapi/runtime@1.9.2': + '@emnapi/runtime@1.8.1': dependencies: tslib: 2.8.1 - '@emnapi/wasi-threads@1.2.1': + '@emnapi/wasi-threads@1.1.0': dependencies: tslib: 2.8.1 @@ -15122,8 +15118,6 @@ snapshots: '@eslint/js@8.57.1': {} - '@fastify/busboy@2.1.1': {} - '@fastify/otel@0.16.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -15143,15 +15137,15 @@ snapshots: '@fetch-mock/vitest@0.2.18(vitest@4.1.2)': dependencies: fetch-mock: 12.6.0 - vitest: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@18.19.130)(@vitest/browser-playwright@4.1.2)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + vitest: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@18.19.130)(@vitest/browser-playwright@4.1.2)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) '@figspec/components@2.1.0': {} - '@figspec/react@2.0.1(@types/react@19.2.10)(react@19.2.5)': + '@figspec/react@2.0.1(@types/react@19.2.10)(react@19.2.4)': dependencies: '@figspec/components': 2.1.0 '@lit-labs/react': 2.1.3(@types/react@19.2.10) - react: 19.2.5 + react: 19.2.4 transitivePeerDependencies: - '@types/react' @@ -15164,18 +15158,18 @@ snapshots: '@floating-ui/core': 1.7.4 '@floating-ui/utils': 0.2.10 - '@floating-ui/react-dom@2.1.7(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@floating-ui/react-dom@2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@floating-ui/dom': 1.7.5 - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) - '@floating-ui/react@0.27.17(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@floating-ui/react@0.27.17(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@floating-ui/react-dom': 2.1.7(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@floating-ui/react-dom': 2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@floating-ui/utils': 0.2.10 - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) tabbable: 6.4.0 '@floating-ui/utils@0.2.10': {} @@ -15224,14 +15218,14 @@ snapshots: dependencies: lodash.camelcase: 4.3.0 long: 5.3.2 - protobufjs: 7.5.4 + protobufjs: 7.5.5 yargs: 17.7.2 '@grpc/proto-loader@0.8.0': dependencies: lodash.camelcase: 4.3.0 long: 5.3.2 - protobufjs: 7.5.4 + protobufjs: 7.5.5 yargs: 17.7.2 '@hapi/address@5.1.1': @@ -15295,7 +15289,7 @@ snapshots: js-yaml: 3.14.2 resolve-from: 5.0.0 - '@istanbuljs/schema@0.1.6': {} + '@istanbuljs/schema@0.1.3': {} '@jest/console@30.3.0': dependencies: @@ -15485,11 +15479,11 @@ snapshots: '@types/yargs': 17.0.35 chalk: 4.1.2 - '@joshwooding/vite-plugin-react-docgen-typescript@0.7.0(typescript@5.9.3)(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.6.4(typescript@5.9.3)(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))': dependencies: glob: 13.0.6 react-docgen-typescript: 2.4.0(typescript@5.9.3) - vite: 8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) optionalDependencies: typescript: 5.9.3 @@ -15740,18 +15734,18 @@ snapshots: '@matrix-org/matrix-sdk-crypto-wasm@18.0.0': {} - '@matrix-org/react-sdk-module-api@2.5.0(patch_hash=016146c9cc96e6363609d2b2ac0896ccef567882eb1d73b75a77b8a30929de96)(react@19.2.5)': + '@matrix-org/react-sdk-module-api@2.5.0(patch_hash=016146c9cc96e6363609d2b2ac0896ccef567882eb1d73b75a77b8a30929de96)(react@19.2.4)': dependencies: - '@babel/runtime': 7.29.2 - react: 19.2.5 + '@babel/runtime': 7.28.6 + react: 19.2.4 '@matrix-org/spec@1.16.0': {} - '@mdx-js/react@3.1.1(@types/react@19.2.10)(react@19.2.5)': + '@mdx-js/react@3.1.1(@types/react@19.2.10)(react@19.2.4)': dependencies: '@types/mdx': 2.0.13(patch_hash=c209882c533714d2dcbf4cf397002125ea83677ef152eff403386611cd0f0d3a) '@types/react': 19.2.10 - react: 19.2.5 + react: 19.2.4 '@mermaid-js/mermaid-mindmap@9.3.0': dependencies: @@ -15786,9 +15780,9 @@ snapshots: '@rushstack/terminal': 0.21.0(@types/node@18.19.130) '@rushstack/ts-command-line': 5.1.7(@types/node@18.19.130) diff: 8.0.3 - lodash: 4.17.23 + lodash: 4.18.1 minimatch: 10.2.5 - resolve: 1.22.12 + resolve: 1.22.11 semver: 7.5.4 source-map: 0.6.1 typescript: 5.8.2 @@ -15800,27 +15794,27 @@ snapshots: '@microsoft/tsdoc': 0.16.0 ajv: 8.18.0 jju: 1.4.0 - resolve: 1.22.12 + resolve: 1.22.11 '@microsoft/tsdoc@0.16.0': {} '@napi-rs/wasm-runtime@0.2.12': dependencies: - '@emnapi/core': 1.9.2 - '@emnapi/runtime': 1.9.2 + '@emnapi/core': 1.8.1 + '@emnapi/runtime': 1.8.1 '@tybys/wasm-util': 0.10.1 optional: true '@napi-rs/wasm-runtime@0.2.4': dependencies: - '@emnapi/core': 1.9.2 - '@emnapi/runtime': 1.9.2 + '@emnapi/core': 1.8.1 + '@emnapi/runtime': 1.8.1 '@tybys/wasm-util': 0.9.0 - '@napi-rs/wasm-runtime@1.1.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@napi-rs/wasm-runtime@1.1.2(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)': dependencies: - '@emnapi/core': 1.9.2 - '@emnapi/runtime': 1.9.2 + '@emnapi/core': 1.8.1 + '@emnapi/runtime': 1.8.1 '@tybys/wasm-util': 0.10.1 optional: true @@ -15914,10 +15908,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@nx-tools/ci-context@7.2.1(@nx/devkit@22.6.5(nx@22.6.5))(tslib@2.8.1)': + '@nx-tools/ci-context@7.2.1(@nx/devkit@22.5.3(nx@22.6.5))(tslib@2.8.1)': dependencies: - '@actions/github': 6.0.1 - '@nx-tools/core': 7.2.1(@nx/devkit@22.6.5(nx@22.6.5))(tslib@2.8.1) + '@actions/github': 8.0.1 + '@nx-tools/core': 7.2.1(@nx/devkit@22.5.3(nx@22.6.5))(tslib@2.8.1) '@octokit/openapi-types': 22.2.0 properties-file: 3.6.4 std-env: 3.10.0 @@ -15925,11 +15919,11 @@ snapshots: transitivePeerDependencies: - '@nx/devkit' - '@nx-tools/container-metadata@7.2.1(@nx/devkit@22.6.5(nx@22.6.5))(tslib@2.8.1)': + '@nx-tools/container-metadata@7.2.1(@nx/devkit@22.5.3(nx@22.6.5))(tslib@2.8.1)': dependencies: - '@nx-tools/ci-context': 7.2.1(@nx/devkit@22.6.5(nx@22.6.5))(tslib@2.8.1) - '@nx-tools/core': 7.2.1(@nx/devkit@22.6.5(nx@22.6.5))(tslib@2.8.1) - '@nx/devkit': 22.6.5(nx@22.6.5) + '@nx-tools/ci-context': 7.2.1(@nx/devkit@22.5.3(nx@22.6.5))(tslib@2.8.1) + '@nx-tools/core': 7.2.1(@nx/devkit@22.5.3(nx@22.6.5))(tslib@2.8.1) + '@nx/devkit': 22.5.3(nx@22.6.5) '@renovatebot/pep440': 4.2.1 csv-parse: 5.6.0 handlebars: 4.7.9 @@ -15937,22 +15931,22 @@ snapshots: semver: 7.7.4 tslib: 2.8.1 - '@nx-tools/core@7.2.1(@nx/devkit@22.6.5(nx@22.6.5))(tslib@2.8.1)': + '@nx-tools/core@7.2.1(@nx/devkit@22.5.3(nx@22.6.5))(tslib@2.8.1)': dependencies: '@actions/io': 1.1.3 - '@nx/devkit': 22.6.5(nx@22.6.5) + '@nx/devkit': 22.5.3(nx@22.6.5) csv-parse: 5.6.0 std-env: 3.10.0 tinyexec: 1.0.2 tinyrainbow: 3.0.3 tslib: 2.8.1 - '@nx-tools/nx-container@7.2.1(@nx/devkit@22.6.5(nx@22.6.5))(@nx/js@22.6.5(@babel/traverse@7.29.0)(nx@22.6.5))(dotenv@17.4.0)(nx@22.6.5)(tslib@2.8.1)': + '@nx-tools/nx-container@7.2.1(@nx/devkit@22.5.3(nx@22.6.5))(@nx/js@22.5.3(@babel/traverse@7.29.0)(nx@22.6.5))(dotenv@17.4.0)(nx@22.6.5)(tslib@2.8.1)': dependencies: - '@nx-tools/container-metadata': 7.2.1(@nx/devkit@22.6.5(nx@22.6.5))(tslib@2.8.1) - '@nx-tools/core': 7.2.1(@nx/devkit@22.6.5(nx@22.6.5))(tslib@2.8.1) - '@nx/devkit': 22.6.5(nx@22.6.5) - '@nx/js': 22.6.5(@babel/traverse@7.29.0)(nx@22.6.5) + '@nx-tools/container-metadata': 7.2.1(@nx/devkit@22.5.3(nx@22.6.5))(tslib@2.8.1) + '@nx-tools/core': 7.2.1(@nx/devkit@22.5.3(nx@22.6.5))(tslib@2.8.1) + '@nx/devkit': 22.5.3(nx@22.6.5) + '@nx/js': 22.5.3(@babel/traverse@7.29.0)(nx@22.6.5) csv-parse: 5.6.0 dotenv: 17.4.0 handlebars: 4.7.9 @@ -15961,29 +15955,40 @@ snapshots: tmp: 0.2.5 tslib: 2.8.1 - '@nx/devkit@22.6.5(nx@22.6.5)': + '@nx/devkit@22.5.3(nx@22.5.3)': dependencies: '@zkochan/js-yaml': 0.0.7 - ejs: 5.0.1 + ejs: 3.1.10 enquirer: 2.3.6 - minimatch: 10.2.4 + minimatch: 10.2.5 + nx: 22.5.3 + semver: 7.7.4 + tslib: 2.8.1 + yargs-parser: 21.1.1 + + '@nx/devkit@22.5.3(nx@22.6.5)': + dependencies: + '@zkochan/js-yaml': 0.0.7 + ejs: 3.1.10 + enquirer: 2.3.6 + minimatch: 10.2.5 nx: 22.6.5 semver: 7.7.4 tslib: 2.8.1 yargs-parser: 21.1.1 - '@nx/jest@22.6.5(@babel/traverse@7.29.0)(@types/node@18.19.130)(babel-plugin-macros@3.1.0)(nx@22.6.5)(typescript@5.9.3)': + '@nx/jest@22.5.3(@babel/traverse@7.29.0)(@types/node@18.19.130)(babel-plugin-macros@3.1.0)(nx@22.6.5)(typescript@5.9.3)': dependencies: '@jest/reporters': 30.3.0 '@jest/test-result': 30.3.0 - '@nx/devkit': 22.6.5(nx@22.6.5) - '@nx/js': 22.6.5(@babel/traverse@7.29.0)(nx@22.6.5) + '@nx/devkit': 22.5.3(nx@22.6.5) + '@nx/js': 22.5.3(@babel/traverse@7.29.0)(nx@22.6.5) '@phenomnomnominal/tsquery': 6.1.4(typescript@5.9.3) identity-obj-proxy: 3.0.0 jest-config: 30.3.0(@types/node@18.19.130)(babel-plugin-macros@3.1.0) jest-resolve: 30.3.0 jest-util: 30.3.0 - minimatch: 10.2.4 + minimatch: 10.2.5 picocolors: 1.1.1 resolve.exports: 2.0.3 semver: 7.7.4 @@ -16004,17 +16009,17 @@ snapshots: - typescript - verdaccio - '@nx/js@22.6.5(@babel/traverse@7.29.0)(nx@22.6.5)': + '@nx/js@22.5.3(@babel/traverse@7.29.0)(nx@22.6.5)': dependencies: '@babel/core': 7.29.0 '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.29.0) '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.29.0) '@babel/plugin-transform-runtime': 7.29.0(@babel/core@7.29.0) - '@babel/preset-env': 7.29.2(@babel/core@7.29.0) + '@babel/preset-env': 7.29.0(@babel/core@7.29.0) '@babel/preset-typescript': 7.28.5(@babel/core@7.29.0) - '@babel/runtime': 7.29.2 - '@nx/devkit': 22.6.5(nx@22.6.5) - '@nx/workspace': 22.6.5 + '@babel/runtime': 7.28.6 + '@nx/devkit': 22.5.3(nx@22.6.5) + '@nx/workspace': 22.5.3 '@zkochan/js-yaml': 0.0.7 babel-plugin-const-enum: 1.2.0(@babel/core@7.29.0) babel-plugin-macros: 3.1.0 @@ -16030,7 +16035,7 @@ snapshots: picomatch: 4.0.4 semver: 7.7.4 source-map-support: 0.5.19 - tinyglobby: 0.2.16 + tinyglobby: 0.2.15 tslib: 2.8.1 transitivePeerDependencies: - '@babel/traverse' @@ -16040,43 +16045,73 @@ snapshots: - nx - supports-color + '@nx/nx-darwin-arm64@22.5.3': + optional: true + '@nx/nx-darwin-arm64@22.6.5': optional: true + '@nx/nx-darwin-x64@22.5.3': + optional: true + '@nx/nx-darwin-x64@22.6.5': optional: true + '@nx/nx-freebsd-x64@22.5.3': + optional: true + '@nx/nx-freebsd-x64@22.6.5': optional: true + '@nx/nx-linux-arm-gnueabihf@22.5.3': + optional: true + '@nx/nx-linux-arm-gnueabihf@22.6.5': optional: true + '@nx/nx-linux-arm64-gnu@22.5.3': + optional: true + '@nx/nx-linux-arm64-gnu@22.6.5': optional: true + '@nx/nx-linux-arm64-musl@22.5.3': + optional: true + '@nx/nx-linux-arm64-musl@22.6.5': optional: true + '@nx/nx-linux-x64-gnu@22.5.3': + optional: true + '@nx/nx-linux-x64-gnu@22.6.5': optional: true + '@nx/nx-linux-x64-musl@22.5.3': + optional: true + '@nx/nx-linux-x64-musl@22.6.5': optional: true + '@nx/nx-win32-arm64-msvc@22.5.3': + optional: true + '@nx/nx-win32-arm64-msvc@22.6.5': optional: true + '@nx/nx-win32-x64-msvc@22.5.3': + optional: true + '@nx/nx-win32-x64-msvc@22.6.5': optional: true - '@nx/workspace@22.6.5': + '@nx/workspace@22.5.3': dependencies: - '@nx/devkit': 22.6.5(nx@22.6.5) + '@nx/devkit': 22.5.3(nx@22.5.3) '@zkochan/js-yaml': 0.0.7 chalk: 4.1.2 enquirer: 2.3.6 - nx: 22.6.5 + nx: 22.5.3 picomatch: 4.0.4 semver: 7.7.4 tslib: 2.8.1 @@ -16086,65 +16121,59 @@ snapshots: - '@swc/core' - debug - '@octokit/auth-token@4.0.0': {} + '@octokit/auth-token@6.0.0': {} - '@octokit/core@5.2.2': + '@octokit/core@7.0.6': dependencies: - '@octokit/auth-token': 4.0.0 - '@octokit/graphql': 7.1.1 - '@octokit/request': 8.4.1 - '@octokit/request-error': 5.1.1 - '@octokit/types': 13.10.0 - before-after-hook: 2.2.3 - universal-user-agent: 6.0.1 + '@octokit/auth-token': 6.0.0 + '@octokit/graphql': 9.0.3 + '@octokit/request': 10.0.8 + '@octokit/request-error': 7.1.0 + '@octokit/types': 16.0.0 + before-after-hook: 4.0.0 + universal-user-agent: 7.0.3 - '@octokit/endpoint@9.0.6': + '@octokit/endpoint@11.0.3': dependencies: - '@octokit/types': 13.10.0 - universal-user-agent: 6.0.1 + '@octokit/types': 16.0.0 + universal-user-agent: 7.0.3 - '@octokit/graphql@7.1.1': + '@octokit/graphql@9.0.3': dependencies: - '@octokit/request': 8.4.1 - '@octokit/types': 13.10.0 - universal-user-agent: 6.0.1 - - '@octokit/openapi-types@20.0.0': {} + '@octokit/request': 10.0.8 + '@octokit/types': 16.0.0 + universal-user-agent: 7.0.3 '@octokit/openapi-types@22.2.0': {} - '@octokit/openapi-types@24.2.0': {} + '@octokit/openapi-types@27.0.0': {} - '@octokit/plugin-paginate-rest@9.2.2(@octokit/core@5.2.2)': + '@octokit/plugin-paginate-rest@14.0.0(@octokit/core@7.0.6)': dependencies: - '@octokit/core': 5.2.2 - '@octokit/types': 12.6.0 + '@octokit/core': 7.0.6 + '@octokit/types': 16.0.0 - '@octokit/plugin-rest-endpoint-methods@10.4.1(@octokit/core@5.2.2)': + '@octokit/plugin-rest-endpoint-methods@17.0.0(@octokit/core@7.0.6)': dependencies: - '@octokit/core': 5.2.2 - '@octokit/types': 12.6.0 + '@octokit/core': 7.0.6 + '@octokit/types': 16.0.0 - '@octokit/request-error@5.1.1': + '@octokit/request-error@7.1.0': dependencies: - '@octokit/types': 13.10.0 - deprecation: 2.3.1 - once: 1.4.0 + '@octokit/types': 16.0.0 - '@octokit/request@8.4.1': + '@octokit/request@10.0.8': dependencies: - '@octokit/endpoint': 9.0.6 - '@octokit/request-error': 5.1.1 - '@octokit/types': 13.10.0 - universal-user-agent: 6.0.1 + '@octokit/endpoint': 11.0.3 + '@octokit/request-error': 7.1.0 + '@octokit/types': 16.0.0 + fast-content-type-parse: 3.0.0 + json-with-bigint: 3.5.8 + universal-user-agent: 7.0.3 - '@octokit/types@12.6.0': + '@octokit/types@16.0.0': dependencies: - '@octokit/openapi-types': 20.0.0 - - '@octokit/types@13.10.0': - dependencies: - '@octokit/openapi-types': 24.2.0 + '@octokit/openapi-types': 27.0.0 '@opentelemetry/api-logs@0.207.0': dependencies: @@ -16421,7 +16450,7 @@ snapshots: '@opentelemetry/sdk-logs': 0.208.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-metrics': 2.2.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.2.0(@opentelemetry/api@1.9.0) - protobufjs: 7.5.4 + protobufjs: 7.5.5 '@opentelemetry/redis-common@0.38.2': {} @@ -16519,9 +16548,9 @@ snapshots: '@oxc-parser/binding-openharmony-arm64@0.121.0': optional: true - '@oxc-parser/binding-wasm32-wasi@0.121.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@oxc-parser/binding-wasm32-wasi@0.121.0(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)': dependencies: - '@napi-rs/wasm-runtime': 1.1.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/wasm-runtime': 1.1.2(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -16588,9 +16617,9 @@ snapshots: '@oxc-resolver/binding-openharmony-arm64@11.19.1': optional: true - '@oxc-resolver/binding-wasm32-wasi@11.19.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@oxc-resolver/binding-wasm32-wasi@11.19.1(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)': dependencies: - '@napi-rs/wasm-runtime': 1.1.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/wasm-runtime': 1.1.2(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -16765,339 +16794,339 @@ snapshots: '@radix-ui/primitive@1.1.3': {} - '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) optionalDependencies: '@types/react': 19.2.10 '@types/react-dom': 19.2.3(@types/react@19.2.10) - '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@19.2.5) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) optionalDependencies: '@types/react': 19.2.10 '@types/react-dom': 19.2.3(@types/react@19.2.10) - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.10)(react@19.2.5)': + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.10)(react@19.2.4)': dependencies: - react: 19.2.5 + react: 19.2.4 optionalDependencies: '@types/react': 19.2.10 - '@radix-ui/react-context-menu@2.2.16(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@radix-ui/react-context-menu@2.2.16(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.5) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) optionalDependencies: '@types/react': 19.2.10 '@types/react-dom': 19.2.3(@types/react@19.2.10) - '@radix-ui/react-context@1.1.2(@types/react@19.2.10)(react@19.2.5)': + '@radix-ui/react-context@1.1.2(@types/react@19.2.10)(react@19.2.4)': dependencies: - react: 19.2.5 + react: 19.2.4 optionalDependencies: '@types/react': 19.2.10 - '@radix-ui/react-context@1.1.3(@types/react@19.2.10)(react@19.2.5)': + '@radix-ui/react-context@1.1.3(@types/react@19.2.10)(react@19.2.4)': dependencies: - react: 19.2.5 + react: 19.2.4 optionalDependencies: '@types/react': 19.2.10 - '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.5) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) aria-hidden: 1.2.6 - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) - react-remove-scroll: 2.7.2(@types/react@19.2.10)(react@19.2.5) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-remove-scroll: 2.7.2(@types/react@19.2.10)(react@19.2.4) optionalDependencies: '@types/react': 19.2.10 '@types/react-dom': 19.2.3(@types/react@19.2.10) - '@radix-ui/react-direction@1.1.1(@types/react@19.2.10)(react@19.2.5)': + '@radix-ui/react-direction@1.1.1(@types/react@19.2.10)(react@19.2.4)': dependencies: - react: 19.2.5 + react: 19.2.4 optionalDependencies: '@types/react': 19.2.10 - '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.10)(react@19.2.5) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) optionalDependencies: '@types/react': 19.2.10 '@types/react-dom': 19.2.3(@types/react@19.2.10) - '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.5) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) optionalDependencies: '@types/react': 19.2.10 '@types/react-dom': 19.2.3(@types/react@19.2.10) - '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.10)(react@19.2.5)': + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.10)(react@19.2.4)': dependencies: - react: 19.2.5 + react: 19.2.4 optionalDependencies: '@types/react': 19.2.10 - '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.5) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) optionalDependencies: '@types/react': 19.2.10 '@types/react-dom': 19.2.3(@types/react@19.2.10) - '@radix-ui/react-form@0.1.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@radix-ui/react-form@0.1.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-label': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-label': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) optionalDependencies: '@types/react': 19.2.10 '@types/react-dom': 19.2.3(@types/react@19.2.10) - '@radix-ui/react-id@1.1.1(@types/react@19.2.10)(react@19.2.5)': + '@radix-ui/react-id@1.1.1(@types/react@19.2.10)(react@19.2.4)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.5) - react: 19.2.5 + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 optionalDependencies: '@types/react': 19.2.10 - '@radix-ui/react-label@2.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@radix-ui/react-label@2.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) optionalDependencies: '@types/react': 19.2.10 '@types/react-dom': 19.2.3(@types/react@19.2.10) - '@radix-ui/react-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@radix-ui/react-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.5) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.4) aria-hidden: 1.2.6 - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) - react-remove-scroll: 2.7.2(@types/react@19.2.10)(react@19.2.5) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-remove-scroll: 2.7.2(@types/react@19.2.10)(react@19.2.4) optionalDependencies: '@types/react': 19.2.10 '@types/react-dom': 19.2.3(@types/react@19.2.10) - '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@floating-ui/react-dom': 2.1.7(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.10)(react@19.2.5) + '@floating-ui/react-dom': 2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.10)(react@19.2.4) '@radix-ui/rect': 1.1.1 - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) optionalDependencies: '@types/react': 19.2.10 '@types/react-dom': 19.2.3(@types/react@19.2.10) - '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.5) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) optionalDependencies: '@types/react': 19.2.10 '@types/react-dom': 19.2.3(@types/react@19.2.10) - '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.5) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) optionalDependencies: '@types/react': 19.2.10 '@types/react-dom': 19.2.3(@types/react@19.2.10) - '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@19.2.5) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) optionalDependencies: '@types/react': 19.2.10 '@types/react-dom': 19.2.3(@types/react@19.2.10) - '@radix-ui/react-primitive@2.1.4(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@radix-ui/react-primitive@2.1.4(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@radix-ui/react-slot': 1.2.4(@types/react@19.2.10)(react@19.2.5) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + '@radix-ui/react-slot': 1.2.4(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) optionalDependencies: '@types/react': 19.2.10 '@types/react-dom': 19.2.3(@types/react@19.2.10) - '@radix-ui/react-progress@1.1.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@radix-ui/react-progress@1.1.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@radix-ui/react-context': 1.1.3(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + '@radix-ui/react-context': 1.1.3(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) optionalDependencies: '@types/react': 19.2.10 '@types/react-dom': 19.2.3(@types/react@19.2.10) - '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.5) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) optionalDependencies: '@types/react': 19.2.10 '@types/react-dom': 19.2.3(@types/react@19.2.10) - '@radix-ui/react-separator@1.1.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@radix-ui/react-separator@1.1.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) optionalDependencies: '@types/react': 19.2.10 '@types/react-dom': 19.2.3(@types/react@19.2.10) - '@radix-ui/react-slot@1.2.3(@types/react@19.2.10)(react@19.2.5)': + '@radix-ui/react-slot@1.2.3(@types/react@19.2.10)(react@19.2.4)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.5) - react: 19.2.5 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 optionalDependencies: '@types/react': 19.2.10 - '@radix-ui/react-slot@1.2.4(@types/react@19.2.10)(react@19.2.5)': + '@radix-ui/react-slot@1.2.4(@types/react@19.2.10)(react@19.2.4)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.5) - react: 19.2.5 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 optionalDependencies: '@types/react': 19.2.10 - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.10)(react@19.2.5)': + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.10)(react@19.2.4)': dependencies: - react: 19.2.5 + react: 19.2.4 optionalDependencies: '@types/react': 19.2.10 - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.10)(react@19.2.5)': + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.10)(react@19.2.4)': dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.10)(react@19.2.5) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.5) - react: 19.2.5 + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 optionalDependencies: '@types/react': 19.2.10 - '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.10)(react@19.2.5)': + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.10)(react@19.2.4)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.5) - react: 19.2.5 + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 optionalDependencies: '@types/react': 19.2.10 - '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.10)(react@19.2.5)': + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.10)(react@19.2.4)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.5) - react: 19.2.5 + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 optionalDependencies: '@types/react': 19.2.10 - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.10)(react@19.2.5)': + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.10)(react@19.2.4)': dependencies: - react: 19.2.5 + react: 19.2.4 optionalDependencies: '@types/react': 19.2.10 - '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.10)(react@19.2.5)': + '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.10)(react@19.2.4)': dependencies: '@radix-ui/rect': 1.1.1 - react: 19.2.5 + react: 19.2.4 optionalDependencies: '@types/react': 19.2.10 - '@radix-ui/react-use-size@1.1.1(@types/react@19.2.10)(react@19.2.5)': + '@radix-ui/react-use-size@1.1.1(@types/react@19.2.10)(react@19.2.4)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.5) - react: 19.2.5 + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 optionalDependencies: '@types/react': 19.2.10 @@ -17141,9 +17170,9 @@ snapshots: '@rolldown/binding-openharmony-arm64@1.0.0-rc.12': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-rc.12(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@rolldown/binding-wasm32-wasi@1.0.0-rc.12(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)': dependencies: - '@napi-rs/wasm-runtime': 1.1.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/wasm-runtime': 1.1.2(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -17258,7 +17287,7 @@ snapshots: fs-extra: 11.3.3 import-lazy: 4.0.0 jju: 1.4.0 - resolve: 1.22.12 + resolve: 1.22.11 semver: 7.5.4 optionalDependencies: '@types/node': 18.19.130 @@ -17269,7 +17298,7 @@ snapshots: '@rushstack/rig-package@0.6.0': dependencies: - resolve: 1.22.12 + resolve: 1.22.11 strip-json-comments: 3.1.1 '@rushstack/terminal@0.21.0(@types/node@18.19.130)': @@ -17590,32 +17619,32 @@ snapshots: '@standard-schema/spec@1.1.0': {} - '@storybook/addon-a11y@10.3.5(storybook@10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))': + '@storybook/addon-a11y@10.2.19(storybook@10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': dependencies: '@storybook/global': 5.0.0 - axe-core: 4.11.3 - storybook: 10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + axe-core: 4.11.1 + storybook: 10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@storybook/addon-designs@11.1.3(@storybook/addon-docs@10.3.5(@types/react@19.2.10)(esbuild@0.27.4)(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.27.4)))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))': + '@storybook/addon-designs@11.1.2(@storybook/addon-docs@10.2.19(@types/react@19.2.10)(esbuild@0.27.4)(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.27.4)))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': dependencies: - '@figspec/react': 2.0.1(@types/react@19.2.10)(react@19.2.5) - storybook: 10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@figspec/react': 2.0.1(@types/react@19.2.10)(react@19.2.4) + storybook: 10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) optionalDependencies: - '@storybook/addon-docs': 10.3.5(@types/react@19.2.10)(esbuild@0.27.4)(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.27.4)) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + '@storybook/addon-docs': 10.2.19(@types/react@19.2.10)(esbuild@0.27.4)(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.27.4)) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) transitivePeerDependencies: - '@types/react' - '@storybook/addon-docs@10.3.5(@types/react@19.2.10)(esbuild@0.27.4)(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.27.4))': + '@storybook/addon-docs@10.2.19(@types/react@19.2.10)(esbuild@0.27.4)(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.27.4))': dependencies: - '@mdx-js/react': 3.1.1(@types/react@19.2.10)(react@19.2.5) - '@storybook/csf-plugin': 10.3.5(esbuild@0.27.4)(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.27.4)) - '@storybook/icons': 2.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@storybook/react-dom-shim': 10.3.5(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) - storybook: 10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@mdx-js/react': 3.1.1(@types/react@19.2.10)(react@19.2.4) + '@storybook/csf-plugin': 10.2.19(esbuild@0.27.4)(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.27.4)) + '@storybook/icons': 2.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@storybook/react-dom-shim': 10.2.19(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + storybook: 10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' @@ -17624,69 +17653,69 @@ snapshots: - vite - webpack - '@storybook/addon-vitest@10.3.5(@vitest/browser-playwright@4.1.2)(@vitest/browser@4.1.2(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2))(@vitest/runner@4.1.2)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vitest@4.1.2)': + '@storybook/addon-vitest@10.2.19(@vitest/browser-playwright@4.1.2)(@vitest/browser@4.1.2(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2))(@vitest/runner@4.1.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vitest@4.1.2)': dependencies: '@storybook/global': 5.0.0 - '@storybook/icons': 2.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - storybook: 10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@storybook/icons': 2.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + storybook: 10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) optionalDependencies: - '@vitest/browser': 4.1.2(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2) - '@vitest/browser-playwright': 4.1.2(playwright@1.59.1)(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2) + '@vitest/browser': 4.1.2(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2) + '@vitest/browser-playwright': 4.1.2(playwright@1.59.1)(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2) '@vitest/runner': 4.1.2 - vitest: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@18.19.130)(@vitest/browser-playwright@4.1.2)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + vitest: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@18.19.130)(@vitest/browser-playwright@4.1.2)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) transitivePeerDependencies: - react - react-dom - '@storybook/builder-vite@10.3.5(esbuild@0.27.4)(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.27.4))': + '@storybook/builder-vite@10.2.19(esbuild@0.27.4)(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.27.4))': dependencies: - '@storybook/csf-plugin': 10.3.5(esbuild@0.27.4)(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.27.4)) - storybook: 10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@storybook/csf-plugin': 10.2.19(esbuild@0.27.4)(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.27.4)) + storybook: 10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) ts-dedent: 2.2.0 - vite: 8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) transitivePeerDependencies: - esbuild - rollup - webpack - '@storybook/csf-plugin@10.3.5(esbuild@0.27.4)(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.27.4))': + '@storybook/csf-plugin@10.2.19(esbuild@0.27.4)(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.27.4))': dependencies: - storybook: 10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + storybook: 10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) unplugin: 2.3.11 optionalDependencies: esbuild: 0.27.4 rollup: 4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8) - vite: 8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) webpack: 5.105.4(esbuild@0.27.4) '@storybook/global@5.0.0': {} - '@storybook/icons@2.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@storybook/icons@2.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) - '@storybook/react-dom-shim@10.3.5(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))': + '@storybook/react-dom-shim@10.2.19(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': dependencies: - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) - storybook: 10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + storybook: 10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@storybook/react-vite@10.3.5(esbuild@0.27.4)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(typescript@5.9.3)(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.27.4))': + '@storybook/react-vite@10.2.19(esbuild@0.27.4)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.27.4))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.7.0(typescript@5.9.3)(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.4(typescript@5.9.3)(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) '@rollup/pluginutils': 5.3.0(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8)) - '@storybook/builder-vite': 10.3.5(esbuild@0.27.4)(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.27.4)) - '@storybook/react': 10.3.5(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(typescript@5.9.3) + '@storybook/builder-vite': 10.2.19(esbuild@0.27.4)(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(storybook@10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.27.4)) + '@storybook/react': 10.2.19(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) empathic: 2.0.0 magic-string: 0.30.21 - react: 19.2.5 + react: 19.2.4 react-docgen: 8.0.3 - react-dom: 19.2.5(react@19.2.5) - resolve: 1.22.12 - storybook: 10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + react-dom: 19.2.4(react@19.2.4) + resolve: 1.22.11 + storybook: 10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) tsconfig-paths: 4.2.0 - vite: 8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) transitivePeerDependencies: - esbuild - rollup @@ -17694,24 +17723,23 @@ snapshots: - typescript - webpack - '@storybook/react@10.3.5(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(typescript@5.9.3)': + '@storybook/react@10.2.19(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)': dependencies: '@storybook/global': 5.0.0 - '@storybook/react-dom-shim': 10.3.5(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)) - react: 19.2.5 + '@storybook/react-dom-shim': 10.2.19(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + react: 19.2.4 react-docgen: 8.0.3 - react-docgen-typescript: 2.4.0(typescript@5.9.3) - react-dom: 19.2.5(react@19.2.5) - storybook: 10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + react-dom: 19.2.4(react@19.2.4) + storybook: 10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@stylistic/eslint-plugin@5.10.0(eslint@8.57.1)': + '@stylistic/eslint-plugin@5.9.0(eslint@8.57.1)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) - '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/types': 8.58.0 eslint: 8.57.1 eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -17801,7 +17829,7 @@ snapshots: dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-constant-elements': 7.27.1(@babel/core@7.29.0) - '@babel/preset-env': 7.29.2(@babel/core@7.29.0) + '@babel/preset-env': 7.29.0(@babel/core@7.29.0) '@babel/preset-react': 7.28.5(@babel/core@7.29.0) '@babel/preset-typescript': 7.28.5(@babel/core@7.29.0) '@svgr/core': 8.1.0(typescript@5.9.3) @@ -17827,7 +17855,7 @@ snapshots: '@testing-library/dom@10.4.1': dependencies: '@babel/code-frame': 7.29.0 - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.28.6 '@types/aria-query': 5.0.4 aria-query: 5.3.0 dom-accessibility-api: 0.5.16 @@ -17844,12 +17872,12 @@ snapshots: picocolors: 1.1.1 redent: 3.0.0 - '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.28.6 '@testing-library/dom': 10.4.1 - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) optionalDependencies: '@types/react': 19.2.10 '@types/react-dom': 19.2.3(@types/react@19.2.10) @@ -18414,14 +18442,14 @@ snapshots: '@types/node': 18.19.130 optional: true - '@typescript-eslint/eslint-plugin@8.58.1(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.57.2(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 '@typescript-eslint/parser': 8.58.0(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.58.1 - '@typescript-eslint/type-utils': 8.58.1(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/utils': 8.58.1(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.58.1 + '@typescript-eslint/scope-manager': 8.57.2 + '@typescript-eslint/type-utils': 8.57.2(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.2(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.57.2 eslint: 8.57.1 ignore: 7.0.5 natural-compare: 1.4.0 @@ -18442,65 +18470,47 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/project-service@8.57.2(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.58.0(typescript@5.9.3) + '@typescript-eslint/types': 8.58.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/project-service@8.58.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@5.9.3) - '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/tsconfig-utils': 8.58.0(typescript@5.9.3) + '@typescript-eslint/types': 8.58.0 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.58.1(typescript@5.9.3)': + '@typescript-eslint/scope-manager@8.57.2': dependencies: - '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@5.9.3) - '@typescript-eslint/types': 8.58.2 - debug: 4.4.3 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.58.2(typescript@5.9.3)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@5.9.3) - '@typescript-eslint/types': 8.58.2 - debug: 4.4.3 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color + '@typescript-eslint/types': 8.57.2 + '@typescript-eslint/visitor-keys': 8.57.2 '@typescript-eslint/scope-manager@8.58.0': dependencies: '@typescript-eslint/types': 8.58.0 '@typescript-eslint/visitor-keys': 8.58.0 - '@typescript-eslint/scope-manager@8.58.1': + '@typescript-eslint/tsconfig-utils@8.57.2(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.58.1 - '@typescript-eslint/visitor-keys': 8.58.1 - - '@typescript-eslint/scope-manager@8.58.2': - dependencies: - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/visitor-keys': 8.58.2 + typescript: 5.9.3 '@typescript-eslint/tsconfig-utils@8.58.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/tsconfig-utils@8.58.1(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.57.2(eslint@8.57.1)(typescript@5.9.3)': dependencies: - typescript: 5.9.3 - - '@typescript-eslint/tsconfig-utils@8.58.2(typescript@5.9.3)': - dependencies: - typescript: 5.9.3 - - '@typescript-eslint/type-utils@8.58.1(eslint@8.57.1)(typescript@5.9.3)': - dependencies: - '@typescript-eslint/types': 8.58.1 - '@typescript-eslint/typescript-estree': 8.58.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.58.1(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/types': 8.57.2 + '@typescript-eslint/typescript-estree': 8.57.2(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.2(eslint@8.57.1)(typescript@5.9.3) debug: 4.4.3 eslint: 8.57.1 ts-api-utils: 2.5.0(typescript@5.9.3) @@ -18508,11 +18518,24 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/types@8.57.2': {} + '@typescript-eslint/types@8.58.0': {} - '@typescript-eslint/types@8.58.1': {} - - '@typescript-eslint/types@8.58.2': {} + '@typescript-eslint/typescript-estree@8.57.2(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.57.2(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.57.2(typescript@5.9.3) + '@typescript-eslint/types': 8.57.2 + '@typescript-eslint/visitor-keys': 8.57.2 + debug: 4.4.3 + minimatch: 10.2.5 + semver: 7.7.4 + tinyglobby: 0.2.15 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color '@typescript-eslint/typescript-estree@8.58.0(typescript@5.9.3)': dependencies: @@ -18523,79 +18546,33 @@ snapshots: debug: 4.4.3 minimatch: 10.2.5 semver: 7.7.4 - tinyglobby: 0.2.16 + tinyglobby: 0.2.15 ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.58.1(typescript@5.9.3)': - dependencies: - '@typescript-eslint/project-service': 8.58.1(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.58.1(typescript@5.9.3) - '@typescript-eslint/types': 8.58.1 - '@typescript-eslint/visitor-keys': 8.58.1 - debug: 4.4.3 - minimatch: 10.2.5 - semver: 7.7.4 - tinyglobby: 0.2.16 - ts-api-utils: 2.5.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@8.58.2(typescript@5.9.3)': - dependencies: - '@typescript-eslint/project-service': 8.58.2(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@5.9.3) - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/visitor-keys': 8.58.2 - debug: 4.4.3 - minimatch: 10.2.5 - semver: 7.7.4 - tinyglobby: 0.2.16 - ts-api-utils: 2.5.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.58.1(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/utils@8.57.2(eslint@8.57.1)(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.58.1 - '@typescript-eslint/types': 8.58.1 - '@typescript-eslint/typescript-estree': 8.58.1(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.57.2 + '@typescript-eslint/types': 8.57.2 + '@typescript-eslint/typescript-estree': 8.57.2(typescript@5.9.3) eslint: 8.57.1 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.58.2(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/visitor-keys@8.57.2': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/typescript-estree': 8.58.2(typescript@5.9.3) - eslint: 8.57.1 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color + '@typescript-eslint/types': 8.57.2 + eslint-visitor-keys: 5.0.1 '@typescript-eslint/visitor-keys@8.58.0': dependencies: '@typescript-eslint/types': 8.58.0 eslint-visitor-keys: 5.0.1 - '@typescript-eslint/visitor-keys@8.58.1': - dependencies: - '@typescript-eslint/types': 8.58.1 - eslint-visitor-keys: 5.0.1 - - '@typescript-eslint/visitor-keys@8.58.2': - dependencies: - '@typescript-eslint/types': 8.58.2 - eslint-visitor-keys: 5.0.1 - '@ungap/structured-clone@1.3.0': {} '@unrs/resolver-binding-android-arm-eabi@1.11.1': @@ -18662,35 +18639,35 @@ snapshots: d3-selection: 3.0.0 d3-transition: 3.0.1(d3-selection@3.0.0) - '@vector-im/compound-design-tokens@10.1.0(@types/react@19.2.10)(react@19.2.5)': + '@vector-im/compound-design-tokens@10.1.0(@types/react@19.2.10)(react@19.2.4)': optionalDependencies: '@types/react': 19.2.10 - react: 19.2.5 + react: 19.2.4 - '@vector-im/compound-web@9.1.0(@fontsource/inconsolata@5.2.8)(@fontsource/inter@5.2.8)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(@vector-im/compound-design-tokens@10.1.0(@types/react@19.2.10)(react@19.2.5))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@vector-im/compound-web@9.1.0(@fontsource/inconsolata@5.2.8)(@fontsource/inter@5.2.8)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(@vector-im/compound-design-tokens@10.1.0(@types/react@19.2.10)(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@floating-ui/react': 0.27.17(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@floating-ui/react': 0.27.17(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@fontsource/inconsolata': 5.2.8 '@fontsource/inter': 5.2.8 - '@radix-ui/react-context-menu': 2.2.16(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-dropdown-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-form': 0.1.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-progress': 1.1.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-separator': 1.1.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-slot': 1.2.4(@types/react@19.2.10)(react@19.2.5) - '@vector-im/compound-design-tokens': 10.1.0(@types/react@19.2.10)(react@19.2.5) + '@radix-ui/react-context-menu': 2.2.16(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-dropdown-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-form': 0.1.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-progress': 1.1.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-separator': 1.1.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.4(@types/react@19.2.10)(react@19.2.4) + '@vector-im/compound-design-tokens': 10.1.0(@types/react@19.2.10)(react@19.2.4) classnames: 2.5.1 - react: 19.2.5 - vaul: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + react: 19.2.4 + vaul: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) optionalDependencies: '@types/react': 19.2.10 transitivePeerDependencies: - '@types/react-dom' - react-dom - '@vector-im/matrix-wysiwyg@2.40.0(patch_hash=7bdf6150f2905bc2f055a6bcaa7b9d78fa7ffde82e800bcc454ac7b0096bd65e)(react@19.2.5)': + '@vector-im/matrix-wysiwyg@2.40.0(patch_hash=7bdf6150f2905bc2f055a6bcaa7b9d78fa7ffde82e800bcc454ac7b0096bd65e)(react@19.2.4)': dependencies: - react: 19.2.5 + react: 19.2.4 '@vitejs/plugin-vue@5.2.4(vite@5.4.21(@types/node@18.19.130)(lightningcss@1.32.0)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1))(vue@3.5.31(typescript@5.9.3))': dependencies: @@ -18711,13 +18688,13 @@ snapshots: - vite optional: true - '@vitest/browser-playwright@4.1.2(playwright@1.59.1)(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2)': + '@vitest/browser-playwright@4.1.2(playwright@1.59.1)(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2)': dependencies: - '@vitest/browser': 4.1.2(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2) - '@vitest/mocker': 4.1.2(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + '@vitest/browser': 4.1.2(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2) + '@vitest/mocker': 4.1.2(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) playwright: 1.59.1 tinyrainbow: 3.1.0 - vitest: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@18.19.130)(@vitest/browser-playwright@4.1.2)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + vitest: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@18.19.130)(@vitest/browser-playwright@4.1.2)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) transitivePeerDependencies: - bufferutil - msw @@ -18742,16 +18719,16 @@ snapshots: - vite optional: true - '@vitest/browser@4.1.2(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2)': + '@vitest/browser@4.1.2(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2)': dependencies: '@blazediff/core': 1.9.1 - '@vitest/mocker': 4.1.2(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + '@vitest/mocker': 4.1.2(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) '@vitest/utils': 4.1.2 magic-string: 0.30.21 pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.1.0 - vitest: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@18.19.130)(@vitest/browser-playwright@4.1.2)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + vitest: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@18.19.130)(@vitest/browser-playwright@4.1.2)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) ws: 8.20.0 transitivePeerDependencies: - bufferutil @@ -18775,7 +18752,7 @@ snapshots: optionalDependencies: '@vitest/browser': 4.1.2(vite@7.3.2(@types/node@18.19.130)(jiti@2.6.1)(lightningcss@1.32.0)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2) - '@vitest/coverage-v8@4.1.2(@vitest/browser@4.1.2(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2))(vitest@4.1.2)': + '@vitest/coverage-v8@4.1.2(@vitest/browser@4.1.2(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2))(vitest@4.1.2)': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.1.2 @@ -18787,9 +18764,9 @@ snapshots: obug: 2.1.1 std-env: 4.0.0 tinyrainbow: 3.1.0 - vitest: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@18.19.130)(@vitest/browser-playwright@4.1.2)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + vitest: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@18.19.130)(@vitest/browser-playwright@4.1.2)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) optionalDependencies: - '@vitest/browser': 4.1.2(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2) + '@vitest/browser': 4.1.2(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2) '@vitest/expect@3.2.4': dependencies: @@ -18816,13 +18793,13 @@ snapshots: optionalDependencies: vite: 7.3.2(@types/node@18.19.130)(jiti@2.6.1)(lightningcss@1.32.0)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) - '@vitest/mocker@4.1.2(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))': + '@vitest/mocker@4.1.2(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))': dependencies: '@vitest/spy': 4.1.2 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) '@vitest/pretty-format@3.2.4': dependencies: @@ -19070,9 +19047,7 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - '@webcontainer/env@1.1.1': {} - - '@xmldom/xmldom@0.9.9': {} + '@xmldom/xmldom@0.8.12': {} '@xtuc/ieee754@1.2.0': {} @@ -19467,11 +19442,11 @@ snapshots: await-lock@3.0.0(patch_hash=b767a571946a4f8710ac54b1a7bec8a7c1570f9b85d75922392fae20d0578964): {} - axe-core@4.11.3: {} + axe-core@4.11.1: {} axios@1.15.0: dependencies: - follow-redirects: 1.15.11 + follow-redirects: 1.16.0 form-data: 4.0.5 proxy-from-env: 2.1.0 transitivePeerDependencies: @@ -19513,7 +19488,7 @@ snapshots: dependencies: '@babel/helper-plugin-utils': 7.28.6 '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.6 + '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 6.0.3 test-exclude: 6.0.0 transitivePeerDependencies: @@ -19529,15 +19504,15 @@ snapshots: babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.28.6 cosmiconfig: 7.1.0 - resolve: 1.22.12 + resolve: 1.22.11 - babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.0): + babel-plugin-polyfill-corejs2@0.4.15(@babel/core@7.29.0): dependencies: '@babel/compat-data': 7.29.0 '@babel/core': 7.29.0 - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) + '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.29.0) semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -19545,23 +19520,23 @@ snapshots: babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.29.0): dependencies: '@babel/core': 7.29.0 - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) - core-js-compat: 3.49.0 + '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.29.0) + core-js-compat: 3.48.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.14.2(@babel/core@7.29.0): + babel-plugin-polyfill-corejs3@0.14.0(@babel/core@7.29.0): dependencies: '@babel/core': 7.29.0 - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) - core-js-compat: 3.49.0 + '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.29.0) + core-js-compat: 3.48.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.8(@babel/core@7.29.0): + babel-plugin-polyfill-regenerator@0.6.6(@babel/core@7.29.0): dependencies: '@babel/core': 7.29.0 - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.0) + '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.29.0) transitivePeerDependencies: - supports-color @@ -19647,7 +19622,7 @@ snapshots: dependencies: tweetnacl: 0.14.5 - before-after-hook@2.2.3: {} + before-after-hook@4.0.0: {} big.js@5.2.2: {} @@ -19742,7 +19717,7 @@ snapshots: browser-resolve@2.0.0: dependencies: - resolve: 1.22.12 + resolve: 1.22.11 browserify-aes@1.2.0: dependencies: @@ -20217,10 +20192,10 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.3.3 serialize-javascript: 7.0.5 - tinyglobby: 0.2.16 + tinyglobby: 0.2.15 webpack: 5.105.4(webpack-cli@7.0.2) - core-js-compat@3.49.0: + core-js-compat@3.48.0: dependencies: browserslist: 4.28.2 @@ -20782,8 +20757,6 @@ snapshots: depd@2.0.0: {} - deprecation@2.3.1: {} - dequal@2.0.3: {} des.js@1.1.0: @@ -20879,7 +20852,7 @@ snapshots: '@grpc/grpc-js': 1.14.3 '@grpc/proto-loader': 0.7.15 docker-modem: 5.0.7 - protobufjs: 7.5.4 + protobufjs: 7.5.5 tar-fs: 2.1.4 uuid: 10.0.0 transitivePeerDependencies: @@ -20903,7 +20876,7 @@ snapshots: dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.28.6 csstype: 3.2.3 dom-serializer@1.4.1: @@ -20942,7 +20915,7 @@ snapshots: dependencies: domelementtype: 3.0.0 - dompurify@3.3.3: + dompurify@3.4.0: optionalDependencies: '@types/trusted-types': 2.0.7 @@ -21317,7 +21290,7 @@ snapshots: dependencies: debug: 3.2.7 is-core-module: 2.16.1 - resolve: 1.22.12 + resolve: 1.22.11 transitivePeerDependencies: - supports-color @@ -21371,12 +21344,12 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest@29.15.2(@typescript-eslint/eslint-plugin@8.58.1(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(jest@30.3.0(@types/node@18.19.130)(babel-plugin-macros@3.1.0))(typescript@5.9.3): + eslint-plugin-jest@29.15.0(@typescript-eslint/eslint-plugin@8.57.2(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(jest@30.3.0(@types/node@18.19.130)(babel-plugin-macros@3.1.0))(typescript@5.9.3): dependencies: - '@typescript-eslint/utils': 8.58.2(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.2(eslint@8.57.1)(typescript@5.9.3) eslint: 8.57.1 optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.58.1(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.57.2(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) jest: 30.3.0(@types/node@18.19.130)(babel-plugin-macros@3.1.0) typescript: 5.9.3 transitivePeerDependencies: @@ -21388,7 +21361,7 @@ snapshots: array-includes: 3.1.9 array.prototype.flatmap: 1.3.3 ast-types-flow: 0.0.8 - axe-core: 4.11.3 + axe-core: 4.11.1 axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 @@ -21401,20 +21374,20 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-matrix-org@3.0.0(882721dbd3307f2fde4046d20d66d9fc): + eslint-plugin-matrix-org@3.0.0(d28b6cfeddcbcf776e114e7554fcab7e): dependencies: '@babel/core': 7.29.0 '@babel/eslint-parser': 7.28.6(@babel/core@7.29.0)(eslint@8.57.1) '@babel/eslint-plugin': 7.27.1(@babel/eslint-parser@7.28.6(@babel/core@7.29.0)(eslint@8.57.1))(eslint@8.57.1) - '@stylistic/eslint-plugin': 5.10.0(eslint@8.57.1) - '@typescript-eslint/eslint-plugin': 8.58.1(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + '@stylistic/eslint-plugin': 5.9.0(eslint@8.57.1) + '@typescript-eslint/eslint-plugin': 8.57.2(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': 8.58.0(eslint@8.57.1)(typescript@5.9.3) eslint: 8.57.1 eslint-config-google: 0.14.0(eslint@8.57.1) eslint-config-prettier: 10.1.8(eslint@8.57.1) eslint-plugin-deprecate: 0.9.0(eslint@8.57.1) eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1) - eslint-plugin-jest: 29.15.2(@typescript-eslint/eslint-plugin@8.58.1(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(jest@30.3.0(@types/node@18.19.130)(babel-plugin-macros@3.1.0))(typescript@5.9.3) + eslint-plugin-jest: 29.15.0(@typescript-eslint/eslint-plugin@8.57.2(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(jest@30.3.0(@types/node@18.19.130)(babel-plugin-macros@3.1.0))(typescript@5.9.3) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) eslint-plugin-react: 7.37.5(eslint@8.57.1) eslint-plugin-react-hooks: 7.0.1(eslint@8.57.1) @@ -21428,7 +21401,7 @@ snapshots: enhanced-resolve: 5.20.1 eslint: 8.57.1 eslint-plugin-es-x: 7.8.0(eslint@8.57.1) - get-tsconfig: 4.14.0 + get-tsconfig: 4.13.7 globals: 15.15.0 globrex: 0.1.2 ignore: 5.3.2 @@ -21494,11 +21467,11 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-storybook@10.3.5(eslint@8.57.1)(storybook@10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(typescript@5.9.3): + eslint-plugin-storybook@10.2.13(eslint@8.57.1)(storybook@10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3): dependencies: - '@typescript-eslint/utils': 8.58.2(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.2(eslint@8.57.1)(typescript@5.9.3) eslint: 8.57.1 - storybook: 10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + storybook: 10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) transitivePeerDependencies: - supports-color - typescript @@ -21509,7 +21482,7 @@ snapshots: '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) ci-info: 4.4.0 clean-regexp: 1.0.0 - core-js-compat: 3.49.0 + core-js-compat: 3.48.0 eslint: 8.57.1 esquery: 1.7.0 globals: 15.15.0 @@ -21695,7 +21668,7 @@ snapshots: methods: 1.1.2 on-finished: 2.4.1 parseurl: 1.3.3 - path-to-regexp: 1.9.0 + path-to-regexp: 0.1.13 proxy-addr: 2.0.7 qs: 6.15.0 range-parser: 1.2.1 @@ -21762,6 +21735,8 @@ snapshots: fake-indexeddb@6.2.5: {} + fast-content-type-parse@3.0.0: {} + fast-deep-equal@3.1.3: {} fast-fifo@1.3.2: {} @@ -21906,7 +21881,7 @@ snapshots: dependencies: tabbable: 6.4.0 - follow-redirects@1.15.11: {} + follow-redirects@1.16.0: {} for-each@0.3.5: dependencies: @@ -22055,10 +22030,6 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 - get-tsconfig@4.14.0: - dependencies: - resolve-pkg-maps: 1.0.0 - github-markdown-css@5.9.0: {} gl-matrix@3.4.4: {} @@ -22311,11 +22282,11 @@ snapshots: relateurl: 0.2.7 terser: 5.46.1 - html-react-parser@5.2.17(@types/react@19.2.10)(react@19.2.5): + html-react-parser@5.2.17(@types/react@19.2.10)(react@19.2.4): dependencies: domhandler: 5.0.3 html-dom-parser: 5.1.8 - react: 19.2.5 + react: 19.2.4 react-property: 2.0.2 style-to-js: 1.1.21 optionalDependencies: @@ -22393,7 +22364,7 @@ snapshots: http-proxy@1.18.1: dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.11 + follow-redirects: 1.16.0 requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -22718,8 +22689,6 @@ snapshots: dependencies: is-inside-container: 1.0.0 - isarray@0.0.1: {} - isarray@1.0.0: {} isarray@2.0.5: {} @@ -22744,7 +22713,7 @@ snapshots: dependencies: '@babel/core': 7.29.0 '@babel/parser': 7.29.2 - '@istanbuljs/schema': 0.1.6 + '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.7.4 transitivePeerDependencies: @@ -23206,6 +23175,8 @@ snapshots: json-stringify-safe@5.0.1: optional: true + json-with-bigint@3.5.8: {} + json5@1.0.2: dependencies: minimist: 1.2.8 @@ -23264,7 +23235,7 @@ snapshots: kind-of@6.0.3: {} - knip@6.3.0(patch_hash=9ee905cce2466e391db69dfcea905b0fe2502afd935d1dc6a6ac94ffe2855c28)(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2): + knip@6.3.0(patch_hash=9ee905cce2466e391db69dfcea905b0fe2502afd935d1dc6a6ac94ffe2855c28)(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1): dependencies: '@nodelib/fs.walk': 1.2.8 fast-glob: 3.3.3 @@ -23272,8 +23243,8 @@ snapshots: get-tsconfig: 4.13.7 jiti: 2.6.1 minimist: 1.2.8 - oxc-parser: 0.121.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) - oxc-resolver: 11.19.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + oxc-parser: 0.121.0(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1) + oxc-resolver: 11.19.1(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1) picocolors: 1.1.1 picomatch: 4.0.4 smol-toml: 1.6.1 @@ -23393,10 +23364,10 @@ snapshots: dependencies: uc.micro: 2.1.0 - linkify-react@4.3.2(linkifyjs@4.3.2)(react@19.2.5): + linkify-react@4.3.2(linkifyjs@4.3.2)(react@19.2.4): dependencies: linkifyjs: 4.3.2 - react: 19.2.5 + react: 19.2.4 linkify-string@4.3.2(linkifyjs@4.3.2): dependencies: @@ -23458,8 +23429,6 @@ snapshots: lodash.uniq@4.5.0: {} - lodash@4.17.23: {} - lodash@4.18.1: {} log-symbols@4.1.0: @@ -23616,9 +23585,9 @@ snapshots: matrix-events-sdk@0.0.1: {} - matrix-js-sdk@https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/ca5655bced1cbb215ac1c18e179384a069d98b0a: + matrix-js-sdk@https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/eb7acfb810d2989c0fe61c490083ff9d72c44013: dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.28.6 '@matrix-org/matrix-sdk-crypto-wasm': 18.0.0 another-json: 0.2.0 bs58: 6.0.0 @@ -23701,7 +23670,7 @@ snapshots: memoize-one@6.0.0: {} - memoize@11.0.0: + memoize@10.2.0: dependencies: mimic-function: 5.0.1 @@ -23729,7 +23698,7 @@ snapshots: d3-sankey: 0.12.3 dagre-d3-es: 7.0.14 dayjs: 1.11.20 - dompurify: 3.3.3 + dompurify: 3.4.0 katex: 0.16.45 khroma: 2.1.0 lodash-es: 4.18.1 @@ -23981,7 +23950,7 @@ snapshots: proc-log: 5.0.0 semver: 7.7.4 tar: 7.5.13 - tinyglobby: 0.2.16 + tinyglobby: 0.2.15 which: 5.0.0 transitivePeerDependencies: - supports-color @@ -23996,13 +23965,15 @@ snapshots: proc-log: 6.1.0 semver: 7.7.4 tar: 7.5.13 - tinyglobby: 0.2.16 + tinyglobby: 0.2.15 which: 6.0.1 transitivePeerDependencies: - supports-color node-int64@0.4.0: {} + node-machine-id@1.1.12: {} + node-releases@2.0.37: {} node-stdlib-browser@1.3.1: @@ -24049,7 +24020,7 @@ snapshots: normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.12 + resolve: 1.22.11 semver: 5.7.2 validate-npm-package-license: 3.0.4 @@ -24109,6 +24080,58 @@ snapshots: nwsapi@2.2.23: {} + nx@22.5.3: + dependencies: + '@napi-rs/wasm-runtime': 0.2.4 + '@yarnpkg/lockfile': 1.1.0 + '@yarnpkg/parsers': 3.0.2 + '@zkochan/js-yaml': 0.0.7 + axios: 1.15.0 + cli-cursor: 3.1.0 + cli-spinners: 2.6.1 + cliui: 8.0.1 + dotenv: 16.4.7 + dotenv-expand: 11.0.7 + ejs: 3.1.10 + enquirer: 2.3.6 + figures: 3.2.0 + flat: 5.0.2 + front-matter: 4.0.2 + ignore: 7.0.5 + jest-diff: 30.3.0 + jsonc-parser: 3.2.0 + lines-and-columns: 2.0.3 + minimatch: 10.2.5 + node-machine-id: 1.1.12 + npm-run-path: 4.0.1 + open: 8.4.2 + ora: 5.3.0 + picocolors: 1.1.1 + resolve.exports: 2.0.3 + semver: 7.7.4 + string-width: 4.2.3 + tar-stream: 2.2.0 + tmp: 0.2.5 + tree-kill: 1.2.2 + tsconfig-paths: 4.2.0 + tslib: 2.8.1 + yaml: 2.8.3 + yargs: 17.7.2 + yargs-parser: 21.1.1 + optionalDependencies: + '@nx/nx-darwin-arm64': 22.5.3 + '@nx/nx-darwin-x64': 22.5.3 + '@nx/nx-freebsd-x64': 22.5.3 + '@nx/nx-linux-arm-gnueabihf': 22.5.3 + '@nx/nx-linux-arm64-gnu': 22.5.3 + '@nx/nx-linux-arm64-musl': 22.5.3 + '@nx/nx-linux-x64-gnu': 22.5.3 + '@nx/nx-linux-x64-musl': 22.5.3 + '@nx/nx-win32-arm64-msvc': 22.5.3 + '@nx/nx-win32-x64-msvc': 22.5.3 + transitivePeerDependencies: + - debug + nx@22.6.5: dependencies: '@napi-rs/wasm-runtime': 0.2.4 @@ -24285,7 +24308,7 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - oxc-parser@0.121.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2): + oxc-parser@0.121.0(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1): dependencies: '@oxc-project/types': 0.121.0 optionalDependencies: @@ -24305,7 +24328,7 @@ snapshots: '@oxc-parser/binding-linux-x64-gnu': 0.121.0 '@oxc-parser/binding-linux-x64-musl': 0.121.0 '@oxc-parser/binding-openharmony-arm64': 0.121.0 - '@oxc-parser/binding-wasm32-wasi': 0.121.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@oxc-parser/binding-wasm32-wasi': 0.121.0(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1) '@oxc-parser/binding-win32-arm64-msvc': 0.121.0 '@oxc-parser/binding-win32-ia32-msvc': 0.121.0 '@oxc-parser/binding-win32-x64-msvc': 0.121.0 @@ -24313,7 +24336,7 @@ snapshots: - '@emnapi/core' - '@emnapi/runtime' - oxc-resolver@11.19.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2): + oxc-resolver@11.19.1(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1): optionalDependencies: '@oxc-resolver/binding-android-arm-eabi': 11.19.1 '@oxc-resolver/binding-android-arm64': 11.19.1 @@ -24331,7 +24354,7 @@ snapshots: '@oxc-resolver/binding-linux-x64-gnu': 11.19.1 '@oxc-resolver/binding-linux-x64-musl': 11.19.1 '@oxc-resolver/binding-openharmony-arm64': 11.19.1 - '@oxc-resolver/binding-wasm32-wasi': 11.19.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@oxc-resolver/binding-wasm32-wasi': 11.19.1(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1) '@oxc-resolver/binding-win32-arm64-msvc': 11.19.1 '@oxc-resolver/binding-win32-ia32-msvc': 11.19.1 '@oxc-resolver/binding-win32-x64-msvc': 11.19.1 @@ -24464,9 +24487,7 @@ snapshots: lru-cache: 11.2.6 minipass: 7.1.3 - path-to-regexp@1.9.0: - dependencies: - isarray: 0.0.1 + path-to-regexp@0.1.13: {} path-to-regexp@8.4.2: {} @@ -24560,7 +24581,7 @@ snapshots: plist@3.1.0(patch_hash=7a3c35087f0ab2a8efbac9e2899990f07d61e2b3e41d8d962ef0bdb0786e1af7): dependencies: - '@xmldom/xmldom': 0.9.9 + '@xmldom/xmldom': 0.8.12 base64-js: 1.5.1 xmlbuilder: 15.1.1 @@ -24735,7 +24756,7 @@ snapshots: postcss: 8.5.8 postcss-value-parser: 4.2.0 read-cache: 1.0.0 - resolve: 1.22.12 + resolve: 1.22.11 postcss-js@4.1.0(postcss@8.5.8): dependencies: @@ -24814,7 +24835,7 @@ snapshots: postcss-js: 4.1.0(postcss@8.5.8) postcss-simple-vars: 7.0.1(postcss@8.5.8) sugarss: 5.0.1(postcss@8.5.8) - tinyglobby: 0.2.16 + tinyglobby: 0.2.15 postcss-modules-extract-imports@3.1.0(postcss@8.5.8): dependencies: @@ -25078,7 +25099,7 @@ snapshots: '@posthog/core': 1.24.6 '@posthog/types': 1.364.7 core-js: 3.48.0 - dompurify: 3.3.3 + dompurify: 3.4.0 fflate: 0.4.8 preact: 10.28.3 query-selector-shadow-dom: 1.0.1 @@ -25154,7 +25175,7 @@ snapshots: property-information@7.1.0: {} - protobufjs@7.5.4: + protobufjs@7.5.5: dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/base64': 1.1.2 @@ -25267,34 +25288,34 @@ snapshots: schema-utils: 3.3.0 webpack: 5.105.4(webpack-cli@7.0.2) - re-resizable@6.11.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + re-resizable@6.11.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) - react-beautiful-dnd@13.1.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + react-beautiful-dnd@13.1.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.28.6 css-box-model: 1.2.1 memoize-one: 5.2.1 raf-schd: 4.0.3 - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) - react-redux: 7.2.9(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-redux: 7.2.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4) redux: 4.2.1 - use-memo-one: 1.1.3(react@19.2.5) + use-memo-one: 1.1.3(react@19.2.4) transitivePeerDependencies: - react-native - react-blurhash@0.3.0(patch_hash=58bc7f075478017ce27bcc252e8509876390db106246bd5b0a7446642cc4b505)(blurhash@2.0.5)(react@19.2.5): + react-blurhash@0.3.0(patch_hash=58bc7f075478017ce27bcc252e8509876390db106246bd5b0a7446642cc4b505)(blurhash@2.0.5)(react@19.2.4): dependencies: blurhash: 2.0.5 - react: 19.2.5 + react: 19.2.4 - react-clientside-effect@1.2.8(react@19.2.5): + react-clientside-effect@1.2.8(react@19.2.4): dependencies: - '@babel/runtime': 7.29.2 - react: 19.2.5 + '@babel/runtime': 7.28.6 + react: 19.2.4 react-docgen-typescript@2.4.0(typescript@5.9.3): dependencies: @@ -25310,25 +25331,25 @@ snapshots: '@types/doctrine': 0.0.9 '@types/resolve': 1.20.6 doctrine: 3.0.0 - resolve: 1.22.12 + resolve: 1.22.11 strip-indent: 4.1.1 transitivePeerDependencies: - supports-color - react-dom@19.2.5(react@19.2.5): + react-dom@19.2.4(react@19.2.4): dependencies: - react: 19.2.5 + react: 19.2.4 scheduler: 0.27.0 - react-focus-lock@2.13.7(@types/react@19.2.10)(react@19.2.5): + react-focus-lock@2.13.7(@types/react@19.2.10)(react@19.2.4): dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.28.6 focus-lock: 1.3.6 prop-types: 15.8.1 - react: 19.2.5 - react-clientside-effect: 1.2.8(react@19.2.5) - use-callback-ref: 1.3.3(@types/react@19.2.10)(react@19.2.5) - use-sidecar: 1.1.3(@types/react@19.2.10)(react@19.2.5) + react: 19.2.4 + react-clientside-effect: 1.2.8(react@19.2.4) + use-callback-ref: 1.3.3(@types/react@19.2.10)(react@19.2.4) + use-sidecar: 1.1.3(@types/react@19.2.10)(react@19.2.4) optionalDependencies: '@types/react': 19.2.10 @@ -25338,73 +25359,73 @@ snapshots: react-is@19.2.4: {} - react-merge-refs@3.0.2(react@19.2.5): + react-merge-refs@3.0.2(react@19.2.4): optionalDependencies: - react: 19.2.5 + react: 19.2.4 react-property@2.0.2: {} - react-redux@7.2.9(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + react-redux@7.2.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.28.6 '@types/react-redux': 7.1.34 hoist-non-react-statics: 3.3.2 loose-envify: 1.4.0 prop-types: 15.8.1 - react: 19.2.5 + react: 19.2.4 react-is: 17.0.2 optionalDependencies: - react-dom: 19.2.5(react@19.2.5) + react-dom: 19.2.4(react@19.2.4) - react-remove-scroll-bar@2.3.8(@types/react@19.2.10)(react@19.2.5): + react-remove-scroll-bar@2.3.8(@types/react@19.2.10)(react@19.2.4): dependencies: - react: 19.2.5 - react-style-singleton: 2.2.3(@types/react@19.2.10)(react@19.2.5) + react: 19.2.4 + react-style-singleton: 2.2.3(@types/react@19.2.10)(react@19.2.4) tslib: 2.8.1 optionalDependencies: '@types/react': 19.2.10 - react-remove-scroll@2.7.2(@types/react@19.2.10)(react@19.2.5): + react-remove-scroll@2.7.2(@types/react@19.2.10)(react@19.2.4): dependencies: - react: 19.2.5 - react-remove-scroll-bar: 2.3.8(@types/react@19.2.10)(react@19.2.5) - react-style-singleton: 2.2.3(@types/react@19.2.10)(react@19.2.5) + react: 19.2.4 + react-remove-scroll-bar: 2.3.8(@types/react@19.2.10)(react@19.2.4) + react-style-singleton: 2.2.3(@types/react@19.2.10)(react@19.2.4) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.2.10)(react@19.2.5) - use-sidecar: 1.1.3(@types/react@19.2.10)(react@19.2.5) + use-callback-ref: 1.3.3(@types/react@19.2.10)(react@19.2.4) + use-sidecar: 1.1.3(@types/react@19.2.10)(react@19.2.4) optionalDependencies: '@types/react': 19.2.10 - react-resizable-panels@4.7.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + react-resizable-panels@4.7.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) react-string-replace@2.0.1: {} - react-style-singleton@2.2.3(@types/react@19.2.10)(react@19.2.5): + react-style-singleton@2.2.3(@types/react@19.2.10)(react@19.2.4): dependencies: get-nonce: 1.0.1 - react: 19.2.5 + react: 19.2.4 tslib: 2.8.1 optionalDependencies: '@types/react': 19.2.10 - react-transition-group@4.4.5(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + react-transition-group@4.4.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.28.6 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) - react-virtuoso@4.18.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + react-virtuoso@4.18.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) - react@19.2.5: {} + react@19.2.4: {} read-binary-file-arch@1.0.6: dependencies: @@ -25473,7 +25494,7 @@ snapshots: rechoir@0.8.0: dependencies: - resolve: 1.22.12 + resolve: 1.22.11 redent@3.0.0: dependencies: @@ -25482,7 +25503,7 @@ snapshots: redux@4.2.1: dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.28.6 reflect-metadata@0.1.14: {} @@ -25596,9 +25617,8 @@ snapshots: resolve.exports@2.0.3: {} - resolve@1.22.12: + resolve@1.22.11: dependencies: - es-errors: 1.3.0 is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -25663,7 +25683,7 @@ snapshots: robust-predicates@3.0.3: {} - rolldown@1.0.0-rc.12(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2): + rolldown@1.0.0-rc.12(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1): dependencies: '@oxc-project/types': 0.122.0 '@rolldown/pluginutils': 1.0.0-rc.12 @@ -25680,7 +25700,7 @@ snapshots: '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.12 '@rolldown/binding-linux-x64-musl': 1.0.0-rc.12 '@rolldown/binding-openharmony-arm64': 1.0.0-rc.12 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.12(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.12(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1) '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.12 '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.12 transitivePeerDependencies: @@ -26199,41 +26219,39 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 - storybook-addon-vis@3.1.5(@storybook/addon-vitest@10.3.5(@vitest/browser-playwright@4.1.2)(@vitest/browser@4.1.2(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2))(@vitest/runner@4.1.2)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vitest@4.1.2))(@vitest/browser-playwright@4.1.2)(@vitest/browser@4.1.2(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2))(babel-plugin-macros@3.1.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(typescript@5.9.3)(vitest@4.1.2): + storybook-addon-vis@3.1.2(@storybook/addon-vitest@10.2.19(@vitest/browser-playwright@4.1.2)(@vitest/browser@4.1.2(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2))(@vitest/runner@4.1.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vitest@4.1.2))(@vitest/browser-playwright@4.1.2)(@vitest/browser@4.1.2(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2))(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vitest@4.1.2): dependencies: - '@storybook/addon-vitest': 10.3.5(@vitest/browser-playwright@4.1.2)(@vitest/browser@4.1.2(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2))(@vitest/runner@4.1.2)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(storybook@10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vitest@4.1.2) - '@storybook/icons': 2.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@vitest/browser': 4.1.2(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2) + '@storybook/addon-vitest': 10.2.19(@vitest/browser-playwright@4.1.2)(@vitest/browser@4.1.2(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2))(@vitest/runner@4.1.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(storybook@10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vitest@4.1.2) + '@storybook/icons': 2.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@vitest/browser': 4.1.2(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2) glob: 13.0.6 is-ci: 4.1.0 - memoize: 11.0.0 + memoize: 10.2.0 pathe: 2.0.3 - storybook: 10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - type-plus: 8.0.0-beta.8(typescript@5.9.3) - vitest: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@18.19.130)(@vitest/browser-playwright@4.1.2)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) - vitest-plugin-vis: 4.2.2(@vitest/browser-playwright@4.1.2)(@vitest/browser@4.1.2(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2))(babel-plugin-macros@3.1.0)(typescript@5.9.3)(vitest@4.1.2) + storybook: 10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + type-plus: 8.0.0-beta.7 + vitest: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@18.19.130)(@vitest/browser-playwright@4.1.2)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + vitest-plugin-vis: 4.1.0(@vitest/browser-playwright@4.1.2)(@vitest/browser@4.1.2(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2))(babel-plugin-macros@3.1.0)(vitest@4.1.2) transitivePeerDependencies: - '@vitest/browser-playwright' - '@vitest/browser-webdriverio' - babel-plugin-macros - react - react-dom - - typescript - storybook@10.3.5(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + storybook@10.2.19(@testing-library/dom@10.4.1)(prettier@3.8.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: '@storybook/global': 5.0.0 - '@storybook/icons': 2.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@storybook/icons': 2.0.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@testing-library/jest-dom': 6.9.1 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) '@vitest/expect': 3.2.4 '@vitest/spy': 3.2.4 - '@webcontainer/env': 1.1.1 esbuild: 0.27.4 open: 10.2.0 recast: 0.23.11 semver: 7.7.4 - use-sync-external-store: 1.6.0(react@19.2.5) + use-sync-external-store: 1.6.0(react@19.2.4) ws: 8.20.0 optionalDependencies: prettier: 3.8.1 @@ -26426,7 +26444,7 @@ snapshots: stylelint-value-no-unknown-custom-properties@6.1.1(stylelint@17.6.0(typescript@5.9.3)): dependencies: postcss-value-parser: 4.2.0 - resolve: 1.22.12 + resolve: 1.22.11 stylelint: 17.6.0(typescript@5.9.3) stylelint@17.6.0(typescript@5.9.3): @@ -26663,7 +26681,7 @@ snapshots: test-exclude@6.0.0: dependencies: - '@istanbuljs/schema': 0.1.6 + '@istanbuljs/schema': 0.1.3 glob: 7.2.3 minimatch: 3.1.5 @@ -26724,7 +26742,7 @@ snapshots: tinyexec@1.0.4: {} - tinyglobby@0.2.16: + tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 @@ -26820,7 +26838,7 @@ snapshots: tsx@4.21.0: dependencies: esbuild: 0.27.4 - get-tsconfig: 4.14.0 + get-tsconfig: 4.13.7 optionalDependencies: fsevents: 2.3.3 optional: true @@ -26875,10 +26893,9 @@ snapshots: media-typer: 1.1.0 mime-types: 3.0.2 - type-plus@8.0.0-beta.8(typescript@5.9.3): + type-plus@8.0.0-beta.7: dependencies: tersify: 3.12.1 - typescript: 5.9.3 unpartial: 1.0.5 typed-array-buffer@1.0.3: @@ -26959,9 +26976,7 @@ snapshots: undici-types@5.26.5: {} - undici@5.29.0: - dependencies: - '@fastify/busboy': 2.1.1 + undici@6.25.0: {} undici@7.25.0: {} @@ -27011,7 +27026,7 @@ snapshots: unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 - universal-user-agent@6.0.1: {} + universal-user-agent@7.0.3: {} universalify@0.1.2: {} @@ -27075,28 +27090,28 @@ snapshots: punycode: 1.4.1 qs: 6.15.0 - use-callback-ref@1.3.3(@types/react@19.2.10)(react@19.2.5): + use-callback-ref@1.3.3(@types/react@19.2.10)(react@19.2.4): dependencies: - react: 19.2.5 + react: 19.2.4 tslib: 2.8.1 optionalDependencies: '@types/react': 19.2.10 - use-memo-one@1.1.3(react@19.2.5): + use-memo-one@1.1.3(react@19.2.4): dependencies: - react: 19.2.5 + react: 19.2.4 - use-sidecar@1.1.3(@types/react@19.2.10)(react@19.2.5): + use-sidecar@1.1.3(@types/react@19.2.10)(react@19.2.4): dependencies: detect-node-es: 1.1.0 - react: 19.2.5 + react: 19.2.4 tslib: 2.8.1 optionalDependencies: '@types/react': 19.2.10 - use-sync-external-store@1.6.0(react@19.2.5): + use-sync-external-store@1.6.0(react@19.2.4): dependencies: - react: 19.2.5 + react: 19.2.4 utf8-byte-length@1.0.5: {} @@ -27139,11 +27154,11 @@ snapshots: vary@1.1.2: {} - vaul@1.1.2(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + vaul@1.1.2(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) transitivePeerDependencies: - '@types/react' - '@types/react-dom' @@ -27184,7 +27199,7 @@ snapshots: - rollup - supports-color - vite-plugin-dts@4.5.4(@types/node@18.19.130)(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(typescript@5.9.3)(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): + vite-plugin-dts@4.5.4(@types/node@18.19.130)(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(typescript@5.9.3)(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): dependencies: '@microsoft/api-extractor': 7.56.0(@types/node@18.19.130) '@rollup/pluginutils': 5.3.0(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8)) @@ -27197,17 +27212,17 @@ snapshots: magic-string: 0.30.21 typescript: 5.9.3 optionalDependencies: - vite: 8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-node-polyfills@0.26.0(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): + vite-plugin-node-polyfills@0.26.0(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8))(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): dependencies: '@rollup/plugin-inject': 5.0.5(rollup@4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8)) node-stdlib-browser: 1.3.1 - vite: 8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) transitivePeerDependencies: - rollup @@ -27230,7 +27245,7 @@ snapshots: picomatch: 4.0.4 postcss: 8.5.8 rollup: 4.60.1(patch_hash=603340e49399c6044e41a3998891667387d5ec1acbd38d4e5862f2ba3ef58de8) - tinyglobby: 0.2.16 + tinyglobby: 0.2.15 optionalDependencies: '@types/node': 18.19.130 fsevents: 2.3.3 @@ -27241,13 +27256,13 @@ snapshots: tsx: 4.21.0 yaml: 2.8.3 - vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3): + vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 postcss: 8.5.8 - rolldown: 1.0.0-rc.12(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) - tinyglobby: 0.2.16 + rolldown: 1.0.0-rc.12(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1) + tinyglobby: 0.2.15 optionalDependencies: '@types/node': 18.19.130 esbuild: 0.27.4 @@ -27317,9 +27332,9 @@ snapshots: - typescript - universal-cookie - vitest-plugin-vis@4.2.2(@vitest/browser-playwright@4.1.2)(@vitest/browser@4.1.2(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2))(babel-plugin-macros@3.1.0)(typescript@5.9.3)(vitest@4.1.2): + vitest-plugin-vis@4.1.0(@vitest/browser-playwright@4.1.2)(@vitest/browser@4.1.2(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2))(babel-plugin-macros@3.1.0)(vitest@4.1.2): dependencies: - '@vitest/browser': 4.1.2(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2) + '@vitest/browser': 4.1.2(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2) dedent: 1.7.2(babel-plugin-macros@3.1.0) glob: 13.0.6 is-ci: 4.1.0 @@ -27329,13 +27344,12 @@ snapshots: pngjs: 7.0.0 rimraf: 6.1.3 ssim.js: 3.5.0 - type-plus: 8.0.0-beta.8(typescript@5.9.3) - vitest: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@18.19.130)(@vitest/browser-playwright@4.1.2)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + type-plus: 8.0.0-beta.7 + vitest: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@18.19.130)(@vitest/browser-playwright@4.1.2)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) optionalDependencies: - '@vitest/browser-playwright': 4.1.2(playwright@1.59.1)(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2) + '@vitest/browser-playwright': 4.1.2(playwright@1.59.1)(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2) transitivePeerDependencies: - babel-plugin-macros - - typescript vitest-sonar-reporter@3.0.0(vitest@4.1.2): dependencies: @@ -27359,7 +27373,7 @@ snapshots: std-env: 4.0.0 tinybench: 2.9.0 tinyexec: 1.0.4 - tinyglobby: 0.2.16 + tinyglobby: 0.2.15 tinyrainbow: 3.1.0 vite: 7.3.2(@types/node@18.19.130)(jiti@2.6.1)(lightningcss@1.32.0)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) why-is-node-running: 2.3.0 @@ -27371,10 +27385,10 @@ snapshots: transitivePeerDependencies: - msw - vitest@4.1.2(@opentelemetry/api@1.9.0)(@types/node@18.19.130)(@vitest/browser-playwright@4.1.2)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): + vitest@4.1.2(@opentelemetry/api@1.9.0)(@types/node@18.19.130)(@vitest/browser-playwright@4.1.2)(jsdom@26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f))(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): dependencies: '@vitest/expect': 4.1.2 - '@vitest/mocker': 4.1.2(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + '@vitest/mocker': 4.1.2(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) '@vitest/pretty-format': 4.1.2 '@vitest/runner': 4.1.2 '@vitest/snapshot': 4.1.2 @@ -27389,14 +27403,14 @@ snapshots: std-env: 4.0.0 tinybench: 2.9.0 tinyexec: 1.0.4 - tinyglobby: 0.2.16 + tinyglobby: 0.2.15 tinyrainbow: 3.1.0 - vite: 8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 '@types/node': 18.19.130 - '@vitest/browser-playwright': 4.1.2(playwright@1.59.1)(vite@8.0.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2) + '@vitest/browser-playwright': 4.1.2(playwright@1.59.1)(vite@8.0.5(@emnapi/core@1.8.1)(@emnapi/runtime@1.8.1)(@types/node@18.19.130)(esbuild@0.27.4)(jiti@2.6.1)(sugarss@5.0.1(postcss@8.5.8))(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2) jsdom: 26.1.0(patch_hash=040623e87b1c8b676c2a705513c0276c0704dd1b23fc3a1bb77cde8128b64b5f) transitivePeerDependencies: - msw diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 047f97ff4a..2aae851aea 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -27,4 +27,8 @@ packageExtensions: dependencies: # Fix missing type dependency "@types/picomatch": 4.0.2 + "@joshwooding/vite-plugin-react-docgen-typescript": + peerDependencies: + # Silence warning + vite: "^8.0.0" ignorePatchFailures: false From abae870b8360daaee2eec9e3695142dc75dce51b Mon Sep 17 00:00:00 2001 From: Andy Balaam Date: Fri, 17 Apr 2026 10:15:22 +0100 Subject: [PATCH 06/11] Improve the toasts fixture of the playwright-common tools (#33158) * Improve the toasts fixture of the playwright-common tools * Increase @element-hq/element-web-playwright-common version to 3.2.0 * Default to 2 second wait for IfExists variants * Set playwright-common version to 4.0.0 due to breaking change * Move handleToast into a free function * Rename handleToast to clickToastButton * Document new param on clickToastButton --- packages/playwright-common/package.json | 2 +- .../playwright-common/src/fixtures/toasts.ts | 135 ++++++++++++------ 2 files changed, 92 insertions(+), 45 deletions(-) diff --git a/packages/playwright-common/package.json b/packages/playwright-common/package.json index 8436b651cb..9ea21024ba 100644 --- a/packages/playwright-common/package.json +++ b/packages/playwright-common/package.json @@ -1,7 +1,7 @@ { "name": "@element-hq/element-web-playwright-common", "type": "module", - "version": "3.1.0", + "version": "4.0.0", "license": "SEE LICENSE IN README.md", "repository": { "type": "git", diff --git a/packages/playwright-common/src/fixtures/toasts.ts b/packages/playwright-common/src/fixtures/toasts.ts index 780884e2b0..e04b275178 100644 --- a/packages/playwright-common/src/fixtures/toasts.ts +++ b/packages/playwright-common/src/fixtures/toasts.ts @@ -29,81 +29,128 @@ class Toasts { public constructor(public readonly page: Page) {} /** - * Assert that no toasts exist + * Assert that no toasts exist. */ public async assertNoToasts(): Promise { await expect(this.page.locator(".mx_Toast_toast")).not.toBeVisible(); } /** - * Assert that a toast with the given title exists, and return it + * Return the toast with the supplied title. Fail or return null if it does + * not exist. * - * @param title - Expected title of the toast - * @param timeout - Time to retry the assertion for in milliseconds. - * Defaults to `timeout` in `TestConfig.expect`. - * @returns the Locator for the matching toast + * If `required` is false, you should supply a relatively short `timeout` + * (e.g. 2000, meaning 2 seconds) to prevent your test taking too long. + * + * @param title - Expected title of the toast. + * @param timeout - Time in ms before we give up and decide the toast does + * not exist. If `required` is true, defaults to `timeout` + * in `TestConfig.expect`. Otherwise, defaults to 2000 (2 + * seconds). + * @param required - If true, fail the test (throw an exception) if the + * toast is not visible. Otherwise, just return null if + * the toast is not visible. + * @returns the Locator for the matching toast, or null if it is not + * visible. (null will only be returned if `required` is false.) */ - public async getToast(title: string, timeout?: number): Promise { - const toast = this.getToastIfExists(title); - await expect(toast).toBeVisible({ timeout }); - return toast; + public async getToast(title: string, timeout?: number, required = true): Promise { + const toast = this.page.locator(".mx_Toast_toast", { hasText: title }).first(); + + if (required) { + await expect(toast).toBeVisible({ timeout }); + return toast; + } else { + // If we don't set a timeout, waitFor will wait forever. Since + // required is false, we definitely don't want to wait forever. + timeout = timeout ?? 2000; + + try { + await toast.waitFor({ state: "visible", timeout }); + return toast; + } catch { + return null; + } + } } /** - * Find a toast with the given title, if it exists. + * Accept the toast with the supplied title, or fail if it does not exist. * - * @param title - Title of the toast. - * @returns the Locator for the matching toast, or an empty locator if it - * doesn't exist. - */ - public getToastIfExists(title: string): Locator { - return this.page.locator(".mx_Toast_toast", { hasText: title }).first(); - } - - /** - * Accept a toast with the given title. Only works for the first toast in - * the stack. + * Only works if this toast is at the top of the stack of toasts. * - * @param title - Expected title of the toast + * @param title - Expected title of the toast. */ public async acceptToast(title: string): Promise { - const toast = await this.getToast(title); - await toast.locator('.mx_Toast_buttons button[data-kind="primary"]').click(); + return await clickToastButton(this, title, "primary"); } + /** - * Accept a toast with the given title, if it exists. Only works for the - * first toast in the stack. + * Accept the toast with the supplied title, if it exists, or return after 2 + * seconds if it is not found. * - * @param title - Title of the toast + * Only works if this toast is at the top of the stack of toasts. + * + * @param title - Expected title of the toast. */ public async acceptToastIfExists(title: string): Promise { - const toast = this.getToastIfExists(title).locator('.mx_Toast_buttons button[data-kind="primary"]'); - if ((await toast.count()) > 0) { - await toast.click(); - } + return await clickToastButton(this, title, "primary", 2000, false); } /** - * Reject a toast with the given title. Only works for the first toast in - * the stack. + * Reject the toast with the supplied title, or fail if it does not exist. * - * @param title - Expected title of the toast + * Only works if this toast is at the top of the stack of toasts. + * + * @param title - Expected title of the toast. */ public async rejectToast(title: string): Promise { - const toast = await this.getToast(title); - await toast.locator('.mx_Toast_buttons button[data-kind="secondary"]').click(); + return await clickToastButton(this, title, "secondary"); } /** - * Reject a toast with the given title, if it exists. Only works for the - * first toast in the stack. + * Reject the toast with the supplied title, if it exists, or return after 2 + * seconds if it is not found. * - * @param title - Title of the toast + * Only works if this toast is at the top of the stack of toasts. + * + * @param title - Expected title of the toast. */ public async rejectToastIfExists(title: string): Promise { - const toast = this.getToastIfExists(title).locator('.mx_Toast_buttons button[data-kind="secondary"]'); - if ((await toast.count()) > 0) { - await toast.click(); - } + return await clickToastButton(this, title, "secondary", 2000, false); + } +} + +/** + * Find the toast with the supplied title and click a button on it. + * + * Only works if this toast is at the top of the stack of toasts. + * + * If `required` is false, you should supply a relatively short `timeout` + * (e.g. 2000, meaning 2 seconds) to prevent your test taking too long. + * + * @param toasts - A Toasts instance. + * @param title - Expected title of the toast. + * @param button - Which button to click on the toast. Allowed values are + * "primary", which will accept the toast, or "secondary", + * which will reject it. + * @param timeout - Time in ms before we give up and decide the toast does + * not exist. If `required` is true, defaults to `timeout` + * in `TestConfig.expect`. Otherwise, defaults to 2000 (2 + * seconds). + * @param required - If true, fail the test (throw an exception) if the + * toast is not visible. Otherwise, just return after + * `timeout` if the toast is not visible. + */ +async function clickToastButton( + toasts: Toasts, + title: string, + button: "primary" | "secondary", + timeout?: number, + required = true, +): Promise { + const toast = await toasts.getToast(title, timeout, required); + + if (toast) { + await toast.locator(`.mx_Toast_buttons button[data-kind="${button}"]`).click(); } } From 1044a95687a318c704ed47eb9e814b5d94435fa1 Mon Sep 17 00:00:00 2001 From: adis veletanlic <96535657+defaultdino@users.noreply.github.com> Date: Fri, 17 Apr 2026 12:58:15 +0200 Subject: [PATCH 07/11] fix(call): leave call along with room (#33162) * make sure to disconnect from possibly active calls for a room when leaving the room * log error on log call * Update apps/web/src/utils/leave-behaviour.ts Co-authored-by: Michael Telatynski <7t3chguy@gmail.com> * fix wrong logger import * hang up calls properly on empty rooms for both legacy and element calls (listen for room event and leave call if only one member left). add tests for both legacy and element calls. * format Call-test.ts * revert async on function def * revert Call.ts and Call-test.ts. Wrap legacy call hangup in try --------- Co-authored-by: Michael Telatynski <7t3chguy@gmail.com> --- apps/web/src/utils/leave-behaviour.ts | 20 +++++++++++++++ .../unit-tests/utils/leave-behaviour-test.ts | 25 +++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/apps/web/src/utils/leave-behaviour.ts b/apps/web/src/utils/leave-behaviour.ts index 8b7ee02f36..9756fa50cf 100644 --- a/apps/web/src/utils/leave-behaviour.ts +++ b/apps/web/src/utils/leave-behaviour.ts @@ -9,6 +9,7 @@ Please see LICENSE files in the repository root for full details. import { sleep } from "matrix-js-sdk/src/utils"; import React, { type ReactNode } from "react"; import { EventStatus, MatrixEventEvent, type Room, type MatrixClient, MatrixError } from "matrix-js-sdk/src/matrix"; +import { logger } from "matrix-js-sdk/src/logger"; import Modal, { type IHandle } from "../Modal"; import Spinner from "../components/views/elements/Spinner"; @@ -25,6 +26,8 @@ import { type AfterLeaveRoomPayload } from "../dispatcher/payloads/AfterLeaveRoo import { bulkSpaceBehaviour } from "./space"; import { SdkContextClass } from "../contexts/SDKContext"; import SettingsStore from "../settings/SettingsStore"; +import { CallStore } from "../stores/CallStore"; +import LegacyCallHandler from "../LegacyCallHandler"; export async function leaveRoomBehaviour( matrixClient: MatrixClient, @@ -59,6 +62,23 @@ export async function leaveRoomBehaviour( throw new Error(`Expected to find room for id ${roomId}`); } + // attempt to hang up legacy based calls + try { + LegacyCallHandler.instance.hangupOrReject(roomId); + } catch (e) { + logger.warn("Failed to hangup call before leaving room: ", e); + } + + // hang up widget based calls + const activeCall = CallStore.instance.getActiveCall(roomId); + if (activeCall) { + try { + await activeCall.disconnect(); + } catch (e) { + logger.warn("Failed to disconnect call before leaving room: ", e); + } + } + // await any queued messages being sent so that they do not fail await Promise.all( room diff --git a/apps/web/test/unit-tests/utils/leave-behaviour-test.ts b/apps/web/test/unit-tests/utils/leave-behaviour-test.ts index 9da796a3a5..a6da3a4083 100644 --- a/apps/web/test/unit-tests/utils/leave-behaviour-test.ts +++ b/apps/web/test/unit-tests/utils/leave-behaviour-test.ts @@ -22,6 +22,9 @@ import SpaceStore from "../../../src/stores/spaces/SpaceStore"; import { MetaSpace } from "../../../src/stores/spaces"; import { type ActionPayload } from "../../../src/dispatcher/payloads"; import SettingsStore from "../../../src/settings/SettingsStore"; +import { CallStore } from "../../../src/stores/CallStore"; +import { type Call } from "../../../src/models/Call"; +import LegacyCallHandler from "../../../src/LegacyCallHandler"; describe("leaveRoomBehaviour", () => { SdkContextClass.instance.constructEagerStores(); // Initialize RoomViewStore @@ -76,6 +79,28 @@ describe("leaveRoomBehaviour", () => { defaultDispatcher.unregister(dispatcherRef); }; + it("hangs up legacy calls when leaving a room", async () => { + const hangupSpy = jest.spyOn(LegacyCallHandler.instance, "hangupOrReject").mockImplementation(() => {}); + + viewRoom(room); + await leaveRoomBehaviour(client, room.roomId); + + expect(hangupSpy).toHaveBeenCalledWith(room.roomId); + }); + + it("disconnects widget-based calls when leaving a room", async () => { + const mockCall = { + disconnect: jest.fn().mockResolvedValue(undefined), + } as unknown as Call; + + jest.spyOn(CallStore.instance, "getActiveCall").mockReturnValue(mockCall); + + viewRoom(room); + await leaveRoomBehaviour(client, room.roomId); + + expect(mockCall.disconnect).toHaveBeenCalled(); + }); + it("returns to the home page after leaving a room outside of a space that was being viewed", async () => { viewRoom(room); From 73d4b63adafd3547aaf957f9d762c6ad2edab6a1 Mon Sep 17 00:00:00 2001 From: adis veletanlic <96535657+defaultdino@users.noreply.github.com> Date: Fri, 17 Apr 2026 13:36:40 +0200 Subject: [PATCH 08/11] Fix crashes in when opening Bridges in room settings (#33137) * use SDKContext for room settings dialog to avoid crash #33107 * format with prettier * add SDKContext to RoomSettingsDialog test --- .../views/dialogs/RoomSettingsDialog.tsx | 34 +++++++++++-------- apps/web/src/utils/DialogOpener.ts | 1 + .../views/dialogs/RoomSettingsDialog-test.tsx | 10 ++++-- 3 files changed, 28 insertions(+), 17 deletions(-) diff --git a/apps/web/src/components/views/dialogs/RoomSettingsDialog.tsx b/apps/web/src/components/views/dialogs/RoomSettingsDialog.tsx index 10e4a3e428..4488c6bf93 100644 --- a/apps/web/src/components/views/dialogs/RoomSettingsDialog.tsx +++ b/apps/web/src/components/views/dialogs/RoomSettingsDialog.tsx @@ -42,6 +42,7 @@ import { type NonEmptyArray } from "../../../@types/common"; import { PollHistoryTab } from "../settings/tabs/room/PollHistoryTab"; import ErrorBoundary from "../elements/ErrorBoundary"; import { PeopleRoomSettingsTab } from "../settings/tabs/room/PeopleRoomSettingsTab"; +import { SDKContext, type SdkContextClass } from "../../../contexts/SDKContext"; export const enum RoomSettingsTab { General = "ROOM_GENERAL_TAB", @@ -59,6 +60,7 @@ interface IProps { roomId: string; onFinished: (success?: boolean) => void; initialTabId?: RoomSettingsTab; + sdkContext: SdkContextClass; } interface IState { @@ -238,21 +240,23 @@ class RoomSettingsDialog extends React.Component { public render(): React.ReactNode { const roomName = this.state.room.name; return ( - -
- -
-
+ + +
+ +
+
+
); } } diff --git a/apps/web/src/utils/DialogOpener.ts b/apps/web/src/utils/DialogOpener.ts index 9eadf63adf..fff7297a68 100644 --- a/apps/web/src/utils/DialogOpener.ts +++ b/apps/web/src/utils/DialogOpener.ts @@ -57,6 +57,7 @@ export class DialogOpener { { roomId: payload.room_id || SdkContextClass.instance.roomViewStore.getRoomId(), initialTabId: payload.initial_tab_id, + sdkContext: SdkContextClass.instance, }, /*className=*/ undefined, /*isPriority=*/ false, diff --git a/apps/web/test/unit-tests/components/views/dialogs/RoomSettingsDialog-test.tsx b/apps/web/test/unit-tests/components/views/dialogs/RoomSettingsDialog-test.tsx index 73654cfc5f..5bc6933d50 100644 --- a/apps/web/test/unit-tests/components/views/dialogs/RoomSettingsDialog-test.tsx +++ b/apps/web/test/unit-tests/components/views/dialogs/RoomSettingsDialog-test.tsx @@ -24,6 +24,7 @@ import MatrixClientContext from "../../../../../src/contexts/MatrixClientContext import SettingsStore from "../../../../../src/settings/SettingsStore"; import { UIFeature } from "../../../../../src/settings/UIFeature"; import DMRoomMap from "../../../../../src/utils/DMRoomMap"; +import { SdkContextClass } from "../../../../../src/contexts/SDKContext"; describe("", () => { const userId = "@alice:server.org"; @@ -43,6 +44,8 @@ describe("", () => { const room2 = new Room("!room2:server.org", mockClient, userId); room2.name = "Another Room"; + let sdkContext: SdkContextClass; + jest.spyOn(SettingsStore, "getValue"); beforeEach(() => { @@ -54,6 +57,9 @@ describe("", () => { return null; }); + sdkContext = new SdkContextClass(); + sdkContext.client = mockClient; + jest.spyOn(SettingsStore, "getValue").mockReset().mockReturnValue(false); const dmRoomMap = { @@ -63,7 +69,7 @@ describe("", () => { }); const getComponent = (onFinished = jest.fn(), propRoomId = roomId) => - render(, { + render(, { wrapper: ({ children }) => ( {children} ), @@ -79,7 +85,7 @@ describe("", () => { expect(getByText(`Room Settings - ${room.name}`)).toBeInTheDocument(); - rerender(); + rerender(); expect(getByText(`Room Settings - ${room2.name}`)).toBeInTheDocument(); }); From 6b67b24254ab676e3135b4bc568ebdfe019643e9 Mon Sep 17 00:00:00 2001 From: Florian Duros Date: Fri, 17 Apr 2026 14:02:42 +0200 Subject: [PATCH 09/11] Room list: add custom section creation (#33155) * feat: add creation section dialog * feat: add in skip list a method to change filters * feat: add helper to creation section * feat: add custom sections data to Settings * feat: add custom section to room list store v3 * feat: update header and room list item vms * feat: add toast to room list vm * feat: add new translation * chore: move util functions of room list specs * test: add custom section playwright tests * chore: call loadCustomSections in RoomListStoreV3 ctor --- .../room-list-custom-sections.spec.ts | 178 ++++++++++++++++++ .../room-list-filter-sort.spec.ts | 19 +- .../room-list-panel/room-list-header.spec.ts | 10 +- .../room-list-panel/room-list-panel.spec.ts | 11 +- .../room-list-panel/room-list-search.spec.ts | 11 +- .../room-list-sections.spec.ts | 31 +-- .../room-list-panel/room-list.spec.ts | 9 +- .../e2e/left-panel/room-list-panel/utils.ts | 92 +++++++++ apps/web/res/css/_components.pcss | 1 + .../views/dialogs/_CreateSectionDialog.pcss | 23 +++ .../views/dialogs/CreateSectionDialog.tsx | 65 +++++++ apps/web/src/i18n/strings/en_EN.json | 6 + apps/web/src/settings/Settings.tsx | 19 ++ .../stores/room-list-v3/RoomListStoreV3.ts | 40 +++- apps/web/src/stores/room-list-v3/section.ts | 59 ++++++ .../room-list-v3/skip-list/RoomSkipList.ts | 11 ++ .../room-list/RoomListHeaderViewModel.ts | 11 +- .../room-list/RoomListItemViewModel.ts | 8 +- .../viewmodels/room-list/RoomListViewModel.ts | 33 +++- .../dialogs/CreateSectionDialog-test.tsx | 59 ++++++ .../CreateSectionDialog-test.tsx.snap | 106 +++++++++++ .../room-list-v3/RoomListStoreV3-test.ts | 81 ++++++++ .../stores/room-list-v3/section-test.ts | 71 +++++++ .../skip-list/RoomSkipList-test.ts | 23 +++ .../room-list/RoomListHeaderViewModel-test.ts | 25 +++ .../room-list/RoomListItemViewModel-test.tsx | 23 +++ .../room-list/RoomListViewModel-test.tsx | 57 +++++- 27 files changed, 985 insertions(+), 97 deletions(-) create mode 100644 apps/web/playwright/e2e/left-panel/room-list-panel/room-list-custom-sections.spec.ts create mode 100644 apps/web/playwright/e2e/left-panel/room-list-panel/utils.ts create mode 100644 apps/web/res/css/views/dialogs/_CreateSectionDialog.pcss create mode 100644 apps/web/src/components/views/dialogs/CreateSectionDialog.tsx create mode 100644 apps/web/src/stores/room-list-v3/section.ts create mode 100644 apps/web/test/unit-tests/components/views/dialogs/CreateSectionDialog-test.tsx create mode 100644 apps/web/test/unit-tests/components/views/dialogs/__snapshots__/CreateSectionDialog-test.tsx.snap create mode 100644 apps/web/test/unit-tests/stores/room-list-v3/section-test.ts diff --git a/apps/web/playwright/e2e/left-panel/room-list-panel/room-list-custom-sections.spec.ts b/apps/web/playwright/e2e/left-panel/room-list-panel/room-list-custom-sections.spec.ts new file mode 100644 index 0000000000..a390d3e610 --- /dev/null +++ b/apps/web/playwright/e2e/left-panel/room-list-panel/room-list-custom-sections.spec.ts @@ -0,0 +1,178 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import { type Page } from "@playwright/test"; + +import { expect, test } from "../../../element-web-test"; +import { getRoomList, getRoomListHeader, getSectionHeader } from "./utils"; + +test.describe("Room list custom sections", () => { + test.use({ + displayName: "Alice", + labsFlags: ["feature_new_room_list", "feature_room_list_sections"], + botCreateOpts: { + displayName: "BotBob", + autoAcceptInvites: true, + }, + }); + + /** + * Create a custom section via the header compose menu and dialog. + * @param page + * @param sectionName The name of the section to create + */ + async function createCustomSection(page: Page, sectionName: string): Promise { + const composeMenu = getRoomListHeader(page).getByRole("button", { name: "New conversation" }); + await composeMenu.click(); + await page.getByRole("menuitem", { name: "New section" }).click(); + + // Fill in the section name in the dialog + const dialog = page.getByRole("dialog", { name: "Create a section" }); + await expect(dialog).toBeVisible(); + await dialog.getByRole("textbox", { name: "Section name" }).fill(sectionName); + await dialog.getByRole("button", { name: "Create section" }).click(); + + // Wait for the dialog to close + await expect(dialog).not.toBeVisible(); + } + + test.beforeEach(async ({ page, app, user }) => { + // The notification toast is displayed above the search section + await app.closeNotificationToast(); + + // Focus the user menu to avoid hover decoration + await page.getByRole("button", { name: "User menu" }).focus(); + }); + + test.describe("Section creation", () => { + test("should create a custom section via the header compose menu", async ({ page, app }) => { + await app.client.createRoom({ name: "my room" }); + + await createCustomSection(page, "Work"); + + // The custom section header should be visible (even though it is empty) + await expect(getSectionHeader(page, "Work")).toBeVisible(); + // The Chats section should also be visible + await expect(getSectionHeader(page, "Chats")).toBeVisible(); + }); + + test("should show 'Section created' toast after creating a section", async ({ page, app }) => { + await app.client.createRoom({ name: "my room" }); + + await createCustomSection(page, "Personal"); + + // The "Section created" toast should appear + await expect(page.getByText("Section created")).toBeVisible(); + }); + + test("should create a custom section via the room option menu", async ({ page, app }) => { + await app.client.createRoom({ name: "my room" }); + + const roomList = getRoomList(page); + const roomItem = roomList.getByRole("option", { name: "Open room my room" }); + await expect(roomItem).toBeVisible(); + + // Open the More Options menu + await roomItem.hover(); + await roomItem.getByRole("button", { name: "More Options" }).click(); + + // Open the "Move to" submenu + await page.getByRole("menuitem", { name: "Move to" }).hover(); + + // Click on "New section" + await page.getByRole("menuitem", { name: "New section" }).click(); + + // Fill in the section name in the dialog + const dialog = page.getByRole("dialog", { name: "Create a section" }); + await expect(dialog).toBeVisible(); + await dialog.getByRole("textbox", { name: "Section name" }).fill("Projects"); + await dialog.getByRole("button", { name: "Create section" }).click(); + + // Wait for the dialog to close + await expect(dialog).not.toBeVisible(); + + // The custom section should be created + await expect(getSectionHeader(page, "Projects")).toBeVisible(); + }); + + test("should cancel section creation when dialog is dismissed", async ({ page, app }) => { + await app.client.createRoom({ name: "my room" }); + + const composeMenu = getRoomListHeader(page).getByRole("button", { name: "New conversation" }); + await composeMenu.click(); + await page.getByRole("menuitem", { name: "New section" }).click(); + + // The dialog should appear + const dialog = page.getByRole("dialog", { name: "Create a section" }); + await expect(dialog).toBeVisible(); + + // Cancel the dialog + await dialog.getByRole("button", { name: "Cancel" }).click(); + + // The dialog should close + await expect(dialog).not.toBeVisible(); + + // No custom section should be created - should remain a flat list + await expect(getSectionHeader(page, "Chats")).not.toBeVisible(); + }); + + test("should create multiple custom sections", async ({ page, app }) => { + await app.client.createRoom({ name: "my room" }); + + await createCustomSection(page, "Work"); + await createCustomSection(page, "Personal"); + + // Both custom sections should be visible + await expect(getSectionHeader(page, "Work")).toBeVisible(); + await expect(getSectionHeader(page, "Personal")).toBeVisible(); + await expect(getSectionHeader(page, "Chats")).toBeVisible(); + }); + }); + + test.describe("Custom section display", () => { + test("should show empty custom sections", async ({ page, app }) => { + // Create a room so the Chats section has something + await app.client.createRoom({ name: "my room" }); + + await createCustomSection(page, "Empty Section"); + + // The custom section should be visible even with no rooms + await expect(getSectionHeader(page, "Empty Section")).toBeVisible(); + // The room should still be in the Chats section + const roomList = getRoomList(page); + await expect(roomList.getByRole("row", { name: "Open room my room" })).toBeVisible(); + }); + + test("should display custom sections between Favourites and Chats", async ({ page, app }) => { + // Create a favourite room + const favouriteId = await app.client.createRoom({ name: "favourite room" }); + await app.client.evaluate(async (client, roomId) => { + await client.setRoomTag(roomId, "m.favourite"); + }, favouriteId); + + // Create a low priority room + const lowPrioId = await app.client.createRoom({ name: "low prio room" }); + await app.client.evaluate(async (client, roomId) => { + await client.setRoomTag(roomId, "m.lowpriority"); + }, lowPrioId); + + // Create a regular room + await app.client.createRoom({ name: "regular room" }); + + // Create a custom section + await createCustomSection(page, "Work"); + + // All section headers should be visible + await expect(getSectionHeader(page, "Favourites")).toBeVisible(); + await expect(getSectionHeader(page, "Work")).toBeVisible(); + // Should be expanded by default + await expect(getSectionHeader(page, "Work")).toHaveAttribute("aria-expanded", "true"); + await expect(getSectionHeader(page, "Chats")).toBeVisible(); + await expect(getSectionHeader(page, "Low Priority")).toBeVisible(); + }); + }); +}); diff --git a/apps/web/playwright/e2e/left-panel/room-list-panel/room-list-filter-sort.spec.ts b/apps/web/playwright/e2e/left-panel/room-list-panel/room-list-filter-sort.spec.ts index 99ffed3ff8..7356a2e6bf 100644 --- a/apps/web/playwright/e2e/left-panel/room-list-panel/room-list-filter-sort.spec.ts +++ b/apps/web/playwright/e2e/left-panel/room-list-panel/room-list-filter-sort.spec.ts @@ -6,10 +6,11 @@ */ import { type Visibility } from "matrix-js-sdk/src/matrix"; -import { type Locator, type Page } from "@playwright/test"; +import { type Page } from "@playwright/test"; import { expect, test } from "../../../element-web-test"; import { SettingLevel } from "../../../../src/settings/SettingLevel"; +import { getFilterCollapseButton, getFilterExpandButton, getPrimaryFilters, getRoomOptionsMenu } from "./utils"; test.describe("Room list filters and sort", () => { test.use({ @@ -21,22 +22,6 @@ test.describe("Room list filters and sort", () => { labsFlags: ["feature_new_room_list"], }); - function getPrimaryFilters(page: Page): Locator { - return page.getByTestId("primary-filters"); - } - - function getRoomOptionsMenu(page: Page): Locator { - return page.getByRole("button", { name: "Room Options" }); - } - - function getFilterExpandButton(page: Page): Locator { - return getPrimaryFilters(page).getByRole("button", { name: "Expand filter list" }); - } - - function getFilterCollapseButton(page: Page): Locator { - return getPrimaryFilters(page).getByRole("button", { name: "Collapse filter list" }); - } - /** * Get the room list * @param page diff --git a/apps/web/playwright/e2e/left-panel/room-list-panel/room-list-header.spec.ts b/apps/web/playwright/e2e/left-panel/room-list-panel/room-list-header.spec.ts index 96e0ca8597..1ffa49429d 100644 --- a/apps/web/playwright/e2e/left-panel/room-list-panel/room-list-header.spec.ts +++ b/apps/web/playwright/e2e/left-panel/room-list-panel/room-list-header.spec.ts @@ -6,21 +6,13 @@ */ import { test, expect } from "../../../element-web-test"; -import type { Page } from "@playwright/test"; +import { getHeaderSection } from "./utils"; test.describe("Header section of the room list", () => { test.use({ labsFlags: ["feature_new_room_list"], }); - /** - * Get the header section of the room list - * @param page - */ - function getHeaderSection(page: Page) { - return page.getByTestId("room-list-header"); - } - test.beforeEach(async ({ page, app, user }) => { // The notification toast is displayed above the search section await app.closeNotificationToast(); diff --git a/apps/web/playwright/e2e/left-panel/room-list-panel/room-list-panel.spec.ts b/apps/web/playwright/e2e/left-panel/room-list-panel/room-list-panel.spec.ts index bc1387cbce..ad87eac89b 100644 --- a/apps/web/playwright/e2e/left-panel/room-list-panel/room-list-panel.spec.ts +++ b/apps/web/playwright/e2e/left-panel/room-list-panel/room-list-panel.spec.ts @@ -5,23 +5,14 @@ * Please see LICENSE files in the repository root for full details. */ -import { type Page } from "@playwright/test"; - import { test, expect } from "../../../element-web-test"; +import { getRoomListView } from "./utils"; test.describe("Room list panel", () => { test.use({ labsFlags: ["feature_new_room_list"], }); - /** - * Get the room list view - * @param page - */ - function getRoomListView(page: Page) { - return page.getByRole("navigation", { name: "Room list" }); - } - test.beforeEach(async ({ page, app, user }) => { // The notification toast is displayed above the search section await app.closeNotificationToast(); diff --git a/apps/web/playwright/e2e/left-panel/room-list-panel/room-list-search.spec.ts b/apps/web/playwright/e2e/left-panel/room-list-panel/room-list-search.spec.ts index 028503f622..37263d9b67 100644 --- a/apps/web/playwright/e2e/left-panel/room-list-panel/room-list-search.spec.ts +++ b/apps/web/playwright/e2e/left-panel/room-list-panel/room-list-search.spec.ts @@ -5,23 +5,14 @@ * Please see LICENSE files in the repository root for full details. */ -import { type Page } from "@playwright/test"; - import { test, expect } from "../../../element-web-test"; +import { getSearchSection } from "./utils"; test.describe("Search section of the room list", () => { test.use({ labsFlags: ["feature_new_room_list"], }); - /** - * Get the search section of the room list - * @param page - */ - function getSearchSection(page: Page) { - return page.getByRole("search"); - } - test.beforeEach(async ({ page, app, user }) => { // The notification toast is displayed above the search section await app.closeNotificationToast(); diff --git a/apps/web/playwright/e2e/left-panel/room-list-panel/room-list-sections.spec.ts b/apps/web/playwright/e2e/left-panel/room-list-panel/room-list-sections.spec.ts index 9bc9bbe2b0..80651c409f 100644 --- a/apps/web/playwright/e2e/left-panel/room-list-panel/room-list-sections.spec.ts +++ b/apps/web/playwright/e2e/left-panel/room-list-panel/room-list-sections.spec.ts @@ -5,9 +5,8 @@ * Please see LICENSE files in the repository root for full details. */ -import { type Locator, type Page } from "@playwright/test"; - import { expect, test } from "../../../element-web-test"; +import { getPrimaryFilters, getRoomList, getSectionHeader } from "./utils"; test.describe("Room list sections", () => { test.use({ @@ -19,34 +18,6 @@ test.describe("Room list sections", () => { }, }); - /** - * Get the room list - * @param page - */ - function getRoomList(page: Page): Locator { - return page.getByTestId("room-list"); - } - - /** - * Get the primary filters - * @param page - */ - function getPrimaryFilters(page: Page): Locator { - return page.getByTestId("primary-filters"); - } - - /** - * Get a section header toggle button by section name - * @param page - * @param sectionName The display name of the section (e.g. "Favourites", "Chats", "Low Priority") - * @param isUnread Whether to look for the unread version of the section header - */ - function getSectionHeader(page: Page, sectionName: string, isUnread = false): Locator { - return getRoomList(page).getByRole("gridcell", { - name: isUnread ? `Toggle ${sectionName} section with unread room(s)` : `Toggle ${sectionName} section`, - }); - } - test.beforeEach(async ({ page, app, user }) => { // The notification toast is displayed above the search section await app.closeNotificationToast(); diff --git a/apps/web/playwright/e2e/left-panel/room-list-panel/room-list.spec.ts b/apps/web/playwright/e2e/left-panel/room-list-panel/room-list.spec.ts index 79cc0b4cf3..30dd461041 100644 --- a/apps/web/playwright/e2e/left-panel/room-list-panel/room-list.spec.ts +++ b/apps/web/playwright/e2e/left-panel/room-list-panel/room-list.spec.ts @@ -10,6 +10,7 @@ import { type Page } from "@playwright/test"; import { expect, test } from "../../../element-web-test"; import { type Bot } from "../../../pages/bot"; import { type ElementAppPage } from "../../../pages/ElementAppPage"; +import { getRoomList } from "./utils"; test.describe("Room list", () => { test.use({ @@ -20,14 +21,6 @@ test.describe("Room list", () => { }, }); - /** - * Get the room list - * @param page - */ - function getRoomList(page: Page) { - return page.getByTestId("room-list"); - } - test.beforeEach(async ({ page, app, user }) => { // The notification toast is displayed above the search section await app.closeNotificationToast(); diff --git a/apps/web/playwright/e2e/left-panel/room-list-panel/utils.ts b/apps/web/playwright/e2e/left-panel/room-list-panel/utils.ts new file mode 100644 index 0000000000..523b268c80 --- /dev/null +++ b/apps/web/playwright/e2e/left-panel/room-list-panel/utils.ts @@ -0,0 +1,92 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import { type Locator, type Page } from "@playwright/test"; + +/** + * Get the room list + * @param page + */ +export function getRoomList(page: Page): Locator { + return page.getByTestId("room-list"); +} + +/** + * Get the room list header + * @param page + */ +export function getRoomListHeader(page: Page): Locator { + return page.getByTestId("room-list-header"); +} + +/** + * Get a section header toggle button by section name + * @param page + * @param sectionName The display name of the section + * @param isUnread Whether to look for the unread version of the section header + */ +export function getSectionHeader(page: Page, sectionName: string, isUnread = false): Locator { + return getRoomList(page).getByRole("gridcell", { + name: isUnread ? `Toggle ${sectionName} section with unread room(s)` : `Toggle ${sectionName} section`, + }); +} + +/** + * Get the primary filters container + * @param page + */ +export function getPrimaryFilters(page: Page): Locator { + return page.getByTestId("primary-filters"); +} + +/** + * Get the room options menu button in the room list header + * @param page + */ +export function getRoomOptionsMenu(page: Page): Locator { + return page.getByRole("button", { name: "Room Options" }); +} + +/** + * Get the filter list expand button in the room list header + * @param page + */ +export function getFilterExpandButton(page: Page): Locator { + return getPrimaryFilters(page).getByRole("button", { name: "Expand filter list" }); +} + +/** + * Get the filter list collapse button in the room list header + * @param page + */ +export function getFilterCollapseButton(page: Page): Locator { + return getPrimaryFilters(page).getByRole("button", { name: "Collapse filter list" }); +} + +/** + * Get the header section of the room list + * @param page + */ +export function getHeaderSection(page: Page) { + return page.getByTestId("room-list-header"); +} + +/** + * Get the room list view + * @param page + */ +export function getRoomListView(page: Page) { + return page.getByRole("navigation", { name: "Room list" }); +} + +/** + * Get the search section of the room list + * @param page + */ +export function getSearchSection(page: Page) { + return page.getByRole("search"); +} diff --git a/apps/web/res/css/_components.pcss b/apps/web/res/css/_components.pcss index fdf774a754..c208a71ef7 100644 --- a/apps/web/res/css/_components.pcss +++ b/apps/web/res/css/_components.pcss @@ -128,6 +128,7 @@ @import "./views/dialogs/_ConfirmSpaceUserActionDialog.pcss"; @import "./views/dialogs/_ConfirmUserActionDialog.pcss"; @import "./views/dialogs/_CreateRoomDialog.pcss"; +@import "./views/dialogs/_CreateSectionDialog.pcss"; @import "./views/dialogs/_CreateSubspaceDialog.pcss"; @import "./views/dialogs/_Crypto.pcss"; @import "./views/dialogs/_DeactivateAccountDialog.pcss"; diff --git a/apps/web/res/css/views/dialogs/_CreateSectionDialog.pcss b/apps/web/res/css/views/dialogs/_CreateSectionDialog.pcss new file mode 100644 index 0000000000..7c941be39f --- /dev/null +++ b/apps/web/res/css/views/dialogs/_CreateSectionDialog.pcss @@ -0,0 +1,23 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +.mx_CreateSectionDialog { + color: var(--cpd-color-text-primary); + + &.mx_Dialog_fixedWidth { + /* 576px coming from Figma and remove external padding */ + max-width: calc(576px - var(--cpd-space-20x)); + } + + .mx_CreateSectionDialog_content { + min-height: 346px; + } + + .mx_CreateSectionDialog_form { + width: 100%; + } +} diff --git a/apps/web/src/components/views/dialogs/CreateSectionDialog.tsx b/apps/web/src/components/views/dialogs/CreateSectionDialog.tsx new file mode 100644 index 0000000000..295aa9c643 --- /dev/null +++ b/apps/web/src/components/views/dialogs/CreateSectionDialog.tsx @@ -0,0 +1,65 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { useState, type JSX } from "react"; +import { Flex } from "@element-hq/web-shared-components"; +import { Form, Text } from "@vector-im/compound-web"; + +import BaseDialog from "./BaseDialog"; +import DialogButtons from "../elements/DialogButtons"; +import { _t } from "../../../languageHandler"; + +interface CreateSectionDialogProps { + /** + * Callback called when the dialog is closed. + * @param shouldCreateSection Whether a section should be created or not. This will be false if the user cancels the dialog. + * @param sectionName The name of the section to create. + */ + onFinished: (shouldCreateSection: boolean, sectionName: string) => void; +} + +/** + * Dialog shown to the user to create a new section in the room list. + */ +export function CreateSectionDialog({ onFinished }: CreateSectionDialogProps): JSX.Element { + const [value, setValue] = useState(""); + const isInvalid = Boolean(value.trim().length === 0); + + return ( + onFinished(false, value)} + title={_t("create_section_dialog|title")} + hasCancel={true} + > + + + {_t("create_section_dialog|description")} + + { + onFinished(true, value); + e.preventDefault(); + }} + > + + {_t("create_section_dialog|label")} + setValue(evt.target.value)} required={true} /> + + + + onFinished(false, "")} + onPrimaryButtonClick={() => onFinished(true, value)} + /> + + ); +} diff --git a/apps/web/src/i18n/strings/en_EN.json b/apps/web/src/i18n/strings/en_EN.json index ac4b3d3e9a..ec66fdade7 100644 --- a/apps/web/src/i18n/strings/en_EN.json +++ b/apps/web/src/i18n/strings/en_EN.json @@ -681,6 +681,12 @@ "unfederated_label_default_on": "You might disable this if the room will be used for collaborating with external teams who have their own homeserver. This cannot be changed later.", "unsupported_version": "The server does not support the room version specified." }, + "create_section_dialog": { + "create_section": "Create section", + "description": "Sections are only for you", + "label": "Section name", + "title": "Create a section" + }, "create_space": { "add_details_prompt": "Add some details to help people recognise it.", "add_details_prompt_2": "You can change these anytime.", diff --git a/apps/web/src/settings/Settings.tsx b/apps/web/src/settings/Settings.tsx index b70095125f..4b05f7320c 100644 --- a/apps/web/src/settings/Settings.tsx +++ b/apps/web/src/settings/Settings.tsx @@ -52,6 +52,7 @@ import InviteRulesConfigController from "./controllers/InviteRulesConfigControll import { type ComputedInviteConfig } from "../@types/invite-rules.ts"; import BlockInvitesConfigController from "./controllers/BlockInvitesConfigController.ts"; import RequiresSettingsController from "./controllers/RequiresSettingsController.ts"; +import { type OrderedCustomSections, type CustomSectionsData } from "../stores/room-list-v3/section.ts"; export const defaultWatchManager = new WatchManager(); @@ -373,6 +374,8 @@ export interface Settings { "inviteRules": IBaseSetting; "blockInvites": IBaseSetting; "Developer.elementCallUrl": IBaseSetting; + "RoomList.CustomSectionData": IBaseSetting; + "RoomList.OrderedCustomSections": IBaseSetting; } export type SettingKey = keyof Settings; @@ -1371,6 +1374,22 @@ export const SETTINGS: Settings = { supportedLevels: LEVELS_ACCOUNT_SETTINGS, default: {}, }, + /** + * Managed by the {@link RoomListStoreV3} + * Store the custom section data for the room list + */ + "RoomList.CustomSectionData": { + supportedLevels: LEVELS_ACCOUNT_SETTINGS, + default: {}, + }, + /** + * Managed by the {@link RoomListStoreV3} + * Store the ordering of the custom sections for the room list + */ + "RoomList.OrderedCustomSections": { + supportedLevels: LEVELS_ACCOUNT_SETTINGS, + default: [], + }, [UIFeature.RoomHistorySettings]: { supportedLevels: LEVELS_UI_FEATURE, default: true, diff --git a/apps/web/src/stores/room-list-v3/RoomListStoreV3.ts b/apps/web/src/stores/room-list-v3/RoomListStoreV3.ts index 71c5a1a9cb..ec10fe1468 100644 --- a/apps/web/src/stores/room-list-v3/RoomListStoreV3.ts +++ b/apps/web/src/stores/room-list-v3/RoomListStoreV3.ts @@ -40,6 +40,7 @@ import { DefaultTagID } from "./skip-list/tag"; import { ExcludeTagsFilter } from "./skip-list/filters/ExcludeTagsFilter"; import { TagFilter } from "./skip-list/filters/TagFilter"; import { filterBoolean } from "../../utils/arrays"; +import { createSection } from "./section"; /** * These are the filters passed to the room skip list. @@ -59,6 +60,8 @@ export enum RoomListStoreV3Event { ListsUpdate = "lists_update", // The event which is called when the room list is loaded. ListsLoaded = "lists_loaded", + /** Fired when a new section is created in the room list. */ + SectionCreated = "section_created", } // The result object for returning rooms from the store @@ -89,6 +92,8 @@ export const CHATS_TAG = "chats"; export const LISTS_UPDATE_EVENT = RoomListStoreV3Event.ListsUpdate; export const LISTS_LOADED_EVENT = RoomListStoreV3Event.ListsLoaded; +export const SECTION_CREATED_EVENT = RoomListStoreV3Event.SectionCreated; + /** * This store allows for fast retrieval of the room list in a sorted and filtered manner. * This is the third such implementation hence the "V3". @@ -108,7 +113,7 @@ export class RoomListStoreV3Class extends AsyncStoreWithClient { /** * Defines the display order of sections. */ - private readonly sortedTags: string[] = [DefaultTagID.Favourite, CHATS_TAG, DefaultTagID.LowPriority]; + private sortedTags: string[] = []; private readonly msc3946ProcessDynamicPredecessor: boolean; @@ -125,6 +130,8 @@ export class RoomListStoreV3Class extends AsyncStoreWithClient { this.onActiveSpaceChanged(); }); SpaceStore.instance.on(UPDATE_HOME_BEHAVIOUR, () => this.onActiveSpaceChanged()); + SettingsStore.watchSetting("RoomList.OrderedCustomSections", null, () => this.onOrderedCustomSectionsChange()); + this.loadCustomSections(); } /** @@ -463,6 +470,37 @@ export class RoomListStoreV3Class extends AsyncStoreWithClient { }; }); } + + /** + * Handle changes to the order of custom sections. + * Reloads the custom sections, updates the skip list filters to reflect the new order and emits an update. + * Emit {@link LISTS_UPDATE_EVENT}. + */ + private onOrderedCustomSectionsChange(): void { + this.loadCustomSections(); + if (!this.roomSkipList) return; + this.roomSkipList.useNewFilters(this.getSkipListFilters()); + this.scheduleEmit(); + } + + /** + * Create a new section. + * Emits {@link SECTION_CREATED_EVENT} and {@link LISTS_UPDATE_EVENT} if the section was successfully created. + */ + public async createSection(): Promise { + const sectionIsCreated = await createSection(); + if (!sectionIsCreated) return; + this.emit(SECTION_CREATED_EVENT); + this.scheduleEmit(); + } + + /** + * Load the custom sections from the settings store and update the sorted tags. + */ + private loadCustomSections(): void { + const orderedCustomSections = SettingsStore.getValue("RoomList.OrderedCustomSections"); + this.sortedTags = [DefaultTagID.Favourite, ...orderedCustomSections, CHATS_TAG, DefaultTagID.LowPriority]; + } } export default class RoomListStoreV3 { diff --git a/apps/web/src/stores/room-list-v3/section.ts b/apps/web/src/stores/room-list-v3/section.ts new file mode 100644 index 0000000000..f11a028693 --- /dev/null +++ b/apps/web/src/stores/room-list-v3/section.ts @@ -0,0 +1,59 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import { v4 as uuidv4 } from "uuid"; + +import { SettingLevel } from "../../settings/SettingLevel"; +import SettingsStore from "../../settings/SettingsStore"; +import Modal from "../../Modal"; +import { CreateSectionDialog } from "../../components/views/dialogs/CreateSectionDialog"; + +type Tag = string; + +/** + * Structure of the custom section stored in the settings. The tag is used as a unique identifier for the section, and the name is given by the user. + */ +type CustomSection = { + tag: Tag; + name: string; +}; + +/** + * The custom sections data is stored as a record in the settings, where the key is the section tag and the value is the section data (name and tag). + */ +export type CustomSectionsData = Record; +/** + * Ordered list of custom section tags. + */ +export type OrderedCustomSections = Tag[]; + +/** + * Creates a new custom section by showing a dialog to the user to enter the section name. + * If the user confirms, it generates a unique tag for the section, saves the section data in the settings, and updates the ordered list of sections. + * + * @return A promise that resolves to true if the section was created, or false if the user cancelled the creation or if there was an error. + */ +export async function createSection(): Promise { + const modal = Modal.createDialog(CreateSectionDialog); + + const [shouldCreateSection, sectionName] = await modal.finished; + if (!shouldCreateSection || !sectionName) return false; + + const tag = `element.io.section.${uuidv4()}`; + const newSection: CustomSection = { tag, name: sectionName }; + + // Save the new section data + const sectionData = SettingsStore.getValue("RoomList.CustomSectionData") || {}; + sectionData[tag] = newSection; + await SettingsStore.setValue("RoomList.CustomSectionData", null, SettingLevel.ACCOUNT, sectionData); + + // Add the new section to the ordered list of sections + const orderedSections = SettingsStore.getValue("RoomList.OrderedCustomSections") || []; + orderedSections.push(tag); + await SettingsStore.setValue("RoomList.OrderedCustomSections", null, SettingLevel.ACCOUNT, orderedSections); + return true; +} diff --git a/apps/web/src/stores/room-list-v3/skip-list/RoomSkipList.ts b/apps/web/src/stores/room-list-v3/skip-list/RoomSkipList.ts index 93c898ee21..dfa5b678e0 100644 --- a/apps/web/src/stores/room-list-v3/skip-list/RoomSkipList.ts +++ b/apps/web/src/stores/room-list-v3/skip-list/RoomSkipList.ts @@ -76,6 +76,17 @@ export class RoomSkipList implements Iterable { this.seed(rooms); } + /** + * Change the filters used by the skip list. + * This will apply the new filters to all existing nodes. + */ + public useNewFilters(filters: Filter[]): void { + this.filters = filters; + for (const node of this.roomNodeMap.values()) { + node.applyFilters(this.filters); + } + } + /** * Removes a given room from the skip list. */ diff --git a/apps/web/src/viewmodels/room-list/RoomListHeaderViewModel.ts b/apps/web/src/viewmodels/room-list/RoomListHeaderViewModel.ts index fa7697d084..55626cb252 100644 --- a/apps/web/src/viewmodels/room-list/RoomListHeaderViewModel.ts +++ b/apps/web/src/viewmodels/room-list/RoomListHeaderViewModel.ts @@ -201,7 +201,7 @@ export class RoomListHeaderViewModel }; public createSection = (): void => { - // To be implemented when custom section creation is added in vms + RoomListStoreV3.instance.createSection(); }; } /** @@ -275,6 +275,10 @@ function computeHeaderSpaceState( ); const canAccessSpaceSettings = Boolean(activeSpace && shouldShowSpaceSettings(activeSpace)); + const isSectionFeatureEnabled = SettingsStore.getValue("feature_room_list_sections"); + const useComposeIcon = !isSectionFeatureEnabled; + const canCreateSection = isSectionFeatureEnabled; + return { title, canCreateRoom, @@ -283,8 +287,7 @@ function computeHeaderSpaceState( displaySpaceMenu, canInviteInSpace, canAccessSpaceSettings, - // To be implemented when custom section creation is added in vms - canCreateSection: false, - useComposeIcon: true, + canCreateSection, + useComposeIcon, }; } diff --git a/apps/web/src/viewmodels/room-list/RoomListItemViewModel.ts b/apps/web/src/viewmodels/room-list/RoomListItemViewModel.ts index ac3f32ad61..f40b60eebd 100644 --- a/apps/web/src/viewmodels/room-list/RoomListItemViewModel.ts +++ b/apps/web/src/viewmodels/room-list/RoomListItemViewModel.ts @@ -37,6 +37,7 @@ import { Action } from "../../dispatcher/actions"; import type { ViewRoomPayload } from "../../dispatcher/payloads/ViewRoomPayload"; import PosthogTrackers from "../../PosthogTrackers"; import { type Call, CallEvent } from "../../models/Call"; +import RoomListStoreV3 from "../../stores/room-list-v3/RoomListStoreV3"; interface RoomItemProps { room: Room; @@ -276,6 +277,8 @@ export class RoomListItemViewModel const callType = call?.callType === CallType.Voice ? "voice" : call?.callType === CallType.Video ? "video" : undefined; + const canMoveToSection = SettingsStore.getValue("feature_room_list_sections"); + return { id: room.roomId, room, @@ -303,8 +306,7 @@ export class RoomListItemViewModel canMarkAsRead, canMarkAsUnread, roomNotifState, - // To be implemented when custom section creation is added in vms - canMoveToSection: false, + canMoveToSection, }; } @@ -385,6 +387,6 @@ export class RoomListItemViewModel }; public onCreateSection = (): void => { - // To be implemented when custom section creation is added in vms + RoomListStoreV3.instance.createSection(); }; } diff --git a/apps/web/src/viewmodels/room-list/RoomListViewModel.ts b/apps/web/src/viewmodels/room-list/RoomListViewModel.ts index a3e516ea2d..99e2b3dc19 100644 --- a/apps/web/src/viewmodels/room-list/RoomListViewModel.ts +++ b/apps/web/src/viewmodels/room-list/RoomListViewModel.ts @@ -91,6 +91,11 @@ export class RoomListViewModel // Don't clear section vm because we want to keep the expand/collapse state even during space changes. private readonly roomSectionHeaderViewModels = new Map(); + /** + * Reference to the currently displayed toast, used to automatically close the toast after a timeout. + */ + private toastRef?: number; + public constructor(props: RoomListViewModelProps) { const activeSpace = SpaceStore.instance.activeSpaceRoom; @@ -144,6 +149,13 @@ export class RoomListViewModel this.onListsLoaded, ); + // Subscribe to section creation + this.disposables.trackListener( + RoomListStoreV3.instance, + RoomListStoreV3Event.SectionCreated as any, + this.onSectionCreated, + ); + // Subscribe to active room changes to update selected room const dispatcherRef = dispatcher.register(this.onDispatch); this.disposables.track(() => { @@ -264,7 +276,8 @@ export class RoomListViewModel public getSectionHeaderViewModel(tag: string): RoomListSectionHeaderViewModel { if (this.roomSectionHeaderViewModels.has(tag)) return this.roomSectionHeaderViewModels.get(tag)!; - const title = TAG_TO_TITLE_MAP[tag] || tag; + const customSections = SettingsStore.getValue("RoomList.CustomSectionData"); + const title = TAG_TO_TITLE_MAP[tag] || customSections[tag]?.name || tag; const viewModel = new RoomListSectionHeaderViewModel({ tag, title, @@ -573,7 +586,19 @@ export class RoomListViewModel } }; + public onSectionCreated = (): void => { + clearTimeout(this.toastRef); + this.snapshot.merge({ + toast: "section_created", + }); + // Automatically close the toast after 15 seconds + this.toastRef = setTimeout(() => { + this.closeToast(); + }, 15 * 1000); + }; + public closeToast: () => void = () => { + clearTimeout(this.toastRef); this.snapshot.merge({ toast: undefined, }); @@ -590,9 +615,11 @@ function computeSections( roomsResult: RoomsResult, isSectionExpanded: (tag: string) => boolean, ): { sections: Section[]; isFlatList: boolean } { + const customSections = SettingsStore.getValue("RoomList.CustomSectionData"); + const sections = roomsResult.sections - // Only include sections that have rooms - .filter((section) => section.rooms.length > 0) + // Only include sections that have rooms or are custom sections (which may be empty but should still be shown) + .filter((section) => section.rooms.length > 0 || customSections[section.tag]) // Remove roomIds for sections that are currently collapsed according to their section header view model .map((section) => ({ ...section, diff --git a/apps/web/test/unit-tests/components/views/dialogs/CreateSectionDialog-test.tsx b/apps/web/test/unit-tests/components/views/dialogs/CreateSectionDialog-test.tsx new file mode 100644 index 0000000000..ad22a7d74b --- /dev/null +++ b/apps/web/test/unit-tests/components/views/dialogs/CreateSectionDialog-test.tsx @@ -0,0 +1,59 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import { render, screen } from "jest-matrix-react"; +import userEvent from "@testing-library/user-event"; +import React from "react"; + +import { CreateSectionDialog } from "../../../../../src/components/views/dialogs/CreateSectionDialog"; + +describe("CreateSectionDialog", () => { + const onFinished: jest.Mock = jest.fn(); + + beforeEach(() => { + jest.resetAllMocks(); + }); + + function renderComponent(): void { + render(); + } + + it("renders the dialog", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("has the create section button disabled when the input is empty", () => { + renderComponent(); + const createButton = screen.getByRole("button", { name: "Create section" }); + expect(createButton).toBeDisabled(); + }); + + it("calls onFinished with true and the section name when create section is clicked", async () => { + renderComponent(); + const input = screen.getByRole("textbox"); + await userEvent.type(input, "My section"); + const createButton = screen.getByRole("button", { name: "Create section" }); + await userEvent.click(createButton); + expect(onFinished).toHaveBeenCalledWith(true, "My section"); + }); + + it("calls onFinished with false when the dialog is cancelled", async () => { + renderComponent(); + const cancelButton = screen.getByRole("button", { name: "Cancel" }); + await userEvent.click(cancelButton); + expect(onFinished).toHaveBeenCalledWith(false, ""); + }); + + it("calls onFinished with true and the section name when the form is submitted", async () => { + renderComponent(); + const input = screen.getByRole("textbox"); + await userEvent.type(input, "My section"); + await userEvent.keyboard("{Enter}"); + expect(onFinished).toHaveBeenCalledWith(true, "My section"); + }); +}); diff --git a/apps/web/test/unit-tests/components/views/dialogs/__snapshots__/CreateSectionDialog-test.tsx.snap b/apps/web/test/unit-tests/components/views/dialogs/__snapshots__/CreateSectionDialog-test.tsx.snap new file mode 100644 index 0000000000..7cff6e3769 --- /dev/null +++ b/apps/web/test/unit-tests/components/views/dialogs/__snapshots__/CreateSectionDialog-test.tsx.snap @@ -0,0 +1,106 @@ +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing + +exports[`CreateSectionDialog renders the dialog 1`] = ` +
+
+ +
+
+`; diff --git a/apps/web/test/unit-tests/stores/room-list-v3/RoomListStoreV3-test.ts b/apps/web/test/unit-tests/stores/room-list-v3/RoomListStoreV3-test.ts index 1944efe7e6..11ba95d864 100644 --- a/apps/web/test/unit-tests/stores/room-list-v3/RoomListStoreV3-test.ts +++ b/apps/web/test/unit-tests/stores/room-list-v3/RoomListStoreV3-test.ts @@ -14,9 +14,11 @@ import type { RoomNotificationState } from "../../../../src/stores/notifications import { CHATS_TAG, LISTS_UPDATE_EVENT, + SECTION_CREATED_EVENT, RoomListStoreV3Class, type Section, } from "../../../../src/stores/room-list-v3/RoomListStoreV3"; +import * as sectionModule from "../../../../src/stores/room-list-v3/section"; import { AsyncStoreWithClient } from "../../../../src/stores/AsyncStoreWithClient"; import { RecencySorter } from "../../../../src/stores/room-list-v3/skip-list/sorters/RecencySorter"; import { mkEvent, mkMessage, mkSpace, mkStubRoom, stubClient, upsertRoomStateEvents } from "../../../test-utils"; @@ -830,6 +832,7 @@ describe("RoomListStoreV3", () => { function enableSections(): void { jest.spyOn(SettingsStore, "getValue").mockImplementation((setting: string) => { if (setting === "feature_room_list_sections") return true; + if (setting === "RoomList.OrderedCustomSections") return []; return false; }); } @@ -1007,6 +1010,84 @@ describe("RoomListStoreV3", () => { const favSection = findSection(sections, DefaultTagID.Favourite)!; expect(favSection.rooms).toContain(rooms[3]); }); + + describe("createSection", () => { + it("emits SECTION_CREATED_EVENT and LISTS_UPDATE_EVENT when section is created", async () => { + enableSections(); + getClientAndRooms(); + jest.spyOn(sectionModule, "createSection").mockResolvedValue(true); + + const store = new RoomListStoreV3Class(dispatcher); + await store.start(); + + const sectionCreatedListener = jest.fn(); + const listsUpdateListener = jest.fn(); + store.on(SECTION_CREATED_EVENT, sectionCreatedListener); + store.on(LISTS_UPDATE_EVENT, listsUpdateListener); + + await store.createSection(); + + expect(sectionCreatedListener).toHaveBeenCalled(); + expect(listsUpdateListener).toHaveBeenCalled(); + }); + + it("does not emit when section creation is cancelled", async () => { + enableSections(); + getClientAndRooms(); + jest.spyOn(sectionModule, "createSection").mockResolvedValue(false); + + const store = new RoomListStoreV3Class(dispatcher); + await store.start(); + + const sectionCreatedListener = jest.fn(); + store.on(SECTION_CREATED_EVENT, sectionCreatedListener); + + await store.createSection(); + + expect(sectionCreatedListener).not.toHaveBeenCalled(); + }); + }); + + it("updates sections when RoomList.OrderedCustomSections setting changes", async () => { + enableSections(); + const { rooms } = getClientAndRooms(); + + let settingsWatcher: (settingName: string) => void = () => {}; + jest.spyOn(SettingsStore, "watchSetting").mockImplementation((settingName, _roomId, callback) => { + if (settingName === "RoomList.OrderedCustomSections") settingsWatcher = callback as () => void; + return "watcher-id"; + }); + + const customTag = "element.io.section.custom"; + + jest.spyOn(SettingsStore, "getValue").mockImplementation((setting: string) => { + if (setting === "feature_room_list_sections") return true; + if (setting === "RoomList.OrderedCustomSections") return []; + return false; + }); + + const store = new RoomListStoreV3Class(dispatcher); + await store.start(); + + // Initial state: 3 sections (Favourite, Chats, LowPriority) + expect(store.getSortedRoomsInActiveSpace().sections).toHaveLength(3); + + // Mark a room with the custom tag and update the settings + rooms[0].tags = { [customTag]: { order: 0 } }; + jest.spyOn(SettingsStore, "getValue").mockImplementation((setting: string) => { + if (setting === "feature_room_list_sections") return true; + if (setting === "RoomList.OrderedCustomSections") return [customTag]; + return false; + }); + + // Trigger the settings watcher + settingsWatcher("RoomList.OrderedCustomSections"); + + // Now there should be 4 sections (Favourite, custom, Chats, LowPriority) + expect(store.getSortedRoomsInActiveSpace().sections).toHaveLength(4); + const customSection = findSection(store.getSortedRoomsInActiveSpace().sections, customTag)!; + expect(customSection.rooms).toContain(rooms[0]); + }); }); describe("Muted rooms", () => { diff --git a/apps/web/test/unit-tests/stores/room-list-v3/section-test.ts b/apps/web/test/unit-tests/stores/room-list-v3/section-test.ts new file mode 100644 index 0000000000..9fb8f40d33 --- /dev/null +++ b/apps/web/test/unit-tests/stores/room-list-v3/section-test.ts @@ -0,0 +1,71 @@ +/* + * Copyright 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import Modal from "../../../../src/Modal"; +import SettingsStore from "../../../../src/settings/SettingsStore"; +import { createSection } from "../../../../src/stores/room-list-v3/section"; +import { CreateSectionDialog } from "../../../../src/components/views/dialogs/CreateSectionDialog"; + +describe("createSection", () => { + beforeEach(() => { + jest.spyOn(SettingsStore, "getValue").mockReturnValue(null); + jest.spyOn(SettingsStore, "setValue").mockResolvedValue(undefined); + }); + + afterEach(() => { + jest.restoreAllMocks(); + }); + + it.each([ + [false, "", false], + [true, "", false], + [true, "My Section", true], + ])("returns %s when shouldCreate=%s and name='%s'", async (shouldCreate, name, expected) => { + jest.spyOn(Modal, "createDialog").mockReturnValue({ + finished: Promise.resolve([shouldCreate, name]), + close: jest.fn(), + } as any); + + const result = await createSection(); + expect(result).toBe(expected); + }); + + it("opens the CreateSectionDialog", async () => { + const createDialogSpy = jest.spyOn(Modal, "createDialog").mockReturnValue({ + finished: Promise.resolve([false, ""]), + close: jest.fn(), + } as any); + + await createSection(); + expect(createDialogSpy).toHaveBeenCalledWith(CreateSectionDialog); + }); + + it("saves section data and ordered sections at ACCOUNT level when confirmed", async () => { + const existingTag = "element.io.section.existing"; + jest.spyOn(SettingsStore, "getValue").mockImplementation((setting) => { + if (setting === "RoomList.OrderedCustomSections") return [existingTag]; + return null; + }); + jest.spyOn(Modal, "createDialog").mockReturnValue({ + finished: Promise.resolve([true, "My Section"]), + close: jest.fn(), + } as any); + const setValueSpy = jest.spyOn(SettingsStore, "setValue").mockResolvedValue(undefined); + + await createSection(); + + const customDataCall = setValueSpy.mock.calls.find(([name]) => name === "RoomList.CustomSectionData"); + const savedSection = Object.values(customDataCall![3] as Record)[0]; + expect(savedSection.name).toBe("My Section"); + expect(savedSection.tag).toMatch(/^element\.io\.section\./); + + const orderedCall = setValueSpy.mock.calls.find(([name]) => name === "RoomList.OrderedCustomSections"); + const savedOrder = orderedCall![3] as string[]; + expect(savedOrder[0]).toBe(existingTag); + expect(savedOrder[1]).toMatch(/^element\.io\.section\./); + }); +}); diff --git a/apps/web/test/unit-tests/stores/room-list-v3/skip-list/RoomSkipList-test.ts b/apps/web/test/unit-tests/stores/room-list-v3/skip-list/RoomSkipList-test.ts index a742e56370..8640f3491e 100644 --- a/apps/web/test/unit-tests/stores/room-list-v3/skip-list/RoomSkipList-test.ts +++ b/apps/web/test/unit-tests/stores/room-list-v3/skip-list/RoomSkipList-test.ts @@ -18,6 +18,9 @@ import { getMockedRooms } from "./getMockedRooms"; import SpaceStore from "../../../../../src/stores/spaces/SpaceStore"; import { MetaSpace } from "../../../../../src/stores/spaces"; import { RoomNotificationStateStore } from "../../../../../src/stores/notifications/RoomNotificationStateStore"; +import { FavouriteFilter } from "../../../../../src/stores/room-list-v3/skip-list/filters/FavouriteFilter"; +import { FilterEnum } from "../../../../../src/stores/room-list-v3/skip-list/filters"; +import { DefaultTagID } from "../../../../../src/stores/room-list-v3/skip-list/tag"; describe("RoomSkipList", () => { function generateSkipList(roomCount?: number): { @@ -99,6 +102,26 @@ describe("RoomSkipList", () => { expect(() => skipList.addNewRoom(room)).toThrow("Can't add room to skiplist"); }); + it("Filters are applied to existing nodes when useNewFilters is called", () => { + const { skipList, rooms } = generateSkipList(10); + + // Mark some rooms as favourite + const favouriteRooms = [rooms[2], rooms[5], rooms[8]]; + for (const room of favouriteRooms) { + room.tags = { [DefaultTagID.Favourite]: { order: 0 } }; + } + + // No filters yet — all rooms are in the list + expect(skipList.size).toEqual(10); + + // Apply the favourite filter + skipList.useNewFilters([new FavouriteFilter()]); + + // Only favourite rooms should be returned when filtering by favourite + const filteredRooms = Array.from(skipList.getRoomsInActiveSpace([FilterEnum.FavouriteFilter])); + expect(filteredRooms).toHaveLength(favouriteRooms.length); + }); + it("Re-sort works when sorter is swapped", () => { const { skipList, rooms, sorter } = generateSkipList(); const sortedByRecency = [...rooms].sort((a, b) => sorter.comparator(a, b)); diff --git a/apps/web/test/viewmodels/room-list/RoomListHeaderViewModel-test.ts b/apps/web/test/viewmodels/room-list/RoomListHeaderViewModel-test.ts index 936389603d..608e990af6 100644 --- a/apps/web/test/viewmodels/room-list/RoomListHeaderViewModel-test.ts +++ b/apps/web/test/viewmodels/room-list/RoomListHeaderViewModel-test.ts @@ -61,6 +61,7 @@ describe("RoomListHeaderViewModel", () => { if (settingName === "RoomList.preferredSorting") return SortingAlgorithm.Recency; if (settingName === "feature_video_rooms") return true; if (settingName === "feature_element_call_video_rooms") return true; + if (settingName === "RoomList.OrderedCustomSections") return []; return false; }); }); @@ -159,6 +160,23 @@ describe("RoomListHeaderViewModel", () => { vm = new RoomListHeaderViewModel({ matrixClient, spaceStore: SpaceStore.instance }); expect(vm.getSnapshot().isMessagePreviewEnabled).toBe(true); }); + + it.each([ + [true, true, false], + [false, false, true], + ])( + "when feature_room_list_sections is %s: canCreateSection=%s, useComposeIcon=%s", + (featureEnabled, expectedCanCreateSection, expectedUseComposeIcon) => { + jest.spyOn(SettingsStore, "getValue").mockImplementation((settingName: string) => { + if (settingName === "feature_room_list_sections") return featureEnabled; + return false; + }); + + vm = new RoomListHeaderViewModel({ matrixClient, spaceStore: SpaceStore.instance }); + expect(vm.getSnapshot().canCreateSection).toBe(expectedCanCreateSection); + expect(vm.getSnapshot().useComposeIcon).toBe(expectedUseComposeIcon); + }, + ); }); describe("event listeners", () => { @@ -296,6 +314,13 @@ describe("RoomListHeaderViewModel", () => { ); }); + it("should call createSection on RoomListStoreV3 when createSection is called", () => { + const createSectionSpy = jest.spyOn(RoomListStoreV3.instance, "createSection").mockResolvedValue(); + vm = new RoomListHeaderViewModel({ matrixClient, spaceStore: SpaceStore.instance }); + vm.createSection(); + expect(createSectionSpy).toHaveBeenCalled(); + }); + it("should toggle message preview from enabled to disabled", () => { jest.spyOn(SettingsStore, "getValue").mockImplementation((settingName: string) => { if (settingName === "RoomList.showMessagePreview") return true; diff --git a/apps/web/test/viewmodels/room-list/RoomListItemViewModel-test.tsx b/apps/web/test/viewmodels/room-list/RoomListItemViewModel-test.tsx index e3b349e085..294476d075 100644 --- a/apps/web/test/viewmodels/room-list/RoomListItemViewModel-test.tsx +++ b/apps/web/test/viewmodels/room-list/RoomListItemViewModel-test.tsx @@ -29,6 +29,7 @@ import { Action } from "../../../src/dispatcher/actions"; import { CallStore } from "../../../src/stores/CallStore"; import { CallEvent, type Call } from "../../../src/models/Call"; import { RoomListItemViewModel } from "../../../src/viewmodels/room-list/RoomListItemViewModel"; +import RoomListStoreV3 from "../../../src/stores/room-list-v3/RoomListStoreV3"; jest.mock("../../../src/viewmodels/room-list/utils", () => ({ hasAccessToOptionsMenu: jest.fn().mockReturnValue(true), @@ -75,6 +76,7 @@ describe("RoomListItemViewModel", () => { jest.spyOn(SettingsStore, "getValue").mockImplementation((setting) => { if (setting === "RoomList.showMessagePreview") return false; + if (setting === "RoomList.OrderedCustomSections") return []; return false; }); jest.spyOn(SettingsStore, "watchSetting").mockImplementation(() => "watcher-id"); @@ -501,6 +503,20 @@ describe("RoomListItemViewModel", () => { }); }); + describe("canMoveToSection", () => { + it.each([ + [true, true], + [false, false], + ])("should be %s when feature_room_list_sections is %s", (featureEnabled, expected) => { + jest.spyOn(SettingsStore, "getValue").mockImplementation((setting) => { + if (setting === "feature_room_list_sections") return featureEnabled; + return false; + }); + viewModel = new RoomListItemViewModel({ room, client: matrixClient }); + expect(viewModel.getSnapshot().canMoveToSection).toBe(expected); + }); + }); + describe("Actions", () => { it("should dispatch view room action on openRoom", () => { viewModel = new RoomListItemViewModel({ room, client: matrixClient }); @@ -572,6 +588,13 @@ describe("RoomListItemViewModel", () => { room_id: "!room:server", }); }); + + it("should call createSection on RoomListStoreV3 when onCreateSection is called", () => { + const createSectionSpy = jest.spyOn(RoomListStoreV3.instance, "createSection").mockResolvedValue(); + viewModel = new RoomListItemViewModel({ room, client: matrixClient }); + viewModel.onCreateSection(); + expect(createSectionSpy).toHaveBeenCalled(); + }); }); describe("Cleanup", () => { diff --git a/apps/web/test/viewmodels/room-list/RoomListViewModel-test.tsx b/apps/web/test/viewmodels/room-list/RoomListViewModel-test.tsx index 2207f08d19..4ae01433ce 100644 --- a/apps/web/test/viewmodels/room-list/RoomListViewModel-test.tsx +++ b/apps/web/test/viewmodels/room-list/RoomListViewModel-test.tsx @@ -9,7 +9,7 @@ import { type MatrixClient, type Room } from "matrix-js-sdk/src/matrix"; import { mocked } from "jest-mock"; import { waitFor } from "jest-matrix-react"; -import { createTestClient, flushPromises, mkStubRoom, stubClient } from "../../test-utils"; +import { createTestClient, flushPromises, flushPromisesWithFakeTimers, mkStubRoom, stubClient } from "../../test-utils"; import RoomListStoreV3, { CHATS_TAG, RoomListStoreV3Event } from "../../../src/stores/room-list-v3/RoomListStoreV3"; import SpaceStore from "../../../src/stores/spaces/SpaceStore"; import { FilterEnum } from "../../../src/stores/room-list-v3/skip-list/filters"; @@ -589,6 +589,14 @@ describe("RoomListViewModel", () => { }); describe("Cleanup", () => { + beforeEach(() => { + jest.useFakeTimers(); + }); + + afterEach(() => { + jest.useRealTimers(); + }); + it("should dispose all room item view models on dispose", () => { viewModel = new RoomListViewModel({ client: matrixClient }); @@ -604,6 +612,51 @@ describe("RoomListViewModel", () => { expect(disposeSpy2).toHaveBeenCalled(); }); + describe("Toast", () => { + it("should show toast when SectionCreated event fires", () => { + viewModel = new RoomListViewModel({ client: matrixClient }); + RoomListStoreV3.instance.emit(RoomListStoreV3Event.SectionCreated); + expect(viewModel.getSnapshot().toast).toBe("section_created"); + }); + + it("should clear toast when closeToast is called", () => { + viewModel = new RoomListViewModel({ client: matrixClient }); + + RoomListStoreV3.instance.emit(RoomListStoreV3Event.SectionCreated); + expect(viewModel.getSnapshot().toast).toBe("section_created"); + + viewModel.closeToast(); + expect(viewModel.getSnapshot().toast).toBeUndefined(); + }); + + it("should auto-close toast after 15 seconds", () => { + viewModel = new RoomListViewModel({ client: matrixClient }); + + RoomListStoreV3.instance.emit(RoomListStoreV3Event.SectionCreated); + expect(viewModel.getSnapshot().toast).toBe("section_created"); + + jest.advanceTimersByTime(15 * 1000); + expect(viewModel.getSnapshot().toast).toBeUndefined(); + }); + + it("should reset the auto-close timer when a new section is created", () => { + viewModel = new RoomListViewModel({ client: matrixClient }); + + RoomListStoreV3.instance.emit(RoomListStoreV3Event.SectionCreated); + jest.advanceTimersByTime(10 * 1000); + + // Second section created — resets the timer + RoomListStoreV3.instance.emit(RoomListStoreV3Event.SectionCreated); + jest.advanceTimersByTime(10 * 1000); + + // Toast should still be visible (only 10s since last emit) + expect(viewModel.getSnapshot().toast).toBe("section_created"); + + jest.advanceTimersByTime(5 * 1000); + expect(viewModel.getSnapshot().toast).toBeUndefined(); + }); + }); + describe("Sections (feature_room_list_sections)", () => { let favRoom1: Room; let favRoom2: Room; @@ -922,7 +975,7 @@ describe("RoomListViewModel", () => { action: Action.ActiveRoomChanged, newRoomId: "!fav1:server", }); - await flushPromises(); + await flushPromisesWithFakeTimers(); expect(viewModel.getSnapshot().roomListState.activeRoomIndex).toBe(0); From 8834438a20c0aba022abfc1ea5e665491261a1e3 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 17 Apr 2026 13:23:24 +0100 Subject: [PATCH 10/11] Add apps/desktop/deploy to Prettier ignore (#33185) --- .prettierignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.prettierignore b/.prettierignore index b6f2c7a1e7..e0a9e4fc57 100644 --- a/.prettierignore +++ b/.prettierignore @@ -50,6 +50,7 @@ CHANGELOG.md /apps/desktop/dist/ /apps/desktop/build/ /apps/desktop/dockerbuild/ +/apps/desktop/deploys/ /apps/desktop/lib/ /apps/desktop/webapp /apps/desktop/playwright/html-report From aeaa73adf6132a4a827bfb5da87e5e5312205c6b Mon Sep 17 00:00:00 2001 From: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> Date: Fri, 17 Apr 2026 14:37:20 +0100 Subject: [PATCH 11/11] Fix flaky OIDC "verifiy dialog" test (#33188) This test was flaking. The problem appears to have been that we were clicking "Continue" twice in succession; the intention was that we click on two *different* "Continue" buttons, but sometimes we ended up clicking in the same one twice. Fix it by waiting for the content to change after the first click. Fixes: #31316 --- apps/web/playwright/e2e/oidc/oidc-native.spec.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/web/playwright/e2e/oidc/oidc-native.spec.ts b/apps/web/playwright/e2e/oidc/oidc-native.spec.ts index 81964c4e64..6d6c4612c1 100644 --- a/apps/web/playwright/e2e/oidc/oidc-native.spec.ts +++ b/apps/web/playwright/e2e/oidc/oidc-native.spec.ts @@ -148,7 +148,8 @@ test.describe("OIDC Native", { tag: ["@no-firefox", "@no-webkit"] }, () => { const userId = `alice_${testInfo.testId}`; await registerAccountMas(page, mailpitClient, userId, `${userId}@email.com`, "Pa$sW0rD!"); - await expect(page.getByText("Welcome")).toBeVisible(); + // richvdh: This takes several seconds to happen on a dev instance + await expect(page.getByText("Welcome")).toBeVisible({ timeout: 10000 }); // Log out await page.getByRole("button", { name: "User menu" }).click(); @@ -162,11 +163,14 @@ test.describe("OIDC Native", { tag: ["@no-firefox", "@no-webkit"] }, () => { // Log in again await page.goto("/#/login"); + await expect(page.getByText("Sign in")).toBeVisible(); await page.getByRole("button", { name: "Continue" }).click(); + await expect(page.getByText("Continue to Element?")).toBeVisible(); await page.getByRole("button", { name: "Continue" }).click(); // We should be being warned that we need to verify (but we can't) - await expect(page.getByText("Confirm your digital identity")).toBeVisible(); + // richvdh: Again, Element takes several seconds to load on a dev instance + await expect(page.getByText("Confirm your digital identity")).toBeVisible({ timeout: 10000 }); // And there should be no way to close this prompt await expect(page.getByRole("button", { name: "Skip verification for now" })).not.toBeVisible();