diff --git a/apps/mobile/README.md b/apps/mobile/README.md
index cd4feb8a..ff0694bd 100644
--- a/apps/mobile/README.md
+++ b/apps/mobile/README.md
@@ -1,4 +1,4 @@
-# Welcome to your Expo app 👋
+# @6pm/mobile
This is an [Expo](https://expo.dev) project created with [`create-expo-app`](https://www.npmjs.com/package/create-expo-app).
diff --git a/apps/mobile/app/(tabs)/explore.tsx b/apps/mobile/app/(tabs)/explore.tsx
index e480218a..d6f2bcde 100644
--- a/apps/mobile/app/(tabs)/explore.tsx
+++ b/apps/mobile/app/(tabs)/explore.tsx
@@ -1,102 +1,25 @@
-import Ionicons from '@expo/vector-icons/Ionicons';
-import { StyleSheet, Image, Platform } from 'react-native';
-
-import { Collapsible } from '@/components/Collapsible';
-import { ExternalLink } from '@/components/ExternalLink';
-import ParallaxScrollView from '@/components/ParallaxScrollView';
-import { ThemedText } from '@/components/ThemedText';
-import { ThemedView } from '@/components/ThemedView';
+import { Avatar, AvatarFallback, AvatarImage } from '@/components/Avatar';
+import { View } from 'react-native';
export default function TabTwoScreen() {
return (
- }>
-
- Explore
-
- This app includes example code to help you get started.
-
-
- This app has two screens:{' '}
- app/(tabs)/index.tsx and{' '}
- app/(tabs)/explore.tsx
-
-
- The layout file in app/(tabs)/_layout.tsx{' '}
- sets up the tab navigator.
-
-
- Learn more
-
-
-
-
- You can open this project on Android, iOS, and the web. To open the web version, press{' '}
- w in the terminal running this project.
-
-
-
-
- For static images, you can use the @2x and{' '}
- @3x suffixes to provide files for
- different screen densities
-
-
-
- Learn more
-
-
-
-
- Open app/_layout.tsx to see how to load{' '}
-
- custom fonts such as this one.
-
-
-
- Learn more
-
-
-
-
- This template has light and dark mode support. The{' '}
- useColorScheme() hook lets you inspect
- what the user's current color scheme is, and so you can adjust UI colors accordingly.
-
-
- Learn more
-
-
-
-
- This template includes an example of an animated component. The{' '}
- components/HelloWave.tsx component uses
- the powerful react-native-reanimated library
- to create a waving hand animation.
-
- {Platform.select({
- ios: (
-
- The components/ParallaxScrollView.tsx{' '}
- component provides a parallax effect for the header image.
-
- ),
- })}
-
-
+
+
+
+ CG
+
+
+
+ SS
+
+
);
}
-
-const styles = StyleSheet.create({
- headerImage: {
- color: '#808080',
- bottom: -90,
- left: -35,
- position: 'absolute',
- },
- titleContainer: {
- flexDirection: 'row',
- gap: 8,
- },
-});
diff --git a/apps/mobile/app/(tabs)/index.tsx b/apps/mobile/app/(tabs)/index.tsx
index 324aeb76..3e9d56eb 100644
--- a/apps/mobile/app/(tabs)/index.tsx
+++ b/apps/mobile/app/(tabs)/index.tsx
@@ -1,70 +1,7 @@
-import { Image, StyleSheet, Platform } from 'react-native';
-
-import { HelloWave } from '@/components/HelloWave';
-import ParallaxScrollView from '@/components/ParallaxScrollView';
-import { ThemedText } from '@/components/ThemedText';
-import { ThemedView } from '@/components/ThemedView';
+import { Button } from '@/components/Button';
export default function HomeScreen() {
return (
-
- }>
-
- Welcome!
-
-
-
- Step 1: Try it
-
- Edit app/(tabs)/index.tsx to see changes.
- Press{' '}
-
- {Platform.select({ ios: 'cmd + d', android: 'cmd + m' })}
- {' '}
- to open developer tools.
-
-
-
- Step 2: Explore
-
- Tap the Explore tab to learn more about what's included in this starter app.
-
-
-
- Step 3: Get a fresh start
-
- When you're ready, run{' '}
- npm run reset-project to get a fresh{' '}
- app directory. This will move the current{' '}
- app to{' '}
- app-example.
-
-
-
+
);
}
-
-const styles = StyleSheet.create({
- titleContainer: {
- flexDirection: 'row',
- alignItems: 'center',
- gap: 8,
- },
- stepContainer: {
- gap: 8,
- marginBottom: 8,
- },
- reactLogo: {
- height: 178,
- width: 290,
- bottom: 0,
- left: 0,
- position: 'absolute',
- },
-});
diff --git a/apps/mobile/app/+not-found.tsx b/apps/mobile/app/+not-found.tsx
index 963b04fb..4819be7d 100644
--- a/apps/mobile/app/+not-found.tsx
+++ b/apps/mobile/app/+not-found.tsx
@@ -1,19 +1,18 @@
import { Link, Stack } from 'expo-router';
-import { StyleSheet } from 'react-native';
+import { StyleSheet, Text, View } from 'react-native';
-import { ThemedText } from '@/components/ThemedText';
-import { ThemedView } from '@/components/ThemedView';
+import { Button } from '@/components/Button';
export default function NotFoundScreen() {
return (
<>
-
- This screen doesn't exist.
-
- Go to home screen!
+
+ This screen doesn't exist.
+
+
-
+
>
);
}
diff --git a/apps/mobile/app/_layout.tsx b/apps/mobile/app/_layout.tsx
index 2e37cdd8..d772b6aa 100644
--- a/apps/mobile/app/_layout.tsx
+++ b/apps/mobile/app/_layout.tsx
@@ -7,6 +7,8 @@ import 'react-native-reanimated';
import { useColorScheme } from '@/hooks/useColorScheme';
+import "../global.css"
+
// Prevent the splash screen from auto-hiding before asset loading is complete.
SplashScreen.preventAutoHideAsync();
diff --git a/apps/mobile/assets/images/adaptive-icon.png b/apps/mobile/assets/images/adaptive-icon.png
index 03d6f6b6..e7239ded 100644
Binary files a/apps/mobile/assets/images/adaptive-icon.png and b/apps/mobile/assets/images/adaptive-icon.png differ
diff --git a/apps/mobile/assets/images/icon.png b/apps/mobile/assets/images/icon.png
index a0b1526f..bccea2a6 100644
Binary files a/apps/mobile/assets/images/icon.png and b/apps/mobile/assets/images/icon.png differ
diff --git a/apps/mobile/assets/images/splash.png b/apps/mobile/assets/images/splash.png
index 0e89705a..378cbc8a 100644
Binary files a/apps/mobile/assets/images/splash.png and b/apps/mobile/assets/images/splash.png differ
diff --git a/apps/mobile/babel.config.js b/apps/mobile/babel.config.js
index 9d89e131..8380c13d 100644
--- a/apps/mobile/babel.config.js
+++ b/apps/mobile/babel.config.js
@@ -1,6 +1,10 @@
-module.exports = function (api) {
+module.exports = function(api) {
api.cache(true);
return {
- presets: ['babel-preset-expo'],
+ presets: [
+ ['babel-preset-expo', { jsxImportSource: 'nativewind' }],
+ 'nativewind/babel'
+ ],
+ plugins: [],
};
};
diff --git a/apps/mobile/components/Avatar.tsx b/apps/mobile/components/Avatar.tsx
new file mode 100644
index 00000000..a000cb2b
--- /dev/null
+++ b/apps/mobile/components/Avatar.tsx
@@ -0,0 +1,60 @@
+import { forwardRef, useState } from 'react';
+import { Image, Text, View } from 'react-native';
+
+import { cn } from '../lib/utils';
+
+const Avatar = forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+Avatar.displayName = 'Avatar';
+
+const AvatarImage = forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => {
+ const [hasError, setHasError] = useState(false);
+
+ if (hasError) {
+ return null;
+ }
+ return (
+ setHasError(true)}
+ className={cn('aspect-square h-full w-full', className)}
+ {...props}
+ />
+ );
+});
+AvatarImage.displayName = 'AvatarImage';
+
+const AvatarFallback = forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & { textClassname?: string }
+>(({ children, className, textClassname, ...props }, ref) => (
+
+
+ {children}
+
+
+));
+AvatarFallback.displayName = 'AvatarFallback';
+
+export { Avatar, AvatarImage, AvatarFallback };
diff --git a/apps/mobile/components/Badge.tsx b/apps/mobile/components/Badge.tsx
new file mode 100644
index 00000000..38cb0c26
--- /dev/null
+++ b/apps/mobile/components/Badge.tsx
@@ -0,0 +1,59 @@
+import { type VariantProps, cva } from 'class-variance-authority';
+import { Text, View } from 'react-native';
+
+import { cn } from '../lib/utils';
+
+const badgeVariants = cva(
+ 'flex flex-row items-center rounded-full px-2 py-1 text-xs font-semibold',
+ {
+ variants: {
+ variant: {
+ default: 'bg-primary',
+ secondary: 'bg-secondary',
+ destructive: 'bg-destructive',
+ success: 'bg-green-500 dark:bg-green-700',
+ },
+ },
+ defaultVariants: {
+ variant: 'default',
+ },
+ }
+);
+
+const badgeTextVariants = cva('font-medium text-center text-xs', {
+ variants: {
+ variant: {
+ default: 'text-primary-foreground',
+ secondary: 'text-secondary-foreground',
+ destructive: 'text-destructive-foreground',
+ success: 'text-green-100',
+ },
+ },
+ defaultVariants: {
+ variant: 'default',
+ },
+});
+
+export interface BadgeProps
+ extends React.ComponentPropsWithoutRef,
+ VariantProps {
+ label: string;
+ labelClasses?: string;
+}
+function Badge({
+ label,
+ labelClasses,
+ className,
+ variant,
+ ...props
+}: BadgeProps) {
+ return (
+
+
+ {label}
+
+
+ );
+}
+
+export { Badge, badgeVariants };
diff --git a/apps/mobile/components/Button.tsx b/apps/mobile/components/Button.tsx
new file mode 100644
index 00000000..55e7e189
--- /dev/null
+++ b/apps/mobile/components/Button.tsx
@@ -0,0 +1,81 @@
+import { type VariantProps, cva } from 'class-variance-authority';
+import { Text, TouchableOpacity } from 'react-native';
+
+import { cn } from '../lib/utils';
+
+const buttonVariants = cva(
+ 'flex flex-row items-center justify-center rounded-md',
+ {
+ variants: {
+ variant: {
+ default: 'bg-primary',
+ secondary: 'bg-secondary',
+ destructive: 'bg-destructive',
+ ghost: 'bg-slate-700',
+ link: 'text-primary underline-offset-4',
+ },
+ size: {
+ default: 'h-10 px-4',
+ sm: 'h-8 px-2',
+ lg: 'h-12 px-8',
+ },
+ },
+ defaultVariants: {
+ variant: 'default',
+ size: 'default',
+ },
+ }
+);
+
+const buttonTextVariants = cva('text-center font-medium', {
+ variants: {
+ variant: {
+ default: 'text-primary-foreground',
+ secondary: 'text-secondary-foreground',
+ destructive: 'text-destructive-foreground',
+ ghost: 'text-primary-foreground',
+ link: 'text-primary-foreground underline',
+ },
+ size: {
+ default: 'text-base',
+ sm: 'text-sm',
+ lg: 'text-xl',
+ },
+ },
+ defaultVariants: {
+ variant: 'default',
+ size: 'default',
+ },
+});
+
+interface ButtonProps
+ extends React.ComponentPropsWithoutRef,
+ VariantProps {
+ label: string;
+ labelClasses?: string;
+}
+function Button({
+ label,
+ labelClasses,
+ className,
+ variant,
+ size,
+ ...props
+}: ButtonProps) {
+ return (
+
+
+ {label}
+
+
+ );
+}
+
+export { Button, buttonVariants, buttonTextVariants };
diff --git a/apps/mobile/components/Card.tsx b/apps/mobile/components/Card.tsx
new file mode 100644
index 00000000..12799ae2
--- /dev/null
+++ b/apps/mobile/components/Card.tsx
@@ -0,0 +1,119 @@
+import { Text, View } from 'react-native';
+
+import { cn } from '../lib/utils';
+
+function Card({
+ className,
+ ...props
+}: React.ComponentPropsWithoutRef) {
+ return (
+
+ );
+}
+
+function CardHeader({
+ className,
+ ...props
+}: React.ComponentPropsWithoutRef) {
+ return ;
+}
+
+function CardTitle({
+ className,
+ ...props
+}: React.ComponentPropsWithoutRef) {
+ return (
+
+ );
+}
+
+function CardDescription({
+ className,
+ ...props
+}: React.ComponentPropsWithoutRef) {
+ return (
+
+ );
+}
+
+function CardContent({
+ className,
+ ...props
+}: React.ComponentPropsWithoutRef) {
+ return ;
+}
+
+// TODO: style
+function CardFooter({
+ className,
+ ...props
+}: React.ComponentPropsWithoutRef) {
+ return (
+
+ );
+}
+
+interface SimpleCardProps {
+ className?: string;
+ title?: string;
+ description?: string;
+ content?: string;
+ footer?: string;
+}
+function SimpleCard({
+ className,
+ title,
+ description,
+ content,
+ footer,
+}: SimpleCardProps) {
+ return (
+
+
+ {title && (
+
+ {title}
+
+ )}
+ {description && (
+ {description}
+ )}
+
+ {content && (
+
+ {content}
+
+ )}
+ {footer && (
+
+ {footer}
+
+ )}
+
+ );
+}
+
+export {
+ Card,
+ CardHeader,
+ CardTitle,
+ CardDescription,
+ CardContent,
+ CardFooter,
+ SimpleCard,
+};
diff --git a/apps/mobile/components/Checkbox.tsx b/apps/mobile/components/Checkbox.tsx
new file mode 100644
index 00000000..a90ea7ba
--- /dev/null
+++ b/apps/mobile/components/Checkbox.tsx
@@ -0,0 +1,50 @@
+import { useState } from 'react';
+import { Text, TouchableOpacity, View } from 'react-native';
+
+import { cn } from '../lib/utils';
+
+// TODO: make controlled (optional)
+interface CheckboxProps extends React.ComponentPropsWithoutRef {
+ label?: string;
+ labelClasses?: string;
+ checkboxClasses?: string;
+}
+function Checkbox({
+ label,
+ labelClasses,
+ checkboxClasses,
+ className,
+ ...props
+}: CheckboxProps) {
+ const [isChecked, setChecked] = useState(false);
+
+ const toggleCheckbox = () => {
+ setChecked(prev => !prev);
+ };
+
+ return (
+
+
+
+ {isChecked && ✓}
+
+
+ {label && (
+ {label}
+ )}
+
+ );
+}
+
+export { Checkbox };
diff --git a/apps/mobile/components/Collapsible.tsx b/apps/mobile/components/Collapsible.tsx
deleted file mode 100644
index c326473d..00000000
--- a/apps/mobile/components/Collapsible.tsx
+++ /dev/null
@@ -1,41 +0,0 @@
-import Ionicons from '@expo/vector-icons/Ionicons';
-import { PropsWithChildren, useState } from 'react';
-import { StyleSheet, TouchableOpacity, useColorScheme } from 'react-native';
-
-import { ThemedText } from '@/components/ThemedText';
-import { ThemedView } from '@/components/ThemedView';
-import { Colors } from '@/constants/Colors';
-
-export function Collapsible({ children, title }: PropsWithChildren & { title: string }) {
- const [isOpen, setIsOpen] = useState(false);
- const theme = useColorScheme() ?? 'light';
-
- return (
-
- setIsOpen((value) => !value)}
- activeOpacity={0.8}>
-
- {title}
-
- {isOpen && {children}}
-
- );
-}
-
-const styles = StyleSheet.create({
- heading: {
- flexDirection: 'row',
- alignItems: 'center',
- gap: 6,
- },
- content: {
- marginTop: 6,
- marginLeft: 24,
- },
-});
diff --git a/apps/mobile/components/Dialog.tsx b/apps/mobile/components/Dialog.tsx
new file mode 100644
index 00000000..baec0d60
--- /dev/null
+++ b/apps/mobile/components/Dialog.tsx
@@ -0,0 +1,73 @@
+import { cloneElement, createContext, useContext, useState } from 'react';
+import { Modal, TouchableOpacity, View } from 'react-native';
+
+import { cn } from '../lib/utils';
+
+interface DialogContextType {
+ open: boolean;
+ setOpen: (open: boolean) => void;
+}
+
+const DialogContext = createContext(undefined);
+
+function Dialog({ children }: { children: React.ReactNode }) {
+ const [open, setOpen] = useState(false);
+
+ return (
+
+ {children}
+
+ );
+}
+
+function DialogTrigger({ children }: any) {
+ const { setOpen } = useDialog();
+
+ return cloneElement(children, { onPress: () => setOpen(true) });
+}
+
+function DialogContent({
+ className,
+ children,
+}: {
+ className?: string;
+ children: React.ReactNode;
+}) {
+ const { open, setOpen } = useDialog();
+
+ return (
+ setOpen(false)}
+ >
+ setOpen(false)}
+ >
+
+
+ {children}
+
+
+
+
+ );
+}
+
+const useDialog = () => {
+ const context = useContext(DialogContext);
+ if (!context) {
+ throw new Error('useDialog must be used within a DialogProvider');
+ }
+ return context;
+};
+
+export { Dialog, DialogTrigger, DialogContent, useDialog };
diff --git a/apps/mobile/components/DropDown.tsx b/apps/mobile/components/DropDown.tsx
new file mode 100644
index 00000000..e11b5073
--- /dev/null
+++ b/apps/mobile/components/DropDown.tsx
@@ -0,0 +1,100 @@
+import React, {
+ cloneElement,
+ createContext,
+ useContext,
+ useState,
+} from 'react';
+import { Text, View } from 'react-native';
+
+import { cn } from '../lib/utils';
+
+interface DropDownContextType {
+ open: boolean;
+ setOpen: (open: boolean) => void;
+}
+
+const DropDownContext = createContext(
+ undefined
+);
+
+const DropDown = ({ children }: { children: React.ReactNode }) => {
+ const [open, setOpen] = useState(false);
+ return (
+
+ {children}
+
+ );
+};
+
+const DropDownTrigger = ({ children }: any) => {
+ const { open, setOpen } = useDropdown();
+ return cloneElement(children, {
+ onPress: () => setOpen(!open),
+ });
+};
+
+type DropDownContentTypes = {
+ className?: string;
+ children: React.ReactNode;
+};
+
+const DropDownContent = ({ className, children }: DropDownContentTypes) => {
+ const { open } = useDropdown();
+ return (
+ <>
+ {open && (
+
+ {children}
+
+ )}
+ >
+ );
+};
+
+type DropDownLabelProps = {
+ labelTitle: string;
+};
+
+const DropDownLabel = ({ labelTitle }: DropDownLabelProps) => {
+ return (
+ {labelTitle}
+ );
+};
+
+type DropDownItemProps = {
+ children: React.ReactNode;
+ className?: string;
+};
+
+const DropDownItem = ({ children, className }: DropDownItemProps) => {
+ return (
+
+ {children}
+
+ );
+};
+
+const DropDownItemSeparator = () => {
+ return ;
+};
+const useDropdown = () => {
+ const context = useContext(DropDownContext);
+ if (!context) {
+ throw new Error('useDropdown must be used within a DropdownProvider');
+ }
+ return context;
+};
+export {
+ DropDown,
+ DropDownTrigger,
+ DropDownContent,
+ DropDownLabel,
+ DropDownItemSeparator,
+ DropDownItem,
+ useDropdown,
+};
diff --git a/apps/mobile/components/ExternalLink.tsx b/apps/mobile/components/ExternalLink.tsx
deleted file mode 100644
index 8f05675b..00000000
--- a/apps/mobile/components/ExternalLink.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import { Link } from 'expo-router';
-import { openBrowserAsync } from 'expo-web-browser';
-import { type ComponentProps } from 'react';
-import { Platform } from 'react-native';
-
-type Props = Omit, 'href'> & { href: string };
-
-export function ExternalLink({ href, ...rest }: Props) {
- return (
- {
- if (Platform.OS !== 'web') {
- // Prevent the default behavior of linking to the default browser on native.
- event.preventDefault();
- // Open the link in an in-app browser.
- await openBrowserAsync(href);
- }
- }}
- />
- );
-}
diff --git a/apps/mobile/components/HelloWave.tsx b/apps/mobile/components/HelloWave.tsx
deleted file mode 100644
index f4b6ea54..00000000
--- a/apps/mobile/components/HelloWave.tsx
+++ /dev/null
@@ -1,37 +0,0 @@
-import { StyleSheet } from 'react-native';
-import Animated, {
- useSharedValue,
- useAnimatedStyle,
- withTiming,
- withRepeat,
- withSequence,
-} from 'react-native-reanimated';
-
-import { ThemedText } from '@/components/ThemedText';
-
-export function HelloWave() {
- const rotationAnimation = useSharedValue(0);
-
- rotationAnimation.value = withRepeat(
- withSequence(withTiming(25, { duration: 150 }), withTiming(0, { duration: 150 })),
- 4 // Run the animation 4 times
- );
-
- const animatedStyle = useAnimatedStyle(() => ({
- transform: [{ rotate: `${rotationAnimation.value}deg` }],
- }));
-
- return (
-
- 👋
-
- );
-}
-
-const styles = StyleSheet.create({
- text: {
- fontSize: 28,
- lineHeight: 32,
- marginTop: -6,
- },
-});
diff --git a/apps/mobile/components/Input.tsx b/apps/mobile/components/Input.tsx
new file mode 100644
index 00000000..13265403
--- /dev/null
+++ b/apps/mobile/components/Input.tsx
@@ -0,0 +1,27 @@
+import { forwardRef } from 'react';
+import { Text, TextInput, View } from 'react-native';
+
+import { cn } from '../lib/utils';
+
+export interface InputProps
+ extends React.ComponentPropsWithoutRef {
+ label?: string;
+ labelClasses?: string;
+ inputClasses?: string;
+}
+const Input = forwardRef, InputProps>(
+ ({ className, label, labelClasses, inputClasses, ...props }, ref) => (
+
+ {label && {label}}
+
+
+ )
+);
+
+export { Input };
diff --git a/apps/mobile/components/ParallaxScrollView.tsx b/apps/mobile/components/ParallaxScrollView.tsx
index 0a354199..c1e2243d 100644
--- a/apps/mobile/components/ParallaxScrollView.tsx
+++ b/apps/mobile/components/ParallaxScrollView.tsx
@@ -1,5 +1,5 @@
import type { PropsWithChildren, ReactElement } from 'react';
-import { StyleSheet, useColorScheme } from 'react-native';
+import { StyleSheet, useColorScheme, View } from 'react-native';
import Animated, {
interpolate,
useAnimatedRef,
@@ -7,8 +7,6 @@ import Animated, {
useScrollViewOffset,
} from 'react-native-reanimated';
-import { ThemedView } from '@/components/ThemedView';
-
const HEADER_HEIGHT = 250;
type Props = PropsWithChildren<{
@@ -43,7 +41,7 @@ export default function ParallaxScrollView({
});
return (
-
+
{headerImage}
- {children}
+ {children}
-
+
);
}
diff --git a/apps/mobile/components/Progress.tsx b/apps/mobile/components/Progress.tsx
new file mode 100644
index 00000000..8a8fbbdb
--- /dev/null
+++ b/apps/mobile/components/Progress.tsx
@@ -0,0 +1,42 @@
+import { useEffect, useRef } from 'react';
+import { Animated, View as RnView, type View } from 'react-native';
+
+import { cn } from '../lib/utils';
+
+function Progress({
+ className,
+ ...props
+}: { className?: string; value: number } & React.ComponentPropsWithoutRef<
+ typeof View
+>) {
+ const widthAnim = useRef(new Animated.Value(0)).current;
+
+ useEffect(() => {
+ Animated.timing(widthAnim, {
+ toValue: props.value,
+ duration: 1000,
+ useNativeDriver: false,
+ }).start();
+ }, [widthAnim, props.value]);
+
+ return (
+
+
+
+ );
+}
+
+export { Progress };
diff --git a/apps/mobile/components/RadioGroup.tsx b/apps/mobile/components/RadioGroup.tsx
new file mode 100644
index 00000000..3b910598
--- /dev/null
+++ b/apps/mobile/components/RadioGroup.tsx
@@ -0,0 +1,90 @@
+import { Circle, CircleDot } from 'lucide-react-native';
+import { createContext, useContext, useState } from 'react';
+import { Text, TouchableOpacity, useColorScheme } from 'react-native';
+
+import { cn } from '../lib/utils';
+import { theme } from '../lib/theme';
+
+interface RadioGroupContextType {
+ value: string;
+ setValue: (value: string) => void;
+}
+const RadioGroupContext = createContext(
+ undefined
+);
+
+interface RadioGroupProps {
+ defaultValue: string;
+ children: React.ReactNode;
+}
+function RadioGroup({ defaultValue, children }: RadioGroupProps) {
+ const [value, setValue] = useState(defaultValue);
+
+ return (
+
+ {children}
+
+ );
+}
+
+interface RadioGroupItemProps
+ extends React.ComponentPropsWithoutRef {
+ value: string;
+ label?: string;
+ labelClasses?: string;
+}
+function RadioGroupItem({
+ value,
+ className,
+ label,
+ labelClasses,
+ ...props
+}: RadioGroupItemProps) {
+ const context = useContext(RadioGroupContext);
+ if (!context) {
+ throw new Error('RadioGroupItem must be used within a RadioGroup');
+ }
+ const { value: selectedValue, setValue } = context;
+
+ const colorScheme = useColorScheme();
+ const currentTheme = colorScheme === 'dark' ? theme.dark : theme.light;
+
+ return (
+ setValue(value)}
+ className={cn('flex flex-row items-center gap-2', className)}
+ {...props}
+ >
+ {selectedValue === value ? (
+
+ ) : (
+
+ )}
+ {label && (
+ {label}
+ )}
+
+ );
+}
+
+interface RadioGroupLabelProps
+ extends React.ComponentPropsWithoutRef {
+ value: string;
+}
+function RadioGroupLabel({ value, className, ...props }: RadioGroupLabelProps) {
+ const context = useContext(RadioGroupContext);
+ if (!context) {
+ throw new Error('RadioGroupLabel must be used within a RadioGroup');
+ }
+ const { setValue } = context;
+
+ return (
+ setValue(value)}
+ {...props}
+ />
+ );
+}
+
+export { RadioGroup, RadioGroupItem, RadioGroupLabel };
diff --git a/apps/mobile/components/Skeleton.tsx b/apps/mobile/components/Skeleton.tsx
new file mode 100644
index 00000000..63fc6da3
--- /dev/null
+++ b/apps/mobile/components/Skeleton.tsx
@@ -0,0 +1,38 @@
+import { useEffect, useRef } from 'react';
+import { Animated, type View } from 'react-native';
+
+import { cn } from '../lib/utils';
+
+function Skeleton({
+ className,
+ ...props
+}: { className?: string } & React.ComponentPropsWithoutRef) {
+ const fadeAnim = useRef(new Animated.Value(0.5)).current;
+
+ useEffect(() => {
+ Animated.loop(
+ Animated.sequence([
+ Animated.timing(fadeAnim, {
+ toValue: 1,
+ duration: 1000,
+ useNativeDriver: true,
+ }),
+ Animated.timing(fadeAnim, {
+ toValue: 0.5,
+ duration: 1000,
+ useNativeDriver: true,
+ }),
+ ])
+ ).start();
+ }, [fadeAnim]);
+
+ return (
+
+ );
+}
+
+export { Skeleton };
diff --git a/apps/mobile/components/Switch.tsx b/apps/mobile/components/Switch.tsx
new file mode 100644
index 00000000..3dbab20d
--- /dev/null
+++ b/apps/mobile/components/Switch.tsx
@@ -0,0 +1,29 @@
+import { Switch as NativeSwitch, useColorScheme } from 'react-native';
+
+import { theme } from '../lib/theme';
+
+function Switch({
+ ...props
+}: React.ComponentPropsWithoutRef) {
+ const colorScheme = useColorScheme();
+ const currentTheme = colorScheme === 'dark' ? theme.dark : theme.light;
+
+ const trackColor = props.trackColor || {
+ false: currentTheme.background,
+ true: currentTheme.foreground,
+ };
+ const thumbColor = props.thumbColor || currentTheme.background;
+ const ios_backgroundColor =
+ props.ios_backgroundColor || currentTheme.background;
+
+ return (
+
+ );
+}
+
+export { Switch };
diff --git a/apps/mobile/components/Tabs.tsx b/apps/mobile/components/Tabs.tsx
new file mode 100644
index 00000000..e5476034
--- /dev/null
+++ b/apps/mobile/components/Tabs.tsx
@@ -0,0 +1,98 @@
+import { createContext, useContext, useState } from 'react';
+import { Text, TouchableOpacity, View } from 'react-native';
+
+import { cn } from '../lib/utils';
+
+interface TabsContextProps {
+ activeTab: string;
+ setActiveTab: (id: string) => void;
+}
+const TabsContext = createContext({
+ activeTab: '',
+ setActiveTab: () => {},
+});
+
+interface TabsProps {
+ defaultValue: string;
+ children: React.ReactNode;
+}
+function Tabs({ defaultValue, children }: TabsProps) {
+ const [activeTab, setActiveTab] = useState(defaultValue);
+
+ return (
+
+ {children}
+
+ );
+}
+
+function TabsList({
+ className,
+ ...props
+}: React.ComponentPropsWithoutRef) {
+ return (
+
+ );
+}
+
+interface TabsTriggerProps
+ extends React.ComponentPropsWithoutRef {
+ value: string;
+ title: string;
+ textClasses?: string;
+}
+function TabsTrigger({
+ value,
+ title,
+ className,
+ textClasses,
+ ...props
+}: TabsTriggerProps) {
+ const { activeTab, setActiveTab } = useContext(TabsContext);
+
+ return (
+ setActiveTab(value)}
+ {...props}
+ >
+
+ {title}
+
+
+ );
+}
+
+interface TabsContentProps extends React.ComponentPropsWithoutRef {
+ value: string;
+}
+function TabsContent({ value, className, ...props }: TabsContentProps) {
+ const { activeTab } = useContext(TabsContext);
+
+ if (value === activeTab)
+ return (
+
+ );
+
+ return null;
+}
+
+export { Tabs, TabsList, TabsTrigger, TabsContent };
diff --git a/apps/mobile/components/ThemedText.tsx b/apps/mobile/components/ThemedText.tsx
deleted file mode 100644
index c0e1a78f..00000000
--- a/apps/mobile/components/ThemedText.tsx
+++ /dev/null
@@ -1,60 +0,0 @@
-import { Text, type TextProps, StyleSheet } from 'react-native';
-
-import { useThemeColor } from '@/hooks/useThemeColor';
-
-export type ThemedTextProps = TextProps & {
- lightColor?: string;
- darkColor?: string;
- type?: 'default' | 'title' | 'defaultSemiBold' | 'subtitle' | 'link';
-};
-
-export function ThemedText({
- style,
- lightColor,
- darkColor,
- type = 'default',
- ...rest
-}: ThemedTextProps) {
- const color = useThemeColor({ light: lightColor, dark: darkColor }, 'text');
-
- return (
-
- );
-}
-
-const styles = StyleSheet.create({
- default: {
- fontSize: 16,
- lineHeight: 24,
- },
- defaultSemiBold: {
- fontSize: 16,
- lineHeight: 24,
- fontWeight: '600',
- },
- title: {
- fontSize: 32,
- fontWeight: 'bold',
- lineHeight: 32,
- },
- subtitle: {
- fontSize: 20,
- fontWeight: 'bold',
- },
- link: {
- lineHeight: 30,
- fontSize: 16,
- color: '#0a7ea4',
- },
-});
diff --git a/apps/mobile/components/ThemedView.tsx b/apps/mobile/components/ThemedView.tsx
deleted file mode 100644
index 4d2cb09d..00000000
--- a/apps/mobile/components/ThemedView.tsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import { View, type ViewProps } from 'react-native';
-
-import { useThemeColor } from '@/hooks/useThemeColor';
-
-export type ThemedViewProps = ViewProps & {
- lightColor?: string;
- darkColor?: string;
-};
-
-export function ThemedView({ style, lightColor, darkColor, ...otherProps }: ThemedViewProps) {
- const backgroundColor = useThemeColor({ light: lightColor, dark: darkColor }, 'background');
-
- return ;
-}
diff --git a/apps/mobile/components/Toast.tsx b/apps/mobile/components/Toast.tsx
new file mode 100644
index 00000000..d3e19aa5
--- /dev/null
+++ b/apps/mobile/components/Toast.tsx
@@ -0,0 +1,177 @@
+import { createContext, useContext, useEffect, useRef, useState } from 'react';
+import { Animated, Text, View } from 'react-native';
+
+import { cn } from '../lib/utils';
+
+const toastVariants = {
+ default: 'bg-foreground',
+ destructive: 'bg-destructive',
+ success: 'bg-green-500',
+ info: 'bg-blue-500',
+};
+
+interface ToastProps {
+ id: number;
+ message: string;
+ onHide: (id: number) => void;
+ variant?: keyof typeof toastVariants;
+ duration?: number;
+ showProgress?: boolean;
+}
+function Toast({
+ id,
+ message,
+ onHide,
+ variant = 'default',
+ duration = 3000,
+ showProgress = true,
+}: ToastProps) {
+ const opacity = useRef(new Animated.Value(0)).current;
+ const progress = useRef(new Animated.Value(0)).current;
+
+ useEffect(() => {
+ Animated.sequence([
+ Animated.timing(opacity, {
+ toValue: 1,
+ duration: 500,
+ useNativeDriver: true,
+ }),
+ Animated.timing(progress, {
+ toValue: 1,
+ duration: duration - 1000,
+ useNativeDriver: false,
+ }),
+ Animated.timing(opacity, {
+ toValue: 0,
+ duration: 500,
+ useNativeDriver: true,
+ }),
+ ]).start(() => onHide(id));
+ }, [duration]);
+
+ return (
+
+ {message}
+ {showProgress && (
+
+
+
+ )}
+
+ );
+}
+
+type ToastVariant = keyof typeof toastVariants;
+
+interface ToastMessage {
+ id: number;
+ text: string;
+ variant: ToastVariant;
+ duration?: number;
+ position?: string;
+ showProgress?: boolean;
+}
+interface ToastContextProps {
+ toast: (
+ message: string,
+ variant?: keyof typeof toastVariants,
+ duration?: number,
+ position?: 'top' | 'bottom',
+ showProgress?: boolean
+ ) => void;
+ removeToast: (id: number) => void;
+}
+const ToastContext = createContext(undefined);
+
+// TODO: refactor to pass position to Toast instead of ToastProvider
+function ToastProvider({
+ children,
+ position = 'top',
+}: {
+ children: React.ReactNode;
+ position?: 'top' | 'bottom';
+}) {
+ const [messages, setMessages] = useState([]);
+
+ const toast: ToastContextProps['toast'] = (
+ message: string,
+ variant: ToastVariant = 'default',
+ duration: number = 3000,
+ position: 'top' | 'bottom' = 'top',
+ showProgress: boolean = true
+ ) => {
+ setMessages(prev => [
+ ...prev,
+ {
+ id: Date.now(),
+ text: message,
+ variant,
+ duration,
+ position,
+ showProgress,
+ },
+ ]);
+ };
+
+ const removeToast = (id: number) => {
+ setMessages(prev => prev.filter(message => message.id !== id));
+ };
+
+ return (
+
+ {children}
+
+ {messages.map(message => (
+
+ ))}
+
+
+ );
+}
+
+function useToast() {
+ const context = useContext(ToastContext);
+ if (!context) {
+ throw new Error('useToast must be used within ToastProvider');
+ }
+ return context;
+}
+
+export { ToastProvider, ToastVariant, Toast, toastVariants, useToast };
diff --git a/apps/mobile/global.css b/apps/mobile/global.css
new file mode 100644
index 00000000..74139351
--- /dev/null
+++ b/apps/mobile/global.css
@@ -0,0 +1,81 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+@layer base {
+ :root {
+ --background: 0 0% 100%;
+ --foreground: 222.2 47.4% 11.2%;
+
+ --muted: 210 40% 96.1%;
+ --muted-foreground: 215.4 16.3% 46.9%;
+
+ --popover: 0 0% 100%;
+ --popover-foreground: 222.2 47.4% 11.2%;
+
+ --border: 214.3 31.8% 91.4%;
+ --input: 214.3 31.8% 91.4%;
+
+ --card: 0 0% 100%;
+ --card-foreground: 222.2 47.4% 11.2%;
+
+ --primary: 222.2 47.4% 11.2%;
+ --primary-foreground: 210 40% 98%;
+
+ --secondary: 210 40% 96.1%;
+ --secondary-foreground: 222.2 47.4% 11.2%;
+
+ --accent: 210 40% 96.1%;
+ --accent-foreground: 222.2 47.4% 11.2%;
+
+ --destructive: 0 100% 50%;
+ --destructive-foreground: 210 40% 98%;
+
+ --ring: 215 20.2% 65.1%;
+
+ --radius: 0.5rem;
+ }
+
+ .dark:root {
+ --background: 224 71% 4%;
+ --foreground: 213 31% 91%;
+
+ --muted: 223 47% 11%;
+ --muted-foreground: 215.4 16.3% 56.9%;
+
+ --accent: 216 34% 17%;
+ --accent-foreground: 210 40% 98%;
+
+ --popover: 224 71% 4%;
+ --popover-foreground: 215 20.2% 65.1%;
+
+ --border: 216 34% 17%;
+ --input: 216 34% 17%;
+
+ --card: 224 71% 4%;
+ --card-foreground: 213 31% 91%;
+
+ --primary: 210 40% 98%;
+ --primary-foreground: 222.2 47.4% 1.2%;
+
+ --secondary: 222.2 47.4% 11.2%;
+ --secondary-foreground: 210 40% 98%;
+
+ --destructive: 0 63% 31%;
+ --destructive-foreground: 210 40% 98%;
+
+ --ring: 216 34% 17%;
+
+ --radius: 0.5rem;
+ }
+}
+
+@layer base {
+ * {
+ @apply border-border;
+ }
+
+ body {
+ @apply bg-background text-foreground;
+ }
+}
diff --git a/apps/mobile/lib/theme.ts b/apps/mobile/lib/theme.ts
new file mode 100644
index 00000000..d46cb676
--- /dev/null
+++ b/apps/mobile/lib/theme.ts
@@ -0,0 +1,10 @@
+export const theme = {
+ light: {
+ background: 'hsl(0, 0%, 100%)',
+ foreground: 'hsl(222.2, 47.4%, 11.2%)',
+ },
+ dark: {
+ background: 'hsl(224, 71% 4%)',
+ foreground: 'hsl(213, 31% 91%)',
+ },
+};
diff --git a/apps/mobile/lib/utils.ts b/apps/mobile/lib/utils.ts
new file mode 100644
index 00000000..9ad0df42
--- /dev/null
+++ b/apps/mobile/lib/utils.ts
@@ -0,0 +1,6 @@
+import { type ClassValue, clsx } from 'clsx';
+import { twMerge } from 'tailwind-merge';
+
+export function cn(...inputs: ClassValue[]) {
+ return twMerge(clsx(inputs));
+}
diff --git a/apps/mobile/metro.config.js b/apps/mobile/metro.config.js
index e50eb26f..4051196d 100644
--- a/apps/mobile/metro.config.js
+++ b/apps/mobile/metro.config.js
@@ -1,4 +1,6 @@
const { getDefaultConfig } = require('expo/metro-config');
+const { withNativeWind } = require('nativewind/metro');
+
const path = require('path');
// Find the project and workspace directories
@@ -16,4 +18,4 @@ config.resolver.nodeModulesPaths = [
path.resolve(monorepoRoot, 'node_modules'),
];
-module.exports = config;
+module.exports = withNativeWind(config, { input: './global.css' });
diff --git a/apps/mobile/nativewind-env.d.ts b/apps/mobile/nativewind-env.d.ts
new file mode 100644
index 00000000..a13e3136
--- /dev/null
+++ b/apps/mobile/nativewind-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/apps/mobile/package.json b/apps/mobile/package.json
index 7df83a78..48ebf98a 100644
--- a/apps/mobile/package.json
+++ b/apps/mobile/package.json
@@ -3,7 +3,7 @@
"main": "index.js",
"version": "1.0.0",
"scripts": {
- "start": "expo start",
+ "start": "expo start -c",
"reset-project": "node ./scripts/reset-project.js",
"android": "expo start --android",
"ios": "expo start --ios",
@@ -17,6 +17,8 @@
"dependencies": {
"@expo/vector-icons": "^14.0.0",
"@react-navigation/native": "^6.0.2",
+ "class-variance-authority": "^0.7.0",
+ "clsx": "^2.1.1",
"expo": "~51.0.11",
"expo-constants": "~16.0.2",
"expo-font": "~12.0.7",
@@ -26,6 +28,8 @@
"expo-status-bar": "~1.12.1",
"expo-system-ui": "~3.0.6",
"expo-web-browser": "~13.0.3",
+ "lucide-react-native": "^0.390.0",
+ "nativewind": "^4.0.36",
"react": "18.2.0",
"react-dom": "18.2.0",
"react-native": "0.74.2",
@@ -33,7 +37,9 @@
"react-native-reanimated": "~3.10.1",
"react-native-safe-area-context": "4.10.1",
"react-native-screens": "3.31.1",
- "react-native-web": "~0.19.10"
+ "react-native-web": "~0.19.10",
+ "tailwind-merge": "^2.3.0",
+ "tailwindcss-animate": "^1.0.7"
},
"devDependencies": {
"@babel/core": "^7.20.0",
@@ -43,6 +49,7 @@
"jest": "^29.2.1",
"jest-expo": "~51.0.1",
"react-test-renderer": "18.2.0",
+ "tailwindcss": "^3.4.4",
"typescript": "~5.3.3"
},
"private": true
diff --git a/apps/mobile/tailwind.config.js b/apps/mobile/tailwind.config.js
new file mode 100644
index 00000000..cc137e19
--- /dev/null
+++ b/apps/mobile/tailwind.config.js
@@ -0,0 +1,72 @@
+const { hairlineWidth } = require('nativewind/theme');
+
+/** @type {import('tailwindcss').Config} */
+module.exports = {
+ darkMode: 'class',
+ content: ['./app/**/*.{js,jsx,ts,tsx}', './components/**/*.{js,jsx,ts,tsx}'],
+ presets: [require('nativewind/preset')],
+ theme: {
+ container: {
+ center: true,
+ padding: '2rem',
+ screens: {
+ '2xl': '1400px',
+ },
+ },
+ extend: {
+ colors: {
+ border: 'hsl(var(--border))',
+ input: 'hsl(var(--input))',
+ ring: 'hsl(var(--ring))',
+ background: 'hsl(var(--background))',
+ foreground: 'hsl(var(--foreground))',
+ primary: {
+ DEFAULT: 'hsl(var(--primary))',
+ foreground: 'hsl(var(--primary-foreground))',
+ },
+ secondary: {
+ DEFAULT: 'hsl(var(--secondary))',
+ foreground: 'hsl(var(--secondary-foreground))',
+ },
+ destructive: {
+ DEFAULT: 'hsl(var(--destructive))',
+ foreground: 'hsl(var(--destructive-foreground))',
+ },
+ muted: {
+ DEFAULT: 'hsl(var(--muted))',
+ foreground: 'hsl(var(--muted-foreground))',
+ },
+ accent: {
+ DEFAULT: 'hsl(var(--accent))',
+ foreground: 'hsl(var(--accent-foreground))',
+ },
+ popover: {
+ DEFAULT: 'hsl(var(--popover))',
+ foreground: 'hsl(var(--popover-foreground))',
+ },
+ card: {
+ DEFAULT: 'hsl(var(--card))',
+ foreground: 'hsl(var(--card-foreground))',
+ },
+ },
+ borderWidth: {
+ hairline: hairlineWidth(),
+ },
+ keyframes: {
+ 'accordion-down': {
+ from: { height: '0' },
+ to: { height: 'var(--radix-accordion-content-height)' },
+ },
+ 'accordion-up': {
+ from: { height: 'var(--radix-accordion-content-height)' },
+ to: { height: '0' },
+ },
+ },
+ animation: {
+ 'accordion-down': 'accordion-down 0.2s ease-out',
+ 'accordion-up': 'accordion-up 0.2s ease-out',
+ },
+ },
+ },
+ plugins: [require('tailwindcss-animate')],
+};
diff --git a/package.json b/package.json
index f9bb4984..667e0e8c 100644
--- a/package.json
+++ b/package.json
@@ -10,6 +10,7 @@
"api:dev": "pnpm --filter @6pm/api run dev",
"api:build": "pnpm --filter @6pm/api run build",
"api:start": "pnpm --filter @6pm/api run start",
+ "mobile": "pnpm --filter @6pm/mobile",
"mobile:start": "pnpm --filter @6pm/mobile run start"
},
"devDependencies": {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index c71fdacd..5cb01345 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -81,6 +81,12 @@ importers:
'@react-navigation/native':
specifier: ^6.0.2
version: 6.1.17(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0)
+ class-variance-authority:
+ specifier: ^0.7.0
+ version: 0.7.0
+ clsx:
+ specifier: ^2.1.1
+ version: 2.1.1
expo:
specifier: ~51.0.11
version: 51.0.11(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))
@@ -108,6 +114,12 @@ importers:
expo-web-browser:
specifier: ~13.0.3
version: 13.0.3(expo@51.0.11(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7)))
+ lucide-react-native:
+ specifier: ^0.390.0
+ version: 0.390.0(react-native-svg@15.3.0(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0)
+ nativewind:
+ specifier: ^4.0.36
+ version: 4.0.36(@babel/core@7.24.7)(react-native-reanimated@3.10.1(@babel/core@7.24.7)(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0))(react-native-safe-area-context@4.10.1(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0))(react-native-svg@15.3.0(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0)(tailwindcss@3.4.4)
react:
specifier: 18.2.0
version: 18.2.0
@@ -132,6 +144,12 @@ importers:
react-native-web:
specifier: ~0.19.10
version: 0.19.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ tailwind-merge:
+ specifier: ^2.3.0
+ version: 2.3.0
+ tailwindcss-animate:
+ specifier: ^1.0.7
+ version: 1.0.7(tailwindcss@3.4.4)
devDependencies:
'@babel/core':
specifier: ^7.20.0
@@ -154,12 +172,19 @@ importers:
react-test-renderer:
specifier: 18.2.0
version: 18.2.0(react@18.2.0)
+ tailwindcss:
+ specifier: ^3.4.4
+ version: 3.4.4
typescript:
specifier: ~5.3.3
version: 5.3.3
packages:
+ '@alloc/quick-lru@5.2.0':
+ resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
+ engines: {node: '>=10'}
+
'@ampproject/remapping@2.3.0':
resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
engines: {node: '>=6.0.0'}
@@ -1851,6 +1876,12 @@ packages:
babel-plugin-react-native-web@0.19.12:
resolution: {integrity: sha512-eYZ4+P6jNcB37lObWIg0pUbi7+3PKoU1Oie2j0C8UF3cXyXoR74tO2NBjI/FORb2LJyItJZEAmjU5pSaJYEL1w==}
+ babel-plugin-tester@11.0.4:
+ resolution: {integrity: sha512-cqswtpSPo0e++rZB0l/54EG17LL25l9gLgh59yXfnmNxX+2lZTIOpx2zt4YI9QIClVXc8xf63J6yWwKkzy0jNg==}
+ engines: {node: ^14.20.0 || ^16.16.0 || >=18.5.0}
+ peerDependencies:
+ '@babel/core': '>=7.11.6'
+
babel-plugin-transform-flow-enums@0.0.2:
resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==}
@@ -1882,9 +1913,16 @@ packages:
resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==}
engines: {node: '>=0.6'}
+ binary-extensions@2.3.0:
+ resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+ engines: {node: '>=8'}
+
bl@4.1.0:
resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
+ boolbase@1.0.0:
+ resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+
bplist-creator@0.1.0:
resolution: {integrity: sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==}
@@ -1964,6 +2002,10 @@ packages:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
+ camelcase-css@2.0.1:
+ resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
+ engines: {node: '>= 6'}
+
camelcase@5.3.1:
resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
engines: {node: '>=6'}
@@ -1998,6 +2040,10 @@ packages:
charenc@0.0.2:
resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==}
+ chokidar@3.6.0:
+ resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+ engines: {node: '>= 8.10.0'}
+
chownr@2.0.0:
resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==}
engines: {node: '>=10'}
@@ -2017,6 +2063,9 @@ packages:
cjs-module-lexer@1.3.1:
resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==}
+ class-variance-authority@0.7.0:
+ resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==}
+
clean-stack@2.2.0:
resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
engines: {node: '>=6'}
@@ -2055,6 +2104,14 @@ packages:
resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==}
engines: {node: '>=0.8'}
+ clsx@2.0.0:
+ resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==}
+ engines: {node: '>=6'}
+
+ clsx@2.1.1:
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
+ engines: {node: '>=6'}
+
co@4.6.0:
resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==}
engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
@@ -2149,6 +2206,9 @@ packages:
core-js-compat@3.37.1:
resolution: {integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==}
+ core-js@3.37.1:
+ resolution: {integrity: sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==}
+
core-util-is@1.0.3:
resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
@@ -2186,6 +2246,22 @@ packages:
css-in-js-utils@3.1.0:
resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==}
+ css-select@5.1.0:
+ resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==}
+
+ css-tree@1.1.3:
+ resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==}
+ engines: {node: '>=8.0.0'}
+
+ css-what@6.1.0:
+ resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==}
+ engines: {node: '>= 6'}
+
+ cssesc@3.0.0:
+ resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+ engines: {node: '>=4'}
+ hasBin: true
+
cssom@0.3.8:
resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==}
@@ -2327,6 +2403,9 @@ packages:
resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==}
engines: {node: '>=8'}
+ didyoumean@1.2.2:
+ resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
+
diff-sequences@29.6.3:
resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@@ -2335,11 +2414,27 @@ packages:
resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
engines: {node: '>=8'}
+ dlv@1.1.3:
+ resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
+
+ dom-serializer@2.0.0:
+ resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
+
+ domelementtype@2.3.0:
+ resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
+
domexception@4.0.0:
resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==}
engines: {node: '>=12'}
deprecated: Use your platform's native DOMException instead
+ domhandler@5.0.3:
+ resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
+ engines: {node: '>= 4'}
+
+ domutils@3.1.0:
+ resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==}
+
dot-case@3.0.4:
resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
@@ -2750,6 +2845,10 @@ packages:
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
engines: {node: '>= 6'}
+ glob-parent@6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+
glob-to-regexp@0.4.1:
resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
@@ -2963,6 +3062,10 @@ packages:
is-bigint@1.0.4:
resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
+ is-binary-path@2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+
is-boolean-object@1.1.2:
resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
engines: {node: '>= 0.4'}
@@ -3303,6 +3406,10 @@ packages:
jimp-compact@0.16.1:
resolution: {integrity: sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==}
+ jiti@1.21.3:
+ resolution: {integrity: sha512-uy2bNX5zQ+tESe+TiC7ilGRz8AtRGmnJH55NC5S0nSUjvvvM2hJHmefHErugGXN4pNv4Qx7vLsnNw9qJ9mtIsw==}
+ hasBin: true
+
joi@17.13.1:
resolution: {integrity: sha512-vaBlIKCyo4FCUtCm7Eu4QZd/q02bWcxfUO6YSXAZOWF6gzcLBeba8kwotUdYJjDLW8Cz8RywsSOqiNJZW0mNvg==}
@@ -3399,52 +3506,118 @@ packages:
cpu: [arm64]
os: [darwin]
+ lightningcss-darwin-arm64@1.22.0:
+ resolution: {integrity: sha512-aH2be3nNny+It5YEVm8tBSSdRlBVWQV8m2oJ7dESiYRzyY/E/bQUe2xlw5caaMuhlM9aoTMtOH25yzMhir0qPg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [darwin]
+
lightningcss-darwin-x64@1.19.0:
resolution: {integrity: sha512-Lif1wD6P4poaw9c/4Uh2z+gmrWhw/HtXFoeZ3bEsv6Ia4tt8rOJBdkfVaUJ6VXmpKHALve+iTyP2+50xY1wKPw==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [darwin]
+ lightningcss-darwin-x64@1.22.0:
+ resolution: {integrity: sha512-9KHRFA0Y6mNxRHeoQMp0YaI0R0O2kOgUlYPRjuasU4d+pI8NRhVn9bt0yX9VPs5ibWX1RbDViSPtGJvYYrfVAQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [darwin]
+
+ lightningcss-freebsd-x64@1.22.0:
+ resolution: {integrity: sha512-xaYL3xperGwD85rQioDb52ozF3NAJb+9wrge3jD9lxGffplu0Mn35rXMptB8Uc2N9Mw1i3Bvl7+z1evlqVl7ww==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [freebsd]
+
lightningcss-linux-arm-gnueabihf@1.19.0:
resolution: {integrity: sha512-P15VXY5682mTXaiDtbnLYQflc8BYb774j2R84FgDLJTN6Qp0ZjWEFyN1SPqyfTj2B2TFjRHRUvQSSZ7qN4Weig==}
engines: {node: '>= 12.0.0'}
cpu: [arm]
os: [linux]
+ lightningcss-linux-arm-gnueabihf@1.22.0:
+ resolution: {integrity: sha512-epQGvXIjOuxrZpMpMnRjK54ZqzhiHhCPLtHvw2fb6NeK2kK9YtF0wqmeTBiQ1AkbWfnnXGTstYaFNiadNK+StQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm]
+ os: [linux]
+
lightningcss-linux-arm64-gnu@1.19.0:
resolution: {integrity: sha512-zwXRjWqpev8wqO0sv0M1aM1PpjHz6RVIsBcxKszIG83Befuh4yNysjgHVplF9RTU7eozGe3Ts7r6we1+Qkqsww==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [linux]
+ lightningcss-linux-arm64-gnu@1.22.0:
+ resolution: {integrity: sha512-AArGtKSY4DGTA8xP8SDyNyKtpsUl1Rzq6FW4JomeyUQ4nBrR71uPChksTpj3gmWuGhZeRKLeCUI1DBid/zhChg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+
lightningcss-linux-arm64-musl@1.19.0:
resolution: {integrity: sha512-vSCKO7SDnZaFN9zEloKSZM5/kC5gbzUjoJQ43BvUpyTFUX7ACs/mDfl2Eq6fdz2+uWhUh7vf92c4EaaP4udEtA==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [linux]
+ lightningcss-linux-arm64-musl@1.22.0:
+ resolution: {integrity: sha512-RRraNgP8hnBPhInTTUdlFm+z16C/ghbxBG51Sw00hd7HUyKmEUKRozyc5od+/N6pOrX/bIh5vIbtMXIxsos0lg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+
lightningcss-linux-x64-gnu@1.19.0:
resolution: {integrity: sha512-0AFQKvVzXf9byrXUq9z0anMGLdZJS+XSDqidyijI5njIwj6MdbvX2UZK/c4FfNmeRa2N/8ngTffoIuOUit5eIQ==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [linux]
+ lightningcss-linux-x64-gnu@1.22.0:
+ resolution: {integrity: sha512-grdrhYGRi2KrR+bsXJVI0myRADqyA7ekprGxiuK5QRNkv7kj3Yq1fERDNyzZvjisHwKUi29sYMClscbtl+/Zpw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+
lightningcss-linux-x64-musl@1.19.0:
resolution: {integrity: sha512-SJoM8CLPt6ECCgSuWe+g0qo8dqQYVcPiW2s19dxkmSI5+Uu1GIRzyKA0b7QqmEXolA+oSJhQqCmJpzjY4CuZAg==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [linux]
+ lightningcss-linux-x64-musl@1.22.0:
+ resolution: {integrity: sha512-t5f90X+iQUtIyR56oXIHMBUyQFX/zwmPt72E6Dane3P8KNGlkijTg2I75XVQS860gNoEFzV7Mm5ArRRA7u5CAQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+
lightningcss-win32-x64-msvc@1.19.0:
resolution: {integrity: sha512-C+VuUTeSUOAaBZZOPT7Etn/agx/MatzJzGRkeV+zEABmPuntv1zihncsi+AyGmjkkzq3wVedEy7h0/4S84mUtg==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [win32]
+ lightningcss-win32-x64-msvc@1.22.0:
+ resolution: {integrity: sha512-64HTDtOOZE9PUCZJiZZQpyqXBbdby1lnztBccnqh+NtbKxjnGzP92R2ngcgeuqMPecMNqNWxgoWgTGpC+yN5Sw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [win32]
+
lightningcss@1.19.0:
resolution: {integrity: sha512-yV5UR7og+Og7lQC+70DA7a8ta1uiOPnWPJfxa0wnxylev5qfo4P+4iMpzWAdYWOca4jdNQZii+bDL/l+4hUXIA==}
engines: {node: '>= 12.0.0'}
+ lightningcss@1.22.0:
+ resolution: {integrity: sha512-+z0qvwRVzs4XGRXelnWRNwqsXUx8k3bSkbP8vD42kYKSk3z9OM2P3e/gagT7ei/gwh8DTS80LZOFZV6lm8Z8Fg==}
+ engines: {node: '>= 12.0.0'}
+
+ lilconfig@2.1.0:
+ resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
+ engines: {node: '>=10'}
+
+ lilconfig@3.1.1:
+ resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==}
+ engines: {node: '>=14'}
+
lines-and-columns@1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
@@ -3463,6 +3636,9 @@ packages:
lodash.debounce@4.0.8:
resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
+ lodash.mergewith@4.6.2:
+ resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==}
+
lodash.throttle@4.1.1:
resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==}
@@ -3499,6 +3675,13 @@ packages:
resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
engines: {node: '>=10'}
+ lucide-react-native@0.390.0:
+ resolution: {integrity: sha512-JFxyXoRP2GLW2Zft4znWXbNpfexA4kC60KKXyJT3BZ+jDK5dvhZVzp1/3A2jCFbNYsZFJFVBXJcD+ahstBKl7w==}
+ peerDependencies:
+ react: ^16.5.1 || ^17.0.0 || ^18.0.0
+ react-native: '*'
+ react-native-svg: ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0
+
make-dir@2.1.0:
resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==}
engines: {node: '>=6'}
@@ -3531,6 +3714,9 @@ packages:
md5hex@1.0.0:
resolution: {integrity: sha512-c2YOUbp33+6thdCUi34xIyOU/a7bvGKj/3DB1iaPMTuPHf/Q2d5s4sn1FaCOO43XkXggnb08y5W2PU8UNYNLKQ==}
+ mdn-data@2.0.14:
+ resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==}
+
memoize-one@5.2.1:
resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==}
@@ -3635,6 +3821,10 @@ packages:
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
engines: {node: '>=6'}
+ min-indent@1.0.1:
+ resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
+ engines: {node: '>=4'}
+
minimatch@3.1.2:
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
@@ -3707,6 +3897,12 @@ packages:
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
+ nativewind@4.0.36:
+ resolution: {integrity: sha512-nd0Xgjzaq0ISvUAjibZXcuSvvpX1BGX2mfOGBPZpjGfHL3By6fwLGsNhrKU6mi2FF30c+kdok3e2I4k/O0UO1Q==}
+ engines: {node: '>=16'}
+ peerDependencies:
+ tailwindcss: '>3.3.0'
+
natural-compare@1.4.0:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
@@ -3797,6 +3993,9 @@ packages:
resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
engines: {node: '>=8'}
+ nth-check@2.1.1:
+ resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+
nullthrows@1.1.1:
resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==}
@@ -3811,6 +4010,10 @@ packages:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'}
+ object-hash@3.0.0:
+ resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
+ engines: {node: '>= 6'}
+
object-inspect@1.13.1:
resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==}
@@ -3991,6 +4194,10 @@ packages:
resolution: {integrity: sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==}
engines: {node: '>=10'}
+ pify@2.3.0:
+ resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
+ engines: {node: '>=0.10.0'}
+
pify@4.0.1:
resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
engines: {node: '>=6'}
@@ -4019,6 +4226,40 @@ packages:
resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==}
engines: {node: '>= 0.4'}
+ postcss-import@15.1.0:
+ resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ postcss: ^8.0.0
+
+ postcss-js@4.0.1:
+ resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
+ engines: {node: ^12 || ^14 || >= 16}
+ peerDependencies:
+ postcss: ^8.4.21
+
+ postcss-load-config@4.0.2:
+ resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==}
+ engines: {node: '>= 14'}
+ peerDependencies:
+ postcss: '>=8.0.9'
+ ts-node: '>=9.0.0'
+ peerDependenciesMeta:
+ postcss:
+ optional: true
+ ts-node:
+ optional: true
+
+ postcss-nested@6.0.1:
+ resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==}
+ engines: {node: '>=12.0'}
+ peerDependencies:
+ postcss: ^8.2.14
+
+ postcss-selector-parser@6.1.0:
+ resolution: {integrity: sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==}
+ engines: {node: '>=4'}
+
postcss-value-parser@4.2.0:
resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
@@ -4049,6 +4290,11 @@ packages:
postgres-range@1.1.4:
resolution: {integrity: sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==}
+ prettier@2.8.8:
+ resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+
pretty-bytes@5.6.0:
resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==}
engines: {node: '>=6'}
@@ -4160,6 +4406,22 @@ packages:
react-is@18.3.1:
resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
+ react-native-css-interop@0.0.36:
+ resolution: {integrity: sha512-ZWoKQlq6XrI5DB4BdPk5ABvJQsX7zls1SQYWuYXOQB8u5QE0KH3OfOGAGRZPekTjgkhjqGO4Bf8G2JTSWAYMSg==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ react: '>=18'
+ react-native: '*'
+ react-native-reanimated: '>=3.6.2'
+ react-native-safe-area-context: '*'
+ react-native-svg: '*'
+ tailwindcss: ~3
+ peerDependenciesMeta:
+ react-native-safe-area-context:
+ optional: true
+ react-native-svg:
+ optional: true
+
react-native-gesture-handler@2.16.2:
resolution: {integrity: sha512-vGFlrDKlmyI+BT+FemqVxmvO7nqxU33cgXVsn6IKAFishvlG3oV2Ds67D5nPkHMea8T+s1IcuMm0bF8ntZtAyg==}
peerDependencies:
@@ -4190,6 +4452,12 @@ packages:
react: '*'
react-native: '*'
+ react-native-svg@15.3.0:
+ resolution: {integrity: sha512-mBHu/fdlzUbpGX8SZFxgbKvK/sgqLfDLP8uh8G7Us+zJgdjO8OSEeqHQs+kPRdQmdLJQiqPJX2WXgCl7ToTWqw==}
+ peerDependencies:
+ react: '*'
+ react-native: '*'
+
react-native-web@0.19.12:
resolution: {integrity: sha512-o2T0oztoVDQjztt4YksO9S1XRjoH/AqcSvifgWLrPJgGVbMWsfhILgl6lfUdEamVZzZSVV/2gqDVMAk/qq7mZw==}
peerDependencies:
@@ -4229,6 +4497,9 @@ packages:
resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
engines: {node: '>=0.10.0'}
+ read-cache@1.0.0:
+ resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
+
readable-stream@2.3.8:
resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
@@ -4236,6 +4507,10 @@ packages:
resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
engines: {node: '>= 6'}
+ readdirp@3.6.0:
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+ engines: {node: '>=8.10.0'}
+
readline@1.3.0:
resolution: {integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==}
@@ -4648,6 +4923,10 @@ packages:
resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
engines: {node: '>=6'}
+ strip-indent@3.0.0:
+ resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
+ engines: {node: '>=8'}
+
strip-json-comments@2.0.1:
resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==}
engines: {node: '>=0.10.0'}
@@ -4720,6 +4999,19 @@ packages:
symbol-tree@3.2.4:
resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
+ tailwind-merge@2.3.0:
+ resolution: {integrity: sha512-vkYrLpIP+lgR0tQCG6AP7zZXCTLc1Lnv/CCRT3BqJ9CZ3ui2++GPaGb1x/ILsINIMSYqqvrpqjUFsMNLlW99EA==}
+
+ tailwindcss-animate@1.0.7:
+ resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==}
+ peerDependencies:
+ tailwindcss: '>=3.0.0 || insiders'
+
+ tailwindcss@3.4.4:
+ resolution: {integrity: sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==}
+ engines: {node: '>=14.0.0'}
+ hasBin: true
+
tar@6.2.1:
resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==}
engines: {node: '>=10'}
@@ -5208,6 +5500,8 @@ packages:
snapshots:
+ '@alloc/quick-lru@5.2.0': {}
+
'@ampproject/remapping@2.3.0':
dependencies:
'@jridgewell/gen-mapping': 0.3.5
@@ -7681,6 +7975,17 @@ snapshots:
babel-plugin-react-native-web@0.19.12: {}
+ babel-plugin-tester@11.0.4(@babel/core@7.24.7):
+ dependencies:
+ '@babel/core': 7.24.7
+ core-js: 3.37.1
+ debug: 4.3.5
+ lodash.mergewith: 4.6.2
+ prettier: 2.8.8
+ strip-indent: 3.0.0
+ transitivePeerDependencies:
+ - supports-color
+
babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.24.7):
dependencies:
'@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.24.7)
@@ -7735,12 +8040,16 @@ snapshots:
big-integer@1.6.52: {}
+ binary-extensions@2.3.0: {}
+
bl@4.1.0:
dependencies:
buffer: 5.7.1
inherits: 2.0.4
readable-stream: 3.6.2
+ boolbase@1.0.0: {}
+
bplist-creator@0.1.0:
dependencies:
stream-buffers: 2.2.0
@@ -7836,6 +8145,8 @@ snapshots:
callsites@3.1.0: {}
+ camelcase-css@2.0.1: {}
+
camelcase@5.3.1: {}
camelcase@6.3.0: {}
@@ -7864,6 +8175,18 @@ snapshots:
charenc@0.0.2: {}
+ chokidar@3.6.0:
+ dependencies:
+ anymatch: 3.1.3
+ braces: 3.0.3
+ glob-parent: 5.1.2
+ is-binary-path: 2.1.0
+ is-glob: 4.0.3
+ normalize-path: 3.0.0
+ readdirp: 3.6.0
+ optionalDependencies:
+ fsevents: 2.3.3
+
chownr@2.0.0: {}
chrome-launcher@0.15.2:
@@ -7881,6 +8204,10 @@ snapshots:
cjs-module-lexer@1.3.1: {}
+ class-variance-authority@0.7.0:
+ dependencies:
+ clsx: 2.0.0
+
clean-stack@2.2.0: {}
cli-cursor@2.1.0:
@@ -7917,6 +8244,10 @@ snapshots:
clone@2.1.2: {}
+ clsx@2.0.0: {}
+
+ clsx@2.1.1: {}
+
co@4.6.0: {}
code-block-writer@12.0.0: {}
@@ -8004,6 +8335,8 @@ snapshots:
dependencies:
browserslist: 4.23.1
+ core-js@3.37.1: {}
+
core-util-is@1.0.3: {}
cosmiconfig@5.2.1:
@@ -8058,6 +8391,23 @@ snapshots:
dependencies:
hyphenate-style-name: 1.0.5
+ css-select@5.1.0:
+ dependencies:
+ boolbase: 1.0.0
+ css-what: 6.1.0
+ domhandler: 5.0.3
+ domutils: 3.1.0
+ nth-check: 2.1.1
+
+ css-tree@1.1.3:
+ dependencies:
+ mdn-data: 2.0.14
+ source-map: 0.6.1
+
+ css-what@6.1.0: {}
+
+ cssesc@3.0.0: {}
+
cssom@0.3.8: {}
cssom@0.5.0: {}
@@ -8170,16 +8520,38 @@ snapshots:
detect-newline@3.1.0: {}
+ didyoumean@1.2.2: {}
+
diff-sequences@29.6.3: {}
dir-glob@3.0.1:
dependencies:
path-type: 4.0.0
+ dlv@1.1.3: {}
+
+ dom-serializer@2.0.0:
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ entities: 4.5.0
+
+ domelementtype@2.3.0: {}
+
domexception@4.0.0:
dependencies:
webidl-conversions: 7.0.0
+ domhandler@5.0.3:
+ dependencies:
+ domelementtype: 2.3.0
+
+ domutils@3.1.0:
+ dependencies:
+ dom-serializer: 2.0.0
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+
dot-case@3.0.4:
dependencies:
no-case: 3.0.4
@@ -8697,6 +9069,10 @@ snapshots:
dependencies:
is-glob: 4.0.3
+ glob-parent@6.0.2:
+ dependencies:
+ is-glob: 4.0.3
+
glob-to-regexp@0.4.1: {}
glob@10.4.1:
@@ -8921,6 +9297,10 @@ snapshots:
dependencies:
has-bigints: 1.0.2
+ is-binary-path@2.1.0:
+ dependencies:
+ binary-extensions: 2.3.0
+
is-boolean-object@1.1.2:
dependencies:
call-bind: 1.0.7
@@ -9453,6 +9833,8 @@ snapshots:
jimp-compact@0.16.1: {}
+ jiti@1.21.3: {}
+
joi@17.13.1:
dependencies:
'@hapi/hoek': 9.3.0
@@ -9587,27 +9969,54 @@ snapshots:
lightningcss-darwin-arm64@1.19.0:
optional: true
+ lightningcss-darwin-arm64@1.22.0:
+ optional: true
+
lightningcss-darwin-x64@1.19.0:
optional: true
+ lightningcss-darwin-x64@1.22.0:
+ optional: true
+
+ lightningcss-freebsd-x64@1.22.0:
+ optional: true
+
lightningcss-linux-arm-gnueabihf@1.19.0:
optional: true
+ lightningcss-linux-arm-gnueabihf@1.22.0:
+ optional: true
+
lightningcss-linux-arm64-gnu@1.19.0:
optional: true
+ lightningcss-linux-arm64-gnu@1.22.0:
+ optional: true
+
lightningcss-linux-arm64-musl@1.19.0:
optional: true
+ lightningcss-linux-arm64-musl@1.22.0:
+ optional: true
+
lightningcss-linux-x64-gnu@1.19.0:
optional: true
+ lightningcss-linux-x64-gnu@1.22.0:
+ optional: true
+
lightningcss-linux-x64-musl@1.19.0:
optional: true
+ lightningcss-linux-x64-musl@1.22.0:
+ optional: true
+
lightningcss-win32-x64-msvc@1.19.0:
optional: true
+ lightningcss-win32-x64-msvc@1.22.0:
+ optional: true
+
lightningcss@1.19.0:
dependencies:
detect-libc: 1.0.3
@@ -9621,6 +10030,24 @@ snapshots:
lightningcss-linux-x64-musl: 1.19.0
lightningcss-win32-x64-msvc: 1.19.0
+ lightningcss@1.22.0:
+ dependencies:
+ detect-libc: 1.0.3
+ optionalDependencies:
+ lightningcss-darwin-arm64: 1.22.0
+ lightningcss-darwin-x64: 1.22.0
+ lightningcss-freebsd-x64: 1.22.0
+ lightningcss-linux-arm-gnueabihf: 1.22.0
+ lightningcss-linux-arm64-gnu: 1.22.0
+ lightningcss-linux-arm64-musl: 1.22.0
+ lightningcss-linux-x64-gnu: 1.22.0
+ lightningcss-linux-x64-musl: 1.22.0
+ lightningcss-win32-x64-msvc: 1.22.0
+
+ lilconfig@2.1.0: {}
+
+ lilconfig@3.1.1: {}
+
lines-and-columns@1.2.4: {}
locate-path@3.0.0:
@@ -9638,6 +10065,8 @@ snapshots:
lodash.debounce@4.0.8: {}
+ lodash.mergewith@4.6.2: {}
+
lodash.throttle@4.1.1: {}
lodash@4.17.21: {}
@@ -9675,6 +10104,12 @@ snapshots:
dependencies:
yallist: 4.0.0
+ lucide-react-native@0.390.0(react-native-svg@15.3.0(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0):
+ dependencies:
+ react: 18.2.0
+ react-native: 0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.2.79)(react@18.2.0)
+ react-native-svg: 15.3.0(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0)
+
make-dir@2.1.0:
dependencies:
pify: 4.0.1
@@ -9710,6 +10145,8 @@ snapshots:
md5hex@1.0.0: {}
+ mdn-data@2.0.14: {}
+
memoize-one@5.2.1: {}
memoize-one@6.0.0: {}
@@ -9906,6 +10343,8 @@ snapshots:
mimic-fn@2.1.0: {}
+ min-indent@1.0.1: {}
+
minimatch@3.1.2:
dependencies:
brace-expansion: 1.1.11
@@ -9970,6 +10409,19 @@ snapshots:
nanoid@3.3.7: {}
+ nativewind@4.0.36(@babel/core@7.24.7)(react-native-reanimated@3.10.1(@babel/core@7.24.7)(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0))(react-native-safe-area-context@4.10.1(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0))(react-native-svg@15.3.0(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0)(tailwindcss@3.4.4):
+ dependencies:
+ react-native-css-interop: 0.0.36(@babel/core@7.24.7)(react-native-reanimated@3.10.1(@babel/core@7.24.7)(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0))(react-native-safe-area-context@4.10.1(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0))(react-native-svg@15.3.0(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0)(tailwindcss@3.4.4)
+ tailwindcss: 3.4.4
+ transitivePeerDependencies:
+ - '@babel/core'
+ - react
+ - react-native
+ - react-native-reanimated
+ - react-native-safe-area-context
+ - react-native-svg
+ - supports-color
+
natural-compare@1.4.0: {}
ncp@2.0.0:
@@ -10050,6 +10502,10 @@ snapshots:
dependencies:
path-key: 3.1.1
+ nth-check@2.1.1:
+ dependencies:
+ boolbase: 1.0.0
+
nullthrows@1.1.1: {}
nwsapi@2.2.10: {}
@@ -10058,6 +10514,8 @@ snapshots:
object-assign@4.1.1: {}
+ object-hash@3.0.0: {}
+
object-inspect@1.13.1: {}
object-keys@1.1.1: {}
@@ -10234,6 +10692,8 @@ snapshots:
picomatch@3.0.1: {}
+ pify@2.3.0: {}
+
pify@4.0.1: {}
pirates@4.0.6: {}
@@ -10256,6 +10716,35 @@ snapshots:
possible-typed-array-names@1.0.0: {}
+ postcss-import@15.1.0(postcss@8.4.38):
+ dependencies:
+ postcss: 8.4.38
+ postcss-value-parser: 4.2.0
+ read-cache: 1.0.0
+ resolve: 1.22.8
+
+ postcss-js@4.0.1(postcss@8.4.38):
+ dependencies:
+ camelcase-css: 2.0.1
+ postcss: 8.4.38
+
+ postcss-load-config@4.0.2(postcss@8.4.38):
+ dependencies:
+ lilconfig: 3.1.1
+ yaml: 2.4.5
+ optionalDependencies:
+ postcss: 8.4.38
+
+ postcss-nested@6.0.1(postcss@8.4.38):
+ dependencies:
+ postcss: 8.4.38
+ postcss-selector-parser: 6.1.0
+
+ postcss-selector-parser@6.1.0:
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+
postcss-value-parser@4.2.0: {}
postcss@8.4.31:
@@ -10282,6 +10771,8 @@ snapshots:
postgres-range@1.1.4: {}
+ prettier@2.8.8: {}
+
pretty-bytes@5.6.0: {}
pretty-format@26.6.2:
@@ -10395,6 +10886,24 @@ snapshots:
react-is@18.3.1: {}
+ react-native-css-interop@0.0.36(@babel/core@7.24.7)(react-native-reanimated@3.10.1(@babel/core@7.24.7)(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0))(react-native-safe-area-context@4.10.1(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0))(react-native-svg@15.3.0(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0))(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0)(tailwindcss@3.4.4):
+ dependencies:
+ '@babel/helper-module-imports': 7.24.7
+ '@babel/traverse': 7.24.7
+ '@babel/types': 7.24.7
+ babel-plugin-tester: 11.0.4(@babel/core@7.24.7)
+ lightningcss: 1.22.0
+ react: 18.2.0
+ react-native: 0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.2.79)(react@18.2.0)
+ react-native-reanimated: 3.10.1(@babel/core@7.24.7)(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0)
+ tailwindcss: 3.4.4
+ optionalDependencies:
+ react-native-safe-area-context: 4.10.1(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0)
+ react-native-svg: 15.3.0(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0)
+ transitivePeerDependencies:
+ - '@babel/core'
+ - supports-color
+
react-native-gesture-handler@2.16.2(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0):
dependencies:
'@egjs/hammerjs': 2.0.17
@@ -10440,6 +10949,13 @@ snapshots:
react-native: 0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.2.79)(react@18.2.0)
warn-once: 0.1.1
+ react-native-svg@15.3.0(react-native@0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0):
+ dependencies:
+ css-select: 5.1.0
+ css-tree: 1.1.3
+ react: 18.2.0
+ react-native: 0.74.2(@babel/core@7.24.7)(@babel/preset-env@7.24.7(@babel/core@7.24.7))(@types/react@18.2.79)(react@18.2.0)
+
react-native-web@0.19.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
'@babel/runtime': 7.24.7
@@ -10528,6 +11044,10 @@ snapshots:
dependencies:
loose-envify: 1.4.0
+ read-cache@1.0.0:
+ dependencies:
+ pify: 2.3.0
+
readable-stream@2.3.8:
dependencies:
core-util-is: 1.0.3
@@ -10544,6 +11064,10 @@ snapshots:
string_decoder: 1.3.0
util-deprecate: 1.0.2
+ readdirp@3.6.0:
+ dependencies:
+ picomatch: 2.3.1
+
readline@1.3.0: {}
recast@0.21.5:
@@ -10967,6 +11491,10 @@ snapshots:
strip-final-newline@2.0.0: {}
+ strip-indent@3.0.0:
+ dependencies:
+ min-indent: 1.0.1
+
strip-json-comments@2.0.1: {}
strip-json-comments@3.1.1: {}
@@ -11025,6 +11553,41 @@ snapshots:
symbol-tree@3.2.4: {}
+ tailwind-merge@2.3.0:
+ dependencies:
+ '@babel/runtime': 7.24.7
+
+ tailwindcss-animate@1.0.7(tailwindcss@3.4.4):
+ dependencies:
+ tailwindcss: 3.4.4
+
+ tailwindcss@3.4.4:
+ dependencies:
+ '@alloc/quick-lru': 5.2.0
+ arg: 5.0.2
+ chokidar: 3.6.0
+ didyoumean: 1.2.2
+ dlv: 1.1.3
+ fast-glob: 3.3.2
+ glob-parent: 6.0.2
+ is-glob: 4.0.3
+ jiti: 1.21.3
+ lilconfig: 2.1.0
+ micromatch: 4.0.7
+ normalize-path: 3.0.0
+ object-hash: 3.0.0
+ picocolors: 1.0.1
+ postcss: 8.4.38
+ postcss-import: 15.1.0(postcss@8.4.38)
+ postcss-js: 4.0.1(postcss@8.4.38)
+ postcss-load-config: 4.0.2(postcss@8.4.38)
+ postcss-nested: 6.0.1(postcss@8.4.38)
+ postcss-selector-parser: 6.1.0
+ resolve: 1.22.8
+ sucrase: 3.34.0
+ transitivePeerDependencies:
+ - ts-node
+
tar@6.2.1:
dependencies:
chownr: 2.0.0