From 8425a177e21f5c3902f08d45a3df31ed93b48784 Mon Sep 17 00:00:00 2001 From: Robert Long Date: Fri, 3 Dec 2021 11:45:29 -0800 Subject: [PATCH] Add invite modal --- package.json | 9 +- src/App.jsx | 60 +++++---- src/App.module.css | 5 + src/CopyButton.jsx | 37 ++++++ src/CopyButton.module.css | 35 +++++ src/InviteModal.jsx | 14 ++ src/Modal.jsx | 62 +++++++++ src/Modal.module.css | 49 +++++++ src/Overlay.jsx | 59 +++++++++ src/Room.jsx | 15 ++- src/RoomButton.jsx | 10 ++ src/icons/Close.svg | 3 + src/icons/Copy.svg | 3 + yarn.lock | 265 +++++++++++++++++++++++++++++++++++++- 14 files changed, 589 insertions(+), 37 deletions(-) create mode 100644 src/App.module.css create mode 100644 src/CopyButton.jsx create mode 100644 src/CopyButton.module.css create mode 100644 src/InviteModal.jsx create mode 100644 src/Modal.jsx create mode 100644 src/Modal.module.css create mode 100644 src/Overlay.jsx create mode 100644 src/icons/Close.svg create mode 100644 src/icons/Copy.svg diff --git a/package.json b/package.json index 2e504e64..40603207 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,12 @@ "serve": "vite preview" }, "dependencies": { + "@react-aria/button": "^3.3.4", + "@react-aria/dialog": "^3.1.4", + "@react-aria/focus": "^3.5.0", + "@react-aria/overlays": "^3.7.3", + "@react-aria/utils": "^3.10.0", + "@react-stately/overlays": "^3.1.3", "@sentry/react": "^6.13.3", "@sentry/tracing": "^6.13.3", "classnames": "^2.3.1", @@ -19,7 +25,8 @@ "react-dom": "^17.0.0", "react-json-view": "^1.21.3", "react-router": "6", - "react-router-dom": "^5.2.0" + "react-router-dom": "^5.2.0", + "react-use-clipboard": "^1.0.7" }, "devDependencies": { "sass": "^1.42.1", diff --git a/src/App.jsx b/src/App.jsx index 52150b85..83787ddc 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -22,6 +22,8 @@ import { Redirect, useLocation, } from "react-router-dom"; +import styles from "./App.module.css"; +import { OverlayProvider } from "@react-aria/overlays"; import * as Sentry from "@sentry/react"; import { useClient } from "./ConferenceCallManagerHooks"; import { Home } from "./Home"; @@ -48,34 +50,36 @@ export default function App() { } = useClient(homeserverUrl); return ( - - <> - {loading ? ( -
-

Loading...

-
- ) : ( - - - - - - - - - - - - {authenticated ? ( - - ) : ( - - )} - - - )} - -
+ + + <> + {loading ? ( +
+

Loading...

+
+ ) : ( + + + + + + + + + + + + {authenticated ? ( + + ) : ( + + )} + + + )} + +
+
); } diff --git a/src/App.module.css b/src/App.module.css new file mode 100644 index 00000000..59e0c7c4 --- /dev/null +++ b/src/App.module.css @@ -0,0 +1,5 @@ +.overlayProvider { + display: flex; + flex-direction: column; + height: 100%; +} diff --git a/src/CopyButton.jsx b/src/CopyButton.jsx new file mode 100644 index 00000000..0a37e594 --- /dev/null +++ b/src/CopyButton.jsx @@ -0,0 +1,37 @@ +import React from "react"; +import { useButton } from "@react-aria/button"; +import useClipboard from "react-use-clipboard"; +import { ReactComponent as CheckIcon } from "./icons/Check.svg"; +import { ReactComponent as CopyIcon } from "./icons/Copy.svg"; +import classNames from "classnames"; +import styles from "./CopyButton.module.css"; + +export function CopyButton({ value, className, ...rest }) { + const [isCopied, setCopied] = useClipboard(value, { successDuration: 3000 }); + const { buttonProps } = useButton({ + onPress: () => setCopied(), + }); + + return ( + + ); +} diff --git a/src/CopyButton.module.css b/src/CopyButton.module.css new file mode 100644 index 00000000..ac1cd59b --- /dev/null +++ b/src/CopyButton.module.css @@ -0,0 +1,35 @@ +.copyButton { + position: relative; + display: flex; + justify-content: center; + align-items: center; + background-color: transparent; + padding: 0; + cursor: pointer; + border: 2px solid #0dbd8b; + border-radius: 8px; + color: #0dbd8b; + width: 100%; + transition: border-color 250ms, background-color 250ms; + height: 40px; +} + +.copyButton span { + font-weight: 600; + font-size: 15px; + margin-right: 10px; +} + +.copyButton:not(.copied) svg * { + fill: #0dbd8b; +} + +.copyButton.copied { + border-color: transparent; + background-color: #0dbd8b; + color: white; +} + +.copyButton.copied svg * { + stroke: white; +} diff --git a/src/InviteModal.jsx b/src/InviteModal.jsx new file mode 100644 index 00000000..18c35ac9 --- /dev/null +++ b/src/InviteModal.jsx @@ -0,0 +1,14 @@ +import React from "react"; +import { Modal, ModalContent } from "./Modal"; +import { CopyButton } from "./CopyButton"; + +export function InviteModal({ roomUrl, ...rest }) { + return ( + + +

Copy and share this meeting link

+ +
+
+ ); +} diff --git a/src/Modal.jsx b/src/Modal.jsx new file mode 100644 index 00000000..cd89c6a1 --- /dev/null +++ b/src/Modal.jsx @@ -0,0 +1,62 @@ +import React, { useRef } from "react"; +import { + useOverlay, + usePreventScroll, + useModal, + OverlayContainer, +} from "@react-aria/overlays"; +import { useDialog } from "@react-aria/dialog"; +import { FocusScope } from "@react-aria/focus"; +import { useButton } from "@react-aria/button"; +import { ReactComponent as CloseIcon } from "./icons/Close.svg"; +import styles from "./Modal.module.css"; +import classNames from "classnames"; + +export function Modal(props) { + const { title, children } = props; + const modalRef = useRef(); + const { overlayProps, underlayProps } = useOverlay(props, modalRef); + usePreventScroll(); + const { modalProps } = useModal(); + const { dialogProps, titleProps } = useDialog(props, modalRef); + const closeButtonRef = useRef(); + const { buttonProps: closeButtonProps } = useButton({ + onPress: () => props.close(), + }); + + return ( + +
+ +
+
+

{title}

+ +
+ {children} +
+
+
+
+ ); +} + +export function ModalContent({ children, className, ...rest }) { + return ( +
+ {children} +
+ ); +} diff --git a/src/Modal.module.css b/src/Modal.module.css new file mode 100644 index 00000000..8284ccc0 --- /dev/null +++ b/src/Modal.module.css @@ -0,0 +1,49 @@ +.modalOverlay { + position: fixed; + z-index: 100; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: rgba(23, 25, 28, 0.5); + display: flex; + align-items: center; + justify-content: center; +} + +.modal { + background: #21262c; + box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.15); + border-radius: 8px; + min-width: 420px; +} + +.modalHeader { + display: flex; + justify-content: space-between; + padding: 34px 34px 0 34px; +} + +.modalHeader h3 { + font-size: 24px; + margin: 0; +} + +.closeButton { + position: relative; + display: flex; + justify-content: center; + align-items: center; + background-color: transparent; + padding: 0; + border: none; + cursor: pointer; +} + +.content { + padding: 24px 32px; +} + +.content p { + margin-top: 0; +} diff --git a/src/Overlay.jsx b/src/Overlay.jsx new file mode 100644 index 00000000..d25bc3e6 --- /dev/null +++ b/src/Overlay.jsx @@ -0,0 +1,59 @@ +import React, { useRef } from "react"; +import { useOverlayTriggerState } from "@react-stately/overlays"; +import { useButton } from "@react-aria/button"; + +export function useToggleOverlayButton(overlayState, ref) { + return useButton( + { + onPress: () => overlayState.toggle(), + }, + ref + ); +} + +export function useOpenOverlayButton(overlayState, ref) { + return useButton( + { + onPress: () => overlayState.open(), + }, + ref + ); +} + +export function useCloseOverlayButton(overlayState, ref) { + return useButton( + { + onPress: () => overlayState.close(), + }, + ref + ); +} + +export function Overlay({ children }) { + const overlayState = useOverlayTriggerState({}); + const buttonRef = useRef(); + const { buttonProps } = useToggleOverlayButton(overlayState, buttonRef); + + if ( + !Array.isArray(children) || + children.length > 2 || + typeof children[1] !== "function" + ) { + throw new Error( + "Overlay trigger must have two props. The first being a button and the second being a render prop." + ); + } + + const [overlayTrigger, overlay] = children; + + return ( + <> + + {overlayState.isOpen && overlay({ ...overlayState })} + + ); +} diff --git a/src/Room.jsx b/src/Room.jsx index 860a4c5b..bac2a965 100644 --- a/src/Room.jsx +++ b/src/Room.jsx @@ -24,7 +24,7 @@ import { LayoutToggleButton, ScreenshareButton, DropdownButton, - SettingsButton, + InviteButton, } from "./RoomButton"; import { Header, @@ -48,6 +48,8 @@ import { fetchGroupCall } from "./ConferenceCallManagerHooks"; import { ErrorModal } from "./ErrorModal"; import { GroupCallInspector } from "./GroupCallInspector"; import * as Sentry from "@sentry/react"; +import { Overlay } from "./Overlay"; +import { InviteModal } from "./InviteModal"; const canScreenshare = "getDisplayMedia" in navigator.mediaDevices; // There is currently a bug in Safari our our code with cloning and sending MediaStreams @@ -505,11 +507,12 @@ function InRoomView({ - setShowInspector((prev) => !prev)} - /> + + + {(props) => ( + + )} + + Add User + + + ); +} + export function LayoutToggleButton({ layout, setLayout, ...rest }) { return ( + + diff --git a/src/icons/Copy.svg b/src/icons/Copy.svg new file mode 100644 index 00000000..5f977f03 --- /dev/null +++ b/src/icons/Copy.svg @@ -0,0 +1,3 @@ + + + diff --git a/yarn.lock b/yarn.lock index 4f30bdda..844b10fb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -176,7 +176,7 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.7.6": +"@babel/runtime@^7.6.2", "@babel/runtime@^7.7.6": version "7.16.3" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.3.tgz#b86f0db02a04187a3c17caa77de69840165d42d5" integrity sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ== @@ -220,6 +220,166 @@ resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== +"@formatjs/ecma402-abstract@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.11.0.tgz#7e91e6cc7cfebdc07171e00a3288719705e0108c" + integrity sha512-TOp5La9wmSh9G5bqFGN/ApmOXtJDzBGkYW+OTRd3ukY7J32RVGZPpN4O9BD651JUy66nj3g9CIENTNCgm4IRXQ== + dependencies: + "@formatjs/intl-localematcher" "0.2.21" + tslib "^2.1.0" + +"@formatjs/fast-memoize@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-1.2.0.tgz#1123bfcc5d21d761f15d8b1c32d10e1b6530355d" + integrity sha512-fObitP9Tlc31SKrPHgkPgQpGo4+4yXfQQITTCNH8AZdEqB7Mq4nPrjpUL/tNGN3lEeJcFxDbi0haX8HM7QvQ8w== + dependencies: + tslib "^2.1.0" + +"@formatjs/icu-messageformat-parser@2.0.15": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.0.15.tgz#9e3ccadc582dbf076481bb95f98a689cfb10e7d5" + integrity sha512-nnRbkK+nz4ZL1l1lUbztL8qrEUGQKF/NU38itLnzLm8QLEacFS5qGOxxp/0DSIehhX99tNroNtudtjdOvzruAQ== + dependencies: + "@formatjs/ecma402-abstract" "1.11.0" + "@formatjs/icu-skeleton-parser" "1.3.2" + tslib "^2.1.0" + +"@formatjs/icu-skeleton-parser@1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.2.tgz#a8ab9c668ea7f044ceba2043ac1d872d71307e22" + integrity sha512-ChKmnVCE/LbJzedRgA/EeL5+tfjx/6ZWunqNiEC5BtqHnnwmLN/oPuCPb8b3NhuGiwTqp+LkaS70tga5kXRHxg== + dependencies: + "@formatjs/ecma402-abstract" "1.11.0" + tslib "^2.1.0" + +"@formatjs/intl-localematcher@0.2.21": + version "0.2.21" + resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.2.21.tgz#39ef33d701fe8084f3d693cd3ff7cbe03cdd3a49" + integrity sha512-JTJeLiNwexN4Gy0cMxoUPvJbKhXdnSuo5jPrDafEZpnDWlJ5VDYta8zUVVozO/pwzEmFVHEUpgiEDj+39L4oMg== + dependencies: + tslib "^2.1.0" + +"@internationalized/date@3.0.0-alpha.1": + version "3.0.0-alpha.1" + resolved "https://registry.yarnpkg.com/@internationalized/date/-/date-3.0.0-alpha.1.tgz#987a86a98b837f275bce084ef502421bc5cdb5f7" + integrity sha512-fxciU4AQ/4XBYfse/mT9h1nsyNkmQkxwQtTmQVu6b4Tp2u95Y3m5BNgWgV2m3vLiiKZ82NtHJXAIGoqiK53w4g== + dependencies: + "@babel/runtime" "^7.6.2" + +"@internationalized/message@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@internationalized/message/-/message-3.0.2.tgz#c3db2b6b7f75af815819f77da11f8424381416e3" + integrity sha512-ZZ8FQDCsri3vUB2mfDD76Vbf97DH361AiZUXKHV4BqwCtYyaNYiZqIr8KXrcMCxJvrIYVQLSn8+jeIQRO3bvtw== + dependencies: + "@babel/runtime" "^7.6.2" + intl-messageformat "^9.6.12" + +"@internationalized/number@^3.0.2": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@internationalized/number/-/number-3.0.3.tgz#d29003dffdff54ca6f2287ec0cb77ff3d045478f" + integrity sha512-ewFoVvsxSyd9QZnknvOWPjirYqdMQhXTeDhJg3hM6C/FeZt0banpGH1nZ0SGMZXHz8NK9uAa2KVIq+jqAIOg4w== + dependencies: + "@babel/runtime" "^7.6.2" + +"@react-aria/button@^3.3.4": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@react-aria/button/-/button-3.3.4.tgz#3af6eb4e0a479a76ba7386d541051d1273cd68fa" + integrity sha512-vebTcf9YpwaKCvsca2VWhn6eYPa15OJtMENwaGop72UrL35Oa7xDgU0RG22RAjRjt8HRVlAfLpHkJQW6GBGU3g== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-aria/focus" "^3.5.0" + "@react-aria/interactions" "^3.6.0" + "@react-aria/utils" "^3.9.0" + "@react-stately/toggle" "^3.2.3" + "@react-types/button" "^3.4.1" + +"@react-aria/dialog@^3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@react-aria/dialog/-/dialog-3.1.4.tgz#7fe3f33e09b75dcdf598d0523e982262d6c89220" + integrity sha512-OtQGBol3CfcbBpjqXDqXzH5Ygny44PIuyAsZ1e3dfIdtaI+XHsoglyZnvDaVVealIgedHkMubreZnyNYnlzPLg== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-aria/focus" "^3.4.1" + "@react-aria/utils" "^3.8.2" + "@react-stately/overlays" "^3.1.3" + "@react-types/dialog" "^3.3.1" + +"@react-aria/focus@^3.4.1", "@react-aria/focus@^3.5.0": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@react-aria/focus/-/focus-3.5.0.tgz#02b85f97d6114af1eccc0902ce40723b626cb7f9" + integrity sha512-Eib75Q6QgQdn8VVVByg5Vipaaj/C//8Bs++sQY7nkomRx4sdArOnXbDppul3YHP6mRfU9VRLvAigEUlReQF/Xw== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-aria/interactions" "^3.6.0" + "@react-aria/utils" "^3.9.0" + "@react-types/shared" "^3.9.0" + clsx "^1.1.1" + +"@react-aria/i18n@^3.3.3": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@react-aria/i18n/-/i18n-3.3.4.tgz#172b8bcff0273410e67af31f7d84e49dd3ada463" + integrity sha512-1DV3I82UfL2dT8WBI/88TwtokO80B7ISSyuz6rO/6n7q76A/nC2AtVINbrGYrcKsCcxCEoEMxW5RVJ39fcLijA== + dependencies: + "@babel/runtime" "^7.6.2" + "@internationalized/date" "3.0.0-alpha.1" + "@internationalized/message" "^3.0.2" + "@internationalized/number" "^3.0.2" + "@react-aria/ssr" "^3.0.3" + "@react-aria/utils" "^3.10.0" + "@react-types/shared" "^3.10.0" + +"@react-aria/interactions@^3.5.1", "@react-aria/interactions@^3.6.0", "@react-aria/interactions@^3.7.0": + version "3.7.0" + resolved "https://registry.yarnpkg.com/@react-aria/interactions/-/interactions-3.7.0.tgz#eb19c1068b557a6b6df1e1c4abef07de719e9f25" + integrity sha512-Xomchjb9bqvh3ocil+QCEYFSxsTy8PHEz43mNP6z2yuu3UqTpl2FsWfyKgF/Yy0WKVkyV2dO2uz758KJTCLZhw== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-aria/utils" "^3.10.0" + "@react-types/shared" "^3.10.0" + +"@react-aria/overlays@^3.7.3": + version "3.7.3" + resolved "https://registry.yarnpkg.com/@react-aria/overlays/-/overlays-3.7.3.tgz#b107b1d31c04c538355e566b1034d23e5696c18a" + integrity sha512-N5F/TVJ9KIYgGuOknVMrRnqqzkNKcFos4nxLHQz4TeFZTp4/P+NqEHd/VBmjsSTNEjEuNAivG+U2o4F1NWn/Pw== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-aria/i18n" "^3.3.3" + "@react-aria/interactions" "^3.7.0" + "@react-aria/utils" "^3.10.0" + "@react-aria/visually-hidden" "^3.2.3" + "@react-stately/overlays" "^3.1.3" + "@react-types/button" "^3.4.1" + "@react-types/overlays" "^3.5.1" + dom-helpers "^3.3.1" + +"@react-aria/ssr@^3.0.3", "@react-aria/ssr@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.1.0.tgz#b7163e6224725c30121932a8d1422ef91d1fab22" + integrity sha512-RxqQKmE8sO7TGdrcSlHTcVzMP450hqowtBSd2bBS9oPlcokVkaGq28c3Rwa8ty5ctw4EBCjXqjP7xdcKMGDzug== + dependencies: + "@babel/runtime" "^7.6.2" + +"@react-aria/utils@^3.10.0", "@react-aria/utils@^3.8.2", "@react-aria/utils@^3.9.0": + version "3.10.0" + resolved "https://registry.yarnpkg.com/@react-aria/utils/-/utils-3.10.0.tgz#2f6f0b0ccede17241fca1cbd76978e1bf8f5a2b0" + integrity sha512-he/1pV8gsTVwmYqbKI6DPtRUkWjzz/4icgemVVNjWNsiKEJSBj8Cr4I+0i3vIgXEPLnn1t+/LUsJMGFbKnqc9w== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-aria/ssr" "^3.1.0" + "@react-stately/utils" "^3.3.0" + "@react-types/shared" "^3.10.0" + clsx "^1.1.1" + +"@react-aria/visually-hidden@^3.2.3": + version "3.2.3" + resolved "https://registry.yarnpkg.com/@react-aria/visually-hidden/-/visually-hidden-3.2.3.tgz#4779df0a468873550afb42a7f5fcb2411d82db8d" + integrity sha512-iAe5EFI7obEOwTnIdAwWrKq+CrIJFGTw85v8fXnQ7CIVGRDblX85GOUww9bzQNPDLLRYWS4VF702ii8kV4+JCw== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-aria/interactions" "^3.5.1" + "@react-aria/utils" "^3.8.2" + clsx "^1.1.1" + "@react-spring/animated@~9.2.0": version "9.2.4" resolved "https://registry.npmjs.org/@react-spring/animated/-/animated-9.2.4.tgz" @@ -265,6 +425,66 @@ "@react-spring/shared" "~9.2.0" "@react-spring/types" "~9.2.0" +"@react-stately/overlays@^3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@react-stately/overlays/-/overlays-3.1.3.tgz#b0bb4061c1b20e712dfc32c933ae4bb23e5ccc0e" + integrity sha512-X8H/h9F8ZjevwJ7P8ak7v500qQd5x4Y76LsXUXrR6LtcO8FXfp2I+W8sGmBtLZwLQpTJiF1U0WMQqXLE1g6eLA== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-stately/utils" "^3.2.2" + "@react-types/overlays" "^3.5.1" + +"@react-stately/toggle@^3.2.3": + version "3.2.3" + resolved "https://registry.yarnpkg.com/@react-stately/toggle/-/toggle-3.2.3.tgz#a4de6edc16982990492c6c557e5194f46dacc809" + integrity sha512-p5eVjXwNo4y4CeybxfjYmbTzNMNiI67uspbRAJnawWBVWw8X+yIvRfpjYAsqmvsJ+DsvwybSTlQDT6taGoWEsA== + dependencies: + "@babel/runtime" "^7.6.2" + "@react-stately/utils" "^3.2.2" + "@react-types/checkbox" "^3.2.3" + "@react-types/shared" "^3.8.0" + +"@react-stately/utils@^3.2.2", "@react-stately/utils@^3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@react-stately/utils/-/utils-3.3.0.tgz#99866c5788539268a06035acd5925b25bb4cedde" + integrity sha512-f//Y8q0+FFcS04xvCNvbba7WWRLHzj2AegLgdgwTxsnk9Gb+AyuasdRrRY7bGQhdHuEJ7OIiQZ9EQWndDbrTcg== + dependencies: + "@babel/runtime" "^7.6.2" + +"@react-types/button@^3.4.1": + version "3.4.1" + resolved "https://registry.yarnpkg.com/@react-types/button/-/button-3.4.1.tgz#715ac9d4997c79233be4d9020b58f85936b8252b" + integrity sha512-B54M84LxdEppwjXNlkBEJyMfe9fd+bvFV7R6+NJvupGrZm/LuFNYjFcHk7yjMKWTdWm6DbpIuQz54n5qTW7Vlg== + dependencies: + "@react-types/shared" "^3.8.0" + +"@react-types/checkbox@^3.2.3": + version "3.2.3" + resolved "https://registry.yarnpkg.com/@react-types/checkbox/-/checkbox-3.2.3.tgz#2b9d529c55c9884519c7f626f0fe8be7d0f18be1" + integrity sha512-YqeAFyrpaxI/eW6zQ7tVkKIASgzpywRrc6C/rV6Mw0zzGGSSvmYvdOBx9yHOEvpts7dLgaGlmLK6CeG7s4yGKg== + dependencies: + "@react-types/shared" "^3.8.0" + +"@react-types/dialog@^3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@react-types/dialog/-/dialog-3.3.1.tgz#eb07e3d703643f7967243d56951d58a2cf77096f" + integrity sha512-1i6fVtixUNlftSNbVPFRieyEy3N/GNqcqpeOsJUB1jby28ppbM+JCp3Icb0ijaNC9Nl8c/oI8srtOWIQIKUJiQ== + dependencies: + "@react-types/overlays" "^3.5.1" + "@react-types/shared" "^3.8.0" + +"@react-types/overlays@^3.5.1": + version "3.5.1" + resolved "https://registry.yarnpkg.com/@react-types/overlays/-/overlays-3.5.1.tgz#35350dfca639d04a8fbd973de59b141450df1b46" + integrity sha512-T3o6wQ5NNm1rSniIa01bIa6fALC8jbwpYxFMaQRrdEpIvwktt0Fi5Xo6/97+oe4HvzzU0JMhtwWDTdRySvgeZw== + dependencies: + "@react-types/shared" "^3.8.0" + +"@react-types/shared@^3.10.0", "@react-types/shared@^3.8.0", "@react-types/shared@^3.9.0": + version "3.10.0" + resolved "https://registry.yarnpkg.com/@react-types/shared/-/shared-3.10.0.tgz#bdafed2ebcd31149c178312252dda0babde316d0" + integrity sha512-B1gTRpE5qkSpfGxw8BHeOwvBPP3gnfKnzPHV0FJQHtgJ46oJS64WyloDAp1D9cLVsFHaI6s/HviXL51kVce2ww== + "@sentry/browser@6.13.3": version "6.13.3" resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.13.3.tgz#d4511791b1e484ad48785eba3bce291fdf115c1e" @@ -841,6 +1061,11 @@ cliui@^5.0.0: strip-ansi "^5.2.0" wrap-ansi "^5.1.0" +clsx@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" + integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" @@ -892,6 +1117,13 @@ convert-source-map@^1.7.0: dependencies: safe-buffer "~5.1.1" +copy-to-clipboard@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz#115aa1a9998ffab6196f93076ad6da3b913662ae" + integrity sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw== + dependencies: + toggle-selection "^1.0.6" + core-js@^1.0.0: version "1.2.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" @@ -1060,6 +1292,13 @@ dijkstrajs@^1.0.1: resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.2.tgz#2e48c0d3b825462afe75ab4ad5e829c8ece36257" integrity sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg== +dom-helpers@^3.3.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8" + integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA== + dependencies: + "@babel/runtime" "^7.1.2" + dom-helpers@^5.0.1: version "5.2.1" resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" @@ -1628,6 +1867,16 @@ indexof@0.0.1: resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= +intl-messageformat@^9.6.12: + version "9.10.0" + resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-9.10.0.tgz#f9864f6e15dde343851398082993911e57a6446e" + integrity sha512-OTOLlGPfwbrFyYD2iQuDbqEs8xccyLy+f1P3ZGJB2/EZo7Z9fVaaIWcM+JGvuWIFVRDnw4Um6z4t0mSSitUxGQ== + dependencies: + "@formatjs/ecma402-abstract" "1.11.0" + "@formatjs/fast-memoize" "1.2.0" + "@formatjs/icu-messageformat-parser" "2.0.15" + tslib "^2.1.0" + ip-regex@^4.0.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" @@ -2706,6 +2955,13 @@ react-transition-group@^4.4.1: loose-envify "^1.4.0" prop-types "^15.6.2" +react-use-clipboard@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/react-use-clipboard/-/react-use-clipboard-1.0.7.tgz#34cccdfb4f17f5e6522e38f2cee62d05f605597a" + integrity sha512-blIprqARyITp0uVw/2Rh87mcujqXdH6vZ5NrcuXEhI5EmjBGxcGnwt/79+vdN7rwM6OliGj481lOj6ZCcsiYEQ== + dependencies: + copy-to-clipboard "^3.3.1" + react-use-gesture@^9.1.3: version "9.1.3" resolved "https://registry.npmjs.org/react-use-gesture/-/react-use-gesture-9.1.3.tgz" @@ -2983,6 +3239,11 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +toggle-selection@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" + integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI= + tough-cookie@~2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" @@ -3001,7 +3262,7 @@ tslib@^1.9.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.3, tslib@^2.2.0: +tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0: version "2.3.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==