diff --git a/.gitignore b/.gitignore index 485dee6..40f0620 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -.idea +# OSX +# +.DS_Store \ No newline at end of file diff --git a/core/.gitignore b/core/.gitignore new file mode 100644 index 0000000..5ad61d8 --- /dev/null +++ b/core/.gitignore @@ -0,0 +1,17 @@ +# OSX +# +.DS_Store + +# node.js +# +node_modules/ +npm-debug.log +yarn-error.log + +# BUCK +buck-out/ +\.buckd/ +*.keystore + +# Packages +lib/ \ No newline at end of file diff --git a/core/package.json b/core/package.json new file mode 100644 index 0000000..b6173a9 --- /dev/null +++ b/core/package.json @@ -0,0 +1,28 @@ +{ + "name": "@react-native-material/core", + "version": "1.0.0", + "description": "Modular and customizable Material Design UI components for React Native", + "main": "lib/index.js", + "types": "lib/index.d.ts", + "repository": "https://github.com/yamankatby/react-native-material", + "author": "Yaman KATBY (https://yamankatby.com/)", + "license": "MIT", + "private": false, + "peerDependencies": { + "react": "^17.0.2", + "react-native": "^0.65.1", + "react-native-svg": "^12.1.1" + }, + "dependencies": { + "chroma-js": "^2.1.2" + }, + "devDependencies": { + "@types/chroma-js": "^2.1.3", + "@types/react": "^17.0.19", + "@types/react-native": "^0.64.13", + "react-native-svg": "^12.1.1" + }, + "files": [ + "lib/**/*" + ] +} diff --git a/core/src/base/color-scheme/color-scheme.ts b/core/src/base/color-scheme/color-scheme.ts new file mode 100644 index 0000000..ccc766c --- /dev/null +++ b/core/src/base/color-scheme/color-scheme.ts @@ -0,0 +1,15 @@ +export type ColorName = + | "primary" + | "primaryVariant" + | "secondary" + | "secondaryVariant" + | "background" + | "surface" + | "error" + | "onPrimary" + | "onSecondary" + | "onBackground" + | "onSurface" + | "onError"; + +export type ColorScheme = Record; diff --git a/core/src/base/color-scheme/index.ts b/core/src/base/color-scheme/index.ts new file mode 100644 index 0000000..c5c55ce --- /dev/null +++ b/core/src/base/color-scheme/index.ts @@ -0,0 +1 @@ +export * from "./color-scheme"; diff --git a/core/src/base/context/ThemeProvider.tsx b/core/src/base/context/ThemeProvider.tsx new file mode 100644 index 0000000..c3a295f --- /dev/null +++ b/core/src/base/context/ThemeProvider.tsx @@ -0,0 +1,18 @@ +import React, { createContext } from "react"; +import { defaultTheme, Theme } from "../theme-scheme"; + +export const ThemeContext = createContext(defaultTheme); + +export interface ThemeProviderProps { + theme?: Theme; +} + +const ThemeProvider: React.FC = ({ theme, children }) => { + return ( + + {children} + + ); +}; + +export default ThemeProvider; diff --git a/core/src/base/context/index.ts b/core/src/base/context/index.ts new file mode 100644 index 0000000..cfa921d --- /dev/null +++ b/core/src/base/context/index.ts @@ -0,0 +1,6 @@ +import ThemeProvider from "./ThemeProvider"; +import useStyles from "./use-styles"; +import useTheme from "./use-theme"; + +export * from "./ThemeProvider"; +export { ThemeProvider, useTheme, useStyles }; diff --git a/core/src/base/context/use-styles.ts b/core/src/base/context/use-styles.ts new file mode 100644 index 0000000..3cc05aa --- /dev/null +++ b/core/src/base/context/use-styles.ts @@ -0,0 +1,18 @@ +import { DependencyList, useMemo } from "react"; +import { ImageStyle, TextStyle, ViewStyle } from "react-native"; +import { Theme } from "../theme-scheme"; +import useTheme from "./use-theme"; + +export type NamedStyles = { + [P in keyof T]: ViewStyle | TextStyle | ImageStyle; +}; + +const useStyles = | NamedStyles>( + factory: (theme: Theme) => T, + deps?: DependencyList | undefined +): T => { + const theme = useTheme(); + return useMemo(() => factory(theme), [theme, deps]); +}; + +export default useStyles; diff --git a/core/src/base/context/use-theme.ts b/core/src/base/context/use-theme.ts new file mode 100644 index 0000000..0cbfe73 --- /dev/null +++ b/core/src/base/context/use-theme.ts @@ -0,0 +1,6 @@ +import { useContext } from "react"; +import { ThemeContext } from "./ThemeProvider"; + +const useTheme = () => useContext(ThemeContext); + +export default useTheme; diff --git a/core/src/base/index.ts b/core/src/base/index.ts new file mode 100644 index 0000000..fc415a6 --- /dev/null +++ b/core/src/base/index.ts @@ -0,0 +1,5 @@ +export * from "./color-scheme"; +export * from "./context"; +export * from "./shape-scheme"; +export * from "./theme-scheme"; +export * from "./typography-scheme"; diff --git a/core/src/base/shape-scheme/index.ts b/core/src/base/shape-scheme/index.ts new file mode 100644 index 0000000..cff65ac --- /dev/null +++ b/core/src/base/shape-scheme/index.ts @@ -0,0 +1 @@ +export * from "./shape-scheme"; diff --git a/core/src/base/shape-scheme/shape-scheme.ts b/core/src/base/shape-scheme/shape-scheme.ts new file mode 100644 index 0000000..98f5474 --- /dev/null +++ b/core/src/base/shape-scheme/shape-scheme.ts @@ -0,0 +1,17 @@ +export type ShapeCategory = "small" | "medium" | "large"; + +export type ShapeFamily = "rounded" | "cut"; + +export interface ShapeBorderRadius { + topStart: number; + topEnd: number; + bottomStart: number; + bottomEnd: number; +} + +export interface ShapeValues { + family: ShapeFamily; + borderRadius: ShapeBorderRadius; +} + +export type ShapeScheme = Record; diff --git a/core/src/base/theme-scheme/index.ts b/core/src/base/theme-scheme/index.ts new file mode 100644 index 0000000..d72e380 --- /dev/null +++ b/core/src/base/theme-scheme/index.ts @@ -0,0 +1 @@ +export * from "./theme-scheme"; diff --git a/core/src/base/theme-scheme/theme-scheme.ts b/core/src/base/theme-scheme/theme-scheme.ts new file mode 100644 index 0000000..eafa5d7 --- /dev/null +++ b/core/src/base/theme-scheme/theme-scheme.ts @@ -0,0 +1,137 @@ +import { ColorScheme } from "../color-scheme"; +import { ShapeScheme } from "../shape-scheme"; +import { TypographyScheme } from "../typography-scheme"; + +export type Mode = "light" | "dark"; + +export interface Theme { + mode: Mode; + colorScheme: ColorScheme; + shapeScheme: ShapeScheme; + typographyScheme: TypographyScheme; +} + +export const defaultTheme: Theme = { + mode: "light", + colorScheme: { + primary: "#6200EE", + primaryVariant: "#3700B3", + secondary: "#03DAC6", + secondaryVariant: "#018786", + background: "#FFFFFF", + surface: "#FFFFFF", + error: "#B00020", + onPrimary: "#FFFFFF", + onSecondary: "#000000", + onBackground: "#000000", + onSurface: "#000000", + onError: "#FFFFFF", + }, + shapeScheme: { + small: { + family: "rounded", + borderRadius: { + topStart: 4, + topEnd: 4, + bottomStart: 4, + bottomEnd: 4, + }, + }, + medium: { + family: "rounded", + borderRadius: { + topStart: 4, + topEnd: 4, + bottomStart: 4, + bottomEnd: 4, + }, + }, + large: { + family: "rounded", + borderRadius: { + topStart: 0, + topEnd: 0, + bottomStart: 0, + bottomEnd: 0, + }, + }, + }, + typographyScheme: { + h1: { + fontWeight: "300", + fontSize: 96, + letterSpacing: -1.5, + }, + h2: { + fontWeight: "300", + fontSize: 60, + letterSpacing: -0.5, + }, + h3: { + fontSize: 48, + }, + h4: { + fontSize: 34, + letterSpacing: 0.25, + }, + h5: { + fontSize: 24, + }, + h6: { + fontWeight: "500", + fontSize: 20, + letterSpacing: 0.15, + }, + subtitle1: { + fontSize: 16, + letterSpacing: 0.15, + }, + subtitle2: { + fontWeight: "500", + fontSize: 14, + letterSpacing: 0.1, + }, + body1: { + fontSize: 16, + letterSpacing: 0.5, + }, + body2: { + fontSize: 14, + letterSpacing: 0.25, + }, + button: { + fontWeight: "500", + fontSize: 14, + letterSpacing: 1.25, + textTransform: "uppercase", + }, + caption: { + fontSize: 10, + letterSpacing: 0.4, + }, + overline: { + fontSize: 12, + letterSpacing: 1.5, + textTransform: "uppercase", + }, + }, +}; + +export const darkTheme: Theme = { + ...defaultTheme, + mode: "dark", + colorScheme: { + primary: "#BB86FC", + primaryVariant: "#3700B3", + secondary: "#03DAC6", + secondaryVariant: "#03DAC6", + background: "#121212", + surface: "#121212", + error: "#CF6679", + onPrimary: "#000000", + onSecondary: "#000000", + onBackground: "#FFFFFF", + onSurface: "#FFFFFF", + onError: "#000000", + }, +}; diff --git a/core/src/base/typography-scheme/index.ts b/core/src/base/typography-scheme/index.ts new file mode 100644 index 0000000..6239fc6 --- /dev/null +++ b/core/src/base/typography-scheme/index.ts @@ -0,0 +1 @@ +export * from "./typography-scheme"; diff --git a/core/src/base/typography-scheme/typography-scheme.ts b/core/src/base/typography-scheme/typography-scheme.ts new file mode 100644 index 0000000..e5b5488 --- /dev/null +++ b/core/src/base/typography-scheme/typography-scheme.ts @@ -0,0 +1,18 @@ +import { TextStyle } from "react-native"; + +export type TypographyVariant = + | "h1" + | "h2" + | "h3" + | "h4" + | "h5" + | "h6" + | "subtitle1" + | "subtitle2" + | "body1" + | "body2" + | "button" + | "caption" + | "overline"; + +export type TypographyScheme = Record; diff --git a/core/src/index.ts b/core/src/index.ts new file mode 100644 index 0000000..69a7079 --- /dev/null +++ b/core/src/index.ts @@ -0,0 +1,2 @@ +export * from "./base"; +export * from "./surface"; diff --git a/core/src/surface/Surface.tsx b/core/src/surface/Surface.tsx new file mode 100644 index 0000000..e14a593 --- /dev/null +++ b/core/src/surface/Surface.tsx @@ -0,0 +1,163 @@ +import React, { useState } from "react"; +import { Animated, StyleSheet, ViewProps } from "react-native"; +import Svg, { Polygon } from "react-native-svg"; +import { + ShapeBorderRadius, + ShapeCategory, + ShapeFamily, + useTheme, +} from "../base"; + +export interface SurfaceProps extends ViewProps { + category?: ShapeCategory; + + family?: ShapeFamily; +} + +const Surface: React.FC = ({ family, ...rest }) => { + const theme = useTheme(); + + return (family ?? theme.shapeScheme[rest.category!].family) === "rounded" ? ( + + ) : ( + + ); +}; + +Surface.defaultProps = { + category: "small", +}; + +export interface RoundedSurfaceProps extends ViewProps { + category?: ShapeCategory; +} + +export const RoundedSurface: React.FC = ({ + category, + style, + ...rest +}) => { + const styles = StyleSheet.flatten(style ?? {}); + + const theme = useTheme(); + + const radius = theme.shapeScheme[category!].borderRadius; + + const borderRadius: ShapeBorderRadius = { + topStart: + styles.borderTopStartRadius ?? + styles.borderTopLeftRadius ?? + styles.borderRadius ?? + radius.topStart, + topEnd: + styles.borderTopEndRadius ?? + styles.borderTopRightRadius ?? + styles.borderRadius ?? + radius.topEnd, + bottomStart: + styles.borderBottomStartRadius ?? + styles.borderBottomRightRadius ?? + styles.borderRadius ?? + radius.bottomStart, + bottomEnd: + styles.borderBottomEndRadius ?? + styles.borderBottomRightRadius ?? + styles.borderRadius ?? + radius.bottomEnd, + }; + + return ( + + ); +}; + +RoundedSurface.defaultProps = { + category: "small", +}; + +export interface CutSurfaceProps extends ViewProps { + category?: ShapeCategory; +} + +export const CutSurface: React.FC = ({ + category, + style, + children, + ...rest +}) => { + const { backgroundColor, ...styles } = StyleSheet.flatten(style ?? {}); + + const [width, setWidth] = useState(0); + const [height, setHeight] = useState(0); + + const theme = useTheme(); + + const radius = theme.shapeScheme[category!].borderRadius; + + const borderRadius: ShapeBorderRadius = { + topStart: + styles.borderTopStartRadius ?? + styles.borderTopLeftRadius ?? + styles.borderRadius ?? + radius.topStart, + topEnd: + styles.borderTopEndRadius ?? + styles.borderTopRightRadius ?? + styles.borderRadius ?? + radius.topEnd, + bottomStart: + styles.borderBottomStartRadius ?? + styles.borderBottomRightRadius ?? + styles.borderRadius ?? + radius.bottomStart, + bottomEnd: + styles.borderBottomEndRadius ?? + styles.borderBottomRightRadius ?? + styles.borderRadius ?? + radius.bottomEnd, + }; + + const points = [ + [0, borderRadius.topStart], + [borderRadius.topStart, 0], + [width - borderRadius.topEnd, 0], + [width, borderRadius.topEnd], + [width, height - borderRadius.bottomEnd], + [width - borderRadius.bottomEnd, height], + [borderRadius.bottomStart, height], + [0, height - borderRadius.bottomStart], + ].reduce((p, c) => `${p} ${c}`, ""); + + return ( + { + setWidth(e.nativeEvent.layout.width); + setHeight(e.nativeEvent.layout.height); + }} + {...rest} + > + + + + {children} + + ); +}; + +CutSurface.defaultProps = { + category: "small", +}; + +export default Surface; diff --git a/core/src/surface/index.ts b/core/src/surface/index.ts new file mode 100644 index 0000000..096d748 --- /dev/null +++ b/core/src/surface/index.ts @@ -0,0 +1,4 @@ +import Surface from "./Surface"; + +export * from "./Surface"; +export { Surface }; diff --git a/core/tsconfig.json b/core/tsconfig.json new file mode 100644 index 0000000..fc1dbc2 --- /dev/null +++ b/core/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "es6", + "jsx": "react-native", + "declaration": true, + "outDir": "./lib", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "moduleResolution": "node" + }, + "include": ["src"], + "exclude": ["node_modules"] +} diff --git a/core/yarn.lock b/core/yarn.lock new file mode 100644 index 0000000..e97d3c6 --- /dev/null +++ b/core/yarn.lock @@ -0,0 +1,175 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@types/chroma-js@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@types/chroma-js/-/chroma-js-2.1.3.tgz#0b03d737ff28fad10eb884e0c6cedd5ffdc4ba0a" + integrity sha512-1xGPhoSGY1CPmXLCBcjVZSQinFjL26vlR8ZqprsBWiFyED4JacJJ9zHhh5aaUXqbY9B37mKQ73nlydVAXmr1+g== + +"@types/prop-types@*": + version "15.7.4" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" + integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== + +"@types/react-native@^0.64.13": + version "0.64.13" + resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.64.13.tgz#9e57b85631380b75979a09f5a97e1884299e8d5a" + integrity sha512-QSOBN6m3TKBPFAcDhuFItDQtw1Fo1/FKDTHGeyeTwBXd3bu0V9s+oHEhntHN7PUK5dAOYFWsnO0wynWwS/KRxQ== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^17.0.19": + version "17.0.19" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.19.tgz#8f2a85e8180a43b57966b237d26a29481dacc991" + integrity sha512-sX1HisdB1/ZESixMTGnMxH9TDe8Sk709734fEQZzCV/4lSu9kJCPbo2PbTRoZM+53Pp0P10hYVyReUueGwUi4A== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/scheduler@*": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +chroma-js@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/chroma-js/-/chroma-js-2.1.2.tgz#1075cb9ae25bcb2017c109394168b5cf3aa500ec" + integrity sha512-ri/ouYDWuxfus3UcaMxC1Tfp3IE9K5iQzxc2hSxbBRVNQFut1UuGAsZmiAf2mOUubzGJwgMSv9lHg+XqLaz1QQ== + dependencies: + cross-env "^6.0.3" + +cross-env@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-6.0.3.tgz#4256b71e49b3a40637a0ce70768a6ef5c72ae941" + integrity sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag== + dependencies: + cross-spawn "^7.0.0" + +cross-spawn@^7.0.0: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +css-select@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-tree@^1.0.0-alpha.39: + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-what@^3.2.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" + integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== + +csstype@^3.0.2: + version "3.0.8" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.8.tgz#d2266a792729fb227cd216fb572f43728e1ad340" + integrity sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw== + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +domelementtype@1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" + integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== + +domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +nth-check@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.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== + +react-native-svg@^12.1.1: + version "12.1.1" + resolved "https://registry.yarnpkg.com/react-native-svg/-/react-native-svg-12.1.1.tgz#5f292410b8bcc07bbc52b2da7ceb22caf5bcaaee" + integrity sha512-NIAJ8jCnXGCqGWXkkJ1GTzO4a3Md5at5sagYV8Vh4MXYnL4z5Rh428Wahjhh+LIjx40EE5xM5YtwyJBqOIba2Q== + dependencies: + css-select "^2.1.0" + css-tree "^1.0.0-alpha.39" + +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== + +source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +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"