From 86a38cd2d2465c00b4feb463d1bf8896576dd5e4 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 9 Dec 2025 14:53:31 +0000 Subject: [PATCH 01/72] Upgrade dependency to matrix-js-sdk@39.4.0-rc.0 --- package.json | 2 +- yarn.lock | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 6cd7eb3d36..875704b15a 100644 --- a/package.json +++ b/package.json @@ -129,7 +129,7 @@ "lodash": "^4.17.21", "maplibre-gl": "^5.0.0", "matrix-encrypt-attachment": "^1.0.3", - "matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop", + "matrix-js-sdk": "39.4.0-rc.0", "matrix-widget-api": "^1.14.0", "memoize-one": "^6.0.0", "mime": "^4.0.4", diff --git a/yarn.lock b/yarn.lock index 4aa5811497..7bf15280a9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4151,7 +4151,7 @@ classnames "^2.5.1" vaul "^1.0.0" -"@vector-im/matrix-wysiwyg-wasm@link:../../.cache/yarn/v6/npm-@vector-im-matrix-wysiwyg-2.40.0-53c9ca5ea907d91e4515da64f20a82e5586b882c-integrity/node_modules/bindings/wysiwyg-wasm": +"@vector-im/matrix-wysiwyg-wasm@link:../../../.cache/yarn/v6/npm-@vector-im-matrix-wysiwyg-2.40.0-53c9ca5ea907d91e4515da64f20a82e5586b882c-integrity/node_modules/bindings/wysiwyg-wasm": version "0.0.0" uid "" @@ -9588,9 +9588,10 @@ matrix-events-sdk@0.0.1: resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== -"matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop": - version "39.3.0" - resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/942fdf5bee0f0303f32c2cae87df6108666bb780" +matrix-js-sdk@39.4.0-rc.0: + version "39.4.0-rc.0" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-39.4.0-rc.0.tgz#58a451911cd469a1011fc94e499429f4a77d689d" + integrity sha512-Y1v5PUN4dfSUcBJ/Mi4BjZ6EqiBLVXe5RobNYIerIEJyKSfEhFn4ptLWb0Gb/hHIm13TKi+HiQ6evYwQEk8wrQ== dependencies: "@babel/runtime" "^7.12.5" "@matrix-org/matrix-sdk-crypto-wasm" "^15.3.0" From cf25d5e2581d12262b0e918704d5df73210a78e9 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 9 Dec 2025 15:01:14 +0000 Subject: [PATCH 02/72] v1.12.7-rc.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 875704b15a..3cb0a803a1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "element-web", - "version": "1.12.6", + "version": "1.12.7-rc.0", "description": "Element: the future of secure communication", "author": "New Vector Ltd.", "repository": { From 1cf9e546fd917978b77538bcacc6a9f9dd81200e Mon Sep 17 00:00:00 2001 From: ElementRobot Date: Wed, 10 Dec 2025 19:14:32 +0100 Subject: [PATCH 03/72] Don't show the key storage out of sync toast when backup disabled (#31506) (#31507) (cherry picked from commit 4bd8eeb17ac7af8f1957522c9b14f7f9d5bad038) Co-authored-by: Hubert Chathi --- src/DeviceListener.ts | 5 ++++- test/unit-tests/DeviceListener-test.ts | 26 +++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/DeviceListener.ts b/src/DeviceListener.ts index ff58517cd2..3591db8d82 100644 --- a/src/DeviceListener.ts +++ b/src/DeviceListener.ts @@ -438,7 +438,10 @@ export default class DeviceListener { // said we are OK with that. const keyBackupIsOk = keyBackupUploadActive || backupDisabled; - const backupKeyCached = (await crypto.getSessionBackupPrivateKey()) !== null; + // If key backup is active and not disabled: do we have the backup key + // cached locally? + const backupKeyCached = + !keyBackupUploadActive || backupDisabled || (await crypto.getSessionBackupPrivateKey()) !== null; const allSystemsReady = isCurrentDeviceTrusted && allCrossSigningSecretsCached && keyBackupIsOk && recoveryIsOk && backupKeyCached; diff --git a/test/unit-tests/DeviceListener-test.ts b/test/unit-tests/DeviceListener-test.ts index e167e9964a..ef3b01b68c 100644 --- a/test/unit-tests/DeviceListener-test.ts +++ b/test/unit-tests/DeviceListener-test.ts @@ -367,7 +367,7 @@ describe("DeviceListener", () => { expect(SetupEncryptionToast.hideToast).toHaveBeenCalled(); }); - it("shows an out-of-sync toast when one of the secrets is missing locally", async () => { + it("shows an out-of-sync toast when one of the cross-signing secrets is missing locally", async () => { mockCrypto!.getCrossSigningStatus.mockResolvedValue({ publicKeysOnDevice: true, privateKeysInSecretStorage: true, @@ -385,6 +385,30 @@ describe("DeviceListener", () => { ); }); + it("shows an out-of-sync toast when the backup key is missing locally", async () => { + mockCrypto!.getSecretStorageStatus.mockResolvedValue(readySecretStorageStatus); + mockCrypto!.getActiveSessionBackupVersion.mockResolvedValue("1"); + mockCrypto!.getSessionBackupPrivateKey.mockResolvedValue(null); + + await createAndStart(); + + expect(SetupEncryptionToast.showToast).toHaveBeenCalledWith( + SetupEncryptionToast.Kind.KEY_STORAGE_OUT_OF_SYNC, + ); + }); + + it("does not show an out-of-sync toast when the backup key is missing locally but backup is purposely disabled", async () => { + mockCrypto!.getSecretStorageStatus.mockResolvedValue(readySecretStorageStatus); + mockCrypto!.getSessionBackupPrivateKey.mockResolvedValue(null); + mockClient.getAccountDataFromServer.mockImplementation((eventType) => + eventType === BACKUP_DISABLED_ACCOUNT_DATA_KEY ? ({ disabled: true } as any) : null, + ); + + await createAndStart(); + + expect(SetupEncryptionToast.hideToast).toHaveBeenCalled(); + }); + it("hides the out-of-sync toast after we receive the missing secrets", async () => { mockCrypto!.getSecretStorageStatus.mockResolvedValue(readySecretStorageStatus); mockCrypto!.getActiveSessionBackupVersion.mockResolvedValue("1"); From 00954542f3c2c8969fdc3d3328673f77fa26c39b Mon Sep 17 00:00:00 2001 From: ElementRobot Date: Thu, 11 Dec 2025 12:01:17 +0100 Subject: [PATCH 04/72] Remove an extra paragraph in advanced room settings (#31500) (#31511) This was introduced (presumably accidentally) in [#30169](https://github.com/element-hq/element-web/pull/30169/files#diff-89268874351e08a327e47b0a7e1d4e916e1ad8dc4be8b4a3f1ef67f3f83a5bc9R459) (cherry picked from commit 3d80e607ce379000b264cf4da4f86fb05b9d6ea5) Co-authored-by: Andy Balaam --- src/components/views/dialogs/CreateRoomDialog.tsx | 1 - .../dialogs/__snapshots__/CreateRoomDialog-test.tsx.snap | 4 ---- 2 files changed, 5 deletions(-) diff --git a/src/components/views/dialogs/CreateRoomDialog.tsx b/src/components/views/dialogs/CreateRoomDialog.tsx index 7bf34aff0a..c2e3be9b3c 100644 --- a/src/components/views/dialogs/CreateRoomDialog.tsx +++ b/src/components/views/dialogs/CreateRoomDialog.tsx @@ -456,7 +456,6 @@ export default class CreateRoomDialog extends React.Component { checked={this.state.noFederate} helpMessage={federateLabel} /> - z

{federateLabel}

)} diff --git a/test/unit-tests/components/views/dialogs/__snapshots__/CreateRoomDialog-test.tsx.snap b/test/unit-tests/components/views/dialogs/__snapshots__/CreateRoomDialog-test.tsx.snap index 79478d0380..cacad8d47d 100644 --- a/test/unit-tests/components/views/dialogs/__snapshots__/CreateRoomDialog-test.tsx.snap +++ b/test/unit-tests/components/views/dialogs/__snapshots__/CreateRoomDialog-test.tsx.snap @@ -187,10 +187,6 @@ exports[` for a private room should create a private room 1` - z -

- You might enable this if the room will only be used for collaborating with internal teams on your homeserver. This cannot be changed later. -

From dbe8ad0529f02db782fc39e50712b8168525b4ec Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 11 Dec 2025 11:16:53 +0000 Subject: [PATCH 05/72] Update dependency @vector-im/compound-design-tokens to v6.4.2 (#31478) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- packages/shared-components/yarn.lock | 6 +++--- yarn.lock | 7 ++++++- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 5075e25257..ee098b9d97 100644 --- a/package.json +++ b/package.json @@ -92,7 +92,7 @@ "@matrix-org/spec": "^1.7.0", "@sentry/browser": "^10.0.0", "@types/png-chunks-extract": "^1.0.2", - "@vector-im/compound-design-tokens": "6.4.1", + "@vector-im/compound-design-tokens": "6.4.2", "@vector-im/compound-web": "^8.3.1", "@vector-im/matrix-wysiwyg": "2.40.0", "@zxcvbn-ts/core": "^3.0.4", diff --git a/packages/shared-components/yarn.lock b/packages/shared-components/yarn.lock index 524a8a3ca8..a4724fcc48 100644 --- a/packages/shared-components/yarn.lock +++ b/packages/shared-components/yarn.lock @@ -2032,9 +2032,9 @@ integrity sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g== "@vector-im/compound-design-tokens@^6.3.0": - version "6.4.0" - resolved "https://registry.yarnpkg.com/@vector-im/compound-design-tokens/-/compound-design-tokens-6.4.0.tgz#2e51f39f79ebda985a2f6cf80d567b9307aff03a" - integrity sha512-93nYQZMgUt6apjCwwnMhMxN8VYQXN3GYOnwovwJjavImwsCGwI/e853BV/DstrWumYh6k5pZsP9e6AF+nz3SIQ== + version "6.4.2" + resolved "https://registry.yarnpkg.com/@vector-im/compound-design-tokens/-/compound-design-tokens-6.4.2.tgz#29189d6480c8ccf09ce143cb4618fb13a56a7583" + integrity sha512-LHLGZgnatH3mQXn9TF+m/SUinPS2nKvuCT/r2AQ7HAgEIG/S/Ck6e/iV4IFQLSZnd9gU0RlMsLkP2UQ/AKUEBA== "@vitest/expect@3.2.4": version "3.2.4" diff --git a/yarn.lock b/yarn.lock index ae89602239..2902132ca2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4201,7 +4201,12 @@ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz#538b1e103bf8d9864e7b85cc96fa8d6fb6c40777" integrity sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g== -"@vector-im/compound-design-tokens@6.4.1", "@vector-im/compound-design-tokens@^6.3.0": +"@vector-im/compound-design-tokens@6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@vector-im/compound-design-tokens/-/compound-design-tokens-6.4.2.tgz#29189d6480c8ccf09ce143cb4618fb13a56a7583" + integrity sha512-LHLGZgnatH3mQXn9TF+m/SUinPS2nKvuCT/r2AQ7HAgEIG/S/Ck6e/iV4IFQLSZnd9gU0RlMsLkP2UQ/AKUEBA== + +"@vector-im/compound-design-tokens@^6.3.0": version "6.4.1" resolved "https://registry.yarnpkg.com/@vector-im/compound-design-tokens/-/compound-design-tokens-6.4.1.tgz#b3356300136b974104b4fb818969350c7686f5ae" integrity sha512-JhrxnzohxGILrc+IZWoMXcpGHinnJlR2HSCKfypEjPDDF5TOB8HQYTqd5ALAPlob8QZU3N2ghnCF7d0f2LmTxg== From a28eabf73b727b3d14a238806af71bf46a474c5a Mon Sep 17 00:00:00 2001 From: Timo <16718859+toger5@users.noreply.github.com> Date: Thu, 11 Dec 2025 13:20:42 +0100 Subject: [PATCH 06/72] Auto approve matrix rtc member event (sticky events) (#31452) --- src/stores/widgets/ElementWidgetDriver.ts | 3 +++ .../stores/widgets/ElementWidgetDriver-test.ts | 9 +++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/stores/widgets/ElementWidgetDriver.ts b/src/stores/widgets/ElementWidgetDriver.ts index e341f7627c..010c777333 100644 --- a/src/stores/widgets/ElementWidgetDriver.ts +++ b/src/stores/widgets/ElementWidgetDriver.ts @@ -193,6 +193,9 @@ export class ElementWidgetDriver extends WidgetDriver { // MSC4310: Add dev and final event to ease future transition, EventType.RTCDecline, "m.rtc.decline", + // MSC4310 The main membership event is sent via a room sticky event. + EventType.RTCMembership, + "m.rtc.member", ]; for (const eventType of [...sendRoomEvents, ...sendRecvRoomEvents]) this.allowedCapabilities.add(WidgetEventCapability.forRoomEvent(EventDirection.Send, eventType).raw); diff --git a/test/unit-tests/stores/widgets/ElementWidgetDriver-test.ts b/test/unit-tests/stores/widgets/ElementWidgetDriver-test.ts index aa5f425e99..0499ba5033 100644 --- a/test/unit-tests/stores/widgets/ElementWidgetDriver-test.ts +++ b/test/unit-tests/stores/widgets/ElementWidgetDriver-test.ts @@ -131,11 +131,16 @@ describe("ElementWidgetDriver", () => { "org.matrix.msc3819.receive.to_device:m.call.replaces", "org.matrix.msc4157.send.delayed_event", "org.matrix.msc4157.update_delayed_event", - // RTC decline events + // RTC decline events (send/receive, unstable/stable) "org.matrix.msc2762.send.event:org.matrix.msc4310.rtc.decline", - "org.matrix.msc2762.receive.event:org.matrix.msc4310.rtc.decline", "org.matrix.msc2762.send.event:m.rtc.decline", + "org.matrix.msc2762.receive.event:org.matrix.msc4310.rtc.decline", "org.matrix.msc2762.receive.event:m.rtc.decline", + // RTC member events (send/receive, unstable/stable) + "org.matrix.msc2762.receive.event:org.matrix.msc4143.rtc.member", + "org.matrix.msc2762.receive.event:m.rtc.member", + "org.matrix.msc2762.send.event:m.rtc.member", + "org.matrix.msc2762.send.event:org.matrix.msc4143.rtc.member", ]); const approvedCapabilities = await driver.validateCapabilities(requestedCapabilities); From 011b975d3fe1d23ce860cf9849b7cba8100ec861 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Thu, 11 Dec 2025 13:43:28 +0000 Subject: [PATCH 07/72] v1.12.7-rc.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3cb0a803a1..7795b04d04 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "element-web", - "version": "1.12.7-rc.0", + "version": "1.12.7-rc.1", "description": "Element: the future of secure communication", "author": "New Vector Ltd.", "repository": { From cd71c109d3e010eb778019220f27febd74b0ef01 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 11 Dec 2025 15:37:25 +0000 Subject: [PATCH 08/72] Update npm non-major dependencies (#31516) * Update npm non-major dependencies * Run prettier Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --------- Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Michael Telatynski <7t3chguy@gmail.com> --- package.json | 4 +- packages/shared-components/yarn.lock | 18 +- .../read-receipts/message-ordering.spec.ts | 70 +- .../read-receipts/missing-referents.spec.ts | 24 +- .../e2e/read-receipts/notifications.spec.ts | 25 +- res/css/structures/_SplashPage.pcss | 2 +- .../structures/ReleaseAnnouncement.tsx | 6 +- src/components/structures/RoomStatusBar.tsx | 4 +- src/components/utils/ListView.tsx | 6 +- .../views/dialogs/InteractiveAuthDialog.tsx | 6 +- .../views/dialogs/RoomSettingsDialog.tsx | 20 +- src/events/EventTileFactory.tsx | 31 +- yarn.lock | 1335 ++++++++--------- 13 files changed, 717 insertions(+), 834 deletions(-) diff --git a/package.json b/package.json index ee098b9d97..a3bb228b4a 100644 --- a/package.json +++ b/package.json @@ -137,7 +137,7 @@ "opus-recorder": "^8.0.3", "pako": "^2.0.3", "png-chunks-extract": "^1.0.0", - "posthog-js": "1.297.2", + "posthog-js": "1.302.2", "qrcode": "1.5.4", "re-resizable": "6.11.2", "react": "^19.0.0", @@ -281,7 +281,7 @@ "postcss-preset-env": "^10.0.0", "postcss-scss": "^4.0.4", "postcss-simple-vars": "^7.0.1", - "prettier": "3.6.2", + "prettier": "3.7.4", "process": "^0.11.10", "raw-loader": "^4.0.2", "rimraf": "^6.0.0", diff --git a/packages/shared-components/yarn.lock b/packages/shared-components/yarn.lock index a4724fcc48..482a095fb6 100644 --- a/packages/shared-components/yarn.lock +++ b/packages/shared-components/yarn.lock @@ -313,9 +313,9 @@ integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== "@element-hq/element-web-module-api@^1.8.0": - version "1.8.0" - resolved "https://registry.yarnpkg.com/@element-hq/element-web-module-api/-/element-web-module-api-1.8.0.tgz#95aa4ec22609cf0f4a7f24274473af0645a16f2a" - integrity sha512-lMiDA9ubP3mZZupIMT8T3wS0riX30rYZj3pFpdP4cfZhkWZa3FJFStokAy5OnaHyENC7Px1cqkBGqilOWewY/A== + version "1.9.0" + resolved "https://registry.yarnpkg.com/@element-hq/element-web-module-api/-/element-web-module-api-1.9.0.tgz#2e4fcc8809418c8670d4f0576bc4a9a235bc6c50" + integrity sha512-Ao/V9w+wysZK4bh61LlKlznF10n2ZbD6KcUI46/zUMttXbmJn3ahvbzhEpwYcD+Cjy3ag5ycxLIIGkKV/fncXg== "@element-hq/element-web-playwright-common@^2.0.0": version "2.1.0" @@ -5855,9 +5855,9 @@ prelude-ls@^1.2.1: integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prettier@^3.6.2: - version "3.6.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.6.2.tgz#ccda02a1003ebbb2bfda6f83a074978f608b9393" - integrity sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ== + version "3.7.4" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.7.4.tgz#d2f8335d4b1cec47e1c8098645411b0c9dff9c0f" + integrity sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA== pretty-format@30.2.0, pretty-format@^30.0.0: version "30.2.0" @@ -7088,9 +7088,9 @@ vite-plugin-node-polyfills@^0.24.0: node-stdlib-browser "^1.2.0" vite@^7.1.9: - version "7.2.4" - resolved "https://registry.yarnpkg.com/vite/-/vite-7.2.4.tgz#a3a09c7e25487612ecc1119c7d412c73da35bd4e" - integrity sha512-NL8jTlbo0Tn4dUEXEsUg8KeyG/Lkmc4Fnzb8JXN/Ykm9G4HNImjtABMJgkQoVjOBN/j2WAwDTRytdqJbZsah7w== + version "7.2.7" + resolved "https://registry.yarnpkg.com/vite/-/vite-7.2.7.tgz#0789a4c3206081699f34a9ecca2dda594a07478e" + integrity sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ== dependencies: esbuild "^0.25.0" fdir "^6.5.0" diff --git a/playwright/e2e/read-receipts/message-ordering.spec.ts b/playwright/e2e/read-receipts/message-ordering.spec.ts index 59a56e6c50..5f4c994fda 100644 --- a/playwright/e2e/read-receipts/message-ordering.spec.ts +++ b/playwright/e2e/read-receipts/message-ordering.spec.ts @@ -13,72 +13,30 @@ import { test } from "."; test.describe("Read receipts", { tag: "@mergequeue" }, () => { test.describe("Message ordering", () => { test.describe("in the main timeline", () => { - test.fixme( - "A receipt for the last event in sync order (even with wrong ts) marks a room as read", - () => {}, - ); - test.fixme( - "A receipt for a non-last event in sync order (even when ts makes it last) leaves room unread", - () => {}, - ); + test.fixme("A receipt for the last event in sync order (even with wrong ts) marks a room as read", () => {}); + test.fixme("A receipt for a non-last event in sync order (even when ts makes it last) leaves room unread", () => {}); }); test.describe("in threads", () => { // These don't pass yet - we need MSC4033 - we don't even know the Sync order yet - test.fixme( - "A receipt for the last event in sync order (even with wrong ts) marks a thread as read", - () => {}, - ); - test.fixme( - "A receipt for a non-last event in sync order (even when ts makes it last) leaves thread unread", - () => {}, - ); + test.fixme("A receipt for the last event in sync order (even with wrong ts) marks a thread as read", () => {}); + test.fixme("A receipt for a non-last event in sync order (even when ts makes it last) leaves thread unread", () => {}); // These pass now and should not later - we should use order from MSC4033 instead of ts // These are broken out - test.fixme( - "A receipt for last threaded event in ts order (even when it was received non-last) marks a thread as read", - () => {}, - ); - test.fixme( - "A receipt for non-last threaded event in ts order (even when it was received last) leaves thread unread", - () => {}, - ); - test.fixme( - "A receipt for last threaded edit in ts order (even when it was received non-last) marks a thread as read", - () => {}, - ); - test.fixme( - "A receipt for non-last threaded edit in ts order (even when it was received last) leaves thread unread", - () => {}, - ); - test.fixme( - "A receipt for last threaded reaction in ts order (even when it was received non-last) marks a thread as read", - () => {}, - ); - test.fixme( - "A receipt for non-last threaded reaction in ts order (even when it was received last) leaves thread unread", - () => {}, - ); + test.fixme("A receipt for last threaded event in ts order (even when it was received non-last) marks a thread as read", () => {}); + test.fixme("A receipt for non-last threaded event in ts order (even when it was received last) leaves thread unread", () => {}); + test.fixme("A receipt for last threaded edit in ts order (even when it was received non-last) marks a thread as read", () => {}); + test.fixme("A receipt for non-last threaded edit in ts order (even when it was received last) leaves thread unread", () => {}); + test.fixme("A receipt for last threaded reaction in ts order (even when it was received non-last) marks a thread as read", () => {}); + test.fixme("A receipt for non-last threaded reaction in ts order (even when it was received last) leaves thread unread", () => {}); }); test.describe("thread roots", () => { - test.fixme( - "A receipt for last reaction to thread root in sync order (even when ts makes it last) marks room as read", - () => {}, - ); - test.fixme( - "A receipt for non-last reaction to thread root in sync order (even when ts makes it last) leaves room unread", - () => {}, - ); - test.fixme( - "A receipt for last edit to thread root in sync order (even when ts makes it last) marks room as read", - () => {}, - ); - test.fixme( - "A receipt for non-last edit to thread root in sync order (even when ts makes it last) leaves room unread", - () => {}, - ); + test.fixme("A receipt for last reaction to thread root in sync order (even when ts makes it last) marks room as read", () => {}); + test.fixme("A receipt for non-last reaction to thread root in sync order (even when ts makes it last) leaves room unread", () => {}); + test.fixme("A receipt for last edit to thread root in sync order (even when ts makes it last) marks room as read", () => {}); + test.fixme("A receipt for non-last edit to thread root in sync order (even when ts makes it last) leaves room unread", () => {}); }); }); }); diff --git a/playwright/e2e/read-receipts/missing-referents.spec.ts b/playwright/e2e/read-receipts/missing-referents.spec.ts index a953aae448..baa5e907f5 100644 --- a/playwright/e2e/read-receipts/missing-referents.spec.ts +++ b/playwright/e2e/read-receipts/missing-referents.spec.ts @@ -12,18 +12,20 @@ import { test } from "."; test.describe("Read receipts", { tag: "@mergequeue" }, () => { test.describe("messages with missing referents", () => { - test.fixme( - "A message in an unknown thread is not visible and the room is read", - async ({ roomAlpha: room1, roomBeta: room2, util, msg }) => { - // Given a thread existed and the room is read - await util.goTo(room1); - await util.receiveMessages(room2, ["Root1", msg.threadedOff("Root1", "T1a")]); + test.fixme("A message in an unknown thread is not visible and the room is read", async ({ + roomAlpha: room1, + roomBeta: room2, + util, + msg, + }) => { + // Given a thread existed and the room is read + await util.goTo(room1); + await util.receiveMessages(room2, ["Root1", msg.threadedOff("Root1", "T1a")]); - // When I restart, forgetting the thread root - // And I receive a message on that thread - // Then the message is invisible and the room remains read - }, - ); + // When I restart, forgetting the thread root + // And I receive a message on that thread + // Then the message is invisible and the room remains read + }); test.fixme("When a message's thread root appears later the thread appears and the room is unread", () => {}); test.fixme("An edit of an unknown message is not visible and the room is read", () => {}); test.fixme("When an edit's message appears later the edited version appears and the room is unread", () => {}); diff --git a/playwright/e2e/read-receipts/notifications.spec.ts b/playwright/e2e/read-receipts/notifications.spec.ts index 93f5515eeb..7013d49141 100644 --- a/playwright/e2e/read-receipts/notifications.spec.ts +++ b/playwright/e2e/read-receipts/notifications.spec.ts @@ -14,14 +14,8 @@ test.describe("Read receipts", { tag: "@mergequeue" }, () => { test.describe("Notifications", () => { test.describe("in the main timeline", () => { test.fixme("A new message that mentions me shows a notification", () => {}); - test.fixme( - "Reading a notifying message reduces the notification count in the room list, space and tab", - () => {}, - ); - test.fixme( - "Reading the last notifying message removes the notification marker from room list, space and tab", - () => {}, - ); + test.fixme("Reading a notifying message reduces the notification count in the room list, space and tab", () => {}); + test.fixme("Reading the last notifying message removes the notification marker from room list, space and tab", () => {}); test.fixme("Editing a message to mentions me shows a notification", () => {}); test.fixme("Reading the last notifying edited message removes the notification marker", () => {}); test.fixme("Redacting a notifying message removes the notification marker", () => {}); @@ -30,18 +24,9 @@ test.describe("Read receipts", { tag: "@mergequeue" }, () => { test.describe("in threads", () => { test.fixme("A new threaded message that mentions me shows a notification", () => {}); test.fixme("Reading a notifying threaded message removes the notification count", () => {}); - test.fixme( - "Notification count remains steady when reading threads that contain seen notifications", - () => {}, - ); - test.fixme( - "Notification count remains steady when paging up thread view even when threads contain seen notifications", - () => {}, - ); - test.fixme( - "Notification count remains steady when paging up thread view after mark as unread even if older threads contain notifications", - () => {}, - ); + test.fixme("Notification count remains steady when reading threads that contain seen notifications", () => {}); + test.fixme("Notification count remains steady when paging up thread view even when threads contain seen notifications", () => {}); + test.fixme("Notification count remains steady when paging up thread view after mark as unread even if older threads contain notifications", () => {}); test.fixme("Redacting a notifying threaded message removes the notification marker", () => {}); }); }); diff --git a/res/css/structures/_SplashPage.pcss b/res/css/structures/_SplashPage.pcss index bd57fbb48d..8f06541179 100644 --- a/res/css/structures/_SplashPage.pcss +++ b/res/css/structures/_SplashPage.pcss @@ -32,7 +32,7 @@ Please see LICENSE files in the repository root for full details. /* mask to dither resulting combined gradient */ url("$(res)/img/noise.png"), /* gradient to apply different amounts of dithering to different parts of the gradient */ - linear-gradient( + linear-gradient( to bottom, /* 10% dithering at the top */ rgb(0, 0, 0, 0.9) 20%, /* 80% dithering at the bottom */ rgb(0, 0, 0, 0.2) 100% diff --git a/src/components/structures/ReleaseAnnouncement.tsx b/src/components/structures/ReleaseAnnouncement.tsx index da41b3c1dd..5a9eea2d68 100644 --- a/src/components/structures/ReleaseAnnouncement.tsx +++ b/src/components/structures/ReleaseAnnouncement.tsx @@ -12,8 +12,10 @@ import { ReleaseAnnouncement as ReleaseAnnouncementCompound } from "@vector-im/c import { ReleaseAnnouncementStore, type Feature } from "../../stores/ReleaseAnnouncementStore"; import { useIsReleaseAnnouncementOpen } from "../../hooks/useIsReleaseAnnouncementOpen"; -interface ReleaseAnnouncementProps - extends Omit, "open" | "onClick"> { +interface ReleaseAnnouncementProps extends Omit< + ComponentProps, + "open" | "onClick" +> { feature: Feature; } diff --git a/src/components/structures/RoomStatusBar.tsx b/src/components/structures/RoomStatusBar.tsx index 4793f1a65b..4d23475762 100644 --- a/src/components/structures/RoomStatusBar.tsx +++ b/src/components/structures/RoomStatusBar.tsx @@ -187,8 +187,8 @@ export default class RoomStatusBar extends React.PureComponent { // if it's a resource limit exceeded error: those are shown in the top bar. const errorIsMauError = Boolean( this.state.syncStateData && - this.state.syncStateData.error && - this.state.syncStateData.error.name === "M_RESOURCE_LIMIT_EXCEEDED", + this.state.syncStateData.error && + this.state.syncStateData.error.name === "M_RESOURCE_LIMIT_EXCEEDED", ); return this.state.syncState === "ERROR" && !errorIsMauError; } diff --git a/src/components/utils/ListView.tsx b/src/components/utils/ListView.tsx index ca45b703a3..e35f7e2e47 100644 --- a/src/components/utils/ListView.tsx +++ b/src/components/utils/ListView.tsx @@ -22,8 +22,10 @@ export type ListContext = { context: Context; }; -export interface IListViewProps - extends Omit>, "data" | "itemContent" | "context"> { +export interface IListViewProps extends Omit< + VirtuosoProps>, + "data" | "itemContent" | "context" +> { /** * The array of items to display in the virtualized list. * Each item will be passed to getItemComponent for rendering. diff --git a/src/components/views/dialogs/InteractiveAuthDialog.tsx b/src/components/views/dialogs/InteractiveAuthDialog.tsx index d4ea7218c7..1aa3e7fe68 100644 --- a/src/components/views/dialogs/InteractiveAuthDialog.tsx +++ b/src/components/views/dialogs/InteractiveAuthDialog.tsx @@ -34,8 +34,10 @@ type DialogAesthetics = Partial<{ }; }>; -export interface InteractiveAuthDialogProps - extends Pick, "makeRequest" | "authData"> { +export interface InteractiveAuthDialogProps extends Pick< + InteractiveAuthProps, + "makeRequest" | "authData" +> { // matrix client to use for UI auth requests matrixClient: MatrixClient; diff --git a/src/components/views/dialogs/RoomSettingsDialog.tsx b/src/components/views/dialogs/RoomSettingsDialog.tsx index 8c90a356d2..7e7a26ed2d 100644 --- a/src/components/views/dialogs/RoomSettingsDialog.tsx +++ b/src/components/views/dialogs/RoomSettingsDialog.tsx @@ -177,12 +177,10 @@ class RoomSettingsDialog extends React.Component { RoomSettingsTab.Notifications, _td("notifications|enable_prompt_toast_title"), "mx_RoomSettingsDialog_notificationsIcon", - ( - this.props.onFinished(true)} - /> - ), + this.props.onFinished(true)} + />, "RoomSettingsNotifications", ), ); @@ -214,12 +212,10 @@ class RoomSettingsDialog extends React.Component { RoomSettingsTab.Advanced, _td("common|advanced"), "mx_RoomSettingsDialog_warningIcon", - ( - this.props.onFinished(true)} - /> - ), + this.props.onFinished(true)} + />, "RoomSettingsAdvanced", ), ); diff --git a/src/events/EventTileFactory.tsx b/src/events/EventTileFactory.tsx index e364723384..3bec221c7a 100644 --- a/src/events/EventTileFactory.tsx +++ b/src/events/EventTileFactory.tsx @@ -46,22 +46,21 @@ import { TextualEventViewModel } from "../viewmodels/event-tiles/TextualEventVie import { ElementCallEventType } from "../call-types"; // Subset of EventTile's IProps plus some mixins -export interface EventTileTypeProps - extends Pick< - EventTileProps, - | "mxEvent" - | "highlights" - | "highlightLink" - | "showUrlPreview" - | "forExport" - | "getRelationsForEvent" - | "editState" - | "replacingEventId" - | "permalinkCreator" - | "callEventGrouper" - | "isSeeingThroughMessageHiddenForModeration" - | "inhibitInteraction" - > { +export interface EventTileTypeProps extends Pick< + EventTileProps, + | "mxEvent" + | "highlights" + | "highlightLink" + | "showUrlPreview" + | "forExport" + | "getRelationsForEvent" + | "editState" + | "replacingEventId" + | "permalinkCreator" + | "callEventGrouper" + | "isSeeingThroughMessageHiddenForModeration" + | "inhibitInteraction" +> { ref?: React.RefObject; // `any` because it's effectively impossible to convince TS of a reasonable type maxImageHeight?: number; // pixels overrideBodyTypes?: Record>; diff --git a/yarn.lock b/yarn.lock index 2902132ca2..717ca08bf8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1165,30 +1165,23 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@cacheable/memoize@^2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@cacheable/memoize/-/memoize-2.0.3.tgz#64b18a6b42f987fe8a9e9e2e4391b14cbf85680f" - integrity sha512-hl9wfQgpiydhQEIv7fkjEzTGE+tcosCXLKFDO707wYJ/78FVOlowb36djex5GdbSyeHnG62pomYLMuV/OT8Pbw== +"@cacheable/memory@^2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@cacheable/memory/-/memory-2.0.6.tgz#de6679d26ffcfa1674c4bb40b97815b0f67839d5" + integrity sha512-7e8SScMocHxcAb8YhtkbMhGG+EKLRIficb1F5sjvhSYsWTZGxvg4KIDp8kgxnV2PUJ3ddPe6J9QESjKvBWRDkg== dependencies: - "@cacheable/utils" "^2.0.3" + "@cacheable/utils" "^2.3.2" + "@keyv/bigmap" "^1.3.0" + hookified "^1.13.0" + keyv "^5.5.4" -"@cacheable/memory@^2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@cacheable/memory/-/memory-2.0.3.tgz#8d8fa1644b32b85f27c7e4e16e14f36a8460735c" - integrity sha512-R3UKy/CKOyb1LZG/VRCTMcpiMDyLH7SH3JrraRdK6kf3GweWCOU3sgvE13W3TiDRbxnDKylzKJvhUAvWl9LQOA== +"@cacheable/utils@^2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@cacheable/utils/-/utils-2.3.2.tgz#8d76faef710840c391a1a35183967028c0c521f0" + integrity sha512-8kGE2P+HjfY8FglaOiW+y8qxcaQAfAhVML+i66XJR3YX5FtyDqn6Txctr3K2FrbxLKixRRYYBWMbuGciOhYNDg== dependencies: - "@cacheable/memoize" "^2.0.3" - "@cacheable/utils" "^2.0.3" - "@keyv/bigmap" "^1.0.2" - hookified "^1.12.1" - keyv "^5.5.3" - -"@cacheable/utils@^2.0.3", "@cacheable/utils@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@cacheable/utils/-/utils-2.1.0.tgz#fbef92c5bfe720eadbdbf516c5fa64dee794d35d" - integrity sha512-ZdxfOiaarMqMj+H7qwlt5EBKWaeGihSYVHdQv5lUsbn8MJJOTW82OIwirQ39U5tMZkNvy3bQE+ryzC+xTAb9/g== - dependencies: - keyv "^5.5.3" + hashery "^1.2.0" + keyv "^5.5.4" "@casualbot/jest-sonar-reporter@2.5.0": version "2.5.0" @@ -1245,6 +1238,11 @@ resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz#5755370a9a29abaec5515b43c8b3f2cf9c2e3076" integrity sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ== +"@csstools/css-syntax-patches-for-csstree@^1.0.19": + version "1.0.20" + resolved "https://registry.yarnpkg.com/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.0.20.tgz#b14db34a759b3446b01d7981b4765f92b2d420ae" + integrity sha512-8BHsjXfSciZxjmHQOuVdW2b8WLUPts9a+mfL13/PzEviufUEW2xnvQuOlKs9dRBHgRqJ53SF/DUoK9+MZk72oQ== + "@csstools/css-tokenizer@^3.0.3", "@csstools/css-tokenizer@^3.0.4": version "3.0.4" resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz#333fedabc3fd1a8e5d0100013731cf19e6a8c5d3" @@ -1579,7 +1577,7 @@ yaml "^2.7.0" "@element-hq/web-shared-components@link:packages/shared-components": - version "0.0.0-test.11" + version "0.0.0-test.12" dependencies: "@element-hq/element-web-module-api" "^1.8.0" "@vector-im/compound-design-tokens" "^6.3.0" @@ -1591,7 +1589,7 @@ react-merge-refs "^3.0.2" temporal-polyfill "^0.3.0" -"@emnapi/core@^1.4.3", "@emnapi/core@^1.5.0": +"@emnapi/core@^1.4.3": version "1.7.0" resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.7.0.tgz#135de4e8858763989112281bdf38ca02439db7c3" integrity sha512-pJdKGq/1iquWYtv1RRSljZklxHCOCAJFJrImO5ZLKPJVJlVUcs8yFwNQlqS0Lo8xT1VAXXTCZocF9n26FWEKsw== @@ -1599,13 +1597,28 @@ "@emnapi/wasi-threads" "1.1.0" tslib "^2.4.0" -"@emnapi/runtime@^1.4.3", "@emnapi/runtime@^1.5.0": +"@emnapi/core@^1.7.1": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.7.1.tgz#3a79a02dbc84f45884a1806ebb98e5746bdfaac4" + integrity sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg== + dependencies: + "@emnapi/wasi-threads" "1.1.0" + tslib "^2.4.0" + +"@emnapi/runtime@^1.4.3": version "1.7.0" resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.7.0.tgz#d7ef3832df8564fe5903bf0567aedbd19538ecbe" integrity sha512-oAYoQnCYaQZKVS53Fq23ceWMRxq5EhQsE0x0RdQ55jT7wagMu5k+fS39v1fiSLrtrLQlXwVINenqhLMtTrV/1Q== dependencies: tslib "^2.4.0" +"@emnapi/runtime@^1.7.1": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.7.1.tgz#a73784e23f5d57287369c808197288b52276b791" + integrity sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA== + dependencies: + tslib "^2.4.0" + "@emnapi/wasi-threads@1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz#60b2102fddc9ccb78607e4a3cf8403ea69be41bf" @@ -2113,13 +2126,6 @@ dependencies: "@sinclair/typebox" "^0.34.0" -"@jest/schemas@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" - integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== - dependencies: - "@sinclair/typebox" "^0.27.8" - "@jest/snapshot-utils@30.2.0": version "30.2.0" resolved "https://registry.yarnpkg.com/@jest/snapshot-utils/-/snapshot-utils-30.2.0.tgz#387858eb90c2f98f67bff327435a532ac5309fbe" @@ -2193,18 +2199,6 @@ "@types/yargs" "^17.0.33" chalk "^4.1.2" -"@jest/types@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" - integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== - dependencies: - "@jest/schemas" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - "@joshwooding/vite-plugin-react-docgen-typescript@0.6.1": version "0.6.1" resolved "https://registry.yarnpkg.com/@joshwooding/vite-plugin-react-docgen-typescript/-/vite-plugin-react-docgen-typescript-0.6.1.tgz#f630b93ed13d5d07483c0ead42db793053b364a9" @@ -2289,12 +2283,13 @@ resolved "https://registry.yarnpkg.com/@jsonjoy.com/util/-/util-1.6.0.tgz#23991b2fe12cb3a006573d9dc97c768d3ed2c9f1" integrity sha512-sw/RMbehRhN68WRtcKCpQOPfnH6lLP4GJfqzi3iYej8tnzpZUDr6UkZYJjcjjC0FWEJOJbyM3PTIwxucUmDG2A== -"@keyv/bigmap@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@keyv/bigmap/-/bigmap-1.0.3.tgz#845aafa65cd72bdd5fcc1a0e3fe707894c47d7a4" - integrity sha512-jUEkNlnE9tYzX2AIBeoSe1gVUvSOfIOQ5EFPL5Un8cFHGvjD9L/fxpxlS1tEivRLHgapO2RZJ3D93HYAa049pg== +"@keyv/bigmap@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@keyv/bigmap/-/bigmap-1.3.0.tgz#f06d9bb38488a59f012cd2758e6f429dfd312fb5" + integrity sha512-KT01GjzV6AQD5+IYrcpoYLkCu1Jod3nau1Z7EsEuViO3TZGRacSbO9MfHmbJ1WaOXFtWLxPVj169cn2WNKPkIg== dependencies: - hookified "^1.12.1" + hashery "^1.2.0" + hookified "^1.13.0" "@keyv/serialize@^1.1.1": version "1.1.1" @@ -2349,9 +2344,9 @@ integrity sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q== "@maplibre/maplibre-gl-style-spec@^24.3.1": - version "24.3.1" - resolved "https://registry.yarnpkg.com/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-24.3.1.tgz#5ff28b16730c65265cf8cca21445286ed5e2abbf" - integrity sha512-TUM5JD40H2mgtVXl5IwWz03BuQabw8oZQLJTmPpJA0YTYF+B+oZppy5lNMO6bMvHzB+/5mxqW9VLG3wFdeqtOw== + version "24.4.0" + resolved "https://registry.yarnpkg.com/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-24.4.0.tgz#370eb9b7bcb868b021e91822ee27ee3491bd2cbf" + integrity sha512-VVuNV2Yf0+yQoth4qbdIPE0qKS6nIG5Atki9BVHZ7R7+0lZyxqxwrh0XVNA5YkuKuytFg/1i3VMyJQnp2EtOqw== dependencies: "@mapbox/jsonlint-lines-primitives" "~2.0.2" "@mapbox/unitbezier" "^0.0.1" @@ -2361,17 +2356,17 @@ rw "^1.3.3" tinyqueue "^3.0.0" -"@maplibre/mlt@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@maplibre/mlt/-/mlt-1.1.0.tgz#c73c6b466a784b447fec594d947f127b618b090c" - integrity sha512-anR8WxKIgZUJQLlZtID0v06wd9Q//9K/6lLLU3dOzmeO/xLEzAwmEqP24jEnEUBcnZGkM4vidz9H6Q4guNAAlw== +"@maplibre/mlt@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@maplibre/mlt/-/mlt-1.1.2.tgz#4d0c8e74287ffe32f2a58bc68320c985cae80b7c" + integrity sha512-SQKdJ909VGROkA6ovJgtHNs9YXV4YXUPS+VaZ50I2Mt951SLlUm2Cv34x5Xwc1HiFlsd3h2Yrs5cn7xzqBmENw== dependencies: "@mapbox/point-geometry" "^1.1.0" -"@maplibre/vt-pbf@^4.0.3": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@maplibre/vt-pbf/-/vt-pbf-4.0.3.tgz#8702b8330cfa0efbe7c81eb2ae138e588a02bfa6" - integrity sha512-YsW99BwnT+ukJRkseBcLuZHfITB4puJoxnqPVjo72rhW/TaawVYsgQHcqWLzTxqknttYoDpgyERzWSa/XrETdA== +"@maplibre/vt-pbf@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@maplibre/vt-pbf/-/vt-pbf-4.1.0.tgz#117c95b113e67aeacdf69443a631bb92d431d191" + integrity sha512-9LjFAoWtxdGRns8RK9vG3Fcw/fb3eHMxvAn2jffwn3jnVO1k49VOv6+FEza70rK7WzF8GnBiKa0K39RyfevKUw== dependencies: "@mapbox/point-geometry" "^1.1.0" "@mapbox/vector-tile" "^2.0.4" @@ -2420,13 +2415,13 @@ "@emnapi/runtime" "^1.4.3" "@tybys/wasm-util" "^0.10.0" -"@napi-rs/wasm-runtime@^1.0.7": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz#dcfea99a75f06209a235f3d941e3460a51e9b14c" - integrity sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw== +"@napi-rs/wasm-runtime@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.0.tgz#c0180393d7862cff0d412e3e1a7c3bd5ea6d9b2f" + integrity sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA== dependencies: - "@emnapi/core" "^1.5.0" - "@emnapi/runtime" "^1.5.0" + "@emnapi/core" "^1.7.1" + "@emnapi/runtime" "^1.7.1" "@tybys/wasm-util" "^0.10.1" "@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": @@ -2457,102 +2452,107 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@oxc-resolver/binding-android-arm-eabi@11.13.2": - version "11.13.2" - resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-android-arm-eabi/-/binding-android-arm-eabi-11.13.2.tgz#e309a5652787f25d65a7771c2f7608f8e4271d94" - integrity sha512-vWd1NEaclg/t2DtEmYzRRBNQOueMI8tixw/fSNZ9XETXLRJiAjQMYpYeflQdRASloGze6ZelHE/wIBNt4S+pkw== +"@oxc-resolver/binding-android-arm-eabi@11.15.0": + version "11.15.0" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-android-arm-eabi/-/binding-android-arm-eabi-11.15.0.tgz#ac132226c0d637f212abfdc253e6ce3e7de5e9bf" + integrity sha512-Q+lWuFfq7whNelNJIP1dhXaVz4zO9Tu77GcQHyxDWh3MaCoO2Bisphgzmsh4ZoUe2zIchQh6OvQL99GlWHg9Tw== -"@oxc-resolver/binding-android-arm64@11.13.2": - version "11.13.2" - resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-android-arm64/-/binding-android-arm64-11.13.2.tgz#bb1267f5c388462758be394d56dcc6ee62d0e39e" - integrity sha512-jxZrYcxgpI6IuQpguQVAQNrZfUyiYfMVqR4pKVU3PRLCM7AsfXNKp0TIgcvp+l6dYVdoZ1MMMMa5Ayjd09rNOw== +"@oxc-resolver/binding-android-arm64@11.15.0": + version "11.15.0" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-android-arm64/-/binding-android-arm64-11.15.0.tgz#1c12444b34ea736098a309ac5c643b4da57f2544" + integrity sha512-vbdBttesHR0W1oJaxgWVTboyMUuu+VnPsHXJ6jrXf4czELzB6GIg5DrmlyhAmFBhjwov+yJH/DfTnHS+2sDgOw== -"@oxc-resolver/binding-darwin-arm64@11.13.2": - version "11.13.2" - resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-darwin-arm64/-/binding-darwin-arm64-11.13.2.tgz#a2213156b6df07ace1c74faf95b7aa2cbeebe86f" - integrity sha512-RDS3HUe1FvgjNS1xfBUqiEJ8938Zb5r7iKABwxEblp3K4ufZZNAtoaHjdUH2TJ0THDmuf0OxxVUO/Y+4Ep4QfQ== +"@oxc-resolver/binding-darwin-arm64@11.15.0": + version "11.15.0" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-darwin-arm64/-/binding-darwin-arm64-11.15.0.tgz#e1cc90578c142fa83f261b15643822b0f2992d9f" + integrity sha512-R67lsOe1UzNjqVBCwCZX1rlItTsj/cVtBw4Uy19CvTicqEWvwaTn8t34zLD75LQwDDPCY3C8n7NbD+LIdw+ZoA== -"@oxc-resolver/binding-darwin-x64@11.13.2": - version "11.13.2" - resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-darwin-x64/-/binding-darwin-x64-11.13.2.tgz#bc28f62c5213633c21a513060289095bb48930da" - integrity sha512-tDcyWtkUzkt6auJLP2dOjL84BxqHkKW4mz2lNRIGPTq7b+HBraB+m8RdRH6BgqTvbnNECOxR3XAMaKBKC8J51g== +"@oxc-resolver/binding-darwin-x64@11.15.0": + version "11.15.0" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-darwin-x64/-/binding-darwin-x64-11.15.0.tgz#ee5746cbfd4a27795758eed89ba77951de52672f" + integrity sha512-77mya5F8WV0EtCxI0MlVZcqkYlaQpfNwl/tZlfg4jRsoLpFbaTeWv75hFm6TE84WULVlJtSgvf7DhoWBxp9+ZQ== -"@oxc-resolver/binding-freebsd-x64@11.13.2": - version "11.13.2" - resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-freebsd-x64/-/binding-freebsd-x64-11.13.2.tgz#0800091260eda93e117dcde3843a480d2fa0f569" - integrity sha512-fpaeN8Q0kWvKns9uSMg6CcKo7cdgmWt6J91stPf8sdM+EKXzZ0YcRnWWyWF8SM16QcLUPCy5Iwt5Z8aYBGaZYA== +"@oxc-resolver/binding-freebsd-x64@11.15.0": + version "11.15.0" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-freebsd-x64/-/binding-freebsd-x64-11.15.0.tgz#5c621ed31913f9e7dd1a9bc11e8edbda7943d5b3" + integrity sha512-X1Sz7m5PC+6D3KWIDXMUtux+0Imj6HfHGdBStSvgdI60OravzI1t83eyn6eN0LPTrynuPrUgjk7tOnOsBzSWHw== -"@oxc-resolver/binding-linux-arm-gnueabihf@11.13.2": - version "11.13.2" - resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-11.13.2.tgz#7940c598e1ad29056d2046bd2843714d9b3e254b" - integrity sha512-idBgJU5AvSsGOeaIWiFBKbNBjpuduHsJmrG4CBbEUNW/Ykx+ISzcuj1PHayiYX6R9stVsRhj3d2PyymfC5KWRg== +"@oxc-resolver/binding-linux-arm-gnueabihf@11.15.0": + version "11.15.0" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-11.15.0.tgz#b25b6d0598d1b9343d42c2a82abb98e5f035291e" + integrity sha512-L1x/wCaIRre+18I4cH/lTqSAymlV0k4HqfSYNNuI9oeL28Ks86lI6O5VfYL6sxxWYgjuWB98gNGo7tq7d4GarQ== -"@oxc-resolver/binding-linux-arm-musleabihf@11.13.2": - version "11.13.2" - resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-11.13.2.tgz#05877080ab043caf49db4c3e72e4d1c4ea3e8552" - integrity sha512-BlBvQUhvvIM/7s96KlKhMk0duR2sj8T7Hyii46/5QnwfN/pHwobvOL5czZ6/SKrHNB/F/qDY4hGsBuB1y7xgTg== +"@oxc-resolver/binding-linux-arm-musleabihf@11.15.0": + version "11.15.0" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-11.15.0.tgz#79a9844b1b5cb90868c89c0c8c2f986888597c44" + integrity sha512-abGXd/zMGa0tH8nKlAXdOnRy4G7jZmkU0J85kMKWns161bxIgGn/j7zxqh3DKEW98wAzzU9GofZMJ0P5YCVPVw== -"@oxc-resolver/binding-linux-arm64-gnu@11.13.2": - version "11.13.2" - resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-11.13.2.tgz#4af0671f403df7ec09c96989982ce6adcc111c1e" - integrity sha512-lUmDTmYOGpbIK+FBfZ0ySaQTo7g1Ia/WnDnQR2wi/0AtehZIg/ZZIgiT/fD0iRvKEKma612/0PVo8dXdAKaAGA== +"@oxc-resolver/binding-linux-arm64-gnu@11.15.0": + version "11.15.0" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-11.15.0.tgz#d14505c8d307c4ba185371e0b593a3cddc17462b" + integrity sha512-SVjjjtMW66Mza76PBGJLqB0KKyFTBnxmtDXLJPbL6ZPGSctcXVmujz7/WAc0rb9m2oV0cHQTtVjnq6orQnI/jg== -"@oxc-resolver/binding-linux-arm64-musl@11.13.2": - version "11.13.2" - resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-linux-arm64-musl/-/binding-linux-arm64-musl-11.13.2.tgz#da4888231605f3f6c587d97baef71d929356ad49" - integrity sha512-dkGzOxo+I9lA4Er6qzFgkFevl3JvwyI9i0T/PkOJHva04rb1p9dz8GPogTO9uMK4lrwLWzm/piAu+tHYC7v7+w== +"@oxc-resolver/binding-linux-arm64-musl@11.15.0": + version "11.15.0" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-linux-arm64-musl/-/binding-linux-arm64-musl-11.15.0.tgz#9c622c8bfd6219d5c15c6d86acff03a4ba361e1b" + integrity sha512-JDv2/AycPF2qgzEiDeMJCcSzKNDm3KxNg0KKWipoKEMDFqfM7LxNwwSVyAOGmrYlE4l3dg290hOMsr9xG7jv9g== -"@oxc-resolver/binding-linux-ppc64-gnu@11.13.2": - version "11.13.2" - resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-11.13.2.tgz#357acf5020c5fe2175ab351e843c1fb0b81afb11" - integrity sha512-53kWsjLkVFnoSA7COdps38pBssN48zI8LfsOvupsmQ0/4VeMYb+0Ao9O6r52PtmFZsGB3S1Qjqbjl/Pswj1a3g== +"@oxc-resolver/binding-linux-ppc64-gnu@11.15.0": + version "11.15.0" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-11.15.0.tgz#ff048ae000d24292719cd3843ea0aec72cc145d1" + integrity sha512-zbu9FhvBLW4KJxo7ElFvZWbSt4vP685Qc/Gyk/Ns3g2gR9qh2qWXouH8PWySy+Ko/qJ42+HJCLg+ZNcxikERfg== -"@oxc-resolver/binding-linux-riscv64-gnu@11.13.2": - version "11.13.2" - resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-11.13.2.tgz#52011bfcc931b2cf4fb744fa5253569b72141dad" - integrity sha512-MfxN6DMpvmdCbGlheJ+ihy11oTcipqDfcEIQV9ah3FGXBRCZtBOHJpQDk8qI2Y+nCXVr3Nln7OSsOzoC4+rSYQ== +"@oxc-resolver/binding-linux-riscv64-gnu@11.15.0": + version "11.15.0" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-11.15.0.tgz#07a20bbecda282e95131385575733638b8c6af86" + integrity sha512-Kfleehe6B09C2qCnyIU01xLFqFXCHI4ylzkicfX/89j+gNHh9xyNdpEvit88Kq6i5tTGdavVnM6DQfOE2qNtlg== -"@oxc-resolver/binding-linux-riscv64-musl@11.13.2": - version "11.13.2" - resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-11.13.2.tgz#203eeaddb4149d36c48c132f53175963b10be151" - integrity sha512-WXrm4YiRU0ijqb72WHSjmfYaQZ7t6/kkQrFc4JtU+pUE4DZA/DEdxOuQEd4Q43VqmLvICTJWSaZMlCGQ4PSRUg== +"@oxc-resolver/binding-linux-riscv64-musl@11.15.0": + version "11.15.0" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-11.15.0.tgz#249c2d83f8312dc21c4cc573e80c9b5004246995" + integrity sha512-J7LPiEt27Tpm8P+qURDwNc8q45+n+mWgyys4/V6r5A8v5gDentHRGUx3iVk5NxdKhgoGulrzQocPTZVosq25Eg== -"@oxc-resolver/binding-linux-s390x-gnu@11.13.2": - version "11.13.2" - resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-11.13.2.tgz#75e2473e961f17e509d975e2a4c85d9f21b64461" - integrity sha512-4pISWIlOFRUhWyvGCB3XUhtcwyvwGGhlXhHz7IXCXuGufaQtvR05trvw8U1ZnaPhsdPBkRhOMIedX11ayi5uXw== +"@oxc-resolver/binding-linux-s390x-gnu@11.15.0": + version "11.15.0" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-11.15.0.tgz#c0d6d35c103cd6e2533191670c6df170a1db4d12" + integrity sha512-+8/d2tAScPjVJNyqa7GPGnqleTB/XW9dZJQ2D/oIM3wpH3TG+DaFEXBbk4QFJ9K9AUGBhvQvWU2mQyhK/yYn3Q== -"@oxc-resolver/binding-linux-x64-gnu@11.13.2": - version "11.13.2" - resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-linux-x64-gnu/-/binding-linux-x64-gnu-11.13.2.tgz#62195e0eadd90a2893481f7726fd1eaa51178f50" - integrity sha512-DVo6jS8n73yNAmCsUOOk2vBeC60j2RauDXQM8p7RDl0afsEaA2le22vD8tky7iNoM5tsxfBmE4sOJXEKgpwWRw== +"@oxc-resolver/binding-linux-x64-gnu@11.15.0": + version "11.15.0" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-linux-x64-gnu/-/binding-linux-x64-gnu-11.15.0.tgz#06786bd80fe48d136b12dd9e595797434f7ecf5b" + integrity sha512-xtvSzH7Nr5MCZI2FKImmOdTl9kzuQ51RPyLh451tvD2qnkg3BaqI9Ox78bTk57YJhlXPuxWSOL5aZhKAc9J6qg== -"@oxc-resolver/binding-linux-x64-musl@11.13.2": - version "11.13.2" - resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-linux-x64-musl/-/binding-linux-x64-musl-11.13.2.tgz#ff801da3ff949efc6e486d53225c5ca562ffc947" - integrity sha512-6WqrE+hQBFP35KdwQjWcZpldbTq6yJmuTVThISu+rY3+j6MaDp2ciLHTr1X68r2H/7ocOIl4k3NnOVIzeRJE3w== +"@oxc-resolver/binding-linux-x64-musl@11.15.0": + version "11.15.0" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-linux-x64-musl/-/binding-linux-x64-musl-11.15.0.tgz#e9721f74f26a91f7ed8908a7841d810980b75775" + integrity sha512-14YL1zuXj06+/tqsuUZuzL0T425WA/I4nSVN1kBXeC5WHxem6lQ+2HGvG+crjeJEqHgZUT62YIgj88W+8E7eyg== -"@oxc-resolver/binding-wasm32-wasi@11.13.2": - version "11.13.2" - resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-wasm32-wasi/-/binding-wasm32-wasi-11.13.2.tgz#c5b2f0a821899a46ff1eac0b66911028070eb3c4" - integrity sha512-YpxvQmP2D+mNUkLQZbBjGz20g/pY8XoOBdPPoWMl9X68liFFjXxkPQTrZxWw4zzG/UkTM5z6dPRTyTePRsMcjw== +"@oxc-resolver/binding-openharmony-arm64@11.15.0": + version "11.15.0" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-openharmony-arm64/-/binding-openharmony-arm64-11.15.0.tgz#6379b02f89425d425a1409aa26f3c5426e2ca924" + integrity sha512-/7Qli+1Wk93coxnrQaU8ySlICYN8HsgyIrzqjgIkQEpI//9eUeaeIHZptNl2fMvBGeXa7k2QgLbRNaBRgpnvMw== + +"@oxc-resolver/binding-wasm32-wasi@11.15.0": + version "11.15.0" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-wasm32-wasi/-/binding-wasm32-wasi-11.15.0.tgz#2c3733bb66e5c6a134ac9df4bcca14672728709c" + integrity sha512-q5rn2eIMQLuc/AVGR2rQKb2EVlgreATGG8xXg8f4XbbYCVgpxaq+dgMbiPStyNywW1MH8VU2T09UEm30UtOQvg== dependencies: - "@napi-rs/wasm-runtime" "^1.0.7" + "@napi-rs/wasm-runtime" "^1.1.0" -"@oxc-resolver/binding-win32-arm64-msvc@11.13.2": - version "11.13.2" - resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-11.13.2.tgz#20ff151cca5b7b87f9070b6019c1ebd121672249" - integrity sha512-1SKBw6KcCmvPBdEw1/Qdpv6eSDf23lCXTWz9VxTe6QUQ/1wR+HZR2uS4q6C8W6jnIswMTQbxpTvVwdRXl+ufeA== +"@oxc-resolver/binding-win32-arm64-msvc@11.15.0": + version "11.15.0" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-11.15.0.tgz#f64132dd86f82d2580325886f1aeedeb72235c98" + integrity sha512-yCAh2RWjU/8wWTxQDgGPgzV9QBv0/Ojb5ej1c/58iOjyTuy/J1ZQtYi2SpULjKmwIxLJdTiCHpMilauWimE31w== -"@oxc-resolver/binding-win32-ia32-msvc@11.13.2": - version "11.13.2" - resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-11.13.2.tgz#96788e52bd32f317b35f4d4a1c87d1e86e3509f7" - integrity sha512-KEVV7wggDucxRn3vvyHnmTCPXoCT7vWpH18UVLTygibHJvNRP2zl5lBaQcCIdIaYYZjKt1aGI/yZqxZvHoiCdg== +"@oxc-resolver/binding-win32-ia32-msvc@11.15.0": + version "11.15.0" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-11.15.0.tgz#b09e3c03e4f9a920efbd61600ebcdd29632e19e5" + integrity sha512-lmXKb6lvA6M6QIbtYfgjd+AryJqExZVSY2bfECC18OPu7Lv1mHFF171Mai5l9hG3r4IhHPPIwT10EHoilSCYeA== -"@oxc-resolver/binding-win32-x64-msvc@11.13.2": - version "11.13.2" - resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-win32-x64-msvc/-/binding-win32-x64-msvc-11.13.2.tgz#14fa5ce6d8065d6b5c5ab31155f9f8ebc188b0f5" - integrity sha512-6AAdN9v/wO5c3td1yidgNLKYlzuNgfOtEqBq60WE469bJWR7gHgG/S5aLR2pH6/gyPLs9UXtItxi934D+0Estg== +"@oxc-resolver/binding-win32-x64-msvc@11.15.0": + version "11.15.0" + resolved "https://registry.yarnpkg.com/@oxc-resolver/binding-win32-x64-msvc/-/binding-win32-x64-msvc-11.15.0.tgz#c8014e1fb466a9778a67a323b73cfbf86c709dc8" + integrity sha512-HZsfne0s/tGOcJK9ZdTGxsNU2P/dH0Shf0jqrPvsC6wX0Wk+6AyhSpHFLQCnLOuFQiHHU0ePfM8iYsoJb5hHpQ== "@peculiar/asn1-schema@^2.3.13", "@peculiar/asn1-schema@^2.3.8": version "2.3.13" @@ -2603,10 +2603,10 @@ resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.28.tgz#d45e01c4a56f143ee69c54dd6b12eade9e270a73" integrity sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw== -"@posthog/core@1.5.5": - version "1.5.5" - resolved "https://registry.yarnpkg.com/@posthog/core/-/core-1.5.5.tgz#fc650389b4275cec73b2e64cc2642f709bd61c39" - integrity sha512-m7G1EQTgo9xrr3lZxCp9C2egP99MSRpIDD95wYzwUPxMesKxI0xEQ+TC5LS/XOXIdmsNvsx4UcxwmzhSwD2GWA== +"@posthog/core@1.7.1": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@posthog/core/-/core-1.7.1.tgz#ec45a3b13acbe4fbf453625c83bcd38da21beeb7" + integrity sha512-kjK0eFMIpKo9GXIbts8VtAknsoZ18oZorANdtuTj1CbgS28t4ZVq//HAWhnxEuXRTrtkd+SUJ6Ux3j2Af8NCuA== dependencies: cross-spawn "^7.0.6" @@ -2996,10 +2996,10 @@ "@sentry-internal/browser-utils" "10.29.0" "@sentry/core" "10.29.0" -"@sentry/babel-plugin-component-annotate@4.6.0": - version "4.6.0" - resolved "https://registry.yarnpkg.com/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-4.6.0.tgz#355a66b20dfeca5438d34fc2b903b47fd153aa41" - integrity sha512-3soTX50JPQQ51FSbb4qvNBf4z/yP7jTdn43vMTp9E4IxvJ9HKJR7OEuKkCMszrZmWsVABXl02msqO7QisePdiQ== +"@sentry/babel-plugin-component-annotate@4.6.1": + version "4.6.1" + resolved "https://registry.yarnpkg.com/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-4.6.1.tgz#94eec0293be8289daa574e18783e64d29203c236" + integrity sha512-aSIk0vgBqv7PhX6/Eov+vlI4puCE0bRXzUG5HdCsHBpAfeMkI8Hva6kSOusnzKqs8bf04hU7s3Sf0XxGTj/1AA== "@sentry/browser@^10.0.0": version "10.29.0" @@ -3012,64 +3012,64 @@ "@sentry-internal/replay-canvas" "10.29.0" "@sentry/core" "10.29.0" -"@sentry/bundler-plugin-core@4.6.0": - version "4.6.0" - resolved "https://registry.yarnpkg.com/@sentry/bundler-plugin-core/-/bundler-plugin-core-4.6.0.tgz#6f1881ea056813e663dc8b855a564649a35263c0" - integrity sha512-Fub2XQqrS258jjS8qAxLLU1k1h5UCNJ76i8m4qZJJdogWWaF8t00KnnTyp9TEDJzrVD64tRXS8+HHENxmeUo3g== +"@sentry/bundler-plugin-core@4.6.1": + version "4.6.1" + resolved "https://registry.yarnpkg.com/@sentry/bundler-plugin-core/-/bundler-plugin-core-4.6.1.tgz#d6013e6233bf663114f581bbd3c3a380ff9311d4" + integrity sha512-WPeRbnMXm927m4Kr69NTArPfI+p5/34FHftdCRI3LFPMyhZDzz6J3wLy4hzaVUgmMf10eLzmq2HGEMvpQmdynA== dependencies: "@babel/core" "^7.18.5" - "@sentry/babel-plugin-component-annotate" "4.6.0" + "@sentry/babel-plugin-component-annotate" "4.6.1" "@sentry/cli" "^2.57.0" dotenv "^16.3.1" find-up "^5.0.0" - glob "^9.3.2" + glob "^10.5.0" magic-string "0.30.8" unplugin "1.0.1" -"@sentry/cli-darwin@2.58.1": - version "2.58.1" - resolved "https://registry.yarnpkg.com/@sentry/cli-darwin/-/cli-darwin-2.58.1.tgz#11fa19fadf21710cadebced8371368dfbc0f2609" - integrity sha512-4olophuk8VHSeybiyBVgGaYpM/4+V6Ex0jsS/P6cv6ilZ3VPK6PomuOPmdW7VP29tQHstZu/Xb3tAIDXelwjpA== +"@sentry/cli-darwin@2.58.3": + version "2.58.3" + resolved "https://registry.yarnpkg.com/@sentry/cli-darwin/-/cli-darwin-2.58.3.tgz#dfe75ef716276a23accfc917228f84777964ef37" + integrity sha512-4bnI5e07cVkG3DdTPpBJcoRjwHvf8GPCY/vBH6gGTrM+cXxGgk7jiZpkblq1ZvpW5H51mFjiO5qqMO7GNjstQA== -"@sentry/cli-linux-arm64@2.58.1": - version "2.58.1" - resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.58.1.tgz#16589f292d545cb4b6af001c51c89919e97e63fd" - integrity sha512-WIfXiyZkDH6Jdm1KsxJmvqh6WjENklyzprffdUmaNQ98p+cfBTDGWOlk9MM1EE4yryump22LQSeVC8hJrzI7vA== +"@sentry/cli-linux-arm64@2.58.3": + version "2.58.3" + resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.58.3.tgz#be87630b46090215f1afe10100ec511de6878d6e" + integrity sha512-xpn94gpy8U+JwsY4Eamlx/gNXh5YiZTmA1XT73kOUBrLs+e+qwQh6gfnzGxx7wdX9x+CJooTw8rwP4unisGALQ== -"@sentry/cli-linux-arm@2.58.1": - version "2.58.1" - resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm/-/cli-linux-arm-2.58.1.tgz#79a4ab3049b39f0edb2d96a625b48ed6735e863b" - integrity sha512-R4Tyw9yYgnf6MOrw47ad8jf2gHk/BOtOOeyyjQw/7taTVZf2r97S35WhZh1kRecxhJh/A6Cwylq+SxbeFiMYww== +"@sentry/cli-linux-arm@2.58.3": + version "2.58.3" + resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm/-/cli-linux-arm-2.58.3.tgz#2da8a797731b4a1ebf21d7a082a44aa7c84578c5" + integrity sha512-33mlrULHtxK5rjzO7YJDtXyOeMTpkZOgfcQqcjyxeDY91jSCXE0EhlBV6SGCKqvahmvh9RUgINLkQO+qc2OjDg== -"@sentry/cli-linux-i686@2.58.1": - version "2.58.1" - resolved "https://registry.yarnpkg.com/@sentry/cli-linux-i686/-/cli-linux-i686-2.58.1.tgz#e84c5efc7c8810489c1696d948bbc84e0bc8c7af" - integrity sha512-I1CjUoNYYFfeUtwI2CubNQCBJtlVEs0/BhBhU4qF/4q4JlUDBgl6mJv6M2C03/zTyqP8StuRxSKkzJa301MC3Q== +"@sentry/cli-linux-i686@2.58.3": + version "2.58.3" + resolved "https://registry.yarnpkg.com/@sentry/cli-linux-i686/-/cli-linux-i686-2.58.3.tgz#a52d0ad62a074e12fd332b3aec71ca69045dabfc" + integrity sha512-Z4qWllBAPa0Z3nO3cvw9bTIfASxo5EYjnid7MvWB99TKUTdd2+YCIJ9rP9UadZqvOE9AekF+DHdh35j9E1urOQ== -"@sentry/cli-linux-x64@2.58.1": - version "2.58.1" - resolved "https://registry.yarnpkg.com/@sentry/cli-linux-x64/-/cli-linux-x64-2.58.1.tgz#4d3dff79ff2f1f39c728a945ee8f5373f59139a8" - integrity sha512-2jR/4I8GXyhiA2eutqToZrGSBIxfagxAZXMeCEye2MSJIRfOwc8Yz49FYtP3EtWqByE6f5Smfjk52tjPCNc32w== +"@sentry/cli-linux-x64@2.58.3": + version "2.58.3" + resolved "https://registry.yarnpkg.com/@sentry/cli-linux-x64/-/cli-linux-x64-2.58.3.tgz#f7bcba26dbe259dec618a95f1726aa7453dad20b" + integrity sha512-i68RTLedYzxZ+wdh9JS8aeMCWbnJq4xYa3Rmib2lrQ9AvScBLJlFbafjYnZUy9PWiqc78PFJc5gLefPRDpIexw== -"@sentry/cli-win32-arm64@2.58.1": - version "2.58.1" - resolved "https://registry.yarnpkg.com/@sentry/cli-win32-arm64/-/cli-win32-arm64-2.58.1.tgz#f35c1c8980ca47dd618a4bab49378b66c4291bda" - integrity sha512-NKrLuHhgRcfD19y04EGY9WMSXhrqf3QQKn9MHfre4vN1UaEqpNX2adkPim94BRLzEDtFiNSZfTqHrEbou/Nxpw== +"@sentry/cli-win32-arm64@2.58.3": + version "2.58.3" + resolved "https://registry.yarnpkg.com/@sentry/cli-win32-arm64/-/cli-win32-arm64-2.58.3.tgz#cf1e04b00d043503a26f3d816e9572eaa652b0fc" + integrity sha512-en2uDEi+NLEVCfTvuivKxUSSe2jp3iKtSRFSONSRMc0p7O6SlGYflPZCVIGPXQWKSNYXdQINbefQND4d5bPzsQ== -"@sentry/cli-win32-i686@2.58.1": - version "2.58.1" - resolved "https://registry.yarnpkg.com/@sentry/cli-win32-i686/-/cli-win32-i686-2.58.1.tgz#ff914e83ab25825ac9ea2b3934c421532d4d3723" - integrity sha512-Y64LJ4jD3WpWSR6cHif514EHWpGVY76qYAGawGJlQ+7EHuPyPOwNy9qVf/1dKwTD8KNDd8goDh4VXOoYsbic7A== +"@sentry/cli-win32-i686@2.58.3": + version "2.58.3" + resolved "https://registry.yarnpkg.com/@sentry/cli-win32-i686/-/cli-win32-i686-2.58.3.tgz#b93e795c7e4351a256fd7a0f84e6c39cf60cfe08" + integrity sha512-dYWNuE+FtZXpT4aqW68/4ah2WAAz//QSQxxpuTBAQ+Wui26Mp30q5nJdYOzAckdSF8yVKjIHB0NLuIYZYHijyQ== -"@sentry/cli-win32-x64@2.58.1": - version "2.58.1" - resolved "https://registry.yarnpkg.com/@sentry/cli-win32-x64/-/cli-win32-x64-2.58.1.tgz#6b476fdca86cb37cd47b3578faf9bd74598774ef" - integrity sha512-Rc/kBryZeTAsgb0o5ygU9LaNNmzaAcitY5jfHToBBaYemciJzhpVVtSEPe6SJw1DT45MIW1PVD4XBx+YXO56Ag== +"@sentry/cli-win32-x64@2.58.3": + version "2.58.3" + resolved "https://registry.yarnpkg.com/@sentry/cli-win32-x64/-/cli-win32-x64-2.58.3.tgz#ac2a7c0785977713f77dad3a138faa61bb4094a0" + integrity sha512-D1qkHE2Mkfu9w1zyZt8M/V+yqoycJFEtp4hCv/HtLhExNtZYrdjf8LHzR0tUvEBS4Y1aw4wbox+Wh8ToOhcXbQ== "@sentry/cli@^2.57.0": - version "2.58.1" - resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-2.58.1.tgz#3d1b5b46dbad3ad3a48728ab1abdb99dacfe0775" - integrity sha512-yva4lLFvrPmqIgjbHy73vUfm8qOfLZkYGj5FyWQXCdjTV3s2HirQV1QW4Ezm4QeT8Ktu1jj14sluLELABGCvZg== + version "2.58.3" + resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-2.58.3.tgz#2ac2b0ab9556e694d6e9cf7f56559e0c3f2a99bf" + integrity sha512-3eGF2ijOuON6wbr3OrQ48+nUTLwFLOGeTixJX9GJ36aYovFnF+FvjxIvtjnWgLUgwGu33PQFGzK7S2HridVJXQ== dependencies: https-proxy-agent "^5.0.0" node-fetch "^2.6.7" @@ -3077,14 +3077,14 @@ proxy-from-env "^1.1.0" which "^2.0.2" optionalDependencies: - "@sentry/cli-darwin" "2.58.1" - "@sentry/cli-linux-arm" "2.58.1" - "@sentry/cli-linux-arm64" "2.58.1" - "@sentry/cli-linux-i686" "2.58.1" - "@sentry/cli-linux-x64" "2.58.1" - "@sentry/cli-win32-arm64" "2.58.1" - "@sentry/cli-win32-i686" "2.58.1" - "@sentry/cli-win32-x64" "2.58.1" + "@sentry/cli-darwin" "2.58.3" + "@sentry/cli-linux-arm" "2.58.3" + "@sentry/cli-linux-arm64" "2.58.3" + "@sentry/cli-linux-i686" "2.58.3" + "@sentry/cli-linux-x64" "2.58.3" + "@sentry/cli-win32-arm64" "2.58.3" + "@sentry/cli-win32-i686" "2.58.3" + "@sentry/cli-win32-x64" "2.58.3" "@sentry/core@10.29.0": version "10.29.0" @@ -3092,19 +3092,14 @@ integrity sha512-olQ2DU9dA/Bwsz3PtA9KNXRMqBWRQSkPw+MxwWEoU1K1qtiM9L0j6lbEFb5iSY3d7WYD5MB+1d5COugjSBrHtw== "@sentry/webpack-plugin@^4.0.0": - version "4.6.0" - resolved "https://registry.yarnpkg.com/@sentry/webpack-plugin/-/webpack-plugin-4.6.0.tgz#b2419b075cc377a7192b0827fc31ebcca6527beb" - integrity sha512-i9Yy2kXCbFKlRST09fV1HsI0naJAfeXxoiUPyh5iCgSo2w7ZwEUlk0tJhupnHZzfSa3OSg01+vVNeeyLYM4tdA== + version "4.6.1" + resolved "https://registry.yarnpkg.com/@sentry/webpack-plugin/-/webpack-plugin-4.6.1.tgz#8041ef27f302c3f63902bc4bb01e2ee53ea94c15" + integrity sha512-CJgT/t2pQWsPsMx9VJ86goU/orCQhL2HhDj5ZYBol6fPPoEGeTqKOPCnv/xsbCAfGSp1uHpyRLTA/Gx96u7VVA== dependencies: - "@sentry/bundler-plugin-core" "4.6.0" + "@sentry/bundler-plugin-core" "4.6.1" unplugin "1.0.1" uuid "^9.0.0" -"@sinclair/typebox@^0.27.8": - version "0.27.8" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" - integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== - "@sinclair/typebox@^0.34.0": version "0.34.41" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.34.41.tgz#aa51a6c1946df2c5a11494a2cdb9318e026db16c" @@ -3609,7 +3604,7 @@ dependencies: "@types/node" "*" -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1", "@types/istanbul-lib-coverage@^2.0.6": +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.1", "@types/istanbul-lib-coverage@^2.0.6": version "2.0.6" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== @@ -3621,7 +3616,7 @@ dependencies: "@types/istanbul-lib-coverage" "*" -"@types/istanbul-reports@^3.0.0", "@types/istanbul-reports@^3.0.4": +"@types/istanbul-reports@^3.0.4": version "3.0.4" resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== @@ -3705,10 +3700,10 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@>=13.7.0": - version "24.10.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-24.10.2.tgz#82a57476a19647d8f2c7750d0924788245e39b26" - integrity sha512-WOhQTZ4G8xZ1tjJTvKOpyEVSGgOTvJAfDK3FNFgELyaTpzhdgHVHeqW8V+UJvzF5BT+/B54T/1S2K6gd9c7bbA== +"@types/node@*": + version "25.0.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-25.0.0.tgz#c0e0022c3c7b41635c49322e6b3a0279fffa7d62" + integrity sha512-rl78HwuZlaDIUSeUKkmogkhebA+8K1Hy7tddZuJ3D0xV8pZSfsYGTsliGUol1JPzu9EKnTxPC4L1fiWouStRew== dependencies: undici-types "~7.16.0" @@ -3719,6 +3714,13 @@ dependencies: undici-types "~5.26.4" +"@types/node@>=13.7.0": + version "24.10.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-24.10.2.tgz#82a57476a19647d8f2c7750d0924788245e39b26" + integrity sha512-WOhQTZ4G8xZ1tjJTvKOpyEVSGgOTvJAfDK3FNFgELyaTpzhdgHVHeqW8V+UJvzF5BT+/B54T/1S2K6gd9c7bbA== + dependencies: + undici-types "~7.16.0" + "@types/normalize-package-data@^2.4.0": version "2.4.4" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" @@ -3925,16 +3927,9 @@ integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^17.0.33": - version "17.0.34" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.34.tgz#1c2f9635b71d5401827373a01ce2e8a7670ea839" - integrity sha512-KExbHVa92aJpw9WDQvzBaGVE2/Pz+pLZQloT2hjL8IqsZnV62rlPOYvNnLmf/L2dyllfVUOVBj64M0z/46eR2A== - dependencies: - "@types/yargs-parser" "*" - -"@types/yargs@^17.0.8": - version "17.0.33" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" - integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== + version "17.0.35" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.35.tgz#07013e46aa4d7d7d50a49e15604c1c5340d4eb24" + integrity sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg== dependencies: "@types/yargs-parser" "*" @@ -4492,7 +4487,7 @@ acorn@^8.0.4, acorn@^8.11.0, acorn@^8.9.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.13.0.tgz#2a30d670818ad16ddd6a35d3842dacec9e5d7ca3" integrity sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w== -acorn@^8.14.0, acorn@^8.15.0, acorn@^8.8.1: +acorn@^8.15.0, acorn@^8.8.1: version "8.15.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== @@ -5050,9 +5045,9 @@ base64-js@^1.3.1: integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== baseline-browser-mapping@^2.9.0: - version "2.9.5" - resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.9.5.tgz#47f9549e0be1a84cd16651ac4c3b7d87a71408e6" - integrity sha512-D5vIoztZOq1XM54LUdttJVc96ggEsIfju2JBvht06pSzpckp3C7HReun67Bghzrtdsq9XdMGbSSB3v3GhMNmAA== + version "2.9.6" + resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.9.6.tgz#82de0f7ee5860df86d60daf0d9524ae7227eeee7" + integrity sha512-v9BVVpOTLB59C9E7aSnmIF8h7qRsFpx+A2nugVMTszEOMcfjlZMsXRm4LF23I3Z9AJxc8ANpIvzbzONoX9VJlg== batch@0.6.1: version "0.6.1" @@ -5177,7 +5172,7 @@ braces@^3.0.3, braces@~3.0.2: dependencies: fill-range "^7.1.1" -browserslist@^4.0.0, browserslist@^4.23.1, browserslist@^4.23.2, browserslist@^4.23.3, browserslist@^4.24.0, browserslist@^4.24.3, browserslist@^4.26.3: +browserslist@^4.0.0, browserslist@^4.23.1, browserslist@^4.23.2, browserslist@^4.23.3, browserslist@^4.24.0, browserslist@^4.24.3, browserslist@^4.26.3, browserslist@^4.27.0: version "4.28.1" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.1.tgz#7f534594628c53c63101079e27e40de490456a95" integrity sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA== @@ -5255,17 +5250,16 @@ bytes@3.1.2, bytes@^3.1.2, bytes@~3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -cacheable@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cacheable/-/cacheable-2.1.0.tgz#539a24a71d16302d09636702bbae1ab6fb7b159b" - integrity sha512-zzL1BxdnqwD69JRT0dihnawAcLkBMwAH+hZSKjUzeBbPedVhk3qYPjRw9VOMYWwt5xRih5xd8S+3kEdGohZm/g== +cacheable@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cacheable/-/cacheable-2.3.0.tgz#4b4737cfff71df9834d8be75284860bf3abc85ec" + integrity sha512-HHiAvOBmlcR2f3SQ7kdlYD8+AUJG+wlFZ/Ze8tl1Vzvz0MdOh8IYA/EFU4ve8t1/sZ0j4MGi7ST5MoTwHessQA== dependencies: - "@cacheable/memoize" "^2.0.3" - "@cacheable/memory" "^2.0.3" - "@cacheable/utils" "^2.1.0" - hookified "^1.12.1" - keyv "^5.5.3" - qified "^0.5.0" + "@cacheable/memory" "^2.0.6" + "@cacheable/utils" "^2.3.2" + hookified "^1.13.0" + keyv "^5.5.4" + qified "^0.5.2" call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: version "1.0.2" @@ -5402,7 +5396,7 @@ chrome-trace-event@^1.0.2: resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== -ci-info@^3.2.0, ci-info@^3.7.0: +ci-info@^3.7.0: version "3.9.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== @@ -5529,12 +5523,17 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" +commander@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906" + integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== + commander@^12.1.0: version "12.1.0" resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== -commander@^14.0.1: +commander@^14.0.2: version "14.0.2" resolved "https://registry.yarnpkg.com/commander/-/commander-14.0.2.tgz#b71fd37fe4069e4c3c7c13925252ada4eba14e8e" integrity sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ== @@ -5689,9 +5688,9 @@ core-js-compat@^3.43.0: browserslist "^4.26.3" core-js@^3.0.0, core-js@^3.38.1: - version "3.46.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.46.0.tgz#323a092b96381a9184d0cd49ee9083b2f93373bb" - integrity sha512-vDMm9B0xnqqZ8uSBpZ8sNtRtOdmfShrvT6h2TuQGLs0Is+cR0DYbj/KWP6ALVNbWPpqA/qPLoOuppJN07humpA== + version "3.47.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.47.0.tgz#436ef07650e191afeb84c24481b298bd60eb4a17" + integrity sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg== core-util-is@~1.0.0: version "1.0.3" @@ -5793,9 +5792,9 @@ css-box-model@^1.2.0: tiny-invariant "^1.0.6" css-declaration-sorter@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz#6dec1c9523bc4a643e088aab8f09e67a54961024" - integrity sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow== + version "7.3.0" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-7.3.0.tgz#edc45c36bcdfea0788b1d4452829f142ef1c4a4a" + integrity sha512-LQF6N/3vkAMYF4xoHLJfG718HRJh34Z8BnNhd6bosOMIVjMlhuZK5++oZa3uYAgrI5+7x2o27gUqTR2U/KjUOQ== css-functions-list@^3.2.3: version "3.2.3" @@ -5826,13 +5825,13 @@ css-loader@^7.0.0: semver "^7.5.4" css-minimizer-webpack-plugin@^7.0.0: - version "7.0.2" - resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-7.0.2.tgz#aa1b01c6033f5b2f86ddb60c1f5bddd012b50cac" - integrity sha512-nBRWZtI77PBZQgcXMNqiIXVshiQOVLGSf2qX/WZfG8IQfMbeHUMXaBWQmiiSTmPJUflQxHjZjzAmuyO7tpL2Jg== + version "7.0.3" + resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-7.0.3.tgz#2da02f79ed5af0f81ac67a39a39bc430c75a0d0d" + integrity sha512-O99EbZ3P9YqfjWPvaL5Ndr54hP1V1N9IRKDLzKpEm1cw5eYF5KTFvz63Wm/AGDz841ceGmLvU1rdN8LrElMIiQ== dependencies: "@jridgewell/trace-mapping" "^0.3.25" cssnano "^7.0.4" - jest-worker "^29.7.0" + jest-worker "^30.0.5" postcss "^8.4.40" schema-utils "^4.2.0" serialize-javascript "^6.0.2" @@ -5854,9 +5853,9 @@ css-select@^4.1.3: nth-check "^2.0.1" css-select@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" - integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + version "5.2.2" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.2.2.tgz#01b6e8d163637bb2dd6c982ca4ed65863682786e" + integrity sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw== dependencies: boolbase "^1.0.0" css-what "^6.1.0" @@ -5888,16 +5887,11 @@ css-tree@~2.2.0: mdn-data "2.0.28" source-map-js "^1.0.1" -css-what@^6.0.1: +css-what@^6.0.1, css-what@^6.1.0: version "6.2.2" resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.2.2.tgz#cdcc8f9b6977719fdfbd1de7aec24abf756b9dea" integrity sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA== -css-what@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" - integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== - css.escape@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" @@ -5918,54 +5912,54 @@ cssfontparser@^1.2.1: resolved "https://registry.yarnpkg.com/cssfontparser/-/cssfontparser-1.2.1.tgz#f4022fc8f9700c68029d542084afbaf425a3f3e3" integrity sha512-6tun4LoZnj7VN6YeegOVb67KBX/7JJsqvj+pv3ZA7F878/eN33AbGa5b/S/wXxS/tcp8nc40xRUrsPlxIyNUPg== -cssnano-preset-default@^7.0.6: - version "7.0.6" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-7.0.6.tgz#0220fa7507478369aa2a226bac03e1204cd024c1" - integrity sha512-ZzrgYupYxEvdGGuqL+JKOY70s7+saoNlHSCK/OGn1vB2pQK8KSET8jvenzItcY+kA7NoWvfbb/YhlzuzNKjOhQ== +cssnano-preset-default@^7.0.10: + version "7.0.10" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-7.0.10.tgz#4fb6ee962c0852a03084e8c7a4b60fb0e2db45e0" + integrity sha512-6ZBjW0Lf1K1Z+0OKUAUpEN62tSXmYChXWi2NAA0afxEVsj9a+MbcB1l5qel6BHJHmULai2fCGRthCeKSFbScpA== dependencies: - browserslist "^4.23.3" + browserslist "^4.27.0" css-declaration-sorter "^7.2.0" - cssnano-utils "^5.0.0" - postcss-calc "^10.0.2" - postcss-colormin "^7.0.2" - postcss-convert-values "^7.0.4" - postcss-discard-comments "^7.0.3" - postcss-discard-duplicates "^7.0.1" - postcss-discard-empty "^7.0.0" - postcss-discard-overridden "^7.0.0" - postcss-merge-longhand "^7.0.4" - postcss-merge-rules "^7.0.4" - postcss-minify-font-values "^7.0.0" - postcss-minify-gradients "^7.0.0" - postcss-minify-params "^7.0.2" - postcss-minify-selectors "^7.0.4" - postcss-normalize-charset "^7.0.0" - postcss-normalize-display-values "^7.0.0" - postcss-normalize-positions "^7.0.0" - postcss-normalize-repeat-style "^7.0.0" - postcss-normalize-string "^7.0.0" - postcss-normalize-timing-functions "^7.0.0" - postcss-normalize-unicode "^7.0.2" - postcss-normalize-url "^7.0.0" - postcss-normalize-whitespace "^7.0.0" - postcss-ordered-values "^7.0.1" - postcss-reduce-initial "^7.0.2" - postcss-reduce-transforms "^7.0.0" - postcss-svgo "^7.0.1" - postcss-unique-selectors "^7.0.3" + cssnano-utils "^5.0.1" + postcss-calc "^10.1.1" + postcss-colormin "^7.0.5" + postcss-convert-values "^7.0.8" + postcss-discard-comments "^7.0.5" + postcss-discard-duplicates "^7.0.2" + postcss-discard-empty "^7.0.1" + postcss-discard-overridden "^7.0.1" + postcss-merge-longhand "^7.0.5" + postcss-merge-rules "^7.0.7" + postcss-minify-font-values "^7.0.1" + postcss-minify-gradients "^7.0.1" + postcss-minify-params "^7.0.5" + postcss-minify-selectors "^7.0.5" + postcss-normalize-charset "^7.0.1" + postcss-normalize-display-values "^7.0.1" + postcss-normalize-positions "^7.0.1" + postcss-normalize-repeat-style "^7.0.1" + postcss-normalize-string "^7.0.1" + postcss-normalize-timing-functions "^7.0.1" + postcss-normalize-unicode "^7.0.5" + postcss-normalize-url "^7.0.1" + postcss-normalize-whitespace "^7.0.1" + postcss-ordered-values "^7.0.2" + postcss-reduce-initial "^7.0.5" + postcss-reduce-transforms "^7.0.1" + postcss-svgo "^7.1.0" + postcss-unique-selectors "^7.0.4" -cssnano-utils@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-5.0.0.tgz#b53a0343dd5d21012911882db6ae7d2eae0e3687" - integrity sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ== +cssnano-utils@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-5.0.1.tgz#f529e9aa0d7930512ca45b9e2ddb8d6b9092eb30" + integrity sha512-ZIP71eQgG9JwjVZsTPSqhc6GHgEr53uJ7tK5///VfyWj6Xp2DBmixWHqJgPno+PqATzn48pL42ww9x5SSGmhZg== cssnano@^7.0.4: - version "7.0.6" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-7.0.6.tgz#63d54fd42bc017f6aaed69e47d9aaef85b7850ec" - integrity sha512-54woqx8SCbp8HwvNZYn68ZFAepuouZW4lTwiMVnBErM3VkO7/Sd4oTOt3Zz3bPx3kxQ36aISppyXj2Md4lg8bw== + version "7.1.2" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-7.1.2.tgz#a8a533a8f509d74b2d22e73d80ec1294f65fdc70" + integrity sha512-HYOPBsNvoiFeR1eghKD5C3ASm64v9YVyJB4Ivnl2gqKoQYvjjN/G0rztvKQq8OxocUtC6sjqY8jwYngIB4AByA== dependencies: - cssnano-preset-default "^7.0.6" - lilconfig "^3.1.2" + cssnano-preset-default "^7.0.10" + lilconfig "^3.1.3" csso@^5.0.5: version "5.0.5" @@ -7302,12 +7296,12 @@ fflate@^0.4.8: resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.4.8.tgz#f90b82aefbd8ac174213abb338bd7ef848f0f5ae" integrity sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA== -file-entry-cache@^10.1.4: - version "10.1.4" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-10.1.4.tgz#1e81441517dc33ba5fe14421d96dc5fe7e37e820" - integrity sha512-5XRUFc0WTtUbjfGzEwXc42tiGxQHBmtbUG1h9L2apu4SulCGN3Hqm//9D6FAolf8MYNL7f/YlJl9vy08pj5JuA== +file-entry-cache@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-11.1.1.tgz#728918c624dbeb09372276837ea0c413ec78806b" + integrity sha512-TPVFSDE7q91Dlk1xpFLvFllf8r0HyOMOlnWy7Z2HBku5H3KhIeOGInexrIeg2D64DosVB/JXkrrk6N/7Wriq4A== dependencies: - flat-cache "^6.1.13" + flat-cache "^6.1.19" file-entry-cache@^6.0.1: version "6.0.1" @@ -7410,14 +7404,14 @@ flat-cache@^3.0.4: keyv "^4.5.3" rimraf "^3.0.2" -flat-cache@^6.1.13: - version "6.1.18" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-6.1.18.tgz#da3fea921032680ba9519bd8d12886107f92e97f" - integrity sha512-JUPnFgHMuAVmLmoH9/zoZ6RHOt5n9NlUw/sDXsTbROJ2SFoS2DS4s+swAV6UTeTbGH/CAsZIE6M8TaG/3jVxgQ== +flat-cache@^6.1.19: + version "6.1.19" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-6.1.19.tgz#20e5b201c9b181a7b773b3b150108932077d2bbf" + integrity sha512-l/K33newPTZMTGAnnzaiqSl6NnH7Namh8jBNjrgjprWxGmZUuxx/sJNIRaijOh3n7q7ESbhNZC+pvVZMFdeU4A== dependencies: - cacheable "^2.1.0" + cacheable "^2.2.0" flatted "^3.3.3" - hookified "^1.12.0" + hookified "^1.13.0" flat@^5.0.2: version "5.0.2" @@ -7677,7 +7671,7 @@ glob-to-regexp@^0.4.0, glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^10.0.0: +glob@^10.0.0, glob@^10.5.0: version "10.5.0" resolved "https://registry.yarnpkg.com/glob/-/glob-10.5.0.tgz#8ec0355919cd3338c28428a23d4f24ecc5fe738c" integrity sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg== @@ -7701,18 +7695,6 @@ glob@^10.3.10: package-json-from-dist "^1.0.0" path-scurry "^1.11.1" -glob@^11.0.3: - version "11.0.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-11.0.3.tgz#9d8087e6d72ddb3c4707b1d2778f80ea3eaefcd6" - integrity sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA== - dependencies: - foreground-child "^3.3.1" - jackspeak "^4.1.1" - minimatch "^10.0.3" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^2.0.0" - glob@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/glob/-/glob-11.1.0.tgz#4f826576e4eb99c7dad383793d2f9f08f67e50a6" @@ -7725,6 +7707,15 @@ glob@^11.1.0: package-json-from-dist "^1.0.0" path-scurry "^2.0.0" +glob@^13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-13.0.0.tgz#9d9233a4a274fc28ef7adce5508b7ef6237a1be3" + integrity sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA== + dependencies: + minimatch "^10.1.1" + minipass "^7.1.2" + path-scurry "^2.0.0" + glob@^7.1.3, glob@^7.1.4: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" @@ -7737,16 +7728,6 @@ glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^9.3.2: - version "9.3.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.5.tgz#ca2ed8ca452781a3009685607fdf025a899dfe21" - integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== - dependencies: - fs.realpath "^1.0.0" - minimatch "^8.0.2" - minipass "^4.2.4" - path-scurry "^1.6.1" - global-modules@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" @@ -7805,7 +7786,7 @@ gopd@^1.0.1, gopd@^1.2.0: resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -7861,6 +7842,13 @@ has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: dependencies: has-symbols "^1.0.3" +hashery@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/hashery/-/hashery-1.3.0.tgz#2af169f1698efc92bf9235c4880eec92cc5b5107" + integrity sha512-fWltioiy5zsSAs9ouEnvhsVJeAXRybGCNNv0lvzpzNOSDbULXRy7ivFWwCCv4I5Am6kSo75hmbsCduOoc2/K4w== + dependencies: + hookified "^1.13.0" + hasown@^2.0.0, hasown@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" @@ -7897,10 +7885,10 @@ hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: dependencies: react-is "^16.7.0" -hookified@^1.12.0, hookified@^1.12.1: - version "1.12.1" - resolved "https://registry.yarnpkg.com/hookified/-/hookified-1.12.1.tgz#b0de0116ca346fd6c4e55db901f52d5cd728ef00" - integrity sha512-xnKGl+iMIlhrZmGHB729MqlmPoWBznctSQTYCpFKqNsCgimJQmithcW0xSQMMFzYnV2iKUh25alswn6epgxS0Q== +hookified@^1.13.0: + version "1.14.0" + resolved "https://registry.yarnpkg.com/hookified/-/hookified-1.14.0.tgz#815ca3b9f3e77c782f583bf3974e966df7a9fd7b" + integrity sha512-pi1ynXIMFx/uIIwpWJ/5CEtOHLGtnUB0WhGeeYT+fKcQ+WCQbm3/rrkAXnpfph++PgepNqPdTC2WTj8A6k6zoQ== hosted-git-info@^2.1.4: version "2.8.9" @@ -7917,10 +7905,10 @@ hpack.js@^2.1.6: readable-stream "^2.0.1" wbuf "^1.1.0" -html-dom-parser@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/html-dom-parser/-/html-dom-parser-5.1.1.tgz#9efb2cfa055f6a71de1bb2f07c5b019db5004f9e" - integrity sha512-+o4Y4Z0CLuyemeccvGN4bAO20aauB2N9tFEAep5x4OW34kV4PTarBHm6RL02afYt2BMKcr0D2Agep8S3nJPIBg== +html-dom-parser@5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/html-dom-parser/-/html-dom-parser-5.1.2.tgz#0fceac1b8e7d917de6e883991b7d71f0b3fd63b9" + integrity sha512-9nD3Rj3/FuQt83AgIa1Y3ruzspwFFA54AJbQnohXN+K6fL1/bhcDQJJY5Ne4L4A163ADQFVESd/0TLyNoV0mfg== dependencies: domhandler "5.0.3" htmlparser2 "10.0.0" @@ -7956,14 +7944,14 @@ html-minifier-terser@^6.0.2: terser "^5.10.0" html-react-parser@^5.2.2: - version "5.2.8" - resolved "https://registry.yarnpkg.com/html-react-parser/-/html-react-parser-5.2.8.tgz#96bc08c669c8ffb1f24e1f256924eaa1de52e4b6" - integrity sha512-09WaI81tbpwhXWeMe1m9VptZVJUcigo0l59zVt+2HUIQT7+baU38/oNhllj6MKhOuGXqh0nrlwOgxbxbm6xXHw== + version "5.2.10" + resolved "https://registry.yarnpkg.com/html-react-parser/-/html-react-parser-5.2.10.tgz#e149447000b044e2828547fa13b9926761420896" + integrity sha512-DjOLloguuDA+Ed7Q7PKhvMQmCl2+Yk/pfvvca68fvn15QFBbL4uHGxXwoXQ4sqS0UyuRH2lJb0S8yZCL3lvehQ== dependencies: domhandler "5.0.3" - html-dom-parser "5.1.1" + html-dom-parser "5.1.2" react-property "2.0.2" - style-to-js "1.1.19" + style-to-js "1.1.21" html-tags@^3.3.1: version "3.3.1" @@ -7971,9 +7959,9 @@ html-tags@^3.3.1: integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== html-webpack-plugin@^5.5.3: - version "5.6.4" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.4.tgz#d8cb0f7edff7745ae7d6cccb0bff592e9f7f7959" - integrity sha512-V/PZeWsqhfpE27nKeX9EO2sbR+D17A+tLf6qU+ht66jdUsN0QLKJN27Z+1+gHrVMKgndBahes0PU6rRihDgHTw== + version "5.6.5" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.5.tgz#d57defb83cabbf29bf56b2d4bf10b67b650066be" + integrity sha512-4xynFbKNNk+WlzXeQQ+6YYsH2g7mpfPszQZUi3ovKlj+pDmngQ7vRXjrrmGROabmKwyQkcgcX5hqfOwHbFmK5g== dependencies: "@types/html-minifier-terser" "^6.0.0" html-minifier-terser "^6.0.2" @@ -8227,10 +8215,10 @@ ini@^1.3.5: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -inline-style-parser@0.2.6: - version "0.2.6" - resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.2.6.tgz#e6bbb5288a635f6284a6249ce754da55c4bd1ff5" - integrity sha512-gtGXVaBdl5mAes3rPcMedEBm12ibjt1kDMFfheul1wUAOVEJW60voNdMVzVkfLN06O7ZaD/rxhfKgtlgtTbMjg== +inline-style-parser@0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.2.7.tgz#b1fc68bfc0313b8685745e4464e37f9376b9c909" + integrity sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA== internal-slot@^1.1.0: version "1.1.0" @@ -9036,18 +9024,6 @@ jest-util@30.2.0: graceful-fs "^4.2.11" picomatch "^4.0.2" -jest-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" - integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - jest-validate@30.2.0: version "30.2.0" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-30.2.0.tgz#273eaaed4c0963b934b5b31e96289edda6e0a2ef" @@ -9074,7 +9050,7 @@ jest-watcher@30.2.0: jest-util "30.2.0" string-length "^4.0.2" -jest-worker@30.2.0: +jest-worker@30.2.0, jest-worker@^30.0.5: version "30.2.0" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-30.2.0.tgz#fd5c2a36ff6058ec8f74366ec89538cc99539d26" integrity sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g== @@ -9094,16 +9070,6 @@ jest-worker@^27.4.5: merge-stream "^2.0.0" supports-color "^8.0.0" -jest-worker@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" - integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== - dependencies: - "@types/node" "*" - jest-util "^29.7.0" - merge-stream "^2.0.0" - supports-color "^8.0.0" - jest@^30.0.0: version "30.2.0" resolved "https://registry.yarnpkg.com/jest/-/jest-30.2.0.tgz#9f0a71e734af968f26952b5ae4b724af82681630" @@ -9142,10 +9108,10 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== +js-yaml@^4.1.0, js-yaml@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.1.tgz#854c292467705b699476e1a2decc0c8a3458806b" + integrity sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA== dependencies: argparse "^2.0.1" @@ -9288,9 +9254,9 @@ jwt-decode@4.0.0, jwt-decode@^4.0.0: integrity sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA== katex@^0.16.0: - version "0.16.25" - resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.25.tgz#61699984277e3bdb3e89e0e446b83cd0a57d87db" - integrity sha512-woHRUZ/iF23GBP1dkDQMh1QBad9dmr8/PAwNA54VrSOVYgI12MAcE14TqnDdQOdzyEonGzMepYnqBMYdsoAr8Q== + version "0.16.27" + resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.27.tgz#4ecf6f620e0ca1c1a5de722e85fcdcec49086a48" + integrity sha512-aeQoDkuRWSqQN6nSvVCEFvfXdqo1OQiCmmW1kc9xSdjutPv7BGO7pqY9sQRJpMOGrEdfDgF2TfRXe5eUAD2Waw== dependencies: commander "^8.3.0" @@ -9306,10 +9272,10 @@ keyv@^4.5.3: dependencies: json-buffer "3.0.1" -keyv@^5.5.3: - version "5.5.3" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-5.5.3.tgz#db7b7f89b3e13ade5a8d0fe59d765aebb596e84b" - integrity sha512-h0Un1ieD+HUrzBH6dJXhod3ifSghk5Hw/2Y4/KHBziPlZecrFyE9YOTPU6eOs0V9pYl8gOs86fkr/KN8lUX39A== +keyv@^5.5.4: + version "5.5.5" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-5.5.5.tgz#a975b32fc03e300a0e443c705b103d8b05220834" + integrity sha512-FA5LmZVF1VziNc0bIdCSA1IoSVnDCqE8HJIZZv2/W8YmoAM50+tnUgJR/gQZwEeIMleuIOnRnHA/UaZRNeV4iQ== dependencies: "@keyv/serialize" "^1.1.1" @@ -9326,28 +9292,23 @@ klaw-sync@^6.0.0: graceful-fs "^4.1.11" knip@^5.36.2: - version "5.69.0" - resolved "https://registry.yarnpkg.com/knip/-/knip-5.69.0.tgz#5a3fe24d1c3161c031eb9142dd9209be4c0c554e" - integrity sha512-aJHQIR+QC3XUnwohqGvyT0VidvKOD8WYk4kfLr5oKnQH/P06jY6rH/HMriwPmvrAWquGV2vKyLv6XgC/GolYtw== + version "5.73.3" + resolved "https://registry.yarnpkg.com/knip/-/knip-5.73.3.tgz#a92c5df99e59291043249006a9d036ca4b6a43f5" + integrity sha512-676xuqNQidE9yZeUUX7lJeZ0d1N7QBTbmO1J0p+SyuXlbpdE4pd8Ql3WVMvrvaaaG2z/+3ExeFNm0Q9mVIjuKw== dependencies: "@nodelib/fs.walk" "^1.2.3" fast-glob "^3.3.3" formatly "^0.3.0" jiti "^2.6.0" - js-yaml "^4.1.0" + js-yaml "^4.1.1" minimist "^1.2.8" - oxc-resolver "^11.12.0" + oxc-resolver "^11.15.0" picocolors "^1.1.1" picomatch "^4.0.1" - smol-toml "^1.4.1" - strip-json-comments "5.0.2" + smol-toml "^1.5.2" + strip-json-comments "5.0.3" zod "^4.1.11" -known-css-properties@^0.36.0: - version "0.36.0" - resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.36.0.tgz#5c4365f3c9549ca2e813d2e729e6c47ef6a6cb60" - integrity sha512-A+9jP+IUmuQsNdsLdcg6Yt7voiMF/D4K83ew0OpJtpu+l34ef7LaohWV0Rc6KNvzw6ZDizkqfyB5JznZnzuKQA== - known-css-properties@^0.37.0: version "0.37.0" resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.37.0.tgz#10ebe49b9dbb6638860ff8a002fb65a053f4aec5" @@ -9400,7 +9361,7 @@ lie@~3.3.0: dependencies: immediate "~3.0.5" -lilconfig@^3.1.2: +lilconfig@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== @@ -9438,11 +9399,11 @@ linkifyjs@4.3.2: integrity sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA== lint-staged@^16.0.0: - version "16.2.6" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-16.2.6.tgz#760675e80f4b53337083d3f8bdecdd1f88079bf5" - integrity sha512-s1gphtDbV4bmW1eylXpVMk2u7is7YsrLl8hzrtvC70h4ByhcMLZFY01Fx05ZUDNuv1H8HO4E+e2zgejV1jVwNw== + version "16.2.7" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-16.2.7.tgz#c4a635960c17b52fe774f1f40aee8ce1bd86531f" + integrity sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow== dependencies: - commander "^14.0.1" + commander "^14.0.2" listr2 "^9.0.5" micromatch "^4.0.8" nano-spawn "^2.0.0" @@ -9462,7 +9423,7 @@ listr2@^9.0.5: rfdc "^1.4.1" wrap-ansi "^9.0.0" -loader-runner@^4.2.0: +loader-runner@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.1.tgz#6c76ed29b0ccce9af379208299f07f876de737e3" integrity sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q== @@ -9643,9 +9604,9 @@ makeerror@1.0.12: tmpl "1.0.5" maplibre-gl@^5.0.0: - version "5.12.0" - resolved "https://registry.yarnpkg.com/maplibre-gl/-/maplibre-gl-5.12.0.tgz#9ff1fb45f25602af1c97c07b509388a0addfd5cf" - integrity sha512-2B/H+DpjDO2NzsvNQYVIuKPyijhYJW/Hk3W+6BloAzXhm6nqXC3gVrntPPgP6hRH8f8j23nbNLOtM6OKplHwRQ== + version "5.14.0" + resolved "https://registry.yarnpkg.com/maplibre-gl/-/maplibre-gl-5.14.0.tgz#4354d460e3bc5c11fbc5c5ae358dbe4561271720" + integrity sha512-O2ok6N/bQ9NA9nJ22r/PRQQYkUe9JwfDMjBPkQ+8OwsVH4TpA5skIAM2wc0k+rni5lVbAVONVyBvgi1rF2vEPA== dependencies: "@mapbox/geojson-rewind" "^0.5.2" "@mapbox/jsonlint-lines-primitives" "^2.0.2" @@ -9655,8 +9616,8 @@ maplibre-gl@^5.0.0: "@mapbox/vector-tile" "^2.0.4" "@mapbox/whoots-js" "^3.1.0" "@maplibre/maplibre-gl-style-spec" "^24.3.1" - "@maplibre/mlt" "^1.1.0" - "@maplibre/vt-pbf" "^4.0.3" + "@maplibre/mlt" "^1.1.2" + "@maplibre/vt-pbf" "^4.1.0" "@types/geojson" "^7946.0.16" "@types/geojson-vt" "3.2.5" "@types/supercluster" "^7.1.3" @@ -9755,10 +9716,10 @@ mdn-data@2.12.2: resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.12.2.tgz#9ae6c41a9e65adf61318b32bff7b64fbfb13f8cf" integrity sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA== -mdn-data@^2.21.0: - version "2.21.0" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.21.0.tgz#f3a495e8b1e60cb4fbeaf9136aefba2f987a56e1" - integrity sha512-+ZKPQezM5vYJIkCxaC+4DTnRrVZR1CgsKLu5zsQERQx6Tea8Y+wMx5A24rq8A8NepCeatIQufVAekKNgiBMsGQ== +mdn-data@^2.25.0: + version "2.25.0" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.25.0.tgz#d45610fae17b222d600bbef3136bd6155ac9cc16" + integrity sha512-T2LPsjgUE/tgMmRXREVmwsux89DwWfNjiynOeXuLd2mX6jphGQ2YE3Ukz7LQ2VOFKiVZU/Ee1GqzHiipZCjymw== mdurl@^1.0.1, mdurl@~1.0.1: version "1.0.1" @@ -9895,7 +9856,7 @@ minimalistic-assert@^1.0.0: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@^10.0.3, minimatch@^10.1.1: +minimatch@^10.1.1: version "10.1.1" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.1.1.tgz#e6e61b9b0c1dcab116b5a7d1458e8b6ae9e73a55" integrity sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ== @@ -9916,13 +9877,6 @@ minimatch@^5.0.1, minimatch@^5.1.0: dependencies: brace-expansion "^2.0.1" -minimatch@^8.0.2: - version "8.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-8.0.4.tgz#847c1b25c014d4e9a7f68aaf63dedd668a626229" - integrity sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA== - dependencies: - brace-expansion "^2.0.1" - minimatch@^9.0.4: version "9.0.5" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" @@ -9935,11 +9889,6 @@ minimist@^1.2.0, minimist@^1.2.6, minimist@^1.2.8, minimist@~1.2.8: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -minipass@^4.2.4: - version "4.2.8" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.8.tgz#f0010f64393ecfc1d1ccb5f582bcaf45f48e1a3a" - integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== - "minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" @@ -10020,7 +9969,7 @@ nano-spawn@^2.0.0: resolved "https://registry.yarnpkg.com/nano-spawn/-/nano-spawn-2.0.0.tgz#f1250434c09ae18870d4f729fc54b406cf85a3e1" integrity sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw== -nanoid@^3.3.11, nanoid@^3.3.8: +nanoid@^3.3.11: version "3.3.11" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== @@ -10289,30 +10238,31 @@ own-keys@^1.0.1: object-keys "^1.1.1" safe-push-apply "^1.0.0" -oxc-resolver@^11.12.0: - version "11.13.2" - resolved "https://registry.yarnpkg.com/oxc-resolver/-/oxc-resolver-11.13.2.tgz#df613c8a0420dc63fc24686328a70822eddc3295" - integrity sha512-1SXVyYQ9bqMX3uZo8Px81EG7jhZkO9PvvR5X9roY5TLYVm4ZA7pbPDNlYaDBBeF9U+YO3OeMNoHde52hrcCu8w== +oxc-resolver@^11.15.0: + version "11.15.0" + resolved "https://registry.yarnpkg.com/oxc-resolver/-/oxc-resolver-11.15.0.tgz#fcb2fadda0a04460e6ef50bb60abace2b7937510" + integrity sha512-Hk2J8QMYwmIO9XTCUiOH00+Xk2/+aBxRUnhrSlANDyCnLYc32R1WSIq1sU2yEdlqd53FfMpPEpnBYIKQMzliJw== optionalDependencies: - "@oxc-resolver/binding-android-arm-eabi" "11.13.2" - "@oxc-resolver/binding-android-arm64" "11.13.2" - "@oxc-resolver/binding-darwin-arm64" "11.13.2" - "@oxc-resolver/binding-darwin-x64" "11.13.2" - "@oxc-resolver/binding-freebsd-x64" "11.13.2" - "@oxc-resolver/binding-linux-arm-gnueabihf" "11.13.2" - "@oxc-resolver/binding-linux-arm-musleabihf" "11.13.2" - "@oxc-resolver/binding-linux-arm64-gnu" "11.13.2" - "@oxc-resolver/binding-linux-arm64-musl" "11.13.2" - "@oxc-resolver/binding-linux-ppc64-gnu" "11.13.2" - "@oxc-resolver/binding-linux-riscv64-gnu" "11.13.2" - "@oxc-resolver/binding-linux-riscv64-musl" "11.13.2" - "@oxc-resolver/binding-linux-s390x-gnu" "11.13.2" - "@oxc-resolver/binding-linux-x64-gnu" "11.13.2" - "@oxc-resolver/binding-linux-x64-musl" "11.13.2" - "@oxc-resolver/binding-wasm32-wasi" "11.13.2" - "@oxc-resolver/binding-win32-arm64-msvc" "11.13.2" - "@oxc-resolver/binding-win32-ia32-msvc" "11.13.2" - "@oxc-resolver/binding-win32-x64-msvc" "11.13.2" + "@oxc-resolver/binding-android-arm-eabi" "11.15.0" + "@oxc-resolver/binding-android-arm64" "11.15.0" + "@oxc-resolver/binding-darwin-arm64" "11.15.0" + "@oxc-resolver/binding-darwin-x64" "11.15.0" + "@oxc-resolver/binding-freebsd-x64" "11.15.0" + "@oxc-resolver/binding-linux-arm-gnueabihf" "11.15.0" + "@oxc-resolver/binding-linux-arm-musleabihf" "11.15.0" + "@oxc-resolver/binding-linux-arm64-gnu" "11.15.0" + "@oxc-resolver/binding-linux-arm64-musl" "11.15.0" + "@oxc-resolver/binding-linux-ppc64-gnu" "11.15.0" + "@oxc-resolver/binding-linux-riscv64-gnu" "11.15.0" + "@oxc-resolver/binding-linux-riscv64-musl" "11.15.0" + "@oxc-resolver/binding-linux-s390x-gnu" "11.15.0" + "@oxc-resolver/binding-linux-x64-gnu" "11.15.0" + "@oxc-resolver/binding-linux-x64-musl" "11.15.0" + "@oxc-resolver/binding-openharmony-arm64" "11.15.0" + "@oxc-resolver/binding-wasm32-wasi" "11.15.0" + "@oxc-resolver/binding-win32-arm64-msvc" "11.15.0" + "@oxc-resolver/binding-win32-ia32-msvc" "11.15.0" + "@oxc-resolver/binding-win32-x64-msvc" "11.15.0" p-limit@^2.2.0: version "2.3.0" @@ -10475,7 +10425,7 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-scurry@^1.11.1, path-scurry@^1.6.1: +path-scurry@^1.11.1: version "1.11.1" resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== @@ -10528,7 +10478,7 @@ picocolors@1.1.1, picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.0, picoc resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -10608,7 +10558,7 @@ postcss-attribute-case-insensitive@^7.0.1: dependencies: postcss-selector-parser "^7.0.0" -postcss-calc@^10.0.2: +postcss-calc@^10.1.1: version "10.1.1" resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-10.1.1.tgz#52b385f2e628239686eb6e3a16207a43f36064ca" integrity sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw== @@ -10650,22 +10600,22 @@ postcss-color-rebeccapurple@^10.0.0: "@csstools/utilities" "^2.0.0" postcss-value-parser "^4.2.0" -postcss-colormin@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-7.0.2.tgz#6f3c53c13158168669f45adc3926f35cb240ef8e" - integrity sha512-YntRXNngcvEvDbEjTdRWGU606eZvB5prmHG4BF0yLmVpamXbpsRJzevyy6MZVyuecgzI2AWAlvFi8DAeCqwpvA== +postcss-colormin@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-7.0.5.tgz#0c7526289ab3f0daf96a376fd7430fae7258d5cf" + integrity sha512-ekIBP/nwzRWhEMmIxHHbXHcMdzd1HIUzBECaj5KEdLz9DVP2HzT065sEhvOx1dkLjYW7jyD0CngThx6bpFi2fA== dependencies: - browserslist "^4.23.3" + browserslist "^4.27.0" caniuse-api "^3.0.0" colord "^2.9.3" postcss-value-parser "^4.2.0" -postcss-convert-values@^7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-7.0.4.tgz#fc13ecedded6365f3c794b502dbcf77d298da12c" - integrity sha512-e2LSXPqEHVW6aoGbjV9RsSSNDO3A0rZLCBxN24zvxF25WknMPpX8Dm9UxxThyEbaytzggRuZxaGXqaOhxQ514Q== +postcss-convert-values@^7.0.8: + version "7.0.8" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-7.0.8.tgz#0c599dc29891d47d7b4d6db399c402cf3ba8efc3" + integrity sha512-+XNKuPfkHTCEo499VzLMYn94TiL3r9YqRE3Ty+jP7UX4qjewUONey1t7CG21lrlTLN07GtGM8MqFVp86D4uKJg== dependencies: - browserslist "^4.23.3" + browserslist "^4.27.0" postcss-value-parser "^4.2.0" postcss-custom-media@^11.0.5: @@ -10706,27 +10656,27 @@ postcss-dir-pseudo-class@^9.0.1: dependencies: postcss-selector-parser "^7.0.0" -postcss-discard-comments@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-7.0.3.tgz#9c414e8ee99d3514ad06a3465ccc20ec1dbce780" - integrity sha512-q6fjd4WU4afNhWOA2WltHgCbkRhZPgQe7cXF74fuVB/ge4QbM9HEaOIzGSiMvM+g/cOsNAUGdf2JDzqA2F8iLA== +postcss-discard-comments@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-7.0.5.tgz#0a95aa4d229a021bc441861d4773d57145ee15dd" + integrity sha512-IR2Eja8WfYgN5n32vEGSctVQ1+JARfu4UH8M7bgGh1bC+xI/obsPJXaBpQF7MAByvgwZinhpHpdrmXtvVVlKcQ== dependencies: - postcss-selector-parser "^6.1.2" + postcss-selector-parser "^7.1.0" -postcss-discard-duplicates@^7.0.1: +postcss-discard-duplicates@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.2.tgz#9cf3e659d4f94b046eef6f93679490c0250a8e4e" + integrity sha512-eTonaQvPZ/3i1ASDHOKkYwAybiM45zFIc7KXils4mQmHLqIswXD9XNOKEVxtTFnsmwYzF66u4LMgSr0abDlh5w== + +postcss-discard-empty@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.1.tgz#f87f2fe47d8f01afb1e98361c1db3ce1e8afd1a3" - integrity sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ== + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-7.0.1.tgz#b6c57e8b5c69023169abea30dceb93f98a2ffd9f" + integrity sha512-cFrJKZvcg/uxB6Ijr4l6qmn3pXQBna9zyrPC+sK0zjbkDUZew+6xDltSF7OeB7rAtzaaMVYSdbod+sZOCWnMOg== -postcss-discard-empty@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-7.0.0.tgz#218829d1ef0a5d5142dd62f0aa60e00e599d2033" - integrity sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA== - -postcss-discard-overridden@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-7.0.0.tgz#b123ea51e3d4e1d0a254cf71eaff1201926d319c" - integrity sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w== +postcss-discard-overridden@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-7.0.1.tgz#bd9c9bc5e4548d3b6e67e7f8d64f2c9d745ae2a0" + integrity sha512-7c3MMjjSZ/qYrx3uc1940GSOzN1Iqjtlqe8uoSg+qdVPYyRb0TILSqqmtlSFuE4mTDECwsm397Ya7iXGzfF7lg== postcss-double-position-gradients@^6.0.0: version "6.0.0" @@ -10831,56 +10781,56 @@ postcss-media-query-parser@^0.2.3: resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244" integrity sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig== -postcss-merge-longhand@^7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-7.0.4.tgz#a52d0662b4b29420f3b64a8d5b0ac5133d8db776" - integrity sha512-zer1KoZA54Q8RVHKOY5vMke0cCdNxMP3KBfDerjH/BYHh4nCIh+1Yy0t1pAEQF18ac/4z3OFclO+ZVH8azjR4A== +postcss-merge-longhand@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-7.0.5.tgz#e1b126e92f583815482e8b1e82c47d2435a20421" + integrity sha512-Kpu5v4Ys6QI59FxmxtNB/iHUVDn9Y9sYw66D6+SZoIk4QTz1prC4aYkhIESu+ieG1iylod1f8MILMs1Em3mmIw== dependencies: postcss-value-parser "^4.2.0" - stylehacks "^7.0.4" + stylehacks "^7.0.5" -postcss-merge-rules@^7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-7.0.4.tgz#648cc864d3121e6ec72c2a4f08df1cc801e60ce8" - integrity sha512-ZsaamiMVu7uBYsIdGtKJ64PkcQt6Pcpep/uO90EpLS3dxJi6OXamIobTYcImyXGoW0Wpugh7DSD3XzxZS9JCPg== +postcss-merge-rules@^7.0.7: + version "7.0.7" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-7.0.7.tgz#f49537e5029ce0e655c2f31fdb205f14575c7334" + integrity sha512-njWJrd/Ms6XViwowaaCc+/vqhPG3SmXn725AGrnl+BgTuRPEacjiLEaGq16J6XirMJbtKkTwnt67SS+e2WGoew== dependencies: - browserslist "^4.23.3" + browserslist "^4.27.0" caniuse-api "^3.0.0" - cssnano-utils "^5.0.0" - postcss-selector-parser "^6.1.2" + cssnano-utils "^5.0.1" + postcss-selector-parser "^7.1.0" -postcss-minify-font-values@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-7.0.0.tgz#d16a75a2548e000779566b3568fc874ee5d0aa17" - integrity sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog== +postcss-minify-font-values@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-7.0.1.tgz#6fb4770131b31fd5a2014bd84e32f386a3406664" + integrity sha512-2m1uiuJeTplll+tq4ENOQSzB8LRnSUChBv7oSyFLsJRtUgAAJGP6LLz0/8lkinTgxrmJSPOEhgY1bMXOQ4ZXhQ== dependencies: postcss-value-parser "^4.2.0" -postcss-minify-gradients@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-7.0.0.tgz#f6d84456e6d49164a55d0e45bb1b1809c6cf0959" - integrity sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg== +postcss-minify-gradients@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-7.0.1.tgz#933cb642dd00df397237c17194f37dcbe4cad739" + integrity sha512-X9JjaysZJwlqNkJbUDgOclyG3jZEpAMOfof6PUZjPnPrePnPG62pS17CjdM32uT1Uq1jFvNSff9l7kNbmMSL2A== dependencies: colord "^2.9.3" - cssnano-utils "^5.0.0" + cssnano-utils "^5.0.1" postcss-value-parser "^4.2.0" -postcss-minify-params@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-7.0.2.tgz#264a76e25f202d8b5ca5290569c0e8c3ac599dfe" - integrity sha512-nyqVLu4MFl9df32zTsdcLqCFfE/z2+f8GE1KHPxWOAmegSo6lpV2GNy5XQvrzwbLmiU7d+fYay4cwto1oNdAaQ== +postcss-minify-params@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-7.0.5.tgz#4a0d15e312252e41d0c8504227d43538e3f607a2" + integrity sha512-FGK9ky02h6Ighn3UihsyeAH5XmLEE2MSGH5Tc4tXMFtEDx7B+zTG6hD/+/cT+fbF7PbYojsmmWjyTwFwW1JKQQ== dependencies: - browserslist "^4.23.3" - cssnano-utils "^5.0.0" + browserslist "^4.27.0" + cssnano-utils "^5.0.1" postcss-value-parser "^4.2.0" -postcss-minify-selectors@^7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-7.0.4.tgz#2b69c99ec48a1c223fce4840609d9c53340a11f5" - integrity sha512-JG55VADcNb4xFCf75hXkzc1rNeURhlo7ugf6JjiiKRfMsKlDzN9CXHZDyiG6x/zGchpjQS+UAgb1d4nqXqOpmA== +postcss-minify-selectors@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-7.0.5.tgz#d8c89eeeb208705ab4127a464d1f54a3bc22cae3" + integrity sha512-x2/IvofHcdIrAm9Q+p06ZD1h6FPcQ32WtCRVodJLDR+WMn8EVHI1kvLxZuGKz/9EY5nAmI6lIQIrpo4tBy5+ug== dependencies: cssesc "^3.0.0" - postcss-selector-parser "^6.1.2" + postcss-selector-parser "^7.1.0" postcss-mixins@^12.0.0: version "12.0.0" @@ -10936,65 +10886,65 @@ postcss-nesting@^13.0.1: "@csstools/selector-specificity" "^5.0.0" postcss-selector-parser "^7.0.0" -postcss-normalize-charset@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-7.0.0.tgz#92244ae73c31bf8f8885d5f16ff69e857ac6c001" - integrity sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ== +postcss-normalize-charset@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-7.0.1.tgz#bccc3f7c5f4440883608eea8b444c8f41ce55ff6" + integrity sha512-sn413ofhSQHlZFae//m9FTOfkmiZ+YQXsbosqOWRiVQncU2BA3daX3n0VF3cG6rGLSFVc5Di/yns0dFfh8NFgQ== -postcss-normalize-display-values@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.0.tgz#01fb50e5e97ef8935363629bea5a6d3b3aac1342" - integrity sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q== +postcss-normalize-display-values@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.1.tgz#feb40277d89a7f677b67a84cac999f0306e38235" + integrity sha512-E5nnB26XjSYz/mGITm6JgiDpAbVuAkzXwLzRZtts19jHDUBFxZ0BkXAehy0uimrOjYJbocby4FVswA/5noOxrQ== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-positions@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-7.0.0.tgz#4eebd7c9d3dde40c97b8047cad38124fc844c463" - integrity sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ== +postcss-normalize-positions@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-7.0.1.tgz#c771c0d33034455205f060b999d8557c2308d22c" + integrity sha512-pB/SzrIP2l50ZIYu+yQZyMNmnAcwyYb9R1fVWPRxm4zcUFCY2ign7rcntGFuMXDdd9L2pPNUgoODDk91PzRZuQ== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-repeat-style@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.0.tgz#0cb784655d5714d29bd3bda6dee2fb628aa7227b" - integrity sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw== +postcss-normalize-repeat-style@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.1.tgz#05fe4d838eedbd996436c5cab78feef9bb1ae57b" + integrity sha512-NsSQJ8zj8TIDiF0ig44Byo3Jk9e4gNt9x2VIlJudnQQ5DhWAHJPF4Tr1ITwyHio2BUi/I6Iv0HRO7beHYOloYQ== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-string@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-7.0.0.tgz#a119d3e63a9614570d8413d572fb9fc8c6a64e8c" - integrity sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg== +postcss-normalize-string@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-7.0.1.tgz#0f111e7b5dfb6de6ab19f09d9e1c16fabeee232f" + integrity sha512-QByrI7hAhsoze992kpbMlJSbZ8FuCEc1OT9EFbZ6HldXNpsdpZr+YXC5di3UEv0+jeZlHbZcoCADgb7a+lPmmQ== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-timing-functions@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.0.tgz#99d0ee8c4b23b7f4355fafb91385833b9b07108b" - integrity sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g== +postcss-normalize-timing-functions@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.1.tgz#7b645a36f113fec49d95d56386c9980316c71216" + integrity sha512-bHifyuuSNdKKsnNJ0s8fmfLMlvsQwYVxIoUBnowIVl2ZAdrkYQNGVB4RxjfpvkMjipqvbz0u7feBZybkl/6NJg== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-unicode@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.2.tgz#095f8d36ea29adfdf494069c1de101112992a713" - integrity sha512-ztisabK5C/+ZWBdYC+Y9JCkp3M9qBv/XFvDtSw0d/XwfT3UaKeW/YTm/MD/QrPNxuecia46vkfEhewjwcYFjkg== +postcss-normalize-unicode@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.5.tgz#d47a3cc40529d7eeb18d7f7a8a215c38c54455cd" + integrity sha512-X6BBwiRxVaFHrb2WyBMddIeB5HBjJcAaUHyhLrM2FsxSq5TFqcHSsK7Zu1otag+o0ZphQGJewGH1tAyrD0zX1Q== dependencies: - browserslist "^4.23.3" + browserslist "^4.27.0" postcss-value-parser "^4.2.0" -postcss-normalize-url@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-7.0.0.tgz#c88cb7cf8952d3ff631e4eba924e7b060ca802f6" - integrity sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ== +postcss-normalize-url@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-7.0.1.tgz#d6471a22b6747ce93d7038c16eb9f1ba8b307e25" + integrity sha512-sUcD2cWtyK1AOL/82Fwy1aIVm/wwj5SdZkgZ3QiUzSzQQofrbq15jWJ3BA7Z+yVRwamCjJgZJN0I9IS7c6tgeQ== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-whitespace@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.0.tgz#46b025f0bea72139ddee63015619b0c21cebd845" - integrity sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ== +postcss-normalize-whitespace@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.1.tgz#ab8e9ff1f3213f3f3851c0a7d0e4ce4716777cea" + integrity sha512-vsbgFHMFQrJBJKrUFJNZ2pgBeBkC2IvvoHjz1to0/0Xk7sII24T0qFOiJzG6Fu3zJoq/0yI4rKWi7WhApW+EFA== dependencies: postcss-value-parser "^4.2.0" @@ -11003,12 +10953,12 @@ postcss-opacity-percentage@^3.0.0: resolved "https://registry.yarnpkg.com/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz#0b0db5ed5db5670e067044b8030b89c216e1eb0a" integrity sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ== -postcss-ordered-values@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-7.0.1.tgz#8b4b5b8070ca7756bd49f07d5edf274b8f6782e0" - integrity sha512-irWScWRL6nRzYmBOXReIKch75RRhNS86UPUAxXdmW/l0FcAsg0lvAXQCby/1lymxn/o0gVa6Rv/0f03eJOwHxw== +postcss-ordered-values@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-7.0.2.tgz#0e803fbb9601e254270481772252de9a8c905f48" + integrity sha512-AMJjt1ECBffF7CEON/Y0rekRLS6KsePU6PRP08UqYW4UGFRnTXNrByUzYK1h8AC7UWTZdQ9O3Oq9kFIhm0SFEw== dependencies: - cssnano-utils "^5.0.0" + cssnano-utils "^5.0.1" postcss-value-parser "^4.2.0" postcss-overflow-shorthand@^6.0.0: @@ -11106,18 +11056,18 @@ postcss-pseudo-class-any-link@^10.0.1: dependencies: postcss-selector-parser "^7.0.0" -postcss-reduce-initial@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-7.0.2.tgz#3dc085347a5943e18547d4b0aa5bd4ff5a93b2c5" - integrity sha512-pOnu9zqQww7dEKf62Nuju6JgsW2V0KRNBHxeKohU+JkHd/GAH5uvoObqFLqkeB2n20mr6yrlWDvo5UBU5GnkfA== +postcss-reduce-initial@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-7.0.5.tgz#cf74bb747dfa003cd3d5372081f6157e6d8e1545" + integrity sha512-RHagHLidG8hTZcnr4FpyMB2jtgd/OcyAazjMhoy5qmWJOx1uxKh4ntk0Pb46ajKM0rkf32lRH4C8c9qQiPR6IA== dependencies: - browserslist "^4.23.3" + browserslist "^4.27.0" caniuse-api "^3.0.0" -postcss-reduce-transforms@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.0.tgz#0386080a14e5faad9f8eda33375b79fe7c4f9677" - integrity sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew== +postcss-reduce-transforms@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.1.tgz#f87111264b0dfa07e1f708d7e6401578707be5d6" + integrity sha512-MhyEbfrm+Mlp/36hvZ9mT9DaO7dbncU0CvWI8V93LRkY6IYlu38OPg3FObnuKTUxJ4qA8HpurdQOo5CyqqO76g== dependencies: postcss-value-parser "^4.2.0" @@ -11148,7 +11098,7 @@ postcss-selector-not@^8.0.1: dependencies: postcss-selector-parser "^7.0.0" -postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.1.2: +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: version "6.1.2" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== @@ -11156,18 +11106,10 @@ postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector cssesc "^3.0.0" util-deprecate "^1.0.2" -postcss-selector-parser@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz#41bd8b56f177c093ca49435f65731befe25d6b9c" - integrity sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-selector-parser@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz#4d6af97eba65d73bc4d84bcb343e865d7dd16262" - integrity sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA== +postcss-selector-parser@^7.0.0, postcss-selector-parser@^7.1.0, postcss-selector-parser@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz#e75d2e0d843f620e5df69076166f4e16f891cb9f" + integrity sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -11177,20 +11119,20 @@ postcss-simple-vars@^7.0.1: resolved "https://registry.yarnpkg.com/postcss-simple-vars/-/postcss-simple-vars-7.0.1.tgz#836b3097a54dcd13dbd3c36a5dbdd512fad2954c" integrity sha512-5GLLXaS8qmzHMOjVxqkk1TZPf1jMqesiI7qLhnlyERalG0sMbHIbJqrcnrpmZdKCLglHnRHoEBB61RtGTsj++A== -postcss-svgo@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-7.0.1.tgz#2b63571d8e9568384df334bac9917baff4d23f58" - integrity sha512-0WBUlSL4lhD9rA5k1e5D8EN5wCEyZD6HJk0jIvRxl+FDVOMlJ7DePHYWGGVc5QRqrJ3/06FTXM0bxjmJpmTPSA== +postcss-svgo@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-7.1.0.tgz#7eb6764a643ac2699bf56eef6d2676d428ed4542" + integrity sha512-KnAlfmhtoLz6IuU3Sij2ycusNs4jPW+QoFE5kuuUOK8awR6tMxZQrs5Ey3BUz7nFCzT3eqyFgqkyrHiaU2xx3w== dependencies: postcss-value-parser "^4.2.0" - svgo "^3.3.2" + svgo "^4.0.0" -postcss-unique-selectors@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-7.0.3.tgz#483fc11215b23d517d5d9bbe5833d9915619ca33" - integrity sha512-J+58u5Ic5T1QjP/LDV9g3Cx4CNOgB5vz+kM6+OxHHhFACdcDeKhBXjQmB7fnIZM12YSTvsL0Opwco83DmacW2g== +postcss-unique-selectors@^7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-7.0.4.tgz#625ad1c808bdf322fab6c027ae8d4f2637140995" + integrity sha512-pmlZjsmEAG7cHd7uK3ZiNSW6otSZ13RHuZ/4cDN/bVglS5EpF2r2oxY99SuOHa8m7AWoBCelTS3JPpzsIs8skQ== dependencies: - postcss-selector-parser "^6.1.2" + postcss-selector-parser "^7.1.0" postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: version "4.2.0" @@ -11215,16 +11157,7 @@ postcss@^8.3.11, postcss@^8.4.33: picocolors "^1.1.0" source-map-js "^1.2.1" -postcss@^8.4.40: - version "8.5.3" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb" - integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== - dependencies: - nanoid "^3.3.8" - picocolors "^1.1.1" - source-map-js "^1.2.1" - -postcss@^8.5.6: +postcss@^8.4.40, postcss@^8.5.6: version "8.5.6" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c" integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== @@ -11233,12 +11166,12 @@ postcss@^8.5.6: picocolors "^1.1.1" source-map-js "^1.2.1" -posthog-js@1.297.2: - version "1.297.2" - resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.297.2.tgz#708e77e9acc5bbaf35ec40261cfe0da3a1a7597e" - integrity sha512-pDtCKHpKegV1D5Yk9PBmkFwI9FMnLJm0TsBO5c5/PhPq5Om4y/t+1qqbNcLCdLajkuYl2px9UlRTzycQ6W7Vmw== +posthog-js@1.302.2: + version "1.302.2" + resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.302.2.tgz#149ab7d511106541d7056bf239094c425fb4ef0a" + integrity sha512-4voih22zQe7yHA7DynlQ3B7kgzJOaKIjzV7K3jJ2Qf+UDXd1ZgO7xYmLWYVtuKEvD1OXHbKk/fPhUTZeHEWpBw== dependencies: - "@posthog/core" "1.5.5" + "@posthog/core" "1.7.1" core-js "^3.38.1" fflate "^0.4.8" preact "^10.19.3" @@ -11259,10 +11192,10 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prettier@3.6.2: - version "3.6.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.6.2.tgz#ccda02a1003ebbb2bfda6f83a074978f608b9393" - integrity sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ== +prettier@3.7.4: + version "3.7.4" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.7.4.tgz#d2f8335d4b1cec47e1c8098645411b0c9dff9c0f" + integrity sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA== prettier@^2.6.2: version "2.8.8" @@ -11401,12 +11334,12 @@ pvutils@^1.1.3: resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.3.tgz#f35fc1d27e7cd3dfbd39c0826d173e806a03f5a3" integrity sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ== -qified@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/qified/-/qified-0.5.0.tgz#2e0a1f8bdf2321764b976402da9fbfc1a205785f" - integrity sha512-Zj6Q/Vc/SQ+Fzc87N90jJUzBzxD7MVQ2ZvGyMmYtnl2u1a07CejAhvtk4ZwASos+SiHKCAIylyGHJKIek75QBw== +qified@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/qified/-/qified-0.5.3.tgz#2d01866eb99c8de3a18965a4a809d9349e26210a" + integrity sha512-kXuQdQTB6oN3KhI6V4acnBSZx8D2I4xzZvn9+wFLLFCoBNQY/sFnCW6c43OL7pOQ2HvGV4lnWIXNmgfp7cTWhQ== dependencies: - hookified "^1.12.1" + hookified "^1.13.0" qrcode@1.5.4: version "1.5.4" @@ -11515,9 +11448,9 @@ react-blurhash@^0.3.0: integrity sha512-XlKr4Ns1iYFRnk6DkAblNbAwN/bTJvxTVoxMvmTcURdc5oLoXZwqAF9N3LZUh/HT+QFlq5n6IS6VsDGsviYAiQ== react-clientside-effect@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/react-clientside-effect/-/react-clientside-effect-1.2.7.tgz#78eb62e3be36208d4d8d5b2668ae630a32deca73" - integrity sha512-gce9m0Pk/xYYMEojRI9bgvqQAkl6hm7ozQvqWPyQx+kULiatdHgkNM1QG4DQRx5N9BAzWSCJmt9mMV8/KsdgVg== + version "1.2.8" + resolved "https://registry.yarnpkg.com/react-clientside-effect/-/react-clientside-effect-1.2.8.tgz#0b90a9d7b2a1823a3a10ed1ea3f651f7e0301cb7" + integrity sha512-ma2FePH0z3px2+WOu6h+YycZcEvFmmxIlAb62cF52bG86eMySciO/EQZeQMXd07kPCYB0a1dWDT5J+KE9mCDUw== dependencies: "@babel/runtime" "^7.12.13" @@ -11550,9 +11483,9 @@ react-dom@^19.0.0: scheduler "^0.27.0" react-focus-lock@^2.5.1: - version "2.13.6" - resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.13.6.tgz#29751bf2e4e30f6248673cd87a347c74ff2af672" - integrity sha512-ehylFFWyYtBKXjAO9+3v8d0i+cnc1trGS0vlTGhzFW1vbFXVUTmR8s2tt/ZQG8x5hElg6rhENlLG1H3EZK0Llg== + version "2.13.7" + resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.13.7.tgz#2f51ad417e4212a9f7bdd87da092aa2ad0536d5a" + integrity sha512-20lpZHEQrXPb+pp1tzd4ULL6DyO5D2KnR0G69tTDdydrmNhU7pdFmbQUYVyHUgp+xN29IuFR0PVuhOmvaZL9Og== dependencies: "@babel/runtime" "^7.0.0" focus-lock "^1.3.6" @@ -11641,9 +11574,9 @@ react-transition-group@^4.4.1: prop-types "^15.6.2" react-virtuoso@^4.14.0: - version "4.14.1" - resolved "https://registry.yarnpkg.com/react-virtuoso/-/react-virtuoso-4.14.1.tgz#78a5e796a3f9ec501499f01962ec6fc7eed77d8d" - integrity sha512-NRUF1ak8lY+Tvc6WN9cce59gU+lilzVtOozP+pm9J7iHshLGGjsiAB4rB2qlBPHjFbcXOQpT+7womNHGDUql8w== + version "4.17.0" + resolved "https://registry.yarnpkg.com/react-virtuoso/-/react-virtuoso-4.17.0.tgz#e81f2da99792cfd9317e910b243d847ebeb09248" + integrity sha512-od3pi2v13v31uzn5zPXC2u3ouISFCVhjFVFch2VvS2Cx7pWA2F1aJa3XhNTN2F07M3lhfnMnsmGeH+7wZICr7w== react@^19.0.0: version "19.2.1" @@ -11982,11 +11915,11 @@ rimraf@^3.0.2: glob "^7.1.3" rimraf@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-6.1.0.tgz#b9168360a26e10ffaca0c8b803f47069f99ca47e" - integrity sha512-DxdlA1bdNzkZK7JiNWH+BAx1x4tEJWoTofIopFo6qWUU94jYrFZ0ubY05TqH3nWPJ1nKa1JWVFDINZ3fnrle/A== + version "6.1.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-6.1.2.tgz#9a0f3cea2ab853e81291127422116ecf2a86ae89" + integrity sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g== dependencies: - glob "^11.0.3" + glob "^13.0.0" package-json-from-dist "^1.0.1" router@^2.2.0: @@ -12091,6 +12024,11 @@ sanitize-html@2.17.0: parse-srcset "^1.0.2" postcss "^8.3.11" +sax@^1.4.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.3.tgz#fcebae3b756cdc8428321805f4b70f16ec0ab5db" + integrity sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ== + saxes@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" @@ -12112,7 +12050,7 @@ schema-utils@^3.0.0: ajv "^6.12.5" ajv-keywords "^3.5.2" -schema-utils@^4.0.0, schema-utils@^4.2.0: +schema-utils@^4.0.0: version "4.3.2" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.2.tgz#0c10878bf4a73fd2b1dfd14b9462b26788c806ae" integrity sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ== @@ -12122,7 +12060,7 @@ schema-utils@^4.0.0, schema-utils@^4.2.0: ajv-formats "^2.1.1" ajv-keywords "^5.1.0" -schema-utils@^4.3.0, schema-utils@^4.3.3: +schema-utils@^4.2.0, schema-utils@^4.3.0, schema-utils@^4.3.3: version "4.3.3" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.3.tgz#5b1850912fa31df90716963d45d9121fdfc09f46" integrity sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA== @@ -12407,10 +12345,10 @@ slice-ansi@^7.1.0: ansi-styles "^6.2.1" is-fullwidth-code-point "^5.0.0" -smol-toml@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/smol-toml/-/smol-toml-1.4.2.tgz#46c4dcc71f982040085ee54b22377c96a4597ce3" - integrity sha512-rInDH6lCNiEyn3+hH8KVGFdbjc099j47+OSgbMrfDYX1CmXLfdKd7qi6IfcWj2wFxvSVkuI46M+wPGYfEOEj6g== +smol-toml@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/smol-toml/-/smol-toml-1.5.2.tgz#70d4324d47b7cccbc67d611829c9b3f6d528b02f" + integrity sha512-QlaZEqcAH3/RtNyet1IPIYPsEWAaYyXXv1Krsi+1L/QHppjX4Ifm8MQsBISz9vE8cHicIq3clogsheili5vhaQ== snake-case@^3.0.4: version "3.0.4" @@ -12780,37 +12718,37 @@ strip-indent@^4.0.0: resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-4.1.1.tgz#aba13de189d4ad9a17f6050e76554ac27585c7af" integrity sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA== -strip-json-comments@5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-5.0.2.tgz#14a76abd63b84a6d2419d14f26a0281d0cf6ea46" - integrity sha512-4X2FR3UwhNUE9G49aIsJW5hRRR3GXGTBTZRMfv568O60ojM8HcWjV/VxAxCDW3SUND33O6ZY66ZuRcdkj73q2g== +strip-json-comments@5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-5.0.3.tgz#b7304249dd402ee67fd518ada993ab3593458bcf" + integrity sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw== strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -style-to-js@1.1.19: - version "1.1.19" - resolved "https://registry.yarnpkg.com/style-to-js/-/style-to-js-1.1.19.tgz#f3f671e74764c1e8eebfba95a9a672acf5c19011" - integrity sha512-Ev+SgeqiNGT1ufsXyVC5RrJRXdrkRJ1Gol9Qw7Pb72YCKJXrBvP0ckZhBeVSrw2m06DJpei2528uIpjMb4TsoQ== +style-to-js@1.1.21: + version "1.1.21" + resolved "https://registry.yarnpkg.com/style-to-js/-/style-to-js-1.1.21.tgz#2908941187f857e79e28e9cd78008b9a0b3e0e8d" + integrity sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ== dependencies: - style-to-object "1.0.12" + style-to-object "1.0.14" -style-to-object@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-1.0.12.tgz#03a30e7f4e555bf50845f8b55c7d5bc2248e03f0" - integrity sha512-ddJqYnoT4t97QvN2C95bCgt+m7AAgXjVnkk/jxAfmp7EAB8nnqqZYEbMd3em7/vEomDb2LAQKAy1RFfv41mdNw== +style-to-object@1.0.14: + version "1.0.14" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-1.0.14.tgz#1d22f0e7266bb8c6d8cae5caf4ec4f005e08f611" + integrity sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw== dependencies: - inline-style-parser "0.2.6" + inline-style-parser "0.2.7" -stylehacks@^7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-7.0.4.tgz#9c21f7374f4bccc0082412b859b3c89d77d3277c" - integrity sha512-i4zfNrGMt9SB4xRK9L83rlsFCgdGANfeDAYacO1pkqcE7cRHPdWHwnKZVz7WY17Veq/FvyYsRAU++Ga+qDFIww== +stylehacks@^7.0.5: + version "7.0.7" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-7.0.7.tgz#12b0dd1eceee4d564aae6da0632804ef0004a5be" + integrity sha512-bJkD0JkEtbRrMFtwgpJyBbFIwfDDONQ1Ov3sDLZQP8HuJ73kBOyx66H4bOcAbVWmnfLdvQ0AJwXxOMkpujcO6g== dependencies: - browserslist "^4.23.3" - postcss-selector-parser "^6.1.2" + browserslist "^4.27.0" + postcss-selector-parser "^7.1.0" stylelint-config-recommended@^17.0.0: version "17.0.0" @@ -12825,17 +12763,17 @@ stylelint-config-standard@^39.0.0: stylelint-config-recommended "^17.0.0" stylelint-scss@^6.0.0: - version "6.12.1" - resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-6.12.1.tgz#7de9980a7c9acb7a3f203498e7296526cb52ffa0" - integrity sha512-UJUfBFIvXfly8WKIgmqfmkGKPilKB4L5j38JfsDd+OCg2GBdU0vGUV08Uw82tsRZzd4TbsUURVVNGeOhJVF7pA== + version "6.13.0" + resolved "https://registry.yarnpkg.com/stylelint-scss/-/stylelint-scss-6.13.0.tgz#0bffc5a2408b14097ce92bde54ff5ba6838c8bf5" + integrity sha512-kZPwFUJkfup2gP1enlrS2h9U5+T5wFoqzJ1n/56AlpwSj28kmFe7ww/QFydvPsg5gLjWchAwWWBLtterynZrOw== dependencies: css-tree "^3.0.1" is-plain-object "^5.0.0" - known-css-properties "^0.36.0" - mdn-data "^2.21.0" + known-css-properties "^0.37.0" + mdn-data "^2.25.0" postcss-media-query-parser "^0.2.3" postcss-resolve-nested-selector "^0.1.6" - postcss-selector-parser "^7.1.0" + postcss-selector-parser "^7.1.1" postcss-value-parser "^4.2.0" stylelint-value-no-unknown-custom-properties@^6.0.1: @@ -12847,11 +12785,12 @@ stylelint-value-no-unknown-custom-properties@^6.0.1: resolve "^1.22.8" stylelint@^16.23.0: - version "16.25.0" - resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.25.0.tgz#c3d602974f2a18fa57fadc9f3f40129b098fe4dc" - integrity sha512-Li0avYWV4nfv1zPbdnxLYBGq4z8DVZxbRgx4Kn6V+Uftz1rMoF1qiEI3oL4kgWqyYgCgs7gT5maHNZ82Gk03vQ== + version "16.26.1" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.26.1.tgz#7048accf9c3990dc074dff13c6f3cdc35c780c95" + integrity sha512-v20V59/crfc8sVTAtge0mdafI3AdnzQ2KsWe6v523L4OA1bJO02S7MO2oyXDCS6iWb9ckIPnqAFVItqSBQr7jw== dependencies: "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-syntax-patches-for-csstree" "^1.0.19" "@csstools/css-tokenizer" "^3.0.4" "@csstools/media-query-list-parser" "^4.0.3" "@csstools/selector-specificity" "^5.0.0" @@ -12864,7 +12803,7 @@ stylelint@^16.23.0: debug "^4.4.3" fast-glob "^3.3.3" fastest-levenshtein "^1.0.16" - file-entry-cache "^10.1.4" + file-entry-cache "^11.1.1" global-modules "^2.0.0" globby "^11.1.0" globjoin "^0.1.4" @@ -12948,7 +12887,7 @@ svg-tags@^1.0.0: resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA== -svgo@^3.0.2, svgo@^3.3.2: +svgo@^3.0.2: version "3.3.2" resolved "https://registry.yarnpkg.com/svgo/-/svgo-3.3.2.tgz#ad58002652dffbb5986fc9716afe52d869ecbda8" integrity sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw== @@ -12961,6 +12900,19 @@ svgo@^3.0.2, svgo@^3.3.2: csso "^5.0.5" picocolors "^1.0.0" +svgo@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-4.0.0.tgz#17e0fa2eaccf429e0ec0d2179169abde9ba8ad3d" + integrity sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw== + dependencies: + commander "^11.1.0" + css-select "^5.1.0" + css-tree "^3.0.1" + css-what "^6.1.0" + csso "^5.0.5" + picocolors "^1.1.1" + sax "^1.4.1" + symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" @@ -12989,12 +12941,7 @@ table@^6.9.0: string-width "^4.2.3" strip-ansi "^6.0.1" -tapable@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.2.tgz#ab4984340d30cb9989a490032f086dbb8b56d872" - integrity sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg== - -tapable@^2.2.0, tapable@^2.3.0: +tapable@^2.0.0, tapable@^2.2.0, tapable@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.3.0.tgz#7e3ea6d5ca31ba8e078b560f0d83ce9a14aa8be6" integrity sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg== @@ -13063,9 +13010,9 @@ temporal-spec@0.3.0: integrity sha512-n+noVpIqz4hYgFSMOSiINNOUOMFtV5cZQNCmmszA6GiVFVRt3G7AqVyhXjhCSmowvQn+NsGn+jMDMKJYHd3bSQ== terser-webpack-plugin@^5.3.11, terser-webpack-plugin@^5.3.9: - version "5.3.14" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz#9031d48e57ab27567f02ace85c7d690db66c3e06" - integrity sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw== + version "5.3.15" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.15.tgz#0a26860b765eaffa8e840170aabc5b3a3f6f6bb9" + integrity sha512-PGkOdpRFK+rb1TzVz+msVhw4YMRT9txLF4kRqvJhGhCM324xuR3REBSHALN+l+sAhKUmz0aotnjp5D+P83mLhQ== dependencies: "@jridgewell/trace-mapping" "^0.3.25" jest-worker "^27.4.5" @@ -13073,20 +13020,10 @@ terser-webpack-plugin@^5.3.11, terser-webpack-plugin@^5.3.9: serialize-javascript "^6.0.2" terser "^5.31.1" -terser@^5.10.0: - version "5.43.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.43.1.tgz#88387f4f9794ff1a29e7ad61fb2932e25b4fdb6d" - integrity sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg== - dependencies: - "@jridgewell/source-map" "^0.3.3" - acorn "^8.14.0" - commander "^2.20.0" - source-map-support "~0.5.20" - -terser@^5.31.1: - version "5.44.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.44.0.tgz#ebefb8e5b8579d93111bfdfc39d2cf63879f4a82" - integrity sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w== +terser@^5.10.0, terser@^5.31.1: + version "5.44.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.44.1.tgz#e391e92175c299b8c284ad6ded609e37303b0a9c" + integrity sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.15.0" @@ -13863,9 +13800,9 @@ webpack-virtual-modules@^0.6.2: integrity sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ== webpack@^5.89.0: - version "5.102.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.102.1.tgz#1003a3024741a96ba99c37431938bf61aad3d988" - integrity sha512-7h/weGm9d/ywQ6qzJ+Xy+r9n/3qgp/thalBbpOi5i223dPXKi04IBtqPN9nTd+jBc7QKfvDbaBnFipYp4sJAUQ== + version "5.103.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.103.0.tgz#17a7c5a5020d5a3a37c118d002eade5ee2c6f3da" + integrity sha512-HU1JOuV1OavsZ+mfigY0j8d1TgQgbZ6M+J75zDkpEAwYeXjWSqrGJtgnPblJjd/mAyTNQ7ygw0MiKOn6etz8yw== dependencies: "@types/eslint-scope" "^3.7.7" "@types/estree" "^1.0.8" @@ -13884,7 +13821,7 @@ webpack@^5.89.0: glob-to-regexp "^0.4.1" graceful-fs "^4.2.11" json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" + loader-runner "^4.3.1" mime-types "^2.1.27" neo-async "^2.6.2" schema-utils "^4.3.3" @@ -14132,16 +14069,11 @@ yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yaml@^2.2.2, yaml@^2.7.0: +yaml@^2.2.2, yaml@^2.3.3, yaml@^2.7.0, yaml@^2.8.1: version "2.8.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.2.tgz#5694f25eca0ce9c3e7a9d9e00ce0ddabbd9e35c5" integrity sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A== -yaml@^2.3.3, yaml@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.1.tgz#1870aa02b631f7e8328b93f8bc574fac5d6c4d79" - integrity sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw== - yargs-parser@^18.1.2: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" @@ -14214,7 +14146,12 @@ zod@^3.22.4: resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.76.tgz#26841c3f6fd22a6a2760e7ccb719179768471e34" integrity sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ== -"zod@^3.25.0 || ^4.0.0", zod@^4.1.11: +"zod@^3.25.0 || ^4.0.0": version "4.1.12" resolved "https://registry.yarnpkg.com/zod/-/zod-4.1.12.tgz#64f1ea53d00eab91853195653b5af9eee68970f0" integrity sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ== + +zod@^4.1.11: + version "4.1.13" + resolved "https://registry.yarnpkg.com/zod/-/zod-4.1.13.tgz#93699a8afe937ba96badbb0ce8be6033c0a4b6b1" + integrity sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig== From 23fbe9cef69edadff3770e1b3cf4770638ea2a5c Mon Sep 17 00:00:00 2001 From: Florian Duros Date: Thu, 11 Dec 2025 16:41:27 +0100 Subject: [PATCH 09/72] UseCreateAutoDisposedViewModel for audio player (#31503) * refactor: useCreateAutoDisposedViewModel for audio player * Update src/viewmodels/audio/AudioPlayerViewModel.ts Co-authored-by: Michael Telatynski <7t3chguy@gmail.com> --------- Co-authored-by: Michael Telatynski <7t3chguy@gmail.com> --- src/components/views/messages/MAudioBody.tsx | 13 +++++-------- src/viewmodels/audio/AudioPlayerViewModel.ts | 9 +++++++++ test/viewmodels/audio/AudioPlayerViewModel-test.tsx | 8 ++++++++ 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/components/views/messages/MAudioBody.tsx b/src/components/views/messages/MAudioBody.tsx index db61672c9c..967e0d5fc7 100644 --- a/src/components/views/messages/MAudioBody.tsx +++ b/src/components/views/messages/MAudioBody.tsx @@ -6,11 +6,11 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import React, { type JSX, useEffect, useMemo } from "react"; +import React, { type JSX, useEffect } from "react"; import { logger } from "matrix-js-sdk/src/logger"; import { type IContent } from "matrix-js-sdk/src/matrix"; import { type MediaEventContent } from "matrix-js-sdk/src/types"; -import { AudioPlayerView } from "@element-hq/web-shared-components"; +import { AudioPlayerView, useCreateAutoDisposedViewModel } from "@element-hq/web-shared-components"; import { type Playback } from "../../../audio/Playback"; import InlineSpinner from "../elements/InlineSpinner"; @@ -132,13 +132,10 @@ interface AudioPlayerProps { * AudioPlayer component that initializes the AudioPlayerViewModel and renders the AudioPlayerView. */ function AudioPlayer({ playback, mediaName }: AudioPlayerProps): JSX.Element { - const vm = useMemo(() => new AudioPlayerViewModel({ playback, mediaName }), [playback, mediaName]); - + const vm = useCreateAutoDisposedViewModel(() => new AudioPlayerViewModel({ playback, mediaName })); useEffect(() => { - return () => { - vm.dispose(); - }; - }, [vm]); + vm.setProps({ playback, mediaName }); + }, [playback, mediaName, vm]); return ; } diff --git a/src/viewmodels/audio/AudioPlayerViewModel.ts b/src/viewmodels/audio/AudioPlayerViewModel.ts index f0f5f87989..37588c5afd 100644 --- a/src/viewmodels/audio/AudioPlayerViewModel.ts +++ b/src/viewmodels/audio/AudioPlayerViewModel.ts @@ -141,4 +141,13 @@ export class AudioPlayerViewModel public onSeekbarChange = async (ev: ChangeEvent): Promise => { await this.props.playback.skipTo((Number(ev.target.value) / 100) * this.props.playback.durationSeconds); }; + + /** + * Updates the properties of the view model and recomputes the snapshot. + * @param newProps + */ + public setProps(newProps: Partial): void { + this.props = { ...this.props, ...newProps }; + this.setSnapshot(); + } } diff --git a/test/viewmodels/audio/AudioPlayerViewModel-test.tsx b/test/viewmodels/audio/AudioPlayerViewModel-test.tsx index a6c4a04166..4fc10fe596 100644 --- a/test/viewmodels/audio/AudioPlayerViewModel-test.tsx +++ b/test/viewmodels/audio/AudioPlayerViewModel-test.tsx @@ -64,4 +64,12 @@ describe("AudioPlayerViewModel", () => { vm.onKeyDown(event); expect(playback.skipTo).toHaveBeenCalledWith(10 + 5); // 5 seconds forward }); + + it("should update snapshot when setProps is called with new mediaName", () => { + const vm = new AudioPlayerViewModel({ playback, mediaName: "oldName" }); + expect(vm.getSnapshot().mediaName).toBe("oldName"); + + vm.setProps({ mediaName: "newName" }); + expect(vm.getSnapshot().mediaName).toBe("newName"); + }); }); From 5b900ab6e2da2e3b582eafb44fe2c9ec1b4d8415 Mon Sep 17 00:00:00 2001 From: Florian Duros Date: Thu, 11 Dec 2025 16:43:20 +0100 Subject: [PATCH 10/72] Move room list search to shared components (#31502) * refactor: move room list search to shared components * refactor: add view model * refactor: use view and vm in room list search component * refactor: use room list id instead of class for landmark navigation * refactor: remove old room list search css * test: add screenshots test for room list search view * test: fix e2e test using class as selector... --- ...-roomlistsearchview--all-buttons-linux.png | Bin 0 -> 9090 bytes ...list-roomlistsearchview--default-linux.png | Bin 0 -> 8634 bytes ...oomlistsearchview--with-dial-pad-linux.png | Bin 0 -> 9090 bytes ...mlistsearchview--without-explore-linux.png | Bin 0 -> 7768 bytes packages/shared-components/src/index.ts | 1 + .../RoomListSearchView.module.css | 47 +++ .../RoomListSearchView.stories.tsx | 74 +++++ .../RoomListSearchView.test.tsx | 103 +++++++ .../RoomListSearchView/RoomListSearchView.tsx | 119 +++++++ .../RoomListSearchView.test.tsx.snap | 290 ++++++++++++++++++ .../src/room-list/RoomListSearchView/index.ts | 9 + .../accessibility/keyboard-navigation.spec.ts | 12 +- playwright/e2e/voip/pstn.spec.ts | 2 +- res/css/_components.pcss | 1 - .../rooms/RoomListPanel/_RoomListSearch.pcss | 45 --- src/accessibility/LandmarkNavigation.ts | 2 +- .../rooms/RoomListPanel/RoomListSearch.tsx | 73 +---- .../room-list/RoomListSearchViewModel.ts | 117 +++++++ .../accessibility/LandmarkNavigation-test.tsx | 4 +- .../RoomListPanel/RoomListSearch-test.tsx | 78 +---- .../RoomListSearch-test.tsx.snap | 207 +------------ .../room-list/RoomListSearchViewModel-test.ts | 114 +++++++ 22 files changed, 901 insertions(+), 397 deletions(-) create mode 100644 packages/shared-components/playwright/snapshots/room-list-roomlistsearchview--all-buttons-linux.png create mode 100644 packages/shared-components/playwright/snapshots/room-list-roomlistsearchview--default-linux.png create mode 100644 packages/shared-components/playwright/snapshots/room-list-roomlistsearchview--with-dial-pad-linux.png create mode 100644 packages/shared-components/playwright/snapshots/room-list-roomlistsearchview--without-explore-linux.png create mode 100644 packages/shared-components/src/room-list/RoomListSearchView/RoomListSearchView.module.css create mode 100644 packages/shared-components/src/room-list/RoomListSearchView/RoomListSearchView.stories.tsx create mode 100644 packages/shared-components/src/room-list/RoomListSearchView/RoomListSearchView.test.tsx create mode 100644 packages/shared-components/src/room-list/RoomListSearchView/RoomListSearchView.tsx create mode 100644 packages/shared-components/src/room-list/RoomListSearchView/__snapshots__/RoomListSearchView.test.tsx.snap create mode 100644 packages/shared-components/src/room-list/RoomListSearchView/index.ts delete mode 100644 res/css/views/rooms/RoomListPanel/_RoomListSearch.pcss create mode 100644 src/viewmodels/room-list/RoomListSearchViewModel.ts create mode 100644 test/viewmodels/room-list/RoomListSearchViewModel-test.ts diff --git a/packages/shared-components/playwright/snapshots/room-list-roomlistsearchview--all-buttons-linux.png b/packages/shared-components/playwright/snapshots/room-list-roomlistsearchview--all-buttons-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..0d7f17d5114cb357db1f36e73caa77eab01ac384 GIT binary patch literal 9090 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 TL9M_QkjqJrpGkkcc>Ui1kIhw1 literal 0 HcmV?d00001 diff --git a/packages/shared-components/playwright/snapshots/room-list-roomlistsearchview--default-linux.png b/packages/shared-components/playwright/snapshots/room-list-roomlistsearchview--default-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..2f41682551ca26dcac0dc7b18f2f3753cf584283 GIT binary patch literal 8634 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 TL9M_QkjqJrpGkkcc>Ui1kIhw1 literal 0 HcmV?d00001 diff --git a/packages/shared-components/playwright/snapshots/room-list-roomlistsearchview--without-explore-linux.png b/packages/shared-components/playwright/snapshots/room-list-roomlistsearchview--without-explore-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..e3e14ccfb4e575362a87658694a90dfc8d7fbe85 GIT binary patch literal 7768 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 literal 0 HcmV?d00001 diff --git a/packages/shared-components/src/index.ts b/packages/shared-components/src/index.ts index a806971a3f..849634e9da 100644 --- a/packages/shared-components/src/index.ts +++ b/packages/shared-components/src/index.ts @@ -19,6 +19,7 @@ export * from "./pill-input/Pill"; export * from "./pill-input/PillInput"; export * from "./rich-list/RichItem"; export * from "./rich-list/RichList"; +export * from "./room-list/RoomListSearchView"; export * from "./utils/Box"; export * from "./utils/Flex"; diff --git a/packages/shared-components/src/room-list/RoomListSearchView/RoomListSearchView.module.css b/packages/shared-components/src/room-list/RoomListSearchView/RoomListSearchView.module.css new file mode 100644 index 0000000000..9b7097373c --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListSearchView/RoomListSearchView.module.css @@ -0,0 +1,47 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +.view { + /* From figma, this should be aligned with the room header */ + min-height: 64px; + box-sizing: border-box; + border-bottom: var(--cpd-border-width-1) solid var(--cpd-color-bg-subtle-primary); + padding: 0 var(--cpd-space-3x); +} + +.search { + /* The search button should take all the remaining space */ + flex: 1; + /* !important is needed to override compound button in EW */ + font: var(--cpd-font-body-md-regular) !important; + color: var(--cpd-color-text-secondary) !important; + min-width: 0; + + svg { + fill: var(--cpd-color-icon-secondary); + } +} + +.search_container { + flex: 1; + + /* Shrink and truncate the search text */ + white-space: nowrap; + overflow: hidden; + + kbd { + font-family: inherit; + } +} + +.search_text { + min-width: 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + text-align: start; +} diff --git a/packages/shared-components/src/room-list/RoomListSearchView/RoomListSearchView.stories.tsx b/packages/shared-components/src/room-list/RoomListSearchView/RoomListSearchView.stories.tsx new file mode 100644 index 0000000000..66f5af461c --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListSearchView/RoomListSearchView.stories.tsx @@ -0,0 +1,74 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { type JSX } from "react"; +import { fn } from "storybook/test"; + +import type { Meta, StoryFn } from "@storybook/react-vite"; +import { + RoomListSearchView, + type RoomListSearchViewActions, + type RoomListSearchViewSnapshot, +} from "./RoomListSearchView"; +import { useMockedViewModel } from "../../useMockedViewModel"; + +type RoomListSearchProps = RoomListSearchViewSnapshot & RoomListSearchViewActions; + +const RoomListSearchViewWrapper = ({ + onSearchClick, + onDialPadClick, + onExploreClick, + ...rest +}: RoomListSearchProps): JSX.Element => { + const vm = useMockedViewModel(rest, { + onSearchClick, + onDialPadClick, + onExploreClick, + }); + return ; +}; + +export default { + title: "Room List/RoomListSearchView", + component: RoomListSearchViewWrapper, + tags: ["autodocs"], + args: { + displayExploreButton: true, + displayDialButton: false, + searchShortcut: "⌘ K", + onSearchClick: fn(), + onDialPadClick: fn(), + onExploreClick: fn(), + }, + parameters: { + design: { + type: "figma", + url: "https://www.figma.com/design/vlmt46QDdE4dgXDiyBJXqp/ER-33-Left-Panel-2025?node-id=98-1979&t=vafb4zoYMNLRuAbh-4", + }, + }, +} as Meta; + +const Template: StoryFn = (args) => ; + +export const Default = Template.bind({}); + +export const WithDialPad = Template.bind({}); +WithDialPad.args = { + displayDialButton: true, +}; + +export const WithoutExplore = Template.bind({}); +WithoutExplore.args = { + displayExploreButton: false, +}; + +export const AllButtons = Template.bind({}); +AllButtons.args = { + displayExploreButton: true, + displayDialButton: true, + searchShortcut: "⌘ K", +}; diff --git a/packages/shared-components/src/room-list/RoomListSearchView/RoomListSearchView.test.tsx b/packages/shared-components/src/room-list/RoomListSearchView/RoomListSearchView.test.tsx new file mode 100644 index 0000000000..1a256d63b1 --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListSearchView/RoomListSearchView.test.tsx @@ -0,0 +1,103 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import { render, screen } from "jest-matrix-react"; +import { composeStories } from "@storybook/react-vite"; +import React from "react"; +import userEvent from "@testing-library/user-event"; + +import * as stories from "./RoomListSearchView.stories"; +import { + RoomListSearchView, + type RoomListSearchViewActions, + type RoomListSearchViewSnapshot, +} from "./RoomListSearchView"; +import { MockViewModel } from "../../viewmodel/MockViewModel"; + +const { Default, WithDialPad, WithoutExplore, AllButtons } = composeStories(stories); + +describe("RoomListSearchView", () => { + afterEach(() => { + jest.clearAllMocks(); + }); + + describe("Storybook snapshots", () => { + it("renders the default state", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders with dial pad button", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders without explore button", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it("renders with all buttons visible", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + }); + + describe("User interactions", () => { + const onSearchClick = jest.fn(); + const onDialPadClick = jest.fn(); + const onExploreClick = jest.fn(); + + class TestViewModel extends MockViewModel implements RoomListSearchViewActions { + public onSearchClick = onSearchClick; + public onDialPadClick = onDialPadClick; + public onExploreClick = onExploreClick; + } + + it("should call onSearchClick when search button is clicked", async () => { + const user = userEvent.setup(); + const vm = new TestViewModel({ + displayExploreButton: false, + displayDialButton: false, + searchShortcut: "⌘ K", + }); + + render(); + + await user.click(screen.getByRole("button", { name: "Search ⌘ K" })); + expect(onSearchClick).toHaveBeenCalledTimes(1); + }); + + it("should call onDialPadClick when dial pad button is clicked", async () => { + const user = userEvent.setup(); + const vm = new TestViewModel({ + displayExploreButton: false, + displayDialButton: true, + searchShortcut: "⌘ K", + }); + + render(); + + await user.click(screen.getByRole("button", { name: "Open dial pad" })); + expect(onDialPadClick).toHaveBeenCalledTimes(1); + }); + + it("should call onExploreClick when explore button is clicked", async () => { + const user = userEvent.setup(); + const vm = new TestViewModel({ + displayExploreButton: true, + displayDialButton: false, + searchShortcut: "⌘ K", + }); + + render(); + + await user.click(screen.getByRole("button", { name: "Explore rooms" })); + expect(onExploreClick).toHaveBeenCalledTimes(1); + }); + }); +}); diff --git a/packages/shared-components/src/room-list/RoomListSearchView/RoomListSearchView.tsx b/packages/shared-components/src/room-list/RoomListSearchView/RoomListSearchView.tsx new file mode 100644 index 0000000000..0c652328ec --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListSearchView/RoomListSearchView.tsx @@ -0,0 +1,119 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { type JSX, type MouseEventHandler } from "react"; +import { Button } from "@vector-im/compound-web"; +import ExploreIcon from "@vector-im/compound-design-tokens/assets/web/icons/explore"; +import SearchIcon from "@vector-im/compound-design-tokens/assets/web/icons/search"; +import DialPadIcon from "@vector-im/compound-design-tokens/assets/web/icons/dial-pad"; + +import styles from "./RoomListSearchView.module.css"; +import { type ViewModel } from "../../viewmodel/ViewModel"; +import { useViewModel } from "../../useViewModel"; +import { Flex } from "../../utils/Flex"; +import { useI18n } from "../../utils/i18nContext"; + +export interface RoomListSearchViewSnapshot { + /** + * Whether to display the explore button. + */ + displayExploreButton: boolean; + /** + * Whether to display the dial pad button. + */ + displayDialButton: boolean; + /** + * The keyboard shortcut text to display for the search action. + * For example: "⌘ K" on macOS or "Ctrl K" on other platforms. + */ + searchShortcut: string; +} + +export interface RoomListSearchViewActions { + /** + * Handles the click event on the search button. + */ + onSearchClick: MouseEventHandler; + /** + * Handles the click event on the dial pad button. + */ + onDialPadClick: MouseEventHandler; + /** + * Handles the click event on the explore button. + */ + onExploreClick: MouseEventHandler; +} + +/** + * The view model for the room list search component. + */ +export type RoomListSearchViewModel = ViewModel & RoomListSearchViewActions; + +interface RoomListSearchViewProps { + /** + * The view model for the room list search component. + */ + vm: RoomListSearchViewModel; +} + +/** + * A search component to be displayed at the top of the room list. + * The component provides search functionality, optional dial pad access, and optional room exploration. + * + * @example + * ```tsx + * + * ``` + */ +export function RoomListSearchView({ vm }: Readonly): JSX.Element { + const { translate: _t } = useI18n(); + const { displayExploreButton, displayDialButton, searchShortcut } = useViewModel(vm); + + return ( + + + {displayDialButton && ( + + + + +`; + +exports[`RoomListSearchView Storybook snapshots renders with all buttons visible 1`] = ` +
+ +
+`; + +exports[`RoomListSearchView Storybook snapshots renders with dial pad button 1`] = ` +
+ +
+`; + +exports[`RoomListSearchView Storybook snapshots renders without explore button 1`] = ` +
+ +
+`; diff --git a/packages/shared-components/src/room-list/RoomListSearchView/index.ts b/packages/shared-components/src/room-list/RoomListSearchView/index.ts new file mode 100644 index 0000000000..a750dca7db --- /dev/null +++ b/packages/shared-components/src/room-list/RoomListSearchView/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +export type { RoomListSearchViewModel, RoomListSearchViewSnapshot } from "./RoomListSearchView"; +export { RoomListSearchView } from "./RoomListSearchView"; diff --git a/playwright/e2e/accessibility/keyboard-navigation.spec.ts b/playwright/e2e/accessibility/keyboard-navigation.spec.ts index 6635a01d57..8ba6cc3a92 100644 --- a/playwright/e2e/accessibility/keyboard-navigation.spec.ts +++ b/playwright/e2e/accessibility/keyboard-navigation.spec.ts @@ -29,7 +29,7 @@ test.describe("Landmark navigation tests", () => { // Pressing Control+F6 again will focus room search await page.keyboard.press("ControlOrMeta+F6"); - await expect(page.locator(".mx_RoomListSearch_search")).toBeFocused(); + await expect(page.locator("#room-list-search-button")).toBeFocused(); // Pressing Control+F6 again will focus the message composer await page.keyboard.press("ControlOrMeta+F6"); @@ -44,7 +44,7 @@ test.describe("Landmark navigation tests", () => { await expect(page.locator(".mx_HomePage")).toBeFocused(); await page.keyboard.press("ControlOrMeta+Shift+F6"); - await expect(page.locator(".mx_RoomListSearch_search")).toBeFocused(); + await expect(page.locator("#room-list-search-button")).toBeFocused(); await page.keyboard.press("ControlOrMeta+Shift+F6"); await expect(page.locator(".mx_SpaceButton_active")).toBeFocused(); @@ -75,7 +75,7 @@ test.describe("Landmark navigation tests", () => { // Pressing Control+F6 again will focus room search await page.keyboard.press("ControlOrMeta+F6"); - await expect(page.locator(".mx_RoomListSearch_search")).toBeFocused(); + await expect(page.locator("#room-list-search-button")).toBeFocused(); // Pressing Control+F6 again will focus the room tile in the room list await page.keyboard.press("ControlOrMeta+F6"); @@ -97,7 +97,7 @@ test.describe("Landmark navigation tests", () => { await expect(page.locator(".mx_RoomListItemView_selected")).toBeFocused(); await page.keyboard.press("ControlOrMeta+Shift+F6"); - await expect(page.locator(".mx_RoomListSearch_search")).toBeFocused(); + await expect(page.locator("#room-list-search-button")).toBeFocused(); await page.keyboard.press("ControlOrMeta+Shift+F6"); await expect(page.locator(".mx_SpaceButton_active")).toBeFocused(); @@ -131,7 +131,7 @@ test.describe("Landmark navigation tests", () => { // Pressing Control+F6 again will focus room search await page.keyboard.press("ControlOrMeta+F6"); - await expect(page.locator(".mx_RoomListSearch_search")).toBeFocused(); + await expect(page.locator("#room-list-search-button")).toBeFocused(); // Pressing Control+F6 again will focus the room tile in the room list await page.keyboard.press("ControlOrMeta+F6"); @@ -153,7 +153,7 @@ test.describe("Landmark navigation tests", () => { await expect(page.locator(".mx_RoomListItemView")).toBeFocused(); await page.keyboard.press("ControlOrMeta+Shift+F6"); - await expect(page.locator(".mx_RoomListSearch_search")).toBeFocused(); + await expect(page.locator("#room-list-search-button")).toBeFocused(); await page.keyboard.press("ControlOrMeta+Shift+F6"); await expect(page.locator(".mx_SpaceButton_active")).toBeFocused(); diff --git a/playwright/e2e/voip/pstn.spec.ts b/playwright/e2e/voip/pstn.spec.ts index 0275b88067..4241db6522 100644 --- a/playwright/e2e/voip/pstn.spec.ts +++ b/playwright/e2e/voip/pstn.spec.ts @@ -24,7 +24,7 @@ test.describe("PSTN", () => { await toasts.rejectToast("Notifications"); await toasts.assertNoToasts(); - await expect(page.locator(".mx_RoomListSearch")).toMatchScreenshot("dialpad-trigger.png"); + await expect(page.getByTestId("room-list-search")).toMatchScreenshot("dialpad-trigger.png"); await page.getByLabel("Open dial pad").click(); await expect(page.locator(".mx_Dialog")).toMatchScreenshot("dialpad.png"); }); diff --git a/res/css/_components.pcss b/res/css/_components.pcss index 21e39a1584..fe527fdc5b 100644 --- a/res/css/_components.pcss +++ b/res/css/_components.pcss @@ -273,7 +273,6 @@ @import "./views/rooms/RoomListPanel/_RoomListItemView.pcss"; @import "./views/rooms/RoomListPanel/_RoomListPanel.pcss"; @import "./views/rooms/RoomListPanel/_RoomListPrimaryFilters.pcss"; -@import "./views/rooms/RoomListPanel/_RoomListSearch.pcss"; @import "./views/rooms/RoomListPanel/_RoomListSecondaryFilters.pcss"; @import "./views/rooms/RoomListPanel/_RoomListSkeleton.pcss"; @import "./views/rooms/_AppsDrawer.pcss"; diff --git a/res/css/views/rooms/RoomListPanel/_RoomListSearch.pcss b/res/css/views/rooms/RoomListPanel/_RoomListSearch.pcss deleted file mode 100644 index 472badc3ad..0000000000 --- a/res/css/views/rooms/RoomListPanel/_RoomListSearch.pcss +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2025 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial - * Please see LICENSE files in the repository root for full details. - */ - -.mx_RoomListSearch { - /* From figma, this should be aligned with the room header */ - flex: 0 0 64px; - box-sizing: border-box; - border-bottom: var(--cpd-border-width-1) solid var(--cpd-color-bg-subtle-primary); - padding: 0 var(--cpd-space-3x); - - .mx_RoomListSearch_search { - /* The search button should take all the remaining space */ - flex: 1; - font: var(--cpd-font-body-md-regular); - color: var(--cpd-color-text-secondary); - min-width: 0; - - svg { - fill: var(--cpd-color-icon-secondary); - } - - span { - flex: 1; - - kbd { - font-family: inherit; - } - - /* Shrink and truncate the search text */ - white-space: nowrap; - overflow: hidden; - .mx_RoomListSearch_search_text { - min-width: 0; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - text-align: start; - } - } - } -} diff --git a/src/accessibility/LandmarkNavigation.ts b/src/accessibility/LandmarkNavigation.ts index 404e01e99c..632c7ec613 100644 --- a/src/accessibility/LandmarkNavigation.ts +++ b/src/accessibility/LandmarkNavigation.ts @@ -75,7 +75,7 @@ const landmarkToDomElementMap: Record HTMLElement | null | undef [Landmark.ROOM_SEARCH]: () => SettingsStore.getValue("feature_new_room_list") - ? document.querySelector(".mx_RoomListSearch_search") + ? document.querySelector("#room-list-search-button") : document.querySelector(".mx_RoomSearch"), [Landmark.ROOM_LIST]: () => SettingsStore.getValue("feature_new_room_list") diff --git a/src/components/views/rooms/RoomListPanel/RoomListSearch.tsx b/src/components/views/rooms/RoomListPanel/RoomListSearch.tsx index f1c3c2e66d..0354831a9e 100644 --- a/src/components/views/rooms/RoomListPanel/RoomListSearch.tsx +++ b/src/components/views/rooms/RoomListPanel/RoomListSearch.tsx @@ -5,24 +5,10 @@ * Please see LICENSE files in the repository root for full details. */ -import React, { type JSX } from "react"; -import { Button } from "@vector-im/compound-web"; -import ExploreIcon from "@vector-im/compound-design-tokens/assets/web/icons/explore"; -import SearchIcon from "@vector-im/compound-design-tokens/assets/web/icons/search"; -import DialPadIcon from "@vector-im/compound-design-tokens/assets/web/icons/dial-pad"; -import { Flex } from "@element-hq/web-shared-components"; +import React, { useEffect, type JSX } from "react"; +import { RoomListSearchView, useCreateAutoDisposedViewModel } from "@element-hq/web-shared-components"; -import { IS_MAC, Key } from "../../../../Keyboard"; -import { _t } from "../../../../languageHandler"; -import { ALTERNATE_KEY_NAME } from "../../../../accessibility/KeyboardShortcuts"; -import { shouldShowComponent } from "../../../../customisations/helpers/UIComponents"; -import { UIComponent } from "../../../../settings/UIFeature"; -import { MetaSpace } from "../../../../stores/spaces"; -import { Action } from "../../../../dispatcher/actions"; -import PosthogTrackers from "../../../../PosthogTrackers"; -import defaultDispatcher from "../../../../dispatcher/dispatcher"; -import { useTypedEventEmitterState } from "../../../../hooks/useEventEmitter"; -import LegacyCallHandler, { LegacyCallHandlerEvent } from "../../../../LegacyCallHandler"; +import { RoomListSearchViewModel } from "../../../../viewmodels/room-list/RoomListSearchViewModel"; type RoomListSearchProps = { /** @@ -37,53 +23,10 @@ type RoomListSearchProps = { * The `Explore` button is displayed only in the Home meta space and when UIComponent.ExploreRooms is enabled. */ export function RoomListSearch({ activeSpace }: RoomListSearchProps): JSX.Element { - const displayExploreButton = activeSpace === MetaSpace.Home && shouldShowComponent(UIComponent.ExploreRooms); - // We only display the dial button if the user is can make PSTN calls - const displayDialButton = useTypedEventEmitterState( - LegacyCallHandler.instance, - LegacyCallHandlerEvent.ProtocolSupport, - () => LegacyCallHandler.instance.getSupportsPstnProtocol(), - ); + const vm = useCreateAutoDisposedViewModel(() => new RoomListSearchViewModel({ activeSpace })); + useEffect(() => { + vm.setActiveSpace(activeSpace); + }, [activeSpace, vm]); - return ( - - - {displayDialButton && ( - - - - -`; - -exports[` should display the dial button when the PTSN protocol is not supported 1`] = ` - - - -`; - -exports[` should hide the explore button when UIComponent.ExploreRooms is disabled 1`] = ` - - - -`; - -exports[` should hide the explore button when the active space is not MetaSpace.Home 1`] = ` - - ); - tabs.push( - new Tab(TabId.DialPad, _td("invite|transfer_dial_pad_tab"), "mx_InviteDialog_dialPadIcon", dialPadSection), - ); + tabs.push(new Tab(TabId.DialPad, _td("invite|transfer_dial_pad_tab"), , dialPadSection)); const consultConnectSection = (
diff --git a/src/components/views/dialogs/LeaveSpaceDialog.tsx b/src/components/views/dialogs/LeaveSpaceDialog.tsx index 7796bf4f61..37838292ff 100644 --- a/src/components/views/dialogs/LeaveSpaceDialog.tsx +++ b/src/components/views/dialogs/LeaveSpaceDialog.tsx @@ -8,6 +8,7 @@ Please see LICENSE files in the repository root for full details. import React, { useMemo, useState } from "react"; import { type Room, JoinRule } from "matrix-js-sdk/src/matrix"; +import { InfoSolidIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; import { _t } from "../../../languageHandler"; import DialogButtons from "../elements/DialogButtons"; @@ -88,7 +89,12 @@ const LeaveSpaceDialog: React.FC = ({ space, onFinished }) => { /> )} - {onlyAdminWarning &&
{onlyAdminWarning}
} + {onlyAdminWarning && ( +
+ + {onlyAdminWarning} +
+ )}
= ({ room, selected = [], if (newSelected.size < 1) { inviteOnlyWarning = (
+ {_t("room_settings|security|join_rule_restricted_dialog_empty_warning")}
); @@ -183,7 +185,8 @@ const ManageRestrictedJoinRuleDialog: React.FC = ({ room, selected = [],

{_t("room_settings|security|join_rule_restricted_dialog_heading_other")}

-
{_t("room_settings|security|join_rule_restricted_dialog_heading_unknown")}
+ + {_t("room_settings|security|join_rule_restricted_dialog_heading_unknown")}
{filteredOtherEntries.map((space) => { return ( diff --git a/src/components/views/dialogs/RoomSettingsDialog.tsx b/src/components/views/dialogs/RoomSettingsDialog.tsx index 7e7a26ed2d..9881d96cd7 100644 --- a/src/components/views/dialogs/RoomSettingsDialog.tsx +++ b/src/components/views/dialogs/RoomSettingsDialog.tsx @@ -10,6 +10,14 @@ Please see LICENSE files in the repository root for full details. import React from "react"; import { RoomEvent, type Room, RoomStateEvent, type MatrixEvent, EventType } from "matrix-js-sdk/src/matrix"; +import { + AdminIcon, + GroupIcon, + LockSolidIcon, + PollsIcon, + SettingsSolidIcon, + VoiceCallSolidIcon, +} from "@vector-im/compound-design-tokens/assets/web/icons"; import TabbedView, { Tab } from "../../structures/TabbedView"; import { _t, _td } from "../../../languageHandler"; @@ -31,6 +39,9 @@ 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 { Icon as AdvancedIcon } from "../../../../res/img/element-icons/room/settings/advanced.svg"; +import { Icon as NotificationsIcon } from "../../../../res/img/element-icons/notifications.svg"; +import { Icon as BridgeIcon } from "../../../../res/img/feather-customised/bridge.svg"; export const enum RoomSettingsTab { General = "ROOM_GENERAL_TAB", @@ -129,7 +140,7 @@ class RoomSettingsDialog extends React.Component { new Tab( RoomSettingsTab.General, _td("common|general"), - "mx_RoomSettingsDialog_settingsIcon", + , , "RoomSettingsGeneral", ), @@ -139,7 +150,7 @@ class RoomSettingsDialog extends React.Component { new Tab( RoomSettingsTab.People, _td("common|people"), - "mx_RoomSettingsDialog_peopleIcon", + , , ), ); @@ -149,7 +160,7 @@ class RoomSettingsDialog extends React.Component { new Tab( RoomSettingsTab.Voip, _td("settings|voip|title"), - "mx_RoomSettingsDialog_voiceIcon", + , , ), ); @@ -158,7 +169,7 @@ class RoomSettingsDialog extends React.Component { new Tab( RoomSettingsTab.Security, _td("room_settings|security|title"), - "mx_RoomSettingsDialog_securityIcon", + , this.props.onFinished(true)} />, "RoomSettingsSecurityPrivacy", ), @@ -167,7 +178,7 @@ class RoomSettingsDialog extends React.Component { new Tab( RoomSettingsTab.Roles, _td("room_settings|permissions|title"), - "mx_RoomSettingsDialog_rolesIcon", + , , "RoomSettingsRolesPermissions", ), @@ -176,7 +187,7 @@ class RoomSettingsDialog extends React.Component { new Tab( RoomSettingsTab.Notifications, _td("notifications|enable_prompt_toast_title"), - "mx_RoomSettingsDialog_notificationsIcon", + , this.props.onFinished(true)} @@ -190,7 +201,7 @@ class RoomSettingsDialog extends React.Component { new Tab( RoomSettingsTab.Bridges, _td("room_settings|bridges|title"), - "mx_RoomSettingsDialog_bridgesIcon", + , , "RoomSettingsBridges", ), @@ -201,7 +212,7 @@ class RoomSettingsDialog extends React.Component { new Tab( RoomSettingsTab.PollHistory, _td("right_panel|polls_button"), - "mx_RoomSettingsDialog_pollsIcon", + , this.props.onFinished(true)} />, ), ); @@ -211,7 +222,7 @@ class RoomSettingsDialog extends React.Component { new Tab( RoomSettingsTab.Advanced, _td("common|advanced"), - "mx_RoomSettingsDialog_warningIcon", + , this.props.onFinished(true)} diff --git a/src/components/views/dialogs/SpacePreferencesDialog.tsx b/src/components/views/dialogs/SpacePreferencesDialog.tsx index 3bb3416524..69fa897ec3 100644 --- a/src/components/views/dialogs/SpacePreferencesDialog.tsx +++ b/src/components/views/dialogs/SpacePreferencesDialog.tsx @@ -8,6 +8,7 @@ Please see LICENSE files in the repository root for full details. import React, { type ChangeEvent } from "react"; import { type Room } from "matrix-js-sdk/src/matrix"; +import { VisibilityOnIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; import { _t, _td } from "../../../languageHandler"; import BaseDialog from "../dialogs/BaseDialog"; @@ -63,7 +64,7 @@ const SpacePreferencesDialog: React.FC = ({ space, onFinished }) => { new Tab( SpacePreferenceTab.Appearance, _td("common|appearance"), - "mx_SpacePreferencesDialog_appearanceIcon", + , , ), ]; diff --git a/src/components/views/dialogs/SpaceSettingsDialog.tsx b/src/components/views/dialogs/SpaceSettingsDialog.tsx index 797622a271..336dee0c87 100644 --- a/src/components/views/dialogs/SpaceSettingsDialog.tsx +++ b/src/components/views/dialogs/SpaceSettingsDialog.tsx @@ -8,6 +8,7 @@ Please see LICENSE files in the repository root for full details. import React, { useMemo } from "react"; import { type Room, type MatrixClient } from "matrix-js-sdk/src/matrix"; +import { AdminIcon, SettingsSolidIcon, VisibilityOnIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; import { _t, _td } from "../../../languageHandler"; import BaseDialog from "./BaseDialog"; @@ -22,6 +23,7 @@ import AdvancedRoomSettingsTab from "../settings/tabs/room/AdvancedRoomSettingsT import RolesRoomSettingsTab from "../settings/tabs/room/RolesRoomSettingsTab"; import { Action } from "../../../dispatcher/actions"; import { type NonEmptyArray } from "../../../@types/common"; +import { Icon as AdvancedIcon } from "../../../../res/img/element-icons/room/settings/advanced.svg"; export enum SpaceSettingsTab { General = "SPACE_GENERAL_TAB", @@ -48,26 +50,26 @@ const SpaceSettingsDialog: React.FC = ({ matrixClient: cli, space, onFin new Tab( SpaceSettingsTab.General, _td("common|general"), - "mx_SpaceSettingsDialog_generalIcon", + , , ), new Tab( SpaceSettingsTab.Visibility, _td("room_settings|visibility|title"), - "mx_SpaceSettingsDialog_visibilityIcon", + , , ), new Tab( SpaceSettingsTab.Roles, _td("room_settings|permissions|title"), - "mx_RoomSettingsDialog_rolesIcon", + , , ), SettingsStore.getValue(UIFeature.AdvancedSettings) ? new Tab( SpaceSettingsTab.Advanced, _td("common|advanced"), - "mx_RoomSettingsDialog_warningIcon", + , , ) : null, diff --git a/src/components/views/elements/ExternalLink.tsx b/src/components/views/elements/ExternalLink.tsx index 0e3856e132..7b6d2852ee 100644 --- a/src/components/views/elements/ExternalLink.tsx +++ b/src/components/views/elements/ExternalLink.tsx @@ -8,6 +8,7 @@ Please see LICENSE files in the repository root for full details. import React, { type DetailedHTMLProps, type AnchorHTMLAttributes } from "react"; import classNames from "classnames"; +import PopOutIcon from "@vector-im/compound-design-tokens/assets/web/icons/pop-out"; interface Props extends DetailedHTMLProps, HTMLAnchorElement> {} @@ -17,7 +18,7 @@ interface Props extends DetailedHTMLProps = ({ children, className, ...rest }) => (
{children} - + ); diff --git a/src/components/views/elements/JoinRuleDropdown.tsx b/src/components/views/elements/JoinRuleDropdown.tsx index 860b87fa00..ac94112f2b 100644 --- a/src/components/views/elements/JoinRuleDropdown.tsx +++ b/src/components/views/elements/JoinRuleDropdown.tsx @@ -8,6 +8,7 @@ Please see LICENSE files in the repository root for full details. import React, { type ReactElement } from "react"; import { JoinRule } from "matrix-js-sdk/src/matrix"; +import { GroupIcon, LockSolidIcon, PublicIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; import Dropdown from "./Dropdown"; import { type NonEmptyArray } from "../../../@types/common"; @@ -36,6 +37,7 @@ const JoinRuleDropdown: React.FC = ({ }) => { const options = [
+ {labelInvite}
, ] as NonEmptyArray; @@ -44,6 +46,7 @@ const JoinRuleDropdown: React.FC = ({ options.push( (
+ {labelPublic}
) as ReactElement & { key: string }, @@ -65,6 +68,7 @@ const JoinRuleDropdown: React.FC = ({ options.unshift( (
+ {labelRestricted}
) as ReactElement & { key: string }, diff --git a/src/components/views/rooms/ReplyPreview.tsx b/src/components/views/rooms/ReplyPreview.tsx index db8f6f4a9e..13616b1fba 100644 --- a/src/components/views/rooms/ReplyPreview.tsx +++ b/src/components/views/rooms/ReplyPreview.tsx @@ -8,6 +8,7 @@ Please see LICENSE files in the repository root for full details. import React, { type JSX } from "react"; import { type MatrixEvent } from "matrix-js-sdk/src/matrix"; +import { CloseIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; import dis from "../../../dispatcher/dispatcher"; import { _t } from "../../../languageHandler"; @@ -44,7 +45,9 @@ export default class ReplyPreview extends React.Component { cancelQuoting(this.context.timelineRenderingType)} - /> + > + +
diff --git a/test/unit-tests/__snapshots__/Terms-test.tsx.snap b/test/unit-tests/__snapshots__/Terms-test.tsx.snap index 27354299dc..7c1bbaa5c0 100644 --- a/test/unit-tests/__snapshots__/Terms-test.tsx.snap +++ b/test/unit-tests/__snapshots__/Terms-test.tsx.snap @@ -74,9 +74,21 @@ exports[`dialogTermsInteractionCallback should render a dialog with the expected target="_blank" > Terms - + fill="currentColor" + height="1em" + viewBox="0 0 24 24" + width="1em" + xmlns="http://www.w3.org/2000/svg" + > + + + diff --git a/test/unit-tests/components/structures/TabbedView-test.tsx b/test/unit-tests/components/structures/TabbedView-test.tsx index 38349e288a..ac1996ec95 100644 --- a/test/unit-tests/components/structures/TabbedView-test.tsx +++ b/test/unit-tests/components/structures/TabbedView-test.tsx @@ -8,15 +8,16 @@ Please see LICENSE files in the repository root for full details. import React from "react"; import { act, fireEvent, render } from "jest-matrix-react"; +import { SettingsSolidIcon, VisibilityOnIcon, LabsIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; import TabbedView, { Tab, TabLocation } from "../../../../src/components/structures/TabbedView"; import { type NonEmptyArray } from "../../../../src/@types/common"; import { _t } from "../../../../src/languageHandler"; describe("", () => { - const generalTab = new Tab("GENERAL", "common|general", "general",
general
); - const labsTab = new Tab("LABS", "common|labs", "labs",
labs
); - const appearanceTab = new Tab("APPEARANCE", "common|appearance", "appearance",
appearance
); + const generalTab = new Tab("GENERAL", "common|general", ,
general
); + const labsTab = new Tab("LABS", "common|labs", ,
labs
); + const appearanceTab = new Tab("APPEARANCE", "common|appearance", ,
appearance
); const defaultProps = { tabLocation: TabLocation.LEFT, tabs: [generalTab, labsTab, appearanceTab] as NonEmptyArray>, diff --git a/test/unit-tests/components/structures/__snapshots__/RoomStatusBar-test.tsx.snap b/test/unit-tests/components/structures/__snapshots__/RoomStatusBar-test.tsx.snap index 6ff517c97d..78a5a19aed 100644 --- a/test/unit-tests/components/structures/__snapshots__/RoomStatusBar-test.tsx.snap +++ b/test/unit-tests/components/structures/__snapshots__/RoomStatusBar-test.tsx.snap @@ -33,9 +33,21 @@ exports[`RoomStatusBar unsent messages should render warning w target="_blank" > our terms and conditions - + fill="currentColor" + height="1em" + viewBox="0 0 24 24" + width="1em" + xmlns="http://www.w3.org/2000/svg" + > + + + . @@ -50,10 +62,21 @@ exports[`RoomStatusBar unsent messages should render warning w class="mx_RoomStatusBar_unsentButtonBar" >
+ + + Delete all
unsent messages should render warning w role="button" tabindex="0" > + + + Retry all
@@ -106,10 +140,21 @@ exports[`RoomStatusBar unsent messages should render warning w class="mx_RoomStatusBar_unsentButtonBar" >
+ + + Delete all
unsent messages should render warning w role="button" tabindex="0" > + + + Retry all
diff --git a/test/unit-tests/components/structures/__snapshots__/RoomView-test.tsx.snap b/test/unit-tests/components/structures/__snapshots__/RoomView-test.tsx.snap index ff0d232455..b7b3034415 100644 --- a/test/unit-tests/components/structures/__snapshots__/RoomView-test.tsx.snap +++ b/test/unit-tests/components/structures/__snapshots__/RoomView-test.tsx.snap @@ -218,10 +218,21 @@ exports[`RoomView for a local room in state ERROR should match the snapshot 1`] class="mx_RoomStatusBar_unsentButtonBar" >
+ + + Retry
diff --git a/test/unit-tests/components/structures/__snapshots__/SpaceHierarchy-test.tsx.snap b/test/unit-tests/components/structures/__snapshots__/SpaceHierarchy-test.tsx.snap index 14143cccfa..fac0319a1a 100644 --- a/test/unit-tests/components/structures/__snapshots__/SpaceHierarchy-test.tsx.snap +++ b/test/unit-tests/components/structures/__snapshots__/SpaceHierarchy-test.tsx.snap @@ -17,7 +17,19 @@ exports[`SpaceHierarchy renders 1`] = ` class="mx_AccessibleButton mx_SearchBox_closeButton" role="button" tabindex="-1" - /> + > + + + +
should not render cycles 1`] = ` class="mx_AccessibleButton mx_SearchBox_closeButton" role="button" tabindex="-1" - /> + > + + + +
renders tabs 1`] = ` role="tab" tabindex="0" > - + + + renders tabs 1`] = ` role="tab" tabindex="-1" > - + + + + + renders tabs 1`] = ` role="tab" tabindex="-1" > - + + + Learn more - + fill="currentColor" + height="1em" + viewBox="0 0 24 24" + width="1em" + xmlns="http://www.w3.org/2000/svg" + > + + +
@@ -245,9 +257,21 @@ exports[`CompleteSecurity Allows verifying with recovery key if one is available target="_blank" > Learn more - + fill="currentColor" + height="1em" + viewBox="0 0 24 24" + width="1em" + xmlns="http://www.w3.org/2000/svg" + > + + + diff --git a/test/unit-tests/components/views/dialogs/__snapshots__/CreateRoomDialog-test.tsx.snap b/test/unit-tests/components/views/dialogs/__snapshots__/CreateRoomDialog-test.tsx.snap index cacad8d47d..d7e41df814 100644 --- a/test/unit-tests/components/views/dialogs/__snapshots__/CreateRoomDialog-test.tsx.snap +++ b/test/unit-tests/components/views/dialogs/__snapshots__/CreateRoomDialog-test.tsx.snap @@ -83,6 +83,17 @@ exports[` for a private room should create a private room 1`
+ + + Private room (invite only)
@@ -309,6 +320,17 @@ exports[` for a private room should render not the advanced
+ + + Private room (invite only)
diff --git a/test/unit-tests/components/views/dialogs/__snapshots__/FeedbackDialog-test.tsx.snap b/test/unit-tests/components/views/dialogs/__snapshots__/FeedbackDialog-test.tsx.snap index aad267eeb2..dc954a45e7 100644 --- a/test/unit-tests/components/views/dialogs/__snapshots__/FeedbackDialog-test.tsx.snap +++ b/test/unit-tests/components/views/dialogs/__snapshots__/FeedbackDialog-test.tsx.snap @@ -45,9 +45,21 @@ exports[`FeedbackDialog should respect feedback config 1`] = ` target="_blank" > existing bugs on Github - + fill="currentColor" + height="1em" + viewBox="0 0 24 24" + width="1em" + xmlns="http://www.w3.org/2000/svg" + > + + + first. No match? Start a new one - + fill="currentColor" + height="1em" + viewBox="0 0 24 24" + width="1em" + xmlns="http://www.w3.org/2000/svg" + > + + + . diff --git a/test/unit-tests/components/views/dialogs/__snapshots__/ManageRestrictedJoinRuleDialog-test.tsx.snap b/test/unit-tests/components/views/dialogs/__snapshots__/ManageRestrictedJoinRuleDialog-test.tsx.snap index 63495b949d..e8a7773166 100644 --- a/test/unit-tests/components/views/dialogs/__snapshots__/ManageRestrictedJoinRuleDialog-test.tsx.snap +++ b/test/unit-tests/components/views/dialogs/__snapshots__/ManageRestrictedJoinRuleDialog-test.tsx.snap @@ -48,7 +48,19 @@ exports[` should list spaces which are not par class="mx_AccessibleButton mx_SearchBox_closeButton" role="button" tabindex="-1" - /> + > + + + +
should list spaces which are not par
should render empty state 1`] = ` class="mx_AccessibleButton mx_SearchBox_closeButton" role="button" tabindex="-1" - /> + > + + + +
should render empty state 1`] = `
- + + + - + + + - + + + - +
- + + + should render dialog 1`] = ` target="_blank" > About homeservers - + fill="currentColor" + height="1em" + viewBox="0 0 24 24" + width="1em" + xmlns="http://www.w3.org/2000/svg" + > + + +
renders link correctly 1`] = ` children - + fill="currentColor" + height="1em" + viewBox="0 0 24 24" + width="1em" + xmlns="http://www.w3.org/2000/svg" + > + + + `; @@ -32,9 +44,21 @@ exports[` renders plain text link correctly 1`] = ` target="_blank" > test - + fill="currentColor" + height="1em" + viewBox="0 0 24 24" + width="1em" + xmlns="http://www.w3.org/2000/svg" + > + + + `; diff --git a/test/unit-tests/components/views/settings/__snapshots__/EventIndexPanel-test.tsx.snap b/test/unit-tests/components/views/settings/__snapshots__/EventIndexPanel-test.tsx.snap index aab56e28f7..e26a581e6e 100644 --- a/test/unit-tests/components/views/settings/__snapshots__/EventIndexPanel-test.tsx.snap +++ b/test/unit-tests/components/views/settings/__snapshots__/EventIndexPanel-test.tsx.snap @@ -31,9 +31,21 @@ exports[` when event indexing is not supported renders link t target="_blank" > Element Desktop - + fill="currentColor" + height="1em" + viewBox="0 0 24 24" + width="1em" + xmlns="http://www.w3.org/2000/svg" + > + + + for encrypted messages to appear in search results. @@ -55,9 +67,21 @@ exports[` when event indexing is supported but not installed target="_blank" > search components added - + fill="currentColor" + height="1em" + viewBox="0 0 24 24" + width="1em" + xmlns="http://www.w3.org/2000/svg" + > + + + . diff --git a/test/unit-tests/components/views/settings/tabs/user/__snapshots__/SecurityUserSettingsTab-test.tsx.snap b/test/unit-tests/components/views/settings/tabs/user/__snapshots__/SecurityUserSettingsTab-test.tsx.snap index 146277e9f2..2bf0bb846c 100644 --- a/test/unit-tests/components/views/settings/tabs/user/__snapshots__/SecurityUserSettingsTab-test.tsx.snap +++ b/test/unit-tests/components/views/settings/tabs/user/__snapshots__/SecurityUserSettingsTab-test.tsx.snap @@ -145,9 +145,21 @@ exports[` renders security section 1`] = ` target="_blank" > Element Desktop - + fill="currentColor" + height="1em" + viewBox="0 0 24 24" + width="1em" + xmlns="http://www.w3.org/2000/svg" + > + + + for encrypted messages to appear in search results. diff --git a/test/unit-tests/components/views/spaces/__snapshots__/AddExistingToSpaceDialog-test.tsx.snap b/test/unit-tests/components/views/spaces/__snapshots__/AddExistingToSpaceDialog-test.tsx.snap index 36ebccb871..0019095223 100644 --- a/test/unit-tests/components/views/spaces/__snapshots__/AddExistingToSpaceDialog-test.tsx.snap +++ b/test/unit-tests/components/views/spaces/__snapshots__/AddExistingToSpaceDialog-test.tsx.snap @@ -75,7 +75,19 @@ exports[` looks as expected 1`] = ` class="mx_AccessibleButton mx_SearchBox_closeButton" role="button" tabindex="-1" - /> + > + + + +
homeserver's SSL certificate - + fill="currentColor" + height="1em" + viewBox="0 0 24 24" + width="1em" + xmlns="http://www.w3.org/2000/svg" + > + + + is trusted, and that a browser extension is not blocking requests. From c7134e85324878f06da3936ccad09655876cad0d Mon Sep 17 00:00:00 2001 From: Skye Elliot Date: Mon, 15 Dec 2025 11:43:00 +0000 Subject: [PATCH 21/72] Prevent history visible banner from displaying in threads. (#31535) * fix: Prevent history visible banner from displaying in threads. * tests: Verify banner is not visible in threads. --- .../views/composer/HistoryVisibleBanner.tsx | 4 ++-- .../views/rooms/MessageComposer.tsx | 2 +- .../HistoryVisibleBannerViewModel.tsx | 11 ++++++--- .../HistoryVisibleBannerViewModel-test.tsx | 23 +++++++++++++++++++ 4 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/components/views/composer/HistoryVisibleBanner.tsx b/src/components/views/composer/HistoryVisibleBanner.tsx index cfc50ade6d..1d27696e9d 100644 --- a/src/components/views/composer/HistoryVisibleBanner.tsx +++ b/src/components/views/composer/HistoryVisibleBanner.tsx @@ -11,7 +11,7 @@ import { type Room } from "matrix-js-sdk/src/matrix"; import { HistoryVisibleBannerViewModel } from "../../../viewmodels/composer/HistoryVisibleBannerViewModel"; -export const HistoryVisibleBanner: React.FC<{ room: Room }> = ({ room }) => { - const vm = useCreateAutoDisposedViewModel(() => new HistoryVisibleBannerViewModel({ room })); +export const HistoryVisibleBanner: React.FC<{ room: Room; threadId?: string | null }> = (props) => { + const vm = useCreateAutoDisposedViewModel(() => new HistoryVisibleBannerViewModel(props)); return ; }; diff --git a/src/components/views/rooms/MessageComposer.tsx b/src/components/views/rooms/MessageComposer.tsx index 3c5dbf1891..b347656ce4 100644 --- a/src/components/views/rooms/MessageComposer.tsx +++ b/src/components/views/rooms/MessageComposer.tsx @@ -675,7 +675,7 @@ export class MessageComposer extends React.Component { return (
- +
{ + private static readonly computeSnapshot = ( + room: Room, + threadId?: string | null, + ): HistoryVisibleBannerViewSnapshot => { const featureEnabled = SettingsStore.getValue("feature_share_history_on_invite"); const acknowledged = SettingsStore.getValue("acknowledgedHistoryVisibility", room.roomId); return { visible: featureEnabled && + !threadId && room.hasEncryptionStateEvent() && room.getHistoryVisibility() !== HistoryVisibility.Joined && !acknowledged, @@ -47,7 +52,7 @@ export class HistoryVisibleBannerViewModel }; public constructor(props: Props) { - super(props, HistoryVisibleBannerViewModel.computeSnapshot(props.room)); + super(props, HistoryVisibleBannerViewModel.computeSnapshot(props.room, props.threadId)); this.disposables.trackListener(props.room, RoomStateEvent.Update, () => this.setSnapshot()); @@ -77,7 +82,7 @@ export class HistoryVisibleBannerViewModel ); } - this.snapshot.set(HistoryVisibleBannerViewModel.computeSnapshot(this.props.room)); + this.snapshot.set(HistoryVisibleBannerViewModel.computeSnapshot(this.props.room, this.props.threadId)); } /** diff --git a/test/unit-tests/components/viewmodels/composer/HistoryVisibleBannerViewModel-test.tsx b/test/unit-tests/components/viewmodels/composer/HistoryVisibleBannerViewModel-test.tsx index 12b7edc6f4..0c2670636a 100644 --- a/test/unit-tests/components/viewmodels/composer/HistoryVisibleBannerViewModel-test.tsx +++ b/test/unit-tests/components/viewmodels/composer/HistoryVisibleBannerViewModel-test.tsx @@ -104,6 +104,29 @@ describe("HistoryVisibleBannerViewModel", () => { vm.dispose(); }); + it("should not show the banner in threads", () => { + upsertRoomStateEvents(room, [ + mkEvent({ + event: true, + type: "m.room.encryption", + user: "@user1:server", + content: {}, + }), + mkEvent({ + event: true, + type: "m.room.history_visibility", + user: "@user1:server", + content: { + history_visibility: "shared", + }, + }), + ]); + + const vm = new HistoryVisibleBannerViewModel({ room, threadId: "some thread ID" }); + expect(vm.getSnapshot().visible).toBe(false); + vm.dispose(); + }); + it("should show the banner in encrypted rooms with non-joined history visibility", async () => { upsertRoomStateEvents(room, [ mkEvent({ From 4a3cf3e69d077d5bd363a68b8c7c7733ffc9dbd8 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 15 Dec 2025 12:00:35 +0000 Subject: [PATCH 22/72] Switch to rendering svg icons rather than masking them (#31531) * Switch to rendering svg icons rather than masking them in left panel Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Remove unused stylesheet Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Switch to rendering svg icons rather than masking them for ExternalLink Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Switch to rendering svg icons rather than masking them for TabbedView Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Switch to rendering svg icons rather than masking them for JoinRuleDropdown Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Switch to rendering svg icons rather than masking them in ManageRestrictedJoinRuleDialog Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Switch to rendering svg icons rather than masking them in LeaveSpaceDialog Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Switch to rendering svg icons rather than masking them in ReplyPreview Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Switch to rendering svg icons rather than masking them in SearchBox Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Switch to rendering svg icons rather than masking them in RoomStatusBar Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Fix advanced.svg Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Update snapshots Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Update screenshots Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Iterate Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Fix bad merge conflict resolution Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Switch to rendering svg icons rather than masking them in Toasts Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Switch to rendering svg icons rather than masking them in RoomInfoLine Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Switch to rendering svg icons rather than masking them in UploadBar Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Remove unused class Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Switch to rendering svg icons rather than masking them in ConfirmSpaceUserActionDialog Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Switch to rendering svg icons rather than masking them in FeedbackDialog Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Switch to rendering svg icons rather than masking them in KeyBackupFailedDialog Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Switch to rendering svg icons rather than masking them in CopyableText Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Switch to rendering svg icons rather than masking them in EventTile Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Switch to rendering svg icons rather than masking them in InviteReason Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Delint Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Update tests Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Add test Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Add test Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --------- Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- .../e2e/right-panel/right-panel.spec.ts | 2 +- .../key-storage-out-of-sync-toast-linux.png | Bin 18663 -> 18676 bytes .../spaces.spec.ts/space-room-view-linux.png | Bin 44880 -> 45110 bytes .../edited-code-block-linux.png | Bin 7720 -> 7772 bytes res/css/structures/_ToastContainer.pcss | 34 +-- res/css/structures/_UploadBar.pcss | 74 +++--- res/css/structures/_UserMenu.pcss | 4 - .../_ConfirmSpaceUserActionDialog.pcss | 17 +- res/css/views/dialogs/_FeedbackDialog.pcss | 30 +-- .../security/_KeyBackupFailedDialog.pcss | 16 +- res/css/views/elements/_CopyableText.pcss | 10 +- res/css/views/elements/_InviteReason.pcss | 12 +- res/css/views/rooms/_EventTile.pcss | 37 +-- res/css/views/rooms/_RoomInfoLine.pcss | 29 +-- res/img/feather-customised/bug.svg | 2 +- .../legacy-light/css/_legacy-light.pcss | 2 - res/themes/light/css/_light.pcss | 5 - .../security/NewRecoveryMethodDialog.tsx | 2 + .../security/RecoveryMethodRemovedDialog.tsx | 6 +- src/components/structures/MatrixChat.tsx | 3 +- src/components/structures/ToastContainer.tsx | 4 +- src/components/structures/UploadBar.tsx | 6 +- .../dialogs/ConfirmSpaceUserActionDialog.tsx | 8 +- .../views/dialogs/FeedbackDialog.tsx | 6 +- .../views/elements/CopyableText.tsx | 15 +- .../views/elements/InviteReason.tsx | 2 + src/components/views/messages/CodeBlock.tsx | 15 +- src/components/views/rooms/RoomInfoLine.tsx | 12 +- src/stores/ToastStore.ts | 3 +- ...ast.ts => BulkUnverifiedSessionsToast.tsx} | 5 +- ...ptionToast.ts => SetupEncryptionToast.tsx} | 8 +- src/toasts/UnverifiedSessionToast.tsx | 3 +- .../NewRecoveryMethodDialog-test.tsx.snap | 22 ++ .../BeaconListItem-test.tsx.snap | 17 +- .../__snapshots__/DialogSidebar-test.tsx.snap | 17 +- .../ShareLatestLocation-test.tsx.snap | 17 +- .../DevtoolsDialog-test.tsx.snap | 17 +- .../FeedbackDialog-test.tsx.snap | 3 +- .../__snapshots__/Users-test.tsx.snap | 221 ++++++++++++++++-- .../__snapshots__/TextualBody-test.tsx.snap | 67 +++++- .../__snapshots__/UserInfo-test.tsx.snap | 34 ++- .../UserInfoHeaderView-test.tsx.snap | 17 +- .../views/rooms/RoomInfoLine-test.tsx | 36 +++ .../__snapshots__/RoomInfoLine-test.tsx.snap | 22 ++ .../AdvancedRoomSettingsTab-test.tsx.snap | 17 +- .../toasts/SetupEncryptionToast-test.tsx | 8 + .../UnverifiedSessionToast-test.tsx.snap | 14 +- 47 files changed, 638 insertions(+), 263 deletions(-) rename src/toasts/{BulkUnverifiedSessionsToast.ts => BulkUnverifiedSessionsToast.tsx} (90%) rename src/toasts/{SetupEncryptionToast.ts => SetupEncryptionToast.tsx} (97%) create mode 100644 test/unit-tests/components/views/rooms/RoomInfoLine-test.tsx create mode 100644 test/unit-tests/components/views/rooms/__snapshots__/RoomInfoLine-test.tsx.snap diff --git a/playwright/e2e/right-panel/right-panel.spec.ts b/playwright/e2e/right-panel/right-panel.spec.ts index 5ebf793c3c..6a6aba8fd5 100644 --- a/playwright/e2e/right-panel/right-panel.spec.ts +++ b/playwright/e2e/right-panel/right-panel.spec.ts @@ -207,7 +207,7 @@ test.describe("RightPanel", () => { // \d represents the number of the space members await page - .locator(".mx_RoomInfoLine_private") + .locator(".mx_RoomInfoLine") .getByRole("button", { name: /\d member/ }) .click(); await expect(page.locator(".mx_MemberListView")).toBeVisible(); diff --git a/playwright/snapshots/crypto/toasts.spec.ts/key-storage-out-of-sync-toast-linux.png b/playwright/snapshots/crypto/toasts.spec.ts/key-storage-out-of-sync-toast-linux.png index fc6fab4e7b33b8c4f61ddbe068ed99d74ffa73d4..c5ca8fdc023a87f04acbcc6d550017371381580f 100644 GIT binary patch literal 18676 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%0A|xhku?fc~c(t?- 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 literal 44880 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%0Ac0Uk^Ny(e2bkR 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 DH7Stz diff --git a/playwright/snapshots/timeline/timeline.spec.ts/edited-code-block-linux.png b/playwright/snapshots/timeline/timeline.spec.ts/edited-code-block-linux.png index 0cb456d72ac4f10b77d58588e22db3bed5972267..8b906b346e3e4369942d97014922f2f35402d6e3 100644 GIT binary patch delta 7660 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 svg { + grid-area: icon; + height: 18px; + width: 18px; + color: $muted-fg-color; + align-self: center; + } + + .mx_UploadBar_filename { + grid-area: filename; + color: $muted-fg-color; + position: relative; + font-size: $font-15px; + vertical-align: middle; + } + + .mx_UploadBar_cancel { + grid-area: cancel; + height: 16px; + width: 16px; + color: $muted-fg-color; + align-self: center; + } + .mx_ProgressBar { - width: calc(100% - 40px); /* cheating at a right margin */ + grid-area: progress; + width: 100%; } } @@ -21,39 +53,3 @@ Please see LICENSE files in the repository root for full details. padding-left: 0; } } - -.mx_UploadBar_filename { - color: $muted-fg-color; - position: relative; - padding-right: 38px; /* 32px for cancel icon, 6px for padding */ - padding-left: 22px; /* 18px for icon, 4px for padding */ - font-size: $font-15px; - vertical-align: middle; - - &::before { - content: ""; - height: 18px; - width: 18px; - position: absolute; - top: 0; - left: 0; - mask-repeat: no-repeat; - mask-position: center; - background-color: $muted-fg-color; - mask-image: url("@vector-im/compound-design-tokens/icons/share.svg"); - } -} - -.mx_UploadBar_cancel { - position: absolute; - top: 0; - right: 0; - height: 16px; - width: 16px; - margin-right: 16px; /* align over rightmost button in composer */ - margin-top: 5px; - mask-repeat: no-repeat; - mask-position: center; - background-color: $muted-fg-color; - mask-image: url("@vector-im/compound-design-tokens/icons/close.svg"); -} diff --git a/res/css/structures/_UserMenu.pcss b/res/css/structures/_UserMenu.pcss index 42754a56a2..ddefc84d8f 100644 --- a/res/css/structures/_UserMenu.pcss +++ b/res/css/structures/_UserMenu.pcss @@ -119,8 +119,4 @@ Please see LICENSE files in the repository root for full details. .mx_IconizedContextMenu_icon svg { color: $icon-button-color; } - - .mx_UserMenu_iconMessage::before { - mask-image: url("$(res)/img/element-icons/feedback.svg"); - } } diff --git a/res/css/views/dialogs/_ConfirmSpaceUserActionDialog.pcss b/res/css/views/dialogs/_ConfirmSpaceUserActionDialog.pcss index 1921ef2457..e3ce9db7dc 100644 --- a/res/css/views/dialogs/_ConfirmSpaceUserActionDialog.pcss +++ b/res/css/views/dialogs/_ConfirmSpaceUserActionDialog.pcss @@ -32,27 +32,20 @@ Please see LICENSE files in the repository root for full details. } .mx_ConfirmSpaceUserActionDialog_warning { - position: relative; border-radius: 8px; - padding: 12px 8px 12px 42px; + padding: 12px 8px; background-color: $header-panel-bg-color; font-size: $font-12px; line-height: $font-15px; color: $secondary-content; - &::before { - content: ""; - position: absolute; - left: 10px; - top: calc(50% - 8px); /* vertical centering */ + svg { height: 16px; width: 16px; - background-color: $secondary-content; - mask-repeat: no-repeat; - mask-size: contain; - mask-image: url("@vector-im/compound-design-tokens/icons/info-solid.svg"); - mask-position: center; + vertical-align: -4px; + margin-right: var(--cpd-space-1-5x); + color: $secondary-content; } } } diff --git a/res/css/views/dialogs/_FeedbackDialog.pcss b/res/css/views/dialogs/_FeedbackDialog.pcss index a9e7d97920..88cfdf33a9 100644 --- a/res/css/views/dialogs/_FeedbackDialog.pcss +++ b/res/css/views/dialogs/_FeedbackDialog.pcss @@ -55,33 +55,17 @@ Please see LICENSE files in the repository root for full details. text-decoration: underline; } - &::before, - &::after { - content: ""; + & > svg { position: absolute; - width: 40px; - height: 40px; left: 16px; top: 12px; - } - - &::before { + padding: var(--cpd-space-2x); + width: 24px; + height: 24px; background-color: $icon-button-color; + color: $avatar-initial-color; border-radius: 8px; } - - &::after { - background: $avatar-initial-color; /* TODO */ - mask-position: center; - mask-size: 24px; - mask-repeat: no-repeat; - } - } - - .mx_FeedbackDialog_reportBug { - &::after { - mask-image: url("$(res)/img/feather-customised/bug.svg"); - } } .mx_FeedbackDialog_rateApp { @@ -125,9 +109,5 @@ Please see LICENSE files in the repository root for full details. font-size: 24px; border-color: var(--cpd-color-bg-action-primary-rest); } - - &::after { - mask-image: url("$(res)/img/element-icons/feedback.svg"); - } } } diff --git a/res/css/views/dialogs/security/_KeyBackupFailedDialog.pcss b/res/css/views/dialogs/security/_KeyBackupFailedDialog.pcss index d4596dd501..f4ca40c66e 100644 --- a/res/css/views/dialogs/security/_KeyBackupFailedDialog.pcss +++ b/res/css/views/dialogs/security/_KeyBackupFailedDialog.pcss @@ -10,20 +10,12 @@ Please see LICENSE files in the repository root for full details. } .mx_KeyBackupFailedDialog_title { - position: relative; - padding-left: 45px; padding-bottom: 10px; - &::before { - mask-image: url("@vector-im/compound-design-tokens/icons/error.svg"); - mask-repeat: no-repeat; - background-color: $primary-content; - content: ""; - position: absolute; - top: -6px; - right: 0; - bottom: 0; - left: 0; + svg { + margin-right: var(--cpd-space-2x); + vertical-align: -2px; + color: $primary-content; } } diff --git a/res/css/views/elements/_CopyableText.pcss b/res/css/views/elements/_CopyableText.pcss index 2764fea46c..6219055085 100644 --- a/res/css/views/elements/_CopyableText.pcss +++ b/res/css/views/elements/_CopyableText.pcss @@ -39,17 +39,11 @@ Please see LICENSE files in the repository root for full details. top: 0.15em; background-color: $background; - &::before { - content: ""; - mask-image: url($copy-button-url); - mask-position: center center; - mask-repeat: no-repeat; - mask-size: contain; - background-color: $message-action-bar-fg-color; + svg { width: 1em; height: 1em; + color: $message-action-bar-fg-color; display: block; - background-repeat: no-repeat; } } } diff --git a/res/css/views/elements/_InviteReason.pcss b/res/css/views/elements/_InviteReason.pcss index b007a90c6c..57cdb82351 100644 --- a/res/css/views/elements/_InviteReason.pcss +++ b/res/css/views/elements/_InviteReason.pcss @@ -23,14 +23,12 @@ Please see LICENSE files in the repository root for full details. cursor: pointer; color: $secondary-content; - &::before { - content: ""; - margin-right: 8px; - background-color: $secondary-content; - mask-image: url("@vector-im/compound-design-tokens/icons/visibility-on.svg"); + svg { + width: 16px; + height: 16px; + color: $secondary-content; display: inline-block; - width: 18px; - height: 14px; + margin-right: 8px; } } } diff --git a/res/css/views/rooms/_EventTile.pcss b/res/css/views/rooms/_EventTile.pcss index d8a05fd6ce..cc9656ddf9 100644 --- a/res/css/views/rooms/_EventTile.pcss +++ b/res/css/views/rooms/_EventTile.pcss @@ -918,30 +918,21 @@ $left-gutter: 64px; position: absolute; top: $spacing-8; right: $spacing-8; - width: 19px; - height: 19px; + width: 16px; + height: 16px; visibility: hidden; - background-color: $message-action-bar-fg-color; &.mx_EventTile_buttonBottom { top: 33px; } - &.mx_EventTile_collapseButton, - &.mx_EventTile_expandButton { - mask-size: 75%; + svg { + width: inherit; + height: inherit; + display: block; + color: $message-action-bar-fg-color; } } - - .mx_EventTile_copyButton { - height: 17px; - mask-image: url($copy-button-url); - mask-position: center center; - mask-repeat: no-repeat; - mask-size: contain; - right: 9px; - width: 17px; - } } } @@ -962,20 +953,6 @@ $left-gutter: 64px; cursor: pointer; } -.mx_EventTile_collapseButton, -.mx_EventTile_expandButton { - mask-position: center; - mask-repeat: no-repeat; -} - -.mx_EventTile_collapseButton { - mask-image: url("@vector-im/compound-design-tokens/icons/collapse.svg"); -} - -.mx_EventTile_expandButton { - mask-image: url("@vector-im/compound-design-tokens/icons/expand.svg"); -} - .mx_EventTile_tileError { color: red; text-align: center; diff --git a/res/css/views/rooms/_RoomInfoLine.pcss b/res/css/views/rooms/_RoomInfoLine.pcss index 74ef6c77e1..a9650f27b5 100644 --- a/res/css/views/rooms/_RoomInfoLine.pcss +++ b/res/css/views/rooms/_RoomInfoLine.pcss @@ -10,33 +10,10 @@ Please see LICENSE files in the repository root for full details. color: $secondary-content; display: inline-block; - &::before { - content: ""; - display: inline-block; - height: 1.2em; - mask-position: center; - mask-repeat: no-repeat; - background-color: $tertiary-content; - vertical-align: text-bottom; + svg { margin-right: 6px; - } - - &.mx_RoomInfoLine_public::before { - width: 12px; - mask-size: 12px; - mask-image: url("@vector-im/compound-design-tokens/icons/public.svg"); - } - - &.mx_RoomInfoLine_private::before { - width: 10px; - mask-size: 10px; - mask-image: url("@vector-im/compound-design-tokens/icons/lock-solid.svg"); - } - - &.mx_RoomInfoLine_video::before { - width: 16px; - mask-size: 16px; - mask-image: url("@vector-im/compound-design-tokens/icons/video-call-solid.svg"); + vertical-align: -2px; + color: $tertiary-content; } .mx_RoomInfoLine_members { diff --git a/res/img/feather-customised/bug.svg b/res/img/feather-customised/bug.svg index 8939f8be11..ea2e4222aa 100644 --- a/res/img/feather-customised/bug.svg +++ b/res/img/feather-customised/bug.svg @@ -1,3 +1,3 @@ - + diff --git a/res/themes/legacy-light/css/_legacy-light.pcss b/res/themes/legacy-light/css/_legacy-light.pcss index ca90eb2e55..8c00393d41 100644 --- a/res/themes/legacy-light/css/_legacy-light.pcss +++ b/res/themes/legacy-light/css/_legacy-light.pcss @@ -241,8 +241,6 @@ $event-highlight-bg-color: $yellow-background; /* event timestamp */ $event-timestamp-color: #acacac; -$copy-button-url: "@vector-im/compound-design-tokens/icons/copy.svg"; - /* e2e */ $e2e-verified-color: #0dbd8b; $e2e-warning-color: #ff5b55; diff --git a/res/themes/light/css/_light.pcss b/res/themes/light/css/_light.pcss index dfdb5f6c75..fcab227283 100644 --- a/res/themes/light/css/_light.pcss +++ b/res/themes/light/css/_light.pcss @@ -347,11 +347,6 @@ $focus-brightness: 105%; /* ******************** */ -/* Icon URLs */ -/* ******************** */ -$copy-button-url: "@vector-im/compound-design-tokens/icons/copy.svg"; -/* ******************** */ - /* Location sharing */ /* ******************** */ $location-marker-color: var(--cpd-color-icon-on-solid-primary); diff --git a/src/async-components/views/dialogs/security/NewRecoveryMethodDialog.tsx b/src/async-components/views/dialogs/security/NewRecoveryMethodDialog.tsx index a2fef4e1c9..2642f01560 100644 --- a/src/async-components/views/dialogs/security/NewRecoveryMethodDialog.tsx +++ b/src/async-components/views/dialogs/security/NewRecoveryMethodDialog.tsx @@ -8,6 +8,7 @@ Please see LICENSE files in the repository root for full details. */ import React, { type JSX, useEffect, useState } from "react"; +import { ErrorIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; import dis from "../../../../dispatcher/dispatcher"; import { _t } from "../../../../languageHandler"; @@ -60,6 +61,7 @@ export default function NewRecoveryMethodDialog({ onFinished }: NewRecoveryMetho onFinished={onFinished} title={ + {_t("encryption|new_recovery_method_detected|title")} } diff --git a/src/async-components/views/dialogs/security/RecoveryMethodRemovedDialog.tsx b/src/async-components/views/dialogs/security/RecoveryMethodRemovedDialog.tsx index 7c3abf37b1..8feac6f043 100644 --- a/src/async-components/views/dialogs/security/RecoveryMethodRemovedDialog.tsx +++ b/src/async-components/views/dialogs/security/RecoveryMethodRemovedDialog.tsx @@ -8,6 +8,7 @@ Please see LICENSE files in the repository root for full details. */ import React from "react"; +import { ErrorIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; import dis from "../../../../dispatcher/dispatcher"; import { _t } from "../../../../languageHandler"; @@ -39,7 +40,10 @@ export default class RecoveryMethodRemovedDialog extends React.PureComponent{_t("encryption|recovery_method_removed|title")} + + + {_t("encryption|recovery_method_removed|title")} + ); return ( diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx index 3764051384..8a9ffdd115 100644 --- a/src/components/structures/MatrixChat.tsx +++ b/src/components/structures/MatrixChat.tsx @@ -29,6 +29,7 @@ import { TooltipProvider } from "@vector-im/compound-web"; import "what-input"; import sanitizeHtml from "sanitize-html"; import { I18nContext } from "@element-hq/web-shared-components"; +import { LockSolidIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; import PosthogTrackers from "../../PosthogTrackers"; import { DecryptionFailureTracker } from "../../DecryptionFailureTracker"; @@ -1771,7 +1772,7 @@ export default class MatrixChat extends React.PureComponent { ToastStore.sharedInstance().addOrReplaceToast({ key: "verifreq_" + request.transactionId, title: _t("encryption|verification_requested_toast_title"), - icon: "verification", + icon: , props: { request }, component: VerificationRequestToast, priority: 90, diff --git a/src/components/structures/ToastContainer.tsx b/src/components/structures/ToastContainer.tsx index 649cd1dc59..a84af5a504 100644 --- a/src/components/structures/ToastContainer.tsx +++ b/src/components/structures/ToastContainer.tsx @@ -53,8 +53,7 @@ export default class ToastContainer extends React.Component const { title, icon, key, component, className, bodyClassName, props } = topToast; const bodyClasses = classNames("mx_Toast_body", bodyClassName); const toastClasses = classNames("mx_Toast_toast", className, { - mx_Toast_hasIcon: icon, - [`mx_Toast_icon_${icon}`]: icon, + mx_Toast_hasIcon: !!icon, }); const toastProps = Object.assign({}, props, { key, @@ -81,6 +80,7 @@ export default class ToastContainer extends React.Component toast = (
+ {icon} {titleElement}
{content}
diff --git a/src/components/structures/UploadBar.tsx b/src/components/structures/UploadBar.tsx index 6dbbd4997d..4fbe35f3fd 100644 --- a/src/components/structures/UploadBar.tsx +++ b/src/components/structures/UploadBar.tsx @@ -8,6 +8,7 @@ Please see LICENSE files in the repository root for full details. import React from "react"; import { type Room, type IEventRelation } from "matrix-js-sdk/src/matrix"; +import { CloseIcon, ShareIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; import ContentMessages from "../../ContentMessages"; import dis from "../../dispatcher/dispatcher"; @@ -114,10 +115,13 @@ export default class UploadBar extends React.PureComponent { const uploadSize = fileSize(this.state.currentTotal!); return (
+
{uploadText} ({uploadSize})
- + + +
); diff --git a/src/components/views/dialogs/ConfirmSpaceUserActionDialog.tsx b/src/components/views/dialogs/ConfirmSpaceUserActionDialog.tsx index 3851460bdd..6d1bb38956 100644 --- a/src/components/views/dialogs/ConfirmSpaceUserActionDialog.tsx +++ b/src/components/views/dialogs/ConfirmSpaceUserActionDialog.tsx @@ -8,6 +8,7 @@ Please see LICENSE files in the repository root for full details. import React, { type JSX, type ComponentProps, useMemo, useState } from "react"; import { type Room } from "matrix-js-sdk/src/matrix"; +import { InfoSolidIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; import ConfirmUserActionDialog from "./ConfirmUserActionDialog"; import SpaceStore from "../../../stores/spaces/SpaceStore"; @@ -47,7 +48,12 @@ const ConfirmSpaceUserActionDialog: React.FC = ({ let warning: JSX.Element | undefined; if (warningMessage) { - warning =
{warningMessage}
; + warning = ( +
+ + {warningMessage} +
+ ); } return ( diff --git a/src/components/views/dialogs/FeedbackDialog.tsx b/src/components/views/dialogs/FeedbackDialog.tsx index 5e1efba38f..1775e9667a 100644 --- a/src/components/views/dialogs/FeedbackDialog.tsx +++ b/src/components/views/dialogs/FeedbackDialog.tsx @@ -6,6 +6,7 @@ Please see LICENSE files in the repository root for full details. */ import React, { type JSX, useEffect, useRef, useState } from "react"; +import { ChatSolidIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; import QuestionDialog from "./QuestionDialog"; import { _t } from "../../../languageHandler"; @@ -19,6 +20,7 @@ import { submitFeedback } from "../../../rageshake/submit-rageshake"; import { useStateToggle } from "../../../hooks/useStateToggle"; import StyledCheckbox from "../elements/StyledCheckbox"; import ExternalLink from "../elements/ExternalLink"; +import { Icon as BugIcon } from "../../../../res/img/feather-customised/bug.svg"; interface IProps { feature?: string; @@ -58,6 +60,7 @@ const FeedbackDialog: React.FC = (props: IProps) => { if (hasFeedback) { feedbackSection = (
+

{_t("feedback|comment_label")}

{_t("feedback|platform_username")}

@@ -111,7 +114,8 @@ const FeedbackDialog: React.FC = (props: IProps) => { title={_t("common|feedback")} description={ -
+
+

{_t("common|report_a_bug")}

{_t( diff --git a/src/components/views/elements/CopyableText.tsx b/src/components/views/elements/CopyableText.tsx index 9c2472a202..8deaad1d4f 100644 --- a/src/components/views/elements/CopyableText.tsx +++ b/src/components/views/elements/CopyableText.tsx @@ -9,6 +9,7 @@ Please see LICENSE files in the repository root for full details. import React, { useState } from "react"; import classNames from "classnames"; +import { CopyIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; import { _t } from "../../../languageHandler"; import { copyPlaintext } from "../../../utils/strings"; @@ -21,7 +22,11 @@ interface IProps extends React.HTMLAttributes { className?: string; } -export const CopyTextButton: React.FC> = ({ getTextToCopy, className }) => { +export const CopyTextButton: React.FC> = ({ + getTextToCopy, + className, + children, +}) => { const [tooltip, setTooltip] = useState(undefined); const onCopyClickInternal = async (e: ButtonEvent): Promise => { @@ -45,7 +50,9 @@ export const CopyTextButton: React.FC { if (!open) onHideTooltip(); }} - /> + > + {children} + ); }; @@ -57,7 +64,9 @@ const CopyableText: React.FC = ({ children, getTextToCopy, border = true return (

{children} - + + +
); }; diff --git a/src/components/views/elements/InviteReason.tsx b/src/components/views/elements/InviteReason.tsx index fd44b5a418..eaa65c7408 100644 --- a/src/components/views/elements/InviteReason.tsx +++ b/src/components/views/elements/InviteReason.tsx @@ -8,6 +8,7 @@ Please see LICENSE files in the repository root for full details. import classNames from "classnames"; import React from "react"; +import { VisibilityOnIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; import { sanitizedHtmlNode } from "../../../HtmlUtils"; import { _t } from "../../../languageHandler"; @@ -50,6 +51,7 @@ export default class InviteReason extends React.PureComponent { {this.props.htmlReason ? sanitizedHtmlNode(this.props.htmlReason) : this.props.reason}
+ {_t("common|view_message")}
diff --git a/src/components/views/messages/CodeBlock.tsx b/src/components/views/messages/CodeBlock.tsx index cb21ffb5e0..0a3a80fb89 100644 --- a/src/components/views/messages/CodeBlock.tsx +++ b/src/components/views/messages/CodeBlock.tsx @@ -9,6 +9,7 @@ import React, { type JSX, useState } from "react"; import classNames from "classnames"; import { type DOMNode, Element as ParserElement, domToReact } from "html-react-parser"; import { textContent, getInnerHTML } from "domutils"; +import { CollapseIcon, CopyIcon, ExpandIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; import { useSettingValue } from "../../../hooks/useSettings.ts"; import { CopyTextButton } from "../elements/CopyableText.tsx"; @@ -25,13 +26,9 @@ const ExpandCollapseButton: React.FC<{ onClick(): void; }> = ({ expanded, onClick }) => { return ( - + + {expanded ? : } + ); }; @@ -138,7 +135,9 @@ const CodeBlock: React.FC = ({ preNode }) => { className={classNames("mx_EventTile_button mx_EventTile_copyButton", { mx_EventTile_buttonBottom: !!expandCollapseButton, })} - /> + > + +
); }; diff --git a/src/components/views/rooms/RoomInfoLine.tsx b/src/components/views/rooms/RoomInfoLine.tsx index dd5a113ecb..687c41da34 100644 --- a/src/components/views/rooms/RoomInfoLine.tsx +++ b/src/components/views/rooms/RoomInfoLine.tsx @@ -9,6 +9,7 @@ Please see LICENSE files in the repository root for full details. import React, { type JSX, type FC } from "react"; import { type Room, JoinRule, type MatrixClient } from "matrix-js-sdk/src/matrix"; import { KnownMembership } from "matrix-js-sdk/src/types"; +import { LockSolidIcon, VideoCallSolidIcon, PublicIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; import { _t } from "../../../languageHandler"; import RightPanelStore from "../../../stores/right-panel/RightPanelStore"; @@ -39,16 +40,16 @@ const RoomInfoLine: FC = ({ room }) => { const isVideoRoom = calcIsVideoRoom(room); - let iconClass: string; + let icon: JSX.Element; let roomType: string; if (isVideoRoom) { - iconClass = "mx_RoomInfoLine_video"; + icon = ; roomType = _t("common|video_room"); } else if (joinRule === JoinRule.Public) { - iconClass = "mx_RoomInfoLine_public"; + icon = ; roomType = room.isSpaceRoom() ? _t("common|public_space") : _t("common|public_room"); } else { - iconClass = "mx_RoomInfoLine_private"; + icon = ; roomType = room.isSpaceRoom() ? _t("common|private_space") : _t("common|private_room"); } @@ -75,7 +76,8 @@ const RoomInfoLine: FC = ({ room }) => { } return ( -
+
+ {icon} {roomType} {members}
diff --git a/src/stores/ToastStore.ts b/src/stores/ToastStore.ts index dd09c610b8..41a78ed460 100644 --- a/src/stores/ToastStore.ts +++ b/src/stores/ToastStore.ts @@ -8,6 +8,7 @@ Please see LICENSE files in the repository root for full details. import EventEmitter from "events"; import { logger } from "matrix-js-sdk/src/logger"; +import { type JSX } from "react"; import type React from "react"; import { type ComponentClass } from "../@types/common"; @@ -17,7 +18,7 @@ export interface IToast { // higher priority number will be shown on top of lower priority priority: number; title?: string; - icon?: "verification" | "verification_warning" | "key_storage"; + icon?: JSX.Element; component: C; className?: string; bodyClassName?: string; diff --git a/src/toasts/BulkUnverifiedSessionsToast.ts b/src/toasts/BulkUnverifiedSessionsToast.tsx similarity index 90% rename from src/toasts/BulkUnverifiedSessionsToast.ts rename to src/toasts/BulkUnverifiedSessionsToast.tsx index 9df70cfb9d..7f658dc3ab 100644 --- a/src/toasts/BulkUnverifiedSessionsToast.ts +++ b/src/toasts/BulkUnverifiedSessionsToast.tsx @@ -6,6 +6,9 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ +import React from "react"; +import { ErrorSolidIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; + import { _t } from "../languageHandler"; import dis from "../dispatcher/dispatcher"; import DeviceListener from "../DeviceListener"; @@ -33,7 +36,7 @@ export const showToast = (deviceIds: Set): void => { ToastStore.sharedInstance().addOrReplaceToast({ key: TOAST_KEY, title: _t("encryption|verification|unverified_sessions_toast_title"), - icon: "verification_warning", + icon: , props: { description: _t("encryption|verification|unverified_sessions_toast_description"), primaryLabel: _t("action|review"), diff --git a/src/toasts/SetupEncryptionToast.ts b/src/toasts/SetupEncryptionToast.tsx similarity index 97% rename from src/toasts/SetupEncryptionToast.ts rename to src/toasts/SetupEncryptionToast.tsx index 965d8e17fc..ddf9dd69a7 100644 --- a/src/toasts/SetupEncryptionToast.ts +++ b/src/toasts/SetupEncryptionToast.tsx @@ -7,11 +7,11 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com Please see LICENSE files in the repository root for full details. */ -import KeyIcon from "@vector-im/compound-design-tokens/assets/web/icons/key"; +import React from "react"; +import { KeyIcon, ErrorSolidIcon, SettingsSolidIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; import { type ComponentType } from "react"; import { type Interaction as InteractionEvent } from "@matrix-org/analytics-events/types/typescript/Interaction"; -import type React from "react"; import Modal from "../Modal"; import { _t } from "../languageHandler"; import DeviceListener from "../DeviceListener"; @@ -52,9 +52,9 @@ const getIcon = (kind: Kind): IToast["icon"] => { return undefined; case Kind.VERIFY_THIS_SESSION: case Kind.KEY_STORAGE_OUT_OF_SYNC: - return "verification_warning"; + return ; case Kind.TURN_ON_KEY_STORAGE: - return "key_storage"; + return ; } }; diff --git a/src/toasts/UnverifiedSessionToast.tsx b/src/toasts/UnverifiedSessionToast.tsx index 76d961233c..4a7f7d2be4 100644 --- a/src/toasts/UnverifiedSessionToast.tsx +++ b/src/toasts/UnverifiedSessionToast.tsx @@ -7,6 +7,7 @@ Please see LICENSE files in the repository root for full details. */ import React from "react"; +import { ErrorSolidIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; import { _t } from "../languageHandler"; import dis from "../dispatcher/dispatcher"; @@ -47,7 +48,7 @@ export const showToast = async (deviceId: string): Promise => { ToastStore.sharedInstance().addOrReplaceToast({ key: toastKey(deviceId), title: _t("encryption|verification|unverified_session_toast_title"), - icon: "verification_warning", + icon: , props: { description: device.display_name, detail: , diff --git a/test/unit-tests/async-components/dialogs/security/__snapshots__/NewRecoveryMethodDialog-test.tsx.snap b/test/unit-tests/async-components/dialogs/security/__snapshots__/NewRecoveryMethodDialog-test.tsx.snap index 530bba11ee..2221bd135c 100644 --- a/test/unit-tests/async-components/dialogs/security/__snapshots__/NewRecoveryMethodDialog-test.tsx.snap +++ b/test/unit-tests/async-components/dialogs/security/__snapshots__/NewRecoveryMethodDialog-test.tsx.snap @@ -24,6 +24,17 @@ exports[` when key backup is disabled 1`] = ` + + + New Recovery Method @@ -96,6 +107,17 @@ exports[` when key backup is enabled 1`] = ` + + + New Recovery Method diff --git a/test/unit-tests/components/views/beacon/__snapshots__/BeaconListItem-test.tsx.snap b/test/unit-tests/components/views/beacon/__snapshots__/BeaconListItem-test.tsx.snap index 81d58a18f0..1cc41fd9f3 100644 --- a/test/unit-tests/components/views/beacon/__snapshots__/BeaconListItem-test.tsx.snap +++ b/test/unit-tests/components/views/beacon/__snapshots__/BeaconListItem-test.tsx.snap @@ -62,7 +62,22 @@ exports[` when a beacon is live and has locations renders beac class="mx_AccessibleButton mx_CopyableText_copyButton" role="button" tabindex="0" - /> + > + + + + +
diff --git a/test/unit-tests/components/views/beacon/__snapshots__/DialogSidebar-test.tsx.snap b/test/unit-tests/components/views/beacon/__snapshots__/DialogSidebar-test.tsx.snap index 3b7b73b7ed..3d5922fcbe 100644 --- a/test/unit-tests/components/views/beacon/__snapshots__/DialogSidebar-test.tsx.snap +++ b/test/unit-tests/components/views/beacon/__snapshots__/DialogSidebar-test.tsx.snap @@ -102,7 +102,22 @@ exports[` renders sidebar correctly with beacons 1`] = ` class="mx_AccessibleButton mx_CopyableText_copyButton" role="button" tabindex="0" - /> + > + + + + +
diff --git a/test/unit-tests/components/views/beacon/__snapshots__/ShareLatestLocation-test.tsx.snap b/test/unit-tests/components/views/beacon/__snapshots__/ShareLatestLocation-test.tsx.snap index b3c27d5b96..eab675f369 100644 --- a/test/unit-tests/components/views/beacon/__snapshots__/ShareLatestLocation-test.tsx.snap +++ b/test/unit-tests/components/views/beacon/__snapshots__/ShareLatestLocation-test.tsx.snap @@ -33,7 +33,22 @@ exports[` renders share buttons when there is a location class="mx_AccessibleButton mx_CopyableText_copyButton" role="button" tabindex="0" - /> + > + + + + +
`; diff --git a/test/unit-tests/components/views/dialogs/__snapshots__/DevtoolsDialog-test.tsx.snap b/test/unit-tests/components/views/dialogs/__snapshots__/DevtoolsDialog-test.tsx.snap index 04e36322e0..1a51e40cca 100644 --- a/test/unit-tests/components/views/dialogs/__snapshots__/DevtoolsDialog-test.tsx.snap +++ b/test/unit-tests/components/views/dialogs/__snapshots__/DevtoolsDialog-test.tsx.snap @@ -39,7 +39,22 @@ exports[`DevtoolsDialog renders the devtools dialog 1`] = ` class="mx_AccessibleButton mx_CopyableText_copyButton" role="button" tabindex="0" - /> + > + + + + +
+

Report a bug

diff --git a/test/unit-tests/components/views/dialogs/devtools/__snapshots__/Users-test.tsx.snap b/test/unit-tests/components/views/dialogs/devtools/__snapshots__/Users-test.tsx.snap index 94bdb71047..ee3ebf88b5 100644 --- a/test/unit-tests/components/views/dialogs/devtools/__snapshots__/Users-test.tsx.snap +++ b/test/unit-tests/components/views/dialogs/devtools/__snapshots__/Users-test.tsx.snap @@ -16,7 +16,22 @@ exports[` should render a single device - signed by owner 1`] = ` class="mx_AccessibleButton mx_CopyableText_copyButton" role="button" tabindex="0" - /> + > + + + + +
  • @@ -29,7 +44,22 @@ exports[` should render a single device - signed by owner 1`] = ` class="mx_AccessibleButton mx_CopyableText_copyButton" role="button" tabindex="0" - /> + > + + + + +
  • @@ -74,7 +104,22 @@ exports[` should render a single device - signed by owner 1`] = ` class="mx_AccessibleButton mx_CopyableText_copyButton" role="button" tabindex="0" - /> + > + + + + +
  • @@ -87,7 +132,22 @@ exports[` should render a single device - signed by owner 1`] = ` class="mx_AccessibleButton mx_CopyableText_copyButton" role="button" tabindex="0" - /> + > + + + + +
  • @@ -120,7 +180,22 @@ exports[` should render a single device - unsigned 1`] = ` class="mx_AccessibleButton mx_CopyableText_copyButton" role="button" tabindex="0" - /> + > + + + + +
  • @@ -133,7 +208,22 @@ exports[` should render a single device - unsigned 1`] = ` class="mx_AccessibleButton mx_CopyableText_copyButton" role="button" tabindex="0" - /> + > + + + + +
  • @@ -178,7 +268,22 @@ exports[` should render a single device - unsigned 1`] = ` class="mx_AccessibleButton mx_CopyableText_copyButton" role="button" tabindex="0" - /> + > + + + + +
  • @@ -191,7 +296,22 @@ exports[` should render a single device - unsigned 1`] = ` class="mx_AccessibleButton mx_CopyableText_copyButton" role="button" tabindex="0" - /> + > + + + + +
  • @@ -224,7 +344,22 @@ exports[` should render a single device - verified by cross-signing 1`] class="mx_AccessibleButton mx_CopyableText_copyButton" role="button" tabindex="0" - /> + > + + + + +
  • @@ -237,7 +372,22 @@ exports[` should render a single device - verified by cross-signing 1`] class="mx_AccessibleButton mx_CopyableText_copyButton" role="button" tabindex="0" - /> + > + + + + +
  • @@ -284,7 +434,22 @@ exports[` should render a single device - verified by cross-signing 1`] class="mx_AccessibleButton mx_CopyableText_copyButton" role="button" tabindex="0" - /> + > + + + + +
  • @@ -297,7 +462,22 @@ exports[` should render a single device - verified by cross-signing 1`] class="mx_AccessibleButton mx_CopyableText_copyButton" role="button" tabindex="0" - /> + > + + + + +
  • @@ -330,7 +510,22 @@ exports[` should render a single user 1`] = ` class="mx_AccessibleButton mx_CopyableText_copyButton" role="button" tabindex="0" - /> + > + + + + +
  • diff --git a/test/unit-tests/components/views/messages/__snapshots__/TextualBody-test.tsx.snap b/test/unit-tests/components/views/messages/__snapshots__/TextualBody-test.tsx.snap index 2a3fc12f69..40d88d54bd 100644 --- a/test/unit-tests/components/views/messages/__snapshots__/TextualBody-test.tsx.snap +++ b/test/unit-tests/components/views/messages/__snapshots__/TextualBody-test.tsx.snap @@ -64,7 +64,22 @@ exports[` renders formatted m.text correctly linkification is not class="mx_AccessibleButton mx_EventTile_button mx_EventTile_copyButton" role="button" tabindex="0" - /> + > + + + + + @@ -268,7 +283,22 @@ exports[` renders formatted m.text correctly pills do not appear class="mx_AccessibleButton mx_EventTile_button mx_EventTile_copyButton" role="button" tabindex="0" - /> + > + + + + + @@ -438,14 +468,41 @@ num_sqrt = num ** + class="mx_EventTile_button" + > + + + +
    + > + + + + +
    diff --git a/test/unit-tests/components/views/right_panel/__snapshots__/UserInfo-test.tsx.snap b/test/unit-tests/components/views/right_panel/__snapshots__/UserInfo-test.tsx.snap index 7b2bcb1c92..14c06a6abc 100644 --- a/test/unit-tests/components/views/right_panel/__snapshots__/UserInfo-test.tsx.snap +++ b/test/unit-tests/components/views/right_panel/__snapshots__/UserInfo-test.tsx.snap @@ -108,7 +108,22 @@ exports[` with crypto enabled renders 1`] = ` class="mx_AccessibleButton mx_CopyableText_copyButton" role="button" tabindex="0" - /> + > + + + + +

    @@ -395,7 +410,22 @@ exports[` with crypto enabled should render a deactivate button for class="mx_AccessibleButton mx_CopyableText_copyButton" role="button" tabindex="0" - /> + > + + + + +

    diff --git a/test/unit-tests/components/views/right_panel/user_info/__snapshots__/UserInfoHeaderView-test.tsx.snap b/test/unit-tests/components/views/right_panel/user_info/__snapshots__/UserInfoHeaderView-test.tsx.snap index 51c368b0e2..7374a49367 100644 --- a/test/unit-tests/components/views/right_panel/user_info/__snapshots__/UserInfoHeaderView-test.tsx.snap +++ b/test/unit-tests/components/views/right_panel/user_info/__snapshots__/UserInfoHeaderView-test.tsx.snap @@ -57,7 +57,22 @@ exports[` renders custom user identifiers in the header 1` class="mx_AccessibleButton mx_CopyableText_copyButton" role="button" tabindex="0" - /> + > + + + + +

    diff --git a/test/unit-tests/components/views/rooms/RoomInfoLine-test.tsx b/test/unit-tests/components/views/rooms/RoomInfoLine-test.tsx new file mode 100644 index 0000000000..434f78dfc4 --- /dev/null +++ b/test/unit-tests/components/views/rooms/RoomInfoLine-test.tsx @@ -0,0 +1,36 @@ +/* +Copyright 2025 Element Creations Ltd. + +SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial +Please see LICENSE files in the repository root for full details. +*/ + +import { render } from "jest-matrix-react"; +import React from "react"; +import { MatrixEvent, Room } from "matrix-js-sdk/src/matrix"; + +import RoomInfoLine from "../../../../../src/components/views/rooms/RoomInfoLine.tsx"; +import { stubClient } from "../../../../test-utils"; + +describe("RoomInfoLine", () => { + it("renders for public room", () => { + const cli = stubClient(); + const room = new Room("!roomId", cli, cli.getUserId()!); + room.currentState.setStateEvents([ + new MatrixEvent({ + sender: cli.getUserId()!, + room_id: room.roomId, + state_key: "", + event_id: "$eventId", + type: "m.room.join_rules", + content: { + join_rule: "public", + }, + }), + ]); + + const { asFragment, getByText } = render(); + expect(getByText("Public room")).toBeVisible(); + expect(asFragment()).toMatchSnapshot(); + }); +}); diff --git a/test/unit-tests/components/views/rooms/__snapshots__/RoomInfoLine-test.tsx.snap b/test/unit-tests/components/views/rooms/__snapshots__/RoomInfoLine-test.tsx.snap new file mode 100644 index 0000000000..643c3b3bf0 --- /dev/null +++ b/test/unit-tests/components/views/rooms/__snapshots__/RoomInfoLine-test.tsx.snap @@ -0,0 +1,22 @@ +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing + +exports[`RoomInfoLine renders for public room 1`] = ` + +
    + + + + Public room +
    +
    +`; diff --git a/test/unit-tests/components/views/settings/tabs/room/__snapshots__/AdvancedRoomSettingsTab-test.tsx.snap b/test/unit-tests/components/views/settings/tabs/room/__snapshots__/AdvancedRoomSettingsTab-test.tsx.snap index cbefee378b..813e759967 100644 --- a/test/unit-tests/components/views/settings/tabs/room/__snapshots__/AdvancedRoomSettingsTab-test.tsx.snap +++ b/test/unit-tests/components/views/settings/tabs/room/__snapshots__/AdvancedRoomSettingsTab-test.tsx.snap @@ -47,7 +47,22 @@ exports[`AdvancedRoomSettingsTab should render as expected 1`] = ` class="mx_AccessibleButton mx_CopyableText_copyButton" role="button" tabindex="0" - /> + > + + + + + diff --git a/test/unit-tests/toasts/SetupEncryptionToast-test.tsx b/test/unit-tests/toasts/SetupEncryptionToast-test.tsx index fa2b389659..8a63a6307b 100644 --- a/test/unit-tests/toasts/SetupEncryptionToast-test.tsx +++ b/test/unit-tests/toasts/SetupEncryptionToast-test.tsx @@ -55,6 +55,14 @@ describe("SetupEncryptionToast", () => { }); }); + describe("Verify this session", () => { + it("should render the toast", async () => { + act(() => showToast(Kind.VERIFY_THIS_SESSION)); + + expect(await screen.findByRole("heading", { name: "Verify this session" })).toBeInTheDocument(); + }); + }); + describe("Key storage out of sync", () => { let client: Mocked; diff --git a/test/unit-tests/toasts/__snapshots__/UnverifiedSessionToast-test.tsx.snap b/test/unit-tests/toasts/__snapshots__/UnverifiedSessionToast-test.tsx.snap index a1ddb2b88c..ab34e13fda 100644 --- a/test/unit-tests/toasts/__snapshots__/UnverifiedSessionToast-test.tsx.snap +++ b/test/unit-tests/toasts/__snapshots__/UnverifiedSessionToast-test.tsx.snap @@ -8,8 +8,20 @@ exports[`UnverifiedSessionToast when rendering the toast should render as expect role="alert" >
    + + +
    From 0cfaeaa3a754168e649f95b67c8f0afcbbdbae81 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 15 Dec 2025 15:46:03 +0000 Subject: [PATCH 23/72] Fix CSS specificity causing icon issues in e2e verification (#31542) Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/css/structures/auth/_CompleteSecurity.pcss | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/res/css/structures/auth/_CompleteSecurity.pcss b/res/css/structures/auth/_CompleteSecurity.pcss index 6776681f63..d8e9e4b4af 100644 --- a/res/css/structures/auth/_CompleteSecurity.pcss +++ b/res/css/structures/auth/_CompleteSecurity.pcss @@ -11,18 +11,17 @@ Please see LICENSE files in the repository root for full details. align-items: center; } -.mx_CompleteSecurity_headerIcon { +.mx_E2EIcon.mx_CompleteSecurity_headerIcon { width: 24px; height: 24px; margin-right: 4px; display: inline-block; } -.mx_CompleteSecurity_heroIcon { +.mx_E2EIcon.mx_CompleteSecurity_heroIcon { width: 128px; height: 128px; margin: 0 auto; - display: inline-block; } .mx_CompleteSecurity_skip { From 9d9782f62b11c2a926321e5411065bf2d29033a2 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 15 Dec 2025 16:37:24 +0000 Subject: [PATCH 24/72] Switch to compound-design-tokens for platform icons (#31543) * Switch to compound-design-tokens for platform icons Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Revert app-store badge usage Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Update snapshots Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --------- Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --- res/img/element-icons/brands/apple.svg | 3 - res/img/element-icons/brands/linux.svg | 15 ----- res/img/element-icons/brands/microsoft.svg | 6 -- src/async-components/structures/ErrorView.tsx | 10 ++- src/components/views/elements/SSOButtons.tsx | 2 +- .../__snapshots__/ErrorView-test.tsx.snap | 65 ++++++++++++++++--- .../vector/__snapshots__/init-test.ts.snap | 65 ++++++++++++++++--- 7 files changed, 119 insertions(+), 47 deletions(-) delete mode 100644 res/img/element-icons/brands/apple.svg delete mode 100644 res/img/element-icons/brands/linux.svg delete mode 100644 res/img/element-icons/brands/microsoft.svg diff --git a/res/img/element-icons/brands/apple.svg b/res/img/element-icons/brands/apple.svg deleted file mode 100644 index 308c3c5d5a..0000000000 --- a/res/img/element-icons/brands/apple.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/res/img/element-icons/brands/linux.svg b/res/img/element-icons/brands/linux.svg deleted file mode 100644 index 6df5e6f959..0000000000 --- a/res/img/element-icons/brands/linux.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/res/img/element-icons/brands/microsoft.svg b/res/img/element-icons/brands/microsoft.svg deleted file mode 100644 index 221dcba716..0000000000 --- a/res/img/element-icons/brands/microsoft.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/src/async-components/structures/ErrorView.tsx b/src/async-components/structures/ErrorView.tsx index fe7b00468a..80a3d8dba1 100644 --- a/src/async-components/structures/ErrorView.tsx +++ b/src/async-components/structures/ErrorView.tsx @@ -9,12 +9,10 @@ import React, { type JSX, type ReactNode } from "react"; import { Text, Heading, Button, Separator } from "@vector-im/compound-web"; import PopOutIcon from "@vector-im/compound-design-tokens/assets/web/icons/pop-out"; import { Flex } from "@element-hq/web-shared-components"; +import { LinuxIcon, MacIcon, WindowsIcon } from "@vector-im/compound-design-tokens/assets/web/icons"; import SdkConfig from "../../SdkConfig"; import { _t } from "../../languageHandler"; -import { Icon as AppleIcon } from "../../../res/img/element-icons/brands/apple.svg"; -import { Icon as MicrosoftIcon } from "../../../res/img/element-icons/brands/microsoft.svg"; -import { Icon as LinuxIcon } from "../../../res/img/element-icons/brands/linux.svg"; // directly import the style here as this layer does not support rethemedex at this time so no matrix-react-sdk // PostCSS variables will be accessible. @@ -86,17 +84,17 @@ const DesktopAppLinks: React.FC<{ return ( {macOsUrl && ( - )} {win64Url && ( - )} {win64ArmUrl && ( - )} diff --git a/src/components/views/elements/SSOButtons.tsx b/src/components/views/elements/SSOButtons.tsx index 3945a66510..52fdef752c 100644 --- a/src/components/views/elements/SSOButtons.tsx +++ b/src/components/views/elements/SSOButtons.tsx @@ -35,7 +35,7 @@ const getIcon = (brand: IdentityProviderBrand | string): string | null => { switch (brand) { /* eslint-disable @typescript-eslint/no-require-imports */ case IdentityProviderBrand.Apple: - return require(`../../../../res/img/element-icons/brands/apple.svg`).default; + return require("@vector-im/compound-design-tokens/icons/mac.svg").default; case IdentityProviderBrand.Facebook: return require(`../../../../res/img/element-icons/brands/facebook.svg`).default; case IdentityProviderBrand.Github: diff --git a/test/unit-tests/async-components/structures/__snapshots__/ErrorView-test.tsx.snap b/test/unit-tests/async-components/structures/__snapshots__/ErrorView-test.tsx.snap index 185a8c83e7..d22d61a0bd 100644 --- a/test/unit-tests/async-components/structures/__snapshots__/ErrorView-test.tsx.snap +++ b/test/unit-tests/async-components/structures/__snapshots__/ErrorView-test.tsx.snap @@ -150,11 +150,20 @@ exports[` should match snapshot 1`] = ` role="link" tabindex="0" > - @@ -85,6 +107,17 @@ exports[`ThreadPanel Header expect that ThreadPanelHeader has the correct option role="menuitemradio" tabindex="0" > + + + All threads diff --git a/test/unit-tests/components/views/spaces/SpaceTreeLevel-test.tsx b/test/unit-tests/components/views/spaces/SpaceTreeLevel-test.tsx index c46b9681a9..2dd6ac5016 100644 --- a/test/unit-tests/components/views/spaces/SpaceTreeLevel-test.tsx +++ b/test/unit-tests/components/views/spaces/SpaceTreeLevel-test.tsx @@ -8,13 +8,14 @@ Please see LICENSE files in the repository root for full details. import React from "react"; import { fireEvent, getByTestId, render } from "jest-matrix-react"; +import { mocked } from "jest-mock"; import { mkRoom, stubClient } from "../../../../test-utils"; import { MatrixClientPeg } from "../../../../../src/MatrixClientPeg"; import DMRoomMap from "../../../../../src/utils/DMRoomMap"; import defaultDispatcher from "../../../../../src/dispatcher/dispatcher"; import { Action } from "../../../../../src/dispatcher/actions"; -import { SpaceButton } from "../../../../../src/components/views/spaces/SpaceTreeLevel"; +import { SpaceItem, SpaceButton } from "../../../../../src/components/views/spaces/SpaceTreeLevel"; import { MetaSpace, type SpaceKey } from "../../../../../src/stores/spaces"; import SpaceStore from "../../../../../src/stores/spaces/SpaceStore"; import { StaticNotificationState } from "../../../../../src/stores/notifications/StaticNotificationState"; @@ -26,6 +27,8 @@ jest.mock("../../../../../src/stores/spaces/SpaceStore", () => { class MockSpaceStore extends EventEmitter { activeSpace: SpaceKey = "!space1"; setActiveSpace = jest.fn(); + getChildSpaces = jest.fn(); + getNotificationState = jest.fn(); } return { instance: new MockSpaceStore() }; @@ -127,3 +130,28 @@ describe("SpaceButton", () => { }); }); }); + +describe("SpaceItem", () => { + const cli = stubClient(); + const space = mkRoom(cli, "!1:example.org"); + space.name = "Root Space"; + const subspace = mkRoom(cli, "!2:example.org"); + subspace.name = "Subspace"; + + it("should render a space with subspaces", () => { + mocked(SpaceStore.instance.getChildSpaces).mockImplementation((spaceId) => + spaceId === space.roomId ? [subspace] : [], + ); + + const { asFragment, queryByText, getByLabelText } = render(); + + expect(queryByText("Root Space")).toBeVisible(); + expect(queryByText("Subspace")).toBeNull(); + expect(asFragment()).toMatchSnapshot(); + + fireEvent.click(getByLabelText("Expand")); + expect(queryByText("Root Space")).toBeVisible(); + expect(queryByText("Subspace")).toBeVisible(); + expect(asFragment()).toMatchSnapshot(); + }); +}); diff --git a/test/unit-tests/components/views/spaces/__snapshots__/SpacePanel-test.tsx.snap b/test/unit-tests/components/views/spaces/__snapshots__/SpacePanel-test.tsx.snap index c6fdc70948..a72f55978c 100644 --- a/test/unit-tests/components/views/spaces/__snapshots__/SpacePanel-test.tsx.snap +++ b/test/unit-tests/components/views/spaces/__snapshots__/SpacePanel-test.tsx.snap @@ -41,7 +41,19 @@ exports[` should show all activated MetaSpaces in the correct orde class="mx_AccessibleButton mx_SpacePanel_toggleCollapse" role="button" tabindex="0" - /> + > + + + +