(readSavedMode);
+
+ const resolvedTheme: ResolvedTheme = mode === 'system' ? (systemColorScheme ?? 'light') : mode;
+
+ useEffect(() => {
+ Uniwind.setTheme(mode);
+ }, [mode]);
+
+ const setMode = useCallback((newMode: ThemeMode) => {
+ setModeState(newMode);
+ mmkvStorage.set(THEME_STORAGE_KEY, newMode);
+ }, []);
+
+ return (
+
+ {children}
+
+ );
+};
+
+export const useTheme = (): ThemeContextValue => {
+ const context = use(ThemeContext);
+
+ if (!context) {
+ throw new Error('useTheme must be used within ThemeProvider');
+ }
+
+ return context;
+};
diff --git a/apps/mobile/src/shared/ui/Button/Button.tsx b/apps/mobile/src/shared/ui/Button/Button.tsx
index 087c787e..5b73b76d 100644
--- a/apps/mobile/src/shared/ui/Button/Button.tsx
+++ b/apps/mobile/src/shared/ui/Button/Button.tsx
@@ -1,4 +1,4 @@
-import { clsx } from 'clsx';
+import { cn } from '@src/shared/utils/cn';
import { PressableFeedback, Spinner } from 'heroui-native';
import { Text } from '../Text/Text';
import type { ButtonProps } from './Button.types';
@@ -27,7 +27,11 @@ export function Button({
const isTextChild = typeof children === 'string';
const textColorMap = {
- fill: 'text-white',
+ fill: {
+ primary: 'text-white dark:text-gray-9',
+ danger: 'text-white dark:text-gray-9',
+ dark: 'text-white dark:text-gray-9',
+ },
weak: {
primary: 'text-main',
danger: 'text-error',
@@ -35,7 +39,7 @@ export function Button({
},
} as const;
- const textColor = variant === 'fill' ? textColorMap.fill : textColorMap.weak[color];
+ const textColor = variant === 'fill' ? textColorMap.fill[color] : textColorMap.weak[color];
const renderContent = () => {
if (isLoading) {
@@ -54,7 +58,7 @@ export function Button({
return (
+ *
*/
export function createStyledIcon(IconComponent: ComponentType
) {
return withUniwind(IconComponent, {
@@ -17,3 +17,5 @@ export function createStyledIcon
(IconComponent: ComponentTyp
},
});
}
+
+export type StyledIcon = ReturnType;
diff --git a/apps/mobile/src/shared/ui/Icon/icons.ts b/apps/mobile/src/shared/ui/Icon/icons.ts
index 999a2288..efedebcb 100644
--- a/apps/mobile/src/shared/ui/Icon/icons.ts
+++ b/apps/mobile/src/shared/ui/Icon/icons.ts
@@ -4,6 +4,7 @@ import ArrowRightIconSvg from '@assets/icons/ic_arrow_right.svg';
import BellIconSvg from '@assets/icons/ic_bell.svg';
import CheckIconSvg from '@assets/icons/ic_check.svg';
import CheckmarkIconSvg from '@assets/icons/ic_checkmark.svg';
+import DeviceIconSvg from '@assets/icons/ic_device.svg';
import DocsIconSvg from '@assets/icons/ic_docs.svg';
import EyeIconSvg from '@assets/icons/ic_eye.svg';
import EyeOffIconSvg from '@assets/icons/ic_eye_off.svg';
@@ -12,12 +13,14 @@ import KakaoIconSvg from '@assets/icons/ic_kakao.svg';
import LockIconSvg from '@assets/icons/ic_lock.svg';
import MenuIconSvg from '@assets/icons/ic_menu.svg';
import MicIconSvg from '@assets/icons/ic_mic.svg';
+import MoonIconSvg from '@assets/icons/ic_moon.svg';
import NaverIconSvg from '@assets/icons/ic_naver.svg';
import PauseIconSvg from '@assets/icons/ic_pause.svg';
import PersonIconSvg from '@assets/icons/ic_person.svg';
import PlusIconSvg from '@assets/icons/ic_plus.svg';
import SearchIconSvg from '@assets/icons/ic_search.svg';
import SendIconSvg from '@assets/icons/ic_send.svg';
+import SunIconSvg from '@assets/icons/ic_sun.svg';
import { createStyledIcon } from './createStyledIcon';
// 래핑된 아이콘 컴포넌트들
@@ -27,6 +30,7 @@ export const ArrowRightIcon = createStyledIcon(ArrowRightIconSvg);
export const BellIcon = createStyledIcon(BellIconSvg);
export const CheckIcon = createStyledIcon(CheckIconSvg);
export const CheckmarkIcon = createStyledIcon(CheckmarkIconSvg);
+export const DeviceIcon = createStyledIcon(DeviceIconSvg);
export const DocsIcon = createStyledIcon(DocsIconSvg);
export const EyeIcon = createStyledIcon(EyeIconSvg);
export const EyeOffIcon = createStyledIcon(EyeOffIconSvg);
@@ -34,6 +38,7 @@ export const GoogleIcon = createStyledIcon(GoogleIconSvg);
export const KakaoIcon = createStyledIcon(KakaoIconSvg);
export const LockIcon = createStyledIcon(LockIconSvg);
export const MenuIcon = createStyledIcon(MenuIconSvg);
+export const MoonIcon = createStyledIcon(MoonIconSvg);
export const MicIcon = createStyledIcon(MicIconSvg);
export const NaverIcon = createStyledIcon(NaverIconSvg);
export const PauseIcon = createStyledIcon(PauseIconSvg);
@@ -41,3 +46,4 @@ export const PersonIcon = createStyledIcon(PersonIconSvg);
export const PlusIcon = createStyledIcon(PlusIconSvg);
export const SearchIcon = createStyledIcon(SearchIconSvg);
export const SendIcon = createStyledIcon(SendIconSvg);
+export const SunIcon = createStyledIcon(SunIconSvg);
diff --git a/apps/mobile/src/shared/ui/Icon/index.ts b/apps/mobile/src/shared/ui/Icon/index.ts
index 63b8b50a..2b4840ff 100644
--- a/apps/mobile/src/shared/ui/Icon/index.ts
+++ b/apps/mobile/src/shared/ui/Icon/index.ts
@@ -1,20 +1,23 @@
-export { createStyledIcon } from './createStyledIcon';
+export { createStyledIcon, type StyledIcon as StyledIconType } from './createStyledIcon';
export {
AppleIcon,
ArrowLeftIcon,
ArrowRightIcon,
BellIcon,
CheckIcon,
+ DeviceIcon,
DocsIcon,
GoogleIcon,
KakaoIcon,
LockIcon,
MenuIcon,
MicIcon,
+ MoonIcon,
NaverIcon,
PauseIcon,
PersonIcon,
PlusIcon,
SearchIcon,
SendIcon,
+ SunIcon,
} from './icons';
diff --git a/apps/mobile/src/shared/ui/Input/Input.tsx b/apps/mobile/src/shared/ui/Input/Input.tsx
index 3b598c7f..2182de70 100644
--- a/apps/mobile/src/shared/ui/Input/Input.tsx
+++ b/apps/mobile/src/shared/ui/Input/Input.tsx
@@ -1,10 +1,13 @@
-import { clsx } from 'clsx';
+import { cn } from '@src/shared/utils/cn';
import { forwardRef, useState } from 'react';
import { TextInput, View } from 'react-native';
+import { withUniwind } from 'uniwind';
import { Text } from '../Text/Text';
import type { InputProps } from './Input.types';
import { inputContainerVariants, inputLabelVariants, inputTextVariants } from './Input.variants';
+const StyledTextInput = withUniwind(TextInput);
+
export const Input = forwardRef(
(
{
@@ -34,13 +37,13 @@ export const Input = forwardRef(
)}
{leftContent && {leftContent}}
- {
export const ListRowImage = ({ size = 'medium', rounded = true, ...props }: ListRowImageProps) => {
return (
-
+
);
@@ -17,7 +17,6 @@ export const ListRowImage = ({ size = 'medium', rounded = true, ...props }: List
const styles = StyleSheet.create({
container: {
overflow: 'hidden',
- backgroundColor: '#F5F5F5',
},
image: {
width: '100%',
diff --git a/apps/mobile/src/shared/ui/Text/Text.tsx b/apps/mobile/src/shared/ui/Text/Text.tsx
index 6ccb4043..58ae665d 100644
--- a/apps/mobile/src/shared/ui/Text/Text.tsx
+++ b/apps/mobile/src/shared/ui/Text/Text.tsx
@@ -1,4 +1,4 @@
-import { clsx } from 'clsx';
+import { cn } from '@src/shared/utils/cn';
import { Text as RNText } from 'react-native';
import type { TextProps } from './Text.types';
import { shadeClasses, textVariants } from './Text.variants';
@@ -21,7 +21,7 @@ export function Text({
return (
= {
1: 'text-gray-1',
diff --git a/apps/mobile/src/shared/ui/TextButton/TextButton.tsx b/apps/mobile/src/shared/ui/TextButton/TextButton.tsx
index cae1f736..fc56ee47 100644
--- a/apps/mobile/src/shared/ui/TextButton/TextButton.tsx
+++ b/apps/mobile/src/shared/ui/TextButton/TextButton.tsx
@@ -1,4 +1,4 @@
-import { clsx } from 'clsx';
+import { cn } from '@src/shared/utils/cn';
import { PressableFeedback } from 'heroui-native';
import { View } from 'react-native';
import { ArrowRightIcon } from '../Icon';
@@ -33,7 +33,7 @@ export function TextButton({
return (
@@ -44,7 +44,7 @@ export function TextButton({
)}
diff --git a/apps/mobile/src/shared/ui/TextButton/TextButton.variants.ts b/apps/mobile/src/shared/ui/TextButton/TextButton.variants.ts
index 83561321..6d353339 100644
--- a/apps/mobile/src/shared/ui/TextButton/TextButton.variants.ts
+++ b/apps/mobile/src/shared/ui/TextButton/TextButton.variants.ts
@@ -1,4 +1,4 @@
-import { tv } from 'tailwind-variants';
+import { tv } from '@src/shared/utils/tv';
export const textButtonVariants = tv({
base: 'items-center justify-center flex-row',
diff --git a/apps/mobile/src/shared/ui/VoiceTextField/VoiceTextField.tsx b/apps/mobile/src/shared/ui/VoiceTextField/VoiceTextField.tsx
index 795e9569..7781a705 100644
--- a/apps/mobile/src/shared/ui/VoiceTextField/VoiceTextField.tsx
+++ b/apps/mobile/src/shared/ui/VoiceTextField/VoiceTextField.tsx
@@ -1,6 +1,7 @@
import { PressableFeedback, Spinner } from 'heroui-native';
import { TextInput, type TextInputProps, View } from 'react-native';
import Animated from 'react-native-reanimated';
+import { useResolveClassNames } from 'uniwind';
import { useBlinkAnimation } from '../../hooks/useBlinkAnimation';
import { HStack } from '../HStack/HStack';
@@ -33,20 +34,31 @@ export const VoiceTextField = ({
isLoading = false,
placeholder,
recognizingPlaceholder = '듣고 있어요...',
- recognizingPlaceholderColor = '#EF4444',
- micIconColor = '#F97316',
- recordingIconColor = '#EF4444',
+ recognizingPlaceholderColor,
+ micIconColor,
+ recordingIconColor,
hideMicButton = false,
hideSendButton = false,
maxLength = 500,
containerClassName,
...textInputProps
}: VoiceTextFieldProps) => {
+ const errorColor = useResolveClassNames('text-error');
+ const mainColor = useResolveClassNames('text-main');
+ const mutedColor = useResolveClassNames('text-gray-5');
+
+ const resolvedRecognizingPlaceholderColor =
+ recognizingPlaceholderColor ?? (errorColor.color as string);
+ const resolvedMicIconColor = micIconColor ?? (mainColor.color as string);
+ const resolvedRecordingIconColor = recordingIconColor ?? (errorColor.color as string);
+
const hasText = value.trim().length > 0;
const isInputDisabled = isLoading || isRecognizing;
const displayPlaceholder = isRecognizing ? recognizingPlaceholder : placeholder;
- const placeholderColor = isRecognizing ? recognizingPlaceholderColor : '#9CA3AF';
+ const placeholderColor = isRecognizing
+ ? resolvedRecognizingPlaceholderColor
+ : (mutedColor.color as string);
return (
)}
@@ -114,8 +126,8 @@ const MicButton = ({
onPress,
isRecognizing,
isDisabled = false,
- micIconColor = '#F97316',
- recordingIconColor = '#EF4444',
+ micIconColor,
+ recordingIconColor,
iconSize = 22,
}: MicButtonProps) => {
return (
diff --git a/apps/mobile/src/shared/utils/cn.ts b/apps/mobile/src/shared/utils/cn.ts
index c7560201..6dda6ec0 100644
--- a/apps/mobile/src/shared/utils/cn.ts
+++ b/apps/mobile/src/shared/utils/cn.ts
@@ -1,5 +1,33 @@
import { type ClassValue, clsx } from 'clsx';
-import { twMerge } from 'tailwind-merge';
+import { extendTailwindMerge } from 'tailwind-merge';
+
+/**
+ * 커스텀 Tailwind 클래스 그룹 설정
+ * text-* 접두사를 사용하는 커스텀 유틸리티가 색상 클래스와 충돌하지 않도록 분리
+ */
+const customClassGroups = {
+ 'text-input': ['text-input-sm', 'text-input-md', 'text-input-lg'],
+ 'text-size': [
+ 'text-h1',
+ 'text-t1',
+ 'text-t2',
+ 'text-t3',
+ 'text-b1',
+ 'text-b2',
+ 'text-b3',
+ 'text-b4',
+ 'text-e1',
+ 'text-e2',
+ ],
+} as const;
+
+type CustomClassGroupIds = keyof typeof customClassGroups;
+
+const customTwMerge = extendTailwindMerge({
+ extend: {
+ classGroups: customClassGroups,
+ },
+});
/**
* Tailwind 클래스 병합 유틸리티
@@ -12,5 +40,5 @@ import { twMerge } from 'tailwind-merge';
* cn('text-red-500', condition && 'text-blue-500') // 조건부 적용
*/
export function cn(...inputs: ClassValue[]) {
- return twMerge(clsx(inputs));
+ return customTwMerge(clsx(inputs));
}
diff --git a/apps/mobile/src/shared/utils/tv.ts b/apps/mobile/src/shared/utils/tv.ts
new file mode 100644
index 00000000..ff1193b7
--- /dev/null
+++ b/apps/mobile/src/shared/utils/tv.ts
@@ -0,0 +1,30 @@
+import { createTV } from 'tailwind-variants';
+
+/**
+ * 커스텀 tailwind-variants 설정
+ *
+ * twMerge에서 커스텀 유틸리티 클래스 충돌 방지
+ * - text-input-* 는 text-gray-* 와 다른 그룹으로 처리
+ */
+export const tv = createTV({
+ twMergeConfig: {
+ extend: {
+ classGroups: {
+ // 커스텀 유틸리티 추가 시 여기에 등록
+ 'text-input': ['text-input-sm', 'text-input-md', 'text-input-lg'],
+ 'text-size': [
+ 'text-h1',
+ 'text-t1',
+ 'text-t2',
+ 'text-t3',
+ 'text-b1',
+ 'text-b2',
+ 'text-b3',
+ 'text-b4',
+ 'text-e1',
+ 'text-e2',
+ ],
+ },
+ },
+ },
+});
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 3881ca6c..dc0d2b4c 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -278,7 +278,7 @@ importers:
version: 10.28.0
ts-jest:
specifier: ^29.2.5
- version: 29.4.6(@babel/core@7.28.6)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.6))(jest-util@30.2.0)(jest@29.7.0(@types/node@22.19.7))(typescript@5.9.3)
+ version: 29.4.6(@babel/core@7.28.6)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.6))(jest-util@30.2.0)(jest@29.7.0(@types/node@22.19.7)(ts-node@10.9.2(@swc/core@1.15.10)(@types/node@22.19.7)(typescript@5.9.3)))(typescript@5.9.3)
ts-loader:
specifier: ^9.5.2
version: 9.5.4(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.15.10))
@@ -395,7 +395,7 @@ importers:
version: 0.32.16(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
expo-router:
specifier: ~6.0.21
- version: 6.0.22(mllt32izckasj5wj2ji7iejztu)
+ version: 6.0.22(gf35npbqodqf3wkccleox2bdiy)
expo-secure-store:
specifier: ~15.0.8
version: 15.0.8(expo@54.0.32)
@@ -450,6 +450,9 @@ importers:
react-native-keyboard-controller:
specifier: ^1.20.6
version: 1.20.6(react-native-reanimated@4.1.6(@babel/core@7.28.6)(react-native-worklets@0.5.1(@babel/core@7.28.6)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native-mmkv:
+ specifier: '3'
+ version: 3.3.3(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
react-native-modal-datetime-picker:
specifier: ^18.0.0
version: 18.0.0(@react-native-community/datetimepicker@8.6.0(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))
@@ -504,7 +507,7 @@ importers:
version: link:../../tooling/typescript
'@testing-library/react-native':
specifier: ^13.3.3
- version: 13.3.3(jest@29.7.0(@types/node@22.19.7))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react-test-renderer@19.1.0(react@19.1.0))(react@19.1.0)
+ version: 13.3.3(jest@29.7.0(@types/node@22.19.7)(ts-node@10.9.2(@swc/core@1.15.10)(@types/node@22.19.7)(typescript@5.9.3)))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react-test-renderer@19.1.0(react@19.1.0))(react@19.1.0)
'@types/jest':
specifier: ^29.5.0
version: 29.5.14
@@ -522,7 +525,7 @@ importers:
version: 29.7.0(@types/node@22.19.7)(ts-node@10.9.2(@swc/core@1.15.10)(@types/node@22.19.7)(typescript@5.9.3))
jest-expo:
specifier: ~54.0.0
- version: 54.0.16(@babel/core@7.28.6)(expo@54.0.32)(jest@29.7.0(@types/node@22.19.7))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ version: 54.0.16(@babel/core@7.28.6)(expo@54.0.32)(jest@29.7.0(@types/node@22.19.7)(ts-node@10.9.2(@swc/core@1.15.10)(@types/node@22.19.7)(typescript@5.9.3)))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
react-native-svg-transformer:
specifier: ^1.5.2
version: 1.5.3(react-native-svg@15.15.1(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(typescript@5.9.3)
@@ -546,7 +549,7 @@ importers:
version: 29.7.0(@types/node@22.19.7)(ts-node@10.9.2(@swc/core@1.15.10)(@types/node@22.19.7)(typescript@5.9.3))
ts-jest:
specifier: ^29.2.5
- version: 29.4.6(@babel/core@7.28.6)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.6))(jest-util@30.2.0)(jest@29.7.0(@types/node@22.19.7))(typescript@5.9.3)
+ version: 29.4.6(@babel/core@7.28.6)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.6))(jest-util@30.2.0)(jest@29.7.0(@types/node@22.19.7)(ts-node@10.9.2(@swc/core@1.15.10)(@types/node@22.19.7)(typescript@5.9.3)))(typescript@5.9.3)
typescript:
specifier: 'catalog:'
version: 5.9.3
@@ -588,7 +591,7 @@ importers:
version: 29.7.0(@types/node@22.19.7)(ts-node@10.9.2(@swc/core@1.15.10)(@types/node@22.19.7)(typescript@5.9.3))
ts-jest:
specifier: ^29.2.5
- version: 29.4.6(@babel/core@7.28.6)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.6))(jest-util@30.2.0)(jest@29.7.0(@types/node@22.19.7))(typescript@5.9.3)
+ version: 29.4.6(@babel/core@7.28.6)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.6))(jest-util@30.2.0)(jest@29.7.0(@types/node@22.19.7)(ts-node@10.9.2(@swc/core@1.15.10)(@types/node@22.19.7)(typescript@5.9.3)))(typescript@5.9.3)
tooling/typescript: {}
@@ -7547,6 +7550,12 @@ packages:
react-native: '*'
react-native-reanimated: '>=3.0.0'
+ react-native-mmkv@3.3.3:
+ resolution: {integrity: sha512-GMsfOmNzx0p5+CtrCFRVtpOOMYNJXuksBVARSQrCFaZwjUyHJdQzcN900GGaFFNTxw2fs8s5Xje//RDKj9+PZA==}
+ peerDependencies:
+ react: '*'
+ react-native: '*'
+
react-native-modal-datetime-picker@18.0.0:
resolution: {integrity: sha512-0jdvhhraZQlRACwr7pM6vmZ2kxgzJ4CpnmV6J3TVA6MrXMXK6Zo/upRBKkRp0+fTOiKuNblzesA2U59rYo6SGA==}
peerDependencies:
@@ -8334,7 +8343,7 @@ packages:
tar@7.5.6:
resolution: {integrity: sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==}
engines: {node: '>=18'}
- deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me
+ deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
temp-dir@2.0.0:
resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==}
@@ -10136,7 +10145,7 @@ snapshots:
wrap-ansi: 7.0.0
ws: 8.19.0
optionalDependencies:
- expo-router: 6.0.22(mllt32izckasj5wj2ji7iejztu)
+ expo-router: 6.0.22(gf35npbqodqf3wkccleox2bdiy)
react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0)
transitivePeerDependencies:
- bufferutil
@@ -11973,7 +11982,7 @@ snapshots:
- react-native-b4a
- supports-color
- '@testing-library/react-native@13.3.3(jest@29.7.0(@types/node@22.19.7))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react-test-renderer@19.1.0(react@19.1.0))(react@19.1.0)':
+ '@testing-library/react-native@13.3.3(jest@29.7.0(@types/node@22.19.7)(ts-node@10.9.2(@swc/core@1.15.10)(@types/node@22.19.7)(typescript@5.9.3)))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react-test-renderer@19.1.0(react@19.1.0))(react@19.1.0)':
dependencies:
jest-matcher-utils: 30.2.0
picocolors: 1.1.1
@@ -14132,7 +14141,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- expo-router@6.0.22(mllt32izckasj5wj2ji7iejztu):
+ expo-router@6.0.22(gf35npbqodqf3wkccleox2bdiy):
dependencies:
'@expo/metro-runtime': 6.1.2(expo@54.0.32)(react-dom@19.1.0(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
'@expo/schema-utils': 0.1.8
@@ -14165,7 +14174,7 @@ snapshots:
use-latest-callback: 0.2.6(react@19.1.0)
vaul: 1.1.2(@types/react@19.1.17)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
optionalDependencies:
- '@testing-library/react-native': 13.3.3(jest@29.7.0(@types/node@22.19.7))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react-test-renderer@19.1.0(react@19.1.0))(react@19.1.0)
+ '@testing-library/react-native': 13.3.3(jest@29.7.0(@types/node@22.19.7)(ts-node@10.9.2(@swc/core@1.15.10)(@types/node@22.19.7)(typescript@5.9.3)))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react-test-renderer@19.1.0(react@19.1.0))(react@19.1.0)
react-dom: 19.1.0(react@19.1.0)
react-native-gesture-handler: 2.30.0(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
react-native-reanimated: 4.1.6(@babel/core@7.28.6)(react-native-worklets@0.5.1(@babel/core@7.28.6)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
@@ -15253,7 +15262,7 @@ snapshots:
jest-mock: 29.7.0
jest-util: 29.7.0
- jest-expo@54.0.16(@babel/core@7.28.6)(expo@54.0.32)(jest@29.7.0(@types/node@22.19.7))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0):
+ jest-expo@54.0.16(@babel/core@7.28.6)(expo@54.0.32)(jest@29.7.0(@types/node@22.19.7)(ts-node@10.9.2(@swc/core@1.15.10)(@types/node@22.19.7)(typescript@5.9.3)))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0):
dependencies:
'@expo/config': 12.0.13
'@expo/json-file': 10.0.8
@@ -15264,7 +15273,7 @@ snapshots:
jest-environment-jsdom: 29.7.0
jest-snapshot: 29.7.0
jest-watch-select-projects: 2.0.0
- jest-watch-typeahead: 2.2.1(jest@29.7.0(@types/node@22.19.7))
+ jest-watch-typeahead: 2.2.1(jest@29.7.0(@types/node@22.19.7)(ts-node@10.9.2(@swc/core@1.15.10)(@types/node@22.19.7)(typescript@5.9.3)))
json5: 2.2.3
lodash: 4.17.23
react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0)
@@ -15497,7 +15506,7 @@ snapshots:
chalk: 3.0.0
prompts: 2.4.2
- jest-watch-typeahead@2.2.1(jest@29.7.0(@types/node@22.19.7)):
+ jest-watch-typeahead@2.2.1(jest@29.7.0(@types/node@22.19.7)(ts-node@10.9.2(@swc/core@1.15.10)(@types/node@22.19.7)(typescript@5.9.3))):
dependencies:
ansi-escapes: 6.2.1
chalk: 4.1.2
@@ -16999,6 +17008,11 @@ snapshots:
react-native-is-edge-to-edge: 1.2.1(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
react-native-reanimated: 4.1.6(@babel/core@7.28.6)(react-native-worklets@0.5.1(@babel/core@7.28.6)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
+ react-native-mmkv@3.3.3(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0):
+ dependencies:
+ react: 19.1.0
+ react-native: 0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0)
+
react-native-modal-datetime-picker@18.0.0(@react-native-community/datetimepicker@8.6.0(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0)):
dependencies:
'@react-native-community/datetimepicker': 8.6.0(expo@54.0.32)(react-native@0.81.5(@babel/core@7.28.6)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)
@@ -18059,7 +18073,7 @@ snapshots:
ts-interface-checker@0.1.13: {}
- ts-jest@29.4.6(@babel/core@7.28.6)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.6))(jest-util@30.2.0)(jest@29.7.0(@types/node@22.19.7))(typescript@5.9.3):
+ ts-jest@29.4.6(@babel/core@7.28.6)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.6))(jest-util@30.2.0)(jest@29.7.0(@types/node@22.19.7)(ts-node@10.9.2(@swc/core@1.15.10)(@types/node@22.19.7)(typescript@5.9.3)))(typescript@5.9.3):
dependencies:
bs-logger: 0.2.6
fast-json-stable-stringify: 2.1.0