From fd152c9c7e0d7d667561a2c2de86c7cb24e6a217 Mon Sep 17 00:00:00 2001 From: Skye Elliot Date: Wed, 26 Nov 2025 15:13:55 +0000 Subject: [PATCH] Implement a shared `Banner` component. (#31266) * feat: Create composer `Banner` shared component. * fix: Yarn resolution issues corrupting package store. * chore: Revert "fix: Yarn resolution issues corrupting package store." This reverts commit 2c1335420331e9cf086cad5c68f7c7432af4b3a5. * fix: Revert lockfile changes. * chore: Resolve linting errors. * chore: Update playwright screenshots. --- packages/shared-components/package.json | 2 +- .../snapshots/room-banner--critical-linux.png | Bin 0 -> 12880 bytes .../snapshots/room-banner--default-linux.png | Bin 0 -> 10570 bytes .../snapshots/room-banner--info-linux.png | Bin 0 -> 13365 bytes .../snapshots/room-banner--success-linux.png | Bin 0 -> 14069 bytes .../room-banner--with-action-linux.png | Bin 0 -> 17305 bytes .../room-banner--with-avatar-image-linux.png | Bin 0 -> 9737 bytes .../src/composer/Banner/Banner.module.css | 93 ++++++ .../src/composer/Banner/Banner.stories.tsx | 67 ++++ .../src/composer/Banner/Banner.test.tsx | 41 +++ .../src/composer/Banner/Banner.tsx | 91 ++++++ .../Banner/__snapshots__/Banner.test.tsx.snap | 290 ++++++++++++++++++ .../src/composer/Banner/index.ts | 8 + packages/shared-components/src/index.ts | 1 + packages/shared-components/yarn.lock | 5 + yarn.lock | 52 +--- 16 files changed, 610 insertions(+), 40 deletions(-) create mode 100644 packages/shared-components/playwright/snapshots/room-banner--critical-linux.png create mode 100644 packages/shared-components/playwright/snapshots/room-banner--default-linux.png create mode 100644 packages/shared-components/playwright/snapshots/room-banner--info-linux.png create mode 100644 packages/shared-components/playwright/snapshots/room-banner--success-linux.png create mode 100644 packages/shared-components/playwright/snapshots/room-banner--with-action-linux.png create mode 100644 packages/shared-components/playwright/snapshots/room-banner--with-avatar-image-linux.png create mode 100644 packages/shared-components/src/composer/Banner/Banner.module.css create mode 100644 packages/shared-components/src/composer/Banner/Banner.stories.tsx create mode 100644 packages/shared-components/src/composer/Banner/Banner.test.tsx create mode 100644 packages/shared-components/src/composer/Banner/Banner.tsx create mode 100644 packages/shared-components/src/composer/Banner/__snapshots__/Banner.test.tsx.snap create mode 100644 packages/shared-components/src/composer/Banner/index.ts diff --git a/packages/shared-components/package.json b/packages/shared-components/package.json index d6831474fa..8b35b17eef 100644 --- a/packages/shared-components/package.json +++ b/packages/shared-components/package.json @@ -46,6 +46,7 @@ "test:storybook:update": "playwright-screenshots --entrypoint yarn --with-node-modules && playwright-screenshots --entrypoint /work/node_modules/.bin/test-storybook --with-node-modules --url http://host.docker.internal:6007/ --updateSnapshot" }, "dependencies": { + "@vector-im/compound-design-tokens": "^6.3.0", "classnames": "^2.5.1", "counterpart": "^0.18.6", "lodash": "^4.17.21", @@ -88,7 +89,6 @@ }, "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e", "peerDependencies": { - "@vector-im/compound-design-tokens": "^6.0.0", "@vector-im/compound-web": "^8.2.5" } } diff --git a/packages/shared-components/playwright/snapshots/room-banner--critical-linux.png b/packages/shared-components/playwright/snapshots/room-banner--critical-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..d920c596640b67213359daa11dd2c666c5ca9bcb GIT binary patch literal 12880 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 literal 0 HcmV?d00001 diff --git a/packages/shared-components/playwright/snapshots/room-banner--default-linux.png b/packages/shared-components/playwright/snapshots/room-banner--default-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..39079994d2f544417e92081f4a9282a8a7557656 GIT binary patch literal 10570 zcmeI2XIN9&`sm|fj%AQxJPxAL^s%5az)_Td5g6N`VqhGa5JE(S334}yC1d^yo4?#L1K#&${0)&vB{Nw-J`|1DX+G7boF>Sh z+1zs@2VD0e_6YmvMf&UBKVO)YgR&+~9&iCw$C~W^j{d6k)NJh2Mq*RVej{~V{qUv- zUHekhKcxNb=eWmOOy^?*?~DUizjx2oem zjy+XLy!R?VO(pklfZYJVv9EURS9RF?uXK1X{bmLZ6ZwB0yP-Qi#9B=4Kr>s=$j=S9 zrM16k{Ht&JKmPRp=rHpYhTmre!U=;FBV&9LwE;24ogK@??3^^LbtI$Kr{%-5u9CW> z5(i~C$;{?n>uJjY^4e4jP&NLU8{y^hbZyT`<_;?}?#2D-)jzmX-lJoK*@+>~SaU0IV;Xm&zV~Ld^yEExtAKfui3w^KcW<8hY_mi>j2o^wNWyUb|Ecb!R}?Q5Zry22i*2nz9ZR#x@X76- zN|G|TQytHBeHr)$?}zw2ZU?1k)52ui_RLcQ+$(GcTOMsLojj1~8K@99_S4oK6!Re} zr+nM((>n@}#6$Ggv-)}M3^qkJi9}&bD=t{>SfAU~8aOZuqA3z)V{&p<&KD^OTkm_~ zP04RWbN#qYx>sY+ZdKNQu`*!uQMCDeSrqz9*JY)80 z1Yi4mSdhb3VYl_)6*X~2hy2zpmL_&$A-g>-W=bWpmg$C%H4j5a;D%O{87KX710)_a zFMjUjX~FL9#7lD~=~e3q>aozDTg`08jj5C%?i;(^U}U&Z z8nHd+V9$JR=;;#HXJxFX(oEEiE6Q1hLq0CxJ!lD|Xf|zaGPB&Vj{+bkMQtQgg$=X? zCGX_fY}DVzxwQt0vS!mAPdi8yInsFTMOnX6KvGJI<{zh>TPaw{zAT!kIS!nvl_+=_ zRBG7j#@!Ts(a3@n+lm`m^U5A>A()zl%D@L>X{=<;iwZTPI)X09ZzZ;Y4SM50w0*BA z)6e)M0I;!#(+3pJW2J*fmWNUw6&G1lkC7~J<^f^m;u-77dI}J}eOGx}$g;vDin-lW zDF;{T$2@b*qkr6d&z_Wx;lFTXQ;t4S1hdIWGvGChOa(nxwWOZ8(g zoFLs*vw5q7MlP&i8z9+=UIS~zjo{WgB-BivbJbbf<*`Yt--f6;Y5k0hx>*@;E|E86 zi5)JEScM3A2`q}mzR432?1OJgbmk!j1vb9paH(??YAK8lTwC&(yV`QG@sia~zy^zB zL!6pli%!$sr-rd2Jq&&hgsgco`eERi4P?RqGjj=7-)hYYnzxCVYJG8H_aWfGDYe)H z+5$D!V{m{h%lY-7L6nKKE8$Y~?!I&K!E3z}&8eg#?$C)8HDXTFOm)Vfl`o0r-Ib2M z=-t>ytEqS*%UO(t?19xFWmIQmLD)^&yILT6nsTjI;+<-%aVCH@i#lu;#yrRq-Tw~d z=WgD-{aR2-efYk$k%wX}E`%Ky`#MyZqiTE=8jT+`bstP#4aYd*P)me*#A1Shlhw+{=(Sydy{D8bhz0x= zGx5yNl!^+8vvXd-Jjxs?!A@oFPJoel-ce*_*KM|G9W+q=2s$Mg8a;hI^9s3n zv+%EN>WESgo5oN1=#};H$o@10+`QP35MEKfInX{<3^b*D>bRMJT<|!T-l|l9zmAD& zi$fAj_h;1vGE=&>AT+BGMeH+945&tvo^`RMd`uLBI9fn13wTh2WhC%d*VaB=iQz!yQ>U9nAI9Ol$fDW+mY$Rt1!X8dCYDdc!w~u-^0kgfV%JdO*u@kP-NH- z6OI~fB(5Da3TO@({&R)l`=)XS{45$!Rxn|#>^ZMFbFfuCl;7ar&Pz|{&3W9H?na6? z9a1!H3qQ*GK50ku->hQRArq3W8iBZX#RuHdT66zeTPb5=dZWa<7YMGO;d_=er(F;SZOO>)eB67+~8{5xF6m zn&pR^1EK!Mr&?P13=M8B@~HfWXoPfwPQ5-*cA=HXG$N4rgPCt8hJ=S9#% zr@+GR*?Ie67U+lmLC+rl2&UCn`@WAh0w$Fo85OIeN_Mj^;I>GSfB)7$xER<4~k zs3t*Bb$g`lxE9iw`|`+7scx;*>U#O_yCz>E{QFL6sYx=|4PYp@O=eR~7{;WWJLN`e z$4v`EA5^&V;^>gZJ0%FMqgbahS9ZjlDC5ARSj{TE`zo!4iCYL8l*E2c zj*GE-HL-BHc@n~>P9gX)vmom|ihWjQ&z|&9Yqw&n#g#uM=~}*SsCZRV8ZxJQ0mypE zmUR7AQi%`nn`*}Wt(lkjOqqygf9*Y@cA*)`prWqLWgT$cukQqPyXVON=6by5kmC6< z=sjrmL{{%2D5d7w>QHaybS;+Ou%@sg^!9i%ad0xcLPDXWV@e%ku9?8XGjGQD4Gpy) z!%KFQ0g*1lE+wvqj409fotHU7Mu>C6rT~Be7GPL1xCDE7+uXk&j_)%o8 z!1RaI#!RTe4b{bZ&CvGcl9iW5wj;%)yO3;PBGNBr#l*f-#2k3$bi1P z?vka&3^=6L!T50S2VdUSyILMDuv^>ASaaHZbHz(;s&_HMo9~4`W8x>@DSpvtlds?S zVBHbSghO)+w!`LtW6k*bZ2o53bq^6(+nMu#=c8-W&h5xZ&Ym8_NY7O7uj9D#4g^>*7oZ zy+h8W+Z!~h1*ieOwLiWbH5KuTSK7#agXG(&k^ZKN8VB0DIiwrKGS}vfXOG0?5GO9O z7~`7eIhpAUbr~(XKg3D*%tKS(Tm9l~WkftY2|Viui3|%{e1G*(fTs&PhXpJqME+9! zdq~pVO3Le3lDK_*gUOV>{IB3)mZ~HTp6{&ag(;pOLP8?MGs5sxrEmy;h=vbgFuON@ zS}Wj|uMETo91WVm94W6EOkKDY^09sC_Lf-f^liKT!dVgHB=_E>pii^cPN(XsTV1Gs zJvv&`j9ma~M+-;EJy;=_xDvEI$FEw&Gcq)wp+n;n47H2sc?gT&eZY0Rs5R1Q zs^%VW0g_{G{pR6joFy>BnUL)m{r2}nzc$H@D8!Zj%>qV;-)4uw^gSkCHZ?(OKz!b^ zP4fF+l^Q#1HV=DV9dPvV)&Y_rSk9~%*k2XCq~oe<9swnM9P9z{5VnP()fWD_i0O}6 zASAujw?s&cn+P!$LvOnU*WH2F-znL17b+Ub*}m$KSh01&#u5Pd-IqP-(`Y04)_S*$ zcRAR&uY~z$4L#yHot&mgd$fN2StiM2Y&gfCDRbZhu|l)h^@A~nIkiHrj%k)^y;WTPk!1)zC1cByw1oDC2XImB%HI;`gvgl*{|v9 z`uNC-NKn@5gA}Q&tA2d`LsqTK$DdYnoHHGk#v#mIq}b-6_?}x4I{$YnDINgZ)bu9b88f3(g}al0%8j zm(Ux31fP8rk2EY6`ZpzxO6tM3`)8bdiS^?Ir15H(KeBHf^zvsf+cxrZoy#_vY%@o* zs6pBCi3{TOD&`4Uddylzm6VO^f#;&X8}!Z&tq8rjvhHxX(cjaNof8EpzYC_-6est{ zq+B)Uc0=3rse)Yqi>~wI%|M#q9qW+43DuqpdMqj=*?=baG22hi#&g}|8y%%(R1DNP zDALF7I>OrW+`4~^lb{%sNs5@SF4Hj}mt-}HOTiF+iMZP1xLK5>CS8-j+Aae3(!xDc z{E&V<`U0`T*Da_r#f+MWpQ(8k3lmQ{tCoq1+V(?Xp`irHw7gwixnP5{w$vXSnL9nQ z=-QW4TTyswY_w*XO0I4r71Y&;^9!t&bAk>&NloA*X=Prv#1brXSSJ8+OGDR&!2kPO ze;psNE-2c6^*PQyPqtIvi1VM+2r&qtH`HIU*_;Ap0JYAsE4W4ac*ZvA4yV9F+_k6& z$}xak_V*0A>F+i;8oX4X5wq5D6PQHdR)Oopzk)I^&G%MR#_?G+M)6kjB=wxJo>?(@>>zsLyR= zYqY~;J|_cAL0y}Q14CHBprd2oyOYnmj*?d1=#|?c=s;ugrwr-QI2xjDYxWKO&zH{L z%Xhm1v=*|fzMv3(AH6XSW{6uNi4maW-&R`sL4VWT~o&B5;pBRWTqnvWo{ zk+#;iT{Q@IIXXODs8sBwniY2f<%_XkhtbAE96*0%IYU=vdKK8px0cU+PEpXm>Tkvv zDTTkqFxNuVwT+3n*xp~`O~^~{iO_G>`5?t72B!c+MY0_`rHr-^hVP4|ZYo-4VA*;&61DQQXPOP}6-gOovFZY%vo~1B@ZmDT+F*{02Yf@*-4yY)PC=M!| zWn}h5=D&>kAtt{M3=%@`I`2P>9;$M*btVqMF9G ziZ>KO+}Z%bpthz1I9?^buy=LgxwF1QXBj zK!I?#tW%k+VrxqT}Ymec?x3_ zxis5Mu_amkn+lbtcJ{85>a3+QxGBZr(=F_FDjphswG=L?n?Edl{Z-(ACQkH$ZLe%$ zw~A)}$s^H|=V_>!r=MBoWB%MCoB?WS9m{4M34T4v^Td7vf^4A9*}52mLV*39=P%A( zkt|6%4R8-x4R|;nL$u2@iI!|D=w+%TY{`Li*t!nVcrdEVL?ufRzXw55t}wMt*8dk7 zU1o7whpZL0-POW@uRoJr8z-jrgeQhFHydZYPbw!YjFsVcs`(5PyTtf|xNpB#J+k)# zC(W>X8V1Lueq7E3c`m6qa8M=t!+sUOf4jL|sb_i;nxcMzbFx~i@w&={jQ+fQU0a`j zf?@SYyyKZQMZ_v8^(}UEYZcmpHsDCW^v{rA7su2NR#7tfWNoD2GXLQ1lO>O=X-)i8 z`1X|oj5Q7X`Jp@ji7JU)t?j36cIZT_0CR_-y@TQ-WjmNE5~6scRXj1LU}rPwl;MA4 zcndF222CQ12f^s_1`Dky7m}I1iW55t9b3>g^{lgHDg+OljtWsN_hMACtWQs6V0<|$ zfFUI~6hNjcKilcUfwwAGGaN6l!oIm|GN^#|EMGU+lwS$zVNSod@BotGR9U=IIg@%fMRl?JbIPLzp!~vnUjL5*75oAKZr`-OLA>_hxBmiC`JNd7 literal 0 HcmV?d00001 diff --git a/packages/shared-components/playwright/snapshots/room-banner--info-linux.png b/packages/shared-components/playwright/snapshots/room-banner--info-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..7d93288e4275bb0669e92b7bf591bdfc86ca7326 GIT binary patch literal 13365 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 literal 0 HcmV?d00001 diff --git a/packages/shared-components/playwright/snapshots/room-banner--success-linux.png b/packages/shared-components/playwright/snapshots/room-banner--success-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..8417f0aee3d9ba89d0e92bac22c79f5607a39236 GIT binary patch literal 14069 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 literal 0 HcmV?d00001 diff --git a/packages/shared-components/playwright/snapshots/room-banner--with-avatar-image-linux.png b/packages/shared-components/playwright/snapshots/room-banner--with-avatar-image-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..d015a12a00a44bea04493926457f4e9dd42bf6ec GIT binary patch literal 9737 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 This is a status banner.

, + onClose: fn(), + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; +export const Info: Story = { + args: { + type: "info", + }, +}; +export const Success: Story = { + args: { + type: "success", + }, +}; +export const Critical: Story = { + args: { + type: "critical", + }, +}; +export const WithAction: Story = { + args: { + children: ( +

+ {_t( + "encryption|pinned_identity_changed", + { displayName: "Alice", userId: "@alice:example.org" }, + { + a: (sub) => {sub}, + b: (sub) => {sub}, + }, + )} +

+ ), + actions: , + }, +}; + +export const WithAvatarImage: Story = { + args: { + avatar: Example, + }, +}; diff --git a/packages/shared-components/src/composer/Banner/Banner.test.tsx b/packages/shared-components/src/composer/Banner/Banner.test.tsx new file mode 100644 index 0000000000..0f33fb452b --- /dev/null +++ b/packages/shared-components/src/composer/Banner/Banner.test.tsx @@ -0,0 +1,41 @@ +/* + * Copyright (c) 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 React from "react"; +import { render } from "jest-matrix-react"; +import { composeStories } from "@storybook/react-vite"; + +import * as stories from "./Banner.stories.tsx"; + +const { Default, Info, Success, WithAction, WithAvatarImage, Critical } = composeStories(stories); + +describe("AvatarWithDetails", () => { + it("renders a default banner", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + it("renders a info banner", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + it("renders a success banner", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + it("renders a critical banner", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + it("renders a banner with an action", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + it("renders a banner with an avatar iamge", () => { + const { container } = render(); + expect(container).toMatchSnapshot(); + }); +}); diff --git a/packages/shared-components/src/composer/Banner/Banner.tsx b/packages/shared-components/src/composer/Banner/Banner.tsx new file mode 100644 index 0000000000..a1622dd1dc --- /dev/null +++ b/packages/shared-components/src/composer/Banner/Banner.tsx @@ -0,0 +1,91 @@ +/* + * Copyright (c) 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 classNames from "classnames"; +import React, { + type MouseEventHandler, + type ReactElement, + type ReactNode, + type PropsWithChildren, + useMemo, +} from "react"; +import { Button } from "@vector-im/compound-web"; +import CheckCircleIcon from "@vector-im/compound-design-tokens/assets/web/icons/check-circle"; +import ErrorIcon from "@vector-im/compound-design-tokens/assets/web/icons/error-solid"; +import InfoIcon from "@vector-im/compound-design-tokens/assets/web/icons/info"; + +import styles from "./Banner.module.css"; +import { _t } from "../../utils/i18n"; + +interface BannerProps { + /** + * The type of the status banner. + */ + type?: "success" | "info" | "critical"; + + /** + * The banner avatar. + */ + avatar?: React.ReactNode; + + className?: string; + + /** + * Actions presented to the user in the right-hand side of the banner alongside the dismiss button. + */ + actions?: ReactNode; + /** + * Called when the user presses the "dismiss" button. + */ + onClose: MouseEventHandler; +} + +/** + * A banner component used for displaying user-facing information above the message composer. + * + * @example + * ```tsx + * + * ``` + */ +export function Banner({ + type, + children, + avatar, + className, + actions, + onClose, + ...props +}: PropsWithChildren): ReactElement { + const classes = classNames(styles.banner, className); + + const icon = useMemo(() => { + switch (type) { + case "critical": + return ; + case "info": + return ; + case "success": + return ; + default: + return ; + } + }, [type, props]); + + return ( +
+
{avatar ?? icon}
+ {children} +
+ {actions} + +
+
+ ); +} diff --git a/packages/shared-components/src/composer/Banner/__snapshots__/Banner.test.tsx.snap b/packages/shared-components/src/composer/Banner/__snapshots__/Banner.test.tsx.snap new file mode 100644 index 0000000000..d8b7f11f74 --- /dev/null +++ b/packages/shared-components/src/composer/Banner/__snapshots__/Banner.test.tsx.snap @@ -0,0 +1,290 @@ +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing + +exports[`AvatarWithDetails renders a banner with an action 1`] = ` +
+ +
+`; + +exports[`AvatarWithDetails renders a banner with an avatar iamge 1`] = ` +
+ +
+`; + +exports[`AvatarWithDetails renders a critical banner 1`] = ` +
+ +
+`; + +exports[`AvatarWithDetails renders a default banner 1`] = ` +
+ +
+`; + +exports[`AvatarWithDetails renders a info banner 1`] = ` +
+ +
+`; + +exports[`AvatarWithDetails renders a success banner 1`] = ` +
+ +
+`; diff --git a/packages/shared-components/src/composer/Banner/index.ts b/packages/shared-components/src/composer/Banner/index.ts new file mode 100644 index 0000000000..5945ff8fd1 --- /dev/null +++ b/packages/shared-components/src/composer/Banner/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright (c) 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. + */ + +export * from "./Banner"; diff --git a/packages/shared-components/src/index.ts b/packages/shared-components/src/index.ts index 68935afd3f..565f7013d3 100644 --- a/packages/shared-components/src/index.ts +++ b/packages/shared-components/src/index.ts @@ -11,6 +11,7 @@ export * from "./audio/Clock"; export * from "./audio/PlayPauseButton"; export * from "./audio/SeekBar"; export * from "./avatar/AvatarWithDetails"; +export * from "./composer/Banner"; export * from "./event-tiles/TextualEventView"; export * from "./message-body/MediaBody"; export * from "./pill-input/Pill"; diff --git a/packages/shared-components/yarn.lock b/packages/shared-components/yarn.lock index f95db8b969..45381afdb2 100644 --- a/packages/shared-components/yarn.lock +++ b/packages/shared-components/yarn.lock @@ -1959,6 +1959,11 @@ 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.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== + "@vitest/expect@3.2.4": version "3.2.4" resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-3.2.4.tgz#8362124cd811a5ee11c5768207b9df53d34f2433" diff --git a/yarn.lock b/yarn.lock index 96c27256a2..da31ea56b8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1579,15 +1579,8 @@ yaml "^2.7.0" "@element-hq/web-shared-components@link:packages/shared-components": - version "0.0.0-test.8" - dependencies: - classnames "^2.5.1" - counterpart "^0.18.6" - lodash "^4.17.21" - matrix-web-i18n "^3.4.0" - patch-package "^8.0.1" - react-merge-refs "^3.0.2" - temporal-polyfill "^0.3.0" + version "0.0.0" + uid "" "@emnapi/core@^1.4.3", "@emnapi/core@^1.5.0": version "1.7.0" @@ -4143,6 +4136,11 @@ resolved "https://registry.yarnpkg.com/@vector-im/compound-design-tokens/-/compound-design-tokens-6.0.0.tgz#a07975ee46307fc31c2ec64a216b6be2b3b27fb3" integrity sha512-Jk0NsLPCvdcuZi6an1cfyf4MDcIuoPlvja5ZWgJcORyGQZV1eLMHPYKShq9gj+EYk/BXZoPvQ1d6/T+/LSCNPA== +"@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== + "@vector-im/compound-web@^8.1.2": version "8.2.4" resolved "https://registry.yarnpkg.com/@vector-im/compound-web/-/compound-web-8.2.4.tgz#1109537365fe49368b13e05c5a32f23956e71fe8" @@ -4160,13 +4158,14 @@ "@vector-im/matrix-wysiwyg-wasm@link:../../Library/Caches/Yarn/v6/npm-@vector-im-matrix-wysiwyg-2.40.0-53c9ca5ea907d91e4515da64f20a82e5586b882c-integrity/node_modules/bindings/wysiwyg-wasm": version "0.0.0" + uid "" "@vector-im/matrix-wysiwyg@2.40.0": version "2.40.0" resolved "https://registry.yarnpkg.com/@vector-im/matrix-wysiwyg/-/matrix-wysiwyg-2.40.0.tgz#53c9ca5ea907d91e4515da64f20a82e5586b882c" integrity sha512-8LRFLs5PEKYs4lOL7aJ4lL/hGCrvEvOYkCR3JggXYXDVMtX4LmfdlKYucSAe98pCmqAAbLRvlRcR1bTOYvM8ug== dependencies: - "@vector-im/matrix-wysiwyg-wasm" "link:../../Library/Caches/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" "@vitest/expect@3.2.4": version "3.2.4" @@ -9603,7 +9602,7 @@ matrix-events-sdk@0.0.1: jwt-decode "^4.0.0" loglevel "^1.9.2" matrix-events-sdk "0.0.1" - matrix-widget-api "^1.10.0" + matrix-widget-api "^1.14.0" oidc-client-ts "^3.0.1" p-retry "7" sdp-transform "^3.0.0" @@ -12499,16 +12498,7 @@ string-length@^4.0.2: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -12616,14 +12606,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -13917,16 +13900,7 @@ word-wrap@^1.2.5: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^6.2.0, wrap-ansi@^7.0.0, wrap-ansi@^8.1.0, wrap-ansi@^9.0.0, "wrap-ansi@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^6.2.0, wrap-ansi@^7.0.0, wrap-ansi@^8.1.0, wrap-ansi@^9.0.0, "wrap-ansi@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==