diff --git a/app/CodeSentPage.tsx b/app/CodeSentPage.tsx new file mode 100644 index 0000000..ceebb33 --- /dev/null +++ b/app/CodeSentPage.tsx @@ -0,0 +1,58 @@ +import BackButton from "./components/BackButton"; +import React from "react"; +import { Card } from "./components/ui/card"; +import Screen from "./components/Screen"; +import { Heading } from "./components/ui/heading"; +import { AntDesign } from "@expo/vector-icons"; +import { VStack } from "./components/ui/vstack"; +import { Text } from "./components/ui/text"; +import { Button, ButtonIcon, ButtonText } from "./components/ui/button"; +import { LockIcon } from "./components/ui/icon"; + +function truncateEmail(email: string) { + const splitedEmail = email.split("@"); + let hiddenPart = splitedEmail[0][0]; + for (let i = 1; i < splitedEmail[0].length - 1; i++) { + hiddenPart += "⋆"; + } + return hiddenPart + splitedEmail[0].slice(-1) + "@" + splitedEmail[1]; +} + +type props = { email?: string }; + +export default function CodeSentPage({ email }: props) { + return ( + + + + + + + Code envoyé ! + + + + Nous t'avons envoyé le code de vérification à + + + {truncateEmail(email ?? "test@Optifit.com")} + + + Clique sur renvoyer si tu n'as pas reçu d’ici quelques secondes ! + 🔥 + + + + + + + ); +} diff --git a/app/LoginPage.tsx b/app/LoginPage.tsx new file mode 100644 index 0000000..ce63e6f --- /dev/null +++ b/app/LoginPage.tsx @@ -0,0 +1,67 @@ +import { Text } from "./components/ui/text"; +import { VStack } from "./components/ui/vstack"; +import { Button, ButtonGroup } from "./components/ui/button"; +import { Feather } from "@expo/vector-icons"; +import { HStack } from "./components/ui/hstack"; +import React from "react"; +import { FeatherIconNames } from "@expo/vector-icons/build/Feather"; +import { Box } from "./components/ui/box"; +import { Heading } from "./components/ui/heading"; +import { Link } from "expo-router"; +import { LinkText } from "./components/ui/link"; +import LoginForm from "./components/form/LoginForm"; +import Screen from "./components/Screen"; + +const socialNetworkButtons: ISocialNetworkButtons[] = [ + { icon: "instagram" }, + { icon: "facebook" }, + { icon: "linkedin" }, +]; + +interface ISocialNetworkButtons { + icon: FeatherIconNames; +} + +export default function LoginPage() { + return ( + + + + + + Connexion à Optifit + + + Personnalise ton expérience du sport avec Optifit, ton nouveau + coach IA. + + + + + {socialNetworkButtons.map((socialNetworkButton) => ( + + ))} + + + + Tu n'as pas encore de compte ? + + Inscris-toi ! + + + + Mot de passe oublié ? + + + + + + ); +} diff --git a/app/ResetPasswordPage.tsx b/app/ResetPasswordPage.tsx new file mode 100644 index 0000000..b738793 --- /dev/null +++ b/app/ResetPasswordPage.tsx @@ -0,0 +1,65 @@ +import { Text } from "./components/ui/text"; +import { + Button, + ButtonGroup, + ButtonIcon, + ButtonText, +} from "./components/ui/button"; +import { VStack } from "./components/ui/vstack"; +import React from "react"; +import { + ArrowRightIcon, + LockIcon, + MailIcon, + MessageCircleIcon, +} from "./components/ui/icon"; +import BackButton from "./components/BackButton"; +import Screen from "./components/Screen"; +import { Heading } from "./components/ui/heading"; +import { Link } from "expo-router"; + +const resetButtons: IResetButton[] = [ + { icon: MailIcon, text: "Envoyer par email" }, + { icon: LockIcon, text: "Envoyer par 2FA" }, + { icon: MessageCircleIcon, text: "Envoyer par SMS" }, +]; + +interface IResetButton { + icon: React.ElementType; + text: string; +} + +export default function ResetPasswordPage() { + return ( + + + + + + Réinitialisation de ton mot de passe + + + Selectionne une méthode pour recevoir ton code temporaire + + + + {resetButtons.map((resetButton) => ( + + + + ))} + + + + ); +} diff --git a/app/SigninPage.tsx b/app/SigninPage.tsx new file mode 100644 index 0000000..cce647c --- /dev/null +++ b/app/SigninPage.tsx @@ -0,0 +1,36 @@ +import { Text } from "./components/ui/text"; +import { VStack } from "./components/ui/vstack"; +import { Box } from "./components/ui/box"; +import { HStack } from "./components/ui/hstack"; +import React from "react"; +import SigninForm from "./components/form/SigninForm"; +import Screen from "./components/Screen"; +import { Heading } from "./components/ui/heading"; +import { Link } from "expo-router"; +import { LinkText } from "./components/ui/link"; + +export default function SigninPage() { + return ( + + + + + + Inscris-toi gratuitement + + + Génère un programme personnalisé en quelques clics et 1 minute ! + + + + + Tu as déjà un compte ? + + Connectes-toi ! + + + + + + ); +} diff --git a/app/_layout.tsx b/app/_layout.tsx index a361ea0..c84ef90 100644 --- a/app/_layout.tsx +++ b/app/_layout.tsx @@ -1,13 +1,14 @@ +import { Slot } from "expo-router"; import "../global.css"; -import {GluestackUIProvider} from "@/app/components/ui/gluestack-ui-provider"; +import { GluestackUIProvider } from "./components/ui/gluestack-ui-provider"; import React from "react"; import NavBar from "@/app/components/NavBar"; export default function RootLayout() { - return ( - - - - - ); + return ( + + + + + ); } diff --git a/app/components/BackButton.tsx b/app/components/BackButton.tsx new file mode 100644 index 0000000..a01fba2 --- /dev/null +++ b/app/components/BackButton.tsx @@ -0,0 +1,24 @@ +import { AntDesign } from "@expo/vector-icons"; +import { Button, ButtonActions } from "./ui/button"; +import { AntDesignIconNames } from "@expo/vector-icons/build/AntDesign"; +import { Href, Link } from "expo-router"; + +type props = { + icon?: AntDesignIconNames; + link: Href; + action?: ButtonActions; +}; + +export default function BackButton({ icon, link, action }: props) { + return ( + + ); +} diff --git a/app/components/Screen.tsx b/app/components/Screen.tsx new file mode 100644 index 0000000..b42d519 --- /dev/null +++ b/app/components/Screen.tsx @@ -0,0 +1,8 @@ +import { PropsWithChildren } from "react"; +import { Box } from "./ui/box"; + +type props = PropsWithChildren; + +export default function Screen({ children }: props) { + return {children}; +} diff --git a/app/components/form/FormError.tsx b/app/components/form/FormError.tsx new file mode 100644 index 0000000..f1b3058 --- /dev/null +++ b/app/components/form/FormError.tsx @@ -0,0 +1,19 @@ +import { + FormControlError, + FormControlErrorIcon, + FormControlErrorText, +} from "../ui/form-control"; +import { AlertCircleIcon } from "../ui/icon"; + +type props = { text: string }; + +export default function FormError({ text }: props) { + return ( + + + + {text} + + + ); +} diff --git a/app/components/form/LoginForm.tsx b/app/components/form/LoginForm.tsx new file mode 100644 index 0000000..c6cb0c2 --- /dev/null +++ b/app/components/form/LoginForm.tsx @@ -0,0 +1,58 @@ +import { Button, ButtonText, ButtonIcon } from "../ui/button"; +import { + FormControl, + FormControlLabel, + FormControlLabelText, +} from "../ui/form-control"; +import { MailIcon, ArrowRightIcon } from "../ui/icon"; +import { Input, InputIcon, InputField } from "../ui/input"; +import { VStack } from "../ui/vstack"; +import React from "react"; +import PasswordField from "./PasswordField"; +import FormError from "./FormError"; + +export default function LoginForm() { + const REQUIRED_ERROR = "Au moins un des champs requis est vide !"; + const [emailValue, setEmailValue] = React.useState(""); + const [isEmailInvalid, setIsEmailInvalid] = React.useState(false); + const [passwordValue, setPasswordValue] = React.useState(""); + const [isPasswordInvalid, setIsPasswordInvalid] = React.useState(false); + const [isFormInvalid, setIsFormInvalid] = React.useState(false); + const handleSubmit = () => { + //check for empty fields + setIsEmailInvalid(emailValue == ""); + setIsPasswordInvalid(passwordValue == ""); + setIsFormInvalid(isEmailInvalid || isPasswordInvalid); + }; + + return ( + + + + Adresse mail + + + + + + + + + Mot de passe + + + + + + + + + ); +} diff --git a/app/components/form/PasswordField.tsx b/app/components/form/PasswordField.tsx new file mode 100644 index 0000000..4f8c518 --- /dev/null +++ b/app/components/form/PasswordField.tsx @@ -0,0 +1,31 @@ +import React from "react"; +import { LockIcon, EyeIcon, EyeOffIcon } from "../ui/icon"; +import { Input, InputIcon, InputField, InputSlot } from "../ui/input"; +import { VariantProps } from "@gluestack-ui/nativewind-utils"; + +type props = React.ComponentProps & + VariantProps; + +export default function PasswordField({ value, onChangeText }: props) { + const [showPassword, setShowPassword] = React.useState(false); + const handleState = () => { + setShowPassword((showState) => { + return !showState; + }); + }; + + return ( + + + + + + + + ); +} diff --git a/app/components/form/SigninForm.tsx b/app/components/form/SigninForm.tsx new file mode 100644 index 0000000..83ec102 --- /dev/null +++ b/app/components/form/SigninForm.tsx @@ -0,0 +1,125 @@ +import { Button, ButtonText, ButtonIcon } from "../ui/button"; +import { + FormControl, + FormControlLabel, + FormControlLabelText, +} from "../ui/form-control"; +import { MailIcon, ArrowRightIcon } from "../ui/icon"; +import { Input, InputIcon, InputField } from "../ui/input"; +import { VStack } from "../ui/vstack"; +import React from "react"; +import FormError from "./FormError"; +import PasswordField from "./PasswordField"; + +export default function SigninForm() { + const REQUIRED = "Au moins un des champs requis est vide !"; + const INVALID_EMAIL = "Adresse mail invalide !"; + // TODO Définir ce qu'est un mdp valide + const INVALID_PASSWORD = "Mot de passe invalide !"; + const NOT_MATCHING_PASSWORD = "Les mots de passe ne correspondent pas !"; + const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/; + + const [emailValue, setEmailValue] = React.useState(""); + const [isEmailInvalid, setIsEmailInvalid] = React.useState(false); + const [passwordValue, setPasswordValue] = React.useState(""); + const [isPasswordInvalid, setIsPasswordInvalid] = React.useState(false); + const [passwordConfirmValue, setPasswordConfirmValue] = React.useState(""); + const [isPasswordConfirmInvalid, setIsPasswordConfirmInvalid] = + React.useState(false); + const [isFormInvalid, setIsFormInvalid] = React.useState(false); + const [formError, setFormError] = React.useState(""); + + function validateForm() { + setFormError(""); + setIsFormInvalid(false); + } + + function invalidateForm(error: string) { + setFormError(error); + setIsFormInvalid(true); + } + + const handleSubmit = () => { + //check for valid email block + if (emailValue != "") { + if (emailRegex.test(emailValue)) { + setIsEmailInvalid(false); + } else { + setIsEmailInvalid(true); + invalidateForm(INVALID_EMAIL); + return; + } + } else { + setIsEmailInvalid(true); + invalidateForm(REQUIRED); + return; + } + + //TODO : check for valid password block + if (passwordValue != "") { + setIsPasswordInvalid(false); + } else { + setIsPasswordInvalid(true); + invalidateForm(REQUIRED); + return; + } + + //check for valid password confirmation + if (passwordConfirmValue != "") { + if (passwordConfirmValue == passwordValue) { + setIsPasswordConfirmInvalid(false); + validateForm(); + } else { + setIsPasswordConfirmInvalid(true); + invalidateForm(NOT_MATCHING_PASSWORD); + return; + } + } else { + setIsPasswordConfirmInvalid(true); + invalidateForm(REQUIRED); + return; + } + }; + + return ( + + + + Adresse mail + + + + + + + + + Mot de passe + + + + + + + Confirmation du mot de passe + + + + + + + + + + ); +} diff --git a/app/components/ui/box/index.tsx b/app/components/ui/box/index.tsx index 766266f..5b8e8d1 100644 --- a/app/components/ui/box/index.tsx +++ b/app/components/ui/box/index.tsx @@ -1,8 +1,8 @@ -import React from 'react'; -import { View, ViewProps } from 'react-native'; +import React from "react"; +import { View, ViewProps } from "react-native"; -import type { VariantProps } from '@gluestack-ui/nativewind-utils'; -import { boxStyle } from './styles'; +import type { VariantProps } from "@gluestack-ui/nativewind-utils"; +import { boxStyle } from "./styles"; type IBoxProps = ViewProps & VariantProps & { className?: string }; @@ -15,5 +15,5 @@ const Box = React.forwardRef, IBoxProps>( } ); -Box.displayName = 'Box'; +Box.displayName = "Box"; export { Box }; diff --git a/app/components/ui/button/index.tsx b/app/components/ui/button/index.tsx index 0efc1a0..4676544 100644 --- a/app/components/ui/button/index.tsx +++ b/app/components/ui/button/index.tsx @@ -1,17 +1,17 @@ -'use client'; -import React from 'react'; -import { createButton } from '@gluestack-ui/button'; -import { tva } from '@gluestack-ui/nativewind-utils/tva'; +"use client"; +import React from "react"; +import { createButton } from "@gluestack-ui/button"; +import { tva } from "@gluestack-ui/nativewind-utils/tva"; import { withStyleContext, useStyleContext, -} from '@gluestack-ui/nativewind-utils/withStyleContext'; -import { cssInterop } from 'nativewind'; -import { ActivityIndicator, Pressable, Text, View } from 'react-native'; -import type { VariantProps } from '@gluestack-ui/nativewind-utils'; -import { PrimitiveIcon, UIIcon } from '@gluestack-ui/icon'; +} from "@gluestack-ui/nativewind-utils/withStyleContext"; +import { cssInterop } from "nativewind"; +import { ActivityIndicator, Pressable, Text, View } from "react-native"; +import type { VariantProps } from "@gluestack-ui/nativewind-utils"; +import { PrimitiveIcon, UIIcon } from "@gluestack-ui/icon"; -const SCOPE = 'BUTTON'; +const SCOPE = "BUTTON"; const Root = withStyleContext(Pressable, SCOPE); @@ -25,262 +25,268 @@ const UIButton = createButton({ cssInterop(PrimitiveIcon, { className: { - target: 'style', + target: "style", nativeStyleToProp: { height: true, width: true, fill: true, - color: 'classNameColor', + color: "classNameColor", stroke: true, }, }, }); const buttonStyle = tva({ - base: 'group/button rounded bg-primary-500 flex-row items-center justify-center data-[focus-visible=true]:web:outline-none data-[focus-visible=true]:web:ring-2 data-[disabled=true]:opacity-40 gap-2', + base: "group/button rounded-3xl bg-primary-500 flex-row items-center justify-center data-[focus-visible=true]:web:outline-none data-[focus-visible=true]:web:ring-2 data-[disabled=true]:opacity-40 gap-2", variants: { action: { primary: - 'bg-primary-500 data-[hover=true]:bg-primary-600 data-[active=true]:bg-primary-700 border-primary-300 data-[hover=true]:border-primary-400 data-[active=true]:border-primary-500 data-[focus-visible=true]:web:ring-indicator-info', + "bg-primary-500 data-[hover=true]:bg-primary-600 data-[active=true]:bg-primary-700 border-primary-300 data-[hover=true]:border-primary-400 data-[active=true]:border-primary-500 data-[focus-visible=true]:web:ring-indicator-info", secondary: - 'bg-secondary-500 border-secondary-300 data-[hover=true]:bg-secondary-600 data-[hover=true]:border-secondary-400 data-[active=true]:bg-secondary-700 data-[active=true]:border-secondary-700 data-[focus-visible=true]:web:ring-indicator-info', + "bg-secondary-500 border-secondary-300 data-[hover=true]:bg-secondary-600 data-[hover=true]:border-secondary-400 data-[active=true]:bg-secondary-700 data-[active=true]:border-secondary-700 data-[focus-visible=true]:web:ring-indicator-info", positive: - 'bg-success-500 border-success-300 data-[hover=true]:bg-success-600 data-[hover=true]:border-success-400 data-[active=true]:bg-success-700 data-[active=true]:border-success-500 data-[focus-visible=true]:web:ring-indicator-info', + "bg-success-500 border-success-300 data-[hover=true]:bg-success-600 data-[hover=true]:border-success-400 data-[active=true]:bg-success-700 data-[active=true]:border-success-500 data-[focus-visible=true]:web:ring-indicator-info", negative: - 'bg-error-500 border-error-300 data-[hover=true]:bg-error-600 data-[hover=true]:border-error-400 data-[active=true]:bg-error-700 data-[active=true]:border-error-500 data-[focus-visible=true]:web:ring-indicator-info', + "bg-error-500 border-error-300 data-[hover=true]:bg-error-600 data-[hover=true]:border-error-400 data-[active=true]:bg-error-700 data-[active=true]:border-error-500 data-[focus-visible=true]:web:ring-indicator-info", default: - 'bg-transparent data-[hover=true]:bg-background-50 data-[active=true]:bg-transparent', + "bg-transparent data-[hover=true]:bg-background-50 data-[active=true]:bg-transparent", }, variant: { - link: 'px-0', + link: "px-0", outline: - 'bg-transparent border data-[hover=true]:bg-background-50 data-[active=true]:bg-transparent', - solid: '', + "bg-transparent border data-[hover=true]:bg-background-50 data-[active=true]:bg-transparent", + solid: "", }, size: { - xs: 'px-3.5 h-8', - sm: 'px-4 h-9', - md: 'px-5 h-10', - lg: 'px-6 h-11', - xl: 'px-7 h-12', + xs: "h-8", + sm: "h-9", + md: "h-10", + lg: "h-11", + xl: "p-4 h-16", + "2xl": "p-6 h-20", + "3xl": "p-8 h-24", }, }, compoundVariants: [ { - action: 'primary', - variant: 'link', + action: "primary", + variant: "link", class: - 'px-0 bg-transparent data-[hover=true]:bg-transparent data-[active=true]:bg-transparent', + "px-0 bg-transparent data-[hover=true]:bg-transparent data-[active=true]:bg-transparent", }, { - action: 'secondary', - variant: 'link', + action: "secondary", + variant: "link", class: - 'px-0 bg-transparent data-[hover=true]:bg-transparent data-[active=true]:bg-transparent', + "px-0 bg-transparent data-[hover=true]:bg-transparent data-[active=true]:bg-transparent", }, { - action: 'positive', - variant: 'link', + action: "positive", + variant: "link", class: - 'px-0 bg-transparent data-[hover=true]:bg-transparent data-[active=true]:bg-transparent', + "px-0 bg-transparent data-[hover=true]:bg-transparent data-[active=true]:bg-transparent", }, { - action: 'negative', - variant: 'link', + action: "negative", + variant: "link", class: - 'px-0 bg-transparent data-[hover=true]:bg-transparent data-[active=true]:bg-transparent', + "px-0 bg-transparent data-[hover=true]:bg-transparent data-[active=true]:bg-transparent", }, { - action: 'primary', - variant: 'outline', + action: "primary", + variant: "outline", class: - 'bg-transparent data-[hover=true]:bg-background-50 data-[active=true]:bg-transparent', + "bg-transparent data-[hover=true]:bg-background-50 data-[active=true]:bg-transparent", }, { - action: 'secondary', - variant: 'outline', + action: "secondary", + variant: "outline", class: - 'bg-transparent data-[hover=true]:bg-background-50 data-[active=true]:bg-transparent', + "bg-transparent data-[hover=true]:bg-background-50 data-[active=true]:bg-transparent", }, { - action: 'positive', - variant: 'outline', + action: "positive", + variant: "outline", class: - 'bg-transparent data-[hover=true]:bg-background-50 data-[active=true]:bg-transparent', + "bg-transparent data-[hover=true]:bg-background-50 data-[active=true]:bg-transparent", }, { - action: 'negative', - variant: 'outline', + action: "negative", + variant: "outline", class: - 'bg-transparent data-[hover=true]:bg-background-50 data-[active=true]:bg-transparent', + "bg-transparent data-[hover=true]:bg-background-50 data-[active=true]:bg-transparent", }, ], }); const buttonTextStyle = tva({ - base: 'text-typography-0 font-semibold web:select-none', + base: "text-typography-0 font-semibold web:select-none", parentVariants: { action: { primary: - 'text-primary-600 data-[hover=true]:text-primary-600 data-[active=true]:text-primary-700', + "text-primary-600 data-[hover=true]:text-primary-600 data-[active=true]:text-primary-700", secondary: - 'text-typography-500 data-[hover=true]:text-typography-600 data-[active=true]:text-typography-700', + "text-typography-500 data-[hover=true]:text-typography-600 data-[active=true]:text-typography-700", positive: - 'text-success-600 data-[hover=true]:text-success-600 data-[active=true]:text-success-700', + "text-success-600 data-[hover=true]:text-success-600 data-[active=true]:text-success-700", negative: - 'text-error-600 data-[hover=true]:text-error-600 data-[active=true]:text-error-700', + "text-error-600 data-[hover=true]:text-error-600 data-[active=true]:text-error-700", }, variant: { - link: 'data-[hover=true]:underline data-[active=true]:underline', - outline: '', + link: "underline data-[hover=true]:underline data-[active=true]:underline text-orange-400", + outline: "", solid: - 'text-typography-0 data-[hover=true]:text-typography-0 data-[active=true]:text-typography-0', + "text-typography-0 data-[hover=true]:text-typography-0 data-[active=true]:text-typography-0", }, size: { - xs: 'text-xs', - sm: 'text-sm', - md: 'text-base', - lg: 'text-lg', - xl: 'text-xl', + xs: "text-xs", + sm: "text-sm", + md: "text-base", + lg: "text-lg", + xl: "text-xl", + "2xl": "text-2xl", + "3xl": "text-3xl", }, }, parentCompoundVariants: [ { - variant: 'solid', - action: 'primary', + variant: "solid", + action: "primary", class: - 'text-typography-0 data-[hover=true]:text-typography-0 data-[active=true]:text-typography-0', + "text-typography-0 data-[hover=true]:text-typography-0 data-[active=true]:text-typography-0", }, { - variant: 'solid', - action: 'secondary', + variant: "solid", + action: "secondary", class: - 'text-typography-800 data-[hover=true]:text-typography-800 data-[active=true]:text-typography-800', + "text-typography-800 data-[hover=true]:text-typography-800 data-[active=true]:text-typography-800", }, { - variant: 'solid', - action: 'positive', + variant: "solid", + action: "positive", class: - 'text-typography-0 data-[hover=true]:text-typography-0 data-[active=true]:text-typography-0', + "text-typography-0 data-[hover=true]:text-typography-0 data-[active=true]:text-typography-0", }, { - variant: 'solid', - action: 'negative', + variant: "solid", + action: "negative", class: - 'text-typography-0 data-[hover=true]:text-typography-0 data-[active=true]:text-typography-0', + "text-typography-0 data-[hover=true]:text-typography-0 data-[active=true]:text-typography-0", }, { - variant: 'outline', - action: 'primary', + variant: "outline", + action: "primary", class: - 'text-primary-500 data-[hover=true]:text-primary-500 data-[active=true]:text-primary-500', + "text-primary-500 data-[hover=true]:text-primary-500 data-[active=true]:text-primary-500", }, { - variant: 'outline', - action: 'secondary', + variant: "outline", + action: "secondary", class: - 'text-typography-500 data-[hover=true]:text-primary-600 data-[active=true]:text-typography-700', + "text-typography-500 data-[hover=true]:text-primary-600 data-[active=true]:text-typography-700", }, { - variant: 'outline', - action: 'positive', + variant: "outline", + action: "positive", class: - 'text-primary-500 data-[hover=true]:text-primary-500 data-[active=true]:text-primary-500', + "text-primary-500 data-[hover=true]:text-primary-500 data-[active=true]:text-primary-500", }, { - variant: 'outline', - action: 'negative', + variant: "outline", + action: "negative", class: - 'text-primary-500 data-[hover=true]:text-primary-500 data-[active=true]:text-primary-500', + "text-primary-500 data-[hover=true]:text-primary-500 data-[active=true]:text-primary-500", }, ], }); const buttonIconStyle = tva({ - base: 'fill-none', + base: "fill-none", parentVariants: { variant: { - link: 'data-[hover=true]:underline data-[active=true]:underline', - outline: '', + link: "data-[hover=true]:underline data-[active=true]:underline", + outline: "", solid: - 'text-typography-0 data-[hover=true]:text-typography-0 data-[active=true]:text-typography-0', + "text-typography-0 data-[hover=true]:text-typography-0 data-[active=true]:text-typography-0", }, size: { - xs: 'h-3.5 w-3.5', - sm: 'h-4 w-4', - md: 'h-[18px] w-[18px]', - lg: 'h-[18px] w-[18px]', - xl: 'h-5 w-5', + xs: "h-3.5 w-3.5", + sm: "h-4 w-4", + md: "h-[18px] w-[18px]", + lg: "h-[18px] w-[18px]", + xl: "h-5 w-5", + "2xl": "h-8 w-8", + "3xl": "h-10 w-10", }, action: { primary: - 'text-primary-600 data-[hover=true]:text-primary-600 data-[active=true]:text-primary-700', + "text-primary-600 data-[hover=true]:text-primary-600 data-[active=true]:text-primary-700", secondary: - 'text-typography-500 data-[hover=true]:text-typography-600 data-[active=true]:text-typography-700', + "text-typography-500 data-[hover=true]:text-typography-600 data-[active=true]:text-typography-700", positive: - 'text-success-600 data-[hover=true]:text-success-600 data-[active=true]:text-success-700', + "text-success-600 data-[hover=true]:text-success-600 data-[active=true]:text-success-700", negative: - 'text-error-600 data-[hover=true]:text-error-600 data-[active=true]:text-error-700', + "text-error-600 data-[hover=true]:text-error-600 data-[active=true]:text-error-700", }, }, parentCompoundVariants: [ { - variant: 'solid', - action: 'primary', + variant: "solid", + action: "primary", class: - 'text-typography-0 data-[hover=true]:text-typography-0 data-[active=true]:text-typography-0', + "text-typography-0 data-[hover=true]:text-typography-0 data-[active=true]:text-typography-0", }, { - variant: 'solid', - action: 'secondary', + variant: "solid", + action: "secondary", class: - 'text-typography-800 data-[hover=true]:text-typography-800 data-[active=true]:text-typography-800', + "text-typography-800 data-[hover=true]:text-typography-800 data-[active=true]:text-typography-800", }, { - variant: 'solid', - action: 'positive', + variant: "solid", + action: "positive", class: - 'text-typography-0 data-[hover=true]:text-typography-0 data-[active=true]:text-typography-0', + "text-typography-0 data-[hover=true]:text-typography-0 data-[active=true]:text-typography-0", }, { - variant: 'solid', - action: 'negative', + variant: "solid", + action: "negative", class: - 'text-typography-0 data-[hover=true]:text-typography-0 data-[active=true]:text-typography-0', + "text-typography-0 data-[hover=true]:text-typography-0 data-[active=true]:text-typography-0", }, ], }); const buttonGroupStyle = tva({ - base: '', + base: "", variants: { space: { - 'xs': 'gap-1', - 'sm': 'gap-2', - 'md': 'gap-3', - 'lg': 'gap-4', - 'xl': 'gap-5', - '2xl': 'gap-6', - '3xl': 'gap-7', - '4xl': 'gap-8', + xs: "gap-1", + sm: "gap-2", + md: "gap-3", + lg: "gap-4", + xl: "gap-5", + "2xl": "gap-6", + "3xl": "gap-7", + "4xl": "gap-8", }, isAttached: { - true: 'gap-0', + true: "gap-0", }, flexDirection: { - 'row': 'flex-row', - 'column': 'flex-col', - 'row-reverse': 'flex-row-reverse', - 'column-reverse': 'flex-col-reverse', + row: "flex-row", + column: "flex-col", + "row-reverse": "flex-row-reverse", + "column-reverse": "flex-col-reverse", }, }, }); type IButtonProps = Omit< React.ComponentPropsWithoutRef, - 'context' + "context" > & VariantProps & { className?: string }; @@ -289,7 +295,7 @@ const Button = React.forwardRef< IButtonProps >( ( - { className, variant = 'solid', size = 'md', action = 'primary', ...props }, + { className, variant = "solid", size = "md", action = "primary", ...props }, ref ) => { return ( @@ -355,7 +361,7 @@ const ButtonIcon = React.forwardRef< action: parentAction, } = useStyleContext(SCOPE); - if (typeof size === 'number') { + if (typeof size === "number") { return ( & { className?: string }; + +const Card = React.forwardRef, ICardProps>( + ({ className, size = 'md', variant = 'elevated', ...props }, ref) => { + return ( + + ); + } +); + +Card.displayName = 'Card'; + +export { Card }; diff --git a/app/components/ui/card/index.web.tsx b/app/components/ui/card/index.web.tsx new file mode 100644 index 0000000..f521d08 --- /dev/null +++ b/app/components/ui/card/index.web.tsx @@ -0,0 +1,22 @@ +import React from 'react'; +import { cardStyle } from './styles'; +import type { VariantProps } from '@gluestack-ui/nativewind-utils'; + +type ICardProps = React.ComponentPropsWithoutRef<'div'> & + VariantProps; + +const Card = React.forwardRef( + ({ className, size = 'md', variant = 'elevated', ...props }, ref) => { + return ( +
+ ); + } +); + +Card.displayName = 'Card'; + +export { Card }; diff --git a/app/components/ui/card/styles.tsx b/app/components/ui/card/styles.tsx new file mode 100644 index 0000000..59de8b7 --- /dev/null +++ b/app/components/ui/card/styles.tsx @@ -0,0 +1,20 @@ +import { tva } from '@gluestack-ui/nativewind-utils/tva'; +import { isWeb } from '@gluestack-ui/nativewind-utils/IsWeb'; +const baseStyle = isWeb ? 'flex flex-col relative z-0' : ''; + +export const cardStyle = tva({ + base: baseStyle, + variants: { + size: { + sm: 'p-3 rounded', + md: 'p-4 rounded-md', + lg: 'p-6 rounded-xl', + }, + variant: { + elevated: 'bg-background-0', + outline: 'border border-outline-200 ', + ghost: 'rounded-none', + filled: 'bg-background-50', + }, + }, +}); diff --git a/app/components/ui/form-control/index.tsx b/app/components/ui/form-control/index.tsx new file mode 100644 index 0000000..b982f4c --- /dev/null +++ b/app/components/ui/form-control/index.tsx @@ -0,0 +1,468 @@ +'use client'; +import { Text, View } from 'react-native'; +import React from 'react'; +import { createFormControl } from '@gluestack-ui/form-control'; +import { tva } from '@gluestack-ui/nativewind-utils/tva'; +import { + withStyleContext, + useStyleContext, +} from '@gluestack-ui/nativewind-utils/withStyleContext'; +import { cssInterop } from 'nativewind'; +import type { VariantProps } from '@gluestack-ui/nativewind-utils'; +import { PrimitiveIcon, UIIcon } from '@gluestack-ui/icon'; + +const SCOPE = 'FORM_CONTROL'; + +const formControlStyle = tva({ + base: 'flex flex-col', + variants: { + size: { + sm: '', + md: '', + lg: '', + }, + }, +}); + +const formControlErrorIconStyle = tva({ + base: 'text-error-700 fill-none', + variants: { + size: { + '2xs': 'h-3 w-3', + 'xs': 'h-3.5 w-3.5', + 'sm': 'h-4 w-4', + 'md': 'h-[18px] w-[18px]', + 'lg': 'h-5 w-5', + 'xl': 'h-6 w-6', + }, + }, +}); + +const formControlErrorStyle = tva({ + base: 'flex flex-row justify-start items-center mt-1 gap-1', +}); + +const formControlErrorTextStyle = tva({ + base: 'text-error-700', + variants: { + isTruncated: { + true: 'web:truncate', + }, + bold: { + true: 'font-bold', + }, + underline: { + true: 'underline', + }, + strikeThrough: { + true: 'line-through', + }, + size: { + '2xs': 'text-2xs', + 'xs': 'text-xs', + 'sm': 'text-sm', + 'md': 'text-base', + 'lg': 'text-lg', + 'xl': 'text-xl', + '2xl': 'text-2xl', + '3xl': 'text-3xl', + '4xl': 'text-4xl', + '5xl': 'text-5xl', + '6xl': 'text-6xl', + }, + sub: { + true: 'text-xs', + }, + italic: { + true: 'italic', + }, + highlight: { + true: 'bg-yellow-500', + }, + }, +}); + +const formControlHelperStyle = tva({ + base: 'flex flex-row justify-start items-center mt-1', +}); + +const formControlHelperTextStyle = tva({ + base: 'text-typography-500', + variants: { + isTruncated: { + true: 'web:truncate', + }, + bold: { + true: 'font-bold', + }, + underline: { + true: 'underline', + }, + strikeThrough: { + true: 'line-through', + }, + size: { + '2xs': 'text-2xs', + 'xs': 'text-xs', + 'sm': 'text-xs', + 'md': 'text-sm', + 'lg': 'text-base', + 'xl': 'text-xl', + '2xl': 'text-2xl', + '3xl': 'text-3xl', + '4xl': 'text-4xl', + '5xl': 'text-5xl', + '6xl': 'text-6xl', + }, + sub: { + true: 'text-xs', + }, + italic: { + true: 'italic', + }, + highlight: { + true: 'bg-yellow-500', + }, + }, +}); + +const formControlLabelStyle = tva({ + base: 'flex flex-row justify-start items-center mb-1', +}); + +const formControlLabelTextStyle = tva({ + base: 'font-medium text-typography-900', + variants: { + isTruncated: { + true: 'web:truncate', + }, + bold: { + true: 'font-bold', + }, + underline: { + true: 'underline', + }, + strikeThrough: { + true: 'line-through', + }, + size: { + '2xs': 'text-2xs', + 'xs': 'text-xs', + 'sm': 'text-sm', + 'md': 'text-base', + 'lg': 'text-lg', + 'xl': 'text-xl', + '2xl': 'text-2xl', + '3xl': 'text-3xl', + '4xl': 'text-4xl', + '5xl': 'text-5xl', + '6xl': 'text-6xl', + }, + sub: { + true: 'text-xs', + }, + italic: { + true: 'italic', + }, + highlight: { + true: 'bg-yellow-500', + }, + }, +}); + +const formControlLabelAstrickStyle = tva({ + base: 'font-medium text-typography-900', + variants: { + isTruncated: { + true: 'web:truncate', + }, + bold: { + true: 'font-bold', + }, + underline: { + true: 'underline', + }, + strikeThrough: { + true: 'line-through', + }, + size: { + '2xs': 'text-2xs', + 'xs': 'text-xs', + 'sm': 'text-sm', + 'md': 'text-base', + 'lg': 'text-lg', + 'xl': 'text-xl', + '2xl': 'text-2xl', + '3xl': 'text-3xl', + '4xl': 'text-4xl', + '5xl': 'text-5xl', + '6xl': 'text-6xl', + }, + sub: { + true: 'text-xs', + }, + italic: { + true: 'italic', + }, + highlight: { + true: 'bg-yellow-500', + }, + }, +}); + +type IFormControlLabelAstrickProps = React.ComponentPropsWithoutRef< + typeof Text +> & + VariantProps; + +const FormControlLabelAstrick = React.forwardRef< + React.ElementRef, + IFormControlLabelAstrickProps +>(({ className, ...props }, ref) => { + const { size: parentSize } = useStyleContext(SCOPE); + + return ( + + ); +}); + +export const UIFormControl = createFormControl({ + Root: withStyleContext(View, SCOPE), + Error: View, + ErrorText: Text, + ErrorIcon: UIIcon, + Label: View, + LabelText: Text, + LabelAstrick: FormControlLabelAstrick, + Helper: View, + HelperText: Text, +}); + +cssInterop(PrimitiveIcon, { + className: { + target: 'style', + nativeStyleToProp: { + height: true, + width: true, + fill: true, + color: true, + stroke: true, + }, + }, +}); + +type IFormControlProps = React.ComponentProps & + VariantProps; + +const FormControl = React.forwardRef< + React.ElementRef, + IFormControlProps +>(({ className, size = 'md', ...props }, ref) => { + return ( + + ); +}); + +type IFormControlErrorProps = React.ComponentProps & + VariantProps; + +const FormControlError = React.forwardRef< + React.ElementRef, + IFormControlErrorProps +>(({ className, ...props }, ref) => { + return ( + + ); +}); + +type IFormControlErrorTextProps = React.ComponentProps< + typeof UIFormControl.Error.Text +> & + VariantProps; + +const FormControlErrorText = React.forwardRef< + React.ElementRef, + IFormControlErrorTextProps +>(({ className, size, ...props }, ref) => { + const { size: parentSize } = useStyleContext(SCOPE); + return ( + + ); +}); + +type IFormControlErrorIconProps = React.ComponentProps< + typeof UIFormControl.Error.Icon +> & + VariantProps & { + height?: number; + width?: number; + }; + +const FormControlErrorIcon = React.forwardRef< + React.ElementRef, + IFormControlErrorIconProps +>(({ className, size, ...props }, ref) => { + const { size: parentSize } = useStyleContext(SCOPE); + + if (typeof size === 'number') { + return ( + + ); + } else if ( + (props.height !== undefined || props.width !== undefined) && + size === undefined + ) { + return ( + + ); + } + return ( + + ); +}); + +type IFormControlLabelProps = React.ComponentProps & + VariantProps; + +const FormControlLabel = React.forwardRef< + React.ElementRef, + IFormControlLabelProps +>(({ className, ...props }, ref) => { + return ( + + ); +}); + +type IFormControlLabelTextProps = React.ComponentProps< + typeof UIFormControl.Label.Text +> & + VariantProps; + +const FormControlLabelText = React.forwardRef< + React.ElementRef, + IFormControlLabelTextProps +>(({ className, size, ...props }, ref) => { + const { size: parentSize } = useStyleContext(SCOPE); + + return ( + + ); +}); + +type IFormControlHelperProps = React.ComponentProps< + typeof UIFormControl.Helper +> & + VariantProps; + +const FormControlHelper = React.forwardRef< + React.ElementRef, + IFormControlHelperProps +>(({ className, ...props }, ref) => { + return ( + + ); +}); + +type IFormControlHelperTextProps = React.ComponentProps< + typeof UIFormControl.Helper.Text +> & + VariantProps; + +const FormControlHelperText = React.forwardRef< + React.ElementRef, + IFormControlHelperTextProps +>(({ className, size, ...props }, ref) => { + const { size: parentSize } = useStyleContext(SCOPE); + + return ( + + ); +}); + +FormControl.displayName = 'FormControl'; +FormControlError.displayName = 'FormControlError'; +FormControlErrorText.displayName = 'FormControlErrorText'; +FormControlErrorIcon.displayName = 'FormControlErrorIcon'; +FormControlLabel.displayName = 'FormControlLabel'; +FormControlLabelText.displayName = 'FormControlLabelText'; +FormControlLabelAstrick.displayName = 'FormControlLabelAstrick'; +FormControlHelper.displayName = 'FormControlHelper'; +FormControlHelperText.displayName = 'FormControlHelperText'; + +export { + FormControl, + FormControlError, + FormControlErrorText, + FormControlErrorIcon, + FormControlLabel, + FormControlLabelText, + FormControlLabelAstrick, + FormControlHelper, + FormControlHelperText, +}; diff --git a/app/components/ui/heading/index.tsx b/app/components/ui/heading/index.tsx new file mode 100644 index 0000000..be876d4 --- /dev/null +++ b/app/components/ui/heading/index.tsx @@ -0,0 +1,219 @@ +import React, { forwardRef, memo } from 'react'; +import { H1, H2, H3, H4, H5, H6 } from '@expo/html-elements'; +import { headingStyle } from './styles'; +import type { VariantProps } from '@gluestack-ui/nativewind-utils'; +import { cssInterop } from 'nativewind'; + +type IHeadingProps = VariantProps & + React.ComponentPropsWithoutRef & { + as?: React.ElementType; + }; + +cssInterop(H1, { className: 'style' }); +cssInterop(H2, { className: 'style' }); +cssInterop(H3, { className: 'style' }); +cssInterop(H4, { className: 'style' }); +cssInterop(H5, { className: 'style' }); +cssInterop(H6, { className: 'style' }); + +const MappedHeading = memo( + forwardRef, IHeadingProps>( + ( + { + size, + className, + isTruncated, + bold, + underline, + strikeThrough, + sub, + italic, + highlight, + ...props + }, + ref + ) => { + switch (size) { + case '5xl': + case '4xl': + case '3xl': + return ( +

+ ); + case '2xl': + return ( +

+ ); + case 'xl': + return ( +

+ ); + case 'lg': + return ( +

+ ); + case 'md': + return ( +

+ ); + case 'sm': + case 'xs': + return ( +
+ ); + default: + return ( +

+ ); + } + } + ) +); + +const Heading = memo( + forwardRef, IHeadingProps>( + ({ className, size = 'lg', as: AsComp, ...props }, ref) => { + const { + isTruncated, + bold, + underline, + strikeThrough, + sub, + italic, + highlight, + } = props; + + if (AsComp) { + return ( + + ); + } + + return ( + + ); + } + ) +); + +Heading.displayName = 'Heading'; + +export { Heading }; diff --git a/app/components/ui/heading/index.web.tsx b/app/components/ui/heading/index.web.tsx new file mode 100644 index 0000000..2806c70 --- /dev/null +++ b/app/components/ui/heading/index.web.tsx @@ -0,0 +1,203 @@ +import React, { forwardRef, memo } from 'react'; +import { headingStyle } from './styles'; +import type { VariantProps } from '@gluestack-ui/nativewind-utils'; +type IHeadingProps = VariantProps & + React.ComponentPropsWithoutRef<'h1'> & { + as?: React.ElementType; + }; + +const MappedHeading = memo( + forwardRef( + ( + { + size, + className, + isTruncated, + bold, + underline, + strikeThrough, + sub, + italic, + highlight, + ...props + }, + ref + ) => { + switch (size) { + case '5xl': + case '4xl': + case '3xl': + return ( +

+ ); + case '2xl': + return ( +

+ ); + case 'xl': + return ( +

+ ); + case 'lg': + return ( +

+ ); + case 'md': + return ( +

+ ); + case 'sm': + case 'xs': + return ( +
+ ); + default: + return ( +

+ ); + } + } + ) +); + +const Heading = memo( + forwardRef( + ({ className, size = 'lg', as: AsComp, ...props }, ref) => { + const { + isTruncated, + bold, + underline, + strikeThrough, + sub, + italic, + highlight, + } = props; + + if (AsComp) { + return ( + + ); + } + + return ( + + ); + } + ) +); + +Heading.displayName = 'Heading'; + +export { Heading }; diff --git a/app/components/ui/heading/styles.tsx b/app/components/ui/heading/styles.tsx new file mode 100644 index 0000000..e695159 --- /dev/null +++ b/app/components/ui/heading/styles.tsx @@ -0,0 +1,43 @@ +import { tva } from "@gluestack-ui/nativewind-utils/tva"; +import { isWeb } from "@gluestack-ui/nativewind-utils/IsWeb"; +const baseStyle = isWeb + ? "font-sans tracking-sm bg-transparent border-0 box-border display-inline list-none margin-0 padding-0 position-relative text-start no-underline whitespace-pre-wrap word-wrap-break-word" + : ""; + +export const headingStyle = tva({ + base: `text-typography-900 font-bold font-heading tracking-sm my-0 ${baseStyle}`, + variants: { + isTruncated: { + true: "truncate", + }, + bold: { + true: "font-bold", + }, + underline: { + true: "underline", + }, + strikeThrough: { + true: "line-through", + }, + sub: { + true: "text-xs", + }, + italic: { + true: "italic", + }, + highlight: { + true: "bg-yellow-500", + }, + size: { + "5xl": "text-6xl", + "4xl": "text-5xl", + "3xl": "text-4xl", + "2xl": "text-3xl", + xl: "text-2xl", + lg: "text-xl", + md: "text-lg", + sm: "text-base", + xs: "text-sm", + }, + }, +}); diff --git a/app/components/ui/input/index.tsx b/app/components/ui/input/index.tsx new file mode 100644 index 0000000..ed6ee27 --- /dev/null +++ b/app/components/ui/input/index.tsx @@ -0,0 +1,214 @@ +"use client"; +import React from "react"; +import { createInput } from "@gluestack-ui/input"; +import { View, Pressable, TextInput } from "react-native"; +import { tva } from "@gluestack-ui/nativewind-utils/tva"; +import { + withStyleContext, + useStyleContext, +} from "@gluestack-ui/nativewind-utils/withStyleContext"; +import { cssInterop } from "nativewind"; +import type { VariantProps } from "@gluestack-ui/nativewind-utils"; +import { PrimitiveIcon, UIIcon } from "@gluestack-ui/icon"; + +const SCOPE = "INPUT"; + +const UIInput = createInput({ + Root: withStyleContext(View, SCOPE), + Icon: UIIcon, + Slot: Pressable, + Input: TextInput, +}); + +cssInterop(PrimitiveIcon, { + className: { + target: "style", + nativeStyleToProp: { + height: true, + width: true, + fill: true, + color: "classNameColor", + stroke: true, + }, + }, +}); + +const inputStyle = tva({ + base: "border-background-300 flex-row overflow-hidden content-center data-[hover=true]:border-outline-400 data-[focus=true]:border-orange-400 data-[focus=true]:hover:border-primary-700 data-[disabled=true]:opacity-40 data-[disabled=true]:hover:border-background-300 items-center", + + variants: { + size: { + xl: "px-4 h-16", + lg: "px-4 h-11", + md: "px-4 h-10", + sm: "px-4 h-9", + }, + + variant: { + underlined: + "rounded-none border-b data-[invalid=true]:border-b-2 data-[invalid=true]:border-error-700 data-[invalid=true]:hover:border-error-700 data-[invalid=true]:data-[focus=true]:border-error-700 data-[invalid=true]:data-[focus=true]:hover:border-error-700 data-[invalid=true]:data-[disabled=true]:hover:border-error-700", + + outline: + "rounded-3xl border data-[invalid=true]:border-error-700 data-[invalid=true]:hover:border-error-700 data-[invalid=true]:data-[focus=true]:border-error-700 data-[invalid=true]:data-[focus=true]:hover:border-error-700 data-[invalid=true]:data-[disabled=true]:hover:border-error-700 data-[focus=true]:web:ring-1 data-[focus=true]:web:ring-inset data-[focus=true]:web:ring-indicator-primary data-[invalid=true]:web:ring-1 data-[invalid=true]:web:ring-inset data-[invalid=true]:web:ring-indicator-error data-[invalid=true]:data-[focus=true]:hover:web:ring-1 data-[invalid=true]:data-[focus=true]:hover:web:ring-inset data-[invalid=true]:data-[focus=true]:hover:web:ring-indicator-error data-[invalid=true]:data-[disabled=true]:hover:web:ring-1 data-[invalid=true]:data-[disabled=true]:hover:web:ring-inset data-[invalid=true]:data-[disabled=true]:hover:web:ring-indicator-error", + + rounded: + "rounded-full border data-[invalid=true]:border-error-700 data-[invalid=true]:hover:border-error-700 data-[invalid=true]:data-[focus=true]:border-error-700 data-[invalid=true]:data-[focus=true]:hover:border-error-700 data-[invalid=true]:data-[disabled=true]:hover:border-error-700 data-[focus=true]:web:ring-1 data-[focus=true]:web:ring-inset data-[focus=true]:web:ring-indicator-primary data-[invalid=true]:web:ring-1 data-[invalid=true]:web:ring-inset data-[invalid=true]:web:ring-indicator-error data-[invalid=true]:data-[focus=true]:hover:web:ring-1 data-[invalid=true]:data-[focus=true]:hover:web:ring-inset data-[invalid=true]:data-[focus=true]:hover:web:ring-indicator-error data-[invalid=true]:data-[disabled=true]:hover:web:ring-1 data-[invalid=true]:data-[disabled=true]:hover:web:ring-inset data-[invalid=true]:data-[disabled=true]:hover:web:ring-indicator-error", + }, + }, +}); + +const inputIconStyle = tva({ + base: "justify-center items-center text-typography-400 fill-none", + parentVariants: { + size: { + "2xs": "h-3 w-3", + xs: "h-3.5 w-3.5", + sm: "h-4 w-4", + md: "h-[18px] w-[18px]", + lg: "h-5 w-5", + xl: "h-6 w-6", + }, + }, +}); + +const inputSlotStyle = tva({ + base: "justify-center items-center web:disabled:cursor-not-allowed", +}); + +const inputFieldStyle = tva({ + base: "flex-1 text-typography-900 py-0 px-3 placeholder:text-typography-500 h-full ios:leading-[0px] web:cursor-text web:data-[disabled=true]:cursor-not-allowed", + + parentVariants: { + variant: { + underlined: "web:outline-0 web:outline-none px-0", + outline: "web:outline-0 web:outline-none", + rounded: "web:outline-0 web:outline-none px-4", + }, + + size: { + "2xs": "text-2xs", + xs: "text-xs", + sm: "text-sm", + md: "text-base", + lg: "text-lg", + xl: "text-xl", + "2xl": "text-2xl", + "3xl": "text-3xl", + "4xl": "text-4xl", + "5xl": "text-5xl", + "6xl": "text-6xl", + }, + }, +}); + +type IInputProps = React.ComponentProps & + VariantProps & { className?: string }; +const Input = React.forwardRef, IInputProps>( + ({ className, variant = "outline", size = "md", ...props }, ref) => { + return ( + + ); + } +); + +type IInputIconProps = React.ComponentProps & + VariantProps & { + className?: string; + height?: number; + width?: number; + }; + +const InputIcon = React.forwardRef< + React.ElementRef, + IInputIconProps +>(({ className, size, ...props }, ref) => { + const { size: parentSize } = useStyleContext(SCOPE); + + if (typeof size === "number") { + return ( + + ); + } else if ( + (props.height !== undefined || props.width !== undefined) && + size === undefined + ) { + return ( + + ); + } + return ( + + ); +}); + +type IInputSlotProps = React.ComponentProps & + VariantProps & { className?: string }; + +const InputSlot = React.forwardRef< + React.ElementRef, + IInputSlotProps +>(({ className, ...props }, ref) => { + return ( + + ); +}); + +type IInputFieldProps = React.ComponentProps & + VariantProps & { className?: string }; + +const InputField = React.forwardRef< + React.ElementRef, + IInputFieldProps +>(({ className, ...props }, ref) => { + const { variant: parentVariant, size: parentSize } = useStyleContext(SCOPE); + + return ( + + ); +}); + +Input.displayName = "Input"; +InputIcon.displayName = "InputIcon"; +InputSlot.displayName = "InputSlot"; +InputField.displayName = "InputField"; + +export { Input, InputField, InputIcon, InputSlot }; diff --git a/app/components/ui/link/index.tsx b/app/components/ui/link/index.tsx new file mode 100644 index 0000000..635b23c --- /dev/null +++ b/app/components/ui/link/index.tsx @@ -0,0 +1,102 @@ +"use client"; +import { createLink } from "@gluestack-ui/link"; +import { Pressable } from "react-native"; +import { Text } from "react-native"; + +import { tva } from "@gluestack-ui/nativewind-utils/tva"; +import { withStyleContext } from "@gluestack-ui/nativewind-utils/withStyleContext"; +import { cssInterop } from "nativewind"; +import type { VariantProps } from "@gluestack-ui/nativewind-utils"; + +import React from "react"; +export const UILink = createLink({ + Root: withStyleContext(Pressable), + Text: Text, +}); + +cssInterop(UILink, { className: "style" }); +cssInterop(UILink.Text, { className: "style" }); + +const linkStyle = tva({ + base: "group/link web:outline-0 data-[disabled=true]:web:cursor-not-allowed data-[focus-visible=true]:web:ring-2 data-[focus-visible=true]:web:ring-indicator-primary data-[focus-visible=true]:web:outline-0 data-[disabled=true]:opacity-4 ", +}); + +const linkTextStyle = tva({ + base: "underline text-orange-400 data-[hover=true]:text-orange-400 data-[hover=true]:no-underline data-[active=true]:text-orange-400 font-normal font-body web:font-sans web:tracking-sm web:my-0 web:bg-transparent web:border-0 web:box-border web:display-inline web:list-none web:margin-0 web:padding-0 web:position-relative web:text-start web:whitespace-pre-wrap web:word-wrap-break-word", + + variants: { + isTruncated: { + true: "web:truncate", + }, + bold: { + true: "font-bold", + }, + underline: { + true: "underline", + }, + strikeThrough: { + true: "line-through", + }, + size: { + "2xs": "text-2xs", + xs: "text-xs", + sm: "text-sm", + md: "text-base", + lg: "text-lg", + xl: "text-xl", + "2xl": "text-2xl", + "3xl": "text-3xl", + "4xl": "text-4xl", + "5xl": "text-5xl", + "6xl": "text-6xl", + }, + sub: { + true: "text-xs", + }, + italic: { + true: "italic", + }, + highlight: { + true: "bg-yellow-500", + }, + }, +}); + +type ILinkProps = React.ComponentProps & + VariantProps & { className?: string }; + +const Link = React.forwardRef, ILinkProps>( + ({ className, ...props }, ref) => { + return ( + + ); + } +); + +type ILinkTextProps = React.ComponentProps & + VariantProps & { className?: string }; + +const LinkText = React.forwardRef< + React.ElementRef, + ILinkTextProps +>(({ className, size = "md", ...props }, ref) => { + return ( + + ); +}); + +Link.displayName = "Link"; +LinkText.displayName = "LinkText"; + +export { Link, LinkText }; diff --git a/app/index.tsx b/app/index.tsx index 92ad8e8..7e0c92c 100644 --- a/app/index.tsx +++ b/app/index.tsx @@ -1,21 +1,12 @@ -import {SafeAreaView, Text, View} from "react-native"; -import Navigation from "@/src/navigation/navigation"; -import HomeScreen from "@/app/HomeScreen"; +import { SafeAreaView, View } from "react-native"; +import LoginPage from "./LoginPage"; export default function Index() { return ( - + + + ); } - - -function App() { - return ( - - - - - ); -} \ No newline at end of file diff --git a/assets/images/icon.png b/assets/images/icon.png index a0b1526..53fd2f6 100644 Binary files a/assets/images/icon.png and b/assets/images/icon.png differ diff --git a/assets/images/partial-react-logo.png b/assets/images/partial-react-logo.png deleted file mode 100644 index 66fd957..0000000 Binary files a/assets/images/partial-react-logo.png and /dev/null differ diff --git a/assets/images/react-logo.png b/assets/images/react-logo.png deleted file mode 100644 index 9d72a9f..0000000 Binary files a/assets/images/react-logo.png and /dev/null differ diff --git a/assets/images/react-logo@2x.png b/assets/images/react-logo@2x.png deleted file mode 100644 index 2229b13..0000000 Binary files a/assets/images/react-logo@2x.png and /dev/null differ diff --git a/assets/images/react-logo@3x.png b/assets/images/react-logo@3x.png deleted file mode 100644 index a99b203..0000000 Binary files a/assets/images/react-logo@3x.png and /dev/null differ diff --git a/assets/svg/Muscle.tsx b/assets/svg/Muscle.tsx new file mode 100644 index 0000000..25b7e8f --- /dev/null +++ b/assets/svg/Muscle.tsx @@ -0,0 +1,8 @@ +import * as React from "react"; +import Svg, { Path, SvgProps } from "react-native-svg"; +const Muscle = (props: SvgProps) => ( + + + +); +export default Muscle; diff --git a/package-lock.json b/package-lock.json index 100ddab..9d91d59 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,11 +8,15 @@ "name": "optifit", "version": "1.0.0", "dependencies": { + "@expo/html-elements": "^0.4.2", "@expo/vector-icons": "^14.0.2", "@gluestack-ui/avatar": "^0.1.18", "@gluestack-ui/button": "^1.0.8", "@gluestack-ui/checkbox": "^0.1.33", + "@gluestack-ui/form-control": "^0.1.19", "@gluestack-ui/icon": "^0.1.25", + "@gluestack-ui/input": "^0.1.32", + "@gluestack-ui/link": "^0.1.23", "@gluestack-ui/nativewind-utils": "^1.0.26", "@gluestack-ui/overlay": "^0.1.16", "@gluestack-ui/toast": "^1.0.8", @@ -20,40 +24,43 @@ "@react-navigation/native": "^7.0.14", "@react-navigation/native-stack": "^7.2.0", "@react-navigation/stack": "^7.1.1", - "expo": "~52.0.24", - "expo-blur": "~14.0.1", - "expo-constants": "~17.0.3", - "expo-font": "~13.0.2", - "expo-haptics": "~14.0.0", - "expo-linking": "~7.0.3", + "expo": "^52.0.24", + "expo-asset": "^11.0.2", + "expo-blur": "^14.0.1", + "expo-constants": "^17.0.3", + "expo-font": "^13.0.2", + "expo-haptics": "^14.0.0", + "expo-linking": "^7.0.3", "expo-router": "~4.0.16", - "expo-splash-screen": "~0.29.19", - "expo-status-bar": "~2.0.0", - "expo-symbols": "~0.2.0", - "expo-system-ui": "~4.0.6", - "expo-web-browser": "~14.0.1", + "expo-splash-screen": "^0.29.19", + "expo-status-bar": "^2.0.0", + "expo-symbols": "^0.2.0", + "expo-system-ui": "^4.0.6", + "expo-web-browser": "^14.0.1", "nativewind": "^4.1.23", "react": "18.3.1", "react-dom": "18.3.1", - "react-native": "0.76.5", - "react-native-gesture-handler": "~2.20.2", - "react-native-reanimated": "~3.16.1", - "react-native-safe-area-context": "^4.14.1", - "react-native-screens": "~4.4.0", - "react-native-svg": "^15.11.0", + "react-native": "0.76.6", + "react-native-gesture-handler": "^2.20.2", + "react-native-reanimated": "^3.16.1", + "react-native-safe-area-context": "^4.12.0", + "react-native-screens": "^4.4.0", + "react-native-svg": "^15.8.0", "react-native-vector-icons": "^10.2.0", - "react-native-web": "~0.19.13", + "react-native-web": "^0.19.13", "react-native-webview": "13.12.5", "tailwindcss": "^3.4.17" }, "devDependencies": { "@babel/core": "^7.25.2", "@types/jest": "^29.5.12", - "@types/react": "~18.3.12", - "@types/react-test-renderer": "^18.3.0", + "@types/react": "^18.3.12", + "@types/react-test-renderer": "^19.0.0", + "@types/validator": "^13.12.2", "jest": "^29.2.1", - "jest-expo": "~52.0.2", - "react-test-renderer": "18.3.1", + "jest-expo": "^52.0.2", + "react-native-svg-transformer": "^1.5.0", + "react-test-renderer": "19.0.0", "typescript": "^5.3.3" } }, @@ -111,9 +118,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", - "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", + "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -150,13 +157,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", + "@babel/parser": "^7.26.5", + "@babel/types": "^7.26.5", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -178,12 +185,12 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.9", + "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -303,9 +310,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -329,14 +336,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", - "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", + "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", "license": "MIT", "dependencies": { "@babel/helper-member-expression-to-functions": "^7.25.9", "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/traverse": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -499,12 +506,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz", + "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", "license": "MIT", "dependencies": { - "@babel/types": "^7.26.3" + "@babel/types": "^7.26.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -1023,13 +1030,13 @@ } }, "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.9.tgz", - "integrity": "sha512-/VVukELzPDdci7UUsWQaSkhgnjIWXnIyRpM02ldxaVoFK96c41So8JcKT3m0gYjyv7j5FNPGS5vfELrWalkbDA==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.26.5.tgz", + "integrity": "sha512-eGK26RsbIkYUns3Y8qKl362juDDYK+wEdPGHGrhzUl6CewZFo55VZ7hg+CyMFU4dd5QQakBN86nBMpRsFpRvbQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-syntax-flow": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/plugin-syntax-flow": "^7.26.0" }, "engines": { "node": ">=6.9.0" @@ -1134,12 +1141,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", - "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.5.tgz", + "integrity": "sha512-OHqczNm4NTQlW1ghrVY43FPoiRzbmzNVbcgVnMKZN/RQYezHUSdjACjaX50CD3B7UIAjv39+MlsrVDb3v741FA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -1452,14 +1459,14 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.3.tgz", - "integrity": "sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.5.tgz", + "integrity": "sha512-GJhPO0y8SD5EYVCy2Zr+9dSZcEgaSmq5BLR0Oc25TOEhC+ba49vUAGZFjy8v79z9E1mdldq4x9d1xgh4L1d5dQ==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", "@babel/plugin-syntax-typescript": "^7.25.9" }, @@ -1574,6 +1581,15 @@ "node": ">=6" } }, + "node_modules/@babel/register/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/@babel/register/node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", @@ -1610,16 +1626,16 @@ } }, "node_modules/@babel/traverse": { - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz", + "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.5", "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", + "@babel/types": "^7.26.5", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1629,16 +1645,16 @@ }, "node_modules/@babel/traverse--for-generate-function-map": { "name": "@babel/traverse", - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz", + "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.5", "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", + "@babel/types": "^7.26.5", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1647,9 +1663,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz", + "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.9", @@ -1691,29 +1707,29 @@ } }, "node_modules/@expo/cli": { - "version": "0.22.8", - "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.22.8.tgz", - "integrity": "sha512-MpHrfPKcHL+b1wwx+WiniEL5n33tl964tN8EW1K4okW3/tAPgbu3R00NZs6OExH9PZGQP8OKhCXhZttbK2jUnA==", + "version": "0.22.9", + "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.22.9.tgz", + "integrity": "sha512-GFW1+InbgTz0+10qWfoo5fyBU2DhhPuJkL4TUnG7GTq8lDlim88JLghJVbq0uAX/xDLcd326QnI0XONsUGSWrw==", "license": "MIT", "dependencies": { "@0no-co/graphql.web": "^1.0.8", "@babel/runtime": "^7.20.0", "@expo/code-signing-certificates": "^0.0.5", - "@expo/config": "~10.0.7", - "@expo/config-plugins": "~9.0.13", + "@expo/config": "~10.0.8", + "@expo/config-plugins": "~9.0.14", "@expo/devcert": "^1.1.2", - "@expo/env": "~0.4.0", - "@expo/image-utils": "^0.6.0", - "@expo/json-file": "^9.0.0", - "@expo/metro-config": "~0.19.8", - "@expo/osascript": "^2.0.31", - "@expo/package-manager": "^1.7.0", - "@expo/plist": "^0.2.0", - "@expo/prebuild-config": "^8.0.24", + "@expo/env": "~0.4.1", + "@expo/image-utils": "^0.6.4", + "@expo/json-file": "^9.0.1", + "@expo/metro-config": "~0.19.9", + "@expo/osascript": "^2.1.5", + "@expo/package-manager": "^1.7.1", + "@expo/plist": "^0.2.1", + "@expo/prebuild-config": "^8.0.25", "@expo/rudder-sdk-node": "^1.1.1", "@expo/spawn-async": "^1.7.2", "@expo/xcpretty": "^4.3.0", - "@react-native/dev-middleware": "0.76.5", + "@react-native/dev-middleware": "0.76.6", "@urql/core": "^5.0.6", "@urql/exchange-retry": "^1.3.0", "accepts": "^1.3.8", @@ -1795,15 +1811,15 @@ } }, "node_modules/@expo/config": { - "version": "10.0.7", - "resolved": "https://registry.npmjs.org/@expo/config/-/config-10.0.7.tgz", - "integrity": "sha512-fS9xuxH3U9tuiXofwxrmsan8TfzlDXgPiX38SDMkq/AQctmRtWllD8GNHRIk9Bdz3vODeBv7vRVGKXPBYG72cQ==", + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@expo/config/-/config-10.0.8.tgz", + "integrity": "sha512-RaKwi8e6PbkMilRexdsxObLMdQwxhY6mlgel+l/eW+IfIw8HEydSU0ERlzYUjlGJxHLHUXe4rC2vw8FEvaowyQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "~7.10.4", - "@expo/config-plugins": "~9.0.13", - "@expo/config-types": "^52.0.2", - "@expo/json-file": "^9.0.0", + "@expo/config-plugins": "~9.0.14", + "@expo/config-types": "^52.0.3", + "@expo/json-file": "^9.0.1", "deepmerge": "^4.3.1", "getenv": "^1.0.0", "glob": "^10.4.2", @@ -1816,14 +1832,14 @@ } }, "node_modules/@expo/config-plugins": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-9.0.13.tgz", - "integrity": "sha512-9mSjuMoCijA0O4JONJwWXg+xaD4tVeVv7pXWQovnQGxorgMNgygOGEzGi9GXFMki8FJ1Zlt2gyXrcPFXiId7Hw==", + "version": "9.0.14", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-9.0.14.tgz", + "integrity": "sha512-Lx1ebV95rTFKKQmbu4wMPLz65rKn7mqSpfANdCx+KwRxuLY2JQls8V4h3lQjG6dW8NWf9qV5QaEFAgNB6VMyOQ==", "license": "MIT", "dependencies": { - "@expo/config-types": "^52.0.2", - "@expo/json-file": "~9.0.0", - "@expo/plist": "^0.2.0", + "@expo/config-types": "^52.0.3", + "@expo/json-file": "~9.0.1", + "@expo/plist": "^0.2.1", "@expo/sdk-runtime-versions": "^1.0.0", "chalk": "^4.1.2", "debug": "^4.3.5", @@ -1850,9 +1866,9 @@ } }, "node_modules/@expo/config-types": { - "version": "52.0.2", - "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-52.0.2.tgz", - "integrity": "sha512-4hYwnaCxOLlXXF1TE17RY+GU1CyBqzRx7s13VUDhU1PQ8Zr9/kzGoJI0McmfayncO9RIeSqeDWO6dELZWk/0uw==", + "version": "52.0.3", + "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-52.0.3.tgz", + "integrity": "sha512-muxvuARmbysH5OGaiBRlh1Y6vfdmL56JtpXxB+y2Hfhu0ezG1U4FjZYBIacthckZPvnDCcP3xIu1R+eTo7/QFA==", "license": "MIT" }, "node_modules/@expo/config/node_modules/@babel/code-frame": { @@ -1906,9 +1922,9 @@ } }, "node_modules/@expo/env": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@expo/env/-/env-0.4.0.tgz", - "integrity": "sha512-g2JYFqck3xKIwJyK+8LxZ2ENZPWtRgjFWpeht9abnKgzXVXBeSNECFBkg+WQjQocSIdxXhEWM6hz4ZAe7Tc4ng==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@expo/env/-/env-0.4.1.tgz", + "integrity": "sha512-oDtbO3i9yXD1nx93acWiPTWGljJ3vABn35x1NAbqtQ2JL6mFOcRcArt1dwi4imZyLnG4VCcjabT9irj+LgYntw==", "license": "MIT", "dependencies": { "chalk": "^4.0.0", @@ -1919,9 +1935,9 @@ } }, "node_modules/@expo/fingerprint": { - "version": "0.11.6", - "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.11.6.tgz", - "integrity": "sha512-hlVIfMEJYZIqIFMjeGRN5GhK/h6vJ3M4QVc1ZD8F0Bh7gMeI+jZkEyZdL5XT29jergQrksP638e2qFwgrGTw/w==", + "version": "0.11.7", + "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.11.7.tgz", + "integrity": "sha512-2rfYVS4nqWmOPQk+AL5GPfPSawbqqmI5mL++bxAhWADt+d+fjoQYfIrGtjZxQ30f9o/a1PrRPVSuh2j09+diVg==", "license": "MIT", "dependencies": { "@expo/spawn-async": "^1.7.2", @@ -1951,10 +1967,16 @@ "node": ">=10" } }, + "node_modules/@expo/html-elements": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@expo/html-elements/-/html-elements-0.4.2.tgz", + "integrity": "sha512-lNioCgdtOrCMMqzHY+PCTdyuWBTU4yMBlOzPSkS4YFIWt9bq0zexM2ZJkpybTXmowNdE3zHO93xxAmiA2yDi2w==", + "license": "MIT" + }, "node_modules/@expo/image-utils": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.6.3.tgz", - "integrity": "sha512-v/JbCKBrHeudxn1gN1TgfPE/pWJSlLPrl29uXJBgrJFQVkViQvUHQNDhaS+UEa9wYI5HHh7XYmtzAehyG4L+GA==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.6.4.tgz", + "integrity": "sha512-L++1PBzSvf5iYc6UHJ8Db8GcYNkfLDw+a+zqEFBQ3xqRXP/muxb/O7wuiMFlXrj/cfkx4e0U+z1a4ceV0A7S7Q==", "license": "MIT", "dependencies": { "@expo/spawn-async": "^1.7.2", @@ -2027,9 +2049,9 @@ } }, "node_modules/@expo/json-file": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-9.0.0.tgz", - "integrity": "sha512-M+55xFVrFzDcgMDf+52lPDLjKB5xwRfStWlv/b/Vu2OLgxGZLWpxoPYjlRoHqxjPbCQIi2ZCbobK+0KuNhsELg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-9.0.1.tgz", + "integrity": "sha512-ZVPhbbEBEwafPCJ0+kI25O2Iivt3XKHEKAADCml1q2cmOIbQnKgLyn8DpOJXqWEyRQr/VWS+hflBh8DU2YFSqg==", "license": "MIT", "dependencies": { "@babel/code-frame": "~7.10.4", @@ -2047,18 +2069,18 @@ } }, "node_modules/@expo/metro-config": { - "version": "0.19.8", - "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-0.19.8.tgz", - "integrity": "sha512-dVAOetouQYuOTEJ2zR0OTLNPOH6zPkeEt5fY53TK0Wxi1QmtsmH6vEWg05U4zkSJ6f1aXmQ0Za77R8QxuukESA==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-0.19.9.tgz", + "integrity": "sha512-JAsLWhFQqwLH0KsI4OMbPXsKFji5KJEmsi+/02Sz1GCT17YrjRmv1fZ91regUS/FUH2Y/PDAE/+2ulrTgMeG7A==", "license": "MIT", "dependencies": { "@babel/core": "^7.20.0", "@babel/generator": "^7.20.5", "@babel/parser": "^7.20.0", "@babel/types": "^7.20.0", - "@expo/config": "~10.0.4", - "@expo/env": "~0.4.0", - "@expo/json-file": "~9.0.0", + "@expo/config": "~10.0.8", + "@expo/env": "~0.4.1", + "@expo/json-file": "~9.0.1", "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", "debug": "^4.3.2", @@ -2118,9 +2140,9 @@ } }, "node_modules/@expo/osascript": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.1.4.tgz", - "integrity": "sha512-LcPjxJ5FOFpqPORm+5MRLV0CuYWMthJYV6eerF+lQVXKlvgSn3EOqaHC3Vf3H+vmB0f6G4kdvvFtg40vG4bIhA==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.1.5.tgz", + "integrity": "sha512-Cp7YF7msGiTAIbFdzNovwHBfecdMLVL5XzSqq4xQz72ALFCQ3uSIUXRph1QV2r61ugH7Yem0gY8yi7RcDlI4qg==", "license": "MIT", "dependencies": { "@expo/spawn-async": "^1.7.2", @@ -2131,12 +2153,12 @@ } }, "node_modules/@expo/package-manager": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.7.0.tgz", - "integrity": "sha512-yWn5TIjd42wLHZjNtdZkvCkcxqUGxlI4YHb+bQmgm3tWZ8aBHnLhPb0rgU8+hVHCofmRvVUXfVZv8Uh+kkLXgw==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.7.1.tgz", + "integrity": "sha512-DKbELrTOdl7U3KT0C07Aka9P+sUP3LL+1UTKf1KmLx2x2gPH1IC+c68N7iQlwNt+yA37qIw6/vKoqyTGu5EL9g==", "license": "MIT", "dependencies": { - "@expo/json-file": "^9.0.0", + "@expo/json-file": "^9.0.1", "@expo/spawn-async": "^1.7.2", "ansi-regex": "^5.0.0", "chalk": "^4.0.0", @@ -2158,9 +2180,9 @@ "license": "MIT" }, "node_modules/@expo/plist": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.2.0.tgz", - "integrity": "sha512-F/IZJQaf8OIVnVA6XWUeMPC3OH6MV00Wxf0WC0JhTQht2QgjyHUa3U5Gs3vRtDq8tXNsZneOQRDVwpaOnd4zTQ==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.2.1.tgz", + "integrity": "sha512-9TaXGuNxa0LQwHQn4rYiU6YaERv6dPnQgsdKWq2rKKTr6LWOtGNQCi/yOk/HBLeZSxBm59APT5/6x60uRvr0Mg==", "license": "MIT", "dependencies": { "@xmldom/xmldom": "~0.7.7", @@ -2169,17 +2191,17 @@ } }, "node_modules/@expo/prebuild-config": { - "version": "8.0.24", - "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-8.0.24.tgz", - "integrity": "sha512-zxbKW+oHn0/QwKaShjbxD7tv+5WtK2+C5ZJTHztyXJXrBP6BOL5dK4lP2djQVzpHYU1p6ZzKFvp9d1bW/+S32Q==", + "version": "8.0.25", + "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-8.0.25.tgz", + "integrity": "sha512-xYHV8eiydZEDedf2AGaOFRFwcGlaSzrqQH94dwX42urNCU03FO0RUb7yPp4nkb7WNFg5Ov6PDsV7ES+YwzNgYQ==", "license": "MIT", "dependencies": { - "@expo/config": "~10.0.7", - "@expo/config-plugins": "~9.0.13", - "@expo/config-types": "^52.0.2", - "@expo/image-utils": "^0.6.0", - "@expo/json-file": "^9.0.0", - "@react-native/normalize-colors": "0.76.5", + "@expo/config": "~10.0.8", + "@expo/config-plugins": "~9.0.14", + "@expo/config-types": "^52.0.3", + "@expo/image-utils": "^0.6.4", + "@expo/json-file": "^9.0.1", + "@react-native/normalize-colors": "0.76.6", "debug": "^4.3.1", "fs-extra": "^9.0.0", "resolve-from": "^5.0.0", @@ -2466,6 +2488,35 @@ "react-dom": ">=16" } }, + "node_modules/@gluestack-ui/input": { + "version": "0.1.32", + "resolved": "https://registry.npmjs.org/@gluestack-ui/input/-/input-0.1.32.tgz", + "integrity": "sha512-RWtqpo0p37GYjwBTiMf4fpvKYe32OMa6lxFbDqPqEX1m994D9QwP7iWnDWA/9nr/Mf3eET6dMWbH4/eL4oZr8Q==", + "dependencies": { + "@gluestack-ui/form-control": "^0.1.19", + "@gluestack-ui/utils": "^0.1.14", + "@react-native-aria/focus": "^0.2.9", + "@react-native-aria/interactions": "0.2.13" + }, + "peerDependencies": { + "react": ">=16", + "react-dom": ">=16" + } + }, + "node_modules/@gluestack-ui/link": { + "version": "0.1.23", + "resolved": "https://registry.npmjs.org/@gluestack-ui/link/-/link-0.1.23.tgz", + "integrity": "sha512-j/YIdlq6V+Ad8c6X1EVL4jUI/Zo/L9S6WLZYPKNArlidRxjEME7d2maIl2O20ZcRSOHvee2VAf7HHNem+Jn+AA==", + "dependencies": { + "@gluestack-ui/utils": "^0.1.14", + "@react-native-aria/focus": "^0.2.9", + "@react-native-aria/interactions": "0.2.13" + }, + "peerDependencies": { + "react": ">=16", + "react-dom": ">=16" + } + }, "node_modules/@gluestack-ui/nativewind-utils": { "version": "1.0.26", "resolved": "https://registry.npmjs.org/@gluestack-ui/nativewind-utils/-/nativewind-utils-1.0.26.tgz", @@ -3516,30 +3567,30 @@ } }, "node_modules/@react-native/assets-registry": { - "version": "0.76.5", - "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.76.5.tgz", - "integrity": "sha512-MN5dasWo37MirVcKWuysRkRr4BjNc81SXwUtJYstwbn8oEkfnwR9DaqdDTo/hHOnTdhafffLIa2xOOHcjDIGEw==", + "version": "0.76.6", + "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.76.6.tgz", + "integrity": "sha512-YI8HoReYiIwdFQs+k9Q9qpFTnsyYikZxgs/UVtVbhKixXDQF6F9LLvj2naOx4cfV+RGybNKxwmDl1vUok/dRFQ==", "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/@react-native/babel-plugin-codegen": { - "version": "0.76.5", - "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.76.5.tgz", - "integrity": "sha512-xe7HSQGop4bnOLMaXt0aU+rIatMNEQbz242SDl8V9vx5oOTI0VbZV9yLy6yBc6poUlYbcboF20YVjoRsxX4yww==", + "version": "0.76.6", + "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.76.6.tgz", + "integrity": "sha512-yFC9I/aDBOBz3ZMlqKn2NY/mDUtCksUNZ7AQmBiTAeVTUP0ujEjE0hTOx5Qd+kok7A7hwZEX87HdSgjiJZfr5g==", "license": "MIT", "dependencies": { - "@react-native/codegen": "0.76.5" + "@react-native/codegen": "0.76.6" }, "engines": { "node": ">=18" } }, "node_modules/@react-native/babel-preset": { - "version": "0.76.5", - "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.76.5.tgz", - "integrity": "sha512-1Nu5Um4EogOdppBLI4pfupkteTjWfmI0hqW8ezWTg7Bezw0FtBj8yS8UYVd3wTnDFT9A5mA2VNoNUqomJnvj2A==", + "version": "0.76.6", + "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.76.6.tgz", + "integrity": "sha512-ojlVWY6S/VE/nb9hIRetPMTsW9ZmGb2R3dnToEXAtQQDz41eHMHXbkw/k2h0THp6qhas25ruNvn3N5n2o+lBzg==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.2", @@ -3583,7 +3634,7 @@ "@babel/plugin-transform-typescript": "^7.25.2", "@babel/plugin-transform-unicode-regex": "^7.24.7", "@babel/template": "^7.25.0", - "@react-native/babel-plugin-codegen": "0.76.5", + "@react-native/babel-plugin-codegen": "0.76.6", "babel-plugin-syntax-hermes-parser": "^0.25.1", "babel-plugin-transform-flow-enums": "^0.0.2", "react-refresh": "^0.14.0" @@ -3596,9 +3647,9 @@ } }, "node_modules/@react-native/codegen": { - "version": "0.76.5", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.76.5.tgz", - "integrity": "sha512-FoZ9VRQ5MpgtDAnVo1rT9nNRfjnWpE40o1GeJSDlpUMttd36bVXvsDm8W/NhX8BKTWXSX+CPQJsRcvN1UPYGKg==", + "version": "0.76.6", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.76.6.tgz", + "integrity": "sha512-BABb3e5G/+hyQYEYi0AODWh2km2d8ERoASZr6Hv90pVXdUHRYR+yxCatX7vSd9rnDUYndqRTzD0hZWAucPNAKg==", "license": "MIT", "dependencies": { "@babel/parser": "^7.25.3", @@ -3639,13 +3690,13 @@ } }, "node_modules/@react-native/community-cli-plugin": { - "version": "0.76.5", - "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.76.5.tgz", - "integrity": "sha512-3MKMnlU0cZOWlMhz5UG6WqACJiWUrE3XwBEumzbMmZw3Iw3h+fIsn+7kLLE5EhzqLt0hg5Y4cgYFi4kOaNgq+g==", + "version": "0.76.6", + "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.76.6.tgz", + "integrity": "sha512-nETlc/+U5cESVluzzgN0OcVfcoMijGBaDWzOaJhoYUodcuqnqtu75XsSEc7yzlYjwNQG+vF83mu9CQGezruNMA==", "license": "MIT", "dependencies": { - "@react-native/dev-middleware": "0.76.5", - "@react-native/metro-babel-transformer": "0.76.5", + "@react-native/dev-middleware": "0.76.6", + "@react-native/metro-babel-transformer": "0.76.6", "chalk": "^4.0.0", "execa": "^5.1.1", "invariant": "^2.2.4", @@ -3770,22 +3821,22 @@ "license": "ISC" }, "node_modules/@react-native/debugger-frontend": { - "version": "0.76.5", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.76.5.tgz", - "integrity": "sha512-5gtsLfBaSoa9WP8ToDb/8NnDBLZjv4sybQQj7rDKytKOdsXm3Pr2y4D7x7GQQtP1ZQRqzU0X0OZrhRz9xNnOqA==", + "version": "0.76.6", + "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.76.6.tgz", + "integrity": "sha512-kP97xMQjiANi5/lmf8MakS7d8FTJl+BqYHQMqyvNiY+eeWyKnhqW2GL2v3eEUBAuyPBgJGivuuO4RvjZujduJg==", "license": "BSD-3-Clause", "engines": { "node": ">=18" } }, "node_modules/@react-native/dev-middleware": { - "version": "0.76.5", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.76.5.tgz", - "integrity": "sha512-f8eimsxpkvMgJia7POKoUu9uqjGF6KgkxX4zqr/a6eoR1qdEAWUd6PonSAqtag3PAqvEaJpB99gLH2ZJI1nDGg==", + "version": "0.76.6", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.76.6.tgz", + "integrity": "sha512-1bAyd2/X48Nzb45s5l2omM75vy764odx/UnDs4sJfFCuK+cupU4nRPgl0XWIqgdM/2+fbQ3E4QsVS/WIKTFxvQ==", "license": "MIT", "dependencies": { "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.76.5", + "@react-native/debugger-frontend": "0.76.6", "chrome-launcher": "^0.15.2", "chromium-edge-launcher": "^0.2.0", "connect": "^3.6.5", @@ -3825,31 +3876,31 @@ } }, "node_modules/@react-native/gradle-plugin": { - "version": "0.76.5", - "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.76.5.tgz", - "integrity": "sha512-7KSyD0g0KhbngITduC8OABn0MAlJfwjIdze7nA4Oe1q3R7qmAv+wQzW+UEXvPah8m1WqFjYTkQwz/4mK3XrQGw==", + "version": "0.76.6", + "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.76.6.tgz", + "integrity": "sha512-sDzpf4eiynryoS6bpYCweGoxSmWgCSx9lzBoxIIW+S6siyGiTaffzZHWCm8mIn9UZsSPlEO37q62ggnR9Zu/OA==", "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/@react-native/js-polyfills": { - "version": "0.76.5", - "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.76.5.tgz", - "integrity": "sha512-ggM8tcKTcaqyKQcXMIvcB0vVfqr9ZRhWVxWIdiFO1mPvJyS6n+a+lLGkgQAyO8pfH0R1qw6K9D0nqbbDo865WQ==", + "version": "0.76.6", + "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.76.6.tgz", + "integrity": "sha512-cDD7FynxWYxHkErZzAJtzPGhJ13JdOgL+R0riTh0hCovOfIUz9ItffdLQv2nx48lnvMTQ+HZXMnGOZnsFCNzQw==", "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/@react-native/metro-babel-transformer": { - "version": "0.76.5", - "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.76.5.tgz", - "integrity": "sha512-Cm9G5Sg5BDty3/MKa3vbCAJtT3YHhlEaPlQALLykju7qBS+pHZV9bE9hocfyyvc5N/osTIGWxG5YOfqTeMu1oQ==", + "version": "0.76.6", + "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.76.6.tgz", + "integrity": "sha512-xSBi9jPliThu5HRSJvluqUlDOLLEmf34zY/U7RDDjEbZqC0ufPcPS7c5XsSg0GDPiXc7lgjBVesPZsKFkoIBgA==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.2", - "@react-native/babel-preset": "0.76.5", + "@react-native/babel-preset": "0.76.6", "hermes-parser": "0.23.1", "nullthrows": "^1.1.1" }, @@ -3861,15 +3912,15 @@ } }, "node_modules/@react-native/normalize-colors": { - "version": "0.76.5", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.76.5.tgz", - "integrity": "sha512-6QRLEok1r55gLqj+94mEWUENuU5A6wsr2OoXpyq/CgQ7THWowbHtru/kRGRr6o3AQXrVnZheR60JNgFcpNYIug==", + "version": "0.76.6", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.76.6.tgz", + "integrity": "sha512-1n4udXH2Cla31iA/8eLRdhFHpYUYK1NKWCn4m1Sr9L4SarWKAYuRFliK1fcLvPPALCFoFlWvn8I0ekdUOHMzDQ==", "license": "MIT" }, "node_modules/@react-native/virtualized-lists": { - "version": "0.76.5", - "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.76.5.tgz", - "integrity": "sha512-M/fW1fTwxrHbcx0OiVOIxzG6rKC0j9cR9Csf80o77y1Xry0yrNPpAlf8D1ev3LvHsiAUiRNFlauoPtodrs2J1A==", + "version": "0.76.6", + "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.76.6.tgz", + "integrity": "sha512-0HUWVwJbRq1BWFOu11eOWGTSmK9nMHhoMPyoI27wyWcl/nqUx7HOxMbRVq0DsTCyATSMPeF+vZ6o1REapcNWKw==", "license": "MIT", "dependencies": { "invariant": "^2.2.4", @@ -4247,28 +4298,436 @@ "join-component": "^1.1.0" } }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "license": "MIT" - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "license": "BSD-3-Clause", + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/core/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/@svgr/core/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@svgr/core/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@svgr/core/node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@svgr/core/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@svgr/core/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", + "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/plugin-svgo/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/@svgr/plugin-svgo/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@svgr/plugin-svgo/node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "license": "MIT", "dependencies": { - "type-detect": "4.0.8" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "license": "BSD-3-Clause", + "node_modules/@svgr/plugin-svgo/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", "dependencies": { - "@sinonjs/commons": "^3.0.0" + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@svgr/plugin-svgo/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" } }, "node_modules/@swc/helpers": { @@ -4290,6 +4749,16 @@ "node": ">= 10" } }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -4442,13 +4911,13 @@ } }, "node_modules/@types/react-test-renderer": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-18.3.1.tgz", - "integrity": "sha512-vAhnk0tG2eGa37lkU9+s5SoroCsRI08xnsWFiAXOuPH2jqzMbcXvKExXViPi1P5fIklDeCvXqyrdmipFaSkZrA==", + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-19.0.0.tgz", + "integrity": "sha512-qDVnNybqFm2eZKJ4jD34EvRd6VHD67KjgnWaEMM0Id9L22EpWe3nOSVKHWL1XWRCxUWe3lhXwlEeCKD1BlJCQA==", "dev": true, "license": "MIT", "dependencies": { - "@types/react": "^18" + "@types/react": "*" } }, "node_modules/@types/stack-utils": { @@ -4476,6 +4945,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/validator": { + "version": "13.12.2", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.2.tgz", + "integrity": "sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/yargs": { "version": "17.0.33", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", @@ -5044,9 +5520,9 @@ } }, "node_modules/babel-preset-expo": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-12.0.5.tgz", - "integrity": "sha512-rEFjN1CoMYEWSRpE+Hvw+zv+nLbDXyRM8vGAoYJtFPJovHupX2VRWPVaqtHlnMTrzsGFQDf4WfQJrjAQ9e2hAQ==", + "version": "12.0.6", + "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-12.0.6.tgz", + "integrity": "sha512-az3H7gDVo0wxNBAFES8h5vLLWE8NPGkD9g5P962hDEOqZUdyPacb9MOzicypeLmcq9zQWr6E3iVtEHoNagCTTQ==", "license": "MIT", "dependencies": { "@babel/plugin-proposal-decorators": "^7.12.9", @@ -5055,7 +5531,7 @@ "@babel/plugin-transform-parameters": "^7.22.15", "@babel/preset-react": "^7.22.15", "@babel/preset-typescript": "^7.23.0", - "@react-native/babel-preset": "0.76.5", + "@react-native/babel-preset": "0.76.6", "babel-plugin-react-native-web": "~0.19.13", "react-refresh": "^0.14.2" }, @@ -6135,6 +6611,42 @@ "node": ">=4" } }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true, + "license": "CC0-1.0" + }, "node_modules/cssom": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", @@ -6499,6 +7011,17 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/dotenv": { "version": "16.4.7", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", @@ -6905,26 +7428,26 @@ } }, "node_modules/expo": { - "version": "52.0.24", - "resolved": "https://registry.npmjs.org/expo/-/expo-52.0.24.tgz", - "integrity": "sha512-g9o7Hi1Zqr5MHNR76sMVm3oEwBFWgAozx4CMbVIgJE+wq8Gu0WZyOFOL6NswR5aZs+Cx0CK5hZEXwDtLQql8WQ==", + "version": "52.0.25", + "resolved": "https://registry.npmjs.org/expo/-/expo-52.0.25.tgz", + "integrity": "sha512-BWHveMyDSST7vuGNn8zbrSGboJdvXDE9auUEkFa14ETAWRtsghYnZ0KmjOEQNxNmrBHzct/JgZ8efh5sJGd0xA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.0", - "@expo/cli": "0.22.8", - "@expo/config": "~10.0.7", - "@expo/config-plugins": "~9.0.13", - "@expo/fingerprint": "0.11.6", - "@expo/metro-config": "0.19.8", + "@expo/cli": "0.22.9", + "@expo/config": "~10.0.8", + "@expo/config-plugins": "~9.0.14", + "@expo/fingerprint": "0.11.7", + "@expo/metro-config": "0.19.9", "@expo/vector-icons": "^14.0.0", - "babel-preset-expo": "~12.0.5", - "expo-asset": "~11.0.1", - "expo-constants": "~17.0.3", - "expo-file-system": "~18.0.6", - "expo-font": "~13.0.2", - "expo-keep-awake": "~14.0.1", - "expo-modules-autolinking": "2.0.4", - "expo-modules-core": "2.1.2", + "babel-preset-expo": "~12.0.6", + "expo-asset": "~11.0.2", + "expo-constants": "~17.0.4", + "expo-file-system": "~18.0.7", + "expo-font": "~13.0.3", + "expo-keep-awake": "~14.0.2", + "expo-modules-autolinking": "2.0.5", + "expo-modules-core": "2.1.3", "fbemitter": "^3.0.0", "web-streams-polyfill": "^3.3.2", "whatwg-url-without-unicode": "8.0.0-3" @@ -6952,13 +7475,13 @@ } }, "node_modules/expo-asset": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-11.0.1.tgz", - "integrity": "sha512-WatvD7JVC89EsllXFYcS/rji3ajVzE2B/USo0TqedsETixwyVCQfrrvCdCPQyuKghrxVNEj8bQ/Qbea/RZLYjg==", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-11.0.2.tgz", + "integrity": "sha512-We3Td5WsNsNQyXoheLnuwic6JCOt/pqXqIIyWaZ3z/PeHrA+SwoQdI18MjDhkudLK08tbIVyDSUW8IJHXa04eg==", "license": "MIT", "dependencies": { - "@expo/image-utils": "^0.6.0", - "expo-constants": "~17.0.0", + "@expo/image-utils": "^0.6.4", + "expo-constants": "~17.0.4", "invariant": "^2.2.4", "md5-file": "^3.2.3" }, @@ -6969,9 +7492,9 @@ } }, "node_modules/expo-blur": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/expo-blur/-/expo-blur-14.0.1.tgz", - "integrity": "sha512-3Q6jFBLbY8n2vwk28ycUC+eIlVhnlqwkXUKk/Lfaj+SGV3AZMQyrixe7OYwJdUfwqETBrnYYMB6uNrJzOSbG+g==", + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/expo-blur/-/expo-blur-14.0.2.tgz", + "integrity": "sha512-6ZStKz/7F3nWfmfdeAzhJeNAtxPQAetU1FQ742XHX9uEfZjhq00CrAjyZNx2+nXpE3tGFQtXyhEE5hQJwug8yQ==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -6980,13 +7503,13 @@ } }, "node_modules/expo-constants": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-17.0.3.tgz", - "integrity": "sha512-lnbcX2sAu8SucHXEXxSkhiEpqH+jGrf+TF+MO6sHWIESjwOUVVYlT8qYdjR9xbxWmqFtrI4KV44FkeJf2DaFjQ==", + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-17.0.4.tgz", + "integrity": "sha512-5c0VlZycmDyQUCMCr3Na3cpHAsVJJ+5o6KkkD4rmATQZ0++Xp/S2gpnjWyEo2riRmO91vxoyHwmAySXuktJddQ==", "license": "MIT", "dependencies": { - "@expo/config": "~10.0.4", - "@expo/env": "~0.4.0" + "@expo/config": "~10.0.8", + "@expo/env": "~0.4.1" }, "peerDependencies": { "expo": "*", @@ -6994,9 +7517,9 @@ } }, "node_modules/expo-file-system": { - "version": "18.0.6", - "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-18.0.6.tgz", - "integrity": "sha512-gGEwIJCXV3/wpIJ/wRyhmieLOSAY7HeFFjb+wEfHs04aE63JYR+rXXV4b7rBpEh1ZgNV9U91zfet/iQG7J8HBQ==", + "version": "18.0.7", + "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-18.0.7.tgz", + "integrity": "sha512-6PpbQfogMXdzOsJzlJayy5qf40IfIHhudtAOzr32RlRYL4Hkmk3YcR9jG0PWQ0rklJfAhbAdP63yOcN+wDgzaA==", "license": "MIT", "dependencies": { "web-streams-polyfill": "^3.3.2" @@ -7007,9 +7530,9 @@ } }, "node_modules/expo-font": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-13.0.2.tgz", - "integrity": "sha512-H9FaXM7ZW5+EfV38w80BgJG3H17kB7CuVXwHoiszIYyoPfWz9bWesFe4QwNZjTq3pzKes28sSd8irFuflIrSIA==", + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-13.0.3.tgz", + "integrity": "sha512-9IdYz+A+b3KvuCYP7DUUXF4VMZjPU+IsvAnLSVJ2TfP6zUD2JjZFx3jeo/cxWRkYk/aLj5+53Te7elTAScNl4Q==", "license": "MIT", "dependencies": { "fontfaceobserver": "^2.1.0" @@ -7020,18 +7543,18 @@ } }, "node_modules/expo-haptics": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/expo-haptics/-/expo-haptics-14.0.0.tgz", - "integrity": "sha512-5tYJN+2axYF22BtG1elBQAV1aZPUOCtr9sItClfm4jDoekGiPCxZG/nylcA3DVh2bUHMSll4Y98qjFFFhwZ1Cw==", + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/expo-haptics/-/expo-haptics-14.0.1.tgz", + "integrity": "sha512-V81FZ7xRUfqM6uSI6FA1KnZ+QpEKnISqafob/xEfcx1ymwhm4V3snuLWWFjmAz+XaZQTqlYa8z3QbqEXz7G63w==", "license": "MIT", "peerDependencies": { "expo": "*" } }, "node_modules/expo-keep-awake": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-14.0.1.tgz", - "integrity": "sha512-c5mGCAIk2YM+Vsdy90BlEJ4ZX+KG5Au9EkJUIxXWlpnuKmDAJ3N+5nEZ7EUO1ZTheqoSBeAo4jJ8rTWPU+JXdw==", + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-14.0.2.tgz", + "integrity": "sha512-71XAMnoWjKZrN8J7Q3+u0l9Ytp4OfhNAYz8BCWF1/9aFUw09J3I7Z5DuI3MUsVMa/KWi+XhG+eDUFP8cVA19Uw==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -7039,12 +7562,12 @@ } }, "node_modules/expo-linking": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/expo-linking/-/expo-linking-7.0.3.tgz", - "integrity": "sha512-YiDacNzeQZd/bdOwGyi+YlawM4GGbcSRkuFCpDGIK7D1KUGqLinBHwJvxUMb9Zert2Ois5IHtmZaZ1et6g229g==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/expo-linking/-/expo-linking-7.0.4.tgz", + "integrity": "sha512-i+QaFc2zwOoq/ajePVWC+op3cOKC6nd6Wj/BJtukU71byTAbxDhbi+3m0ZFbh2i1/v/iIXRqrl3PvQcKNklPkw==", "license": "MIT", "dependencies": { - "expo-constants": "~17.0.0", + "expo-constants": "~17.0.4", "invariant": "^2.2.4" }, "peerDependencies": { @@ -7053,9 +7576,9 @@ } }, "node_modules/expo-modules-autolinking": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-2.0.4.tgz", - "integrity": "sha512-e0p+19NhmD50U7s7BV7kWIypWmTNC9n/VlJKlXS05hM/zX7pe6JKmXyb+BFnXJq3SLBalLCUY0tu2gEUF3XeVg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-2.0.5.tgz", + "integrity": "sha512-z1aAa7OtnAXZRFwn/CSgr9qSclW0mepGRJzcjZjyHL49u3VWmAHaPLl6S5vVGSX3sTYsFjKJ7ioCCye3tNdeUg==", "license": "MIT", "dependencies": { "@expo/spawn-async": "^1.7.2", @@ -7108,9 +7631,9 @@ } }, "node_modules/expo-modules-core": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-2.1.2.tgz", - "integrity": "sha512-0OhMU5S8zf9c/CRh1MwiXfOInI9wzz6yiIh5RuR/9J7N6xHRum68hInsPbaSc1UQpo08ZZLM4MPsbpoNRUoqIg==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-2.1.3.tgz", + "integrity": "sha512-DkSEr7q/SobjmCAo70833+xl0liShEFDHuC/YzXmHoDRxYHJaZCNc9uVBqjMeRfPVWp+4Rj9hF/gNvfad7vy0g==", "license": "MIT", "dependencies": { "invariant": "^2.2.4" @@ -7170,21 +7693,21 @@ } }, "node_modules/expo-splash-screen": { - "version": "0.29.19", - "resolved": "https://registry.npmjs.org/expo-splash-screen/-/expo-splash-screen-0.29.19.tgz", - "integrity": "sha512-tknx8oWl8c8VO8zXYYwF38oKjuLHvWwxK61pDyr73I6lflJ0/p81LSb5x53OEsyzr+H69y/RHvVQnWKu+RFfBg==", + "version": "0.29.20", + "resolved": "https://registry.npmjs.org/expo-splash-screen/-/expo-splash-screen-0.29.20.tgz", + "integrity": "sha512-6CkKHyfPREhTL4/NcAI1BQqAMo+qv8K5Kt1s+jQCE8LCweX203BWMDYPu5padBnlYfVDAs7O4CFAe3cyaEDSjA==", "license": "MIT", "dependencies": { - "@expo/prebuild-config": "^8.0.24" + "@expo/prebuild-config": "^8.0.25" }, "peerDependencies": { "expo": "*" } }, "node_modules/expo-status-bar": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/expo-status-bar/-/expo-status-bar-2.0.0.tgz", - "integrity": "sha512-vxxdpvpNDMTEc5uTiIrbTvySKKUsOACmfl8OZuUdjNle05oGqwtq3v5YObwym/njSByjoyuZX8UpXBZnxvarwQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/expo-status-bar/-/expo-status-bar-2.0.1.tgz", + "integrity": "sha512-AkIPX7jWHRPp83UBZ1iXtVvyr0g+DgBVvIXTtlmPtmUsm8Vq9Bb5IGj86PW8osuFlgoTVAg7HI/+Ok7yEYwiRg==", "license": "MIT", "peerDependencies": { "react": "*", @@ -7192,9 +7715,9 @@ } }, "node_modules/expo-symbols": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/expo-symbols/-/expo-symbols-0.2.0.tgz", - "integrity": "sha512-9ci+JBc03e3UvRcdal219FYg5ot7oFWMuyrUwIqI47IoIDUijKn10iuT7T6RjpLtBwHgGvKUK4tue/CiJ+8KeQ==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/expo-symbols/-/expo-symbols-0.2.1.tgz", + "integrity": "sha512-7MchQEfEYq+BDGM4r7bBh0GbgoAemnW+TEiFb3QQc/D1nYuNMIBzK7KKhjgWzi1pRiPX4TIJgAcj2R+WN23s5w==", "license": "MIT", "dependencies": { "sf-symbols-typescript": "^2.0.0" @@ -7204,12 +7727,12 @@ } }, "node_modules/expo-system-ui": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/expo-system-ui/-/expo-system-ui-4.0.6.tgz", - "integrity": "sha512-JWmw0aaNIB8YxA6bXgH6nClyledZaAG5VNzoRvmXT4+j3MY4waAHSSSdVV71bUgjchT/2KOAcibZ/EeosJONug==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/expo-system-ui/-/expo-system-ui-4.0.7.tgz", + "integrity": "sha512-x1VDoE7J8m4wxTgWyUBEYqsf1KabIg64dOLzYiZjg0cWOE6o6kX2Mg6n3abVWEEC01WhZBoo9+Urcce/6ZJ3tg==", "license": "MIT", "dependencies": { - "@react-native/normalize-colors": "0.76.5", + "@react-native/normalize-colors": "0.76.6", "debug": "^4.3.2" }, "peerDependencies": { @@ -7224,9 +7747,9 @@ } }, "node_modules/expo-web-browser": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/expo-web-browser/-/expo-web-browser-14.0.1.tgz", - "integrity": "sha512-QM9F3ie+UyIOoBvqFmT6CZojb1vMc2H+7ZlMT5dEu1PL2jtYyOeK2hLfbt/EMt7CBm/w+P29H9W9Y9gdebOkuQ==", + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/expo-web-browser/-/expo-web-browser-14.0.2.tgz", + "integrity": "sha512-Hncv2yojhTpHbP6SGWARBFdl7P6wBHc1O8IKaNsH0a/IEakq887o1eRhLxZ5IwztPQyRDhpqHdgJ+BjWolOnwA==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -7485,6 +8008,15 @@ "node": ">=4" } }, + "node_modules/find-cache-dir/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/find-cache-dir/node_modules/pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", @@ -8519,9 +9051,9 @@ } }, "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "license": "MIT" }, "node_modules/isexe": { @@ -9011,14 +9543,14 @@ } }, "node_modules/jest-expo": { - "version": "52.0.2", - "resolved": "https://registry.npmjs.org/jest-expo/-/jest-expo-52.0.2.tgz", - "integrity": "sha512-6xV/+IRw93Org1UlgIqu89Ex3vuPRozD5VqTS95AonHMgjb0XTHHhMmn+TdR1d3i3ziy7JFbWAMoBLwminIalw==", + "version": "52.0.3", + "resolved": "https://registry.npmjs.org/jest-expo/-/jest-expo-52.0.3.tgz", + "integrity": "sha512-z2gptekrQ0FIichvRhrES31X9twtCCTzu00sWnPyFaQuWQdoyZiCj2WFPqVrpgIgNYLFIEGhc0VP9rUT9johJw==", "dev": true, "license": "MIT", "dependencies": { - "@expo/config": "~10.0.4", - "@expo/json-file": "^9.0.0", + "@expo/config": "~10.0.8", + "@expo/json-file": "^9.0.1", "@jest/create-cache-key-function": "^29.2.1", "@jest/globals": "^29.2.1", "babel-jest": "^29.2.1", @@ -9043,23 +9575,19 @@ "react-native": "*" } }, - "node_modules/jest-expo/node_modules/react-server-dom-webpack": { - "version": "19.0.0-rc-6230622a1a-20240610", - "resolved": "https://registry.npmjs.org/react-server-dom-webpack/-/react-server-dom-webpack-19.0.0-rc-6230622a1a-20240610.tgz", - "integrity": "sha512-nr+IsOVD07QdeCr4BLvR5TALfLaZLi9AIaoa6vXymBc051iDPWedJujYYrjRJy5+9jp9oCx3G8Tt/Bs//TckJw==", + "node_modules/jest-expo/node_modules/react-test-renderer": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-18.3.1.tgz", + "integrity": "sha512-KkAgygexHUkQqtvvx/otwxtuFu5cVjfzTCtjXLH9boS19/Nbtg84zS7wIQn39G8IlrhThBpQsMKkq5ZHZIYFXA==", "dev": true, "license": "MIT", "dependencies": { - "acorn-loose": "^8.3.0", - "neo-async": "^2.6.1" - }, - "engines": { - "node": ">=0.10.0" + "react-is": "^18.3.1", + "react-shallow-renderer": "^16.15.0", + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "19.0.0-rc-6230622a1a-20240610", - "react-dom": "19.0.0-rc-6230622a1a-20240610", - "webpack": "^5.59.0" + "react": "^18.3.1" } }, "node_modules/jest-get-type": { @@ -9782,12 +10310,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/json-stable-stringify/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "license": "MIT" - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -10253,6 +10775,16 @@ "loose-envify": "cli.js" } }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -11086,6 +11618,17 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "license": "MIT" }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, "node_modules/node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", @@ -11533,6 +12076,19 @@ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "license": "BlueOak-1.0.0" }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -11717,6 +12273,13 @@ "node": ">= 10.0.0" } }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", + "dev": true, + "license": "MIT" + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -11800,12 +12363,12 @@ } }, "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "license": "MIT", "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, "node_modules/pirates": { @@ -12422,19 +12985,19 @@ "license": "MIT" }, "node_modules/react-native": { - "version": "0.76.5", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.76.5.tgz", - "integrity": "sha512-op2p2kB+lqMF1D7AdX4+wvaR0OPFbvWYs+VBE7bwsb99Cn9xISrLRLAgFflZedQsa5HvnOGrULhtnmItbIKVVw==", + "version": "0.76.6", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.76.6.tgz", + "integrity": "sha512-AsRi+ud6v6ADH7ZtSOY42kRB4nbM0KtSu450pGO4pDudl4AEK/AF96ai88snb2/VJJSGGa/49QyJVFXxz/qoFg==", "license": "MIT", "dependencies": { "@jest/create-cache-key-function": "^29.6.3", - "@react-native/assets-registry": "0.76.5", - "@react-native/codegen": "0.76.5", - "@react-native/community-cli-plugin": "0.76.5", - "@react-native/gradle-plugin": "0.76.5", - "@react-native/js-polyfills": "0.76.5", - "@react-native/normalize-colors": "0.76.5", - "@react-native/virtualized-lists": "0.76.5", + "@react-native/assets-registry": "0.76.6", + "@react-native/codegen": "0.76.6", + "@react-native/community-cli-plugin": "0.76.6", + "@react-native/gradle-plugin": "0.76.6", + "@react-native/js-polyfills": "0.76.6", + "@react-native/normalize-colors": "0.76.6", + "@react-native/virtualized-lists": "0.76.6", "abort-controller": "^3.0.0", "anser": "^1.4.9", "ansi-regex": "^5.0.0", @@ -12590,9 +13153,9 @@ } }, "node_modules/react-native-safe-area-context": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-4.14.1.tgz", - "integrity": "sha512-+tUhT5WBl8nh5+P+chYhAjR470iCByf9z5EYdCEbPaAK3Yfzw+o8VRPnUgmPAKlSccOgQBxx3NOl/Wzckn9ujg==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-4.12.0.tgz", + "integrity": "sha512-ukk5PxcF4p3yu6qMZcmeiZgowhb5AsKRnil54YFUUAXVIS7PJcMHGGC+q44fCiBg44/1AJk5njGMez1m9H0BVQ==", "license": "MIT", "peerDependencies": { "react": "*", @@ -12614,9 +13177,9 @@ } }, "node_modules/react-native-svg": { - "version": "15.11.0", - "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-15.11.0.tgz", - "integrity": "sha512-IJN0wcGHXpCbi7+TUgnjrPJTmk70t2IsEgyqCp/6x4Sy/PXz0+dB75jyUnPC0JZ1oTN1FsxnJEZChDMmhs6tzw==", + "version": "15.8.0", + "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-15.8.0.tgz", + "integrity": "sha512-KHJzKpgOjwj1qeZzsBjxNdoIgv2zNCO9fVcoq2TEhTRsVV5DGTZ9JzUZwybd7q4giT/H3RdtqC3u44dWdO0Ffw==", "license": "MIT", "dependencies": { "css-select": "^5.1.0", @@ -12628,6 +13191,23 @@ "react-native": "*" } }, + "node_modules/react-native-svg-transformer": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/react-native-svg-transformer/-/react-native-svg-transformer-1.5.0.tgz", + "integrity": "sha512-RG5fSWJT7mjCQYocgYFUo1KYPLOoypPVG5LQab+pZZO7m4ciGaQIe0mhok3W4R5jLQsEXKo0u+aQGkZV/bZG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@svgr/core": "^8.1.0", + "@svgr/plugin-jsx": "^8.1.0", + "@svgr/plugin-svgo": "^8.1.0", + "path-dirname": "^1.0.2" + }, + "peerDependencies": { + "react-native": ">=0.59.0", + "react-native-svg": ">=12.0.0" + } + }, "node_modules/react-native-vector-icons": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/react-native-vector-icons/-/react-native-vector-icons-10.2.0.tgz", @@ -12853,6 +13433,25 @@ "node": ">=0.10.0" } }, + "node_modules/react-server-dom-webpack": { + "version": "19.0.0-rc-6230622a1a-20240610", + "resolved": "https://registry.npmjs.org/react-server-dom-webpack/-/react-server-dom-webpack-19.0.0-rc-6230622a1a-20240610.tgz", + "integrity": "sha512-nr+IsOVD07QdeCr4BLvR5TALfLaZLi9AIaoa6vXymBc051iDPWedJujYYrjRJy5+9jp9oCx3G8Tt/Bs//TckJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn-loose": "^8.3.0", + "neo-async": "^2.6.1" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "react": "19.0.0-rc-6230622a1a-20240610", + "react-dom": "19.0.0-rc-6230622a1a-20240610", + "webpack": "^5.59.0" + } + }, "node_modules/react-shallow-renderer": { "version": "16.15.0", "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz", @@ -12868,20 +13467,33 @@ } }, "node_modules/react-test-renderer": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-18.3.1.tgz", - "integrity": "sha512-KkAgygexHUkQqtvvx/otwxtuFu5cVjfzTCtjXLH9boS19/Nbtg84zS7wIQn39G8IlrhThBpQsMKkq5ZHZIYFXA==", + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-19.0.0.tgz", + "integrity": "sha512-oX5u9rOQlHzqrE/64CNr0HB0uWxkCQmZNSfozlYvwE71TLVgeZxVf0IjouGEr1v7r1kcDifdAJBeOhdhxsG/DA==", "dev": true, "license": "MIT", "dependencies": { - "react-is": "^18.3.1", - "react-shallow-renderer": "^16.15.0", - "scheduler": "^0.23.2" + "react-is": "^19.0.0", + "scheduler": "^0.25.0" }, "peerDependencies": { - "react": "^18.3.1" + "react": "^19.0.0" } }, + "node_modules/react-test-renderer/node_modules/react-is": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.0.0.tgz", + "integrity": "sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-test-renderer/node_modules/scheduler": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", + "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==", + "dev": true, + "license": "MIT" + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -12891,15 +13503,6 @@ "pify": "^2.3.0" } }, - "node_modules/read-cache/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -12915,6 +13518,12 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, "node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -13731,6 +14340,17 @@ "node": ">=8.0.0" } }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", @@ -14191,6 +14811,60 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/svgo": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/svgo/node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true, + "license": "CC0-1.0" + }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", diff --git a/package.json b/package.json index 62a8801..e6b314f 100644 --- a/package.json +++ b/package.json @@ -15,11 +15,15 @@ "preset": "jest-expo" }, "dependencies": { + "@expo/html-elements": "^0.4.2", "@expo/vector-icons": "^14.0.2", "@gluestack-ui/avatar": "^0.1.18", "@gluestack-ui/button": "^1.0.8", "@gluestack-ui/checkbox": "^0.1.33", + "@gluestack-ui/form-control": "^0.1.19", "@gluestack-ui/icon": "^0.1.25", + "@gluestack-ui/input": "^0.1.32", + "@gluestack-ui/link": "^0.1.23", "@gluestack-ui/nativewind-utils": "^1.0.26", "@gluestack-ui/overlay": "^0.1.16", "@gluestack-ui/toast": "^1.0.8", @@ -27,40 +31,43 @@ "@react-navigation/native": "^7.0.14", "@react-navigation/native-stack": "^7.2.0", "@react-navigation/stack": "^7.1.1", - "expo": "~52.0.24", - "expo-blur": "~14.0.1", - "expo-constants": "~17.0.3", - "expo-font": "~13.0.2", - "expo-haptics": "~14.0.0", - "expo-linking": "~7.0.3", + "expo": "^52.0.24", + "expo-asset": "^11.0.2", + "expo-blur": "^14.0.1", + "expo-constants": "^17.0.3", + "expo-font": "^13.0.2", + "expo-haptics": "^14.0.0", + "expo-linking": "^7.0.3", "expo-router": "~4.0.16", - "expo-splash-screen": "~0.29.19", - "expo-status-bar": "~2.0.0", - "expo-symbols": "~0.2.0", - "expo-system-ui": "~4.0.6", - "expo-web-browser": "~14.0.1", + "expo-splash-screen": "^0.29.19", + "expo-status-bar": "^2.0.0", + "expo-symbols": "^0.2.0", + "expo-system-ui": "^4.0.6", + "expo-web-browser": "^14.0.1", "nativewind": "^4.1.23", "react": "18.3.1", "react-dom": "18.3.1", - "react-native": "0.76.5", - "react-native-gesture-handler": "~2.20.2", - "react-native-reanimated": "~3.16.1", - "react-native-safe-area-context": "^4.14.1", - "react-native-screens": "~4.4.0", - "react-native-svg": "^15.11.0", + "react-native": "0.76.6", + "react-native-gesture-handler": "^2.20.2", + "react-native-reanimated": "^3.16.1", + "react-native-safe-area-context": "^4.12.0", + "react-native-screens": "^4.4.0", + "react-native-svg": "^15.8.0", "react-native-vector-icons": "^10.2.0", - "react-native-web": "~0.19.13", + "react-native-web": "^0.19.13", "react-native-webview": "13.12.5", "tailwindcss": "^3.4.17" }, "devDependencies": { "@babel/core": "^7.25.2", "@types/jest": "^29.5.12", - "@types/react": "~18.3.12", - "@types/react-test-renderer": "^18.3.0", + "@types/react": "^18.3.12", + "@types/react-test-renderer": "^19.0.0", + "@types/validator": "^13.12.2", "jest": "^29.2.1", - "jest-expo": "~52.0.2", - "react-test-renderer": "18.3.1", + "jest-expo": "^52.0.2", + "react-native-svg-transformer": "^1.5.0", + "react-test-renderer": "19.0.0", "typescript": "^5.3.3" }, "private": true diff --git a/tsconfig.json b/tsconfig.json index c417704..e844cb8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,6 +11,7 @@ "**/*.tsx", ".expo/types/**/*.ts", "expo-env.d.ts", - "nativewind-env.d.ts" + "nativewind-env.d.ts", + "app/index.tsx" ] }