From 092940dae1d5b8e55c7a69a021a826fcd17ce2e4 Mon Sep 17 00:00:00 2001 From: Thiago Date: Mon, 11 Sep 2023 15:40:02 -0300 Subject: [PATCH] feat(test) Radix ui provider in ssr relay --- apps/web/package.json | 1 + apps/web/src/components/NoAppointment.tsx | 2 + .../src/components/providers/Providers.tsx | 17 + .../components/providers/RelayProvider.tsx | 43 ++ apps/web/src/pages/_app.tsx | 1 + apps/web/src/relay/ReactRelayContainer.tsx | 77 ++- apps/web/src/relay/RelayEnvironment.tsx | 25 + apps/web/src/relay/environment.tsx | 56 ++- apps/web/src/relay/network.ts | 84 ++-- packages/ui/src/Button.tsx | 20 +- yarn.lock | 450 +++++++++++++++++- 11 files changed, 647 insertions(+), 129 deletions(-) create mode 100644 apps/web/src/components/providers/Providers.tsx create mode 100644 apps/web/src/components/providers/RelayProvider.tsx create mode 100644 apps/web/src/relay/RelayEnvironment.tsx diff --git a/apps/web/package.json b/apps/web/package.json index a3b1a52..3d2ebed 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -15,6 +15,7 @@ "@radix-ui/react-alert-dialog": "^1.0.4", "@radix-ui/react-dialog": "^1.0.4", "@radix-ui/react-toast": "^1.1.4", + "@radix-ui/themes": "^1.1.2", "@types/jsonwebtoken": "^9.0.2", "@types/node": "20.4.1", "@types/react": "18.2.14", diff --git a/apps/web/src/components/NoAppointment.tsx b/apps/web/src/components/NoAppointment.tsx index c9f5439..d966491 100644 --- a/apps/web/src/components/NoAppointment.tsx +++ b/apps/web/src/components/NoAppointment.tsx @@ -1,3 +1,4 @@ +import { Button } from '@radix-ui/themes' import DialogButton from './DialogButton' function NoAppointment() { @@ -8,6 +9,7 @@ function NoAppointment() { Welcome! 🚀 Create your first Appointment + ) diff --git a/apps/web/src/components/providers/Providers.tsx b/apps/web/src/components/providers/Providers.tsx new file mode 100644 index 0000000..72be1af --- /dev/null +++ b/apps/web/src/components/providers/Providers.tsx @@ -0,0 +1,17 @@ +import { Theme } from '@radix-ui/themes'; +import React from 'react'; +import { RelayEnvironmentProvider, useRelayEnvironment } from 'react-relay'; + +type ProvidersProps = { children: React.ReactNode }; + +const Providers = ({ children }: ProvidersProps) => { + const environment = useRelayEnvironment(); + + return ( + + {children} + + ); +}; + +export default Providers; \ No newline at end of file diff --git a/apps/web/src/components/providers/RelayProvider.tsx b/apps/web/src/components/providers/RelayProvider.tsx new file mode 100644 index 0000000..7e61d23 --- /dev/null +++ b/apps/web/src/components/providers/RelayProvider.tsx @@ -0,0 +1,43 @@ +import { RelayEnvironmentProvider } from 'react-relay'; +import type { FetchFunction } from 'relay-runtime'; +import { Environment, Network, RecordSource, Store } from 'relay-runtime'; + +/** + * + * Define a function that fetches the results of an operation (query/mutation) + * and returns its results as a Promise. + */ +const fetchQuery: FetchFunction = async ( + operation, + variables, + // cacheConfig, + // uploadables +) => { + const response = await fetch('/', { + method: 'POST', + headers: { + 'content-type': 'application/json', + }, + body: JSON.stringify({ + query: operation.text, + variables, + }), + }); + + return await response.json(); +}; + +/** + * Create a network layer from the fetch function + */ +const network = Network.create(fetchQuery); +const store = new Store(new RecordSource()); + +const environment = new Environment({ + network, + store, +}); + +export const RelayProvider = ({ children }: { children: React.ReactNode }) => { + return {children}; +}; \ No newline at end of file diff --git a/apps/web/src/pages/_app.tsx b/apps/web/src/pages/_app.tsx index 96f2aca..0ac7a7f 100644 --- a/apps/web/src/pages/_app.tsx +++ b/apps/web/src/pages/_app.tsx @@ -1,4 +1,5 @@ import '@/styles/globals.css' +import '@radix-ui/themes/styles.css'; import type { AppProps } from 'next/app' import { Suspense } from 'react' import { ReactRelayContainer } from '../relay/ReactRelayContainer' diff --git a/apps/web/src/relay/ReactRelayContainer.tsx b/apps/web/src/relay/ReactRelayContainer.tsx index f3fbf7e..c95ea63 100644 --- a/apps/web/src/relay/ReactRelayContainer.tsx +++ b/apps/web/src/relay/ReactRelayContainer.tsx @@ -1,70 +1,63 @@ -/*eslint-disable @typescript-eslint/no-unused-vars*/ -/*eslint-disable @typescript-eslint/no-explicit-any*/ -import { NextComponentType, NextPageContext } from 'next' -import { Suspense, useMemo } from 'react' -import { useRelayEnvironment, RelayEnvironmentProvider } from 'react-relay' -import { createEnvironment } from './environment' +import type { NextComponentType, NextPage, NextPageContext } from 'next'; +import React, { Suspense, useMemo } from 'react'; +import { ReactRelayContext, useRelayEnvironment } from 'react-relay'; + +import Providers from '../components/providers/Providers'; +import { createEnvironment } from './RelayEnvironment'; + +type NextPageWithLayout = NextPage & { + getLayout?: (page: React.ReactElement) => React.ReactNode; +}; export function ReactRelayContainer({ Component, props, }: { - Component: NextComponentType - props: any + Component: NextComponentType; + props: any; }) { - const environment = useMemo(() => createEnvironment(), []) - + const environment = useMemo(() => createEnvironment(), []); return ( - + - + - - ) + + ); } -function Hyderate({ - Component, - props, -}: { - Component: NextComponentType - props: any -}) { - const environment = useRelayEnvironment() +function Hydrate({ Component, props }: { Component: NextPageWithLayout; props: any }) { + const environment = useRelayEnvironment(); + + const getLayout = Component.getLayout ?? ((page) => page); const transformedProps = useMemo(() => { if (props == null) { - return props + return props; } - const { preloadedQueries, ...otherProps } = props + // eslint-disable-next-line react/prop-types + const { preloadedQueries, ...otherProps } = props; if (preloadedQueries == null) { - return props + return props; } - const queryRefs: any = {} - for (const [queryName, { params, variables, response }] of Object.entries( - preloadedQueries, - ) as any) { - const queryId = params.id || params.text - - environment - .getNetwork() - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - seems to be a private untyped api 🤷‍♂️ - .responseCache.set(queryId, variables, response) + const queryRefs: any = {}; + for (const [queryName, { params, variables, response }] of Object.entries(preloadedQueries) as any) { + environment.getNetwork().responseCache.set(params.id, variables, response); + // TODO: create using a function exported from react-relay package queryRefs[queryName] = { environment, - fetchKey: queryId, + fetchKey: params.id, fetchPolicy: 'store-or-network', isDisposed: false, name: params.name, kind: 'PreloadedQuery', variables, - } + }; } - return { ...otherProps, queryRefs } - }, [props]) + return { ...otherProps, queryRefs }; + }, [props]); - return -} + return {getLayout()}; +} \ No newline at end of file diff --git a/apps/web/src/relay/RelayEnvironment.tsx b/apps/web/src/relay/RelayEnvironment.tsx new file mode 100644 index 0000000..d43c7b4 --- /dev/null +++ b/apps/web/src/relay/RelayEnvironment.tsx @@ -0,0 +1,25 @@ +import { Environment, RecordSource, Store } from 'relay-runtime'; + +import { createNetwork } from './network'; + +const IS_SERVER = typeof window === typeof undefined; +const CLIENT_DEBUG = true; +const SERVER_DEBUG = false; + +export function createEnvironment() { + const network = createNetwork(); + const environment = new Environment({ + network, + store: new Store(new RecordSource(), {}), + isServer: IS_SERVER, + log(event) { + if ((IS_SERVER && SERVER_DEBUG) || (!IS_SERVER && CLIENT_DEBUG)) { + console.debug('[relay environment event]', event); + } + }, + }); + + environment.getNetwork().responseCache = network.responseCache; + + return environment; +} \ No newline at end of file diff --git a/apps/web/src/relay/environment.tsx b/apps/web/src/relay/environment.tsx index 96ccaa7..2d82f87 100644 --- a/apps/web/src/relay/environment.tsx +++ b/apps/web/src/relay/environment.tsx @@ -1,29 +1,41 @@ -import { Environment, RecordSource, Store } from 'relay-runtime' +import type { FetchFunction } from 'relay-runtime'; +import { Environment, Network, RecordSource, Store } from 'relay-runtime'; -import { createNetwork } from './network' -const IS_SERVER = typeof window === typeof undefined -const CLIENT_DEBUG = false -const SERVER_DEBUG = false +/** + * + * Define a function that fetches the results of an operation (query/mutation) + * and returns its results as a Promise. + */ -function createEnvironment() { - const network = createNetwork() - const environment = new Environment({ - network, - store: new Store(new RecordSource(), {}), - isServer: IS_SERVER, - log(event) { - if ((IS_SERVER && SERVER_DEBUG) || (!IS_SERVER && CLIENT_DEBUG)) { - console.debug('[relay environment event]', event) - } +const GRAPHQL_ENPOINT = process.env.NEXT_PUBLIC_GRAPHQL_ENDPOINT as string +const fetchQuery: FetchFunction = async ( + operation, + variables, + // cacheConfig, + // uploadables +) => { + const response = await fetch(GRAPHQL_ENPOINT, { + method: 'POST', + headers: { + 'content-type': 'application/json', }, - }) + body: JSON.stringify({ + query: operation.text, + variables, + }), + }); - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore Private API Hackery? 🤷‍♂️ - environment.getNetwork().responseCache = network.responseCache + return await response.json(); +}; - return environment -} +/** + * Create a network layer from the fetch function + */ +const network = Network.create(fetchQuery); +const store = new Store(new RecordSource()); -export { createEnvironment } +export const environment = new Environment({ + network, + store, +}); \ No newline at end of file diff --git a/apps/web/src/relay/network.ts b/apps/web/src/relay/network.ts index 0719256..d28c651 100644 --- a/apps/web/src/relay/network.ts +++ b/apps/web/src/relay/network.ts @@ -1,105 +1,79 @@ -import { - CacheConfig, - ConcreteRequest, - Network, - QueryResponseCache, - RequestParameters, - Variables, -} from 'relay-runtime' +import type { CacheConfig, ConcreteRequest, RequestParameters, Variables } from 'relay-runtime'; +import { Network, QueryResponseCache } from 'relay-runtime'; -const ONE_MINUTE_IN_MS = 60 * 1000 -function createNetwork() { +const ONE_MINUTE_IN_MS = 60 * 1000; + +const GRAPHQL_ENPOINT = process.env.NEXT_PUBLIC_GRAPHQL_ENDPOINT as string + +export function createNetwork() { const responseCache = new QueryResponseCache({ size: 100, ttl: ONE_MINUTE_IN_MS, - }) + }); - async function fetchResponse( - operation: RequestParameters, - variables: Variables, - cacheConfig: CacheConfig, - ) { - const { id } = operation - - const isQuery = operation.operationKind === 'query' - const forceFetch = cacheConfig && cacheConfig.force + async function fetchResponse(operation: RequestParameters, variables: Variables, cacheConfig: CacheConfig) { + const { id } = operation; + const isQuery = operation.operationKind === 'query'; + const forceFetch = cacheConfig && cacheConfig.force; if (isQuery && !forceFetch) { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const fromCache = responseCache.get(id!, variables) + const fromCache = responseCache.get(id!, variables); if (fromCache != null) { - return Promise.resolve(fromCache) + return Promise.resolve(fromCache); } } - return networkFetch(operation, variables) + return networkFetch(operation, variables); } - const network = Network.create(fetchResponse) - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore Private API Hackery? 🤷‍♂️ - network.responseCache = responseCache - return network + const network = Network.create(fetchResponse); + network.responseCache = responseCache; + return network; } /** * Relay requires developers to configure a "fetch" function that tells Relay how to load * the results of GraphQL queries from your server (or other data source). See more at * https://relay.dev/docs/en/quick-start-guide#relay-environment. */ - -const GRAPHQL_ENPOINT = process.env.NEXT_PUBLIC_GRAPHQL_ENDPOINT as string -async function networkFetch( - params: RequestParameters, - variables: Variables, - headers?: HeadersInit, -) { +async function networkFetch(params: RequestParameters, variables: Variables) { // Fetch data from GitHub's GraphQL API: - // TODO: Add GraphQL Endpoint const response = await fetch(GRAPHQL_ENPOINT, { method: 'POST', credentials: 'include', headers: { - ...headers, 'Content-Type': 'application/json', }, body: JSON.stringify({ query: params.text, variables, }), - }) + }); // Get the response as JSON - const json = await response.json() + const json = await response.json(); // GraphQL returns exceptions (for example, a missing required variable) in the "errors" // property of the response. If any exceptions occurred when processing the request, // throw an error to indicate to the developer what went wrong. if (Array.isArray(json.errors)) { + console.log(json.errors); throw new Error( - `Error fetching GraphQL query '${ - params.name - }' with variables '${JSON.stringify(variables)}': ${JSON.stringify( + `Error fetching GraphQL query '${params.name}' with variables '${JSON.stringify(variables)}': ${JSON.stringify( json.errors, )}`, - ) + ); } // Otherwise, return the full payload. - return json + return json; } -async function getPreloadedQuery( - { params }: ConcreteRequest, - variables: Variables, - headers?: HeadersInit, -) { - const response = await networkFetch(params, variables, headers) +export async function getPreloadedQuery({ params }: ConcreteRequest, variables: Variables) { + const response = await networkFetch(params, variables); return { params, variables, response, - } -} - -export { createNetwork, getPreloadedQuery } + }; +} \ No newline at end of file diff --git a/packages/ui/src/Button.tsx b/packages/ui/src/Button.tsx index 634938c..0346b43 100755 --- a/packages/ui/src/Button.tsx +++ b/packages/ui/src/Button.tsx @@ -1,9 +1,17 @@ -import { ButtonHTMLAttributes } from "react"; +import { Button as RadixButton } from '@radix-ui/themes'; -interface Props extends ButtonHTMLAttributes { } -export const Button = ({ children, ...props }: Props) => { +const Button = (props:any) => { + const { text = '', isSubmitting, ...restProps } = props; + return ( - - ); -}; \ No newline at end of file + + {isSubmitting ? 'loading' : text} + + ) + +} + + + +export default Button diff --git a/yarn.lock b/yarn.lock index ef87da2..abdf456 100755 --- a/yarn.lock +++ b/yarn.lock @@ -1821,6 +1821,33 @@ resolved "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz" integrity sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw== +"@floating-ui/core@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.4.1.tgz#0d633f4b76052668afb932492ac452f7ebe97f17" + integrity sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ== + dependencies: + "@floating-ui/utils" "^0.1.1" + +"@floating-ui/dom@^1.5.1": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.5.1.tgz#88b70defd002fe851f17b4a25efb2d3c04d7a8d7" + integrity sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw== + dependencies: + "@floating-ui/core" "^1.4.1" + "@floating-ui/utils" "^0.1.1" + +"@floating-ui/react-dom@^2.0.0": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.0.2.tgz#fab244d64db08e6bed7be4b5fcce65315ef44d20" + integrity sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ== + dependencies: + "@floating-ui/dom" "^1.5.1" + +"@floating-ui/utils@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.1.1.tgz#1a5b1959a528e374e8037c4396c3e825d6cf4a83" + integrity sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw== + "@flydotio/dockerfile@^0.4.8": version "0.4.8" resolved "https://registry.npmjs.org/@flydotio/dockerfile/-/dockerfile-0.4.8.tgz" @@ -2315,13 +2342,33 @@ picocolors "^1.0.0" tslib "^2.6.0" -"@radix-ui/primitive@1.0.1": +"@radix-ui/colors@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@radix-ui/colors/-/colors-2.1.0.tgz#8aa6f233f68076a92c57db93d7235172e88fda44" + integrity sha512-gcBnxjS2u2c6thQz/9K1+Pt2ZYcm5WKU4SLi0emYkRmYbVUw+37rlc5wgLtYOsSsRP9nxVtbJJYj6WVO7UUmZg== + +"@radix-ui/number@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/number/-/number-1.0.1.tgz#644161a3557f46ed38a042acf4a770e826021674" + integrity sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/primitive@1.0.1", "@radix-ui/primitive@^1.0.1": version "1.0.1" resolved "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz" integrity sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw== dependencies: "@babel/runtime" "^7.13.10" +"@radix-ui/react-accessible-icon@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-accessible-icon/-/react-accessible-icon-1.0.3.tgz#53c4b5f4afbea51bbf009432c1dc01806f337254" + integrity sha512-duVGKeWPSUILr/MdlPxV+GeULTc2rS1aihGdQ3N2qCUPMgxYLxvAsHJM3mCVLF8d5eK+ympmB22mb1F3a5biNw== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-visually-hidden" "1.0.3" + "@radix-ui/react-alert-dialog@^1.0.4": version "1.0.4" resolved "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.0.4.tgz" @@ -2335,6 +2382,48 @@ "@radix-ui/react-primitive" "1.0.3" "@radix-ui/react-slot" "1.0.2" +"@radix-ui/react-arrow@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz#c24f7968996ed934d57fe6cde5d6ec7266e1d25d" + integrity sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-primitive" "1.0.3" + +"@radix-ui/react-aspect-ratio@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.0.3.tgz#d1a15d6953203e6fd7f5b569fae77c88c1880125" + integrity sha512-fXR5kbMan9oQqMuacfzlGG/SQMcmMlZ4wrvpckv8SgUulD0MMpspxJrxg/Gp/ISV3JfV1AeSWTYK9GvxA4ySwA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-primitive" "1.0.3" + +"@radix-ui/react-avatar@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-avatar/-/react-avatar-1.0.3.tgz#06a31d06bfb03be5e0d156a5af26a437dce96e7f" + integrity sha512-9ToF7YNex3Ste45LrAeTlKtONI9yVRt/zOS158iilIkW5K/Apeyb/TUQlcEFTEFvWr8Kzdi2ZYrm1/suiXPajQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-callback-ref" "1.0.1" + "@radix-ui/react-use-layout-effect" "1.0.1" + +"@radix-ui/react-checkbox@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@radix-ui/react-checkbox/-/react-checkbox-1.0.4.tgz#98f22c38d5010dd6df4c5744cac74087e3275f4b" + integrity sha512-CBuGQa52aAYnADZVt/KBQzXrwx6TqnlwtcIPGtVt5JkkzQwMOLJjPukimhfKEr4GQNd43C+djUh5Ikopj8pSLg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-presence" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-controllable-state" "1.0.1" + "@radix-ui/react-use-previous" "1.0.1" + "@radix-ui/react-use-size" "1.0.1" + "@radix-ui/react-collection@1.0.3": version "1.0.3" resolved "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.3.tgz" @@ -2353,6 +2442,19 @@ dependencies: "@babel/runtime" "^7.13.10" +"@radix-ui/react-context-menu@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@radix-ui/react-context-menu/-/react-context-menu-2.1.4.tgz#250420d259d3cebe026b7658414c516a1204de3f" + integrity sha512-HVHLUtZOBiR2Fh5l07qQ9y0IgX4dGZF0S9Gwdk4CVA+DL9afSphvFNa4nRiw6RNgb6quwLV4dLPF/gFDvNaOcQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-menu" "2.0.5" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-callback-ref" "1.0.1" + "@radix-ui/react-use-controllable-state" "1.0.1" + "@radix-ui/react-context@1.0.1": version "1.0.1" resolved "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.1.tgz" @@ -2381,6 +2483,13 @@ aria-hidden "^1.1.1" react-remove-scroll "2.5.5" +"@radix-ui/react-direction@1.0.1", "@radix-ui/react-direction@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-direction/-/react-direction-1.0.1.tgz#9cb61bf2ccf568f3421422d182637b7f47596c9b" + integrity sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-dismissable-layer@1.0.4": version "1.0.4" resolved "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.4.tgz" @@ -2393,6 +2502,20 @@ "@radix-ui/react-use-callback-ref" "1.0.1" "@radix-ui/react-use-escape-keydown" "1.0.3" +"@radix-ui/react-dropdown-menu@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.0.5.tgz#19bf4de8ffa348b4eb6a86842f14eff93d741170" + integrity sha512-xdOrZzOTocqqkCkYo8yRPCib5OkTkqN7lqNCdxwPOdE466DOaNl4N8PkUIlsXthQvW5Wwkd+aEmWpfWlBoDPEw== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-menu" "2.0.5" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-controllable-state" "1.0.1" + "@radix-ui/react-focus-guards@1.0.1": version "1.0.1" resolved "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz" @@ -2410,6 +2533,35 @@ "@radix-ui/react-primitive" "1.0.3" "@radix-ui/react-use-callback-ref" "1.0.1" +"@radix-ui/react-form@^0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-form/-/react-form-0.0.3.tgz#328e7163e723ccc748459d66a2d685d7b4f85d5a" + integrity sha512-kgE+Z/haV6fxE5WqIXj05KkaXa3OkZASoTDy25yX2EIp/x0c54rOH/vFr5nOZTg7n7T1z8bSyXmiVIFP9bbhPQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-label" "2.0.2" + "@radix-ui/react-primitive" "1.0.3" + +"@radix-ui/react-hover-card@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@radix-ui/react-hover-card/-/react-hover-card-1.0.6.tgz#ea4b5c02e9f145b278cbcacaf5200f80d44cba22" + integrity sha512-2K3ToJuMk9wjwBOa+jdg2oPma+AmLdcEyTNsG/iC4BDVG3E0/mGCjbY8PEDSLxJcUi+nJi2QII+ec/4kWd88DA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-dismissable-layer" "1.0.4" + "@radix-ui/react-popper" "1.1.2" + "@radix-ui/react-portal" "1.0.3" + "@radix-ui/react-presence" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-controllable-state" "1.0.1" + "@radix-ui/react-id@1.0.1": version "1.0.1" resolved "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.1.tgz" @@ -2418,7 +2570,79 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-use-layout-effect" "1.0.1" -"@radix-ui/react-portal@1.0.3": +"@radix-ui/react-label@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-label/-/react-label-2.0.2.tgz#9c72f1d334aac996fdc27b48a8bdddd82108fb6d" + integrity sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-primitive" "1.0.3" + +"@radix-ui/react-menu@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@radix-ui/react-menu/-/react-menu-2.0.5.tgz#a7d78b0808c4d38269240bf5d5c7ffea3e225e16" + integrity sha512-Gw4f9pwdH+w5w+49k0gLjN0PfRDHvxmAgG16AbyJZ7zhwZ6PBHKtWohvnSwfusfnK3L68dpBREHpVkj8wEM7ZA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-collection" "1.0.3" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-direction" "1.0.1" + "@radix-ui/react-dismissable-layer" "1.0.4" + "@radix-ui/react-focus-guards" "1.0.1" + "@radix-ui/react-focus-scope" "1.0.3" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-popper" "1.1.2" + "@radix-ui/react-portal" "1.0.3" + "@radix-ui/react-presence" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-roving-focus" "1.0.4" + "@radix-ui/react-slot" "1.0.2" + "@radix-ui/react-use-callback-ref" "1.0.1" + aria-hidden "^1.1.1" + react-remove-scroll "2.5.5" + +"@radix-ui/react-popover@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@radix-ui/react-popover/-/react-popover-1.0.6.tgz#19bb81e7450482c625b8cd05bf4dcd1d2cd91a8b" + integrity sha512-cZ4defGpkZ0qTRtlIBzJLSzL6ht7ofhhW4i1+pkemjV1IKXm0wgCRnee154qlV6r9Ttunmh2TNZhMfV2bavUyA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-dismissable-layer" "1.0.4" + "@radix-ui/react-focus-guards" "1.0.1" + "@radix-ui/react-focus-scope" "1.0.3" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-popper" "1.1.2" + "@radix-ui/react-portal" "1.0.3" + "@radix-ui/react-presence" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-slot" "1.0.2" + "@radix-ui/react-use-controllable-state" "1.0.1" + aria-hidden "^1.1.1" + react-remove-scroll "2.5.5" + +"@radix-ui/react-popper@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-popper/-/react-popper-1.1.2.tgz#4c0b96fcd188dc1f334e02dba2d538973ad842e9" + integrity sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg== + dependencies: + "@babel/runtime" "^7.13.10" + "@floating-ui/react-dom" "^2.0.0" + "@radix-ui/react-arrow" "1.0.3" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-callback-ref" "1.0.1" + "@radix-ui/react-use-layout-effect" "1.0.1" + "@radix-ui/react-use-rect" "1.0.1" + "@radix-ui/react-use-size" "1.0.1" + "@radix-ui/rect" "1.0.1" + +"@radix-ui/react-portal@1.0.3", "@radix-ui/react-portal@^1.0.3": version "1.0.3" resolved "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.3.tgz" integrity sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA== @@ -2443,7 +2667,110 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-slot" "1.0.2" -"@radix-ui/react-slot@1.0.2": +"@radix-ui/react-radio-group@^1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-radio-group/-/react-radio-group-1.1.3.tgz#3197f5dcce143bcbf961471bf89320735c0212d3" + integrity sha512-x+yELayyefNeKeTx4fjK6j99Fs6c4qKm3aY38G3swQVTN6xMpsrbigC0uHs2L//g8q4qR7qOcww8430jJmi2ag== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-direction" "1.0.1" + "@radix-ui/react-presence" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-roving-focus" "1.0.4" + "@radix-ui/react-use-controllable-state" "1.0.1" + "@radix-ui/react-use-previous" "1.0.1" + "@radix-ui/react-use-size" "1.0.1" + +"@radix-ui/react-roving-focus@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.4.tgz#e90c4a6a5f6ac09d3b8c1f5b5e81aab2f0db1974" + integrity sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-collection" "1.0.3" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-direction" "1.0.1" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-callback-ref" "1.0.1" + "@radix-ui/react-use-controllable-state" "1.0.1" + +"@radix-ui/react-scroll-area@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@radix-ui/react-scroll-area/-/react-scroll-area-1.0.4.tgz#13c36c453b2880aba57df67fb91a1d3f9b18998d" + integrity sha512-OIClwBkwPG+FKvC4OMTRaa/3cfD069nkKFFL/TQzRzaO42Ce5ivKU9VMKgT7UU6UIkjcQqKBrDOIzWtPGw6e6w== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/number" "1.0.1" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-direction" "1.0.1" + "@radix-ui/react-presence" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-callback-ref" "1.0.1" + "@radix-ui/react-use-layout-effect" "1.0.1" + +"@radix-ui/react-select@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-select/-/react-select-1.2.2.tgz#caa981fa0d672cf3c1b2a5240135524e69b32181" + integrity sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/number" "1.0.1" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-collection" "1.0.3" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-direction" "1.0.1" + "@radix-ui/react-dismissable-layer" "1.0.4" + "@radix-ui/react-focus-guards" "1.0.1" + "@radix-ui/react-focus-scope" "1.0.3" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-popper" "1.1.2" + "@radix-ui/react-portal" "1.0.3" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-slot" "1.0.2" + "@radix-ui/react-use-callback-ref" "1.0.1" + "@radix-ui/react-use-controllable-state" "1.0.1" + "@radix-ui/react-use-layout-effect" "1.0.1" + "@radix-ui/react-use-previous" "1.0.1" + "@radix-ui/react-visually-hidden" "1.0.3" + aria-hidden "^1.1.1" + react-remove-scroll "2.5.5" + +"@radix-ui/react-separator@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-separator/-/react-separator-1.0.3.tgz#be5a931a543d5726336b112f465f58585c04c8aa" + integrity sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-primitive" "1.0.3" + +"@radix-ui/react-slider@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-slider/-/react-slider-1.1.2.tgz#330ff2a0e1f6c19aace76590004f229a7e8fbe6c" + integrity sha512-NKs15MJylfzVsCagVSWKhGGLNR1W9qWs+HtgbmjjVUB3B9+lb3PYoXxVju3kOrpf0VKyVCtZp+iTwVoqpa1Chw== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/number" "1.0.1" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-collection" "1.0.3" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-direction" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-controllable-state" "1.0.1" + "@radix-ui/react-use-layout-effect" "1.0.1" + "@radix-ui/react-use-previous" "1.0.1" + "@radix-ui/react-use-size" "1.0.1" + +"@radix-ui/react-slot@1.0.2", "@radix-ui/react-slot@^1.0.2": version "1.0.2" resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz" integrity sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg== @@ -2451,6 +2778,35 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-compose-refs" "1.0.1" +"@radix-ui/react-switch@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-switch/-/react-switch-1.0.3.tgz#6119f16656a9eafb4424c600fdb36efa5ec5837e" + integrity sha512-mxm87F88HyHztsI7N+ZUmEoARGkC22YVW5CaC+Byc+HRpuvCrOBPTAnXgf+tZ/7i0Sg/eOePGdMhUKhPaQEqow== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-controllable-state" "1.0.1" + "@radix-ui/react-use-previous" "1.0.1" + "@radix-ui/react-use-size" "1.0.1" + +"@radix-ui/react-tabs@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@radix-ui/react-tabs/-/react-tabs-1.0.4.tgz#993608eec55a5d1deddd446fa9978d2bc1053da2" + integrity sha512-egZfYY/+wRNCflXNHx+dePvnz9FbmssDTJBtgRfDY7e8SE5oIo3Py2eCB1ckAbh1Q7cQ/6yJZThJ++sgbxibog== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-direction" "1.0.1" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-presence" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-roving-focus" "1.0.4" + "@radix-ui/react-use-controllable-state" "1.0.1" + "@radix-ui/react-toast@^1.1.4": version "1.1.4" resolved "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.1.4.tgz" @@ -2470,6 +2826,25 @@ "@radix-ui/react-use-layout-effect" "1.0.1" "@radix-ui/react-visually-hidden" "1.0.3" +"@radix-ui/react-tooltip@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@radix-ui/react-tooltip/-/react-tooltip-1.0.6.tgz#87a7786cd9f2b4de957ac645afae1575339c58b0" + integrity sha512-DmNFOiwEc2UDigsYj6clJENma58OelxD24O4IODoZ+3sQc3Zb+L8w1EP+y9laTuKCLAysPw4fD6/v0j4KNV8rg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-dismissable-layer" "1.0.4" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-popper" "1.1.2" + "@radix-ui/react-portal" "1.0.3" + "@radix-ui/react-presence" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-slot" "1.0.2" + "@radix-ui/react-use-controllable-state" "1.0.1" + "@radix-ui/react-visually-hidden" "1.0.3" + "@radix-ui/react-use-callback-ref@1.0.1": version "1.0.1" resolved "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz" @@ -2500,7 +2875,30 @@ dependencies: "@babel/runtime" "^7.13.10" -"@radix-ui/react-visually-hidden@1.0.3": +"@radix-ui/react-use-previous@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-previous/-/react-use-previous-1.0.1.tgz#b595c087b07317a4f143696c6a01de43b0d0ec66" + integrity sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-use-rect@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-rect/-/react-use-rect-1.0.1.tgz#fde50b3bb9fd08f4a1cd204572e5943c244fcec2" + integrity sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/rect" "1.0.1" + +"@radix-ui/react-use-size@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-size/-/react-use-size-1.0.1.tgz#1c5f5fea940a7d7ade77694bb98116fb49f870b2" + integrity sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-layout-effect" "1.0.1" + +"@radix-ui/react-visually-hidden@1.0.3", "@radix-ui/react-visually-hidden@^1.0.3": version "1.0.3" resolved "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.3.tgz" integrity sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA== @@ -2508,6 +2906,45 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-primitive" "1.0.3" +"@radix-ui/rect@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/rect/-/rect-1.0.1.tgz#bf8e7d947671996da2e30f4904ece343bc4a883f" + integrity sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/themes@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/themes/-/themes-1.1.2.tgz#e53022f8f298a87612cda17e4a32b927b23c8d98" + integrity sha512-VnNeanSxHQurSgwQe5Z3zNZP5SrwhRY+RW97FPZe7TOJGpa+rpDHLDR9vourSsEGxsgrtTXHJaoII1pyIXDi8A== + dependencies: + "@radix-ui/colors" "^2.1.0" + "@radix-ui/primitive" "^1.0.1" + "@radix-ui/react-accessible-icon" "^1.0.3" + "@radix-ui/react-alert-dialog" "^1.0.4" + "@radix-ui/react-aspect-ratio" "^1.0.3" + "@radix-ui/react-avatar" "^1.0.3" + "@radix-ui/react-checkbox" "^1.0.4" + "@radix-ui/react-context-menu" "^2.1.4" + "@radix-ui/react-dialog" "^1.0.4" + "@radix-ui/react-direction" "^1.0.1" + "@radix-ui/react-dropdown-menu" "^2.0.5" + "@radix-ui/react-form" "^0.0.3" + "@radix-ui/react-hover-card" "^1.0.6" + "@radix-ui/react-popover" "^1.0.6" + "@radix-ui/react-portal" "^1.0.3" + "@radix-ui/react-radio-group" "^1.1.3" + "@radix-ui/react-scroll-area" "^1.0.4" + "@radix-ui/react-select" "^1.2.2" + "@radix-ui/react-separator" "^1.0.3" + "@radix-ui/react-slider" "^1.1.2" + "@radix-ui/react-slot" "^1.0.2" + "@radix-ui/react-switch" "^1.0.3" + "@radix-ui/react-tabs" "^1.0.4" + "@radix-ui/react-tooltip" "^1.0.6" + "@radix-ui/react-visually-hidden" "^1.0.3" + classnames "^2.3.2" + "@rushstack/eslint-patch@^1.1.3": version "1.3.2" resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.2.tgz" @@ -4005,6 +4442,11 @@ class-variance-authority@^0.6.1: dependencies: clsx "1.2.1" +classnames@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" + integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== + client-only@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz"