diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..db87e1f --- /dev/null +++ b/.editorconfig @@ -0,0 +1,8 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +charset = utf-8 +trim_trailing_whitespace = false +insert_final_newline = false \ No newline at end of file diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..372edf9 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,4 @@ +node_modules/ +public/ +out/ +.next/ \ No newline at end of file diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..8ab81fb --- /dev/null +++ b/.eslintrc @@ -0,0 +1,79 @@ +{ + "extends": [ + "eslint:recommended", + "plugin:react/recommended", + "plugin:import/recommended", + "plugin:import/errors", + "plugin:import/warnings", + "plugin:import/typescript", + "prettier" + ], + "env": { + "browser": true, + "es6": true, + "node": true, + "commonjs": true + }, + "globals": { + "Atomics": "readonly", + "SharedArrayBuffer": "readonly", + "JSX": true + }, + "plugins": [ + "eslint-plugin-import", + "eslint-plugin-react", + "eslint-plugin-react-hooks", + "@typescript-eslint/eslint-plugin" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 2018, + "sourceType": "module", + "allowImportExportEverywhere": true + }, + "rules": { + "no-const-assign": "error", + "no-case-declarations": "warn", + "no-empty-pattern": "error", + "no-fallthrough": "warn", + "no-global-assign": "error", + "no-alert": "error", + "no-with": "error", + "no-delete-var": "error", + "no-shadow-restricted-names": "error", + "no-dupe-class-members": "error", + "no-new-symbol": "error", + "no-this-before-super": "error", + "no-undef": "error", + "no-console": "warn", + "no-octal": "error", + "no-redeclare": "error", + "no-self-assign": "error", + "no-useless-catch": "error", + "no-useless-escape": "warn", + "no-unused-vars": "warn", + "no-mixed-spaces-and-tabs": "warn", + "no-class-assign": "error", + "constructor-super": "error", + "require-yield": "error", + "prefer-const": "error", + "default-case": "warn", + "@typescript-eslint/no-unused-vars": "warn", + "react-hooks/rules-of-hooks": "error", + "react-hooks/exhaustive-deps": "warn", + "react/react-in-jsx-scope": "off", + "react/prop-types": "off", + "react/jsx-no-undef": [2, { "allowGlobals": true }] + }, + "settings": { + "react": { + "version": "detect" + }, + "import/resolver": { + "node": { + "paths": ["."], + "extensions": [".js", ".jsx", ".ts", ".tsx", ".d.ts"] + } + } + } +} diff --git a/.github/workflows/gh-pages-deploy.yml b/.github/workflows/gh-pages-deploy.yml new file mode 100644 index 0000000..e69de29 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b5f352d --- /dev/null +++ b/.gitignore @@ -0,0 +1,130 @@ +# See https://github.com/github/gitignore/blob/master/Node.gitignore + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test +shell.env + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.pnp.* + +# testing +/coverage + +# production +/build + +# misc +.DS_Store + +.idea +.vscode diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..372edf9 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,4 @@ +node_modules/ +public/ +out/ +.next/ \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..afa3ee3 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,11 @@ +{ + "bracketSpacing": true, + "packageManager": "yarn", + "printWidth": 80, + "semi": true, + "singleQuote": false, + "tabWidth": 2, + "useEditorConfig": true, + "trailingComma": "none", + "arrowParens": "avoid" +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..4f47d9b --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# Sonnat Design System - Documentation Website diff --git a/components/ActiveLink/ActiveLink.tsx b/components/ActiveLink/ActiveLink.tsx new file mode 100644 index 0000000..39cd649 --- /dev/null +++ b/components/ActiveLink/ActiveLink.tsx @@ -0,0 +1,46 @@ +import createClassName from "classnames"; +import Link, { LinkProps as NextLinkProps } from "next/link"; +import { useRouter } from "next/router"; +import * as React from "react"; + +export interface ActiveLinkProps extends NextLinkProps { + onActive?: () => void; + activeClassName?: string; +} + +const ActiveLink: React.FC = props => { + const { + children, + href, + onActive, + activeClassName = "active", + ...otherProps + } = props; + + const child = React.Children.only( + children + ) as NonNullable; + + const router = useRouter(); + + const isActive = React.useMemo( + () => router.pathname === href, + [href, router.pathname] + ); + + React.useEffect(() => { + if (isActive && onActive) onActive(); + }, [isActive, onActive]); + + return ( + + {React.cloneElement(child, { + className: createClassName(child.props?.className, { + [activeClassName]: isActive + }) + })} + + ); +}; + +export default ActiveLink; diff --git a/components/ActiveLink/index.ts b/components/ActiveLink/index.ts new file mode 100644 index 0000000..576b7a4 --- /dev/null +++ b/components/ActiveLink/index.ts @@ -0,0 +1,2 @@ +export { default } from "./ActiveLink"; +export * from "./ActiveLink"; diff --git a/components/Anatomy/Anatomy.tsx b/components/Anatomy/Anatomy.tsx new file mode 100644 index 0000000..95eb035 --- /dev/null +++ b/components/Anatomy/Anatomy.tsx @@ -0,0 +1,180 @@ +import makeStyles from "@sonnat/ui/styles/makeStyles"; +import Skeleton from "@sonnat/ui/Skeleton"; +import InfoCircleLargeO from "@sonnat/icons/InfoCircleLargeO"; +import Text from "@sonnat/ui/Text"; +import clx from "classnames"; +import NextImage, { ImageProps as NextImageProps } from "next/image"; +import useIsomorphicLayoutEffect from "utils/useIsomorphicLayoutEffect"; +import * as React from "react"; + +const componentName = "Anatomy"; + +const useStyles = makeStyles( + theme => ({ + root: { + margin: 0, + cursor: "pointer", + "&:hover $specImage": { + opacity: 1, + visibility: "visible" + } + }, + container: { + position: "relative", + borderRadius: theme.typography.pxToRem(4), + overflow: "hidden", + border: "1px solid rgba(0, 0, 0, 0.04)", + backgroundColor: "rgba(0, 0, 0, 0.02)" + }, + imageWrapper: { + width: "100%", + position: "absolute", + top: 0 + }, + hoverInfo: { + position: "absolute", + top: theme.typography.pxToRem(8), + right: theme.typography.pxToRem(8), + display: "flex", + alignItems: "center", + "& > * + *": { marginRight: theme.typography.pxToRem(4) } + }, + hoverInfoDesktop: {}, + hoverInfoMobile: {}, + caption: { marginTop: theme.typography.pxToRem(8) }, + captionText: {}, + mainImage: {}, + specImage: { + opacity: 0, + visibility: "hidden", + transition: ["opacity 360ms ease", "visibility 360ms ease"].join(", ") + }, + [theme.breakpoints.down("md")]: { + hoverInfoDesktop: { display: "none" } + }, + [theme.breakpoints.up("md")]: { + hoverInfoMobile: { display: "none" } + } + }), + { name: componentName } +); + +interface AnatomyProps { + className?: string; + imageProps: NextImageProps & { + mainSrc: string; + specSrc: string; + width: number; + height: number; + }; + caption: string; +} + +const Anatomy: React.FC = props => { + const classes = useStyles(); + + const { imageProps, caption, className, ...otherProps } = props; + const { + mainSrc, + specSrc, + width, + height, + // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars + src, + className: imageClassName, + ...otherImageProps + } = imageProps; + + const ratio = width / height; + const paddingTop = (height / width) * 100; + + const [isMainLoaded, setMainLoaded] = React.useState(false); + const [isSpecLoaded, setSpecLoaded] = React.useState(false); + + const isReady = isMainLoaded && isSpecLoaded; + + useIsomorphicLayoutEffect(() => { + const mainImage = new window.Image(); + const specImage = new window.Image(); + + mainImage.src = mainSrc; + specImage.src = specSrc; + + mainImage.onload = () => { + setMainLoaded(true); + }; + + specImage.onload = () => { + setSpecLoaded(true); + }; + }, []); + + return ( +
+
+ {isReady ? ( + +
+ + + برای دیدن مشخصات{" "} + هاور کنید + کلیک کنید + +
+
+ +
+
+ +
+
+ ) : ( + + )} +
+ {caption && ( +
+ {typeof caption === "string" ? ( + + {caption} + + ) : ( + caption + )} +
+ )} +
+ ); +}; + +Anatomy.displayName = componentName; + +export default Anatomy; diff --git a/components/Anatomy/index.ts b/components/Anatomy/index.ts new file mode 100644 index 0000000..951c8e8 --- /dev/null +++ b/components/Anatomy/index.ts @@ -0,0 +1 @@ +export { default } from "./Anatomy"; diff --git a/components/AnchorButton/AnchorButton.tsx b/components/AnchorButton/AnchorButton.tsx new file mode 100644 index 0000000..ee7ebb1 --- /dev/null +++ b/components/AnchorButton/AnchorButton.tsx @@ -0,0 +1,68 @@ +import Link from "@sonnat/icons/Link"; +import Button from "@sonnat/ui/Button"; +import makeStyles from "@sonnat/ui/styles/makeStyles"; +import Tooltip from "@sonnat/ui/Tooltip"; +import createClassName from "classnames"; +import * as React from "react"; +import useClipboard from "react-use-clipboard"; + +const componentName = "AnchorButton"; + +const isServer = typeof window === "undefined"; + +interface Props { + className?: string; + anchorId: string; +} + +const useStyles = makeStyles( + theme => ({ + root: { + position: "relative", + marginLeft: theme.typography.pxToRem(8), + marginRight: theme.typography.pxToRem(8) + }, + button: {}, + anchor: { + position: "absolute", + top: 0, + [theme.breakpoints.down("sm")]: { top: theme.typography.pxToRem(-64) } + } + }), + { name: componentName } +); + +const AnchorButton = React.memo(function AnchorButton(props) { + const { className, anchorId, ...otherProps } = props; + + const anchorHref = isServer + ? "" + : `${window.location.origin}${window.location.pathname}#${anchorId}`; + + const classes = useStyles(); + const [isCopied, setCopied] = useClipboard(anchorHref, { + successDuration: 1000 + }); + + return ( +
+ + +
+ ); +}); + +AnchorButton.displayName = componentName; + +export default AnchorButton; diff --git a/components/AnchorButton/index.ts b/components/AnchorButton/index.ts new file mode 100644 index 0000000..3626905 --- /dev/null +++ b/components/AnchorButton/index.ts @@ -0,0 +1 @@ +export { default } from "./AnchorButton"; diff --git a/components/Behaviour/Behaviour.tsx b/components/Behaviour/Behaviour.tsx new file mode 100644 index 0000000..e050fea --- /dev/null +++ b/components/Behaviour/Behaviour.tsx @@ -0,0 +1,65 @@ +import { AlertCircle, CheckCircle, CloseCircle } from "@sonnat/icons"; +import makeStyles from "@sonnat/ui/styles/makeStyles"; +import Text, { TextProps } from "@sonnat/ui/Text"; +import Image, { ImageProps as ImageProps } from "components/Image"; +import * as React from "react"; + +const componentName = "Behaviour"; + +const useStyles = makeStyles( + theme => ({ + root: {}, + caption: {}, + captionTitle: { + display: "flex", + alignItems: "center" + }, + captionIcon: { marginLeft: theme.typography.pxToRem(8) } + }), + { name: componentName } +); + +interface BehaviourProps { + imageProps: ImageProps["imageProps"]; + caption: string; + variant?: "do" | "dont" | "warning"; +} + +const Behaviour: React.FC = props => { + const classes = useStyles(); + + const { imageProps, caption, variant = "do", ...otherProps } = props; + + const color = ({ do: "success", dont: "error", warning: "warning" }[ + variant + ] || "textPrimary") as TextProps["color"]; + + return ( + + + {{ + do: , + dont: , + warning: + }[variant] || null} + + {{ do: "درست", dont: "نادرست", warning: "احتیاط" }[variant] || ""} + + + + {caption} + + + } + /> + ); +}; + +Behaviour.displayName = componentName; + +export default Behaviour; diff --git a/components/Behaviour/index.ts b/components/Behaviour/index.ts new file mode 100644 index 0000000..eb0f5f7 --- /dev/null +++ b/components/Behaviour/index.ts @@ -0,0 +1 @@ +export { default } from "./Behaviour"; diff --git a/components/Collapsable/Content.tsx b/components/Collapsable/Content.tsx new file mode 100644 index 0000000..cc0bb08 --- /dev/null +++ b/components/Collapsable/Content.tsx @@ -0,0 +1,24 @@ +import * as React from "react"; + +export const componentName = "CollapsableContent"; + +interface Props { + className?: string; + children?: React.ReactNode; +} + +const CollapsableContent = React.memo(function CollapsableContent( + props +) { + const { className, children, ...otherProps } = props; + + return ( +
+ {children} +
+ ); +}); + +CollapsableContent.displayName = componentName; + +export default CollapsableContent; diff --git a/components/Collapsable/Context.tsx b/components/Collapsable/Context.tsx new file mode 100644 index 0000000..477291f --- /dev/null +++ b/components/Collapsable/Context.tsx @@ -0,0 +1,13 @@ +import * as React from "react"; + +interface CollapsableContextValue { + isExpanded: boolean; + setExpanded: ((booleanState: boolean) => void) | undefined | null; +} + +const CollapsableContext = React.createContext({ + isExpanded: false, + setExpanded: null +}); + +export default CollapsableContext; diff --git a/components/Collapsable/InnerLink.tsx b/components/Collapsable/InnerLink.tsx new file mode 100644 index 0000000..20e5578 --- /dev/null +++ b/components/Collapsable/InnerLink.tsx @@ -0,0 +1,23 @@ +import ActiveLink, { ActiveLinkProps } from "components/ActiveLink"; +import * as React from "react"; +import CollapsableContext from "./Context"; + +interface Props extends ActiveLinkProps {} + +const CollapsableInnerLink: React.FC = props => { + const { children, ...otherProps } = props; + const { setExpanded } = React.useContext(CollapsableContext); + + const onActive = React.useCallback(() => { + setExpanded?.(true); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( + + {children} + + ); +}; + +export default CollapsableInnerLink; diff --git a/components/Collapsable/NavItem.tsx b/components/Collapsable/NavItem.tsx new file mode 100644 index 0000000..4d15a16 --- /dev/null +++ b/components/Collapsable/NavItem.tsx @@ -0,0 +1,78 @@ +import makeStyles from "@sonnat/ui/styles/makeStyles"; +import * as React from "react"; +import { Collapse } from "react-collapse"; +import CollapsableContext from "./Context"; + +const componentName = "CollapsableNavItem"; + +interface Props { + trigger: JSX.Element; + content: JSX.Element; + isExpanded?: boolean; +} + +const useStyles = makeStyles( + { + root: { width: "100%" }, + collapseWrapper: { + transition: "height 360ms ease" + }, + collapseContainer: {} + }, + { name: componentName } +); + +const CollapsableNavItem = React.memo(function CollapsableNavItem( + props: Props +) { + const { trigger: triggerComponent, content, isExpanded = false } = props; + + const classes = useStyles(); + const [isCollapsed, setCollapsed] = React.useState(!isExpanded); + + const { setExpanded: setParentExpanded } = + React.useContext(CollapsableContext); + + const triggerClickListener = React.useCallback(() => { + setCollapsed(c => !c); + }, []); + + const triggerProps = { + onClick: triggerClickListener, + active: !isCollapsed + }; + + const trigger = React.cloneElement(triggerComponent, triggerProps); + + const context = React.useMemo( + () => ({ + isExpanded: !isCollapsed, + setExpanded: (bool: boolean) => { + setCollapsed(!bool); + if (setParentExpanded) setParentExpanded(bool); + } + }), + [isCollapsed, setParentExpanded] + ); + + return ( +
+ + {trigger} + + {content} + + +
+ ); +}); + +CollapsableNavItem.displayName = componentName; + +export default CollapsableNavItem; diff --git a/components/Collapsable/Trigger.tsx b/components/Collapsable/Trigger.tsx new file mode 100644 index 0000000..5079bb9 --- /dev/null +++ b/components/Collapsable/Trigger.tsx @@ -0,0 +1,79 @@ +import Divar from "@sonnat/icons/Divar"; +import makeStyles from "@sonnat/ui/styles/makeStyles"; +import Text from "@sonnat/ui/Text"; +import createClass from "classnames"; +import * as React from "react"; + +export const componentName = "CollapsableTrigger"; + +interface Props { + title?: string; + className?: string; + onClick?: React.MouseEventHandler; + active?: boolean; + isDivarSpecific?: boolean; +} + +const useStyles = makeStyles( + theme => ({ + root: {}, + title: { + color: theme.colors.text.secondary, + transition: "color 360ms ease", + "&:hover": { + color: theme.colors.text.primary + } + }, + divarIndicator: { color: "#ea475b" }, + divider: { + width: 1, + height: `calc(100% - ${theme.typography.pxToRem(24)})`, + marginRight: theme.typography.pxToRem(10), + marginLeft: theme.typography.pxToRem(8), + backgroundColor: theme.colors.divider + }, + active: { + "& $title": { + color: theme.colors.text.primary, + fontWeight: theme.typography.fontWeight.medium + } + } + }), + { name: componentName } +); + +const CollapsableTrigger = React.memo((props: Props) => { + const { + className, + title, + onClick, + active = false, + isDivarSpecific = false + } = props; + + const classes = useStyles(); + + return ( +
+ + {title} + + {isDivarSpecific && ( + +
+ +
+ )} +
+ ); +}); + +CollapsableTrigger.displayName = componentName; + +export default CollapsableTrigger; diff --git a/components/Collapsable/index.ts b/components/Collapsable/index.ts new file mode 100644 index 0000000..77316f1 --- /dev/null +++ b/components/Collapsable/index.ts @@ -0,0 +1,4 @@ +export { default as Content } from "./Content"; +export { default as InnerLink } from "./InnerLink"; +export { default as NavItem } from "./NavItem"; +export { default as Trigger } from "./Trigger"; diff --git a/components/ComponentsOfType/ComponentsOfType.tsx b/components/ComponentsOfType/ComponentsOfType.tsx new file mode 100644 index 0000000..bfe3d0e --- /dev/null +++ b/components/ComponentsOfType/ComponentsOfType.tsx @@ -0,0 +1,167 @@ +import Column from "@sonnat/ui/Column"; +import Row from "@sonnat/ui/Row"; +import Skeleton from "@sonnat/ui/Skeleton"; +import makeStyles from "@sonnat/ui/styles/makeStyles"; +import Text from "@sonnat/ui/Text"; +import clx from "classnames"; +import { ChildLabel, ChildSchema, getSchema, LeafChild } from "nav-schema"; +import NextImage, { ImageProps as NextImageProps } from "next/image"; +import Link from "next/link"; +import * as React from "react"; +import { kebabCase } from "utils/case"; +import useIsomorphicLayoutEffect from "utils/useIsomorphicLayoutEffect"; + +const componentName = "ComponentsOfType"; + +const useParentStyles = makeStyles( + theme => ({ + root: { marginBottom: theme.typography.pxToRem(16) }, + column: {}, + card: {} + }), + { name: componentName } +); + +const useCardStyles = makeStyles( + theme => ({ + root: { + border: "1px solid rgba(0, 0, 0, 0.08)", + overflow: "hidden", + borderRadius: theme.typography.pxToRem(4), + marginTop: theme.typography.pxToRem(16), + "&:hover": { + "& $caption": { + color: theme.colors.text.primary + } + } + }, + figure: { margin: 0 }, + image: { + verticalAlign: "middle", + backgroundColor: "rgba(0, 0, 0, 0.02)" + }, + caption: { + padding: theme.typography.pxToRem(16), + color: theme.colors.text.secondary, + transition: "color 360ms ease" + } + }), + { name: "ComponentCard" } +); + +interface ParentProps { + type: "Actions" | "Controlers" | "Display" | "Navigation" | "Rows"; +} + +interface CardProps { + title: string; + className: string; + imageProps: NextImageProps & { width: number; height: number }; +} + +const ComponentsSchema = getSchema().byChild.Components as ChildSchema; + +const Card: React.FC = props => { + const classes = useCardStyles(); + + const { className, title, imageProps, ...otherProps } = props; + const { + src, + width, + height, + className: imageClassName, + ...otherImageProps + } = imageProps; + + const ratio = width / height; + const [isImageLoaded, setImageLoaded] = React.useState(false); + const [hasError, setHasError] = React.useState(false); + + useIsomorphicLayoutEffect(() => { + const img = new window.Image(); + img.onload = () => void setImageLoaded(true); + img.onerror = () => void setHasError(true); + img.src = src; + }, [src]); + + return !hasError ? ( +
+
+ {isImageLoaded ? ( + + ) : ( + + )} +
+ {title} +
+
+
+ ) : null; +}; + +Card.displayName = "ComponentCard"; + +const ComponentsOfType: React.FC = props => { + const classes = useParentStyles(); + + const { type, ...otherProps } = props; + + const childSchema = ComponentsSchema.byChild[type] as ChildSchema; + + const isDivarSpecific = + childSchema.isDivarSpecific != undefined && + childSchema.isDivarSpecific === true; + + return ( + + {childSchema.children.map((child: ChildLabel) => { + const key = child.en; + const leafSchema = childSchema.byChild[key] as LeafChild; + const shouldExclude = !!leafSchema.excludeFromComponentsPage; + const pascalCaseLabel = leafSchema.label.en; + const kebabCaseLabel = kebabCase(pascalCaseLabel); + const href = leafSchema.href; + const relativePath = isDivarSpecific ? "divar/" : ""; + const imgSrc = `/static/media/representative/${relativePath}${kebabCaseLabel}.svg`; + + return !shouldExclude ? ( + + + + + + + + ) : null; + })} + + ); +}; + +ComponentsOfType.displayName = componentName; + +export default ComponentsOfType; diff --git a/components/ComponentsOfType/index.ts b/components/ComponentsOfType/index.ts new file mode 100644 index 0000000..fe2af72 --- /dev/null +++ b/components/ComponentsOfType/index.ts @@ -0,0 +1 @@ +export { default } from "./ComponentsOfType"; diff --git a/components/Image/Image.tsx b/components/Image/Image.tsx new file mode 100644 index 0000000..1786541 --- /dev/null +++ b/components/Image/Image.tsx @@ -0,0 +1,126 @@ +import clx from "classnames"; +import Skeleton from "@sonnat/ui/Skeleton"; +import Text from "@sonnat/ui/Text"; +import makeStyles from "@sonnat/ui/styles/makeStyles"; +import NextImage, { ImageProps as NextImageProps } from "next/image"; +import * as React from "react"; +import useIsomorphicLayoutEffect from "utils/useIsomorphicLayoutEffect"; + +const componentName = "Image"; + +export interface ImageProps { + imageProps: NextImageProps & { width: number; height: number }; + caption?: React.ReactNode; + illustration?: boolean; + className?: string; +} + +const useStyles = makeStyles( + theme => { + const { + typography: { pxToRem } + } = theme; + + return { + root: { margin: 0 }, + container: { + borderRadius: pxToRem(4), + overflow: "hidden", + border: "1px solid rgba(0, 0, 0, 0.04)", + backgroundColor: "rgba(0, 0, 0, 0.02)" + }, + illustration: { + "& $container": { + border: "none", + backgroundColor: "transparent" + } + }, + skeleton: {}, + image: {}, + caption: { marginTop: pxToRem(8) }, + captionText: {} + }; + }, + { name: componentName } +); + +const Image = React.memo((props: ImageProps) => { + const { + className, + caption, + imageProps, + illustration = false, + ...otherProps + } = props; + + const { + src, + width, + height, + className: imageClassName, + ...otherImageProps + } = imageProps; + + const classes = useStyles(); + + const [isLoaded, setLoaded] = React.useState(false); + + const ratio = width / height; + + useIsomorphicLayoutEffect(() => { + const image = new window.Image(); + image.src = src; + image.onload = () => { + setLoaded(true); + }; + }, []); + + return ( +
+
+ {isLoaded ? ( + + ) : ( + + )} +
+ {caption && ( +
+ {typeof caption === "string" ? ( + + {caption} + + ) : ( + caption + )} +
+ )} +
+ ); +}); + +Image.displayName = componentName; + +export default Image; diff --git a/components/Image/index.ts b/components/Image/index.ts new file mode 100644 index 0000000..6baa126 --- /dev/null +++ b/components/Image/index.ts @@ -0,0 +1,2 @@ +export { default } from "./Image"; +export * from "./Image"; diff --git a/components/InteractiveDemo/InteractiveDemo.tsx b/components/InteractiveDemo/InteractiveDemo.tsx new file mode 100644 index 0000000..ee4c5bc --- /dev/null +++ b/components/InteractiveDemo/InteractiveDemo.tsx @@ -0,0 +1,382 @@ +import { + Button, + Checkbox, + Radio, + RadioGroup, + Tab, + TabBar, + Text, + TextField +} from "@sonnat/ui"; +import { Tune, CloseLarge } from "@sonnat/icons"; +import makeStyles from "@sonnat/ui/styles/makeStyles"; +import createClass from "classnames"; +import * as React from "react"; + +const componentName = "Demo"; + +const useStyles = makeStyles( + theme => { + const { + colors, + breakpoints, + direction, + typography: { pxToRem } + } = theme; + + return { + root: { + width: "100%", + borderRadius: pxToRem(4), + boxShadow: `0 1px 6px 0 rgba(0, 0, 0, 0.1)`, + backgroundColor: "rgba(255, 255, 255, 0.88)", + marginTop: pxToRem(16) + }, + header: { + width: "100%", + display: "flex", + alignItems: "center", + height: pxToRem(48), + borderBottom: `1px solid ${colors.divider}` + }, + tabs: { + ...(direction === "rtl" + ? { paddingRight: pxToRem(32) } + : { paddingLeft: pxToRem(32) }) + }, + adjustmentButtons: { + ...(direction === "rtl" + ? { marginRight: "auto" } + : { marginLeft: "auto" }), + display: "flex", + alignItems: "center", + width: pxToRem(116), + transition: "width 360ms ease", + "&:before": { + ...(direction === "rtl" + ? { marginLeft: pxToRem(16) } + : { marginRight: pxToRem(16) }), + content: '""', + height: pxToRem(24), + width: pxToRem(1), + alignSelf: "center", + backgroundColor: colors.divider + } + }, + openAdjustmentsButton: { + "&$disabled > *": { + color: [colors.text.secondary, "!important"] + } + }, + closeAdjustmentsButton: { + ...(direction === "rtl" + ? { marginLeft: pxToRem(16), marginRight: "auto" } + : { marginRight: pxToRem(16), marginLeft: "auto" }) + }, + body: { + width: "100%", + display: "flex", + flexWrap: "nowrap", + overflow: "hidden" + }, + mainContent: { + display: "flex", + alignItems: "center", + justifyContent: "center", + width: "100%", + flexShrink: 0, + padding: pxToRem(32), + transition: "width 360ms ease" + }, + sidebar: { + ...(direction === "rtl" ? { right: 0 } : { left: 0 }), + width: pxToRem(240), + padding: pxToRem(16), + position: "relative", + flexShrink: 0, + height: "100%", + overflow: "auto", + borderRight: `1px solid ${colors.divider}`, + "& > $adjustment:first-child": { margin: 0 }, + "& > $adjustment:last-child:after": { content: "none" } + }, + adjustment: { + marginTop: pxToRem(16), + "&:after": { + content: '""', + display: "block", + marginTop: pxToRem(8), + height: pxToRem(1), + width: "100%", + backgroundColor: colors.divider + } + }, + utilAdjustment: { + "&:after": { content: "none" } + }, + adjustmentTitle: { marginBottom: pxToRem(8) }, + adjustmentField: {}, + switchLabel: { fontSize: pxToRem(12) }, + disabled: {}, + opened: { + "& $mainContent": { + width: `calc(100% - ${pxToRem(240)})` + }, + "& $adjustmentButtons": { width: pxToRem(240) } + }, + [breakpoints.down("sm")]: { + adjustmentButtons: { display: "none" }, + tabs: { width: "100%", padding: [0, "!important"] }, + mainContent: { + width: [`calc(100vw - ${pxToRem(32)})`, "!important"], + minHeight: pxToRem(185), + padding: pxToRem(16) + }, + body: { + minHeight: pxToRem(300), + flexDirection: "column", + maxHeight: "none" + }, + sidebar: { + width: "100%", + borderRight: "none", + borderTop: `${pxToRem(1)} solid ${colors.divider}` + } + } + }; + }, + { name: componentName } +); + +interface Props { + className?: string; + DemoComponent: React.ReactNode; + disabledAdjustments?: string[]; + adjustments?: { bySegment: { [P: string]: any }; allSegments: string[] }; + variants?: { label: string; onActiveCallback: () => void }[]; +} + +const Demo: React.FC = React.memo(props => { + const { + className, + adjustments, + DemoComponent, + variants = [], + disabledAdjustments = [] + } = props; + + const localClass = useStyles(); + + const [isSidebarOpen, setSidebarOpen] = React.useState( + adjustments ? true : false + ); + + const createRadioGroup = (segment: any) => { + const { fields, initial } = segment; + + const defaultField = fields.find((field: any) => field.id === initial); + const defaultFieldValue = defaultField + ? defaultField.label.en + : fields[0].label.en; + + return ( + + {fields.map((field: any) => { + const isDisabled = disabledAdjustments.includes(field.id); + + return ( +
+ { + if (field.toggleCallback) + field.toggleCallback(e.target.checked); + }} + /> +
+ ); + })} +
+ ); + }; + + const createAdjustmentField = (field: any) => { + const { id, type, label, toggleCallback, onChangeCallback } = field; + const isDisabled = disabledAdjustments.includes(id); + + switch (type) { + case "text": + return ( + { + if (onChangeCallback) onChangeCallback(e); + }} + placeholder={field.placeholder.fa} + /> + ); + case "boolean": + return ( + { + if (toggleCallback) toggleCallback(e.target.checked); + }} + /> + ); + default: + return null; + } + }; + + const createAdjustmentComponents = ( + adjustments: NonNullable + ) => { + const { allSegments = [], bySegment } = adjustments; + + const components = allSegments.map((segmentName, index) => { + const segment = bySegment[segmentName]; + + if (segment && segment.fields && segment.fields.length) { + if (segmentName === "utils") { + return segment.fields.map((field: any) => ( + +
+ + {field.label.fa} + +
+ {createAdjustmentField(field)} +
+
+
+ )); + } else { + return ( +
+ + {segment.label.fa} + +
+ {segment.type === "radioGroup" + ? createRadioGroup(segment) + : segment.fields.map((field: any) => ( +
+ {createAdjustmentField(field)} +
+ ))} +
+
+ ); + } + } + }); + + return components; + }; + + const sidebarContent = React.useMemo(() => { + return adjustments ? createAdjustmentComponents(adjustments) : null; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [adjustments]); + + return ( +
+
+ {variants.length > 0 && ( +
+ {/* @ts-ignore */} + + {variants.map((variant, index) => { + return ( + { + if (variant.onActiveCallback) variant.onActiveCallback(); + }} + key={`${variant.label}/${index}`} + label={variant.label} + /> + ); + })} + +
+ )} + {adjustments && ( +
+
+ )} +
+
+
{DemoComponent}
+ {adjustments && ( +
{sidebarContent}
+ )} +
+
+ ); +}); + +Demo.displayName = componentName; + +export default Demo; diff --git a/components/InteractiveDemo/index.ts b/components/InteractiveDemo/index.ts new file mode 100644 index 0000000..2a5242e --- /dev/null +++ b/components/InteractiveDemo/index.ts @@ -0,0 +1 @@ +export { default } from "./InteractiveDemo"; diff --git a/components/SearchResults/SearchResults.tsx b/components/SearchResults/SearchResults.tsx new file mode 100644 index 0000000..a3c9d17 --- /dev/null +++ b/components/SearchResults/SearchResults.tsx @@ -0,0 +1,203 @@ +import makeStyles from "@sonnat/ui/styles/makeStyles"; +import Text from "@sonnat/ui/Text"; +import createClass from "classnames"; +import Link from "next/link"; +import * as React from "react"; +import type { SearchReturnType } from "utils/search"; + +const componentName = "SearchResults"; + +const useStyles = makeStyles( + theme => { + const { + colors, + typography: { pxToRem } + } = theme; + + return { + root: { + position: "absolute", + transform: `translateY(${pxToRem(4)})`, + zIndex: 1, + width: pxToRem(280), + borderRadius: pxToRem(4), + boxShadow: + "0 1px 6px 0 rgba(0, 0, 0, 0.08)," + + "0 -8px 32px -4px rgba(0, 0, 0, 0.04)," + + "0 16px 24px -6px rgba(0, 0, 0, 0.04)", + backgroundColor: colors.white + }, + list: { + margin: 0, + padding: 0, + listStyle: "none" + }, + segment: { + paddingTop: pxToRem(8), + "& + *": { + borderTop: `1px solid ${colors.divider}` + } + }, + segmentTitle: { + padding: [[0, pxToRem(8)]], + marginBottom: pxToRem(4) + }, + segmentList: { + margin: 0, + padding: 0, + listStyle: "none" + }, + listItem: { + height: pxToRem(40), + display: "flex", + backgroundColor: colors.transparent, + transition: "background-color 180ms ease", + "&:hover, &:focus": { + backgroundColor: "rgba(0, 0, 0, 0.04)" + }, + "& + $segment": { + borderTop: `1px solid ${colors.divider}` + } + }, + listItemLink: { + display: "flex", + alignItems: "center", + flex: [[1, 0]], + padding: [[0, pxToRem(16)]] + }, + hidden: { + opacity: 0, + visibility: "hidden", + transition: "opacity 180ms ease, visibility 180ms ease" + } + }; + }, + { name: componentName } +); + +interface Props { + results: SearchReturnType; + className?: string; + isOutOfFocus?: boolean; +} + +const SearchResults: React.FC = React.memo( + ({ results, className, isOutOfFocus = false }) => { + const classes = useStyles(); + + const segments = React.useMemo( + () => + results.reduce( + ( + result: { + bySegment: { + [P: string]: { + title: string; + children: SearchReturnType; + }; + }; + allSegments: string[]; + }, + current + ) => { + const parentPath = current.parents.length + ? current.parents.map(parent => parent.label.fa).join(" / ") + : current.label.fa; + + const exists = result.allSegments.includes(parentPath); + + if (exists) { + return { + bySegment: { + ...result.bySegment, + [parentPath]: { + ...result.bySegment[parentPath], + children: [ + ...result.bySegment[parentPath].children, + current + ] + } + }, + allSegments: result.allSegments + }; + } else { + return { + bySegment: { + ...result.bySegment, + [parentPath]: { + title: parentPath, + children: [current] + } + }, + allSegments: [...result.allSegments, parentPath] + }; + } + }, + { bySegment: {}, allSegments: [] } + ), + [results] + ); + + const children = React.useMemo( + () => + segments.allSegments.map((name, index) => { + const { title, children } = segments.bySegment[name]; + + const leaves = children.map((child, index) => { + const childKey = `${child.label.en}/${index}`; + + return ( +
  • + + + {child.label.fa} + + +
  • + ); + }); + + if (title.includes("/")) { + const segmentKey = `${title}/${index}`; + + return ( +
  • + + {title} + +
      {leaves}
    +
  • + ); + } else return leaves; + }), + // eslint-disable-next-line react-hooks/exhaustive-deps + [segments] + ); + + return ( +
    +
      {children}
    +
    + ); + } +); + +SearchResults.displayName = componentName; + +export default SearchResults; diff --git a/components/SearchResults/index.ts b/components/SearchResults/index.ts new file mode 100644 index 0000000..e185c4d --- /dev/null +++ b/components/SearchResults/index.ts @@ -0,0 +1 @@ +export { default } from "./SearchResults"; diff --git a/components/SonnatSvgLogo/SonnatSvgLogo.tsx b/components/SonnatSvgLogo/SonnatSvgLogo.tsx new file mode 100644 index 0000000..7bb0dea --- /dev/null +++ b/components/SonnatSvgLogo/SonnatSvgLogo.tsx @@ -0,0 +1,45 @@ +import Icon, { IconProps } from "@sonnat/ui/Icon"; +import * as React from "react"; + +const componentName = "SonnatSvgLogo"; + +const SonnatSvgLogo: React.FC = props => { + return ( + + + + + + + + ); +}; + +SonnatSvgLogo.displayName = componentName; + +export default SonnatSvgLogo; diff --git a/components/SonnatSvgLogo/index.ts b/components/SonnatSvgLogo/index.ts new file mode 100644 index 0000000..b74b8a2 --- /dev/null +++ b/components/SonnatSvgLogo/index.ts @@ -0,0 +1 @@ +export { default } from "./SonnatSvgLogo"; diff --git a/components/TableOfContent/TableOfContent.tsx b/components/TableOfContent/TableOfContent.tsx new file mode 100644 index 0000000..0e5bce0 --- /dev/null +++ b/components/TableOfContent/TableOfContent.tsx @@ -0,0 +1,221 @@ +import makeStyles from "@sonnat/ui/styles/makeStyles"; +import Text from "@sonnat/ui/Text"; +import { clamp, getOffsetFromWindow } from "@sonnat/ui/utils"; +import useIsomorphicLayoutEffect from "utils/useIsomorphicLayoutEffect"; +import useEventListener from "@utilityjs/use-event-listener"; +import createClass from "classnames"; +import debounce from "lodash.debounce"; +import throttle from "lodash.throttle"; +import * as React from "react"; + +const componentName = "TableOfContents"; + +const useStyles = makeStyles( + theme => { + const { + colors, + direction, + typography: { pxToRem, fontWeight } + } = theme; + + return { + root: { position: "sticky", top: pxToRem(32) }, + title: { fontWeight: fontWeight.medium }, + list: { + margin: [[pxToRem(10), 0, 0, 0]], + padding: 0, + listStyle: "none", + display: "flex", + flexDirection: "column", + alignItems: "flex-start" + }, + listItem: { + ...(direction === "rtl" + ? { paddingRight: pxToRem(16) } + : { paddingLeft: pxToRem(16) }), + paddingTop: pxToRem(4), + display: "flex", + alignItems: "center", + position: "relative", + cursor: "pointer", + "&:not($active):hover, &:not($active):focus": { + "& $listItemLinkText": { color: colors.text.primary } + }, + "&:before": { + content: '""', + position: "absolute", + right: 0, + width: pxToRem(1), + height: pxToRem(16), + transition: "background-color 360ms ease", + backgroundColor: colors.transparent + } + }, + listItemLink: { textDecoration: "none", color: "inherit" }, + listItemLinkText: { + color: colors.text.secondary, + lineHeight: 2, + transition: "color 360ms ease, font-weight 360ms ease" + }, + active: { + "&:before": { backgroundColor: colors.primary.origin }, + "& $listItemLinkText": { + color: colors.primary.origin, + fontWeight: fontWeight.medium + } + } + }; + }, + { name: componentName } +); + +type TableDataType = { id: string; label: string }[]; + +interface Props { + tableData: TableDataType; +} + +const TableOfContents: React.FC = React.memo(props => { + const { tableData = [] } = props; + + const localClass = useStyles(); + + const [activeItem, setActiveItem] = React.useState(""); + const [isLoaded, setLoaded] = React.useState(false); + const [isScrollingAllowed, setScrollingAllowed] = React.useState(true); + + const update = (): { + all: string[]; + section: Record; + } => + tableData.reduce<{ + all: string[]; + section: Record; + }>( + (result, data, index) => { + const anchor = document.getElementById(data.id); + + if (anchor) { + const offset = getOffsetFromWindow(anchor); + const start = offset.top; + + const record = { start, end: document.body.scrollHeight }; + + const prevAnchor: string | null = + index > 0 ? tableData[index - 1].id : null; + + return { + ...result, + all: [...result.all, data.id], + section: { + ...result.section, + ...(prevAnchor + ? { + [prevAnchor]: { ...result.section[prevAnchor], end: start }, + [data.id]: record + } + : { [data.id]: record }) + } + }; + } else return { ...result }; + }, + { all: [], section: {} } + ); + + const handleScroll = () => { + const boundaries = update(); + + let _activeItem = ""; + const { all = [], section = {} } = boundaries; + + all.forEach((sectionName, index) => { + const nextIndex = clamp(index + 1, 0, all.length - 1); + const prevIndex = clamp(index - 1, 0, all.length - 1); + + const start = index === 0 ? 0 : section[all[prevIndex]].end; + const end = + index === all.length - 1 + ? document.body.scrollHeight + : section[all[nextIndex]].start; + + if (start - 4 <= window.scrollY && window.scrollY <= end + 4) { + _activeItem = sectionName; + } + }); + + setActiveItem(_activeItem); + // eslint-disable-next-line react-hooks/exhaustive-deps + }; + + useIsomorphicLayoutEffect(() => { + if (isLoaded) handleScroll(); + }, [isLoaded]); + + if (typeof window !== "undefined") { + // eslint-disable-next-line react-hooks/rules-of-hooks + useEventListener({ + target: window, + eventType: "load", + handler: () => void setLoaded(true) + }); + + // eslint-disable-next-line react-hooks/rules-of-hooks + useEventListener( + { + target: window, + eventType: "scroll", + handler: () => { + if (isLoaded && isScrollingAllowed) throttle(handleScroll, 250)(); + else if (isLoaded && !isScrollingAllowed) { + debounce(() => void setScrollingAllowed(true), 125)(); + } + } + }, + isLoaded + ); + } + + return ( +
    + + فهرست محتوا + + +
    + ); +}); + +TableOfContents.displayName = componentName; + +export default TableOfContents; diff --git a/components/TableOfContent/index.ts b/components/TableOfContent/index.ts new file mode 100644 index 0000000..1518324 --- /dev/null +++ b/components/TableOfContent/index.ts @@ -0,0 +1 @@ +export { default } from "./TableOfContent"; diff --git a/components/containers/Footer/Footer.tsx b/components/containers/Footer/Footer.tsx new file mode 100644 index 0000000..0ae6e33 --- /dev/null +++ b/components/containers/Footer/Footer.tsx @@ -0,0 +1,175 @@ +import { SonnatOThin, Twitter, Virgool } from "@sonnat/icons"; +import makeStyles from "@sonnat/ui/styles/makeStyles"; +import Text from "@sonnat/ui/Text"; +import createClassName from "classnames"; +import Link from "next/link"; +import * as React from "react"; + +const componentName = "Footer"; + +interface Props { + className?: string; +} + +const useStyles = makeStyles( + theme => { + const { + colors, + breakpoints, + typography: { pxToRem } + } = theme; + + return { + root: { + display: "flex", + alignItems: "center", + height: pxToRem(72), + marginTop: pxToRem(128), + justifyContent: "space-between", + borderTop: `1px solid ${colors.divider}` + }, + navigation: { display: "flex", alignItems: "center" }, + logo: { + marginLeft: pxToRem(16), + cursor: "pointer", + color: colors.text.secondary, + transition: [ + "opacity 360ms ease", + "visibility 360ms ease", + "color 360ms ease" + ].join(", "), + "&:hover": { + color: colors.text.primary + } + }, + navigationList: { + padding: "0", + margin: "0", + listStyle: "none", + display: "flex", + alignItems: "center" + }, + navigationItem: { + padding: pxToRem(8), + cursor: "pointer", + "&:hover > $navigationItemLink": { color: colors.text.primary } + }, + navigationItemLink: { + color: colors.text.secondary, + transition: "color 360ms ease" + }, + navigationDivider: { + width: pxToRem(1), + height: pxToRem(16), + backgroundColor: colors.divider + }, + socials: { display: "flex", alignItems: "center" }, + social: { + marginRight: pxToRem(8), + cursor: "pointer", + transition: "color 360ms ease", + color: colors.text.secondary, + "&:hover": { color: colors.text.primary } + }, + [breakpoints.down("sm")]: { + root: { + paddingTop: pxToRem(16), + paddingBottom: pxToRem(16), + height: "auto", + flexDirection: "column" + }, + navigation: { flexDirection: "column" }, + navigationList: { marginTop: pxToRem(16), marginBottom: pxToRem(16) }, + social: { + marginLeft: pxToRem(8), + marginRight: pxToRem(8) + }, + logo: { + marginLeft: 0 + } + } + }; + }, + { name: componentName } +); + +const Footer = React.memo(function Footer(props: Props) { + const { className } = props; + + const classes = useStyles(); + + return ( +
    + +
    + + + + + + + + + + +
    +
    + ); +}); + +Footer.displayName = componentName; + +export default Footer; diff --git a/components/containers/Footer/index.ts b/components/containers/Footer/index.ts new file mode 100644 index 0000000..3738288 --- /dev/null +++ b/components/containers/Footer/index.ts @@ -0,0 +1 @@ +export { default } from "./Footer"; diff --git a/components/containers/Header/Header.tsx b/components/containers/Header/Header.tsx new file mode 100644 index 0000000..da1811e --- /dev/null +++ b/components/containers/Header/Header.tsx @@ -0,0 +1,132 @@ +import { + BurgerMenu as BurgerMenuIcon, + CloseLarge, + MagnifierLarge +} from "@sonnat/icons"; +import Button from "@sonnat/ui/Button"; +import SonnatSvgLogo from "components/SonnatSvgLogo"; +import makeStyles from "@sonnat/ui/styles/makeStyles"; +import createClassName from "classnames"; +import Link from "next/link"; +import * as React from "react"; +import useStore from "store"; +import BurgerMenu from "./partials/BurgerMenu"; +import SearchBox from "./partials/SearchBox"; + +const componentName = "Header"; + +interface Props { + className?: string; +} + +const useStyles = makeStyles( + theme => { + const { + colors, + zIndexes, + breakpoints, + typography: { pxToRem } + } = theme; + + return { + root: { + position: "fixed", + top: 0, + left: 0, + right: 0, + zIndex: zIndexes.header, + height: pxToRem(64), + display: "flex", + alignItems: "center", + justifyContent: "space-between", + paddingRight: pxToRem(16), + paddingLeft: pxToRem(16), + backgroundColor: colors.createWhiteColor({ alpha: 0.98 }), + boxShadow: `0 1px 2px 0 ${colors.divider}`, + opacity: 0, + visibility: "hidden", + transition: "opacity 360ms ease, visibility 360ms ease" + }, + searchButton: {}, + brandingLogo: { verticalAlign: "middle" }, + burgerButton: {}, + visible: { + opacity: 1, + visibility: "visible" + }, + [breakpoints.down("lg")]: { + root: { opacity: 1, visibility: "visible" } + } + }; + }, + { name: componentName } +); + +const Header = React.memo(function Header(props: Props) { + const { className, ...otherProps } = props; + + const classes = useStyles(); + + const [isMounted, setMounted] = React.useState(false); + + const isBurgerMenuOpen = useStore(state => state.isBurgerMenuOpen); + const setBurgerMenuOpen = useStore(state => state.setBurgerMenuOpen); + + const isSearchBoxOpen = useStore(state => state.isSearchBoxOpen); + const setSearchBoxOpen = useStore(state => state.setSearchBoxOpen); + + React.useEffect(() => { + setMounted(true); + return () => void setMounted(false); + }, []); + + return ( + + ); +}); + +Header.displayName = componentName; + +export default Header; diff --git a/components/containers/Header/index.ts b/components/containers/Header/index.ts new file mode 100644 index 0000000..2764567 --- /dev/null +++ b/components/containers/Header/index.ts @@ -0,0 +1 @@ +export { default } from "./Header"; diff --git a/components/containers/Header/partials/BurgerMenu.tsx b/components/containers/Header/partials/BurgerMenu.tsx new file mode 100644 index 0000000..4317dc8 --- /dev/null +++ b/components/containers/Header/partials/BurgerMenu.tsx @@ -0,0 +1,113 @@ +import PortalDestination from "@sonnat/ui/PortalDestination"; +import { DefaultTheme } from "@sonnat/ui/styles"; +import makeStyles from "@sonnat/ui/styles/makeStyles"; +import createClass from "classnames"; +import { useNavJsx } from "nav-schema"; +import * as React from "react"; + +const componentName = "BurgerMenu"; + +interface Props { + open?: boolean; + toggle?: () => void; +} + +const useStyles = makeStyles< + DefaultTheme, + "root" | "dimmer" | "open" | "active" +>( + // @ts-ignore + theme => { + const { + colors, + zIndexes, + darkMode, + breakpoints, + typography: { pxToRem } + } = theme; + + return { + root: { + right: 0, + transform: "translateX(+100%)", + boxShadow: `1px 0 2px 0 ${colors.divider}`, + position: "fixed", + width: pxToRem(256), + height: `calc(100% - ${pxToRem(64)})`, + overflow: "auto", + top: pxToRem(64), + backgroundColor: darkMode ? colors.background.level?.[2] : colors.white, + zIndex: zIndexes.header - 1, + opacity: 0, + padding: [[pxToRem(32), pxToRem(16)]], + visibility: "hidden", + transition: + "transform 360ms ease, opacity 260ms ease, visibility 260ms ease" + }, + dimmer: { + position: "fixed", + top: 0, + left: 0, + right: 0, + bottom: 0, + zIndex: zIndexes.header - 2, + backgroundColor: !darkMode + ? "rgba(0, 0, 0, 0.26)" + : "rgba(0, 0, 0, 0.56)", + visibility: "hidden", + opacity: 0, + transition: "opacity 360ms ease, visibility 360ms ease" + }, + open: { + opacity: 1, + visibility: "visible", + "&$root": { + left: 0, + transform: "translateX(0)" + } + }, + active: {}, + [breakpoints.up("lg")]: { + root: { opacity: 0, visibility: "hidden" }, + dimmer: { opacity: 0, visibility: "hidden" } + } + }; + }, + { name: componentName } +); + +const BurgerMenu = React.memo(function BurgerMenu(props: Props) { + const { open = false, toggle: toggleFn } = props; + + const classes = useStyles(); + const [isOpen, setOpen] = React.useState(false); + + const navJsx = useNavJsx( + createClass(classes.root, { [classes.open]: isOpen }) + ); + + const toggle = React.useCallback(() => { + if (toggleFn) requestAnimationFrame(toggleFn); + else requestAnimationFrame(() => setOpen(s => !s)); + }, [toggleFn]); + + React.useEffect(() => { + requestAnimationFrame(() => setOpen(open)); + }, [open]); + + return ( + + {navJsx} +
    +
    + ); +}); + +BurgerMenu.displayName = componentName; + +export default BurgerMenu; diff --git a/components/containers/Header/partials/SearchBox.tsx b/components/containers/Header/partials/SearchBox.tsx new file mode 100644 index 0000000..771e846 --- /dev/null +++ b/components/containers/Header/partials/SearchBox.tsx @@ -0,0 +1,197 @@ +import { MagnifierLarge, Close } from "@sonnat/icons"; +import InputAdornment from "@sonnat/ui/InputAdornment"; +import Portal from "@sonnat/ui/Portal"; +import { DefaultTheme, makeStyles } from "@sonnat/ui/styles"; +import TextField from "@sonnat/ui/TextField"; +import createClass from "classnames"; +import SearchResults from "components/SearchResults"; +import throttle from "lodash.throttle"; +import { getSchema } from "nav-schema"; +import * as React from "react"; +import search, { SearchReturnType } from "utils/search"; + +const componentName = "SearchBox"; + +const useStyles = makeStyles< + DefaultTheme, + unknown, + "root" | "dimmer" | "open" | "clearFieldButton" | "searchResults" +>( + theme => { + const { + colors, + zIndexes, + breakpoints, + typography: { pxToRem } + } = theme; + + return { + root: { + display: "flex", + justifyContent: "center", + position: "fixed", + top: pxToRem(64), + left: 0, + right: 0, + backgroundColor: colors.white, + zIndex: zIndexes.header - 1, + opacity: 0, + padding: [[pxToRem(8), pxToRem(8)]], + visibility: "hidden", + transform: "translateY(-100%)", + transition: + "transform 360ms ease, opacity 260ms ease, visibility 260ms ease" + }, + dimmer: { + position: "fixed", + top: 0, + left: 0, + right: 0, + bottom: 0, + zIndex: zIndexes.header - 2, + backgroundColor: "rgba(0, 0, 0, 0.26)", + visibility: "hidden", + opacity: 0, + transition: "opacity 360ms ease, visibility 360ms ease" + }, + open: { + opacity: 1, + visibility: "visible", + "&$root": { + transform: "translateY(0)" + } + }, + clearFieldButton: { + height: "100%", + width: pxToRem(40), + display: "flex", + alignItems: "center", + justifyContent: "center" + }, + searchResults: { + top: "100%", + overflow: "auto", + maxHeight: `calc(100vh - ${pxToRem(136)})`, + transform: `translateY(${pxToRem(-8)})`, + width: `calc(100% - ${pxToRem(32)})` + }, + [breakpoints.up("lg")]: { + root: { opacity: 0, visibility: "hidden" }, + dimmer: { opacity: 0, visibility: "hidden" } + } + }; + }, + { name: componentName } +); + +interface Props { + open: boolean; + toggle: () => void; +} + +const SearchBox: React.FC = React.memo(function SearchBox(props) { + const { open: openProp, toggle: toggleFn } = props; + + const localClass = useStyles(); + + const { current: isOpenControlled } = React.useRef(openProp != null); + + const fieldRef = React.useRef(null); + + const [isOpen, setOpen] = React.useState(false); + const [searchValue, setSearchValue] = React.useState(""); + const [searchResults, setSearchResults] = React.useState( + [] + ); + const [isFocused, setFocused] = React.useState(false); + + const openState = isOpenControlled ? openProp : isOpen; + + const toggle = React.useCallback(() => { + if (isOpenControlled) { + if (toggleFn) requestAnimationFrame(toggleFn); + } else requestAnimationFrame(() => setOpen(s => !s)); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [toggleFn]); + + return ( + +
    { + const isOpenTransitionEnd = e.propertyName + .toLowerCase() + .includes("transform"); + + if (isOpenTransitionEnd) { + setFocused(openState); + if (openState) fieldRef.current?.focus(); + else fieldRef.current?.blur(); + } + }} + className={createClass(localClass.root, { + [localClass.open]: openState + })} + > + + + + } + trailingAdornment={ + !!searchValue && ( + { + setSearchValue(""); + setSearchResults([]); + fieldRef.current?.focus(); + }} + className={localClass.clearFieldButton} + > + + + ) + } + placeholder="جستجو در سنّت" + inputProps={{ autoComplete: "off" }} + onBlur={() => setFocused(false)} + onFocus={() => setFocused(true)} + onChange={e => { + setSearchValue(e.target.value); + throttle(() => { + if (e.target.value.length >= 2) { + const results = search(getSchema(), e.target.value); + setSearchResults(results); + } else setSearchResults([]); + }, 250)(); + }} + /> + {searchResults.length > 0 && ( + + )} +
    +
    +
    + ); +}); + +SearchBox.displayName = componentName; + +export default SearchBox; diff --git a/components/containers/Header/partials/index.ts b/components/containers/Header/partials/index.ts new file mode 100644 index 0000000..d6352e2 --- /dev/null +++ b/components/containers/Header/partials/index.ts @@ -0,0 +1,2 @@ +export { default as BurgerMenu } from "./BurgerMenu"; +export { default as SearchBox } from "./SearchBox"; diff --git a/components/containers/MainWrapper/MainWrapper.tsx b/components/containers/MainWrapper/MainWrapper.tsx new file mode 100644 index 0000000..e1fe1ea --- /dev/null +++ b/components/containers/MainWrapper/MainWrapper.tsx @@ -0,0 +1,38 @@ +import PageLoader from "@sonnat/ui/PageLoader"; +import { DefaultTheme } from "@sonnat/ui/styles"; +import makeStyles from "@sonnat/ui/styles/makeStyles"; +import Header from "components/containers/Header"; +import * as React from "react"; +import useStore from "store"; + +const componentName = "MainWrapper"; + +const useStyles = makeStyles( + theme => ({ + root: {}, + pageLoader: {}, + [theme.breakpoints.down("lg")]: { + pageLoader: { + top: [[theme.typography.pxToRem(64)], "!important"] + } + } + }), + { name: "MainWrapper" } +); + +const MainWrapper: React.FC = ({ children }) => { + const classes = useStyles(); + const isPageLoading = useStore(state => state.isPageLoading); + + return ( +
    +
    + + {children} +
    + ); +}; + +MainWrapper.displayName = componentName; + +export default MainWrapper; diff --git a/components/containers/MainWrapper/index.ts b/components/containers/MainWrapper/index.ts new file mode 100644 index 0000000..fb4125b --- /dev/null +++ b/components/containers/MainWrapper/index.ts @@ -0,0 +1 @@ +export { default } from "./MainWrapper"; diff --git a/components/containers/Sidebar/Sidebar.tsx b/components/containers/Sidebar/Sidebar.tsx new file mode 100644 index 0000000..a8bf192 --- /dev/null +++ b/components/containers/Sidebar/Sidebar.tsx @@ -0,0 +1,166 @@ +import { MagnifierLarge } from "@sonnat/icons"; +import InputAdornment from "@sonnat/ui/InputAdornment"; +import { DefaultTheme } from "@sonnat/ui/styles"; +import makeStyles from "@sonnat/ui/styles/makeStyles"; +import Text from "@sonnat/ui/Text"; +import TextField from "@sonnat/ui/TextField"; +import detectScrollBarWidth from "@sonnat/ui/utils/detectScrollBarWidth"; +import createClass from "classnames"; +import SearchResults from "components/SearchResults"; +import SonnatSvgLogo from "components/SonnatSvgLogo"; +import throttle from "lodash.throttle"; +import { getSchema, useNavJsx } from "nav-schema"; +import Link from "next/link"; +import * as React from "react"; +import search, { SearchReturnType } from "utils/search"; + +interface Props { + className?: string; +} + +const componentName = "Sidebar"; + +const useStyles = makeStyles< + DefaultTheme, + { scrollBarWidth: number }, + | "root" + | "heading" + | "branding" + | "brandingLogo" + | "brandingText" + | "searchRow" +>( + theme => { + const { + colors, + typography: { pxToRem, fontWeight } + } = theme; + + return { + root: { + position: "sticky", + borderLeft: `1px solid ${colors.divider}`, + top: 0, + zIndex: 1, + "&:after": { + marginLeft: ({ scrollBarWidth }) => pxToRem(scrollBarWidth), + content: '""', + position: "absolute", + left: 0, + right: 0, + bottom: 0, + height: pxToRem(16), + background: `linear-gradient(180deg, rgba(255, 255, 255, 0), ${colors.background.origin})` + } + }, + heading: { + position: "relative", + zIndex: 2, + paddingBottom: pxToRem(16), + paddingRight: pxToRem(32), + paddingLeft: pxToRem(32), + "&:after": { + marginLeft: ({ scrollBarWidth }) => pxToRem(scrollBarWidth), + content: '""', + position: "absolute", + bottom: pxToRem(-16), + left: 0, + right: 0, + height: pxToRem(16), + background: `linear-gradient(180deg, ${colors.background.origin}, rgba(255, 255, 255, 0))` + } + }, + branding: { + display: "flex", + flexDirection: "column", + alignItems: "center", + justifyContent: "center", + paddingTop: pxToRem(64) + }, + brandingLogo: { verticalAlign: "middle" }, + brandingText: { + fontWeight: fontWeight.medium, + marginTop: pxToRem(8) + }, + searchRow: { + position: "relative", + marginTop: pxToRem(24) + } + }; + }, + { name: componentName } +); + +const Sidebar = React.memo(function Sidebar({ children, className }) { + const navJsx = useNavJsx(); + + const [searchResults, setSearchResults] = React.useState( + [] + ); + const [isFocused, setFocused] = React.useState(false); + + const _scrollBarWidth = + typeof window !== "undefined" ? detectScrollBarWidth() : 0; + + const scrollBarWidth = React.useMemo( + () => _scrollBarWidth, + [_scrollBarWidth] + ); + + const classes = useStyles({ scrollBarWidth }); + + const searchHandler = (e: React.ChangeEvent) => { + const key = e.target.value; + + if (key.length >= 2) { + const results = search(getSchema(), e.target.value); + setSearchResults(results); + } else setSearchResults([]); + }; + + return ( + + ); +}); + +Sidebar.displayName = componentName; + +export default Sidebar; diff --git a/components/containers/Sidebar/index.ts b/components/containers/Sidebar/index.ts new file mode 100644 index 0000000..123c2e4 --- /dev/null +++ b/components/containers/Sidebar/index.ts @@ -0,0 +1 @@ +export { default } from "./Sidebar"; diff --git a/components/containers/index.ts b/components/containers/index.ts new file mode 100644 index 0000000..db64951 --- /dev/null +++ b/components/containers/index.ts @@ -0,0 +1,4 @@ +export { default as Footer } from "./Footer"; +export { default as Header } from "./Header"; +export { default as Sidebar } from "./Sidebar"; +export { default as MainWrapper } from "./MainWrapper"; diff --git a/components/demos/ButtonDemo.tsx b/components/demos/ButtonDemo.tsx new file mode 100644 index 0000000..ed5a554 --- /dev/null +++ b/components/demos/ButtonDemo.tsx @@ -0,0 +1,306 @@ +import Button, { ButtonProps } from "@sonnat/ui/Button"; +import { Heart, ChevronDown } from "@sonnat/icons"; +import InteractiveDemo from "components/InteractiveDemo"; +import * as React from "react"; +import { useAdjustments } from "./utils"; + +const componentName = "ButtonDemo"; + +const initialLabel = "عنوان دکمه"; + +interface Props { + className?: string; +} + +const ButtonDemo: React.FC = React.memo(({ className }) => { + const [variant, setVariant] = + React.useState("filled"); + const [size, setSize] = React.useState("medium"); + + const [isIconButton, setIconButton] = React.useState(false); + const [blackList, setBlackList] = React.useState([]); + + const [rootProps, setRootProps] = React.useState({ + label: initialLabel + }); + + const [isFilledButton, setFilledButton] = React.useState( + variant === "filled" + ); + + const variants = [ + { + label: "توپر", + onActiveCallback: () => { + setFilledButton(true); + setVariant("filled"); + } + }, + { + label: "توخالی", + onActiveCallback: () => { + setRootProps(p => ({ ...p, raised: false })); + setFilledButton(false); + setVariant("outlined"); + } + }, + { + label: "متنی", + onActiveCallback: () => { + setRootProps(p => ({ ...p, raised: false })); + setFilledButton(false); + setVariant("inlined"); + } + } + ]; + + const adjustments = useAdjustments( + { + utils: { + fields: [ + { + id: "utils.text1", + type: "text", + placeholder: { + fa: "متن دل‌خواه دکمه", + en: "Enter your desired text" + }, + label: { + fa: "متن دکمه", + en: "Button text" + }, + onChangeCallback: (e: React.ChangeEvent) => { + const newLabel = e.target.value || initialLabel; + + setRootProps(p => ({ + ...p, + label: newLabel + })); + } + } + ] + }, + sizes: { + initial: "medium", + type: "radioGroup", + label: { + fa: "سایز", + en: "Size" + }, + fields: [ + { + id: "large", + type: "radio", + label: { + fa: "بزرگ", + en: "Large" + }, + toggleCallback: (currentValue: any) => { + if (currentValue) setSize("large"); + } + }, + { + id: "medium", + type: "radio", + label: { + fa: "متوسط", + en: "Medium" + }, + toggleCallback: (currentValue: any) => { + if (currentValue) setSize("medium"); + } + }, + { + id: "small", + type: "radio", + label: { + fa: "کوچک", + en: "Small" + }, + toggleCallback: (currentValue: any) => { + if (currentValue) setSize("small"); + } + } + ] + }, + options: { + label: { + fa: "گزینه‌ها", + en: "Options" + }, + fields: [ + { + id: "options.bool1", + type: "boolean", + label: { + fa: "رنگ برند", + en: "Branding color" + }, + toggleCallback: (currentValue: any) => { + setRootProps(p => ({ + ...p, + color: currentValue ? "primary" : undefined + })); + } + }, + { + id: "options.bool2", + type: "boolean", + label: { + fa: "دکمه‌آیکون", + en: "IconButton" + }, + toggleCallback: (currentValue: any) => { + setIconButton(currentValue); + setRootProps(p => ({ + ...p, + leadingIcon: currentValue ? : undefined, + label: currentValue ? undefined : initialLabel, + trailingIcon: undefined + })); + } + }, + { + id: "options.bool3", + type: "boolean", + label: { + fa: "با آیکون ابتدایی", + en: "Leading icon" + }, + toggleCallback: (currentValue: any) => { + setRootProps(p => ({ + ...p, + leadingIcon: currentValue ? : undefined + })); + } + }, + { + id: "options.bool4", + type: "boolean", + label: { + fa: "با آیکون انتهایی", + en: "Trailing icon" + }, + toggleCallback: (currentValue: any) => { + setRootProps(p => ({ + ...p, + trailingIcon: currentValue ? : undefined + })); + } + } + ] + }, + styles: { + label: { + fa: "استایل‌ها", + en: "Styles" + }, + fields: [ + { + id: "styles.bool1", + type: "boolean", + label: { + fa: "گوشه‌گرد", + en: "Rounded" + }, + toggleCallback: (currentValue: any) => { + setRootProps(p => ({ + ...p, + rounded: currentValue + })); + } + }, + { + id: "styles.bool2", + type: "boolean", + label: { + fa: "سایه‌دار", + en: "Raised" + }, + toggleCallback: (currentValue: any) => { + setRootProps(p => ({ + ...p, + raised: currentValue + })); + } + } + ] + }, + states: { + label: { + fa: "وضعیت‌ها", + en: "States" + }, + fields: [ + { + id: "states.bool1", + type: "boolean", + label: { + fa: "غیرفعال", + en: "Disabled" + }, + toggleCallback: (currentValue: any) => { + setRootProps(p => ({ ...p, disabled: currentValue })); + } + } + ] + } + }, + [] + ); + + React.useEffect(() => { + if (isIconButton) { + setBlackList(s => [ + ...s, + ...["options.bool3", "options.bool4", "utils.text1"] + ]); + } else { + setBlackList(s => + s.filter( + i => !["options.bool3", "options.bool4", "utils.text1"].includes(i) + ) + ); + } + }, [isIconButton]); + + React.useEffect(() => { + if (isIconButton) { + setRootProps(p => ({ + ...p, + "aria-label": initialLabel + })); + } else { + setRootProps(p => ({ + ...p, + "aria-label": undefined + })); + } + }, [isIconButton]); + + React.useEffect(() => { + if (!isFilledButton) { + setBlackList(s => [...s, "styles.bool2"]); + setRootProps(p => ({ + ...p, + raised: false + })); + } else { + setBlackList(s => s.filter(i => i !== "styles.bool2")); + } + }, [isFilledButton]); + + return ( + } + variants={variants} + adjustments={adjustments} + /> + ); +}); + +ButtonDemo.displayName = componentName; + +export default ButtonDemo; diff --git a/components/demos/ChipDemo.tsx b/components/demos/ChipDemo.tsx new file mode 100644 index 0000000..539e700 --- /dev/null +++ b/components/demos/ChipDemo.tsx @@ -0,0 +1,206 @@ +import Heart from "@sonnat/icons/Heart"; +import ActionChip, { ActionChipProps } from "@sonnat/ui/ActionChip"; +import ChoiceChip from "@sonnat/ui/ChoiceChip"; +import RemovableChip from "@sonnat/ui/RemovableChip"; +import InteractiveDemo from "components/InteractiveDemo"; +import * as React from "react"; +import { useAdjustments } from "./utils"; + +const componentName = "ChipDemo"; + +interface Props { + className?: string; +} + +const ChipDemo: React.FC = React.memo(({ className }) => { + const [variant, setVariant] = + React.useState("filled"); + const [size, setSize] = React.useState("medium"); + const [chipType, setChipType] = React.useState("action"); + + const [rootProps, setRootProps] = React.useState({ + label: "عنوان چیپس" + }); + + const variants = [ + { + label: "توپر", + onActiveCallback: () => { + setVariant("filled"); + } + }, + { + label: "توخالی", + onActiveCallback: () => { + setVariant("outlined"); + } + } + ]; + + const adjustments = useAdjustments( + { + sizes: { + initial: "medium", + type: "radioGroup", + label: { + fa: "سایز", + en: "Size" + }, + fields: [ + { + id: "large", + type: "radio", + label: { + fa: "بزرگ", + en: "Large" + }, + toggleCallback: (currentValue: any) => { + if (currentValue) setSize("large"); + } + }, + { + id: "medium", + type: "radio", + label: { + fa: "متوسط", + en: "Medium" + }, + toggleCallback: (currentValue: any) => { + if (currentValue) setSize("medium"); + } + }, + { + id: "small", + type: "radio", + label: { + fa: "کوچک", + en: "Small" + }, + toggleCallback: (currentValue: any) => { + if (currentValue) setSize("small"); + } + } + ] + }, + interactions: { + initial: "interaction1", + type: "radioGroup", + label: { + fa: "نوع تعامل", + en: "Interaction type" + }, + fields: [ + { + id: "interaction1", + type: "radio", + label: { + fa: "کنش‌پذیر", + en: "Action chip" + }, + toggleCallback: (currentValue: any) => { + setChipType(s => (currentValue ? "action" : s)); + } + }, + { + id: "interaction2", + type: "radio", + label: { + fa: "انتخاب‌شونده", + en: "Choice chip" + }, + toggleCallback: (currentValue: any) => { + setChipType(s => (currentValue ? "choice" : s)); + } + }, + { + id: "interaction3", + type: "radio", + label: { + fa: "حذف‌شونده", + en: "Removable chip" + }, + toggleCallback: (currentValue: any) => { + setChipType(s => (currentValue ? "removable" : s)); + } + } + ] + }, + options: { + label: { + fa: "گزینه‌ها", + en: "Options" + }, + fields: [ + { + type: "boolean", + label: { + fa: "رنگ برند", + en: "Branding color" + }, + toggleCallback: (currentValue: any) => { + setRootProps(p => ({ + ...p, + color: currentValue ? "primary" : undefined + })); + } + }, + { + id: "options.bool2", + type: "boolean", + label: { + fa: "با آیکون ابتدایی", + en: "Leading icon" + }, + toggleCallback: (currentValue: any) => { + setRootProps(p => ({ + ...p, + leadingIcon: currentValue ? : undefined + })); + } + } + ] + }, + styles: { + label: { + fa: "استایل‌ها", + en: "Styles" + }, + fields: [ + { + id: "styles.bool1", + type: "boolean", + label: { + fa: "گوشه‌گرد", + en: "Rounded" + }, + toggleCallback: (currentValue: any) => { + setRootProps(p => ({ ...p, rounded: currentValue })); + } + } + ] + } + }, + [] + ); + + return ( + + ) : chipType === "choice" ? ( + + ) : chipType === "removable" ? ( + + ) : undefined + } + variants={variants} + adjustments={adjustments} + /> + ); +}); + +ChipDemo.displayName = componentName; + +export default ChipDemo; diff --git a/components/demos/InputSliderDemo.tsx b/components/demos/InputSliderDemo.tsx new file mode 100644 index 0000000..494494f --- /dev/null +++ b/components/demos/InputSliderDemo.tsx @@ -0,0 +1,109 @@ +import InputSlider, { InputSliderProps } from "@sonnat/ui/InputSlider"; +import InteractiveDemo from "components/InteractiveDemo"; +import * as React from "react"; +import { useAdjustments } from "./utils"; + +const componentName = "InputSliderDemo"; + +interface Props { + className?: string; +} + +const InputSliderDemo: React.FC = React.memo(({ className }) => { + const [variant, setVariant] = + React.useState("continuous"); + const [rootProps, setRootProps] = React.useState({}); + + const breakingChanges = React.useRef(0); + + const variants = [ + { + label: "پیوسته", + onActiveCallback: () => { + breakingChanges.current++; + setVariant("continuous"); + setRootProps(p => ({ ...p, step: undefined })); + } + }, + { + label: "گسسته", + onActiveCallback: () => { + breakingChanges.current++; + setVariant("discrete"); + setRootProps(p => ({ ...p, step: 10 })); + } + } + ]; + + const adjustments = useAdjustments( + { + options: { + label: { + fa: "گزینه‌ها", + en: "Options" + }, + fields: [ + { + id: "options.bool1", + type: "boolean", + label: { + fa: "دوجهته", + en: "Bidirectional" + }, + toggleCallback: (currentValue: any) => { + currentValue + ? breakingChanges.current++ + : breakingChanges.current--; + setRootProps(p => ({ + ...p, + defaultValue: currentValue ? [0, 100] : undefined + })); + } + } + ] + }, + states: { + label: { + fa: "وضعیت‌ها", + en: "States" + }, + fields: [ + { + id: "states.bool1", + type: "boolean", + label: { + fa: "غیرفعال", + en: "Disabled" + }, + toggleCallback: (currentValue: any) => { + setRootProps(p => ({ ...p, disabled: currentValue })); + } + } + ] + } + }, + [] + ); + + return ( + + } + variants={variants} + adjustments={adjustments} + /> + ); +}); + +InputSliderDemo.displayName = componentName; + +export default InputSliderDemo; diff --git a/components/demos/SelectDemo.tsx b/components/demos/SelectDemo.tsx new file mode 100644 index 0000000..d0cdb80 --- /dev/null +++ b/components/demos/SelectDemo.tsx @@ -0,0 +1,229 @@ +import InputAdornment from "@sonnat/ui/InputAdornment"; +import Select, { + SelectOption, + SelectOptionGroup, + SelectProps +} from "@sonnat/ui/Select"; +import InteractiveDemo from "components/InteractiveDemo"; +import * as React from "react"; +import { useAdjustments } from "./utils"; + +const componentName = "SelectDemo"; + +interface Props { + className?: string; +} + +const SelectDemo: React.FC = React.memo(({ className }) => { + const breakingChanges = React.useRef(0); + + const [size, setSize] = React.useState("medium"); + const [isSuffixVisible, setSuffixVisible] = React.useState(false); + const [rootProps, setRootProps] = React.useState({ + fluid: true, + placeholder: "متنی وارد کنید..." + }); + + const adjustments = useAdjustments( + { + sizes: { + initial: "medium", + type: "radioGroup", + label: { + fa: "سایز", + en: "Size" + }, + fields: [ + { + id: "large", + type: "radio", + label: { + fa: "بزرگ", + en: "Large" + }, + toggleCallback: (currentValue: any) => { + if (currentValue) setSize("large"); + } + }, + { + id: "medium", + type: "radio", + label: { + fa: "متوسط", + en: "Medium" + }, + toggleCallback: (currentValue: any) => { + if (currentValue) setSize("medium"); + } + }, + { + id: "small", + type: "radio", + label: { + fa: "کوچک", + en: "Small" + }, + toggleCallback: (currentValue: any) => { + if (currentValue) setSize("small"); + } + } + ] + }, + options: { + label: { + fa: "گزینه‌ها", + en: "Options" + }, + fields: [ + { + id: "options.bool1", + type: "boolean", + label: { + fa: "با متن راهنما", + en: "Helper text" + }, + toggleCallback: (currentValue: any) => { + setRootProps(p => ({ + ...p, + helperText: currentValue ? "این یک متن راهنما است." : undefined + })); + } + }, + { + id: "options.bool2", + type: "boolean", + label: { + fa: "با فیلد جستجو", + en: "Searchable" + }, + toggleCallback: (currentValue: any) => { + setRootProps(p => ({ + ...p, + searchable: currentValue + })); + } + }, + { + id: "options.bool3", + type: "boolean", + label: { + fa: "با پسوند", + en: "Suffix" + }, + toggleCallback: () => setSuffixVisible(v => !v) + }, + { + id: "options.bool4", + type: "boolean", + label: { + fa: "چند انتخابی", + en: "Multiple" + }, + toggleCallback: (currentValue: any) => { + currentValue + ? breakingChanges.current++ + : breakingChanges.current--; + setRootProps(p => ({ + ...p, + multiple: currentValue + })); + } + } + ] + }, + styles: { + label: { + fa: "استایل‌ها", + en: "Styles" + }, + fields: [ + { + id: "styles.bool1", + type: "boolean", + label: { + fa: "گوشه‌گرد", + en: "Rounded" + }, + toggleCallback: (currentValue: any) => { + setRootProps(p => ({ ...p, rounded: currentValue })); + } + } + ] + }, + states: { + label: { + fa: "وضعیت‌ها", + en: "States" + }, + fields: [ + { + id: "states.bool1", + type: "boolean", + label: { + fa: "غیرفعال", + en: "Disabled" + }, + toggleCallback: (currentValue: any) => { + setRootProps(p => ({ ...p, disabled: currentValue })); + } + }, + { + id: "states.bool2", + type: "boolean", + label: { + fa: "خطا", + en: "Has error" + }, + toggleCallback: (currentValue: any) => { + setRootProps(p => ({ ...p, hasError: currentValue })); + } + } + ] + } + }, + [] + ); + + React.useEffect(() => { + if (isSuffixVisible) { + setRootProps(p => ({ + ...p, + trailingAdornment: isSuffixVisible && ( + متن پسوند + ) + })); + } else { + setRootProps(p => ({ + ...p, + trailingAdornment: null + })); + } + }, [isSuffixVisible]); + + return ( + + + انتخاب اول + انتخاب دوم + + انتخاب سوم + انتخاب چهارم + + } + adjustments={adjustments} + /> + ); +}); + +SelectDemo.displayName = componentName; + +export default SelectDemo; diff --git a/components/demos/TabBarDemo.tsx b/components/demos/TabBarDemo.tsx new file mode 100644 index 0000000..8372eb7 --- /dev/null +++ b/components/demos/TabBarDemo.tsx @@ -0,0 +1,196 @@ +import * as React from "react"; +import TabBar, { Tab, TabBarProps, TabProps } from "@sonnat/ui/TabBar"; +import Heart from "@sonnat/icons/Heart"; +import InteractiveDemo from "components/InteractiveDemo"; +import { useAdjustments } from "./utils"; + +const componentName = "TabBarDemo"; + +const initialTabsLabel = "عنوان تب"; + +interface Props { + className?: string; +} + +const TabBarDemo: React.FC = React.memo(function TabBarDemo({ + className +}) { + const breakingChange = React.useRef(0); + + const [variant, setVariant] = React.useState("fluid"); + const [size, setSize] = React.useState("medium"); + const [isScrollable, setScrollable] = React.useState(false); + const [isIconTab, setIconTab] = React.useState(false); + const [blackList, setBlackList] = React.useState([]); + + const [rootProps] = React.useState>({ + defaultActiveTab: 0 + }); + + const [childProps, setChildProps] = React.useState>({ + label: initialTabsLabel + }); + + const variants = [ + { + label: "با عرض کامل", + onActiveCallback: () => { + breakingChange.current++; + setVariant("fluid"); + setScrollable(false); + } + }, + { + label: "اسکرول‌شدنی", + onActiveCallback: () => { + breakingChange.current++; + setVariant("scrollable"); + setScrollable(true); + } + } + ]; + + const adjustments = useAdjustments( + { + sizes: { + initial: "medium", + type: "radioGroup", + label: { + fa: "سایز", + en: "Size" + }, + fields: [ + { + id: "large", + type: "radio", + label: { + fa: "بزرگ", + en: "Large" + }, + toggleCallback: (currentValue: any) => { + if (currentValue) setSize("large"); + breakingChange.current++; + } + }, + { + id: "medium", + type: "radio", + label: { + fa: "متوسط", + en: "Medium" + }, + toggleCallback: (currentValue: any) => { + if (currentValue) setSize("medium"); + breakingChange.current++; + } + }, + { + id: "small", + type: "radio", + label: { + fa: "کوچک", + en: "Small" + }, + toggleCallback: (currentValue: any) => { + if (currentValue) setSize("small"); + breakingChange.current++; + } + } + ] + }, + options: { + label: { + fa: "گزینه‌ها", + en: "Options" + }, + fields: [ + { + id: "options.bool1", + type: "boolean", + label: { + fa: "با آیکون ابتدایی", + en: "Leading icon" + }, + toggleCallback: (currentValue: any) => { + currentValue + ? breakingChange.current++ + : breakingChange.current--; + setChildProps(p => ({ + ...p, + icon: currentValue ? : undefined + })); + } + }, + { + id: "options.bool2", + type: "boolean", + label: { + fa: "فقط آیکون", + en: "Icon-only" + }, + toggleCallback: (currentValue: any) => { + currentValue + ? breakingChange.current++ + : breakingChange.current--; + setIconTab(currentValue); + setChildProps(p => ({ + ...p, + label: currentValue ? undefined : initialTabsLabel, + icon: currentValue ? : undefined + })); + } + } + ] + } + }, + [] + ); + + React.useEffect(() => { + if (isIconTab) { + setBlackList(s => [...s, "options.bool1"]); + } else { + setBlackList(s => s.filter(i => !["options.bool1"].includes(i))); + } + }, [isIconTab]); + + return ( + + + + + + + + + ) : ( + + + + + ) + } + variants={variants} + adjustments={adjustments} + /> + ); +}); + +TabBarDemo.displayName = componentName; + +export default TabBarDemo; diff --git a/components/demos/TagDemo.tsx b/components/demos/TagDemo.tsx new file mode 100644 index 0000000..6866b58 --- /dev/null +++ b/components/demos/TagDemo.tsx @@ -0,0 +1,74 @@ +import Tag, { TagProps } from "@sonnat/ui/Tag"; +import Heart from "@sonnat/icons/Heart"; +import InteractiveDemo from "components/InteractiveDemo"; +import * as React from "react"; +import { useAdjustments } from "./utils"; + +const componentName = "TagDemo"; + +interface Props { + className?: string; +} + +const TagDemo: React.FC = React.memo(({ className }) => { + const [variant, setVariant] = React.useState("filled"); + const [rootProps, setRootProps] = React.useState({ + label: "عنوان برچسب" + }); + + const variants = [ + { + label: "توپر", + onActiveCallback: () => { + setVariant("filled"); + } + }, + { + label: "توخالی", + onActiveCallback: () => { + setVariant("outlined"); + } + } + ]; + + const adjustments = useAdjustments( + { + options: { + label: { + fa: "گزینه‌ها", + en: "Options" + }, + fields: [ + { + id: "options.bool1", + type: "boolean", + label: { + fa: "به همراه آیکون ابتدایی", + en: "Leading icon" + }, + toggleCallback: (currentValue: any) => { + setRootProps(p => ({ + ...p, + icon: currentValue ? : undefined + })); + } + } + ] + } + }, + [] + ); + + return ( + } + variants={variants} + adjustments={adjustments} + /> + ); +}); + +TagDemo.displayName = componentName; + +export default TagDemo; diff --git a/components/demos/TextFieldDemo.tsx b/components/demos/TextFieldDemo.tsx new file mode 100644 index 0000000..738151f --- /dev/null +++ b/components/demos/TextFieldDemo.tsx @@ -0,0 +1,225 @@ +import { Eye, Heart } from "@sonnat/icons"; +import InputAdornment from "@sonnat/ui/InputAdornment"; +import TextField, { TextFieldProps } from "@sonnat/ui/TextField"; +import InteractiveDemo from "components/InteractiveDemo"; +import * as React from "react"; +import { useAdjustments } from "./utils"; + +const componentName = "TextFieldDemo"; + +interface Props { + className?: string; +} + +const TextFieldDemo: React.FC = React.memo(({ className }) => { + const [size, setSize] = React.useState("medium"); + const [isSuffixVisible, setSuffixVisible] = React.useState(false); + const [isLeadingVisible, setLeadingVisible] = React.useState(false); + const [isTrailingVisible, setTrailingVisible] = React.useState(false); + const [rootProps, setRootProps] = React.useState({ + fluid: true, + placeholder: "متنی وارد کنید..." + }); + + const adjustments = useAdjustments( + { + sizes: { + initial: "medium", + type: "radioGroup", + label: { + fa: "سایز", + en: "Size" + }, + fields: [ + { + id: "large", + type: "radio", + label: { + fa: "بزرگ", + en: "Large" + }, + toggleCallback: (currentValue: any) => { + if (currentValue) setSize("large"); + } + }, + { + id: "medium", + type: "radio", + label: { + fa: "متوسط", + en: "Medium" + }, + toggleCallback: (currentValue: any) => { + if (currentValue) setSize("medium"); + } + }, + { + id: "small", + type: "radio", + label: { + fa: "کوچک", + en: "Small" + }, + toggleCallback: (currentValue: any) => { + if (currentValue) setSize("small"); + } + } + ] + }, + options: { + label: { + fa: "گزینه‌ها", + en: "Options" + }, + fields: [ + { + id: "options.bool1", + type: "boolean", + label: { + fa: "با متن راهنما", + en: "Helper text" + }, + toggleCallback: (currentValue: any) => { + setRootProps(p => ({ + ...p, + helperText: currentValue ? "این یک متن راهنما است." : undefined + })); + } + }, + { + id: "options.bool2", + type: "boolean", + label: { + fa: "با پسوند", + en: "Suffix" + }, + toggleCallback: () => setSuffixVisible(v => !v) + }, + { + id: "options.bool3", + type: "boolean", + label: { + fa: "با آیکون ابتدایی", + en: "Leading icon" + }, + toggleCallback: () => setLeadingVisible(v => !v) + }, + { + id: "options.bool4", + type: "boolean", + label: { + fa: "با آیکون انتهایی", + en: "Trailing icon" + }, + toggleCallback: () => setTrailingVisible(v => !v) + } + ] + }, + styles: { + label: { + fa: "استایل‌ها", + en: "Styles" + }, + fields: [ + { + id: "styles.bool1", + type: "boolean", + label: { + fa: "گوشه‌گرد", + en: "Rounded" + }, + toggleCallback: (currentValue: any) => { + setRootProps(p => ({ ...p, rounded: currentValue })); + } + } + ] + }, + states: { + label: { + fa: "وضعیت‌ها", + en: "States" + }, + fields: [ + { + id: "states.bool1", + type: "boolean", + label: { + fa: "غیرفعال", + en: "Disabled" + }, + toggleCallback: (currentValue: any) => { + setRootProps(p => ({ ...p, disabled: currentValue })); + } + }, + { + id: "states.bool2", + type: "boolean", + label: { + fa: "خطا", + en: "Has error" + }, + toggleCallback: (currentValue: any) => { + setRootProps(p => ({ ...p, hasError: currentValue })); + } + } + ] + } + }, + [] + ); + + React.useEffect(() => { + if (isLeadingVisible) { + setRootProps(p => ({ + ...p, + leadingAdornment: ( + + + + ) + })); + } else { + setRootProps(p => ({ + ...p, + leadingAdornment: null + })); + } + }, [isLeadingVisible]); + + React.useEffect(() => { + if (isTrailingVisible || isSuffixVisible) { + setRootProps(p => ({ + ...p, + trailingAdornment: ( + + {isSuffixVisible && ( + متن پسوند + )} + {isTrailingVisible && ( + + + + )} + + ) + })); + } else { + setRootProps(p => ({ + ...p, + trailingAdornment: null + })); + } + }, [isTrailingVisible, isSuffixVisible]); + + return ( + } + adjustments={adjustments} + /> + ); +}); + +TextFieldDemo.displayName = componentName; + +export default TextFieldDemo; diff --git a/components/demos/utils/index.ts b/components/demos/utils/index.ts new file mode 100644 index 0000000..a21a4d7 --- /dev/null +++ b/components/demos/utils/index.ts @@ -0,0 +1,2 @@ +export { default as useAdjustments } from "./useAdjustments"; +export * from "./useAdjustments"; diff --git a/components/demos/utils/useAdjustments.ts b/components/demos/utils/useAdjustments.ts new file mode 100644 index 0000000..8a1e166 --- /dev/null +++ b/components/demos/utils/useAdjustments.ts @@ -0,0 +1,38 @@ +import { DependencyList, useMemo } from "react"; + +type NormalizedResult = { + bySegment: { [P: string]: any }; + allSegments: string[]; +}; + +export default function useAdjustments( + inputAdjustments: { [P: string]: any }, + dependencies?: DependencyList +) { + return useMemo( + () => { + const normalizedResult: NormalizedResult = Object.keys( + inputAdjustments + ).reduce( + (result: NormalizedResult, adj: string) => { + return { + ...result, + bySegment: { + ...result.bySegment, + [adj]: inputAdjustments[adj] + }, + allSegments: [...result.allSegments, adj] + }; + }, + { + bySegment: {}, + allSegments: [] + } + ); + + return normalizedResult; + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [dependencies] + ); +} diff --git a/components/layouts/WithSidebar.tsx b/components/layouts/WithSidebar.tsx new file mode 100644 index 0000000..b2e2ed3 --- /dev/null +++ b/components/layouts/WithSidebar.tsx @@ -0,0 +1,78 @@ +import Container from "@sonnat/ui/Container"; +import makeStyles from "@sonnat/ui/styles/makeStyles"; +import Footer from "components/containers/Footer"; +import Sidebar from "components/containers/Sidebar"; +import * as React from "react"; + +const componentName = "WithSidebar"; + +const useStyles = makeStyles( + theme => { + const { + breakpoints, + typography: { pxToRem } + } = theme; + + return { + root: { + display: "flex" + }, + container: { + [breakpoints.up("lg")]: { + paddingRight: 0, + paddingLeft: 0 + } + }, + sidebar: { + height: `100vh`, + width: pxToRem(256), + flexShrink: 0, + [breakpoints.down("lg")]: { + display: "none" + } + }, + content: { + flex: "1 1", + minWidth: 0, + paddingTop: pxToRem(64), + paddingRight: pxToRem(32), + paddingLeft: pxToRem(32), + [breakpoints.down("lg")]: { + paddingTop: pxToRem(96), + paddingRight: 0, + paddingLeft: 0 + } + }, + article: { + minHeight: `calc(100vh - ${pxToRem(264)})`, + [breakpoints.down("lg")]: { + minHeight: `calc(100vh - ${pxToRem(296)})` + }, + [breakpoints.down("sm")]: { + minHeight: "auto" + } + } + }; + }, + { name: componentName } +); + +const WithSidebar: React.FC = ({ children }) => { + const classes = useStyles(); + + return ( +
    + +
    + +
    {children}
    +
    + +
    +
    + ); +}; + +WithSidebar.displayName = componentName; + +export default WithSidebar; diff --git a/components/layouts/WithTableOfContent.tsx b/components/layouts/WithTableOfContent.tsx new file mode 100644 index 0000000..f1ebb01 --- /dev/null +++ b/components/layouts/WithTableOfContent.tsx @@ -0,0 +1,44 @@ +import Row from "@sonnat/ui/Row"; +import Column from "@sonnat/ui/Column"; +import makeStyles from "@sonnat/ui/styles/makeStyles"; +import TableOfContent from "components/TableOfContent"; +import * as React from "react"; + +const componentName = "WithTableOfContent"; + +const useStyles = makeStyles( + theme => ({ + root: {}, + tableColumn: { + [theme.breakpoints.down("lg")]: { + display: "none" + } + } + }), + { name: componentName } +); + +type TableDataType = { id: string; label: string }[]; + +interface Props { + tableData: TableDataType; +} + +const WithTableOfContent: React.FC = ({ children, tableData }) => { + const classes = useStyles(); + + return ( + + + {children} + + + + + + ); +}; + +WithTableOfContent.displayName = componentName; + +export default WithTableOfContent; diff --git a/components/layouts/index.ts b/components/layouts/index.ts new file mode 100644 index 0000000..3b63cdf --- /dev/null +++ b/components/layouts/index.ts @@ -0,0 +1,2 @@ +export { default as WithTableOfContent } from "./WithTableOfContent"; +export { default as WithSiderbar } from "./WithSidebar"; diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..25f83f7 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "baseUrl": "." + }, + "exclude": ["node_modules", "out", ".next"] +} diff --git a/mdx.d.ts b/mdx.d.ts new file mode 100644 index 0000000..45c95cd --- /dev/null +++ b/mdx.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/nav-schema.tsx b/nav-schema.tsx new file mode 100644 index 0000000..7c210ae --- /dev/null +++ b/nav-schema.tsx @@ -0,0 +1,491 @@ +import makeStyles from "@sonnat/ui/styles/makeStyles"; +import Text from "@sonnat/ui/Text"; +import type { Classes } from "@sonnat/ui/typings"; +import usePreviousValue from "@sonnat/ui/utils/usePreviousValue"; +import createClassName from "classnames"; +import ActiveLink from "components/ActiveLink"; +import { Content, InnerLink, NavItem, Trigger } from "components/Collapsable"; +import { diff } from "deep-diff"; +import * as React from "react"; + +export type ChildLabel = { en: string; fa: string }; + +export interface LeafChild { + label: ChildLabel; + href: string; + excludeFromComponentsPage?: boolean; +} + +export interface ChildSchema { + label: ChildLabel; + isDivarSpecific?: boolean; + byChild: { + [P: string]: ChildSchema | LeafChild; + }; + children: ChildLabel[]; +} + +export interface Schema { + byChild: { + [P: string]: ChildSchema | LeafChild; + }; + children: ChildLabel[]; +} + +const schema: Schema = { + byChild: { + Components: { + label: { en: "Components", fa: "کامپوننت‌ها" }, + byChild: { + Actions: { + label: { en: "Actions", fa: "کنش‌گرها" }, + byChild: { + Button: { + label: { en: "Button", fa: "دکمه" }, + href: "/components/Button" + } + }, + children: [{ en: "Button", fa: "دکمه" }] + }, + Controlers: { + label: { en: "Controlers", fa: "کنترل‌کننده‌ها" }, + byChild: { + InputSlider: { + label: { en: "InputSlider", fa: "اسلایدر محدوده" }, + href: "/components/InputSlider" + }, + SwitchControls: { + label: { en: "SwitchControls", fa: "کنترل‌های انتخاب" }, + href: "/components/SwitchControls" + }, + Select: { + label: { en: "Select", fa: "فیلد انتخابی" }, + href: "/components/Select" + }, + InputStepper: { + label: { en: "InputStepper", fa: "فیلد پله‌ای" }, + href: "/components/InputStepper" + }, + TextField: { + label: { en: "TextField", fa: "فیلد متنی" }, + href: "/components/TextField" + } + }, + children: [ + { en: "InputSlider", fa: "اسلایدر محدوده" }, + { en: "SwitchControls", fa: "کنترل‌های انتخاب" }, + { en: "Select", fa: "فیلد انتخابی" }, + { en: "InputStepper", fa: "فیلد پله‌ای" }, + { en: "TextField", fa: "فیلد متنی" } + ] + }, + Display: { + label: { en: "Display", fa: "نمایش‌دهنده‌ها" }, + byChild: { + Tag: { + label: { en: "Tag", fa: "برچسب" }, + href: "/components/Tag" + }, + Chip: { + label: { en: "Chip", fa: "چیپس" }, + href: "/components/Chip" + }, + Divider: { + label: { en: "Divider", fa: "جداکننده" }, + href: "/components/Divider" + }, + Backdrop: { + label: { en: "Backdrop", fa: "پوشاننده" }, + href: "/components/Backdrop" + }, + Tooltip: { + label: { en: "Tooltip", fa: "راهنمای ابزار" }, + href: "/components/Tooltip" + }, + Progress: { + label: { en: "Progress", fa: "نشانگر پیشرفت" }, + href: "/components/Progress" + }, + Badge: { + label: { en: "Badge", fa: "نشان و نشانگر" }, + href: "/components/Badge" + } + }, + children: [ + { en: "Tag", fa: "برچسب" }, + { en: "Chip", fa: "چیپس" }, + { en: "Divider", fa: "جداکننده" }, + { en: "Backdrop", fa: "پوشاننده" }, + { en: "Tooltip", fa: "راهنمای ابزار" }, + { en: "Progress", fa: "نشانگر پیشرفت" }, + { en: "Badge", fa: "نشان و نشانگر" } + ] + }, + Navigation: { + label: { en: "Navigation", fa: "راهبری" }, + byChild: { + Breadcrumb: { + label: { en: "Breadcrumb", fa: "بردکرام" }, + href: "/components/Breadcrumb" + }, + TabBar: { + label: { en: "TabBar", fa: "نوار تب" }, + href: "/components/TabBar" + } + }, + children: [ + { en: "Breadcrumb", fa: "بردکرام" }, + { en: "TabBar", fa: "نوار تب" } + ] + }, + Rows: { + label: { en: "Rows", fa: "ردیف‌ها" }, + isDivarSpecific: true, + byChild: { + "Introduction to Rows": { + excludeFromComponentsPage: true, + label: { en: "Introduction to Rows", fa: "آشنایی با ردیف‌ها" }, + href: "/components/divar/rows-introduction" + }, + FeatureRow: { + label: { en: "FeatureRow", fa: "ردیف ویژگی" }, + href: "/components/divar/FeatureRow" + }, + AccordionRow: { + label: { en: "AccordionRow", fa: "ردیف آکاردئون" }, + href: "/components/divar/AccordionRow" + }, + RateRow: { + label: { en: "RateRow", fa: "ردیف ارزیابی" }, + href: "/components/divar/RateRow" + }, + ScoreRow: { + label: { en: "ScoreRow", fa: "ردیف امتیاز" }, + href: "/components/divar/ScoreRow" + }, + SelectorRow: { + label: { en: "SelectorRow", fa: "ردیف انتخابی" }, + href: "/components/divar/SelectorRow" + }, + PriceEstimationRow: { + label: { en: "PriceEstimationRow", fa: "ردیف تخمین قیمت" }, + href: "/components/divar/PriceEstimationRow" + }, + PriceChangeRow: { + label: { en: "PriceChangeRow", fa: "ردیف تغییرات قیمت" }, + href: "/components/divar/PriceChangeRow" + }, + InfoRow: { + label: { en: "InfoRow", fa: "ردیف داده" }, + href: "/components/divar/InfoRow" + }, + EvaluationRow: { + label: { en: "EvaluationRow", fa: "ردیف سنجش" }, + href: "/components/divar/EvaluationRow" + }, + ControlRow: { + label: { en: "ControlRow", fa: "ردیف کنترل" }, + href: "/components/divar/ControlRow" + }, + TitleRow: { + label: { en: "TitleRow", fa: "ردیف عنوان" }, + href: "/components/divar/TitleRow" + } + }, + children: [ + { en: "Introduction to Rows", fa: "آشنایی با ردیف‌ها" }, + { en: "FeatureRow", fa: "ردیف ویژگی" }, + { en: "AccordionRow", fa: "ردیف آکاردئون" }, + { en: "RateRow", fa: "ردیف ارزیابی" }, + { en: "ScoreRow", fa: "ردیف امتیاز" }, + { en: "SelectorRow", fa: "ردیف انتخابی" }, + { en: "PriceEstimationRow", fa: "ردیف تخمین قیمت" }, + { en: "PriceChangeRow", fa: "ردیف تغییرات قیمت" }, + { en: "InfoRow", fa: "ردیف داده" }, + { en: "EvaluationRow", fa: "ردیف سنجش" }, + { en: "ControlRow", fa: "ردیف کنترل" }, + { en: "TitleRow", fa: "ردیف عنوان" } + ] + } + }, + children: [ + { en: "Actions", fa: "کنش‌گرها" }, + { en: "Controlers", fa: "کنترل‌کننده‌ها" }, + { en: "Display", fa: "نمایش‌دهنده‌ها" }, + { en: "Navigation", fa: "راهبری" }, + { en: "Rows", fa: "ردیف‌ها" } + ] + }, + Introduction: { + label: { en: "Introduction", fa: "آشنایی با سنّت" }, + href: "/introduction" + }, + Foundation: { + label: { en: "Foundation", fa: "بنیان سنّت" }, + byChild: { + Typography: { + label: { en: "Typography", fa: "تایپوگرافی" }, + href: "/foundation/typography" + }, + Layout: { + label: { en: "Layout", fa: "چیدمان" }, + byChild: { + "Understanding layout and spacings": { + label: { + en: "Understanding layout and spacings", + fa: "درک چیدمان و فاصله‌گذاری" + }, + href: "/foundation/layout/understanding-layout-and-spacings" + }, + "Grid and breakpoints": { + label: { + en: "Grid and breakpoints", + fa: "گرید و نقاط‌شکست" + }, + href: "/foundation/layout/grid-and-breakpoints" + } + }, + children: [ + { + en: "Understanding layout and spacings", + fa: "درک چیدمان و فاصله‌گذاری" + }, + { + en: "Grid and breakpoints", + fa: "گرید و نقاط‌شکست" + } + ] + }, + Icon: { + label: { en: "Icon", fa: "آیکون" }, + href: "/foundation/icon" + } + }, + children: [ + { en: "Typography", fa: "تایپوگرافی" }, + { en: "Layout", fa: "چیدمان" }, + { en: "Icon", fa: "آیکون" } + ] + } + }, + children: [ + { en: "Introduction", fa: "آشنایی با سنّت" }, + { en: "Foundation", fa: "بنیان سنّت" }, + { en: "Components", fa: "کامپوننت‌ها" } + ] +}; + +export const getSchema = (): Readonly => { + return Object.freeze(schema); +}; + +const useStyles = makeStyles( + theme => { + const { + colors, + typography: { pxToRem, fontWeight } + } = theme; + + return { + root: { + height: `calc(100% - ${pxToRem(225)})`, + paddingRight: pxToRem(32), + paddingLeft: pxToRem(32), + paddingBottom: pxToRem(16), + paddingTop: pxToRem(16), + overflowX: "hidden", + overflowY: "auto" + }, + navigationList: { + position: "relative", + margin: 0, + padding: 0, + listStyle: "none", + "& $navigationList": { + paddingRight: pxToRem(32), + "& $navigationList": { + paddingRight: pxToRem(16), + "&:before": { + right: pxToRem(16), + position: "absolute", + top: pxToRem(8), + bottom: pxToRem(8), + content: '""', + backgroundColor: colors.divider, + width: pxToRem(1) + } + } + } + }, + navigationItem: { + display: "flex", + flexDirection: "column", + alignItems: "flex-start", + "& $navigationItem": { + position: "relative", + "& $navigationItem": { + flexDirection: "row", + alignItems: "center", + "& > $navigationItemLink": { + height: pxToRem(32), + "&:before": { + content: '""', + position: "absolute", + right: 0, + backgroundColor: colors.transparent, + width: pxToRem(1), + height: pxToRem(24), + transition: "background-color 360ms ease" + } + }, + "& > $navigationItemLink$active:before": { + backgroundColor: colors.primary.origin + } + } + } + }, + navigationItemLink: { + paddingRight: pxToRem(8), + position: "relative", + height: pxToRem(40), + display: "inline-flex", + alignItems: "center", + cursor: "pointer", + color: colors.text.secondary, + transition: "color 360ms ease, font-weight 360ms ease", + "&$active": { + color: colors.primary.origin, + fontWeight: fontWeight.medium + }, + "&:not($active):hover": { + color: colors.text.primary + } + }, + active: {} + }; + }, + { name: "Nav" } +); + +// @ts-ignore +const schemaToJSX = ( + schema: Schema | ChildSchema, + classes: Classes< + | "root" + | "navigationList" + | "navigationItem" + | "navigationItemLink" + | "active" + >, + depth: number = 0 +) => { + let jsx: (React.ReactNode | null)[] = []; + + if (schema.children && schema.children.length > 0) { + jsx = schema.children.map((child, index) => { + const childSchema = schema.byChild[child.en]; + const key = `${child}/${index}`; + + if (!childSchema) return null; + + const isLeaf = + !(childSchema as unknown as ChildSchema).children || + (childSchema as unknown as ChildSchema).children.length === 0; + + if (isLeaf) { + if (depth === 0) { + return ( +
  • + + + {childSchema.label.fa} + + +
  • + ); + } else { + return ( +
  • + + + {childSchema.label.fa} + + +
  • + ); + } + } else { + const isDivarSpecific = (childSchema as unknown as ChildSchema) + .isDivarSpecific; + + return ( +
  • + + } + content={ + +
      + {schemaToJSX( + childSchema as ChildSchema, + classes, + depth + 1 + )} +
    +
    + } + /> +
  • + ); + } + }); + } + + return jsx; +}; + +export const useNavJsx = (className?: string) => { + const classes = useStyles(); + + const children = React.useRef(); + const changeId = React.useRef(""); + + const prevClasses = usePreviousValue(classes); + + const classesChanged = diff(classes, prevClasses) != null; + const idChanged = classes.root !== changeId.current; + + if (classesChanged && idChanged) { + changeId.current = classes.root; + children.current = schemaToJSX(getSchema(), classes); + } + + return ( + + ); +}; diff --git a/next-env.d.ts b/next-env.d.ts new file mode 100644 index 0000000..7b7aa2c --- /dev/null +++ b/next-env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/next.config.js b/next.config.js new file mode 100644 index 0000000..8c3e83e --- /dev/null +++ b/next.config.js @@ -0,0 +1,18 @@ +const withMdx = require("@next/mdx")({ + extension: /\.(md|mdx)?$/ +}); + +/** @type {import('next/dist/next-server/server/config').NextConfig} */ +const nextConfig = { + pageExtensions: ["jsx", "js", "mdx", "md", "ts", "tsx"], + env: { + VERSION: require("./package.json").version + }, + trailingSlash: false, + experimental: { + reactStrictMode: true + }, + future: { webpack5: true } +}; + +module.exports = withMdx(nextConfig); diff --git a/package.json b/package.json new file mode 100644 index 0000000..31c090d --- /dev/null +++ b/package.json @@ -0,0 +1,91 @@ +{ + "name": "sonnat.design-website", + "version": "1.0.0", + "description": "Sonnat is an adaptable Design System helps teams build high quality digital experiences.", + "repository": "git@git.cafebazaar.ir:sonnat/sonnat.design-website.git", + "private": true, + "scripts": { + "dev": "next", + "build": "next build", + "start": "next start", + "static:export": "next export", + "static:serve": "serve out", + "start:prod": "npm run build && npm run start" + }, + "devDependencies": { + "@mdx-js/loader": "^1.6.22", + "@mdx-js/react": "^1.6.22", + "@next/mdx": "^10.0.8", + "@types/classnames": "^2.2.11", + "@types/clean-css": "^4.2.3", + "@types/deep-diff": "^1.0.0", + "@types/fs-extra": "^9.0.11", + "@types/lodash.debounce": "^4.0.6", + "@types/lodash.throttle": "^4.1.6", + "@types/mdx-js__react": "^1.5.3", + "@types/node": "^14.14.32", + "@types/react": "^18.2.64", + "@types/react-collapse": "^5.0.0", + "@types/react-dom": "^17.0.1", + "@types/smoothscroll-polyfill": "^0.3.1", + "@typescript-eslint/eslint-plugin": "^4.16.1", + "@typescript-eslint/parser": "^4.16.1", + "eslint": "^7.16.0", + "eslint-config-prettier": "^8.1.0", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-react": "^7.22.0", + "eslint-plugin-react-hooks": "^4.2.0", + "husky": "^6.0.0", + "lint-staged": "^11.0.0", + "lodash.debounce": "^4.0.8", + "postcss-flexbugs-fixes": "^5.0.2", + "postcss-normalize": "^9.0.0", + "postcss-preset-env": "^6.7.0", + "prettier": "^2.2.1", + "typescript": "^4.2.3" + }, + "dependencies": { + "@sonnat/icons": "^1.2.0", + "@sonnat/ui": "^1.3.3-canary.0", + "@utilityjs/use-event-listener": "^1.0.4", + "autoprefixer": "^10.2.5", + "classnames": "^2.2.6", + "clean-css": "^5.1.2", + "deep-diff": "^1.0.2", + "lodash.throttle": "^4.1.1", + "next": "^10.1.3", + "postcss": "^8.2.9", + "prop-types": "^15.7.2", + "react": "17.0.1", + "react-collapse": "^5.1.0", + "react-dom": "17.0.1", + "react-ga": "^3.3.0", + "react-use-clipboard": "^1.0.7", + "smoothscroll-polyfill": "^0.4.4", + "zustand": "^3.3.3" + }, + "browserslist": { + "production": [ + "cover 95%", + "last 4 versions", + "not ie <= 11" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "lint-staged": { + "*.{js,jsx,ts,tsx}": "eslint --cache --fix", + "*.{js,jsx,ts,tsx,scss,css,md,mdx,json}": "prettier --write" + }, + "volta": { + "node": "20.11.1" + } +} diff --git a/pages/_app.tsx b/pages/_app.tsx new file mode 100644 index 0000000..18afb42 --- /dev/null +++ b/pages/_app.tsx @@ -0,0 +1,119 @@ +import { MDXProvider } from "@mdx-js/react"; +import CssBaseline from "@sonnat/ui/CssBaseline"; +import makeStyles from "@sonnat/ui/styles/makeStyles"; +import SonnatInitializer from "@sonnat/ui/styles/SonnatInitializer"; +import MainWrapper from "components/containers/MainWrapper"; +import WithSidebar from "components/layouts/WithSidebar"; +import Head from "next/head"; +// eslint-disable-next-line import/no-named-as-default +import Router from "next/router"; +import "public/static/fonts.css"; +import * as React from "react"; +import smoothScroll from "smoothscroll-polyfill"; +import useStore from "store"; +import theme from "theme"; +import type { AppPropsWithLayout, MDXMeta } from "types"; +import { analytics, createComponentMapping, setTitleMeta } from "utils"; + +const googleFontFamily = + "https://fonts.googleapis.com/css2?" + + "family=Roboto+Mono:ital,wght@0,300;0,400;0,500;0,700;1,300;1,400;1,500;1,700&" + + "family=Roboto:ital,wght@0,300;0,400;0,500;0,700;1,300;1,400;1,500;1,700&" + + "display=swap"; + +const isProduction = process.env.NODE_ENV === "production"; + +const useGlobalStyles = makeStyles( + { + "@global": { + "html, body": { scrollBehavior: "smooth" }, + img: { verticalAlign: "middle" }, + a: { textDecoration: "none", color: "inherit" } + } + }, + { name: "GlobalStyles" } +); + +const componentMapping = createComponentMapping(); + +export default function App(props: AppPropsWithLayout) { + const { Component: Page, pageProps } = props; + + useGlobalStyles(); + + // @ts-ignore + const meta: MDXMeta = Page.isMDXComponent ? Page({}).props.meta : {}; + const MdxGetPageLayout = meta?.getLayout; + + const getPageLayout = MdxGetPageLayout + ? MdxGetPageLayout + : Page.getLayout || (() => (page: React.ReactNode) => page); + + const withPageLayout = getPageLayout(); + + const setBurgerMenuOpen = useStore(state => state.setBurgerMenuOpen); + const setSearchBoxOpen = useStore(state => state.setSearchBoxOpen); + const setPageLoading = useStore(state => state.setPageLoading); + + const routeChangeStart = () => setPageLoading(true); + const routeChangeComplete = () => { + setPageLoading(false); + setBurgerMenuOpen(false); + setSearchBoxOpen(false); + if (isProduction) analytics.logPageView(); + }; + + React.useEffect(() => { + const sonnatServerStyles = document.getElementById("sonnat-jss-ssr"); + + if (sonnatServerStyles) + sonnatServerStyles.parentElement?.removeChild(sonnatServerStyles); + }, []); + + React.useEffect(() => { + smoothScroll.polyfill(); + }, []); + + React.useEffect(() => { + Router.events.on("routeChangeStart", routeChangeStart); + Router.events.on("routeChangeComplete", routeChangeComplete); + Router.events.on("routeChangeError", routeChangeComplete); + + return () => { + Router.events.off("routeChangeStart", routeChangeStart); + Router.events.off("routeChangeComplete", routeChangeComplete); + Router.events.off("routeChangeError", routeChangeComplete); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + React.useEffect(() => { + if (isProduction) { + analytics.initGA(); + analytics.logPageView(); + } + }, []); + + return ( + + + {setTitleMeta("دیزاین سیستم سنّت")} + + + + + + + + + {withPageLayout()} + + + + + ); +} diff --git a/pages/_document.tsx b/pages/_document.tsx new file mode 100644 index 0000000..3513927 --- /dev/null +++ b/pages/_document.tsx @@ -0,0 +1,115 @@ +import Document, { + Head, + Html, + Main, + NextScript, + DocumentContext +} from "next/document"; +import ServerStyleSheets from "@sonnat/ui/styles/ServerStyleSheets"; +import * as React from "react"; +import PostCss from "postcss"; +import AutoPrefixer from "autoprefixer"; +import CleanCss from "clean-css"; + +const prefixer = PostCss([AutoPrefixer]); +const cleaner = new CleanCss(); + +export default class MyDocument extends Document { + static async getInitialProps(ctx: DocumentContext) { + const sheets = new ServerStyleSheets(); + + const originalRenderPage = ctx.renderPage; + + ctx.renderPage = () => + originalRenderPage({ + enhanceApp: App => props => sheets.collect() + }); + + const initialProps = await Document.getInitialProps(ctx); + + const css = sheets.toString(); + const sheetId = sheets.getStyleElementId(); + + const minifiedCSS = await (async rawCSS => { + // It might be undefined, e.g. after an error. + if (rawCSS) { + return cleaner.minify( + (await prefixer.process(rawCSS, { from: undefined })).css + ).styles; + } else return rawCSS; + })(css); + + return { + ...initialProps, + // Styles fragment is rendered after the app and page rendering finish. + styles: [ + ...React.Children.toArray(initialProps.styles), + + ] + }; + } + + render() { + return ( + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + ); + } +} diff --git a/pages/components/Backdrop.mdx b/pages/components/Backdrop.mdx new file mode 100644 index 0000000..7b7f822 --- /dev/null +++ b/pages/components/Backdrop.mdx @@ -0,0 +1,210 @@ +import Divider from "@sonnat/ui/Divider"; +import Row from "@sonnat/ui/Row"; +import Column from "@sonnat/ui/Column"; +import Code from "@sonnat/ui/Code"; +import Image from "components/Image"; +import Behaviour from "components/Behaviour"; +import Anatomy from "components/Anatomy"; +import AnchorButton from "components/AnchorButton"; +import WithTableOfContent from "components/layouts/WithTableOfContent"; +import Head from "next/head"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +export const meta = { + title: "پوشاننده", + description: + "پوشاننده‌ها بخشی از محتوای رابط کاربر را می‌پوشانند تا تمرکز کاربر را بر محتوایی مشخص بالا ببرند یا از تعامل کاربر با بخشی از رابط کاربر جلوگیری کنند.", + getLayout: () => page => + ( + + {page} + + ) +}; + + + {setTitleMeta(`${meta.title} | دیزاین سیستم سنّت`)} + {setDescriptionMeta(meta.description)} + {setCanonicalMeta(`${siteFullAddress}/components/Backdrop`)} + {setKeywordsMeta([...defaultKeywordsMetaContent, "backdrop", "پوشاننده"])} + + +

    + {meta.title} + +

    + +

    پوشاننده‌ روشن (Light) و تیره (Dark)

    + +

    {meta.description}

    + +

    + کاربرد + +

    + +

    + همان‌طور که جدا کننده‌ها محتوا را در فضای دو بُعدی از هم متمایز و دسته‌بندی + می‌کنند، پوشاننده‌ها در فضای سه‌ بعدی محتوای رابط کاربر را در لایه‌هایی با + ارتفاع متفاوت به کاربر ارائه می‌دهند. پوشاننده‌ها می‌توانند بخشی یا تمام سطح + رابط‌ کاربر را بپوشانند و علاوه ‌بر پوشاندن محتوای مخل تمرکز، اجازهٔ دسترسی و + تغییر آن بخش را از کاربر سلب ‌کنند. +
    + این کامپوننت می‌تواند پس‌زمینهٔ کامپوننت‌های گفتگو محور سیستم مانند مُدال‌ها، + پیغام‌های هشدار یا متنی و نمایشگر عکس یا ویدیو باشد و کاربر را به ادامهٔ مسیرِ + مشخص یا تأیید مشاهدهٔ پیامِ سیستم ملزم کند. همچنین پوشاننده‌ محتوای وابسته به + پیشرفت فرآیندی مشخص (In Progress) را می‌پوشاند و از کنش در این محتوا جلوگیری + می‌کند. +

    + +
    + + +
    + +
    +
    + +
    + +
    +
    +
    +
    + +
    +

    + +
    + +

    + انواع + +

    + +

    + پوشاننده‌های تیره + +

    + +

    + این پوشاننده‌ها با ۳ درجهٔ شفافیت که از رنگ سیاه تعریف‌شده در دیزاین سیستم + پیروی می‌کند، روی محتوای صفحه قرار می‌گیرند. درجهٔ تیرگی بیشتر مختص پس‌زمینهٔ + مدال‌ها، پیغام‌های هشدار یا متنی و یا نمایشگر عکس یا ویدیو است و تمام سطح رابط + کاربر را پوشش می‌دهد. درجهٔ تیرگی کمتر برای پوشاندن بخشی از رابط کاربر است که + ابزار یا کامپوننتی درسطحی بالاتر در آن تغییر ایجاد می‌کند. +

    + + + + + +

    + پوشاننده‌های روشن + +

    + +

    + این پوشاننده‌ها از رنگ سفید تعریف‌شده در دیزاین سیستم با درجهٔ شفافیت مشخص + پیروی می‌کنند و برای پوشاندن محتوای وابسته به پیشرفت فرآیندی مشخص (بارگذاری یا + به‌روزرسانی) مناسب‌اند. معمولاً روی این پوشاننده‌ها نشانگر/ نوار پیشرفت قرار + می‌گیرد تا کاربر از وضعیت بارگذاری یا به‌روزرسانی آگاه شود. ‌ +

    + + + +
    +

    + +
    + +

    + رفتار + +

    + +

    + در راهنمای زیر رفتار کامپوننت در کاربردهای مختلف دیزاین توضیح داده شده است. +

    + +
    + + +
    + +
    +
    + +
    + +
    +
    +
    +
    diff --git a/pages/components/Badge.mdx b/pages/components/Badge.mdx new file mode 100644 index 0000000..e3e850d --- /dev/null +++ b/pages/components/Badge.mdx @@ -0,0 +1,271 @@ +import Divider from "@sonnat/ui/Divider"; +import Row from "@sonnat/ui/Row"; +import Column from "@sonnat/ui/Column"; +import Code from "@sonnat/ui/Code"; +import Image from "components/Image"; +import Behaviour from "components/Behaviour"; +import Anatomy from "components/Anatomy"; +import AnchorButton from "components/AnchorButton"; +import WithTableOfContent from "components/layouts/WithTableOfContent"; +import Head from "next/head"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +export const meta = { + title: "نشان و نشانگر", + description: + "کامپوننت‌های نشان و نشانگر برای جلب توجه کاربران استفاده می‌شوند تا تغییرات رخ‌داده در بخشی از رابط کاربر را درک کنند یا از کمیت تغییرات آگاه شوند. اگر تغییرات آنلاین اتفاق بیفتند، همان لحظه در رابط کاربر ظاهر می‌شوند در غیر این صورت از قبل در محل مورد نظر قرار می‌گیرند.", + getLayout: () => page => + ( + + {page} + + ) +}; + + + {setTitleMeta(`${meta.title} | دیزاین سیستم سنّت`)} + {setDescriptionMeta(meta.description)} + {setCanonicalMeta(`${siteFullAddress}/components/Badge`)} + {setKeywordsMeta([ + ...defaultKeywordsMetaContent, + "badge", + "Indicator", + "نشان", + "نشانگر" + ])} + + +

    + {meta.title} + +

    + +

    نشان‌ توپُر (Filled) و بدون متن (نشانگر | Indicator)

    + +

    {meta.description}

    + +

    + کاربرد + +

    + +

    + کامپوننت نشان برای جلب توجه کاربر و به دو شکل متنی یا بدون متن (نشانگر) + استفاده می‌شود. نشان متنی یا شامل عددی است که کمیت تغییر را نمایش می‌دهد و یا + شامل کلماتی که وضعیت بخش مورد نظر در رابط کاربر را توصیف می‌کند. مانند «جدید!» + و یا ورژن یک تغییر مثل «v1.0.1». +

    + +

    نشان‌ها می‌توانند در این مکان‌ها باشند:

    + +
      +
    • کنار آیکون
    • +
    • + بعد از لیبلی که باید آن را بشمارند و یا وضعیتش را مشخص کنند. (توصیف کنند) +
    • +
    • + کنار تصویر کاربر (Avatar) برای نمایش وضعیت اتصال کاربر (آفلاین، آنلاین و در + دسترس‌نبودن) +
    • +
    + +

    + زمانی که باید مشخص شود «آخرین تغییر رصد نشده» در کدام بخش اتفاق افتاده و کمیت + این تغییر نیز مهم نباشد یا وقتی که فقط جلب توجه کاربر نیاز باشد (مانند نمایش + وضعیت اتصال کاربر) از نشان بدون متن استفاده می‌شود. ولی اگر علاوه بر جلب توجه + لازم باشد اطلاعاتی به کاربر منتقل شود، باید از نشان متنی استفاده ‌شود مانند + تعداد پیام‌های جدید چت که خوانده نشده‌اند. +

    + + + +

    + انواع + +

    + +

    + نشان‌ توپُر + +

    + +

    نشان‌های توپُر با کادری که رنگ اصلی برند را در زمینه دارند مشخص می‌شوند.

    + + + +

    + نشان بدون متن (نشانگر) + +

    + +

    + نشانگر نشان بدون متن است که وضعیت‌های مختلف آن با استفاده از رنگ‌های بامعنا از + یکدیگر متمایز می‌شود. مثلاً برای مشخص‌کردن وضعیت اتصال (آنلاین، آفلاین و یا در + دسترس‌نبودن) در کنار تصویر کاربر (Avatar). +
    + نشان کنار گزینه‌های منو و هم‌تراز با متن آن‌ها یا بالا گوشهٔ سمت راست، کنار + آیکون و آواتار قرار می‌گیرد. در انتخاب نوع نشان باید به استایل بصری رابط کاربر + توجه کنید و مطمئن شوید نشان در محلی استفاده شده است که توجه کاربر را به + تغییرات رخ‌داده جلب می‌کند. +

    + + + +

    + آناتومی + +

    + +

    + اینجا می‌توانید ابعاد نشان و نشانگر، فاصله‌ها، حاشیه‌ها و اندازهٔ متن را + ببینید. +

    + +
    + + +
    + +
    +
    + +
    + +
    +
    +
    +
    + +
    +

    + +
    + +

    + رفتار + +

    + +

    + در راهنمای زیر رفتار کامپوننت در کاربردهای مختلف دیزاین توضیح داده شده است. +

    + +
    + + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    +
    +
    + +
    +

    + +
    + +

    + نگارش + +

    + +
      +
    • + در نشانِ متنی باید از تک کلمه و یا جملهٔ کوتاه (زیر ۲۴ کاراکتر) استفاده شود. +
    • +
    • + در نشانِ متنی که شامل عدد است می‌توانید از علائم + و - در کنار عدد استفاده + کنید. +
    • +
    diff --git a/pages/components/Breadcrumb.mdx b/pages/components/Breadcrumb.mdx new file mode 100644 index 0000000..85d4ddd --- /dev/null +++ b/pages/components/Breadcrumb.mdx @@ -0,0 +1,364 @@ +import Divider from "@sonnat/ui/Divider"; +import Row from "@sonnat/ui/Row"; +import Column from "@sonnat/ui/Column"; +import Text from "@sonnat/ui/Text"; +import Code from "@sonnat/ui/Code"; +import Image from "components/Image"; +import Behaviour from "components/Behaviour"; +import Anatomy from "components/Anatomy"; +import AnchorButton from "components/AnchorButton"; +import WithTableOfContent from "components/layouts/WithTableOfContent"; +import Head from "next/head"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +export const meta = { + title: "بردکرام", + description: + "بردکرام یکی از کامپوننت‌های مهم راهبری، شامل مجموعه‌ای از لینک‌های راهنما است. این لینک‌ها برای کمک به کاربر در درک موقعیت فعلی خود در سایت و درک ساختار سلسله مراتبی آن کنار هم قرار گرفته‌اند. لینک‌های بردکرام با رعایت سلسه مراتب صفحات سایت، مسیری کاملاً مشخص برای کاربر فراهم می‌کند تا به صفحه یا صفحات لایه‌های بالاتر دسترسی داشته باشد.", + getLayout: () => page => + ( + + {page} + + ) +}; + + + {setTitleMeta(`${meta.title} | دیزاین سیستم سنّت`)} + {setDescriptionMeta(meta.description)} + {setCanonicalMeta(`${siteFullAddress}/components/Breadcrumb`)} + {setKeywordsMeta([...defaultKeywordsMetaContent, "breadcrumb", "بردکرام"])} + + +

    + {meta.title} + +

    + +

    + بردکرام + + * + یکی از کامپوننت‌های مهم راهبری، شامل مجموعه‌ای از لینک‌های راهنما است. این + لینک‌ها برای کمک به کاربر در درک موقعیت فعلی خود در سایت و درک ساختار سلسله مراتبی + آن کنار هم قرار گرفته‌اند. لینک‌های بردکرام با رعایت سلسه مراتب صفحات سایت، مسیری + کاملاً مشخص برای کاربر فراهم می‌کند تا به صفحه یا صفحات لایه‌های بالاتر دسترسی + داشته باشد. +

    + +

    + کاربرد + +

    + +

    + کامپوننت بردکرام اغلب در محصولاتی به‌کار می‌رود که به دلیل حجم زیاد محتوا + ساختار سلسه مراتبیِ عمیق (۳ یا بیش تر از ۳ لایه) دارند. در این محصولات بردکرام + موقعیت فعلی کاربر را در ساختار نشان می‌دهد و دسترسی او به لایه‌های بالاتر را + فراهم می‌کند. +
    + در محصولاتی با ساختار سلسله ‌مراتبی مسطح (عمقی کمتر از ۳ لایه) از بردکرام + استفاده نمی‌شود. +
    + بردکرام معمولاً بالا و در سمت راست صفحه، یعنی زیر هدر و بالای عنوان صفحه قرار + می‌گیرد. +

    + +

    + اجزای تشکیل‌دهندهٔ بردکرام + +

    + +

    + ۱. لینک: کاربر را به یک صفحهٔ والد (لایه‌‌ای بالاتر از صفحهٔ + فعلی) هدایت می‌کند. +
    + ۲. جدا کننده: لینک‌ها را از هم متمایز می‌کند. +
    + ۳. عنوان صفحهٔ فعلی: موقعیت فعلی کاربر را نشان می‌دهد. +

    + + + +
    +

    + +
    + +

    + انواع + +

    + +

    + بردکرام براساس موقعیت + +

    + +

    + بردکرام براساس موقعیت، رایج‌ترین نوع بردکرام است. این نوع بردکرام به کاربر کمک + می‌کند تا موقعیت فعلی خود را در سلسله ‌مراتب سایت درک کند. +

    + + + + + +

    + بردکرام براساس ویژگی + +

    + +

    + مسیری که این نوع بردکرام به کاربر نمایش می‌دهد بر پایهٔ محتوای صفحه‌ای است که + کاربر در حال بازدید است. هدف این نوع بردکرام مشخص‌کردن ویژگی‌های اصلی محتوایی‌ + است که کاربر بازدید کرده است. +
    + در محصولاتی که ساختار آن‌ها چند سلسله‌ای است (یعنی هر صفحه می‌تواند بیشتر از + یک والد داشته باشد) معمولاً از این نوع بردکرام استفاده می‌شود. برای این موارد + فقط یک مسیر را مشخص کنید و نمایش دهید. +

    + + + +
    +

    + +
    + +

    + آناتومی + +

    + +

    + اینجا می‌توانید ابعاد بردکرام، فاصله‌ها، حاشیه‌ها، اندازهٔ متن و حالت + چندمرحله‌ای و تک‌مرحله‌ای را ببینید. +

    + +
    + + +
    + +
    +
    + +
    + +
    +
    +
    +
    + +
    +

    + +
    + +

    + رفتار + +

    + +

    + در راهنمای زیر رفتار کامپوننت در کاربردهای مختلف دیزاین توضیح داده شده است. +

    + +
    + + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    +
    +
    + +
    +

    + +
    + + + *واژهٔ Breadcrumb برگرفته از داستان «هانسل و گرتل» است که کودکان داستان برای + جلوگیری از گم‌شدن در مسیری ناشناخته با ریختن خرده‌نان در راه، خرده‌راهنماهایی + برای مسیر بازگشت خود فراهم ‌کردند. با الهام از این داستان، بردکرام به کاربر + کمک می‌کند در محصول احساس سردرگمی نداشته باشد و موقعیت خود را در آن درک کند. + diff --git a/pages/components/Button.mdx b/pages/components/Button.mdx new file mode 100644 index 0000000..2e2df69 --- /dev/null +++ b/pages/components/Button.mdx @@ -0,0 +1,465 @@ +import Divider from "@sonnat/ui/Divider"; +import Row from "@sonnat/ui/Row"; +import Column from "@sonnat/ui/Column"; +import Code from "@sonnat/ui/Code"; +import Image from "components/Image"; +import ButtonDemo from "components/demos/ButtonDemo"; +import Behaviour from "components/Behaviour"; +import Anatomy from "components/Anatomy"; +import AnchorButton from "components/AnchorButton"; +import WithTableOfContent from "components/layouts/WithTableOfContent"; +import Head from "next/head"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +export const meta = { + title: "دکمه", + description: + "یکی از مهم‌ترین کامپوننت‌های تعاملی دکمه‌ها هستند که کاربران برای کُنش انجام‌دادن از آن استفاده می‌کنند. دکمه‌ها میان کاربر، سیستم و مسیر پیشِ ‌روی کاربران واسطه‌اند. واکنش دکمه‌ها در فشرده‌شدن باید واضح و دقیق احساس شود و به‌راحتی با یک لمس یا کلیک عمل کنند. نتیجهٔ عمل دکمه‌ها باید به‌سرعت دیده شود.", + getLayout: () => page => + ( + + {page} + + ) +}; + + + {setTitleMeta(`${meta.title} | دیزاین سیستم سنّت`)} + {setDescriptionMeta(meta.description)} + {setCanonicalMeta(`${siteFullAddress}/components/Button`)} + {setKeywordsMeta([...defaultKeywordsMetaContent, "button", "دکمه"])} + + +

    + {meta.title} + +

    + +

    دکمه‌ توپُر (Filled)، توخالی (Outlined)، متنی (Inlined)

    + +

    {meta.description}

    + +

    + دموی تعاملی + +

    + + + +

    + کاربرد + +

    + +

    + دکمه‌ها باید در جایی قرار بگیرند که کاربر به‌راحتی آن‌ها را پیدا کند یا جایی + باشند که کاربر انتظار دارد آنجا دکمه ببیند. دکمه‌ها می‌توانند در این‌ مکان‌ها + باشند: +

    + +
      +
    • انتهای فرم‌ها
    • +
    • دیالوگ‌های مُدال
    • +
    • دیالوگ‌ها
    • +
    • منوهای کناری و راهبری
    • +
    • نوار ابزارها
    • +
    + +

    + تمام کنش‌ها و حالت‌های مختلف دکمه مثل هاور، فوکوس و غیرفعال باید مشخص باشند، + دکمه‌ها باید میان عناصر دیگر به‌راحتی تشخیص داده شوند و اگر کاربر نتواند آن‌ها + را پیدا کند، متوجه وجود آن‌ها نخواهد شد. ازین بابت ویژگی‌های بصری خود دکمه + اهمیت بسیار دارند، فضای سفید اطراف دکمه می‌تواند در راحت یا دشوار پیدا کردن + دکمه تاثیر بگذارد. +

    + +

    + اولویت‌های کاربرد + +

    + +
      +
    • + دکمهٔ با درجهٔ اهمیت بالا (High-emphasis): برای تأکید و + نمایش اهمیت کنش اصلی، باید در چیدمان هر صفحهٔ رابط کاربر از دکمه‌ای با درجهٔ + اهمیت بالا استفاده شود. این دکمه یکتا است و در صورت همراهی با دکمه‌هایی با + درجهٔ اهمیت متوسط یا پایین، باید متمایز و برجسته باشد. +
    • +
    • + + دکمه‌های با درجهٔ اهمیت متوسط (Medium-emphasis) و درجهٔ اهمیت پایین + (Low-emphasis): + {" "} + در هر صفحهٔ رابط کاربر برای کنش‌هایی که نسبت به کنش اصلی اهمیت کمتری دارند، + با توجه به درجهٔ تأکید و اهمیت آن کنش، ازین دکمه‌ها استفاده می‌شود. دکمهٔ با + درجهٔ اهمیت پایین یا متوسط باید علاوه بر متمایز‌ بودن از دکمهٔ با درجهٔ + اهمیت بالا، اولویت سایر کنش‌های صفحه را نیز مشخص کند. مهم است زمانی که + دکمه‌هایی با درجهٔ اهمیت متفاوت کنار هم قرار می‌گیرند، هیچ‌کدام با وضعیت + غیرفعال دکمهٔ مجاورش اشتباه گرفته نشود. +
    • +
    + +
    + + +
    + +
    +
    + +
    + +
    +
    +
    +
    + +

    + دکمه با آیکون + +

    + +

    آیکون‌ها می‌توانند ابتدا یا انتهای دکمه قرار بگیرند.

    + +
      +
    • + دکمه با آیکون ابتدایی: همهٔ دکمه‌ها می‌توانند آیکون ابتدایی + داشته باشند تا کنش مربوط به خودشان را واضح‌تر ابراز کنند. توصیه می‌کنیم در + صورت امکان از آیکون‌های SVG و یا از آیکونْ فونتِ طراحی‌شده با قواعد سنّت + استفاده کنید. +
    • +
    • + دکمه با آیکون انتهایی: هنگامی که کنش دکمه در جهت مشخصی از + رابط کاربر اعمال می‌شود، می توان از آیکون‌هایی که این جهت را برای پیش‌آگاهی + کاربر نمایش می‌دهند، استفاده کرد. به عنوان مثال دکمه‌هایی که با فشردن آن‌ها + منوهای کشویی در جهتی مشخص باز می‌شوند. +
    • +
    + + + +

    + دکمه آیکون + +

    + +

    + دکمه‌ آیکون‌ها بیش‌تر در نوار ابزارها و منوهای راهبری استفاده می‌شوند و یا + موقعیت‌هایی که باید در حداقل فضای موجود، چند کنش مختلف را در رابط کاربر فراهم + کنید. +

    + + + +

    + انواع + +

    + +

    + دکمهٔ توپُر (Filled) + +

    + +

    + دکمه‌های توپر با کادری که رنگ زمینه دارد، مشخص می‌شوند و با ویژگی‌هایی نظیر + رنگ اصلی برند در زمینه و سایه‌دار شدن و ارتفاع‌گرفتن از سطح کلی زمینه، از سایر + دکمه‌ها متمایز می‌شوند. کنش با درجهٔ اهمیت بالا در صفحهٔ نمایش یا کنش اصلی در + کامپوننت‌های پیچیده باید به این دکمه‌ها اختصاص یابند. +

    + + + +

    + دکمهٔ توخالی (Outlined) + +

    + +

    + دکمه‌های توخالی رنگ زمینه ندارند، با دسنی نازک از محیط اطراف جدا می‌شوند و + شامل متنی ساده‌اند. این نوع دکمه‌ها برای محتوایی با درجهٔ اهمیت متوسط و پایین + بسیار مناسب‌اند تا آن‌جا که مخل تمرکز بر CTA اصلی نشوند. زیرا در حالت ایده‌آل + انتظار دارید کاربر ابتدا CTA اصلی را ببیند و بعد به دکمهٔ ثانویه توجه کند. + می‌توان با استفاده‌کردن یا نکردن رنگ برند در دسن و متن لیبل این دکمه‌ها میان + درجه اهمیت کنش‌های آن‌ها تمایز ایجاد کرد. +

    + + + +

    + دکمهٔ متنی (Inlined) + +

    + +

    + نداشتن رنگ زمینه قبل از هاور یا فوکوس‌کردن کاربر، این دکمه‌ها را از CTA اصلی + جدا می‌کند. این نوع از دکمه‌ها برای کنش‌هایی با درجه اهمیت پایین یا برای + بیش‌تر به‌چشم آمدن CTA اصلی بسیار مناسب‌اند. دکمه‌های متنی اغلب در + کامپوننت‌هایی مانند کارت یا دیالوگ‌ها استفاده می‌شوند زیرا آن‌ها مانند باقی + دکمه‌ها مرز مشخصی در لبه‌های خود ندارند و چون از محتوای مجاور دور نیستند، کم + شدنِ تمرکز روی محتوای مهم‌تر در کامپوننت اصلی را به حداقل می‌رسانند. +

    + + + +

    + آناتومی + +

    + +

    + اینجا می‌توانید ابعاد دکمه‌ها، فاصله‌ها، حاشیه‌ها و اندازهٔ متن و آیکون را در + موقعیت‌های نرمال و آیکون (ابتدایی/انتهایی)، در دو مقیاس متفاوت، ببینید. +

    + +
    + + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    +
    +
    + +
    +

    + +
    + +

    + رفتار + +

    + +

    + در راهنمای زیر رفتار کامپوننت در کاربردهای مختلف دیزاین توضیح داده شده است. +

    + +
    + + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    +
    +
    + +
    +

    + +
    + +

    + نگارش + +

    + +
      +
    • از علائم نگارشی در متن دکمه‌ها استفاده نکنید.
    • +
    • برای متن هر دکمه می‌توانید حداکثر ۴ کلمه بنویسید.
    • +
    diff --git a/pages/components/Chip.mdx b/pages/components/Chip.mdx new file mode 100644 index 0000000..ce102d4 --- /dev/null +++ b/pages/components/Chip.mdx @@ -0,0 +1,384 @@ +import Divider from "@sonnat/ui/Divider"; +import Row from "@sonnat/ui/Row"; +import Column from "@sonnat/ui/Column"; +import Code from "@sonnat/ui/Code"; +import Image from "components/Image"; +import ChipDemo from "components/demos/ChipDemo"; +import Behaviour from "components/Behaviour"; +import Anatomy from "components/Anatomy"; +import AnchorButton from "components/AnchorButton"; +import WithTableOfContent from "components/layouts/WithTableOfContent"; +import Head from "next/head"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +export const meta = { + title: "چیپس", + description: + "چیپس‌ها عناصری کم‌حجم و کوچک‌اند که اغلب در گروه‌های ۲تایی یا بیشتر کنار هم قرار می‌گیرند و فضای کمی را اشغال می‌کنند. چیپس‌ها انتخاب و فیلتر محتوا، تعیین و حذف دادهٔ ورودی و کنش را در رابط کاربر فراهم می‌کنند.", + getLayout: () => page => + ( + + {page} + + ) +}; + + + {setTitleMeta(`${meta.title} | دیزاین سیستم سنّت`)} + {setDescriptionMeta(meta.description)} + {setCanonicalMeta(`${siteFullAddress}/components/Chip`)} + {setKeywordsMeta([...defaultKeywordsMetaContent, "chip", "چیپس"])} + + +

    + {meta.title} + +

    + +

    چیپس‌ توپر (Filled) و توخالی (Outlined)

    + +

    {meta.description}

    + +

    + دموی تعاملی + +

    + + + +

    + کاربرد + +

    + +

    + چیپس‌ها ورود اطلاعات، انتخاب یک یا چند گزینه، فیلتر کردن محتوا یا شروع کنش را + برای کاربر میسر می‌کنند. در مقابلِ دکمه که تکی و ثابت در صفحه استفاده می‌شود، + چیپس‌ها در صورت نیاز در صفحه ظاهر شده و به شکل‌های زیر از آن‌ها استفاده + می‌شود: +

    + +

    + چیپس کنش‌پذیر (Action Chip) + +

    + +

    + برای کنش در محتوای اصلی،‌ چیپس‌های کنش‌پذیر به شکلی پویا در صفحه ظاهر می‌شوند + و می‌توانند به لینک تبدیل شوند. چیپس‌های کنش‌پذیر را می‌توان با دکمه‌ای ثابت + در صفحه جایگزین کرد. +

    + + + +

    + چیپس انتخابی (Choice Chip) + +

    + +

    + کاربر با استفاده از این کامپوننت می‌تواند بین تعدادی چیپس، یکی را انتخاب کند. + چیپس‌های انتخابی دو نوع تک ‌انتخابی و چند انتخابی دارند. +

    + +
      +
    • + چیپس‌های تک ‌انتخابی: جایگزین مناسبی برای منو‌های تک + ‌انتخابی، کلید‌های رادیویی و کلید‌های تاگل‌ هستند. +
    • +
    • + چیپس‌های چند ‌انتخابی: جایگزین مناسبی برای چک‌باکس‌ها هستند + و کاربر می‌تواند چند چیپس را انتخاب کند. +
    • +
    + + + +

    + چیپس حذف‌شونده (Removable Chip) + +

    + +

    + این کامپوننت داده‌های ورودی کاربر را به شکل چیپسی نمایش می‌دهد که کاربر در + صورت تمایل می‌تواند آن را حذف کند. +

    + + + +

    + چیپس‌های آیکون‌دار + +

    + +

    + آیکون‌ها در ابتدای چیپس‌ها قرار می‌گیرند. همهٔ چیپس‌ها می‌توانند آیکون داشته + باشند تا کنش مربوط به خودشان را واضح‌تر ابراز کنند. توصیه می‌کنیم در صورت + امکان از آیکون‌های SVG و یا از آیکون ‌فونت طراحی‌شده با قواعد سنّت استفاده + کنید. +

    + + + +

    + اولویت‌های کاربرد + +

    + +
      +
    • + چیپس با درجهٔ اهمیت بالا (High Emphasis): برای تأکید و + نمایش اهمیت کنش اصلی، باید در چیدمان هر صفحهٔ رابط کاربر از مجموعه چیپس‌هایی + با درجهٔ اهمیت بالا استفاده شود. +
    • +
    • + + چیپس با درجهٔ اهمیت متوسط (Medium Emphasis) و درجهٔ اهمیت پایین (Low + Emphasis): + {" "} + در هر صفحهٔ رابط کاربر برای کنش‌هایی که نسبت به کنش اصلی اهمیت کمتری دارند، + با توجه به درجهٔ تأکید و اهمیت آن کنش، از این چیپس‌ها استفاده می‌شود. +
    • +
    + +
    + + +
    + +
    +
    + +
    + +
    +
    +
    +
    + +
    +

    + +
    + +

    + انواع + +

    + +

    + چیپس توپر + +

    + +

    + چیپس‌های توپر با کادری که رنگ زمینه دارد مشخص و با داشتن رنگ اصلی برند در + زمینه، از سایر چیپس‌ها متمایز می‌شوند. این نوع چیپس‌ها برای محتوایی با درجهٔ + اهمیت بالا استفاده می‌شوند. +

    + + + +

    + چیپس توخالی + +

    + +

    + چیپس‌های توخالی رنگ زمینه ندارند، با دسنی نازک از محیط اطراف جدا می‌شوند و + شامل متنی ساده‌اند. این نوع چیپس‌ها برای محتوایی با درجهٔ اهمیت متوسط و پایین + مناسب‌اند. می‌توان با استفاده‌کردن یا نکردن رنگ برند در دسن و متن لیبل این + چیپس‌ها میان درجه اهمیت کنش‌های آن‌ها تمایز ایجاد کرد. +

    + + + +

    + آناتومی + +

    + +

    + اینجا می‌توانید ابعاد چیپس‌ها، فاصله‌ها، حاشیه‌ها و اندازهٔ متن و آیکون را در + موقعیت‌های معمولی، آیکون‌دار و حذف‌شونده ببینید. +

    + +
    + + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    +
    +
    + +
    +

    + +
    + +

    + رفتار + +

    + +

    + در راهنمای زیر رفتار کامپوننت در کاربردهای مختلف دیزاین توضیح داده شده است. +

    + +
    + + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    +
    +
    + +
    +

    + +
    + +

    + نگارش + +

    + +
      +
    • + برای متن چیپس انتخابی و حذف‌شونده حداکثر ۳ کلمه و برای متن چیپس کنش‌پذیر + حداکثر ۴ کلمه بنویسید. +
    • +
    • از علائم نگارشی در متن چیپس‌ها استفاده نکنید.
    • +
    diff --git a/pages/components/Divider.mdx b/pages/components/Divider.mdx new file mode 100644 index 0000000..20d2f92 --- /dev/null +++ b/pages/components/Divider.mdx @@ -0,0 +1,229 @@ +import Divider from "@sonnat/ui/Divider"; +import Row from "@sonnat/ui/Row"; +import Column from "@sonnat/ui/Column"; +import Code from "@sonnat/ui/Code"; +import Image from "components/Image"; +import Behaviour from "components/Behaviour"; +import Anatomy from "components/Anatomy"; +import AnchorButton from "components/AnchorButton"; +import WithTableOfContent from "components/layouts/WithTableOfContent"; +import Head from "next/head"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +export const meta = { + title: "جداکننده", + description: + "جداکننده خط باریک و یا نقاطی است که محتوای موجود در صفحه یا لیست را گروه‌بندی می‌کند.", + getLayout: () => page => + ( + + {page} + + ) +}; + + + {setTitleMeta(`${meta.title} | دیزاین سیستم سنّت`)} + {setDescriptionMeta(meta.description)} + {setCanonicalMeta(`${siteFullAddress}/components/Divider`)} + {setKeywordsMeta([...defaultKeywordsMetaContent, "divider", "جداکننده"])} + + +

    + {meta.title} + +

    + +

    + جداکننده‌ تمام صفحه (Full-bleed)، با فاصله (Inset)، عمودی (Vertical) و نقطه‌ای + (Dotted) +

    + +

    {meta.description}

    + +

    + کاربرد + +

    + +

    + جداکننده‌ها مانند کاربرد فضای سفید در رابط کاربر، برای جدا کردن و متمایز کردن + محتوا در گروه‌های مشخص استفاده می‌شوند. +

    + + + +

    + انواع + +

    + +

    + جداکنندهٔ تمام صفحه (Full-bleed divider) + +

    + +

    + جداکننده‌هایی که تمام عرض صفحه و یا نگه‌دارنده (Container) را در برمی‌گیرند. + از آن‌ها برای ایجاد بخش‌ها یا گروه‌های کاملاً مجزا در صفحه استفاده می‌شود. +

    + + + + + +

    + جدا کنندهٔ با فاصله (Inset divider) + +

    + +

    + جداکننده‌هایی که محتواهای مرتبط را از یکدیگر جدا می‌کنند و معمولاً در کارت‌ها + و یا منوهای کشویی با محتوای مرتبط استفاده می‌شوند. +

    + + + + + +

    + جداکنندهٔ عمودی (Vertical divider) + +

    + +

    + جداکننده‌هایی که برای مجزا کردن محتوا و یا کامپوننت‌هایی با چیدمان افقی + استفاده می‌شوند. ارتفاع این جداکننده از ارتفاع بلندترین جزء محتوایی که جدا + می‌کند و یا نگه‌دارنده‌ای که در آن قرار گرفته، بیشتر نیست اما با ضریب فواصل + تعریف‌شده در سنّت می‌تواند کوتاه‌تر باشد. +

    + + + + + +

    + جداکنندهٔ نقطه‌ای (Dotted divider) + +

    + +

    + جداکننده‌هایی که معمولاً برای ایجاد فاصله در محتوای متنی، پارگراف‌ها و + کامپوننت‌های متنی دیوار استفاده می‌شوند و از رفتار تایپوگرافی اجزایی که آن‌ها + را جدا کرده است، تبعیت می‌کنند. +

    + + + +
    +

    + +
    + +

    + رفتار + +

    + +

    + در راهنمای زیر رفتار کامپوننت در کاربردهای مختلف دیزاین توضیح داده شده است. +

    + +
    + + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    +
    +
    diff --git a/pages/components/InputSlider.mdx b/pages/components/InputSlider.mdx new file mode 100644 index 0000000..fb79496 --- /dev/null +++ b/pages/components/InputSlider.mdx @@ -0,0 +1,343 @@ +import Divider from "@sonnat/ui/Divider"; +import Row from "@sonnat/ui/Row"; +import Column from "@sonnat/ui/Column"; +import Code from "@sonnat/ui/Code"; +import Image from "components/Image"; +import InputSliderDemo from "components/demos/InputSliderDemo"; +import Behaviour from "components/Behaviour"; +import Anatomy from "components/Anatomy"; +import AnchorButton from "components/AnchorButton"; +import WithTableOfContent from "components/layouts/WithTableOfContent"; +import Head from "next/head"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +export const meta = { + title: "اسلایدر محدوده", + description: "اسلایدر محدوده انتخاب مقدار یا بازه‌ای مشخص را فراهم می‌کند.", + getLayout: () => page => + ( + + {page} + + ) +}; + + + {setTitleMeta(`${meta.title} | دیزاین سیستم سنّت`)} + {setDescriptionMeta(meta.description)} + {setCanonicalMeta(`${siteFullAddress}/components/InputSlider`)} + {setKeywordsMeta([ + ...defaultKeywordsMetaContent, + "InputSlider", + "اسلایدر محدوده" + ])} + + +

    + {meta.title} + +

    + +

    اسلایدر پیوسته (Continuous) و گسسته (Discrete)

    + +

    {meta.description}

    + +

    + دموی تعاملی + +

    + + + +

    + کاربرد + +

    + +

    + نوار اسلایدر محدوده‌ای از مقادیر را مشخص می‌کند که می‌تواند انتخاب مقدار معین + یا طیفی از آن محدوده را برای کاربر فراهم کند. +
    + زمانی که انتخاب محدوده و یا مقدار نسبی از تعیین مقدار دقیق اهمیت بیشتری داشته + باشد، از اسلایدر استفاده می‌شود. (به طور مثال در اسلایدر صدا، بلندی نسبی بیشتر + از سطح دسیبل اهمیت دارد.) +
    + در غیر این صورت، زمانی که لازم باشد کاربر مقدار دقیق عددی وارد کند، از فیلد + متنی استفاده می‌شود. اسلایدرها برای تنظیماتی مانند صدا و روشنایی و یا برای + اعمال فیلترهای عکس ایده‌آل‌اند. +
    + تغییرات جابجایی اسلایدر در لحظه و بعد از کنش کاربر با کامپوننت اتفاق می‌افتد و + همزمان با تغییر تنظیمات اسلایدر کاربر باید بتواند تاثیرات آن‌ را ببیند. +
    + برای تعیین عدد مشخص از اسلایدر گسسته و در غیر این صورت از اسلایدر پیوسته + استفاده می‌شود. +

    + +

    + اسلایدر یک‌جهته + +

    + +

    برای کم یا زیاد کردن مقداری بیشینه از اسلایدر یک‌جهته استفاده می‌شود.

    + + + + + +

    + اسلایدر دو‌جهته + +

    + +

    برای انتخاب مقداری کمینه یا بیشینه‌ از اسلایدر دو‌جهته استفاده می‌شود.

    + + + + + +

    + رفتار تعاملی اسلایدر دو‌جهته + +

    + +

    + در اسلایدر دوجهته هرکدام از دسته‌های تعیین‌کنندهٔ مقدار بیشینه و کمینه، بازهٔ + حرکتی دستهٔ دیگر را محدود می‌کنند. در محدودترین حالت ممکن بیشینه و کمینهٔ + محدودهٔ تعیین‌شده برهم منطبق می‌شوند. +

    + + + +
    +

    + +
    + +

    + انواع + +

    + +

    + اسلایدر پیوسته + +

    + +

    این کامپوننت برای تنظیم و انتخاب مقداری نسبی از یک محدوده استفاده می‌شود.

    + + + + + +

    + اسلایدر گسسته + +

    + +

    + این کامپوننت برای تنظیم مقادیری مشخص (با ارجاع به نشانگر آن مقدار) مناسب‌اند. + مقادیر مجاز و تعیین‌شدنی با علامت‌هایی روی نوار اسلایدر نشان داده می‌شوند و با + انتخاب هر کدام از این مقادیر، دستهٔ اسلایدر به آن‌ می‌چسبد. +

    + + + +
    +

    + +
    + +

    + آناتومی + +

    + +

    اینجا می‌توانید ابعاد بخش‌های مختلف اسلایدرها را ببینید.

    + +
    + + +
    + +
    +
    + +
    + +
    +
    +
    +
    + +
    +

    + +
    + +

    + رفتار + +

    + +

    + در راهنمای زیر رفتار کامپوننت در کاربردهای مختلف دیزاین توضیح داده شده است. +

    + +
    + + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    +
    +
    diff --git a/pages/components/InputStepper.mdx b/pages/components/InputStepper.mdx new file mode 100644 index 0000000..f734369 --- /dev/null +++ b/pages/components/InputStepper.mdx @@ -0,0 +1,187 @@ +import Divider from "@sonnat/ui/Divider"; +import Row from "@sonnat/ui/Row"; +import Column from "@sonnat/ui/Column"; +import Code from "@sonnat/ui/Code"; +import Image from "components/Image"; +import Behaviour from "components/Behaviour"; +import Anatomy from "components/Anatomy"; +import AnchorButton from "components/AnchorButton"; +import WithTableOfContent from "components/layouts/WithTableOfContent"; +import Head from "next/head"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +export const meta = { + title: "فیلد پله‌ای", + description: + "در فیلد پله‌ای می‌توان مقادیر عددی را در بازه‌هایی مشخص و با فواصل یکسان وارد کرد.", + getLayout: () => page => + ( + + {page} + + ) +}; + + + {setTitleMeta(`${meta.title} | دیزاین سیستم سنّت`)} + {setDescriptionMeta(meta.description)} + {setCanonicalMeta(`${siteFullAddress}/components/InputStepper`)} + {setKeywordsMeta([ + ...defaultKeywordsMetaContent, + "input stepper", + "stepper", + "فیلد پله‌ای" + ])} + + +

    + {meta.title} + +

    + +

    {meta.description}

    + +

    + کاربرد + +

    + +

    + فیلدهای پله‌ای درکنار فیلدهای متنی وارد ‌کردن مقادیر عددی را با این شرایط برای + کاربر فراهم می‌کنند: +

    + +
      +
    • بیشینه و کمینهٔ مقدار ورودی در نظر گرفته شده باشد.
    • +
    • + بازهٔ این مقدار زیاد نباشد و تغییرات این بازه با تعداد کمی کلیک امکان‌پذیر + باشد. +
    • +
    • اعداد ورودی صحیح باشند.
    • +
    • مقدار پیش‌فرضی در این فیلد قرار داده شود.
    • +
    + +

    + اجزای تشکیل‌دهندهٔ فیلد پله‌ای + +

    + +

    فیلدهای پله‌ای از ۳ بخش تشکیل می‌شوند:

    + +
      +
    • + دو بخش کنترل‌کننده که افزایش و کاهش تدریجی و یکنواخت مقدار درون نگه‌دارنده + را فراهم می‌کنند. +
    • +
    • + بخش میانی که نگه‌دارندهٔ مقدار ورودی است. این بخش با متن شبحی که معمولاً + نشان‌دهندهٔ مقدار کمینهٔ فیلد است نمایش‌داده می‌شود. +
    • +
    + + + +
    +

    + +
    + +

    + آناتومی + +

    + +

    + اینجا می‌توانید ابعاد فیلد پله‌ای، فاصله‌ها، حاشیه‌ها، اندازهٔ متن را ببینید. +

    + +
    + + +
    + +
    +
    +
    +
    + +
    +

    + +
    + +

    + رفتار + +

    + +

    + در راهنمای زیر رفتار کامپوننت در کاربردهای مختلف دیزاین توضیح داده شده است. +

    + +
    + + +
    + +
    +
    + +
    + +
    +
    +
    +
    diff --git a/pages/components/Progress.mdx b/pages/components/Progress.mdx new file mode 100644 index 0000000..15b7c32 --- /dev/null +++ b/pages/components/Progress.mdx @@ -0,0 +1,343 @@ +import Divider from "@sonnat/ui/Divider"; +import Row from "@sonnat/ui/Row"; +import Column from "@sonnat/ui/Column"; +import Code from "@sonnat/ui/Code"; +import Image from "components/Image"; +import Behaviour from "components/Behaviour"; +import Anatomy from "components/Anatomy"; +import AnchorButton from "components/AnchorButton"; +import WithTableOfContent from "components/layouts/WithTableOfContent"; +import Head from "next/head"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +export const meta = { + title: "نشانگرِ پیشرفت", + description: + "نشانگر پیشرفت مدت زمان مشخص یا نامشخصی را که باید برای انجام‌شدن یک فرایند منتظر ماند، نمایش می‌دهد.", + getLayout: () => page => + ( + + {page} + + ) +}; + + + {setTitleMeta(`${meta.title} | دیزاین سیستم سنّت`)} + {setDescriptionMeta(meta.description)} + {setCanonicalMeta(`${siteFullAddress}/components/Progress`)} + {setKeywordsMeta([ + ...defaultKeywordsMetaContent, + "progress", + "indicator", + "progress indicator", + "نشانگرِ پیشرفت", + "نشانگر پیشرفت" + ])} + + +

    + {meta.title} + +

    + +

    + نشانگر پیشرفت خطی (Linear)، دایره‌ای (Circular)، نقطه‌ای (Dotted) +

    + +

    {meta.description}

    + +

    + کاربرد + +

    + +

    + نشانگرهای پیشرفت وضعیت کنشی در حال انجام‌شدن، بارگذاری، دریافت یا تأیید + اطلاعات و یا ذخیره‌کردن به‌روزرسانی را نشان می‌دهند. این نشانگرها بیشتر در + صفحاتی حاوی فرم‌ها و یا المان‌های ارسال‌کنندهٔ اطلاعات استفاده می‌شوند. +

    + +

    + مشخص (Determinate) + +

    + +

    + نشانگر مشخص زمانی استفاده می‌شود که طول انجام‌شدن فرآیند معلوم باشد. +
    + فرآیندهایی مانند دریافت اطلاعات، بارگذاری اطلاعات و انجام برخی تنظیمات خودکار + هنگام شروع برنامه از این نوع‌اند. +

    + + + +

    + نامشخص (Indeterminate) + +

    + +

    + نشانگر نامشخص زمانی استفاده می‌شود که طول انجام‌شدن فرآیند تخمین‌زدنی نبوده و + یا نیازی به نمایش آن نباشد. این کامپوننت نشان‌دهندهٔ مدت زمان نامعلومی از + انتظار است. +

    + + + +

    + بارگذاری صفحه (Page Progress) + +

    + +

    برای نمایش بارگذاری صفحه‌ای کامل از نشانگرهای خطی استفاده می‌شود.

    + + + +

    + بارگذاری بخش (Section Progress) + +

    + +

    + برای نمایش بارگذاری بخشی از صفحه، می‌توان از نشانگرهای خطی و هم از نشانگرهای + دایره‌ای استفاده کرد. ولی استفاده از نوع دایره‌ای پیشنهاد می‌شود. +

    + + + +

    + انواع + +

    + +

    + خطی + +

    + +

    + نشانگرهایِ پیشرفتِ خطی برای فرآیندهایی مانند دریافت اطلاعات، بارگذاری، + نشان‌دادن زمان انجام‌شدن کنش و... استفاده می‌شوند. آن‌ها می‌توانند نماینده‌ی + فرایند‌های مشخص و نامشخص باشند. +

    + + + +

    + دایره‌ای + +

    + +

    + نشانگرهایِ پیشرفتِ دایره‌ای مانند نشانگرهای خطی، روند انجام عملیات سیستمی + مانند دریافت اطلاعات، بارگذاری اطلاعات، انجام محاسبات و غیره را نشان می‌دهند و + می‌توانند نمایندهٔ فرایند‌های مشخص و نامشخص باشند. +
    + نشانگرهای دایره‌ای نسبت به نشانگرهای خطی فضای کمتری اشغال می‌کنند و برای + استفاده در فضاهای محدود مناسب‌اند. +

    + + + +

    + نقطه‌ای + +

    + +

    + نشانگرهایِ پیشرفتِ نقطه‌ای فقط برای فرایندهای نامشخص استفاده می‌شوند و ۲ حالت + دارند: +

    + +
      +
    • + ارسال: از این نوع نشانگر برای بارگذاری اطلاعات مانند + ثبت‌کردن فرم‌ها استفاده می‌شود. +
    • +
    • + انتظار: این نشانگر اغلب برای نمایش زمان انتظار بارگیری + اطلاعات استفاده می‌شود. +
    • +
    + + + +
    +

    + +
    + +

    + آناتومی + +

    + +

    اینجا می‌توانید ابعاد و مشخصه‌های نشانگرهای پیشرفت را ببینید.

    + +
    + + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    +
    +
    + +
    +

    + +
    + +

    + رفتار + +

    + +

    + در راهنمای زیر رفتار کامپوننت در کاربردهای مختلف دیزاین توضیح داده شده است. +

    + +
    + + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    +
    +
    diff --git a/pages/components/Select.mdx b/pages/components/Select.mdx new file mode 100644 index 0000000..2ae1dba --- /dev/null +++ b/pages/components/Select.mdx @@ -0,0 +1,394 @@ +import Divider from "@sonnat/ui/Divider"; +import Row from "@sonnat/ui/Row"; +import Column from "@sonnat/ui/Column"; +import Code from "@sonnat/ui/Code"; +import Image from "components/Image"; +import SelectDemo from "components/demos/SelectDemo"; +import Behaviour from "components/Behaviour"; +import Anatomy from "components/Anatomy"; +import AnchorButton from "components/AnchorButton"; +import WithTableOfContent from "components/layouts/WithTableOfContent"; +import Head from "next/head"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +export const meta = { + title: "فیلد انتخابی", + description: + "در فیلد انتخابی کاربر می‌تواند یک یا چند گزینه را از میان گزینه‌های نمایش‌داده‌شده انتخاب کند.", + getLayout: () => page => + ( + + {page} + + ) +}; + + + {setTitleMeta(`${meta.title} | دیزاین سیستم سنّت`)} + {setDescriptionMeta(meta.description)} + {setCanonicalMeta(`${siteFullAddress}/components/Select`)} + {setKeywordsMeta([...defaultKeywordsMetaContent, "select", "فیلد انتخابی"])} + + +

    + {meta.title} + +

    + +

    فیلد انتخابی توپُر (Filled) و توخالی (Outlined)

    + +

    {meta.description}

    + +

    + دموی تعاملی + +

    + + + +

    + کاربرد + +

    + +

    + فیلد انتخابی یکی از انواع فیلدهای ورودی است که انتخاب یک یا چند گزینه را از + میان گزینه‌های نمایش‌داده‌شده فراهم می‌کند. فیلد انتخابی دارای ۲ کاربرد اصلی + است: +

    + +
      +
    • + در فرم‌ها مانند فیلد متنی، تعامل با آن منجر به کنش نمی‌شود و معمولاً وابسته + به یک عمل ثانویه است. (مثل استفاده از دکمهٔ تأیید یا ارسال) +
    • +
    • + مجموعه‌ای از گزینه‌ها که انتخاب آن‌ها باعث واکنش صفحه می‌شود، مانند + گزینه‌های مرتب‌سازی. +
    • +
    + +

    + تفاوت با منوی کشویی (Dropdown Menu) + +

    + +

    + منوی کشویی حالتی از نمایش گزینه‌ها است که به شکل شناور زیر فیلد ورودی ظاهر + می‌شود. منوی کشویی می‌تواند مستقل از فیلد انتخابی استفاده شود، برای مثال منوی + کشویی در فیلد جستجو براساس جستجوهای قبلی یا پرتکرار کلماتی را به کاربر پیشنهاد + می‌دهد. +

    + + + +

    + لیبل + +

    + +

    + متن شفاف و موثری که کاربران را برای انتخاب گزینه مورد نظرشان راهنمایی می‌کند. + اگر انتهای لیبل نشانهٔ «*» استفاده شده باشد، کاربر متوجه می‌شود پر کردن آن + فیلد الزامی است. +
    + در شرایطی که لازم باشد در فضای عمودی رابط کاربر صرفه‌جویی شود، با تأیید + کارشناس دسترس‌پذیری، لیبل می‌تواند حذف شود. طول لیبل نباید از یک خط بیشتر شود. +

    + + + +

    + متن شبح (Placeholder) + +

    + +

    + زمانی که فیلد خالی باشد این متن به کاربر نمایش داده می‌شود و معمولاً با سرنخی + که به کاربر می‌دهد، انتخاب گزینهٔ مورد نظرش را راحت‌تر می‌کند. +

    + + + +

    + متن راهنما + +

    + +

    + متنی که توضیحات کامل‌تری به کاربران می‌دهد تا بتوانند اطلاعات درست را در فیلد + متنی وارد کنند. متن راهنما تا زمانی که فیلد در وضعیت خطا نباشد، در جای خود + ثابت است و در صورت بروز خطا، متن راهنما با متن خطای فیلد متنی جایگزین می‌شود. +

    + + + +

    + منوی کشویی + +

    + +

    + این منو به شکل شناور در زیر فیلد انتخابی ظاهر می‌شود و شامل تعدادی گزینه‌ است. + اگر گزینه‌ها زیاد باشند، ارتفاع این منو به ۹.۵ گزینه محدود می‌شود (فقط ۹ و + نیمی از گزینهٔ ۱۰ام را نمایش می‌دهد) اما در انتهای لیست از محوکننده‌ای (fader) + استفاده می‌شود تا کاربر متوجه وجود گزینه‌های دیگر بشود. +

    + + + + + +

    + گزینه‌ها + +

    + +

    + مجموعه‌ای از سطرها که گزینه‌های منوی کشویی را نشان می‌دهد. این گزینه‌ها به شکل + متنی نمایش داده می‌شوند و در فارسی به راست هم‌ترازند. توصیه می‌شود برای نمایش + گزینه‌های زیاد ترتیبی انتخاب کنید.(مثلاً به‌ترتیب حروف الفبا یا از کم به زیاد) + ماهیت گزینه‌ها باید همگن و نتیجه‌محور باشد. +
    + گزینه‌ها در یک عمق می‌توانند دسته‌بندی‌ای با عناوینِ مشخص داشته باشند.(عناوین + را نمی‌شود انتخاب کرد.) +
    + از عکس و آیکون‌های تزیینی در گزینه‌های فیلد انتخابی استفاده نکنید. +
    + متن گزینه‌ها می‌تواند چند خط باشد و نباید بریده یا خلاصه‌شده نشان داده شود. +

    + + + +

    + فیلد جستجو + +

    + +

    + اگر تعداد گزینه‌ها زیاد است بهتر است ابتدای منوی کشویی از فیلد متنی جستجو + استفاده کنید تا گزینه‌ها برای کاربر خلاصه شوند و کاربر بتواند گزینهٔ مورد نظر + خود را راحت‌تر انتخاب کند. +
    + با بازشدن منوی کشویی، فوکوس کیبورد روی فیلد جستجو قرار می‌گیرد. +
    + فیلد جستجو را با فیلد انتخابی ادغام نکنید. +

    + + + + + +

    + دکمهٔ حذفِ گزینهٔ انتخاب‌شده + +

    + +

    + این دکمه در فیلدهای تک ‌انتخابی استفاده می‌شود و انتخاب کاربر را حذف می‌کند، + اما منوی کشویی را باز نمی‌کند. +

    + + + +

    + پسوند متنی + +

    + +

    + در فیلد انتخابی پسوندها سمت چپ در انتهای محل ورود اطلاعات و قبل از آیکون + انتهایی می‌آیند. پسوندها معمولاً واحد اطلاعات ورودی را مشخص می‌کنند مانند واحد + پولی. +

    + + + +

    + چیپس حذف‌شونده + +

    + +

    + در کامپوننت چند انتخابی گزینه‌ها درون فیلد به شکل چیپس نمایش داده می‌شوند و با + زدن آیکون حذف چیپس می‌توان آن‌ها را پاک کرد. +

    + + + +
    +

    + +
    + +

    + انواع + +

    + +
      +
    • + فیلد انتخابی توپر +
    • +
    • + فیلد انتخابی توخالی +
    • +
    + +

    + هر دو نوع از فیلدهای انتخابی عملکرد مشابهی دارند. در انتخاب نوع فیلد انتخابی + به استایل بصری رابط کاربر توجه کنید و دقت کنید فیلد انتخابی از باقی + کامپوننت‌های موجود در محتوا متمایز باشد. +

    + + + +

    + رفتار + +

    + +

    + در راهنمای زیر رفتار کامپوننت در کاربردهای مختلف دیزاین توضیح داده شده است. +

    + +
    + + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    +
    +
    + +
    +

    + +
    + +

    + نگارش + +

    + +
      +
    • + برای لیبل جملات سوالی ننویسید. همچنین لیبل‌ها نباید جمله کامل باشند، مثلا به + جای کجا هستید؟ بگویید: مکان یا محله +
    • +
    • در لیبل‌ها و گزینه‌ها از علائم نگارشی استفاده نکنید.
    • +
    • متن لیبل نباید از ۳ کلمه بیشتر شود.
    • +
    diff --git a/pages/components/SwitchControls.mdx b/pages/components/SwitchControls.mdx new file mode 100644 index 0000000..3bd2f63 --- /dev/null +++ b/pages/components/SwitchControls.mdx @@ -0,0 +1,335 @@ +import Divider from "@sonnat/ui/Divider"; +import Row from "@sonnat/ui/Row"; +import Column from "@sonnat/ui/Column"; +import Code from "@sonnat/ui/Code"; +import Image from "components/Image"; +import Behaviour from "components/Behaviour"; +import Anatomy from "components/Anatomy"; +import AnchorButton from "components/AnchorButton"; +import WithTableOfContent from "components/layouts/WithTableOfContent"; +import Head from "next/head"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +export const meta = { + title: "کنترل‌های‌ انتخاب", + description: + "کنترل‌های انتخابی امکان انتخاب از میان یک یا چند گزینهٔ ممکن را فراهم می‌کنند.", + getLayout: () => page => + ( + + {page} + + ) +}; + + + {setTitleMeta(`${meta.title} | دیزاین سیستم سنّت`)} + {setDescriptionMeta(meta.description)} + {setCanonicalMeta(`${siteFullAddress}/components/SwitchControls`)} + {setKeywordsMeta([ + ...defaultKeywordsMetaContent, + "switch", + "checkbox", + "دکمه رادیویی", + "چک‌باکس‌", + "کلید" + ])} + + +

    + {meta.title} + +

    + +

    + دکمه‌‌ رادیویی (Radio button)، ‌چک‌باکس‌ (Checkbox) و کلید (Switch) +

    + +

    {meta.description}

    + +

    + کاربرد + +

    + +

    + این کامپوننت‌ها انتخاب گزینه‌ها و یا خاموش و روشن کردن تنظیمات و تغییر + وضعیت‌های موجود در محصول را میسر می کنند. مانند فعال یا غیرفعال‌کردن ویبره در + صفحهٔ تنظیمات. +
    + بهتر است کنترل‌های انتخاب همیشه لیبل متنی داشته باشند. لیبل متن شفاف و موثری + است که کاربران را برای وارد کردن اطلاعات درست در فیلد متنی راهنمایی می‌کند. + اگر کنترل‌های انتخاب لیبل متنی نداشته باشند باید رابطهٔ آنها با کامپوننت + مربوطشان به‌وضوح مشخص باشد. +

    + + + +

    + انواع + +

    + +

    + دکمهٔ رادیویی (Radio button) + +

    + +

    + دکمه‌های رادیویی امکان انتخاب یک گزینه را از میان مجموعه‌ای از گزینه‌ها فراهم + می‌کند. زمانی که لازم باشد کاربر تمام گزینه‌های موجود را ببیند اما فقط یکی از + آن‌ها را انتخاب کند، از این کامپوننت استفاده می‌شود. +

    + + + + + +

    + چک‌باکس (Checkbox) + +

    + +

    + چک‌باکس‌ها امکان انتخاب یک یا چند گزینه را فراهم می‌کنند. همچنین از چک‌باکس‌ها + برای روشن و خاموش کردن وضعیت‌ها در حالت دسکتاپ نیز استفاده می‌شود. +
    + چک‌باکس‌های والد و فرزندی: چک‌باکس‌های والد و فرزندی زمانی + استفاده می‌شوند که لیستی از گزینه‌های اصلی و فرعی وجود داشته باشد. +
    + وقتی چک‌باکس‌ والد فعال شود همهٔ فرزند‌های آن نیز فعال می‌شوند و وقتی چک‌باکس + والد غیرفعال باشد همهٔ فرزند‌های آن نیز غیرفعال می‌شوند. اگر بعضی از + چک‌باکس‌های فرزندان فعال و بعضی از آن‌ها غیرفعال باشند، چک‌باکس‌ والد به حالت + نامشخص (Indeterminate) تبدیل می‌شود. +

    + + + + + +

    + کلید (Switch) + +

    + +

    + کلیدها وضعیت یک المان را روشن یا خاموش می کنند. آنها بهترین روش برای مشخص کردن + «مفهوم» تنظیمات درمحصول‌اند. +

    + + + +
    +

    + +
    + +

    + آناتومی + +

    + +

    + اینجا می‌توانید ابعاد و مشخصه‌های دکمه‌های رادیویی، چک‌باکس‌ها و کلید‌ها را + ببینید. +

    + +
    + + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    +
    +
    + +
    +

    + +
    + +

    + رفتار + +

    + +

    + در راهنمای زیر رفتار کامپوننت در کاربردهای مختلف دیزاین توضیح داده شده است. +

    + +
    + + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    +
    +
    diff --git a/pages/components/TabBar.mdx b/pages/components/TabBar.mdx new file mode 100644 index 0000000..cdea21e --- /dev/null +++ b/pages/components/TabBar.mdx @@ -0,0 +1,485 @@ +import Divider from "@sonnat/ui/Divider"; +import Row from "@sonnat/ui/Row"; +import Column from "@sonnat/ui/Column"; +import Code from "@sonnat/ui/Code"; +import Image from "components/Image"; +import TabBarDemo from "components/demos/TabBarDemo"; +import Behaviour from "components/Behaviour"; +import Anatomy from "components/Anatomy"; +import AnchorButton from "components/AnchorButton"; +import WithTableOfContent from "components/layouts/WithTableOfContent"; +import Head from "next/head"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +export const meta = { + title: "نوار تب", + description: + "نوار تب برای طبقه‌بندی و گروه‌بندی محتوا و دسته‌ای از اطلاعات مشابه در صفحه‌ها و نماهای مختلف استفاده می‌شود. نوار تب برای راهبری سریع کاربر بین محتوا شامل دو یا چند تب می‌شود، محتوای مربوط به هر تب را با انتخاب کردن آن تب می‌توان جداگانه دید.", + getLayout: () => page => + ( + + {page} + + ) +}; + + + {setTitleMeta(`${meta.title} | دیزاین سیستم سنّت`)} + {setDescriptionMeta(meta.description)} + {setCanonicalMeta(`${siteFullAddress}/components/TabBar`)} + {setKeywordsMeta([ + ...defaultKeywordsMetaContent, + "tab bar", + "tabs", + "تب", + "نوار تب" + ])} + + +

    + {meta.title} + +

    + +

    {meta.description}

    + +

    + دموی تعاملی + +

    + + + +

    + کاربرد + +

    + +

    + تب‌ها با طبقه‌بندی اطلاعات، کاربر را بین دسته‌هایی از محتواهای مرتبط و هم‌سطح + راهبری می‌کنند. +

    + +

    + مجموعهٔ تب‌‌ها + +

    + +

    + محتوای هر تب باید از بقیهٔ تب‌های مجموعه مجزا باشد و هر تب دسته‌ای از اطلاعات + مرتبط را معرفی کند. مثلاً برای نمایش دسته‌بندی‌های آگهی‌‌ مانند املاک، وسایل + نقلیه، لوازم الکترونیکی و ... می‌توان از نوار تب استفاده کرد. +

    + + + +

    + نوار تب اسکرول‌شدنی + +

    + +

    + افقی اسکرول می‌شود و عرض آن به نگه‌دارندهٔ والد (Parent Container) وابسته + (Relative) است. به همین دلیل رابط کاربر براساس نیازِ محصول می‌تواند تعداد + نامحدودی تب داشته باشد. اگر تب‌ها زیاد باشند یا عرض نگه‌دارنده کم باشد، بعضی + از تب‌ها در عرض نگه‌دارندهٔ والد جا نمی‌شوند. در این حالت عرض تب‌ها کم و فشرده + و یا بخشی از تب یا کل تب مخفی (Hide) می‌شود. محوکننده (Fader) مخفی‌شدنِ تب را + در نوار تب اسکرول‌شدنی میسر می‌کند تا کاربر از اسکرولی‌بودن نوار تب آگاه شود. + تب‌های نوار تب اسکرول‌شدنی می‌توانند لیبل‌های عریض‌تری داشته باشند که هیچ‌گاه + بریده یا خلاصه نمی‌شوند. استفادهٔ آن‌ها در دستگاه‌هایی با رابط لمسی یکی از + مفیدترین کاربردهای نوار تب اسکرول‌شدنی است. +

    + + + + + +

    + محوکننده با فلش + +

    + +

    + این محوکننده‌ها با گرادیان سفیدی که دو فلش در سمت چپ و راست نوار تب دارد، + کاربر را از اسکرولی‌بودن آن آگاه می‌کنند. +

    + + + +

    + نوار تب با عرض کامل + +

    + +

    + در نوار تب با عرض کامل همهٔ تب‌ها در یک نما نشان داده می‌شوند. عرض تب‌ها ثابت + است و هیچ تبی مخفی نمی‌شود. همچنین عرض نوار تب وابسته به نگه‌دارندهٔ والد است. +
    + تب‌های این کامپوننت در حالت معمولی به وسط ‌چین و یا راست‌چین (در چیدمان زبان + فارسی) هم‌ترازند، و در حالت سیال (Fluid) در عرض نوار تب گسترده می‌شوند. +

    + + + + + +

    + تب آیکون (تب بدون متن) + +

    + +

    برای استفاده از تب آیکون (تب بدون متن) در نوار تب این ۳ شرط لازم است:

    + +
      +
    • فضای استفاده از تب محدود باشد.
    • +
    • دسترسی‌پذیری آیکون‌ها (pictogram) بررسی و تأیید شده باشد.
    • +
    • کاربر مفهوم آیکون را در محصول متوجه شود.
    • +
    + + + + + +

    + نشان‌گر (Indicator) تب فعال + +

    + +

    + برای تمایز میان تب فعال و غیرفعال از نشانگر خطی با رنگ برند استفاده می‌کنیم که + زیر تب فعال قرار می‌گیرد. همچنین لیبل متنی و آیکون تب فعال نیز با رنگ برند از + تب‌های غیرفعال متمایز می‌شوند. +

    + + + +

    + لیبل متنی + +

    + +

    + لیبل متنی باید خلاصه و واضح محتوایی را که نشان می‌دهد، توصیف کند. محتوای تب‌ + باید مجموعه‌ای منسجم از داده‌هایی با ویژگی‌های مشترک باشد. +
    + متن لیبل‌ تب نباید هیچگاه ۲ خط ‌شود. پیشنهاد می‌کنیم برای لیبل‌هایی با متن + طولانی، از نوار تب با اسکرول افقی استفاده کنید تا متن لیبل به‌راحتی خوانده + شود. +

    + + + +

    + تب آیکون‌دار + +

    + +

    + تب‌ها برای ایجاد ارتباط بهتر با محتوا می‌توانند آیکون داشته باشند. آیکون‌ها + نوع محتوای تب را ساده و مشخص به کاربر منتقل می‌کنند، اگرچه به اندازهٔ لیبل‌های + متنی در انتقال محتواهای پیچیده موثر نیستند. +
    + تب‌ها می‌توانند ترکیبی از آیکون و متن (تب آیکون‌دار) باشند. +

    + + + +

    + آناتومی + +

    + +

    + اینجا می‌توانید ابعاد تب‌های درون نوار تب، فاصله‌ها، حاشیه‌ها و اندازهٔ متن و + آیکون آن‌ها را در حالت‌های مختلف ببینید. +

    + +
    + + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    +
    +
    + +
    +

    + +
    + +

    + رفتار + +

    + +

    + در راهنمای زیر رفتار کامپوننت در کاربردهای مختلف دیزاین توضیح داده شده است. +

    + +
    + + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    +
    +
    + +
    +

    + +
    + +

    + نگارش + +

    + +
      +
    • + وقتی از نوار تب با عرض کامل استفاده می‌کنید از نمایش درست محتوای تب‌ها در + سایز موبایل مطمئن شوید. +
    • +
    diff --git a/pages/components/Tag.mdx b/pages/components/Tag.mdx new file mode 100644 index 0000000..5d563a8 --- /dev/null +++ b/pages/components/Tag.mdx @@ -0,0 +1,262 @@ +import Divider from "@sonnat/ui/Divider"; +import Row from "@sonnat/ui/Row"; +import Column from "@sonnat/ui/Column"; +import Code from "@sonnat/ui/Code"; +import Image from "components/Image"; +import TagDemo from "components/demos/TagDemo"; +import Behaviour from "components/Behaviour"; +import Anatomy from "components/Anatomy"; +import AnchorButton from "components/AnchorButton"; +import WithTableOfContent from "components/layouts/WithTableOfContent"; +import Head from "next/head"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +export const meta = { + title: "برچسب‌", + description: + "برچسب‌ها برای دسته‌بندی، طبقه‌بندی و نشانه‌گذاری محتوای رابط کاربر استفاده می‌شوند و شامل کلمه یا کلماتی‌‌اند که می‌تواند با آیکون یا بدون آیکون باشد. آن‌ها می‌توانند به‌تنهایی و یا کنار هم استفاده شوند.", + getLayout: () => page => + ( + + {page} + + ) +}; + + + {setTitleMeta(`${meta.title} | دیزاین سیستم سنّت`)} + {setDescriptionMeta(meta.description)} + {setCanonicalMeta(`${siteFullAddress}/components/Tag`)} + {setKeywordsMeta([...defaultKeywordsMetaContent, "tag", "برچسب‌"])} + + +

    + {meta.title} + +

    + +

    برچسب‌ توپُر (Filled) و توخالی (Outlined)

    + +

    {meta.description}

    + +

    + دموی تعاملی + +

    + + + +

    + کاربرد + +

    + +

    + برچسب‌ها تنها در ارتباط با کامپوننتی دیگر و برای بروز خصوصیات آن معنادارند و + چون می‌توانند مخل تمرکز کاربر شوند، نباید در حالتی با درجهٔ اهمیت بالا قرار + بگیرند. بهتر است تعداد برچسب‌هایی که استفاده می‌کنیم در بهینه‌ترین حالت باشند + (کم باشند) و تنها برای نمایش مشخصات کلی کامپوننت از آن‌ها استفاده شود. +
    + برچسب‌ها معمولاً کنار این قسمت‌ها استفاده می‌شوند: +

    + +
      +
    • عنوان اصلی صفحات
    • +
    • کارت‌ها
    • +
    • کامپوننت‌هایی با مرز مشخص و جدا شده از بقیهٔ اجزای رابط کاربر
    • +
    + +

    + یادآوری این نکته لازم است که برچسب‌ها می‌توانند در همهٔ قسمت‌ها استفاده شوند + به شرطی که ویژگی‌های یک کامپوننت یا بخش دیگر رابط کاربر را مشخص کنند. +

    + + + +

    + انواع + +

    + +

    + استایل انواع برچسب‌ها هنگام هاور و فوکوس تغییر نمی‌کند تا کاربر غیرتعاملی‌بودن + این کامپوننت را درک کرده و متوجه شود برچسب‌ها صرفاً برای اطلاع‌رسانی استفاده + شده‌اند. +

    + +

    + برچسب توپُر + +

    + +

    + مشخصهٔ برچسب‌های توپُر کادر رنگی و متن داخل آن است. این برچسب‌ درجهٔ اهمیت + بالاتری نسبت به سایر برچسب‌ها دارد. +

    + + + +

    + برچسب توخالی + +

    + +

    + برچسب‌های توخالی رنگ زمینه ندارند، با دِسنی نازک از محیط اطراف جدا می‌شوند و + شامل متنی ساده‌اند. این برچسب‌ها نسبت به برچسب‌های توپر درجهٔ اهمیت پایین‌تری + دارند. +

    + + + +

    + برچسب آیکون‌دار + +

    + +

    + هر دو نوع برچسب توپر و توخالی می‌توانند آیکون ابتدایی هم‌رنگ متن برچسب داشته + باشند. +

    + + + +

    + آناتومی + +

    + +

    + اینجا می‌توانید ابعاد برچسب‌ها، فاصله‌ها، حاشیه‌ها و اندازهٔ متن و آیکون را + ببینید. +

    + +
    + + +
    + +
    +
    + +
    + +
    +
    +
    +
    + +
    +

    + +
    + +

    + رفتار + +

    + +

    + در راهنمای زیر رفتار کامپوننت در کاربردهای مختلف دیزاین توضیح داده شده است. +

    + +
    + + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    +
    +
    + +
    +

    + +
    + +

    + نگارش + +

    + +
      +
    • در متن برچسب‌ها از علائم نگارشی استفاده نکنید.
    • +
    • حداکثر ۵ کلمه در برچسب‌ بنویسید.
    • +
    diff --git a/pages/components/TextField.mdx b/pages/components/TextField.mdx new file mode 100644 index 0000000..d4e1326 --- /dev/null +++ b/pages/components/TextField.mdx @@ -0,0 +1,439 @@ +import Divider from "@sonnat/ui/Divider"; +import Row from "@sonnat/ui/Row"; +import Column from "@sonnat/ui/Column"; +import Code from "@sonnat/ui/Code"; +import Image from "components/Image"; +import TextFieldDemo from "components/demos/TextFieldDemo"; +import Behaviour from "components/Behaviour"; +import Anatomy from "components/Anatomy"; +import AnchorButton from "components/AnchorButton"; +import WithTableOfContent from "components/layouts/WithTableOfContent"; +import Head from "next/head"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +export const meta = { + title: "فیلد متنی", + description: + "در فیلد متنی کاربر می‌تواند متنی تک‌خطی شامل حرف، عدد یا نشانه را وارد یا ویرایش کند.", + getLayout: () => page => + ( + + {page} + + ) +}; + + + {setTitleMeta(`${meta.title} | دیزاین سیستم سنّت`)} + {setDescriptionMeta(meta.description)} + {setCanonicalMeta(`${siteFullAddress}/components/TextField`)} + {setKeywordsMeta([ + ...defaultKeywordsMetaContent, + "textfield", + "text-field", + "فیلد متنی" + ])} + + +

    + {meta.title} + +

    + +

    فیلد‌ متنی توپُر (Filled) و توخالی (Outlined)

    + +

    {meta.description}

    + +

    + دموی تعاملی + +

    + + + +

    + کاربرد + +

    + +

    + فیلد متنی معمولاً در فرم‌ها و دیالوگ‌ها استفاده می‌شود و برای ورود اطلاعات یا + داده‌های کوتاه مناسب است. برای وارد کردن داده‌ها یا اطلاعاتی که طول بلندتری + دارند،‌ باید از «کادر متنی» استفاده شود. +

    + +

    + لیبل + +

    + +

    + متن شفاف و موثری که کاربران را برای وارد کردن اطلاعات درست در فیلد متنی + راهنمایی می‌کند. اگر انتهای لیبل نشانهٔ «*» استفاده شده باشد، کاربر متوجه + می‌شود پر کردن آن فیلد الزامی است. +
    + همهٔ فیلدهای متنی باید لیبل داشته باشند مگر برای صرفه‌جویی در فضای عمودی رابط + کاربر که در این صورت، لیبل با متن شبح (placeholder) همراه با آیکون ابتدایی (که + کارشناس دسترس‌پذیری تأیید کرده است) جایگزین می‌شود. +

    + +

    + فیلد متنی با لیبل معمولی: در این حالت، لیبل بالای فیلد متنی و + هم‌تراز با شروع آن قرار می‌گیرد و وضعیت نمایشش به هیچ‌کدام از کنش‌های کاربر + وابسته نیست. همچنین متن توضیحات فیلد می‌تواند زیر این لیبل قرار بگیرد. در + فرم‌ها و دیالوگ‌هایی که فضای کافی برای نمایش محتوا وجود دارد، استفاده از «فیلد + متنی با لیبل معمولی» توصیه می‌شود. +

    + +

    + فیلد متنی با لیبل بالارونده: در این حالت، لیبل در مرکز فیلد و + هم‌تراز با محل ورود اطلاعات قرار می‌گیرد. وقتی کاربر فوکوس ‌کند، لیبل به سمت + بالا حرکت می‌کند و بین دسن فیلد قرار می‌گیرد. زمانی‌ که در فرم یا دیالوگ، فضای + عمودی کافی موجود نباشد یا بخواهید محتوای رابط کاربر را ساده‌سازی کنید، از این + فیلد استفاده می‌شود. +

    + + + +

    + متن شبح (Placeholder) + +

    + +

    + متنی که کاربر را راهنمایی می‌کند چگونه اطلاعات درست را در فیلد وارد کند. این + متن یا توضیحاتی در تکمیل لیبل است یا مثالی از اطلاعات صحیحی که کاربر باید در + فیلد متنی وارد کند. وقتی کاربر شروع به نوشتن کند، متن شبح از فیلد حذف شده و + دیگر دیده نمی‌شود، به همین دلیل نباید حاوی اطلاعات مهمی باشد. از متن شبح فقط + در مواردی استفاده کنید که شفاف‌سازی بیشتری نیاز است. +

    + + + +

    + متن ورودی + +

    + +

    متنی که کاربر آن را وارد می‌کند. (می‌نویسد)

    + + + +

    + متن راهنما + +

    + +

    + متنی که توضیحات کامل‌تری به کاربران می‌دهد تا بتوانند اطلاعات درست را در فیلد + متنی وارد کنند. متن راهنما تا زمانی که فیلد در وضعیت خطا نباشد، در جای خود + ثابت است و در صورت بروز خطا، متن راهنما با متن خطای فیلد متنی جایگزین می‌شود. + این متن می‌تواند شامل جملاتی کامل همراه با علائم نگارشی باشد. +

    + + + +

    + فیلد متنی با آیکون + +

    + +

    آیکون‌ها می‌توانند ابتدا یا انتهای فیلد متنی قرار بگیرند.

    + +

    + فیلد متنی با آیکون ابتدایی: آیکون ابتدایی برای شفاف‌تر کردن + اطلاعات مورد نیاز فیلد استفاده می‌شود و در مواردی تاثیر متنی را که کاربر وارد + می‌کند، روی محتوا و اطلاعات رابط کاربر نشان می‌دهد. +
    + در مواردی می‌توان از ترکیب آیکون ابتدایی و متن شبح به جای لیبل فیلد متنی + استفاده کرد، به شرطی که کارشناس دسترس‌پذیری آن را تأیید کرده باشد. +

    + +

    + فیلد متنی با آیکون انتهایی: آیکون انتهایی در فیلد متنی برای + اعتبارسنجی متنی که کاربر وارد می‌کند استفاده می‌شود. آیکون انتهایی همچنین + می‌تواند کنش‌گر باشد، به طور مثال کاربر در کنش با آن می‌تواند رمز عبور + مخفی‌شده در فیلد را ببیند یا متن وارد شده را پاک کند. +

    + + + +

    + کاراکتر شمار + +

    + +

    + در بعضی از فیلدهای متنی که محدودیت کاراکتر دارند، این شمارنده به کاربر نشان + می‌دهد چه تعداد کاراکتر می‌تواند در فیلد متنی وارد کند، همچنین تعداد + کاراکترهای باقی‌مانده را نیز نشان می‌دهد. +

    + + + +

    + پیشوند و پسوند + +

    + +

    + در فیلد متنی، پیشوندها سمت راست و پسوندها سمت چپ و در ابتدا و انتهای محل ورود + اطلاعات قرار می‌گیرند و در صورت وجود آیکون ابتدایی و انتهایی، بعد و قبل از آن + می‌آیند. پسوندها می‌توانند ساده یا برچسب‌دار باشند. پسوند ساده معمولاً واحد + اطلاعات ورودی را مشخص می‌کند، مانند واحد پولی. پسوند برچسب‌دار برای نشان‌دادن + بخشی از اطلاعاتی‌ست که کاربر وارد می‌کند و سیستم به صورت پیش‌فرض ثبت‌ خواهد + کرد، مانند کد پیش‌شمارهٔ تلفن. +

    + + + +

    + انواع + +

    + +

    + هر دو نوع از فیلدهای متنی تقریباً عملکرد مشابهی دارند. در انتخاب نوع فیلد متنی + به استایل بصری رابط کاربر توجه کنید و دقت کنید فیلد متنی از باقی کامپوننت‌های + موجود در محتوا متمایز باشد. +

    + +

    + فیلد متنی توپر + +

    + +

    + این فیلد بدون دسن است و در زمان استفاده می تواند رنگ پس‌زمینه‌ای از رنگ‌های + دیزاین سیستم را داشته باشد. هم‌چنین در نوارهای راهبری نیز می تواند بدون بدون + رنگ زمینه ظاهر شود. در فیلد متنی توپر نمی‌توان از لیبل بالا رونده استفاده کرد. +

    + + + +

    + فیلد متنی توخالی + +

    + +

    + فیلدهای متنی توخالی رنگ زمینه ندارند، با دسنی نازک از محیط اطراف جدا می‌شوند و + در فرم‌های اصلی و ورودی های مهم، بهترین کامپوننت برای راهنمایی دقیق‌تر کاربر + در وارد کردن اطلاعات‌اند. +

    + + + +

    + آناتومی + +

    + +

    + اینجا می‌توانید ابعاد فیلدهای متنی، فاصله‌ها، حاشیه‌ها و اندازهٔ آیکون‌ها را + در موقعیت‌های نرمال و آیکون (ابتدایی/انتهایی)، ببینید. +

    + +
    + + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    +
    +
    + +
    +

    + +
    + +

    + رفتار + +

    + +

    + در راهنمای زیر رفتار کامپوننت در کاربردهای مختلف دیزاین توضیح داده شده است. +

    + +
    + + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    +
    +
    + +
    +

    + +
    + +

    + نگارش + +

    + +
      +
    • در متن راهنما از علائم نگارشی استفاده کنید.
    • +
    diff --git a/pages/components/Tooltip.mdx b/pages/components/Tooltip.mdx new file mode 100644 index 0000000..71bd0e0 --- /dev/null +++ b/pages/components/Tooltip.mdx @@ -0,0 +1,349 @@ +import Divider from "@sonnat/ui/Divider"; +import Row from "@sonnat/ui/Row"; +import Column from "@sonnat/ui/Column"; +import Code from "@sonnat/ui/Code"; +import Image from "components/Image"; +import Behaviour from "components/Behaviour"; +import Anatomy from "components/Anatomy"; +import AnchorButton from "components/AnchorButton"; +import WithTableOfContent from "components/layouts/WithTableOfContent"; +import Head from "next/head"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +export const meta = { + title: "راهنمای ابزار", + description: + "راهنمای ابزار متن شناور و کنش‌ناپذیری است که با حرکت‌دادن یا نگه‌داشتن موس، ضربه‌زدن یا کلیک‌کردن روی المانی ظاهر می‌شود و راهنمای تکمیلی دربارهٔ آن را نشان می‌دهد.", + getLayout: () => page => + ( + + {page} + + ) +}; + + + {setTitleMeta(`${meta.title} | دیزاین سیستم سنّت`)} + {setDescriptionMeta(meta.description)} + {setCanonicalMeta(`${siteFullAddress}/components/Tooltip`)} + {setKeywordsMeta([...defaultKeywordsMetaContent, "tooltip", "راهنمای ابزار"])} + + +

    + {meta.title} + +

    + +

    {meta.description}

    + +

    + کاربرد + +

    + +

    + راهنمای ابزار برای نمایش اطلاعات تکمیلی و مرتبط با مضمون استفاده می‌شود. برای + نمایش محتواهای ضروری یا پیام‌های خطا که حتماً باید خوانده شوند، نباید از + راهنمای ابزار استفاده شود. +

    + +

    راهنمای ابزار می‌تواند در این موارد استفاده شود:

    + +
      +
    • تعریف‌کردن کاربرد آیکون‌ها یا محتواهای تصویری کنش‌ناپذیر.
    • +
    • + تعریف‌کردن کاربرد یا بسط‌ دادن اطلاعات دربارهٔ بخشی از رابط کاربر که روی آن + ظاهر می‌شود. +
    • +
    + +

    + راهنمای ابزار باید در جایی قرار بگیرد که همیشه دیده شود. همچنین می‌تواند در + چهار جهت اصلی محل استفاده (بالا، پایین، چپ، راست) نیز استفاده شود. اگر راهنمای + ابزار در حالت واکنش‌گرا بیرون از صفحه قرار بگیرد، با اصلاح محل‌ ظاهر شدن خود + به نقطه‌ی مقابل جهت تعیین‌شده منتقل می‌شود. +

    + +

    + راهنمای ابزار آیکون‌دار + +

    + +

    + راهنمای ابزار آیکون‌دار زمانی استفاده می‌شود که آیکون به انتقال مفهوم المان + کمک کند. اگر محتوای متنی برای انتقال مفهوم کافی باشد، نیازی به اضافه‌کردن + آیکون نیست. +

    + + + +

    + انواع + +

    + +

    + راهنمای ابزاری که با ورود موس نمایش داده می شود + +

    + +

    در این حالت با قرارگرفتن موس روی محل استفاده، راهنمای ابزار ظاهر می‌شود.

    + + + + + +

    + راهنمای ابزاری که بعد از کنش یا کلیک نمایش داده می‌شود + +

    + +

    + در این حالت بعد از کلیک‌کردن یا ضربه‌زدن روی محل استفاده، راهنمای ابزار ظاهر + می‌شود. برای این نوع از راهنمای ابزار بهتر است از حالت تیره استفاده شود. +

    + + + + + +

    + راهنمای ابزاری که موس را دنبال می‌‌کند + +

    + +

    در این حالت راهنمای ابزار حرکت موس را در محل استفاده دنبال می‌کند.

    + + + +
    +

    + +
    + +

    + آناتومی + +

    + +

    + اینجا می‌توانید ابعاد راهنمای ابزار، فاصله‌ها، حاشیه‌ها و اندازهٔ متن و آیکون + را در موقعیت‌های معمولی، دنباله‌دار و آیکون‌دار ببینید. +

    + +
    + + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    +
    +
    + +
    +

    + +
    + +

    + رفتار + +

    + +

    + در راهنمای زیر رفتار کامپوننت در کاربردهای مختلف دیزاین توضیح داده شده است. +

    + +
    + + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    +
    +
    + +
    +

    + +
    + +

    + نگارش + +

    + +
      +
    • متن راهنمای ابزار نباید بیشتر از ۲ خط شود.
    • +
    • متن راهنمای ابزار باید مختصر، مفید و مفهوم باشد.
    • +
    • + راهنمای ابزار نباید حاوی اطلاعات مهم مانند پیام‌های خطا یا اطلاعات حساب + کاربر باشد. +
    • +
    diff --git a/pages/components/divar/AccordionRow.mdx b/pages/components/divar/AccordionRow.mdx new file mode 100644 index 0000000..59ea7f8 --- /dev/null +++ b/pages/components/divar/AccordionRow.mdx @@ -0,0 +1,117 @@ +import Divider from "@sonnat/ui/Divider"; +import Row from "@sonnat/ui/Row"; +import Column from "@sonnat/ui/Column"; +import Code from "@sonnat/ui/Code"; +import Image from "components/Image"; +import Behaviour from "components/Behaviour"; +import Anatomy from "components/Anatomy"; +import AnchorButton from "components/AnchorButton"; +import WithTableOfContent from "components/layouts/WithTableOfContent"; +import Head from "next/head"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +export const meta = { + title: "ردیف آکاردئون", + description: + "ردیف آکاردئون با مخفی‌کردن جزئیات محتوا می‌تواند حجم بالایی از محتوا را طبقه‌بندی‌شده و در فضایی محدودتر نمایش دهد.", + getLayout: () => page => + ( + + {page} + + ) +}; + + + {setTitleMeta(`${meta.title} | دیزاین سیستم سنّت`)} + {setDescriptionMeta(meta.description)} + {setCanonicalMeta(`${siteFullAddress}/components/divar/AccordionRow`)} + {setKeywordsMeta([...defaultKeywordsMetaContent, "accordion row"])} + + +

    + {meta.title} + +

    + +

    ردیف ویژگی تکی، ردیف ویژگی گروهی

    + +

    {meta.description}

    + +

    + کاربرد + +

    + +

    + این روش نمایشِ محتوا برای کاهش و بهینه‌سازی «ارتفاع چیدمان» آن به ویژه در + صفحه‌نمایش‌های کوچک‌تر کاربرد دارد. این کامپوننت در استفاده از فضای عرضی نیز + نسبت به کامپوننت‌های دیگر (مثل تب‌ها) بهینه‌تر عمل می‌کند. +
    + از این روش نمایش تنها زمانی استفاده می‌شود که کاربر نیازی به مطالعهٔ تمام + محتوا ندارد. در این صورت با استفاده از آکاردئون‌ها، ساماندهی و طبقه‌بندی صحیح + و انتخاب عنوان مناسب برای هر قسمت از محتوا، کاربر می‌تواند میان موضوعات مختلف + انتخاب کند که کدام بخش را مطالعه کند. استفاده از آکاردئون پردازش و کشف اطلاعات + را برای کاربر آسان‌تر و بهینه‌تر می‌کند. +
    + از این کامپوننت برای بخشی مشخص و به‌شکل محدود استفاده کنید. با توجه به اینکه + در این روش جزئیات محتوا از دید کاربر مخفی می‌شود، به‌کارگیری به‌جا از این + کامپوننت اهمیت زیادی دارد. برای حالتی که مطالعهٔ تمام یا بخش زیادی از محتوا + برای کاربر ضرورت دارد، استفاده از این روش نمایش محتوا مطلوب نیست زیرا دسترسی + به محتوا را برای کاربر مشکل می‌سازد. +

    + + + +
    +

    + +
    + +

    + انواع + +

    + +

    + ساده + +

    + +

    در این حالت با باز کردن پنل جدید پنل بازشدهٔ قبلی همچنان باز می‌ماند.

    + + + +

    + تک نمایشی (یا بسته‌شونده) + +

    + +

    + در هر لحظه تنها یک پنل می‌تواند بازشده نمایش داده شود و به محض بازکردن پنل + جدید، پنل دیگر بسته می‌شود. این رفتار می‌تواند برای بعضی کاربرها + پیش‌بینی‌ناپذیر بوده و کنترل کمتری در اختیار آن‌ها قرار دهد. همچنین کاربر + نمی‌تواند تصمیم‌ بگیرد کدام پنل‌ها باز یا بسته باشند. بنابراین استفاده از نوع + اول (ساده) مزایای بیش‌تری دارد. +

    diff --git a/pages/components/divar/ControlRow.mdx b/pages/components/divar/ControlRow.mdx new file mode 100644 index 0000000..6a26f93 --- /dev/null +++ b/pages/components/divar/ControlRow.mdx @@ -0,0 +1,145 @@ +import Divider from "@sonnat/ui/Divider"; +import Row from "@sonnat/ui/Row"; +import Column from "@sonnat/ui/Column"; +import Code from "@sonnat/ui/Code"; +import Image from "components/Image"; +import Behaviour from "components/Behaviour"; +import Anatomy from "components/Anatomy"; +import AnchorButton from "components/AnchorButton"; +import WithTableOfContent from "components/layouts/WithTableOfContent"; +import Head from "next/head"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +export const meta = { + title: "ردیف کنترل", + description: + "ردیف‌های کنترل‌، انتخاب از میان یک یا چند گزینه را فراهم می‌کنند.", + getLayout: () => page => + ( + + {page} + + ) +}; + + + {setTitleMeta(`${meta.title} | دیزاین سیستم سنّت`)} + {setDescriptionMeta(meta.description)} + {setCanonicalMeta(`${siteFullAddress}/components/divar/ControlRow`)} + {setKeywordsMeta([...defaultKeywordsMetaContent, "control row"])} + + +

    + {meta.title} + +

    + +

    + ردیف کنترل رادیویی (RadioButtonRow)، ردیف کنترل چک‌باکس(CheckboxRow)، ردیف + کنترل کلید (SwitchRow) +

    + +

    {meta.description}

    + +

    + کاربرد + +

    + +

    + این کامپوننت‌ امکان انتخاب گزینه‌ها در فرم‌ها و یا خاموش و روشن کردن تنظیمات و + تغییر وضعیت‌های موجود در محصول را میسر می‌کند. آیکون در ابتدای ردیف کنترل + چک‌باکس و کلید برای واضح‌تر شدن عنوان کاربرد دارد. +
    + در طراحی این کامپوننت بسته به نوع کاربرد از انواع کامپوننت کنترل‌ انتخاب + استفاده می‌شود. +

    + + + +

    + انواع + +

    + +

    + ردیف کنترل رادیویی + +

    + +

    + زمانی که لازم باشد کاربر تمام گزینه‌های موجود در فرم یا لیست را ببیند اما فقط + یکی از آن‌ها را انتخاب کند، از این کامپوننت استفاده می‌شود. +

    + + + + + +

    + ردیف کنترل چک‌باکس + +

    + +

    + زمانی که لازم باشد کاربر تمام گزینه‌های موجود در فرم یا لیست را ببیند و امکان + انتخاب یک یا چند گزینه را داشته باشد، از این کامپوننت استفاده می‌شود. +
    + در صورت نیاز به شفافیتِ انتخاب‌های پیش روی کاربر از ردیف کنترل چک‌باکس با + توضیحات استفاده می‌شود. +

    + + + + + +

    + ردیف کنترل کلید + +

    + +

    + زمانی که لازم باشد وضعیت المانی روشن یا خاموش شود از این کامپوننت استفاده + می‌شود. +

    + + diff --git a/pages/components/divar/EvaluationRow.mdx b/pages/components/divar/EvaluationRow.mdx new file mode 100644 index 0000000..c6abe5f --- /dev/null +++ b/pages/components/divar/EvaluationRow.mdx @@ -0,0 +1,93 @@ +import Divider from "@sonnat/ui/Divider"; +import Row from "@sonnat/ui/Row"; +import Column from "@sonnat/ui/Column"; +import Code from "@sonnat/ui/Code"; +import Image from "components/Image"; +import Behaviour from "components/Behaviour"; +import Anatomy from "components/Anatomy"; +import AnchorButton from "components/AnchorButton"; +import WithTableOfContent from "components/layouts/WithTableOfContent"; +import Head from "next/head"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +export const meta = { + title: "ردیف سنجش", + description: + "ردیف‌های سنجش برای نشان دادن وضعیت المانی در بازه‌های پیوسته استفاده می‌شوند. بازه‌ها از ۳ بخش پایینی، میانی و بالایی تشکیل شده‌اند و از نشانگری نیز برای نشان دادن وضعیت المان در بازه استفاده می‌شود. نشانگر می‌تواند در هر نقطه از ردیف با درصدی مشخص قرار بگیرد.", + getLayout: () => page => + ( + + {page} + + ) +}; + + + {setTitleMeta(`${meta.title} | دیزاین سیستم سنّت`)} + {setDescriptionMeta(meta.description)} + {setCanonicalMeta(`${siteFullAddress}/components/divar/EvaluationRow`)} + {setKeywordsMeta([...defaultKeywordsMetaContent, "evaluation row"])} + + +

    + {meta.title} + +

    + +

    {meta.description}

    + +

    + کاربرد + +

    + +

    + ردیف سنجش برای ارزیابی، نشان دادن کیفیت، تعداد و وضعیت المان به کار می‌رود. + قیمت، سلامت، تعداد و هر متغیر دیگری که پیوسته باشد، می‌تواند با ردیف سنجش + نمایش داده شود. +

    + + + +

    + بازه‌ها + +

    + +

    + این کامپوننت از ۳ بازهٔ مجزا با طول برابر تشکیل شده است که هر کدام رنگ متفاوتی + دارند. رنگ هشدار ثانویه برای بازهٔ بالایی، رنگ موفقیت ثانویه برای بازهٔ میانی + و رنگ موفقیت اصلی برای بازهٔ پایینی استفاده می‌شود. +

    + + + +

    + نشانگر + +

    + +

    + در این کامپوننت نشانگر مقدار متغیر ویژگی را روی بازه‌ها و عنوان ویژگی را با + راهنمای ابزار دنباله‌داری که می تواند آیکون داشته باشد نمایش می‌دهد. +

    diff --git a/pages/components/divar/FeatureRow.mdx b/pages/components/divar/FeatureRow.mdx new file mode 100644 index 0000000..7003bf5 --- /dev/null +++ b/pages/components/divar/FeatureRow.mdx @@ -0,0 +1,131 @@ +import Divider from "@sonnat/ui/Divider"; +import Row from "@sonnat/ui/Row"; +import Column from "@sonnat/ui/Column"; +import Code from "@sonnat/ui/Code"; +import Image from "components/Image"; +import Behaviour from "components/Behaviour"; +import Anatomy from "components/Anatomy"; +import AnchorButton from "components/AnchorButton"; +import WithTableOfContent from "components/layouts/WithTableOfContent"; +import Head from "next/head"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +export const meta = { + title: "ردیف ویژگی", + description: + "برای نمایش خصوصیت‌های یک محصول یا سرویس از ردیف‌های ویژگی استفاده می‌شود. ردیف‌های ویژگی دارای ۲ نوع تکی و گروهی‌اند که هر کدام ویژگی‌های متفاوتی دارند.", + getLayout: () => page => + ( + + {page} + + ) +}; + + + {setTitleMeta(`${meta.title} | دیزاین سیستم سنّت`)} + {setDescriptionMeta(meta.description)} + {setCanonicalMeta(`${siteFullAddress}/components/divar/FeatureRow`)} + {setKeywordsMeta([...defaultKeywordsMetaContent, "feature row"])} + + +

    + {meta.title} + +

    + +

    ردیف ویژگی تکی، ردیف ویژگی گروهی

    + +

    {meta.description}

    + +

    + کاربرد + +

    + +

    + ردیف ویژگی مزیت‌ها و نواقص را توضیح می‌دهد. همچنین مقایسه بین ۲ محصول یا سرویس + را راحت‌تر می‌کنند. ردیف ویژگی همیشه آیکون‌دار است و رنگ آیکون (که از رنگ‌های + معنادار سنّت است) درجهٔ اهمیت یا ارزش آن ویژگی را تعیین می‌کند. این ردیف + هیچ‌وقت مقداری غیر از متن اصلی ندارد. از آنجایی که این ردیف خصوصیت‌های یک + محصول یا سرویس را نمایش می‌دهد، حالت غیرفعال نخواهد داشت. +

    + + + +

    + انواع + +

    + +

    + ردیف ویژگی تکی + +

    + +

    + ردیف‌های ویژگی تکی شامل آیکون و متن ویژگی‌‌اند. این ردیف‌ها در صورتی که محصول + یا سرویس مورد نظر، دارای خصوصیتی باشد نمایش داده می‌شوند و وضعیت غیرفعال + ندارند. ردیف‌های ویژگی تکی ویژگی‌های متفاوتی به‌شرح زیر دارند: +

    + +
      +
    • + تک‌خط: توضیحات ویژگی در یک خط نمایش داده می‌شود و اگر متن + طولانی‌تر از یک سطر شود، انتهایش سه‌نقطه «...» می‌آید. +
    • +
    • + چند‌خط: اگر متن توضیحات طولانی‌تر از یک سطر شود، متن به + خط‌های بعدی می‌رود. +
    • +
    + +

    اگر ردیف‌های ویژگی تکی تعاملی باشند، با فلش نمایش داده می‌شوند.

    + + + + + +

    + ردیف ویژگی گروهی + +

    + +

    + ردیف‌های گروهی آیکون‌ دارند و ۲ وضعیت فعال و غیرفعال را نمایش می‌دهند. +
    + در ردیف‌های ویژگی گروهی در هر سطر ۳ گزینه و به‌ترتیب از راست قرار می‌گیرند. هر + ردیف ویژگی گروهی می‌تواند ۶ گزینه را نمایش دهد. +

    + + diff --git a/pages/components/divar/InfoRow.mdx b/pages/components/divar/InfoRow.mdx new file mode 100644 index 0000000..f7e25d4 --- /dev/null +++ b/pages/components/divar/InfoRow.mdx @@ -0,0 +1,165 @@ +import Divider from "@sonnat/ui/Divider"; +import Row from "@sonnat/ui/Row"; +import Column from "@sonnat/ui/Column"; +import Code from "@sonnat/ui/Code"; +import Image from "components/Image"; +import Behaviour from "components/Behaviour"; +import Anatomy from "components/Anatomy"; +import AnchorButton from "components/AnchorButton"; +import WithTableOfContent from "components/layouts/WithTableOfContent"; +import Head from "next/head"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +export const meta = { + title: "ردیف داده", + description: + "برای نمایش داده‌های گسترهٔ وسیعی از کالاها، محصولات و سرویس‌ها از ردیف داده استفاده می‌شود.", + getLayout: () => page => + ( + + {page} + + ) +}; + + + {setTitleMeta(`${meta.title} | دیزاین سیستم سنّت`)} + {setDescriptionMeta(meta.description)} + {setCanonicalMeta(`${siteFullAddress}/components/divar/InfoRow`)} + {setKeywordsMeta([...defaultKeywordsMetaContent, "info row"])} + + +

    + {meta.title} + +

    + +

    + ردیف‌ دادهٔ تک‌خطی (Unexpandable)، بسط‌پذیر (Expandable) و گروهی (Group) +

    + +

    {meta.description}

    + +

    + کاربرد + +

    + +

    + در ردیف داده با نمایش متنی ویژگی‌های محصول یا سرویس در دو بخش مجزای عنوان و + مقدار توضیح داده می‌شود. +

    + +

    + عنوان + +

    + +

    عنوان، موضوع ردیف داده را مشخص می‌کند.

    + + + +

    + مقدار + +

    + +

    + مقدار، عنوان را در چند کلمه یا چند جمله توضیح می‌دهد. +
    + در ردیف‌های دادهٔ تک‌خطی و گروهی، مقدار در ۱ تا ۳ کلمه عنوان را توضیح می‌دهد. + در ردیف‌های دادهٔ بسط‌پذیر، مقدار می‌تواند بیشتر از چند کلمه باشد و در چند + جمله عنوان را توضیح دهد. +
    + درجهٔ اهمیت مقدار همیشه از عنوان بالاتر است. +

    + + + +

    + انواع + +

    + +

    + ردیف دادهٔ تک‌خطی + +

    + +

    + مقدار ردیف‌های دادهٔ تک‌خطی می‌تواند متن یا لینک باشد. در حالت دوم، متن آن + باید با رنگ برند نمایش داده شود و فقط محدودهٔ لینک مقدار تعاملی است. در + ردیف‌های داده درجهٔ اهمیت مقدار بیشتر از عنوان است. در نتیجه مقدار، وزن بصری + بیشتری نسبت به عنوان دارد. +

    + + + + + +

    + ردیف دادهٔ بسط‌پذیر + +

    + +

    + از این نوع ردیف داده زمانی استفاده می‌شود که مقدار بیشتر از ۳ کلمه باشد. در + این صورت به جای مقدار از عبارتی مانند «نمایش» استفاده می‌شود و کنار آن فلشی رو + به پایین قرار می‌گیرد. در این حالت با کلیک‌کردن روی ردیف داده، کامپوننت باز + می‌شود و مقدار زیر عنوان نمایش داده می‌شود. +

    + + + + + +

    + ردیف دادهٔ گروهی + +

    + +

    + در ردیف‌های دادهٔ گروهی عنوان و مقدار زیر هم قرار می‌گیرند. این کامپوننت حداقل + ۲ و حداکثر ۳ ویژگی را نمایش می‌دهد. این ویژگی‌ها وسط‌چین می‌شوند. +

    + + diff --git a/pages/components/divar/PriceChangeRow.mdx b/pages/components/divar/PriceChangeRow.mdx new file mode 100644 index 0000000..1e3cfc6 --- /dev/null +++ b/pages/components/divar/PriceChangeRow.mdx @@ -0,0 +1,135 @@ +import Divider from "@sonnat/ui/Divider"; +import Row from "@sonnat/ui/Row"; +import Column from "@sonnat/ui/Column"; +import Code from "@sonnat/ui/Code"; +import Image from "components/Image"; +import Behaviour from "components/Behaviour"; +import Anatomy from "components/Anatomy"; +import AnchorButton from "components/AnchorButton"; +import WithTableOfContent from "components/layouts/WithTableOfContent"; +import Head from "next/head"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +export const meta = { + title: "ردیف تغییرات قیمت", + description: + "این کامپوننت قیمت، روند و میزان تغییرات آن را در لیستی از محصولات نمایش می‌دهد.", + getLayout: () => page => + ( + + {page} + + ) +}; + + + {setTitleMeta(`${meta.title} | دیزاین سیستم سنّت`)} + {setDescriptionMeta(meta.description)} + {setCanonicalMeta(`${siteFullAddress}/components/divar/PriceChangeRow`)} + {setKeywordsMeta([...defaultKeywordsMetaContent, "price change row"])} + + +

    + {meta.title} + +

    + +

    {meta.description}

    + +

    + کاربرد + +

    + +

    + ردیف تغییرات قیمت باتوجه به اینکه اطلاعات زیادی را در فضایی کم نمایش می‌دهد + چیدمان واکنش‌گرای آن در صفحات نمایش کوچک متفاوت است. همچنین در صورتی که طول + عنوان و زیرعنوان اول زیاد باشد متن‌ها به شکل سه‌نقطه نمایش داده می‌شوند. +

    + + + +

    + تمایز بین حالت‌ها + +

    + +

    + این کامپوننت ۳ حالت دارد که با توجه به مقدار زیرعنوان دوم (درصد تغییرات قیمت) + تعریف شده‌اند. هر یک از حالت‌ها به کمک رنگ متن از هم تفکیک می‌شوند و می‌توانند + در ۳ حالت مختلف استفاده شوند. +

    + +
      +
    • + اگر درصد تغییرات منفی باشد، برای رنگ متن از رنگ خطای اصلی (Error Primary) + استفاده می‌شود. +
    • +
    • + اگر درصد تغییرات صفر باشد، برای رنگ متن از رنگ سیاه ثانویه (Black Secondary) + استفاده می‌شود. +
    • +
    • + اگر درصد تغییرات مثبت باشد، برای رنگ متن از رنگ موفقیت اصلی (Success + Primary) استفاده می‌شود. +
    • +
    + + + + + +

    + سنجاق + +

    + +

    + این کامپوننت می‌تواند در دو حالت با سنجاق و بدون سنجاق استفاده شود. +
    + سنجاق برای ایجاد دسترسی ساده‌تر کاربر به چند گزینه از لیستی طولانی کاربرد + دارد. بعد از لمس آیکون سنجاق، گزینهٔ موردنظر به حالت سنجاق‌شده درمی‌آید و به + بالای لیست و قسمت سنجاق‌شده‌ها اضافه می‌شود. +
    + تنها ناحیهٔ تعاملی در این کامپوننت در حالت سنجاق‌دار، اطراف آیکون سنجاق است. +

    + + diff --git a/pages/components/divar/PriceEstimationRow.mdx b/pages/components/divar/PriceEstimationRow.mdx new file mode 100644 index 0000000..630572f --- /dev/null +++ b/pages/components/divar/PriceEstimationRow.mdx @@ -0,0 +1,108 @@ +import Divider from "@sonnat/ui/Divider"; +import Row from "@sonnat/ui/Row"; +import Column from "@sonnat/ui/Column"; +import Code from "@sonnat/ui/Code"; +import Image from "components/Image"; +import Behaviour from "components/Behaviour"; +import Anatomy from "components/Anatomy"; +import AnchorButton from "components/AnchorButton"; +import WithTableOfContent from "components/layouts/WithTableOfContent"; +import Head from "next/head"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +export const meta = { + title: "ردیف تخمین قیمت", + description: + "در ابزارهای تخمین قیمت محصول و بخش‌هایی که نیاز به نمایش بازه‌های قیمتی یک کالا وجود دارد، ردیف تخمین قیمت کامپوننتی مناسب برای ارائهٔ بصری سادهٔ این مفهوم است.", + getLayout: () => page => + ( + + {page} + + ) +}; + + + {setTitleMeta(`${meta.title} | دیزاین سیستم سنّت`)} + {setDescriptionMeta(meta.description)} + {setCanonicalMeta(`${siteFullAddress}/components/divar/PriceEstimationRow`)} + {setKeywordsMeta([...defaultKeywordsMetaContent, "price estimation row"])} + + +

    + {meta.title} + +

    + +

    {meta.description}

    + +

    + کاربرد + +

    + +

    + برای نمایش مقادیر ابتدایی و انتهایی بازه‌ای منتخب از میان طیف گسترده‌تری، ازین + کامپوننت استفاده می‌شود. +

    + +

    + بازه‌ها + +

    + +

    + این کامپوننت از ۳ بازهٔ مجزا تشکیل شده است که هر کدام رنگ متفاوتی دارند. بازهٔ + قیمت منصفانه عرضی دوبرابر دو بازهٔ دیگر دارد. رنگ هشدار ثانویه برای بازهٔ قیمت + بالا، رنگ موفقیت ثانویه برای بازهٔ قیمت منصفانه و رنگ موفقیت اصلی برای بازهٔ + قیمت پایین استفاده می‌شود. +

    + + + + + +

    + مقادیر ابتدا و انتهای بازه + +

    + +

    + متن‌های مقادیر ابتدا و انتهای بازهٔ منصفانه در این کامپوننت، می‌توانند متفاوت + و به تبع آن طول مختلفی داشته ‌باشند. عرض این متن‌ها به اندازهٔ نصف عرض + نگه‌دارندهٔ کامپوننت بوده و در بیشتر از این مقدار به خط دوم می‌روند. +
    + در این کامپوننت چه در حالت فارسی و چه در حالت انگلیسی، مقدار کم‌تر سمت چپ و + مقدار بیش‌تر سمت راست بازه قرار می‌گیرد. +

    + + diff --git a/pages/components/divar/RateRow.mdx b/pages/components/divar/RateRow.mdx new file mode 100644 index 0000000..88bc464 --- /dev/null +++ b/pages/components/divar/RateRow.mdx @@ -0,0 +1,148 @@ +import Divider from "@sonnat/ui/Divider"; +import Row from "@sonnat/ui/Row"; +import Column from "@sonnat/ui/Column"; +import Code from "@sonnat/ui/Code"; +import Image from "components/Image"; +import Behaviour from "components/Behaviour"; +import Anatomy from "components/Anatomy"; +import AnchorButton from "components/AnchorButton"; +import WithTableOfContent from "components/layouts/WithTableOfContent"; +import Head from "next/head"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +export const meta = { + title: "ردیف ارزیابی", + description: + "ارزیابی رضایت کاربران و امکان مقایسهٔ کل‌نگر میان بخش‌ها و خدمات گوناگون محصول نیاز به روشی برای جمع‌آوری دادهٔ مورد نیاز از کاربران آن محصول دارد. این کامپوننت امکان تهیهٔ این داده را به‌شکلی قابل فهم، بسط‌پذیر و یکپارچه فراهم می‌کند.", + getLayout: () => page => + ( + + {page} + + ) +}; + + + {setTitleMeta(`${meta.title} | دیزاین سیستم سنّت`)} + {setDescriptionMeta(meta.description)} + {setCanonicalMeta(`${siteFullAddress}/components/divar/RateRow`)} + {setKeywordsMeta([...defaultKeywordsMetaContent, "rate row"])} + + +

    + {meta.title} + +

    + +

    + ردیف ارزیابی با ستاره، ردیف ارزیابی با ایموجی (Emoji)، ردیف ارزیابی دوتایی + (Boolean) +

    + +

    {meta.description}

    + +

    + کاربرد + +

    + +

    + از کامپوننت ردیف ارزیابی برای بازخورد گرفتن از کاربرها و اندازه‌گیری میزان + رضایت آن‌ها از امکانات محصول استفاده می‌شود. هنگام استفاده از این کامپوننت + باید اطمینان داشت برای سنجش بخش مورد نظر محصول و بازخورد گرفتن بهترین ابزار + همین کامپوننت است. +
    + متنی که برای بازخورد گرفتن به کاربر نمایش می‌دهید باید شفاف باشد تا کاربر + کاملاً متوجه موضوعی که دربارهٔ آن بازخورد می‌گیرید بشود. +
    + همچنین در ردیف ارزیابی، بعد از گرفتن بازخورد ابتدایی می‌توان با گرفتن توضیحات + کاربر دربارهٔ دلیل امتیاز یا انتخاب او بازخورد کامل‌تری ثبت کرد. +

    + + + +

    + انواع + +

    + +

    + ردیف ارزیابی با ستاره + +

    + +

    + زمانی که لازم باشد محصولی به کاربر معرفی شود (مانند یک برند خودرو) و + بازخوردهای کاربران دربارهٔ کیفیت آن گرفته شده و میانگین آن به سایر کاربران + نمایش داده شود از این کامپوننت استفاده می‌شود. در این نوع از ردیف ارزیابی برای + فهم بهتر کاربر از مقادیر از راهنمای ابزار استفاده می‌شود. +

    + + + + + +

    + ردیف ارزیابی با ایموجی (Emoji) + +

    + +

    + زمانی از این کامپوننت استفاده می‌شود که لازم باشد کاربر بخشی از محصول با + محتوای متفاوت را یکجا ارزیابی کند. +

    + + + + + +

    + ردیف ارزیابی دوتایی (Boolean) + +

    + +

    + زمانی از این کامپوننت استفاده می‌شود که لازم باشد کاربر تنها یک بخش از محصول + را ارزیابی کند. +

    + + diff --git a/pages/components/divar/ScoreRow.mdx b/pages/components/divar/ScoreRow.mdx new file mode 100644 index 0000000..c7cdcb5 --- /dev/null +++ b/pages/components/divar/ScoreRow.mdx @@ -0,0 +1,142 @@ +import Divider from "@sonnat/ui/Divider"; +import Row from "@sonnat/ui/Row"; +import Column from "@sonnat/ui/Column"; +import Code from "@sonnat/ui/Code"; +import Image from "components/Image"; +import Behaviour from "components/Behaviour"; +import Anatomy from "components/Anatomy"; +import AnchorButton from "components/AnchorButton"; +import WithTableOfContent from "components/layouts/WithTableOfContent"; +import Head from "next/head"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +export const meta = { + title: "ردیف امتیاز", + description: + "در ارائهٔ بازهٔ گسترده‌ای از ویژگی‌ها با تفاوت‌های بنیادین و نمایش کیفیت این ويژگی‌ها با المان‌های بصری‌ای که برای تمام ‌آن‌ها قابل استفاده باشد از ردیف‌های امتیاز استفاده می‌کنیم. مزیت این ردیف‌ها کمک به کاربر در تشخیص نقاط قوت و ضعف یک محصول را با نگاهی کلی تشخیص دهد.", + getLayout: () => page => + ( + + {page} + + ) +}; + + + {setTitleMeta(`${meta.title} | دیزاین سیستم سنّت`)} + {setDescriptionMeta(meta.description)} + {setCanonicalMeta(`${siteFullAddress}/components/divar/ScoreRow`)} + {setKeywordsMeta([...defaultKeywordsMetaContent, "score row"])} + + +

    + {meta.title} + +

    + +

    ردیف امتیاز با مقدار(Value)، ردیف امتیاز با نوار(Bar)

    + +

    {meta.description}

    + +

    + کاربرد + +

    + +

    + ردیف‌های امتیاز برای اطلاع‌رسانی دربارهٔ بودن یا نبودن ویژگی‌ای مشخص و یا + نمایش کیفیت یک یا چند ویژگی استفاده می‌شوند. ردیف امتیاز می‌تواند توصیفی + (Informative) یا تعاملی (Interactive) باشد. ردیف امتیاز توصیفی، دربارهٔ + ویژگی‌ای خاص به کاربر اطلاعات می‌دهد و در صورت تعاملی‌بودن، کاربر را برای دیدن + جزئیات بیشترِ آن ویژگی به نمایی داخلی راهبری می‌کند. عنوانِ ردیف امتیاز نوع + ویژگی را مشخص می‌کند. +
    + دسترسی ردیف‌های امتیاز می‌توانند آیکون داشته باشند. همچنین این ردیف‌ها با + قابلیت راهبری (در این حالت فلش به انتهای ردیف اضافه می شود) کاربر را به جزئیات + بیشتری دربارهٔ آن ویژگی راهنمایی می‌کنند. +
    + از آنجا که این ردیف‌ها وضعیت یک ویژگی را نمایش می‌دهند حالت غیرفعال ندارند. +

    + +

    + ردیف امتیاز آیکون‌دار + +

    + +

    از آیکون ابتدایی برای درک بهتر و سریع‌تر عنوانِ ردیف استفاده می‌شود.

    + + + +

    + ردیف امتیاز با فلش + +

    + +

    + در ردیف امتیاز تعاملی از فلش برای جلب توجه کاربر استفاده می‌شود تا با این + کامپوننت تعامل کند. +

    + + + +

    + انواع + +

    + +

    + ردیف امتیاز با مقدار (Value) + +

    + +

    + در ردیف امتیاز با مقدار، با استفاده از یک یا چند عبارت‌ کیفیت و اولویت ویژگی + توصیف می‌شود. متن مقدار، رنگ و ویژگی‌های معنادار را ارث می‌برد. +

    + + + + + +

    + ردیف امتیاز با نوار (Bar) + +

    + +

    + در این نوع ردیف نواری با ۵ درجه وجود دارد تا کاربر با کمک درجه‌ها و رنگ‌های + معنادار وضعیت ویژگیِ مشخص‌شده را بهتر درک کند. درجهٔ یکم (رنگ قرمز) بدترین + حالت ویژگی و درجهٔ پنجم (رنگ سبز) بهترین حالت آن را مشخص می‌کند. +

    + + diff --git a/pages/components/divar/SelectorRow.mdx b/pages/components/divar/SelectorRow.mdx new file mode 100644 index 0000000..c51e76e --- /dev/null +++ b/pages/components/divar/SelectorRow.mdx @@ -0,0 +1,169 @@ +import Divider from "@sonnat/ui/Divider"; +import Row from "@sonnat/ui/Row"; +import Column from "@sonnat/ui/Column"; +import Code from "@sonnat/ui/Code"; +import Image from "components/Image"; +import Behaviour from "components/Behaviour"; +import Anatomy from "components/Anatomy"; +import AnchorButton from "components/AnchorButton"; +import WithTableOfContent from "components/layouts/WithTableOfContent"; +import Head from "next/head"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +export const meta = { + title: "ردیف انتخابی", + description: + "ردیف انتخابی در میان ردیف‌ها اصلی‌ترین کامپوننت برای راهبری میان قسمت‌ها مختلف محصول است و با اطلاعاتی که نمایش می‌دهد مسیر پیش‌روی کاربر را شفاف و قابل پیش‌بینی می‌کند.", + getLayout: () => page => + ( + + {page} + + ) +}; + + + {setTitleMeta(`${meta.title} | دیزاین سیستم سنّت`)} + {setDescriptionMeta(meta.description)} + {setCanonicalMeta(`${siteFullAddress}/components/divar/SelectorRow`)} + {setKeywordsMeta([...defaultKeywordsMetaContent, "selector row"])} + + +

    + {meta.title} + +

    + +

    {meta.description}

    + +

    + کاربرد + +

    + +

    + ردیف‌های انتخابی راهبری در بخشی از فرایند، انتخاب بین گزینه‌های یک موضوع، + دریافت اطلاعات بیشتر دربارهٔ یک موضوع و همچنین دسترسی به صفحاتی را فراهم + می‌کنند که عنوان آن‌ها نیاز به توضیحات بیشتری دارد و یک دکمه یا کامپوننت + لینک‌دار برای عنوان آن‌ها کافی نیست. در حالتی که این کامپوننت برای کاربر + تعامل‌پذیر نباشد، وضعیت آن غیرفعال می‌شود. ردیف انتخابی می‌تواند ویژگی‌های (یا + گزینه‌های) متفاوتی به‌‌شرح زیر داشته باشد: +

    + +

    + ردیف انتخابی ساده + +

    + +

    + ردیف انتخابی که با متن عنوان کاربر را از هدف تعاملی و راهبری این کامپوننت آگاه + می‌کند. در این ردیف زیرعنوان، عنوان را کامل و شفاف می‌کند. +

    + + + + + +

    + ردیف انتخابی با فِلِش + +

    + +

    + از فلش برای جلب توجه کاربر استفاده می‌شود تا با این کامپوننت تعامل کند. همچنین + مشخص می‌کند گزینهٔ انتخابی، مرحله‌ای میانی از فرایند انتخاب است. بنابراین + گزینه‌های انتخابی میانی با فلش و گزینه‌های انتخابی نهایی بدون فلش نمایش داده + می‌شوند. +
    + در این ردیف‌ها می‌توانیم با افزودن متن توضیحات انتخاب‌های پیش‌روی کاربر را با + جزئیات بیشتری توضیح دهیم. +

    + + + + + +

    + ردیف انتخابی آیکون‌دار + +

    + +

    + آیکون‌ها ابتدای ردیف انتخابی قرار می‌گیرند و عنوان را شفاف‌تر می‌کنند. توصیه + می‌کنیم در صورت امکان از آیکون‌های SVG و یا از آیکونْ فونتِ طراحی‌شده با قواعد + سنّت استفاده کنید. +

    + + + + + +

    + ردیف انتخابی با نشانگر + +

    + +

    + در ردیف انتخابی با نشانگر برای جلب توجه کاربر از کامپوننت‌های نشان و نشانگر + استفاده می‌شود تا تغییرات رخ‌داده در بخشی از رابط کاربر را درک کنند یا از کمیت + تغییرات آگاه شوند. اگر تغییرات آنلاین اتفاق بیفتند، همان لحظه در رابط کاربر + ظاهر می‌شوند در غیر این صورت از قبل در محل مورد نظر قرار می‌گیرند. +
    + کامپوننت نشان برای جلب توجه کاربر و به دو شکل متنی یا بدون متن (نشانگر) + استفاده می‌شود. نشان متنی یا شامل عددی است که کمیت تغییر را نمایش می‌دهد و یا + شامل کلماتی که وضعیت بخش مورد نظر در رابط کاربر را توصیف می‌کند. مانند «جدید!» + و یا ورژن یک تغییر مثل «v1.0.1». مشخصات بیشتر کامپوننت نشانگر را{" "} + + اینجا + {" "} + بخوانید. +

    + + diff --git a/pages/components/divar/TitleRow.mdx b/pages/components/divar/TitleRow.mdx new file mode 100644 index 0000000..7479e69 --- /dev/null +++ b/pages/components/divar/TitleRow.mdx @@ -0,0 +1,80 @@ +import Divider from "@sonnat/ui/Divider"; +import Row from "@sonnat/ui/Row"; +import Column from "@sonnat/ui/Column"; +import Code from "@sonnat/ui/Code"; +import Image from "components/Image"; +import Behaviour from "components/Behaviour"; +import Anatomy from "components/Anatomy"; +import AnchorButton from "components/AnchorButton"; +import WithTableOfContent from "components/layouts/WithTableOfContent"; +import Head from "next/head"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +export const meta = { + title: "ردیف عنوان", + description: + "ردیف‌های عنوان عناصری متنی‌اند و با چند کلمه اطلاعاتی را توصیف می‌کنند که زیر آن‌ها نمایش داده می‌شود.", + getLayout: () => page => + ( + + {page} + + ) +}; + + + {setTitleMeta(`${meta.title} | دیزاین سیستم سنّت`)} + {setDescriptionMeta(meta.description)} + {setCanonicalMeta(`${siteFullAddress}/components/divar/TitleRow`)} + {setKeywordsMeta([...defaultKeywordsMetaContent, "title row"])} + + +

    + {meta.title} + +

    + +

    {meta.description}

    + +

    + کاربرد + +

    + +

    + این کامپوننت در عنوان مجزا و غیر اصلی صفحه کاربر دارد. همچنین برای جدا کردن + قسمت‌های مختلف صفحه با موضوعات متفاوت نیز از ردیف عنوان استفاده می‌شود. +

    + +

    + ردیف عنوان آیکون‌دار + +

    + +

    + آیکون‌ها ابتدای ردیف عنوان قرار می‌گیرند و عنوان را شفاف‌تر می‌کنند. توصیه + می‌کنیم در صورت امکان از آیکون‌های SVG و یا از آیکونْ فونتِ طراحی‌شده با قواعد + سنّت استفاده کنید. +

    + + diff --git a/pages/components/divar/rows-introduction.mdx b/pages/components/divar/rows-introduction.mdx new file mode 100644 index 0000000..29f9233 --- /dev/null +++ b/pages/components/divar/rows-introduction.mdx @@ -0,0 +1,180 @@ +import Divider from "@sonnat/ui/Divider"; +import Image from "components/Image"; +import AnchorButton from "components/AnchorButton"; +import WithTableOfContent from "components/layouts/WithTableOfContent"; +import Head from "next/head"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +export const meta = { + title: "آشنایی با ردیف‌ها", + description: + "ردیف‌ها کامپوننت‌های اختصاصی دیوارند که بنا به نیاز‌های اختصاصی محصول دیوار شکل گرفتند و با مشارکت طراحان تجربهٔ کاربر در تیم‌های محصولی مختلف طراحی و به سنّت اضافه شدند.", + getLayout: () => page => + ( + + {page} + + ) +}; + + + {setTitleMeta(`${meta.title} | دیزاین سیستم سنّت`)} + {setDescriptionMeta(meta.description)} + {setCanonicalMeta(`${siteFullAddress}/components/divar/rows-introduction`)} + {setKeywordsMeta([...defaultKeywordsMetaContent, "divar", "rows", "intro"])} + + +

    + {meta.title} + +

    + +

    {meta.description}

    + +

    + فرآیند شکل‌گیری + +

    + +

    + همان‌طور که در{" "} + + معرفی سنت + {" "} + توضیح دادیم، شکل‌گیری سنّت با رویکردی برآینده انجام شد. به این معنی که سیستمی + متفاوت از وضعیت موجود دیوار طراحی نکردیم و کامپوننت‌های سنّت با استخراج + الگوهای موجود در محصول و یکپارچه‌سازی آن‌ها طراحی و نسخه‌های ابتدایی آن‌ها در + طول زمان و متناسب با تغییر نیازمندی‌های محصول به‌روزرسانی شدند. +

    + +

    + نمونه‌هایی از تغییرات در طی زمان + +

    + + + +

    + این کامپوننت ابتدا برای نمایش پیام‌های پستچی در چت دیوار طراحی شد و سپس + کاربردهای دیگری نیز مثل نمایش فعالیت‌ مشاوران املاک در پنل آژانس‌‌های املاک + دیوار، نمایش لیست فروشندگان دیوار و ... پیدا کرد. این کامپوننت در تمام + کاربردها نقشی کُنش‌پذیر داشت و نمایشی نبود. اما زمانی که از این کامپوننت برای + نمایش لیست آگهی‌ها در «میان‌بُر ویرایش قیمت آگهی» پنل فروشگاه‌ها استفاده + کردیم، نیاز جدی به تأکید بصری بر کُنش‌پذیر بودن کامپوننت احساس شد. +

    + + + + + +

    + این کامپوننت ابتدا فقط برای نمایش اطلاعات تیپ، مدل و برند خودرو طراحی شد. اما + به این نتیجه رسیدیم لازم است اطلاعات تیپ و مدل متمایز از برند نمایش داده شود. + هم‌چنین در لیست طولانی اطلاعات قیمت خودروها، باید این امکان به کاربر داده + می‌شد تا بتواند محصولات مورد علاقه‌ی خود را بالای لیست نگه‌ دارد. بنابراین + رفتار واکنش‌گرا به این کامپوننت اضافه کردیم. به‌تبع با کم‌شدن عرض مفید + کامپوننت و برای اطمینان از بریده‌شدن متن‌ها، لازم بود اطلاعات در دو خط نمایش + دا +

    + +

    + انواع کامپوننت‌های ردیف و کاربردهای آن‌ها + +

    + +

    کامپوننت‌های ردیف از نظر کاربرد به ۳ دسته تقسیم می‌شوند.

    + +

    + ساختن فرم + +

    + +

    + این کامپوننت‌ها وظیفهٔ دریافت اطلاعات از کاربر در فرم‌ها و نمایش اطلاعات + دریافت‌شده یا انتخابی کاربر را برعهده دارند. +
    + ردیف‌های سازندهٔ فرم شامل: +

    + +
      +
    • ردیف وضعیت
    • +
    • ردیف کنترل
    • +
    • ردیف ارزیابی
    • +
    + +

    + راهبری + +

    + +

    + این کامپوننت‌ها راهبری در بخشی از فرایند، انتخاب بین گزینه‌های یک موضوع، + دریافت اطلاعات بیشتر دربارهٔ یک موضوع و همچنین دسترسی به صفحاتی را فراهم + می‌کنند که عنوان آن‌ها نیاز به توضیحات بیشتری دارد. +
    + ردیف‌های راهبری شامل: +

    + +
      +
    • ردیف انتخابی
    • +
    • ردیف‌های نتایج جستجو و پیشنهاد جستجو
    • +
    • ردیف امتیاز (تعاملی)
    • +
    • ردیف ویژگی (تعاملی)
    • +
    + +

    + نمایش اطلاعات + +

    + +

    + این کامپوننت‌ها فقط اطلاعات را نمایش می‌دهند و کُنشی نمی‌پذیرند. این + کامپوننت‌ها در شکل‌گیری فرم‌ها نیز کاربرد دارند، ولی نه برای دریافت اطلاعات یا + انتخاب‌های کاربر، بلکه برای شفاف‌کردن مضمون قسمت‌های مختلف فرم یا گروه‌بندی + کردن اطلاعات در فرم‌. +
    + ردیف‌های نمایش اطلاعات شامل: +

    + +
      +
    • ردیف عنوان
    • +
    • ردیف ویژگی
    • +
    • ردیف تغییرات قیمت
    • +
    • ردیف تخمین قیمت
    • +
    • ردیف سنجش
    • +
    • ردیف امتیاز
    • +
    • ردیف داده
    • +
    diff --git a/pages/components/index.mdx b/pages/components/index.mdx new file mode 100644 index 0000000..304aaf2 --- /dev/null +++ b/pages/components/index.mdx @@ -0,0 +1,89 @@ +import Divar from "@sonnat/icons/Divar"; +import Divider from "@sonnat/ui/Divider"; +import AnchorButton from "components/AnchorButton"; +import ComponentsOfType from "components/ComponentsOfType"; +import WithTableOfContent from "components/layouts/WithTableOfContent"; +import Head from "next/head"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +export const meta = { + title: "کامپوننت‌ها", + description: + "کامپوننت‌های سنّت بلوک‌هایی تعاملی برای ساخت رابط کاربری هستند. این کامپوننت‌ها برمبنای قواعد دیزاین سیستم دیزاین شده و مداوم و با ثبات توسعه داده می‌شوند.", + getLayout: () => page => + ( + + {page} + + ) +}; + + + {setTitleMeta(`${meta.title} | دیزاین سیستم سنّت`)} + {setDescriptionMeta(meta.description)} + {setCanonicalMeta(`${siteFullAddress}/components`)} + {setKeywordsMeta([ + ...defaultKeywordsMetaContent, + "components", + "کامپوننت‌ها", + "کامپوننت" + ])} + + +

    + {meta.title} + +

    + +

    {meta.description}

    + +

    + کنش‌گرها + +

    + + + +

    + کنترل‌کننده‌ها + +

    + + + +

    + نمایش‌دهنده‌ها + +

    + + + +

    + راهبری + +

    + + + +

    + ردیف‌ها + + +

    + + diff --git a/pages/foundation/icon.mdx b/pages/foundation/icon.mdx new file mode 100644 index 0000000..841e97c --- /dev/null +++ b/pages/foundation/icon.mdx @@ -0,0 +1,373 @@ +import Divider from "@sonnat/ui/Divider"; +import Row from "@sonnat/ui/Row"; +import Column from "@sonnat/ui/Column"; +import Code from "@sonnat/ui/Code"; +import Image from "components/Image"; +import AnchorButton from "components/AnchorButton"; +import WithTableOfContent from "components/layouts/WithTableOfContent"; +import Head from "next/head"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +export const meta = { + title: "آیکون", + description: + "آیکون‌های دیزاین سیستم سنّت تصاویری کوچک برای نمایش نمادینِ کنش‌ها، مفهوم پیام‌ها و شفاف‌کنندهٔ مسیر راهبری در بخش‌های مختلف رابط کاربر یک محصول‌اند. مشترک بودن این تصاویر با تجربهٔ متداول کاربران در محصولات دیجیتال، درک المان‌های تعاملی را آسان‌، لذت‌بخش و دسترس‌پذیر می‌کند.", + getLayout: () => page => + ( + + {page} + + ) +}; + + + {setTitleMeta(`${meta.title} | دیزاین سیستم سنّت`)} + {setDescriptionMeta(meta.description)} + {setCanonicalMeta(`${siteFullAddress}/foundation/icon`)} + {setKeywordsMeta([ + ...defaultKeywordsMetaContent, + "iconography", + "icon", + "icons", + "آیکون", + "آیکونوگرافی" + ])} + + +

    + {meta.title} + +

    + +

    {meta.description}

    + +

    + کاربرد + +

    + +

    + آیکون‌ها با قرارگیری در کامپوننت‌های مختلف دیزاین سیستم به شفافیت نقش تعاملی و + ارتباطی آن‌ها کمک می‌کنند. در دکمه‌ها، دکمه‌های آیکون‌دار و دکمه آیکون انتظار + کاربر را برای تعاملی‌بودن تأیید و در فیلدهای ورودی، دادهٔ مورد انتظار محصول از + کاربر را شفاف می‌کنند. هم‌چنین با استفادهٔ پیش‌فرض در بردکرام‌ها، ردیف‌ها و + فیلدهای انتخاب مسیر راهبری را پیش‌بینی‌پذیر می‌سازند. با استفاده از آیکون‌هایی + که کارشناس دسترس‌پذیری تأیید کرده‌ است، می‌توان در فضای مختص لیبل‌ها یا متن + دکمه‌ها صرفه‌جویی کرد. +

    + +

    + دیزاین + +

    + +

    + مفهوم نمادین + +

    + +

    + آیکون‌های دیزاین‌ سیستم سنّت ظاهری آشنا، سبک و انعطاف‌پذیر دارند. در گام اول + مفاهیم با توجه به تجربهٔ مشترک و فراگیر در محصولات دیجیتال طراحی شده‌اند. در + گام بعدی آیکون‌های جدید با حفظ یکپارچگی در استایل طراحی بصری، اختصار در مفهوم + ارائه‌شده و با خوانایی متمایز به مجموعه اضافه می‌شوند. +

    + + + +

    + این یکپارچگی با استفاده از اشکال هندسی مشخص، چیدمانی با حداکثر تقارن و خطوط + موازی تأمین می‌شود. +

    + + + +

    + بوم دیزاین + +

    + +

    + بوم دیزاین آیکون‌ها در فضایی مربع با ابعاد 24dp در نظر گرفته می‌شود و خطوط و + اشکال هندسی سازندهٔ آیکون محدود به آن است. این اجزاء معمولا در محدودهٔ مربعی + 22dp در مرکز بوم قرار می گیرند و در مواردی که پیچیدگی دیزاین و تأمین خوانایی + آیکون فضایی بیشتر نیاز دارد این محدوده به ابعاد 24dp در یک بعد افزایش می‌یابد. +

    + + + + + + + + + + +

    + شکل‌های هندسی + +

    + +

    + دایره، مربع، مستطیل‌ افقی، عمودی و مورب شکل‌های هندسی اصلی‌ای هستند که با توجه + به چیدمان مناسب برای طراحی نماد انتخاب‌شده به‌کار می‌روند. با حفظ این شکل‌ها + در زمینهٔ طراحی، ساختاری هماهنگ و انعطاف‌پذیر در طراحی ایجاد می‌شود که چیدمان + اجزاء آیکون را در فضای بوم تنظیم می‌کند. +
    + با استفاده از سایر شکل‌های هندسی مانند مثلث، چهارضلعی و چند ضلعی‌های منتظم و + حفظ تقارن حداکثری، اجزاء آیکون طراحی می‌شوند و در ساختار شکل‌های هندسی اصلی + کنار هم قرار می‌گیرند. +

    + + + +

    + ضخامت خط + +

    + +

    + ضخامت خط در بخش‌های اصلی آیکون‌ها 2dp است و در طراحی‌هایی با اجزاء پیچیده این + ضخامت در بخش‌های غیر اصلی به 1.5dp و 1dp کاهش می‌یابد. +

    + + + +

    + گوشه‌ها + +

    + +

    + شعاع گوشه‌های آیکون‌ها در انتهای خطوطی با زاویهٔ ۹۰ درجه و زوایای بیرونی + شکل‌ها 2dp است. در بخش‌هایی که خطوط با زاویه‌ای غیر از ۹۰ درجه خمیده شده یا با + منحنی‌ها تلاقی دارند و همچنین زوایای درونی شکل‌ها، گردی گوشه‌ها از 1dp تا 0dp + انتخاب می‌شود. تمامی خطوط اطراف اشکال به گوشهٔ کاملا گرد منتهی می‌شوند به‌غیر + از مواردی که شکل یا خطی دیگر با زاویه‌ای غیر از ۹۰ درجه آن را بریده باشد. +

    + + + +

    + استایل + +

    + +

    + آیکون‌های سنّت با ۲ استایل توپر و توخالی طراحی می‌شوند که با توجه به محل + کاربرد در محصول می‌توان از هر دوی آن‌ها استفاده کرد. +

    + + + +

    + مقیاس + +

    + +

    + آیکون‌ها در مقیاس 24dp در مختصات صحیح پیکسل‌های بوم طراحی شده‌اند تا کاملاً + شفاف باشند. Perfect Pixel بودن اجزاء آیکون‌ها کمک می‌کند تا در مقیاس‌های + کوچک‌تر و بزرگ‌تر از 24dp تا حد زیادی از اعوجاج (Distortion) این اجزاء جلوگیری + شود. +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    مقیاس‌های آیکون‌های سنّت
    مقیاسنام مقیاس
    16dpxxs
    18dpxs
    20dpsm
    24dpmd
    32dplg
    40dpxlg
    + +

    + قواعد نام‌گذاری + +

    + +

    + نام‌ آیکون‌ها نباید به کاربرد آن‌ها در سیستم اشاره کند، بلکه باید آن‌ها را + توصیف کند. +
    + برای نام‌گذاری آیکون‌ها در سنّت از فرمول زیر استفاده می‌شود: +

    + +{`{object-names}-{shape?}-{size?}-{multiple?}-{variant?-number?}-{outlined?}-{thickness?}`} + +
    + توجه: علامت "?" به معنی اختیاری و موقعیتی بودن کلیدواژه است. +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    قواعد نام‌گذاری آیکون‌های سنّت
    Keywordکاربرد
    + {`{object-names}`} + + توصیف از چپ به راست آبجکت استفاده‌شده در آیکون که بین آن‌ها با "-" + فاصله‌گذاری شده است. +
    + {`{shapes}`} + توصیف شکل پس‌زمینهٔ آیکون. (square, circle, card and etc.)
    + {`{size}`} + توصیف اندازهٔ آیکون (small, medium, large and etc.)
    + {`{multiple}`} + توصیف تکرار در آیکون. (در صورتی که طرح اصلی تکرار شده باشد)
    + {`{variant-number}`} + + گاهی چندین طرح از یک آیکون موجود است که برای تمایز بین آن‌ها از + کلیدواژهٔ variant استفاده می‌شود. در صورتی که چندین گونهٔ مختلف از آیکون + وجود داشت، شمارهٔ گونه هم نوشته می‌شود. مثال: *-variant-1, *-variant-2 + and etc. +
    + {`{outlined}`} + + توصیف اینکه آیکون خطی طراحی شده است یا نه. در صورت خطی بودن آیکون در + انتها کلیدواژهٔ "o-" نوشته‌ می‌شود. +
    + {`{thickness}`} + توصیف ضخامت آیکون. (thick or thin)
    diff --git a/pages/foundation/layout/grid-and-breakpoints.mdx b/pages/foundation/layout/grid-and-breakpoints.mdx new file mode 100644 index 0000000..10e93f3 --- /dev/null +++ b/pages/foundation/layout/grid-and-breakpoints.mdx @@ -0,0 +1,333 @@ +import Divider from "@sonnat/ui/Divider"; +import Row from "@sonnat/ui/Row"; +import Column from "@sonnat/ui/Column"; +import Code from "@sonnat/ui/Code"; +import Image from "components/Image"; +import Behaviour from "components/Behaviour"; +import AnchorButton from "components/AnchorButton"; +import WithTableOfContent from "components/layouts/WithTableOfContent"; +import Head from "next/head"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +export const meta = { + title: "گرید و نقاط‌ شکست", + description: + "چیدمان صفحات در ساختار گرید شکل می‌گیرد و با وجود نقاط شکست، در تمام دستگاه‌ها رفتاری منعطف و پیش‌بینی‌پذیر خواهد داشت.", + getLayout: () => page => + ( + + {page} + + ) +}; + + + {setTitleMeta(`${meta.title} | دیزاین سیستم سنّت`)} + {setDescriptionMeta(meta.description)} + {setCanonicalMeta( + `${siteFullAddress}/foundation/layout/grid-and-breakpoints` + )} + {setKeywordsMeta([ + ...defaultKeywordsMetaContent, + "layout", + "grid", + "breakpoints", + "واکنش‌گرا", + "ریسپانسیو", + "گرید", + "نقاط شکست", + "چیدمان" + ])} + + +

    + {meta.title} + +

    + +

    {meta.description}

    + +

    + گرید واکنش‌گرا (Responsive Grid) + +

    + +

    + گرید چیدمانی دوبُعدی و یکی از اجزاء اصلی در دیزاین سیستم برای نمایش موقعیت + هماهنگ و پیوستگی عناصر صفحه است. گرید واکنش‌گرا به‌شکلی پویا چیدمان را براساس + اندازهٔ صفحه‌‌نمایش تغییر می‌دهد. تراز کردن عناصر با گرید صفحه باعث می‌شود + محتوای اصلی در مرکز صفحه قرار گیرد و تمرکز کاربر مخدوش نشود. رفتار گرید از + رفتار اجزاء تشکیل‌دهندهٔ آن تبعیت می‌کند. +

    + +

    + اجزای تشکیل‌دهندهٔ گرید + +

    + +

    گرید از ۳ بخش اصلی تشکیل شده است:

    + + + +

    + ۱. ستون (Column): ستون‌ها گریدها را می‌سازند و تعداد آن‌ها در + سنّت ۱۲ عدد است. عرض هر ستون با توجه به نقاط شکست تغییر می‌کند. +
    + ۲. گاتر (Gutter): فاصلهٔ خالی و ثابت بین ستون‌ها را گاتر + می‌گویند. در سنّت عرض هر گاتر 16px است. +
    + ۳. حاشیه (Margin): حاشیه فضای بیرونی گرید است و در سنّت با + توجه به نقاط شکست، عرض حاشیه‌ها می‌تواند برابر یا بزرگ‌تر از گاتر باشد. +

    + + + +

    + انواع گریدهای واکنش‌گرا + +

    + +

    + گرید ثابت (Fixed Grid) + +

    + +

    + به‌دلیل داشتن عرض ثابت در نقاط شکست مختلف و کنترل بیشتر روی چیدمان صفحه، از + این گرید در طراحی و توسعهٔ صفحات ساده‌ و پیش‌بینی‌پذیر استفاده می‌شود. همچنین + استفاده از این گرید خوانایی محتوای صفحه را افزایش می‌دهد. +

    + + + +

    + گرید سیّال (Fluid Grid) + +

    + +

    + به‌دلیل استفادهٔ کامل از عرض صفحه، از این گرید در طراحی و توسعهٔ صفحات پیچیده + استفاده می‌شود. در گرید سیال عرض ستون‌ها دائماً در نقاط شکست مختلف کم یا زیاد + می‌شود و اندازهٔ محتوا براساس آن تغییر می‌کند. +

    + + + + + +

    + کاربرد ستون‌ها در گرید‌های واکنش‌گرا + +

    + +

    + گسترهٔ ستون‌ها (Column Spanning) + +

    + +

    + در هر بخش از چیدمان با توجه به ساختار و چینش صفحه، می‌توان تعداد ستون‌های هر + جزء آن بخش را گسترش داد. این اجزاء به کمک گاترها از هم جدا می‌شوند. در نقاط + شکست می‌توان تعداد ستون‌ها را تغییر داد. +

    + + + +

    + اُفست (Offset) + +

    + +

    + لازم نیست همیشه محتوای صفحه در ۱۲ ستون قرار بگیرد و گاهی اوقات می‌تواند فضای + کوچک‌تری را در مرکز صفحه اشغال کند. برای مثال محتوا می‌تواند در ۸ ستون وسط + قرار بگیرد و دو ستون در اطراف آن خالی باشد. +

    + + + +

    + نقاط شکست (Breakpoints) + +

    + +

    + در نقاط شکست، طراحی صفحه و نحوهٔ نمایش محتوای آن تغییر می‌کند تا بهینه‌ترین + چیدمان را برای بهترین تجربهٔ کاربر ارائه دهد. عرض ستون‌ها، گاترها و حاشیه‌ها + در نقاط شکست برای هر صفحه‌نمایش متفاوت است. در سنّت ۶ نقطهٔ شکست وجود دارد. +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    نقاط شکست دیزاین سیستم سنّت
    بازهنام بازهعرض گرید ثابت
    519 - 320xxs100%
    520 - 767xs100%
    768 - 959sm100%
    960 - 1023md768px
    1024 - 1365lg960px
    ≥ 1366xlg1184px
    +
      +
    • تعداد ستون‌های سنّت در هر نقطهٔ شکست ۱۲ عدد است.
    • +
    • + عرض هر گاتر سنّت مقدار ثابت 16px است. 8px از راست و 8px از چپ. +
    • +
    • + چیدمان صفحه در هر بازه، رفتار مقدار کمینهٔ نقطه‌ شکست را در آن بازه + ارث می‌برد. +
    • +
    +
    + +

    + رفتار + +

    + +

    + در راهنمای زیر رفتار گریدهای واکنش‌گرا در کاربردهای مختلف دیزاین توضیح داده + شده است. +

    + +
    + + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    +
    +
    diff --git a/pages/foundation/layout/understanding-layout-and-spacings.mdx b/pages/foundation/layout/understanding-layout-and-spacings.mdx new file mode 100644 index 0000000..0a538ed --- /dev/null +++ b/pages/foundation/layout/understanding-layout-and-spacings.mdx @@ -0,0 +1,116 @@ +import Divider from "@sonnat/ui/Divider"; +import Row from "@sonnat/ui/Row"; +import Column from "@sonnat/ui/Column"; +import Code from "@sonnat/ui/Code"; +import Image from "components/Image"; +import Behaviour from "components/Behaviour"; +import AnchorButton from "components/AnchorButton"; +import WithTableOfContent from "components/layouts/WithTableOfContent"; +import Head from "next/head"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +export const meta = { + title: "درک چیدمان و فاصله‌گذاری", + description: + "چیدمان و فاصله‌گذاری در همنشینی با یکدیگر ظاهر بصری، اولویت‌ها و وابستگی‌های المان‌های رابط کاربر را شفاف می‌کنند و هر کدام در دیزاین سیستم سنّت قواعد مشخصی دارند. با رعایت این قواعد، صفحات مختلف محصول ساختاری یکپارچه و باثبات خواهد داشت.", + getLayout: () => page => + ( + + {page} + + ) +}; + + + {setTitleMeta(`${meta.title} | دیزاین سیستم سنّت`)} + {setDescriptionMeta(meta.description)} + {setCanonicalMeta( + `${siteFullAddress}/foundation/layout/understanding-layout-and-spacings` + )} + {setKeywordsMeta([ + ...defaultKeywordsMetaContent, + "layout", + "spacing", + "spacings", + "فاصله‌گذاری", + "چیدمان" + ])} + + +

    + {meta.title} + +

    + +

    {meta.description}

    + +

    + چیدمان (Layout) + +

    + +

    + چیدمان جزء اصلی صفحهٔ وب واکنش‌گرا است که از تعدادی نگهدارنده تشکیل شده است تا + فضای مجاز طراحی را تعیین کنند. چیدمان واکنش‌گرای نگه‌دارنده‌ها از رفتار گرید + در صفحات مختلف پیروی می‌کند. +

    + + + +

    + فاصله‌گذاری (Spacing) + +

    + +

    + فاصله‌گذاری در سنّت براساس واحدی ثابت انجام می‌شود. این واحد ثابت مضربی از عدد + ۸ است و با توجه به ساختار و اجزای مختلف صفحه، از آن استفاده می‌شود. ۲ نوع + فاصله‌گذاری در سنّت وجود دارد: +

    + +
      +
    • + فاصله‌گذاری بین اجزاء یک کامپوننت: حداقل و حداکثر فاصلهٔ هر + جز در کامپوننت، 2dp و 16dp است. +
    • +
    • + فاصله‌گذاری بین کامپوننت‌ها: حداقل و حداکثر فاصله‌ی + کامپوننت‌ها از یکدیگر براساس صفحه و نوع چیدمان‌شان، 4dp و 128dp است. +
    • +
    + +

    + مقادیر تعیین‌شده در روش فاصله‌گذاری سنّت در فاصله‌ها (Paddings) و حاشیه‌های + (Margins) المان‌ها و کامپوننت‌ها استفاده می‌شوند تا چیدمان‌ صفحات و اجزایشان + باثبات و رفتار واکنش‌گرایشان پیش‌بینی‌پذیر باشد +

    + + diff --git a/pages/foundation/typography.mdx b/pages/foundation/typography.mdx new file mode 100644 index 0000000..926e1e9 --- /dev/null +++ b/pages/foundation/typography.mdx @@ -0,0 +1,281 @@ +import Divider from "@sonnat/ui/Divider"; +import Row from "@sonnat/ui/Row"; +import Column from "@sonnat/ui/Column"; +import AnchorButton from "components/AnchorButton"; +import WithTableOfContent from "components/layouts/WithTableOfContent"; +import Image from "components/Image"; +import Head from "next/head"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +export const meta = { + title: "تایپوگرافی", + description: + "متن‌ها برای انتقال مفاهیم اصلی، کمک به کاربر برای تعامل با محصول و همچنین ایجاد تجربهٔ کاربرِ مناسب اهمیت ویژه‌ای دارند. تایپوگرافی با توجه‌ به جزئیاتی مانند اندازهٔ فونت‌ها، استایل و رنگ آن‌ها، باید محتوای متن‌ها را به‌راحت‌ترین و خواناترین شکل ممکن به کاربر انتقال دهد.", + getLayout: () => page => + ( + + {page} + + ) +}; + + + {setTitleMeta(`${meta.title} | دیزاین سیستم سنّت`)} + {setDescriptionMeta(meta.description)} + {setCanonicalMeta(`${siteFullAddress}/foundation/typography`)} + {setKeywordsMeta([ + ...defaultKeywordsMetaContent, + "typography", + "تایپوگرافی", + "text", + "متن" + ])} + + +

    + {meta.title} + +

    + +

    {meta.description}

    + +

    + مفاهیم + +

    + +

    + اندازه فونت (Font Size) + +

    + +

    + اندازهٔ کاراکترهای فونت را نشان می‌دهد و کوچکترین واحد اندازه‌گیری آن پوینت + (pt)، معادل ۱.۷۲ اینچ است. در تایپ دیجیتال حروف در فضایی فرضی به نام em square + قرار می‌گیرند که ابعاد آن را اندازهٔ فونت مشخص می‌کند. برای مثال حروف فونتی با + اندازهٔ ۱۰pt در فضایی با ابعاد ۱۰pt قرار می‌گیرند. +

    + + + +

    + انتخاب اندازهٔ فونت مناسب در خوانایی متن بسیار مهم است. به‌علاوه می‌توان با + استفاده از فونت‌هایی با اندازهٔ متفاوت و ایجاد تضاد، مفاهیم را سریع‌تر به + کاربر منتقل کرد. اندازهٔ فونت‌های استفاده‌شده و واحدهای آن‌ها در دیزاین سیستم + سنّت به شکل زیر است: +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    اندازه فونت‌های دیزاین سیستم سنّت
    WebAndroidiOS
    0.5rem--
    0.625rem--
    0.75rem12pt12sp
    0.875rem14pt14sp
    1rem16pt16sp
    1.125rem18pt18sp
    1.25rem20pt20sp
    1.5rem--
    2rem--
    3rem--
    + واحد rem در مرورگرها براساس اندازهٔ فونت root element تعیین می‌شود که به + صورت پیش‌فرض 16px است. +
    + + + +

    + وزن فونت (Font Weight) + +

    + +

    + نسبت ضخامت کاراکتر به ارتفاع آن، وزن فونت را تعیین می‌کند. وزن‌ها در مقیاس + عددی در بازه‌ای بین ۱۰۰ تا ۹۰۰ (۱۰۰، ۲۰۰، ۳۰۰، ... ، ۹۰۰) قرار می‌گیرند. برای + مثال مقدار فونت نرمال ۴۰۰ و مقدار فونت bold معادل ۷۰۰ است. برای اغلب فونت‌ها + همهٔ این ۹ حالت تعریف نشده است. +
    + در دیزاین سیستم سنّت از وزن‌های Medium ،Regular ،Light و Bold خانوادهٔ فونت + IRANSans استفاده شده است. سلسله مراتب متن به‌وسیلهٔ تفاوت در وزن فونت متمایز + می شود. +

    + + + + + +

    + ارتفاع خط (Line Height) + +

    + +

    + به فاصلهٔ عمودی بین خطوط، ارتفاع خط گفته می‌شود. رایج‌ترین مقدار برای ارتفاع + خط ۱.۵em است. در دیزاین سیستم سنّت این مقدار بدون واحد (unitless) و با مقادیر + ۱.۵ در متن‌‌های عنوان و ۲ در متن‌های بدنه در نظر گرفته شده است. +

    + + + + + +

    + کامپوننت‌ها و کاربردهای آن + +

    + +

    + متن‌های عنوان اصلی (Headings) + +

    + +

    + تایپوگرافی برای تگ‌های عنوان HTML اندازه و وزن فونت و ارتفاع خط را مشخص کرده + ‌است تا متن در حفظ خوانایی و سلسله مراتب موثر و قاعده‌مند عمل کند. +

    + +

    + متن زیرعنوان (Subtitle Text) + +

    + +

    + برای نمایش عنوان‌ها در بخش‌‌های مختلف رابط کاربر و همچنین عنوان‌های ساختار + کامپوننت‌ها، از متن عنوان استفاده می‌شود. +

    + +

    + متن بدنه (Body Text) + +

    + +

    + در کامپوننت متن بدنه از فونت‌های کوچکتری نسبت به متن عنوان استفاده می‌شود. این + کامپوننت برای متن‌های طولانی کاربرد دارد و در بدنهٔ اصلی و نیز بخش توضیحات در + ساختار کامپوننت‌ها استفاده می‌شود. +

    + +

    + متن زیرنویس (Caption Text) + +

    + +

    + این کامپوننت برای نوشتن توضیح عکس‌ها، جدول‌ها و توضیحات داخل کامپوننت‌های کوچک + مانند ابزار راهنما کاربرد دارد و کوچکترین اندازهٔ فونت برای آن استفاده می‌شود. +

    + + + +

    + دسترس‌پذیری + +

    + +

    + رنگ‌های متن + +

    + +

    + رنگ‌های متن دیزاین سیستم سنّت براساس دستورالعمل‌های دسترس‌پذیری محتوای وب + (WCAG) تنظیم می‌شوند. با ایجاد کنتراست رنگ سطح AA (حداقل نسبت کنتراست ۴.۵:۱) + میان رنگ متن‌های اصلی و رنگ پس‌زمینه، خوانایی محتوای متنی صفحات تضمین می‌شود. +

    diff --git a/pages/index.tsx b/pages/index.tsx new file mode 100644 index 0000000..ceba3fe --- /dev/null +++ b/pages/index.tsx @@ -0,0 +1,224 @@ +import ChevronLeft from "@sonnat/icons/ChevronLeft"; +import Column from "@sonnat/ui/Column"; +import Row from "@sonnat/ui/Row"; +import makeStyles from "@sonnat/ui/styles/makeStyles"; +import Text from "@sonnat/ui/Text"; +import clx from "classnames"; +import Image from "components/Image"; +import Head from "next/head"; +import Link from "next/link"; +import * as React from "react"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +const pageName = "LandingPage"; + +const useCoreTopicStyles = makeStyles( + theme => { + const { + breakpoints, + colors, + direction, + typography: { pxToRem } + } = theme; + + return { + root: { + display: "flex", + flexDirection: "column", + alignItems: "flex-start" + }, + title: { marginBottom: pxToRem(16) }, + description: {}, + link: { + marginTop: pxToRem(16), + color: colors.primary.origin, + display: "inline-flex", + alignItems: "center", + "&:hover": { + // @ts-ignore + color: colors.primaryActive + } + }, + linkText: {}, + linkIcon: { + ...(direction === "rtl" + ? { marginRight: pxToRem(4) } + : { marginLeft: pxToRem(4) }) + }, + [breakpoints.down("sm")]: { + link: { + ...(direction === "rtl" + ? { marginRight: "auto" } + : { marginLeft: "auto" }) + } + } + }; + }, + { name: "CoreTopic" } +); + +const usePageStyles = makeStyles( + theme => { + const { + breakpoints, + typography: { pxToRem, variants } + } = theme; + + return { + root: {}, + title: {}, + subtitle: { + marginTop: pxToRem(8), + marginBottom: pxToRem(32) + }, + heroImagery: { + marginBottom: pxToRem(32) + }, + coreTopic: {}, + divider: { + marginTop: pxToRem(64), + marginBottom: pxToRem(48) + }, + changeLogRow: {}, + changeLogRowTitle: { marginBottom: pxToRem(16) }, + changeLogRowDescription: {}, + changeLogs: { + display: "flex", + flexDirection: "column", + alignItems: "center", + marginTop: pxToRem(16) + }, + changeLogsButton: { marginTop: pxToRem(32) }, + [breakpoints.down("sm")]: { + title: { textAlign: "center", fontSize: variants.h4.fontSize }, + subtitle: { textAlign: "center" }, + heroImagery: { marginBottom: pxToRem(-16) }, + coreTopic: { marginTop: pxToRem(32) } + } + }; + }, + { name: pageName, index: 1 } +); + +interface CoreTopicProps { + title: string; + className: string; + description: string; + linkHref: string; + linkText: string; +} + +const CoreTopic: React.FC = React.memo(props => { + const { title, description, className, linkHref, linkText } = props; + + const classes = useCoreTopicStyles(); + + return ( +
    + + {title} + + + {description} + + + + {linkText} + + + +
    + ); +}); + +CoreTopic.displayName = "CoreTopic"; + +const LandingPage = () => { + const classes = usePageStyles(); + + return ( + + + {setTitleMeta("دیزاین سیستم سنّت")} + {setCanonicalMeta(siteFullAddress)} + {setDescriptionMeta( + "دیزاین سیستم سنّت - مجموعه‌ای از ابزارها و کامپوننت‌ها برای ساختن تجربهٔ دیجیتالی سازگار، پایدار و دسترس‌پذیر" + )} + {setKeywordsMeta(defaultKeywordsMetaContent)} + + + دیزاین سیستم سنّت + + + مجموعه‌ای از ابزارها و کامپوننت‌ها برای ساختن تجربهٔ دیجیتالی سازگار، + پایدار و دسترس‌پذیر + + + + + + + + + + + + ); +}; + +LandingPage.displayName = pageName; + +export default LandingPage; diff --git a/pages/introduction.mdx b/pages/introduction.mdx new file mode 100644 index 0000000..43f49ec --- /dev/null +++ b/pages/introduction.mdx @@ -0,0 +1,341 @@ +import Divider from "@sonnat/ui/Divider"; +import Row from "@sonnat/ui/Row"; +import Column from "@sonnat/ui/Column"; +import AnchorButton from "components/AnchorButton"; +import Image from "components/Image"; +import Head from "next/head"; +import { defaultKeywordsMetaContent, siteFullAddress } from "sharedVars"; +import { + setCanonicalMeta, + setDescriptionMeta, + setKeywordsMeta, + setTitleMeta +} from "utils"; + +export const meta = { + title: "آشنایی با سنّت", + description: + "دیزاین سیستم سنّت - مجموعه‌ای از ابزارها و کامپوننت‌ها برای ساختن تجربهٔ دیجیتالی سازگار، پایدار و دسترس‌پذیر", + getLayout: () => page => + ( + + + {page} + + + ) +}; + + + {setTitleMeta(`${meta.title} | دیزاین سیستم سنّت`)} + {setDescriptionMeta(meta.description)} + {setCanonicalMeta(`${siteFullAddress}/introduction`)} + {setKeywordsMeta([ + ...defaultKeywordsMetaContent, + "introduction", + "آشنایی با سنّت" + ])} + + +
    + +
    + +

    + {meta.title} + +

    + +

    دیزاین سیستمِ دیوار

    + +

    + دیزاین ‌سیستم و فلسفهٔ شکل‌گیری آن در محصولات + +

    + +

    + زبان مشترک برای تعامل بین نقش‌های مختلف + +

    + +

    + ​در تولید محصول دیجیتال تخصص‌های مختلف با میزان دانش و تجربهٔ متفاوت نقش + دارند. اگر ارتباط بین نقش‌های مختلف پیوسته و به‌جا نباشد، فرایند توسعهٔ محصول + جهت‌های مختلفی می‌گیرد. تعامل موثر در تیم‌های کوچک کلامی شکل می‌گیرد اما در + محصولی مانند «دیوار» که متشکل از چندین تیم محصولی با نقش‌های متفاوت است، ریسک + ایجاد شکاف دانش بیشتر است.​ +
    + برای حل مسئلهٔ تعامل در فرایند توسعهٔ محصول به «زبانی مشترک» میان همهٔ نقش‌ها + نیاز داشتیم تا ارتباط را راحت‌تر کند و وابسته به افراد نباشد. مثل همهٔ + زبان‌های دیگر این زبان نیز از حرف، کلمه و جمله تشکیل شده باشد و قواعد، قرار + گرفتن اجزاء آن را کنار هم تعیین کند. دیزاین سیستم همان زبان طراحی محصول است. +

    + +

    + بهینه‌سازی فرایند طراحی محصول + +

    + +

    + هدف از افزایش تعداد طراحان بالا بردن سرعت طراحی محصول، افزایش کیفیت تصمیمات و + در نتیجه خلق محصولی کاربرد‌پذیر است. نداشتن قواعدی مشترک برای دیزاین، مشکلاتی + را در مسیر تحقق این اهداف ایجاد می‌کند. مثلاً: +

    + +
      +
    • یکپارچگی طراحی بخش‌های مختلف محصول از بین می‌رود.
    • +
    • + چون اختلافات طراحی فقط در مرحلهٔ پیاده‌سازی معلوم می‌شوند، هزینهٔ بالایی + برای اصلاح ایجاد می‌کنند. +
    • +
    • طراحان در تیم‌های مختلف کارهای تکراری انجام می‌دهند.
    • +
    • + چون تصمیمات طراحی در گذشته مستند نشده است، یادگیری اصول و قواعد برای طراحان + جدید سخت می‌شود. سوالات تکراری طراحان مختلف، از نشانه‌های این مشکل است. +
    • +
    • + حفظ اصولی مانند دسترس‌پذیری در طراحی که به دانش طراح وابسته است، سخت می‌‌شود + و به آموزش یا افزایش انتظارات در مرحلهٔ استخدام نیاز دارد. +
    • +
    • طراحان زمان زیادی برای طراحی جزئیات رابط کاربر صرف می‌کنند.
    • +
    + +

    + دیزاین ‌سیستم راهی برای حل این مشکلات است. چون مرجعی متشکل از تصمیمات و قواعد + مستند‌شدهٔ طراحی است که با حفظ یکپارچگی در محصول، وابسته‌نبودن به افراد و حفظ + استانداردهای طراحی، باعث می‌شود طراحان زمان خود را به نوآوری در محصول، حل + مسائل واقعی کاربران و رشد شخصی اختصاص دهند و کاربران نیز محصول کاربردپذیرتری + را تجربه‌ کنند. +

    + +

    + تولد و رشد سنّت در دیوار + +

    + +

    + دیوار اولین محصولی نیست که به «زبان مشترک» برای تعامل بین نقش‌های مختلف و + بهینه‌سازی فرایند طراحی نیاز داشت. شرکت‌های بزرگی در جهان قبلاً با این مشکلات + روبه‌رو شده بودند. پس در اولین قدم تجربهٔ آن‌ها را بررسی کردیم تا متناسب با + ویژگی‌های دیوار، این راه‌حل را بازآفرینی کنیم. نام آن را سنّت گذاشتیم، چون + باور داریم راه و روشی است که نسل به نسل منتقل خواهد شد.​​ +
    + در طراحی سنّت رویکردی براینده داشتیم به این معنی که سیستمی مستقل از وضعیت فعلی + دیوار طراحی نکردیم. بلکه با استخراج الگوهای دیوار، سیستمی براساس همان الگوها + شکل دادیم و به‌تدریج آن را بهتر کردیم. همچنین این رویکرد باعث شد نگاهی انتقادی + به الگوهای دیوار داشته باشیم، دربارهٔ آن‌ها بحث کنیم و به اتفاق نظر برسیم که + در نتیجه هزینهٔ تغییر و توسعه برای تیم‌های محصولی توجیه‌پذیر شد.​​ +
    + طراحی و توسعهٔ سنّت از پلتفرم‌‌ اندروید شروع شد که میزبان سهم بیشتری از + کاربران دیوار است. در تعریف استایل‌ها، درجهٔ انتزاع کامپوننت‌ها و عملکردشان، + با{" "} + + تیم توسعهٔ کلاینت + {" "} + ارتباط مستقیم داشتیم. این تعامل به تخمین هزینهٔ توسعه و مقیاس‌پذیری سنّت کمک + می‌کرد. راهنمای استایل و کتابخانه‌‌ٔ توسعه‌داده‌شدهٔ کامپوننت‌ها به‌تدریج + کامل‌تر می‌شد. با شکل‌گیری سنّت، فرایند طراحی و توسعهٔ محصول روان‌تر شد و طی + چند روز دیوار را برای نابینایان و کم‌بینایان دسترس‌پذیر و « + + حالت شب + + » را به برنامهٔ دیوار اضافه کردیم. +
    + محسوس‌بودن فواید سنّت در برنامهٔ اندروید دیوار، باعث شد از آن در سایر پلتفرم‌ها + نیز استفاده کنیم. با ایجاد تغییراتی متناسب با پلتفرم، سنّت در برنامهٔ آی‌او‌اس + دیوار هم پیاده‌سازی شد. اما برای طراحی و توسعهٔ سنّت در وب به تخصص‌هایی فراتر از + مسئولیت‌های طراحان تجربهٔ کاربر نیاز داشتیم. برای رفع این چالش نقش + مهندس تجربهٔ کاربر + را به دیوار اضافه کردیم. با اضافه‌شدن این تخصص، نیازمندی‌های استخدام طراحان + تجربهٔ کاربر در دیوار نیز تغییر کرد. در حال حاضر اعضای صنف تجربهٔ کاربر دیوار متشکل + از طراحان، پژوهشگران، مهندسان و نویسندهٔ تجربهٔ کاربر است. +
    +

    + +

    + اصول و فرهنگ سنّت در دیوار + +

    + +

    + یکپارچگی (Consistency) + +

    + +

    + یکپارچگی بصری و عملکردی کامپوننت‌ها و دستورالعمل‌های سنّت تضمینی برای خلق + تجربهٔ یکپارچه در کل محصول برای کاربر است. طراحی براساس سنّت به ما اطمینان + می‌دهد که رابط کاربر در هر صفحهٔ نمایش و پلتفرمی به‌خوبی کار می‌کند. +

    + +

    + سرعت (Efficiency) + +

    + +

    + وجود مرجعی مشترک، احتمال انجام‌دادن کارهای تکراری در تیم‌های مختلف محصولی را + کاهش می‌دهد. با استفاده از کامپوننت‌های آماده و اصول مشخص، سرعت طراحی بالا + می‌رود و طراحان می‌توانند در کوتاه‌ترین زمان پروتوتایپ‌هایی مشابه با محصول + نهایی بسازند و روی حل مسئله، آزمودن فلوهای طراحی‌شده با کاربران و گرفتن + بازخورد متمرکز شوند.​ +

    + +

    + قطعیت (Certainty) + +

    + +

    + همکاری در طراحی و ساخت محصولات نقش به‌سزایی دارد. هرچه تعداد نفرات + تصمیم‌گیرنده در طراحی و توسعهٔ محصول بیشتر باشد، احتمال اختلاف نظر و سلیقه نیز + بیشتر می‌شود. اینجاست که نیاز به مستندسازی و نگهداری از تصمیمات گذشته، اهمیتی + جدی پیدا می‌کند. سنّت مجموعه‌ای از توافقات طراحی بین تمام تخصص‌ها در محصول است + و چون وابسته به نظر یا سلیقهٔ افراد نیست، قواعد ساده‌شدهٔ ماژولار، کامپوننت‌ها + و الگوهای آن مقیاس‌پذیر و تعمیم‌پذیر به تمام محصول‌اند.​​ +

    + +

    + تمرکز بر حل مسئله (Focus) + +

    + +

    + از آنجا که متخصصان طراحی و پیاده‌سازی رابط کاربر سنّت را طراحی کرده‌اند، همهٔ + نیازها از قبل پیش‌بینی شده و قواعد صحیح طراحی در دل کامپوننت‌ها و الگوها پنهان + شده‌اند. بنابراین طراحی‌ محصول دیجیتال با استفاده از سنّت دانش تخصصی در زمینهٔ + طراحی رابط کاربر نیاز ندارد. طراحان با استفاده از سنّت در هر سطح از دانش و + تجربهٔ طراحی رابط کاربر می‌توانند محصولاتی یکپارچه و کاربردپذیر طراحی کنند و + روی کشف و حل مسائل واقعی کاربران متمرکز باشند.​​​ +

    + +

    + ارزش‌های سنّت در فرایند طراحی محصول و تجربهٔ کاربر + +

    + +

    + فراگیر (Inclusive) + +

    + +

    + در حال حاضر{" "} + + ۳۵ میلیون نفر ماهیانه + {" "} + از دیوار استفاده می‌کنند. ۹ درصد از جامعه، به{" "} + + اختلالات بینایی + {" "} + (رنگ‌بینی، کم‌بینی و نابینایی) مبتلا هستند و + + فراگیر بودن استفاده از دیوار + {" "} + برای ما مهم است. در طراحی اجزاء سنّت، اصول دسترس‌پذیری رعایت شده است. هم‌چنین + ابزاری طراحی کرده‌ایم تا{" "} + + استاندارد‌های نسبت تضاد رنگ + {" "} + در طراحی رابط کاربر را بسنجیم.​​​ +

    + +

    + ساده و آموختنی‌ (Simple and Learnable) + +

    + +

    + ​سنّت منطبق با قواعد طراحی متریال و با الهام از چندین دیزاین‌ سیستم مطرح دنیا + طراحی شده و به همین دلیل مجموعه‌ای از الگوهای آشنای تعامل با محصولات دیجیتال + است. معماری اطلاعات و رفتار اجزاء آن چیزی خلاف انتظار کاربران نیست و یادگیری + آن نیز آسان است. +
    + در طراحی رابط کاربر وزن عناصر بصری نباید بیشتر از محتوا و فرایندی که برای + رسیدن به هدف کاربر طراحی شده است باشد تا کاربر بتواند در تعامل با رابط کاربر + روی رسیدن به هدف خود تمرکز کند. ازین رو عناصر و جزئیات غیرضروری در سنّت جایی + ندارند.​ +

    + +

    + قابل اعتماد (Trustworthy) + +

    + +

    + کاربران می‌توانند کار با محصولی که براساس سنّت طراحی شده است را به‌راحتی یاد + بگیرند و امکانات آن را بشناسند. این موضوع یکی از مهم‌ترین بسترهای اعتماد به + محصول است. اعتماد به اینکه مطابق انتظار عمل می‌کند، در مسیر رسیدن به هدف هرکجا + که لازم است کاربر را راهنمایی می‌کند، بین کُنش‌های مثبت و کنش‌‌هایی که باید با + احتیاط انجام شوند تفاوت قائل می‌شود، امکان بازگشت از کنش‌های اشتباه را در + اختیار کاربر می‌گذارد، بعد از هر تعامل کاربر با محصول عکس‌العمل یا بازخورد + مناسب نشان می‌دهد تا کاربر را از نتیجهٔ کنش آگاه‌ کند.​ +

    + +

    + پیوسته در حال رشد (Growing) + +

    + +

    + ​با افزایش سرعت توسعهٔ محصول و تمرکز طراحان بر حل مسئله، محصولاتی توسعه پیدا + می‌کنند که مطابق با بازخورد و نیاز کاربران دائماً رشد می‌کنند و امکانات + مناسب‌تری را ارائه می‌دهند. نتیجهٔ اضافه‌شدن امکاناتی که مسائل واقعی کاربران + را حل می‌کنند، افزایش رضایت آن‌ها است.​ +

    + + + +

    + ​محصولی که پیش روی شماست فقط حاصل طراحی طراحان نبوده و تک‌بعدی نیست. تمام + اهالی محصول دیوار در رشد آن نقش داشته‌اند. شما نیز در جایگاه مخاطب این محصول، + می‌توانید با بازخورد دادن به ما در رشد و بهبود سنّت نقش کلیدی داشته باشید. +

    diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png new file mode 100644 index 0000000..e1f91ab Binary files /dev/null and b/public/android-chrome-192x192.png differ diff --git a/public/android-chrome-512x512.png b/public/android-chrome-512x512.png new file mode 100644 index 0000000..feb234d Binary files /dev/null and b/public/android-chrome-512x512.png differ diff --git a/public/android-chrome-maskable-192x192.png b/public/android-chrome-maskable-192x192.png new file mode 100644 index 0000000..367cc29 Binary files /dev/null and b/public/android-chrome-maskable-192x192.png differ diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000..9ca2dc2 Binary files /dev/null and b/public/apple-touch-icon.png differ diff --git a/public/browserconfig.xml b/public/browserconfig.xml new file mode 100644 index 0000000..372dca3 --- /dev/null +++ b/public/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #2e294e + + + diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png new file mode 100644 index 0000000..fc13184 Binary files /dev/null and b/public/favicon-16x16.png differ diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png new file mode 100644 index 0000000..d82d469 Binary files /dev/null and b/public/favicon-32x32.png differ diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..65ff79b Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/manifest.json b/public/manifest.json new file mode 100644 index 0000000..6279006 --- /dev/null +++ b/public/manifest.json @@ -0,0 +1,27 @@ +{ + "short_name": "Sonnat", + "name": "Sonnat Design System", + "icons": [ + { + "src": "android-chrome-192x192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "android-chrome-192x192.png", + "type": "image/png", + "sizes": "192x192", + "purpose": "maskable" + }, + { + "src": "android-chrome-512x512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": "/", + "display": "standalone", + "background_color": "#FFFFFF", + "theme_color": "#EA475B", + "orientation": "portrait" +} diff --git a/public/meta-image-compressed.jpg b/public/meta-image-compressed.jpg new file mode 100644 index 0000000..1d672d0 Binary files /dev/null and b/public/meta-image-compressed.jpg differ diff --git a/public/mstile-144x144.png b/public/mstile-144x144.png new file mode 100644 index 0000000..2a162e5 Binary files /dev/null and b/public/mstile-144x144.png differ diff --git a/public/mstile-150x150.png b/public/mstile-150x150.png new file mode 100644 index 0000000..58cb613 Binary files /dev/null and b/public/mstile-150x150.png differ diff --git a/public/mstile-310x150.png b/public/mstile-310x150.png new file mode 100644 index 0000000..f60341c Binary files /dev/null and b/public/mstile-310x150.png differ diff --git a/public/mstile-310x310.png b/public/mstile-310x310.png new file mode 100644 index 0000000..3ae934f Binary files /dev/null and b/public/mstile-310x310.png differ diff --git a/public/mstile-70x70.png b/public/mstile-70x70.png new file mode 100644 index 0000000..7c9a00a Binary files /dev/null and b/public/mstile-70x70.png differ diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..01b0f9a --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,2 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * diff --git a/public/safari-pinned-tab.svg b/public/safari-pinned-tab.svg new file mode 100644 index 0000000..eb2d31c --- /dev/null +++ b/public/safari-pinned-tab.svg @@ -0,0 +1,46 @@ + + + + +Created by potrace 1.11, written by Peter Selinger 2001-2013 + + + + + diff --git a/public/static/font/eot/IRANSansWeb.eot b/public/static/font/eot/IRANSansWeb.eot new file mode 100755 index 0000000..553eec8 Binary files /dev/null and b/public/static/font/eot/IRANSansWeb.eot differ diff --git a/public/static/font/eot/IRANSansWeb_Black.eot b/public/static/font/eot/IRANSansWeb_Black.eot new file mode 100755 index 0000000..ee7c6a0 Binary files /dev/null and b/public/static/font/eot/IRANSansWeb_Black.eot differ diff --git a/public/static/font/eot/IRANSansWeb_Bold.eot b/public/static/font/eot/IRANSansWeb_Bold.eot new file mode 100755 index 0000000..746a6e6 Binary files /dev/null and b/public/static/font/eot/IRANSansWeb_Bold.eot differ diff --git a/public/static/font/eot/IRANSansWeb_Light.eot b/public/static/font/eot/IRANSansWeb_Light.eot new file mode 100755 index 0000000..f79a681 Binary files /dev/null and b/public/static/font/eot/IRANSansWeb_Light.eot differ diff --git a/public/static/font/eot/IRANSansWeb_Medium.eot b/public/static/font/eot/IRANSansWeb_Medium.eot new file mode 100755 index 0000000..8b31d6b Binary files /dev/null and b/public/static/font/eot/IRANSansWeb_Medium.eot differ diff --git a/public/static/font/eot/IRANSansWeb_UltraLight.eot b/public/static/font/eot/IRANSansWeb_UltraLight.eot new file mode 100755 index 0000000..fd4b205 Binary files /dev/null and b/public/static/font/eot/IRANSansWeb_UltraLight.eot differ diff --git a/public/static/font/ttf/IRANSansWeb.ttf b/public/static/font/ttf/IRANSansWeb.ttf new file mode 100755 index 0000000..7416c53 Binary files /dev/null and b/public/static/font/ttf/IRANSansWeb.ttf differ diff --git a/public/static/font/ttf/IRANSansWeb_Black.ttf b/public/static/font/ttf/IRANSansWeb_Black.ttf new file mode 100755 index 0000000..df4928f Binary files /dev/null and b/public/static/font/ttf/IRANSansWeb_Black.ttf differ diff --git a/public/static/font/ttf/IRANSansWeb_Bold.ttf b/public/static/font/ttf/IRANSansWeb_Bold.ttf new file mode 100755 index 0000000..158fbaa Binary files /dev/null and b/public/static/font/ttf/IRANSansWeb_Bold.ttf differ diff --git a/public/static/font/ttf/IRANSansWeb_Light.ttf b/public/static/font/ttf/IRANSansWeb_Light.ttf new file mode 100755 index 0000000..3060c60 Binary files /dev/null and b/public/static/font/ttf/IRANSansWeb_Light.ttf differ diff --git a/public/static/font/ttf/IRANSansWeb_Medium.ttf b/public/static/font/ttf/IRANSansWeb_Medium.ttf new file mode 100755 index 0000000..6dd6c5d Binary files /dev/null and b/public/static/font/ttf/IRANSansWeb_Medium.ttf differ diff --git a/public/static/font/ttf/IRANSansWeb_UltraLight.ttf b/public/static/font/ttf/IRANSansWeb_UltraLight.ttf new file mode 100755 index 0000000..7ebe1bf Binary files /dev/null and b/public/static/font/ttf/IRANSansWeb_UltraLight.ttf differ diff --git a/public/static/font/woff/IRANSansWeb.woff b/public/static/font/woff/IRANSansWeb.woff new file mode 100755 index 0000000..abb63f2 Binary files /dev/null and b/public/static/font/woff/IRANSansWeb.woff differ diff --git a/public/static/font/woff/IRANSansWeb_Black.woff b/public/static/font/woff/IRANSansWeb_Black.woff new file mode 100755 index 0000000..12c8a6e Binary files /dev/null and b/public/static/font/woff/IRANSansWeb_Black.woff differ diff --git a/public/static/font/woff/IRANSansWeb_Bold.woff b/public/static/font/woff/IRANSansWeb_Bold.woff new file mode 100755 index 0000000..801c55d Binary files /dev/null and b/public/static/font/woff/IRANSansWeb_Bold.woff differ diff --git a/public/static/font/woff/IRANSansWeb_Light.woff b/public/static/font/woff/IRANSansWeb_Light.woff new file mode 100755 index 0000000..99b8d5d Binary files /dev/null and b/public/static/font/woff/IRANSansWeb_Light.woff differ diff --git a/public/static/font/woff/IRANSansWeb_Medium.woff b/public/static/font/woff/IRANSansWeb_Medium.woff new file mode 100755 index 0000000..322c396 Binary files /dev/null and b/public/static/font/woff/IRANSansWeb_Medium.woff differ diff --git a/public/static/font/woff/IRANSansWeb_UltraLight.woff b/public/static/font/woff/IRANSansWeb_UltraLight.woff new file mode 100755 index 0000000..31c21ca Binary files /dev/null and b/public/static/font/woff/IRANSansWeb_UltraLight.woff differ diff --git a/public/static/font/woff2/IRANSansWeb.woff2 b/public/static/font/woff2/IRANSansWeb.woff2 new file mode 100755 index 0000000..21bbba5 Binary files /dev/null and b/public/static/font/woff2/IRANSansWeb.woff2 differ diff --git a/public/static/font/woff2/IRANSansWeb_Black.woff2 b/public/static/font/woff2/IRANSansWeb_Black.woff2 new file mode 100755 index 0000000..da34aad Binary files /dev/null and b/public/static/font/woff2/IRANSansWeb_Black.woff2 differ diff --git a/public/static/font/woff2/IRANSansWeb_Bold.woff2 b/public/static/font/woff2/IRANSansWeb_Bold.woff2 new file mode 100755 index 0000000..dd1436c Binary files /dev/null and b/public/static/font/woff2/IRANSansWeb_Bold.woff2 differ diff --git a/public/static/font/woff2/IRANSansWeb_Light.woff2 b/public/static/font/woff2/IRANSansWeb_Light.woff2 new file mode 100755 index 0000000..16dc9f1 Binary files /dev/null and b/public/static/font/woff2/IRANSansWeb_Light.woff2 differ diff --git a/public/static/font/woff2/IRANSansWeb_Medium.woff2 b/public/static/font/woff2/IRANSansWeb_Medium.woff2 new file mode 100755 index 0000000..5fb39d4 Binary files /dev/null and b/public/static/font/woff2/IRANSansWeb_Medium.woff2 differ diff --git a/public/static/font/woff2/IRANSansWeb_UltraLight.woff2 b/public/static/font/woff2/IRANSansWeb_UltraLight.woff2 new file mode 100755 index 0000000..eeeec11 Binary files /dev/null and b/public/static/font/woff2/IRANSansWeb_UltraLight.woff2 differ diff --git a/public/static/fonts.css b/public/static/fonts.css new file mode 100644 index 0000000..785dc51 --- /dev/null +++ b/public/static/fonts.css @@ -0,0 +1,81 @@ +@font-face { + font-family: "IRANSans"; + font-style: normal; + font-weight: 900; + src: url("./font/eot/IRANSansWeb_Black.eot"); + src: url("./font/eot/IRANSansWeb_Black.eot?#iefix") + format("embedded-opentype"), + /* IE6-8 */ url("./font/woff2/IRANSansWeb_Black.woff2") format("woff2"), + /* FF39+,Chrome36+, Opera24+*/ url("./font/woff/IRANSansWeb_Black.woff") + format("woff"), + /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ url("./font/ttf/IRANSansWeb_Black.ttf") + format("truetype"); +} + +@font-face { + font-family: "IRANSans"; + font-style: normal; + font-weight: bold; + src: url("./font/eot/IRANSansWeb_Bold.eot"); + src: url("./font/eot/IRANSansWeb_Bold.eot?#iefix") format("embedded-opentype"), + /* IE6-8 */ url("./font/woff2/IRANSansWeb_Bold.woff2") format("woff2"), + /* FF39+,Chrome36+, Opera24+*/ url("./font/woff/IRANSansWeb_Bold.woff") + format("woff"), + /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ url("./font/ttf/IRANSansWeb_Bold.ttf") + format("truetype"); +} + +@font-face { + font-family: "IRANSans"; + font-style: normal; + font-weight: 500; + src: url("./font/eot/IRANSansWeb_Medium.eot"); + src: url("./font/eot/IRANSansWeb_Medium.eot?#iefix") + format("embedded-opentype"), + /* IE6-8 */ url("./font/woff2/IRANSansWeb_Medium.woff2") format("woff2"), + /* FF39+,Chrome36+, Opera24+*/ url("./font/woff/IRANSansWeb_Medium.woff") + format("woff"), + /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ url("./font/ttf/IRANSansWeb_Medium.ttf") + format("truetype"); +} + +@font-face { + font-family: "IRANSans"; + font-style: normal; + font-weight: 300; + src: url("./font/eot/IRANSansWeb_Light.eot"); + src: url("./font/eot/IRANSansWeb_Light.eot?#iefix") + format("embedded-opentype"), + /* IE6-8 */ url("./font/woff2/IRANSansWeb_Light.woff2") format("woff2"), + /* FF39+,Chrome36+, Opera24+*/ url("./font/woff/IRANSansWeb_Light.woff") + format("woff"), + /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ url("./font/ttf/IRANSansWeb_Light.ttf") + format("truetype"); +} + +@font-face { + font-family: "IRANSans"; + font-style: normal; + font-weight: 200; + src: url("./font/eot/IRANSansWeb_UltraLight.eot"); + src: url("./font/eot/IRANSansWeb_UltraLight.eot?#iefix") + format("embedded-opentype"), + /* IE6-8 */ url("./font/woff2/IRANSansWeb_UltraLight.woff2") format("woff2"), + /* FF39+,Chrome36+, Opera24+*/ + url("./font/woff/IRANSansWeb_UltraLight.woff") format("woff"), + /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ + url("./font/ttf/IRANSansWeb_UltraLight.ttf") format("truetype"); +} + +@font-face { + font-family: "IRANSans"; + font-style: normal; + font-weight: normal; + src: url("./font/eot/IRANSansWeb.eot"); + src: url("./font/eot/IRANSansWeb.eot?#iefix") format("embedded-opentype"), + /* IE6-8 */ url("./font/woff2/IRANSansWeb.woff2") format("woff2"), + /* FF39+,Chrome36+, Opera24+*/ url("./font/woff/IRANSansWeb.woff") + format("woff"), + /* FF3.6+, IE9, Chrome6+, Saf5.1+*/ url("./font/ttf/IRANSansWeb.ttf") + format("truetype"); +} diff --git a/public/static/media/accordion-row-1.svg b/public/static/media/accordion-row-1.svg new file mode 100644 index 0000000..4a6ba83 --- /dev/null +++ b/public/static/media/accordion-row-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/backdrop-behaviour-1.svg b/public/static/media/backdrop-behaviour-1.svg new file mode 100644 index 0000000..d6d0337 --- /dev/null +++ b/public/static/media/backdrop-behaviour-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/backdrop-behaviour-2.svg b/public/static/media/backdrop-behaviour-2.svg new file mode 100644 index 0000000..a95ecf3 --- /dev/null +++ b/public/static/media/backdrop-behaviour-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/backdrop-usage-1.svg b/public/static/media/backdrop-usage-1.svg new file mode 100644 index 0000000..9e9dbf3 --- /dev/null +++ b/public/static/media/backdrop-usage-1.svg @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/backdrop-usage-2.svg b/public/static/media/backdrop-usage-2.svg new file mode 100644 index 0000000..07c4b50 --- /dev/null +++ b/public/static/media/backdrop-usage-2.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/backdrop-variation-1.svg b/public/static/media/backdrop-variation-1.svg new file mode 100644 index 0000000..1017b53 --- /dev/null +++ b/public/static/media/backdrop-variation-1.svg @@ -0,0 +1,200 @@ + + + variation_1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/static/media/backdrop-variation-2.svg b/public/static/media/backdrop-variation-2.svg new file mode 100644 index 0000000..163f65f --- /dev/null +++ b/public/static/media/backdrop-variation-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/badge-anatomy-1-spec.svg b/public/static/media/badge-anatomy-1-spec.svg new file mode 100644 index 0000000..f24052d --- /dev/null +++ b/public/static/media/badge-anatomy-1-spec.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/static/media/badge-anatomy-1.svg b/public/static/media/badge-anatomy-1.svg new file mode 100644 index 0000000..5ec0593 --- /dev/null +++ b/public/static/media/badge-anatomy-1.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/static/media/badge-anatomy-2-spec.svg b/public/static/media/badge-anatomy-2-spec.svg new file mode 100644 index 0000000..256fcfa --- /dev/null +++ b/public/static/media/badge-anatomy-2-spec.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/badge-anatomy-2.svg b/public/static/media/badge-anatomy-2.svg new file mode 100644 index 0000000..22285f5 --- /dev/null +++ b/public/static/media/badge-anatomy-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/badge-behaviour-1.svg b/public/static/media/badge-behaviour-1.svg new file mode 100644 index 0000000..5991f8e --- /dev/null +++ b/public/static/media/badge-behaviour-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/badge-behaviour-2.svg b/public/static/media/badge-behaviour-2.svg new file mode 100644 index 0000000..71e40be --- /dev/null +++ b/public/static/media/badge-behaviour-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/badge-behaviour-3.svg b/public/static/media/badge-behaviour-3.svg new file mode 100644 index 0000000..9c97144 --- /dev/null +++ b/public/static/media/badge-behaviour-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/badge-behaviour-4.svg b/public/static/media/badge-behaviour-4.svg new file mode 100644 index 0000000..49c2701 --- /dev/null +++ b/public/static/media/badge-behaviour-4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/breadcrumb-anatomy-1-spec.svg b/public/static/media/breadcrumb-anatomy-1-spec.svg new file mode 100644 index 0000000..47f888d --- /dev/null +++ b/public/static/media/breadcrumb-anatomy-1-spec.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/breadcrumb-anatomy-1.svg b/public/static/media/breadcrumb-anatomy-1.svg new file mode 100644 index 0000000..b76cf3f --- /dev/null +++ b/public/static/media/breadcrumb-anatomy-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/breadcrumb-anatomy-2-spec.svg b/public/static/media/breadcrumb-anatomy-2-spec.svg new file mode 100644 index 0000000..32adb1a --- /dev/null +++ b/public/static/media/breadcrumb-anatomy-2-spec.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/breadcrumb-anatomy-2.svg b/public/static/media/breadcrumb-anatomy-2.svg new file mode 100644 index 0000000..764eed7 --- /dev/null +++ b/public/static/media/breadcrumb-anatomy-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/breadcrumb-behaviour-1.svg b/public/static/media/breadcrumb-behaviour-1.svg new file mode 100644 index 0000000..69d88e5 --- /dev/null +++ b/public/static/media/breadcrumb-behaviour-1.svg @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/breadcrumb-behaviour-2.svg b/public/static/media/breadcrumb-behaviour-2.svg new file mode 100644 index 0000000..846b249 --- /dev/null +++ b/public/static/media/breadcrumb-behaviour-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/breadcrumb-behaviour-3.svg b/public/static/media/breadcrumb-behaviour-3.svg new file mode 100644 index 0000000..0c9df8f --- /dev/null +++ b/public/static/media/breadcrumb-behaviour-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/breadcrumb-behaviour-4.svg b/public/static/media/breadcrumb-behaviour-4.svg new file mode 100644 index 0000000..83b2dd7 --- /dev/null +++ b/public/static/media/breadcrumb-behaviour-4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/breadcrumb-behaviour-5.svg b/public/static/media/breadcrumb-behaviour-5.svg new file mode 100644 index 0000000..bdb2a67 --- /dev/null +++ b/public/static/media/breadcrumb-behaviour-5.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/public/static/media/breadcrumb-behaviour-6.svg b/public/static/media/breadcrumb-behaviour-6.svg new file mode 100644 index 0000000..a8de970 --- /dev/null +++ b/public/static/media/breadcrumb-behaviour-6.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/breadcrumb-behaviour-7.svg b/public/static/media/breadcrumb-behaviour-7.svg new file mode 100644 index 0000000..2c615a3 --- /dev/null +++ b/public/static/media/breadcrumb-behaviour-7.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/breadcrumb-behaviour-8.svg b/public/static/media/breadcrumb-behaviour-8.svg new file mode 100644 index 0000000..8f7809c --- /dev/null +++ b/public/static/media/breadcrumb-behaviour-8.svg @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/breadcrumb-elements.svg b/public/static/media/breadcrumb-elements.svg new file mode 100644 index 0000000..f3389b7 --- /dev/null +++ b/public/static/media/breadcrumb-elements.svg @@ -0,0 +1,53 @@ + + + usage + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/static/media/breadcrumb-variation-1.svg b/public/static/media/breadcrumb-variation-1.svg new file mode 100644 index 0000000..ce53dec --- /dev/null +++ b/public/static/media/breadcrumb-variation-1.svg @@ -0,0 +1,32 @@ + + + variation_1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/static/media/breadcrumb-variation-2.svg b/public/static/media/breadcrumb-variation-2.svg new file mode 100644 index 0000000..2c8e2a5 --- /dev/null +++ b/public/static/media/breadcrumb-variation-2.svg @@ -0,0 +1,41 @@ + + + variation_2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/static/media/button-anatomy-1-spec.svg b/public/static/media/button-anatomy-1-spec.svg new file mode 100644 index 0000000..9d11a74 --- /dev/null +++ b/public/static/media/button-anatomy-1-spec.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/button-anatomy-1.svg b/public/static/media/button-anatomy-1.svg new file mode 100644 index 0000000..ce65cbf --- /dev/null +++ b/public/static/media/button-anatomy-1.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/static/media/button-anatomy-2-spec.svg b/public/static/media/button-anatomy-2-spec.svg new file mode 100644 index 0000000..81a18a9 --- /dev/null +++ b/public/static/media/button-anatomy-2-spec.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/button-anatomy-2.svg b/public/static/media/button-anatomy-2.svg new file mode 100644 index 0000000..f3bacef --- /dev/null +++ b/public/static/media/button-anatomy-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/button-anatomy-3-spec.svg b/public/static/media/button-anatomy-3-spec.svg new file mode 100644 index 0000000..6a25bed --- /dev/null +++ b/public/static/media/button-anatomy-3-spec.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/button-anatomy-3.svg b/public/static/media/button-anatomy-3.svg new file mode 100644 index 0000000..47cc996 --- /dev/null +++ b/public/static/media/button-anatomy-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/button-anatomy-4-spec.svg b/public/static/media/button-anatomy-4-spec.svg new file mode 100644 index 0000000..f436bbd --- /dev/null +++ b/public/static/media/button-anatomy-4-spec.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/button-anatomy-4.svg b/public/static/media/button-anatomy-4.svg new file mode 100644 index 0000000..d337765 --- /dev/null +++ b/public/static/media/button-anatomy-4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/button-behaviour-1.svg b/public/static/media/button-behaviour-1.svg new file mode 100644 index 0000000..5497ad0 --- /dev/null +++ b/public/static/media/button-behaviour-1.svg @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/button-behaviour-2.svg b/public/static/media/button-behaviour-2.svg new file mode 100644 index 0000000..74281d3 --- /dev/null +++ b/public/static/media/button-behaviour-2.svg @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/button-behaviour-3.svg b/public/static/media/button-behaviour-3.svg new file mode 100644 index 0000000..3ef3a8d --- /dev/null +++ b/public/static/media/button-behaviour-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/button-behaviour-4.svg b/public/static/media/button-behaviour-4.svg new file mode 100644 index 0000000..37b56b5 --- /dev/null +++ b/public/static/media/button-behaviour-4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/button-behaviour-5.svg b/public/static/media/button-behaviour-5.svg new file mode 100644 index 0000000..e6d252d --- /dev/null +++ b/public/static/media/button-behaviour-5.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/button-behaviour-6.svg b/public/static/media/button-behaviour-6.svg new file mode 100644 index 0000000..b69fae7 --- /dev/null +++ b/public/static/media/button-behaviour-6.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/button-behaviour-7.svg b/public/static/media/button-behaviour-7.svg new file mode 100644 index 0000000..3e529b2 --- /dev/null +++ b/public/static/media/button-behaviour-7.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/button-behaviour-8.svg b/public/static/media/button-behaviour-8.svg new file mode 100644 index 0000000..f7068b3 --- /dev/null +++ b/public/static/media/button-behaviour-8.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/button-emphasis-1.svg b/public/static/media/button-emphasis-1.svg new file mode 100644 index 0000000..4f0de6b --- /dev/null +++ b/public/static/media/button-emphasis-1.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/button-emphasis-2.svg b/public/static/media/button-emphasis-2.svg new file mode 100644 index 0000000..85fc013 --- /dev/null +++ b/public/static/media/button-emphasis-2.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/chip-anatomy-1-spec.svg b/public/static/media/chip-anatomy-1-spec.svg new file mode 100644 index 0000000..c6faf91 --- /dev/null +++ b/public/static/media/chip-anatomy-1-spec.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/chip-anatomy-1.svg b/public/static/media/chip-anatomy-1.svg new file mode 100644 index 0000000..abb721b --- /dev/null +++ b/public/static/media/chip-anatomy-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/chip-anatomy-2-spec.svg b/public/static/media/chip-anatomy-2-spec.svg new file mode 100644 index 0000000..2043f6c --- /dev/null +++ b/public/static/media/chip-anatomy-2-spec.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/chip-anatomy-2.svg b/public/static/media/chip-anatomy-2.svg new file mode 100644 index 0000000..0cca121 --- /dev/null +++ b/public/static/media/chip-anatomy-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/chip-anatomy-3-spec.svg b/public/static/media/chip-anatomy-3-spec.svg new file mode 100644 index 0000000..6aaa5b0 --- /dev/null +++ b/public/static/media/chip-anatomy-3-spec.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/chip-anatomy-3.svg b/public/static/media/chip-anatomy-3.svg new file mode 100644 index 0000000..4c307d0 --- /dev/null +++ b/public/static/media/chip-anatomy-3.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/static/media/chip-anatomy-4-spec.svg b/public/static/media/chip-anatomy-4-spec.svg new file mode 100644 index 0000000..c8856af --- /dev/null +++ b/public/static/media/chip-anatomy-4-spec.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/chip-anatomy-4.svg b/public/static/media/chip-anatomy-4.svg new file mode 100644 index 0000000..fb20671 --- /dev/null +++ b/public/static/media/chip-anatomy-4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/chip-behaviour-1.svg b/public/static/media/chip-behaviour-1.svg new file mode 100644 index 0000000..e3d59fb --- /dev/null +++ b/public/static/media/chip-behaviour-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/chip-behaviour-2.svg b/public/static/media/chip-behaviour-2.svg new file mode 100644 index 0000000..9ca4120 --- /dev/null +++ b/public/static/media/chip-behaviour-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/chip-behaviour-3.svg b/public/static/media/chip-behaviour-3.svg new file mode 100644 index 0000000..da3851d --- /dev/null +++ b/public/static/media/chip-behaviour-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/chip-emphasis-1.svg b/public/static/media/chip-emphasis-1.svg new file mode 100644 index 0000000..1f90fd0 --- /dev/null +++ b/public/static/media/chip-emphasis-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/chip-emphasis-2.svg b/public/static/media/chip-emphasis-2.svg new file mode 100644 index 0000000..f6d2fbd --- /dev/null +++ b/public/static/media/chip-emphasis-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/connection.svg b/public/static/media/connection.svg new file mode 100644 index 0000000..e96680f --- /dev/null +++ b/public/static/media/connection.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/control-row-1.svg b/public/static/media/control-row-1.svg new file mode 100644 index 0000000..5c13eda --- /dev/null +++ b/public/static/media/control-row-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/control-row-2.svg b/public/static/media/control-row-2.svg new file mode 100644 index 0000000..13b28e3 --- /dev/null +++ b/public/static/media/control-row-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/control-row-3.svg b/public/static/media/control-row-3.svg new file mode 100644 index 0000000..0b0e0da --- /dev/null +++ b/public/static/media/control-row-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/divider-behaviour-1.svg b/public/static/media/divider-behaviour-1.svg new file mode 100644 index 0000000..82fcdd0 --- /dev/null +++ b/public/static/media/divider-behaviour-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/divider-behaviour-2.svg b/public/static/media/divider-behaviour-2.svg new file mode 100644 index 0000000..baa864a --- /dev/null +++ b/public/static/media/divider-behaviour-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/divider-behaviour-3.svg b/public/static/media/divider-behaviour-3.svg new file mode 100644 index 0000000..0fc5da4 --- /dev/null +++ b/public/static/media/divider-behaviour-3.svg @@ -0,0 +1,84 @@ + + + behavior_3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/static/media/divider-variation-1.svg b/public/static/media/divider-variation-1.svg new file mode 100644 index 0000000..2296aa1 --- /dev/null +++ b/public/static/media/divider-variation-1.svg @@ -0,0 +1,49 @@ + + + variation_1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/static/media/divider-variation-2.svg b/public/static/media/divider-variation-2.svg new file mode 100644 index 0000000..2502f56 --- /dev/null +++ b/public/static/media/divider-variation-2.svg @@ -0,0 +1,54 @@ + + + variation_2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/static/media/divider-variation-3.svg b/public/static/media/divider-variation-3.svg new file mode 100644 index 0000000..05ce334 --- /dev/null +++ b/public/static/media/divider-variation-3.svg @@ -0,0 +1,47 @@ + + + variation_3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/static/media/divider-variation-4.svg b/public/static/media/divider-variation-4.svg new file mode 100644 index 0000000..7bc22d0 --- /dev/null +++ b/public/static/media/divider-variation-4.svg @@ -0,0 +1,43 @@ + + + variation_4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/static/media/evaluation-row-1.svg b/public/static/media/evaluation-row-1.svg new file mode 100644 index 0000000..1873eae --- /dev/null +++ b/public/static/media/evaluation-row-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/feature-row-1.svg b/public/static/media/feature-row-1.svg new file mode 100644 index 0000000..f379354 --- /dev/null +++ b/public/static/media/feature-row-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/feature-row-2.svg b/public/static/media/feature-row-2.svg new file mode 100644 index 0000000..0fe5af3 --- /dev/null +++ b/public/static/media/feature-row-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/hero-illustration.svg b/public/static/media/hero-illustration.svg new file mode 100644 index 0000000..1087137 --- /dev/null +++ b/public/static/media/hero-illustration.svg @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/iconography-consistency.svg b/public/static/media/iconography-consistency.svg new file mode 100644 index 0000000..69ceb33 --- /dev/null +++ b/public/static/media/iconography-consistency.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/iconography-corners.svg b/public/static/media/iconography-corners.svg new file mode 100644 index 0000000..61d9a73 --- /dev/null +++ b/public/static/media/iconography-corners.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/iconography-grids.svg b/public/static/media/iconography-grids.svg new file mode 100644 index 0000000..0043979 --- /dev/null +++ b/public/static/media/iconography-grids.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/iconography-guidelines.svg b/public/static/media/iconography-guidelines.svg new file mode 100644 index 0000000..5411987 --- /dev/null +++ b/public/static/media/iconography-guidelines.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/iconography-icons.svg b/public/static/media/iconography-icons.svg new file mode 100644 index 0000000..3cfc56d --- /dev/null +++ b/public/static/media/iconography-icons.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/iconography-shapes.svg b/public/static/media/iconography-shapes.svg new file mode 100644 index 0000000..3d9f9f3 --- /dev/null +++ b/public/static/media/iconography-shapes.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/iconography-strokes.svg b/public/static/media/iconography-strokes.svg new file mode 100644 index 0000000..960dd90 --- /dev/null +++ b/public/static/media/iconography-strokes.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/iconography-styles.svg b/public/static/media/iconography-styles.svg new file mode 100644 index 0000000..373028f --- /dev/null +++ b/public/static/media/iconography-styles.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/info-row-1.svg b/public/static/media/info-row-1.svg new file mode 100644 index 0000000..fa8b5c6 --- /dev/null +++ b/public/static/media/info-row-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/info-row-2.svg b/public/static/media/info-row-2.svg new file mode 100644 index 0000000..d53a6a0 --- /dev/null +++ b/public/static/media/info-row-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/info-row-3.svg b/public/static/media/info-row-3.svg new file mode 100644 index 0000000..bad79b6 --- /dev/null +++ b/public/static/media/info-row-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/input-slider-anatomy-1-spec.svg b/public/static/media/input-slider-anatomy-1-spec.svg new file mode 100644 index 0000000..bcf7e0b --- /dev/null +++ b/public/static/media/input-slider-anatomy-1-spec.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/input-slider-anatomy-1.svg b/public/static/media/input-slider-anatomy-1.svg new file mode 100644 index 0000000..03169d2 --- /dev/null +++ b/public/static/media/input-slider-anatomy-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/input-slider-anatomy-2-spec.svg b/public/static/media/input-slider-anatomy-2-spec.svg new file mode 100644 index 0000000..282135c --- /dev/null +++ b/public/static/media/input-slider-anatomy-2-spec.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/input-slider-anatomy-2.svg b/public/static/media/input-slider-anatomy-2.svg new file mode 100644 index 0000000..b85395f --- /dev/null +++ b/public/static/media/input-slider-anatomy-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/input-slider-behaviour-1.svg b/public/static/media/input-slider-behaviour-1.svg new file mode 100644 index 0000000..a6a0006 --- /dev/null +++ b/public/static/media/input-slider-behaviour-1.svg @@ -0,0 +1,211 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/input-slider-behaviour-2.svg b/public/static/media/input-slider-behaviour-2.svg new file mode 100644 index 0000000..58e970f --- /dev/null +++ b/public/static/media/input-slider-behaviour-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/input-slider-behaviour-3.svg b/public/static/media/input-slider-behaviour-3.svg new file mode 100644 index 0000000..e8136b1 --- /dev/null +++ b/public/static/media/input-slider-behaviour-3.svg @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/input-slider-behaviour-4.svg b/public/static/media/input-slider-behaviour-4.svg new file mode 100644 index 0000000..f12306f --- /dev/null +++ b/public/static/media/input-slider-behaviour-4.svg @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/input-slider-behaviour-5.svg b/public/static/media/input-slider-behaviour-5.svg new file mode 100644 index 0000000..9c65c8b --- /dev/null +++ b/public/static/media/input-slider-behaviour-5.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/input-slider-bidirectional.svg b/public/static/media/input-slider-bidirectional.svg new file mode 100644 index 0000000..0c9b27e --- /dev/null +++ b/public/static/media/input-slider-bidirectional.svg @@ -0,0 +1,53 @@ + + + usage_2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/static/media/input-slider-continuous.svg b/public/static/media/input-slider-continuous.svg new file mode 100644 index 0000000..ad1b11d --- /dev/null +++ b/public/static/media/input-slider-continuous.svg @@ -0,0 +1,42 @@ + + + variation_1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/static/media/input-slider-discrete.svg b/public/static/media/input-slider-discrete.svg new file mode 100644 index 0000000..7db7ef8 --- /dev/null +++ b/public/static/media/input-slider-discrete.svg @@ -0,0 +1,50 @@ + + + variation_2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/static/media/input-slider-interaction.svg b/public/static/media/input-slider-interaction.svg new file mode 100644 index 0000000..278f165 --- /dev/null +++ b/public/static/media/input-slider-interaction.svg @@ -0,0 +1,567 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/input-slider.svg b/public/static/media/input-slider.svg new file mode 100644 index 0000000..ac60b32 --- /dev/null +++ b/public/static/media/input-slider.svg @@ -0,0 +1,42 @@ + + + usage_1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/static/media/input-stepper-anatomy-1-spec.svg b/public/static/media/input-stepper-anatomy-1-spec.svg new file mode 100644 index 0000000..0893fbc --- /dev/null +++ b/public/static/media/input-stepper-anatomy-1-spec.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/input-stepper-anatomy-1.svg b/public/static/media/input-stepper-anatomy-1.svg new file mode 100644 index 0000000..c061563 --- /dev/null +++ b/public/static/media/input-stepper-anatomy-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/input-stepper-behaviour-1.svg b/public/static/media/input-stepper-behaviour-1.svg new file mode 100644 index 0000000..1e8b90f --- /dev/null +++ b/public/static/media/input-stepper-behaviour-1.svg @@ -0,0 +1,390 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/input-stepper-behaviour-2.svg b/public/static/media/input-stepper-behaviour-2.svg new file mode 100644 index 0000000..93e70a8 --- /dev/null +++ b/public/static/media/input-stepper-behaviour-2.svg @@ -0,0 +1,424 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/input-stepper-elements.svg b/public/static/media/input-stepper-elements.svg new file mode 100644 index 0000000..d83c792 --- /dev/null +++ b/public/static/media/input-stepper-elements.svg @@ -0,0 +1,39 @@ + + + usage_1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/static/media/introduction-illustration.svg b/public/static/media/introduction-illustration.svg new file mode 100644 index 0000000..640fe52 --- /dev/null +++ b/public/static/media/introduction-illustration.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/layout-behaviour-1.svg b/public/static/media/layout-behaviour-1.svg new file mode 100644 index 0000000..0ced98a --- /dev/null +++ b/public/static/media/layout-behaviour-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/layout-behaviour-2.svg b/public/static/media/layout-behaviour-2.svg new file mode 100644 index 0000000..7a2dca2 --- /dev/null +++ b/public/static/media/layout-behaviour-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/layout-behaviour-3.svg b/public/static/media/layout-behaviour-3.svg new file mode 100644 index 0000000..1fea122 --- /dev/null +++ b/public/static/media/layout-behaviour-3.svg @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/layout-column-offset.svg b/public/static/media/layout-column-offset.svg new file mode 100644 index 0000000..97f31cc --- /dev/null +++ b/public/static/media/layout-column-offset.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/layout-column-spanning.svg b/public/static/media/layout-column-spanning.svg new file mode 100644 index 0000000..960e72e --- /dev/null +++ b/public/static/media/layout-column-spanning.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/layout-demo.svg b/public/static/media/layout-demo.svg new file mode 100644 index 0000000..527f0b2 --- /dev/null +++ b/public/static/media/layout-demo.svg @@ -0,0 +1,360 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/layout-fixed-grid.svg b/public/static/media/layout-fixed-grid.svg new file mode 100644 index 0000000..cbca3d5 --- /dev/null +++ b/public/static/media/layout-fixed-grid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/layout-fluid-grid.svg b/public/static/media/layout-fluid-grid.svg new file mode 100644 index 0000000..118cbee --- /dev/null +++ b/public/static/media/layout-fluid-grid.svg @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/layout-grid-elements.svg b/public/static/media/layout-grid-elements.svg new file mode 100644 index 0000000..5735c31 --- /dev/null +++ b/public/static/media/layout-grid-elements.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/layout-spacings.svg b/public/static/media/layout-spacings.svg new file mode 100644 index 0000000..3908a3e --- /dev/null +++ b/public/static/media/layout-spacings.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/price-change-row-1.svg b/public/static/media/price-change-row-1.svg new file mode 100644 index 0000000..cdc3c4c --- /dev/null +++ b/public/static/media/price-change-row-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/price-change-row-2.svg b/public/static/media/price-change-row-2.svg new file mode 100644 index 0000000..e9e54ea --- /dev/null +++ b/public/static/media/price-change-row-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/price-change-row-3.svg b/public/static/media/price-change-row-3.svg new file mode 100644 index 0000000..ef1c90a --- /dev/null +++ b/public/static/media/price-change-row-3.svg @@ -0,0 +1,423 @@ + + +price_change_row_pinning + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Peugeot + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/static/media/price-estimation-row-1.svg b/public/static/media/price-estimation-row-1.svg new file mode 100644 index 0000000..8c78c31 --- /dev/null +++ b/public/static/media/price-estimation-row-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/price-estimation-row-2.svg b/public/static/media/price-estimation-row-2.svg new file mode 100644 index 0000000..cd69bf9 --- /dev/null +++ b/public/static/media/price-estimation-row-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/progress-anatomy-1-spec.svg b/public/static/media/progress-anatomy-1-spec.svg new file mode 100644 index 0000000..1e7ff74 --- /dev/null +++ b/public/static/media/progress-anatomy-1-spec.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/progress-anatomy-1.svg b/public/static/media/progress-anatomy-1.svg new file mode 100644 index 0000000..0a5ce9e --- /dev/null +++ b/public/static/media/progress-anatomy-1.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/public/static/media/progress-anatomy-2-spec.svg b/public/static/media/progress-anatomy-2-spec.svg new file mode 100644 index 0000000..dc3842b --- /dev/null +++ b/public/static/media/progress-anatomy-2-spec.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/progress-anatomy-2.svg b/public/static/media/progress-anatomy-2.svg new file mode 100644 index 0000000..d06cd31 --- /dev/null +++ b/public/static/media/progress-anatomy-2.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/static/media/progress-anatomy-3-spec.svg b/public/static/media/progress-anatomy-3-spec.svg new file mode 100644 index 0000000..962626b --- /dev/null +++ b/public/static/media/progress-anatomy-3-spec.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/progress-anatomy-3.svg b/public/static/media/progress-anatomy-3.svg new file mode 100644 index 0000000..2ded1d0 --- /dev/null +++ b/public/static/media/progress-anatomy-3.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/static/media/progress-anatomy-4-spec.svg b/public/static/media/progress-anatomy-4-spec.svg new file mode 100644 index 0000000..80c97e2 --- /dev/null +++ b/public/static/media/progress-anatomy-4-spec.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/progress-anatomy-4.svg b/public/static/media/progress-anatomy-4.svg new file mode 100644 index 0000000..19a9595 --- /dev/null +++ b/public/static/media/progress-anatomy-4.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/static/media/progress-behaviour-1.svg b/public/static/media/progress-behaviour-1.svg new file mode 100644 index 0000000..5e7cd81 --- /dev/null +++ b/public/static/media/progress-behaviour-1.svg @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/progress-behaviour-2.svg b/public/static/media/progress-behaviour-2.svg new file mode 100644 index 0000000..006c9a9 --- /dev/null +++ b/public/static/media/progress-behaviour-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/progress-behaviour-3.svg b/public/static/media/progress-behaviour-3.svg new file mode 100644 index 0000000..4477ce3 --- /dev/null +++ b/public/static/media/progress-behaviour-3.svg @@ -0,0 +1,249 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/progress-behaviour-4.svg b/public/static/media/progress-behaviour-4.svg new file mode 100644 index 0000000..1143d9f --- /dev/null +++ b/public/static/media/progress-behaviour-4.svg @@ -0,0 +1,262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/progress-variations.svg b/public/static/media/progress-variations.svg new file mode 100644 index 0000000..ba58649 --- /dev/null +++ b/public/static/media/progress-variations.svg @@ -0,0 +1,187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/rate-row-1.svg b/public/static/media/rate-row-1.svg new file mode 100644 index 0000000..e0496c0 --- /dev/null +++ b/public/static/media/rate-row-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/rate-row-2.svg b/public/static/media/rate-row-2.svg new file mode 100644 index 0000000..1c987cf --- /dev/null +++ b/public/static/media/rate-row-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/rate-row-3.svg b/public/static/media/rate-row-3.svg new file mode 100644 index 0000000..52fefd5 --- /dev/null +++ b/public/static/media/rate-row-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/representative/backdrop.svg b/public/static/media/representative/backdrop.svg new file mode 100644 index 0000000..17e41a9 --- /dev/null +++ b/public/static/media/representative/backdrop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/representative/badge.svg b/public/static/media/representative/badge.svg new file mode 100644 index 0000000..03b64c0 --- /dev/null +++ b/public/static/media/representative/badge.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/representative/breadcrumb.svg b/public/static/media/representative/breadcrumb.svg new file mode 100644 index 0000000..37fd310 --- /dev/null +++ b/public/static/media/representative/breadcrumb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/representative/button.svg b/public/static/media/representative/button.svg new file mode 100644 index 0000000..41451a0 --- /dev/null +++ b/public/static/media/representative/button.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/representative/chip.svg b/public/static/media/representative/chip.svg new file mode 100644 index 0000000..a71ae60 --- /dev/null +++ b/public/static/media/representative/chip.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/representative/divar/accordion-row.svg b/public/static/media/representative/divar/accordion-row.svg new file mode 100644 index 0000000..6b2ff2a --- /dev/null +++ b/public/static/media/representative/divar/accordion-row.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/representative/divar/control-row.svg b/public/static/media/representative/divar/control-row.svg new file mode 100644 index 0000000..5fadcac --- /dev/null +++ b/public/static/media/representative/divar/control-row.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/representative/divar/evaluation-row.svg b/public/static/media/representative/divar/evaluation-row.svg new file mode 100644 index 0000000..ab9fa59 --- /dev/null +++ b/public/static/media/representative/divar/evaluation-row.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/representative/divar/feature-row.svg b/public/static/media/representative/divar/feature-row.svg new file mode 100644 index 0000000..a643aef --- /dev/null +++ b/public/static/media/representative/divar/feature-row.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/representative/divar/info-row.svg b/public/static/media/representative/divar/info-row.svg new file mode 100644 index 0000000..20baebf --- /dev/null +++ b/public/static/media/representative/divar/info-row.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/representative/divar/price-change-row.svg b/public/static/media/representative/divar/price-change-row.svg new file mode 100644 index 0000000..deee4f5 --- /dev/null +++ b/public/static/media/representative/divar/price-change-row.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/representative/divar/price-estimation-row.svg b/public/static/media/representative/divar/price-estimation-row.svg new file mode 100644 index 0000000..620f795 --- /dev/null +++ b/public/static/media/representative/divar/price-estimation-row.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/representative/divar/rate-row.svg b/public/static/media/representative/divar/rate-row.svg new file mode 100644 index 0000000..b9d0473 --- /dev/null +++ b/public/static/media/representative/divar/rate-row.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/representative/divar/score-row.svg b/public/static/media/representative/divar/score-row.svg new file mode 100644 index 0000000..ef6b15d --- /dev/null +++ b/public/static/media/representative/divar/score-row.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/representative/divar/selector-row.svg b/public/static/media/representative/divar/selector-row.svg new file mode 100644 index 0000000..bbd806d --- /dev/null +++ b/public/static/media/representative/divar/selector-row.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/representative/divar/title-row.svg b/public/static/media/representative/divar/title-row.svg new file mode 100644 index 0000000..5faef74 --- /dev/null +++ b/public/static/media/representative/divar/title-row.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/representative/divider.svg b/public/static/media/representative/divider.svg new file mode 100644 index 0000000..adc7afe --- /dev/null +++ b/public/static/media/representative/divider.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/representative/input-slider.svg b/public/static/media/representative/input-slider.svg new file mode 100644 index 0000000..5536dee --- /dev/null +++ b/public/static/media/representative/input-slider.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/representative/input-stepper.svg b/public/static/media/representative/input-stepper.svg new file mode 100644 index 0000000..f11d728 --- /dev/null +++ b/public/static/media/representative/input-stepper.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/representative/progress.svg b/public/static/media/representative/progress.svg new file mode 100644 index 0000000..2ce96f0 --- /dev/null +++ b/public/static/media/representative/progress.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/representative/select.svg b/public/static/media/representative/select.svg new file mode 100644 index 0000000..d280237 --- /dev/null +++ b/public/static/media/representative/select.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/representative/switch-controls.svg b/public/static/media/representative/switch-controls.svg new file mode 100644 index 0000000..a5bd5bd --- /dev/null +++ b/public/static/media/representative/switch-controls.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/representative/tab-bar.svg b/public/static/media/representative/tab-bar.svg new file mode 100644 index 0000000..5c7a491 --- /dev/null +++ b/public/static/media/representative/tab-bar.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/representative/tag.svg b/public/static/media/representative/tag.svg new file mode 100644 index 0000000..279f2a6 --- /dev/null +++ b/public/static/media/representative/tag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/representative/text-field.svg b/public/static/media/representative/text-field.svg new file mode 100644 index 0000000..f4cf021 --- /dev/null +++ b/public/static/media/representative/text-field.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/representative/tooltip.svg b/public/static/media/representative/tooltip.svg new file mode 100644 index 0000000..0b65d42 --- /dev/null +++ b/public/static/media/representative/tooltip.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/rows-intro-changes-2.svg b/public/static/media/rows-intro-changes-2.svg new file mode 100644 index 0000000..4c855eb --- /dev/null +++ b/public/static/media/rows-intro-changes-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/rows-intro-changes.svg b/public/static/media/rows-intro-changes.svg new file mode 100644 index 0000000..3e3ce87 --- /dev/null +++ b/public/static/media/rows-intro-changes.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/score-row-1.svg b/public/static/media/score-row-1.svg new file mode 100644 index 0000000..6cf1c7f --- /dev/null +++ b/public/static/media/score-row-1.svg @@ -0,0 +1 @@ +normal \ No newline at end of file diff --git a/public/static/media/score-row-2.svg b/public/static/media/score-row-2.svg new file mode 100644 index 0000000..4676853 --- /dev/null +++ b/public/static/media/score-row-2.svg @@ -0,0 +1 @@ +normal \ No newline at end of file diff --git a/public/static/media/select-behaviour-1.svg b/public/static/media/select-behaviour-1.svg new file mode 100644 index 0000000..b09ffbd --- /dev/null +++ b/public/static/media/select-behaviour-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/select-behaviour-2.svg b/public/static/media/select-behaviour-2.svg new file mode 100644 index 0000000..eb4a1b7 --- /dev/null +++ b/public/static/media/select-behaviour-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/select-behaviour-3.svg b/public/static/media/select-behaviour-3.svg new file mode 100644 index 0000000..1262597 --- /dev/null +++ b/public/static/media/select-behaviour-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/select-behaviour-4.svg b/public/static/media/select-behaviour-4.svg new file mode 100644 index 0000000..a25883a --- /dev/null +++ b/public/static/media/select-behaviour-4.svg @@ -0,0 +1,319 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/select-behaviour-5.svg b/public/static/media/select-behaviour-5.svg new file mode 100644 index 0000000..e084aca --- /dev/null +++ b/public/static/media/select-behaviour-5.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/select-menu.svg b/public/static/media/select-menu.svg new file mode 100644 index 0000000..cf25d11 --- /dev/null +++ b/public/static/media/select-menu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/select-remove.svg b/public/static/media/select-remove.svg new file mode 100644 index 0000000..19015a8 --- /dev/null +++ b/public/static/media/select-remove.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/select-search.svg b/public/static/media/select-search.svg new file mode 100644 index 0000000..831d844 --- /dev/null +++ b/public/static/media/select-search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/selector-row-1.svg b/public/static/media/selector-row-1.svg new file mode 100644 index 0000000..6dd0194 --- /dev/null +++ b/public/static/media/selector-row-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/selector-row-2.svg b/public/static/media/selector-row-2.svg new file mode 100644 index 0000000..f5b86b6 --- /dev/null +++ b/public/static/media/selector-row-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/selector-row-3.svg b/public/static/media/selector-row-3.svg new file mode 100644 index 0000000..8cc2fbf --- /dev/null +++ b/public/static/media/selector-row-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/selector-row-4.svg b/public/static/media/selector-row-4.svg new file mode 100644 index 0000000..6f54ee1 --- /dev/null +++ b/public/static/media/selector-row-4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/switch-controls-anatomy-1-spec.svg b/public/static/media/switch-controls-anatomy-1-spec.svg new file mode 100644 index 0000000..5c2c299 --- /dev/null +++ b/public/static/media/switch-controls-anatomy-1-spec.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/switch-controls-anatomy-1.svg b/public/static/media/switch-controls-anatomy-1.svg new file mode 100644 index 0000000..567775b --- /dev/null +++ b/public/static/media/switch-controls-anatomy-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/switch-controls-anatomy-2-spec.svg b/public/static/media/switch-controls-anatomy-2-spec.svg new file mode 100644 index 0000000..5c2c299 --- /dev/null +++ b/public/static/media/switch-controls-anatomy-2-spec.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/switch-controls-anatomy-2.svg b/public/static/media/switch-controls-anatomy-2.svg new file mode 100644 index 0000000..567775b --- /dev/null +++ b/public/static/media/switch-controls-anatomy-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/switch-controls-anatomy-3-spec.svg b/public/static/media/switch-controls-anatomy-3-spec.svg new file mode 100644 index 0000000..18a98e4 --- /dev/null +++ b/public/static/media/switch-controls-anatomy-3-spec.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/switch-controls-anatomy-3.svg b/public/static/media/switch-controls-anatomy-3.svg new file mode 100644 index 0000000..5524caf --- /dev/null +++ b/public/static/media/switch-controls-anatomy-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/switch-controls-behaviour-1.svg b/public/static/media/switch-controls-behaviour-1.svg new file mode 100644 index 0000000..3c24169 --- /dev/null +++ b/public/static/media/switch-controls-behaviour-1.svg @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/switch-controls-behaviour-2.svg b/public/static/media/switch-controls-behaviour-2.svg new file mode 100644 index 0000000..c69c86e --- /dev/null +++ b/public/static/media/switch-controls-behaviour-2.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/switch-controls-behaviour-3.svg b/public/static/media/switch-controls-behaviour-3.svg new file mode 100644 index 0000000..3c24169 --- /dev/null +++ b/public/static/media/switch-controls-behaviour-3.svg @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/switch-controls-behaviour-4.svg b/public/static/media/switch-controls-behaviour-4.svg new file mode 100644 index 0000000..c69c86e --- /dev/null +++ b/public/static/media/switch-controls-behaviour-4.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/switch-controls-behaviour-5.svg b/public/static/media/switch-controls-behaviour-5.svg new file mode 100644 index 0000000..f87f3ca --- /dev/null +++ b/public/static/media/switch-controls-behaviour-5.svg @@ -0,0 +1,431 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/switch-controls-behaviour-6.svg b/public/static/media/switch-controls-behaviour-6.svg new file mode 100644 index 0000000..4fa5e1f --- /dev/null +++ b/public/static/media/switch-controls-behaviour-6.svg @@ -0,0 +1,476 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/switch-controls-checkbox.svg b/public/static/media/switch-controls-checkbox.svg new file mode 100644 index 0000000..0395e45 --- /dev/null +++ b/public/static/media/switch-controls-checkbox.svg @@ -0,0 +1,766 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/switch-controls-radio.svg b/public/static/media/switch-controls-radio.svg new file mode 100644 index 0000000..2a7527c --- /dev/null +++ b/public/static/media/switch-controls-radio.svg @@ -0,0 +1,211 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/switch-controls-switch.svg b/public/static/media/switch-controls-switch.svg new file mode 100644 index 0000000..cf5acf7 --- /dev/null +++ b/public/static/media/switch-controls-switch.svg @@ -0,0 +1,311 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/tabbar-anatomy-1-spec.svg b/public/static/media/tabbar-anatomy-1-spec.svg new file mode 100644 index 0000000..ce861f1 --- /dev/null +++ b/public/static/media/tabbar-anatomy-1-spec.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tabbar-anatomy-1.svg b/public/static/media/tabbar-anatomy-1.svg new file mode 100644 index 0000000..7258da0 --- /dev/null +++ b/public/static/media/tabbar-anatomy-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tabbar-anatomy-2-spec.svg b/public/static/media/tabbar-anatomy-2-spec.svg new file mode 100644 index 0000000..ef900be --- /dev/null +++ b/public/static/media/tabbar-anatomy-2-spec.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tabbar-anatomy-2.svg b/public/static/media/tabbar-anatomy-2.svg new file mode 100644 index 0000000..c3a98bb --- /dev/null +++ b/public/static/media/tabbar-anatomy-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tabbar-anatomy-3-spec.svg b/public/static/media/tabbar-anatomy-3-spec.svg new file mode 100644 index 0000000..a3666b5 --- /dev/null +++ b/public/static/media/tabbar-anatomy-3-spec.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tabbar-anatomy-3.svg b/public/static/media/tabbar-anatomy-3.svg new file mode 100644 index 0000000..c2e14e9 --- /dev/null +++ b/public/static/media/tabbar-anatomy-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tabbar-behaviour-1.svg b/public/static/media/tabbar-behaviour-1.svg new file mode 100644 index 0000000..b94bb2d --- /dev/null +++ b/public/static/media/tabbar-behaviour-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tabbar-behaviour-10.svg b/public/static/media/tabbar-behaviour-10.svg new file mode 100644 index 0000000..844d0f5 --- /dev/null +++ b/public/static/media/tabbar-behaviour-10.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tabbar-behaviour-11.svg b/public/static/media/tabbar-behaviour-11.svg new file mode 100644 index 0000000..15b38e6 --- /dev/null +++ b/public/static/media/tabbar-behaviour-11.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tabbar-behaviour-2.svg b/public/static/media/tabbar-behaviour-2.svg new file mode 100644 index 0000000..31c4567 --- /dev/null +++ b/public/static/media/tabbar-behaviour-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tabbar-behaviour-3.svg b/public/static/media/tabbar-behaviour-3.svg new file mode 100644 index 0000000..64e198b --- /dev/null +++ b/public/static/media/tabbar-behaviour-3.svg @@ -0,0 +1,354 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/tabbar-behaviour-4.svg b/public/static/media/tabbar-behaviour-4.svg new file mode 100644 index 0000000..b482c8a --- /dev/null +++ b/public/static/media/tabbar-behaviour-4.svg @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/tabbar-behaviour-5.svg b/public/static/media/tabbar-behaviour-5.svg new file mode 100644 index 0000000..9f39ce1 --- /dev/null +++ b/public/static/media/tabbar-behaviour-5.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tabbar-behaviour-6.svg b/public/static/media/tabbar-behaviour-6.svg new file mode 100644 index 0000000..3c0600b --- /dev/null +++ b/public/static/media/tabbar-behaviour-6.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tabbar-behaviour-7.svg b/public/static/media/tabbar-behaviour-7.svg new file mode 100644 index 0000000..b5b2239 --- /dev/null +++ b/public/static/media/tabbar-behaviour-7.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tabbar-behaviour-8.svg b/public/static/media/tabbar-behaviour-8.svg new file mode 100644 index 0000000..1f8d1ac --- /dev/null +++ b/public/static/media/tabbar-behaviour-8.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tabbar-behaviour-9.svg b/public/static/media/tabbar-behaviour-9.svg new file mode 100644 index 0000000..bd7f110 --- /dev/null +++ b/public/static/media/tabbar-behaviour-9.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tabbar-fluid.svg b/public/static/media/tabbar-fluid.svg new file mode 100644 index 0000000..31c7cf5 --- /dev/null +++ b/public/static/media/tabbar-fluid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tabbar-only-icon.svg b/public/static/media/tabbar-only-icon.svg new file mode 100644 index 0000000..bb7fcdc --- /dev/null +++ b/public/static/media/tabbar-only-icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tabbar-scrollable.svg b/public/static/media/tabbar-scrollable.svg new file mode 100644 index 0000000..3889375 --- /dev/null +++ b/public/static/media/tabbar-scrollable.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tag-anatomy-1-spec.svg b/public/static/media/tag-anatomy-1-spec.svg new file mode 100644 index 0000000..8ed91a3 --- /dev/null +++ b/public/static/media/tag-anatomy-1-spec.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tag-anatomy-1.svg b/public/static/media/tag-anatomy-1.svg new file mode 100644 index 0000000..7bb430c --- /dev/null +++ b/public/static/media/tag-anatomy-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tag-anatomy-2-spec.svg b/public/static/media/tag-anatomy-2-spec.svg new file mode 100644 index 0000000..47da3b4 --- /dev/null +++ b/public/static/media/tag-anatomy-2-spec.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tag-anatomy-2.svg b/public/static/media/tag-anatomy-2.svg new file mode 100644 index 0000000..35e6840 --- /dev/null +++ b/public/static/media/tag-anatomy-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tag-behaviour-1.svg b/public/static/media/tag-behaviour-1.svg new file mode 100644 index 0000000..62d9ecb --- /dev/null +++ b/public/static/media/tag-behaviour-1.svg @@ -0,0 +1,51 @@ + + + behavior_1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/static/media/tag-behaviour-2.svg b/public/static/media/tag-behaviour-2.svg new file mode 100644 index 0000000..1a33059 --- /dev/null +++ b/public/static/media/tag-behaviour-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tag-behaviour-3.svg b/public/static/media/tag-behaviour-3.svg new file mode 100644 index 0000000..59cde48 --- /dev/null +++ b/public/static/media/tag-behaviour-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/textfield-anatomy-1-spec.svg b/public/static/media/textfield-anatomy-1-spec.svg new file mode 100644 index 0000000..bb6871c --- /dev/null +++ b/public/static/media/textfield-anatomy-1-spec.svg @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/textfield-anatomy-1.svg b/public/static/media/textfield-anatomy-1.svg new file mode 100644 index 0000000..757271f --- /dev/null +++ b/public/static/media/textfield-anatomy-1.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/static/media/textfield-anatomy-2-spec.svg b/public/static/media/textfield-anatomy-2-spec.svg new file mode 100644 index 0000000..f64cac7 --- /dev/null +++ b/public/static/media/textfield-anatomy-2-spec.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/textfield-anatomy-2.svg b/public/static/media/textfield-anatomy-2.svg new file mode 100644 index 0000000..4f6b17b --- /dev/null +++ b/public/static/media/textfield-anatomy-2.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/static/media/textfield-anatomy-3-spec.svg b/public/static/media/textfield-anatomy-3-spec.svg new file mode 100644 index 0000000..8912928 --- /dev/null +++ b/public/static/media/textfield-anatomy-3-spec.svg @@ -0,0 +1,91 @@ + + + + + + + 30 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/textfield-anatomy-3.svg b/public/static/media/textfield-anatomy-3.svg new file mode 100644 index 0000000..9273780 --- /dev/null +++ b/public/static/media/textfield-anatomy-3.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/textfield-anatomy-4-spec.svg b/public/static/media/textfield-anatomy-4-spec.svg new file mode 100644 index 0000000..8eb2618 --- /dev/null +++ b/public/static/media/textfield-anatomy-4-spec.svg @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/textfield-anatomy-4.svg b/public/static/media/textfield-anatomy-4.svg new file mode 100644 index 0000000..f705232 --- /dev/null +++ b/public/static/media/textfield-anatomy-4.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/textfield-behaviour-1.svg b/public/static/media/textfield-behaviour-1.svg new file mode 100644 index 0000000..68657ee --- /dev/null +++ b/public/static/media/textfield-behaviour-1.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/textfield-behaviour-2.svg b/public/static/media/textfield-behaviour-2.svg new file mode 100644 index 0000000..6307100 --- /dev/null +++ b/public/static/media/textfield-behaviour-2.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/textfield-behaviour-3.svg b/public/static/media/textfield-behaviour-3.svg new file mode 100644 index 0000000..aeb40ef --- /dev/null +++ b/public/static/media/textfield-behaviour-3.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/textfield-behaviour-4.svg b/public/static/media/textfield-behaviour-4.svg new file mode 100644 index 0000000..ecf5586 --- /dev/null +++ b/public/static/media/textfield-behaviour-4.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/textfield-behaviour-5.svg b/public/static/media/textfield-behaviour-5.svg new file mode 100644 index 0000000..825f1a3 --- /dev/null +++ b/public/static/media/textfield-behaviour-5.svg @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/textfield-behaviour-6.svg b/public/static/media/textfield-behaviour-6.svg new file mode 100644 index 0000000..cb65a3f --- /dev/null +++ b/public/static/media/textfield-behaviour-6.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/title-row-1.svg b/public/static/media/title-row-1.svg new file mode 100644 index 0000000..2c35e9c --- /dev/null +++ b/public/static/media/title-row-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tooltip-anatomy-1-spec.svg b/public/static/media/tooltip-anatomy-1-spec.svg new file mode 100644 index 0000000..4e0bc86 --- /dev/null +++ b/public/static/media/tooltip-anatomy-1-spec.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tooltip-anatomy-1.svg b/public/static/media/tooltip-anatomy-1.svg new file mode 100644 index 0000000..aaab006 --- /dev/null +++ b/public/static/media/tooltip-anatomy-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tooltip-anatomy-2-spec.svg b/public/static/media/tooltip-anatomy-2-spec.svg new file mode 100644 index 0000000..6e169ba --- /dev/null +++ b/public/static/media/tooltip-anatomy-2-spec.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tooltip-anatomy-2.svg b/public/static/media/tooltip-anatomy-2.svg new file mode 100644 index 0000000..9453c41 --- /dev/null +++ b/public/static/media/tooltip-anatomy-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tooltip-anatomy-3-spec.svg b/public/static/media/tooltip-anatomy-3-spec.svg new file mode 100644 index 0000000..025d6f5 --- /dev/null +++ b/public/static/media/tooltip-anatomy-3-spec.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tooltip-anatomy-3.svg b/public/static/media/tooltip-anatomy-3.svg new file mode 100644 index 0000000..dd77797 --- /dev/null +++ b/public/static/media/tooltip-anatomy-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tooltip-behaviour-1.svg b/public/static/media/tooltip-behaviour-1.svg new file mode 100644 index 0000000..a3e3da9 --- /dev/null +++ b/public/static/media/tooltip-behaviour-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tooltip-behaviour-2.svg b/public/static/media/tooltip-behaviour-2.svg new file mode 100644 index 0000000..b1c3171 --- /dev/null +++ b/public/static/media/tooltip-behaviour-2.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/tooltip-behaviour-3.svg b/public/static/media/tooltip-behaviour-3.svg new file mode 100644 index 0000000..bb4f3fa --- /dev/null +++ b/public/static/media/tooltip-behaviour-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tooltip-behaviour-4.svg b/public/static/media/tooltip-behaviour-4.svg new file mode 100644 index 0000000..77d4e48 --- /dev/null +++ b/public/static/media/tooltip-behaviour-4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tooltip-behaviour-5.svg b/public/static/media/tooltip-behaviour-5.svg new file mode 100644 index 0000000..03f9c4c --- /dev/null +++ b/public/static/media/tooltip-behaviour-5.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/tooltip-behaviour-6.svg b/public/static/media/tooltip-behaviour-6.svg new file mode 100644 index 0000000..7a84f71 --- /dev/null +++ b/public/static/media/tooltip-behaviour-6.svg @@ -0,0 +1,275 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/tooltip-variation-1.svg b/public/static/media/tooltip-variation-1.svg new file mode 100644 index 0000000..615c630 --- /dev/null +++ b/public/static/media/tooltip-variation-1.svg @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/tooltip-variation-2.svg b/public/static/media/tooltip-variation-2.svg new file mode 100644 index 0000000..73a970e --- /dev/null +++ b/public/static/media/tooltip-variation-2.svg @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/tooltip-variation-3.svg b/public/static/media/tooltip-variation-3.svg new file mode 100644 index 0000000..cd5bd9a --- /dev/null +++ b/public/static/media/tooltip-variation-3.svg @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/typography-font-size.svg b/public/static/media/typography-font-size.svg new file mode 100644 index 0000000..504e6e8 --- /dev/null +++ b/public/static/media/typography-font-size.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/typography-font-weight.svg b/public/static/media/typography-font-weight.svg new file mode 100644 index 0000000..a80a142 --- /dev/null +++ b/public/static/media/typography-font-weight.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/typography-line-height.svg b/public/static/media/typography-line-height.svg new file mode 100644 index 0000000..9b48a90 --- /dev/null +++ b/public/static/media/typography-line-height.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/media/zinput-slider.svg b/public/static/media/zinput-slider.svg new file mode 100644 index 0000000..f4e074d --- /dev/null +++ b/public/static/media/zinput-slider.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/static/media/zinput-stepper-elements.svg b/public/static/media/zinput-stepper-elements.svg new file mode 100644 index 0000000..1911f71 --- /dev/null +++ b/public/static/media/zinput-stepper-elements.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sharedVars.ts b/sharedVars.ts new file mode 100644 index 0000000..2a08414 --- /dev/null +++ b/sharedVars.ts @@ -0,0 +1,16 @@ +export const defaultKeywordsMetaContent = [ + "design", + "design system", + "sonnat", + "ui", + "user interface", + "design kit", + "ui kit", + "دیزاین", + "کامپوننت لایبرری", + "دیزاین سیستم", + "سنت", + "سنّت" +]; + +export const siteFullAddress = "https://sonnat.design"; diff --git a/shell.env.example b/shell.env.example new file mode 100644 index 0000000..5ec50b3 --- /dev/null +++ b/shell.env.example @@ -0,0 +1,2 @@ +GIT_USERNAME= +GIT_DEPLOY_TOKEN= diff --git a/store.ts b/store.ts new file mode 100644 index 0000000..85f2a65 --- /dev/null +++ b/store.ts @@ -0,0 +1,21 @@ +import createStore, { State } from "zustand"; + +interface IState extends State { + isBurgerMenuOpen: boolean; + isSearchBoxOpen: boolean; + isPageLoading: boolean; + setPageLoading: (isLoading: boolean) => void; + setBurgerMenuOpen: (isOpen: boolean) => void; + setSearchBoxOpen: (isOpen: boolean) => void; +} + +const useStore = createStore(set => ({ + isBurgerMenuOpen: false, + isSearchBoxOpen: false, + isPageLoading: false, + setPageLoading: isLoading => set(() => ({ isPageLoading: isLoading })), + setBurgerMenuOpen: isOpen => set(() => ({ isBurgerMenuOpen: isOpen })), + setSearchBoxOpen: isOpen => set(() => ({ isSearchBoxOpen: isOpen })) +})); + +export default useStore; diff --git a/theme.ts b/theme.ts new file mode 100644 index 0000000..24f8ff2 --- /dev/null +++ b/theme.ts @@ -0,0 +1,33 @@ +// @ts-nocheck + +import { adjustColor } from "@sonnat/ui/styles/colorUtils"; +import createTheme, { Theme } from "@sonnat/ui/styles/createTheme"; +import defaultTheme from "@sonnat/ui/styles/defaultTheme"; + +export interface CustomizedTheme extends Theme { + custom: { + colors: { + primaryHover: string; + primaryActive: string; + }; + }; +} + +// Create a theme instance. +const theme = createTheme({ + direction: "rtl", + custom: { + colors: { + primaryHover: adjustColor(defaultTheme.colors.primary.origin, { + saturation: -8, + lightness: +8 + }), + primaryActive: adjustColor(defaultTheme.colors.primary.origin, { + saturation: +8, + lightness: -4 + }) + } + } +}); + +export default theme; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..7c1f097 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "allowJs": true, + "alwaysStrict": true, + "strictNullChecks": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "isolatedModules": true, + "jsx": "preserve", + "lib": ["DOM", "DOM.Iterable", "ES2017"], + "module": "ESNext", + "moduleResolution": "node", + "noEmit": true, + "noFallthroughCasesInSwitch": true, + "noUnusedLocals": true, + "noImplicitAny": true, + "noUnusedParameters": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true, + "target": "ES5", + "types": ["node", "react"] + }, + "exclude": ["node_modules", "out", ".next"], + "include": ["**/*.ts", "**/*.tsx"] +} diff --git a/types.d.ts b/types.d.ts new file mode 100644 index 0000000..b0bb532 --- /dev/null +++ b/types.d.ts @@ -0,0 +1,32 @@ +import { AppProps } from "next/app"; +import { NextComponentType, NextPageContext } from "next"; +import * as React from "react"; + +// eslint-disable-next-line no-unused-vars +export type GetLayout = () => (page: React.ReactNode) => React.ReactNode; + +export type NextComponentTypeWithLayout

    = NextComponentType< + NextPageContext, + any, + P +> & { + getLayout?: GetLayout; +}; + +export type NextPageWithLayout

    = NextComponentType< + NextPageContext, + IP, + P +> & { + getLayout?: GetLayout; +}; + +export type AppPropsWithLayout

    = AppProps

    & { + Component: NextComponentTypeWithLayout

    ; +}; + +export interface MDXMeta { + title: string; + description: string; + getLayout?: GetLayout; +} diff --git a/utils/analytics.ts b/utils/analytics.ts new file mode 100644 index 0000000..797c81d --- /dev/null +++ b/utils/analytics.ts @@ -0,0 +1,21 @@ +import ReactGA from "react-ga"; + +export const initGA = () => { + ReactGA.initialize("UA-181316522-1"); +}; + +export const logPageView = () => { + ReactGA.set({ page: window.location.pathname }); + ReactGA.pageview(window.location.pathname); +}; + +export const logEvent = (category: string = "", action: string = "") => { + if (category && action) ReactGA.event({ category, action }); +}; + +export const logException = ( + description: string = "", + fatal: boolean = false +) => { + if (description) ReactGA.exception({ description, fatal }); +}; diff --git a/utils/case.ts b/utils/case.ts new file mode 100644 index 0000000..7904276 --- /dev/null +++ b/utils/case.ts @@ -0,0 +1,51 @@ +// cherry-picked from +// https://github.com/blakeembrey/change-case/blob/c24a0e18044bf77d9e824e93f04f7eb4e2151230/packages/no-case/src/index.ts#L19 + +// Support camel case ("camelCase" -> "camel Case" and "CAMELCase" -> "CAMEL Case"). +const DEFAULT_SPLIT_REGEXP = [/([a-z0-9])([A-Z])/g, /([A-Z])([A-Z][a-z])/g]; + +// Remove all non-word characters. +const DEFAULT_STRIP_REGEXP = /[^A-Z0-9]+/gi; + +/** + * Replace `re` in the input string with the replacement value. + */ +const replace = (input: string, re: RegExp | RegExp[], value: string) => { + if (re instanceof RegExp) return input.replace(re, value); + return re.reduce((input, re) => input.replace(re, value), input); +}; + +/** + * Normalize the string into something other libraries can manipulate easier. + */ +export const noCase = (input: string, delimiter: string = " ") => { + const splitRegexp = DEFAULT_SPLIT_REGEXP; + const stripRegexp = DEFAULT_STRIP_REGEXP; + + const result = replace( + replace(input, splitRegexp, "$1\0$2"), + stripRegexp, + "\0" + ); + let start = 0; + let end = result.length; + + // Trim the delimiter from around the output string. + while (result.charAt(start) === "\0") start++; + while (result.charAt(end - 1) === "\0") end--; + + // Transform each token independently. + return result + .slice(start, end) + .split("\0") + .map(str => str.toLowerCase()) + .join(delimiter); +}; + +export const dotCase = (input: string, delimiter?: string) => { + return noCase(input, delimiter || "."); +}; + +export const kebabCase = (input: string, delimiter?: string) => { + return noCase(input, delimiter || "-"); +}; diff --git a/utils/createComponentMapping.tsx b/utils/createComponentMapping.tsx new file mode 100644 index 0000000..3bcfe77 --- /dev/null +++ b/utils/createComponentMapping.tsx @@ -0,0 +1,701 @@ +import { InfoCircleLargeO } from "@sonnat/icons"; +import Divider, { DividerProps } from "@sonnat/ui/Divider"; +import { adjustColor } from "@sonnat/ui/styles/colorUtils"; +import type { DefaultTheme } from "@sonnat/ui/styles/defaultTheme"; +import makeStyles from "@sonnat/ui/styles/makeStyles"; +import useTheme from "@sonnat/ui/styles/useTheme"; +import Text, { TextProps } from "@sonnat/ui/Text"; +import clx from "classnames"; +import Link from "next/link"; +import * as React from "react"; + +interface CustomDivProps extends React.ComponentPropsWithoutRef<"div"> { + "data-notebox"?: boolean; + "data-imagery"?: boolean; + "data-column"?: boolean; + "data-columnWrapper"?: boolean; + "data-topFluid"?: boolean; +} + +interface TableProps extends React.ComponentPropsWithoutRef<"table"> { + cols?: number | "auto"; + dataDir?: "ltr" | "rtl"; + layout?: React.CSSProperties["tableLayout"]; +} + +const useParagraphStyles = makeStyles( + theme => ({ + root: { + paddingTop: theme.typography.pxToRem(16), + paddingBottom: theme.typography.pxToRem(16), + "& > strong": { fontWeight: theme.typography.fontWeight.medium }, + "& + ul, & + ol": { marginTop: theme.typography.pxToRem(-16) }, + "& + div > table": { marginTop: theme.typography.pxToRem(-16) } + }, + subtitle: { + fontWeight: theme.typography.fontWeight.regular, + paddingTop: theme.typography.pxToRem(8), + paddingBottom: theme.typography.pxToRem(16), + color: theme.colors.text.secondary + } + }), + { name: "Paragraph" } +); + +const baseHeadingStyles = (theme: DefaultTheme) => ({ + root: { + alignItems: "center", + "& + .demo-box, & + pre": { marginTop: theme.typography.pxToRem(8) }, + "& + figure": { marginTop: theme.typography.pxToRem(16) }, + [theme.breakpoints.up("sm")]: { + "@global .anchor-button": { + visibility: "hidden", + opacity: 0 + } + }, + "&:hover": { + "@global .anchor-button": { + visibility: "visible", + opacity: 1 + } + } + } +}); + +const useH1Styles = makeStyles( + theme => ({ + root: { + ...baseHeadingStyles(theme).root, + [theme.breakpoints.down("sm")]: { + ...theme.typography.variants.h5 + } + } + }), + { name: "H1" } +); + +const useH2Styles = makeStyles( + theme => ({ + root: { + ...baseHeadingStyles(theme).root, + paddingTop: theme.typography.pxToRem(32), + [theme.breakpoints.down("sm")]: { + ...theme.typography.variants.h6 + } + } + }), + { name: "H2" } +); + +const useH3Styles = makeStyles( + theme => ({ + root: { + ...baseHeadingStyles(theme).root, + paddingTop: theme.typography.pxToRem(32), + [theme.breakpoints.down("sm")]: { + ...theme.typography.variants.subtitle + } + } + }), + { name: "H3" } +); + +const useH4Styles = makeStyles( + theme => ({ + root: { + ...baseHeadingStyles(theme).root, + paddingTop: theme.typography.pxToRem(16), + [theme.breakpoints.down("sm")]: { + ...theme.typography.variants.subtitleSmall + } + } + }), + { name: "H4" } +); + +const useTableStyles = makeStyles( + theme => ({ + root: { + marginTop: theme.typography.pxToRem(16), + overflow: "auto", + width: "100%", + display: "block", + [theme.breakpoints.down("lg")]: { + maxWidth: `calc(100vw - ${theme.typography.pxToRem(32)})` + } + }, + table: { + margin: "0 auto", + borderCollapse: "collapse", + captionSide: "bottom", + wordBreak: "normal", + "& ul, & ol": { paddingTop: 0, paddingBottom: 0 }, + "& li": { + fontSize: theme.typography.pxToRem(12) + }, + "& caption": { + ...theme.typography.useText({ + fontSize: theme.typography.pxToRem(12), + color: theme.colors.text.secondary + }), + direction: "rtl", + textAlign: "right", + padding: [[theme.typography.pxToRem(8), 0]] + } + }, + ltrData: { + direction: "ltr", + "& thead tr, & tbody tr": { + textAlign: "left", + fontFamily: theme.typography.fontFamily.ltr + } + }, + rtlData: { + direction: "rtl", + "& thead tr, & tbody tr": { + textAlign: "right", + fontFamily: theme.typography.fontFamily.rtl + } + } + }), + { name: "Table" } +); + +const useTHStyles = makeStyles( + theme => ({ + root: { + ...theme.typography.useText({ + fontSize: theme.typography.pxToRem(14), + fontWeight: theme.typography.fontWeight.medium, + color: theme.colors.text.primary + }), + padding: [[theme.typography.pxToRem(14), theme.typography.pxToRem(16)]], + whiteSpace: "pre", + minWidth: theme.typography.pxToRem(120) + } + }), + { name: "TH" } +); + +const useTDStyles = makeStyles( + theme => ({ + root: { + ...theme.typography.useText({ + fontSize: theme.typography.pxToRem(14), + color: theme.colors.text.primary + }), + padding: [[theme.typography.pxToRem(10), theme.typography.pxToRem(16)]] + } + }), + { name: "TD" } +); + +const useTableRowStyles = makeStyles( + theme => ({ + root: { + borderBottom: `1px solid ${theme.colors.divider}`, + verticalAlign: "top" + } + }), + { name: "TableRow" } +); + +const useTableFooterStyles = makeStyles( + theme => ({ + root: { + direction: "rtl", + "& td": { + color: theme.colors.text.primary, + fontSize: theme.typography.pxToRem(12), + padding: [[theme.typography.pxToRem(8), 0]] + } + } + }), + { name: "TableFooter" } +); + +const useLinkStyles = makeStyles( + theme => { + const { + colors, + darkMode, + typography: { pxToRem } + } = theme; + + const primary = !darkMode ? colors.primary.origin : colors.primary.light; + + const primaryHover = adjustColor(primary, { + saturation: -8, + lightness: +8 + }); + + const primaryActive = adjustColor(primary, { + saturation: +8, + lightness: -4 + }); + + return { + root: { + position: "relative", + display: "inline-block", + textDecoration: "none", + color: primary, + "&:hover": { + color: primaryActive, + "&:after": { backgroundColor: primary } + }, + "&:visited": { + color: primaryHover, + "&:hover": { + color: primaryActive, + "&:after": { backgroundColor: primary } + } + }, + "&:after": { + content: '""', + position: "absolute", + bottom: 0, + left: 0, + right: 0, + height: pxToRem(1), + backgroundColor: colors.transparent + } + } + }; + }, + { name: "Link" } +); + +const useOrderedListStyles = makeStyles( + theme => ({ + root: { + counterReset: "section", + listStyle: "none", + paddingRight: 0, + paddingLeft: 0, + margin: 0, + paddingTop: theme.typography.pxToRem(16), + paddingBottom: theme.typography.pxToRem(16), + "& + p": { marginTop: theme.typography.pxToRem(-16) }, + "& > li:before": { + counterIncrement: "section", + content: 'counters(section, ".") "-"', + width: "auto", + height: "auto", + backgroundColor: "transparent", + borderRadius: "initial", + verticalAlign: "initial", + marginLeft: theme.typography.pxToRem(4) + } + } + }), + { name: "OrderedList" } +); + +const useUnorderedListStyles = makeStyles( + theme => ({ + root: { + listStyle: "none", + paddingRight: 0, + paddingLeft: 0, + margin: 0, + paddingTop: theme.typography.pxToRem(16), + paddingBottom: theme.typography.pxToRem(16), + "& + p": { marginTop: theme.typography.pxToRem(-16) } + } + }), + { name: "UnorderedList" } +); + +const useListItemStyles = makeStyles( + theme => ({ + root: { + position: "relative", + color: theme.colors.text.primary, + fontSize: theme.typography.pxToRem(16), + "& pre": { + marginTop: theme.typography.pxToRem(16), + marginBottom: theme.typography.pxToRem(32) + }, + "& strong": { fontWeight: theme.typography.fontWeight.medium }, + "&:before": { + marginLeft: theme.typography.pxToRem(8), + content: '""', + verticalAlign: "middle", + display: "inline-block", + width: "0.25rem", + height: "0.25rem", + borderRadius: "0.5em", + flexShrink: 0, + backgroundColor: theme.colors.text.primary + } + } + }), + { name: "ListItem" } +); + +const useCustomDivStyles = makeStyles( + theme => ({ + root: { + "&#tickle-anchor": { + width: 150, + height: 150, + display: "flex", + alignItems: "center", + justifyContent: "center", + border: "1px solid #ddd" + } + }, + noteBox: { + display: "flex", + alignItems: "center", + marginTop: theme.typography.pxToRem(16), + color: !theme.darkMode + ? theme.colors.secondary.origin + : theme.colors.secondary.light + }, + noteBoxIcon: { + marginLeft: theme.typography.pxToRem(8), + alignSelf: "flex-start", + position: "relative", + top: theme.typography.pxToRem(5) + }, + imagery: { + "& + h1": { marginTop: theme.typography.pxToRem(32) } + }, + column: { + marginBottom: theme.typography.pxToRem(32), + marginTop: theme.typography.pxToRem(16) + }, + columnWrapper: { + marginBottom: theme.typography.pxToRem(-32), + marginTop: theme.typography.pxToRem(-16) + }, + topFluid: { + marginRight: theme.typography.pxToRem(-16), + marginLeft: theme.typography.pxToRem(-16), + marginTop: theme.typography.pxToRem(-32), + "&$imagery figure > div:nth-child(1)": { + borderRadius: 0 + } + } + }), + { name: "CustomDiv" } +); + +const useMarkStyles = makeStyles( + theme => ({ + root: { + backgroundColor: theme.colors.transparent, + color: theme.darkMode + ? theme.colors.secondary.light + : theme.colors.secondary.origin, + fontStyle: "italic", + "&:before, &:after": { content: '"\'"' } + } + }), + { name: "Mark" } +); + +const Mark = (props: React.ComponentPropsWithoutRef<"mark">) => { + const { children, ...otherProps } = props; + const classes = useMarkStyles(); + + return ( + + {children} + + ); +}; + +const CustomDiv = React.forwardRef(function CustomDiv( + props: CustomDivProps, + ref +) { + const { + children, + "data-notebox": isNoteBox, + "data-imagery": isImagery, + "data-column": isColumn, + "data-columnWrapper": isColumnWrapper, + "data-topFluid": isTopFluid, + className, + ...otherProps + } = props; + + const classes = useCustomDivStyles(); + + return ( +

    + {isNoteBox ? ( + + + {children} + + ) : ( + children + )} +
    + ); +}); + +const Paragraph = (props: TextProps<{ "data-subtitle"?: boolean }, "p">) => { + const { children, "data-subtitle": isSubtitle, ...otherProps } = props; + + const classes = useParagraphStyles(); + + return ( + + {children} + + ); +}; + +const H1 = (props: TextProps<{}, "h1">) => { + const { children, ...otherProps } = props; + const classes = useH1Styles(); + + return ( + + {children} + + ); +}; + +const H2 = (props: TextProps<{}, "h2">) => { + const { children, ...otherProps } = props; + const classes = useH2Styles(); + + return ( + + {children} + + ); +}; + +const H3 = (props: TextProps<{}, "h3">) => { + const { children, ...otherProps } = props; + const classes = useH3Styles(); + + return ( + + {children} + + ); +}; + +const H4 = (props: TextProps<{}, "h4">) => { + const { children, ...otherProps } = props; + const classes = useH4Styles(); + + return ( + + {children} + + ); +}; + +const HorizontalDivider = (props: DividerProps) => { + return ; +}; + +const Table = (props: TableProps) => { + const { + children, + cols = "auto", + dataDir = "rtl", + layout = "auto", + style, + ...otherProps + } = props; + + const classes = useTableStyles(); + const theme = useTheme(); + + let widthProp: object; + + if (layout !== "fixed") { + widthProp = + cols === "auto" + ? { width: "100%" } + : { minWidth: theme.typography.pxToRem(cols * 200) }; + } else { + widthProp = + cols === "auto" + ? { width: "100%" } + : { width: "100%", maxWidth: theme.typography.pxToRem(cols * 200) }; + } + + return ( +
    + + {children} +
    +
    + ); +}; + +const TableFooter = (props: React.ComponentPropsWithoutRef<"tfoot">) => { + const { children, ...otherProps } = props; + const classes = useTableFooterStyles(); + + return ( + + {children} + + ); +}; + +const TableRow = (props: React.ComponentPropsWithoutRef<"tr">) => { + const { children, ...otherProps } = props; + const classes = useTableRowStyles(); + + return ( + + {children} + + ); +}; + +const TD = (props: React.ComponentPropsWithoutRef<"td">) => { + const { children, ...otherProps } = props; + const classes = useTDStyles(); + + return ( + + {children} + + ); +}; + +const TH = (props: React.ComponentPropsWithoutRef<"th">) => { + const { children, ...otherProps } = props; + const classes = useTHStyles(); + + return ( + + {children} + + ); +}; + +const CustomLink = (props: React.ComponentPropsWithoutRef<"a">) => { + const { children, href = "", ...otherProps } = props; + const classes = useLinkStyles(); + + return ( + + + {children} + + + ); +}; + +const OrderedList = (props: React.ComponentPropsWithoutRef<"ol">) => { + const { children, ...otherProps } = props; + const classes = useOrderedListStyles(); + + return ( +
      + {children} +
    + ); +}; + +const UnorderedList = (props: React.ComponentPropsWithoutRef<"ul">) => { + const { children, ...otherProps } = props; + const classes = useUnorderedListStyles(); + + return ( +
      + {children} +
    + ); +}; + +const ListItem = (props: React.ComponentPropsWithoutRef<"li">) => { + const { children, ...otherProps } = props; + const classes = useListItemStyles(); + + return ( +
  • + {children} +
  • + ); +}; + +export default function createComponentMapping() { + return { + p: Paragraph, + h1: H1, + h2: H2, + h3: H3, + h4: H4, + pre: function Pre({ children }: React.ComponentPropsWithoutRef<"pre">) { + return {children}; + }, + mark: Mark, + hr: HorizontalDivider, + table: Table, + tfoot: TableFooter, + tr: TableRow, + td: TD, + th: TH, + a: CustomLink, + ul: UnorderedList, + ol: OrderedList, + li: ListItem, + div: CustomDiv + }; +} diff --git a/utils/index.ts b/utils/index.ts new file mode 100644 index 0000000..47f6d8d --- /dev/null +++ b/utils/index.ts @@ -0,0 +1,11 @@ +export { default as createComponentMapping } from "./createComponentMapping"; +export { default as removeSlashes } from "./removeSlashes"; +export { default as search } from "./search"; +export { default as setCanonicalMeta } from "./setCanonicalMeta"; +export { default as setDescriptionMeta } from "./setDescriptionMeta"; +export { default as setKeywordsMeta } from "./setKeywordsMeta"; +export { default as setTitleMeta } from "./setTitleMeta"; +export { default as useIsomorphicLayoutEffect } from "./useIsomorphicLayoutEffect"; + +export * as analytics from "./analytics"; +export * as case from "./case"; diff --git a/utils/removeSlashes.ts b/utils/removeSlashes.ts new file mode 100644 index 0000000..9eb3396 --- /dev/null +++ b/utils/removeSlashes.ts @@ -0,0 +1,14 @@ +export default function removeSlashes( + url: string = "", + options: { leadingSlashes?: boolean; trailingSlashes?: boolean } = {} +) { + const { leadingSlashes = true, trailingSlashes = true } = options; + + let end = url.length - 1; + let start = 0; + + if (leadingSlashes) while (url.charAt(start) === "/") ++start; + if (trailingSlashes) while (url.charAt(end) === "/") --end; + + return url.slice(start, end + 1); +} diff --git a/utils/search.ts b/utils/search.ts new file mode 100644 index 0000000..fc029dc --- /dev/null +++ b/utils/search.ts @@ -0,0 +1,63 @@ +import type { Schema, LeafChild, ChildSchema } from "nav-schema"; + +type LabelType = { en: string; fa: string }; +type ParentTreeType = { label: LabelType }[]; + +export type SearchReturnType = { + label: LabelType; + href: string; + parents: ParentTreeType; +}[]; + +const search = (schema: Schema, key: string = ""): SearchReturnType => { + const searchMechanic = ( + schema: Schema | ChildSchema, + key: string, + parentTree: ParentTreeType = [] + ): SearchReturnType => { + let results: SearchReturnType = []; + const parents = [...parentTree]; + + if (schema.children && schema.children.length > 0) { + results = schema.children.reduce((output: SearchReturnType, child) => { + const childSchema = schema.byChild[child.en]; + + if (!childSchema) return output; + + const isLeaf = + !(childSchema as unknown as ChildSchema).children || + (childSchema as unknown as ChildSchema).children.length === 0; + + if (isLeaf) { + if ( + childSchema.label.en.toLowerCase().indexOf(key.toLowerCase()) !== + -1 || + childSchema.label.fa.indexOf(key) !== -1 + ) { + return [ + ...output, + { + label: (childSchema as unknown as LeafChild).label, + href: (childSchema as unknown as LeafChild).href, + parents + } + ]; + } else return output; + } else + return [ + ...output, + ...searchMechanic(childSchema as ChildSchema, key, [ + ...parentTree, + { label: childSchema.label } + ]) + ]; + }, []); + } + + return results; + }; + + return searchMechanic(schema, key); +}; + +export default search; diff --git a/utils/setCanonicalMeta.tsx b/utils/setCanonicalMeta.tsx new file mode 100644 index 0000000..fd8a586 --- /dev/null +++ b/utils/setCanonicalMeta.tsx @@ -0,0 +1,10 @@ +import { Fragment } from "react"; + +export default function setCanonicalMeta(canonical: string) { + return ( + + + + + ); +} diff --git a/utils/setDescriptionMeta.tsx b/utils/setDescriptionMeta.tsx new file mode 100644 index 0000000..802e8e8 --- /dev/null +++ b/utils/setDescriptionMeta.tsx @@ -0,0 +1,10 @@ +import { Fragment } from "react"; + +export default function setDescriptionMeta(description: string) { + return ( + + + + + ); +} diff --git a/utils/setKeywordsMeta.tsx b/utils/setKeywordsMeta.tsx new file mode 100644 index 0000000..b0f3983 --- /dev/null +++ b/utils/setKeywordsMeta.tsx @@ -0,0 +1,3 @@ +export default function setKeywordsMeta(keywords: string[]) { + return ; +} diff --git a/utils/setTitleMeta.tsx b/utils/setTitleMeta.tsx new file mode 100644 index 0000000..357cbe6 --- /dev/null +++ b/utils/setTitleMeta.tsx @@ -0,0 +1,10 @@ +import { Fragment } from "react"; + +export default function setTitleMeta(title: string) { + return ( + + {title} + + + ); +} diff --git a/utils/useIsomorphicLayoutEffect.ts b/utils/useIsomorphicLayoutEffect.ts new file mode 100644 index 0000000..809fd59 --- /dev/null +++ b/utils/useIsomorphicLayoutEffect.ts @@ -0,0 +1,5 @@ +import * as React from "react"; + +export default typeof window === "undefined" + ? React.useEffect + : React.useLayoutEffect; diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..f49086b --- /dev/null +++ b/yarn.lock @@ -0,0 +1,5462 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" + integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== + dependencies: + "@babel/highlight" "^7.23.4" + chalk "^2.4.2" + +"@babel/core@7.12.9": + version "7.12.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" + integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.5" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.5" + "@babel/parser" "^7.12.7" + "@babel/template" "^7.12.7" + "@babel/traverse" "^7.12.9" + "@babel/types" "^7.12.7" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.12.5", "@babel/generator@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.5.tgz#17d0a1ea6b62f351d281350a5f80b87a810c4755" + integrity sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA== + dependencies: + "@babel/types" "^7.23.5" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-imports@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== + dependencies: + "@babel/types" "^7.22.15" + +"@babel/helper-module-transforms@^7.12.1": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.20" + +"@babel/helper-plugin-utils@7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== + +"@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" + integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== + +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/helpers@^7.12.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.5.tgz#52f522840df8f1a848d06ea6a79b79eefa72401e" + integrity sha512-oO7us8FzTEsG3U6ag9MfdF1iA/7Z6dz+MtFhifZk8C8o453rGJFFWUP1t+ULM9TUIAzC9uxXEiXjOiVMyd7QPg== + dependencies: + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.5" + "@babel/types" "^7.23.5" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" + integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.12.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.5.tgz#37dee97c4752af148e1d38c34b856b2507660563" + integrity sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ== + +"@babel/plugin-proposal-object-rest-spread@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" + integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.12.1" + +"@babel/plugin-syntax-jsx@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz#9d9d357cc818aa7ae7935917c1257f67677a0926" + integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@7.8.3", "@babel/plugin-syntax-object-rest-spread@^7.8.0": + 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-transform-parameters@^7.12.1": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz#83ef5d1baf4b1072fa6e54b2b0999a7b2527e2af" + integrity sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/runtime@7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" + integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.13.6", "@babel/runtime@^7.3.1", "@babel/runtime@^7.8.3": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.5.tgz#11edb98f8aeec529b82b211028177679144242db" + integrity sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.12.7", "@babel/template@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + +"@babel/traverse@^7.12.9", "@babel/traverse@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.5.tgz#f546bf9aba9ef2b042c0e00d245990c15508e7ec" + integrity sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.5" + "@babel/types" "^7.23.5" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c" + integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg== + dependencies: + esutils "^2.0.2" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + +"@babel/types@^7.12.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.5.tgz#48d730a00c95109fa4393352705954d74fb5b602" + integrity sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w== + dependencies: + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + +"@csstools/convert-colors@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" + integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== + +"@csstools/normalize.css@*": + version "12.0.0" + resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-12.0.0.tgz#a9583a75c3f150667771f30b60d9f059473e62c4" + integrity sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg== + +"@emotion/is-prop-valid@^0.7.3": + version "0.7.3" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.7.3.tgz#a6bf4fa5387cbba59d44e698a4680f481a8da6cc" + integrity sha512-uxJqm/sqwXw3YPA5GXX365OBcJGFtxUVkB6WyezqFHlNe9jqUWH5ur2O2M8dGBz61kn1g3ZBlzUunFQXQIClhA== + dependencies: + "@emotion/memoize" "0.7.1" + +"@emotion/memoize@0.7.1": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.1.tgz#e93c13942592cf5ef01aa8297444dc192beee52f" + integrity sha512-Qv4LTqO11jepd5Qmlp3M1YEjBumoTHcHFdgPTQ+sFlIL5myi/7xu/POwP7IRu6odBdmLXdtIs1D6TuW6kbwbbg== + +"@eslint/eslintrc@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^13.9.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + +"@hapi/accept@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@hapi/accept/-/accept-5.0.2.tgz#ab7043b037e68b722f93f376afb05e85c0699523" + integrity sha512-CmzBx/bXUR8451fnZRuZAJRlzgm0Jgu5dltTX/bszmR2lheb9BpyN47Q1RbaGTsvFzn0PXAEs+lXDKfshccYZw== + dependencies: + "@hapi/boom" "9.x.x" + "@hapi/hoek" "9.x.x" + +"@hapi/boom@9.x.x": + version "9.1.4" + resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-9.1.4.tgz#1f9dad367c6a7da9f8def24b4a986fc5a7bd9db6" + integrity sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw== + dependencies: + "@hapi/hoek" "9.x.x" + +"@hapi/hoek@9.x.x": + version "9.3.0" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + +"@humanwhocodes/config-array@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== + dependencies: + "@humanwhocodes/object-schema" "^1.2.0" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.20" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" + integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@mdx-js/loader@^1.6.22": + version "1.6.22" + resolved "https://registry.yarnpkg.com/@mdx-js/loader/-/loader-1.6.22.tgz#d9e8fe7f8185ff13c9c8639c048b123e30d322c4" + integrity sha512-9CjGwy595NaxAYp0hF9B/A0lH6C8Rms97e2JS9d3jVUtILn6pT5i5IV965ra3lIWc7Rs1GG1tBdVF7dCowYe6Q== + dependencies: + "@mdx-js/mdx" "1.6.22" + "@mdx-js/react" "1.6.22" + loader-utils "2.0.0" + +"@mdx-js/mdx@1.6.22": + version "1.6.22" + resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-1.6.22.tgz#8a723157bf90e78f17dc0f27995398e6c731f1ba" + integrity sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA== + dependencies: + "@babel/core" "7.12.9" + "@babel/plugin-syntax-jsx" "7.12.1" + "@babel/plugin-syntax-object-rest-spread" "7.8.3" + "@mdx-js/util" "1.6.22" + babel-plugin-apply-mdx-type-prop "1.6.22" + babel-plugin-extract-import-names "1.6.22" + camelcase-css "2.0.1" + detab "2.0.4" + hast-util-raw "6.0.1" + lodash.uniq "4.5.0" + mdast-util-to-hast "10.0.1" + remark-footnotes "2.0.0" + remark-mdx "1.6.22" + remark-parse "8.0.3" + remark-squeeze-paragraphs "4.0.0" + style-to-object "0.3.0" + unified "9.2.0" + unist-builder "2.0.3" + unist-util-visit "2.0.3" + +"@mdx-js/react@1.6.22", "@mdx-js/react@^1.6.22": + version "1.6.22" + resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-1.6.22.tgz#ae09b4744fddc74714ee9f9d6f17a66e77c43573" + integrity sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg== + +"@mdx-js/util@1.6.22": + version "1.6.22" + resolved "https://registry.yarnpkg.com/@mdx-js/util/-/util-1.6.22.tgz#219dfd89ae5b97a8801f015323ffa4b62f45718b" + integrity sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA== + +"@next/env@10.2.3": + version "10.2.3" + resolved "https://registry.yarnpkg.com/@next/env/-/env-10.2.3.tgz#ede3bbe68cec9939c37168ea2077f9adbc68334e" + integrity sha512-uBOjRBjsWC4C8X3DfmWWP6ekwLnf2JCCwQX9KVnJtJkqfDsv1yQPakdOEwvJzXQc3JC/v5KKffYPVmV2wHXCgQ== + +"@next/mdx@^10.0.8": + version "10.2.3" + resolved "https://registry.yarnpkg.com/@next/mdx/-/mdx-10.2.3.tgz#226d25530e4b98af3a200be3e2616beebf81b56c" + integrity sha512-hseekptFqOCxLbdaNDS/yelaG2Q2uaNDilnRjq8Uv/LWHuZ9F2cp7ndwTolW9acJsbDedamKRMgdw4V2Fz0pUA== + +"@next/polyfill-module@10.2.3": + version "10.2.3" + resolved "https://registry.yarnpkg.com/@next/polyfill-module/-/polyfill-module-10.2.3.tgz#5a29f50c3ce3a56b8268d3b8331c691d8039467a" + integrity sha512-OkeY4cLhzfYbXxM4fd+6V4s5pTPuyfKSlavItfNRA6PpS7t1/R6YjO7S7rB8tu1pbTGuDHGIdE1ioDv15bAbDQ== + +"@next/react-dev-overlay@10.2.3": + version "10.2.3" + resolved "https://registry.yarnpkg.com/@next/react-dev-overlay/-/react-dev-overlay-10.2.3.tgz#95313d10a8848f6c7b9e31ae3bd2a3627d136841" + integrity sha512-E6g2jws4YW94l0lMMopBVKIZK2mEHfSBvM0d9dmzKG9L/A/kEq6LZCB4SiwGJbNsAdlk2y3USDa0oNbpA+m5Kw== + dependencies: + "@babel/code-frame" "7.12.11" + anser "1.4.9" + chalk "4.0.0" + classnames "2.2.6" + css.escape "1.5.1" + data-uri-to-buffer "3.0.1" + platform "1.3.6" + shell-quote "1.7.2" + source-map "0.8.0-beta.0" + stacktrace-parser "0.1.10" + strip-ansi "6.0.0" + +"@next/react-refresh-utils@10.2.3": + version "10.2.3" + resolved "https://registry.yarnpkg.com/@next/react-refresh-utils/-/react-refresh-utils-10.2.3.tgz#2f3e42fe6680798f276e3621345c2886b231348b" + integrity sha512-qtBF56vPC6d6a8p7LYd0iRjW89fhY80kAIzmj+VonvIGjK/nymBjcFUhbKiMFqlhsarCksnhwX+Zmn95Dw9qvA== + +"@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" + +"@opentelemetry/api@0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-0.14.0.tgz#4e17d8d2f1da72b19374efa7b6526aa001267cae" + integrity sha512-L7RMuZr5LzMmZiQSQDy9O1jo0q+DaLy6XpYJfIGfYSfoJA5qzYwUP3sP1uMIQ549DvxAgM3ng85EaPTM/hUHwQ== + dependencies: + "@opentelemetry/context-base" "^0.14.0" + +"@opentelemetry/context-base@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/context-base/-/context-base-0.14.0.tgz#c67fc20a4d891447ca1a855d7d70fa79a3533001" + integrity sha512-sDOAZcYwynHFTbLo6n8kIbLiVF3a3BLkrmehJUyEbT9F+Smbi47kLGS2gG2g0fjBLR/Lr1InPD7kXL7FaTqEkw== + +"@sonnat/icons@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@sonnat/icons/-/icons-1.2.0.tgz#ba02835043eed611a6b1a3dd0b6a61e283eb647e" + integrity sha512-ucdYT5mgfnWWd9miaKVyG0HrB9qkR2Vg4EsVzNHZsnIgjHVYG/IvFUUX0cPQzCPVd0fbW9NtOhDWtQstPaY+qw== + dependencies: + "@babel/runtime" "^7.13.6" + +"@sonnat/ui@^1.3.3-canary.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@sonnat/ui/-/ui-1.4.0.tgz#e63d36e9c07a73c841f87c300d804a94890c2ec2" + integrity sha512-v9sqDRk1Nf022ulfc7GGs+kXsNFg2UGjNMcPEzemdQjhoR/PBTnOnVt6J1+HhwngNV2yxqdvkZhfOf0itlbQIg== + dependencies: + "@babel/runtime" "^7.13.6" + classnames "^2.2.6" + color "^3.1.3" + jss "^10.7.1" + jss-plugin-camel-case "^10.7.1" + jss-plugin-default-unit "^10.7.1" + jss-plugin-extend "^10.7.1" + jss-plugin-global "^10.7.1" + jss-plugin-nested "^10.7.1" + jss-plugin-props-sort "^10.7.1" + jss-plugin-rule-value-function "^10.7.1" + jss-plugin-vendor-prefixer "^10.7.1" + lodash.debounce "^4.0.8" + lodash.throttle "^4.1.1" + prop-types "^15.7.2" + react-is "^17.0.1" + react-jss "^10.7.1" + +"@types/classnames@^2.2.11": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@types/classnames/-/classnames-2.3.1.tgz#3c2467aa0f1a93f1f021e3b9bcf938bd5dfdc0dd" + integrity sha512-zeOWb0JGBoVmlQoznvqXbE0tEC/HONsnoUNH19Hc96NFsTAwTXbTqb8FMYkru1F/iqp7a18Ws3nWJvtA1sHD1A== + dependencies: + classnames "*" + +"@types/clean-css@^4.2.3": + version "4.2.11" + resolved "https://registry.yarnpkg.com/@types/clean-css/-/clean-css-4.2.11.tgz#3f170dedd8d096fe7e7bd1c8dda0c8314217cbe6" + integrity sha512-Y8n81lQVTAfP2TOdtJJEsCoYl1AnOkqDqMvXb9/7pfgZZ7r8YrEyurrAvAoAjHOGXKRybay+5CsExqIH6liccw== + dependencies: + "@types/node" "*" + source-map "^0.6.0" + +"@types/deep-diff@^1.0.0": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/deep-diff/-/deep-diff-1.0.5.tgz#95c08a57f097ffadd28bc98a45a8025f53c581e4" + integrity sha512-PQyNSy1YMZU1hgZA5tTYfHPpUAo9Dorn1PZho2/budQLfqLu3JIP37JAavnwYpR1S2yFZTXa3hxaE4ifGW5jaA== + +"@types/fs-extra@^9.0.11": + version "9.0.13" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" + integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== + dependencies: + "@types/node" "*" + +"@types/hast@^2.0.0": + version "2.3.8" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.8.tgz#4ac5caf38b262b7bd5ca3202dda71f0271635660" + integrity sha512-aMIqAlFd2wTIDZuvLbhUT+TGvMxrNC8ECUIVtH6xxy0sQLs3iu6NO8Kp/VT5je7i5ufnebXzdV1dNDMnvaH6IQ== + dependencies: + "@types/unist" "^2" + +"@types/json-schema@^7.0.7": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/lodash.debounce@^4.0.6": + version "4.0.9" + resolved "https://registry.yarnpkg.com/@types/lodash.debounce/-/lodash.debounce-4.0.9.tgz#0f5f21c507bce7521b5e30e7a24440975ac860a5" + integrity sha512-Ma5JcgTREwpLRwMM+XwBR7DaWe96nC38uCBDFKZWbNKD+osjVzdpnUSwBcqCptrp16sSOLBAUb50Car5I0TCsQ== + dependencies: + "@types/lodash" "*" + +"@types/lodash.throttle@^4.1.6": + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/lodash.throttle/-/lodash.throttle-4.1.9.tgz#f17a6ae084f7c0117bd7df145b379537bc9615c5" + integrity sha512-PCPVfpfueguWZQB7pJQK890F2scYKoDUL3iM522AptHWn7d5NQmeS/LTEHIcLr5PaTzl3dK2Z0xSUHHTHwaL5g== + dependencies: + "@types/lodash" "*" + +"@types/lodash@*": + version "4.14.202" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.202.tgz#f09dbd2fb082d507178b2f2a5c7e74bd72ff98f8" + integrity sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ== + +"@types/mdast@^3.0.0": + version "3.0.15" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.15.tgz#49c524a263f30ffa28b71ae282f813ed000ab9f5" + integrity sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ== + dependencies: + "@types/unist" "^2" + +"@types/mdx-js__react@^1.5.3": + version "1.5.8" + resolved "https://registry.yarnpkg.com/@types/mdx-js__react/-/mdx-js__react-1.5.8.tgz#a709076d48d17bb2e3168a0686d79b16e55ff9a4" + integrity sha512-iLQL8JZ4AZ+rpZvGUsQwENffpsSCMLYB8kE6OhGasLmdYn7aSLq53uOvZrKx5FM+hymE2nm08HDfq7tFx02ElA== + dependencies: + "@types/react" "*" + +"@types/node@*": + version "20.10.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.3.tgz#4900adcc7fc189d5af5bb41da8f543cea6962030" + integrity sha512-XJavIpZqiXID5Yxnxv3RUDKTN5b81ddNC3ecsA0SoFXz/QU8OGBwZGMomiq0zw+uuqbL/krztv/DINAQ/EV4gg== + dependencies: + undici-types "~5.26.4" + +"@types/node@^14.14.32": + version "14.18.63" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.63.tgz#1788fa8da838dbb5f9ea994b834278205db6ca2b" + integrity sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ== + +"@types/parse-json@^4.0.0": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" + integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== + +"@types/parse5@^5.0.0": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" + integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== + +"@types/prop-types@*": + version "15.7.11" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.11.tgz#2596fb352ee96a1379c657734d4b913a613ad563" + integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== + +"@types/react-collapse@^5.0.0": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@types/react-collapse/-/react-collapse-5.0.4.tgz#1b3e52557c8f85b3d4c4a7d073d4c2437fa2e2a0" + integrity sha512-tM5cVB6skGLneNYnRK2E3R56VOHguSeJQHslGPTIMC58ytL3oelT8L/l1onkwHGn5vSEs2BEq2Olzrur+YdliA== + dependencies: + "@types/react" "*" + +"@types/react-dom@^17.0.1": + version "17.0.25" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.25.tgz#e0e5b3571e1069625b3a3da2b279379aa33a0cb5" + integrity sha512-urx7A7UxkZQmThYA4So0NelOVjx3V4rNFVJwp0WZlbIK5eM4rNJDiN3R/E9ix0MBh6kAEojk/9YL+Te6D9zHNA== + dependencies: + "@types/react" "^17" + +"@types/react@*": + version "18.2.41" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.41.tgz#9eea044246bdb10510df89ef7f8422a8b6ad8fb9" + integrity sha512-CwOGr/PiLiNBxEBqpJ7fO3kocP/2SSuC9fpH5K7tusrg4xPSRT/193rzolYwQnTN02We/ATXKnb6GqA5w4fRxw== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/react@^17": + version "17.0.71" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.71.tgz#3673d446ad482b1564e44bf853b3ab5bcbc942c4" + integrity sha512-lfqOu9mp16nmaGRrS8deS2Taqhd5Ih0o92Te5Ws6I1py4ytHBcXLqh0YIqVsViqwVI5f+haiFM6hju814BzcmA== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/react@^18.2.64": + version "18.2.64" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.64.tgz#3700fbb6b2fa60a6868ec1323ae4cbd446a2197d" + integrity sha512-MlmPvHgjj2p3vZaxbQgFUQFvD8QiZwACfGqEdDSWou5yISWxDQ4/74nCAwsUiX7UFLKZz3BbVSPj+YxeoGGCfg== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/scheduler@*": + version "0.16.8" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff" + integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== + +"@types/smoothscroll-polyfill@^0.3.1": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@types/smoothscroll-polyfill/-/smoothscroll-polyfill-0.3.3.tgz#60dcd0acfdb62a9df5e3d4d935436be089c43adb" + integrity sha512-VBcuyevh5N80XlrUz8a2GWgP9MnIVctdUgxWj8YdD+tN2OMptZTEUKYo8wXly8MR91HisJ9CaX8utF9zbMU8yA== + +"@types/unist@^2", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": + version "2.0.10" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.10.tgz#04ffa7f406ab628f7f7e97ca23e290cd8ab15efc" + integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== + +"@typescript-eslint/eslint-plugin@^4.16.1": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz#c24dc7c8069c7706bc40d99f6fa87edcb2005276" + integrity sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg== + dependencies: + "@typescript-eslint/experimental-utils" "4.33.0" + "@typescript-eslint/scope-manager" "4.33.0" + debug "^4.3.1" + functional-red-black-tree "^1.0.1" + ignore "^5.1.8" + regexpp "^3.1.0" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/experimental-utils@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd" + integrity sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q== + dependencies: + "@types/json-schema" "^7.0.7" + "@typescript-eslint/scope-manager" "4.33.0" + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/typescript-estree" "4.33.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/parser@^4.16.1": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.33.0.tgz#dfe797570d9694e560528d18eecad86c8c744899" + integrity sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA== + dependencies: + "@typescript-eslint/scope-manager" "4.33.0" + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/typescript-estree" "4.33.0" + debug "^4.3.1" + +"@typescript-eslint/scope-manager@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3" + integrity sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ== + dependencies: + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/visitor-keys" "4.33.0" + +"@typescript-eslint/types@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" + integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== + +"@typescript-eslint/typescript-estree@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609" + integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA== + dependencies: + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/visitor-keys" "4.33.0" + debug "^4.3.1" + globby "^11.0.3" + is-glob "^4.0.1" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/visitor-keys@4.33.0": + version "4.33.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd" + integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg== + dependencies: + "@typescript-eslint/types" "4.33.0" + eslint-visitor-keys "^2.0.0" + +"@utilityjs/use-event-listener@^1.0.4": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@utilityjs/use-event-listener/-/use-event-listener-1.0.6.tgz#f1ebcb900067ce42d1549130d3c6eee6f458e42a" + integrity sha512-qmJD9Kjtv8ogu7W17isxtcjhj+PlCbJjBAL0RV4/yiY8FsqUfPJZMuhIGfRfrbglUjgW4tCtmMHtovHDHlbK5w== + dependencies: + "@utilityjs/use-get-latest" "^1.0.2" + +"@utilityjs/use-get-latest@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@utilityjs/use-get-latest/-/use-get-latest-1.0.2.tgz#7151efdaad46ab0eff9961464367943545696fa2" + integrity sha512-GeKhniDJDEjzOQmteGRRFr26x5LNA0FMcWPNIjJEClAC/D6kFXmi3a/sHVynOM3h6rgUqrIVxIIFlf/EFJ9LBQ== + +acorn-jsx@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.1: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +anser@1.4.9: + version "1.4.9" + resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.9.tgz#1f85423a5dcf8da4631a341665ff675b96845760" + integrity sha512-AI+BjTeGt2+WFk4eWcqbQ7snZpDBt8SaLlj0RT2h5xfdWaiy51OjYvqwMrNzJLGy8iOAL6nKDITWO+rd4MkYEA== + +ansi-colors@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-escapes@^4.3.0: + 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.0, 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-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" + +anymatch@~3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +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" + +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + +array-includes@^3.1.6, array-includes@^3.1.7: + version "3.1.7" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" + integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.findlastindex@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz#b37598438f97b579166940814e2c0493a4f50207" + integrity sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.2.1" + +array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.1, array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz#620eff7442503d66c799d95503f82b475745cefd" + integrity sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.2.1" + +arraybuffer.prototype.slice@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" + integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" + +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +assert@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-2.0.0.tgz#95fc1c616d48713510680f2eaf2d10dd22e02d32" + integrity sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A== + dependencies: + es6-object-assign "^1.1.0" + is-nan "^1.2.1" + object-is "^1.0.1" + util "^0.12.0" + +assert@^1.1.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.1.tgz#038ab248e4ff078e7bc2485ba6e6388466c78f76" + integrity sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A== + dependencies: + object.assign "^4.1.4" + util "^0.10.4" + +ast-types@0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.2.tgz#df39b677a911a83f3a049644fb74fdded23cea48" + integrity sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +asynciterator.prototype@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz#8c5df0514936cdd133604dfcc9d3fb93f09b2b62" + integrity sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg== + dependencies: + has-symbols "^1.0.3" + +autoprefixer@^10.2.5: + version "10.4.16" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.16.tgz#fad1411024d8670880bdece3970aa72e3572feb8" + integrity sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ== + dependencies: + browserslist "^4.21.10" + caniuse-lite "^1.0.30001538" + fraction.js "^4.3.6" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +autoprefixer@^9.6.1: + version "9.8.8" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.8.tgz#fd4bd4595385fa6f06599de749a4d5f7a474957a" + integrity sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA== + dependencies: + browserslist "^4.12.0" + caniuse-lite "^1.0.30001109" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + picocolors "^0.2.1" + postcss "^7.0.32" + postcss-value-parser "^4.1.0" + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +babel-plugin-apply-mdx-type-prop@1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz#d216e8fd0de91de3f1478ef3231e05446bc8705b" + integrity sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ== + dependencies: + "@babel/helper-plugin-utils" "7.10.4" + "@mdx-js/util" "1.6.22" + +babel-plugin-extract-import-names@1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz#de5f9a28eb12f3eb2578bf74472204e66d1a13dc" + integrity sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ== + dependencies: + "@babel/helper-plugin-utils" "7.10.4" + +babel-plugin-syntax-jsx@6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" + integrity sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw== + +bail@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" + integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== + +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== + +base64-js@^1.0.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.0, bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + +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, 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" + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.2.tgz#e78d4b69816d6e3dd1c747e64e9947f9ad79bc7e" + integrity sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg== + dependencies: + bn.js "^5.2.1" + browserify-rsa "^4.1.0" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.4" + inherits "^2.0.4" + parse-asn1 "^5.1.6" + readable-stream "^3.6.2" + safe-buffer "^5.2.1" + +browserify-zlib@0.2.0, browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@4.16.6: + version "4.16.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" + integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== + dependencies: + caniuse-lite "^1.0.30001219" + colorette "^1.2.2" + electron-to-chromium "^1.3.723" + escalade "^3.1.1" + node-releases "^1.1.71" + +browserslist@^4.12.0, browserslist@^4.21.10, browserslist@^4.6.4: + version "4.22.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.2.tgz#704c4943072bd81ea18997f3bd2180e89c77874b" + integrity sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A== + dependencies: + caniuse-lite "^1.0.30001565" + electron-to-chromium "^1.4.601" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + +buffer@5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" + integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" + integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== + dependencies: + function-bind "^1.1.2" + get-intrinsic "^1.2.1" + set-function-length "^1.1.1" + +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== + +camelcase-css@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001202, caniuse-lite@^1.0.30001219, caniuse-lite@^1.0.30001228, caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001565: + version "1.0.30001566" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001566.tgz#61a8e17caf3752e3e426d4239c549ebbb37fef0d" + integrity sha512-ggIhCsTxmITBAMmK8yZjEhCO5/47jKXPu6Dha/wuCS4JePVL+3uiDEBuhu2aIoT+bqTOR8L76Ip1ARL9xYsEJA== + +ccount@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" + integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== + +chalk@2.4.2, chalk@^2.4.2: + 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@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72" + integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.0: + 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" + +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== + +chokidar@3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" + integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" + optionalDependencies: + fsevents "~2.3.1" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +classnames@*, classnames@^2.2.6: + version "2.3.2" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" + integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== + +classnames@2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" + integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== + +clean-css@^5.1.2: + version "5.3.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.3.tgz#b330653cd3bd6b75009cc25c714cae7b93351ccd" + integrity sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg== + dependencies: + source-map "~0.6.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-truncate@2.1.0, cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + +collapse-white-space@^1.0.2: + version "1.0.6" + resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" + integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== + +color-convert@^1.9.0, color-convert@^1.9.3: + 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 sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@^1.0.0, 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== + +color-string@^1.6.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.1.3: + version "3.2.1" + resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + +colorette@^1.2.2, colorette@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" + integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== + +colorette@^2.0.16: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +comma-separated-tokens@^1.0.0: + version "1.0.8" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" + integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== + +commander@^8.2.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +constants-browserify@1.0.0, constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== + +convert-source-map@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +copy-to-clipboard@^3.3.1: + version "3.3.3" + resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0" + integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA== + dependencies: + toggle-selection "^1.0.6" + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== + 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-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@^7.0.2, 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" + +crypto-browserify@3.12.0, crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +css-blank-pseudo@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" + integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w== + dependencies: + postcss "^7.0.5" + +css-has-pseudo@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" + integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^5.0.0-rc.4" + +css-jss@10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/css-jss/-/css-jss-10.10.0.tgz#bd51fbd255cc24597ac0f0f32368394794d37ef3" + integrity sha512-YyMIS/LsSKEGXEaVJdjonWe18p4vXLo8CMA4FrW/kcaEyqdIGKCFXao31gbJddXEdIxSXFFURWrenBJPlKTgAA== + dependencies: + "@babel/runtime" "^7.3.1" + jss "^10.10.0" + jss-preset-default "^10.10.0" + +css-prefers-color-scheme@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" + integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg== + dependencies: + postcss "^7.0.5" + +css-vendor@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-2.0.8.tgz#e47f91d3bd3117d49180a3c935e62e3d9f7f449d" + integrity sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ== + dependencies: + "@babel/runtime" "^7.8.3" + is-in-browser "^1.0.2" + +css.escape@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" + integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== + +cssdb@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" + integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== + +cssesc@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" + integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== + +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== + +cssnano-preset-simple@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cssnano-preset-simple/-/cssnano-preset-simple-2.0.0.tgz#b55e72cb970713f425560a0e141b0335249e2f96" + integrity sha512-HkufSLkaBJbKBFx/7aj5HmCK9Ni/JedRQm0mT2qBzMG/dEuJOLnMt2lK6K1rwOOyV4j9aSY+knbW9WoS7BYpzg== + dependencies: + caniuse-lite "^1.0.30001202" + +cssnano-simple@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cssnano-simple/-/cssnano-simple-2.0.0.tgz#930d9dcd8ba105c5a62ce719cb00854da58b5c05" + integrity sha512-0G3TXaFxlh/szPEG/o3VcmCwl0N3E60XNb9YZZijew5eIs6fLjJuOPxQd9yEBaX2p/YfJtt49i4vYi38iH6/6w== + dependencies: + cssnano-preset-simple "^2.0.0" + +csstype@^3.0.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + +data-uri-to-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" + integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== + +debug@2: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2: + 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" + +deep-diff@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/deep-diff/-/deep-diff-1.0.2.tgz#afd3d1f749115be965e89c63edc7abb1506b9c26" + integrity sha512-aWS3UIVH+NPGCD1kki+DCU9Dua032iSsO43LqQpcs4R3+dVv7tX0qBGjiVHJHjplsoUM2XRO/KB92glqc68awg== + +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== + +define-data-property@^1.0.1, define-data-property@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +des.js@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da" + integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +detab@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detab/-/detab-2.0.4.tgz#b927892069aff405fbb9a186fe97a44a92a94b43" + integrity sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g== + dependencies: + repeat-string "^1.5.4" + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +domain-browser@4.19.0: + version "4.19.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-4.19.0.tgz#1093e17c0a17dbd521182fe90d49ac1370054af1" + integrity sha512-fRA+BaAWOR/yr/t7T9E9GJztHPeFjj8U35ajyAjCDtAAnTn1Rc1f6W6VGPJrO1tkQv9zWu+JRof7z6oQtiYVFQ== + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +electron-to-chromium@^1.3.723, electron-to-chromium@^1.4.601: + version "1.4.601" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.601.tgz#cac69868548aee89961ffe63ff5a7716f0685b75" + integrity sha512-SpwUMDWe9tQu8JX5QCO1+p/hChAi9AE9UpoC3rcHVc+gdCGlbT3SGb5I1klgb952HRIyvt9wZhSz9bNBYz9swA== + +elliptic@^6.5.3, elliptic@^6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +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== + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encoding@0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +enquirer@^2.3.5, enquirer@^2.3.6: + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== + dependencies: + ansi-colors "^4.1.1" + strip-ansi "^6.0.1" + +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" + +es-abstract@^1.22.1: + version "1.22.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32" + integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA== + dependencies: + array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.2" + available-typed-arrays "^1.0.5" + call-bind "^1.0.5" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.2" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.12" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.1" + safe-array-concat "^1.0.1" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.8" + string.prototype.trimend "^1.0.7" + string.prototype.trimstart "^1.0.7" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.13" + +es-iterator-helpers@^1.0.12: + version "1.0.15" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz#bd81d275ac766431d19305923707c3efd9f1ae40" + integrity sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g== + dependencies: + asynciterator.prototype "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.1" + es-abstract "^1.22.1" + es-set-tostringtag "^2.0.1" + function-bind "^1.1.1" + get-intrinsic "^1.2.1" + globalthis "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + iterator.prototype "^1.1.2" + safe-array-concat "^1.0.1" + +es-set-tostringtag@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz#11f7cc9f63376930a5f20be4915834f4bc74f9c9" + integrity sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q== + dependencies: + get-intrinsic "^1.2.2" + has-tostringtag "^1.0.0" + hasown "^2.0.0" + +es-shim-unscopables@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es6-object-assign@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" + integrity sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw== + +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 sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +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== + +eslint-config-prettier@^8.1.0: + version "8.10.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" + integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== + +eslint-import-resolver-node@^0.3.9: + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== + dependencies: + debug "^3.2.7" + is-core-module "^2.13.0" + resolve "^1.22.4" + +eslint-module-utils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" + integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== + dependencies: + debug "^3.2.7" + +eslint-plugin-import@^2.22.1: + version "2.29.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz#8133232e4329ee344f2f612885ac3073b0b7e155" + integrity sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg== + dependencies: + array-includes "^3.1.7" + array.prototype.findlastindex "^1.2.3" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.8.0" + hasown "^2.0.0" + is-core-module "^2.13.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.fromentries "^2.0.7" + object.groupby "^1.0.1" + object.values "^1.1.7" + semver "^6.3.1" + tsconfig-paths "^3.14.2" + +eslint-plugin-react-hooks@^4.2.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + +eslint-plugin-react@^7.22.0: + version "7.33.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz#69ee09443ffc583927eafe86ffebb470ee737608" + integrity sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw== + dependencies: + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" + doctrine "^2.1.0" + es-iterator-helpers "^1.0.12" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" + prop-types "^15.8.1" + resolve "^2.0.0-next.4" + semver "^6.3.1" + string.prototype.matchall "^4.0.8" + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint@^7.16.0: + version "7.32.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== + dependencies: + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.3" + "@humanwhocodes/config-array" "^0.5.0" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + escape-string-regexp "^4.0.0" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.1.2" + globals "^13.6.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.9" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.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== + +etag@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +events@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^5.1.1: + 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" + +extend@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.9: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + 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.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 sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +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-cache-dir@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" + integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@^4.0.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" + +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flatted@^3.2.9: + version "3.2.9" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" + integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== + +flatten@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" + integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +fraction.js@^4.3.6: + version "4.3.7" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.1: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.1, function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gensync@^1.0.0-beta.1: + 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-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" + integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== + dependencies: + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-orientation@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/get-orientation/-/get-orientation-1.1.2.tgz#20507928951814f8a91ded0a0e67b29dfab98947" + integrity sha512-/pViTfifW+gBbh/RnlFYHINvELT9Znt+SYyDKAUL6uV6By019AK/s+i9XP4jSwq7lwP38Fd8HVeTxym3+hkwmQ== + dependencies: + stream-parser "^0.3.1" + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +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== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +glob-parent@^5.1.2, glob-parent@~5.1.0: + 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-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + 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== + +globals@^13.6.0, globals@^13.9.0: + version "13.23.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.23.0.tgz#ef31673c926a0976e1f61dab4dca57e0c0a8af02" + integrity sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.0.3: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.2: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +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-property-descriptors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" + integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== + dependencies: + get-intrinsic "^1.2.2" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + dependencies: + function-bind "^1.1.2" + +hast-to-hyperscript@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz#9b67fd188e4c81e8ad66f803855334173920218d" + integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== + dependencies: + "@types/unist" "^2.0.3" + comma-separated-tokens "^1.0.0" + property-information "^5.3.0" + space-separated-tokens "^1.0.0" + style-to-object "^0.3.0" + unist-util-is "^4.0.0" + web-namespaces "^1.0.0" + +hast-util-from-parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz#554e34abdeea25ac76f5bd950a1f0180e0b3bc2a" + integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== + dependencies: + "@types/parse5" "^5.0.0" + hastscript "^6.0.0" + property-information "^5.0.0" + vfile "^4.0.0" + vfile-location "^3.2.0" + web-namespaces "^1.0.0" + +hast-util-parse-selector@^2.0.0: + version "2.2.5" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" + integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== + +hast-util-raw@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-6.0.1.tgz#973b15930b7529a7b66984c98148b46526885977" + integrity sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig== + dependencies: + "@types/hast" "^2.0.0" + hast-util-from-parse5 "^6.0.0" + hast-util-to-parse5 "^6.0.0" + html-void-elements "^1.0.0" + parse5 "^6.0.0" + unist-util-position "^3.0.0" + vfile "^4.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + +hast-util-to-parse5@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz#1ec44650b631d72952066cea9b1445df699f8479" + integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ== + dependencies: + hast-to-hyperscript "^9.0.0" + property-information "^5.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + +hastscript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" + integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoist-non-react-statics@^3.2.0, hoist-non-react-statics@^3.3.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +html-void-elements@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483" + integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== + +http-errors@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +https-browserify@1.0.0, https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== + +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== + +husky@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/husky/-/husky-6.0.0.tgz#810f11869adf51604c32ea577edbc377d7f9319e" + integrity sha512-SQS2gDTB7tBN486QSoKPKQItZw97BMOd+Kdb6ghfpBc0yXyzrddI0oDV5MkDAbuB4X2mO3/nj60TRMcYxwzZeQ== + +hyphenate-style-name@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" + integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== + +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" + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ieee754@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.1.8, ignore@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" + integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== + +import-fresh@^3.0.0, 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" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +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== + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, 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== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +inline-style-parser@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" + integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== + +internal-slot@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930" + integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg== + dependencies: + get-intrinsic "^1.2.2" + hasown "^2.0.0" + side-channel "^1.0.4" + +is-alphabetical@1.0.4, is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-buffer@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.13.0, is-core-module@^2.13.1: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + +is-date-object@^1.0.1, is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + +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-function@^1.0.10, is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, 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-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + +is-in-browser@^1.0.2, is-in-browser@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" + integrity sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g== + +is-map@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + +is-nan@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" + integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +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-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== + +is-plain-obj@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== + +is-set@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +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-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.3, is-typed-array@^1.1.9: + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== + dependencies: + which-typed-array "^1.1.11" + +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +is-whitespace-character@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" + integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== + +is-word-character@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230" + integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== + +isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +iterator.prototype@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" + integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== + dependencies: + define-properties "^1.2.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" + +jest-worker@27.0.0-next.5: + version "27.0.0-next.5" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.0.0-next.5.tgz#5985ee29b12a4e191f4aae4bb73b97971d86ec28" + integrity sha512-mk0umAQ5lT+CaOJ+Qp01N6kz48sJG2kr2n1rX0koqKf6FIygQV0qLOdN9SCYID4IVeSigDOcPeGLozdMLYfb5g== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +"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" + +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-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +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== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.1, json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jss-plugin-camel-case@10.10.0, jss-plugin-camel-case@^10.7.1: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.10.0.tgz#27ea159bab67eb4837fa0260204eb7925d4daa1c" + integrity sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw== + dependencies: + "@babel/runtime" "^7.3.1" + hyphenate-style-name "^1.0.3" + jss "10.10.0" + +jss-plugin-compose@10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-compose/-/jss-plugin-compose-10.10.0.tgz#00d7a79adf7fcfe4927a792febdf0deceb0a7cd2" + integrity sha512-F5kgtWpI2XfZ3Z8eP78tZEYFdgTIbpA/TMuX3a8vwrNolYtN1N4qJR/Ob0LAsqIwCMLojtxN7c7Oo/+Vz6THow== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + tiny-warning "^1.0.2" + +jss-plugin-default-unit@10.10.0, jss-plugin-default-unit@^10.7.1: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.10.0.tgz#db3925cf6a07f8e1dd459549d9c8aadff9804293" + integrity sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + +jss-plugin-expand@10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-expand/-/jss-plugin-expand-10.10.0.tgz#5debd80554174ca2d9b9e38d85d4cb6f3e0393ab" + integrity sha512-ymT62W2OyDxBxr7A6JR87vVX9vTq2ep5jZLIdUSusfBIEENLdkkc0lL/Xaq8W9s3opUq7R0sZQpzRWELrfVYzA== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + +jss-plugin-extend@10.10.0, jss-plugin-extend@^10.7.1: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-extend/-/jss-plugin-extend-10.10.0.tgz#94eb450847a8941777e77ea4533a579c1c578430" + integrity sha512-sKYrcMfr4xxigmIwqTjxNcHwXJIfvhvjTNxF+Tbc1NmNdyspGW47Ey6sGH8BcQ4FFQhLXctpWCQSpDwdNmXSwg== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + tiny-warning "^1.0.2" + +jss-plugin-global@10.10.0, jss-plugin-global@^10.7.1: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.10.0.tgz#1c55d3c35821fab67a538a38918292fc9c567efd" + integrity sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + +jss-plugin-nested@10.10.0, jss-plugin-nested@^10.7.1: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.10.0.tgz#db872ed8925688806e77f1fc87f6e62264513219" + integrity sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + tiny-warning "^1.0.2" + +jss-plugin-props-sort@10.10.0, jss-plugin-props-sort@^10.7.1: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.10.0.tgz#67f4dd4c70830c126f4ec49b4b37ccddb680a5d7" + integrity sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + +jss-plugin-rule-value-function@10.10.0, jss-plugin-rule-value-function@^10.7.1: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.10.0.tgz#7d99e3229e78a3712f78ba50ab342e881d26a24b" + integrity sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + tiny-warning "^1.0.2" + +jss-plugin-rule-value-observable@10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-observable/-/jss-plugin-rule-value-observable-10.10.0.tgz#d17b28c4401156bbe4cd0c4a73a80aad70613e8b" + integrity sha512-ZLMaYrR3QE+vD7nl3oNXuj79VZl9Kp8/u6A1IbTPDcuOu8b56cFdWRZNZ0vNr8jHewooEeq2doy8Oxtymr2ZPA== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + symbol-observable "^1.2.0" + +jss-plugin-template@10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-template/-/jss-plugin-template-10.10.0.tgz#072cda74a94c91b02d3a895d9e2408fd978ce033" + integrity sha512-ocXZBIOJOA+jISPdsgkTs8wwpK6UbsvtZK5JI7VUggTD6LWKbtoxUzadd2TpfF+lEtlhUmMsCkTRNkITdPKa6w== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + tiny-warning "^1.0.2" + +jss-plugin-vendor-prefixer@10.10.0, jss-plugin-vendor-prefixer@^10.7.1: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.10.0.tgz#c01428ef5a89f2b128ec0af87a314d0c767931c7" + integrity sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg== + dependencies: + "@babel/runtime" "^7.3.1" + css-vendor "^2.0.8" + jss "10.10.0" + +jss-preset-default@10.10.0, jss-preset-default@^10.10.0: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss-preset-default/-/jss-preset-default-10.10.0.tgz#c8209449a0f6d232526c2ba3a3a6ec69ee97e023" + integrity sha512-GL175Wt2FGhjE+f+Y3aWh+JioL06/QWFgZp53CbNNq6ZkVU0TDplD8Bxm9KnkotAYn3FlplNqoW5CjyLXcoJ7Q== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + jss-plugin-camel-case "10.10.0" + jss-plugin-compose "10.10.0" + jss-plugin-default-unit "10.10.0" + jss-plugin-expand "10.10.0" + jss-plugin-extend "10.10.0" + jss-plugin-global "10.10.0" + jss-plugin-nested "10.10.0" + jss-plugin-props-sort "10.10.0" + jss-plugin-rule-value-function "10.10.0" + jss-plugin-rule-value-observable "10.10.0" + jss-plugin-template "10.10.0" + jss-plugin-vendor-prefixer "10.10.0" + +jss@10.10.0, jss@^10.10.0, jss@^10.7.1: + version "10.10.0" + resolved "https://registry.yarnpkg.com/jss/-/jss-10.10.0.tgz#a75cc85b0108c7ac8c7b7d296c520a3e4fbc6ccc" + integrity sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw== + dependencies: + "@babel/runtime" "^7.3.1" + csstype "^3.0.2" + is-in-browser "^1.1.3" + tiny-warning "^1.0.2" + +"jsx-ast-utils@^2.4.1 || ^3.0.0": + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +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== + +lint-staged@^11.0.0: + version "11.2.6" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-11.2.6.tgz#f477b1af0294db054e5937f171679df63baa4c43" + integrity sha512-Vti55pUnpvPE0J9936lKl0ngVeTdSZpEdTNhASbkaWX7J5R9OEifo1INBGQuGW4zmy6OG+TcWPJ3m5yuy5Q8Tg== + dependencies: + cli-truncate "2.1.0" + colorette "^1.4.0" + commander "^8.2.0" + cosmiconfig "^7.0.1" + debug "^4.3.2" + enquirer "^2.3.6" + execa "^5.1.1" + listr2 "^3.12.2" + micromatch "^4.0.4" + normalize-path "^3.0.0" + please-upgrade-node "^3.2.0" + string-argv "0.3.1" + stringify-object "3.3.0" + supports-color "8.1.1" + +listr2@^3.12.2: + version "3.14.0" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" + integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== + dependencies: + cli-truncate "^2.1.0" + colorette "^2.0.16" + log-update "^4.0.0" + p-map "^4.0.0" + rfdc "^1.3.0" + rxjs "^7.5.1" + through "^2.3.8" + wrap-ansi "^7.0.0" + +loader-utils@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + +loader-utils@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +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" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== + +lodash.throttle@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" + integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ== + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== + +lodash.uniq@4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== + +lodash@^4.17.13, lodash@^4.17.19: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-update@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== + dependencies: + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" + +loose-envify@^1.1.0, loose-envify@^1.4.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" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-dir@^3.0.2: + 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" + +markdown-escapes@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" + integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mdast-squeeze-paragraphs@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz#7c4c114679c3bee27ef10b58e2e015be79f1ef97" + integrity sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ== + dependencies: + unist-util-remove "^2.0.0" + +mdast-util-definitions@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" + integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== + dependencies: + unist-util-visit "^2.0.0" + +mdast-util-to-hast@10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz#0cfc82089494c52d46eb0e3edb7a4eb2aea021eb" + integrity sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + mdast-util-definitions "^4.0.0" + mdurl "^1.0.0" + unist-builder "^2.0.0" + unist-util-generated "^1.0.0" + unist-util-position "^3.0.0" + unist-util-visit "^2.0.0" + +mdurl@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== + +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, merge2@^1.4.1: + 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" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +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== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: + 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.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +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== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@^3.1.22, nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + +native-url@0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/native-url/-/native-url-0.3.4.tgz#29c943172aed86c63cee62c8c04db7f5756661f8" + integrity sha512-6iM8R99ze45ivyH8vybJ7X0yekIcPf5GgLV5K0ENCbmRcaRIDoj37BC8iLEmaaBfqqb8enuZ5p0uhY+lVAbAcA== + dependencies: + querystring "^0.2.0" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +next@^10.1.3: + version "10.2.3" + resolved "https://registry.yarnpkg.com/next/-/next-10.2.3.tgz#5aa058a63626338cea91c198fda8f2715c058394" + integrity sha512-dkM1mIfnORtGyzw/Yme8RdqNxlCMZyi4Lqj56F01/yHbe1ZtOaJ0cyqqRB4RGiPhjGGh0319f8ddjDyO1605Ow== + dependencies: + "@babel/runtime" "7.12.5" + "@hapi/accept" "5.0.2" + "@next/env" "10.2.3" + "@next/polyfill-module" "10.2.3" + "@next/react-dev-overlay" "10.2.3" + "@next/react-refresh-utils" "10.2.3" + "@opentelemetry/api" "0.14.0" + assert "2.0.0" + ast-types "0.13.2" + browserify-zlib "0.2.0" + browserslist "4.16.6" + buffer "5.6.0" + caniuse-lite "^1.0.30001228" + chalk "2.4.2" + chokidar "3.5.1" + constants-browserify "1.0.0" + crypto-browserify "3.12.0" + cssnano-simple "2.0.0" + domain-browser "4.19.0" + encoding "0.1.13" + etag "1.8.1" + find-cache-dir "3.3.1" + get-orientation "1.1.2" + https-browserify "1.0.0" + jest-worker "27.0.0-next.5" + native-url "0.3.4" + node-fetch "2.6.1" + node-html-parser "1.4.9" + node-libs-browser "^2.2.1" + os-browserify "0.3.0" + p-limit "3.1.0" + path-browserify "1.0.1" + pnp-webpack-plugin "1.6.4" + postcss "8.2.13" + process "0.11.10" + prop-types "15.7.2" + querystring-es3 "0.2.1" + raw-body "2.4.1" + react-is "16.13.1" + react-refresh "0.8.3" + stream-browserify "3.0.0" + stream-http "3.1.1" + string_decoder "1.3.0" + styled-jsx "3.3.2" + timers-browserify "2.0.12" + tty-browserify "0.0.1" + use-subscription "1.5.1" + util "0.12.3" + vm-browserify "1.1.2" + watchpack "2.1.1" + +node-fetch@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + +node-html-parser@1.4.9: + version "1.4.9" + resolved "https://registry.yarnpkg.com/node-html-parser/-/node-html-parser-1.4.9.tgz#3c8f6cac46479fae5800725edb532e9ae8fd816c" + integrity sha512-UVcirFD1Bn0O+TSmloHeHqZZCxHjvtIeGdVdGMhyZ8/PWlEiZaZ5iJzR189yKZr8p0FXN58BUeC7RHRkf/KYGw== + dependencies: + he "1.2.0" + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +node-releases@^1.1.71: + version "1.1.77" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.77.tgz#50b0cfede855dd374e7585bf228ff34e57c1c32e" + integrity sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ== + +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + +normalize-path@^3.0.0, 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== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +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" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg== + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.13.1, object-inspect@^1.9.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + +object-is@^1.0.1: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.6: + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131" + integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.fromentries@^2.0.6, object.fromentries@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" + integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.groupby@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.1.tgz#d41d9f3c8d6c778d9cbac86b4ee9f5af103152ee" + integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + +object.hasown@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae" + integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== + dependencies: + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.values@^1.1.6, object.values@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" + integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.0, 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.9.1: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + +os-browserify@0.3.0, os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== + +p-limit@3.1.0: + 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-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-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-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +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== + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +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-asn1@^5.0.0, parse-asn1@^5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-json@^5.0.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.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +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-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 sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +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== + +pbkdf2@^3.0.3: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +picocolors@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" + integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== + +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.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pkg-dir@^4.1.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" + +platform@1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7" + integrity sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg== + +please-upgrade-node@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" + integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg== + dependencies: + semver-compare "^1.0.0" + +pnp-webpack-plugin@1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" + integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== + dependencies: + ts-pnp "^1.1.6" + +postcss-attribute-case-insensitive@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880" + integrity sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^6.0.2" + +postcss-browser-comments@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz#1248d2d935fb72053c8e1f61a84a57292d9f65e9" + integrity sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig== + dependencies: + postcss "^7" + +postcss-color-functional-notation@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0" + integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-gray@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547" + integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-color-hex-alpha@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388" + integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw== + dependencies: + postcss "^7.0.14" + postcss-values-parser "^2.0.1" + +postcss-color-mod-function@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d" + integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-rebeccapurple@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77" + integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-custom-media@^7.0.8: + version "7.0.8" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c" + integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg== + dependencies: + postcss "^7.0.14" + +postcss-custom-properties@^8.0.11: + version "8.0.11" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97" + integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA== + dependencies: + postcss "^7.0.17" + postcss-values-parser "^2.0.1" + +postcss-custom-selectors@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba" + integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-dir-pseudo-class@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2" + integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-double-position-gradients@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e" + integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA== + dependencies: + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-env-function@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7" + integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-flexbugs-fixes@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz#2028e145313074fc9abe276cb7ca14e5401eb49d" + integrity sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ== + +postcss-focus-visible@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" + integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g== + dependencies: + postcss "^7.0.2" + +postcss-focus-within@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680" + integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w== + dependencies: + postcss "^7.0.2" + +postcss-font-variant@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz#42d4c0ab30894f60f98b17561eb5c0321f502641" + integrity sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA== + dependencies: + postcss "^7.0.2" + +postcss-gap-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715" + integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg== + dependencies: + postcss "^7.0.2" + +postcss-image-set-function@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" + integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-initial@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.4.tgz#9d32069a10531fe2ecafa0b6ac750ee0bc7efc53" + integrity sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg== + dependencies: + postcss "^7.0.2" + +postcss-lab-function@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" + integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-logical@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" + integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA== + dependencies: + postcss "^7.0.2" + +postcss-media-minmax@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" + integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw== + dependencies: + postcss "^7.0.2" + +postcss-nesting@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052" + integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg== + dependencies: + postcss "^7.0.2" + +postcss-normalize@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize/-/postcss-normalize-9.0.0.tgz#3b551279f78ec3b2e151bc8cf52ff6e46c4cc60c" + integrity sha512-//kq5O1xkygzN1iCioFIBtzyVTgB6ce9+Hu0mNHuUhPn+FnnFSPybe5kBemnUPPqd7QrHc+kdX6GVECUWdU2uQ== + dependencies: + "@csstools/normalize.css" "*" + postcss "^7.0.27" + postcss-browser-comments "^3.0.0" + sanitize.css "*" + +postcss-overflow-shorthand@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30" + integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g== + dependencies: + postcss "^7.0.2" + +postcss-page-break@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf" + integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ== + dependencies: + postcss "^7.0.2" + +postcss-place@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62" + integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-preset-env@^6.7.0: + version "6.7.2" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.2.tgz#58792ed25cff5b997b7274b5401a8868dafa1c52" + integrity sha512-nz+VyUUEB9uAxo5VxI0Gq4E31UjHCG3cUiZW3PzRn7KqkGlAEWuYgb/VLbAitEq7Ooubfix+H2JCm9v+C6hJuw== + dependencies: + autoprefixer "^9.6.1" + browserslist "^4.6.4" + caniuse-lite "^1.0.30000981" + css-blank-pseudo "^0.1.4" + css-has-pseudo "^0.10.0" + css-prefers-color-scheme "^3.1.1" + cssdb "^4.4.0" + postcss "^7.0.17" + postcss-attribute-case-insensitive "^4.0.1" + postcss-color-functional-notation "^2.0.1" + postcss-color-gray "^5.0.0" + postcss-color-hex-alpha "^5.0.3" + postcss-color-mod-function "^3.0.3" + postcss-color-rebeccapurple "^4.0.1" + postcss-custom-media "^7.0.8" + postcss-custom-properties "^8.0.11" + postcss-custom-selectors "^5.1.2" + postcss-dir-pseudo-class "^5.0.0" + postcss-double-position-gradients "^1.0.0" + postcss-env-function "^2.0.2" + postcss-focus-visible "^4.0.0" + postcss-focus-within "^3.0.0" + postcss-font-variant "^4.0.0" + postcss-gap-properties "^2.0.0" + postcss-image-set-function "^3.0.1" + postcss-initial "^3.0.0" + postcss-lab-function "^2.0.1" + postcss-logical "^3.0.0" + postcss-media-minmax "^4.0.0" + postcss-nesting "^7.0.0" + postcss-overflow-shorthand "^2.0.0" + postcss-page-break "^2.0.0" + postcss-place "^4.0.1" + postcss-pseudo-class-any-link "^6.0.0" + postcss-replace-overflow-wrap "^3.0.0" + postcss-selector-matches "^4.0.0" + postcss-selector-not "^4.0.0" + +postcss-pseudo-class-any-link@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1" + integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-replace-overflow-wrap@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c" + integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw== + dependencies: + postcss "^7.0.2" + +postcss-selector-matches@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" + integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-not@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz#263016eef1cf219e0ade9a913780fc1f48204cbf" + integrity sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" + integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== + dependencies: + cssesc "^2.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^6.0.2: + version "6.0.13" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" + integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" + integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss@8.2.13: + version "8.2.13" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.13.tgz#dbe043e26e3c068e45113b1ed6375d2d37e2129f" + integrity sha512-FCE5xLH+hjbzRdpbRb1IMCvPv9yZx2QnDarBEYSN0N0HYk+TcXsEhwdFcFb+SRWOKzKGErhIEbBK2ogyLdTtfQ== + dependencies: + colorette "^1.2.2" + nanoid "^3.1.22" + source-map "^0.6.1" + +postcss@^7, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.39" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" + integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== + dependencies: + picocolors "^0.2.1" + source-map "^0.6.1" + +postcss@^8.2.9: + version "8.4.32" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.32.tgz#1dac6ac51ab19adb21b8b34fd2d93a86440ef6c9" + integrity sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier@^2.2.1: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@0.11.10, process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +prop-types@15.7.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.7.2, prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +property-information@^5.0.0, property-information@^5.3.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" + integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== + dependencies: + xtend "^4.0.0" + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +punycode@^1.2.4, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +qs@^6.11.2: + version "6.11.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== + dependencies: + side-channel "^1.0.4" + +querystring-es3@0.2.1, querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== + +querystring@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" + integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== + +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== + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +raw-body@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c" + integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA== + dependencies: + bytes "3.1.0" + http-errors "1.7.3" + iconv-lite "0.4.24" + unpipe "1.0.0" + +react-collapse@^5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/react-collapse/-/react-collapse-5.1.1.tgz#a2fa08ef13f372141b02e6a7d49ef72427bcbc2b" + integrity sha512-k6cd7csF1o9LBhQ4AGBIdxB60SUEUMQDAnL2z1YvYNr9KoKr+nDkhN6FK7uGaBd/rYrYfrMpzpmJEIeHRYogBw== + +react-display-name@^0.2.4: + version "0.2.5" + resolved "https://registry.yarnpkg.com/react-display-name/-/react-display-name-0.2.5.tgz#304c7cbfb59ee40389d436e1a822c17fe27936c6" + integrity sha512-I+vcaK9t4+kypiSgaiVWAipqHRXYmZIuAiS8vzFvXHHXVigg/sMKwlRgLy6LH2i3rmP+0Vzfl5lFsFRwF1r3pg== + +react-dom@17.0.1: + version "17.0.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.1.tgz#1de2560474ec9f0e334285662ede52dbc5426fc6" + integrity sha512-6eV150oJZ9U2t9svnsspTMrWNyHc6chX0KzDeAOXftRa8bNeOKTTfCJ7KorIwenkHd2xqVTBTCZd79yk/lx/Ug== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler "^0.20.1" + +react-ga@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/react-ga/-/react-ga-3.3.1.tgz#d8e1f4e05ec55ed6ff944dcb14b99011dfaf9504" + integrity sha512-4Vc0W5EvXAXUN/wWyxvsAKDLLgtJ3oLmhYYssx+YzphJpejtOst6cbIHCIyF50Fdxuf5DDKqRYny24yJ2y7GFQ== + +react-is@16.13.1, react-is@^16.13.1, react-is@^16.7.0, react-is@^16.8.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +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-jss@^10.7.1: + version "10.10.0" + resolved "https://registry.yarnpkg.com/react-jss/-/react-jss-10.10.0.tgz#d08ab3257b0eed01e15d6d8275840055c279b0da" + integrity sha512-WLiq84UYWqNBF6579/uprcIUnM1TSywYq6AIjKTTTG5ziJl9Uy+pwuvpN3apuyVwflMbD60PraeTKT7uWH9XEQ== + dependencies: + "@babel/runtime" "^7.3.1" + "@emotion/is-prop-valid" "^0.7.3" + css-jss "10.10.0" + hoist-non-react-statics "^3.2.0" + is-in-browser "^1.1.3" + jss "10.10.0" + jss-preset-default "10.10.0" + prop-types "^15.6.0" + shallow-equal "^1.2.0" + theming "^3.3.0" + tiny-warning "^1.0.2" + +react-refresh@0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f" + integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg== + +react-use-clipboard@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/react-use-clipboard/-/react-use-clipboard-1.0.9.tgz#d34d4d04500f77c606795d3756fc587ec93db8d2" + integrity sha512-OcMzc14usXhqQnAkvzmhCXAbW5WBT2LSgscVh2vKHXZfg72jFsSOsEearqdeC/nUj8YxEfLnziqe7AE7YkWFwA== + dependencies: + copy-to-clipboard "^3.3.1" + +react@17.0.1: + version "17.0.1" + resolved "https://registry.yarnpkg.com/react/-/react-17.0.1.tgz#6e0600416bd57574e3f86d92edba3d9008726127" + integrity sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +readable-stream@^2.0.2, readable-stream@^2.3.3, readable-stream@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.5.0, readable-stream@^3.6.0, readable-stream@^3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + dependencies: + picomatch "^2.2.1" + +reflect.getprototypeof@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz#aaccbf41aca3821b87bb71d9dcbc7ad0ba50a3f3" + integrity sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + +regenerator-runtime@^0.13.4: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + +regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" + integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + set-function-name "^2.0.0" + +regexpp@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +remark-footnotes@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/remark-footnotes/-/remark-footnotes-2.0.0.tgz#9001c4c2ffebba55695d2dd80ffb8b82f7e6303f" + integrity sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ== + +remark-mdx@1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-1.6.22.tgz#06a8dab07dcfdd57f3373af7f86bd0e992108bbd" + integrity sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ== + dependencies: + "@babel/core" "7.12.9" + "@babel/helper-plugin-utils" "7.10.4" + "@babel/plugin-proposal-object-rest-spread" "7.12.1" + "@babel/plugin-syntax-jsx" "7.12.1" + "@mdx-js/util" "1.6.22" + is-alphabetical "1.0.4" + remark-parse "8.0.3" + unified "9.2.0" + +remark-parse@8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1" + integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== + dependencies: + ccount "^1.0.0" + collapse-white-space "^1.0.2" + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + is-word-character "^1.0.0" + markdown-escapes "^1.0.0" + parse-entities "^2.0.0" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + trim "0.0.1" + trim-trailing-lines "^1.0.0" + unherit "^1.0.4" + unist-util-remove-position "^2.0.0" + vfile-location "^3.0.0" + xtend "^4.0.1" + +remark-squeeze-paragraphs@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz#76eb0e085295131c84748c8e43810159c5653ead" + integrity sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw== + dependencies: + mdast-squeeze-paragraphs "^4.0.0" + +repeat-string@^1.5.4: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +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@^1.22.4, resolve@^1.3.2: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.4: + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +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== + +rfdc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + +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" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +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" + +rxjs@^7.5.1: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +safe-array-concat@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" + integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, 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== + +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sanitize.css@*: + version "13.0.0" + resolved "https://registry.yarnpkg.com/sanitize.css/-/sanitize.css-13.0.0.tgz#2675553974b27964c75562ade3bd85d79879f173" + integrity sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA== + +scheduler@^0.20.1: + 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-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== + +semver@^5.4.1: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@^6.0.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.2.1, semver@^7.3.5: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +set-function-length@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" + integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== + dependencies: + define-data-property "^1.1.1" + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +set-function-name@^2.0.0, set-function-name@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" + integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== + dependencies: + define-data-property "^1.0.1" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.0" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-equal@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/shallow-equal/-/shallow-equal-1.2.1.tgz#4c16abfa56043aa20d050324efa68940b0da79da" + integrity sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA== + +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== + +shell-quote@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" + integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +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== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +smoothscroll-polyfill@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/smoothscroll-polyfill/-/smoothscroll-polyfill-0.4.4.tgz#3a259131dc6930e6ca80003e1cb03b603b69abf8" + integrity sha512-TK5ZA9U5RqCwMpfoMq/l1mrH0JAR7y7KRvOBx0n2869aLxch+gT9GhN3yUfjiw+d/DiF1mKo14+hd62JyMmoBg== + +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@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== + +source-map@0.8.0-beta.0: + version "0.8.0-beta.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" + integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== + dependencies: + whatwg-url "^7.0.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 sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +space-separated-tokens@^1.0.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" + integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stacktrace-parser@0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" + integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== + dependencies: + type-fest "^0.7.1" + +state-toggle@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" + integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== + +"statuses@>= 1.5.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +stream-browserify@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" + integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== + dependencies: + inherits "~2.0.4" + readable-stream "^3.5.0" + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-http@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.1.1.tgz#0370a8017cf8d050b9a8554afe608f043eaff564" + integrity sha512-S7OqaYu0EkFpgeGFb/NPOoPLxFko7TPqtEeFg5DXPB4v/KETHG0Ln6fRFrNezoelpaDKmycEmmZ81cC9DAwgYg== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.4" + readable-stream "^3.6.0" + xtend "^4.0.2" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-parser@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/stream-parser/-/stream-parser-0.3.1.tgz#1618548694420021a1182ff0af1911c129761773" + integrity sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ== + dependencies: + debug "2" + +string-argv@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" + integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== + +string-hash@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" + integrity sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A== + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.matchall@^4.0.8: + version "4.0.10" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz#a1553eb532221d4180c51581d6072cd65d1ee100" + integrity sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + regexp.prototype.flags "^1.5.0" + set-function-name "^2.0.0" + side-channel "^1.0.4" + +string.prototype.trim@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" + integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string.prototype.trimend@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" + integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string.prototype.trimstart@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" + integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string_decoder@1.3.0, string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringify-object@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +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-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +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-json-comments@^3.1.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== + +style-to-object@0.3.0, style-to-object@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" + integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== + dependencies: + inline-style-parser "0.1.1" + +styled-jsx@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-3.3.2.tgz#2474601a26670a6049fb4d3f94bd91695b3ce018" + integrity sha512-daAkGd5mqhbBhLd6jYAjYBa9LpxYCzsgo/f6qzPdFxVB8yoGbhxvzQgkC0pfmCVvW3JuAEBn0UzFLBfkHVZG1g== + dependencies: + "@babel/types" "7.8.3" + babel-plugin-syntax-jsx "6.18.0" + convert-source-map "1.7.0" + loader-utils "1.2.3" + source-map "0.7.3" + string-hash "1.1.3" + stylis "3.5.4" + stylis-rule-sheet "0.0.10" + +stylis-rule-sheet@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz#44e64a2b076643f4b52e5ff71efc04d8c3c4a430" + integrity sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw== + +stylis@3.5.4: + version "3.5.4" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.4.tgz#f665f25f5e299cf3d64654ab949a57c768b73fbe" + integrity sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q== + +supports-color@8.1.1, 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-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.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-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== + +symbol-observable@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== + +table@^6.0.9: + version "6.8.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" + integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== + dependencies: + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +theming@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/theming/-/theming-3.3.0.tgz#dacabf04aa689edde35f1e1c117ec6de73fbf870" + integrity sha512-u6l4qTJRDaWZsqa8JugaNt7Xd8PPl9+gonZaIe28vAhqgHMIG/DOyFPqiKN/gQLQYj05tHv+YQdNILL4zoiAVA== + dependencies: + hoist-non-react-statics "^3.3.0" + prop-types "^15.5.8" + react-display-name "^0.2.4" + tiny-warning "^1.0.2" + +through@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +timers-browserify@2.0.12, timers-browserify@^2.0.4: + version "2.0.12" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== + dependencies: + setimmediate "^1.0.4" + +tiny-warning@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA== + +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 sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +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" + +toggle-selection@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" + integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA== + dependencies: + punycode "^2.1.0" + +trim-trailing-lines@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0" + integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== + +trim@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" + integrity sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ== + +trough@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" + integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== + +ts-pnp@^1.1.6: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" + integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== + +tsconfig-paths@^3.14.2: + version "3.14.2" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" + integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.1.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw== + +tty-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" + integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +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== + +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== + +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +typescript@^4.2.3: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +unherit@^1.0.4: + version "1.1.3" + resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" + integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== + dependencies: + inherits "^2.0.0" + xtend "^4.0.0" + +unified@9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8" + integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA== + +unist-builder@2.0.3, unist-builder@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" + integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== + +unist-util-generated@^1.0.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" + integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== + +unist-util-is@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" + integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== + +unist-util-position@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47" + integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== + +unist-util-remove-position@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc" + integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== + dependencies: + unist-util-visit "^2.0.0" + +unist-util-remove@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unist-util-remove/-/unist-util-remove-2.1.0.tgz#b0b4738aa7ee445c402fda9328d604a02d010588" + integrity sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q== + dependencies: + unist-util-is "^4.0.0" + +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" + integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + dependencies: + "@types/unist" "^2.0.2" + +unist-util-visit-parents@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" + integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + +unist-util-visit@2.0.3, unist-util-visit@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" + integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" + +unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url@^0.11.0: + version "0.11.3" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.3.tgz#6f495f4b935de40ce4a0a52faee8954244f3d3ad" + integrity sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw== + dependencies: + punycode "^1.4.1" + qs "^6.11.2" + +use-subscription@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/use-subscription/-/use-subscription-1.5.1.tgz#73501107f02fad84c6dd57965beb0b75c68c42d1" + integrity sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA== + dependencies: + object-assign "^4.1.1" + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +util@0.12.3: + version "0.12.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.3.tgz#971bb0292d2cc0c892dab7c6a5d37c2bec707888" + integrity sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + safe-buffer "^5.1.2" + which-typed-array "^1.1.2" + +util@^0.10.4: + version "0.10.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" + integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== + dependencies: + inherits "2.0.3" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +util@^0.12.0: + version "0.12.5" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + which-typed-array "^1.1.2" + +v8-compile-cache@^2.0.3: + version "2.4.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz#cdada8bec61e15865f05d097c5f4fd30e94dc128" + integrity sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw== + +vfile-location@^3.0.0, vfile-location@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" + integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== + +vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + +vfile@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" + integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + +vm-browserify@1.1.2, vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +watchpack@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.1.1.tgz#e99630550fca07df9f90a06056987baa40a689c7" + integrity sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +web-namespaces@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" + integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-builtin-type@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" + integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== + dependencies: + function.prototype.name "^1.1.5" + has-tostringtag "^1.0.0" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + +which-typed-array@^1.1.11, which-typed-array@^1.1.13, which-typed-array@^1.1.2, which-typed-array@^1.1.9: + version "1.1.13" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" + integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.4" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.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" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +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 sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +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== + +zustand@^3.3.3: + version "3.7.2" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-3.7.2.tgz#7b44c4f4a5bfd7a8296a3957b13e1c346f42514d" + integrity sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA== + +zwitch@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" + integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==