Merge branch 'livekit' into test-call-vm

This commit is contained in:
Robin 2024-09-18 22:37:15 -04:00
commit 156f1e3a10
28 changed files with 431 additions and 641 deletions

View File

@ -1,17 +1,8 @@
const COPYRIGHT_HEADER = `/* const COPYRIGHT_HEADER = `/*
Copyright %%CURRENT_YEAR%% New Vector Ltd Copyright %%CURRENT_YEAR%% New Vector Ltd.
Licensed under the Apache License, Version 2.0 (the "License"); SPDX-License-Identifier: AGPL-3.0-only
you may not use this file except in compliance with the License. Please see LICENSE in the repository root for full details.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/ */
`; `;

View File

@ -39,7 +39,7 @@ jobs:
VITE_APP_VERSION: ${{ inputs.vite_app_version }} VITE_APP_VERSION: ${{ inputs.vite_app_version }}
NODE_OPTIONS: "--max-old-space-size=4096" NODE_OPTIONS: "--max-old-space-size=4096"
- name: Upload Artifact - name: Upload Artifact
uses: actions/upload-artifact@834a144ee995460fba8ed112a2fc961b36a5ec5a # v4 uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4
with: with:
name: build-output name: build-output
path: dist path: dist

View File

@ -39,7 +39,7 @@ jobs:
- name: Create Pull Request - name: Create Pull Request
id: cpr id: cpr
uses: peter-evans/create-pull-request@c5a7806660adbe173f04e3e038b0ccdcd758773c # v6.1.0 uses: peter-evans/create-pull-request@d121e62763d8cc35b5fb1710e887d6e69a52d3a4 # v7.0.2
with: with:
token: ${{ secrets.ELEMENT_BOT_TOKEN }} token: ${{ secrets.ELEMENT_BOT_TOKEN }}
branch: actions/localazy-download branch: actions/localazy-download

View File

@ -83,7 +83,7 @@
"livekit-client": "^2.0.2", "livekit-client": "^2.0.2",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"loglevel": "^1.9.1", "loglevel": "^1.9.1",
"matrix-js-sdk": "matrix-org/matrix-js-sdk#169e8f86139111574a3738f8557c6fa4b2a199db", "matrix-js-sdk": "matrix-org/matrix-js-sdk#414ac9d8cc28330718236b90ad67a1507e146932",
"matrix-widget-api": "^1.8.2", "matrix-widget-api": "^1.8.2",
"normalize.css": "^8.0.1", "normalize.css": "^8.0.1",
"observable-hooks": "^4.2.3", "observable-hooks": "^4.2.3",
@ -110,5 +110,8 @@
"vite-plugin-svgr": "^4.0.0", "vite-plugin-svgr": "^4.0.0",
"vitest": "^2.0.0", "vitest": "^2.0.0",
"vitest-axe": "^1.0.0-pre.3" "vitest-axe": "^1.0.0-pre.3"
},
"resolutions": {
"strip-ansi": "6.0.1"
} }
} }

View File

@ -8,14 +8,20 @@ Please see LICENSE in the repository root for full details.
import { FC } from "react"; import { FC } from "react";
import { Trans } from "react-i18next"; import { Trans } from "react-i18next";
import { Link } from "../typography/Typography"; import { ExternalLink } from "../button/Link";
export const AnalyticsNotice: FC = () => ( export const AnalyticsNotice: FC = () => (
<Trans i18nKey="analytics_notice"> <Trans i18nKey="analytics_notice">
By participating in this beta, you consent to the collection of anonymous By participating in this beta, you consent to the collection of anonymous
data, which we use to improve the product. You can find more information data, which we use to improve the product. You can find more information
about which data we track in our{" "} about which data we track in our{" "}
<Link href="https://element.io/privacy">Privacy Policy</Link> and our{" "} <ExternalLink href="https://element.io/privacy">
<Link href="https://element.io/cookie-policy">Cookie Policy</Link>. Privacy Policy
</ExternalLink>{" "}
and our{" "}
<ExternalLink href="https://element.io/cookie-policy">
Cookie Policy
</ExternalLink>
.
</Trans> </Trans>
); );

View File

@ -19,7 +19,7 @@ import { captureException } from "@sentry/react";
import { sleep } from "matrix-js-sdk/src/utils"; import { sleep } from "matrix-js-sdk/src/utils";
import { Trans, useTranslation } from "react-i18next"; import { Trans, useTranslation } from "react-i18next";
import { logger } from "matrix-js-sdk/src/logger"; import { logger } from "matrix-js-sdk/src/logger";
import { Button } from "@vector-im/compound-web"; import { Button, Text } from "@vector-im/compound-web";
import { FieldRow, InputField, ErrorMessage } from "../input/Input"; import { FieldRow, InputField, ErrorMessage } from "../input/Input";
import { useClientLegacy } from "../ClientContext"; import { useClientLegacy } from "../ClientContext";
@ -28,10 +28,10 @@ import styles from "./LoginPage.module.css";
import Logo from "../icons/LogoLarge.svg?react"; import Logo from "../icons/LogoLarge.svg?react";
import { LoadingView } from "../FullScreenView"; import { LoadingView } from "../FullScreenView";
import { useRecaptcha } from "./useRecaptcha"; import { useRecaptcha } from "./useRecaptcha";
import { Caption, Link } from "../typography/Typography";
import { usePageTitle } from "../usePageTitle"; import { usePageTitle } from "../usePageTitle";
import { PosthogAnalytics } from "../analytics/PosthogAnalytics"; import { PosthogAnalytics } from "../analytics/PosthogAnalytics";
import { Config } from "../config/Config"; import { Config } from "../config/Config";
import { ExternalLink, Link } from "../button/Link";
export const RegisterPage: FC = () => { export const RegisterPage: FC = () => {
const { t } = useTranslation(); const { t } = useTranslation();
@ -201,24 +201,24 @@ export const RegisterPage: FC = () => {
data-testid="register_confirm_password" data-testid="register_confirm_password"
/> />
</FieldRow> </FieldRow>
<Caption> <Text size="sm">
<Trans i18nKey="recaptcha_caption"> <Trans i18nKey="recaptcha_caption">
This site is protected by ReCAPTCHA and the Google{" "} This site is protected by ReCAPTCHA and the Google{" "}
<Link href="https://www.google.com/policies/privacy/"> <ExternalLink href="https://www.google.com/policies/privacy/">
Privacy Policy Privacy Policy
</Link>{" "} </ExternalLink>{" "}
and{" "} and{" "}
<Link href="https://policies.google.com/terms"> <ExternalLink href="https://policies.google.com/terms">
Terms of Service Terms of Service
</Link>{" "} </ExternalLink>{" "}
apply. apply.
<br /> <br />
By clicking "Register", you agree to our{" "} By clicking "Register", you agree to our{" "}
<Link href={Config.get().eula}> <ExternalLink href={Config.get().eula}>
End User Licensing Agreement (EULA) End User Licensing Agreement (EULA)
</Link> </ExternalLink>
</Trans> </Trans>
</Caption> </Text>
{error && ( {error && (
<FieldRow> <FieldRow>
<ErrorMessage error={error} /> <ErrorMessage error={error} />

View File

@ -0,0 +1,13 @@
/*
Copyright 2024 New Vector Ltd.
SPDX-License-Identifier: AGPL-3.0-only
Please see LICENSE in the repository root for full details.
*/
.external {
/* By default links will be blue/purple (or whatever the user agent does), but
in our designs we generally want external links to be the same color as the
surrounding text */
color: inherit;
}

View File

@ -15,10 +15,16 @@ import {
import { Link as CpdLink } from "@vector-im/compound-web"; import { Link as CpdLink } from "@vector-im/compound-web";
import { useHistory } from "react-router-dom"; import { useHistory } from "react-router-dom";
import { createPath, LocationDescriptor, Path } from "history"; import { createPath, LocationDescriptor, Path } from "history";
import classNames from "classnames";
import { useLatest } from "../useLatest";
import styles from "./Link.module.css";
export function useLink( export function useLink(
to: LocationDescriptor, to: LocationDescriptor,
state?: unknown,
): [Path, (e: MouseEvent) => void] { ): [Path, (e: MouseEvent) => void] {
const latestState = useLatest(state);
const history = useHistory(); const history = useHistory();
const path = useMemo( const path = useMemo(
() => (typeof to === "string" ? to : createPath(to)), () => (typeof to === "string" ? to : createPath(to)),
@ -27,9 +33,9 @@ export function useLink(
const onClick = useCallback( const onClick = useCallback(
(e: MouseEvent) => { (e: MouseEvent) => {
e.preventDefault(); e.preventDefault();
history.push(to); history.push(to, latestState.current);
}, },
[history, to], [history, to, latestState],
); );
return [path, onClick]; return [path, onClick];
@ -38,15 +44,37 @@ export function useLink(
type Props = Omit< type Props = Omit<
ComponentPropsWithoutRef<typeof CpdLink>, ComponentPropsWithoutRef<typeof CpdLink>,
"href" | "onClick" "href" | "onClick"
> & { to: LocationDescriptor }; > & { to: LocationDescriptor; state?: unknown };
/** /**
* A version of Compound's link component that integrates with our router setup. * A version of Compound's link component that integrates with our router setup.
* This is only for app-internal links.
*/ */
export const Link = forwardRef<HTMLAnchorElement, Props>(function Link( export const Link = forwardRef<HTMLAnchorElement, Props>(function Link(
{ to, ...props }, { to, state, ...props },
ref, ref,
) { ) {
const [path, onClick] = useLink(to); const [path, onClick] = useLink(to, state);
return <CpdLink ref={ref} {...props} href={path} onClick={onClick} />; return <CpdLink ref={ref} {...props} href={path} onClick={onClick} />;
}); });
/**
* A link to an external web page, made to fit into blocks of text more subtly
* than the normal Compound link component.
*/
export const ExternalLink = forwardRef<
HTMLAnchorElement,
ComponentPropsWithoutRef<"a">
>(function ExternalLink({ className, children, ...props }, ref) {
return (
<a
ref={ref}
className={classNames(className, styles.external)}
target="_blank"
rel="noreferrer noopener"
{...props}
>
{children}
</a>
);
});

View File

@ -50,6 +50,12 @@ Please see LICENSE in the repository root for full details.
margin-bottom: 0; margin-bottom: 0;
} }
.callName {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.facePile { .facePile {
margin-top: 8px; margin-top: 8px;
} }
@ -64,3 +70,8 @@ Please see LICENSE in the repository root for full details.
justify-content: center; justify-content: center;
margin-bottom: 24px; margin-bottom: 24px;
} }
.disabled {
cursor: not-allowed;
opacity: 0.8;
}

View File

@ -9,12 +9,15 @@ import { Link } from "react-router-dom";
import { MatrixClient } from "matrix-js-sdk/src/client"; import { MatrixClient } from "matrix-js-sdk/src/client";
import { RoomMember } from "matrix-js-sdk/src/models/room-member"; import { RoomMember } from "matrix-js-sdk/src/models/room-member";
import { Room } from "matrix-js-sdk/src/models/room"; import { Room } from "matrix-js-sdk/src/models/room";
import { FC } from "react"; import { FC, useCallback, MouseEvent, useState } from "react";
import { useTranslation } from "react-i18next";
import { IconButton, Text } from "@vector-im/compound-web";
import { CloseIcon } from "@vector-im/compound-design-tokens/assets/web/icons";
import classNames from "classnames";
import { Avatar, Size } from "../Avatar"; import { Avatar, Size } from "../Avatar";
import styles from "./CallList.module.css"; import styles from "./CallList.module.css";
import { getRelativeRoomUrl } from "../utils/matrix"; import { getRelativeRoomUrl } from "../utils/matrix";
import { Body } from "../typography/Typography";
import { GroupCallRoom } from "./useGroupCallRooms"; import { GroupCallRoom } from "./useGroupCallRooms";
import { useRoomEncryptionSystem } from "../e2ee/sharedKeyManagement"; import { useRoomEncryptionSystem } from "../e2ee/sharedKeyManagement";
@ -55,22 +58,53 @@ interface CallTileProps {
client: MatrixClient; client: MatrixClient;
} }
const CallTile: FC<CallTileProps> = ({ name, avatarUrl, room }) => { const CallTile: FC<CallTileProps> = ({ name, avatarUrl, room, client }) => {
const { t } = useTranslation();
const roomEncryptionSystem = useRoomEncryptionSystem(room.roomId); const roomEncryptionSystem = useRoomEncryptionSystem(room.roomId);
const [isLeaving, setIsLeaving] = useState(false);
const onRemove = useCallback(
(e: MouseEvent) => {
e.stopPropagation();
e.preventDefault();
setIsLeaving(true);
client.leave(room.roomId).catch(() => setIsLeaving(false));
},
[room, client],
);
const body = (
<>
<Avatar id={room.roomId} name={name} size={Size.LG} src={avatarUrl} />
<div className={styles.callInfo}>
<Text weight="semibold" className={styles.callName}>
{name}
</Text>
</div>
<IconButton
onClick={onRemove}
disabled={isLeaving}
aria-label={t("action.remove")}
>
<CloseIcon />
</IconButton>
</>
);
return ( return (
<div className={styles.callTile}> <div className={styles.callTile}>
<Link {isLeaving ? (
to={getRelativeRoomUrl(room.roomId, roomEncryptionSystem, room.name)} <span className={classNames(styles.callTileLink, styles.disabled)}>
className={styles.callTileLink} {body}
> </span>
<Avatar id={room.roomId} name={name} size={Size.LG} src={avatarUrl} /> ) : (
<div className={styles.callInfo}> <Link
<Body overflowEllipsis fontWeight="semiBold"> to={getRelativeRoomUrl(room.roomId, roomEncryptionSystem, room.name)}
{name} className={styles.callTileLink}
</Body> >
</div> {body}
<div className={styles.copyButtonSpacer} /> </Link>
</Link> )}
</div> </div>
); );
}; };

View File

@ -9,7 +9,7 @@ import { useState, useCallback, FormEvent, FormEventHandler, FC } from "react";
import { useHistory } from "react-router-dom"; import { useHistory } from "react-router-dom";
import { MatrixClient } from "matrix-js-sdk/src/client"; import { MatrixClient } from "matrix-js-sdk/src/client";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { Heading } from "@vector-im/compound-web"; import { Heading, Text } from "@vector-im/compound-web";
import { logger } from "matrix-js-sdk/src/logger"; import { logger } from "matrix-js-sdk/src/logger";
import { Button } from "@vector-im/compound-web"; import { Button } from "@vector-im/compound-web";
@ -27,7 +27,6 @@ import { FieldRow, InputField, ErrorMessage } from "../input/Input";
import { CallList } from "./CallList"; import { CallList } from "./CallList";
import { UserMenuContainer } from "../UserMenuContainer"; import { UserMenuContainer } from "../UserMenuContainer";
import { JoinExistingCallModal } from "./JoinExistingCallModal"; import { JoinExistingCallModal } from "./JoinExistingCallModal";
import { Caption } from "../typography/Typography";
import { Form } from "../form/Form"; import { Form } from "../form/Form";
import { AnalyticsNotice } from "../analytics/AnalyticsNotice"; import { AnalyticsNotice } from "../analytics/AnalyticsNotice";
import { E2eeType } from "../e2ee/e2eeType"; import { E2eeType } from "../e2ee/e2eeType";
@ -144,9 +143,9 @@ export const RegisteredView: FC<Props> = ({ client }) => {
</Button> </Button>
</FieldRow> </FieldRow>
{optInAnalytics === null && ( {optInAnalytics === null && (
<Caption className={styles.notice}> <Text size="sm" className={styles.notice}>
<AnalyticsNotice /> <AnalyticsNotice />
</Caption> </Text>
)} )}
{error && ( {error && (
<FieldRow className={styles.fieldRow}> <FieldRow className={styles.fieldRow}>

View File

@ -9,7 +9,7 @@ import { FC, useCallback, useState, FormEventHandler } from "react";
import { useHistory } from "react-router-dom"; import { useHistory } from "react-router-dom";
import { randomString } from "matrix-js-sdk/src/randomstring"; import { randomString } from "matrix-js-sdk/src/randomstring";
import { Trans, useTranslation } from "react-i18next"; import { Trans, useTranslation } from "react-i18next";
import { Button, Heading } from "@vector-im/compound-web"; import { Button, Heading, Text } from "@vector-im/compound-web";
import { logger } from "matrix-js-sdk/src/logger"; import { logger } from "matrix-js-sdk/src/logger";
import { useClient } from "../ClientContext"; import { useClient } from "../ClientContext";
@ -25,7 +25,6 @@ import {
import { useInteractiveRegistration } from "../auth/useInteractiveRegistration"; import { useInteractiveRegistration } from "../auth/useInteractiveRegistration";
import { JoinExistingCallModal } from "./JoinExistingCallModal"; import { JoinExistingCallModal } from "./JoinExistingCallModal";
import { useRecaptcha } from "../auth/useRecaptcha"; import { useRecaptcha } from "../auth/useRecaptcha";
import { Body, Caption, Link } from "../typography/Typography";
import { Form } from "../form/Form"; import { Form } from "../form/Form";
import styles from "./UnauthenticatedView.module.css"; import styles from "./UnauthenticatedView.module.css";
import commonStyles from "./common.module.css"; import commonStyles from "./common.module.css";
@ -34,6 +33,7 @@ import { AnalyticsNotice } from "../analytics/AnalyticsNotice";
import { Config } from "../config/Config"; import { Config } from "../config/Config";
import { E2eeType } from "../e2ee/e2eeType"; import { E2eeType } from "../e2ee/e2eeType";
import { useOptInAnalytics } from "../settings/settings"; import { useOptInAnalytics } from "../settings/settings";
import { ExternalLink, Link } from "../button/Link";
export const UnauthenticatedView: FC = () => { export const UnauthenticatedView: FC = () => {
const { setClient } = useClient(); const { setClient } = useClient();
@ -178,18 +178,18 @@ export const UnauthenticatedView: FC = () => {
/> />
</FieldRow> </FieldRow>
{optInAnalytics === null && ( {optInAnalytics === null && (
<Caption className={styles.notice}> <Text size="sm" className={styles.notice}>
<AnalyticsNotice /> <AnalyticsNotice />
</Caption> </Text>
)} )}
<Caption className={styles.notice}> <Text size="sm" className={styles.notice}>
<Trans i18nKey="unauthenticated_view_eula_caption"> <Trans i18nKey="unauthenticated_view_eula_caption">
By clicking "Go", you agree to our{" "} By clicking "Go", you agree to our{" "}
<Link href={Config.get().eula}> <ExternalLink href={Config.get().eula}>
End User Licensing Agreement (EULA) End User Licensing Agreement (EULA)
</Link> </ExternalLink>
</Trans> </Trans>
</Caption> </Text>
{error && ( {error && (
<FieldRow> <FieldRow>
<ErrorMessage error={error} /> <ErrorMessage error={error} />
@ -207,19 +207,19 @@ export const UnauthenticatedView: FC = () => {
</Form> </Form>
</main> </main>
<footer className={styles.footer}> <footer className={styles.footer}>
<Body className={styles.mobileLoginLink}> <Text className={styles.mobileLoginLink}>
<Link color="primary" to="/login" data-testid="home_login"> <Link to="/login" data-testid="home_login">
{t("unauthenticated_view_login_button")} {t("unauthenticated_view_login_button")}
</Link> </Link>
</Body> </Text>
<Body> <Text>
<Trans i18nKey="unauthenticated_view_body"> <Trans i18nKey="unauthenticated_view_body">
Not registered yet?{" "} Not registered yet?{" "}
<Link color="primary" to="/register" data-testid="home_register"> <Link to="/register" data-testid="home_register">
Create an account Create an account
</Link> </Link>
</Trans> </Trans>
</Body> </Text>
</footer> </footer>
</div> </div>
{onFinished && ( {onFinished && (

View File

@ -237,16 +237,6 @@ body[data-platform="desktop"] {
line-height: var(--font-size-title); line-height: var(--font-size-title);
} }
a {
color: var(--cpd-color-text-action-accent);
text-decoration: none;
}
a:hover,
a:active {
opacity: 0.8;
}
hr { hr {
width: calc(100% - 24px); width: calc(100% - 24px);
border: none; border: none;

View File

@ -18,7 +18,7 @@ import "./index.css";
import { logger } from "matrix-js-sdk/src/logger"; import { logger } from "matrix-js-sdk/src/logger";
import { import {
setLogExtension as setLKLogExtension, setLogExtension as setLKLogExtension,
setLogLevel, setLogLevel as setLKLogLevel,
} from "livekit-client"; } from "livekit-client";
import { App } from "./App"; import { App } from "./App";
@ -28,9 +28,11 @@ import { Initializer } from "./initializer";
initRageshake().catch((e) => { initRageshake().catch((e) => {
logger.error("Failed to initialize rageshake", e); logger.error("Failed to initialize rageshake", e);
}); });
setLKLogLevel("debug");
setLogLevel("debug"); setLKLogExtension((level, msg, context) => {
setLKLogExtension(global.mx_rage_logger.log); // we pass a synthetic logger name of "livekit" to the rageshake to make it easier to read
global.mx_rage_logger.log(level, "livekit", msg, context);
});
logger.info(`Element Call ${import.meta.env.VITE_APP_VERSION || "dev"}`); logger.info(`Element Call ${import.meta.env.VITE_APP_VERSION || "dev"}`);

View File

@ -9,12 +9,11 @@ import { FC, FormEventHandler, ReactNode, useCallback, useState } from "react";
import { MatrixClient } from "matrix-js-sdk/src/client"; import { MatrixClient } from "matrix-js-sdk/src/client";
import { Trans, useTranslation } from "react-i18next"; import { Trans, useTranslation } from "react-i18next";
import { useHistory } from "react-router-dom"; import { useHistory } from "react-router-dom";
import { Button } from "@vector-im/compound-web"; import { Button, Heading, Text } from "@vector-im/compound-web";
import styles from "./CallEndedView.module.css"; import styles from "./CallEndedView.module.css";
import feedbackStyle from "../input/FeedbackInput.module.css"; import feedbackStyle from "../input/FeedbackInput.module.css";
import { useProfile } from "../profile/useProfile"; import { useProfile } from "../profile/useProfile";
import { Body, Headline } from "../typography/Typography";
import { Header, HeaderLogo, LeftNav, RightNav } from "../Header"; import { Header, HeaderLogo, LeftNav, RightNav } from "../Header";
import { PosthogAnalytics } from "../analytics/PosthogAnalytics"; import { PosthogAnalytics } from "../analytics/PosthogAnalytics";
import { FieldRow, InputField } from "../input/Input"; import { FieldRow, InputField } from "../input/Input";
@ -139,11 +138,11 @@ export const CallEndedView: FC<Props> = ({
return ( return (
<> <>
<main className={styles.main}> <main className={styles.main}>
<Headline className={styles.headline}> <Heading size="xl" weight="semibold" className={styles.headline}>
<Trans i18nKey="call_ended_view.body"> <Trans i18nKey="call_ended_view.body">
You were disconnected from the call You were disconnected from the call
</Trans> </Trans>
</Headline> </Heading>
<div className={styles.disconnectedButtons}> <div className={styles.disconnectedButtons}>
<Button onClick={reconnect}> <Button onClick={reconnect}>
{t("call_ended_view.reconnect_button")} {t("call_ended_view.reconnect_button")}
@ -154,9 +153,9 @@ export const CallEndedView: FC<Props> = ({
</div> </div>
</main> </main>
{!confineToRoom && ( {!confineToRoom && (
<Body className={styles.footer}> <Text className={styles.footer}>
<Link to="/"> {t("return_home_button")} </Link> <Link to="/"> {t("return_home_button")} </Link>
</Body> </Text>
)} )}
</> </>
); );
@ -164,7 +163,7 @@ export const CallEndedView: FC<Props> = ({
return ( return (
<> <>
<main className={styles.main}> <main className={styles.main}>
<Headline className={styles.headline}> <Heading size="xl" weight="semibold" className={styles.headline}>
{surveySubmitted {surveySubmitted
? t("call_ended_view.headline", { ? t("call_ended_view.headline", {
displayName, displayName,
@ -174,16 +173,16 @@ export const CallEndedView: FC<Props> = ({
}) + }) +
"\n" + "\n" +
t("call_ended_view.survey_prompt")} t("call_ended_view.survey_prompt")}
</Headline> </Heading>
{(!surveySubmitted || confineToRoom) && {(!surveySubmitted || confineToRoom) &&
PosthogAnalytics.instance.isEnabled() PosthogAnalytics.instance.isEnabled()
? qualitySurveyDialog ? qualitySurveyDialog
: createAccountDialog} : createAccountDialog}
</main> </main>
{!confineToRoom && ( {!confineToRoom && (
<Body className={styles.footer}> <Text className={styles.footer}>
<Link to="/"> {t("call_ended_view.not_now_button")} </Link> <Link to="/"> {t("call_ended_view.not_now_button")} </Link>
</Body> </Text>
)} )}
</> </>
); );

View File

@ -5,13 +5,12 @@ SPDX-License-Identifier: AGPL-3.0-only
Please see LICENSE in the repository root for full details. Please see LICENSE in the repository root for full details.
*/ */
import { useCallback } from "react";
import { MatrixClient } from "matrix-js-sdk/src/client"; import { MatrixClient } from "matrix-js-sdk/src/client";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { MatrixError } from "matrix-js-sdk/src/matrix"; import { MatrixError } from "matrix-js-sdk/src/matrix";
import { useHistory } from "react-router-dom"; import { Heading, Text } from "@vector-im/compound-web";
import { Heading, Link, Text } from "@vector-im/compound-web";
import { Link } from "../button/Link";
import { import {
useLoadGroupCall, useLoadGroupCall,
GroupCallStatus, GroupCallStatus,
@ -35,15 +34,6 @@ export function GroupCallLoader({
const { t } = useTranslation(); const { t } = useTranslation();
const groupCallState = useLoadGroupCall(client, roomIdOrAlias, viaServers); const groupCallState = useLoadGroupCall(client, roomIdOrAlias, viaServers);
const history = useHistory();
const onHomeClick = useCallback(
(ev: React.MouseEvent) => {
ev.preventDefault();
history.push("/");
},
[history],
);
switch (groupCallState.kind) { switch (groupCallState.kind) {
case "loaded": case "loaded":
case "waitForInvite": case "waitForInvite":
@ -63,9 +53,7 @@ export function GroupCallLoader({
<Text>{t("group_call_loader.failed_text")}</Text> <Text>{t("group_call_loader.failed_text")}</Text>
{/* XXX: A 'create it for me' button would be the obvious UX here. Two screens already have {/* XXX: A 'create it for me' button would be the obvious UX here. Two screens already have
dupes of this flow, let's make a common component and put it here. */} dupes of this flow, let's make a common component and put it here. */}
<Link href="/" onClick={onHomeClick}> <Link to="/">{t("common.home")}</Link>
{t("common.home")}
</Link>
</FullScreenView> </FullScreenView>
); );
} else if (groupCallState.error instanceof CallTerminatedMessage) { } else if (groupCallState.error instanceof CallTerminatedMessage) {
@ -79,9 +67,7 @@ export function GroupCallLoader({
<Text size="sm">"{groupCallState.error.reason}"</Text> <Text size="sm">"{groupCallState.error.reason}"</Text>
</> </>
)} )}
<Link href="/" onClick={onHomeClick}> <Link to="/">{t("common.home")}</Link>
{t("common.home")}
</Link>
</FullScreenView> </FullScreenView>
); );
} else { } else {

View File

@ -15,7 +15,7 @@ import {
import { logger } from "matrix-js-sdk/src/logger"; import { logger } from "matrix-js-sdk/src/logger";
import { MatrixRTCSession } from "matrix-js-sdk/src/matrixrtc/MatrixRTCSession"; import { MatrixRTCSession } from "matrix-js-sdk/src/matrixrtc/MatrixRTCSession";
import { JoinRule } from "matrix-js-sdk/src/matrix"; import { JoinRule } from "matrix-js-sdk/src/matrix";
import { Heading, Link, Text } from "@vector-im/compound-web"; import { Heading, Text } from "@vector-im/compound-web";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import type { IWidgetApiRequest } from "matrix-widget-api"; import type { IWidgetApiRequest } from "matrix-widget-api";
@ -40,6 +40,7 @@ import { useJoinRule } from "./useJoinRule";
import { InviteModal } from "./InviteModal"; import { InviteModal } from "./InviteModal";
import { useUrlParams } from "../UrlParams"; import { useUrlParams } from "../UrlParams";
import { E2eeType } from "../e2ee/e2eeType"; import { E2eeType } from "../e2ee/e2eeType";
import { Link } from "../button/Link";
declare global { declare global {
interface Window { interface Window {
@ -85,6 +86,14 @@ export const GroupCallView: FC<Props> = ({
}; };
}, [rtcSession]); }, [rtcSession]);
useEffect(() => {
// Sanity check the room object
if (client.getRoom(rtcSession.room.roomId) !== rtcSession.room)
logger.warn(
`We've ended up with multiple rooms for the same ID (${rtcSession.room.roomId}). This indicates a bug in the group call loading code, and may lead to incomplete room state.`,
);
}, [client, rtcSession.room]);
const { displayName, avatarUrl } = useProfile(client); const { displayName, avatarUrl } = useProfile(client);
const roomName = useRoomName(rtcSession.room); const roomName = useRoomName(rtcSession.room);
const roomAvatar = useRoomAvatar(rtcSession.room); const roomAvatar = useRoomAvatar(rtcSession.room);
@ -273,14 +282,6 @@ export const GroupCallView: FC<Props> = ({
); );
const onShareClick = joinRule === JoinRule.Public ? onShareClickFn : null; const onShareClick = joinRule === JoinRule.Public ? onShareClickFn : null;
const onHomeClick = useCallback(
(ev: React.MouseEvent) => {
ev.preventDefault();
history.push("/");
},
[history],
);
const { t } = useTranslation(); const { t } = useTranslation();
if (!isE2EESupportedBrowser() && e2eeSystem.kind !== E2eeType.NONE) { if (!isE2EESupportedBrowser() && e2eeSystem.kind !== E2eeType.NONE) {
@ -289,9 +290,7 @@ export const GroupCallView: FC<Props> = ({
<FullScreenView> <FullScreenView>
<Heading>{t("browser_media_e2ee_unsupported_heading")}</Heading> <Heading>{t("browser_media_e2ee_unsupported_heading")}</Heading>
<Text>{t("browser_media_e2ee_unsupported")}</Text> <Text>{t("browser_media_e2ee_unsupported")}</Text>
<Link href="/" onClick={onHomeClick}> <Link to="/">{t("common.home")}</Link>
{t("common.home")}
</Link>
</FullScreenView> </FullScreenView>
); );
} }

View File

@ -7,12 +7,11 @@ Please see LICENSE in the repository root for full details.
import { FC, useEffect } from "react"; import { FC, useEffect } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { Button } from "@vector-im/compound-web"; import { Button, Text } from "@vector-im/compound-web";
import { Modal, Props as ModalProps } from "../Modal"; import { Modal, Props as ModalProps } from "../Modal";
import { FieldRow, ErrorMessage } from "../input/Input"; import { FieldRow, ErrorMessage } from "../input/Input";
import { useSubmitRageshake } from "../settings/submit-rageshake"; import { useSubmitRageshake } from "../settings/submit-rageshake";
import { Body } from "../typography/Typography";
interface Props extends Omit<ModalProps, "title" | "children"> { interface Props extends Omit<ModalProps, "title" | "children"> {
rageshakeRequestId: string; rageshakeRequestId: string;
@ -40,7 +39,7 @@ export const RageshakeRequestModal: FC<Props> = ({
open={open} open={open}
onDismiss={onDismiss} onDismiss={onDismiss}
> >
<Body>{t("rageshake_request_modal.body")}</Body> <Text>{t("rageshake_request_modal.body")}</Text>
<FieldRow> <FieldRow>
<Button <Button
onClick={(): void => onClick={(): void =>

View File

@ -9,16 +9,16 @@ import { FC, useCallback, useState } from "react";
import { useLocation } from "react-router-dom"; import { useLocation } from "react-router-dom";
import { Trans, useTranslation } from "react-i18next"; import { Trans, useTranslation } from "react-i18next";
import { logger } from "matrix-js-sdk/src/logger"; import { logger } from "matrix-js-sdk/src/logger";
import { Button } from "@vector-im/compound-web"; import { Button, Heading, Text } from "@vector-im/compound-web";
import styles from "./RoomAuthView.module.css"; import styles from "./RoomAuthView.module.css";
import { Body, Caption, Link, Headline } from "../typography/Typography";
import { Header, HeaderLogo, LeftNav, RightNav } from "../Header"; import { Header, HeaderLogo, LeftNav, RightNav } from "../Header";
import { FieldRow, InputField, ErrorMessage } from "../input/Input"; import { FieldRow, InputField, ErrorMessage } from "../input/Input";
import { Form } from "../form/Form"; import { Form } from "../form/Form";
import { UserMenuContainer } from "../UserMenuContainer"; import { UserMenuContainer } from "../UserMenuContainer";
import { useRegisterPasswordlessUser } from "../auth/useRegisterPasswordlessUser"; import { useRegisterPasswordlessUser } from "../auth/useRegisterPasswordlessUser";
import { Config } from "../config/Config"; import { Config } from "../config/Config";
import { ExternalLink, Link } from "../button/Link";
export const RoomAuthView: FC = () => { export const RoomAuthView: FC = () => {
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
@ -63,9 +63,9 @@ export const RoomAuthView: FC = () => {
</Header> </Header>
<div className={styles.container}> <div className={styles.container}>
<main className={styles.main}> <main className={styles.main}>
<Headline className={styles.headline}> <Heading size="xl" weight="semibold" className={styles.headline}>
{t("lobby.join_button")} {t("lobby.join_button")}
</Headline> </Heading>
<Form className={styles.form} onSubmit={onSubmit}> <Form className={styles.form} onSubmit={onSubmit}>
<FieldRow> <FieldRow>
<InputField <InputField
@ -79,14 +79,14 @@ export const RoomAuthView: FC = () => {
autoComplete="off" autoComplete="off"
/> />
</FieldRow> </FieldRow>
<Caption> <Text size="sm">
<Trans i18nKey="room_auth_view_eula_caption"> <Trans i18nKey="room_auth_view_eula_caption">
By clicking "Join call now", you agree to our{" "} By clicking "Join call now", you agree to our{" "}
<Link href={Config.get().eula}> <ExternalLink href={Config.get().eula}>
End User Licensing Agreement (EULA) End User Licensing Agreement (EULA)
</Link> </ExternalLink>
</Trans> </Trans>
</Caption> </Text>
{error && ( {error && (
<FieldRow> <FieldRow>
<ErrorMessage error={error} /> <ErrorMessage error={error} />
@ -103,17 +103,14 @@ export const RoomAuthView: FC = () => {
<div id={recaptchaId} /> <div id={recaptchaId} />
</Form> </Form>
</main> </main>
<Body className={styles.footer}> <Text className={styles.footer}>
<Trans i18nKey="unauthenticated_view_body"> <Trans i18nKey="unauthenticated_view_body">
Not registered yet?{" "} Not registered yet?{" "}
<Link <Link to="/register" state={{ from: location }}>
color="primary"
to={{ pathname: "/register", state: { from: location } }}
>
Create an account Create an account
</Link> </Link>
</Trans> </Trans>
</Body> </Text>
</div> </div>
</> </>
); );

View File

@ -17,7 +17,7 @@ import { SyncState } from "matrix-js-sdk/src/sync";
import { MatrixRTCSession } from "matrix-js-sdk/src/matrixrtc/MatrixRTCSession"; import { MatrixRTCSession } from "matrix-js-sdk/src/matrixrtc/MatrixRTCSession";
import { RoomEvent, Room } from "matrix-js-sdk/src/models/room"; import { RoomEvent, Room } from "matrix-js-sdk/src/models/room";
import { KnownMembership } from "matrix-js-sdk/src/types"; import { KnownMembership } from "matrix-js-sdk/src/types";
import { JoinRule } from "matrix-js-sdk/src/matrix"; import { JoinRule, MatrixError } from "matrix-js-sdk/src/matrix";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { widget } from "../widget"; import { widget } from "../widget";
@ -54,6 +54,42 @@ export type GroupCallStatus =
| GroupCallWaitForInvite | GroupCallWaitForInvite
| GroupCallCanKnock; | GroupCallCanKnock;
const MAX_ATTEMPTS_FOR_INVITE_JOIN_FAILURE = 3;
const DELAY_MS_FOR_INVITE_JOIN_FAILURE = 3000;
/**
* Join a room, and retry on M_FORBIDDEN error in order to work
* around a potential race when joining rooms over federation.
*
* Will wait up to to `DELAY_MS_FOR_INVITE_JOIN_FAILURE` per attempt.
* Will try up to `MAX_ATTEMPTS_FOR_INVITE_JOIN_FAILURE` times.
*
* @see https://github.com/element-hq/element-call/issues/2634
* @param client The matrix client
* @param attempt Number of attempts made.
* @param params Parameters to pass to client.joinRoom
*/
async function joinRoomAfterInvite(
client: MatrixClient,
attempt = 0,
...params: Parameters<MatrixClient["joinRoom"]>
): ReturnType<MatrixClient["joinRoom"]> {
try {
return await client.joinRoom(...params);
} catch (ex) {
if (
ex instanceof MatrixError &&
ex.errcode === "M_FORBIDDEN" &&
attempt < MAX_ATTEMPTS_FOR_INVITE_JOIN_FAILURE
) {
// If we were invited and got a M_FORBIDDEN, it's highly likely the server hasn't caught up yet.
await new Promise((r) => setTimeout(r, DELAY_MS_FOR_INVITE_JOIN_FAILURE));
return joinRoomAfterInvite(client, attempt + 1, ...params);
}
throw ex;
}
}
export class CallTerminatedMessage extends Error { export class CallTerminatedMessage extends Error {
/** /**
* @param messageBody The message explaining the kind of termination (kick, ban, knock reject, etc.) (translated) * @param messageBody The message explaining the kind of termination (kick, ban, knock reject, etc.) (translated)
@ -162,10 +198,13 @@ export const useLoadGroupCall = (
membership === KnownMembership.Invite && membership === KnownMembership.Invite &&
prevMembership === KnownMembership.Knock prevMembership === KnownMembership.Knock
) { ) {
client.joinRoom(room.roomId, { viaServers }).then((room) => { joinRoomAfterInvite(client, 0, room.roomId, { viaServers }).then(
logger.log("Auto-joined %s", room.roomId); (room) => {
resolve(room); logger.log("Auto-joined %s", room.roomId);
}, reject); resolve(room);
},
reject,
);
} }
if (membership === KnownMembership.Ban) reject(bannedError()); if (membership === KnownMembership.Ban) reject(bannedError());
if (membership === KnownMembership.Leave) if (membership === KnownMembership.Leave)

View File

@ -8,12 +8,11 @@ Please see LICENSE in the repository root for full details.
import { FC, useCallback } from "react"; import { FC, useCallback } from "react";
import { randomString } from "matrix-js-sdk/src/randomstring"; import { randomString } from "matrix-js-sdk/src/randomstring";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { Button } from "@vector-im/compound-web"; import { Button, Text } from "@vector-im/compound-web";
import { logger } from "matrix-js-sdk/src/logger"; import { logger } from "matrix-js-sdk/src/logger";
import { FieldRow, InputField, ErrorMessage } from "../input/Input"; import { FieldRow, InputField, ErrorMessage } from "../input/Input";
import { useSubmitRageshake, useRageshakeRequest } from "./submit-rageshake"; import { useSubmitRageshake, useRageshakeRequest } from "./submit-rageshake";
import { Body } from "../typography/Typography";
import feedbackStyles from "../input/FeedbackInput.module.css"; import feedbackStyles from "../input/FeedbackInput.module.css";
interface Props { interface Props {
@ -56,7 +55,7 @@ export const FeedbackSettingsTab: FC<Props> = ({ roomId }) => {
return ( return (
<div> <div>
<h4>{t("settings.feedback_tab_h4")}</h4> <h4>{t("settings.feedback_tab_h4")}</h4>
<Body>{t("settings.feedback_tab_body")}</Body> <Text>{t("settings.feedback_tab_body")}</Text>
<form onSubmit={onSubmitFeedback}> <form onSubmit={onSubmitFeedback}>
<FieldRow> <FieldRow>
<InputField <InputField
@ -69,9 +68,7 @@ export const FeedbackSettingsTab: FC<Props> = ({ roomId }) => {
disabled={sending || sent} disabled={sending || sent}
/> />
</FieldRow> </FieldRow>
{sent ? ( {!sent && (
<Body> {t("settings.feedback_tab_thank_you")}</Body>
) : (
<FieldRow> <FieldRow>
<InputField <InputField
id="sendLogs" id="sendLogs"
@ -80,16 +77,15 @@ export const FeedbackSettingsTab: FC<Props> = ({ roomId }) => {
type="checkbox" type="checkbox"
defaultChecked defaultChecked
/> />
{error && (
<FieldRow>
<ErrorMessage error={error} />
</FieldRow>
)}
<Button type="submit" disabled={sending}> <Button type="submit" disabled={sending}>
{sending ? t("submitting") : t("action.submit")} {sending ? t("submitting") : t("action.submit")}
</Button> </Button>
</FieldRow> </FieldRow>
)} )}
<FieldRow>
{error && <ErrorMessage error={error} />}
{sent && <Text>{t("settings.feedback_tab_thank_you")}</Text>}
</FieldRow>
</form> </form>
</div> </div>
); );

View File

@ -8,13 +8,12 @@ Please see LICENSE in the repository root for full details.
import { ChangeEvent, FC, ReactNode, useCallback } from "react"; import { ChangeEvent, FC, ReactNode, useCallback } from "react";
import { Trans, useTranslation } from "react-i18next"; import { Trans, useTranslation } from "react-i18next";
import { MatrixClient } from "matrix-js-sdk/src/matrix"; import { MatrixClient } from "matrix-js-sdk/src/matrix";
import { Dropdown } from "@vector-im/compound-web"; import { Dropdown, Text } from "@vector-im/compound-web";
import { Modal } from "../Modal"; import { Modal } from "../Modal";
import styles from "./SettingsModal.module.css"; import styles from "./SettingsModal.module.css";
import { Tab, TabContainer } from "../tabs/Tabs"; import { Tab, TabContainer } from "../tabs/Tabs";
import { FieldRow, InputField } from "../input/Input"; import { FieldRow, InputField } from "../input/Input";
import { Caption } from "../typography/Typography";
import { AnalyticsNotice } from "../analytics/AnalyticsNotice"; import { AnalyticsNotice } from "../analytics/AnalyticsNotice";
import { ProfileSettingsTab } from "./ProfileSettingsTab"; import { ProfileSettingsTab } from "./ProfileSettingsTab";
import { FeedbackSettingsTab } from "./FeedbackSettingsTab"; import { FeedbackSettingsTab } from "./FeedbackSettingsTab";
@ -102,14 +101,14 @@ export const SettingsModal: FC<Props> = ({
}; };
const optInDescription = ( const optInDescription = (
<Caption> <Text size="sm">
<Trans i18nKey="settings.opt_in_description"> <Trans i18nKey="settings.opt_in_description">
<AnalyticsNotice /> <AnalyticsNotice />
<br /> <br />
You may withdraw consent by unchecking this box. If you are currently in You may withdraw consent by unchecking this box. If you are currently in
a call, this setting will take effect at the end of the call. a call, this setting will take effect at the end of the call.
</Trans> </Trans>
</Caption> </Text>
); );
const devices = useMediaDevices(); const devices = useMediaDevices();

View File

@ -29,9 +29,9 @@ Please see LICENSE in the repository root for full details.
import EventEmitter from "events"; import EventEmitter from "events";
import { throttle } from "lodash"; import { throttle } from "lodash";
import { logger } from "matrix-js-sdk/src/logger"; import { Logger, logger } from "matrix-js-sdk/src/logger";
import { randomString } from "matrix-js-sdk/src/randomstring"; import { randomString } from "matrix-js-sdk/src/randomstring";
import { LoggingMethod } from "loglevel"; import loglevel, { LoggingMethod } from "loglevel";
// the length of log data we keep in indexeddb (and include in the reports) // the length of log data we keep in indexeddb (and include in the reports)
const MAX_LOG_SIZE = 1024 * 1024 * 5; // 5 MB const MAX_LOG_SIZE = 1024 * 1024 * 5; // 5 MB
@ -467,7 +467,12 @@ declare global {
*/ */
export async function init(): Promise<void> { export async function init(): Promise<void> {
global.mx_rage_logger = new ConsoleLogger(); global.mx_rage_logger = new ConsoleLogger();
setLogExtension(global.mx_rage_logger.log); setLogExtension(logger, global.mx_rage_logger.log);
// these are the child/prefixed loggers we want to capture from js-sdk
// there doesn't seem to be an easy way to capture all children
["MatrixRTCSession", "MatrixRTCSessionManager"].forEach((loggerName) => {
setLogExtension(logger.getChild(loggerName), global.mx_rage_logger.log);
});
return tryInitStorage(); return tryInitStorage();
} }
@ -580,10 +585,14 @@ type LogLevelString = keyof typeof LogLevel;
* took loglevel's example honouring log levels). Adds a loglevel logging extension * took loglevel's example honouring log levels). Adds a loglevel logging extension
* in the recommended way. * in the recommended way.
*/ */
export function setLogExtension(extension: LogExtensionFunc): void { function setLogExtension(
const originalFactory = logger.methodFactory; _loggerToExtend: Logger,
extension: LogExtensionFunc,
): void {
const loggerToExtend = _loggerToExtend as unknown as loglevel.Logger;
const originalFactory = loggerToExtend.methodFactory;
logger.methodFactory = function ( loggerToExtend.methodFactory = function (
methodName, methodName,
configLevel, configLevel,
loggerName, loggerName,
@ -594,11 +603,14 @@ export function setLogExtension(extension: LogExtensionFunc): void {
const needLog = logLevel >= configLevel && logLevel < LogLevel.silent; const needLog = logLevel >= configLevel && logLevel < LogLevel.silent;
return (...args) => { return (...args) => {
// we don't send the logger name to the raw method as some of them are already outputting the prefix
rawMethod.apply(this, args); rawMethod.apply(this, args);
if (needLog) { if (needLog) {
extension(logLevel, ...args); // we prefix the logger name to the extension
// this makes sure that the rageshake contains the logger name
extension(logLevel, loggerName?.toString(), ...args);
} }
}; };
}; };
logger.setLevel(logger.getLevel()); // Be sure to call setLevel method in order to apply plugin loggerToExtend.setLevel(loggerToExtend.getLevel()); // Be sure to call setLevel method in order to apply plugin
} }

View File

@ -270,11 +270,17 @@ export function useSubmitRageshake(): {
); );
} }
await fetch(Config.get().rageshake!.submit_url, { const res = await fetch(Config.get().rageshake!.submit_url, {
method: "POST", method: "POST",
body, body,
}); });
if (res.status !== 200) {
throw new Error(
`Failed to submit feedback: receive HTTP ${res.status} ${res.statusText}`,
);
}
setState({ sending: false, sent: true, error: undefined }); setState({ sending: false, sent: true, error: undefined });
} catch (error) { } catch (error) {
setState({ sending: false, sent: false, error: error as Error }); setState({ sending: false, sent: false, error: error as Error });

View File

@ -16,7 +16,11 @@ import {
ParticipantEvent, ParticipantEvent,
RemoteParticipant, RemoteParticipant,
} from "livekit-client"; } from "livekit-client";
import { Room as MatrixRoom, RoomMember } from "matrix-js-sdk/src/matrix"; import {
Room as MatrixRoom,
RoomMember,
RoomStateEvent,
} from "matrix-js-sdk/src/matrix";
import { import {
EMPTY, EMPTY,
Observable, Observable,
@ -320,6 +324,8 @@ export class CallViewModel extends ViewModel {
this.remoteParticipants, this.remoteParticipants,
observeParticipantMedia(this.livekitRoom.localParticipant), observeParticipantMedia(this.livekitRoom.localParticipant),
duplicateTiles.value, duplicateTiles.value,
// Also react to changes in the list of members
fromEvent(this.matrixRoom, RoomStateEvent.Update).pipe(startWith(null)),
]).pipe( ]).pipe(
scan( scan(
( (

View File

@ -1,47 +0,0 @@
/*
Copyright 2022-2024 New Vector Ltd.
SPDX-License-Identifier: AGPL-3.0-only
Please see LICENSE in the repository root for full details.
*/
.caption {
font-size: var(--font-size-caption);
line-height: var(--font-size-body);
}
.micro {
font-size: var(--font-size-micro);
line-height: var(--font-size-caption);
}
.regular {
font-weight: 400;
}
.semiBold {
font-weight: 600;
}
.bold {
font-weight: 700;
}
.link {
color: var(--cpd-color-text-link-external);
}
.link:hover {
text-decoration: underline;
opacity: initial;
}
.primary {
color: var(--cpd-color-text-action-accent);
}
.overflowEllipsis {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}

View File

@ -1,262 +0,0 @@
/*
Copyright 2022-2024 New Vector Ltd.
SPDX-License-Identifier: AGPL-3.0-only
Please see LICENSE in the repository root for full details.
*/
import { createElement, forwardRef, ReactNode } from "react";
import classNames from "classnames";
import { Link as RouterLink } from "react-router-dom";
import * as H from "history";
import styles from "./Typography.module.css";
interface TypographyProps {
children: ReactNode;
fontWeight?: string;
className?: string;
overflowEllipsis?: boolean;
as?: string;
}
export const Headline = forwardRef<HTMLHeadingElement, TypographyProps>(
(
{
as: Component = "h1",
children,
className,
fontWeight,
overflowEllipsis,
...rest
},
ref,
) => {
return createElement(
Component,
{
...rest,
className: classNames(
styles[fontWeight ?? ""],
{ [styles.overflowEllipsis]: overflowEllipsis },
className,
),
ref,
},
children,
);
},
);
Headline.displayName = "Headline";
export const Title = forwardRef<HTMLHeadingElement, TypographyProps>(
(
{
as: Component = "h2",
children,
className,
fontWeight,
overflowEllipsis,
...rest
},
ref,
) => {
return createElement(
Component,
{
...rest,
className: classNames(
styles[fontWeight ?? ""],
{ [styles.overflowEllipsis]: overflowEllipsis },
className,
),
ref,
},
children,
);
},
);
Title.displayName = "Title";
export const Subtitle = forwardRef<HTMLParagraphElement, TypographyProps>(
(
{
as: Component = "h3",
children,
className,
fontWeight,
overflowEllipsis,
...rest
},
ref,
) => {
return createElement(
Component,
{
...rest,
className: classNames(
styles[fontWeight ?? ""],
{ [styles.overflowEllipsis]: overflowEllipsis },
className,
),
ref,
},
children,
);
},
);
Subtitle.displayName = "Subtitle";
export const Body = forwardRef<HTMLParagraphElement, TypographyProps>(
(
{
as: Component = "p",
children,
className,
fontWeight,
overflowEllipsis,
...rest
},
ref,
) => {
return createElement(
Component,
{
...rest,
className: classNames(
styles[fontWeight ?? ""],
{ [styles.overflowEllipsis]: overflowEllipsis },
className,
),
ref,
},
children,
);
},
);
Body.displayName = "Body";
export const Caption = forwardRef<HTMLParagraphElement, TypographyProps>(
(
{
as: Component = "p",
children,
className,
fontWeight,
overflowEllipsis,
...rest
},
ref,
) => {
return createElement(
Component,
{
...rest,
className: classNames(
styles.caption,
styles[fontWeight ?? ""],
{ [styles.overflowEllipsis]: overflowEllipsis },
className,
),
ref,
},
children,
);
},
);
Caption.displayName = "Caption";
export const Micro = forwardRef<HTMLParagraphElement, TypographyProps>(
(
{
as: Component = "p",
children,
className,
fontWeight,
overflowEllipsis,
...rest
},
ref,
) => {
return createElement(
Component,
{
...rest,
className: classNames(
styles.micro,
styles[fontWeight ?? ""],
{ [styles.overflowEllipsis]: overflowEllipsis },
className,
),
ref,
},
children,
);
},
);
Micro.displayName = "Micro";
interface LinkProps extends TypographyProps {
to?: H.LocationDescriptor<unknown>;
color?: string;
href?: string;
}
export const Link = forwardRef<HTMLAnchorElement, LinkProps>(
(
{
as,
children,
className,
color = "link",
href,
to,
fontWeight,
overflowEllipsis,
...rest
},
ref,
) => {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
const Component: string | RouterLink = as || (to ? RouterLink : "a");
let externalLinkProps: { href: string; target: string; rel: string };
if (href) {
externalLinkProps = {
href,
target: "_blank",
rel: "noreferrer noopener",
};
}
return createElement(
Component,
{
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
...externalLinkProps,
...rest,
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
to: to,
className: classNames(
styles[color],
styles[fontWeight ?? ""],
{ [styles.overflowEllipsis]: overflowEllipsis },
className,
),
ref: ref,
},
children,
);
},
);
Link.displayName = "Link";

314
yarn.lock
View File

@ -1746,48 +1746,40 @@
integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==
"@floating-ui/core@^1.6.0": "@floating-ui/core@^1.6.0":
version "1.6.7"
resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.7.tgz#7602367795a390ff0662efd1c7ae8ca74e75fb12"
integrity sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g==
dependencies:
"@floating-ui/utils" "^0.2.7"
"@floating-ui/dom@1.6.8":
version "1.6.8" version "1.6.8"
resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.8.tgz#45e20532b6d8a061b356a4fb336022cf2609754d" resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.8.tgz#aa43561be075815879305965020f492cdb43da12"
integrity sha512-kx62rP19VZ767Q653wsP1XZCGIirkE09E0QUGNYTM/ttbbQHqcGPdSfWFxUyyNLc/W6aoJRBajOSXhP6GXjC0Q== integrity sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==
dependencies:
"@floating-ui/utils" "^0.2.8"
"@floating-ui/dom@1.6.11", "@floating-ui/dom@^1.0.0":
version "1.6.11"
resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.11.tgz#8631857838d34ee5712339eb7cbdfb8ad34da723"
integrity sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==
dependencies: dependencies:
"@floating-ui/core" "^1.6.0" "@floating-ui/core" "^1.6.0"
"@floating-ui/utils" "^0.2.5" "@floating-ui/utils" "^0.2.8"
"@floating-ui/dom@^1.0.0": "@floating-ui/react-dom@^2.0.0", "@floating-ui/react-dom@^2.1.2":
version "1.6.10" version "2.1.2"
resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.10.tgz#b74c32f34a50336c86dcf1f1c845cf3a39e26d6f" resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.2.tgz#a1349bbf6a0e5cb5ded55d023766f20a4d439a31"
integrity sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A== integrity sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==
dependencies:
"@floating-ui/core" "^1.6.0"
"@floating-ui/utils" "^0.2.7"
"@floating-ui/react-dom@^2.0.0", "@floating-ui/react-dom@^2.1.1":
version "2.1.1"
resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.1.tgz#cca58b6b04fc92b4c39288252e285e0422291fb0"
integrity sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==
dependencies: dependencies:
"@floating-ui/dom" "^1.0.0" "@floating-ui/dom" "^1.0.0"
"@floating-ui/react@^0.26.9": "@floating-ui/react@^0.26.9":
version "0.26.23" version "0.26.24"
resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.26.23.tgz#28985e5ce482c34f347f28076f11267e47a933bd" resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.26.24.tgz#072b9dfeca4e79ef4e3000ef1c28e0ffc86f4ed4"
integrity sha512-9u3i62fV0CFF3nIegiWiRDwOs7OW/KhSUJDNx2MkQM3LbE5zQOY01sL3nelcVBXvX7Ovvo3A49I8ql+20Wg/Hw== integrity sha512-2ly0pCkZIGEQUq5H8bBK0XJmc1xIK/RM3tvVzY3GBER7IOD1UgmC2Y2tjj4AuS+TC+vTE1KJv2053290jua0Sw==
dependencies: dependencies:
"@floating-ui/react-dom" "^2.1.1" "@floating-ui/react-dom" "^2.1.2"
"@floating-ui/utils" "^0.2.7" "@floating-ui/utils" "^0.2.8"
tabbable "^6.0.0" tabbable "^6.0.0"
"@floating-ui/utils@^0.2.5", "@floating-ui/utils@^0.2.7": "@floating-ui/utils@^0.2.8":
version "0.2.7" version "0.2.8"
resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.7.tgz#d0ece53ce99ab5a8e37ebdfe5e32452a2bfc073e" resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.8.tgz#21a907684723bbbaa5f0974cf7730bd797eb8e62"
integrity sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA== integrity sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==
"@gulpjs/to-absolute-glob@^4.0.0": "@gulpjs/to-absolute-glob@^4.0.0":
version "4.0.0" version "4.0.0"
@ -1864,21 +1856,21 @@
"@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/resolve-uri" "^3.1.0"
"@jridgewell/sourcemap-codec" "^1.4.14" "@jridgewell/sourcemap-codec" "^1.4.14"
"@livekit/components-core@0.11.2", "@livekit/components-core@^0.11.0": "@livekit/components-core@0.11.5", "@livekit/components-core@^0.11.0":
version "0.11.2" version "0.11.5"
resolved "https://registry.yarnpkg.com/@livekit/components-core/-/components-core-0.11.2.tgz#fded2e207155e4737ed52830d48b75ae2eaaf449" resolved "https://registry.yarnpkg.com/@livekit/components-core/-/components-core-0.11.5.tgz#6c61910f6cecd51a88a195ccbd9300832fdf1c22"
integrity sha512-rXQ1OvyGe9gY8BCpH5FTr4Il17/sS/ecJQbG3PoOXAkQVl5JP965eqUPyKXZTdxNKlVLef00AygrO2pPArwOTA== integrity sha512-aaWPQJEfbY5tUND+diB7sW/6dRWN/H9lwqVy7L3nt15MszN1lX7ZlM9gA4ODquv+wUyFhxYfjRm7jVuV/g234g==
dependencies: dependencies:
"@floating-ui/dom" "1.6.8" "@floating-ui/dom" "1.6.11"
loglevel "1.9.1" loglevel "1.9.1"
rxjs "7.8.1" rxjs "7.8.1"
"@livekit/components-react@^2.0.0": "@livekit/components-react@^2.0.0":
version "2.4.3" version "2.5.4"
resolved "https://registry.yarnpkg.com/@livekit/components-react/-/components-react-2.4.3.tgz#634b507be2dfede2267f304fc5922d1b69e2be56" resolved "https://registry.yarnpkg.com/@livekit/components-react/-/components-react-2.5.4.tgz#43181f3a7718f58e4a77b0fdd45d96e99777ffa4"
integrity sha512-XhCvwFvNjhBJcoQHIY4Hk6MBp7mM9q0n0i7sN/xK3fB1DSjkxIkpc7lh/+Pjqdu6F6OJT3MjwNFYnftqy6kcmw== integrity sha512-uog/fZMOABFNX2HS8R4zYr2F+m14vS4mifAnRWDux+4wjMvBminX57pRqf/YN9wHc0cmiPlq0Nd8JLWnqJd2fg==
dependencies: dependencies:
"@livekit/components-core" "0.11.2" "@livekit/components-core" "0.11.5"
clsx "2.1.1" clsx "2.1.1"
usehooks-ts "3.1.0" usehooks-ts "3.1.0"
@ -1889,10 +1881,10 @@
dependencies: dependencies:
"@bufbuild/protobuf" "^1.7.2" "@bufbuild/protobuf" "^1.7.2"
"@matrix-org/matrix-sdk-crypto-wasm@^7.0.0": "@matrix-org/matrix-sdk-crypto-wasm@^8.0.0":
version "7.0.0" version "8.0.0"
resolved "https://registry.yarnpkg.com/@matrix-org/matrix-sdk-crypto-wasm/-/matrix-sdk-crypto-wasm-7.0.0.tgz#8d6abdb9ded8656cc9e2a7909913a34bf3fc9b3a" resolved "https://registry.yarnpkg.com/@matrix-org/matrix-sdk-crypto-wasm/-/matrix-sdk-crypto-wasm-8.0.0.tgz#6ddc0e63538e821a2efbc5c1a2f0fa0f71d489ff"
integrity sha512-MOencXiW/gI5MuTtCNsuojjwT5DXCrjMqv9xOslJC9h2tPdLFFFMGr58dY5Lis4DRd9MRWcgrGowUIHOqieWTA== integrity sha512-s0q3O2dK8b6hOJ+SZFz+s/IiMabmVsNue6r17sTwbrRD8liBkCrpjYnxoMYvtC01GggJ9TZLQbeqpt8hQSPHAg==
"@matrix-org/olm@3.2.15": "@matrix-org/olm@3.2.15":
version "3.2.15" version "3.2.15"
@ -2441,85 +2433,85 @@
estree-walker "^2.0.2" estree-walker "^2.0.2"
picomatch "^2.3.1" picomatch "^2.3.1"
"@rollup/rollup-android-arm-eabi@4.21.2": "@rollup/rollup-android-arm-eabi@4.21.3":
version "4.21.2" version "4.21.3"
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.2.tgz#0412834dc423d1ff7be4cb1fc13a86a0cd262c11" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.3.tgz#155c7d82c1b36c3ad84d9adf9b3cd520cba81a0f"
integrity sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg== integrity sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg==
"@rollup/rollup-android-arm64@4.21.2": "@rollup/rollup-android-arm64@4.21.3":
version "4.21.2" version "4.21.3"
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.2.tgz#baf1a014b13654f3b9e835388df9caf8c35389cb" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.3.tgz#b94b6fa002bd94a9cbd8f9e47e23b25e5bd113ba"
integrity sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA== integrity sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g==
"@rollup/rollup-darwin-arm64@4.21.2": "@rollup/rollup-darwin-arm64@4.21.3":
version "4.21.2" version "4.21.3"
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.2.tgz#0a2c364e775acdf1172fe3327662eec7c46e55b1" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.3.tgz#0934126cf9cbeadfe0eb7471ab5d1517e8cd8dcc"
integrity sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q== integrity sha512-P0UxIOrKNBFTQaXTxOH4RxuEBVCgEA5UTNV6Yz7z9QHnUJ7eLX9reOd/NYMO3+XZO2cco19mXTxDMXxit4R/eQ==
"@rollup/rollup-darwin-x64@4.21.2": "@rollup/rollup-darwin-x64@4.21.3":
version "4.21.2" version "4.21.3"
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.2.tgz#a972db75890dfab8df0da228c28993220a468c42" resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.3.tgz#0ce8e1e0f349778938c7c90e4bdc730640e0a13e"
integrity sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w== integrity sha512-L1M0vKGO5ASKntqtsFEjTq/fD91vAqnzeaF6sfNAy55aD+Hi2pBI5DKwCO+UNDQHWsDViJLqshxOahXyLSh3EA==
"@rollup/rollup-linux-arm-gnueabihf@4.21.2": "@rollup/rollup-linux-arm-gnueabihf@4.21.3":
version "4.21.2" version "4.21.3"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.2.tgz#1609d0630ef61109dd19a278353e5176d92e30a1" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.3.tgz#5669d34775ad5d71e4f29ade99d0ff4df523afb6"
integrity sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w== integrity sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g==
"@rollup/rollup-linux-arm-musleabihf@4.21.2": "@rollup/rollup-linux-arm-musleabihf@4.21.3":
version "4.21.2" version "4.21.3"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.2.tgz#3c1dca5f160aa2e79e4b20ff6395eab21804f266" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.3.tgz#f6d1a0e1da4061370cb2f4244fbdd727c806dd88"
integrity sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w== integrity sha512-zmjbSphplZlau6ZTkxd3+NMtE4UKVy7U4aVFMmHcgO5CUbw17ZP6QCgyxhzGaU/wFFdTfiojjbLG3/0p9HhAqA==
"@rollup/rollup-linux-arm64-gnu@4.21.2": "@rollup/rollup-linux-arm64-gnu@4.21.3":
version "4.21.2" version "4.21.3"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.2.tgz#c2fe376e8b04eafb52a286668a8df7c761470ac7" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.3.tgz#ed96a05e99743dee4d23cc4913fc6e01a0089c88"
integrity sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw== integrity sha512-nSZfcZtAnQPRZmUkUQwZq2OjQciR6tEoJaZVFvLHsj0MF6QhNMg0fQ6mUOsiCUpTqxTx0/O6gX0V/nYc7LrgPw==
"@rollup/rollup-linux-arm64-musl@4.21.2": "@rollup/rollup-linux-arm64-musl@4.21.3":
version "4.21.2" version "4.21.3"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.2.tgz#e62a4235f01e0f66dbba587c087ca6db8008ec80" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.3.tgz#057ea26eaa7e537a06ded617d23d57eab3cecb58"
integrity sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w== integrity sha512-MnvSPGO8KJXIMGlQDYfvYS3IosFN2rKsvxRpPO2l2cum+Z3exiExLwVU+GExL96pn8IP+GdH8Tz70EpBhO0sIQ==
"@rollup/rollup-linux-powerpc64le-gnu@4.21.2": "@rollup/rollup-linux-powerpc64le-gnu@4.21.3":
version "4.21.2" version "4.21.3"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.2.tgz#24b3457e75ee9ae5b1c198bd39eea53222a74e54" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.3.tgz#6e6e1f9404c9bf3fbd7d51cd11cd288a9a2843aa"
integrity sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ== integrity sha512-+W+p/9QNDr2vE2AXU0qIy0qQE75E8RTwTwgqS2G5CRQ11vzq0tbnfBd6brWhS9bCRjAjepJe2fvvkvS3dno+iw==
"@rollup/rollup-linux-riscv64-gnu@4.21.2": "@rollup/rollup-linux-riscv64-gnu@4.21.3":
version "4.21.2" version "4.21.3"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.2.tgz#38edfba9620fe2ca8116c97e02bd9f2d606bde09" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.3.tgz#eef1536a53f6e6658a2a778130e6b1a4a41cb439"
integrity sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg== integrity sha512-yXH6K6KfqGXaxHrtr+Uoy+JpNlUlI46BKVyonGiaD74ravdnF9BUNC+vV+SIuB96hUMGShhKV693rF9QDfO6nQ==
"@rollup/rollup-linux-s390x-gnu@4.21.2": "@rollup/rollup-linux-s390x-gnu@4.21.3":
version "4.21.2" version "4.21.3"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.2.tgz#a3bfb8bc5f1e802f8c76cff4a4be2e9f9ac36a18" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.3.tgz#2b28fb89ca084efaf8086f435025d96b4a966957"
integrity sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ== integrity sha512-R8cwY9wcnApN/KDYWTH4gV/ypvy9yZUHlbJvfaiXSB48JO3KpwSpjOGqO4jnGkLDSk1hgjYkTbTt6Q7uvPf8eg==
"@rollup/rollup-linux-x64-gnu@4.21.2": "@rollup/rollup-linux-x64-gnu@4.21.3":
version "4.21.2" version "4.21.3"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.2.tgz#0dadf34be9199fcdda44b5985a086326344f30ad" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.3.tgz#5226cde6c6b495b04a3392c1d2c572844e42f06b"
integrity sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw== integrity sha512-kZPbX/NOPh0vhS5sI+dR8L1bU2cSO9FgxwM8r7wHzGydzfSjLRCFAT87GR5U9scj2rhzN3JPYVC7NoBbl4FZ0g==
"@rollup/rollup-linux-x64-musl@4.21.2": "@rollup/rollup-linux-x64-musl@4.21.3":
version "4.21.2" version "4.21.3"
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.2.tgz#7b7deddce240400eb87f2406a445061b4fed99a8" resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.3.tgz#2c2412982e6c2a00a2ecac6d548ebb02f0aa6ca4"
integrity sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg== integrity sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg==
"@rollup/rollup-win32-arm64-msvc@4.21.2": "@rollup/rollup-win32-arm64-msvc@4.21.3":
version "4.21.2" version "4.21.3"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.2.tgz#a0ca0c5149c2cfb26fab32e6ba3f16996fbdb504" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.3.tgz#fbb6ef5379199e2ec0103ef32877b0985c773a55"
integrity sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ== integrity sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q==
"@rollup/rollup-win32-ia32-msvc@4.21.2": "@rollup/rollup-win32-ia32-msvc@4.21.3":
version "4.21.2" version "4.21.3"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.2.tgz#aae2886beec3024203dbb5569db3a137bc385f8e" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.3.tgz#d50e2082e147e24d87fe34abbf6246525ec3845a"
integrity sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw== integrity sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA==
"@rollup/rollup-win32-x64-msvc@4.21.2": "@rollup/rollup-win32-x64-msvc@4.21.3":
version "4.21.2" version "4.21.3"
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.2.tgz#e4291e3c1bc637083f87936c333cdbcad22af63b" resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.3.tgz#4115233aa1bd5a2060214f96d8511f6247093212"
integrity sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA== integrity sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA==
"@rtsao/scc@^1.1.0": "@rtsao/scc@^1.1.0":
version "1.1.0" version "1.1.0"
@ -3093,9 +3085,9 @@
integrity sha512-PtQMG7kDzwtjw/fLKD63uWP5rJ8cgWc/aXarfEzxYUf9ceWxBajnYOBI2jDqtE3WIUe9uTVBzNEvmOBG/VIgTA== integrity sha512-PtQMG7kDzwtjw/fLKD63uWP5rJ8cgWc/aXarfEzxYUf9ceWxBajnYOBI2jDqtE3WIUe9uTVBzNEvmOBG/VIgTA==
"@vector-im/compound-web@^6.0.0": "@vector-im/compound-web@^6.0.0":
version "6.1.2" version "6.2.0"
resolved "https://registry.yarnpkg.com/@vector-im/compound-web/-/compound-web-6.1.2.tgz#3f8bbd69f2b06a2b8dd12c68df813356e5486074" resolved "https://registry.yarnpkg.com/@vector-im/compound-web/-/compound-web-6.2.0.tgz#ae38f04be524b87b2b655858e603f60677d9a973"
integrity sha512-kWOcprUsGGrGPRT9lPE3tnyGYWzNEIQSZ57BT/vMx9NX4QqT/Dpq0VhkBKm8W583NoYtxDOgSWWkvFQhyHVkWw== integrity sha512-oRoRDyKzlgPwjhZcn/Ll9zTccr/61ky3g7JUfQtvbe03H2Gyd887J8KJ/Q6RuUvVyUYTjHh2yi+eKp3UK1ylCw==
dependencies: dependencies:
"@floating-ui/react" "^0.26.9" "@floating-ui/react" "^0.26.9"
"@radix-ui/react-context-menu" "^2.1.5" "@radix-ui/react-context-menu" "^2.1.5"
@ -3250,11 +3242,6 @@ ansi-regex@^5.0.1:
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
ansi-regex@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a"
integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==
ansi-styles@^3.2.1: ansi-styles@^3.2.1:
version "3.2.1" version "3.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
@ -5811,16 +5798,16 @@ lines-and-columns@^1.1.6:
integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
livekit-client@^2.0.2: livekit-client@^2.0.2:
version "2.5.1" version "2.5.2"
resolved "https://registry.yarnpkg.com/livekit-client/-/livekit-client-2.5.1.tgz#c5a6bcc7069133e71ed1f3dd3e397a7480cf24b3" resolved "https://registry.yarnpkg.com/livekit-client/-/livekit-client-2.5.2.tgz#3c8fcc67a0eb4a990822603e3f016d18b400a1a1"
integrity sha512-D7BzGoO3nc7/H2pEP9hseTjpzfgUoQ1AdeUNdlM7XNEywvorY1UR6RhOWH9UvycM/D5tIIRx7OvhxzpVfHE3TA== integrity sha512-rzWFH02UznHxpnbj+WEEoHxL1ZSo9BdFK+7ltSZWniTt2llnNckdqeXNsjkBH6k+C9agHTF4XikmxKcpWa4YrQ==
dependencies: dependencies:
"@livekit/protocol" "1.20.1" "@livekit/protocol" "1.20.1"
events "^3.3.0" events "^3.3.0"
loglevel "^1.8.0" loglevel "^1.8.0"
sdp-transform "^2.14.1" sdp-transform "^2.14.1"
ts-debounce "^4.0.0" ts-debounce "^4.0.0"
tslib "2.6.3" tslib "2.7.0"
typed-emitter "^2.1.0" typed-emitter "^2.1.0"
webrtc-adapter "^9.0.0" webrtc-adapter "^9.0.0"
@ -5858,7 +5845,7 @@ lodash@^4.17.21:
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
loglevel@1.9.1, loglevel@^1.8.0: loglevel@1.9.1:
version "1.9.1" version "1.9.1"
resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.9.1.tgz#d63976ac9bcd03c7c873116d41c2a85bafff1be7" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.9.1.tgz#d63976ac9bcd03c7c873116d41c2a85bafff1be7"
integrity sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg== integrity sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==
@ -5868,7 +5855,7 @@ loglevel@^1.7.1:
resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.1.tgz#5c621f83d5b48c54ae93b6156353f555963377b4" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.1.tgz#5c621f83d5b48c54ae93b6156353f555963377b4"
integrity sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg== integrity sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==
loglevel@^1.9.1: loglevel@^1.8.0, loglevel@^1.9.1:
version "1.9.2" version "1.9.2"
resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.9.2.tgz#c2e028d6c757720107df4e64508530db6621ba08" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.9.2.tgz#c2e028d6c757720107df4e64508530db6621ba08"
integrity sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg== integrity sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==
@ -5959,12 +5946,12 @@ matrix-events-sdk@0.0.1:
resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd"
integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA==
matrix-js-sdk@matrix-org/matrix-js-sdk#169e8f86139111574a3738f8557c6fa4b2a199db: matrix-js-sdk@matrix-org/matrix-js-sdk#414ac9d8cc28330718236b90ad67a1507e146932:
version "34.4.0" version "34.5.0"
resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/169e8f86139111574a3738f8557c6fa4b2a199db" resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/414ac9d8cc28330718236b90ad67a1507e146932"
dependencies: dependencies:
"@babel/runtime" "^7.12.5" "@babel/runtime" "^7.12.5"
"@matrix-org/matrix-sdk-crypto-wasm" "^7.0.0" "@matrix-org/matrix-sdk-crypto-wasm" "^8.0.0"
"@matrix-org/olm" "3.2.15" "@matrix-org/olm" "3.2.15"
another-json "^0.2.0" another-json "^0.2.0"
bs58 "^6.0.0" bs58 "^6.0.0"
@ -6434,7 +6421,7 @@ pathval@^2.0.0:
resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25" resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.0.tgz#7e2550b422601d4f6b8e26f1301bc8f15a741a25"
integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==
picocolors@^1.0.0, picocolors@^1.0.1: picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59"
integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==
@ -6734,7 +6721,7 @@ postcss-value-parser@^4.2.0:
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
postcss@^8.4.41, postcss@^8.4.43: postcss@^8.4.41:
version "8.4.45" version "8.4.45"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.45.tgz#538d13d89a16ef71edbf75d895284ae06b79e603" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.45.tgz#538d13d89a16ef71edbf75d895284ae06b79e603"
integrity sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q== integrity sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==
@ -6743,6 +6730,15 @@ postcss@^8.4.41, postcss@^8.4.43:
picocolors "^1.0.1" picocolors "^1.0.1"
source-map-js "^1.2.0" source-map-js "^1.2.0"
postcss@^8.4.43:
version "8.4.47"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.47.tgz#5bf6c9a010f3e724c503bf03ef7947dcb0fea365"
integrity sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==
dependencies:
nanoid "^3.3.7"
picocolors "^1.1.0"
source-map-js "^1.2.1"
posthog-js@^1.29.0: posthog-js@^1.29.0:
version "1.160.3" version "1.160.3"
resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.160.3.tgz#17c8af4c9ffa2d795d925ca1e7146e61cd5ccabd" resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.160.3.tgz#17c8af4c9ffa2d795d925ca1e7146e61cd5ccabd"
@ -7204,28 +7200,28 @@ rimraf@^3.0.2:
glob "^7.1.3" glob "^7.1.3"
rollup@^4.20.0: rollup@^4.20.0:
version "4.21.2" version "4.21.3"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.21.2.tgz#f41f277a448d6264e923dd1ea179f0a926aaf9b7" resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.21.3.tgz#c64ba119e6aeb913798a6f7eef2780a0df5a0821"
integrity sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw== integrity sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA==
dependencies: dependencies:
"@types/estree" "1.0.5" "@types/estree" "1.0.5"
optionalDependencies: optionalDependencies:
"@rollup/rollup-android-arm-eabi" "4.21.2" "@rollup/rollup-android-arm-eabi" "4.21.3"
"@rollup/rollup-android-arm64" "4.21.2" "@rollup/rollup-android-arm64" "4.21.3"
"@rollup/rollup-darwin-arm64" "4.21.2" "@rollup/rollup-darwin-arm64" "4.21.3"
"@rollup/rollup-darwin-x64" "4.21.2" "@rollup/rollup-darwin-x64" "4.21.3"
"@rollup/rollup-linux-arm-gnueabihf" "4.21.2" "@rollup/rollup-linux-arm-gnueabihf" "4.21.3"
"@rollup/rollup-linux-arm-musleabihf" "4.21.2" "@rollup/rollup-linux-arm-musleabihf" "4.21.3"
"@rollup/rollup-linux-arm64-gnu" "4.21.2" "@rollup/rollup-linux-arm64-gnu" "4.21.3"
"@rollup/rollup-linux-arm64-musl" "4.21.2" "@rollup/rollup-linux-arm64-musl" "4.21.3"
"@rollup/rollup-linux-powerpc64le-gnu" "4.21.2" "@rollup/rollup-linux-powerpc64le-gnu" "4.21.3"
"@rollup/rollup-linux-riscv64-gnu" "4.21.2" "@rollup/rollup-linux-riscv64-gnu" "4.21.3"
"@rollup/rollup-linux-s390x-gnu" "4.21.2" "@rollup/rollup-linux-s390x-gnu" "4.21.3"
"@rollup/rollup-linux-x64-gnu" "4.21.2" "@rollup/rollup-linux-x64-gnu" "4.21.3"
"@rollup/rollup-linux-x64-musl" "4.21.2" "@rollup/rollup-linux-x64-musl" "4.21.3"
"@rollup/rollup-win32-arm64-msvc" "4.21.2" "@rollup/rollup-win32-arm64-msvc" "4.21.3"
"@rollup/rollup-win32-ia32-msvc" "4.21.2" "@rollup/rollup-win32-ia32-msvc" "4.21.3"
"@rollup/rollup-win32-x64-msvc" "4.21.2" "@rollup/rollup-win32-x64-msvc" "4.21.3"
fsevents "~2.3.2" fsevents "~2.3.2"
rrweb-cssom@^0.6.0: rrweb-cssom@^0.6.0:
@ -7437,7 +7433,7 @@ sort-keys@^5.0.0:
dependencies: dependencies:
is-plain-obj "^4.0.0" is-plain-obj "^4.0.0"
"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.2.0: "source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.2.0, source-map-js@^1.2.1:
version "1.2.1" version "1.2.1"
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46"
integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
@ -7618,20 +7614,13 @@ string_decoder@~1.1.1:
dependencies: dependencies:
ansi-regex "^5.0.1" ansi-regex "^5.0.1"
strip-ansi@^6.0.0, strip-ansi@^6.0.1: strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1, strip-ansi@^7.0.1:
version "6.0.1" version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
dependencies: dependencies:
ansi-regex "^5.0.1" ansi-regex "^5.0.1"
strip-ansi@^7.0.1:
version "7.1.0"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45"
integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==
dependencies:
ansi-regex "^6.0.1"
strip-bom@^3.0.0: strip-bom@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
@ -7845,12 +7834,7 @@ tsconfig-paths@^3.15.0:
minimist "^1.2.6" minimist "^1.2.6"
strip-bom "^3.0.0" strip-bom "^3.0.0"
tslib@2.6.3: tslib@2.7.0, tslib@^2.0.0, tslib@^2.1.0:
version "2.6.3"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0"
integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==
tslib@^2.0.0, tslib@^2.1.0:
version "2.7.0" version "2.7.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01"
integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==
@ -8193,9 +8177,9 @@ vite-plugin-svgr@^4.0.0:
"@svgr/plugin-jsx" "^8.1.0" "@svgr/plugin-jsx" "^8.1.0"
vite@^5.0.0: vite@^5.0.0:
version "5.4.3" version "5.4.6"
resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.3.tgz#771c470e808cb6732f204e1ee96c2ed65b97a0eb" resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.6.tgz#85a93a1228a7fb5a723ca1743e337a2588ed008f"
integrity sha512-IH+nl64eq9lJjFqU+/yrRnrHPVTlgy42/+IzbOdaFDVlyLgI/wDlf+FCobXLX1cT0X5+7LMyH1mIy2xJdLfo8Q== integrity sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q==
dependencies: dependencies:
esbuild "^0.21.3" esbuild "^0.21.3"
postcss "^8.4.43" postcss "^8.4.43"