diff --git a/.gitignore b/.gitignore
index b991ff9..55caa5b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -68,6 +68,3 @@ cache/
*.log
*.debug
-# Generated Components
-components/
-!packages/components/**/*
diff --git a/components/.gitignore b/components/.gitignore
new file mode 100644
index 0000000..91dfed8
--- /dev/null
+++ b/components/.gitignore
@@ -0,0 +1,2 @@
+.DS_Store
+node_modules
\ No newline at end of file
diff --git a/components/.npmignore b/components/.npmignore
new file mode 100644
index 0000000..eb5b7ff
--- /dev/null
+++ b/components/.npmignore
@@ -0,0 +1,2 @@
+src/
+test/
\ No newline at end of file
diff --git a/packages/components/jest.config.ts b/components/jest.config.ts
similarity index 78%
rename from packages/components/jest.config.ts
rename to components/jest.config.ts
index 49729d6..02c0206 100644
--- a/packages/components/jest.config.ts
+++ b/components/jest.config.ts
@@ -1,7 +1,7 @@
-import type { Config } from '@jest/types';
-import { pathsToModuleNameMapper } from 'ts-jest/utils';
+import type { Config } from '@jest/types'
+import { pathsToModuleNameMapper } from 'ts-jest/utils'
-import { compilerOptions } from './tsconfig.json';
+import { compilerOptions } from './tsconfig.json'
const config: Config.InitialOptions = {
collectCoverageFrom: [
@@ -30,6 +30,6 @@ const config: Config.InitialOptions = {
'jest-watch-typeahead/filename',
'jest-watch-typeahead/testname',
],
-};
+}
-export default config;
+export default config
diff --git a/packages/components/package.json b/components/package.json
similarity index 60%
rename from packages/components/package.json
rename to components/package.json
index bb519a8..3800f3e 100644
--- a/packages/components/package.json
+++ b/components/package.json
@@ -1,7 +1,7 @@
{
"name": "@disco3/components",
- "version": "0.0.1",
- "description": "web3 design system for disco3",
+ "version": "0.0.8",
+ "description": "Design system for Disco3",
"main": "./dist/index.cjs.js",
"module": "./dist/index.es.js",
"types": "./dist/types/index.d.ts",
@@ -23,51 +23,27 @@
"files": [
"dist/**"
],
+ "repository": "manifoldfinance/disco3-react",
"license": "MIT",
- "repository": {
- "type": "git",
- "url": "git+https://github.com/manifoldfinance/disco3-react.git",
- "directory": "packages/components"
- },
- "keywords": [
- "react",
- "typescript",
- "bundle",
- "ethereum",
- "web3",
- "vanilla",
- "react",
- "components"
- ],
- "bugs": {
- "url": "https://github.com/manifoldfinance/disco3-react/issues"
- },
"scripts": {
- "build": "NODE_ENV=production npx vite build",
+ "build": "vite build",
"clean": "rimraf dist src/components/icons/generated/",
- "lint:types": "npx tsc --noEmit",
- "prepack": "yarn build",
+ "lint:types": "tsc --noEmit",
+ "build-pack": "yarn gen:icons && yarn build",
"publish": "yarn npm publish",
- "test": "npx jest -u"
+ "test": "jest"
},
"dependencies": {
"@vanilla-extract/css": "^1.6.8",
"@vanilla-extract/css-utils": "^0.1.2",
"@vanilla-extract/dynamic": "^2.0.2",
- "@vanilla-extract/recipes": "^0.2.3",
- "@vanilla-extract/sprinkles": "^1.3.3",
+ "@vanilla-extract/recipes": "^0.2.4",
+ "@vanilla-extract/sprinkles": "^1.4.0",
"clsx": "^1.1.1",
"focus-visible": "^5.2.0"
},
"devDependencies": {
- "@babel/core": "7.4.5",
- "@babel/plugin-proposal-class-properties": "7.4.4",
- "@babel/preset-env": "7.4.5",
- "@babel/preset-react": "7.0.0",
- "@babel/preset-typescript": "7.3.3",
- "@babel/register": "7.4.4",
"@jest/types": "^27.2.5",
- "@svgr/babel-plugin-remove-jsx-attribute": "^6.0.0",
"@svgr/core": "^6.2.1",
"@svgr/plugin-jsx": "^6.2.1",
"@svgr/plugin-prettier": "^6.1.2",
@@ -77,16 +53,16 @@
"@testing-library/react": "^12.1.2",
"@testing-library/react-hooks": "^7.0.2",
"@testing-library/user-event": "^13.5.0",
- "@types/testing-library__jest-dom": "^5.14.1",
"@types/glob": "^7.2.0",
"@types/node": "^16.11.6",
"@types/react": "^17.0.33",
"@types/react-dom": "^17.0.10",
"@types/rimraf": "^3.0.2",
- "@vanilla-extract/babel-plugin": "^1.1.4",
- "@vanilla-extract/private": "^1.0.3",
- "@vanilla-extract/vite-plugin": "^3.1.2",
+ "@types/testing-library__jest-dom": "^5.14.1",
+ "@vanilla-extract/private": "^1.0.1",
+ "@vanilla-extract/vite-plugin": "^3.0.0",
"change-case": "^4.1.2",
+ "dedent": "^0.7.0",
"deepmerge": "^4.2.2",
"glob": "^7.2.0",
"jest": "^27.3.1",
@@ -96,9 +72,10 @@
"rimraf": "^3.0.2",
"ts-jest": "^27.0.7",
"ts-node": "^10.4.0",
- "vite": "^2.6.13",
+ "typescript": "4.6.3",
+ "vite": "^2.9.1",
"vite-plugin-dts": "^0.9.2",
- "vite-tsconfig-paths": "^3.3.17"
+ "vite-tsconfig-paths": "^3.4.1"
},
"peerDependencies": {
"react": "^17",
diff --git a/packages/components/src/components/Avatar/Avatar.docs.mdx b/components/src/components/Avatar/Avatar.docs.mdx
similarity index 65%
rename from packages/components/src/components/Avatar/Avatar.docs.mdx
rename to components/src/components/Avatar/Avatar.docs.mdx
index 57d0f11..445ebfb 100644
--- a/packages/components/src/components/Avatar/Avatar.docs.mdx
+++ b/components/src/components/Avatar/Avatar.docs.mdx
@@ -4,7 +4,7 @@ description: Representation of entity
---
```tsx
-import { Avatar } from '@disco3/components';
+import { Avatar } from 'degen'
```
```tsx live=true expand=true
@@ -53,9 +53,7 @@ import { Avatar } from '@disco3/components';
## Border
-By default, there is a light border around the edge to define image edges on
-similarly colored backgrounds. This can be disabled by using the `noBorder`
-prop.
+By default, there is a light border around the edge to define image edges on similarly colored backgrounds. This can be disabled by using the `noBorder` prop.
```tsx live=true
@@ -63,8 +61,8 @@ prop.
size="24"
src={
mode === 'light'
- ? 'https://d.pr/i/2532ep.jpeg'
- : 'https://d.pr/i/QQNPxB.jpegg'
+ ? 'https://images.mirror-media.xyz/publication-images/152cd86f-45ad-4f48-8971-4dd33fde5bc1.png'
+ : 'https://images.mirror-media.xyz/publication-images/5eaba6b2-b9ee-4bea-aeac-75796d53798f.jpg'
}
/>
@@ -81,9 +79,7 @@ prop.
## next/image
-If you are using Next.js and configured
-[`next/image`](https://nextjs.org/docs/api-reference/next/image) appropriately,
-you can pass it in with the `as` prop.
+If you are using Next.js and configured [`next/image`](https://nextjs.org/docs/api-reference/next/image) appropriately, you can pass it in with the `as` prop.
```tsx live=true expand=true
diff --git a/components/src/components/Avatar/Avatar.snippets.tsx b/components/src/components/Avatar/Avatar.snippets.tsx
new file mode 100644
index 0000000..61c85c0
--- /dev/null
+++ b/components/src/components/Avatar/Avatar.snippets.tsx
@@ -0,0 +1,16 @@
+import * as React from 'react'
+
+import { Snippet } from '!/playroom/src/types'
+import { Avatar } from './Avatar'
+
+export const snippets: Snippet[] = [
+ {
+ name: 'Basic',
+ code: (
+
+ ),
+ },
+]
diff --git a/components/src/components/Avatar/Avatar.test.tsx b/components/src/components/Avatar/Avatar.test.tsx
new file mode 100644
index 0000000..3847506
--- /dev/null
+++ b/components/src/components/Avatar/Avatar.test.tsx
@@ -0,0 +1,19 @@
+import * as React from 'react'
+
+import { cleanup, render, screen } from '@/test'
+
+import { Avatar } from './Avatar'
+
+describe('', () => {
+ afterEach(cleanup)
+
+ it('renders', () => {
+ render(
+ ,
+ )
+ expect(screen.getByRole(/img/i)).toBeInTheDocument()
+ })
+})
diff --git a/packages/components/src/components/Avatar/Avatar.tsx b/components/src/components/Avatar/Avatar.tsx
similarity index 76%
rename from packages/components/src/components/Avatar/Avatar.tsx
rename to components/src/components/Avatar/Avatar.tsx
index 8093f73..6200d88 100644
--- a/packages/components/src/components/Avatar/Avatar.tsx
+++ b/components/src/components/Avatar/Avatar.tsx
@@ -1,18 +1,17 @@
-import * as React from 'react';
-import * as styles from './styles.css';
+import * as React from 'react'
-import { Box, BoxProps } from '../Box';
-
-import { UserSolid } from '../disco-icons';
+import { Box, BoxProps } from '../Box'
+import { IconUserSolid } from '../icons'
+import * as styles from './styles.css'
export type Props = {
- as?: 'img' | React.ComponentType;
- label: string;
- placeholder?: boolean;
- noBorder?: boolean;
- size?: BoxProps['height'];
- src?: string;
-} & styles.Variants;
+ as?: 'img' | React.ComponentType
+ label: string
+ placeholder?: boolean
+ noBorder?: boolean
+ size?: BoxProps['height']
+ src?: string
+} & styles.Variants
export const Avatar = ({
as = 'img',
@@ -62,5 +61,5 @@ export const Avatar = ({
>
)}
- );
-};
+ )
+}
diff --git a/components/src/components/Avatar/index.ts b/components/src/components/Avatar/index.ts
new file mode 100644
index 0000000..d59bf3b
--- /dev/null
+++ b/components/src/components/Avatar/index.ts
@@ -0,0 +1,2 @@
+export { Avatar } from './Avatar'
+export type { Props } from './Avatar'
diff --git a/packages/components/src/components/Avatar/styles.css.ts b/components/src/components/Avatar/styles.css.ts
similarity index 84%
rename from packages/components/src/components/Avatar/styles.css.ts
rename to components/src/components/Avatar/styles.css.ts
index 3f7cb7d..1f5d094 100644
--- a/packages/components/src/components/Avatar/styles.css.ts
+++ b/components/src/components/Avatar/styles.css.ts
@@ -1,7 +1,7 @@
-import { style } from '@vanilla-extract/css';
-import { RecipeVariants, recipe } from '@vanilla-extract/recipes';
+import { style } from '@vanilla-extract/css'
+import { RecipeVariants, recipe } from '@vanilla-extract/recipes'
-import { atoms, vars } from '../../css';
+import { atoms, vars } from '../../css'
export const variants = recipe({
variants: {
@@ -42,6 +42,6 @@ export const variants = recipe({
defaultVariants: {
noBorder: false,
},
-});
+})
-export type Variants = RecipeVariants;
+export type Variants = RecipeVariants
diff --git a/components/src/components/AvatarGroup/AvatarGroup.docs.mdx b/components/src/components/AvatarGroup/AvatarGroup.docs.mdx
new file mode 100644
index 0000000..e978316
--- /dev/null
+++ b/components/src/components/AvatarGroup/AvatarGroup.docs.mdx
@@ -0,0 +1,71 @@
+---
+title: AvatarGroup
+description: Group of entity representations
+---
+
+```tsx
+import { AvatarGroup } from 'degen'
+```
+
+```tsx live=true expand=true
+
+```
+
+## Props
+
+See [`Avatar`'s props](/components/Avatar#props) for more info.
+
+
+
+## Sizes
+
+```tsx live=true
+
+
+
+
+
+```
+
+## Limit
+
+```tsx live=true expand=true
+
+```
diff --git a/components/src/components/AvatarGroup/AvatarGroup.snippets.tsx b/components/src/components/AvatarGroup/AvatarGroup.snippets.tsx
new file mode 100644
index 0000000..4dcdd02
--- /dev/null
+++ b/components/src/components/AvatarGroup/AvatarGroup.snippets.tsx
@@ -0,0 +1,28 @@
+import * as React from 'react'
+
+import { Snippet } from '!/playroom/src/types'
+import { AvatarGroup } from './AvatarGroup'
+
+export const snippets: Snippet[] = [
+ {
+ name: 'Basic',
+ code: (
+
+ ),
+ },
+]
diff --git a/components/src/components/AvatarGroup/AvatarGroup.test.tsx b/components/src/components/AvatarGroup/AvatarGroup.test.tsx
new file mode 100644
index 0000000..f62b8ae
--- /dev/null
+++ b/components/src/components/AvatarGroup/AvatarGroup.test.tsx
@@ -0,0 +1,31 @@
+import * as React from 'react'
+
+import { cleanup, render, screen } from '@/test'
+
+import { AvatarGroup } from './AvatarGroup'
+
+describe('', () => {
+ afterEach(cleanup)
+
+ it('renders', () => {
+ render(
+ ,
+ )
+ expect(screen.getAllByRole(/img/i).length).toBe(3)
+ })
+})
diff --git a/packages/components/src/components/AvatarGroup/AvatarGroup.tsx b/components/src/components/AvatarGroup/AvatarGroup.tsx
similarity index 51%
rename from packages/components/src/components/AvatarGroup/AvatarGroup.tsx
rename to components/src/components/AvatarGroup/AvatarGroup.tsx
index ece556d..bca73e7 100644
--- a/packages/components/src/components/AvatarGroup/AvatarGroup.tsx
+++ b/components/src/components/AvatarGroup/AvatarGroup.tsx
@@ -1,19 +1,20 @@
-import * as React from 'react';
+import * as React from 'react'
-import { Avatar, Props as AvatarProps } from '../Avatar';
-import { Box, BoxProps } from '../Box';
-import * as styles from './styles.css';
+import { Avatar, Props as AvatarProps } from '../Avatar'
+import { Box, BoxProps } from '../Box'
+import { useTheme } from '../ThemeProvider'
+import * as styles from './styles.css'
type Props = {
- as?: 'img' | React.ComponentType;
- limit?: number;
+ as?: 'img' | React.ComponentType
+ limit?: number
members: {
- label: AvatarProps['label'];
- placeholder?: AvatarProps['placeholder'];
- src?: AvatarProps['src'];
- }[];
- size?: BoxProps['height'];
-};
+ label: AvatarProps['label']
+ placeholder?: AvatarProps['placeholder']
+ src?: AvatarProps['src']
+ }[]
+ size?: BoxProps['height']
+}
export const AvatarGroup = ({
as,
@@ -21,8 +22,10 @@ export const AvatarGroup = ({
members = [],
size = '6',
}: Props) => {
- const membersCount = members.length;
- const visibleMembers = members.slice(0, limit);
+ const { mode, forcedMode } = useTheme()
+ const membersCount = members.length
+ const visibleMembers = members.slice(0, limit)
+ const variantSize = size < 5 ? 'small' : 'large'
return (
@@ -32,7 +35,7 @@ export const AvatarGroup = ({
borderRadius="full"
className={styles.wrapper}
key={x.label}
- marginLeft={i === 0 ? '0' : '-1.5'}
+ marginLeft={i === 0 ? '0' : variantSize === 'small' ? '-1' : '-1.5'}
>
{membersCount > limit && (
+{(membersCount - limit).toLocaleString()}
)}
- );
-};
+ )
+}
diff --git a/components/src/components/AvatarGroup/index.ts b/components/src/components/AvatarGroup/index.ts
new file mode 100644
index 0000000..d52d2c9
--- /dev/null
+++ b/components/src/components/AvatarGroup/index.ts
@@ -0,0 +1 @@
+export { AvatarGroup } from './AvatarGroup'
diff --git a/components/src/components/AvatarGroup/styles.css.ts b/components/src/components/AvatarGroup/styles.css.ts
new file mode 100644
index 0000000..4b8107d
--- /dev/null
+++ b/components/src/components/AvatarGroup/styles.css.ts
@@ -0,0 +1,61 @@
+import { style } from '@vanilla-extract/css'
+import { recipe } from '@vanilla-extract/recipes'
+
+import { atoms, vars } from '../../css'
+
+export const wrapper = style({
+ boxShadow: `0 0 0 2px ${vars.colors.background}`,
+ transform: `translateX(0px)`,
+})
+
+export const overflowText = recipe({
+ variants: {
+ size: {
+ small: [
+ atoms({
+ alignSelf: 'stretch',
+ position: 'relative',
+ display: 'flex',
+ alignItems: 'center',
+ borderRadius: 'full',
+ }),
+ wrapper,
+ {
+ fontSize: 8,
+ letterSpacing: '-0.009em',
+ paddingLeft: '0.33rem',
+ paddingRight: '0.33rem',
+ marginLeft: '-0.1875rem',
+ },
+ ],
+ large: atoms({
+ fontSize: 'base',
+ marginLeft: '1.5',
+ }),
+ },
+ theme: {
+ light: {},
+ dark: {},
+ },
+ },
+ compoundVariants: [
+ {
+ variants: {
+ size: 'small',
+ theme: 'light',
+ },
+ style: {
+ backgroundColor: '#ECECEC',
+ },
+ },
+ {
+ variants: {
+ size: 'small',
+ theme: 'dark',
+ },
+ style: {
+ backgroundColor: '#262626',
+ },
+ },
+ ],
+})
diff --git a/packages/components/src/components/Box/Box.docs.mdx b/components/src/components/Box/Box.docs.mdx
similarity index 80%
rename from packages/components/src/components/Box/Box.docs.mdx
rename to components/src/components/Box/Box.docs.mdx
index 2577e71..37e0a26 100644
--- a/packages/components/src/components/Box/Box.docs.mdx
+++ b/components/src/components/Box/Box.docs.mdx
@@ -4,7 +4,7 @@ description: Primitive for consuming design tokens
---
```tsx
-import { Box } from '@disco3/components';
+import { Box } from 'degen'
```
```tsx expand=true live=true
@@ -13,7 +13,6 @@ import { Box } from '@disco3/components';
## Props
-`React.AllHTMLAttributes` properties are supported, but not listed below for
-brevity.
+`React.AllHTMLAttributes` properties are supported, but not listed below for brevity.
diff --git a/components/src/components/Box/Box.snippets.tsx b/components/src/components/Box/Box.snippets.tsx
new file mode 100644
index 0000000..5b0928f
--- /dev/null
+++ b/components/src/components/Box/Box.snippets.tsx
@@ -0,0 +1,12 @@
+import * as React from 'react'
+
+import { Snippet } from '!/playroom/src/types'
+
+import { Box } from './Box'
+
+export const snippets: Snippet[] = [
+ {
+ name: 'Basic',
+ code: _,
+ },
+]
diff --git a/components/src/components/Box/Box.test.tsx b/components/src/components/Box/Box.test.tsx
new file mode 100644
index 0000000..9bfa9b9
--- /dev/null
+++ b/components/src/components/Box/Box.test.tsx
@@ -0,0 +1,14 @@
+import * as React from 'react'
+
+import { cleanup, render, screen } from '@/test'
+
+import { Box } from './Box'
+
+describe('', () => {
+ afterEach(cleanup)
+
+ it('renders', () => {
+ render(foo bar baz)
+ expect(screen.getByText(/foo/i)).toBeInTheDocument()
+ })
+})
diff --git a/packages/components/src/components/Box/Box.tsx b/components/src/components/Box/Box.tsx
similarity index 56%
rename from packages/components/src/components/Box/Box.tsx
rename to components/src/components/Box/Box.tsx
index d926d57..b58d254 100644
--- a/packages/components/src/components/Box/Box.tsx
+++ b/components/src/components/Box/Box.tsx
@@ -1,45 +1,45 @@
-import * as React from 'react';
-import clsx, { ClassValue } from 'clsx';
+import * as React from 'react'
+import clsx, { ClassValue } from 'clsx'
-import { Atoms, atoms, sprinkles } from '../../css';
+import { Atoms, atoms, sprinkles } from '../../css'
type HTMLProperties = Omit<
React.AllHTMLAttributes,
'as' | 'className' | 'color' | 'height' | 'width'
->;
+>
type Props = Atoms &
HTMLProperties & {
- as?: React.ElementType;
- className?: ClassValue;
- };
+ as?: React.ElementType
+ className?: ClassValue
+ }
export const Box = React.forwardRef(
({ as = 'div', className, ...props }: Props, ref) => {
- const atomProps: Record = {};
- const nativeProps: Record = {};
+ const atomProps: Record = {}
+ const nativeProps: Record = {}
for (const key in props) {
if (sprinkles.properties.has(key as keyof Omit)) {
- atomProps[key] = props[key as keyof typeof props];
+ atomProps[key] = props[key as keyof typeof props]
} else {
- nativeProps[key] = props[key as keyof typeof props];
+ nativeProps[key] = props[key as keyof typeof props]
}
}
const atomicClasses = atoms({
reset: typeof as === 'string' ? (as as Atoms['reset']) : 'div',
...atomProps,
- });
+ })
return React.createElement(as, {
className: clsx(atomicClasses, className),
...nativeProps,
ref,
- });
+ })
},
-);
+)
-export type BoxProps = Parameters[0];
+export type BoxProps = Parameters[0]
-Box.displayName = 'Box';
+Box.displayName = 'Box'
diff --git a/components/src/components/Box/index.ts b/components/src/components/Box/index.ts
new file mode 100644
index 0000000..6067699
--- /dev/null
+++ b/components/src/components/Box/index.ts
@@ -0,0 +1,2 @@
+export { Box } from './Box'
+export type { BoxProps } from './Box'
diff --git a/packages/components/src/components/Button/Button.docs.mdx b/components/src/components/Button/Button.docs.mdx
similarity index 92%
rename from packages/components/src/components/Button/Button.docs.mdx
rename to components/src/components/Button/Button.docs.mdx
index e04f4c7..ec92c4b 100644
--- a/packages/components/src/components/Button/Button.docs.mdx
+++ b/components/src/components/Button/Button.docs.mdx
@@ -4,7 +4,7 @@ description: Trigger for actions
---
```tsx
-import { Button } from '@disco3/components';
+import { Button } from 'degen'
```
```tsx expand=true live=true
@@ -36,8 +36,8 @@ import { Button } from '@disco3/components';
disabled={getState('loading')}
loading={getState('loading')}
onClick={() => {
- toggleState('loading');
- setTimeout(() => toggleState('loading'), 1000);
+ toggleState('loading')
+ setTimeout(() => toggleState('loading'), 1000)
}}
>
Click Me
@@ -49,6 +49,7 @@ import { Button } from '@disco3/components';
```tsx live=true
+
@@ -56,8 +57,7 @@ import { Button } from '@disco3/components';
## Tones
-When `variant` is set to `primary` or `secondary`, you can `tone` to change the
-button accent color.
+When `variant` is set to `primary` or `secondary`, you can `tone` to change the button accent color.
```tsx live=true
@@ -172,13 +172,8 @@ Optional `center` prop reserves space for affixes and loading spinner.
```tsx live=true
-
)}
>
- );
+ )
}
return (
@@ -119,8 +119,8 @@ export const Button = React.forwardRef(
>
{childContent}
- );
+ )
},
-);
+)
-Button.displayName = 'Button';
+Button.displayName = 'Button'
diff --git a/components/src/components/Button/index.ts b/components/src/components/Button/index.ts
new file mode 100644
index 0000000..eaad758
--- /dev/null
+++ b/components/src/components/Button/index.ts
@@ -0,0 +1,2 @@
+export { Button } from './Button'
+export type { Props } from './Button'
diff --git a/packages/components/src/components/Button/styles.css.ts b/components/src/components/Button/styles.css.ts
similarity index 85%
rename from packages/components/src/components/Button/styles.css.ts
rename to components/src/components/Button/styles.css.ts
index 7582144..eddfa1d 100644
--- a/packages/components/src/components/Button/styles.css.ts
+++ b/components/src/components/Button/styles.css.ts
@@ -1,17 +1,17 @@
-import { createVar, style } from '@vanilla-extract/css';
-import { CSSVarFunction } from '@vanilla-extract/private';
-import { RecipeVariants, recipe } from '@vanilla-extract/recipes';
+import { createVar, style } from '@vanilla-extract/css'
+import { CSSVarFunction } from '@vanilla-extract/private'
+import { RecipeVariants, recipe } from '@vanilla-extract/recipes'
-import { atoms, rgb, vars } from '../../css';
+import { atoms, rgb, vars } from '../../css'
const shape = {
circle: atoms({
borderRadius: 'full',
}),
square: {},
-};
+}
-export type Shape = keyof typeof shape;
+export type Shape = keyof typeof shape
const size = {
small: atoms({
@@ -19,16 +19,25 @@ const size = {
fontSize: 'small',
height: '10',
paddingX: '4',
+ gap: '2',
}),
medium: atoms({
+ borderRadius: 'large',
+ fontSize: 'small',
+ height: '12',
+ paddingX: '4',
+ gap: '3',
+ }),
+ large: atoms({
borderRadius: '2xLarge',
fontSize: 'base',
height: '14',
paddingX: '5',
+ gap: '4',
}),
-};
+}
-export type Size = keyof typeof size;
+export type Size = keyof typeof size
const getAccentVars = (colorVar: CSSVarFunction) => ({
[vars.colors.accent]: rgb(colorVar),
@@ -41,7 +50,7 @@ const getAccentVars = (colorVar: CSSVarFunction) => ({
colorVar,
vars.mode.shades.accentSecondaryHover,
),
-});
+})
const tone = {
accent: {},
@@ -60,11 +69,11 @@ const tone = {
pink: style({
vars: getAccentVars(vars.mode.colors.pink),
}),
-};
+}
-export type Tone = keyof typeof tone;
+export type Tone = keyof typeof tone
-const boxShadowColorVar = createVar();
+const boxShadowColorVar = createVar()
const variant = {
primary: style([
@@ -158,9 +167,9 @@ const variant = {
},
}),
]),
-};
+}
-export type Variant = keyof typeof variant;
+export type Variant = keyof typeof variant
const getShapeSizeCompoundVariant = (shape: Shape, size: Size) => ({
variants: {
@@ -171,17 +180,17 @@ const getShapeSizeCompoundVariant = (shape: Shape, size: Size) => ({
atoms({
borderRadius:
shape === 'square'
- ? size === 'small'
+ ? size === 'small' || size === 'medium'
? 'large'
: '2xLarge'
: undefined,
- minWidth: size === 'small' ? '10' : '14',
+ minWidth: size === 'small' || size === 'medium' ? '10' : '14',
}),
style({
padding: 0,
}),
]),
-});
+})
export const variants = recipe({
base: style([
@@ -189,7 +198,6 @@ export const variants = recipe({
alignItems: 'center',
cursor: 'pointer',
display: 'flex',
- gap: '4',
transitionDuration: '150',
transitionProperty: 'default',
transitionTimingFunction: 'inOut',
@@ -231,15 +239,17 @@ export const variants = recipe({
},
compoundVariants: [
// Shape + Size
+ getShapeSizeCompoundVariant('circle', 'large'),
getShapeSizeCompoundVariant('circle', 'medium'),
getShapeSizeCompoundVariant('circle', 'small'),
+ getShapeSizeCompoundVariant('square', 'large'),
getShapeSizeCompoundVariant('square', 'medium'),
getShapeSizeCompoundVariant('square', 'small'),
// Center + Size
{
variants: {
center: true,
- size: 'medium',
+ size: 'large',
},
style: atoms({
paddingX: '14',
@@ -248,13 +258,13 @@ export const variants = recipe({
{
variants: {
center: true,
- size: 'medium',
+ size: 'large',
},
style: atoms({
paddingX: '15',
}),
},
],
-});
+})
-export type Variants = RecipeVariants;
+export type Variants = RecipeVariants
diff --git a/packages/components/src/components/Button/utils.test.ts b/components/src/components/Button/utils.test.ts
similarity index 64%
rename from packages/components/src/components/Button/utils.test.ts
rename to components/src/components/Button/utils.test.ts
index 134f535..622ba91 100644
--- a/packages/components/src/components/Button/utils.test.ts
+++ b/components/src/components/Button/utils.test.ts
@@ -1,16 +1,17 @@
-import { getCenterProps } from './utils';
+import { getCenterProps } from './utils'
describe.each`
center | size | side | expected
- ${true} | ${'large'} | ${'left'} | ${{ position: 'absolute', left: 5 }}
- ${true} | ${'large'} | ${'right'} | ${{ position: 'absolute', right: 5 }}
- ${true} | ${'medium'} | ${'right'} | ${{ position: 'absolute', right: 4 }}
- ${undefined} | ${'large'} | ${'left'} | ${{}}
+ ${true} | ${'small'} | ${'left'} | ${{ position: 'absolute', left: 5 }}
+ ${true} | ${'small'} | ${'right'} | ${{ position: 'absolute', right: 5 }}
+ ${true} | ${'medium'} | ${'right'} | ${{ position: 'absolute', right: 5 }}
+ ${true} | ${'large'} | ${'right'} | ${{ position: 'absolute', right: 4 }}
+ ${undefined} | ${'small'} | ${'left'} | ${{}}
`(
'getCenterProps($center, $size, $side)',
({ center, size, side, expected }) => {
it(`returns ${JSON.stringify(expected)}`, () => {
- expect(getCenterProps(center, size, side)).toEqual(expected);
- });
+ expect(getCenterProps(center, size, side)).toEqual(expected)
+ })
},
-);
+)
diff --git a/packages/components/src/components/Button/utils.ts b/components/src/components/Button/utils.ts
similarity index 54%
rename from packages/components/src/components/Button/utils.ts
rename to components/src/components/Button/utils.ts
index 20f43b3..0bc5e3f 100644
--- a/packages/components/src/components/Button/utils.ts
+++ b/components/src/components/Button/utils.ts
@@ -1,15 +1,15 @@
-import { BoxProps } from '../Box';
-import { Size } from './styles.css';
+import { BoxProps } from '../Box'
+import { Size } from './styles.css'
export const getCenterProps = (
center: boolean | undefined,
size: Size,
side: 'left' | 'right',
): Pick => {
- if (!center) return {};
+ if (!center) return {}
const props: BoxProps = {
position: 'absolute',
- [side]: size === 'medium' ? 4 : 5,
- };
- return props;
-};
+ [side]: size === 'large' ? 4 : 5,
+ }
+ return props
+}
diff --git a/packages/components/src/components/Card/Card.docs.mdx b/components/src/components/Card/Card.docs.mdx
similarity index 94%
rename from packages/components/src/components/Card/Card.docs.mdx
rename to components/src/components/Card/Card.docs.mdx
index 323bb8b..e0428b9 100644
--- a/packages/components/src/components/Card/Card.docs.mdx
+++ b/components/src/components/Card/Card.docs.mdx
@@ -4,7 +4,7 @@ description: Styled wrapper for content
---
```tsx
-import { Card } from '@disco3/components';
+import { Card } from 'degen'
```
```tsx live=true expand=true backgroundColor=foregroundTertiary
diff --git a/components/src/components/Card/Card.snippets.tsx b/components/src/components/Card/Card.snippets.tsx
new file mode 100644
index 0000000..0d0319d
--- /dev/null
+++ b/components/src/components/Card/Card.snippets.tsx
@@ -0,0 +1,11 @@
+import * as React from 'react'
+
+import { Snippet } from '!/playroom/src/types'
+import { Card } from './Card'
+
+export const snippets: Snippet[] = [
+ {
+ name: 'Basic',
+ code: _,
+ },
+]
diff --git a/components/src/components/Card/Card.test.tsx b/components/src/components/Card/Card.test.tsx
new file mode 100644
index 0000000..ea61fa3
--- /dev/null
+++ b/components/src/components/Card/Card.test.tsx
@@ -0,0 +1,14 @@
+import * as React from 'react'
+
+import { cleanup, render, screen } from '@/test'
+
+import { Card } from './Card'
+
+describe('', () => {
+ afterEach(cleanup)
+
+ it('renders', () => {
+ render(foo bar baz)
+ expect(screen.getByText(/foo/i)).toBeInTheDocument()
+ })
+})
diff --git a/packages/components/src/components/Card/Card.tsx b/components/src/components/Card/Card.tsx
similarity index 55%
rename from packages/components/src/components/Card/Card.tsx
rename to components/src/components/Card/Card.tsx
index 7bb4942..2dcb465 100644
--- a/packages/components/src/components/Card/Card.tsx
+++ b/components/src/components/Card/Card.tsx
@@ -1,18 +1,18 @@
-import * as React from 'react';
+import * as React from 'react'
-import { Box, BoxProps } from '../Box';
-import { useTheme } from '../ThemeProvider';
-import * as styles from './styles.css';
+import { Box, BoxProps } from '../Box'
+import { useTheme } from '../ThemeProvider'
+import * as styles from './styles.css'
type Props = {
- as?: BoxProps['as'];
- shadow?: boolean;
- hover?: boolean;
- level?: '1' | '2';
- borderRadius?: BoxProps['borderRadius'];
- padding?: BoxProps['padding'];
- width?: BoxProps['width'];
-};
+ as?: BoxProps['as']
+ shadow?: boolean
+ hover?: boolean
+ level?: '1' | '2'
+ borderRadius?: BoxProps['borderRadius']
+ padding?: BoxProps['padding']
+ width?: BoxProps['width']
+}
export const Card = ({
as = 'div',
@@ -24,7 +24,7 @@ export const Card = ({
borderRadius = { xs: '2xLarge', sm: '3xLarge' },
width,
}: React.PropsWithChildren) => {
- const { mode, forcedMode } = useTheme();
+ const { mode, forcedMode } = useTheme()
return (
{children}
- );
-};
+ )
+}
diff --git a/components/src/components/Card/index.ts b/components/src/components/Card/index.ts
new file mode 100644
index 0000000..423e583
--- /dev/null
+++ b/components/src/components/Card/index.ts
@@ -0,0 +1 @@
+export { Card } from './Card'
diff --git a/packages/components/src/components/Card/styles.css.ts b/components/src/components/Card/styles.css.ts
similarity index 88%
rename from packages/components/src/components/Card/styles.css.ts
rename to components/src/components/Card/styles.css.ts
index 0841def..e6019b3 100644
--- a/packages/components/src/components/Card/styles.css.ts
+++ b/components/src/components/Card/styles.css.ts
@@ -1,9 +1,9 @@
-import { RecipeVariants, recipe } from '@vanilla-extract/recipes';
-import { createVar, style } from '@vanilla-extract/css';
+import { RecipeVariants, recipe } from '@vanilla-extract/recipes'
+import { createVar, style } from '@vanilla-extract/css'
-import { atoms, responsiveStyle, rgb, vars } from '../../css';
+import { atoms, responsiveStyle, rgb, vars } from '../../css'
-const radiiVar = createVar();
+const radiiVar = createVar()
export const variants = recipe({
variants: {
@@ -85,6 +85,6 @@ export const variants = recipe({
]),
},
],
-});
+})
-export type Variants = RecipeVariants;
+export type Variants = RecipeVariants
diff --git a/packages/components/src/components/Field/Field.docs.mdx b/components/src/components/Field/Field.docs.mdx
similarity index 91%
rename from packages/components/src/components/Field/Field.docs.mdx
rename to components/src/components/Field/Field.docs.mdx
index 0d0772d..2e97a82 100644
--- a/packages/components/src/components/Field/Field.docs.mdx
+++ b/components/src/components/Field/Field.docs.mdx
@@ -4,7 +4,7 @@ description: Wrapper for form content
---
```tsx
-import { Field } from '@disco3/components';
+import { Field } from 'degen'
```
```tsx live=true expand=true
@@ -51,8 +51,7 @@ import { Field } from '@disco3/components';
## Consume ID
-The content wrapped by field sets an `id` automatically for accessibility. You
-can customize the behavior by using the render prop.
+The content wrapped by field sets an `id` automatically for accessibility. You can customize the behavior by using the render prop.
```tsx live=true
diff --git a/packages/components/src/components/Field/Field.snippets.tsx b/components/src/components/Field/Field.snippets.tsx
similarity index 55%
rename from packages/components/src/components/Field/Field.snippets.tsx
rename to components/src/components/Field/Field.snippets.tsx
index 38d3273..a65696a 100644
--- a/packages/components/src/components/Field/Field.snippets.tsx
+++ b/components/src/components/Field/Field.snippets.tsx
@@ -1,7 +1,7 @@
-import * as React from 'react';
+import * as React from 'react'
-import { Snippet } from '!/playroom/src/types';
-import { Field } from './Field';
+import { Snippet } from '!/playroom/src/types'
+import { Field } from './Field'
export const snippets: Snippet[] = [
{
@@ -12,4 +12,4 @@ export const snippets: Snippet[] = [
),
},
-];
+]
diff --git a/components/src/components/Field/Field.test.tsx b/components/src/components/Field/Field.test.tsx
new file mode 100644
index 0000000..c4b57a0
--- /dev/null
+++ b/components/src/components/Field/Field.test.tsx
@@ -0,0 +1,18 @@
+import * as React from 'react'
+
+import { cleanup, render, screen } from '@/test'
+
+import { Field } from './Field'
+
+describe('', () => {
+ afterEach(cleanup)
+
+ it('renders', () => {
+ render(
+
+
+ ,
+ )
+ expect(screen.getByText(/foo/i)).toBeInTheDocument()
+ })
+})
diff --git a/components/src/components/Field/Field.tsx b/components/src/components/Field/Field.tsx
new file mode 100644
index 0000000..a8dfc0f
--- /dev/null
+++ b/components/src/components/Field/Field.tsx
@@ -0,0 +1,114 @@
+import * as React from 'react'
+
+import { ReactNodeNoStrings } from '../../types'
+import { useFieldIds } from '../../hooks'
+import { Context as FieldSetContext } from '../FieldSet'
+import { Box, BoxProps } from '../Box'
+import { VisuallyHidden } from '../VisuallyHidden'
+
+type State = ReturnType | undefined
+const Context = React.createContext(undefined)
+
+type NativeFormProps = React.AllHTMLAttributes
+
+export type FieldBaseProps = {
+ description?: React.ReactNode
+ error?: React.ReactNode
+ hideLabel?: boolean
+ label: React.ReactNode
+ labelSecondary?: React.ReactNode
+ required?: NativeFormProps['required']
+ width?: BoxProps['width']
+}
+
+type Props = FieldBaseProps & {
+ children: React.ReactElement | ((context: State) => ReactNodeNoStrings)
+ id?: NativeFormProps['id']
+}
+
+export const Field = ({
+ children,
+ description,
+ error,
+ hideLabel,
+ id,
+ label,
+ labelSecondary,
+ required,
+ width = 'full',
+}: Props) => {
+ const fieldSetProps = React.useContext(FieldSetContext)
+ const ids = useFieldIds({
+ id,
+ description: description !== undefined,
+ error: error !== undefined,
+ })
+
+ const labelContent = (
+
+
+ {label} {required && (required)}
+
+ {labelSecondary && labelSecondary}
+
+ )
+
+ // Allow children to consume ids or try to clone ids onto it
+ let content: React.ReactNode | null
+ if (typeof children === 'function')
+ content = (
+
+ {(context) => children(context)}
+
+ )
+ else if (children) content = React.cloneElement(children, ids.content)
+ else content = children
+
+ return (
+
+ {hideLabel ? (
+ {labelContent}
+ ) : (
+ labelContent
+ )}
+
+ {content}
+
+ {description && (
+
+ {description}
+
+ )}
+
+ {error && (
+
+ {error}
+
+ )}
+
+ )
+}
diff --git a/components/src/components/Field/index.ts b/components/src/components/Field/index.ts
new file mode 100644
index 0000000..0ca865d
--- /dev/null
+++ b/components/src/components/Field/index.ts
@@ -0,0 +1,2 @@
+export { Field } from './Field'
+export type { FieldBaseProps } from './Field'
diff --git a/components/src/components/FieldSet/FieldSet.docs.mdx b/components/src/components/FieldSet/FieldSet.docs.mdx
new file mode 100644
index 0000000..c2f5c8e
--- /dev/null
+++ b/components/src/components/FieldSet/FieldSet.docs.mdx
@@ -0,0 +1,102 @@
+---
+title: FieldSet
+description: Group related form elements
+---
+
+```tsx
+import { FieldSet } from 'degen'
+```
+
+```tsx live=true expand=true
+
+```
+
+## Props
+
+
+
+## Description
+
+```tsx live=true
+
+```
+
+## Status
+
+```tsx live=true
+
+```
+
+## Disabled
+
+Uses native [`fieldset[disabled]`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/fieldset#attr-disabled) to automatically disable form elements inside.
+
+```tsx live=true
+
+```
+
+## Size
+
+Notice how the field styles also change inside the `FieldSet` depending on the `size`.
+
+```tsx live=true
+
+
+
+
+
+```
diff --git a/packages/components/src/components/FieldSet/FieldSet.snippets.tsx b/components/src/components/FieldSet/FieldSet.snippets.tsx
similarity index 55%
rename from packages/components/src/components/FieldSet/FieldSet.snippets.tsx
rename to components/src/components/FieldSet/FieldSet.snippets.tsx
index 6ce74cb..c5cb381 100644
--- a/packages/components/src/components/FieldSet/FieldSet.snippets.tsx
+++ b/components/src/components/FieldSet/FieldSet.snippets.tsx
@@ -1,7 +1,7 @@
-import * as React from 'react';
+import * as React from 'react'
-import { Snippet } from '!/playroom/src/types';
-import { FieldSet } from './FieldSet';
+import { Snippet } from '!/playroom/src/types'
+import { FieldSet } from './FieldSet'
export const snippets: Snippet[] = [
{
@@ -12,4 +12,4 @@ export const snippets: Snippet[] = [
),
},
-];
+]
diff --git a/components/src/components/FieldSet/FieldSet.test.tsx b/components/src/components/FieldSet/FieldSet.test.tsx
new file mode 100644
index 0000000..6fd7799
--- /dev/null
+++ b/components/src/components/FieldSet/FieldSet.test.tsx
@@ -0,0 +1,18 @@
+import * as React from 'react'
+
+import { cleanup, render, screen } from '@/test'
+
+import { FieldSet } from './FieldSet'
+
+describe('', () => {
+ afterEach(cleanup)
+
+ it('renders', () => {
+ render(
+ ,
+ )
+ expect(screen.getByText(/token/i)).toBeInTheDocument()
+ })
+})
diff --git a/components/src/components/FieldSet/FieldSet.tsx b/components/src/components/FieldSet/FieldSet.tsx
new file mode 100644
index 0000000..a9621ab
--- /dev/null
+++ b/components/src/components/FieldSet/FieldSet.tsx
@@ -0,0 +1,119 @@
+import * as React from 'react'
+
+import { ReactNodeNoStrings } from '../../types'
+import { Box, BoxProps } from '../Box'
+import { Heading } from '../Heading'
+import { Stack } from '../Stack'
+import { Tag, TagProps } from '../Tag'
+import { Text } from '../Text'
+
+type NativeFieldSetProps = React.AllHTMLAttributes
+
+type Props = {
+ children: ReactNodeNoStrings
+ description?: string | React.ReactNode
+ disabled?: NativeFieldSetProps['disabled']
+ form?: NativeFieldSetProps['form']
+ name?: NativeFieldSetProps['name']
+ legend: string
+ size?: 'medium' | 'small'
+ space?: BoxProps['gap']
+ status?:
+ | 'required'
+ | 'optional'
+ | 'pending'
+ | 'complete'
+ | {
+ name: string
+ tone: TagProps['tone']
+ }
+}
+
+export const Context = React.createContext<{ size?: Props['size'] }>({})
+
+export const FieldSet = ({
+ children,
+ description,
+ disabled,
+ form,
+ legend,
+ name,
+ size,
+ space = '4',
+ status,
+}: Props) => {
+ let statusText: string | undefined
+ let statusTone: TagProps['tone']
+ switch (status) {
+ case 'complete': {
+ statusText = 'Complete'
+ statusTone = 'green'
+ break
+ }
+ case 'required':
+ case 'pending': {
+ statusText = status === 'pending' ? 'Pending' : 'Required'
+ statusTone = 'accent'
+ break
+ }
+ case 'optional': {
+ statusText = 'Optional'
+ statusTone = 'secondary'
+ break
+ }
+ }
+ if (typeof status === 'object') {
+ statusText = status.name
+ statusTone = status.tone
+ }
+
+ const isSmall = size === 'small'
+
+ return (
+
+
+
+ {isSmall ? (
+
+ {legend}
+
+ ) : (
+
+ {legend}
+
+ )}
+ {statusTone && statusText && (
+
+ {statusText}
+
+ )}
+
+
+
+ {description}
+
+
+
+
+ {children}
+
+
+ )
+}
diff --git a/components/src/components/FieldSet/index.ts b/components/src/components/FieldSet/index.ts
new file mode 100644
index 0000000..cd764f7
--- /dev/null
+++ b/components/src/components/FieldSet/index.ts
@@ -0,0 +1 @@
+export { FieldSet, Context } from './FieldSet'
diff --git a/packages/components/src/components/FileInput/FileInput.docs.mdx b/components/src/components/FileInput/FileInput.docs.mdx
similarity index 96%
rename from packages/components/src/components/FileInput/FileInput.docs.mdx
rename to components/src/components/FileInput/FileInput.docs.mdx
index 37045a6..9639864 100644
--- a/packages/components/src/components/FileInput/FileInput.docs.mdx
+++ b/components/src/components/FileInput/FileInput.docs.mdx
@@ -4,7 +4,7 @@ description: Surface for accepting files
---
```tsx
-import { FileInput } from '@disco3/components';
+import { FileInput } from 'degen'
```
```tsx live=true expand=true
diff --git a/packages/components/src/components/FileInput/FileInput.snippets.tsx b/components/src/components/FileInput/FileInput.snippets.tsx
similarity index 61%
rename from packages/components/src/components/FileInput/FileInput.snippets.tsx
rename to components/src/components/FileInput/FileInput.snippets.tsx
index e3ccdd3..eafd3f0 100644
--- a/packages/components/src/components/FileInput/FileInput.snippets.tsx
+++ b/components/src/components/FileInput/FileInput.snippets.tsx
@@ -1,7 +1,7 @@
-import * as React from 'react';
+import * as React from 'react'
-import { Snippet } from '!/playroom/src/types';
-import { FileInput } from './FileInput';
+import { Snippet } from '!/playroom/src/types'
+import { FileInput } from './FileInput'
export const snippets: Snippet[] = [
{
@@ -12,4 +12,4 @@ export const snippets: Snippet[] = [
),
},
-];
+]
diff --git a/components/src/components/FileInput/FileInput.test.tsx b/components/src/components/FileInput/FileInput.test.tsx
new file mode 100644
index 0000000..5946454
--- /dev/null
+++ b/components/src/components/FileInput/FileInput.test.tsx
@@ -0,0 +1,20 @@
+import * as React from 'react'
+
+import { cleanup, render, screen } from '@/test'
+
+import { FileInput } from './FileInput'
+
+describe('', () => {
+ afterEach(cleanup)
+
+ it('renders', () => {
+ render(
+
+ {(context) =>
+ context.name ? {context.name}
: Upload file
+ }
+ ,
+ )
+ expect(screen.getByText(/upload/i)).toBeInTheDocument()
+ })
+})
diff --git a/packages/components/src/components/FileInput/FileInput.tsx b/components/src/components/FileInput/FileInput.tsx
similarity index 56%
rename from packages/components/src/components/FileInput/FileInput.tsx
rename to components/src/components/FileInput/FileInput.tsx
index 76f95be..6aa697b 100644
--- a/packages/components/src/components/FileInput/FileInput.tsx
+++ b/components/src/components/FileInput/FileInput.tsx
@@ -1,46 +1,46 @@
-import * as React from 'react';
+import * as React from 'react'
-import { ReactNodeNoStrings } from '../../types';
-import { useFieldIds } from '../../hooks';
-import { Box } from '../Box';
-import { VisuallyHidden } from '../VisuallyHidden';
-import { validateAccept } from './utils';
+import { ReactNodeNoStrings } from '../../types'
+import { useFieldIds } from '../../hooks'
+import { Box } from '../Box'
+import { VisuallyHidden } from '../VisuallyHidden'
+import { validateAccept } from './utils'
type State = {
- droppable?: boolean;
- file?: File;
- focused?: boolean;
- name?: string;
- previewUrl?: string;
- type?: string;
-};
+ droppable?: boolean
+ file?: File
+ focused?: boolean
+ name?: string
+ previewUrl?: string
+ type?: string
+}
-const initialState: State = {};
+const initialState: State = {}
-type NativeInputProps = React.AllHTMLAttributes;
+type NativeInputProps = React.AllHTMLAttributes
export type Props = {
- accept?: NativeInputProps['accept'];
- autoFocus?: NativeInputProps['autoFocus'];
+ accept?: NativeInputProps['accept']
+ autoFocus?: NativeInputProps['autoFocus']
children: (
context: State & {
- reset(event: React.MouseEvent): void;
+ reset(event: React.MouseEvent): void
},
- ) => ReactNodeNoStrings;
- defaultValue?: { name?: string; type: string; url: string };
- disabled?: NativeInputProps['disabled'];
- error?: boolean | React.ReactNode;
- id?: NativeInputProps['id'];
+ ) => ReactNodeNoStrings
+ defaultValue?: { name?: string; type: string; url: string }
+ disabled?: NativeInputProps['disabled']
+ error?: boolean | React.ReactNode
+ id?: NativeInputProps['id']
/** Size in megabytes */
- maxSize?: number;
- name?: string;
- required?: NativeInputProps['required'];
- tabIndex?: NativeInputProps['tabIndex'];
- onBlur?: NativeInputProps['onBlur'];
- onError?(error: string): void;
- onChange?(file: File): void;
- onFocus?: NativeInputProps['onFocus'];
- onReset?(): void;
-};
+ maxSize?: number
+ name?: string
+ required?: NativeInputProps['required']
+ tabIndex?: NativeInputProps['tabIndex']
+ onBlur?: NativeInputProps['onBlur']
+ onError?(error: string): void
+ onChange?(file: File): void
+ onFocus?: NativeInputProps['onFocus']
+ onReset?(): void
+}
export const FileInput = React.forwardRef(
(
@@ -64,134 +64,134 @@ export const FileInput = React.forwardRef(
}: Props,
ref: React.Ref,
) => {
- const defaultRef = React.useRef(null);
- const inputRef = (ref as React.RefObject) || defaultRef;
- const [state, setState] = React.useState(initialState);
+ const defaultRef = React.useRef(null)
+ const inputRef = (ref as React.RefObject) || defaultRef
+ const [state, setState] = React.useState(initialState)
- const hasError = error ? true : undefined;
+ const hasError = error ? true : undefined
const ids = useFieldIds({
id,
error: hasError,
- });
+ })
const handleFile = React.useCallback(
(file: File, event?: React.ChangeEvent | React.DragEvent) => {
// Disallow file larger than max
if (maxSize && file.size > maxSize * 1_000_000) {
- event?.preventDefault();
+ event?.preventDefault()
onError &&
onError(
`File is ${(file.size / 1_000_000).toFixed(
2,
)} MB. Must be smaller than ${maxSize} MB`,
- );
- return;
+ )
+ return
}
setState((x) => ({
...x,
file,
name: file.name,
type: file.type,
- }));
- onChange && onChange(file);
+ }))
+ onChange && onChange(file)
},
[maxSize, onChange, onError],
- );
+ )
const handleChange = React.useCallback(
(event: React.ChangeEvent) => {
- const files = event.target.files;
- if (!files?.length) return;
- handleFile(files[0], event);
+ const files = event.target.files
+ if (!files?.length) return
+ handleFile(files[0], event)
},
[handleFile],
- );
+ )
const handleDragOver = React.useCallback(
(event: React.DragEvent) => {
- event.preventDefault();
- setState((x) => ({ ...x, droppable: true }));
+ event.preventDefault()
+ setState((x) => ({ ...x, droppable: true }))
},
[],
- );
+ )
const handleDragLeave = React.useCallback(
(event: React.DragEvent) => {
- event.preventDefault();
- setState((x) => ({ ...x, droppable: false }));
+ event.preventDefault()
+ setState((x) => ({ ...x, droppable: false }))
},
[],
- );
+ )
const handleDrop = React.useCallback(
(event: React.DragEvent) => {
- event.preventDefault();
- setState((x) => ({ ...x, droppable: false }));
- let file: File | null;
+ event.preventDefault()
+ setState((x) => ({ ...x, droppable: false }))
+ let file: File | null
if (event.dataTransfer.items) {
- const files = event.dataTransfer.items;
- if (files?.[0].kind !== 'file') return;
- file = files[0].getAsFile();
- if (!file) return;
+ const files = event.dataTransfer.items
+ if (files?.[0].kind !== 'file') return
+ file = files[0].getAsFile()
+ if (!file) return
} else {
- const files = event.dataTransfer.files;
- if (!files?.length) return;
- file = files[0];
+ const files = event.dataTransfer.files
+ if (!files?.length) return
+ file = files[0]
}
- if (!validateAccept(file.type, accept)) return;
- handleFile(file, event);
+ if (!validateAccept(file.type, accept)) return
+ handleFile(file, event)
},
[handleFile, accept],
- );
+ )
const handleFocus = React.useCallback(
(event: React.FocusEvent) => {
- setState((x) => ({ ...x, focused: true }));
- onFocus && onFocus(event);
+ setState((x) => ({ ...x, focused: true }))
+ onFocus && onFocus(event)
},
[onFocus],
- );
+ )
const handleBlur = React.useCallback(
(event: React.FocusEvent) => {
- setState((x) => ({ ...x, focused: false }));
- onBlur && onBlur(event);
+ setState((x) => ({ ...x, focused: false }))
+ onBlur && onBlur(event)
},
[onBlur],
- );
+ )
/* eslint-disable react-hooks/exhaustive-deps */
const reset = React.useCallback(
(event: React.MouseEvent) => {
- event.preventDefault();
- setState(initialState);
- if (inputRef.current) inputRef.current.value = '';
- onReset && onReset();
+ event.preventDefault()
+ setState(initialState)
+ if (inputRef.current) inputRef.current.value = ''
+ onReset && onReset()
},
// No need to add defaultValue
[inputRef, onReset],
- );
+ )
/* eslint-enable react-hooks/exhaustive-deps */
// Display preview for default value
/* eslint-disable react-hooks/exhaustive-deps */
React.useEffect(() => {
- if (!defaultValue) return;
+ if (!defaultValue) return
setState({
previewUrl: defaultValue.url,
name: defaultValue.name,
type: defaultValue.type,
- });
- }, []);
+ })
+ }, [])
/* eslint-enable react-hooks/exhaustive-deps */
// Create URL for displaying media preview
React.useEffect(() => {
- if (!state.file) return;
- const previewUrl = URL.createObjectURL(state.file);
- setState((x) => ({ ...x, previewUrl }));
- return () => URL.revokeObjectURL(previewUrl);
- }, [state.file]);
+ if (!state.file) return
+ const previewUrl = URL.createObjectURL(state.file)
+ setState((x) => ({ ...x, previewUrl }))
+ return () => URL.revokeObjectURL(previewUrl)
+ }, [state.file])
return (
@@ -224,8 +224,8 @@ export const FileInput = React.forwardRef(
{children({ ...state, reset })}
- );
+ )
},
-);
+)
-FileInput.displayName = 'FileInput';
+FileInput.displayName = 'FileInput'
diff --git a/components/src/components/FileInput/index.ts b/components/src/components/FileInput/index.ts
new file mode 100644
index 0000000..e9735a4
--- /dev/null
+++ b/components/src/components/FileInput/index.ts
@@ -0,0 +1,2 @@
+export { FileInput } from './FileInput'
+export type { Props as FileInputProps } from './FileInput'
diff --git a/packages/components/src/components/FileInput/utils.test.ts b/components/src/components/FileInput/utils.test.ts
similarity index 90%
rename from packages/components/src/components/FileInput/utils.test.ts
rename to components/src/components/FileInput/utils.test.ts
index a0c3fe0..66b471e 100644
--- a/packages/components/src/components/FileInput/utils.test.ts
+++ b/components/src/components/FileInput/utils.test.ts
@@ -1,4 +1,4 @@
-import { validateAccept } from './utils';
+import { validateAccept } from './utils'
describe.each`
fileType | accept | expected
@@ -11,6 +11,6 @@ describe.each`
${'image/jpeg'} | ${'image/jpeg, image/png, image/webp, image/gif, video/mp4, video/ogg, video/webm'} | ${true}
`('validateAccept($fileType, $accept)', ({ fileType, accept, expected }) => {
it(`returns ${expected}`, () => {
- expect(validateAccept(fileType, accept)).toEqual(expected);
- });
-});
+ expect(validateAccept(fileType, accept)).toEqual(expected)
+ })
+})
diff --git a/packages/components/src/components/FileInput/utils.ts b/components/src/components/FileInput/utils.ts
similarity index 54%
rename from packages/components/src/components/FileInput/utils.ts
rename to components/src/components/FileInput/utils.ts
index ebfc793..e20f799 100644
--- a/packages/components/src/components/FileInput/utils.ts
+++ b/components/src/components/FileInput/utils.ts
@@ -1,21 +1,21 @@
-import { Props } from './FileInput';
+import { Props } from './FileInput'
export const validateAccept = (fileType: string, accept: Props['accept']) => {
- const allowedTypes = accept?.split(', ');
- if (!allowedTypes) return true;
- const mime = getMimeType(fileType);
+ const allowedTypes = accept?.split(', ')
+ if (!allowedTypes) return true
+ const mime = getMimeType(fileType)
return allowedTypes.some((x) => {
- const allowedMime = getMimeType(x);
+ const allowedMime = getMimeType(x)
return (
allowedMime.type === mime.type && allowedMime.subtype === mime.subtype
- );
- });
-};
+ )
+ })
+}
const getMimeType = (type: string) => {
- const parts = type.split('/');
+ const parts = type.split('/')
return {
type: parts[0],
subtype: parts[1],
- };
-};
+ }
+}
diff --git a/packages/components/src/components/Heading/Heading.docs.mdx b/components/src/components/Heading/Heading.docs.mdx
similarity index 81%
rename from packages/components/src/components/Heading/Heading.docs.mdx
rename to components/src/components/Heading/Heading.docs.mdx
index 9458316..a944c2b 100644
--- a/packages/components/src/components/Heading/Heading.docs.mdx
+++ b/components/src/components/Heading/Heading.docs.mdx
@@ -4,7 +4,7 @@ description: Page and section title
---
```tsx
-import { Heading } from '@disco3/components';
+import { Heading } from 'degen'
```
```tsx expand=true live=true
@@ -17,10 +17,7 @@ import { Heading } from '@disco3/components';
## Levels
-By default, the semantic heading level matches the visual heading level, e.g.
-`` will render an `h2` element. If you need the semantics to
-be different from the visuals, you can provide the desired HTML tag via the `as`
-prop.
+By default, the semantic heading level matches the visual heading level, e.g. `` will render an `h2` element. If you need the semantics to be different from the visuals, you can provide the desired HTML tag via the `as` prop.
```tsx live=true
diff --git a/components/src/components/Heading/Heading.snippets.tsx b/components/src/components/Heading/Heading.snippets.tsx
new file mode 100644
index 0000000..15175ef
--- /dev/null
+++ b/components/src/components/Heading/Heading.snippets.tsx
@@ -0,0 +1,11 @@
+import * as React from 'react'
+
+import { Snippet } from '!/playroom/src/types'
+import { Heading } from './Heading'
+
+export const snippets: Snippet[] = [
+ {
+ name: 'Basic',
+ code: Heading,
+ },
+]
diff --git a/components/src/components/Heading/Heading.test.tsx b/components/src/components/Heading/Heading.test.tsx
new file mode 100644
index 0000000..e30ec1a
--- /dev/null
+++ b/components/src/components/Heading/Heading.test.tsx
@@ -0,0 +1,14 @@
+import * as React from 'react'
+
+import { cleanup, render, screen } from '@/test'
+
+import { Heading } from './Heading'
+
+describe('', () => {
+ afterEach(cleanup)
+
+ it('renders', () => {
+ render(foo bar baz)
+ expect(screen.getByText(/foo/i)).toBeInTheDocument()
+ })
+})
diff --git a/packages/components/src/components/Heading/Heading.tsx b/components/src/components/Heading/Heading.tsx
similarity index 59%
rename from packages/components/src/components/Heading/Heading.tsx
rename to components/src/components/Heading/Heading.tsx
index 3a9848b..29618ef 100644
--- a/packages/components/src/components/Heading/Heading.tsx
+++ b/components/src/components/Heading/Heading.tsx
@@ -1,22 +1,23 @@
-import * as React from 'react';
+import * as React from 'react'
-import { Box, BoxProps } from '../Box';
-import * as styles from './styles.css';
+import { Box, BoxProps } from '../Box'
+import * as styles from './styles.css'
const resolveDefaultComponent = {
'1': 'h1',
'2': 'h2',
-} as const;
+} as const
type Props = {
- align?: BoxProps['textAlign'];
- as?: 'div' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'legend';
- children?: React.ReactNode;
- color?: BoxProps['color'];
- id?: string;
- transform?: BoxProps['textTransform'];
- responsive?: boolean;
-} & styles.Variants;
+ align?: BoxProps['textAlign']
+ as?: 'div' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'legend'
+ children?: React.ReactNode
+ color?: BoxProps['color']
+ id?: string
+ transform?: BoxProps['textTransform']
+ responsive?: boolean
+ wordBreak?: BoxProps['wordBreak']
+} & styles.Variants
export const Heading = ({
align,
@@ -27,6 +28,7 @@ export const Heading = ({
level = '2',
responsive,
transform,
+ wordBreak,
}: Props) => {
return (
{children}
- );
-};
+ )
+}
diff --git a/components/src/components/Heading/index.ts b/components/src/components/Heading/index.ts
new file mode 100644
index 0000000..d273982
--- /dev/null
+++ b/components/src/components/Heading/index.ts
@@ -0,0 +1 @@
+export { Heading } from './Heading'
diff --git a/packages/components/src/components/Heading/styles.css.ts b/components/src/components/Heading/styles.css.ts
similarity index 86%
rename from packages/components/src/components/Heading/styles.css.ts
rename to components/src/components/Heading/styles.css.ts
index 78669a9..4634436 100644
--- a/packages/components/src/components/Heading/styles.css.ts
+++ b/components/src/components/Heading/styles.css.ts
@@ -1,7 +1,7 @@
-import { style } from '@vanilla-extract/css';
-import { RecipeVariants, recipe } from '@vanilla-extract/recipes';
+import { style } from '@vanilla-extract/css'
+import { RecipeVariants, recipe } from '@vanilla-extract/recipes'
-import { atoms } from '../../css';
+import { atoms } from '../../css'
const level = {
'1': style([
@@ -22,7 +22,7 @@ const level = {
lineHeight: '1.25',
}),
]),
-};
+}
export const variants = recipe({
variants: {
@@ -53,6 +53,6 @@ export const variants = recipe({
}),
},
],
-});
+})
-export type Variants = RecipeVariants;
+export type Variants = RecipeVariants
diff --git a/packages/components/src/components/Input/Input.docs.mdx b/components/src/components/Input/Input.docs.mdx
similarity index 94%
rename from packages/components/src/components/Input/Input.docs.mdx
rename to components/src/components/Input/Input.docs.mdx
index 00d9843..f5ee30e 100644
--- a/packages/components/src/components/Input/Input.docs.mdx
+++ b/components/src/components/Input/Input.docs.mdx
@@ -4,7 +4,7 @@ description: Surface for accepting user input
---
```tsx
-import { Input } from '@disco3/components';
+import { Input } from 'degen'
```
```tsx live=true expand=true
@@ -54,7 +54,7 @@ import { Input } from '@disco3/components';
diff --git a/components/src/components/Input/Input.snippets.tsx b/components/src/components/Input/Input.snippets.tsx
new file mode 100644
index 0000000..115065e
--- /dev/null
+++ b/components/src/components/Input/Input.snippets.tsx
@@ -0,0 +1,11 @@
+import * as React from 'react'
+
+import { Snippet } from '!/playroom/src/types'
+import { Input } from './Input'
+
+export const snippets: Snippet[] = [
+ {
+ name: 'Basic',
+ code: ,
+ },
+]
diff --git a/components/src/components/Input/Input.test.tsx b/components/src/components/Input/Input.test.tsx
new file mode 100644
index 0000000..8005762
--- /dev/null
+++ b/components/src/components/Input/Input.test.tsx
@@ -0,0 +1,67 @@
+import * as React from 'react'
+
+import { cleanup, render, screen, userEvent } from '@/test'
+
+import { Input } from './Input'
+
+describe('', () => {
+ afterEach(cleanup)
+
+ it('renders', () => {
+ render()
+ expect(screen.getByRole('textbox')).toBeInTheDocument()
+ })
+
+ it('receives user input', () => {
+ render()
+
+ userEvent.type(screen.getByRole('textbox'), 'Satoshi Nakamoto')
+ expect(screen.getByRole('textbox')).toHaveValue('Satoshi Nakamoto')
+ })
+
+ describe('[type=text]', () => {
+ it('maxLength', () => {
+ render()
+
+ const element = screen.getByLabelText(/short/i)
+ userEvent.type(element, 'Satoshi Nakamoto')
+ expect(element).toHaveValue('Satoshi')
+ })
+ })
+
+ describe('[type=number]', () => {
+ it('filters invalid characters', () => {
+ render()
+
+ const element = screen.getByLabelText(/funding/i)
+ userEvent.type(element, 'Ee+')
+ expect(element).toHaveValue(null)
+ })
+
+ it('max', () => {
+ render()
+
+ const element = screen.getByLabelText(/funding/i)
+ expect(element).toHaveValue(null)
+ userEvent.click(screen.getByText('Max'))
+ expect(element).toHaveValue(20)
+ })
+
+ it('units', () => {
+ render(
+ ,
+ )
+
+ const element = screen.getByLabelText(/funding/i) as HTMLInputElement
+ expect(element.placeholder).toEqual('10 ETH')
+ userEvent.type(element, '20')
+ expect(element).toHaveValue(20)
+ expect(screen.getByTestId('ghost')).toBeInTheDocument()
+ })
+ })
+})
diff --git a/packages/components/src/components/Input/Input.tsx b/components/src/components/Input/Input.tsx
similarity index 72%
rename from packages/components/src/components/Input/Input.tsx
rename to components/src/components/Input/Input.tsx
index 364f6e6..98ad083 100644
--- a/packages/components/src/components/Input/Input.tsx
+++ b/components/src/components/Input/Input.tsx
@@ -1,52 +1,52 @@
-import * as React from 'react';
+import * as React from 'react'
-import { Box, BoxProps } from '../Box';
-import { Field, FieldBaseProps } from '../Field';
-import * as styles from './styles.css';
+import { Box, BoxProps } from '../Box'
+import { Field, FieldBaseProps } from '../Field'
+import * as styles from './styles.css'
-type NativeInputProps = React.AllHTMLAttributes;
+type NativeInputProps = React.AllHTMLAttributes
type BaseProps = FieldBaseProps & {
- autoFocus?: NativeInputProps['autoFocus'];
- autoComplete?: NativeInputProps['autoComplete'];
- autoCorrect?: NativeInputProps['autoCorrect'];
- defaultValue?: string | number;
- disabled?: boolean;
- id?: NativeInputProps['id'];
- inputMode?: NativeInputProps['inputMode'];
- name?: string;
- placeholder?: NativeInputProps['placeholder'];
- prefix?: React.ReactNode;
- readOnly?: NativeInputProps['readOnly'];
- spellCheck?: NativeInputProps['spellCheck'];
- suffix?: React.ReactNode;
- tabIndex?: NativeInputProps['tabIndex'];
- textTransform?: BoxProps['textTransform'];
- type?: 'email' | 'number' | 'text';
- units?: string;
- value?: string | number;
- onBlur?: NativeInputProps['onBlur'];
- onChange?: React.EventHandler>;
- onFocus?: NativeInputProps['onFocus'];
- onKeyDown?: React.KeyboardEventHandler;
-};
+ autoFocus?: NativeInputProps['autoFocus']
+ autoComplete?: NativeInputProps['autoComplete']
+ autoCorrect?: NativeInputProps['autoCorrect']
+ defaultValue?: string | number
+ disabled?: boolean
+ id?: NativeInputProps['id']
+ inputMode?: NativeInputProps['inputMode']
+ name?: string
+ placeholder?: NativeInputProps['placeholder']
+ prefix?: React.ReactNode
+ readOnly?: NativeInputProps['readOnly']
+ spellCheck?: NativeInputProps['spellCheck']
+ suffix?: React.ReactNode
+ tabIndex?: NativeInputProps['tabIndex']
+ textTransform?: BoxProps['textTransform']
+ type?: 'email' | 'number' | 'text'
+ units?: string
+ value?: string | number
+ onBlur?: NativeInputProps['onBlur']
+ onChange?: React.EventHandler>
+ onFocus?: NativeInputProps['onFocus']
+ onKeyDown?: React.KeyboardEventHandler
+}
type WithTypeEmail = {
- type?: 'email';
-};
+ type?: 'email'
+}
type WithTypeText = {
- type?: 'text';
- maxLength?: NativeInputProps['maxLength'];
-};
+ type?: 'text'
+ maxLength?: NativeInputProps['maxLength']
+}
type WithTypeNumber = {
- type?: 'number';
- max?: NativeInputProps['max'];
- min?: NativeInputProps['min'];
-};
+ type?: 'number'
+ max?: NativeInputProps['max']
+ min?: NativeInputProps['min']
+}
-type Props = BaseProps & (WithTypeEmail | WithTypeText | WithTypeNumber);
+type Props = BaseProps & (WithTypeEmail | WithTypeText | WithTypeNumber)
export const Input = React.forwardRef(
(
@@ -84,60 +84,60 @@ export const Input = React.forwardRef(
}: Props,
ref: React.Ref,
) => {
- const defaultRef = React.useRef(null);
- const inputRef = (ref as React.RefObject) || defaultRef;
+ const defaultRef = React.useRef(null)
+ const inputRef = (ref as React.RefObject) || defaultRef
const [state, setState] = React.useState<{
- ghostValue?: Props['value'];
- }>({ ghostValue: value || defaultValue });
+ ghostValue?: Props['value']
+ }>({ ghostValue: value || defaultValue })
const placeholderText = placeholder
? `${placeholder ?? ''}${units ? ` ${units}` : ''}`
- : undefined;
- const hasError = error ? true : undefined;
+ : undefined
+ const hasError = error ? true : undefined
const className = styles.variants({
prefix: prefix ? true : undefined,
suffix: suffix ? true : undefined,
- });
- const max = (props as WithTypeNumber).max;
- const inputType = type === 'number' ? 'number' : 'text';
+ })
+ const max = (props as WithTypeNumber).max
+ const inputType = type === 'number' ? 'number' : 'text'
const handleInput = React.useCallback(
(event: React.FormEvent) => {
- const value = (event.target as HTMLInputElement).value;
- setState((x) => ({ ...x, ghostValue: value }));
+ const value = (event.target as HTMLInputElement).value
+ setState((x) => ({ ...x, ghostValue: value }))
},
[],
- );
+ )
const handleKeyDown = React.useCallback(
(event: React.KeyboardEvent) => {
if (type === 'number') {
- const key = event.key;
- const filteredKeys = ['E', 'e', '+'];
- if (filteredKeys.includes(key)) event.preventDefault();
+ const key = event.key
+ const filteredKeys = ['E', 'e', '+']
+ if (filteredKeys.includes(key)) event.preventDefault()
}
- onKeyDown && onKeyDown(event);
+ onKeyDown && onKeyDown(event)
},
[type, onKeyDown],
- );
+ )
const handleWheel = React.useCallback(
(event: React.WheelEvent) => {
- (event.target as HTMLElement)?.blur();
+ ;(event.target as HTMLElement)?.blur()
},
[],
- );
+ )
const handleMax = React.useCallback(() => {
if (onChange)
onChange({
target: { value: max },
- } as React.ChangeEvent);
- else if (inputRef.current) inputRef.current.value = max as string;
- if (!units) return;
- setState((x) => ({ ...x, ghostValue: max }));
- }, [inputRef, max, units, onChange]);
+ } as React.ChangeEvent)
+ else if (inputRef.current) inputRef.current.value = max as string
+ if (!units) return
+ setState((x) => ({ ...x, ghostValue: max }))
+ }, [inputRef, max, units, onChange])
return (
)}
- );
+ )
},
-);
+)
-Input.displayName = 'Input';
+Input.displayName = 'Input'
diff --git a/components/src/components/Input/index.ts b/components/src/components/Input/index.ts
new file mode 100644
index 0000000..3188ccc
--- /dev/null
+++ b/components/src/components/Input/index.ts
@@ -0,0 +1 @@
+export { Input } from './Input'
diff --git a/packages/components/src/components/Input/styles.css.ts b/components/src/components/Input/styles.css.ts
similarity index 93%
rename from packages/components/src/components/Input/styles.css.ts
rename to components/src/components/Input/styles.css.ts
index 010383e..544b425 100644
--- a/packages/components/src/components/Input/styles.css.ts
+++ b/components/src/components/Input/styles.css.ts
@@ -1,9 +1,9 @@
-import { style } from '@vanilla-extract/css';
-import { recipe } from '@vanilla-extract/recipes';
+import { style } from '@vanilla-extract/css'
+import { recipe } from '@vanilla-extract/recipes'
-import { atoms, vars } from '../../css';
+import { atoms, vars } from '../../css'
-export const inputParent = style({});
+export const inputParent = style({})
export const root = recipe({
base: [
@@ -50,31 +50,31 @@ export const root = recipe({
]),
},
},
-});
+})
const container = atoms({
alignItems: 'center',
display: 'flex',
height: 'full',
lineHeight: 'none',
-});
+})
const text = atoms({
color: 'inherit',
fontFamily: 'sans',
fontSize: 'base',
fontWeight: 'medium',
-});
+})
-const affix = style([container, text, style({ lineHeight: 'normal' })]);
+const affix = style([container, text, style({ lineHeight: 'normal' })])
export const prefix = style([
affix,
atoms({ paddingLeft: '4', paddingRight: '2' }),
-]);
+])
export const suffix = style([
affix,
atoms({ paddingRight: '4', paddingLeft: '2' }),
-]);
+])
export const input = recipe({
base: atoms({
@@ -97,7 +97,7 @@ export const input = recipe({
text: {},
},
},
-});
+})
export const ghost = recipe({
base: [
@@ -119,7 +119,7 @@ export const ghost = recipe({
text: {},
},
},
-});
+})
export const variants = recipe({
base: [style([container, text, atoms({ paddingX: '4' })])],
@@ -135,7 +135,7 @@ export const variants = recipe({
}),
},
},
-});
+})
export const max = style([
atoms({
@@ -164,4 +164,4 @@ export const max = style([
},
},
}),
-]);
+])
diff --git a/components/src/components/MediaPicker/MediaPicker.docs.mdx b/components/src/components/MediaPicker/MediaPicker.docs.mdx
new file mode 100644
index 0000000..d7db92a
--- /dev/null
+++ b/components/src/components/MediaPicker/MediaPicker.docs.mdx
@@ -0,0 +1,80 @@
+---
+title: MediaPicker
+description: Surface for accepting media
+---
+
+```tsx
+import { MediaPicker } from 'degen'
+```
+
+```tsx live=true expand=true
+
+```
+
+## Props
+
+
+
+## Disabled
+
+```tsx live=true
+
+```
+
+## Error
+
+```tsx live=true
+
+```
+
+## Uploading
+
+```tsx live=true
+
+```
+
+## Uploaded
+
+```tsx live=true
+
+```
+
+## Compact
+
+```tsx live=true
+
+```
+
+## Cover
+
+```tsx live=true
+
+```
+
+## Content Types
+
+```tsx live=true
+
+
+
+
+```
diff --git a/components/src/components/MediaPicker/MediaPicker.snippets.tsx b/components/src/components/MediaPicker/MediaPicker.snippets.tsx
new file mode 100644
index 0000000..ec07812
--- /dev/null
+++ b/components/src/components/MediaPicker/MediaPicker.snippets.tsx
@@ -0,0 +1,11 @@
+import * as React from 'react'
+
+import { Snippet } from '!/playroom/src/types'
+import { MediaPicker } from './MediaPicker'
+
+export const snippets: Snippet[] = [
+ {
+ name: 'Basic',
+ code: ,
+ },
+]
diff --git a/components/src/components/MediaPicker/MediaPicker.test.tsx b/components/src/components/MediaPicker/MediaPicker.test.tsx
new file mode 100644
index 0000000..c5968db
--- /dev/null
+++ b/components/src/components/MediaPicker/MediaPicker.test.tsx
@@ -0,0 +1,26 @@
+import * as React from 'react'
+
+import { cleanup, render, screen, userEvent } from '@/test'
+
+import { MediaPicker } from './MediaPicker'
+
+describe('', () => {
+ afterEach(cleanup)
+
+ it('renders', () => {
+ render()
+ expect(screen.getByLabelText(/choose/i)).toBeInTheDocument()
+ })
+
+ it('receives user input', () => {
+ render()
+
+ const file = new File(['hello'], 'hello.png', { type: 'image/png' })
+ const input = screen.getByLabelText(/choose/i) as HTMLInputElement
+ userEvent.upload(input, file)
+
+ expect(input?.files?.[0]).toStrictEqual(file)
+ expect(input?.files?.item(0)).toStrictEqual(file)
+ expect(input.files).toHaveLength(1)
+ })
+})
diff --git a/components/src/components/MediaPicker/MediaPicker.tsx b/components/src/components/MediaPicker/MediaPicker.tsx
new file mode 100644
index 0000000..23c3075
--- /dev/null
+++ b/components/src/components/MediaPicker/MediaPicker.tsx
@@ -0,0 +1,306 @@
+import * as React from 'react'
+
+import { Box, BoxProps } from '../Box'
+import { Button } from '../Button'
+import { FileInput, FileInputProps } from '../FileInput'
+import { Spinner } from '../Spinner'
+import { Tag } from '../Tag'
+import { VisuallyHidden } from '../VisuallyHidden'
+import { IconClose, IconExclamation, IconUpload } from '../icons'
+import * as styles from './styles.css'
+
+type Image =
+ | 'image/jpeg'
+ | 'image/png'
+ | 'image/webp'
+ | 'image/jpeg, image/png, image/webp'
+type Video =
+ | 'image/gif'
+ | 'video/mp4'
+ | 'video/ogg'
+ | 'video/webm'
+ | 'image/gif, video/mp4, video/ogg, video/webm'
+export type Accept = Image | Video | `${Image}, ${Video}`
+
+type BaseProps = {
+ accept?: Accept
+ autoFocus?: FileInputProps['autoFocus']
+ defaultValue?: { name?: string; type: string; url: string }
+ disabled?: FileInputProps['disabled']
+ error?: boolean | React.ReactNode
+ id?: FileInputProps['id']
+ label: React.ReactNode
+ /** Size in megabytes */
+ maxSize?: number
+ name?: string
+ required?: FileInputProps['required']
+ tabIndex?: FileInputProps['tabIndex']
+ uploaded?: boolean
+ uploading?: boolean
+ uploadProgress?: number
+ onBlur?: FileInputProps['onBlur']
+ onError?(error: string): void
+ onChange?: FileInputProps['onChange']
+ onFocus?: FileInputProps['onFocus']
+ onReset?: FileInputProps['onReset']
+}
+
+type WithoutCompact = {
+ compact?: never
+ cover?: boolean
+}
+
+type WithCompact = {
+ /** Show smaller input */
+ compact?: boolean
+ cover?: never
+}
+
+type Props = BaseProps & (WithCompact | WithoutCompact)
+
+export const MediaPicker = ({
+ accept = 'image/jpeg, image/png, image/webp, image/gif, video/mp4, video/ogg, video/webm',
+ autoFocus,
+ compact,
+ cover,
+ defaultValue,
+ disabled,
+ error,
+ id,
+ label,
+ maxSize = 5,
+ name,
+ required,
+ tabIndex,
+ uploaded,
+ uploading,
+ uploadProgress,
+ onBlur,
+ onChange,
+ onError,
+ onFocus,
+ onReset,
+}: Props) => {
+ const hasError = error ? true : undefined
+ return (
+
+ {(context) => (
+
+
+
+
+
+
+ {!cover && context.file ? (
+ context.file.name
+ ) : (
+ <>
+ {label}{' '}
+ {required && (
+ (required)
+ )}
+ >
+ )}
+
+
+
+
+
+ {cover && context.type && context.previewUrl && (
+
+
+
+ )}
+
+
+ {context.type && (
+
+
+
+ )}
+
+ )}
+
+ )
+}
+
+MediaPicker.displayName = 'MediaPicker'
+
+type MediaProps = {
+ cover?: boolean
+ name?: string
+ type: string
+ url: string
+}
+
+const Media = ({ cover, name, type, url }: MediaProps) => {
+ const boxProps: BoxProps = cover
+ ? { className: styles.cover }
+ : {
+ maxHeight: 'full',
+ maxWidth: 'full',
+ }
+ if (type.includes('image'))
+ return
+ else if (type.includes('video'))
+ return
+ return null
+}
+
+type MediaPreviewProps = Pick & {
+ fileName?: string
+ fileType?: string
+ hasError?: boolean
+ previewUrl?: string
+}
+
+const MediaPreview = ({
+ compact,
+ fileName,
+ fileType,
+ hasError,
+ previewUrl,
+ uploading,
+}: MediaPreviewProps) => {
+ let content: React.ReactNode
+ if (uploading) content =
+ else if (fileType && previewUrl)
+ content =
+ else if (hasError) content =
+ else content =
+
+ return (
+
+ {content}
+
+ )
+}
+
+type MediaTagProps = Pick<
+ Props,
+ 'compact' | 'error' | 'maxSize' | 'uploadProgress' | 'uploaded' | 'uploading'
+>
+
+const MediaTag = ({
+ compact,
+ error,
+ maxSize,
+ uploadProgress,
+ uploaded,
+ uploading,
+}: MediaTagProps) => {
+ let statusProps: Parameters[0] | undefined
+ if (uploading)
+ statusProps = {
+ tone: 'accent',
+ ...(uploadProgress
+ ? { label: 'Uploading', children: `${uploadProgress * 100}%` }
+ : { children: 'Uploading' }),
+ }
+ else if (uploaded) statusProps = { children: 'Success', tone: 'green' }
+ else if (error)
+ statusProps = {
+ tone: 'red',
+ ...(typeof error === 'string'
+ ? { label: 'Error', children: error }
+ : { children: 'Error' }),
+ }
+ else if (maxSize !== undefined)
+ statusProps = {
+ label: 'Maximum size',
+ children: `${maxSize} MB`,
+ }
+
+ if (!statusProps) return null
+ return
+}
+
+type RemoveButtonProps = Pick & {
+ onClick(event: React.MouseEvent): void
+}
+
+const RemoveButton = ({ cover, uploading, onClick }: RemoveButtonProps) => {
+ const content = (
+ <>
+ Remove Media
+
+ >
+ )
+ if (cover)
+ return (
+
+ {uploading ? : content}
+
+ )
+
+ return (
+
+ {content}
+
+ )
+}
diff --git a/components/src/components/MediaPicker/index.ts b/components/src/components/MediaPicker/index.ts
new file mode 100644
index 0000000..905799b
--- /dev/null
+++ b/components/src/components/MediaPicker/index.ts
@@ -0,0 +1 @@
+export { MediaPicker } from './MediaPicker'
diff --git a/components/src/components/MediaPicker/styles.css.ts b/components/src/components/MediaPicker/styles.css.ts
new file mode 100644
index 0000000..01fb327
--- /dev/null
+++ b/components/src/components/MediaPicker/styles.css.ts
@@ -0,0 +1,148 @@
+import { style } from '@vanilla-extract/css'
+import { recipe } from '@vanilla-extract/recipes'
+
+import { atoms, rgb, vars } from '../../css'
+
+export const root = recipe({
+ base: [
+ atoms({
+ borderRadius: '2xLarge',
+ borderWidth: '0.5',
+ overflow: 'hidden',
+ position: 'relative',
+ transitionDuration: '150',
+ transitionProperty: 'colors',
+ transitionTimingFunction: 'inOut',
+ width: 'full',
+ }),
+ ],
+ variants: {
+ disabled: {
+ true: atoms({
+ borderColor: 'foregroundSecondary',
+ cursor: 'not-allowed',
+ }),
+ },
+ droppable: {
+ true: style({
+ borderStyle: 'dashed',
+ }),
+ },
+ focused: {
+ true: atoms({
+ borderColor: 'accent',
+ }),
+ false: atoms({
+ borderColor: 'foregroundSecondary',
+ }),
+ },
+ },
+})
+
+export const label = recipe({
+ base: atoms({
+ alignItems: 'center',
+ display: 'flex',
+ cursor: 'pointer',
+ flexDirection: 'column',
+ gap: '5',
+ width: 'full',
+ }),
+ variants: {
+ compact: {
+ true: atoms({
+ flexDirection: 'row',
+ padding: '4',
+ paddingRight: '12',
+ }),
+ false: atoms({
+ padding: '10',
+ }),
+ },
+ disabled: {
+ true: atoms({
+ cursor: 'not-allowed',
+ }),
+ },
+ },
+ defaultVariants: {
+ compact: false,
+ },
+})
+
+export const preview = recipe({
+ base: atoms({
+ alignItems: 'center',
+ backgroundColor: 'foregroundTertiary',
+ borderRadius: 'large',
+ color: 'textTertiary',
+ display: 'flex',
+ flexDirection: 'column',
+ justifyContent: 'center',
+ overflow: 'hidden',
+ position: 'relative',
+ }),
+ variants: {
+ compact: {
+ true: atoms({
+ height: '16',
+ minWidth: '16',
+ }),
+ false: atoms({
+ height: '32',
+ width: '32',
+ }),
+ },
+ },
+ defaultVariants: {
+ compact: false,
+ },
+})
+
+export const content = recipe({
+ base: atoms({
+ display: 'flex',
+ flexDirection: 'column',
+ }),
+ variants: {
+ compact: {
+ true: atoms({
+ alignItems: 'flex-start',
+ gap: '1.5',
+ textAlign: 'left',
+ }),
+ false: atoms({
+ alignItems: 'center',
+ gap: '4',
+ textAlign: 'center',
+ }),
+ },
+ },
+ defaultVariants: {
+ compact: false,
+ },
+})
+
+export const cover = style([
+ atoms({
+ backgroundColor: 'background',
+ minHeight: 'full',
+ minWidth: 'full',
+ }),
+ style({
+ objectFit: 'cover',
+ objectPosition: 'center',
+ }),
+])
+
+export const removeButton = style({
+ background: `linear-gradient(0deg, ${rgb(
+ vars.mode.colors.background,
+ '0.8',
+ )}, ${rgb(vars.mode.colors.background, '0.8')}), ${rgb(
+ vars.mode.colors.foreground,
+ '0.075',
+ )}`,
+ backdropFilter: 'blur(4px)',
+ color: rgb(vars.mode.colors.foreground, '0.4'),
+})
diff --git a/components/src/components/Range/Range.docs.mdx b/components/src/components/Range/Range.docs.mdx
new file mode 100644
index 0000000..0772bdf
--- /dev/null
+++ b/components/src/components/Range/Range.docs.mdx
@@ -0,0 +1,16 @@
+---
+title: Range
+description: A native element
+---
+
+```tsx
+import { Range } from 'degen'
+```
+
+```tsx live=true expand=true
+
+```
+
+## Props
+
+
diff --git a/components/src/components/Range/Range.snippets.tsx b/components/src/components/Range/Range.snippets.tsx
new file mode 100644
index 0000000..f7ad458
--- /dev/null
+++ b/components/src/components/Range/Range.snippets.tsx
@@ -0,0 +1,11 @@
+import * as React from 'react'
+
+import { Snippet } from '!/playroom/src/types'
+import { Range } from './Range'
+
+export const snippets: Snippet[] = [
+ {
+ name: 'Basic',
+ code: ,
+ },
+]
diff --git a/components/src/components/Range/Range.test.tsx b/components/src/components/Range/Range.test.tsx
new file mode 100644
index 0000000..6949778
--- /dev/null
+++ b/components/src/components/Range/Range.test.tsx
@@ -0,0 +1,13 @@
+import * as React from 'react'
+
+import { cleanup, render } from '@/test'
+
+import { Range } from './Range'
+
+describe('', () => {
+ afterEach(cleanup)
+
+ it('renders', () => {
+ render()
+ })
+})
diff --git a/components/src/components/Range/Range.tsx b/components/src/components/Range/Range.tsx
new file mode 100644
index 0000000..17e77ec
--- /dev/null
+++ b/components/src/components/Range/Range.tsx
@@ -0,0 +1,66 @@
+import * as React from 'react'
+
+import { Box, BoxProps } from '../Box'
+import * as styles from './styles.css'
+
+type Props = Pick<
+ BoxProps,
+ | 'marginX'
+ | 'marginY'
+ | 'width'
+ | 'flex'
+ | 'flexBasis'
+ | 'flexGrow'
+ | 'flexShrink'
+> &
+ React.InputHTMLAttributes
+
+export const Range = React.forwardRef(
+ (
+ {
+ width = 'full',
+ marginX = '0',
+ marginY = '0',
+ step,
+ min,
+ max,
+ value,
+ onChange,
+ form,
+ name,
+ disabled,
+ flex,
+ flexBasis,
+ flexGrow,
+ flexShrink,
+ }: Props,
+ ref: React.Ref,
+ ) => {
+ return (
+
+ )
+ },
+)
+
+Range.displayName = 'Range'
diff --git a/components/src/components/Range/index.ts b/components/src/components/Range/index.ts
new file mode 100644
index 0000000..e947221
--- /dev/null
+++ b/components/src/components/Range/index.ts
@@ -0,0 +1 @@
+export { Range } from './Range'
diff --git a/components/src/components/Range/styles.css.ts b/components/src/components/Range/styles.css.ts
new file mode 100644
index 0000000..2417a72
--- /dev/null
+++ b/components/src/components/Range/styles.css.ts
@@ -0,0 +1,74 @@
+import {
+ StyleRule,
+ assignVars,
+ createThemeContract,
+ style,
+} from '@vanilla-extract/css'
+import { calc } from '@vanilla-extract/css-utils'
+
+import { vars as globalVars } from '../../css'
+
+/**
+ * Tested on Chrome, Safari, Firefox
+ * All input styling techniques derived from:
+ * https://css-tricks.com/styling-cross-browser-compatible-range-inputs-css/
+ */
+
+const vars = createThemeContract({
+ trackHeight: null,
+ thumbSize: null,
+})
+
+const track: StyleRule = {
+ width: globalVars.space.full,
+ height: vars.trackHeight,
+ background: globalVars.colors.foregroundSecondary,
+ borderRadius: globalVars.radii.full,
+}
+
+const thumb: StyleRule = {
+ borderRadius: globalVars.radii.full,
+ height: vars.thumbSize,
+ width: vars.thumbSize,
+ background: globalVars.colors.accent,
+ cursor: 'pointer',
+}
+
+export const range = style({
+ vars: assignVars(vars, {
+ trackHeight: globalVars.space['0.5'],
+ thumbSize: globalVars.space[6],
+ }),
+
+ WebkitAppearance: 'none',
+ appearance: 'none',
+ height: vars.thumbSize,
+ background: 'none',
+
+ // Track styles
+
+ '::-webkit-slider-runnable-track': {
+ ...track,
+ },
+
+ '::-moz-range-track': {
+ ...track,
+ },
+
+ // Thumb styles and browser-specific overrides
+
+ '::-webkit-slider-thumb': {
+ ...thumb,
+ WebkitAppearance: 'none',
+ marginTop: calc(vars.trackHeight)
+ .subtract(vars.thumbSize)
+ .divide(2)
+ .toString(), // Centers thumb on webkit
+ boxShadow: 'none', // iOS
+ },
+
+ '::-moz-range-thumb': {
+ ...thumb,
+ borderWidth: 0,
+ },
+})
diff --git a/packages/components/src/components/Skeleton/Skeleton.docs.mdx b/components/src/components/Skeleton/Skeleton.docs.mdx
similarity index 82%
rename from packages/components/src/components/Skeleton/Skeleton.docs.mdx
rename to components/src/components/Skeleton/Skeleton.docs.mdx
index 5580053..e384c4d 100644
--- a/packages/components/src/components/Skeleton/Skeleton.docs.mdx
+++ b/components/src/components/Skeleton/Skeleton.docs.mdx
@@ -4,7 +4,7 @@ description: Loading placeholder
---
```tsx
-import { Skeleton } from '@disco3/components';
+import { Skeleton } from 'degen'
```
```tsx expand=true live=true
@@ -17,9 +17,7 @@ import { Skeleton } from '@disco3/components';
## Wrap content
-Can wrap content and the container will automatically resize. Check out
-[`SkeletonGroup`](/components/SkeletonGroup) if you want to manage multiple
-skeletons with a single `loading` prop.
+Can wrap content and the container will automatically resize. Check out [`SkeletonGroup`](/components/SkeletonGroup) if you want to manage multiple skeletons with a single `loading` prop.
```tsx live=true
diff --git a/components/src/components/Skeleton/Skeleton.snippets.tsx b/components/src/components/Skeleton/Skeleton.snippets.tsx
new file mode 100644
index 0000000..7f67683
--- /dev/null
+++ b/components/src/components/Skeleton/Skeleton.snippets.tsx
@@ -0,0 +1,11 @@
+import * as React from 'react'
+
+import { Snippet } from '!/playroom/src/types'
+import { Skeleton } from './Skeleton'
+
+export const snippets: Snippet[] = [
+ {
+ name: 'Basic',
+ code: _,
+ },
+]
diff --git a/components/src/components/Skeleton/Skeleton.test.tsx b/components/src/components/Skeleton/Skeleton.test.tsx
new file mode 100644
index 0000000..191145d
--- /dev/null
+++ b/components/src/components/Skeleton/Skeleton.test.tsx
@@ -0,0 +1,14 @@
+import * as React from 'react'
+
+import { cleanup, render, screen } from '@/test'
+
+import { Skeleton } from './Skeleton'
+
+describe('', () => {
+ afterEach(cleanup)
+
+ it('renders', () => {
+ render(foo bar baz)
+ expect(screen.getByText(/foo/i)).toBeInTheDocument()
+ })
+})
diff --git a/packages/components/src/components/Skeleton/Skeleton.tsx b/components/src/components/Skeleton/Skeleton.tsx
similarity index 53%
rename from packages/components/src/components/Skeleton/Skeleton.tsx
rename to components/src/components/Skeleton/Skeleton.tsx
index d46e5e0..df656d5 100644
--- a/packages/components/src/components/Skeleton/Skeleton.tsx
+++ b/components/src/components/Skeleton/Skeleton.tsx
@@ -1,18 +1,18 @@
-import * as React from 'react';
+import * as React from 'react'
-import { Box, BoxProps } from '../Box';
-import { Context } from '../SkeletonGroup';
-import * as styles from './styles.css';
+import { Box, BoxProps } from '../Box'
+import { Context } from '../SkeletonGroup'
+import * as styles from './styles.css'
type Props = {
- as?: 'div' | 'span';
- backgroundColor?: BoxProps['backgroundColor'];
- radius?: BoxProps['borderRadius'];
- height?: BoxProps['height'];
- loading?: boolean;
- maxWidth?: BoxProps['maxWidth'];
- width?: BoxProps['width'];
-};
+ as?: 'div' | 'span'
+ backgroundColor?: BoxProps['backgroundColor']
+ radius?: BoxProps['borderRadius']
+ height?: BoxProps['height']
+ loading?: boolean
+ maxWidth?: BoxProps['maxWidth']
+ width?: BoxProps['width']
+}
export const Skeleton = ({
as,
@@ -24,8 +24,8 @@ export const Skeleton = ({
maxWidth,
width = 'fit',
}: React.PropsWithChildren) => {
- const groupLoading = React.useContext(Context);
- const active = loading ?? groupLoading;
+ const groupLoading = React.useContext(Context)
+ const active = loading ?? groupLoading
const containerProps = active
? {
backgroundColor,
@@ -34,7 +34,7 @@ export const Skeleton = ({
maxWidth,
width,
}
- : {};
+ : {}
return (
- );
-};
+ )
+}
diff --git a/components/src/components/Skeleton/index.ts b/components/src/components/Skeleton/index.ts
new file mode 100644
index 0000000..e42e3eb
--- /dev/null
+++ b/components/src/components/Skeleton/index.ts
@@ -0,0 +1 @@
+export { Skeleton } from './Skeleton'
diff --git a/packages/components/src/components/Skeleton/styles.css.ts b/components/src/components/Skeleton/styles.css.ts
similarity index 51%
rename from packages/components/src/components/Skeleton/styles.css.ts
rename to components/src/components/Skeleton/styles.css.ts
index f4a4f29..0467a07 100644
--- a/packages/components/src/components/Skeleton/styles.css.ts
+++ b/components/src/components/Skeleton/styles.css.ts
@@ -1,5 +1,5 @@
-import { style } from '@vanilla-extract/css';
+import { style } from '@vanilla-extract/css'
export const root = style({
visibility: 'hidden',
-});
+})
diff --git a/packages/components/src/components/SkeletonGroup/SkeletonGroup.docs.mdx b/components/src/components/SkeletonGroup/SkeletonGroup.docs.mdx
similarity index 92%
rename from packages/components/src/components/SkeletonGroup/SkeletonGroup.docs.mdx
rename to components/src/components/SkeletonGroup/SkeletonGroup.docs.mdx
index 070bf2d..c7f784b 100644
--- a/packages/components/src/components/SkeletonGroup/SkeletonGroup.docs.mdx
+++ b/components/src/components/SkeletonGroup/SkeletonGroup.docs.mdx
@@ -4,7 +4,7 @@ description: Manages loading state for multiple skeletons
---
```tsx
-import { SkeletonGroup } from '@disco3/components';
+import { SkeletonGroup } from 'degen'
```
```tsx expand=true live=true
diff --git a/components/src/components/SkeletonGroup/SkeletonGroup.snippets.tsx b/components/src/components/SkeletonGroup/SkeletonGroup.snippets.tsx
new file mode 100644
index 0000000..716c9de
--- /dev/null
+++ b/components/src/components/SkeletonGroup/SkeletonGroup.snippets.tsx
@@ -0,0 +1,16 @@
+import * as React from 'react'
+
+import { Snippet } from '!/playroom/src/types'
+import { Skeleton } from '../Skeleton'
+import { SkeletonGroup } from './SkeletonGroup'
+
+export const snippets: Snippet[] = [
+ {
+ name: 'Basic',
+ code: (
+
+ _
+
+ ),
+ },
+]
diff --git a/components/src/components/SkeletonGroup/SkeletonGroup.test.tsx b/components/src/components/SkeletonGroup/SkeletonGroup.test.tsx
new file mode 100644
index 0000000..d731922
--- /dev/null
+++ b/components/src/components/SkeletonGroup/SkeletonGroup.test.tsx
@@ -0,0 +1,20 @@
+import * as React from 'react'
+
+import { cleanup, render, screen } from '@/test'
+
+import { Skeleton } from '../Skeleton'
+import { SkeletonGroup } from './SkeletonGroup'
+
+describe('', () => {
+ afterEach(cleanup)
+
+ it('renders', () => {
+ render(
+
+ foo bar baz
+ quick brown fox
+ ,
+ )
+ expect(screen.getByText(/foo/i)).toBeInTheDocument()
+ })
+})
diff --git a/packages/components/src/components/SkeletonGroup/SkeletonGroup.tsx b/components/src/components/SkeletonGroup/SkeletonGroup.tsx
similarity index 56%
rename from packages/components/src/components/SkeletonGroup/SkeletonGroup.tsx
rename to components/src/components/SkeletonGroup/SkeletonGroup.tsx
index d125b20..9de628d 100644
--- a/packages/components/src/components/SkeletonGroup/SkeletonGroup.tsx
+++ b/components/src/components/SkeletonGroup/SkeletonGroup.tsx
@@ -1,14 +1,14 @@
-import * as React from 'react';
+import * as React from 'react'
-import { ReactNodeNoStrings } from '../../types';
+import { ReactNodeNoStrings } from '../../types'
type Props = {
- children: ReactNodeNoStrings;
- loading?: boolean;
-};
+ children: ReactNodeNoStrings
+ loading?: boolean
+}
-export const Context = React.createContext(undefined);
+export const Context = React.createContext(undefined)
export const SkeletonGroup = ({ children, loading }: Props) => {
- return {children};
-};
+ return {children}
+}
diff --git a/components/src/components/SkeletonGroup/index.ts b/components/src/components/SkeletonGroup/index.ts
new file mode 100644
index 0000000..a3d1a13
--- /dev/null
+++ b/components/src/components/SkeletonGroup/index.ts
@@ -0,0 +1 @@
+export { SkeletonGroup, Context } from './SkeletonGroup'
diff --git a/packages/components/src/components/Spinner/Spinner.docs.mdx b/components/src/components/Spinner/Spinner.docs.mdx
similarity index 91%
rename from packages/components/src/components/Spinner/Spinner.docs.mdx
rename to components/src/components/Spinner/Spinner.docs.mdx
index b3a2aa2..4f557bb 100644
--- a/packages/components/src/components/Spinner/Spinner.docs.mdx
+++ b/components/src/components/Spinner/Spinner.docs.mdx
@@ -4,7 +4,7 @@ description: Loading spinner
---
```tsx
-import { Spinner } from '@disco3/components';
+import { Spinner } from 'degen'
```
```tsx expand=true live=true
diff --git a/components/src/components/Spinner/Spinner.snippets.tsx b/components/src/components/Spinner/Spinner.snippets.tsx
new file mode 100644
index 0000000..8b2a9c0
--- /dev/null
+++ b/components/src/components/Spinner/Spinner.snippets.tsx
@@ -0,0 +1,11 @@
+import * as React from 'react'
+
+import { Snippet } from '!/playroom/src/types'
+import { Spinner } from './Spinner'
+
+export const snippets: Snippet[] = [
+ {
+ name: 'Basic',
+ code: ,
+ },
+]
diff --git a/components/src/components/Spinner/Spinner.test.tsx b/components/src/components/Spinner/Spinner.test.tsx
new file mode 100644
index 0000000..6e327ab
--- /dev/null
+++ b/components/src/components/Spinner/Spinner.test.tsx
@@ -0,0 +1,14 @@
+import * as React from 'react'
+
+import { cleanup, render, screen } from '@/test'
+
+import { Spinner } from './Spinner'
+
+describe('', () => {
+ afterEach(cleanup)
+
+ it('renders', () => {
+ render()
+ expect(screen.getByText(/loading/i)).toBeInTheDocument()
+ })
+})
diff --git a/packages/components/src/components/Spinner/Spinner.tsx b/components/src/components/Spinner/Spinner.tsx
similarity index 74%
rename from packages/components/src/components/Spinner/Spinner.tsx
rename to components/src/components/Spinner/Spinner.tsx
index 5a28854..e4fab33 100644
--- a/packages/components/src/components/Spinner/Spinner.tsx
+++ b/components/src/components/Spinner/Spinner.tsx
@@ -1,13 +1,13 @@
-import * as React from 'react';
+import * as React from 'react'
-import { Box, BoxProps } from '../Box';
-import { VisuallyHidden } from '../VisuallyHidden';
-import * as styles from './styles.css';
+import { Box, BoxProps } from '../Box'
+import { VisuallyHidden } from '../VisuallyHidden'
+import * as styles from './styles.css'
type Props = {
- accessibilityLabel?: string;
- color?: BoxProps['color'];
-} & styles.Variants;
+ accessibilityLabel?: string
+ color?: BoxProps['color']
+} & styles.Variants
export const Spinner = React.forwardRef(
(
@@ -38,8 +38,8 @@ export const Spinner = React.forwardRef(
/>
- );
+ )
},
-);
+)
-Spinner.displayName = 'Spinner';
+Spinner.displayName = 'Spinner'
diff --git a/components/src/components/Spinner/index.ts b/components/src/components/Spinner/index.ts
new file mode 100644
index 0000000..fbf16c1
--- /dev/null
+++ b/components/src/components/Spinner/index.ts
@@ -0,0 +1 @@
+export { Spinner } from './Spinner'
diff --git a/packages/components/src/components/Spinner/styles.css.ts b/components/src/components/Spinner/styles.css.ts
similarity index 76%
rename from packages/components/src/components/Spinner/styles.css.ts
rename to components/src/components/Spinner/styles.css.ts
index 45cba71..7e55239 100644
--- a/packages/components/src/components/Spinner/styles.css.ts
+++ b/components/src/components/Spinner/styles.css.ts
@@ -1,11 +1,11 @@
-import { RecipeVariants, recipe } from '@vanilla-extract/recipes';
-import { keyframes, style } from '@vanilla-extract/css';
+import { RecipeVariants, recipe } from '@vanilla-extract/recipes'
+import { keyframes, style } from '@vanilla-extract/css'
-import { atoms, motionSafe, vars } from '../../css';
+import { atoms, motionSafe, vars } from '../../css'
const rotate = keyframes({
'100%': { transform: 'rotate(1turn)' },
-});
+})
export const variants = recipe({
base: [
@@ -30,6 +30,6 @@ export const variants = recipe({
}),
},
},
-});
+})
-export type Variants = RecipeVariants;
+export type Variants = RecipeVariants
diff --git a/packages/components/src/components/Stack/Stack.docs.mdx b/components/src/components/Stack/Stack.docs.mdx
similarity index 98%
rename from packages/components/src/components/Stack/Stack.docs.mdx
rename to components/src/components/Stack/Stack.docs.mdx
index a186342..9cc46fd 100644
--- a/packages/components/src/components/Stack/Stack.docs.mdx
+++ b/components/src/components/Stack/Stack.docs.mdx
@@ -4,7 +4,7 @@ description: Layout for elements
---
```tsx
-import { Stack } from '@disco3/components';
+import { Stack } from 'degen'
```
```tsx expand=true live=true
diff --git a/packages/components/src/components/Stack/Stack.snippets.tsx b/components/src/components/Stack/Stack.snippets.tsx
similarity index 53%
rename from packages/components/src/components/Stack/Stack.snippets.tsx
rename to components/src/components/Stack/Stack.snippets.tsx
index 666b470..32b0686 100644
--- a/packages/components/src/components/Stack/Stack.snippets.tsx
+++ b/components/src/components/Stack/Stack.snippets.tsx
@@ -1,7 +1,7 @@
-import * as React from 'react';
+import * as React from 'react'
-import { Snippet } from '!/playroom/src/types';
-import { Stack } from './Stack';
+import { Snippet } from '!/playroom/src/types'
+import { Stack } from './Stack'
export const snippets: Snippet[] = [
{
@@ -12,4 +12,4 @@ export const snippets: Snippet[] = [
),
},
-];
+]
diff --git a/components/src/components/Stack/Stack.test.tsx b/components/src/components/Stack/Stack.test.tsx
new file mode 100644
index 0000000..45c1c94
--- /dev/null
+++ b/components/src/components/Stack/Stack.test.tsx
@@ -0,0 +1,19 @@
+import * as React from 'react'
+
+import { cleanup, render, screen } from '@/test'
+
+import { Box } from '../Box'
+import { Stack } from './Stack'
+
+describe('', () => {
+ afterEach(cleanup)
+
+ it('renders', () => {
+ render(
+
+ foo bar baz
+ ,
+ )
+ expect(screen.getByText(/foo/i)).toBeInTheDocument()
+ })
+})
diff --git a/packages/components/src/components/Stack/Stack.tsx b/components/src/components/Stack/Stack.tsx
similarity index 54%
rename from packages/components/src/components/Stack/Stack.tsx
rename to components/src/components/Stack/Stack.tsx
index f2a537c..11de6dd 100644
--- a/packages/components/src/components/Stack/Stack.tsx
+++ b/components/src/components/Stack/Stack.tsx
@@ -1,9 +1,9 @@
-import * as React from 'react';
+import * as React from 'react'
-import { OptionalResponsiveObject, OptionalResponsiveValue } from '../../css';
-import { ReactNodeNoStrings } from '../../types';
-import { Box, BoxProps } from '../Box';
-import { Direction, directionToFlexDirection, wrapToFlexWrap } from './utils';
+import { OptionalResponsiveObject, OptionalResponsiveValue } from '../../css'
+import { ReactNodeNoStrings } from '../../types'
+import { Box, BoxProps } from '../Box'
+import { Direction, directionToFlexDirection, wrapToFlexWrap } from './utils'
export const validStackComponents = [
'a',
@@ -16,18 +16,18 @@ export const validStackComponents = [
'main',
'section',
'span',
-] as const;
+] as const
type Props = {
- as?: typeof validStackComponents[number];
- align?: BoxProps['alignItems'];
- children: ReactNodeNoStrings;
- direction?: OptionalResponsiveValue;
- flex?: BoxProps['flex'];
- justify?: BoxProps['justifyContent'];
- space?: BoxProps['gap'];
- wrap?: OptionalResponsiveObject;
-};
+ as?: typeof validStackComponents[number]
+ align?: BoxProps['alignItems']
+ children: ReactNodeNoStrings
+ direction?: OptionalResponsiveValue
+ flex?: BoxProps['flex']
+ justify?: BoxProps['justifyContent']
+ space?: BoxProps['gap']
+ wrap?: OptionalResponsiveObject
+}
export const Stack = ({
as = 'div',
@@ -39,8 +39,8 @@ export const Stack = ({
space = '4',
wrap,
}: React.PropsWithChildren) => {
- const flexDirection = directionToFlexDirection(direction);
- const flexWrap = wrapToFlexWrap(wrap);
+ const flexDirection = directionToFlexDirection(direction)
+ const flexWrap = wrapToFlexWrap(wrap)
return (
{children}
- );
-};
+ )
+}
diff --git a/components/src/components/Stack/index.ts b/components/src/components/Stack/index.ts
new file mode 100644
index 0000000..f0536fb
--- /dev/null
+++ b/components/src/components/Stack/index.ts
@@ -0,0 +1 @@
+export { Stack } from './Stack'
diff --git a/packages/components/src/components/Stack/utils.test.ts b/components/src/components/Stack/utils.test.ts
similarity index 93%
rename from packages/components/src/components/Stack/utils.test.ts
rename to components/src/components/Stack/utils.test.ts
index 8f82bd5..b40b656 100644
--- a/packages/components/src/components/Stack/utils.test.ts
+++ b/components/src/components/Stack/utils.test.ts
@@ -1,4 +1,4 @@
-import { directionToFlexDirection, wrapToFlexWrap } from './utils';
+import { directionToFlexDirection, wrapToFlexWrap } from './utils'
describe.each`
direction | expected
@@ -10,9 +10,9 @@ describe.each`
${undefined} | ${undefined}
`('directionToFlexDirection($direction)', ({ direction, expected }) => {
it(`returns ${JSON.stringify(expected)}`, () => {
- expect(directionToFlexDirection(direction)).toEqual(expected);
- });
-});
+ expect(directionToFlexDirection(direction)).toEqual(expected)
+ })
+})
describe.each`
wrap | expected
@@ -24,6 +24,6 @@ describe.each`
${undefined} | ${undefined}
`('wrapToFlexWrap($wrap)', ({ wrap, expected }) => {
it(`returns ${JSON.stringify(expected)}`, () => {
- expect(wrapToFlexWrap(wrap)).toEqual(expected);
- });
-});
+ expect(wrapToFlexWrap(wrap)).toEqual(expected)
+ })
+})
diff --git a/packages/components/src/components/Stack/utils.ts b/components/src/components/Stack/utils.ts
similarity index 85%
rename from packages/components/src/components/Stack/utils.ts
rename to components/src/components/Stack/utils.ts
index cd2215d..e0fb00a 100644
--- a/packages/components/src/components/Stack/utils.ts
+++ b/components/src/components/Stack/utils.ts
@@ -2,13 +2,13 @@ import {
OptionalResponsiveObject,
OptionalResponsiveValue,
mapResponsiveValue,
-} from '../../css';
-export type Direction = 'horizontal' | 'vertical';
+} from '../../css'
+export type Direction = 'horizontal' | 'vertical'
const directionToFlexDirectionLookup = {
horizontal: 'row',
vertical: 'column',
-} as const;
+} as const
export const directionToFlexDirection = (
direction: OptionalResponsiveValue | undefined,
@@ -18,14 +18,14 @@ export const directionToFlexDirection = (
direction,
(value) => directionToFlexDirectionLookup[value],
)
- : undefined;
+ : undefined
-type Wrap = 1 | 0;
+type Wrap = 1 | 0
const wrapToFlexWrapLookup = {
1: 'wrap',
0: 'nowrap',
-} as const;
+} as const
export const wrapToFlexWrap = (
wrap: OptionalResponsiveObject | undefined,
@@ -39,4 +39,4 @@ export const wrapToFlexWrap = (
// boolean responsive keys
(value) => wrapToFlexWrapLookup[+value as Wrap],
)
- : undefined;
+ : undefined
diff --git a/packages/components/src/components/Stat/Stat.docs.mdx b/components/src/components/Stat/Stat.docs.mdx
similarity index 95%
rename from packages/components/src/components/Stat/Stat.docs.mdx
rename to components/src/components/Stat/Stat.docs.mdx
index 2821dc6..33124d4 100644
--- a/packages/components/src/components/Stat/Stat.docs.mdx
+++ b/components/src/components/Stat/Stat.docs.mdx
@@ -4,7 +4,7 @@ description: Display a label, value, and sub-value
---
```tsx
-import { Stat } from '@disco3/components';
+import { Stat } from 'degen'
```
```tsx live=true expand=true
diff --git a/packages/components/src/components/Stat/Stat.snippets.tsx b/components/src/components/Stat/Stat.snippets.tsx
similarity index 59%
rename from packages/components/src/components/Stat/Stat.snippets.tsx
rename to components/src/components/Stat/Stat.snippets.tsx
index 2cbbc33..c851a44 100644
--- a/packages/components/src/components/Stat/Stat.snippets.tsx
+++ b/components/src/components/Stat/Stat.snippets.tsx
@@ -1,7 +1,7 @@
-import * as React from 'react';
+import * as React from 'react'
-import { Snippet } from '!/playroom/src/types';
-import { Stat } from './Stat';
+import { Snippet } from '!/playroom/src/types'
+import { Stat } from './Stat'
export const snippets: Snippet[] = [
{
@@ -10,4 +10,4 @@ export const snippets: Snippet[] = [
),
},
-];
+]
diff --git a/packages/components/src/components/Stat/Stat.test.tsx b/components/src/components/Stat/Stat.test.tsx
similarity index 50%
rename from packages/components/src/components/Stat/Stat.test.tsx
rename to components/src/components/Stat/Stat.test.tsx
index 76abe7b..13b4c42 100644
--- a/packages/components/src/components/Stat/Stat.test.tsx
+++ b/components/src/components/Stat/Stat.test.tsx
@@ -1,15 +1,15 @@
-import * as React from 'react';
+import * as React from 'react'
-import { cleanup, render } from '@/test';
+import { cleanup, render } from '@/test'
-import { Stat } from './Stat';
+import { Stat } from './Stat'
describe('', () => {
- afterEach(cleanup);
+ afterEach(cleanup)
it('renders', () => {
render(
,
- );
- });
-});
+ )
+ })
+})
diff --git a/packages/components/src/components/Stat/Stat.tsx b/components/src/components/Stat/Stat.tsx
similarity index 59%
rename from packages/components/src/components/Stat/Stat.tsx
rename to components/src/components/Stat/Stat.tsx
index 54dc5f1..88364ec 100644
--- a/packages/components/src/components/Stat/Stat.tsx
+++ b/components/src/components/Stat/Stat.tsx
@@ -1,15 +1,15 @@
-import * as React from 'react';
+import * as React from 'react'
-import { Heading } from '../Heading';
-import { Stack } from '../Stack';
-import { Text } from '../Text';
+import { Heading } from '../Heading'
+import { Stack } from '../Stack'
+import { Text } from '../Text'
type Props = {
- label: React.ReactNode;
- meta?: React.ReactNode;
- size?: 'small' | 'medium';
- value: React.ReactNode;
-};
+ label: React.ReactNode
+ meta?: React.ReactNode
+ size?: 'small' | 'medium'
+ value: React.ReactNode
+}
export const Stat = ({ label, meta, size = 'medium', value }: Props) => {
return (
@@ -20,11 +20,11 @@ export const Stat = ({ label, meta, size = 'medium', value }: Props) => {
{value}
) : (
-
+
{value}
)}
{meta !== undefined && {meta}}
- );
-};
+ )
+}
diff --git a/components/src/components/Stat/index.ts b/components/src/components/Stat/index.ts
new file mode 100644
index 0000000..7811bc7
--- /dev/null
+++ b/components/src/components/Stat/index.ts
@@ -0,0 +1 @@
+export { Stat } from './Stat'
diff --git a/packages/components/src/components/Tag/Tag.docs.mdx b/components/src/components/Tag/Tag.docs.mdx
similarity index 91%
rename from packages/components/src/components/Tag/Tag.docs.mdx
rename to components/src/components/Tag/Tag.docs.mdx
index fcf26a8..a16b128 100644
--- a/packages/components/src/components/Tag/Tag.docs.mdx
+++ b/components/src/components/Tag/Tag.docs.mdx
@@ -4,11 +4,11 @@ description: Indicator with optional label.
---
```tsx
-import { Tag } from '@disco3/components';
+import { Tag } from 'degen'
```
```tsx live=true expand=true
-100 $FOLD
+100 $WRITE
```
## Props
diff --git a/components/src/components/Tag/Tag.snippets.tsx b/components/src/components/Tag/Tag.snippets.tsx
new file mode 100644
index 0000000..c00f1a7
--- /dev/null
+++ b/components/src/components/Tag/Tag.snippets.tsx
@@ -0,0 +1,11 @@
+import * as React from 'react'
+
+import { Snippet } from '!/playroom/src/types'
+import { Tag } from './Tag'
+
+export const snippets: Snippet[] = [
+ {
+ name: 'Basic',
+ code: Tag,
+ },
+]
diff --git a/components/src/components/Tag/Tag.test.tsx b/components/src/components/Tag/Tag.test.tsx
new file mode 100644
index 0000000..390ae31
--- /dev/null
+++ b/components/src/components/Tag/Tag.test.tsx
@@ -0,0 +1,14 @@
+import * as React from 'react'
+
+import { cleanup, render, screen } from '@/test'
+
+import { Tag } from './Tag'
+
+describe('', () => {
+ afterEach(cleanup)
+
+ it('renders', () => {
+ render(10 ETH)
+ expect(screen.getByText(/eth/i)).toBeInTheDocument()
+ })
+})
diff --git a/packages/components/src/components/Tag/Tag.tsx b/components/src/components/Tag/Tag.tsx
similarity index 79%
rename from packages/components/src/components/Tag/Tag.tsx
rename to components/src/components/Tag/Tag.tsx
index adec6cb..b62d047 100644
--- a/packages/components/src/components/Tag/Tag.tsx
+++ b/components/src/components/Tag/Tag.tsx
@@ -1,12 +1,12 @@
-import * as React from 'react';
+import * as React from 'react'
-import { Box } from '../Box';
-import * as styles from './styles.css';
+import { Box } from '../Box'
+import * as styles from './styles.css'
export type Props = {
- as?: 'div' | 'span';
- label?: string;
-} & styles.Variants;
+ as?: 'div' | 'span'
+ label?: string
+} & styles.Variants
export const Tag = ({
as = 'div',
@@ -39,5 +39,5 @@ export const Tag = ({
{children}
- );
-};
+ )
+}
diff --git a/components/src/components/Tag/index.ts b/components/src/components/Tag/index.ts
new file mode 100644
index 0000000..e74ecce
--- /dev/null
+++ b/components/src/components/Tag/index.ts
@@ -0,0 +1,2 @@
+export { Tag } from './Tag'
+export type { Props as TagProps } from './Tag'
diff --git a/packages/components/src/components/Tag/styles.css.ts b/components/src/components/Tag/styles.css.ts
similarity index 85%
rename from packages/components/src/components/Tag/styles.css.ts
rename to components/src/components/Tag/styles.css.ts
index fd57c9f..51b9afd 100644
--- a/packages/components/src/components/Tag/styles.css.ts
+++ b/components/src/components/Tag/styles.css.ts
@@ -1,15 +1,15 @@
-import { style } from '@vanilla-extract/css';
-import { CSSVarFunction } from '@vanilla-extract/private';
-import { RecipeVariants, recipe } from '@vanilla-extract/recipes';
+import { style } from '@vanilla-extract/css'
+import { CSSVarFunction } from '@vanilla-extract/private'
+import { RecipeVariants, recipe } from '@vanilla-extract/recipes'
-import { atoms, rgb, vars } from '../../css';
+import { atoms, rgb, vars } from '../../css'
export const label = style({
boxShadow: `0 0 0 2px ${vars.colors.background}`,
-});
+})
const getToneHoverCompoundVariant = (tone: 'blue' | 'green' | 'red') => {
- const color = vars.mode.colors[tone];
+ const color = vars.mode.colors[tone]
return {
variants: {
hover: true,
@@ -25,11 +25,11 @@ const getToneHoverCompoundVariant = (tone: 'blue' | 'green' | 'red') => {
},
},
},
- };
-};
+ }
+}
const getToneColor = (color: CSSVarFunction) =>
- rgb(color, `calc(${vars.mode.shades.accentSecondary} * 0.5)`);
+ rgb(color, `calc(${vars.mode.shades.accentSecondary} * 0.5)`)
export const variants = recipe({
base: [
@@ -93,6 +93,14 @@ export const variants = recipe({
backgroundColor: getToneColor(vars.mode.colors.red),
}),
]),
+ orange: style([
+ atoms({
+ color: 'orange',
+ }),
+ style({
+ backgroundColor: getToneColor(vars.mode.colors.orange),
+ }),
+ ]),
purple: style([
atoms({
color: 'purple',
@@ -143,6 +151,6 @@ export const variants = recipe({
getToneHoverCompoundVariant('green'),
getToneHoverCompoundVariant('red'),
],
-});
+})
-export type Variants = RecipeVariants;
+export type Variants = RecipeVariants
diff --git a/packages/components/src/components/Text/Text.docs.mdx b/components/src/components/Text/Text.docs.mdx
similarity index 97%
rename from packages/components/src/components/Text/Text.docs.mdx
rename to components/src/components/Text/Text.docs.mdx
index 0e22042..f9a4951 100644
--- a/packages/components/src/components/Text/Text.docs.mdx
+++ b/components/src/components/Text/Text.docs.mdx
@@ -4,7 +4,7 @@ description: Primitive typographic component
---
```tsx
-import { Text } from '@disco3/components';
+import { Text } from 'degen'
```
```tsx expand=true live=true
diff --git a/components/src/components/Text/Text.snippets.tsx b/components/src/components/Text/Text.snippets.tsx
new file mode 100644
index 0000000..8bdb8b5
--- /dev/null
+++ b/components/src/components/Text/Text.snippets.tsx
@@ -0,0 +1,11 @@
+import * as React from 'react'
+
+import { Snippet } from '!/playroom/src/types'
+import { Text } from './Text'
+
+export const snippets: Snippet[] = [
+ {
+ name: 'Basic',
+ code: Text,
+ },
+]
diff --git a/components/src/components/Text/Text.test.tsx b/components/src/components/Text/Text.test.tsx
new file mode 100644
index 0000000..959fb70
--- /dev/null
+++ b/components/src/components/Text/Text.test.tsx
@@ -0,0 +1,14 @@
+import * as React from 'react'
+
+import { cleanup, render, screen } from '@/test'
+
+import { Text } from './Text'
+
+describe('', () => {
+ afterEach(cleanup)
+
+ it('renders', () => {
+ render(foo bar baz)
+ expect(screen.getByText(/foo/i)).toBeInTheDocument()
+ })
+})
diff --git a/packages/components/src/components/Text/Text.tsx b/components/src/components/Text/Text.tsx
similarity index 61%
rename from packages/components/src/components/Text/Text.tsx
rename to components/src/components/Text/Text.tsx
index 3a0da34..6647fb2 100644
--- a/packages/components/src/components/Text/Text.tsx
+++ b/components/src/components/Text/Text.tsx
@@ -1,10 +1,10 @@
-import * as React from 'react';
+import * as React from 'react'
-import { Box, BoxProps } from '../Box';
-import * as styles from './styles.css';
+import { Box, BoxProps } from '../Box'
+import * as styles from './styles.css'
type Props = {
- align?: BoxProps['textAlign'];
+ align?: BoxProps['textAlign']
as?:
| 'code'
| 'div'
@@ -16,17 +16,18 @@ type Props = {
| 'h6'
| 'label'
| 'p'
- | 'span';
- children?: React.ReactNode;
- color?: BoxProps['color'];
- font?: BoxProps['fontFamily'];
- letterSpacing?: BoxProps['letterSpacing'];
- lineHeight?: BoxProps['lineHeight'];
- size?: BoxProps['fontSize'];
- transform?: BoxProps['textTransform'];
- weight?: BoxProps['fontWeight'];
- whiteSpace?: BoxProps['whiteSpace'];
-} & styles.Variants;
+ | 'span'
+ children?: React.ReactNode
+ color?: BoxProps['color']
+ font?: BoxProps['fontFamily']
+ letterSpacing?: BoxProps['letterSpacing']
+ lineHeight?: BoxProps['lineHeight']
+ size?: BoxProps['fontSize']
+ transform?: BoxProps['textTransform']
+ weight?: BoxProps['fontWeight']
+ whiteSpace?: BoxProps['whiteSpace']
+ wordBreak?: BoxProps['wordBreak']
+} & styles.Variants
export const Text = React.forwardRef(
(
@@ -44,6 +45,7 @@ export const Text = React.forwardRef(
variant,
weight,
whiteSpace,
+ wordBreak,
}: Props,
ref: React.Ref,
) => {
@@ -64,11 +66,12 @@ export const Text = React.forwardRef(
textAlign={align}
textTransform={transform}
whiteSpace={whiteSpace}
+ wordBreak={wordBreak}
>
{children}
- );
+ )
},
-);
+)
-Text.displayName = 'Text';
+Text.displayName = 'Text'
diff --git a/components/src/components/Text/index.ts b/components/src/components/Text/index.ts
new file mode 100644
index 0000000..c79f9ee
--- /dev/null
+++ b/components/src/components/Text/index.ts
@@ -0,0 +1 @@
+export { Text } from './Text'
diff --git a/packages/components/src/components/Text/styles.css.ts b/components/src/components/Text/styles.css.ts
similarity index 88%
rename from packages/components/src/components/Text/styles.css.ts
rename to components/src/components/Text/styles.css.ts
index 9df8d39..11dbf6f 100644
--- a/packages/components/src/components/Text/styles.css.ts
+++ b/components/src/components/Text/styles.css.ts
@@ -1,7 +1,7 @@
-import { style } from '@vanilla-extract/css';
-import { RecipeVariants, recipe } from '@vanilla-extract/recipes';
+import { style } from '@vanilla-extract/css'
+import { RecipeVariants, recipe } from '@vanilla-extract/recipes'
-import { atoms } from '../../css';
+import { atoms } from '../../css'
const variant = {
extraLarge: style([
@@ -47,7 +47,7 @@ const variant = {
letterSpacing: '0.03',
textTransform: 'uppercase',
}),
-};
+}
export const variants = recipe({
variants: {
@@ -64,6 +64,6 @@ export const variants = recipe({
]),
},
},
-});
+})
-export type Variants = RecipeVariants;
+export type Variants = RecipeVariants
diff --git a/packages/components/src/components/Textarea/Textarea.docs.mdx b/components/src/components/Textarea/Textarea.docs.mdx
similarity index 53%
rename from packages/components/src/components/Textarea/Textarea.docs.mdx
rename to components/src/components/Textarea/Textarea.docs.mdx
index e46b4d7..1b04ef6 100644
--- a/packages/components/src/components/Textarea/Textarea.docs.mdx
+++ b/components/src/components/Textarea/Textarea.docs.mdx
@@ -4,13 +4,13 @@ description: Surface for accepting multi-line user input
---
```tsx
-import { Textarea } from '@disco3/components';
+import { Textarea } from 'degen'
```
```tsx live=true expand=true
```
@@ -23,8 +23,8 @@ import { Textarea } from '@disco3/components';
```tsx live=true
```
@@ -33,8 +33,8 @@ import { Textarea } from '@disco3/components';
```tsx live=true
```
@@ -43,8 +43,8 @@ import { Textarea } from '@disco3/components';
```tsx live=true
```
@@ -53,7 +53,7 @@ import { Textarea } from '@disco3/components';
```tsx live=true
```
diff --git a/components/src/components/Textarea/Textarea.snippets.tsx b/components/src/components/Textarea/Textarea.snippets.tsx
new file mode 100644
index 0000000..26ea772
--- /dev/null
+++ b/components/src/components/Textarea/Textarea.snippets.tsx
@@ -0,0 +1,11 @@
+import * as React from 'react'
+
+import { Snippet } from '!/playroom/src/types'
+import { Textarea } from './Textarea'
+
+export const snippets: Snippet[] = [
+ {
+ name: 'Basic',
+ code: ,
+ },
+]
diff --git a/components/src/components/Textarea/Textarea.test.tsx b/components/src/components/Textarea/Textarea.test.tsx
new file mode 100644
index 0000000..882038d
--- /dev/null
+++ b/components/src/components/Textarea/Textarea.test.tsx
@@ -0,0 +1,33 @@
+import * as React from 'react'
+
+import { cleanup, render, screen, userEvent } from '@/test'
+
+import { Textarea } from './Textarea'
+
+describe('', () => {
+ afterEach(cleanup)
+
+ it('renders', () => {
+ render()
+ expect(screen.getByRole('textbox')).toBeInTheDocument()
+ })
+
+ it('receives user input', () => {
+ render()
+
+ userEvent.type(screen.getByRole('textbox'), 'I love writing and crypto.')
+ expect(screen.getByRole('textbox')).toHaveValue(
+ 'I love writing and crypto.',
+ )
+ })
+
+ it('maxLength', () => {
+ render(
+ ,
+ )
+
+ const element = screen.getByLabelText(/why/i)
+ userEvent.type(element, 'I love writing and crypto.')
+ expect(element).toHaveValue('I love writing')
+ })
+})
diff --git a/packages/components/src/components/Textarea/Textarea.tsx b/components/src/components/Textarea/Textarea.tsx
similarity index 63%
rename from packages/components/src/components/Textarea/Textarea.tsx
rename to components/src/components/Textarea/Textarea.tsx
index 5a0875f..51475a3 100644
--- a/packages/components/src/components/Textarea/Textarea.tsx
+++ b/components/src/components/Textarea/Textarea.tsx
@@ -1,29 +1,29 @@
-import * as React from 'react';
+import * as React from 'react'
-import { Box } from '../Box';
-import { Field, FieldBaseProps } from '../Field';
-import * as styles from './styles.css';
+import { Box } from '../Box'
+import { Field, FieldBaseProps } from '../Field'
+import * as styles from './styles.css'
-type NativeTextareaProps = React.AllHTMLAttributes;
+type NativeTextareaProps = React.AllHTMLAttributes
type Props = FieldBaseProps & {
- autoCorrect?: NativeTextareaProps['autoCorrect'];
- autoFocus?: NativeTextareaProps['autoFocus'];
- defaultValue?: string | number;
- disabled?: boolean;
- id?: NativeTextareaProps['id'];
- name?: string;
- maxLength?: NativeTextareaProps['maxLength'];
- placeholder?: NativeTextareaProps['placeholder'];
- readOnly?: NativeTextareaProps['readOnly'];
- rows?: NativeTextareaProps['rows'];
- spellCheck?: NativeTextareaProps['spellCheck'];
- tabIndex?: NativeTextareaProps['tabIndex'];
- value?: string | number;
- onChange?: React.EventHandler>;
- onBlur?: NativeTextareaProps['onBlur'];
- onFocus?: NativeTextareaProps['onFocus'];
-};
+ autoCorrect?: NativeTextareaProps['autoCorrect']
+ autoFocus?: NativeTextareaProps['autoFocus']
+ defaultValue?: string | number
+ disabled?: boolean
+ id?: NativeTextareaProps['id']
+ name?: string
+ maxLength?: NativeTextareaProps['maxLength']
+ placeholder?: NativeTextareaProps['placeholder']
+ readOnly?: NativeTextareaProps['readOnly']
+ rows?: NativeTextareaProps['rows']
+ spellCheck?: NativeTextareaProps['spellCheck']
+ tabIndex?: NativeTextareaProps['tabIndex']
+ value?: string | number
+ onChange?: React.EventHandler>
+ onBlur?: NativeTextareaProps['onBlur']
+ onFocus?: NativeTextareaProps['onFocus']
+}
export const Textarea = React.forwardRef(
(
@@ -54,10 +54,10 @@ export const Textarea = React.forwardRef(
}: Props,
ref: React.Ref,
) => {
- const defaultRef = React.useRef(null);
- const inputRef = (ref as React.RefObject) || defaultRef;
+ const defaultRef = React.useRef(null)
+ const inputRef = (ref as React.RefObject) || defaultRef
- const hasError = error ? true : undefined;
+ const hasError = error ? true : undefined
return (
- );
+ )
},
-);
+)
-Textarea.displayName = 'Textarea';
+Textarea.displayName = 'Textarea'
diff --git a/components/src/components/Textarea/index.ts b/components/src/components/Textarea/index.ts
new file mode 100644
index 0000000..25e32ea
--- /dev/null
+++ b/components/src/components/Textarea/index.ts
@@ -0,0 +1 @@
+export { Textarea } from './Textarea'
diff --git a/packages/components/src/components/Textarea/styles.css.ts b/components/src/components/Textarea/styles.css.ts
similarity index 84%
rename from packages/components/src/components/Textarea/styles.css.ts
rename to components/src/components/Textarea/styles.css.ts
index 01b97b4..2d53b60 100644
--- a/packages/components/src/components/Textarea/styles.css.ts
+++ b/components/src/components/Textarea/styles.css.ts
@@ -1,12 +1,12 @@
-import { style } from '@vanilla-extract/css';
-import { recipe } from '@vanilla-extract/recipes';
+import { style } from '@vanilla-extract/css'
+import { recipe } from '@vanilla-extract/recipes'
-import { atoms, vars } from '../../css';
+import { atoms, vars } from '../../css'
export const variants = recipe({
base: [
atoms({
- backgroundColor: 'transparent',
+ backgroundColor: 'background',
borderColor: { base: 'foregroundSecondary', focus: 'accent' },
borderRadius: '2xLarge',
borderWidth: '0.5',
@@ -50,4 +50,4 @@ export const variants = recipe({
]),
},
},
-});
+})
diff --git a/packages/components/src/components/ThemeProvider/ThemeProvider.docs.mdx b/components/src/components/ThemeProvider/ThemeProvider.docs.mdx
similarity index 86%
rename from packages/components/src/components/ThemeProvider/ThemeProvider.docs.mdx
rename to components/src/components/ThemeProvider/ThemeProvider.docs.mdx
index 150a52f..1f9a5cb 100644
--- a/packages/components/src/components/ThemeProvider/ThemeProvider.docs.mdx
+++ b/components/src/components/ThemeProvider/ThemeProvider.docs.mdx
@@ -4,7 +4,7 @@ description: Wrapper for managing theme state
---
```tsx
-import { ThemeProvider } from '@disco3/components';
+import { ThemeProvider } from 'degen'
```
## Props
@@ -13,8 +13,7 @@ import { ThemeProvider } from '@disco3/components';
## Element
-Pass in an element selector or reference to change where the theme binds. By
-default, the theme attaches to the `:root` element.
+Pass in an element selector or reference to change where the theme binds. By default, the theme attaches to the `:root` element.
```tsx live=true
),
},
-];
+]
diff --git a/packages/components/src/components/ThemeProvider/ThemeProvider.test.tsx b/components/src/components/ThemeProvider/ThemeProvider.test.tsx
similarity index 55%
rename from packages/components/src/components/ThemeProvider/ThemeProvider.test.tsx
rename to components/src/components/ThemeProvider/ThemeProvider.test.tsx
index d27fc5e..b76ce23 100644
--- a/packages/components/src/components/ThemeProvider/ThemeProvider.test.tsx
+++ b/components/src/components/ThemeProvider/ThemeProvider.test.tsx
@@ -1,31 +1,31 @@
-import * as React from 'react';
-import { render } from '@testing-library/react';
+import * as React from 'react'
+import { render } from '@testing-library/react'
-import { Providers, actHook, cleanup, renderHook, screen } from '@/test';
+import { Providers, actHook, cleanup, renderHook, screen } from '@/test'
-import { ThemeProvider, attribute, useTheme } from './ThemeProvider';
+import { ThemeProvider, attribute, useTheme } from './ThemeProvider'
describe('', () => {
- afterEach(cleanup);
+ afterEach(cleanup)
it('renders', () => {
- render(foo bar baz);
- expect(screen.getByText(/foo/i)).toBeInTheDocument();
- });
+ render(foo bar baz)
+ expect(screen.getByText(/foo/i)).toBeInTheDocument()
+ })
it('forcedMode', () => {
- render(foo bar baz);
+ render(foo bar baz)
expect(
document.querySelector(`[${attribute}]`)?.getAttribute(attribute),
- ).toStrictEqual('dark');
- });
-});
+ ).toStrictEqual('dark')
+ })
+})
describe('useTheme', () => {
- afterEach(cleanup);
+ afterEach(cleanup)
it('renders', () => {
- const { result } = renderHook(() => useTheme());
+ const { result } = renderHook(() => useTheme())
expect(result.current).toStrictEqual({
accent: 'blue',
@@ -34,30 +34,30 @@ describe('useTheme', () => {
mode: 'light',
setAccent: expect.any(Function),
setMode: expect.any(Function),
- });
- });
+ })
+ })
it('sets accent', () => {
- const { result } = renderHook(() => useTheme());
- expect(result.current.accent).toStrictEqual('blue');
+ const { result } = renderHook(() => useTheme())
+ expect(result.current.accent).toStrictEqual('blue')
actHook(() => {
- result.current.setAccent('green');
- });
+ result.current.setAccent('green')
+ })
- expect(result.current.accent).toStrictEqual('green');
- });
+ expect(result.current.accent).toStrictEqual('green')
+ })
it('sets mode', () => {
- const { result } = renderHook(() => useTheme());
- expect(result.current.mode).toStrictEqual('light');
+ const { result } = renderHook(() => useTheme())
+ expect(result.current.mode).toStrictEqual('light')
actHook(() => {
- result.current.setMode('dark');
- });
+ result.current.setMode('dark')
+ })
- expect(result.current.mode).toStrictEqual('dark');
- });
+ expect(result.current.mode).toStrictEqual('dark')
+ })
it('sets defaults', () => {
const { result } = renderHook(() => useTheme(), {
@@ -66,11 +66,11 @@ describe('useTheme', () => {
{children}
),
- });
+ })
- expect(result.current.mode).toStrictEqual('dark');
- expect(result.current.accent).toStrictEqual('green');
- });
+ expect(result.current.mode).toStrictEqual('dark')
+ expect(result.current.accent).toStrictEqual('green')
+ })
it('forcedMode', () => {
const { result } = renderHook(() => useTheme(), {
@@ -79,11 +79,11 @@ describe('useTheme', () => {
{children}
),
- });
+ })
- expect(result.current.forcedMode).toStrictEqual('light');
- expect(result.current.mode).toStrictEqual('dark');
- });
+ expect(result.current.forcedMode).toStrictEqual('light')
+ expect(result.current.mode).toStrictEqual('dark')
+ })
it('forcedAccent', () => {
const { result } = renderHook(() => useTheme(), {
@@ -94,9 +94,9 @@ describe('useTheme', () => {
{children}
),
- });
+ })
- expect(result.current.forcedAccent).toStrictEqual('indigo');
- expect(result.current.accent).toStrictEqual('blue');
- });
-});
+ expect(result.current.forcedAccent).toStrictEqual('indigo')
+ expect(result.current.accent).toStrictEqual('blue')
+ })
+})
diff --git a/packages/components/src/components/ThemeProvider/ThemeProvider.tsx b/components/src/components/ThemeProvider/ThemeProvider.tsx
similarity index 58%
rename from packages/components/src/components/ThemeProvider/ThemeProvider.tsx
rename to components/src/components/ThemeProvider/ThemeProvider.tsx
index 9ba87d0..bbd55be 100644
--- a/packages/components/src/components/ThemeProvider/ThemeProvider.tsx
+++ b/components/src/components/ThemeProvider/ThemeProvider.tsx
@@ -1,42 +1,42 @@
-import * as React from 'react';
-import { setElementVars } from '@vanilla-extract/dynamic';
+import * as React from 'react'
+import { setElementVars } from '@vanilla-extract/dynamic'
-import { Mode, Accent as TokenAccent } from '../../tokens';
-import { getAccentText, getModeColors, vars } from '../../css';
+import { Mode, Accent as TokenAccent } from '../../tokens'
+import { getAccentText, getModeColors, vars } from '../../css'
-type Accent = TokenAccent | 'foreground';
+type Accent = TokenAccent | 'foreground'
type ThemeContextValue = {
/** Active accent name */
- accent: Accent;
+ accent: Accent
/** Forced accent name */
- forcedAccent?: Accent;
+ forcedAccent?: Accent
/** Forced mode name */
- forcedMode?: Mode;
+ forcedMode?: Mode
/** Active mode name */
- mode: Mode;
+ mode: Mode
/** Update accent */
- setAccent(accent: Accent): void;
+ setAccent(accent: Accent): void
/** Update mode */
- setMode(mode: Mode): void;
-};
+ setMode(mode: Mode): void
+}
-const ThemeContext = React.createContext(null);
+const ThemeContext = React.createContext(null)
-export const attribute = 'data-theme';
+export const attribute = 'data-theme'
export type ThemeProviderProps = {
/** Default accent name. */
- defaultAccent?: Accent;
+ defaultAccent?: Accent
/** Default mode name. */
- defaultMode?: Mode;
+ defaultMode?: Mode
/** Element to bind theme */
- element?: string | HTMLElement;
+ element?: string | HTMLElement
/** Forced accent name */
- forcedAccent?: Accent;
+ forcedAccent?: Accent
/** Forced mode name */
- forcedMode?: Mode;
-};
+ forcedMode?: Mode
+}
export const ThemeProvider = ({
children,
@@ -47,21 +47,21 @@ export const ThemeProvider = ({
forcedMode,
}: React.PropsWithChildren) => {
const [state, setState] = React.useState<{
- accent: Accent;
- mode: Mode;
+ accent: Accent
+ mode: Mode
}>({
accent: defaultAccent,
mode: defaultMode,
- });
+ })
const setAccent = React.useCallback(
(accent: Accent) => {
setState((x) => {
- const root = getElement(element);
+ const root = getElement(element)
if (root) {
- const enable = disableAnimation();
- const resolvedAccent = forcedAccent ?? accent;
- const resolvedMode = forcedMode ?? x.mode;
+ const enable = disableAnimation()
+ const resolvedAccent = forcedAccent ?? accent
+ const resolvedMode = forcedMode ?? x.mode
setElementVars(root as HTMLElement, {
[vars.mode.colors.accent]:
getModeColors(resolvedMode)[resolvedAccent],
@@ -69,25 +69,25 @@ export const ThemeProvider = ({
resolvedMode,
resolvedAccent,
),
- });
- enable();
+ })
+ enable()
}
- return { ...x, accent };
- });
+ return { ...x, accent }
+ })
},
[element, forcedAccent, forcedMode],
- );
+ )
const setMode = React.useCallback(
(mode: Mode) => {
- setState((x) => ({ ...x, mode }));
- const enable = disableAnimation();
- const root = getElement(element);
- root?.setAttribute(attribute, mode);
- enable();
+ setState((x) => ({ ...x, mode }))
+ const enable = disableAnimation()
+ const root = getElement(element)
+ root?.setAttribute(attribute, mode)
+ enable()
},
[element],
- );
+ )
const value = React.useMemo(
() => ({
@@ -99,55 +99,53 @@ export const ThemeProvider = ({
setMode,
}),
[forcedAccent, forcedMode, state.accent, state.mode, setAccent, setMode],
- );
+ )
// Set accent and mode on load
/* eslint-disable react-hooks/exhaustive-deps */
React.useEffect(() => {
- const root = getElement(element);
- const mode = forcedMode ?? defaultMode;
- root?.setAttribute(attribute, mode);
- setAccent(defaultAccent);
- }, []);
+ const root = getElement(element)
+ const mode = forcedMode ?? defaultMode
+ root?.setAttribute(attribute, mode)
+ setAccent(defaultAccent)
+ }, [])
/* eslint-enable react-hooks/exhaustive-deps */
// When mode changes, update accent
/* eslint-disable react-hooks/exhaustive-deps */
React.useEffect(() => {
- setAccent(state.accent);
- }, [state.mode]);
+ setAccent(state.accent)
+ }, [state.mode])
/* eslint-enable react-hooks/exhaustive-deps */
- return (
- {children}
- );
-};
+ return {children}
+}
export const useTheme = () => {
- const context = React.useContext(ThemeContext);
- if (!context) throw Error('Must be used within ThemeProvider');
- return context;
-};
+ const context = React.useContext(ThemeContext)
+ if (!context) throw Error('Must be used within ThemeProvider')
+ return context
+}
const getElement = (selector: string | HTMLElement = ':root') => {
- if (typeof selector === 'string') return document.querySelector(selector);
- return selector;
-};
+ if (typeof selector === 'string') return document.querySelector(selector)
+ return selector
+}
const disableAnimation = () => {
- const css = document.createElement('style');
+ const css = document.createElement('style')
css.appendChild(
document.createTextNode(
`*{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}`,
),
- );
- document.head.appendChild(css);
+ )
+ document.head.appendChild(css)
return () => {
// Force restyle
- (() => window.getComputedStyle(document.body))();
+ ;(() => window.getComputedStyle(document.body))()
// Wait for next tick before removing
- setTimeout(() => document.head.removeChild(css), 1);
- };
-};
+ setTimeout(() => document.head.removeChild(css), 1)
+ }
+}
diff --git a/components/src/components/ThemeProvider/index.ts b/components/src/components/ThemeProvider/index.ts
new file mode 100644
index 0000000..b0e4128
--- /dev/null
+++ b/components/src/components/ThemeProvider/index.ts
@@ -0,0 +1,2 @@
+export { ThemeProvider, useTheme } from './ThemeProvider'
+export type { ThemeProviderProps } from './ThemeProvider'
diff --git a/packages/components/src/components/VisuallyHidden/VisuallyHidden.docs.mdx b/components/src/components/VisuallyHidden/VisuallyHidden.docs.mdx
similarity index 56%
rename from packages/components/src/components/VisuallyHidden/VisuallyHidden.docs.mdx
rename to components/src/components/VisuallyHidden/VisuallyHidden.docs.mdx
index 71a4530..8cee142 100644
--- a/packages/components/src/components/VisuallyHidden/VisuallyHidden.docs.mdx
+++ b/components/src/components/VisuallyHidden/VisuallyHidden.docs.mdx
@@ -1,11 +1,10 @@
---
title: VisuallyHidden
-description:
- Wrapper for hiding an element visually without hiding it from screen readers
+description: Wrapper for hiding an element visually without hiding it from screen readers
---
```tsx
-import { VisuallyHidden } from '@disco3/components';
+import { VisuallyHidden } from 'degen'
```
```tsx expand=true live=true
diff --git a/components/src/components/VisuallyHidden/VisuallyHidden.snippets.tsx b/components/src/components/VisuallyHidden/VisuallyHidden.snippets.tsx
new file mode 100644
index 0000000..8678bc9
--- /dev/null
+++ b/components/src/components/VisuallyHidden/VisuallyHidden.snippets.tsx
@@ -0,0 +1,11 @@
+import * as React from 'react'
+
+import { Snippet } from '!/playroom/src/types'
+import { VisuallyHidden } from './VisuallyHidden'
+
+export const snippets: Snippet[] = [
+ {
+ name: 'Basic',
+ code: _,
+ },
+]
diff --git a/components/src/components/VisuallyHidden/VisuallyHidden.test.tsx b/components/src/components/VisuallyHidden/VisuallyHidden.test.tsx
new file mode 100644
index 0000000..d319206
--- /dev/null
+++ b/components/src/components/VisuallyHidden/VisuallyHidden.test.tsx
@@ -0,0 +1,14 @@
+import * as React from 'react'
+
+import { cleanup, render, screen } from '@/test'
+
+import { VisuallyHidden } from './VisuallyHidden'
+
+describe('', () => {
+ afterEach(cleanup)
+
+ it('renders', () => {
+ render(foo bar baz)
+ expect(screen.getByText(/foo/i)).toBeInTheDocument()
+ })
+})
diff --git a/packages/components/src/components/VisuallyHidden/VisuallyHidden.tsx b/components/src/components/VisuallyHidden/VisuallyHidden.tsx
similarity index 73%
rename from packages/components/src/components/VisuallyHidden/VisuallyHidden.tsx
rename to components/src/components/VisuallyHidden/VisuallyHidden.tsx
index e9f7096..970ba67 100644
--- a/packages/components/src/components/VisuallyHidden/VisuallyHidden.tsx
+++ b/components/src/components/VisuallyHidden/VisuallyHidden.tsx
@@ -1,11 +1,11 @@
-import * as React from 'react';
+import * as React from 'react'
-import { Box } from '../Box';
-import * as styles from './styles.css';
+import { Box } from '../Box'
+import * as styles from './styles.css'
type Props = {
- as?: 'div' | 'span';
-};
+ as?: 'div' | 'span'
+}
export const VisuallyHidden = ({
as = 'div',
@@ -26,5 +26,5 @@ export const VisuallyHidden = ({
>
{children}
- );
-};
+ )
+}
diff --git a/components/src/components/VisuallyHidden/index.ts b/components/src/components/VisuallyHidden/index.ts
new file mode 100644
index 0000000..a6be36e
--- /dev/null
+++ b/components/src/components/VisuallyHidden/index.ts
@@ -0,0 +1 @@
+export { VisuallyHidden } from './VisuallyHidden'
diff --git a/packages/components/src/components/VisuallyHidden/styles.css.ts b/components/src/components/VisuallyHidden/styles.css.ts
similarity index 53%
rename from packages/components/src/components/VisuallyHidden/styles.css.ts
rename to components/src/components/VisuallyHidden/styles.css.ts
index fb42fa7..9cbdde1 100644
--- a/packages/components/src/components/VisuallyHidden/styles.css.ts
+++ b/components/src/components/VisuallyHidden/styles.css.ts
@@ -1,5 +1,5 @@
-import { style } from '@vanilla-extract/css';
+import { style } from '@vanilla-extract/css'
export const root = style({
clip: 'rect(0, 0, 0, 0)',
-});
+})
diff --git a/packages/components/src/components/icons/IconNFT/IconNFT.docs.mdx b/components/src/components/icons/IconNFT/IconNFT.docs.mdx
similarity index 75%
rename from packages/components/src/components/icons/IconNFT/IconNFT.docs.mdx
rename to components/src/components/icons/IconNFT/IconNFT.docs.mdx
index 321f238..786a05f 100644
--- a/packages/components/src/components/icons/IconNFT/IconNFT.docs.mdx
+++ b/components/src/components/icons/IconNFT/IconNFT.docs.mdx
@@ -3,7 +3,7 @@ title: IconNFT
---
```tsx
-import { IconNFT } from '@disco3/components';
+import { IconNFT } from 'degen'
```
```tsx live=true expand=true
diff --git a/components/src/components/icons/IconNFT/IconNFT.snippets.tsx b/components/src/components/icons/IconNFT/IconNFT.snippets.tsx
new file mode 100644
index 0000000..b5055fa
--- /dev/null
+++ b/components/src/components/icons/IconNFT/IconNFT.snippets.tsx
@@ -0,0 +1,11 @@
+import * as React from 'react'
+
+import { Snippet } from '!/playroom/src/types'
+import { IconNFT } from './IconNFT'
+
+export const snippets: Snippet[] = [
+ {
+ name: 'Basic',
+ code: ,
+ },
+]
diff --git a/components/src/components/icons/IconNFT/IconNFT.tsx b/components/src/components/icons/IconNFT/IconNFT.tsx
new file mode 100644
index 0000000..0733eba
--- /dev/null
+++ b/components/src/components/icons/IconNFT/IconNFT.tsx
@@ -0,0 +1,30 @@
+import * as React from 'react'
+
+import { Box, BoxProps } from '../../Box'
+import { OptionalTitle } from '../types'
+import { IconNFTSvg } from './IconNFTSVG'
+
+type Props = {
+ className?: BoxProps['className']
+ color?: BoxProps['color']
+ size?: BoxProps['height']
+ strokeWidth?: BoxProps['strokeWidth']
+} & OptionalTitle
+
+export const IconNFT = ({
+ color,
+ size = '6',
+ strokeWidth = '0.5',
+ ...props
+}: Props) => {
+ return (
+
+ )
+}
diff --git a/packages/components/src/components/icons/IconNFT/IconNFTSVG.tsx b/components/src/components/icons/IconNFT/IconNFTSVG.tsx
similarity index 97%
rename from packages/components/src/components/icons/IconNFT/IconNFTSVG.tsx
rename to components/src/components/icons/IconNFT/IconNFTSVG.tsx
index 22821f7..9236e2f 100644
--- a/packages/components/src/components/icons/IconNFT/IconNFTSVG.tsx
+++ b/components/src/components/icons/IconNFT/IconNFTSVG.tsx
@@ -1,6 +1,6 @@
-import * as React from 'react';
+import * as React from 'react'
-import { IconProps } from '../types';
+import { IconProps } from '../types'
export const IconNFTSvg = ({ title, titleId, ...props }: IconProps) => (
-);
+)
diff --git a/components/src/components/icons/IconNFT/index.ts b/components/src/components/icons/IconNFT/index.ts
new file mode 100644
index 0000000..58fcf98
--- /dev/null
+++ b/components/src/components/icons/IconNFT/index.ts
@@ -0,0 +1 @@
+export { IconNFT } from './IconNFT'
diff --git a/packages/components/src/components/icons/Icons.docs.mdx b/components/src/components/icons/Icons.docs.mdx
similarity index 100%
rename from packages/components/src/components/icons/Icons.docs.mdx
rename to components/src/components/icons/Icons.docs.mdx
diff --git a/components/src/components/icons/generated/index.ts b/components/src/components/icons/generated/index.ts
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/components/src/components/icons/generated/index.ts
@@ -0,0 +1 @@
+
diff --git a/components/src/components/icons/index.ts b/components/src/components/icons/index.ts
new file mode 100644
index 0000000..d8e523b
--- /dev/null
+++ b/components/src/components/icons/index.ts
@@ -0,0 +1,2 @@
+export * from './generated'
+export { IconNFT } from './IconNFT'
diff --git a/packages/components/src/components/icons/types.ts b/components/src/components/icons/types.ts
similarity index 59%
rename from packages/components/src/components/icons/types.ts
rename to components/src/components/icons/types.ts
index 0d935e4..6a95fcd 100644
--- a/packages/components/src/components/icons/types.ts
+++ b/components/src/components/icons/types.ts
@@ -1,7 +1,7 @@
-import * as React from 'react';
+import * as React from 'react'
-import { AllOrNone } from '../../types';
+import { AllOrNone } from '../../types'
-export type OptionalTitle = AllOrNone<{ title: string; titleId: string }>;
+export type OptionalTitle = AllOrNone<{ title: string; titleId: string }>
-export type IconProps = React.SVGProps & OptionalTitle;
+export type IconProps = React.SVGProps & OptionalTitle
diff --git a/components/src/components/index.ts b/components/src/components/index.ts
new file mode 100644
index 0000000..ed41d81
--- /dev/null
+++ b/components/src/components/index.ts
@@ -0,0 +1,24 @@
+export * from './icons'
+export type { BoxProps } from './Box'
+export { Avatar } from './Avatar'
+export { AvatarGroup } from './AvatarGroup'
+export { Box } from './Box'
+export { Button } from './Button'
+export { Card } from './Card'
+export { Field } from './Field'
+export { FieldSet } from './FieldSet'
+export { FileInput } from './FileInput'
+export { Heading } from './Heading'
+export { Input } from './Input'
+export { MediaPicker } from './MediaPicker'
+export { Range } from './Range'
+export { Skeleton } from './Skeleton'
+export { SkeletonGroup } from './SkeletonGroup'
+export { Spinner } from './Spinner'
+export { Stack } from './Stack'
+export { Stat } from './Stat'
+export { Tag } from './Tag'
+export { Text } from './Text'
+export { Textarea } from './Textarea'
+export { ThemeProvider, useTheme } from './ThemeProvider'
+export { VisuallyHidden } from './VisuallyHidden'
diff --git a/components/src/css/atoms.ts b/components/src/css/atoms.ts
new file mode 100644
index 0000000..675b624
--- /dev/null
+++ b/components/src/css/atoms.ts
@@ -0,0 +1,20 @@
+import clsx from 'clsx'
+
+import * as resetStyles from './reset.css'
+import { Sprinkles, sprinkles } from './sprinkles.css'
+import { getInjectedStyleClasses } from './injectedStyles'
+
+export type Atoms = Sprinkles & {
+ reset?: resetStyles.Element & keyof JSX.IntrinsicElements
+}
+
+export const atoms = ({ reset, ...rest }: Atoms) => {
+ const sprinklesClasses = sprinkles(rest)
+ const injectedStyleClasses = getInjectedStyleClasses(rest)
+
+ return clsx(
+ reset && [resetStyles.base, resetStyles.element[reset]],
+ sprinklesClasses,
+ injectedStyleClasses,
+ )
+}
diff --git a/packages/components/src/css/breakpoints.ts b/components/src/css/breakpoints.ts
similarity index 66%
rename from packages/components/src/css/breakpoints.ts
rename to components/src/css/breakpoints.ts
index fb13008..25157a6 100644
--- a/packages/components/src/css/breakpoints.ts
+++ b/components/src/css/breakpoints.ts
@@ -3,8 +3,8 @@ export const breakpoints = {
md: 768,
lg: 1024,
xl: 1280,
-} as const;
+} as const
-export type Breakpoint = keyof typeof breakpoints;
+export type Breakpoint = keyof typeof breakpoints
-export const breakpointNames = Object.keys(breakpoints) as Breakpoint[];
+export const breakpointNames = Object.keys(breakpoints) as Breakpoint[]
diff --git a/components/src/css/index.ts b/components/src/css/index.ts
new file mode 100644
index 0000000..121badd
--- /dev/null
+++ b/components/src/css/index.ts
@@ -0,0 +1,25 @@
+export { atoms } from './atoms'
+export type { Atoms } from './atoms'
+
+export { breakpoints } from './breakpoints'
+export type { Breakpoint } from './breakpoints'
+
+export {
+ mapResponsiveValue,
+ normalizeResponsiveValue,
+ sprinkles,
+} from './sprinkles.css'
+export type {
+ OptionalResponsiveObject,
+ OptionalResponsiveValue,
+ RequiredResponsiveObject,
+ RequiredResponsiveValue,
+ Sprinkles,
+} from './sprinkles.css'
+
+export { vars } from './vars.css'
+
+export type { Theme } from './types'
+
+export { responsiveStyle } from './responsiveStyle'
+export { getAccentText, getModeColors, motionSafe, rgb } from './utils'
diff --git a/packages/components/src/css/injectedStyles.css.ts b/components/src/css/injectedStyles.css.ts
similarity index 81%
rename from packages/components/src/css/injectedStyles.css.ts
rename to components/src/css/injectedStyles.css.ts
index f46292b..d564cf5 100644
--- a/packages/components/src/css/injectedStyles.css.ts
+++ b/components/src/css/injectedStyles.css.ts
@@ -1,9 +1,9 @@
-import { createVar } from '@vanilla-extract/css';
-import { calc } from '@vanilla-extract/css-utils';
-import { recipe } from '@vanilla-extract/recipes';
+import { createVar } from '@vanilla-extract/css'
+import { calc } from '@vanilla-extract/css-utils'
+import { recipe } from '@vanilla-extract/recipes'
// https://css-tricks.com/almanac/properties/a/aspect-ratio/
-const aspectRatioVar = createVar();
+const aspectRatioVar = createVar()
export const aspectRatioFallback = recipe({
base: {
'@supports': {
@@ -40,4 +40,4 @@ export const aspectRatioFallback = recipe({
},
},
},
-});
+})
diff --git a/packages/components/src/css/injectedStyles.ts b/components/src/css/injectedStyles.ts
similarity index 56%
rename from packages/components/src/css/injectedStyles.ts
rename to components/src/css/injectedStyles.ts
index 29e8a48..c1eb9c0 100644
--- a/packages/components/src/css/injectedStyles.ts
+++ b/components/src/css/injectedStyles.ts
@@ -1,27 +1,27 @@
-import { aspectRatioFallback } from './injectedStyles.css';
-import { Sprinkles } from './sprinkles.css';
+import { aspectRatioFallback } from './injectedStyles.css'
+import { Sprinkles } from './sprinkles.css'
-const injectedStyleRules = ['aspectRatio'] as const;
+const injectedStyleRules = ['aspectRatio'] as const
export const getInjectedStyleClasses = (rules: Sprinkles): Array => {
- const injectedStyleClasses: Array = [];
+ const injectedStyleClasses: Array = []
for (const rule of injectedStyleRules) {
switch (rule) {
case 'aspectRatio': {
- const value = rules[rule];
+ const value = rules[rule]
if (value && value !== 'auto') {
- injectedStyleClasses.push(aspectRatioFallback({ ratio: value }));
+ injectedStyleClasses.push(aspectRatioFallback({ ratio: value }))
}
- break;
+ break
}
default: {
// Ensures a typesafe exhaustive check
// eslint-disable-next-line @typescript-eslint/no-unused-vars
- const exhaustiveCheck: never = rule;
+ const exhaustiveCheck: never = rule
}
}
}
- return injectedStyleClasses;
-};
+ return injectedStyleClasses
+}
diff --git a/packages/components/src/css/reset.css.ts b/components/src/css/reset.css.ts
similarity index 91%
rename from packages/components/src/css/reset.css.ts
rename to components/src/css/reset.css.ts
index 5ebb39c..9ce279e 100644
--- a/packages/components/src/css/reset.css.ts
+++ b/components/src/css/reset.css.ts
@@ -1,7 +1,7 @@
-import { style as resetStyles } from '@vanilla-extract/css';
+import { style as resetStyles } from '@vanilla-extract/css'
-import 'focus-visible';
-import { vars } from './vars.css';
+import 'focus-visible'
+import { vars } from './vars.css'
/**
* Selector for `focus-visible` package
@@ -10,7 +10,7 @@ import { vars } from './vars.css';
* https://caniuse.com/css-focus-visible
*/
const hideFocusRingsDataAttribute =
- '[data-js-focus-visible] &:focus:not([data-focus-visible-added])';
+ '[data-js-focus-visible] &:focus:not([data-focus-visible-added])'
export const base = resetStyles({
// Prevent padding and border from affecting element width
@@ -34,20 +34,20 @@ export const base = resetStyles({
outline: 'none',
},
},
-});
+})
// HTML5 display-role reset for older browsers
const block = resetStyles({
display: 'block',
-});
+})
const body = resetStyles({
lineHeight: vars.lineHeights.none,
-});
+})
const list = resetStyles({
listStyle: 'none',
-});
+})
const quote = resetStyles({
quotes: 'none',
@@ -56,34 +56,34 @@ const quote = resetStyles({
content: "''",
},
},
-});
+})
const table = resetStyles({
borderCollapse: 'collapse',
borderSpacing: 0,
-});
+})
const appearance = resetStyles({
appearance: 'none',
-});
+})
const field = resetStyles([
block,
appearance,
resetStyles({
- 'outline': 'none',
+ outline: 'none',
'::placeholder': {
color: vars.colors.textTertiary,
opacity: vars.opacity['100'],
},
}),
-]);
+])
// Custom reset rules
const mark = resetStyles({
backgroundColor: vars.colors.transparent,
color: vars.colors.inherit,
-});
+})
const select = resetStyles([
field,
@@ -94,7 +94,7 @@ const select = resetStyles([
},
},
}),
-]);
+])
const input = resetStyles([
field,
@@ -116,16 +116,16 @@ const input = resetStyles([
},
},
}),
-]);
+])
const button = resetStyles({
background: 'none',
-});
+})
const a = resetStyles({
textDecoration: 'none',
color: vars.colors.inherit,
-});
+})
export const element = {
article: block,
@@ -152,6 +152,6 @@ export const element = {
button,
textarea: field,
input,
-};
+}
-export type Element = keyof typeof element;
+export type Element = keyof typeof element
diff --git a/packages/components/src/css/responsiveStyle.test.ts b/components/src/css/responsiveStyle.test.ts
similarity index 87%
rename from packages/components/src/css/responsiveStyle.test.ts
rename to components/src/css/responsiveStyle.test.ts
index b2d999e..b3d109f 100644
--- a/packages/components/src/css/responsiveStyle.test.ts
+++ b/components/src/css/responsiveStyle.test.ts
@@ -1,4 +1,4 @@
-import { responsiveStyle } from './responsiveStyle';
+import { responsiveStyle } from './responsiveStyle'
const xs = {
actual: {
@@ -9,7 +9,7 @@ const xs = {
expected: {
backgroundColor: 'red',
},
-};
+}
const xsMd = {
actual: {
@@ -21,14 +21,14 @@ const xsMd = {
},
},
expected: {
- 'backgroundColor': 'red',
+ backgroundColor: 'red',
'@media': {
'screen and (min-width: 768px)': {
backgroundColor: 'blue',
},
},
},
-};
+}
const xsMdLg = {
actual: {
@@ -44,7 +44,7 @@ const xsMdLg = {
},
},
expected: {
- 'backgroundColor': 'red',
+ backgroundColor: 'red',
'@media': {
'screen and (min-width: 768px)': {
backgroundColor: 'blue',
@@ -55,7 +55,7 @@ const xsMdLg = {
},
},
},
-};
+}
const lg = {
actual: {
@@ -70,7 +70,7 @@ const lg = {
},
},
},
-};
+}
describe.each`
style | expected
@@ -80,6 +80,6 @@ describe.each`
${lg.actual} | ${lg.expected}
`('responsiveStyle($style)', ({ style, expected }) => {
it(`returns ${expected}`, () => {
- expect(responsiveStyle(style)).toEqual(expected);
- });
-});
+ expect(responsiveStyle(style)).toEqual(expected)
+ })
+})
diff --git a/packages/components/src/css/responsiveStyle.ts b/components/src/css/responsiveStyle.ts
similarity index 72%
rename from packages/components/src/css/responsiveStyle.ts
rename to components/src/css/responsiveStyle.ts
index 6780071..a1222e4 100644
--- a/packages/components/src/css/responsiveStyle.ts
+++ b/components/src/css/responsiveStyle.ts
@@ -1,30 +1,30 @@
-import { StyleRule } from '@vanilla-extract/css';
+import { StyleRule } from '@vanilla-extract/css'
-import { Breakpoint, breakpoints } from './breakpoints';
+import { Breakpoint, breakpoints } from './breakpoints'
-type CSSProps = Omit;
+type CSSProps = Omit
const makeMediaQuery = (breakpoint: Breakpoint) => (styles?: CSSProps) =>
!styles || Object.keys(styles).length === 0
? {}
: {
[`screen and (min-width: ${breakpoints[breakpoint]}px)`]: styles,
- };
+ }
const mediaQuery = {
sm: makeMediaQuery('sm'),
md: makeMediaQuery('md'),
lg: makeMediaQuery('lg'),
xl: makeMediaQuery('xl'),
-};
+}
type ResponsiveStyle = {
- xs?: CSSProps;
- sm?: CSSProps;
- md?: CSSProps;
- lg?: CSSProps;
- xl?: CSSProps;
-};
+ xs?: CSSProps
+ sm?: CSSProps
+ md?: CSSProps
+ lg?: CSSProps
+ xl?: CSSProps
+}
export const responsiveStyle = ({
xs,
@@ -34,7 +34,7 @@ export const responsiveStyle = ({
xl,
}: ResponsiveStyle): StyleRule => {
/* eslint-disable @typescript-eslint/no-unused-vars */
- const { '@media': _, ...xsStyle } = (xs ?? {}) as any;
+ const { '@media': _, ...xsStyle } = (xs ?? {}) as any
/* eslint-enable @typescript-eslint/no-unused-vars */
return {
...xsStyle,
@@ -48,5 +48,5 @@ export const responsiveStyle = ({
},
}
: {}),
- };
-};
+ }
+}
diff --git a/packages/components/src/css/sprinkles.css.ts b/components/src/css/sprinkles.css.ts
similarity index 89%
rename from packages/components/src/css/sprinkles.css.ts
rename to components/src/css/sprinkles.css.ts
index bfff3bc..b192bbb 100644
--- a/packages/components/src/css/sprinkles.css.ts
+++ b/components/src/css/sprinkles.css.ts
@@ -5,23 +5,23 @@ import {
createNormalizeValueFn,
createSprinkles,
defineProperties,
-} from '@vanilla-extract/sprinkles';
-import { calc } from '@vanilla-extract/css-utils';
-import { createVar } from '@vanilla-extract/css';
+} from '@vanilla-extract/sprinkles'
+import { calc } from '@vanilla-extract/css-utils'
+import { createVar } from '@vanilla-extract/css'
-import { vars } from './vars.css';
-import { Breakpoint, breakpointNames, breakpoints } from './breakpoints';
+import { vars } from './vars.css'
+import { Breakpoint, breakpointNames, breakpoints } from './breakpoints'
// Ensure reset has lowest specificity
/* DO NOT MOVE THIS LINE */
-import './reset.css';
+import './reset.css'
/* DO NOT MOVE THIS LINE */
-const flexAlignment = ['flex-start', 'center', 'flex-end', 'stretch'] as const;
+const flexAlignment = ['flex-start', 'center', 'flex-end', 'stretch'] as const
-const flexibility = [0, 1, 2, 3, 4] as const;
+const flexibility = [0, 1, 2, 3, 4] as const
-const space = vars.space;
+const space = vars.space
const negativeSpace = {
['-px']: `${calc(space.px).negate()}`,
['-0.5']: `${calc(space['0.5']).negate()}`,
@@ -32,12 +32,12 @@ const negativeSpace = {
['-3']: `${calc(space['3']).negate()}`,
['-3.5']: `${calc(space['3.5']).negate()}`,
['-4']: `${calc(space['4']).negate()}`,
-};
+}
const margins = {
...space,
...negativeSpace,
-};
+}
const extendedSpace = {
'112': '28rem',
@@ -55,11 +55,11 @@ const extendedSpace = {
'1/2': '50%',
'2/3': '66.666667%',
'3/4': '75%',
- 'screenSm': breakpoints.sm,
- 'screenMd': breakpoints.md,
- 'screenLg': breakpoints.lg,
- 'screenXl': breakpoints.xl,
-};
+ screenSm: breakpoints.sm,
+ screenMd: breakpoints.md,
+ screenLg: breakpoints.lg,
+ screenXl: breakpoints.xl,
+}
const responsiveProperties = defineProperties({
defaultCondition: 'xs',
@@ -84,7 +84,7 @@ const responsiveProperties = defineProperties({
borderTopLeftRadius: vars.radii,
borderTopRightRadius: vars.radii,
bottom: vars.space,
- display: ['block', 'flex', 'grid', 'inline-block', 'none'],
+ display: ['block', 'flex', 'grid', 'inline-block', 'none', 'contents'],
flex: {
1: '1 1 0%',
auto: '1 1 auto',
@@ -150,12 +150,12 @@ const responsiveProperties = defineProperties({
paddingX: ['paddingLeft', 'paddingRight'],
paddingY: ['paddingTop', 'paddingBottom'],
},
-});
+})
const unresponsiveProperties = defineProperties({
properties: {
aspectRatio: {
- 'auto': 'auto',
+ auto: 'auto',
'1/1': '1 / 1',
'2/1': '2 / 1',
'4/1': '4 / 1',
@@ -207,12 +207,12 @@ const unresponsiveProperties = defineProperties({
'50': 50,
'75': 75,
'100': 100,
- 'auto': 'auto',
+ auto: 'auto',
},
},
-});
+})
-const boxShadowColorVar = createVar();
+const boxShadowColorVar = createVar()
const selectorProperties = defineProperties({
conditions: {
@@ -250,7 +250,7 @@ const selectorProperties = defineProperties({
color: vars.colors,
outlineColor: vars.colors,
},
-});
+})
const motionSafeProperties = defineProperties({
conditions: {
@@ -269,29 +269,29 @@ const motionSafeProperties = defineProperties({
'1000': '1000ms',
},
},
-});
+})
export const sprinkles = createSprinkles(
responsiveProperties,
unresponsiveProperties,
selectorProperties,
motionSafeProperties,
-);
-export type Sprinkles = Parameters[0];
+)
+export type Sprinkles = Parameters[0]
export type OptionalResponsiveValue =
- ConditionalValue;
+ ConditionalValue
export type RequiredResponsiveValue =
- RequiredConditionalValue;
+ RequiredConditionalValue
export type OptionalResponsiveObject =
| Value
- | Partial>;
+ | Partial>
export type RequiredResponsiveObject = Partial<
Record
> &
- Record;
+ Record
export const normalizeResponsiveValue =
- createNormalizeValueFn(responsiveProperties);
-export const mapResponsiveValue = createMapValueFn(responsiveProperties);
+ createNormalizeValueFn(responsiveProperties)
+export const mapResponsiveValue = createMapValueFn(responsiveProperties)
diff --git a/components/src/css/types.ts b/components/src/css/types.ts
new file mode 100644
index 0000000..81a4f37
--- /dev/null
+++ b/components/src/css/types.ts
@@ -0,0 +1,47 @@
+import { Accent, Tokens } from '../tokens'
+
+type BaseColors = Tokens['colors']['base'] & {
+ [key in Accent]: string
+}
+
+type ThemeColors = BaseColors & {
+ accent: string
+ accentText: string
+ accentSecondary?: string
+ accentSecondaryHover?: string
+ accentTertiary?: string
+ background: string
+ backgroundSecondary: string
+ backgroundTertiary: string
+ foreground: string
+ foregroundSecondary: string
+ foregroundSecondaryHover: string
+ foregroundTertiary: string
+ groupBackground: string
+ groupBorder: string
+ text: string
+ textPrimary: string
+ textSecondary: string
+ textTertiary: string
+}
+
+type ThemeMode = {
+ colors: Tokens['colors']['light']
+ shades: Tokens['shades']['light']
+}
+
+export type Theme = {
+ borderStyles: Tokens['borderStyles']
+ borderWidths: Tokens['borderWidths']
+ colors: ThemeColors
+ fonts: Tokens['fonts']
+ fontSizes: Tokens['fontSizes']
+ fontWeights: Tokens['fontWeights']
+ letterSpacings: Tokens['letterSpacings']
+ lineHeights: Tokens['lineHeights']
+ opacity: Tokens['opacity']
+ mode: ThemeMode
+ radii: Tokens['radii']
+ shadows: Tokens['shadows']
+ space: Tokens['space']
+}
diff --git a/packages/components/src/css/utils.test.ts b/components/src/css/utils.test.ts
similarity index 82%
rename from packages/components/src/css/utils.test.ts
rename to components/src/css/utils.test.ts
index 1375fd5..ef482eb 100644
--- a/packages/components/src/css/utils.test.ts
+++ b/components/src/css/utils.test.ts
@@ -1,11 +1,11 @@
-import { tokens } from '../tokens';
+import { tokens } from '../tokens'
import {
getAccentText,
getModeColors,
getVarName,
motionSafe,
rgb,
-} from './utils';
+} from './utils'
describe.each`
mode | accent | expected
@@ -16,9 +16,9 @@ describe.each`
${'dark'} | ${'yellow'} | ${tokens.colors.light.foreground}
`('getAccentText($mode, $accent)', ({ mode, accent, expected }) => {
it(`returns ${expected}`, () => {
- expect(getAccentText(mode, accent)).toEqual(expected);
- });
-});
+ expect(getAccentText(mode, accent)).toEqual(expected)
+ })
+})
describe.each`
mode | expected
@@ -26,9 +26,9 @@ describe.each`
${'dark'} | ${tokens.colors['dark']}
`('getModeColors($mode)', ({ mode, expected }) => {
it(`returns ${expected}`, () => {
- expect(getModeColors(mode)).toStrictEqual(expected);
- });
-});
+ expect(getModeColors(mode)).toStrictEqual(expected)
+ })
+})
describe.each`
value | path | expected
@@ -38,9 +38,9 @@ describe.each`
${'none'} | ${['borderStyles', 'none']} | ${'borderStyles-none'}
`('getVarName($value, $path)', ({ value, path, expected }) => {
it(`returns ${expected}`, () => {
- expect(getVarName(value, path)).toStrictEqual(expected);
- });
-});
+ expect(getVarName(value, path)).toStrictEqual(expected)
+ })
+})
describe.each`
partial | alpha | expected
@@ -48,9 +48,9 @@ describe.each`
${'255, 255, 255'} | ${'0.5'} | ${'rgba(255, 255, 255, 0.5)'}
`('rgb($partial, $alpha)', ({ partial, alpha, expected }) => {
it(`returns ${expected}`, () => {
- expect(rgb(partial, alpha)).toEqual(expected);
- });
-});
+ expect(rgb(partial, alpha)).toEqual(expected)
+ })
+})
describe.each`
style | expected
@@ -65,6 +65,6 @@ describe.each`
}}
`('motionSafe($style)', ({ style, expected }) => {
it(`returns ${expected}`, () => {
- expect(motionSafe(style)).toEqual(expected);
- });
-});
+ expect(motionSafe(style)).toEqual(expected)
+ })
+})
diff --git a/packages/components/src/css/utils.ts b/components/src/css/utils.ts
similarity index 61%
rename from packages/components/src/css/utils.ts
rename to components/src/css/utils.ts
index 1a79ded..0d2eea6 100644
--- a/packages/components/src/css/utils.ts
+++ b/components/src/css/utils.ts
@@ -1,23 +1,23 @@
-import { StyleRule } from '@vanilla-extract/css';
-import { CSSVarFunction } from '@vanilla-extract/private';
+import { StyleRule } from '@vanilla-extract/css'
+import { CSSVarFunction } from '@vanilla-extract/private'
-import { Accent, Mode, tokens } from '../tokens';
+import { Accent, Mode, tokens } from '../tokens'
export const rgb = (partial: string, alpha?: CSSVarFunction | string) =>
- alpha ? `rgba(${partial}, ${alpha})` : `rgb(${partial})`;
+ alpha ? `rgba(${partial}, ${alpha})` : `rgb(${partial})`
export const getAccentText = (mode: Mode, accent: Accent | 'foreground') =>
['foreground', 'yellow'].includes(accent) && mode === 'dark'
? tokens.colors.light.foreground
- : tokens.colors.dark.foreground;
+ : tokens.colors.dark.foreground
-export const getModeColors = (mode: Mode) => tokens.colors[mode];
+export const getModeColors = (mode: Mode) => tokens.colors[mode]
export const getVarName = (_value: string | null, path: string[]) =>
- path.join('-').replace('.', '_').replace('/', '__');
+ path.join('-').replace('.', '_').replace('/', '__')
export const motionSafe = (style: StyleRule) => ({
'@media': {
'(prefers-reduced-motion: no-preference)': style,
},
-});
+})
diff --git a/packages/components/src/css/vars.css.ts b/components/src/css/vars.css.ts
similarity index 71%
rename from packages/components/src/css/vars.css.ts
rename to components/src/css/vars.css.ts
index 51f7495..a5274f1 100644
--- a/packages/components/src/css/vars.css.ts
+++ b/components/src/css/vars.css.ts
@@ -1,24 +1,24 @@
-import merge from 'deepmerge';
+import merge from 'deepmerge'
import {
createGlobalTheme,
createGlobalThemeContract,
-} from '@vanilla-extract/css';
+} from '@vanilla-extract/css'
-import { Mode, tokens } from '../tokens';
-import { Theme } from './types';
-import { getVarName, rgb } from './utils';
+import { Mode, tokens } from '../tokens'
+import { Theme } from './types'
+import { getVarName, rgb } from './utils'
/* eslint-disable @typescript-eslint/no-unused-vars */
-const { colors, shades, ...restTokens } = tokens;
+const { colors, shades, ...restTokens } = tokens
/* eslint-enable @typescript-eslint/no-unused-vars */
-const baseTokens: Omit = restTokens;
-const baseVars = createGlobalThemeContract(baseTokens, getVarName);
-createGlobalTheme(':root', baseVars, baseTokens);
+const baseTokens: Omit = restTokens
+const baseVars = createGlobalThemeContract(baseTokens, getVarName)
+createGlobalTheme(':root', baseVars, baseTokens)
const makeColorScheme = (mode: Mode = 'light') => {
- const colors = tokens.colors[mode];
- const shades = tokens.shades[mode];
+ const colors = tokens.colors[mode]
+ const shades = tokens.shades[mode]
return {
colors: {
...tokens.colors.base,
@@ -56,15 +56,15 @@ const makeColorScheme = (mode: Mode = 'light') => {
},
shades,
},
- };
-};
+ }
+}
-const modeTokens = makeColorScheme('light');
-const modeVars = createGlobalThemeContract(modeTokens, getVarName);
-createGlobalTheme('[data-theme="light"]', modeVars, modeTokens);
-createGlobalTheme('[data-theme="dark"]', modeVars, makeColorScheme('dark'));
+const modeTokens = makeColorScheme('light')
+const modeVars = createGlobalThemeContract(modeTokens, getVarName)
+createGlobalTheme('[data-theme="light"]', modeVars, modeTokens)
+createGlobalTheme('[data-theme="dark"]', modeVars, makeColorScheme('dark'))
-const mode = modeVars.mode;
+const mode = modeVars.mode
const accentTokens = {
colors: {
accent: rgb(mode.colors.accent),
@@ -79,12 +79,12 @@ const accentTokens = {
`calc(${mode.shades.accentSecondary} * 0.5)`,
),
},
-};
-const accentVars = createGlobalThemeContract(accentTokens, getVarName);
-createGlobalTheme('[data-theme]', accentVars, accentTokens);
+}
+const accentVars = createGlobalThemeContract(accentTokens, getVarName)
+createGlobalTheme('[data-theme]', accentVars, accentTokens)
-type ColorVars = typeof modeVars & typeof accentVars;
-const colorVars = merge(accentVars, modeVars) as ColorVars;
+type ColorVars = typeof modeVars & typeof accentVars
+const colorVars = merge(accentVars, modeVars) as ColorVars
-type ThemeVars = typeof baseVars & typeof colorVars;
-export const vars = merge(baseVars, colorVars) as ThemeVars;
+type ThemeVars = typeof baseVars & typeof colorVars
+export const vars = merge(baseVars, colorVars) as ThemeVars
diff --git a/components/src/hooks/index.ts b/components/src/hooks/index.ts
new file mode 100644
index 0000000..96e20c0
--- /dev/null
+++ b/components/src/hooks/index.ts
@@ -0,0 +1,2 @@
+export { useFieldIds } from './useFieldIds'
+export { useId } from './useId'
diff --git a/packages/components/src/hooks/useFieldIds.test.ts b/components/src/hooks/useFieldIds.test.ts
similarity index 82%
rename from packages/components/src/hooks/useFieldIds.test.ts
rename to components/src/hooks/useFieldIds.test.ts
index 5bad0b5..4d47ed3 100644
--- a/packages/components/src/hooks/useFieldIds.test.ts
+++ b/components/src/hooks/useFieldIds.test.ts
@@ -1,12 +1,12 @@
-import { cleanup, renderHook } from '@/test';
+import { cleanup, renderHook } from '@/test'
-import { useFieldIds } from './useFieldIds';
+import { useFieldIds } from './useFieldIds'
const noArgs = {
content: {
'aria-describedby': undefined,
'aria-labelledby': 'degen1-label',
- 'id': 'degen1',
+ id: 'degen1',
},
description: undefined,
error: undefined,
@@ -14,13 +14,13 @@ const noArgs = {
htmlFor: 'degen1',
id: 'degen1-label',
},
-};
+}
const withId = {
content: {
'aria-describedby': undefined,
'aria-labelledby': 'degen2-address-label',
- 'id': 'degen2-address',
+ id: 'degen2-address',
},
description: undefined,
error: undefined,
@@ -28,13 +28,13 @@ const withId = {
htmlFor: 'degen2-address',
id: 'degen2-address-label',
},
-};
+}
const withDescription = {
content: {
'aria-describedby': 'degen3-description',
'aria-labelledby': 'degen3-label',
- 'id': 'degen3',
+ id: 'degen3',
},
description: {
id: 'degen3-description',
@@ -44,13 +44,13 @@ const withDescription = {
htmlFor: 'degen3',
id: 'degen3-label',
},
-};
+}
const withError = {
content: {
'aria-describedby': 'degen4-error',
'aria-labelledby': 'degen4-label',
- 'id': 'degen4',
+ id: 'degen4',
},
description: undefined,
error: {
@@ -60,13 +60,13 @@ const withError = {
htmlFor: 'degen4',
id: 'degen4-label',
},
-};
+}
const withDescriptionAndError = {
content: {
'aria-describedby': 'degen5-description degen5-error',
'aria-labelledby': 'degen5-label',
- 'id': 'degen5',
+ id: 'degen5',
},
description: {
id: 'degen5-description',
@@ -78,7 +78,7 @@ const withDescriptionAndError = {
htmlFor: 'degen5',
id: 'degen5-label',
},
-};
+}
describe.each`
args | expected
@@ -88,10 +88,10 @@ describe.each`
${{ error: true }} | ${withError}
${{ description: true, error: true }} | ${withDescriptionAndError}
`('useFieldIds($args)', ({ args, expected }) => {
- afterEach(cleanup);
+ afterEach(cleanup)
it(`returns ${JSON.stringify(expected)}`, () => {
- const { result } = renderHook(() => useFieldIds(args));
- expect(result.current).toStrictEqual(expected);
- });
-});
+ const { result } = renderHook(() => useFieldIds(args))
+ expect(result.current).toStrictEqual(expected)
+ })
+})
diff --git a/packages/components/src/hooks/useFieldIds.ts b/components/src/hooks/useFieldIds.ts
similarity index 51%
rename from packages/components/src/hooks/useFieldIds.ts
rename to components/src/hooks/useFieldIds.ts
index 2e6aeb2..0c6284b 100644
--- a/packages/components/src/hooks/useFieldIds.ts
+++ b/components/src/hooks/useFieldIds.ts
@@ -1,34 +1,34 @@
-import * as React from 'react';
+import * as React from 'react'
-import { useId } from './useId';
+import { useId } from './useId'
type Args = {
- description?: boolean;
- error?: boolean;
- id?: string;
-};
+ description?: boolean
+ error?: boolean
+ id?: string
+}
export const useFieldIds = ({
description: hasDescription,
error: hasError,
id: contentId,
}: Args = {}) => {
- const _id = useId();
+ const _id = useId()
return React.useMemo(() => {
- const id = `${_id}${contentId ? `-${contentId}` : ''}`;
- const labelId = `${id}-label`;
+ const id = `${_id}${contentId ? `-${contentId}` : ''}`
+ const labelId = `${id}-label`
- let describedBy;
- let description;
+ let describedBy
+ let description
if (hasDescription) {
- description = { id: `${id}-description` };
- describedBy = description.id;
+ description = { id: `${id}-description` }
+ describedBy = description.id
}
- let error;
+ let error
if (hasError) {
- error = { id: `${id}-error` };
- describedBy = `${describedBy ? `${describedBy} ` : ''}${error.id}`;
+ error = { id: `${id}-error` }
+ describedBy = `${describedBy ? `${describedBy} ` : ''}${error.id}`
}
return {
@@ -43,6 +43,6 @@ export const useFieldIds = ({
htmlFor: id,
id: labelId,
},
- };
- }, [_id, hasDescription, hasError, contentId]);
-};
+ }
+ }, [_id, hasDescription, hasError, contentId])
+}
diff --git a/components/src/hooks/useId.test.ts b/components/src/hooks/useId.test.ts
new file mode 100644
index 0000000..3576698
--- /dev/null
+++ b/components/src/hooks/useId.test.ts
@@ -0,0 +1,14 @@
+import { cleanup, renderHook } from '@/test'
+
+import { useId } from './useId'
+
+describe('useId', () => {
+ afterEach(cleanup)
+
+ it('generates id', () => {
+ const { result: resultA } = renderHook(() => useId())
+ expect(resultA.current).toStrictEqual('degen1')
+ const { result: resultB } = renderHook(() => useId())
+ expect(resultB.current).toStrictEqual('degen2')
+ })
+})
diff --git a/components/src/hooks/useId.ts b/components/src/hooks/useId.ts
new file mode 100644
index 0000000..841e8c3
--- /dev/null
+++ b/components/src/hooks/useId.ts
@@ -0,0 +1,22 @@
+import * as React from 'react'
+
+import { useIsoMorphicEffect } from './useIsoMorphicEffect'
+import { useServerHandoffComplete } from './useServerHandoffComplete'
+
+const idPrefix = 'degen'
+
+let id = 0
+function generateId() {
+ return ++id
+}
+
+export const useId = () => {
+ const ready = useServerHandoffComplete()
+ const [id, setId] = React.useState(ready ? generateId : null)
+
+ useIsoMorphicEffect(() => {
+ if (id === null) setId(generateId())
+ }, [id])
+
+ return id != null ? `${idPrefix}` + id : undefined
+}
diff --git a/packages/components/src/hooks/useIsoMorphicEffect.ts b/components/src/hooks/useIsoMorphicEffect.ts
similarity index 69%
rename from packages/components/src/hooks/useIsoMorphicEffect.ts
rename to components/src/hooks/useIsoMorphicEffect.ts
index b54eb54..61a5753 100644
--- a/packages/components/src/hooks/useIsoMorphicEffect.ts
+++ b/components/src/hooks/useIsoMorphicEffect.ts
@@ -1,4 +1,4 @@
-import * as React from 'react';
+import * as React from 'react'
export const useIsoMorphicEffect =
- typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;
+ typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect
diff --git a/components/src/hooks/useServerHandoffComplete.ts b/components/src/hooks/useServerHandoffComplete.ts
new file mode 100644
index 0000000..672aa90
--- /dev/null
+++ b/components/src/hooks/useServerHandoffComplete.ts
@@ -0,0 +1,21 @@
+import * as React from 'react'
+
+const state = { serverHandoffComplete: false }
+
+export const useServerHandoffComplete = () => {
+ const [serverHandoffComplete, setServerHandoffComplete] = React.useState(
+ state.serverHandoffComplete,
+ )
+
+ React.useEffect(() => {
+ if (serverHandoffComplete) return
+ setServerHandoffComplete(true)
+ }, [serverHandoffComplete])
+
+ React.useEffect(() => {
+ if (state.serverHandoffComplete) return
+ state.serverHandoffComplete = true
+ }, [])
+
+ return serverHandoffComplete
+}
diff --git a/components/src/icons/ArrowDown.svg b/components/src/icons/ArrowDown.svg
new file mode 100644
index 0000000..eb07063
--- /dev/null
+++ b/components/src/icons/ArrowDown.svg
@@ -0,0 +1,13 @@
+
diff --git a/components/src/icons/ArrowRight.svg b/components/src/icons/ArrowRight.svg
new file mode 100644
index 0000000..f279f0f
--- /dev/null
+++ b/components/src/icons/ArrowRight.svg
@@ -0,0 +1,13 @@
+
diff --git a/components/src/icons/ArrowUp.svg b/components/src/icons/ArrowUp.svg
new file mode 100644
index 0000000..f214d6f
--- /dev/null
+++ b/components/src/icons/ArrowUp.svg
@@ -0,0 +1,13 @@
+
diff --git a/components/src/icons/BookOpen.svg b/components/src/icons/BookOpen.svg
new file mode 100644
index 0000000..cfa3fe4
--- /dev/null
+++ b/components/src/icons/BookOpen.svg
@@ -0,0 +1,13 @@
+
diff --git a/components/src/icons/Check.svg b/components/src/icons/Check.svg
new file mode 100644
index 0000000..3dd918e
--- /dev/null
+++ b/components/src/icons/Check.svg
@@ -0,0 +1,13 @@
+
diff --git a/components/src/icons/ChevronDown.svg b/components/src/icons/ChevronDown.svg
new file mode 100644
index 0000000..f59bb6e
--- /dev/null
+++ b/components/src/icons/ChevronDown.svg
@@ -0,0 +1,13 @@
+
diff --git a/components/src/icons/ChevronLeft.svg b/components/src/icons/ChevronLeft.svg
new file mode 100644
index 0000000..4333739
--- /dev/null
+++ b/components/src/icons/ChevronLeft.svg
@@ -0,0 +1,13 @@
+
diff --git a/components/src/icons/ChevronRight.svg b/components/src/icons/ChevronRight.svg
new file mode 100644
index 0000000..f4f3b62
--- /dev/null
+++ b/components/src/icons/ChevronRight.svg
@@ -0,0 +1,13 @@
+
diff --git a/components/src/icons/ChevronUp.svg b/components/src/icons/ChevronUp.svg
new file mode 100644
index 0000000..fd84359
--- /dev/null
+++ b/components/src/icons/ChevronUp.svg
@@ -0,0 +1,13 @@
+
diff --git a/components/src/icons/Close.svg b/components/src/icons/Close.svg
new file mode 100644
index 0000000..9cd7b97
--- /dev/null
+++ b/components/src/icons/Close.svg
@@ -0,0 +1,13 @@
+
diff --git a/components/src/icons/Code.svg b/components/src/icons/Code.svg
new file mode 100644
index 0000000..d22416f
--- /dev/null
+++ b/components/src/icons/Code.svg
@@ -0,0 +1,13 @@
+
diff --git a/components/src/icons/Cog.svg b/components/src/icons/Cog.svg
new file mode 100644
index 0000000..3707343
--- /dev/null
+++ b/components/src/icons/Cog.svg
@@ -0,0 +1,19 @@
+
diff --git a/components/src/icons/Collection.svg b/components/src/icons/Collection.svg
new file mode 100644
index 0000000..bbcdedb
--- /dev/null
+++ b/components/src/icons/Collection.svg
@@ -0,0 +1,13 @@
+
diff --git a/components/src/icons/Documents.svg b/components/src/icons/Documents.svg
new file mode 100644
index 0000000..53c852d
--- /dev/null
+++ b/components/src/icons/Documents.svg
@@ -0,0 +1,13 @@
+
diff --git a/components/src/icons/DotsHorizontal.svg b/components/src/icons/DotsHorizontal.svg
new file mode 100644
index 0000000..fb3cc8d
--- /dev/null
+++ b/components/src/icons/DotsHorizontal.svg
@@ -0,0 +1,3 @@
+
diff --git a/components/src/icons/DotsVertical.svg b/components/src/icons/DotsVertical.svg
new file mode 100644
index 0000000..d145620
--- /dev/null
+++ b/components/src/icons/DotsVertical.svg
@@ -0,0 +1,13 @@
+
diff --git a/components/src/icons/Duplicate.svg b/components/src/icons/Duplicate.svg
new file mode 100644
index 0000000..2b06a53
--- /dev/null
+++ b/components/src/icons/Duplicate.svg
@@ -0,0 +1,13 @@
+
diff --git a/components/src/icons/Eth.svg b/components/src/icons/Eth.svg
new file mode 100644
index 0000000..6820da5
--- /dev/null
+++ b/components/src/icons/Eth.svg
@@ -0,0 +1,8 @@
+
diff --git a/components/src/icons/Exclamation.svg b/components/src/icons/Exclamation.svg
new file mode 100644
index 0000000..5cff7b7
--- /dev/null
+++ b/components/src/icons/Exclamation.svg
@@ -0,0 +1,13 @@
+
diff --git a/components/src/icons/Flag.svg b/components/src/icons/Flag.svg
new file mode 100644
index 0000000..4b27c4a
--- /dev/null
+++ b/components/src/icons/Flag.svg
@@ -0,0 +1,13 @@
+
diff --git a/components/src/icons/Grid.svg b/components/src/icons/Grid.svg
new file mode 100644
index 0000000..f4034d9
--- /dev/null
+++ b/components/src/icons/Grid.svg
@@ -0,0 +1,13 @@
+
diff --git a/components/src/icons/GridSolid.svg b/components/src/icons/GridSolid.svg
new file mode 100644
index 0000000..7b774cb
--- /dev/null
+++ b/components/src/icons/GridSolid.svg
@@ -0,0 +1,6 @@
+
diff --git a/components/src/icons/Hand.svg b/components/src/icons/Hand.svg
new file mode 100644
index 0000000..0894828
--- /dev/null
+++ b/components/src/icons/Hand.svg
@@ -0,0 +1,13 @@
+
diff --git a/components/src/icons/Link.svg b/components/src/icons/Link.svg
new file mode 100644
index 0000000..1c814dd
--- /dev/null
+++ b/components/src/icons/Link.svg
@@ -0,0 +1,13 @@
+
diff --git a/components/src/icons/List.svg b/components/src/icons/List.svg
new file mode 100644
index 0000000..173f95a
--- /dev/null
+++ b/components/src/icons/List.svg
@@ -0,0 +1,13 @@
+
diff --git a/components/src/icons/LockClosed.svg b/components/src/icons/LockClosed.svg
new file mode 100644
index 0000000..2a3a707
--- /dev/null
+++ b/components/src/icons/LockClosed.svg
@@ -0,0 +1,13 @@
+
diff --git a/components/src/icons/Menu.svg b/components/src/icons/Menu.svg
new file mode 100644
index 0000000..a3a63d2
--- /dev/null
+++ b/components/src/icons/Menu.svg
@@ -0,0 +1,13 @@
+
diff --git a/components/src/icons/Moon.svg b/components/src/icons/Moon.svg
new file mode 100644
index 0000000..5482104
--- /dev/null
+++ b/components/src/icons/Moon.svg
@@ -0,0 +1,13 @@
+
diff --git a/components/src/icons/Pencil.svg b/components/src/icons/Pencil.svg
new file mode 100644
index 0000000..e39dd68
--- /dev/null
+++ b/components/src/icons/Pencil.svg
@@ -0,0 +1,13 @@
+
diff --git a/components/src/icons/Plug.svg b/components/src/icons/Plug.svg
new file mode 100644
index 0000000..9485c8a
--- /dev/null
+++ b/components/src/icons/Plug.svg
@@ -0,0 +1,12 @@
+
diff --git a/components/src/icons/Plus.svg b/components/src/icons/Plus.svg
new file mode 100644
index 0000000..406c5f2
--- /dev/null
+++ b/components/src/icons/Plus.svg
@@ -0,0 +1,13 @@
+
diff --git a/components/src/icons/PlusSmall.svg b/components/src/icons/PlusSmall.svg
new file mode 100644
index 0000000..cca2408
--- /dev/null
+++ b/components/src/icons/PlusSmall.svg
@@ -0,0 +1,13 @@
+
diff --git a/components/src/icons/Refresh.svg b/components/src/icons/Refresh.svg
new file mode 100644
index 0000000..73c62d0
--- /dev/null
+++ b/components/src/icons/Refresh.svg
@@ -0,0 +1,13 @@
+
diff --git a/components/src/icons/Search.svg b/components/src/icons/Search.svg
new file mode 100644
index 0000000..8716f6b
--- /dev/null
+++ b/components/src/icons/Search.svg
@@ -0,0 +1,13 @@
+
diff --git a/components/src/icons/Split.svg b/components/src/icons/Split.svg
new file mode 100644
index 0000000..1002dbd
--- /dev/null
+++ b/components/src/icons/Split.svg
@@ -0,0 +1,19 @@
+
diff --git a/components/src/icons/Sun.svg b/components/src/icons/Sun.svg
new file mode 100644
index 0000000..5487e06
--- /dev/null
+++ b/components/src/icons/Sun.svg
@@ -0,0 +1,13 @@
+
diff --git a/components/src/icons/Tokens.svg b/components/src/icons/Tokens.svg
new file mode 100644
index 0000000..97c323d
--- /dev/null
+++ b/components/src/icons/Tokens.svg
@@ -0,0 +1,14 @@
+
diff --git a/components/src/icons/Trash.svg b/components/src/icons/Trash.svg
new file mode 100644
index 0000000..786b6e3
--- /dev/null
+++ b/components/src/icons/Trash.svg
@@ -0,0 +1,3 @@
+
diff --git a/components/src/icons/TrendingUp.svg b/components/src/icons/TrendingUp.svg
new file mode 100644
index 0000000..0e6acd9
--- /dev/null
+++ b/components/src/icons/TrendingUp.svg
@@ -0,0 +1,13 @@
+
diff --git a/components/src/icons/Upload.svg b/components/src/icons/Upload.svg
new file mode 100644
index 0000000..3ce7f33
--- /dev/null
+++ b/components/src/icons/Upload.svg
@@ -0,0 +1,13 @@
+
diff --git a/components/src/icons/UserSolid.svg b/components/src/icons/UserSolid.svg
new file mode 100644
index 0000000..12943a8
--- /dev/null
+++ b/components/src/icons/UserSolid.svg
@@ -0,0 +1,8 @@
+
diff --git a/components/src/icons/UsersSolid.svg b/components/src/icons/UsersSolid.svg
new file mode 100644
index 0000000..2a8c59b
--- /dev/null
+++ b/components/src/icons/UsersSolid.svg
@@ -0,0 +1,6 @@
+
diff --git a/components/src/icons/Wallet.svg b/components/src/icons/Wallet.svg
new file mode 100644
index 0000000..e7404d9
--- /dev/null
+++ b/components/src/icons/Wallet.svg
@@ -0,0 +1,13 @@
+
diff --git a/packages/components/src/index.test.ts b/components/src/index.test.ts
similarity index 86%
rename from packages/components/src/index.test.ts
rename to components/src/index.test.ts
index 0a1d2bb..5c00653 100644
--- a/packages/components/src/index.test.ts
+++ b/components/src/index.test.ts
@@ -1,14 +1,15 @@
-import * as Exports from './';
+import { glob } from 'glob'
-import { glob } from 'glob';
-import path from 'path';
+import path from 'path'
+
+import * as Exports from './'
const generatedIconPaths = glob.sync('components/icons/generated/Icon*/', {
cwd: __dirname,
absolute: true,
-});
+})
-const generatedIcons = generatedIconPaths.map((x) => path.basename(x));
+const generatedIcons = generatedIconPaths.map((x) => path.basename(x))
it('should expose correct exports', () => {
expect(Object.keys(Exports)).toEqual([
@@ -23,6 +24,8 @@ it('should expose correct exports', () => {
'FileInput',
'Heading',
'IconNFT',
+ 'MediaPicker',
+ 'Range',
'Skeleton',
'SkeletonGroup',
'Spinner',
@@ -46,5 +49,5 @@ it('should expose correct exports', () => {
'vars',
// generated icons
...generatedIcons,
- ]);
-});
+ ])
+})
diff --git a/packages/components/src/index.ts b/components/src/index.ts
similarity index 74%
rename from packages/components/src/index.ts
rename to components/src/index.ts
index 6713414..5c3c21c 100644
--- a/packages/components/src/index.ts
+++ b/components/src/index.ts
@@ -9,6 +9,8 @@ export {
FileInput,
Heading,
IconNFT,
+ MediaPicker,
+ Range,
Skeleton,
SkeletonGroup,
Spinner,
@@ -21,8 +23,11 @@ export {
ThemeProvider,
useTheme,
VisuallyHidden,
-} from './components';
-export type { BoxProps } from './components';
+} from './components'
+export type { BoxProps } from './components'
+
+// Export generated icons
+export * from './components/icons/generated'
export {
atoms,
@@ -33,7 +38,7 @@ export {
normalizeResponsiveValue,
responsiveStyle,
vars,
-} from './css';
+} from './css'
export type {
Atoms,
Breakpoint,
@@ -43,4 +48,4 @@ export type {
RequiredResponsiveValue,
Sprinkles,
Theme,
-} from './css';
+} from './css'
diff --git a/packages/components/src/tokens/border.ts b/components/src/tokens/border.ts
similarity index 69%
rename from packages/components/src/tokens/border.ts
rename to components/src/tokens/border.ts
index de2d33c..ad7edce 100644
--- a/packages/components/src/tokens/border.ts
+++ b/components/src/tokens/border.ts
@@ -1,25 +1,25 @@
export const borderStyles = {
none: 'none',
solid: 'solid',
-};
+}
export const borderWidths = {
'0': '0px',
- 'px': '1px',
+ px: '1px',
'0.375': '0.09375rem',
'0.5': '0.125rem',
'0.75': '0.1875rem',
'1': '0.25rem',
'2': '0.5rem',
-};
+}
export const radii = {
- 'none': '0',
- 'medium': '0.375rem',
- 'large': '0.5rem',
- 'extraLarge': '0.75rem',
+ none: '0',
+ medium: '0.375rem',
+ large: '0.5rem',
+ extraLarge: '0.75rem',
'2xLarge': '1rem',
'3xLarge': '1.5rem',
'4xLarge': '2.5rem',
- 'full': '9999px',
-};
+ full: '9999px',
+}
diff --git a/packages/components/src/tokens/color.ts b/components/src/tokens/color.ts
similarity index 97%
rename from packages/components/src/tokens/color.ts
rename to components/src/tokens/color.ts
index 6b71cbb..2e4fd01 100644
--- a/packages/components/src/tokens/color.ts
+++ b/components/src/tokens/color.ts
@@ -1,4 +1,4 @@
-export type Mode = 'light' | 'dark';
+export type Mode = 'light' | 'dark'
export type Accent =
| 'blue'
@@ -9,7 +9,7 @@ export type Accent =
| 'purple'
| 'red'
| 'teal'
- | 'yellow';
+ | 'yellow'
const accents: { [key in Mode]: { [key in Accent]: string } } = {
light: {
@@ -34,7 +34,7 @@ const accents: { [key in Mode]: { [key in Accent]: string } } = {
teal: '100, 210, 255',
yellow: '255, 214, 10',
},
-};
+}
export const colors = {
base: {
@@ -62,7 +62,7 @@ export const colors = {
groupBorder: '255, 255, 255',
...accents.dark,
},
-};
+}
export const shades = {
light: {
@@ -93,4 +93,4 @@ export const shades = {
textTertiary: '0.35',
textTertiaryHover: '0.4',
},
-};
+}
diff --git a/components/src/tokens/index.ts b/components/src/tokens/index.ts
new file mode 100644
index 0000000..5666239
--- /dev/null
+++ b/components/src/tokens/index.ts
@@ -0,0 +1,31 @@
+import { borderStyles, borderWidths, radii } from './border'
+import { shadows } from './shadows'
+import { colors, shades } from './color'
+import { opacity } from './opacity'
+import { space } from './space'
+import {
+ fontSizes,
+ fontWeights,
+ fonts,
+ letterSpacings,
+ lineHeights,
+} from './typography'
+
+export const tokens = {
+ borderStyles,
+ borderWidths,
+ colors,
+ fonts,
+ fontSizes,
+ fontWeights,
+ letterSpacings,
+ lineHeights,
+ opacity,
+ radii,
+ shades,
+ shadows,
+ space,
+}
+
+export type { Accent, Mode } from './color'
+export type Tokens = typeof tokens
diff --git a/packages/components/src/tokens/opacity.ts b/components/src/tokens/opacity.ts
similarity index 52%
rename from packages/components/src/tokens/opacity.ts
rename to components/src/tokens/opacity.ts
index 60326f9..a83fb33 100644
--- a/packages/components/src/tokens/opacity.ts
+++ b/components/src/tokens/opacity.ts
@@ -1,5 +1,5 @@
export const opacity = {
'0': '0',
- '50': '50',
- '100': '100',
-};
+ '50': '0.5',
+ '100': '1',
+}
diff --git a/packages/components/src/tokens/shadows.ts b/components/src/tokens/shadows.ts
similarity index 87%
rename from packages/components/src/tokens/shadows.ts
rename to components/src/tokens/shadows.ts
index e1cb557..86d1c70 100644
--- a/packages/components/src/tokens/shadows.ts
+++ b/components/src/tokens/shadows.ts
@@ -1,8 +1,8 @@
export const shadows = {
- 'none': 'none',
+ none: 'none',
'-px': 'inset 0 0 0 1px',
'0': '0 0 0 0',
'0.5': '0 0 0 0.125rem',
'1': '0 0 0 0.25rem',
'2': '0 0 0 0.5rem',
-};
+}
diff --git a/packages/components/src/tokens/space.ts b/components/src/tokens/space.ts
similarity index 78%
rename from packages/components/src/tokens/space.ts
rename to components/src/tokens/space.ts
index 33f427b..c19d0a2 100644
--- a/packages/components/src/tokens/space.ts
+++ b/components/src/tokens/space.ts
@@ -1,6 +1,6 @@
export const space = {
'0': '0',
- 'px': '1px',
+ px: '1px',
'0.5': '0.125rem',
'1': '0.25rem',
'1.5': '0.375rem',
@@ -38,12 +38,12 @@ export const space = {
'76': '19rem',
'80': '20rem',
'96': '24rem',
- 'auto': 'auto',
- 'full': '100%',
- 'fit': 'fit-content',
- 'max': 'max-content',
- 'min': 'min-content',
- 'viewHeight': '100vh',
- 'viewWidth': '100vw',
- 'none': '0',
-};
+ auto: 'auto',
+ full: '100%',
+ fit: 'fit-content',
+ max: 'max-content',
+ min: 'min-content',
+ viewHeight: '100vh',
+ viewWidth: '100vw',
+ none: '0',
+}
diff --git a/packages/components/src/tokens/typography.ts b/components/src/tokens/typography.ts
similarity index 93%
rename from packages/components/src/tokens/typography.ts
rename to components/src/tokens/typography.ts
index c0be59e..d023156 100644
--- a/packages/components/src/tokens/typography.ts
+++ b/components/src/tokens/typography.ts
@@ -1,7 +1,7 @@
export const fonts = {
mono: `"iAWriter Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace`,
sans: `"Inter var", system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"`,
-};
+}
export const fontSizes = {
headingOne: '3rem',
@@ -12,7 +12,7 @@ export const fontSizes = {
label: '0.8125rem',
base: '1.0625rem',
root: '16px',
-};
+}
export const fontWeights = {
light: '300',
@@ -20,22 +20,22 @@ export const fontWeights = {
medium: '500',
semiBold: '550',
bold: '650',
-};
+}
export const letterSpacings = {
'-0.02': '-0.02em',
'-0.015': '-0.015em',
'-0.01': '-0.01em',
- 'normal': '0',
+ normal: '0',
'0.03': '0.03em',
-};
+}
export const lineHeights = {
- 'normal': 'normal',
- 'none': '1',
+ normal: 'normal',
+ none: '1',
'1.25': '1.25', // tight
'1.375': '1.375', // snug
'1.5': '1.5', // normal
'1.625': '1.625', // relaxed
'2': '2', // loose
-};
+}
diff --git a/components/src/types/focus-visible.d.ts b/components/src/types/focus-visible.d.ts
new file mode 100644
index 0000000..9324650
--- /dev/null
+++ b/components/src/types/focus-visible.d.ts
@@ -0,0 +1 @@
+declare module 'focus-visible'
diff --git a/packages/components/src/types/index.ts b/components/src/types/index.ts
similarity index 64%
rename from packages/components/src/types/index.ts
rename to components/src/types/index.ts
index 0f0d4ab..b212f32 100644
--- a/packages/components/src/types/index.ts
+++ b/components/src/types/index.ts
@@ -1,6 +1,6 @@
-import * as React from 'react';
+import * as React from 'react'
-export type AllOrNone = T | { [K in keyof T]?: never };
+export type AllOrNone = T | { [K in keyof T]?: never }
/*
* Disallow string from React.ReactNode
@@ -10,9 +10,9 @@ export type ReactNodeNoStrings =
| React.ReactNodeArray
| boolean
| null
- | undefined;
+ | undefined
/* Basic empty type instead of using `{}`
* https://github.com/typescript-eslint/typescript-eslint/issues/2063#issuecomment-675156492
*/
-export type EmptyObject = { [k: string]: unknown };
+export type EmptyObject = { [k: string]: unknown }
diff --git a/packages/components/test/index.tsx b/components/test/index.tsx
similarity index 67%
rename from packages/components/test/index.tsx
rename to components/test/index.tsx
index f0a2c20..a4bf2f1 100644
--- a/packages/components/test/index.tsx
+++ b/components/test/index.tsx
@@ -1,43 +1,43 @@
-import * as React from 'react';
-import { RenderResult, render as defaultRender } from '@testing-library/react';
+import * as React from 'react'
+import { RenderResult, render as defaultRender } from '@testing-library/react'
import {
RenderHookOptions,
WrapperComponent,
renderHook as defaultRenderHook,
-} from '@testing-library/react-hooks';
+} from '@testing-library/react-hooks'
import {
ThemeProvider,
ThemeProviderProps,
-} from '../src/components/ThemeProvider';
+} from '../src/components/ThemeProvider'
-import '@testing-library/jest-dom/extend-expect';
-import './mocks/URL.js';
+import '@testing-library/jest-dom/extend-expect'
+import './mocks/URL.js'
type ProvidersProps = {
children:
| React.ReactElement>
- | React.ReactNode;
- themeProps?: ThemeProviderProps;
-};
+ | React.ReactNode
+ themeProps?: ThemeProviderProps
+}
export const Providers = ({ children, themeProps }: ProvidersProps) => {
- return {children};
-};
+ return {children}
+}
// --------------------------------------------------
// Override default test render with our own
// --------------------------------------------------
-type DefaultParams = Parameters;
-type RenderUI = DefaultParams[0];
-type RenderOptions = DefaultParams[1];
+type DefaultParams = Parameters
+type RenderUI = DefaultParams[0]
+type RenderOptions = DefaultParams[1]
const render = (
ui: RenderUI,
{ wrapper, ...options }: RenderOptions = {},
): RenderResult => {
- if (!wrapper) wrapper = Providers as any;
- return defaultRender(ui, { wrapper, ...options });
-};
+ if (!wrapper) wrapper = Providers as any
+ return defaultRender(ui, { wrapper, ...options })
+}
// --------------------------------------------------
// Override default test renderHook with our own
@@ -46,20 +46,20 @@ export const renderHook = (
hook: (props: TProps) => TResult,
{ wrapper, ...options }: RenderHookOptions | undefined = {},
) => {
- if (!wrapper) wrapper = Providers as WrapperComponent;
- return defaultRenderHook(hook, { wrapper, ...options });
-};
+ if (!wrapper) wrapper = Providers as WrapperComponent
+ return defaultRenderHook(hook, { wrapper, ...options })
+}
// --------------------------------------------------
// re-export everything
// --------------------------------------------------
/* eslint-disable import/export */
-export * from '@testing-library/react';
+export * from '@testing-library/react'
/* eslint-enable import/export */
-export { default as userEvent } from '@testing-library/user-event';
-export { act as actHook } from '@testing-library/react-hooks';
+export { default as userEvent } from '@testing-library/user-event'
+export { act as actHook } from '@testing-library/react-hooks'
// override methods
/* eslint-disable import/export */
-export { render };
+export { render }
/* eslint-enable import/export */
diff --git a/packages/components/test/mocks/URL.js b/components/test/mocks/URL.js
similarity index 100%
rename from packages/components/test/mocks/URL.js
rename to components/test/mocks/URL.js
diff --git a/packages/components/tsconfig.json b/components/tsconfig.json
similarity index 68%
rename from packages/components/tsconfig.json
rename to components/tsconfig.json
index c7182c7..32b52ab 100644
--- a/packages/components/tsconfig.json
+++ b/components/tsconfig.json
@@ -15,16 +15,8 @@
"strict": true,
"strictNullChecks": true,
"target": "esnext",
- "baseUrl": "./",
- "declaration": true,
- "jsx": "react",
- "outDir": "./dist/types",
- "paths": {
- "!/*": ["../*"],
- "@/*": ["./*"]
- },
- "types": ["@testing-library/jest-dom", "jest"]
+ "types": ["node"]
},
- "include": ["src"],
+ "include": ["components/**/*", "docs/**/*", "playroom/**/*"],
"exclude": ["node_modules"]
-}
+}
\ No newline at end of file
diff --git a/packages/components/vite.config.ts b/components/vite.config.ts
similarity index 83%
rename from packages/components/vite.config.ts
rename to components/vite.config.ts
index 7bf39cc..842b511 100644
--- a/packages/components/vite.config.ts
+++ b/components/vite.config.ts
@@ -1,9 +1,9 @@
-import { defineConfig } from 'vite';
-import { vanillaExtractPlugin } from '@vanilla-extract/vite-plugin';
-import dts from 'vite-plugin-dts';
-import tsconfigPaths from 'vite-tsconfig-paths';
+import { defineConfig } from 'vite'
+import { vanillaExtractPlugin } from '@vanilla-extract/vite-plugin'
+import dts from 'vite-plugin-dts'
+import tsconfigPaths from 'vite-tsconfig-paths'
-import pkg from './package.json';
+import pkg from './package.json'
export default defineConfig({
build: {
@@ -39,4 +39,4 @@ export default defineConfig({
outputDir: 'dist/types',
}),
],
-});
+})
diff --git a/components/yarn.lock b/components/yarn.lock
new file mode 100644
index 0000000..42162ce
--- /dev/null
+++ b/components/yarn.lock
@@ -0,0 +1,3926 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@ampproject/remapping@^2.1.0":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.2.tgz#4edca94973ded9630d20101cd8559cedb8d8bd34"
+ integrity sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==
+ dependencies:
+ "@jridgewell/trace-mapping" "^0.3.0"
+
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789"
+ integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==
+ dependencies:
+ "@babel/highlight" "^7.16.7"
+
+"@babel/compat-data@^7.17.7":
+ version "7.17.7"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.7.tgz#078d8b833fbbcc95286613be8c716cef2b519fa2"
+ integrity sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==
+
+"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.15.5", "@babel/core@^7.7.2", "@babel/core@^7.8.0":
+ version "7.17.9"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.9.tgz#6bae81a06d95f4d0dec5bb9d74bbc1f58babdcfe"
+ integrity sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==
+ dependencies:
+ "@ampproject/remapping" "^2.1.0"
+ "@babel/code-frame" "^7.16.7"
+ "@babel/generator" "^7.17.9"
+ "@babel/helper-compilation-targets" "^7.17.7"
+ "@babel/helper-module-transforms" "^7.17.7"
+ "@babel/helpers" "^7.17.9"
+ "@babel/parser" "^7.17.9"
+ "@babel/template" "^7.16.7"
+ "@babel/traverse" "^7.17.9"
+ "@babel/types" "^7.17.0"
+ convert-source-map "^1.7.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.2.1"
+ semver "^6.3.0"
+
+"@babel/generator@^7.17.9", "@babel/generator@^7.7.2":
+ version "7.17.9"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.9.tgz#f4af9fd38fa8de143c29fce3f71852406fc1e2fc"
+ integrity sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==
+ dependencies:
+ "@babel/types" "^7.17.0"
+ jsesc "^2.5.1"
+ source-map "^0.5.0"
+
+"@babel/helper-compilation-targets@^7.17.7":
+ version "7.17.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz#a3c2924f5e5f0379b356d4cfb313d1414dc30e46"
+ integrity sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==
+ dependencies:
+ "@babel/compat-data" "^7.17.7"
+ "@babel/helper-validator-option" "^7.16.7"
+ browserslist "^4.17.5"
+ semver "^6.3.0"
+
+"@babel/helper-environment-visitor@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7"
+ integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-function-name@^7.17.9":
+ version "7.17.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12"
+ integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==
+ dependencies:
+ "@babel/template" "^7.16.7"
+ "@babel/types" "^7.17.0"
+
+"@babel/helper-hoist-variables@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246"
+ integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-module-imports@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437"
+ integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-module-transforms@^7.17.7":
+ version "7.17.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz#3943c7f777139e7954a5355c815263741a9c1cbd"
+ integrity sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.16.7"
+ "@babel/helper-module-imports" "^7.16.7"
+ "@babel/helper-simple-access" "^7.17.7"
+ "@babel/helper-split-export-declaration" "^7.16.7"
+ "@babel/helper-validator-identifier" "^7.16.7"
+ "@babel/template" "^7.16.7"
+ "@babel/traverse" "^7.17.3"
+ "@babel/types" "^7.17.0"
+
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5"
+ integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==
+
+"@babel/helper-simple-access@^7.17.7":
+ version "7.17.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz#aaa473de92b7987c6dfa7ce9a7d9674724823367"
+ integrity sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==
+ dependencies:
+ "@babel/types" "^7.17.0"
+
+"@babel/helper-split-export-declaration@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b"
+ integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-validator-identifier@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad"
+ integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==
+
+"@babel/helper-validator-option@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23"
+ integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==
+
+"@babel/helpers@^7.17.9":
+ version "7.17.9"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.9.tgz#b2af120821bfbe44f9907b1826e168e819375a1a"
+ integrity sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==
+ dependencies:
+ "@babel/template" "^7.16.7"
+ "@babel/traverse" "^7.17.9"
+ "@babel/types" "^7.17.0"
+
+"@babel/highlight@^7.16.7":
+ version "7.17.9"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.9.tgz#61b2ee7f32ea0454612def4fccdae0de232b73e3"
+ integrity sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.16.7"
+ chalk "^2.0.0"
+ js-tokens "^4.0.0"
+
+"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.9":
+ version "7.17.9"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.9.tgz#9c94189a6062f0291418ca021077983058e171ef"
+ integrity sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==
+
+"@babel/plugin-syntax-async-generators@^7.8.4":
+ version "7.8.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
+ integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-bigint@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea"
+ integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-class-properties@^7.8.3":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10"
+ integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-syntax-import-meta@^7.8.3":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51"
+ integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-json-strings@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
+ integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-logical-assignment-operators@^7.8.3":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
+ integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
+ integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-numeric-separator@^7.8.3":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97"
+ integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-object-rest-spread@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
+ integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-catch-binding@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1"
+ integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-chaining@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
+ integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-top-level-await@^7.8.3":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c"
+ integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-typescript@^7.7.2":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz#39c9b55ee153151990fb038651d58d3fd03f98f8"
+ integrity sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/runtime@^7.12.5", "@babel/runtime@^7.9.2":
+ version "7.17.9"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.9.tgz#d19fbf802d01a8cb6cf053a64e472d42c434ba72"
+ integrity sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==
+ dependencies:
+ regenerator-runtime "^0.13.4"
+
+"@babel/template@^7.16.7", "@babel/template@^7.3.3":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155"
+ integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==
+ dependencies:
+ "@babel/code-frame" "^7.16.7"
+ "@babel/parser" "^7.16.7"
+ "@babel/types" "^7.16.7"
+
+"@babel/traverse@^7.17.3", "@babel/traverse@^7.17.9", "@babel/traverse@^7.7.2":
+ version "7.17.9"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.9.tgz#1f9b207435d9ae4a8ed6998b2b82300d83c37a0d"
+ integrity sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==
+ dependencies:
+ "@babel/code-frame" "^7.16.7"
+ "@babel/generator" "^7.17.9"
+ "@babel/helper-environment-visitor" "^7.16.7"
+ "@babel/helper-function-name" "^7.17.9"
+ "@babel/helper-hoist-variables" "^7.16.7"
+ "@babel/helper-split-export-declaration" "^7.16.7"
+ "@babel/parser" "^7.17.9"
+ "@babel/types" "^7.17.0"
+ debug "^4.1.0"
+ globals "^11.1.0"
+
+"@babel/types@^7.0.0", "@babel/types@^7.15.6", "@babel/types@^7.16.7", "@babel/types@^7.17.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3":
+ version "7.17.0"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b"
+ integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.16.7"
+ to-fast-properties "^2.0.0"
+
+"@bcoe/v8-coverage@^0.2.3":
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
+ integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
+
+"@cspotcode/source-map-consumer@0.8.0":
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b"
+ integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==
+
+"@cspotcode/source-map-support@0.7.0":
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5"
+ integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==
+ dependencies:
+ "@cspotcode/source-map-consumer" "0.8.0"
+
+"@cush/relative@^1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@cush/relative/-/relative-1.0.0.tgz#8cd1769bf9bde3bb27dac356b1bc94af40f6cc16"
+ integrity sha512-RpfLEtTlyIxeNPGKcokS+p3BZII/Q3bYxryFRglh5H3A3T8q9fsLYm72VYAMEOOIBLEa8o93kFLiBDUWKrwXZA==
+
+"@emotion/hash@^0.8.0":
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413"
+ integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==
+
+"@istanbuljs/load-nyc-config@^1.0.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced"
+ integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==
+ dependencies:
+ camelcase "^5.3.1"
+ find-up "^4.1.0"
+ get-package-type "^0.1.0"
+ js-yaml "^3.13.1"
+ resolve-from "^5.0.0"
+
+"@istanbuljs/schema@^0.1.2":
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98"
+ integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==
+
+"@jest/console@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.5.1.tgz#260fe7239602fe5130a94f1aa386eff54b014bba"
+ integrity sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ jest-message-util "^27.5.1"
+ jest-util "^27.5.1"
+ slash "^3.0.0"
+
+"@jest/core@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.5.1.tgz#267ac5f704e09dc52de2922cbf3af9edcd64b626"
+ integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==
+ dependencies:
+ "@jest/console" "^27.5.1"
+ "@jest/reporters" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/transform" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ ansi-escapes "^4.2.1"
+ chalk "^4.0.0"
+ emittery "^0.8.1"
+ exit "^0.1.2"
+ graceful-fs "^4.2.9"
+ jest-changed-files "^27.5.1"
+ jest-config "^27.5.1"
+ jest-haste-map "^27.5.1"
+ jest-message-util "^27.5.1"
+ jest-regex-util "^27.5.1"
+ jest-resolve "^27.5.1"
+ jest-resolve-dependencies "^27.5.1"
+ jest-runner "^27.5.1"
+ jest-runtime "^27.5.1"
+ jest-snapshot "^27.5.1"
+ jest-util "^27.5.1"
+ jest-validate "^27.5.1"
+ jest-watcher "^27.5.1"
+ micromatch "^4.0.4"
+ rimraf "^3.0.0"
+ slash "^3.0.0"
+ strip-ansi "^6.0.0"
+
+"@jest/environment@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.5.1.tgz#d7425820511fe7158abbecc010140c3fd3be9c74"
+ integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==
+ dependencies:
+ "@jest/fake-timers" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ jest-mock "^27.5.1"
+
+"@jest/fake-timers@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74"
+ integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ "@sinonjs/fake-timers" "^8.0.1"
+ "@types/node" "*"
+ jest-message-util "^27.5.1"
+ jest-mock "^27.5.1"
+ jest-util "^27.5.1"
+
+"@jest/globals@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.5.1.tgz#7ac06ce57ab966566c7963431cef458434601b2b"
+ integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==
+ dependencies:
+ "@jest/environment" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ expect "^27.5.1"
+
+"@jest/reporters@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.5.1.tgz#ceda7be96170b03c923c37987b64015812ffec04"
+ integrity sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==
+ dependencies:
+ "@bcoe/v8-coverage" "^0.2.3"
+ "@jest/console" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/transform" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ collect-v8-coverage "^1.0.0"
+ exit "^0.1.2"
+ glob "^7.1.2"
+ graceful-fs "^4.2.9"
+ istanbul-lib-coverage "^3.0.0"
+ istanbul-lib-instrument "^5.1.0"
+ istanbul-lib-report "^3.0.0"
+ istanbul-lib-source-maps "^4.0.0"
+ istanbul-reports "^3.1.3"
+ jest-haste-map "^27.5.1"
+ jest-resolve "^27.5.1"
+ jest-util "^27.5.1"
+ jest-worker "^27.5.1"
+ slash "^3.0.0"
+ source-map "^0.6.0"
+ string-length "^4.0.1"
+ terminal-link "^2.0.0"
+ v8-to-istanbul "^8.1.0"
+
+"@jest/source-map@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf"
+ integrity sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==
+ dependencies:
+ callsites "^3.0.0"
+ graceful-fs "^4.2.9"
+ source-map "^0.6.0"
+
+"@jest/test-result@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.5.1.tgz#56a6585fa80f7cdab72b8c5fc2e871d03832f5bb"
+ integrity sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==
+ dependencies:
+ "@jest/console" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/istanbul-lib-coverage" "^2.0.0"
+ collect-v8-coverage "^1.0.0"
+
+"@jest/test-sequencer@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz#4057e0e9cea4439e544c6353c6affe58d095745b"
+ integrity sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==
+ dependencies:
+ "@jest/test-result" "^27.5.1"
+ graceful-fs "^4.2.9"
+ jest-haste-map "^27.5.1"
+ jest-runtime "^27.5.1"
+
+"@jest/transform@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.5.1.tgz#6c3501dcc00c4c08915f292a600ece5ecfe1f409"
+ integrity sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==
+ dependencies:
+ "@babel/core" "^7.1.0"
+ "@jest/types" "^27.5.1"
+ babel-plugin-istanbul "^6.1.1"
+ chalk "^4.0.0"
+ convert-source-map "^1.4.0"
+ fast-json-stable-stringify "^2.0.0"
+ graceful-fs "^4.2.9"
+ jest-haste-map "^27.5.1"
+ jest-regex-util "^27.5.1"
+ jest-util "^27.5.1"
+ micromatch "^4.0.4"
+ pirates "^4.0.4"
+ slash "^3.0.0"
+ source-map "^0.6.1"
+ write-file-atomic "^3.0.0"
+
+"@jest/types@^27.2.5", "@jest/types@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80"
+ integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==
+ dependencies:
+ "@types/istanbul-lib-coverage" "^2.0.0"
+ "@types/istanbul-reports" "^3.0.0"
+ "@types/node" "*"
+ "@types/yargs" "^16.0.0"
+ chalk "^4.0.0"
+
+"@jridgewell/resolve-uri@^3.0.3":
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz#68eb521368db76d040a6315cdb24bf2483037b9c"
+ integrity sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==
+
+"@jridgewell/sourcemap-codec@^1.4.10":
+ version "1.4.11"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec"
+ integrity sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==
+
+"@jridgewell/trace-mapping@^0.3.0":
+ version "0.3.4"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz#f6a0832dffd5b8a6aaa633b7d9f8e8e94c83a0c3"
+ integrity sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.0.3"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+
+"@nodelib/fs.scandir@2.1.5":
+ version "2.1.5"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
+ integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
+ dependencies:
+ "@nodelib/fs.stat" "2.0.5"
+ run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
+ integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
+
+"@nodelib/fs.walk@^1.2.3":
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
+ integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
+ dependencies:
+ "@nodelib/fs.scandir" "2.1.5"
+ fastq "^1.6.0"
+
+"@sinonjs/commons@^1.7.0":
+ version "1.8.3"
+ resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d"
+ integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==
+ dependencies:
+ type-detect "4.0.8"
+
+"@sinonjs/fake-timers@^8.0.1":
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7"
+ integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==
+ dependencies:
+ "@sinonjs/commons" "^1.7.0"
+
+"@svgr/babel-plugin-add-jsx-attribute@^6.0.0":
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.0.0.tgz#bd6d1ff32a31b82b601e73672a789cc41e84fe18"
+ integrity sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA==
+
+"@svgr/babel-plugin-remove-jsx-attribute@^6.0.0":
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.0.0.tgz#58654908beebfa069681a83332544b17e5237e89"
+ integrity sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw==
+
+"@svgr/babel-plugin-remove-jsx-empty-expression@^6.0.0":
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.0.0.tgz#d06dd6e8a8f603f92f9979bb9990a1f85a4f57ba"
+ integrity sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA==
+
+"@svgr/babel-plugin-replace-jsx-attribute-value@^6.0.0":
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.0.0.tgz#0b85837577b02c31c09c758a12932820f5245cee"
+ integrity sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ==
+
+"@svgr/babel-plugin-svg-dynamic-title@^6.0.0":
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.0.0.tgz#28236ec26f7ab9d486a487d36ae52d58ba15676f"
+ integrity sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg==
+
+"@svgr/babel-plugin-svg-em-dimensions@^6.0.0":
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.0.0.tgz#40267c5dea1b43c4f83a0eb6169e08b43d8bafce"
+ integrity sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA==
+
+"@svgr/babel-plugin-transform-react-native-svg@^6.0.0":
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.0.0.tgz#eb688d0a5f539e34d268d8a516e81f5d7fede7c9"
+ integrity sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ==
+
+"@svgr/babel-plugin-transform-svg-component@^6.2.0":
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.2.0.tgz#7ba61d9fc1fb42b0ba1a04e4630019fa7e993c4f"
+ integrity sha512-bhYIpsORb++wpsp91fymbFkf09Z/YEKR0DnFjxvN+8JHeCUD2unnh18jIMKnDJTWtvpTaGYPXELVe4OOzFI0xg==
+
+"@svgr/babel-preset@^6.2.0":
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-6.2.0.tgz#1d3ad8c7664253a4be8e4a0f0e6872f30d8af627"
+ integrity sha512-4WQNY0J71JIaL03DRn0vLiz87JXx0b9dYm2aA8XHlQJQoixMl4r/soYHm8dsaJZ3jWtkCiOYy48dp9izvXhDkQ==
+ dependencies:
+ "@svgr/babel-plugin-add-jsx-attribute" "^6.0.0"
+ "@svgr/babel-plugin-remove-jsx-attribute" "^6.0.0"
+ "@svgr/babel-plugin-remove-jsx-empty-expression" "^6.0.0"
+ "@svgr/babel-plugin-replace-jsx-attribute-value" "^6.0.0"
+ "@svgr/babel-plugin-svg-dynamic-title" "^6.0.0"
+ "@svgr/babel-plugin-svg-em-dimensions" "^6.0.0"
+ "@svgr/babel-plugin-transform-react-native-svg" "^6.0.0"
+ "@svgr/babel-plugin-transform-svg-component" "^6.2.0"
+
+"@svgr/core@^6.2.1":
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/@svgr/core/-/core-6.2.1.tgz#195de807a9f27f9e0e0d678e01084b05c54fdf61"
+ integrity sha512-NWufjGI2WUyrg46mKuySfviEJ6IxHUOm/8a3Ph38VCWSp+83HBraCQrpEM3F3dB6LBs5x8OElS8h3C0oOJaJAA==
+ dependencies:
+ "@svgr/plugin-jsx" "^6.2.1"
+ camelcase "^6.2.0"
+ cosmiconfig "^7.0.1"
+
+"@svgr/hast-util-to-babel-ast@^6.2.1":
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.2.1.tgz#ae065567b74cbe745afae617053adf9a764bea25"
+ integrity sha512-pt7MMkQFDlWJVy9ULJ1h+hZBDGFfSCwlBNW1HkLnVi7jUhyEXUaGYWi1x6bM2IXuAR9l265khBT4Av4lPmaNLQ==
+ dependencies:
+ "@babel/types" "^7.15.6"
+ entities "^3.0.1"
+
+"@svgr/plugin-jsx@^6.2.1":
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-6.2.1.tgz#5668f1d2aa18c2f1bb7a1fc9f682d3f9aed263bd"
+ integrity sha512-u+MpjTsLaKo6r3pHeeSVsh9hmGRag2L7VzApWIaS8imNguqoUwDq/u6U/NDmYs/KAsrmtBjOEaAAPbwNGXXp1g==
+ dependencies:
+ "@babel/core" "^7.15.5"
+ "@svgr/babel-preset" "^6.2.0"
+ "@svgr/hast-util-to-babel-ast" "^6.2.1"
+ svg-parser "^2.0.2"
+
+"@svgr/plugin-prettier@^6.1.2":
+ version "6.1.2"
+ resolved "https://registry.yarnpkg.com/@svgr/plugin-prettier/-/plugin-prettier-6.1.2.tgz#e87eab379b96a6414ddfb9555754e35e64798a90"
+ integrity sha512-jd9+Arj+6wsv8XxbE2VxfXGftibV+QIH+Uzl4Y0JZ+j5jgJsbCd+7Yey7ZBgVRe7xaW0aRwshUAmP6axOAl37A==
+ dependencies:
+ deepmerge "^4.2.2"
+ prettier "^2.4.0"
+
+"@svgr/plugin-svgo@^6.2.0":
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-6.2.0.tgz#4cbe6a33ccccdcae4e3b63ded64cc1cbe1faf48c"
+ integrity sha512-oDdMQONKOJEbuKwuy4Np6VdV6qoaLLvoY86hjvQEgU82Vx1MSWRyYms6Sl0f+NtqxLI/rDVufATbP/ev996k3Q==
+ dependencies:
+ cosmiconfig "^7.0.1"
+ deepmerge "^4.2.2"
+ svgo "^2.5.0"
+
+"@testing-library/dom@^8.0.0", "@testing-library/dom@^8.10.1":
+ version "8.13.0"
+ resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.13.0.tgz#bc00bdd64c7d8b40841e27a70211399ad3af46f5"
+ integrity sha512-9VHgfIatKNXQNaZTtLnalIy0jNZzY35a4S3oi08YAt9Hv1VsfZ/DfA45lM8D/UhtHBGJ4/lGwp0PZkVndRkoOQ==
+ dependencies:
+ "@babel/code-frame" "^7.10.4"
+ "@babel/runtime" "^7.12.5"
+ "@types/aria-query" "^4.2.0"
+ aria-query "^5.0.0"
+ chalk "^4.1.0"
+ dom-accessibility-api "^0.5.9"
+ lz-string "^1.4.4"
+ pretty-format "^27.0.2"
+
+"@testing-library/jest-dom@^5.14.1":
+ version "5.16.4"
+ resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.16.4.tgz#938302d7b8b483963a3ae821f1c0808f872245cd"
+ integrity sha512-Gy+IoFutbMQcky0k+bqqumXZ1cTGswLsFqmNLzNdSKkU9KGV2u9oXhukCbbJ9/LRPKiqwxEE8VpV/+YZlfkPUA==
+ dependencies:
+ "@babel/runtime" "^7.9.2"
+ "@types/testing-library__jest-dom" "^5.9.1"
+ aria-query "^5.0.0"
+ chalk "^3.0.0"
+ css "^3.0.0"
+ css.escape "^1.5.1"
+ dom-accessibility-api "^0.5.6"
+ lodash "^4.17.15"
+ redent "^3.0.0"
+
+"@testing-library/react-hooks@^7.0.2":
+ version "7.0.2"
+ resolved "https://registry.yarnpkg.com/@testing-library/react-hooks/-/react-hooks-7.0.2.tgz#3388d07f562d91e7f2431a4a21b5186062ecfee0"
+ integrity sha512-dYxpz8u9m4q1TuzfcUApqi8iFfR6R0FaMbr2hjZJy1uC8z+bO/K4v8Gs9eogGKYQop7QsrBTFkv/BCF7MzD2Cg==
+ dependencies:
+ "@babel/runtime" "^7.12.5"
+ "@types/react" ">=16.9.0"
+ "@types/react-dom" ">=16.9.0"
+ "@types/react-test-renderer" ">=16.9.0"
+ react-error-boundary "^3.1.0"
+
+"@testing-library/react@^12.1.2":
+ version "12.1.4"
+ resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-12.1.4.tgz#09674b117e550af713db3f4ec4c0942aa8bbf2c0"
+ integrity sha512-jiPKOm7vyUw311Hn/HlNQ9P8/lHNtArAx0PisXyFixDDvfl8DbD6EUdbshK5eqauvBSvzZd19itqQ9j3nferJA==
+ dependencies:
+ "@babel/runtime" "^7.12.5"
+ "@testing-library/dom" "^8.0.0"
+ "@types/react-dom" "*"
+
+"@testing-library/user-event@^13.5.0":
+ version "13.5.0"
+ resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-13.5.0.tgz#69d77007f1e124d55314a2b73fd204b333b13295"
+ integrity sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==
+ dependencies:
+ "@babel/runtime" "^7.12.5"
+
+"@tootallnate/once@1":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
+ integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==
+
+"@trysound/sax@0.2.0":
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad"
+ integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==
+
+"@ts-morph/common@~0.12.3":
+ version "0.12.3"
+ resolved "https://registry.yarnpkg.com/@ts-morph/common/-/common-0.12.3.tgz#a96e250217cd30e480ab22ec6a0ebbe65fd784ff"
+ integrity sha512-4tUmeLyXJnJWvTFOKtcNJ1yh0a3SsTLi2MUoyj8iUNznFRN1ZquaNe7Oukqrnki2FzZkm0J9adCNLDZxUzvj+w==
+ dependencies:
+ fast-glob "^3.2.7"
+ minimatch "^3.0.4"
+ mkdirp "^1.0.4"
+ path-browserify "^1.0.1"
+
+"@tsconfig/node10@^1.0.7":
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9"
+ integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==
+
+"@tsconfig/node12@^1.0.7":
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c"
+ integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==
+
+"@tsconfig/node14@^1.0.0":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2"
+ integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==
+
+"@tsconfig/node16@^1.0.2":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e"
+ integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==
+
+"@types/aria-query@^4.2.0":
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc"
+ integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==
+
+"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14":
+ version "7.1.19"
+ resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460"
+ integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==
+ dependencies:
+ "@babel/parser" "^7.1.0"
+ "@babel/types" "^7.0.0"
+ "@types/babel__generator" "*"
+ "@types/babel__template" "*"
+ "@types/babel__traverse" "*"
+
+"@types/babel__generator@*":
+ version "7.6.4"
+ resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7"
+ integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==
+ dependencies:
+ "@babel/types" "^7.0.0"
+
+"@types/babel__template@*":
+ version "7.4.1"
+ resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969"
+ integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==
+ dependencies:
+ "@babel/parser" "^7.1.0"
+ "@babel/types" "^7.0.0"
+
+"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6":
+ version "7.14.2"
+ resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43"
+ integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==
+ dependencies:
+ "@babel/types" "^7.3.0"
+
+"@types/glob@*", "@types/glob@^7.2.0":
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb"
+ integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==
+ dependencies:
+ "@types/minimatch" "*"
+ "@types/node" "*"
+
+"@types/graceful-fs@^4.1.2":
+ version "4.1.5"
+ resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15"
+ integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==
+ dependencies:
+ "@types/node" "*"
+
+"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1":
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44"
+ integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==
+
+"@types/istanbul-lib-report@*":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686"
+ integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==
+ dependencies:
+ "@types/istanbul-lib-coverage" "*"
+
+"@types/istanbul-reports@^3.0.0":
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff"
+ integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==
+ dependencies:
+ "@types/istanbul-lib-report" "*"
+
+"@types/jest@*":
+ version "27.4.1"
+ resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.4.1.tgz#185cbe2926eaaf9662d340cc02e548ce9e11ab6d"
+ integrity sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw==
+ dependencies:
+ jest-matcher-utils "^27.0.0"
+ pretty-format "^27.0.0"
+
+"@types/json5@^0.0.29":
+ version "0.0.29"
+ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
+ integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4=
+
+"@types/minimatch@*":
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40"
+ integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==
+
+"@types/node@*":
+ version "17.0.23"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.23.tgz#3b41a6e643589ac6442bdbd7a4a3ded62f33f7da"
+ integrity sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==
+
+"@types/node@^16.11.6":
+ version "16.11.26"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.26.tgz#63d204d136c9916fb4dcd1b50f9740fe86884e47"
+ integrity sha512-GZ7bu5A6+4DtG7q9GsoHXy3ALcgeIHP4NnL0Vv2wu0uUB/yQex26v0tf6/na1mm0+bS9Uw+0DFex7aaKr2qawQ==
+
+"@types/parse-json@^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
+ integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
+
+"@types/prettier@^2.1.5":
+ version "2.4.4"
+ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.4.tgz#5d9b63132df54d8909fce1c3f8ca260fdd693e17"
+ integrity sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA==
+
+"@types/prop-types@*":
+ version "15.7.5"
+ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf"
+ integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==
+
+"@types/react-dom@*", "@types/react-dom@>=16.9.0":
+ version "18.0.0"
+ resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.0.tgz#b13f8d098e4b0c45df4f1ed123833143b0c71141"
+ integrity sha512-49897Y0UiCGmxZqpC8Blrf6meL8QUla6eb+BBhn69dTXlmuOlzkfr7HHY/O8J25e1lTUMs+YYxSlVDAaGHCOLg==
+ dependencies:
+ "@types/react" "*"
+
+"@types/react-dom@^17.0.10":
+ version "17.0.15"
+ resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.15.tgz#f2c8efde11521a4b7991e076cb9c70ba3bb0d156"
+ integrity sha512-Tr9VU9DvNoHDWlmecmcsE5ZZiUkYx+nKBzum4Oxe1K0yJVyBlfbq7H3eXjxXqJczBKqPGq3EgfTru4MgKb9+Yw==
+ dependencies:
+ "@types/react" "^17"
+
+"@types/react-test-renderer@>=16.9.0":
+ version "17.0.1"
+ resolved "https://registry.yarnpkg.com/@types/react-test-renderer/-/react-test-renderer-17.0.1.tgz#3120f7d1c157fba9df0118dae20cb0297ee0e06b"
+ integrity sha512-3Fi2O6Zzq/f3QR9dRnlnHso9bMl7weKCviFmfF6B4LS1Uat6Hkm15k0ZAQuDz+UBq6B3+g+NM6IT2nr5QgPzCw==
+ dependencies:
+ "@types/react" "*"
+
+"@types/react@*", "@types/react@>=16.9.0":
+ version "18.0.0"
+ resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.0.tgz#4be8aa3a2d04afc3ac2cc1ca43d39b0bd412890c"
+ integrity sha512-7+K7zEQYu7NzOwQGLR91KwWXXDzmTFODRVizJyIALf6RfLv2GDpqpknX64pvRVILXCpXi7O/pua8NGk44dLvJw==
+ dependencies:
+ "@types/prop-types" "*"
+ "@types/scheduler" "*"
+ csstype "^3.0.2"
+
+"@types/react@^17", "@types/react@^17.0.33":
+ version "17.0.44"
+ resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.44.tgz#c3714bd34dd551ab20b8015d9d0dbec812a51ec7"
+ integrity sha512-Ye0nlw09GeMp2Suh8qoOv0odfgCoowfM/9MG6WeRD60Gq9wS90bdkdRtYbRkNhXOpG4H+YXGvj4wOWhAC0LJ1g==
+ dependencies:
+ "@types/prop-types" "*"
+ "@types/scheduler" "*"
+ csstype "^3.0.2"
+
+"@types/rimraf@^3.0.2":
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-3.0.2.tgz#a63d175b331748e5220ad48c901d7bbf1f44eef8"
+ integrity sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ==
+ dependencies:
+ "@types/glob" "*"
+ "@types/node" "*"
+
+"@types/scheduler@*":
+ version "0.16.2"
+ resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39"
+ integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==
+
+"@types/stack-utils@^2.0.0":
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c"
+ integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==
+
+"@types/testing-library__jest-dom@^5.14.1", "@types/testing-library__jest-dom@^5.9.1":
+ version "5.14.3"
+ resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.3.tgz#ee6c7ffe9f8595882ee7bda8af33ae7b8789ef17"
+ integrity sha512-oKZe+Mf4ioWlMuzVBaXQ9WDnEm1+umLx0InILg+yvZVBBDmzV5KfZyLrCvadtWcx8+916jLmHafcmqqffl+iIw==
+ dependencies:
+ "@types/jest" "*"
+
+"@types/yargs-parser@*":
+ version "21.0.0"
+ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b"
+ integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==
+
+"@types/yargs@^16.0.0":
+ version "16.0.4"
+ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977"
+ integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==
+ dependencies:
+ "@types/yargs-parser" "*"
+
+"@vanilla-extract/css-utils@^0.1.2":
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/@vanilla-extract/css-utils/-/css-utils-0.1.2.tgz#6bcd3e45f187d56c319ce9bc36ae1814b373c581"
+ integrity sha512-qoxIu5E/UhJtoKsPL1JaU9nhTN0Xl5zYV0pScOgsvc3JN46TvTTt0L3GV8x3PQpZP7x3elw8BsC9czYbhJy9Gg==
+
+"@vanilla-extract/css@^1.6.8":
+ version "1.6.8"
+ resolved "https://registry.yarnpkg.com/@vanilla-extract/css/-/css-1.6.8.tgz#21796c6e11d010a22422185bacf5b65cbd294da8"
+ integrity sha512-wkZay2jWe9a3Dt30j+WTJicK4+YV7i65lr+QnpkigVY9uU2KPzaiASEyUV8AouT2cZm7AOhteBBVKI8cYeWnVQ==
+ dependencies:
+ "@emotion/hash" "^0.8.0"
+ "@vanilla-extract/private" "^1.0.3"
+ chalk "^4.1.1"
+ css-what "^5.0.1"
+ cssesc "^3.0.0"
+ csstype "^3.0.7"
+ deep-object-diff "^1.1.0"
+ deepmerge "^4.2.2"
+ escape-string-regexp "^4.0.0"
+ outdent "^0.8.0"
+
+"@vanilla-extract/dynamic@^2.0.2":
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/@vanilla-extract/dynamic/-/dynamic-2.0.2.tgz#13a3e461964c8029a52e6b6b631009ca6a8b27f5"
+ integrity sha512-U4nKaEQ8Kuz+exXEr51DUpyaOuzo24/S/k1YbDPQR06cYcNjQqvwFRnwWtZ+9ImocqM1wTKtzrdUgSTtLGIwAg==
+ dependencies:
+ "@vanilla-extract/private" "^1.0.3"
+
+"@vanilla-extract/integration@^3.0.0":
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/@vanilla-extract/integration/-/integration-3.0.1.tgz#7f4bb01667f65f745fae3d9e39be699b115839d5"
+ integrity sha512-4G4WgkalVRIsJyDb/X08S0xcG2eDm1RJvqIgji0D7HvOSeyD+nvPEhbq8FAxs7MeVyyPDoCWsCKQvS3f9jz9UA==
+ dependencies:
+ "@vanilla-extract/css" "^1.6.8"
+ esbuild "^0.11.16"
+ eval "0.1.6"
+ find-up "^5.0.0"
+ javascript-stringify "^2.0.1"
+ lodash "^4.17.21"
+ outdent "^0.8.0"
+
+"@vanilla-extract/private@^1.0.1", "@vanilla-extract/private@^1.0.3":
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/@vanilla-extract/private/-/private-1.0.3.tgz#7ec72bc2ff6fe51f9d650f962e8d1989b073690f"
+ integrity sha512-17kVyLq3ePTKOkveHxXuIJZtGYs+cSoev7BlP+Lf4916qfDhk/HBjvlYDe8egrea7LNPHKwSZJK/bzZC+Q6AwQ==
+
+"@vanilla-extract/recipes@^0.2.4":
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/@vanilla-extract/recipes/-/recipes-0.2.4.tgz#255a0a30cd0b1e6c6e1d890a71f3781339f2f7fd"
+ integrity sha512-UwRR3IbxYmKOBSML8oze77T2ZuAGyCmIYqhzRW7kk+AmVNqPwtfDtnf3z6quf+E/B4an5g1TlSGJwHvq9QaVTQ==
+
+"@vanilla-extract/sprinkles@^1.4.0":
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/@vanilla-extract/sprinkles/-/sprinkles-1.4.0.tgz#acad9c9470a41b8350ae97efc02bb33e52553bcf"
+ integrity sha512-q9Tu5bHkN/fT0IFkBDEsNeTKN/8CFYkgGVDw0iZ+wM/n9IKhWrKLnOjDk1v9NpCXD3rUQqDipl0pdGCEcBe4RQ==
+
+"@vanilla-extract/vite-plugin@^3.0.0":
+ version "3.1.4"
+ resolved "https://registry.yarnpkg.com/@vanilla-extract/vite-plugin/-/vite-plugin-3.1.4.tgz#2ad1d58c268833099ef65869fafe2b54b0dfb0f5"
+ integrity sha512-FLORJJ92FbPSf2HLSQfs3GiYS/ceZUhBLB1vQ2dwmXCeybpIeTcettzSIYdbrkFNy2gHbLD9yRSTMg7nCPEqUw==
+ dependencies:
+ "@vanilla-extract/integration" "^3.0.0"
+ outdent "^0.8.0"
+ postcss "^8.3.6"
+ postcss-load-config "^3.1.0"
+
+abab@^2.0.3, abab@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a"
+ integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==
+
+acorn-globals@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45"
+ integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==
+ dependencies:
+ acorn "^7.1.1"
+ acorn-walk "^7.1.1"
+
+acorn-walk@^7.1.1:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc"
+ integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==
+
+acorn-walk@^8.1.1:
+ version "8.2.0"
+ resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1"
+ integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
+
+acorn@^7.1.1:
+ version "7.4.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
+ integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
+
+acorn@^8.2.4, acorn@^8.4.1:
+ version "8.7.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf"
+ integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==
+
+agent-base@6:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
+ integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
+ dependencies:
+ debug "4"
+
+ansi-escapes@^4.2.1, ansi-escapes@^4.3.1:
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
+ integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
+ dependencies:
+ type-fest "^0.21.3"
+
+ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+ 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:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+ansi-styles@^5.0.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b"
+ integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==
+
+anymatch@^3.0.3:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
+ integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+arg@^4.1.0:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
+ integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
+
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
+aria-query@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.0.0.tgz#210c21aaf469613ee8c9a62c7f86525e058db52c"
+ integrity sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
+
+atob@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
+ integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
+
+babel-jest@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444"
+ integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==
+ dependencies:
+ "@jest/transform" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/babel__core" "^7.1.14"
+ babel-plugin-istanbul "^6.1.1"
+ babel-preset-jest "^27.5.1"
+ chalk "^4.0.0"
+ graceful-fs "^4.2.9"
+ slash "^3.0.0"
+
+babel-plugin-istanbul@^6.1.1:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73"
+ integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@istanbuljs/load-nyc-config" "^1.0.0"
+ "@istanbuljs/schema" "^0.1.2"
+ istanbul-lib-instrument "^5.0.4"
+ test-exclude "^6.0.0"
+
+babel-plugin-jest-hoist@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz#9be98ecf28c331eb9f5df9c72d6f89deb8181c2e"
+ integrity sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==
+ dependencies:
+ "@babel/template" "^7.3.3"
+ "@babel/types" "^7.3.3"
+ "@types/babel__core" "^7.0.0"
+ "@types/babel__traverse" "^7.0.6"
+
+babel-preset-current-node-syntax@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b"
+ integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==
+ dependencies:
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
+ "@babel/plugin-syntax-bigint" "^7.8.3"
+ "@babel/plugin-syntax-class-properties" "^7.8.3"
+ "@babel/plugin-syntax-import-meta" "^7.8.3"
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+ "@babel/plugin-syntax-numeric-separator" "^7.8.3"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+ "@babel/plugin-syntax-top-level-await" "^7.8.3"
+
+babel-preset-jest@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz#91f10f58034cb7989cb4f962b69fa6eef6a6bc81"
+ integrity sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==
+ dependencies:
+ babel-plugin-jest-hoist "^27.5.1"
+ babel-preset-current-node-syntax "^1.0.0"
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+boolbase@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+ integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+braces@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+ dependencies:
+ fill-range "^7.0.1"
+
+browser-process-hrtime@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626"
+ integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==
+
+browserslist@^4.17.5:
+ version "4.20.2"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.2.tgz#567b41508757ecd904dab4d1c646c612cd3d4f88"
+ integrity sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==
+ dependencies:
+ caniuse-lite "^1.0.30001317"
+ electron-to-chromium "^1.4.84"
+ escalade "^3.1.1"
+ node-releases "^2.0.2"
+ picocolors "^1.0.0"
+
+bs-logger@0.x:
+ version "0.2.6"
+ resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8"
+ integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==
+ dependencies:
+ fast-json-stable-stringify "2.x"
+
+bser@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05"
+ integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==
+ dependencies:
+ node-int64 "^0.4.0"
+
+buffer-from@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
+ integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
+
+callsites@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+ integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+camel-case@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a"
+ integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==
+ dependencies:
+ pascal-case "^3.1.2"
+ tslib "^2.0.3"
+
+camelcase@^5.3.1:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+ integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+
+camelcase@^6.2.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
+ integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
+
+caniuse-lite@^1.0.30001317:
+ version "1.0.30001327"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001327.tgz#c1546d7d7bb66506f0ccdad6a7d07fc6d668c858"
+ integrity sha512-1/Cg4jlD9qjZzhbzkzEaAC2JHsP0WrOc8Rd/3a3LuajGzGWR/hD7TVyvq99VqmTy99eVh8Zkmdq213OgvgXx7w==
+
+capital-case@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/capital-case/-/capital-case-1.0.4.tgz#9d130292353c9249f6b00fa5852bee38a717e669"
+ integrity sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==
+ dependencies:
+ no-case "^3.0.4"
+ tslib "^2.0.3"
+ upper-case-first "^2.0.2"
+
+chalk@^2.0.0:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chalk@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
+ integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+change-case@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/change-case/-/change-case-4.1.2.tgz#fedfc5f136045e2398c0410ee441f95704641e12"
+ integrity sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==
+ dependencies:
+ camel-case "^4.1.2"
+ capital-case "^1.0.4"
+ constant-case "^3.0.4"
+ dot-case "^3.0.4"
+ header-case "^2.0.4"
+ no-case "^3.0.4"
+ param-case "^3.0.4"
+ pascal-case "^3.1.2"
+ path-case "^3.0.4"
+ sentence-case "^3.0.4"
+ snake-case "^3.0.4"
+ tslib "^2.0.3"
+
+char-regex@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf"
+ integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==
+
+char-regex@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-2.0.1.tgz#6dafdb25f9d3349914079f010ba8d0e6ff9cd01e"
+ integrity sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==
+
+ci-info@^3.2.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2"
+ integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==
+
+cjs-module-lexer@^1.0.0:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40"
+ integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==
+
+cliui@^7.0.2:
+ version "7.0.4"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
+ integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
+ wrap-ansi "^7.0.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==
+
+co@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+ integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=
+
+code-block-writer@^11.0.0:
+ version "11.0.0"
+ resolved "https://registry.yarnpkg.com/code-block-writer/-/code-block-writer-11.0.0.tgz#5956fb186617f6740e2c3257757fea79315dd7d4"
+ integrity sha512-GEqWvEWWsOvER+g9keO4ohFoD3ymwyCnqY3hoTr7GZipYFwEhMHJw+TtV0rfgRhNImM6QWZGO2XYjlJVyYT62w==
+ dependencies:
+ tslib "2.3.1"
+
+collect-v8-coverage@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59"
+ integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+combined-stream@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+commander@^7.2.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
+ integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+
+constant-case@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-3.0.4.tgz#3b84a9aeaf4cf31ec45e6bf5de91bdfb0589faf1"
+ integrity sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==
+ dependencies:
+ no-case "^3.0.4"
+ tslib "^2.0.3"
+ upper-case "^2.0.2"
+
+convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369"
+ integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==
+ dependencies:
+ safe-buffer "~5.1.1"
+
+cosmiconfig@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d"
+ integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==
+ dependencies:
+ "@types/parse-json" "^4.0.0"
+ import-fresh "^3.2.1"
+ parse-json "^5.0.0"
+ path-type "^4.0.0"
+ yaml "^1.10.0"
+
+create-require@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
+ integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
+
+cross-spawn@^7.0.3:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+ integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+css-select@^4.1.3:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b"
+ integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==
+ dependencies:
+ boolbase "^1.0.0"
+ css-what "^6.0.1"
+ domhandler "^4.3.1"
+ domutils "^2.8.0"
+ nth-check "^2.0.1"
+
+css-tree@^1.1.2, css-tree@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d"
+ integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==
+ dependencies:
+ mdn-data "2.0.14"
+ source-map "^0.6.1"
+
+css-what@^5.0.1:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe"
+ integrity sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==
+
+css-what@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4"
+ integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==
+
+css.escape@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb"
+ integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=
+
+css@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/css/-/css-3.0.0.tgz#4447a4d58fdd03367c516ca9f64ae365cee4aa5d"
+ integrity sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==
+ dependencies:
+ inherits "^2.0.4"
+ source-map "^0.6.1"
+ source-map-resolve "^0.6.0"
+
+cssesc@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
+ integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
+
+csso@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529"
+ integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==
+ dependencies:
+ css-tree "^1.1.2"
+
+cssom@^0.4.4:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10"
+ integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==
+
+cssom@~0.3.6:
+ version "0.3.8"
+ resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a"
+ integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==
+
+cssstyle@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852"
+ integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==
+ dependencies:
+ cssom "~0.3.6"
+
+csstype@^3.0.2, csstype@^3.0.7:
+ version "3.0.11"
+ resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.11.tgz#d66700c5eacfac1940deb4e3ee5642792d85cd33"
+ integrity sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==
+
+data-urls@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b"
+ integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==
+ dependencies:
+ abab "^2.0.3"
+ whatwg-mimetype "^2.3.0"
+ whatwg-url "^8.0.0"
+
+debug@4, debug@^4.1.0, debug@^4.1.1:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
+ integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
+ dependencies:
+ ms "2.1.2"
+
+decimal.js@^10.2.1:
+ version "10.3.1"
+ resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783"
+ integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==
+
+decode-uri-component@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+ integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
+
+dedent@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
+ integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=
+
+deep-is@~0.1.3:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
+ integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
+
+deep-object-diff@^1.1.0:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/deep-object-diff/-/deep-object-diff-1.1.7.tgz#348b3246f426427dd633eaa50e1ed1fc2eafc7e4"
+ integrity sha512-QkgBca0mL08P6HiOjoqvmm6xOAl2W6CT2+34Ljhg0OeFan8cwlcdq8jrLKsBBuUFAZLsN5b6y491KdKEoSo9lg==
+
+deepmerge@^4.2.2:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955"
+ integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
+
+detect-newline@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651"
+ integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==
+
+diff-sequences@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327"
+ integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==
+
+diff@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
+ integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
+
+dom-accessibility-api@^0.5.6, dom-accessibility-api@^0.5.9:
+ version "0.5.13"
+ resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.13.tgz#102ee5f25eacce09bdf1cfa5a298f86da473be4b"
+ integrity sha512-R305kwb5CcMDIpSHUnLyIAp7SrSPBx6F0VfQFB3M75xVMHhXJJIdePYgbPPh1o57vCHNu5QztokWUPsLjWzFqw==
+
+dom-serializer@^1.0.1:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91"
+ integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==
+ dependencies:
+ domelementtype "^2.0.1"
+ domhandler "^4.2.0"
+ entities "^2.0.0"
+
+domelementtype@^2.0.1, domelementtype@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d"
+ integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==
+
+domexception@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304"
+ integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==
+ dependencies:
+ webidl-conversions "^5.0.0"
+
+domhandler@^4.2.0, domhandler@^4.3.1:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c"
+ integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==
+ dependencies:
+ domelementtype "^2.2.0"
+
+domutils@^2.8.0:
+ version "2.8.0"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135"
+ integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==
+ dependencies:
+ dom-serializer "^1.0.1"
+ domelementtype "^2.2.0"
+ domhandler "^4.2.0"
+
+dot-case@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751"
+ integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==
+ dependencies:
+ no-case "^3.0.4"
+ tslib "^2.0.3"
+
+electron-to-chromium@^1.4.84:
+ version "1.4.106"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.106.tgz#e7a3bfa9d745dd9b9e597616cb17283cc349781a"
+ integrity sha512-ZYfpVLULm67K7CaaGP7DmjyeMY4naxsbTy+syVVxT6QHI1Ww8XbJjmr9fDckrhq44WzCrcC5kH3zGpdusxwwqg==
+
+emittery@^0.8.1:
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860"
+ integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+entities@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55"
+ integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==
+
+entities@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4"
+ integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==
+
+error-ex@^1.3.1:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+esbuild-android-64@0.14.34:
+ version "0.14.34"
+ resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.34.tgz#46bc4327dd0809937912346244eaffdb9bfc980d"
+ integrity sha512-XfxcfJqmMYsT/LXqrptzFxmaR3GWzXHDLdFNIhm6S00zPaQF1TBBWm+9t0RZ6LRR7iwH57DPjaOeW20vMqI4Yw==
+
+esbuild-android-arm64@0.14.34:
+ version "0.14.34"
+ resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.34.tgz#a3f7e1ad84b8a7dcb39b5e132768b56ee7133656"
+ integrity sha512-T02+NXTmSRL1Mc6puz+R9CB54rSPICkXKq6+tw8B6vxZFnCPzbJxgwIX4kcluz9p8nYBjF3+lSilTGWb7+Xgew==
+
+esbuild-darwin-64@0.14.34:
+ version "0.14.34"
+ resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.34.tgz#a0e4ab7a0cddf76761f1fb5d6bf552a376beb16e"
+ integrity sha512-pLRip2Bh4Ng7Bf6AMgCrSp3pPe/qZyf11h5Qo2mOfJqLWzSVjxrXW+CFRJfrOVP7TCnh/gmZSM2AFdCPB72vtw==
+
+esbuild-darwin-arm64@0.14.34:
+ version "0.14.34"
+ resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.34.tgz#54c35461f82f83a7f5169d9a6a54201798977b07"
+ integrity sha512-vpidSJEBxx6lf1NWgXC+DCmGqesJuZ5Y8aQVVsaoO4i8tRXbXb0whChRvop/zd3nfNM4dIl5EXAky0knRX5I6w==
+
+esbuild-freebsd-64@0.14.34:
+ version "0.14.34"
+ resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.34.tgz#aebb50248f5874d04ffeab2db8ee1ed6037e2654"
+ integrity sha512-m0HBjePhe0hAQJgtMRMNV9kMgIyV4/qSnzPx42kRMQBcPhgjAq1JRu4Il26czC+9FgpMbFkUktb07f/Lwnc6CA==
+
+esbuild-freebsd-arm64@0.14.34:
+ version "0.14.34"
+ resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.34.tgz#09bef288e29f18b38b0c70a9827b6ee718e36c7f"
+ integrity sha512-cpRc2B94L1KvMPPYB4D6G39jLqpKlD3noAMY4/e86iXXXkhUYJJEtTuyNFTa9JRpWM0xCAp4mxjHjoIiLuoCLA==
+
+esbuild-linux-32@0.14.34:
+ version "0.14.34"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.34.tgz#67790061758e008e919e65bbc34549f55dadaca7"
+ integrity sha512-8nQaEaoW7MH/K/RlozJa+lE1ejHIr8fuPIHhc513UebRav7HtXgQvxHQ6VZRUkWtep23M6dd7UqhwO1tMOfzQQ==
+
+esbuild-linux-64@0.14.34:
+ version "0.14.34"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.34.tgz#b9b19d4ac07e37495dd2508ec843418aa71c98d6"
+ integrity sha512-Y3of4qQoLLlAgf042MlrY1P+7PnN9zWj8nVtw9XQG5hcLOZLz7IKpU35oeu7n4wvyaZHwvQqDJ93gRLqdJekcQ==
+
+esbuild-linux-arm64@0.14.34:
+ version "0.14.34"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.34.tgz#fd84b11a6ccfe9e83e00d0c45890e9fb3a7248c1"
+ integrity sha512-IlWaGtj9ir7+Nrume1DGcyzBDlK8GcnJq0ANKwcI9pVw8tqr+6GD0eqyF9SF1mR8UmAp+odrx1H5NdR2cHdFHA==
+
+esbuild-linux-arm@0.14.34:
+ version "0.14.34"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.34.tgz#c89d4714b05265a315a97c8933508cc73950e683"
+ integrity sha512-9lpq1NcJqssAF7alCO6zL3gvBVVt/lKw4oetUM7OgNnRX0OWpB+ZIO9FwCrSj/dMdmgDhPLf+119zB8QxSMmAg==
+
+esbuild-linux-mips64le@0.14.34:
+ version "0.14.34"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.34.tgz#d60752c3fb1260dd0737532af2de2a9521656456"
+ integrity sha512-k3or+01Rska1AjUyNjA4buEwB51eyN/xPQAoOx1CjzAQC3l8rpjUDw55kXyL63O/1MUi4ISvtNtl8gLwdyEcxw==
+
+esbuild-linux-ppc64le@0.14.34:
+ version "0.14.34"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.34.tgz#f4c6229269956564f0c6f9825f5e717c2cfc22b3"
+ integrity sha512-+qxb8M9FfM2CJaVU7GgYpJOHM1ngQOx+/VrtBjb4C8oVqaPcESCeg2anjl+HRZy8VpYc71q/iBYausPPbJ+Keg==
+
+esbuild-linux-riscv64@0.14.34:
+ version "0.14.34"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.34.tgz#549bd18a9eba3135b67f7b742730b5343a1be35d"
+ integrity sha512-Y717ltBdQ5j5sZIHdy1DV9kieo0wMip0dCmVSTceowCPYSn1Cg33Kd6981+F/3b9FDMzNWldZFOBRILViENZSA==
+
+esbuild-linux-s390x@0.14.34:
+ version "0.14.34"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.34.tgz#2a6b577c437f94c2b37623c755ff5215a05c12bc"
+ integrity sha512-bDDgYO4LhL4+zPs+WcBkXph+AQoPcQRTv18FzZS0WhjfH8TZx2QqlVPGhmhZ6WidrY+jKthUqO6UhGyIb4MpmA==
+
+esbuild-netbsd-64@0.14.34:
+ version "0.14.34"
+ resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.34.tgz#7f0b73229157975eb35597207723df52ba21722a"
+ integrity sha512-cfaFGXdRt0+vHsjNPyF0POM4BVSHPSbhLPe8mppDc7GDDxjIl08mV1Zou14oDWMp/XZMjYN1kWYRSfftiD0vvQ==
+
+esbuild-openbsd-64@0.14.34:
+ version "0.14.34"
+ resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.34.tgz#b9bc44b4f70031fb01b173b279daeffc4d4f54b7"
+ integrity sha512-vmy9DxXVnRiI14s8GKuYBtess+EVcDALkbpTqd5jw4XITutIzyB7n4x0Tj5utAkKsgZJB22lLWGekr0ABnSLow==
+
+esbuild-sunos-64@0.14.34:
+ version "0.14.34"
+ resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.34.tgz#512dd6085ac1a0dccc20c5f932f16a618bea409c"
+ integrity sha512-eNPVatNET1F7tRMhii7goL/eptfxc0ALRjrj9SPFNqp0zmxrehBFD6BaP3R4LjMn6DbMO0jOAnTLFKr8NqcJAA==
+
+esbuild-windows-32@0.14.34:
+ version "0.14.34"
+ resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.34.tgz#3ff1afd5cac08050c7c7140a59e343b06f6b037c"
+ integrity sha512-EFhpXyHEcnqWYe2rAHFd8dRw8wkrd9U+9oqcyoEL84GbanAYjiiIjBZsnR8kl0sCQ5w6bLpk7vCEIA2VS32Vcg==
+
+esbuild-windows-64@0.14.34:
+ version "0.14.34"
+ resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.34.tgz#66f7b43d2a0b132f6748dfa3edac4fc939a99be0"
+ integrity sha512-a8fbl8Ky7PxNEjf1aJmtxdDZj32/hC7S1OcA2ckEpCJRTjiKslI9vAdPpSjrKIWhws4Galpaawy0nB7fjHYf5Q==
+
+esbuild-windows-arm64@0.14.34:
+ version "0.14.34"
+ resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.34.tgz#b74a6395b7b7e53dba70b71b39542afd83352473"
+ integrity sha512-EYvmKbSa2B3sPnpC28UEu9jBK5atGV4BaVRE7CYGUci2Hlz4AvtV/LML+TcDMT6gBgibnN2gcltWclab3UutMg==
+
+esbuild@^0.11.16:
+ version "0.11.23"
+ resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.11.23.tgz#c42534f632e165120671d64db67883634333b4b8"
+ integrity sha512-iaiZZ9vUF5wJV8ob1tl+5aJTrwDczlvGP0JoMmnpC2B0ppiMCu8n8gmy5ZTGl5bcG081XBVn+U+jP+mPFm5T5Q==
+
+esbuild@^0.14.27:
+ version "0.14.34"
+ resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.34.tgz#3610056f0a57bcfd0b63ddaafdb2e3bef1cf96e4"
+ integrity sha512-QIWdPT/gFF6hCaf4m7kP0cJ+JIuFkdHibI7vVFvu3eJS1HpVmYHWDulyN5WXwbRA0SX/7ZDaJ/1DH8SdY9xOJg==
+ optionalDependencies:
+ esbuild-android-64 "0.14.34"
+ esbuild-android-arm64 "0.14.34"
+ esbuild-darwin-64 "0.14.34"
+ esbuild-darwin-arm64 "0.14.34"
+ esbuild-freebsd-64 "0.14.34"
+ esbuild-freebsd-arm64 "0.14.34"
+ esbuild-linux-32 "0.14.34"
+ esbuild-linux-64 "0.14.34"
+ esbuild-linux-arm "0.14.34"
+ esbuild-linux-arm64 "0.14.34"
+ esbuild-linux-mips64le "0.14.34"
+ esbuild-linux-ppc64le "0.14.34"
+ esbuild-linux-riscv64 "0.14.34"
+ esbuild-linux-s390x "0.14.34"
+ esbuild-netbsd-64 "0.14.34"
+ esbuild-openbsd-64 "0.14.34"
+ esbuild-sunos-64 "0.14.34"
+ esbuild-windows-32 "0.14.34"
+ esbuild-windows-64 "0.14.34"
+ esbuild-windows-arm64 "0.14.34"
+
+escalade@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
+ integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+
+escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+
+escape-string-regexp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344"
+ integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
+
+escape-string-regexp@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+escodegen@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd"
+ integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==
+ dependencies:
+ esprima "^4.0.1"
+ estraverse "^5.2.0"
+ esutils "^2.0.2"
+ optionator "^0.8.1"
+ optionalDependencies:
+ source-map "~0.6.1"
+
+esprima@^4.0.0, esprima@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+estraverse@^5.2.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
+ integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+eval@0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/eval/-/eval-0.1.6.tgz#9620d7d8c85515e97e6b47c5814f46ae381cb3cc"
+ integrity sha512-o0XUw+5OGkXw4pJZzQoXUk+H87DHuC+7ZE//oSrRGtatTmr12oTnLfg6QOq9DyTt0c/p4TwzgmkKrBzWTSizyQ==
+ dependencies:
+ require-like ">= 0.1.1"
+
+execa@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
+ integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
+ dependencies:
+ cross-spawn "^7.0.3"
+ get-stream "^6.0.0"
+ human-signals "^2.1.0"
+ is-stream "^2.0.0"
+ merge-stream "^2.0.0"
+ npm-run-path "^4.0.1"
+ onetime "^5.1.2"
+ signal-exit "^3.0.3"
+ strip-final-newline "^2.0.0"
+
+exit@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
+ integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=
+
+expect@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/expect/-/expect-27.5.1.tgz#83ce59f1e5bdf5f9d2b94b61d2050db48f3fef74"
+ integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ jest-get-type "^27.5.1"
+ jest-matcher-utils "^27.5.1"
+ jest-message-util "^27.5.1"
+
+fast-glob@^3.2.7:
+ version "3.2.11"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9"
+ integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==
+ dependencies:
+ "@nodelib/fs.stat" "^2.0.2"
+ "@nodelib/fs.walk" "^1.2.3"
+ glob-parent "^5.1.2"
+ merge2 "^1.3.0"
+ micromatch "^4.0.4"
+
+fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-levenshtein@~2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+ integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
+
+fastq@^1.6.0:
+ version "1.13.0"
+ resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c"
+ integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==
+ dependencies:
+ reusify "^1.0.4"
+
+fb-watchman@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85"
+ integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==
+ dependencies:
+ bser "2.1.1"
+
+fill-range@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+ integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+find-up@^4.0.0, find-up@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
+ integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
+ dependencies:
+ locate-path "^5.0.0"
+ path-exists "^4.0.0"
+
+find-up@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
+ integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
+ dependencies:
+ locate-path "^6.0.0"
+ path-exists "^4.0.0"
+
+focus-visible@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/focus-visible/-/focus-visible-5.2.0.tgz#3a9e41fccf587bd25dcc2ef045508284f0a4d6b3"
+ integrity sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==
+
+form-data@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f"
+ integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+fs-extra@^10.0.0:
+ version "10.0.1"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.1.tgz#27de43b4320e833f6867cc044bfce29fdf0ef3b8"
+ integrity sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==
+ dependencies:
+ graceful-fs "^4.2.0"
+ jsonfile "^6.0.1"
+ universalify "^2.0.0"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
+fsevents@^2.3.2, fsevents@~2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+ integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+gensync@^1.0.0-beta.2:
+ version "1.0.0-beta.2"
+ resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
+ integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
+
+get-caller-file@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+get-package-type@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a"
+ integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==
+
+get-stream@^6.0.0:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
+ integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
+
+glob-parent@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob-regex@^0.3.0:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/glob-regex/-/glob-regex-0.3.2.tgz#27348f2f60648ec32a4a53137090b9fb934f3425"
+ integrity sha512-m5blUd3/OqDTWwzBBtWBPrGlAzatRywHameHeekAZyZrskYouOGdNB8T/q6JucucvJXtOuyHIn0/Yia7iDasDw==
+
+glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.2.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
+ integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+globals@^11.1.0:
+ version "11.12.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
+ integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+
+globrex@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098"
+ integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==
+
+graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.9:
+ version "4.2.10"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
+ integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+header-case@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/header-case/-/header-case-2.0.4.tgz#5a42e63b55177349cf405beb8d775acabb92c063"
+ integrity sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==
+ dependencies:
+ capital-case "^1.0.4"
+ tslib "^2.0.3"
+
+html-encoding-sniffer@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3"
+ integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==
+ dependencies:
+ whatwg-encoding "^1.0.5"
+
+html-escaper@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453"
+ integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
+
+http-proxy-agent@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a"
+ integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==
+ dependencies:
+ "@tootallnate/once" "1"
+ agent-base "6"
+ debug "4"
+
+https-proxy-agent@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2"
+ integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==
+ dependencies:
+ agent-base "6"
+ debug "4"
+
+human-signals@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
+ integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
+
+iconv-lite@0.4.24:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+import-fresh@^3.2.1:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
+ integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
+ dependencies:
+ parent-module "^1.0.0"
+ resolve-from "^4.0.0"
+
+import-local@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4"
+ integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==
+ dependencies:
+ pkg-dir "^4.2.0"
+ resolve-cwd "^3.0.0"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+ integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
+
+indent-string@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
+ integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+ integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
+
+is-core-module@^2.8.1:
+ version "2.8.1"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211"
+ integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==
+ dependencies:
+ has "^1.0.3"
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
+
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-generator-fn@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118"
+ integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==
+
+is-glob@^4.0.1:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-potential-custom-element-name@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5"
+ integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==
+
+is-stream@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
+ integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
+
+is-typedarray@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+ integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+
+istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3"
+ integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==
+
+istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz#7b49198b657b27a730b8e9cb601f1e1bff24c59a"
+ integrity sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==
+ dependencies:
+ "@babel/core" "^7.12.3"
+ "@babel/parser" "^7.14.7"
+ "@istanbuljs/schema" "^0.1.2"
+ istanbul-lib-coverage "^3.2.0"
+ semver "^6.3.0"
+
+istanbul-lib-report@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6"
+ integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==
+ dependencies:
+ istanbul-lib-coverage "^3.0.0"
+ make-dir "^3.0.0"
+ supports-color "^7.1.0"
+
+istanbul-lib-source-maps@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551"
+ integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==
+ dependencies:
+ debug "^4.1.1"
+ istanbul-lib-coverage "^3.0.0"
+ source-map "^0.6.1"
+
+istanbul-reports@^3.1.3:
+ version "3.1.4"
+ resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c"
+ integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==
+ dependencies:
+ html-escaper "^2.0.0"
+ istanbul-lib-report "^3.0.0"
+
+javascript-stringify@^2.0.1:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-2.1.0.tgz#27c76539be14d8bd128219a2d731b09337904e79"
+ integrity sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==
+
+jest-changed-files@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.5.1.tgz#a348aed00ec9bf671cc58a66fcbe7c3dfd6a68f5"
+ integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ execa "^5.0.0"
+ throat "^6.0.1"
+
+jest-circus@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.5.1.tgz#37a5a4459b7bf4406e53d637b49d22c65d125ecc"
+ integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==
+ dependencies:
+ "@jest/environment" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ co "^4.6.0"
+ dedent "^0.7.0"
+ expect "^27.5.1"
+ is-generator-fn "^2.0.0"
+ jest-each "^27.5.1"
+ jest-matcher-utils "^27.5.1"
+ jest-message-util "^27.5.1"
+ jest-runtime "^27.5.1"
+ jest-snapshot "^27.5.1"
+ jest-util "^27.5.1"
+ pretty-format "^27.5.1"
+ slash "^3.0.0"
+ stack-utils "^2.0.3"
+ throat "^6.0.1"
+
+jest-cli@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.5.1.tgz#278794a6e6458ea8029547e6c6cbf673bd30b145"
+ integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==
+ dependencies:
+ "@jest/core" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ chalk "^4.0.0"
+ exit "^0.1.2"
+ graceful-fs "^4.2.9"
+ import-local "^3.0.2"
+ jest-config "^27.5.1"
+ jest-util "^27.5.1"
+ jest-validate "^27.5.1"
+ prompts "^2.0.1"
+ yargs "^16.2.0"
+
+jest-config@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.5.1.tgz#5c387de33dca3f99ad6357ddeccd91bf3a0e4a41"
+ integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==
+ dependencies:
+ "@babel/core" "^7.8.0"
+ "@jest/test-sequencer" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ babel-jest "^27.5.1"
+ chalk "^4.0.0"
+ ci-info "^3.2.0"
+ deepmerge "^4.2.2"
+ glob "^7.1.1"
+ graceful-fs "^4.2.9"
+ jest-circus "^27.5.1"
+ jest-environment-jsdom "^27.5.1"
+ jest-environment-node "^27.5.1"
+ jest-get-type "^27.5.1"
+ jest-jasmine2 "^27.5.1"
+ jest-regex-util "^27.5.1"
+ jest-resolve "^27.5.1"
+ jest-runner "^27.5.1"
+ jest-util "^27.5.1"
+ jest-validate "^27.5.1"
+ micromatch "^4.0.4"
+ parse-json "^5.2.0"
+ pretty-format "^27.5.1"
+ slash "^3.0.0"
+ strip-json-comments "^3.1.1"
+
+jest-diff@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def"
+ integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==
+ dependencies:
+ chalk "^4.0.0"
+ diff-sequences "^27.5.1"
+ jest-get-type "^27.5.1"
+ pretty-format "^27.5.1"
+
+jest-docblock@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0"
+ integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==
+ dependencies:
+ detect-newline "^3.0.0"
+
+jest-each@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.5.1.tgz#5bc87016f45ed9507fed6e4702a5b468a5b2c44e"
+ integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ chalk "^4.0.0"
+ jest-get-type "^27.5.1"
+ jest-util "^27.5.1"
+ pretty-format "^27.5.1"
+
+jest-environment-jsdom@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz#ea9ccd1fc610209655a77898f86b2b559516a546"
+ integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==
+ dependencies:
+ "@jest/environment" "^27.5.1"
+ "@jest/fake-timers" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ jest-mock "^27.5.1"
+ jest-util "^27.5.1"
+ jsdom "^16.6.0"
+
+jest-environment-node@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.5.1.tgz#dedc2cfe52fab6b8f5714b4808aefa85357a365e"
+ integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==
+ dependencies:
+ "@jest/environment" "^27.5.1"
+ "@jest/fake-timers" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ jest-mock "^27.5.1"
+ jest-util "^27.5.1"
+
+jest-get-type@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1"
+ integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==
+
+jest-haste-map@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f"
+ integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ "@types/graceful-fs" "^4.1.2"
+ "@types/node" "*"
+ anymatch "^3.0.3"
+ fb-watchman "^2.0.0"
+ graceful-fs "^4.2.9"
+ jest-regex-util "^27.5.1"
+ jest-serializer "^27.5.1"
+ jest-util "^27.5.1"
+ jest-worker "^27.5.1"
+ micromatch "^4.0.4"
+ walker "^1.0.7"
+ optionalDependencies:
+ fsevents "^2.3.2"
+
+jest-jasmine2@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz#a037b0034ef49a9f3d71c4375a796f3b230d1ac4"
+ integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==
+ dependencies:
+ "@jest/environment" "^27.5.1"
+ "@jest/source-map" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ co "^4.6.0"
+ expect "^27.5.1"
+ is-generator-fn "^2.0.0"
+ jest-each "^27.5.1"
+ jest-matcher-utils "^27.5.1"
+ jest-message-util "^27.5.1"
+ jest-runtime "^27.5.1"
+ jest-snapshot "^27.5.1"
+ jest-util "^27.5.1"
+ pretty-format "^27.5.1"
+ throat "^6.0.1"
+
+jest-leak-detector@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz#6ec9d54c3579dd6e3e66d70e3498adf80fde3fb8"
+ integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==
+ dependencies:
+ jest-get-type "^27.5.1"
+ pretty-format "^27.5.1"
+
+jest-matcher-utils@^27.0.0, jest-matcher-utils@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab"
+ integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==
+ dependencies:
+ chalk "^4.0.0"
+ jest-diff "^27.5.1"
+ jest-get-type "^27.5.1"
+ pretty-format "^27.5.1"
+
+jest-message-util@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf"
+ integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==
+ dependencies:
+ "@babel/code-frame" "^7.12.13"
+ "@jest/types" "^27.5.1"
+ "@types/stack-utils" "^2.0.0"
+ chalk "^4.0.0"
+ graceful-fs "^4.2.9"
+ micromatch "^4.0.4"
+ pretty-format "^27.5.1"
+ slash "^3.0.0"
+ stack-utils "^2.0.3"
+
+jest-mock@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6"
+ integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+
+jest-pnp-resolver@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c"
+ integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==
+
+jest-regex-util@^27.0.0, jest-regex-util@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95"
+ integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==
+
+jest-resolve-dependencies@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8"
+ integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ jest-regex-util "^27.5.1"
+ jest-snapshot "^27.5.1"
+
+jest-resolve@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.5.1.tgz#a2f1c5a0796ec18fe9eb1536ac3814c23617b384"
+ integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ chalk "^4.0.0"
+ graceful-fs "^4.2.9"
+ jest-haste-map "^27.5.1"
+ jest-pnp-resolver "^1.2.2"
+ jest-util "^27.5.1"
+ jest-validate "^27.5.1"
+ resolve "^1.20.0"
+ resolve.exports "^1.1.0"
+ slash "^3.0.0"
+
+jest-runner@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.5.1.tgz#071b27c1fa30d90540805c5645a0ec167c7b62e5"
+ integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==
+ dependencies:
+ "@jest/console" "^27.5.1"
+ "@jest/environment" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/transform" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ emittery "^0.8.1"
+ graceful-fs "^4.2.9"
+ jest-docblock "^27.5.1"
+ jest-environment-jsdom "^27.5.1"
+ jest-environment-node "^27.5.1"
+ jest-haste-map "^27.5.1"
+ jest-leak-detector "^27.5.1"
+ jest-message-util "^27.5.1"
+ jest-resolve "^27.5.1"
+ jest-runtime "^27.5.1"
+ jest-util "^27.5.1"
+ jest-worker "^27.5.1"
+ source-map-support "^0.5.6"
+ throat "^6.0.1"
+
+jest-runtime@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.5.1.tgz#4896003d7a334f7e8e4a53ba93fb9bcd3db0a1af"
+ integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==
+ dependencies:
+ "@jest/environment" "^27.5.1"
+ "@jest/fake-timers" "^27.5.1"
+ "@jest/globals" "^27.5.1"
+ "@jest/source-map" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/transform" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ chalk "^4.0.0"
+ cjs-module-lexer "^1.0.0"
+ collect-v8-coverage "^1.0.0"
+ execa "^5.0.0"
+ glob "^7.1.3"
+ graceful-fs "^4.2.9"
+ jest-haste-map "^27.5.1"
+ jest-message-util "^27.5.1"
+ jest-mock "^27.5.1"
+ jest-regex-util "^27.5.1"
+ jest-resolve "^27.5.1"
+ jest-snapshot "^27.5.1"
+ jest-util "^27.5.1"
+ slash "^3.0.0"
+ strip-bom "^4.0.0"
+
+jest-serializer@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64"
+ integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==
+ dependencies:
+ "@types/node" "*"
+ graceful-fs "^4.2.9"
+
+jest-snapshot@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.5.1.tgz#b668d50d23d38054a51b42c4039cab59ae6eb6a1"
+ integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==
+ dependencies:
+ "@babel/core" "^7.7.2"
+ "@babel/generator" "^7.7.2"
+ "@babel/plugin-syntax-typescript" "^7.7.2"
+ "@babel/traverse" "^7.7.2"
+ "@babel/types" "^7.0.0"
+ "@jest/transform" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/babel__traverse" "^7.0.4"
+ "@types/prettier" "^2.1.5"
+ babel-preset-current-node-syntax "^1.0.0"
+ chalk "^4.0.0"
+ expect "^27.5.1"
+ graceful-fs "^4.2.9"
+ jest-diff "^27.5.1"
+ jest-get-type "^27.5.1"
+ jest-haste-map "^27.5.1"
+ jest-matcher-utils "^27.5.1"
+ jest-message-util "^27.5.1"
+ jest-util "^27.5.1"
+ natural-compare "^1.4.0"
+ pretty-format "^27.5.1"
+ semver "^7.3.2"
+
+jest-util@^27.0.0, jest-util@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9"
+ integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ ci-info "^3.2.0"
+ graceful-fs "^4.2.9"
+ picomatch "^2.2.3"
+
+jest-validate@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067"
+ integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ camelcase "^6.2.0"
+ chalk "^4.0.0"
+ jest-get-type "^27.5.1"
+ leven "^3.1.0"
+ pretty-format "^27.5.1"
+
+jest-watch-typeahead@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-1.0.0.tgz#4de2ca1eb596acb1889752afbab84b74fcd99173"
+ integrity sha512-jxoszalAb394WElmiJTFBMzie/RDCF+W7Q29n5LzOPtcoQoHWfdUtHFkbhgf5NwWe8uMOxvKb/g7ea7CshfkTw==
+ dependencies:
+ ansi-escapes "^4.3.1"
+ chalk "^4.0.0"
+ jest-regex-util "^27.0.0"
+ jest-watcher "^27.0.0"
+ slash "^4.0.0"
+ string-length "^5.0.1"
+ strip-ansi "^7.0.1"
+
+jest-watcher@^27.0.0, jest-watcher@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2"
+ integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==
+ dependencies:
+ "@jest/test-result" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ ansi-escapes "^4.2.1"
+ chalk "^4.0.0"
+ jest-util "^27.5.1"
+ string-length "^4.0.1"
+
+jest-worker@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0"
+ integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==
+ dependencies:
+ "@types/node" "*"
+ merge-stream "^2.0.0"
+ supports-color "^8.0.0"
+
+jest@^27.3.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest/-/jest-27.5.1.tgz#dadf33ba70a779be7a6fc33015843b51494f63fc"
+ integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==
+ dependencies:
+ "@jest/core" "^27.5.1"
+ import-local "^3.0.2"
+ jest-cli "^27.5.1"
+
+"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-yaml@^3.13.1:
+ version "3.14.1"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
+ integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+jsdom@^16.6.0:
+ version "16.7.0"
+ resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710"
+ integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==
+ dependencies:
+ abab "^2.0.5"
+ acorn "^8.2.4"
+ acorn-globals "^6.0.0"
+ cssom "^0.4.4"
+ cssstyle "^2.3.0"
+ data-urls "^2.0.0"
+ decimal.js "^10.2.1"
+ domexception "^2.0.1"
+ escodegen "^2.0.0"
+ form-data "^3.0.0"
+ html-encoding-sniffer "^2.0.1"
+ http-proxy-agent "^4.0.1"
+ https-proxy-agent "^5.0.0"
+ is-potential-custom-element-name "^1.0.1"
+ nwsapi "^2.2.0"
+ parse5 "6.0.1"
+ saxes "^5.0.1"
+ symbol-tree "^3.2.4"
+ tough-cookie "^4.0.0"
+ w3c-hr-time "^1.0.2"
+ w3c-xmlserializer "^2.0.0"
+ webidl-conversions "^6.1.0"
+ whatwg-encoding "^1.0.5"
+ whatwg-mimetype "^2.3.0"
+ whatwg-url "^8.5.0"
+ ws "^7.4.6"
+ xml-name-validator "^3.0.0"
+
+jsesc@^2.5.1:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
+ integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+
+json-parse-even-better-errors@^2.3.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
+ integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
+
+json5@2.x, json5@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c"
+ integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==
+
+json5@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
+ integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
+ dependencies:
+ minimist "^1.2.0"
+
+jsonfile@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
+ integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
+ dependencies:
+ universalify "^2.0.0"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+kleur@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
+ integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
+
+leven@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
+ integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==
+
+levn@~0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+ integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
+ dependencies:
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+
+lilconfig@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.5.tgz#19e57fd06ccc3848fd1891655b5a447092225b25"
+ integrity sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==
+
+lines-and-columns@^1.1.6:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
+ integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
+
+locate-path@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
+ integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
+ dependencies:
+ p-locate "^4.1.0"
+
+locate-path@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
+ integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
+ dependencies:
+ p-locate "^5.0.0"
+
+lodash.memoize@4.x:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
+ integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=
+
+lodash@^4.17.15, lodash@^4.17.21, lodash@^4.7.0:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+loose-envify@^1.1.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+lower-case@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28"
+ integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==
+ dependencies:
+ tslib "^2.0.3"
+
+lru-cache@^7.4.0:
+ version "7.8.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.8.0.tgz#649aaeb294a56297b5cbc5d70f198dcc5ebe5747"
+ integrity sha512-AmXqneQZL3KZMIgBpaPTeI6pfwh+xQ2vutMsyqOu1TBdEXFZgpG/80wuJ531w2ZN7TI0/oc8CPxzh/DKQudZqg==
+
+lz-string@^1.4.4:
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26"
+ integrity sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=
+
+make-dir@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
+ integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
+ dependencies:
+ semver "^6.0.0"
+
+make-error@1.x, make-error@^1.1.1:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
+ integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
+
+makeerror@1.0.12:
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a"
+ integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==
+ dependencies:
+ tmpl "1.0.5"
+
+mdn-data@2.0.14:
+ version "2.0.14"
+ resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50"
+ integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==
+
+merge-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
+ integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
+
+merge2@^1.3.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+ integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+micromatch@^4.0.4:
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
+ integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
+ dependencies:
+ braces "^3.0.2"
+ picomatch "^2.3.1"
+
+mime-db@1.52.0:
+ version "1.52.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+mime-types@^2.1.12:
+ version "2.1.35"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
+ integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+ dependencies:
+ mime-db "1.52.0"
+
+mimic-fn@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
+ integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+
+min-indent@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869"
+ integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==
+
+minimatch@^3.0.4:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@^1.2.0, minimist@^1.2.6:
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
+ integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
+
+mkdirp@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+ integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+nanoid@^3.3.1:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.2.tgz#c89622fafb4381cd221421c69ec58547a1eec557"
+ integrity sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+ integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
+
+no-case@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d"
+ integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==
+ dependencies:
+ lower-case "^2.0.2"
+ tslib "^2.0.3"
+
+node-int64@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
+ integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=
+
+node-releases@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01"
+ integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==
+
+normalize-path@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+npm-run-path@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
+ integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
+ dependencies:
+ path-key "^3.0.0"
+
+nth-check@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2"
+ integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==
+ dependencies:
+ boolbase "^1.0.0"
+
+nwsapi@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7"
+ integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==
+
+object-assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
+
+once@^1.3.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ dependencies:
+ wrappy "1"
+
+onetime@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
+ integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
+ dependencies:
+ mimic-fn "^2.1.0"
+
+optionator@^0.8.1:
+ version "0.8.3"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
+ integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
+ dependencies:
+ deep-is "~0.1.3"
+ fast-levenshtein "~2.0.6"
+ levn "~0.3.0"
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+ word-wrap "~1.2.3"
+
+outdent@^0.8.0:
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/outdent/-/outdent-0.8.0.tgz#2ebc3e77bf49912543f1008100ff8e7f44428eb0"
+ integrity sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==
+
+p-limit@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+ dependencies:
+ p-try "^2.0.0"
+
+p-limit@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
+ integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
+ dependencies:
+ yocto-queue "^0.1.0"
+
+p-locate@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
+ integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
+ dependencies:
+ p-limit "^2.2.0"
+
+p-locate@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
+ integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
+ dependencies:
+ p-limit "^3.0.2"
+
+p-try@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+
+param-case@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5"
+ integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==
+ dependencies:
+ dot-case "^3.0.4"
+ tslib "^2.0.3"
+
+parent-module@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
+ integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+ dependencies:
+ callsites "^3.0.0"
+
+parse-json@^5.0.0, parse-json@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
+ integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ error-ex "^1.3.1"
+ json-parse-even-better-errors "^2.3.0"
+ lines-and-columns "^1.1.6"
+
+parse5@6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b"
+ integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==
+
+pascal-case@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb"
+ integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==
+ dependencies:
+ no-case "^3.0.4"
+ tslib "^2.0.3"
+
+path-browserify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd"
+ integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==
+
+path-case@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/path-case/-/path-case-3.0.4.tgz#9168645334eb942658375c56f80b4c0cb5f82c6f"
+ integrity sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==
+ dependencies:
+ dot-case "^3.0.4"
+ tslib "^2.0.3"
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+
+path-key@^3.0.0, path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-parse@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-type@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
+ integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
+picocolors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
+ integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+
+picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
+pirates@^4.0.4:
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b"
+ integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==
+
+pkg-dir@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
+ integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
+ dependencies:
+ find-up "^4.0.0"
+
+postcss-load-config@^3.1.0:
+ version "3.1.4"
+ resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855"
+ integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==
+ dependencies:
+ lilconfig "^2.0.5"
+ yaml "^1.10.2"
+
+postcss@^8.3.6, postcss@^8.4.12:
+ version "8.4.12"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.12.tgz#1e7de78733b28970fa4743f7da6f3763648b1905"
+ integrity sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==
+ dependencies:
+ nanoid "^3.3.1"
+ picocolors "^1.0.0"
+ source-map-js "^1.0.2"
+
+prelude-ls@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+ integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
+
+prettier@^2.4.0:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032"
+ integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==
+
+pretty-format@^27.0.0, pretty-format@^27.0.2, pretty-format@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e"
+ integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==
+ dependencies:
+ ansi-regex "^5.0.1"
+ ansi-styles "^5.0.0"
+ react-is "^17.0.1"
+
+prompts@^2.0.1:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069"
+ integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==
+ dependencies:
+ kleur "^3.0.3"
+ sisteransi "^1.0.5"
+
+psl@^1.1.33:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
+ integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
+
+punycode@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+ integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+
+queue-microtask@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
+ integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+
+react-dom@^17.0.2:
+ version "17.0.2"
+ resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23"
+ integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==
+ dependencies:
+ loose-envify "^1.1.0"
+ object-assign "^4.1.1"
+ scheduler "^0.20.2"
+
+react-error-boundary@^3.1.0:
+ version "3.1.4"
+ resolved "https://registry.yarnpkg.com/react-error-boundary/-/react-error-boundary-3.1.4.tgz#255db92b23197108757a888b01e5b729919abde0"
+ integrity sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==
+ dependencies:
+ "@babel/runtime" "^7.12.5"
+
+react-is@^17.0.1:
+ version "17.0.2"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0"
+ integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
+
+react@^17.0.2:
+ version "17.0.2"
+ resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037"
+ integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==
+ dependencies:
+ loose-envify "^1.1.0"
+ object-assign "^4.1.1"
+
+recrawl-sync@^2.0.3:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/recrawl-sync/-/recrawl-sync-2.2.2.tgz#a5a8664c77267d603d601825af544d6716d69e15"
+ integrity sha512-E2sI4F25Fu2nrfV+KsnC7/qfk/spQIYXlonfQoS4rwxeNK5BjxnLPbWiRXHVXPwYBOTWtPX5765kTm/zJiL+LQ==
+ dependencies:
+ "@cush/relative" "^1.0.0"
+ glob-regex "^0.3.0"
+ slash "^3.0.0"
+ tslib "^1.9.3"
+
+redent@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f"
+ integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==
+ dependencies:
+ indent-string "^4.0.0"
+ strip-indent "^3.0.0"
+
+regenerator-runtime@^0.13.4:
+ version "0.13.9"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52"
+ integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
+
+"require-like@>= 0.1.1":
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/require-like/-/require-like-0.1.2.tgz#ad6f30c13becd797010c468afa775c0c0a6b47fa"
+ integrity sha1-rW8wwTvs15cBDEaK+ndcDAprR/o=
+
+resolve-cwd@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
+ integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==
+ dependencies:
+ resolve-from "^5.0.0"
+
+resolve-from@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
+ integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
+resolve-from@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
+ integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
+
+resolve.exports@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9"
+ integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==
+
+resolve@^1.20.0, resolve@^1.22.0:
+ version "1.22.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198"
+ integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==
+ dependencies:
+ is-core-module "^2.8.1"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+reusify@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
+ integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
+rimraf@^3.0.0, rimraf@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
+rollup@^2.59.0:
+ version "2.70.1"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.70.1.tgz#824b1f1f879ea396db30b0fc3ae8d2fead93523e"
+ integrity sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA==
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+run-parallel@^1.1.9:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
+ integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
+ dependencies:
+ queue-microtask "^1.2.2"
+
+safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+"safer-buffer@>= 2.1.2 < 3":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+saxes@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d"
+ integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==
+ dependencies:
+ xmlchars "^2.2.0"
+
+scheduler@^0.20.2:
+ version "0.20.2"
+ resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91"
+ integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==
+ dependencies:
+ loose-envify "^1.1.0"
+ object-assign "^4.1.1"
+
+semver@7.x, semver@^7.3.2:
+ version "7.3.6"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.6.tgz#5d73886fb9c0c6602e79440b97165c29581cbb2b"
+ integrity sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==
+ dependencies:
+ lru-cache "^7.4.0"
+
+semver@^6.0.0, semver@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
+ integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+
+sentence-case@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-3.0.4.tgz#3645a7b8c117c787fde8702056225bb62a45131f"
+ integrity sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==
+ dependencies:
+ no-case "^3.0.4"
+ tslib "^2.0.3"
+ upper-case-first "^2.0.2"
+
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+signal-exit@^3.0.2, signal-exit@^3.0.3:
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
+ integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
+
+sisteransi@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
+ integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==
+
+slash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+slash@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7"
+ integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==
+
+snake-case@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c"
+ integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==
+ dependencies:
+ dot-case "^3.0.4"
+ tslib "^2.0.3"
+
+source-map-js@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
+ integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
+
+source-map-resolve@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2"
+ integrity sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==
+ dependencies:
+ atob "^2.1.2"
+ decode-uri-component "^0.2.0"
+
+source-map-support@^0.5.6:
+ version "0.5.21"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
+ integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map@^0.5.0:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+ integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+
+source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+source-map@^0.7.3:
+ version "0.7.3"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
+ integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+
+stable@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
+ integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==
+
+stack-utils@^2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5"
+ integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==
+ dependencies:
+ escape-string-regexp "^2.0.0"
+
+string-length@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a"
+ integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==
+ dependencies:
+ char-regex "^1.0.2"
+ strip-ansi "^6.0.0"
+
+string-length@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/string-length/-/string-length-5.0.1.tgz#3d647f497b6e8e8d41e422f7e0b23bc536c8381e"
+ integrity sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==
+ dependencies:
+ char-regex "^2.0.0"
+ strip-ansi "^7.0.1"
+
+string-width@^4.1.0, string-width@^4.2.0:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
+strip-ansi@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2"
+ integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==
+ dependencies:
+ ansi-regex "^6.0.1"
+
+strip-bom@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+ integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
+
+strip-bom@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878"
+ integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==
+
+strip-final-newline@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
+ integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
+
+strip-indent@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001"
+ integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==
+ dependencies:
+ min-indent "^1.0.0"
+
+strip-json-comments@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
+ integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.0.0, supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-color@^8.0.0:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
+ integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-hyperlinks@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb"
+ integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==
+ dependencies:
+ has-flag "^4.0.0"
+ supports-color "^7.0.0"
+
+supports-preserve-symlinks-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
+ integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+svg-parser@^2.0.2:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5"
+ integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==
+
+svgo@^2.5.0:
+ version "2.8.0"
+ resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24"
+ integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==
+ dependencies:
+ "@trysound/sax" "0.2.0"
+ commander "^7.2.0"
+ css-select "^4.1.3"
+ css-tree "^1.1.3"
+ csso "^4.2.0"
+ picocolors "^1.0.0"
+ stable "^0.1.8"
+
+symbol-tree@^3.2.4:
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
+ integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
+
+terminal-link@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994"
+ integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==
+ dependencies:
+ ansi-escapes "^4.2.1"
+ supports-hyperlinks "^2.0.0"
+
+test-exclude@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e"
+ integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==
+ dependencies:
+ "@istanbuljs/schema" "^0.1.2"
+ glob "^7.1.4"
+ minimatch "^3.0.4"
+
+throat@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375"
+ integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==
+
+tmpl@1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc"
+ integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==
+
+to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+ integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+tough-cookie@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4"
+ integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==
+ dependencies:
+ psl "^1.1.33"
+ punycode "^2.1.1"
+ universalify "^0.1.2"
+
+tr46@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240"
+ integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==
+ dependencies:
+ punycode "^2.1.1"
+
+ts-jest@^27.0.7:
+ version "27.1.4"
+ resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-27.1.4.tgz#84d42cf0f4e7157a52e7c64b1492c46330943e00"
+ integrity sha512-qjkZlVPWVctAezwsOD1OPzbZ+k7zA5z3oxII4dGdZo5ggX/PL7kvwTM0pXTr10fAtbiVpJaL3bWd502zAhpgSQ==
+ dependencies:
+ bs-logger "0.x"
+ fast-json-stable-stringify "2.x"
+ jest-util "^27.0.0"
+ json5 "2.x"
+ lodash.memoize "4.x"
+ make-error "1.x"
+ semver "7.x"
+ yargs-parser "20.x"
+
+ts-morph@^13.0.0:
+ version "13.0.3"
+ resolved "https://registry.yarnpkg.com/ts-morph/-/ts-morph-13.0.3.tgz#c0c51d1273ae2edb46d76f65161eb9d763444c1d"
+ integrity sha512-pSOfUMx8Ld/WUreoSzvMFQG5i9uEiWIsBYjpU9+TTASOeUa89j5HykomeqVULm1oqWtBdleI3KEFRLrlA3zGIw==
+ dependencies:
+ "@ts-morph/common" "~0.12.3"
+ code-block-writer "^11.0.0"
+
+ts-node@^10.4.0:
+ version "10.7.0"
+ resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.7.0.tgz#35d503d0fab3e2baa672a0e94f4b40653c2463f5"
+ integrity sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==
+ dependencies:
+ "@cspotcode/source-map-support" "0.7.0"
+ "@tsconfig/node10" "^1.0.7"
+ "@tsconfig/node12" "^1.0.7"
+ "@tsconfig/node14" "^1.0.0"
+ "@tsconfig/node16" "^1.0.2"
+ acorn "^8.4.1"
+ acorn-walk "^8.1.1"
+ arg "^4.1.0"
+ create-require "^1.1.0"
+ diff "^4.0.1"
+ make-error "^1.1.1"
+ v8-compile-cache-lib "^3.0.0"
+ yn "3.1.1"
+
+tsconfig-paths@^3.9.0:
+ version "3.14.1"
+ resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a"
+ integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==
+ dependencies:
+ "@types/json5" "^0.0.29"
+ json5 "^1.0.1"
+ minimist "^1.2.6"
+ strip-bom "^3.0.0"
+
+tslib@2.3.1, tslib@^2.0.3:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01"
+ integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==
+
+tslib@^1.9.3:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
+ integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
+type-check@~0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+ integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=
+ dependencies:
+ prelude-ls "~1.1.2"
+
+type-detect@4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
+ integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
+
+type-fest@^0.21.3:
+ version "0.21.3"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
+ integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
+
+typedarray-to-buffer@^3.1.5:
+ version "3.1.5"
+ resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
+ integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
+ dependencies:
+ is-typedarray "^1.0.0"
+
+typescript@4.6.3:
+ version "4.6.3"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.3.tgz#eefeafa6afdd31d725584c67a0eaba80f6fc6c6c"
+ integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==
+
+universalify@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+ integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+
+universalify@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
+ integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
+
+upper-case-first@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-2.0.2.tgz#992c3273f882abd19d1e02894cc147117f844324"
+ integrity sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==
+ dependencies:
+ tslib "^2.0.3"
+
+upper-case@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-2.0.2.tgz#d89810823faab1df1549b7d97a76f8662bae6f7a"
+ integrity sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==
+ dependencies:
+ tslib "^2.0.3"
+
+v8-compile-cache-lib@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz#0582bcb1c74f3a2ee46487ceecf372e46bce53e8"
+ integrity sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==
+
+v8-to-istanbul@^8.1.0:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz#77b752fd3975e31bbcef938f85e9bd1c7a8d60ed"
+ integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==
+ dependencies:
+ "@types/istanbul-lib-coverage" "^2.0.1"
+ convert-source-map "^1.6.0"
+ source-map "^0.7.3"
+
+vite-plugin-dts@^0.9.2:
+ version "0.9.10"
+ resolved "https://registry.yarnpkg.com/vite-plugin-dts/-/vite-plugin-dts-0.9.10.tgz#c039214ef3e645412ed8527c83eff0eea050b63d"
+ integrity sha512-dNfFJXRsm3YW8k+Wm8SesSaEGOaicKdgFz5PoUpT9zUh6URr5cwu5NMOBhJgiofrzcuYtOU2Ez7JQtg68RII8g==
+ dependencies:
+ fast-glob "^3.2.7"
+ fs-extra "^10.0.0"
+ ts-morph "^13.0.0"
+
+vite-tsconfig-paths@^3.4.1:
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/vite-tsconfig-paths/-/vite-tsconfig-paths-3.4.1.tgz#6901b71d4cb7b764f76312e491f8f0622b9bfe56"
+ integrity sha512-SgK3/pnTuJ3i+gMSAWLR6VCPSw26bnxawrmXGvCDjJgk8MAQgmbCrFrAzfwbwZBXSqSuvWEuX04Wt73qJKx8fQ==
+ dependencies:
+ debug "^4.1.1"
+ globrex "^0.1.2"
+ recrawl-sync "^2.0.3"
+ tsconfig-paths "^3.9.0"
+
+vite@^2.9.1:
+ version "2.9.1"
+ resolved "https://registry.yarnpkg.com/vite/-/vite-2.9.1.tgz#84bce95fae210a7beb566a0af06246748066b48f"
+ integrity sha512-vSlsSdOYGcYEJfkQ/NeLXgnRv5zZfpAsdztkIrs7AZHV8RCMZQkwjo4DS5BnrYTqoWqLoUe1Cah4aVO4oNNqCQ==
+ dependencies:
+ esbuild "^0.14.27"
+ postcss "^8.4.12"
+ resolve "^1.22.0"
+ rollup "^2.59.0"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+w3c-hr-time@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd"
+ integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==
+ dependencies:
+ browser-process-hrtime "^1.0.0"
+
+w3c-xmlserializer@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a"
+ integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==
+ dependencies:
+ xml-name-validator "^3.0.0"
+
+walker@^1.0.7:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f"
+ integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==
+ dependencies:
+ makeerror "1.0.12"
+
+webidl-conversions@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff"
+ integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==
+
+webidl-conversions@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514"
+ integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==
+
+whatwg-encoding@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0"
+ integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==
+ dependencies:
+ iconv-lite "0.4.24"
+
+whatwg-mimetype@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf"
+ integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==
+
+whatwg-url@^8.0.0, whatwg-url@^8.5.0:
+ version "8.7.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77"
+ integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==
+ dependencies:
+ lodash "^4.7.0"
+ tr46 "^2.1.0"
+ webidl-conversions "^6.1.0"
+
+which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+word-wrap@~1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
+ integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
+
+wrap-ansi@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+write-file-atomic@^3.0.0:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8"
+ integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==
+ dependencies:
+ imurmurhash "^0.1.4"
+ is-typedarray "^1.0.0"
+ signal-exit "^3.0.2"
+ typedarray-to-buffer "^3.1.5"
+
+ws@^7.4.6:
+ version "7.5.7"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67"
+ integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==
+
+xml-name-validator@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
+ integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==
+
+xmlchars@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
+ integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
+
+y18n@^5.0.5:
+ version "5.0.8"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
+ integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
+
+yaml@^1.10.0, yaml@^1.10.2:
+ version "1.10.2"
+ resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
+ integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
+
+yargs-parser@20.x, yargs-parser@^20.2.2:
+ version "20.2.9"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
+ integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
+
+yargs@^16.2.0:
+ version "16.2.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
+ integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
+ dependencies:
+ cliui "^7.0.2"
+ escalade "^3.1.1"
+ get-caller-file "^2.0.5"
+ require-directory "^2.1.1"
+ string-width "^4.2.0"
+ y18n "^5.0.5"
+ yargs-parser "^20.2.2"
+
+yn@3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
+ integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
+
+yocto-queue@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
+ integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
diff --git a/packages/components/src/components/Avatar/Avatar.snippets.tsx b/packages/components/src/components/Avatar/Avatar.snippets.tsx
deleted file mode 100644
index 25a09f3..0000000
--- a/packages/components/src/components/Avatar/Avatar.snippets.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import * as React from 'react';
-
-import { Avatar } from './Avatar';
-import { Snippet } from '!/playroom/src/types';
-
-export const snippets: Snippet[] = [
- {
- name: 'Basic',
- code: ,
- },
-];
diff --git a/packages/components/src/components/Avatar/Avatar.test.tsx b/packages/components/src/components/Avatar/Avatar.test.tsx
deleted file mode 100644
index 12b3d04..0000000
--- a/packages/components/src/components/Avatar/Avatar.test.tsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import * as React from 'react';
-
-import { cleanup, render, screen } from '@/test';
-
-import { Avatar } from './Avatar';
-
-describe('', () => {
- afterEach(cleanup);
-
- it('renders', () => {
- render();
- expect(screen.getByRole(/img/i)).toBeInTheDocument();
- });
-});
diff --git a/packages/components/src/components/Avatar/index.ts b/packages/components/src/components/Avatar/index.ts
deleted file mode 100644
index 1f963d1..0000000
--- a/packages/components/src/components/Avatar/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export { Avatar } from './Avatar';
-export type { Props } from './Avatar';
diff --git a/packages/components/src/components/AvatarGroup/AvatarGroup.docs.mdx b/packages/components/src/components/AvatarGroup/AvatarGroup.docs.mdx
deleted file mode 100644
index 216b220..0000000
--- a/packages/components/src/components/AvatarGroup/AvatarGroup.docs.mdx
+++ /dev/null
@@ -1,40 +0,0 @@
----
-title: AvatarGroup
-description: Group of entity representations
----
-
-```tsx
-import { AvatarGroup } from '@disco3/components';
-```
-
-```tsx live=true expand=true
-
-```
-
-## Props
-
-See [`Avatar`'s props](/components/Avatar#props) for more info.
-
-
-
-## Limit
-
-```tsx live=true expand=true
-
-```
diff --git a/packages/components/src/components/AvatarGroup/AvatarGroup.snippets.tsx b/packages/components/src/components/AvatarGroup/AvatarGroup.snippets.tsx
deleted file mode 100644
index fdb1a31..0000000
--- a/packages/components/src/components/AvatarGroup/AvatarGroup.snippets.tsx
+++ /dev/null
@@ -1,28 +0,0 @@
-import * as React from 'react';
-
-import { AvatarGroup } from './AvatarGroup';
-import { Snippet } from '!/playroom/src/types';
-
-export const snippets: Snippet[] = [
- {
- name: 'Basic',
- code: (
-
- ),
- },
-];
diff --git a/packages/components/src/components/AvatarGroup/AvatarGroup.test.tsx b/packages/components/src/components/AvatarGroup/AvatarGroup.test.tsx
deleted file mode 100644
index 4c51250..0000000
--- a/packages/components/src/components/AvatarGroup/AvatarGroup.test.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import * as React from 'react';
-
-import { cleanup, render, screen } from '@/test';
-
-import { AvatarGroup } from './AvatarGroup';
-
-describe('', () => {
- afterEach(cleanup);
-
- it('renders', () => {
- render(
- ,
- );
- expect(screen.getAllByRole(/img/i).length).toBe(3);
- });
-});
diff --git a/packages/components/src/components/AvatarGroup/index.ts b/packages/components/src/components/AvatarGroup/index.ts
deleted file mode 100644
index c8bc222..0000000
--- a/packages/components/src/components/AvatarGroup/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { AvatarGroup } from './AvatarGroup';
diff --git a/packages/components/src/components/AvatarGroup/styles.css.ts b/packages/components/src/components/AvatarGroup/styles.css.ts
deleted file mode 100644
index 4dc6c42..0000000
--- a/packages/components/src/components/AvatarGroup/styles.css.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { style } from '@vanilla-extract/css';
-
-import { vars } from '../../css';
-
-export const wrapper = style({
- boxShadow: `0 0 0 2px ${vars.colors.background}`,
- transform: `translateX(0px)`,
-});
diff --git a/packages/components/src/components/Box/Box.snippets.tsx b/packages/components/src/components/Box/Box.snippets.tsx
deleted file mode 100644
index abbcaf0..0000000
--- a/packages/components/src/components/Box/Box.snippets.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import * as React from 'react';
-
-import { Snippet } from '!/playroom/src/types';
-
-import { Box } from './Box';
-
-export const snippets: Snippet[] = [
- {
- name: 'Basic',
- code: _,
- },
-];
diff --git a/packages/components/src/components/Box/Box.test.tsx b/packages/components/src/components/Box/Box.test.tsx
deleted file mode 100644
index 7013c76..0000000
--- a/packages/components/src/components/Box/Box.test.tsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import * as React from 'react';
-
-import { cleanup, render, screen } from '@/test';
-
-import { Box } from './Box';
-
-describe('', () => {
- afterEach(cleanup);
-
- it('renders', () => {
- render(foo bar baz);
- expect(screen.getByText(/foo/i)).toBeInTheDocument();
- });
-});
diff --git a/packages/components/src/components/Box/index.ts b/packages/components/src/components/Box/index.ts
deleted file mode 100644
index c9ac6eb..0000000
--- a/packages/components/src/components/Box/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export { Box } from './Box';
-export type { BoxProps } from './Box';
diff --git a/packages/components/src/components/Button/Button.snippets.tsx b/packages/components/src/components/Button/Button.snippets.tsx
deleted file mode 100644
index 9269fa1..0000000
--- a/packages/components/src/components/Button/Button.snippets.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import * as React from 'react';
-
-import { Snippet } from '!/playroom/src/types';
-import { Button } from './Button';
-
-export const snippets: Snippet[] = [
- {
- name: 'Basic',
- code: Button,
- },
-];
diff --git a/packages/components/src/components/Button/Button.test.tsx b/packages/components/src/components/Button/Button.test.tsx
deleted file mode 100644
index be10816..0000000
--- a/packages/components/src/components/Button/Button.test.tsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import * as React from 'react';
-
-import { cleanup, render, screen } from '@/test';
-
-import { Button } from './Button';
-
-describe('', () => {
- afterEach(cleanup);
-
- it('renders', () => {
- render(Connect Wallet);
- expect(screen.getByText(/connect/i)).toBeInTheDocument();
- });
-});
diff --git a/packages/components/src/components/Button/index.ts b/packages/components/src/components/Button/index.ts
deleted file mode 100644
index d53b1a0..0000000
--- a/packages/components/src/components/Button/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export { Button } from './Button';
-export type { Props } from './Button';
diff --git a/packages/components/src/components/Card/Card.snippets.tsx b/packages/components/src/components/Card/Card.snippets.tsx
deleted file mode 100644
index 7ee3175..0000000
--- a/packages/components/src/components/Card/Card.snippets.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import * as React from 'react';
-
-import { Snippet } from '!/playroom/src/types';
-import { Card } from './Card';
-
-export const snippets: Snippet[] = [
- {
- name: 'Basic',
- code: _,
- },
-];
diff --git a/packages/components/src/components/Card/Card.test.tsx b/packages/components/src/components/Card/Card.test.tsx
deleted file mode 100644
index aec5d7f..0000000
--- a/packages/components/src/components/Card/Card.test.tsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import * as React from 'react';
-
-import { cleanup, render, screen } from '@/test';
-
-import { Card } from './Card';
-
-describe('', () => {
- afterEach(cleanup);
-
- it('renders', () => {
- render(foo bar baz);
- expect(screen.getByText(/foo/i)).toBeInTheDocument();
- });
-});
diff --git a/packages/components/src/components/Card/index.ts b/packages/components/src/components/Card/index.ts
deleted file mode 100644
index 1e15afd..0000000
--- a/packages/components/src/components/Card/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { Card } from './Card';
diff --git a/packages/components/src/components/Field/Field.test.tsx b/packages/components/src/components/Field/Field.test.tsx
deleted file mode 100644
index 4b82c03..0000000
--- a/packages/components/src/components/Field/Field.test.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import * as React from 'react';
-
-import { cleanup, render, screen } from '@/test';
-
-import { Field } from './Field';
-
-describe('', () => {
- afterEach(cleanup);
-
- it('renders', () => {
- render(
-
-
- ,
- );
- expect(screen.getByText(/foo/i)).toBeInTheDocument();
- });
-});
diff --git a/packages/components/src/components/Field/Field.tsx b/packages/components/src/components/Field/Field.tsx
deleted file mode 100644
index b154055..0000000
--- a/packages/components/src/components/Field/Field.tsx
+++ /dev/null
@@ -1,93 +0,0 @@
-import * as React from 'react';
-
-import { ReactNodeNoStrings } from '../../types';
-import { useFieldIds } from '../../hooks';
-import { Box, BoxProps } from '../Box';
-import { VisuallyHidden } from '../VisuallyHidden';
-
-type State = ReturnType | undefined;
-const Context = React.createContext(undefined);
-
-type NativeFormProps = React.AllHTMLAttributes;
-
-export type FieldBaseProps = {
- description?: React.ReactNode;
- error?: React.ReactNode;
- hideLabel?: boolean;
- label: React.ReactNode;
- labelSecondary?: React.ReactNode;
- required?: NativeFormProps['required'];
- width?: BoxProps['width'];
-};
-
-type Props = FieldBaseProps & {
- children: React.ReactElement | ((context: State) => ReactNodeNoStrings);
- id?: NativeFormProps['id'];
-};
-
-export const Field = ({
- children,
- description,
- error,
- hideLabel,
- id,
- label,
- labelSecondary,
- required,
- width = 'full',
-}: Props) => {
- const ids = useFieldIds({
- id,
- description: description !== undefined,
- error: error !== undefined,
- });
-
- const labelContent = (
-
-
- {label} {required && (required)}
-
- {labelSecondary && labelSecondary}
-
- );
-
- // Allow children to consume ids or try to clone ids onto it
- let content: React.ReactNode | null;
- if (typeof children === 'function')
- content = (
-
- {(context) => children(context)}
-
- );
- else if (children) content = React.cloneElement(children, ids.content);
- else content = children;
-
- return (
-
- {hideLabel ? (
- {labelContent}
- ) : (
- labelContent
- )}
-
- {content}
-
- {description && (
-
- {description}
-
- )}
-
- {error && (
-
- {error}
-
- )}
-
- );
-};
diff --git a/packages/components/src/components/Field/index.ts b/packages/components/src/components/Field/index.ts
deleted file mode 100644
index 72e8a4b..0000000
--- a/packages/components/src/components/Field/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export { Field } from './Field';
-export type { FieldBaseProps } from './Field';
diff --git a/packages/components/src/components/FieldSet/FieldSet.docs.mdx b/packages/components/src/components/FieldSet/FieldSet.docs.mdx
deleted file mode 100644
index fbf4708..0000000
--- a/packages/components/src/components/FieldSet/FieldSet.docs.mdx
+++ /dev/null
@@ -1,70 +0,0 @@
----
-title: FieldSet
-description: Group related form elements
----
-
-```tsx
-import { FieldSet } from '@disco3/components';
-```
-
-```tsx live=true expand=true
-
-```
-
-## Props
-
-
-
-## Description
-
-```tsx live=true
-
-```
-
-## Status
-
-```tsx live=true
-
-```
-
-## Disabled
-
-Uses native
-[`fieldset[disabled]`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/fieldset#attr-disabled)
-to automatically disable form elements inside.
-
-```tsx live=true
-
-```
diff --git a/packages/components/src/components/FieldSet/FieldSet.test.tsx b/packages/components/src/components/FieldSet/FieldSet.test.tsx
deleted file mode 100644
index ceb43f0..0000000
--- a/packages/components/src/components/FieldSet/FieldSet.test.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import * as React from 'react';
-
-import { cleanup, render, screen } from '@/test';
-
-import { FieldSet } from './FieldSet';
-
-describe('', () => {
- afterEach(cleanup);
-
- it('renders', () => {
- render(
- ,
- );
- expect(screen.getByText(/token/i)).toBeInTheDocument();
- });
-});
diff --git a/packages/components/src/components/FieldSet/FieldSet.tsx b/packages/components/src/components/FieldSet/FieldSet.tsx
deleted file mode 100644
index 2615b11..0000000
--- a/packages/components/src/components/FieldSet/FieldSet.tsx
+++ /dev/null
@@ -1,91 +0,0 @@
-import * as React from 'react';
-
-import { ReactNodeNoStrings } from '../../types';
-import { Box } from '../Box';
-import { Heading } from '../Heading';
-import { Stack } from '../Stack';
-import { Tag, TagProps } from '../Tag';
-
-type NativeFieldSetProps = React.AllHTMLAttributes;
-
-type Props = {
- children: ReactNodeNoStrings;
- description?: string | React.ReactNode;
- disabled?: NativeFieldSetProps['disabled'];
- form?: NativeFieldSetProps['form'];
- name?: NativeFieldSetProps['name'];
- legend: string;
- status?:
- | 'required'
- | 'optional'
- | 'pending'
- | 'complete'
- | {
- name: string;
- tone: TagProps['tone'];
- };
-};
-
-export const FieldSet = ({
- children,
- description,
- disabled,
- form,
- legend,
- name,
- status,
-}: Props) => {
- let statusText: string | undefined;
- let statusTone: TagProps['tone'];
- switch (status) {
- case 'complete': {
- statusText = 'Complete';
- statusTone = 'green';
- break;
- }
- case 'required':
- case 'pending': {
- statusText = status === 'pending' ? 'Pending' : 'Required';
- statusTone = 'accent';
- break;
- }
- case 'optional': {
- statusText = 'Optional';
- statusTone = 'secondary';
- break;
- }
- }
- if (typeof status === 'object') {
- statusText = status.name;
- statusTone = status.tone;
- }
-
- return (
-
-
-
-
- {legend}
-
- {statusTone && statusText && (
- {statusText}
- )}
-
-
-
- {description}
-
-
-
- {children}
-
- );
-};
diff --git a/packages/components/src/components/FieldSet/index.ts b/packages/components/src/components/FieldSet/index.ts
deleted file mode 100644
index 1636afe..0000000
--- a/packages/components/src/components/FieldSet/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { FieldSet } from './FieldSet';
diff --git a/packages/components/src/components/FileInput/FileInput.test.tsx b/packages/components/src/components/FileInput/FileInput.test.tsx
deleted file mode 100644
index 2facae7..0000000
--- a/packages/components/src/components/FileInput/FileInput.test.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import * as React from 'react';
-
-import { cleanup, render, screen } from '@/test';
-
-import { FileInput } from './FileInput';
-
-describe('', () => {
- afterEach(cleanup);
-
- it('renders', () => {
- render(
-
- {(context) =>
- context.name ? {context.name}
: Upload file
- }
- ,
- );
- expect(screen.getByText(/upload/i)).toBeInTheDocument();
- });
-});
diff --git a/packages/components/src/components/FileInput/index.ts b/packages/components/src/components/FileInput/index.ts
deleted file mode 100644
index 95f9a73..0000000
--- a/packages/components/src/components/FileInput/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export { FileInput } from './FileInput';
-export type { Props as FileInputProps } from './FileInput';
diff --git a/packages/components/src/components/Heading/Heading.snippets.tsx b/packages/components/src/components/Heading/Heading.snippets.tsx
deleted file mode 100644
index 531e856..0000000
--- a/packages/components/src/components/Heading/Heading.snippets.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import * as React from 'react';
-
-import { Snippet } from '!/playroom/src/types';
-import { Heading } from './Heading';
-
-export const snippets: Snippet[] = [
- {
- name: 'Basic',
- code: Heading,
- },
-];
diff --git a/packages/components/src/components/Heading/Heading.test.tsx b/packages/components/src/components/Heading/Heading.test.tsx
deleted file mode 100644
index 8741768..0000000
--- a/packages/components/src/components/Heading/Heading.test.tsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import * as React from 'react';
-
-import { cleanup, render, screen } from '@/test';
-
-import { Heading } from './Heading';
-
-describe('', () => {
- afterEach(cleanup);
-
- it('renders', () => {
- render(foo bar baz);
- expect(screen.getByText(/foo/i)).toBeInTheDocument();
- });
-});
diff --git a/packages/components/src/components/Heading/index.ts b/packages/components/src/components/Heading/index.ts
deleted file mode 100644
index c05e2f8..0000000
--- a/packages/components/src/components/Heading/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { Heading } from './Heading';
diff --git a/packages/components/src/components/Input/Input.snippets.tsx b/packages/components/src/components/Input/Input.snippets.tsx
deleted file mode 100644
index 4d9c695..0000000
--- a/packages/components/src/components/Input/Input.snippets.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import * as React from 'react';
-
-import { Snippet } from '!/playroom/src/types';
-import { Input } from './Input';
-
-export const snippets: Snippet[] = [
- {
- name: 'Basic',
- code: ,
- },
-];
diff --git a/packages/components/src/components/Input/Input.test.tsx b/packages/components/src/components/Input/Input.test.tsx
deleted file mode 100644
index be5b0bc..0000000
--- a/packages/components/src/components/Input/Input.test.tsx
+++ /dev/null
@@ -1,67 +0,0 @@
-import * as React from 'react';
-
-import { cleanup, render, screen, userEvent } from '@/test';
-
-import { Input } from './Input';
-
-describe('', () => {
- afterEach(cleanup);
-
- it('renders', () => {
- render();
- expect(screen.getByRole('textbox')).toBeInTheDocument();
- });
-
- it('receives user input', () => {
- render();
-
- userEvent.type(screen.getByRole('textbox'), 'Satoshi Nakamoto');
- expect(screen.getByRole('textbox')).toHaveValue('Satoshi Nakamoto');
- });
-
- describe('[type=text]', () => {
- it('maxLength', () => {
- render();
-
- const element = screen.getByLabelText(/short/i);
- userEvent.type(element, 'Satoshi Nakamoto');
- expect(element).toHaveValue('Satoshi');
- });
- });
-
- describe('[type=number]', () => {
- it('filters invalid characters', () => {
- render();
-
- const element = screen.getByLabelText(/funding/i);
- userEvent.type(element, 'Ee+');
- expect(element).toHaveValue(null);
- });
-
- it('max', () => {
- render();
-
- const element = screen.getByLabelText(/funding/i);
- expect(element).toHaveValue(null);
- userEvent.click(screen.getByText('Max'));
- expect(element).toHaveValue(20);
- });
-
- it('units', () => {
- render(
- ,
- );
-
- const element = screen.getByLabelText(/funding/i) as HTMLInputElement;
- expect(element.placeholder).toEqual('10 ETH');
- userEvent.type(element, '20');
- expect(element).toHaveValue(20);
- expect(screen.getByTestId('ghost')).toBeInTheDocument();
- });
- });
-});
diff --git a/packages/components/src/components/Input/index.ts b/packages/components/src/components/Input/index.ts
deleted file mode 100644
index 6322cf3..0000000
--- a/packages/components/src/components/Input/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { Input } from './Input';
diff --git a/packages/components/src/components/Skeleton/Skeleton.snippets.tsx b/packages/components/src/components/Skeleton/Skeleton.snippets.tsx
deleted file mode 100644
index 065acaf..0000000
--- a/packages/components/src/components/Skeleton/Skeleton.snippets.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import * as React from 'react';
-
-import { Snippet } from '!/playroom/src/types';
-import { Skeleton } from './Skeleton';
-
-export const snippets: Snippet[] = [
- {
- name: 'Basic',
- code: _,
- },
-];
diff --git a/packages/components/src/components/Skeleton/Skeleton.test.tsx b/packages/components/src/components/Skeleton/Skeleton.test.tsx
deleted file mode 100644
index a7b5ed2..0000000
--- a/packages/components/src/components/Skeleton/Skeleton.test.tsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import * as React from 'react';
-
-import { cleanup, render, screen } from '@/test';
-
-import { Skeleton } from './Skeleton';
-
-describe('', () => {
- afterEach(cleanup);
-
- it('renders', () => {
- render(foo bar baz);
- expect(screen.getByText(/foo/i)).toBeInTheDocument();
- });
-});
diff --git a/packages/components/src/components/Skeleton/index.ts b/packages/components/src/components/Skeleton/index.ts
deleted file mode 100644
index 3f34073..0000000
--- a/packages/components/src/components/Skeleton/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { Skeleton } from './Skeleton';
diff --git a/packages/components/src/components/SkeletonGroup/SkeletonGroup.snippets.tsx b/packages/components/src/components/SkeletonGroup/SkeletonGroup.snippets.tsx
deleted file mode 100644
index 231e3ce..0000000
--- a/packages/components/src/components/SkeletonGroup/SkeletonGroup.snippets.tsx
+++ /dev/null
@@ -1,16 +0,0 @@
-import * as React from 'react';
-
-import { Snippet } from '!/playroom/src/types';
-import { Skeleton } from '../Skeleton';
-import { SkeletonGroup } from './SkeletonGroup';
-
-export const snippets: Snippet[] = [
- {
- name: 'Basic',
- code: (
-
- _
-
- ),
- },
-];
diff --git a/packages/components/src/components/SkeletonGroup/SkeletonGroup.test.tsx b/packages/components/src/components/SkeletonGroup/SkeletonGroup.test.tsx
deleted file mode 100644
index eb4af0c..0000000
--- a/packages/components/src/components/SkeletonGroup/SkeletonGroup.test.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import * as React from 'react';
-
-import { cleanup, render, screen } from '@/test';
-
-import { Skeleton } from '../Skeleton';
-import { SkeletonGroup } from './SkeletonGroup';
-
-describe('', () => {
- afterEach(cleanup);
-
- it('renders', () => {
- render(
-
- foo bar baz
- quick brown fox
- ,
- );
- expect(screen.getByText(/foo/i)).toBeInTheDocument();
- });
-});
diff --git a/packages/components/src/components/SkeletonGroup/index.ts b/packages/components/src/components/SkeletonGroup/index.ts
deleted file mode 100644
index bd9bb7d..0000000
--- a/packages/components/src/components/SkeletonGroup/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { SkeletonGroup, Context } from './SkeletonGroup';
diff --git a/packages/components/src/components/Spinner/Spinner.snippets.tsx b/packages/components/src/components/Spinner/Spinner.snippets.tsx
deleted file mode 100644
index a8f0372..0000000
--- a/packages/components/src/components/Spinner/Spinner.snippets.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import * as React from 'react';
-
-import { Snippet } from '!/playroom/src/types';
-import { Spinner } from './Spinner';
-
-export const snippets: Snippet[] = [
- {
- name: 'Basic',
- code: ,
- },
-];
diff --git a/packages/components/src/components/Spinner/Spinner.test.tsx b/packages/components/src/components/Spinner/Spinner.test.tsx
deleted file mode 100644
index 2a4a658..0000000
--- a/packages/components/src/components/Spinner/Spinner.test.tsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import * as React from 'react';
-
-import { cleanup, render, screen } from '@/test';
-
-import { Spinner } from './Spinner';
-
-describe('', () => {
- afterEach(cleanup);
-
- it('renders', () => {
- render();
- expect(screen.getByText(/loading/i)).toBeInTheDocument();
- });
-});
diff --git a/packages/components/src/components/Spinner/index.ts b/packages/components/src/components/Spinner/index.ts
deleted file mode 100644
index 1ce6cab..0000000
--- a/packages/components/src/components/Spinner/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { Spinner } from './Spinner';
diff --git a/packages/components/src/components/Stack/Stack.test.tsx b/packages/components/src/components/Stack/Stack.test.tsx
deleted file mode 100644
index b0df513..0000000
--- a/packages/components/src/components/Stack/Stack.test.tsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import * as React from 'react';
-
-import { cleanup, render, screen } from '@/test';
-
-import { Box } from '../Box';
-import { Stack } from './Stack';
-
-describe('', () => {
- afterEach(cleanup);
-
- it('renders', () => {
- render(
-
- foo bar baz
- ,
- );
- expect(screen.getByText(/foo/i)).toBeInTheDocument();
- });
-});
diff --git a/packages/components/src/components/Stack/index.ts b/packages/components/src/components/Stack/index.ts
deleted file mode 100644
index 54507b6..0000000
--- a/packages/components/src/components/Stack/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { Stack } from './Stack';
diff --git a/packages/components/src/components/Stat/index.ts b/packages/components/src/components/Stat/index.ts
deleted file mode 100644
index 48bf1a4..0000000
--- a/packages/components/src/components/Stat/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { Stat } from './Stat';
diff --git a/packages/components/src/components/Tag/Tag.snippets.tsx b/packages/components/src/components/Tag/Tag.snippets.tsx
deleted file mode 100644
index 0a146fb..0000000
--- a/packages/components/src/components/Tag/Tag.snippets.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import * as React from 'react';
-
-import { Snippet } from '!/playroom/src/types';
-import { Tag } from './Tag';
-
-export const snippets: Snippet[] = [
- {
- name: 'Basic',
- code: Tag,
- },
-];
diff --git a/packages/components/src/components/Tag/Tag.test.tsx b/packages/components/src/components/Tag/Tag.test.tsx
deleted file mode 100644
index e377832..0000000
--- a/packages/components/src/components/Tag/Tag.test.tsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import * as React from 'react';
-
-import { cleanup, render, screen } from '@/test';
-
-import { Tag } from './Tag';
-
-describe('', () => {
- afterEach(cleanup);
-
- it('renders', () => {
- render(10 ETH);
- expect(screen.getByText(/eth/i)).toBeInTheDocument();
- });
-});
diff --git a/packages/components/src/components/Tag/index.ts b/packages/components/src/components/Tag/index.ts
deleted file mode 100644
index a3531f8..0000000
--- a/packages/components/src/components/Tag/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export { Tag } from './Tag';
-export type { Props as TagProps } from './Tag';
diff --git a/packages/components/src/components/Text/Text.snippets.tsx b/packages/components/src/components/Text/Text.snippets.tsx
deleted file mode 100644
index cee0ca9..0000000
--- a/packages/components/src/components/Text/Text.snippets.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import * as React from 'react';
-
-import { Snippet } from '!/playroom/src/types';
-import { Text } from './Text';
-
-export const snippets: Snippet[] = [
- {
- name: 'Basic',
- code: Text,
- },
-];
diff --git a/packages/components/src/components/Text/Text.test.tsx b/packages/components/src/components/Text/Text.test.tsx
deleted file mode 100644
index 413ae3e..0000000
--- a/packages/components/src/components/Text/Text.test.tsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import * as React from 'react';
-
-import { cleanup, render, screen } from '@/test';
-
-import { Text } from './Text';
-
-describe('', () => {
- afterEach(cleanup);
-
- it('renders', () => {
- render(foo bar baz);
- expect(screen.getByText(/foo/i)).toBeInTheDocument();
- });
-});
diff --git a/packages/components/src/components/Text/index.ts b/packages/components/src/components/Text/index.ts
deleted file mode 100644
index 3db2d7e..0000000
--- a/packages/components/src/components/Text/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { Text } from './Text';
diff --git a/packages/components/src/components/Textarea/Textarea.snippets.tsx b/packages/components/src/components/Textarea/Textarea.snippets.tsx
deleted file mode 100644
index e92625c..0000000
--- a/packages/components/src/components/Textarea/Textarea.snippets.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import * as React from 'react';
-
-import { Snippet } from '!/playroom/src/types';
-import { Textarea } from './Textarea';
-
-export const snippets: Snippet[] = [
- {
- name: 'Basic',
- code: ,
- },
-];
diff --git a/packages/components/src/components/Textarea/Textarea.test.tsx b/packages/components/src/components/Textarea/Textarea.test.tsx
deleted file mode 100644
index 1421561..0000000
--- a/packages/components/src/components/Textarea/Textarea.test.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-import * as React from 'react';
-
-import { cleanup, render, screen, userEvent } from '@/test';
-
-import { Textarea } from './Textarea';
-
-describe('', () => {
- afterEach(cleanup);
-
- it('renders', () => {
- render();
- expect(screen.getByRole('textbox')).toBeInTheDocument();
- });
-
- it('receives user input', () => {
- render();
-
- userEvent.type(screen.getByRole('textbox'), 'Calculate total profits');
- expect(screen.getByRole('textbox')).toHaveValue('Calculate total profits');
- });
-
- it('maxLength', () => {
- render();
-
- const element = screen.getByLabelText(/why/i);
- userEvent.type(element, 'Calculate total profits');
- expect(element).toHaveValue('Wen Waifu');
- });
-});
diff --git a/packages/components/src/components/Textarea/index.ts b/packages/components/src/components/Textarea/index.ts
deleted file mode 100644
index f4212c0..0000000
--- a/packages/components/src/components/Textarea/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { Textarea } from './Textarea';
diff --git a/packages/components/src/components/ThemeProvider/index.ts b/packages/components/src/components/ThemeProvider/index.ts
deleted file mode 100644
index 28023c4..0000000
--- a/packages/components/src/components/ThemeProvider/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export { ThemeProvider, useTheme } from './ThemeProvider';
-export type { ThemeProviderProps } from './ThemeProvider';
diff --git a/packages/components/src/components/VisuallyHidden/VisuallyHidden.snippets.tsx b/packages/components/src/components/VisuallyHidden/VisuallyHidden.snippets.tsx
deleted file mode 100644
index b5e024c..0000000
--- a/packages/components/src/components/VisuallyHidden/VisuallyHidden.snippets.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import * as React from 'react';
-
-import { Snippet } from '!/playroom/src/types';
-import { VisuallyHidden } from './VisuallyHidden';
-
-export const snippets: Snippet[] = [
- {
- name: 'Basic',
- code: _,
- },
-];
diff --git a/packages/components/src/components/VisuallyHidden/VisuallyHidden.test.tsx b/packages/components/src/components/VisuallyHidden/VisuallyHidden.test.tsx
deleted file mode 100644
index 27f6721..0000000
--- a/packages/components/src/components/VisuallyHidden/VisuallyHidden.test.tsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import * as React from 'react';
-
-import { cleanup, render, screen } from '@/test';
-
-import { VisuallyHidden } from './VisuallyHidden';
-
-describe('', () => {
- afterEach(cleanup);
-
- it('renders', () => {
- render(foo bar baz);
- expect(screen.getByText(/foo/i)).toBeInTheDocument();
- });
-});
diff --git a/packages/components/src/components/VisuallyHidden/index.ts b/packages/components/src/components/VisuallyHidden/index.ts
deleted file mode 100644
index 893063f..0000000
--- a/packages/components/src/components/VisuallyHidden/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { VisuallyHidden } from './VisuallyHidden';
diff --git a/packages/components/src/components/icons/IconNFT/IconNFT.snippets.tsx b/packages/components/src/components/icons/IconNFT/IconNFT.snippets.tsx
deleted file mode 100644
index e79255a..0000000
--- a/packages/components/src/components/icons/IconNFT/IconNFT.snippets.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import * as React from 'react';
-
-import { Snippet } from '!/playroom/src/types';
-import { IconNFT } from './IconNFT';
-
-export const snippets: Snippet[] = [
- {
- name: 'Basic',
- code: ,
- },
-];
diff --git a/packages/components/src/components/icons/IconNFT/IconNFT.tsx b/packages/components/src/components/icons/IconNFT/IconNFT.tsx
deleted file mode 100644
index a65fc56..0000000
--- a/packages/components/src/components/icons/IconNFT/IconNFT.tsx
+++ /dev/null
@@ -1,30 +0,0 @@
-import * as React from 'react';
-
-import { Box, BoxProps } from '../../Box';
-import { OptionalTitle } from '../types';
-import { IconNFTSvg } from './IconNFTSVG';
-
-type Props = {
- className?: BoxProps['className'];
- color?: BoxProps['color'];
- size?: BoxProps['height'];
- strokeWidth?: BoxProps['strokeWidth'];
-} & OptionalTitle;
-
-export const IconNFT = ({
- color,
- size = '6',
- strokeWidth = '0.5',
- ...props
-}: Props) => {
- return (
-
- );
-};
diff --git a/packages/components/src/components/icons/IconNFT/index.ts b/packages/components/src/components/icons/IconNFT/index.ts
deleted file mode 100644
index 1c5439f..0000000
--- a/packages/components/src/components/icons/IconNFT/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { IconNFT } from './IconNFT';
diff --git a/packages/components/src/components/icons/generated/.gitkeep b/packages/components/src/components/icons/generated/.gitkeep
deleted file mode 100644
index e69de29..0000000
diff --git a/packages/components/src/components/icons/generated/index.ts b/packages/components/src/components/icons/generated/index.ts
deleted file mode 100644
index e69de29..0000000
diff --git a/packages/components/src/components/icons/index.ts b/packages/components/src/components/icons/index.ts
deleted file mode 100644
index 703d8de..0000000
--- a/packages/components/src/components/icons/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from './generated';
-export { IconNFT } from './IconNFT';
diff --git a/packages/components/src/components/index.ts b/packages/components/src/components/index.ts
deleted file mode 100644
index 161118f..0000000
--- a/packages/components/src/components/index.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-export * from './icons';
-export type { BoxProps } from './Box';
-export { Avatar } from './Avatar';
-export { AvatarGroup } from './AvatarGroup';
-export { Box } from './Box';
-export { Button } from './Button';
-export { Card } from './Card';
-export { Field } from './Field';
-export { FieldSet } from './FieldSet';
-export { FileInput } from './FileInput';
-export { Heading } from './Heading';
-export { Input } from './Input';
-
-export { Skeleton } from './Skeleton';
-export { SkeletonGroup } from './SkeletonGroup';
-export { Spinner } from './Spinner';
-export { Stack } from './Stack';
-export { Stat } from './Stat';
-export { Tag } from './Tag';
-export { Text } from './Text';
-export { Textarea } from './Textarea';
-export { ThemeProvider, useTheme } from './ThemeProvider';
-export { VisuallyHidden } from './VisuallyHidden';
diff --git a/packages/components/src/css/atoms.ts b/packages/components/src/css/atoms.ts
deleted file mode 100644
index 1fc2f5c..0000000
--- a/packages/components/src/css/atoms.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import clsx from 'clsx';
-
-import * as resetStyles from './reset.css';
-import { Sprinkles, sprinkles } from './sprinkles.css';
-import { getInjectedStyleClasses } from './injectedStyles';
-
-export type Atoms = Sprinkles & {
- reset?: resetStyles.Element & keyof JSX.IntrinsicElements;
-};
-
-export const atoms = ({ reset, ...rest }: Atoms) => {
- const sprinklesClasses = sprinkles(rest);
- const injectedStyleClasses = getInjectedStyleClasses(rest);
-
- return clsx(
- reset && [resetStyles.base, resetStyles.element[reset]],
- sprinklesClasses,
- injectedStyleClasses,
- );
-};
diff --git a/packages/components/src/css/index.ts b/packages/components/src/css/index.ts
deleted file mode 100644
index ec7c09f..0000000
--- a/packages/components/src/css/index.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-export { atoms } from './atoms';
-export type { Atoms } from './atoms';
-
-export { breakpoints } from './breakpoints';
-export type { Breakpoint } from './breakpoints';
-
-export {
- mapResponsiveValue,
- normalizeResponsiveValue,
- sprinkles,
-} from './sprinkles.css';
-export type {
- OptionalResponsiveObject,
- OptionalResponsiveValue,
- RequiredResponsiveObject,
- RequiredResponsiveValue,
- Sprinkles,
-} from './sprinkles.css';
-
-export { vars } from './vars.css';
-
-export type { Theme } from './types';
-
-export { responsiveStyle } from './responsiveStyle';
-export { getAccentText, getModeColors, motionSafe, rgb } from './utils';
diff --git a/packages/components/src/css/types.ts b/packages/components/src/css/types.ts
deleted file mode 100644
index 3081ce9..0000000
--- a/packages/components/src/css/types.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-import { Accent, Tokens } from '../tokens';
-
-type BaseColors = Tokens['colors']['base'] & {
- [key in Accent]: string;
-};
-
-type ThemeColors = BaseColors & {
- accent: string;
- accentText: string;
- accentSecondary?: string;
- accentSecondaryHover?: string;
- accentTertiary?: string;
- background: string;
- backgroundSecondary: string;
- backgroundTertiary: string;
- foreground: string;
- foregroundSecondary: string;
- foregroundSecondaryHover: string;
- foregroundTertiary: string;
- groupBackground: string;
- groupBorder: string;
- text: string;
- textPrimary: string;
- textSecondary: string;
- textTertiary: string;
-};
-
-type ThemeMode = {
- colors: Tokens['colors']['light'];
- shades: Tokens['shades']['light'];
-};
-
-export type Theme = {
- borderStyles: Tokens['borderStyles'];
- borderWidths: Tokens['borderWidths'];
- colors: ThemeColors;
- fonts: Tokens['fonts'];
- fontSizes: Tokens['fontSizes'];
- fontWeights: Tokens['fontWeights'];
- letterSpacings: Tokens['letterSpacings'];
- lineHeights: Tokens['lineHeights'];
- opacity: Tokens['opacity'];
- mode: ThemeMode;
- radii: Tokens['radii'];
- shadows: Tokens['shadows'];
- space: Tokens['space'];
-};
diff --git a/packages/components/src/hooks/index.ts b/packages/components/src/hooks/index.ts
deleted file mode 100644
index 594d31d..0000000
--- a/packages/components/src/hooks/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export { useFieldIds } from './useFieldIds';
-export { useId } from './useId';
diff --git a/packages/components/src/hooks/useId.test.ts b/packages/components/src/hooks/useId.test.ts
deleted file mode 100644
index dd96341..0000000
--- a/packages/components/src/hooks/useId.test.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import { cleanup, renderHook } from '@/test';
-
-import { useId } from './useId';
-
-describe('useId', () => {
- afterEach(cleanup);
-
- it('generates id', () => {
- const { result: resultA } = renderHook(() => useId());
- expect(resultA.current).toStrictEqual('degen1');
- const { result: resultB } = renderHook(() => useId());
- expect(resultB.current).toStrictEqual('degen2');
- });
-});
diff --git a/packages/components/src/hooks/useId.ts b/packages/components/src/hooks/useId.ts
deleted file mode 100644
index fbc407c..0000000
--- a/packages/components/src/hooks/useId.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import * as React from 'react';
-
-import { useIsoMorphicEffect } from './useIsoMorphicEffect';
-import { useServerHandoffComplete } from './useServerHandoffComplete';
-
-const idPrefix = '@disco3/components';
-
-let id = 0;
-function generateId() {
- return ++id;
-}
-
-export const useId = () => {
- const ready = useServerHandoffComplete();
- const [id, setId] = React.useState(ready ? generateId : null);
-
- useIsoMorphicEffect(() => {
- if (id === null) setId(generateId());
- }, [id]);
-
- return id != null ? `${idPrefix}` + id : undefined;
-};
diff --git a/packages/components/src/hooks/useServerHandoffComplete.ts b/packages/components/src/hooks/useServerHandoffComplete.ts
deleted file mode 100644
index 2e6aeb5..0000000
--- a/packages/components/src/hooks/useServerHandoffComplete.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import * as React from 'react';
-
-const state = { serverHandoffComplete: false };
-
-export const useServerHandoffComplete = () => {
- const [serverHandoffComplete, setServerHandoffComplete] = React.useState(
- state.serverHandoffComplete,
- );
-
- React.useEffect(() => {
- if (serverHandoffComplete) return;
- setServerHandoffComplete(true);
- }, [serverHandoffComplete]);
-
- React.useEffect(() => {
- if (state.serverHandoffComplete) return;
- state.serverHandoffComplete = true;
- }, []);
-
- return serverHandoffComplete;
-};
diff --git a/packages/components/src/tokens/index.ts b/packages/components/src/tokens/index.ts
deleted file mode 100644
index 0de47c6..0000000
--- a/packages/components/src/tokens/index.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import { borderStyles, borderWidths, radii } from './border';
-import { shadows } from './shadows';
-import { colors, shades } from './color';
-import { opacity } from './opacity';
-import { space } from './space';
-import {
- fontSizes,
- fontWeights,
- fonts,
- letterSpacings,
- lineHeights,
-} from './typography';
-
-export const tokens = {
- borderStyles,
- borderWidths,
- colors,
- fonts,
- fontSizes,
- fontWeights,
- letterSpacings,
- lineHeights,
- opacity,
- radii,
- shades,
- shadows,
- space,
-};
-
-export type { Accent, Mode } from './color';
-export type Tokens = typeof tokens;
diff --git a/packages/components/src/types/focus-visible.d.ts b/packages/components/src/types/focus-visible.d.ts
deleted file mode 100644
index 6384c6d..0000000
--- a/packages/components/src/types/focus-visible.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-declare module 'focus-visible';
diff --git a/scripts/generateIcons.js b/scripts/generateIcons.js
new file mode 100644
index 0000000..cf5b704
--- /dev/null
+++ b/scripts/generateIcons.js
@@ -0,0 +1,203 @@
+const fs = require('fs-extra')
+const glob = require('glob')
+const { default: svgr } = require('@svgr/core')
+const dedent = require('dedent')
+const { pascalCase } = require('change-case')
+
+const path = require('path')
+
+const componentTemplate = ({ template }, opts, { componentName, jsx }) => {
+ const code = `
+ import * as React from 'react'
+ NEWLINE
+ import { IconProps } from '../../types'
+ NEWLINE
+ export const COMPONENT_NAME = ({ title, titleId, ...props }: IconProps) => COMPONENT_JSX
+ `
+
+ const reactTemplate = template.smart(code, {
+ plugins: ['react', 'typescript'],
+ })
+
+ return reactTemplate({
+ COMPONENT_NAME: componentName,
+ COMPONENT_JSX: jsx,
+ NEWLINE: '\n',
+ })
+}
+
+const svgrConfig = {
+ plugins: ['@svgr/plugin-svgo', '@svgr/plugin-jsx', '@svgr/plugin-prettier'],
+ replaceAttrValues: { '#000': 'currentColor' },
+ svgProps: {
+ focusable: 'false',
+ shapeRendering: 'geometricPrecision',
+ viewBox: '0 0 24 24',
+ },
+ svgoConfig: {
+ multipass: true,
+ },
+ template: componentTemplate,
+ titleProp: true,
+ jsx: {
+ babelConfig: {
+ plugins: [
+ [
+ '@svgr/babel-plugin-remove-jsx-attribute',
+ {
+ elements: ['path'],
+ attributes: ['className', 'strokeWidth'],
+ },
+ ],
+ ],
+ },
+ },
+}
+
+const baseDir = path.join(__dirname, '..')
+const iconComponentsDir = path.join(
+ baseDir,
+ 'components/src/components/icons/generated',
+)
+
+;(async () => {
+ // Clean old files
+ const svgComponentPaths = glob.sync('Icon*/', {
+ cwd: iconComponentsDir,
+ absolute: true,
+ })
+ console.log('Cleaning old icons...')
+ for (const svgComponentPath of svgComponentPaths) {
+ await fs.remove(svgComponentPath)
+ }
+
+ // Get SVGs to generate
+ const svgFilePaths = glob.sync('./icons/*.svg', {
+ cwd: baseDir,
+ absolute: true,
+ })
+
+ console.log('Generating icons...')
+ for (const svgFilePath of svgFilePaths) {
+ const rawSvg = await fs.readFile(svgFilePath, 'utf8')
+ const svg = rawSvg.replace(/ data-name=".*?"/g, '')
+ const svgName = `Icon${pascalCase(path.basename(svgFilePath, '.svg'))}`
+
+ // Create icon directory if it's missing
+ const iconDir = path.join(iconComponentsDir, svgName)
+ await fs.mkdirp(iconDir)
+
+ // Write SVG React component
+ const componentName = `${svgName}Svg`
+ const svgComponentCode = svgr.sync(svg, svgrConfig, { componentName })
+ await fs.writeFile(
+ path.join(iconDir, `${componentName}.tsx`),
+ svgComponentCode,
+ { encoding: 'utf-8' },
+ )
+
+ // Write wrapper component
+ await fs.writeFile(
+ path.join(iconDir, `${svgName}.tsx`),
+ dedent`
+ import * as React from 'react'
+
+ import { Box, BoxProps } from '../../../Box'
+ import { OptionalTitle } from '../../types'
+ import { ${componentName} } from './${componentName}'
+
+ type Props = {
+ className?: BoxProps['className']
+ color?: BoxProps['color']
+ size?: BoxProps['height']
+ strokeWidth?: BoxProps['strokeWidth']
+ } & OptionalTitle
+
+ export const ${svgName} = ({
+ color,
+ size = '6',
+ strokeWidth = '0.5',
+ ...props
+ }: Props) => {
+ return (
+
+ )
+ }
+ `,
+ 'utf-8',
+ )
+
+ // Write docs file
+ await fs.writeFile(
+ path.join(iconDir, `${svgName}.docs.mdx`),
+ dedent`
+ ---
+ title: ${svgName}
+ ---
+
+ \`\`\`tsx
+ import { ${svgName} } from 'degen'
+ \`\`\`
+
+ \`\`\`tsx live=true expand=true
+ <${svgName} />
+ \`\`\`
+
+ ## Props
+
+
+ `,
+ 'utf-8',
+ )
+
+ // Write snippets file
+ await fs.writeFile(
+ path.join(iconDir, `${svgName}.snippets.tsx`),
+ dedent`
+ import * as React from 'react'
+
+ import { Snippet } from '!/playroom/src/types'
+ import { ${svgName} } from './${svgName}'
+
+ export const snippets: Snippet[] = [
+ {
+ name: 'Basic',
+ code: <${svgName} />,
+ },
+ ]
+ `,
+ 'utf-8',
+ )
+
+ // Write index file
+ await fs.writeFile(
+ path.join(iconDir, 'index.ts'),
+ dedent`
+ export { ${svgName} } from './${svgName}'
+ `,
+ 'utf-8',
+ )
+ }
+
+ // Create icons/index.ts
+ const iconComponentNames = (await fs.readdir(iconComponentsDir)).filter(
+ (fileOrDir) => !fileOrDir.includes('.') && fileOrDir.includes('Icon'),
+ )
+ const iconExports = iconComponentNames
+ .map((componentFile) => path.basename(componentFile, '.tsx'))
+ .map((component) => `export { ${component} } from './${component}'`)
+ .join('\n')
+ .concat('\n')
+ const iconsIndexPath = path.join(iconComponentsDir, 'index.ts')
+ await fs.remove(iconsIndexPath)
+ console.log('Generating icon index...')
+ await fs.writeFile(iconsIndexPath, iconExports, 'utf-8')
+ console.log('Done.')
+})()