authorgravatar for julius0216@outlook.comJulius Marminge <julius0216@outlook.com> 2026-10-01 10:51:22-07:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-10-01 10:51:22-07:00
log8dc07f199c2e3a4d8ec1a3997a2b9c2edf12457e
tree10b8c129f4b5892fb2dc934b1f1f921a8085fdd6
parent5cc99e1c23980d7995a13c47f969b47cb68ed1be
signature Signed by PGP key B5690EEEBB952194

chore(mobile): upgrade to Expo SDK 58 and React Native 0.88 RC (#12045)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

74 files changed, 5642 insertions(+), 6449 deletions(-)

apps/mobile/app.config.ts+3-1
......@@ -401,6 +401,9 @@ const config: ExpoConfig = {
401401 android: {
402402 // Keep the supported floor explicit and covered by native notification tests.
403403 minSdkVersion: 24,
404 // kotlinx-io uses Kotlin 2.3's return-value checker annotation, while
405 // SDK 58 builds with Kotlin 2.2. It has no runtime behavior.
406 extraProguardRules: "-dontwarn kotlin.MustUseReturnValues",
404407 },
405408 ios: {
406409 deploymentTarget: "18.0",
......@@ -419,7 +422,6 @@ const config: ExpoConfig = {
419422 // would delete the asset catalog) and its xcodeproj mod creates the widget
420423 // target (which must exist before the compile phase can be attached).
421424 ...(!isIosPersonalTeamBuild ? ["./plugins/withWidgetLogoAsset.cjs", widgetsPlugin] : []),
422 "./plugins/withIosSceneLifecycle.cjs",
423425 "./plugins/withAndroidCleartextTraffic.cjs",
424426 "./plugins/withAndroidGradleHeap.cjs",
425427 "./plugins/withAndroidInputBackground.cjs",
apps/mobile/modules/t3-markdown-text/ios/T3MarkdownText.mm+1-1
......@@ -10,7 +10,7 @@
1010#import <react/renderer/components/T3MarkdownTextSpec/EventEmitters.h>
1111#import <react/renderer/components/T3MarkdownTextSpec/Props.h>
1212#import <react/renderer/components/T3MarkdownTextSpec/RCTComponentViewHelpers.h>
13#import "RCTFabricComponentsPlugins.h"
13#import <React/RCTFabricComponentsPlugins.h>
1414
1515using namespace facebook::react;
1616
apps/mobile/modules/t3-markdown-text/ios/T3MarkdownTextManager.mm-1
......@@ -1,6 +1,5 @@
11#import <React/RCTViewManager.h>
22#import <React/RCTUIManager.h>
3#import "RCTBridge.h"
43#import "Utils.h"
54
65@interface T3MarkdownTextManager : RCTViewManager
apps/mobile/modules/t3-markdown-text/ios/T3MarkdownTextRun.mm+1-1
......@@ -4,7 +4,7 @@
44#import <react/renderer/components/T3MarkdownTextSpec/EventEmitters.h>
55#import <react/renderer/components/T3MarkdownTextSpec/Props.h>
66#import <react/renderer/components/T3MarkdownTextSpec/RCTComponentViewHelpers.h>
7#import "RCTFabricComponentsPlugins.h"
7#import <React/RCTFabricComponentsPlugins.h>
88#import "Utils.h"
99
1010using namespace facebook::react;
apps/mobile/modules/t3-markdown-text/src/MarkdownTextPrimitive.tsx+9-4
......@@ -6,6 +6,7 @@ import {
66 StyleSheet,
77 Text as RNText,
88 type ColorValue,
9 type TextInstance,
910 type TextProps,
1011 type ViewStyle,
1112} from "react-native";
......@@ -43,7 +44,7 @@ export type ContextMenuActionEvent = {
4344 * while the React Native Text fallback reports measured `TextLayoutLine`s.
4445 */
4546export type MarkdownTextPrimitiveProps = Omit<TextProps, "onTextLayout"> & {
46 nativeTextRef?: Ref<RNText>;
47 nativeTextRef?: Ref<TextInstance>;
4748 selectionHandleColor?: ColorValue;
4849 uiTextView?: boolean;
4950 contextMenuConfig?: string;
......@@ -134,13 +135,17 @@ function AndroidMarkdownText({
134135 contextClipboardConfig: _contextClipboardConfig,
135136 ...props
136137}: MarkdownTextPrimitiveProps) {
137 const textRef = React.useRef<RNText | null>(null);
138 React.useImperativeHandle<RNText | null, RNText | null>(nativeTextRef, () => textRef.current, []);
138 const textRef = React.useRef<TextInstance | null>(null);
139 React.useImperativeHandle<TextInstance | null, TextInstance | null>(
140 nativeTextRef,
141 () => textRef.current,
142 [],
143 );
139144 const color = processColor(selectionHandleColor);
140145 const applyHandleColor = React.useCallback(() => {
141146 if (!textRef.current || typeof color !== "number") return;
142147 const reactTag = findNodeHandle(textRef.current);
143 if (reactTag !== null) setMarkdownSelectionHandleColor(reactTag, color);
148 if (reactTag != null) setMarkdownSelectionHandleColor(reactTag, color);
144149 }, [color]);
145150
146151 // RN's selectionColor only sets the highlight. Retint mounted handles when
apps/mobile/modules/t3-markdown-text/src/NativeMarkdownSelectableText.tsx+19-11
......@@ -6,14 +6,14 @@ import {
66 Linking,
77 Platform,
88 StyleSheet,
9 Text as RNText,
9 type TextInstance,
1010 type TextStyle,
1111 useColorScheme,
1212 View,
1313} from "react-native";
1414
1515import { MarkdownTextPrimitive } from "./MarkdownTextPrimitive";
16import { markdownFileIconSource } from "./markdownFileIcons";
16import { markdownFileIconSource, markdownIconAssetUri } from "./markdownFileIcons";
1717import { markdownLinkIconSource } from "./markdownLinkIcons";
1818import { resolveMarkdownFileIcon, resolveMarkdownLinkIcon } from "./markdownLinks";
1919import type { NativeMarkdownTextRun } from "./nativeMarkdownText";
......@@ -236,11 +236,11 @@ export function NativeMarkdownSelectableText(props: {
236236 interactive: Boolean(run.href),
237237 iconUri:
238238 !contextReference && run.fileIcon
239 ? Image.resolveAssetSource(markdownFileIconSource(run.fileIcon)).uri
239 ? markdownIconAssetUri(markdownFileIconSource(run.fileIcon))
240240 : contextRecord?.kind === "mention" && "path" in contextRecord
241 ? Image.resolveAssetSource(
241 ? markdownIconAssetUri(
242242 markdownFileIconSource(resolveMarkdownFileIcon(contextRecord.path)),
243 ).uri
243 )
244244 : undefined,
245245 fontSize: props.textStyle.fontSize * 0.8,
246246 foreground: props.textStyle.color,
......@@ -297,10 +297,12 @@ export function NativeMarkdownSelectableText(props: {
297297 ? JSON.stringify({ fragment: contextClipboardFragment, ranges })
298298 : "";
299299 const attachAndroidText = useCallback(
300 (textView: RNText | null) => {
300 (textView: TextInstance | null) => {
301301 if (Platform.OS !== "android" || !containsInlineIcon || !textView) return;
302302 const reactTag = findNodeHandle(textView);
303 if (reactTag !== null) installMarkdownCopySanitizer(reactTag, contextClipboardConfig);
303 if (typeof reactTag === "number") {
304 installMarkdownCopySanitizer(reactTag, contextClipboardConfig);
305 }
304306 },
305307 [containsInlineIcon, contextClipboardConfig],
306308 );
......@@ -358,6 +360,12 @@ export function NativeMarkdownSelectableText(props: {
358360 else void Linking.openURL(href);
359361 }
360362 : undefined;
363 const fileIconUri = run.fileIcon
364 ? markdownIconAssetUri(markdownFileIconSource(run.fileIcon))
365 : undefined;
366 const linkIconUri = linkIcon
367 ? markdownIconAssetUri(markdownLinkIconSource(linkIcon))
368 : undefined;
361369 return (
362370 <MarkdownTextPrimitive
363371 key={key}
......@@ -366,12 +374,12 @@ export function NativeMarkdownSelectableText(props: {
366374 Platform.OS === "ios"
367375 ? chip
368376 ? `t3-chip:${JSON.stringify(chip)}`
369 : run.fileIcon
370 ? `t3-file:${Image.resolveAssetSource(markdownFileIconSource(run.fileIcon)).uri}`
377 : fileIconUri
378 ? `t3-file:${fileIconUri}`
371379 : run.skillName
372380 ? "t3-skill:sf:cube"
373 : linkIcon
374 ? `t3-link:${Image.resolveAssetSource(markdownLinkIconSource(linkIcon)).uri}`
381 : linkIconUri
382 ? `t3-link:${linkIconUri}`
375383 : undefined
376384 : undefined
377385 }
apps/mobile/modules/t3-markdown-text/src/T3MarkdownTextNativeComponent.ts+9-15
......@@ -1,13 +1,7 @@
1import codegenNativeComponent from "react-native/Libraries/Utilities/codegenNativeComponent";
2import type { ViewProps } from "react-native";
3import type {
4 BubblingEventHandler,
5 Int32,
6 WithDefault,
7} from "react-native/Libraries/Types/CodegenTypes";
1import { codegenNativeComponent, type CodegenTypes, type ViewProps } from "react-native";
82
93interface TargetedEvent {
10 target: Int32;
4 target: CodegenTypes.Int32;
115}
126
137interface TextLayoutEvent extends TargetedEvent {
......@@ -21,19 +15,19 @@ interface TextLayoutEvent extends TargetedEvent {
2115 * @property end - The end index of the selected range (0-based, exclusive)
2216 */
2317interface SelectionChangeEvent extends TargetedEvent {
24 start: Int32;
25 end: Int32;
18 start: CodegenTypes.Int32;
19 end: CodegenTypes.Int32;
2620}
2721
2822type EllipsizeMode = "head" | "middle" | "tail" | "clip";
2923
3024interface NativeProps extends ViewProps {
3125 contextClipboardConfig?: string;
32 numberOfLines?: Int32;
33 allowFontScaling?: WithDefault<boolean, true>;
34 ellipsizeMode?: WithDefault<EllipsizeMode, "tail">;
26 numberOfLines?: CodegenTypes.Int32;
27 allowFontScaling?: CodegenTypes.WithDefault<boolean, true>;
28 ellipsizeMode?: CodegenTypes.WithDefault<EllipsizeMode, "tail">;
3529 selectable?: boolean;
36 onTextLayout?: BubblingEventHandler<TextLayoutEvent>;
30 onTextLayout?: CodegenTypes.BubblingEventHandler<TextLayoutEvent>;
3731 /**
3832 * Callback fired when the text selection changes.
3933 *
......@@ -48,7 +42,7 @@ interface NativeProps extends ViewProps {
4842 * </MarkdownTextPrimitive>
4943 * ```
5044 */
51 onSelectionChange?: BubblingEventHandler<SelectionChangeEvent>;
45 onSelectionChange?: CodegenTypes.BubblingEventHandler<SelectionChangeEvent>;
5246}
5347
5448export default codegenNativeComponent<NativeProps>("T3MarkdownText", {
apps/mobile/modules/t3-markdown-text/src/T3MarkdownTextRunNativeComponent.ts+19-21
......@@ -1,14 +1,12 @@
1import type { ColorValue, ViewProps } from "react-native";
2import type {
3 BubblingEventHandler,
4 Float,
5 Int32,
6 WithDefault,
7} from "react-native/Libraries/Types/CodegenTypes";
8import codegenNativeComponent from "react-native/Libraries/Utilities/codegenNativeComponent";
1import {
2 codegenNativeComponent,
3 type CodegenTypes,
4 type ColorValue,
5 type ViewProps,
6} from "react-native";
97
108interface TargetedEvent {
11 target: Int32;
9 target: CodegenTypes.Int32;
1210}
1311
1412interface ContextMenuActionEvent extends TargetedEvent {
......@@ -35,21 +33,21 @@ type TextAlign = "auto" | "left" | "right" | "center" | "justify";
3533interface NativeProps extends ViewProps {
3634 text: string;
3735 color?: ColorValue;
38 fontSize?: Float;
39 fontStyle?: WithDefault<FontStyle, "normal">;
40 fontWeight?: WithDefault<NativeFontWeight, "normal">;
36 fontSize?: CodegenTypes.Float;
37 fontStyle?: CodegenTypes.WithDefault<FontStyle, "normal">;
38 fontWeight?: CodegenTypes.WithDefault<NativeFontWeight, "normal">;
4139 fontFamily?: string;
42 letterSpacing?: Float;
43 lineHeight?: Float;
44 textDecorationLine?: WithDefault<TextDecorationLine, "none">;
45 textDecorationStyle?: WithDefault<TextDecorationStyle, "solid">;
40 letterSpacing?: CodegenTypes.Float;
41 lineHeight?: CodegenTypes.Float;
42 textDecorationLine?: CodegenTypes.WithDefault<TextDecorationLine, "none">;
43 textDecorationStyle?: CodegenTypes.WithDefault<TextDecorationStyle, "solid">;
4644 textDecorationColor?: ColorValue;
47 textAlign?: WithDefault<TextAlign, "auto">;
48 shadowRadius?: WithDefault<Float, 0>;
45 textAlign?: CodegenTypes.WithDefault<TextAlign, "auto">;
46 shadowRadius?: CodegenTypes.WithDefault<CodegenTypes.Float, 0>;
4947 contextMenuConfig?: string;
50 onPress?: BubblingEventHandler<TargetedEvent>;
51 onLongPress?: BubblingEventHandler<TargetedEvent>;
52 onContextMenuAction?: BubblingEventHandler<ContextMenuActionEvent>;
48 onPress?: CodegenTypes.BubblingEventHandler<TargetedEvent>;
49 onLongPress?: CodegenTypes.BubblingEventHandler<TargetedEvent>;
50 onContextMenuAction?: CodegenTypes.BubblingEventHandler<ContextMenuActionEvent>;
5351}
5452
5553export default codegenNativeComponent<NativeProps>("T3MarkdownTextRun", {
apps/mobile/modules/t3-markdown-text/src/markdownFileIcons.ts+10-1
......@@ -1,4 +1,4 @@
1import type { ImageSourcePropType } from "react-native";
1import { Image, type ImageSourcePropType } from "react-native";
22
33import type { MarkdownFileIcon } from "./markdownLinks";
44import { MARKDOWN_FILE_ICON_SOURCES } from "./markdownFileIcons.generated";
......@@ -6,3 +6,12 @@ import { MARKDOWN_FILE_ICON_SOURCES } from "./markdownFileIcons.generated";
66export function markdownFileIconSource(icon: MarkdownFileIcon): ImageSourcePropType {
77 return MARKDOWN_FILE_ICON_SOURCES[icon];
88}
9
10/**
11 * Bundled icon URI handed to native views that draw the icon themselves. The
12 * sources are static requires, so this only comes back undefined when the
13 * bundler dropped the asset; callers treat a missing icon as "no icon".
14 */
15export function markdownIconAssetUri(source: ImageSourcePropType): string | undefined {
16 return Image.resolveAssetSource(source)?.uri;
17}
apps/mobile/package.json+48-47
......@@ -49,7 +49,8 @@
4949 "@clerk/expo": "catalog:",
5050 "@effect/atom-react": "catalog:",
5151 "@expo-google-fonts/dm-sans": "^0.4.2",
52 "@expo/ui": "~57.0.14",
52 "@expo/metro-runtime": "~58.0.9",
53 "@expo/ui": "~58.0.9",
5354 "@legendapp/list": "catalog:",
5455 "@material/material-color-utilities": "0.3.0",
5556 "@noble/curves": "catalog:",
......@@ -73,56 +74,56 @@
7374 "clsx": "^2.1.1",
7475 "diff": "8.0.3",
7576 "effect": "catalog:",
76 "expo": "~57.0.18",
77 "expo-asset": "~57.0.15",
78 "expo-audio": "57.0.4",
79 "expo-auth-session": "~57.0.10",
80 "expo-blur": "~57.0.2",
81 "expo-build-properties": "~57.0.15",
82 "expo-camera": "~57.0.4",
83 "expo-clipboard": "~57.0.1",
84 "expo-constants": "~57.0.16",
85 "expo-crypto": "~57.0.2",
86 "expo-dev-client": "~57.0.16",
87 "expo-device": "~57.0.1",
88 "expo-document-picker": "~57.0.1",
89 "expo-file-system": "~57.0.6",
90 "expo-font": "~57.0.2",
91 "expo-glass-effect": "~57.0.1",
92 "expo-haptics": "~57.0.2",
93 "expo-image": "~57.0.3",
94 "expo-image-manipulator": "~57.0.17",
95 "expo-image-picker": "~57.0.14",
96 "expo-keep-awake": "~57.0.2",
97 "expo-linking": "~57.0.8",
98 "expo-network": "~57.0.1",
99 "expo-notifications": "57.0.15",
77 "expo": "58.0.0",
78 "expo-asset": "~58.0.9",
79 "expo-audio": "58.0.3",
80 "expo-auth-session": "~58.0.6",
81 "expo-blur": "58.0.2",
82 "expo-build-properties": "~58.0.9",
83 "expo-camera": "~58.0.5",
84 "expo-clipboard": "~58.0.2",
85 "expo-constants": "~58.0.9",
86 "expo-crypto": "~58.0.3",
87 "expo-dev-client": "~58.0.9",
88 "expo-device": "~58.0.3",
89 "expo-document-picker": "~58.0.3",
90 "expo-file-system": "~58.0.4",
91 "expo-font": "~58.0.4",
92 "expo-glass-effect": "58.0.3",
93 "expo-haptics": "~58.0.3",
94 "expo-image": "~58.0.8",
95 "expo-image-manipulator": "~58.0.10",
96 "expo-image-picker": "~58.0.9",
97 "expo-keep-awake": "~58.0.2",
98 "expo-linking": "~58.0.9",
99 "expo-network": "~58.0.2",
100 "expo-notifications": "~58.0.9",
100101 "expo-paste-input": "^0.1.15",
101102 "expo-quick-actions": "^6.0.2",
102 "expo-secure-store": "~57.0.2",
103 "expo-sharing": "57.0.17",
104 "expo-splash-screen": "~57.0.8",
105 "expo-sqlite": "~57.0.2",
106 "expo-symbols": "~57.0.2",
107 "expo-updates": "~57.0.19",
108 "expo-video": "~57.0.3",
109 "expo-web-browser": "~57.0.2",
110 "expo-widgets": "57.0.15",
111 "react": "19.2.3",
112 "react-dom": "19.2.3",
113 "react-native": "0.86.3",
114 "react-native-gesture-handler": "~2.32.0",
103 "expo-secure-store": "~58.0.1",
104 "expo-sharing": "58.0.12",
105 "expo-splash-screen": "~58.0.2",
106 "expo-sqlite": "~58.0.7",
107 "expo-symbols": "~58.0.3",
108 "expo-updates": "~58.0.11",
109 "expo-video": "~58.0.5",
110 "expo-web-browser": "~58.0.3",
111 "expo-widgets": "58.0.9",
112 "react": "19.3.0",
113 "react-dom": "19.3.0",
114 "react-native": "0.88.0-rc.3",
115 "react-native-gesture-handler": "~3.2.1",
115116 "react-native-image-viewing": "^0.2.2",
116 "react-native-keyboard-controller": "1.21.13",
117 "react-native-keyboard-controller": "1.22.4",
117118 "react-native-nitro-markdown": "^0.5.0",
118119 "react-native-nitro-modules": "0.35.9",
119 "react-native-reanimated": "4.5.5",
120 "react-native-safe-area-context": "~5.7.0",
121 "react-native-screens": "~4.26.0",
120 "react-native-reanimated": "4.7.0",
121 "react-native-safe-area-context": "~5.9.1",
122 "react-native-screens": "~4.28.0",
122123 "react-native-shiki-engine": "^0.3.12",
123 "react-native-svg": "15.15.4",
124 "react-native-webview": "^13.16.1",
125 "react-native-worklets": "0.11.4",
124 "react-native-svg": "15.15.5",
125 "react-native-webview": "14.0.1",
126 "react-native-worklets": "0.13.0",
126127 "shiki": "4.2.0",
127128 "tailwind-merge": "^3.5.0",
128129 "uniwind": "1.11.0"
......@@ -130,9 +131,9 @@
130131 "devDependencies": {
131132 "@effect/vitest": "catalog:",
132133 "@pierre/trees": "1.0.0-beta.4",
133 "@types/react": "~19.2.0",
134 "@types/react": "~19.3.0",
134135 "@types/react-dom": "~19.2.3",
135 "babel-preset-expo": "~57.0.9",
136 "babel-preset-expo": "~58.0.6",
136137 "tailwindcss": "^4.0.0",
137138 "typescript": "catalog:"
138139 },
apps/mobile/plugins/withIosSceneLifecycle.cjs deleted-123
......@@ -1,123 +0,0 @@
1const { withAppDelegate, withInfoPlist } = require("expo/config-plugins");
2
3const SCENE_DELEGATE = `
4
5class SceneDelegate: UIResponder, UIWindowSceneDelegate {
6 var window: UIWindow?
7
8 func scene(
9 _ scene: UIScene,
10 willConnectTo session: UISceneSession,
11 options connectionOptions: UIScene.ConnectionOptions
12 ) {
13 guard
14 let windowScene = scene as? UIWindowScene,
15 let appDelegate = UIApplication.shared.delegate as? AppDelegate
16 else {
17 return
18 }
19
20 let appWindow: UIWindow
21 if let existingWindow = appDelegate.window {
22 appWindow = existingWindow
23 } else {
24 appWindow = UIWindow(windowScene: windowScene)
25 appDelegate.window = appWindow
26 appDelegate.reactNativeFactory?.startReactNative(
27 withModuleName: "main",
28 in: appWindow,
29 launchOptions: appDelegate.sceneLaunchOptions)
30 appDelegate.sceneLaunchOptions = nil
31 }
32
33 window = appWindow
34 appWindow.windowScene = windowScene
35 appWindow.makeKeyAndVisible()
36
37 if let url = connectionOptions.urlContexts.first?.url {
38 _ = appDelegate.application(UIApplication.shared, open: url, options: [:])
39 }
40
41 if let userActivity = connectionOptions.userActivities.first {
42 _ = appDelegate.application(
43 UIApplication.shared,
44 continue: userActivity,
45 restorationHandler: { _ in })
46 }
47 }
48
49 func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
50 guard
51 let url = URLContexts.first?.url,
52 let appDelegate = UIApplication.shared.delegate as? AppDelegate
53 else {
54 return
55 }
56
57 _ = appDelegate.application(UIApplication.shared, open: url, options: [:])
58 }
59
60 func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
61 guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
62 return
63 }
64
65 _ = appDelegate.application(
66 UIApplication.shared,
67 continue: userActivity,
68 restorationHandler: { _ in })
69 }
70}`;
71
72module.exports = function withIosSceneLifecycle(config) {
73 config = withInfoPlist(config, (nextConfig) => {
74 nextConfig.modResults.UIApplicationSceneManifest = {
75 UIApplicationSupportsMultipleScenes: false,
76 UISceneConfigurations: {
77 UIWindowSceneSessionRoleApplication: [
78 {
79 UISceneConfigurationName: "Default Configuration",
80 UISceneDelegateClassName: "$(PRODUCT_MODULE_NAME).SceneDelegate",
81 },
82 ],
83 },
84 };
85
86 return nextConfig;
87 });
88
89 return withAppDelegate(config, (nextConfig) => {
90 if (nextConfig.modResults.language !== "swift") {
91 throw new Error("The iOS scene lifecycle plugin requires a Swift AppDelegate.");
92 }
93
94 // Creating the window before a scene exists leaves iOS share scenes with
95 // incorrect geometry, even if windowScene is assigned afterward.
96 const startup =
97 /window = UIWindow\(frame: UIScreen\.main\.bounds\)\s+factory\.startReactNative\(\s+withModuleName: "main",\s+in: window,\s+launchOptions: launchOptions\)/;
98 if (startup.test(nextConfig.modResults.contents)) {
99 nextConfig.modResults.contents = nextConfig.modResults.contents.replace(
100 startup,
101 "sceneLaunchOptions = launchOptions",
102 );
103 } else if (!nextConfig.modResults.contents.includes("sceneLaunchOptions = launchOptions")) {
104 throw new Error("Could not move React Native startup into the iOS scene lifecycle.");
105 }
106 if (!nextConfig.modResults.contents.includes("var sceneLaunchOptions:")) {
107 nextConfig.modResults.contents = nextConfig.modResults.contents.replace(
108 "var window: UIWindow?",
109 "var window: UIWindow?\n var sceneLaunchOptions: [UIApplication.LaunchOptionsKey: Any]?",
110 );
111 }
112 if (!nextConfig.modResults.contents.includes("class SceneDelegate:")) {
113 nextConfig.modResults.contents += SCENE_DELEGATE;
114 } else {
115 nextConfig.modResults.contents = nextConfig.modResults.contents.replace(
116 "in: appWindow,\n launchOptions: nil)",
117 "in: appWindow,\n launchOptions: appDelegate.sceneLaunchOptions)\n appDelegate.sceneLaunchOptions = nil",
118 );
119 }
120
121 return nextConfig;
122 });
123};
apps/mobile/plugins/withIosSceneLifecycle.test.mjs deleted-58
......@@ -1,58 +0,0 @@
1import { describe, expect, it } from "vitest";
2import withIosSceneLifecycle from "./withIosSceneLifecycle.cjs";
3
4const appDelegate = `class AppDelegate: ExpoAppDelegate {
5 var window: UIWindow?
6 func application() {
7 window = UIWindow(frame: UIScreen.main.bounds)
8 factory.startReactNative(
9 withModuleName: "main",
10 in: window,
11 launchOptions: launchOptions)
12 }
13}`;
14
15async function transform(contents) {
16 const config = withIosSceneLifecycle({ name: "Test", slug: "test" });
17 const result = await config.mods.ios.appDelegate({
18 ...config,
19 modRequest: { platform: "ios", modName: "appDelegate", introspect: false },
20 modResults: { language: "swift", contents },
21 });
22 return result.modResults.contents;
23}
24
25describe("iOS scene lifecycle generation", () => {
26 it("creates the window in the scene before starting React Native and retains launch options", async () => {
27 const result = await transform(appDelegate);
28 const [startup, scene] = result.split("class SceneDelegate:");
29 expect(startup).not.toContain("UIWindow(frame:");
30 expect(startup).not.toContain("startReactNative(");
31 expect(startup).toContain("sceneLaunchOptions = launchOptions");
32 expect(scene.indexOf("UIWindow(windowScene: windowScene)")).toBeLessThan(
33 scene.indexOf("startReactNative("),
34 );
35 expect(scene).toContain("launchOptions: appDelegate.sceneLaunchOptions)");
36 expect(scene).toContain("appDelegate.sceneLaunchOptions = nil");
37 });
38
39 it("does not duplicate startup or scene code on subsequent prebuilds", async () => {
40 const generated = await transform(appDelegate);
41 expect(await transform(generated)).toBe(generated);
42 });
43
44 it("updates the previously generated scene delegate", async () => {
45 const generated = await transform(appDelegate);
46 const oldScene = generated
47 .slice(generated.indexOf("class SceneDelegate:"))
48 .replace("launchOptions: appDelegate.sceneLaunchOptions)", "launchOptions: nil)")
49 .replace(" appDelegate.sceneLaunchOptions = nil\n", "");
50 expect(await transform(`${appDelegate}\n\n${oldScene}`)).toBe(generated);
51 });
52
53 it("fails visibly when the Expo startup template changes", async () => {
54 await expect(transform("class AppDelegate: ExpoAppDelegate {}")).rejects.toThrow(
55 "Could not move React Native startup",
56 );
57 });
58});
apps/mobile/src/App.tsx+1-4
......@@ -76,10 +76,7 @@ function AppContent() {
7676 <GestureHandlerRootView className="flex-1">
7777 <KeyboardProvider statusBarTranslucent>
7878 <SafeAreaProvider>
79 <StatusBar
80 barStyle={themeAppearance === "dark" ? "light-content" : "dark-content"}
81 translucent
82 />
79 <StatusBar barStyle={themeAppearance === "dark" ? "light-content" : "dark-content"} />
8380 {/* The navigation theme drives the NATIVE header appearance: native-stack
8481 forwards `dark` as the nav bar's overrideUserInterfaceStyle. Without
8582 this, React Navigation defaults to its light theme and every native
apps/mobile/src/Stack.tsx+6-6
......@@ -520,7 +520,12 @@ function RootStackLayout(props: {
520520 const navigation = useNavigation();
521521 const { pendingShare } = useIncomingShare();
522522 const sharePresentationRef = useRef(EMPTY_INCOMING_SHARE_PRESENTATION_STATE);
523 useAgentNotificationNavigation();
523 // Keyboard commands follow the top route; notification suppression follows
524 // the thread beneath overlay sheets.
525 const path = getPathFromState(props.state, navigationPathConfig);
526 const pathname = path.startsWith("/") ? path : `/${path}`;
527 const workspaceLocation = workspaceLocationFromState(props.state);
528 useAgentNotificationNavigation(workspaceLocation.pathname);
524529 // Presents the T3 Connect onboarding sheet after an in-session sign-in.
525530 useConnectOnboardingNavigation();
526531 // Launcher app shortcuts: routes shortcut taps and tracks opened threads.
......@@ -540,11 +545,6 @@ function RootStackLayout(props: {
540545 params: { incomingShareId: transition.shareIdToPresent },
541546 });
542547 }, [navigation, pendingShare, props.state]);
543 // Full pathname (sheets included) for keyboard-command scoping; the
544 // workspace layout only reacts to the underlying non-overlay route.
545 const path = getPathFromState(props.state, navigationPathConfig);
546 const pathname = path.startsWith("/") ? path : `/${path}`;
547 const workspaceLocation = workspaceLocationFromState(props.state);
548548
549549 return (
550550 <HardwareKeyboardCommandProvider pathname={pathname}>
apps/mobile/src/components/AndroidAnchoredMenu.tsx+3-3
......@@ -1,7 +1,7 @@
11import type { MenuAction, MenuComponentProps } from "@react-native-menu/menu";
22import type { ReactNode } from "react";
33import { useCallback, useEffect, useRef, useState } from "react";
4import type { StyleProp, ViewStyle } from "react-native";
4import type { StyleProp, ViewInstance, ViewStyle } from "react-native";
55import { BackHandler, Pressable, ScrollView, View } from "react-native";
66import { useKeyboardState } from "react-native-keyboard-controller";
77import Animated, { FadeIn } from "react-native-reanimated";
......@@ -73,8 +73,8 @@ export function AndroidAnchoredMenu(props: AndroidAnchoredMenuProps) {
7373 overlay === null
7474 ? desiredMenuWidth
7575 : Math.min(desiredMenuWidth, Math.max(0, overlay.width - 2 * SCREEN_MARGIN));
76 const anchorRef = useRef<View>(null);
77 const overlayRef = useRef<View>(null);
76 const anchorRef = useRef<ViewInstance>(null);
77 const overlayRef = useRef<ViewInstance>(null);
7878
7979 const keyboardVisible = useKeyboardState((state) => state.isVisible);
8080 const keyboardHeight = useKeyboardState((state) => state.height);
apps/mobile/src/components/AppText.tsx+2-1
......@@ -2,6 +2,7 @@ import {
22 Platform,
33 Text as RNText,
44 TextInput as RNTextInput,
5 type TextInputInstance,
56 type TextInputProps as RNTextInputProps,
67 type TextProps as RNTextProps,
78} from "react-native";
......@@ -26,7 +27,7 @@ export function AppText({ className, ...props }: AppTextProps) {
2627
2728export type AppTextInputProps = Omit<RNTextInputProps, "placeholderTextColor"> & {
2829 readonly className?: string;
29 readonly ref?: React.Ref<RNTextInput>;
30 readonly ref?: React.Ref<TextInputInstance>;
3031};
3132
3233/**
apps/mobile/src/components/ComposerAttachmentStrip.tsx+1-1
......@@ -127,7 +127,7 @@ async function materializeDataUrlPreview(id: string, dataUrl: string): Promise<s
127127 const file = new File(directory, `${id}.${extension}`);
128128 if (!file.exists) {
129129 file.create();
130 file.write(dataUrl.slice(comma + 1), { encoding: "base64" });
130 await file.write(dataUrl.slice(comma + 1), { encoding: "base64" });
131131 }
132132 return file.uri;
133133}
apps/mobile/src/components/GlassSurface.tsx+9-2
......@@ -1,6 +1,13 @@
11import { GlassView, isGlassEffectAPIAvailable } from "expo-glass-effect";
22import type { ReactNode, Ref } from "react";
3import { Platform, View, type ColorValue, type ViewProps, type ViewStyle } from "react-native";
3import {
4 Platform,
5 View,
6 type ColorValue,
7 type ViewInstance,
8 type ViewProps,
9 type ViewStyle,
10} from "react-native";
411import { withUniwind } from "uniwind";
512
613import { cn } from "../lib/cn";
......@@ -14,7 +21,7 @@ const ThemedGlassView = withUniwind(GlassView, {
1421});
1522
1623interface GlassSurfaceProps extends ViewProps {
17 readonly ref?: Ref<View>;
24 readonly ref?: Ref<ViewInstance>;
1825 readonly children: ReactNode;
1926 readonly glassEffectStyle?: "clear" | "regular" | "none";
2027 readonly tintColor?: ColorValue;
apps/mobile/src/components/LoadingScreen.tsx+1-1
......@@ -15,7 +15,7 @@ export function LoadingScreen(props: {
1515
1616 return (
1717 <View className="flex-1 bg-screen" style={{ paddingTop: insets.top }}>
18 <StatusBar barStyle={colorScheme === "dark" ? "light-content" : "dark-content"} translucent />
18 <StatusBar barStyle={colorScheme === "dark" ? "light-content" : "dark-content"} />
1919 <View className="flex-1 items-center justify-center gap-5 px-6">
2020 <BrandMark compact />
2121 {messagePlacement === "above-spinner" ? (
apps/mobile/src/components/MaterialSearchField.tsx+2-2
......@@ -1,5 +1,5 @@
11import type { RefObject } from "react";
2import { Pressable, TextInput, View } from "react-native";
2import { Pressable, TextInput, type TextInputInstance, View } from "react-native";
33
44import { SymbolView } from "./AppSymbol";
55import { useAndroidControlSizing } from "./useAndroidControlSizing";
......@@ -12,7 +12,7 @@ export function MaterialSearchField({
1212 value,
1313 onChangeText,
1414}: {
15 readonly inputRef: RefObject<TextInput | null>;
15 readonly inputRef: RefObject<TextInputInstance | null>;
1616 readonly accessibilityLabel: string;
1717 readonly clearAccessibilityLabel: string;
1818 readonly placeholder: string;
apps/mobile/src/components/ScreenHeader.android.tsx+9-2
......@@ -1,5 +1,12 @@
11import { useCallback, useEffect, useRef, useState } from "react";
2import { BackHandler, Keyboard, Pressable, TextInput, View } from "react-native";
2import {
3 BackHandler,
4 Keyboard,
5 Pressable,
6 TextInput,
7 type TextInputInstance,
8 View,
9} from "react-native";
310import { useMaterialToolbarLayout } from "./useMaterialToolbarLayout";
411import { NativeStackScreenOptions } from "../native/StackHeader";
512import { AndroidWorkspaceSidebarButton } from "../features/layout/workspace-sidebar-toolbar";
......@@ -18,7 +25,7 @@ export function ScreenHeader(props: ScreenHeaderProps) {
1825 const { paddingTop, paddingBottom } = useMaterialToolbarLayout();
1926 const { scale, buttonSize, iconSize, smallIconSize } = useAndroidControlSizing();
2027 const { themeVariables } = useAppearancePreferences();
21 const inputRef = useRef<TextInput>(null);
28 const inputRef = useRef<TextInputInstance>(null);
2229 const [searchOpen, setSearchOpen] = useState(false);
2330 const searching = search !== undefined && (searchOpen || search.value.length > 0);
2431 const onSearchChange = search?.onChangeText;
apps/mobile/src/connection/background-activity.ts+4-2
......@@ -14,7 +14,7 @@ import * as Queue from "effect/Queue";
1414import * as Schedule from "effect/Schedule";
1515import * as Stream from "effect/Stream";
1616import * as SubscriptionRef from "effect/SubscriptionRef";
17import { AppState, type AppStateStatus } from "react-native";
17import { AppState } from "react-native";
1818
1919import * as MobileStorage from "../persistence/mobile-storage";
2020import {
......@@ -27,8 +27,10 @@ const REPORT_INTERVAL_MS = 25_000;
2727const LEASE_TTL_MS = 45_000;
2828const BASELINE_SCOPES: ReadonlyArray<BackgroundScope> = [{ type: "provider-status" }];
2929
30// `AppState.currentState` is a loosely typed string that can be unset before
31// the first change event; anything outside the known states reports as unknown.
3032function normalizeAppState(
31 state: AppStateStatus,
33 state: string | null | undefined,
3234): NonNullable<ClientActivityReportInput["appState"]> {
3335 if (state === "active" || state === "inactive" || state === "background") return state;
3436 return "unknown";
apps/mobile/src/features/agent-awareness/foregroundNotificationBehavior.test.ts created+61
......@@ -0,0 +1,61 @@
1import type { Notification } from "expo-notifications";
2import { describe, expect, it } from "vite-plus/test";
3
4import { foregroundNotificationBehavior } from "./foregroundNotificationBehavior";
5import { threadDeepLinkOnScreen } from "./notificationPayload";
6
7function notificationWithData(data: Record<string, unknown>): Notification {
8 return {
9 date: 0,
10 request: { identifier: "notification-1", content: { data }, trigger: null },
11 } as unknown as Notification;
12}
13
14describe("threadDeepLinkOnScreen", () => {
15 it("maps a thread route and its nested screens to the thread deep link", () => {
16 expect(threadDeepLinkOnScreen("/threads/env-1/thread-1")).toBe("/threads/env-1/thread-1");
17 expect(threadDeepLinkOnScreen("/threads/env-1/thread-1/files/src")).toBe(
18 "/threads/env-1/thread-1",
19 );
20 });
21
22 it("returns null outside a thread", () => {
23 expect(threadDeepLinkOnScreen("/")).toBeNull();
24 expect(threadDeepLinkOnScreen("/settings")).toBeNull();
25 expect(threadDeepLinkOnScreen("/threads/env-1")).toBeNull();
26 });
27});
28
29describe("foregroundNotificationBehavior", () => {
30 it("suppresses a notification for the thread already on screen", () => {
31 const behavior = foregroundNotificationBehavior(
32 notificationWithData({ environmentId: "env-1", threadId: "thread-1" }),
33 "/threads/env-1/thread-1",
34 );
35 expect(behavior.shouldShowBanner).toBe(false);
36 expect(behavior.shouldShowList).toBe(false);
37 expect(behavior.shouldPlaySound).toBe(false);
38 });
39
40 it("shows a notification for another thread", () => {
41 const behavior = foregroundNotificationBehavior(
42 notificationWithData({ deepLink: "/threads/env-1/thread-2" }),
43 "/threads/env-1/thread-1",
44 );
45 expect(behavior.shouldShowBanner).toBe(true);
46 expect(behavior.shouldShowList).toBe(true);
47 });
48
49 it("shows a notification when no thread is open or the payload has no target", () => {
50 expect(
51 foregroundNotificationBehavior(
52 notificationWithData({ environmentId: "env-1", threadId: "thread-1" }),
53 null,
54 ).shouldShowBanner,
55 ).toBe(true);
56 expect(
57 foregroundNotificationBehavior(notificationWithData({}), "/threads/env-1/thread-1")
58 .shouldShowBanner,
59 ).toBe(true);
60 });
61});
apps/mobile/src/features/agent-awareness/foregroundNotificationBehavior.ts created+35
......@@ -0,0 +1,35 @@
1import type { Notification, NotificationBehavior } from "expo-notifications";
2
3import { extractAgentNotificationDeepLink } from "./notificationPayload";
4
5const SHOW: NotificationBehavior = {
6 shouldShowBanner: true,
7 shouldShowList: true,
8 shouldPlaySound: true,
9 shouldSetBadge: false,
10};
11
12const SUPPRESS: NotificationBehavior = {
13 shouldShowBanner: false,
14 shouldShowList: false,
15 shouldPlaySound: false,
16 shouldSetBadge: false,
17};
18
19/**
20 * Decides how a notification that arrives while the app is open is presented.
21 * A notification for the thread already on screen is redundant with the live
22 * feed, so it stays silent; everything else banners like it would in the
23 * background. `deepLinkOnScreen` is the normalized `/threads/:env/:thread`
24 * path of the current route, or null when no thread is open.
25 */
26export function foregroundNotificationBehavior(
27 notification: Notification,
28 deepLinkOnScreen: string | null,
29): NotificationBehavior {
30 const target = extractAgentNotificationDeepLink({ notification });
31 if (target !== null && target === deepLinkOnScreen) {
32 return SUPPRESS;
33 }
34 return SHOW;
35}
apps/mobile/src/features/agent-awareness/notificationNavigation.ts+17-2
......@@ -2,12 +2,27 @@ import { useEffect, useRef } from "react";
22import * as Notifications from "expo-notifications";
33import { useLinkTo } from "@react-navigation/native";
44
5import { routeAgentNotificationResponseOnce } from "./notificationPayload";
5import { foregroundNotificationBehavior } from "./foregroundNotificationBehavior";
6import { routeAgentNotificationResponseOnce, threadDeepLinkOnScreen } from "./notificationPayload";
67import { consumeLastAgentNotificationResponse } from "./notificationResponseConsumer";
78
8export function useAgentNotificationNavigation(): void {
9export function useAgentNotificationNavigation(pathname: string): void {
910 const linkTo = useLinkTo();
1011 const handledResponseIds = useRef(new Set<string>());
12 // Read through a ref so the native handler registered once below sees the
13 // current route without re-registering on every navigation.
14 const deepLinkOnScreen = useRef<string | null>(null);
15 deepLinkOnScreen.current = threadDeepLinkOnScreen(pathname);
16
17 useEffect(() => {
18 Notifications.setNotificationHandler({
19 handleNotification: (notification) =>
20 Promise.resolve(foregroundNotificationBehavior(notification, deepLinkOnScreen.current)),
21 });
22 return () => {
23 Notifications.setNotificationHandler(null);
24 };
25 }, []);
1126
1227 useEffect(() => {
1328 const handleResponse = (response: Notifications.NotificationResponse): void => {
apps/mobile/src/features/agent-awareness/notificationPayload.ts+13
......@@ -69,6 +69,19 @@ function normalizeThreadDeepLink(value: string): string | null {
6969 }
7070}
7171
72/**
73 * The deep link a notification would have to carry to target the thread the
74 * given route is showing, including its nested screens such as the file
75 * inspector. Null when the route is not inside a thread.
76 */
77export function threadDeepLinkOnScreen(pathname: string): string | null {
78 const match = /^\/threads\/([^/]+)\/([^/]+)(?:\/|$)/.exec(pathname);
79 if (!match?.[1] || !match[2]) {
80 return null;
81 }
82 return `/threads/${match[1]}/${match[2]}`;
83}
84
7285export function extractAgentNotificationDeepLink(response: unknown): string | null {
7386 const data = dataFromNotificationResponse(response);
7487 const deepLink = data?.deepLink;
apps/mobile/src/features/archive/ArchivedThreadsScreen.tsx+4-6
......@@ -20,7 +20,7 @@ import {
2020 useWindowDimensions,
2121 View,
2222} from "react-native";
23import { Gesture, GestureDetector } from "react-native-gesture-handler";
23import { GestureDetector, useNativeGesture } from "react-native-gesture-handler";
2424import type { SwipeableMethods } from "react-native-gesture-handler/ReanimatedSwipeable";
2525
2626import { AppText as Text } from "../../components/AppText";
......@@ -185,9 +185,7 @@ function ArchivedThreadRow(props: {
185185 readonly onDelete: () => void;
186186 readonly onSwipeableClose: (methods: SwipeableMethods) => void;
187187 readonly onSwipeableWillOpen: (methods: SwipeableMethods) => void;
188 readonly simultaneousSwipeGesture?: ComponentProps<
189 typeof ThreadSwipeable
190 >["simultaneousWithExternalGesture"];
188 readonly simultaneousSwipeGesture?: ComponentProps<typeof ThreadSwipeable>["simultaneousWith"];
191189 readonly onUnarchive: () => void;
192190 readonly thread: EnvironmentThreadShell;
193191}) {
......@@ -221,7 +219,7 @@ function ArchivedThreadRow(props: {
221219 label: "Unarchive",
222220 onPress: props.onUnarchive,
223221 }}
224 simultaneousWithExternalGesture={props.simultaneousSwipeGesture}
222 simultaneousWith={props.simultaneousSwipeGesture}
225223 threadTitle={props.thread.title}
226224 >
227225 {() => (
......@@ -303,7 +301,7 @@ export function ArchivedThreadsScreen(props: {
303301}) {
304302 const { onDeleteThread, onUnarchiveThread } = props;
305303 const openSwipeableRef = useRef<SwipeableMethods | null>(null);
306 const archiveScrollGesture = useMemo(() => Gesture.Native(), []);
304 const archiveScrollGesture = useNativeGesture();
307305 const environmentLabelsById = useMemo(
308306 () =>
309307 new Map(
apps/mobile/src/features/connection/CloudEnvironmentRows.tsx+2-8
......@@ -13,13 +13,7 @@ import {
1313} from "@t3tools/contracts";
1414import { useAtomValue } from "@effect/atom-react";
1515import { useCallback, useState } from "react";
16import {
17 ActivityIndicator,
18 Pressable,
19 type NativeSyntheticEvent,
20 type TextLayoutEventData,
21 View,
22} from "react-native";
16import { ActivityIndicator, Pressable, type TextLayoutEvent, View } from "react-native";
2317
2418import { AppText as Text } from "../../components/AppText";
2519import { EnvironmentMachineSymbol } from "../../components/EnvironmentMachineSymbol";
......@@ -334,7 +328,7 @@ function CloudEnvironmentRowShell(props: {
334328 const isErrorExpanded = errorCanExpand && props.errorExpanded;
335329 const StatusContainer = errorCanExpand ? Pressable : View;
336330 const onMeasuredErrorTextLayout = useCallback(
337 (event: NativeSyntheticEvent<TextLayoutEventData>) => {
331 (event: TextLayoutEvent) => {
338332 if (!props.connectionError) {
339333 return;
340334 }
apps/mobile/src/features/devices/DeviceStreamWebView.tsx+2-2
......@@ -89,7 +89,7 @@ function DeviceStreamDocumentView({
8989 readonly onStreaming: () => void;
9090 readonly onRecoverProcess: () => boolean;
9191}) {
92 const webView = useRef<WebView>(null);
92 const webView = useRef<WebView<object>>(null);
9393 const active = useRef(true);
9494 const failed = useRef(false);
9595 const [status, setStatus] = useState<DeviceStreamStatus>("connecting");
......@@ -148,7 +148,7 @@ function DeviceStreamDocumentView({
148148 };
149149 return (
150150 <View className="flex-1" style={{ backgroundColor: background }}>
151 <WebView
151 <WebView<object>
152152 ref={webView}
153153 source={source}
154154 originWhitelist={["*"]}
apps/mobile/src/features/files/MaterialFilesHeader.tsx+2-2
......@@ -1,5 +1,5 @@
11import { useCallback, useEffect, useRef, useState, type ReactNode } from "react";
2import { BackHandler, Keyboard, type TextInput, View } from "react-native";
2import { BackHandler, Keyboard, type TextInputInstance, View } from "react-native";
33
44import { AndroidHeaderIconButton, AndroidScreenHeader } from "../../components/AndroidScreenHeader";
55import { AndroidAnchoredMenu } from "../../components/AndroidAnchoredMenu";
......@@ -16,7 +16,7 @@ export function MaterialFilesHeader(props: {
1616 readonly leading?: ReactNode;
1717}) {
1818 const { paddingTop, paddingBottom } = useMaterialToolbarLayout();
19 const searchRef = useRef<TextInput>(null);
19 const searchRef = useRef<TextInputInstance>(null);
2020 const [searchOpen, setSearchOpen] = useState(false);
2121 const searching = searchOpen || props.searchQuery.length > 0;
2222 const { onSearchQueryChange } = props;
apps/mobile/src/features/home/HomeScreen.tsx+4-4
......@@ -309,8 +309,8 @@ export function HomeScreen(props: HomeScreenProps) {
309309 (event: GestureResponderEvent, started: boolean) => {
310310 const { changedTouches, touches } = event.nativeEvent;
311311 swipeRowActivation.trackTouches(
312 started ? changedTouches.map((touch) => touch.identifier) : [],
313 touches.map((touch) => touch.identifier),
312 started ? changedTouches.map((touch) => String(touch.identifier)) : [],
313 touches.map((touch) => String(touch.identifier)),
314314 );
315315 },
316316 [swipeRowActivation],
......@@ -945,7 +945,7 @@ export function HomeScreen(props: HomeScreenProps) {
945945 );
946946 }
947947
948 const listHeader = Platform.OS === "ios" ? null : <HomeTopContentSpacer />;
948 const listHeader = Platform.OS === "ios" ? undefined : <HomeTopContentSpacer />;
949949
950950 // Project scoping lives in the header filter menu (no inline chip row on
951951 // mobile — the menu is the one filter surface).
......@@ -954,7 +954,7 @@ export function HomeScreen(props: HomeScreenProps) {
954954 // Use the v2 project scope for its empty state. Snoozed threads need no
955955 // special empty state: their shelf header is a list row even while collapsed.
956956 const v2ListEmpty =
957 hasSearchQuery && threadSearch.isPending ? null : hasSearchQuery ? (
957 hasSearchQuery && threadSearch.isPending ? undefined : hasSearchQuery ? (
958958 <EmptyState
959959 title="No results"
960960 detail={`No threads matching "${props.searchQuery}".`}
apps/mobile/src/features/home/MaterialThreadListToolbar.tsx+8-2
......@@ -1,5 +1,11 @@
11import { useCallback, useEffect, useRef, useState, type ComponentProps } from "react";
2import { BackHandler, Keyboard, type TextInput, View, type LayoutChangeEvent } from "react-native";
2import {
3 BackHandler,
4 Keyboard,
5 type TextInputInstance,
6 View,
7 type LayoutChangeEvent,
8} from "react-native";
39import { useSafeAreaInsets } from "react-native-safe-area-context";
410import type { MenuAction } from "@react-native-menu/menu";
511
......@@ -33,7 +39,7 @@ export function MaterialThreadListToolbar(props: {
3339 const { height: toolbarHeight, ...headerPadding } = useMaterialToolbarLayout();
3440 const { state } = useWorkspaceState();
3541 const { onRequestVisibility, onSearchQueryChange } = props;
36 const searchRef = useRef<TextInput>(null);
42 const searchRef = useRef<TextInputInstance>(null);
3743 const [searchOpen, setSearchOpen] = useState(false);
3844 const searching = searchOpen || props.searchQuery.length > 0;
3945 const openSearch = useCallback(() => {
apps/mobile/src/features/home/thread-swipe-actions.tsx+3-5
......@@ -266,9 +266,7 @@ interface ThreadSwipeableProps {
266266 readonly resetKey?: string;
267267 /** Paints the row without swipe machinery; see swipe-row-activation. */
268268 readonly dormant?: boolean;
269 readonly simultaneousWithExternalGesture?: ComponentProps<
270 typeof ReanimatedSwipeable
271 >["simultaneousWithExternalGesture"];
269 readonly simultaneousWith?: ComponentProps<typeof ReanimatedSwipeable>["simultaneousWith"];
272270 readonly threadTitle: string;
273271}
274272
......@@ -433,7 +431,7 @@ function ThreadSwipeableRow(props: ThreadSwipeableProps) {
433431 animationOptions={THREAD_SWIPE_SPRING}
434432 childrenContainerStyle={{ backgroundColor: props.backgroundColor }}
435433 containerStyle={[{ backgroundColor: props.backgroundColor }, props.containerStyle]}
436 dragOffsetFromRightEdge={8}
434 dragOffsetFromRight={-8}
437435 enabled={!isDismissing && props.enabled !== false && gateEnabled}
438436 enableTrackpadTwoFingerGesture={props.enableTrackpadSwipe ?? true}
439437 // Fail the swipe once the pan is vertically dominant (patched-in RNGH
......@@ -497,7 +495,7 @@ function ThreadSwipeableRow(props: ThreadSwipeableProps) {
497495 </Animated.View>
498496 )}
499497 rightThreshold={actionsWidth * 0.42}
500 simultaneousWithExternalGesture={props.simultaneousWithExternalGesture}
498 simultaneousWith={props.simultaneousWith}
501499 >
502500 {props.children(close)}
503501 </ReanimatedSwipeable>
apps/mobile/src/features/keyboard/CommandPalette.tsx+2-1
......@@ -12,6 +12,7 @@ import {
1212 TextInput,
1313 useWindowDimensions,
1414 View,
15 type TextInputInstance,
1516} from "react-native";
1617
1718import { GestureHandlerRootView } from "react-native-gesture-handler";
......@@ -151,7 +152,7 @@ export function CommandPalette(props: {
151152 const [visible, setVisible] = useState(true);
152153 const pendingAction = useRef<(() => void) | null>(null);
153154 const closing = useRef(false);
154 const inputRef = useRef<TextInput>(null);
155 const inputRef = useRef<TextInputInstance>(null);
155156 const listRef = useRef<FlatList<CommandPaletteItem>>(null);
156157 const { width, height } = useWindowDimensions();
157158 const searchEnvironmentIds = useMemo(
apps/mobile/src/features/sharing/incoming-share-storage.ts+1-1
......@@ -68,7 +68,7 @@ export async function writeIncomingShareDraft(draft: IncomingShareDraft): Promis
6868 if (!file.exists) {
6969 file.create({ intermediates: true, overwrite: true });
7070 }
71 file.write(JSON.stringify(draft));
71 await file.write(JSON.stringify(draft));
7272 } catch (cause) {
7373 throw new IncomingShareStorageError({ operation: "write", shareId: draft.id, cause });
7474 }
apps/mobile/src/features/terminal/NativeTerminalSurface.tsx+2-1
......@@ -6,6 +6,7 @@ import {
66 View,
77 type LayoutChangeEvent,
88 type NativeSyntheticEvent,
9 type TextInputInstance,
910 type ViewProps,
1011} from "react-native";
1112
......@@ -61,7 +62,7 @@ function estimateGridSize(input: {
6162
6263const FallbackTerminalSurface = memo(function FallbackTerminalSurface(props: TerminalSurfaceProps) {
6364 const fontSize = props.fontSize ?? MOBILE_TYPOGRAPHY.label.fontSize;
64 const inputRef = useRef<TextInput>(null);
65 const inputRef = useRef<TextInputInstance>(null);
6566 const { themeAppearance, themeId } = useAppearancePreferences();
6667 const theme = props.theme ?? getMobileTerminalTheme(themeId, themeAppearance);
6768 const statusLabel = props.isRunning
apps/mobile/src/features/threads/CustomSnoozeSheet.ios.tsx+3-3
......@@ -139,7 +139,7 @@ export function CustomSnoozeSheet(props: {
139139 modifiers={[
140140 datePickerStyle("wheel"),
141141 labelsHidden(),
142 frame({ maxWidth: Infinity, height: 180 }),
142 frame({ maxWidth: Infinity, minHeight: 180, maxHeight: 180 }),
143143 ]}
144144 />
145145 ) : (
......@@ -154,7 +154,7 @@ export function CustomSnoozeSheet(props: {
154154 modifiers={[
155155 pickerStyle("wheel"),
156156 labelsHidden(),
157 frame({ minWidth: 0, maxWidth: Infinity, height: 180 }),
157 frame({ minWidth: 0, maxWidth: Infinity, minHeight: 180, maxHeight: 180 }),
158158 clipped(),
159159 ]}
160160 >
......@@ -177,7 +177,7 @@ export function CustomSnoozeSheet(props: {
177177 modifiers={[
178178 pickerStyle("wheel"),
179179 labelsHidden(),
180 frame({ minWidth: 0, maxWidth: Infinity, height: 180 }),
180 frame({ minWidth: 0, maxWidth: Infinity, minHeight: 180, maxHeight: 180 }),
181181 clipped(),
182182 ]}
183183 >
apps/mobile/src/features/threads/ThreadDetailScreen.tsx+2-1
......@@ -47,6 +47,7 @@ import {
4747 useWindowDimensions,
4848 View,
4949 type GestureResponderEvent,
50 type ViewInstance,
5051} from "react-native";
5152import {
5253 KeyboardController,
......@@ -321,7 +322,7 @@ export const ThreadDetailScreen = memo(function ThreadDetailScreen(props: Thread
321322 const composerEditorRef = useRef<ComposerEditorHandle>(null);
322323 const draftMessageRef = useRef(props.draftMessage);
323324 draftMessageRef.current = props.draftMessage;
324 const composerOverlayRef = useRef<View>(null);
325 const composerOverlayRef = useRef<ViewInstance>(null);
325326 const listRef = useRef<LegendListRef>(null);
326327 const feedTouchStartRef = useRef<{ pageX: number; pageY: number } | null>(null);
327328 const selectedThreadKeyRef = useRef(selectedThreadKey);
apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx+4-4
......@@ -14,9 +14,9 @@ import type { MenuAction } from "@react-native-menu/menu";
1414import { useAtomValue } from "@effect/atom-react";
1515import { type EnvironmentId, resolveEnvironmentMachineKind } from "@t3tools/contracts";
1616import { useCallback, useEffect, useMemo, useRef, useState } from "react";
17import type { LayoutChangeEvent } from "react-native";
17import type { LayoutChangeEvent, TextInputInstance } from "react-native";
1818import { Platform, StyleSheet, TextInput, View } from "react-native";
19import { Gesture, GestureDetector } from "react-native-gesture-handler";
19import { GestureDetector, useNativeGesture } from "react-native-gesture-handler";
2020import type { SwipeableMethods } from "react-native-gesture-handler/ReanimatedSwipeable";
2121import { useSafeAreaInsets } from "react-native-safe-area-context";
2222import type { SearchBarCommands } from "react-native-screens";
......@@ -139,10 +139,10 @@ function ThreadNavigationSidebarPane(
139139 const threads = useThreadShells();
140140 const { environments: workspaceEnvironments, state: catalogState } = useWorkspaceState();
141141 const { savedConnectionsById } = useSavedRemoteConnections();
142 const searchInputRef = useRef<TextInput>(null);
142 const searchInputRef = useRef<TextInputInstance>(null);
143143 const searchBarRef = useRef<SearchBarCommands>(null);
144144 const openSwipeableRef = useRef<SwipeableMethods | null>(null);
145 const sidebarScrollGesture = useMemo(() => Gesture.Native(), []);
145 const sidebarScrollGesture = useNativeGesture();
146146 const {
147147 archiveThread,
148148 confirmDeleteThread,
apps/mobile/src/features/threads/thread-list-v2-items.tsx+2-4
......@@ -523,9 +523,7 @@ export const ThreadListV2Row = memo(function ThreadListV2Row(props: {
523523 readonly activationKey?: string;
524524 readonly searchMatch?: EnvironmentThreadSearchMatch;
525525 readonly searchQuery?: string;
526 readonly simultaneousSwipeGesture?: ComponentProps<
527 typeof ThreadSwipeable
528 >["simultaneousWithExternalGesture"];
526 readonly simultaneousSwipeGesture?: ComponentProps<typeof ThreadSwipeable>["simultaneousWith"];
529527}) {
530528 const { width: windowWidth } = useWindowDimensions();
531529 const {
......@@ -1198,7 +1196,7 @@ export const ThreadListV2Row = memo(function ThreadListV2Row(props: {
11981196 primaryAction={primaryAction}
11991197 secondaryAction={secondaryAction}
12001198 resetKey={`${thread.environmentId}:${thread.id}:${variant}:${snoozedRow}:${thread.settledAt}:${thread.unsettledAt}:${thread.snoozedUntil}`}
1201 simultaneousWithExternalGesture={props.simultaneousSwipeGesture}
1199 simultaneousWith={props.simultaneousSwipeGesture}
12021200 threadTitle={thread.title}
12031201 >
12041202 {(close) => (
apps/mobile/src/lib/atomic-file.ts+1-1
......@@ -14,6 +14,6 @@ export async function writeFileAtomically(file: File, contents: string): Promise
1414 tempFileSequence += 1;
1515 const temp = new FileConstructor(file.parentDirectory, `${file.name}.${tempFileSequence}.tmp`);
1616 temp.create({ intermediates: true, overwrite: true });
17 temp.write(contents);
17 await temp.write(contents);
1818 temp.moveSync(file, { overwrite: true });
1919}
apps/mobile/src/lib/attachmentUpload.ts+1-1
......@@ -276,7 +276,7 @@ async function uploadFileBytes(
276276 try {
277277 if (fileUri === undefined && inlineDataUrl !== undefined) {
278278 file.create();
279 file.write(inlineDataUrl.slice(inlineDataUrl.indexOf(",") + 1), {
279 await file.write(inlineDataUrl.slice(inlineDataUrl.indexOf(",") + 1), {
280280 encoding: "base64",
281281 });
282282 }
apps/mobile/src/lib/composerImages.ts+2-2
......@@ -161,7 +161,7 @@ export async function persistComposerAttachmentFile(
161161 try {
162162 let copiedBytes = 0;
163163 while (true) {
164 const chunk = reader.readBytes(
164 const chunk = await reader.readBytes(
165165 Math.min(ATTACHMENT_COPY_CHUNK_BYTES, maxBytes - copiedBytes + 1),
166166 );
167167 if (chunk.byteLength === 0) {
......@@ -171,7 +171,7 @@ export async function persistComposerAttachmentFile(
171171 if (copiedBytes > maxBytes) {
172172 throw new Error(fileAttachmentTooLargeMessage(name, maxBytes));
173173 }
174 writer.writeBytes(chunk);
174 await writer.writeBytes(chunk);
175175 }
176176 } finally {
177177 writer.close();
apps/mobile/src/native/T3ComposerEditor.ios.tsx+7-4
......@@ -13,9 +13,12 @@ import {
1313 type Ref,
1414} from "react";
1515import type { NativeSyntheticEvent, StyleProp, ViewProps, ViewStyle } from "react-native";
16import { Image, StyleSheet } from "react-native";
16import { StyleSheet } from "react-native";
1717
18import { markdownFileIconSource } from "@t3tools/mobile-markdown-text/file-icons";
18import {
19 markdownFileIconSource,
20 markdownIconAssetUri,
21} from "@t3tools/mobile-markdown-text/file-icons";
1922import {
2023 composerChipSizeSuffix,
2124 contextChipPresentation,
......@@ -109,8 +112,8 @@ function basename(path: string): string {
109112 return separator >= 0 ? path.slice(separator + 1) : path;
110113}
111114
112function fileIconUri(path: string): string {
113 return Image.resolveAssetSource(markdownFileIconSource(resolveMarkdownFileIcon(path))).uri;
115function fileIconUri(path: string): string | null {
116 return markdownIconAssetUri(markdownFileIconSource(resolveMarkdownFileIcon(path))) ?? null;
114117}
115118
116119export function ComposerEditor({
apps/mobile/src/native/T3ComposerEditor.native.tsx+6-3
......@@ -16,7 +16,10 @@ import {
1616import type { NativeSyntheticEvent, ViewProps } from "react-native";
1717import { Image, Platform, StyleSheet } from "react-native";
1818
19import { markdownFileIconSource } from "@t3tools/mobile-markdown-text/file-icons";
19import {
20 markdownFileIconSource,
21 markdownIconAssetUri,
22} from "@t3tools/mobile-markdown-text/file-icons";
2023import {
2124 composerChipSizeSuffix,
2225 contextChipPresentation,
......@@ -110,8 +113,8 @@ function basename(path: string): string {
110113 return separator >= 0 ? path.slice(separator + 1) : path;
111114}
112115
113function fileIconUri(path: string): string {
114 return Image.resolveAssetSource(markdownFileIconSource(resolveMarkdownFileIcon(path))).uri;
116function fileIconUri(path: string): string | null {
117 return markdownIconAssetUri(markdownFileIconSource(resolveMarkdownFileIcon(path))) ?? null;
115118}
116119
117120export function ComposerEditor({
apps/mobile/src/native/T3ComposerEditor.tsx+2-2
......@@ -1,6 +1,6 @@
11import { TextInputWrapper } from "expo-paste-input";
22import { useImperativeHandle, useRef } from "react";
3import { TextInput, type TextInput as RNTextInput } from "react-native";
3import { TextInput, type TextInputInstance } from "react-native";
44
55import { useFontFamily } from "../lib/useFontFamily";
66import { useScaledTextRole } from "../features/settings/appearance/useScaledTextRole";
......@@ -21,7 +21,7 @@ export function ComposerEditor({
2121 readOnly = false,
2222 ...props
2323}: ComposerEditorProps) {
24 const inputRef = useRef<RNTextInput>(null);
24 const inputRef = useRef<TextInputInstance>(null);
2525 const bodyText = useScaledTextRole("body");
2626 const fontFamily = useFontFamily("regular");
2727 const handlePaste = useNativePaste((uris) => onPasteImages?.(uris));
apps/mobile/src/native/T3KeyboardCommands.android.tsx+1-1
......@@ -4,7 +4,7 @@ import type { NativeSyntheticEvent, ViewProps } from "react-native";
44
55import type { HardwareKeyboardCommand } from "../features/keyboard/hardwareKeyboardCommands";
66
7interface NativeKeyboardCommandsProps extends ViewProps, PropsWithChildren {
7interface NativeKeyboardCommandsProps extends ViewProps {
88 readonly enabledCommands: ReadonlyArray<HardwareKeyboardCommand>;
99 readonly onCommand: (
1010 event: NativeSyntheticEvent<{ readonly command: HardwareKeyboardCommand }>,
apps/mobile/src/native/T3KeyboardCommands.ios.tsx+1-1
......@@ -4,7 +4,7 @@ import type { NativeSyntheticEvent, ViewProps } from "react-native";
44
55import type { HardwareKeyboardCommand } from "../features/keyboard/hardwareKeyboardCommands";
66
7interface NativeKeyboardCommandsProps extends ViewProps, PropsWithChildren {
7interface NativeKeyboardCommandsProps extends ViewProps {
88 readonly enabledCommands: ReadonlyArray<HardwareKeyboardCommand>;
99 readonly onCommand: (
1010 event: NativeSyntheticEvent<{ readonly command: HardwareKeyboardCommand }>,
apps/mobile/src/widgets/SubscriptionUsage.tsx+1-1
......@@ -29,7 +29,7 @@ function SubscriptionUsage(
2929 // The extension evaluates this function without the app's module scope.
3030 const family = environment.widgetFamily;
3131 // Gallery snapshots can render an old timeline entry after it has expired.
32 const now = Math.max(environment.date.getTime(), Date.now());
32 const now = Math.max(environment.date?.getTime() ?? 0, Date.now());
3333 const accessory = family === "accessoryRectangular";
3434 const compact =
3535 family === "systemSmall" || accessory || environment.levelOfDetail === "simplified";
apps/mobile/tsconfig.json+1-1
......@@ -1,5 +1,5 @@
11{
2 "extends": "expo/tsconfig.base",
2 "extends": "expo/tsconfig.base.json",
33 "compilerOptions": {
44 "allowImportingTsExtensions": true,
55 "strict": true,
apps/web/package.json+1-1
......@@ -68,7 +68,7 @@
6868 "@types/compression": "^1.8.1",
6969 "@types/culori": "^4.0.1",
7070 "@types/mdast": "^4.0.4",
71 "@types/react": "~19.2.14",
71 "@types/react": "~19.3.0",
7272 "@types/react-dom": "~19.2.3",
7373 "@types/react-test-renderer": "19.1.0",
7474 "@vercel/config": "^0.3.0",
patches/@clerk__expo@4.6.8.patch+17
......@@ -1,3 +1,20 @@
1diff --git a/android/build.gradle b/android/build.gradle
2index 6bd6d5acf6ac3da78232170a6ea8c2b0f6e5504e..a827dad53dcd8c1b2f47fce30ea8bf9140787f38 100644
3--- a/android/build.gradle
4+++ b/android/build.gradle
5@@ -146,6 +146,12 @@ dependencies {
6 implementation "androidx.activity:activity-compose:$activityComposeVersion"
7 implementation "androidx.lifecycle:lifecycle-runtime-compose:$lifecycleVersion"
8 implementation "androidx.lifecycle:lifecycle-viewmodel-compose:$lifecycleVersion"
9+ // ClerkComposeNativeViewHost imports LocalSavedStateRegistryOwner and
10+ // LocalLifecycleOwner from these artifacts. Earlier SDKs leaked them onto
11+ // the compile classpath through clerk-android-ui's navigation3 runtime
12+ // dependency; AGP 9 resolves the compile classpath on its own.
13+ implementation "androidx.savedstate:savedstate-compose:1.4.0"
14+ implementation "androidx.lifecycle:lifecycle-runtime-compose:2.10.0"
15
16 testImplementation "junit:junit:4.13.2"
17 }
118diff --git a/ios/ClerkAuthNativeView.swift b/ios/ClerkAuthNativeView.swift
219index 5f8d2ba66d5b232890af75c22b173c86d2ef546b..b170304cbf2fbaae8032db8dd6f89b6a59c6e3fe 100644
320--- a/ios/ClerkAuthNativeView.swift
patches/@expo__metro-config@57.0.12.patch deleted-86
......@@ -1,86 +0,0 @@
1diff --git a/build/serializer/sourceMap.js b/build/serializer/sourceMap.js
2index 547e53377a7c560db8dfd983601606de15896e07..29a0c855088bceacb7ba00a627615539cbf37738 100644
3--- a/build/serializer/sourceMap.js
4+++ b/build/serializer/sourceMap.js
5@@ -27,6 +27,13 @@ function loadSourcemapCodec() {
6 }
7 return _sourcemapCodec;
8 }
9+let _traceMapping;
10+function loadTraceMapping() {
11+ if (!_traceMapping) {
12+ _traceMapping = require('@jridgewell/trace-mapping');
13+ }
14+ return _traceMapping;
15+}
16 let _Generator;
17 function loadGenerator() {
18 if (!_Generator) {
19@@ -224,6 +231,58 @@ function repairInvalidNegativeIndices(map) {
20 }
21 return changed ? { ...map, mappings: encode(decoded) } : map;
22 }
23+// Hermes can emit mappings for Metro trailer/debug lines that have no
24+// corresponding Metro source-map line. @jridgewell/remapping assumes every
25+// referenced generated line exists, so strip those invalid bridge segments.
26+function getGeneratedLineCount(map) {
27+ const { TraceMap, decodedMappings } = loadTraceMapping();
28+ return decodedMappings(new TraceMap(map)).length;
29+}
30+function dropInvalidOriginalSegments(map, maxOriginalLine) {
31+ const { TraceMap, decodedMappings } = loadTraceMapping();
32+ const decoded = decodedMappings(new TraceMap(map));
33+ let didChange = false;
34+ const filtered = decoded.map((line) => {
35+ const filteredLine = line.filter((segment) => {
36+ if (segment.length < 4) {
37+ return true;
38+ }
39+ const sourceIndex = segment[1];
40+ const sourceLine = segment[2];
41+ const sourceColumn = segment[3];
42+ return (sourceIndex >= 0 &&
43+ sourceIndex < map.sources.length &&
44+ sourceLine >= 0 &&
45+ sourceLine < maxOriginalLine &&
46+ sourceColumn >= 0);
47+ });
48+ if (filteredLine.length !== line.length) {
49+ didChange = true;
50+ }
51+ return filteredLine;
52+ });
53+ if (!didChange) {
54+ return map;
55+ }
56+ return {
57+ ...map,
58+ mappings: loadSourcemapCodec().encode(filtered),
59+ };
60+}
61+function sanitizeSourceMapsForComposition(maps) {
62+ let sanitized = maps;
63+ for (let index = 1; index < maps.length; index++) {
64+ const maxOriginalLine = getGeneratedLineCount(sanitized[index - 1]);
65+ const next = dropInvalidOriginalSegments(sanitized[index], maxOriginalLine);
66+ if (next !== sanitized[index]) {
67+ if (sanitized === maps) {
68+ sanitized = maps.slice();
69+ }
70+ sanitized[index] = next;
71+ }
72+ }
73+ return sanitized;
74+}
75 // `maps[0]` is the original-most transform; `maps[maps.length - 1]` is
76 // the most recent. Built on `@jridgewell/remapping` instead of mozilla's
77 // `SourceMapConsumer`-based composer.
78@@ -251,7 +310,7 @@ function composeSourceMaps(maps) {
79 return { ...map, ignoreList: map.x_google_ignoreList };
80 });
81 // Metro convention is original-first; remapping is most-recent first.
82- let input = normalized.slice().reverse();
83+ let input = sanitizeSourceMapsForComposition(normalized).slice().reverse();
84 const remap = loadRemapping();
85 let composed;
86 try {
patches/@expo__metro-config@58.0.6.patch created+72
......@@ -0,0 +1,72 @@
1diff --git a/build/serializer/sourceMap.js b/build/serializer/sourceMap.js
2index 2a58f57..a90ce77 100644
3--- a/build/serializer/sourceMap.js
4+++ b/build/serializer/sourceMap.js
5@@ -177,6 +177,58 @@ function repairInvalidNegativeIndices(map) {
6 mappings: encode(decoded)
7 } : map;
8 }
9+// Hermes can emit mappings for Metro trailer/debug lines that have no
10+// corresponding Metro source-map line. @jridgewell/remapping assumes every
11+// referenced generated line exists, so strip those invalid bridge segments.
12+function getGeneratedLineCount(map) {
13+ const { TraceMap, decodedMappings } = loadTraceMapping();
14+ return decodedMappings(new TraceMap(map)).length;
15+}
16+function dropInvalidOriginalSegments(map, maxOriginalLine) {
17+ const { TraceMap, decodedMappings } = loadTraceMapping();
18+ const decoded = decodedMappings(new TraceMap(map));
19+ let didChange = false;
20+ const filtered = decoded.map((line) => {
21+ const filteredLine = line.filter((segment) => {
22+ if (segment.length < 4) {
23+ return true;
24+ }
25+ const sourceIndex = segment[1];
26+ const sourceLine = segment[2];
27+ const sourceColumn = segment[3];
28+ return (sourceIndex >= 0 &&
29+ sourceIndex < map.sources.length &&
30+ sourceLine >= 0 &&
31+ sourceLine < maxOriginalLine &&
32+ sourceColumn >= 0);
33+ });
34+ if (filteredLine.length !== line.length) {
35+ didChange = true;
36+ }
37+ return filteredLine;
38+ });
39+ if (!didChange) {
40+ return map;
41+ }
42+ return {
43+ ...map,
44+ mappings: loadSourcemapCodec().encode(filtered),
45+ };
46+}
47+function sanitizeSourceMapsForComposition(maps) {
48+ let sanitized = maps;
49+ for (let index = 1; index < maps.length; index++) {
50+ const maxOriginalLine = getGeneratedLineCount(sanitized[index - 1]);
51+ const next = dropInvalidOriginalSegments(sanitized[index], maxOriginalLine);
52+ if (next !== sanitized[index]) {
53+ if (sanitized === maps) {
54+ sanitized = maps.slice();
55+ }
56+ sanitized[index] = next;
57+ }
58+ }
59+ return sanitized;
60+}
61 function composeSourceMaps(maps) {
62 if (maps.length < 1) {
63 throw new Error('composeSourceMaps: Expected at least one map');
64@@ -192,7 +244,7 @@ function composeSourceMaps(maps) {
65 };
66 });
67 // Metro convention is original-first; remapping is most-recent first.
68- let input = normalized.slice().reverse();
69+ let input = sanitizeSourceMapsForComposition(normalized).slice().reverse();
70 const remap = loadRemapping();
71 let composed;
72 try {
patches/@react-native-menu__menu@2.0.0.patch+8
......@@ -2,6 +2,14 @@ diff --git a/ios/MenuViewManager.mm b/ios/MenuViewManager.mm
22index 3d149b3e7426b8f7c999603ddf1e15e12331c33a..e80fe2caae86e339fcb03408419a7d64b3e5b04f 100644
33--- a/ios/MenuViewManager.mm
44+++ b/ios/MenuViewManager.mm
5@@ -1,6 +1,6 @@
6 #import <React/RCTViewManager.h>
7 #import <React/RCTUIManager.h>
8-#import "RCTBridge.h"
9+#import <React/RCTBridge.h>
10
11 #ifdef RCT_NEW_ARCH_ENABLED
12 // NEW ARCH
513@@ -65,6 +65,10 @@ - (UIView *)view
614 * onOpenMenu: callback to be called when the menu is opened
715 */
patches/expo-audio@57.0.4.patch deleted-24
......@@ -1,24 +0,0 @@
1diff --git a/ios/AudioRecorder.swift b/ios/AudioRecorder.swift
2index 20020bff9f8ba7bb6e7f61c99b4de5d29eee00db..284c22f12e30c8c2ed16feb141876cbfd8897c90 100644
3--- a/ios/AudioRecorder.swift
4+++ b/ios/AudioRecorder.swift
5@@ -216,15 +216,15 @@ class AudioRecorder: SharedRef<AVAudioRecorder>, RecordingResultHandler {
6 }
7
8 func didFinish(_ recorder: AVAudioRecorder, successfully flag: Bool) {
9- // Update internal state when recording finishes automatically (e.g., from recordForDuration)
10- currentState = .stopped
11+ // Update internal state when AVAudioRecorder finishes or fails.
12+ currentState = flag ? .stopped : .error
13 resetDurationTracking()
14
15 emit(event: recordingStatus, payload: [
16 "id": id,
17 "isFinished": true,
18- "hasError": false,
19- "error": nil,
20+ "hasError": !flag,
21+ "error": flag ? nil : "Recording failed",
22 "url": recorder.url.absoluteString
23 ])
24 }
patches/expo-audio@58.0.3.patch created+25
......@@ -0,0 +1,25 @@
1diff --git a/ios/AudioRecorder.swift b/ios/AudioRecorder.swift
2index 73c6a036be6c76e219774a8d1e1cc3a7f18e6f8e..edfbbe00c2b0f3544bcbe42d02b829bf310d241c 100644
3--- a/ios/AudioRecorder.swift
4+++ b/ios/AudioRecorder.swift
5@@ -268,16 +268,16 @@ class AudioRecorder: SharedRef<AVAudioRecorder>, RecordingResultHandler {
6 }
7
8 func didFinish(_ recorder: AVAudioRecorder, successfully flag: Bool) {
9- // Update internal state when recording finishes automatically (e.g., from recordForDuration)
10- currentState = .stopped
11+ // Update internal state when AVAudioRecorder finishes or fails.
12+ currentState = flag ? .stopped : .error
13 resetDurationTracking()
14 durationLimitSeconds = nil
15
16 emit(event: recordingStatus, payload: [
17 "id": id,
18 "isFinished": true,
19- "hasError": false,
20- "error": nil,
21+ "hasError": !flag,
22+ "error": flag ? nil : "Recording failed",
23 "url": recorder.url.absoluteString
24 ])
25 }
patches/expo-blur@58.0.2.patch created+57
......@@ -0,0 +1,57 @@
1diff --git a/build/BlurView.types.d.ts b/build/BlurView.types.d.ts
2index cc93ffe2cd398a73ac50ebbe5427cbe4187fd83b..7246e9ffbe67af7da4fed20e1e08d0768be812a3 100644
3--- a/build/BlurView.types.d.ts
4+++ b/build/BlurView.types.d.ts
5@@ -1,5 +1,5 @@
6 import type { RefObject } from 'react';
7-import type { ViewProps, View } from 'react-native';
8+import type { ViewProps, ViewInstance } from 'react-native';
9 /**
10 * Blur method to use on Android.
11 *
12@@ -24,7 +24,7 @@ export type BlurViewProps = {
13 *
14 * @platform android
15 */
16- blurTarget?: RefObject<View | null>;
17+ blurTarget?: RefObject<ViewInstance | null>;
18 /**
19 * A tint mode which will be applied to the view.
20 *
21@@ -68,6 +68,6 @@ export type BlurViewProps = {
22 blurMethod?: BlurMethod;
23 } & ViewProps;
24 export type BlurTargetViewProps = {
25- ref?: RefObject<View | null>;
26+ ref?: RefObject<ViewInstance | null>;
27 } & ViewProps;
28 export type BlurTint = 'light' | 'dark' | 'default' | 'extraLight' | 'regular' | 'prominent' | 'systemUltraThinMaterial' | 'systemThinMaterial' | 'systemMaterial' | 'systemThickMaterial' | 'systemChromeMaterial' | 'systemUltraThinMaterialLight' | 'systemThinMaterialLight' | 'systemMaterialLight' | 'systemThickMaterialLight' | 'systemChromeMaterialLight' | 'systemUltraThinMaterialDark' | 'systemThinMaterialDark' | 'systemMaterialDark' | 'systemThickMaterialDark' | 'systemChromeMaterialDark';
29diff --git a/src/BlurView.types.ts b/src/BlurView.types.ts
30index b63ad6b3a9e30bd0f13cff322be79077d0cb5326..bdc3295af94bc17e8a6457b6c9567ff2d57799a7 100644
31--- a/src/BlurView.types.ts
32+++ b/src/BlurView.types.ts
33@@ -1,5 +1,5 @@
34 import type { RefObject } from 'react';
35-import type { ViewProps, View } from 'react-native';
36+import type { ViewProps, ViewInstance } from 'react-native';
37
38 /**
39 * Blur method to use on Android.
40@@ -27,7 +27,7 @@ export type BlurViewProps = {
41 *
42 * @platform android
43 */
44- blurTarget?: RefObject<View | null>;
45+ blurTarget?: RefObject<ViewInstance | null>;
46 /**
47 * A tint mode which will be applied to the view.
48 *
49@@ -74,7 +74,7 @@ export type BlurViewProps = {
50 } & ViewProps;
51
52 export type BlurTargetViewProps = {
53- ref?: RefObject<View | null>;
54+ ref?: RefObject<ViewInstance | null>;
55 } & ViewProps;
56
57 export type BlurTint =
patches/expo-glass-effect@58.0.3.patch created+72
......@@ -0,0 +1,72 @@
1diff --git a/build/GlassContainer.types.d.ts b/build/GlassContainer.types.d.ts
2index 502f9b037900d62aa5875dc37f0fcb517dec7a44..cc521dcb7e411cba7dfe99f191bbc42ac979849f 100644
3--- a/build/GlassContainer.types.d.ts
4+++ b/build/GlassContainer.types.d.ts
5@@ -1,5 +1,5 @@
6 import type { Ref } from 'react';
7-import type { View, ViewProps } from 'react-native';
8+import type { ViewInstance, ViewProps } from 'react-native';
9 export type GlassContainerProps = {
10 /**
11 * The distance at which glass elements start affecting each other.
12@@ -7,5 +7,5 @@ export type GlassContainerProps = {
13 * @default undefined
14 */
15 spacing?: number;
16- ref?: Ref<View>;
17+ ref?: Ref<ViewInstance>;
18 } & ViewProps;
19diff --git a/build/GlassView.types.d.ts b/build/GlassView.types.d.ts
20index a09487b1b3ef2e4d89b19e2bad81f99fc532d94d..eeadfff1dcd891bf581ef6be0493e2a6eda0849a 100644
21--- a/build/GlassView.types.d.ts
22+++ b/build/GlassView.types.d.ts
23@@ -1,5 +1,5 @@
24 import type { Ref } from 'react';
25-import type { ColorValue, View, ViewProps } from 'react-native';
26+import type { ColorValue, ViewInstance, ViewProps } from 'react-native';
27 export type GlassStyle = 'clear' | 'regular' | 'none';
28 export type GlassEffectStyleConfig = {
29 /**
30@@ -40,5 +40,5 @@ export type GlassViewProps = {
31 * @default 'auto'
32 */
33 colorScheme?: GlassColorScheme;
34- ref?: Ref<View>;
35+ ref?: Ref<ViewInstance>;
36 } & ViewProps;
37diff --git a/src/GlassContainer.types.ts b/src/GlassContainer.types.ts
38index f57a30713a4a2c1769e4f213a43d29fa17d8c411..fa934d45d488dcbc8cb6396e88f0a2996834367b 100644
39--- a/src/GlassContainer.types.ts
40+++ b/src/GlassContainer.types.ts
41@@ -1,5 +1,5 @@
42 import type { Ref } from 'react';
43-import type { View, ViewProps } from 'react-native';
44+import type { ViewInstance, ViewProps } from 'react-native';
45
46 export type GlassContainerProps = {
47 /**
48@@ -8,5 +8,5 @@ export type GlassContainerProps = {
49 * @default undefined
50 */
51 spacing?: number;
52- ref?: Ref<View>;
53+ ref?: Ref<ViewInstance>;
54 } & ViewProps;
55diff --git a/src/GlassView.types.ts b/src/GlassView.types.ts
56index 7fc30003a9337a12ffb12ffb44a050aae99e9b40..413db6b698055dd00d6ec2cf7b71e4370c85054c 100644
57--- a/src/GlassView.types.ts
58+++ b/src/GlassView.types.ts
59@@ -1,5 +1,5 @@
60 import type { Ref } from 'react';
61-import type { ColorValue, View, ViewProps } from 'react-native';
62+import type { ColorValue, ViewInstance, ViewProps } from 'react-native';
63
64 export type GlassStyle = 'clear' | 'regular' | 'none';
65
66@@ -44,5 +44,5 @@ export type GlassViewProps = {
67 * @default 'auto'
68 */
69 colorScheme?: GlassColorScheme;
70- ref?: Ref<View>;
71+ ref?: Ref<ViewInstance>;
72 } & ViewProps;
patches/expo-sharing@57.0.17.patch deleted-123
......@@ -1,123 +0,0 @@
1diff --git a/android/src/main/java/expo/modules/sharing/SharingRecords.kt b/android/src/main/java/expo/modules/sharing/SharingRecords.kt
2index 0b87b53f632e82f9b4c09c066d5a67e4ab2525a4..65f1c57faef3ba8caac9e137341f2b8312bb5f86 100644
3--- a/android/src/main/java/expo/modules/sharing/SharingRecords.kt
4+++ b/android/src/main/java/expo/modules/sharing/SharingRecords.kt
5@@ -52,7 +52,8 @@ enum class ContentType(val value: String) : Enumerable {
6 internal data class SharePayload(
7 @Field var value: String = "",
8 @Field var shareType: ShareType = ShareType.Text,
9- @Field var mimeType: String = "text/plain"
10+ @Field var mimeType: String = "text/plain",
11+ @Field var originalName: String? = null
12 ) : Record
13
14 @OptimizedRecord
15diff --git a/android/src/main/java/expo/modules/sharing/dataParsers/SimpleShareIntentDataParser.kt b/android/src/main/java/expo/modules/sharing/dataParsers/SimpleShareIntentDataParser.kt
16index 8dd50e8f04022d183884a57e4d61a7e1711b9e49..481cdb4bc64ea5ae49919071f686324f6d56d55c 100644
17--- a/android/src/main/java/expo/modules/sharing/dataParsers/SimpleShareIntentDataParser.kt
18+++ b/android/src/main/java/expo/modules/sharing/dataParsers/SimpleShareIntentDataParser.kt
19@@ -3,6 +3,7 @@ package expo.modules.sharing
20 import android.content.Context
21 import android.content.Intent
22 import android.net.Uri
23+import android.provider.OpenableColumns
24
25 internal class SimpleShareIntentDataParser {
26 companion object {
27@@ -17,21 +18,26 @@ internal class SimpleShareIntentDataParser {
28 }
29
30 private fun handleSendAction(context: Context, intent: Intent, type: String): List<SharePayload> {
31- return if (type == "text/plain") {
32- val text = intent.getStringExtra(Intent.EXTRA_TEXT) ?: return emptyList()
33- val isUrl = android.util.Patterns.WEB_URL.matcher(text).matches()
34-
35- listOf(
36+ val stream = intent.getParcelableExtraCompat<Uri>(Intent.EXTRA_STREAM)
37+ val text = intent.getStringExtra(Intent.EXTRA_TEXT)
38+ if (stream == null) {
39+ if (!type.startsWith("text/") || text == null) return emptyList()
40+ return listOf(
41 SharePayload().apply {
42 value = text
43- shareType = if (isUrl) ShareType.Url else ShareType.Text
44- mimeType = "text/plain"
45+ shareType = if (android.util.Patterns.WEB_URL.matcher(text).matches()) ShareType.Url else ShareType.Text
46+ mimeType = type
47 }
48 )
49- } else {
50- val uri = intent.getParcelableExtraCompat<Uri>(Intent.EXTRA_STREAM)
51- listOfNotNull(uri?.let { createUriPayload(context, it, type) })
52 }
53+ val filePayload = createUriPayload(context, stream, type)
54+ if (text.isNullOrBlank()) return listOf(filePayload)
55+ val textPayload = SharePayload().apply {
56+ value = text
57+ shareType = if (android.util.Patterns.WEB_URL.matcher(text).matches()) ShareType.Url else ShareType.Text
58+ mimeType = "text/plain"
59+ }
60+ return listOf(textPayload, filePayload)
61 }
62
63 private fun handleSendMultipleAction(context: Context, intent: Intent, type: String): List<SharePayload> {
64@@ -41,10 +47,25 @@ internal class SimpleShareIntentDataParser {
65
66 private fun createUriPayload(context: Context, uri: Uri, defaultType: String): SharePayload {
67 val specificType = context.contentResolver.getType(uri) ?: defaultType
68+ // A blank DISPLAY_NAME must stay null: consumers treat originalName as
69+ // the attachment name, and an empty name fails contract validation.
70+ val displayName = runCatching {
71+ context.contentResolver.query(
72+ uri,
73+ arrayOf(OpenableColumns.DISPLAY_NAME),
74+ null,
75+ null,
76+ null
77+ )?.use { cursor ->
78+ val column = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)
79+ if (column >= 0 && cursor.moveToFirst()) cursor.getString(column) else null
80+ }
81+ }.getOrNull()?.takeIf { it.isNotBlank() }
82 return SharePayload().apply {
83 value = uri.toString()
84- shareType = ShareType.fromMimeType(specificType)
85+ shareType = if (specificType.startsWith("text/")) ShareType.File else ShareType.fromMimeType(specificType)
86 mimeType = specificType
87+ originalName = displayName
88 }
89 }
90 }
91diff --git a/build/Sharing.types.d.ts b/build/Sharing.types.d.ts
92index e9820b061bddce91657ab7144fde98d0543a3b8e..364d63273cb3e209c6490de6dd869a01c8728fcc 100644
93--- a/build/Sharing.types.d.ts
94+++ b/build/Sharing.types.d.ts
95@@ -77,6 +77,11 @@ export type SharePayload = {
96 * @default 'text/plain'
97 */
98 mimeType?: string;
99+ /**
100+ * The display name of a shared file, when the source app provided one.
101+ * Populated on Android from the content resolver's `DISPLAY_NAME`.
102+ */
103+ originalName?: string | null;
104 };
105 export type BaseResolvedSharePayload = SharePayload & {
106 /**
107diff --git a/src/Sharing.types.ts b/src/Sharing.types.ts
108index d9a5ad38f5fe2856b365eb91b71abd640314a5cc..21ea45f04b88cce272e2e02de24c5e4eb8157e82 100644
109--- a/src/Sharing.types.ts
110+++ b/src/Sharing.types.ts
111@@ -85,6 +85,12 @@ export type SharePayload = {
112 * @default 'text/plain'
113 */
114 mimeType?: string;
115+
116+ /**
117+ * The display name of a shared file, when the source app provided one.
118+ * Populated on Android from the content resolver's `DISPLAY_NAME`.
119+ */
120+ originalName?: string | null;
121 };
122
123 export type BaseResolvedSharePayload = SharePayload & {
patches/expo-sharing@58.0.12.patch created+123
......@@ -0,0 +1,123 @@
1diff --git a/android/src/main/java/expo/modules/sharing/SharingRecords.kt b/android/src/main/java/expo/modules/sharing/SharingRecords.kt
2index 0b87b53..65f1c57 100644
3--- a/android/src/main/java/expo/modules/sharing/SharingRecords.kt
4+++ b/android/src/main/java/expo/modules/sharing/SharingRecords.kt
5@@ -52,7 +52,8 @@ enum class ContentType(val value: String) : Enumerable {
6 internal data class SharePayload(
7 @Field var value: String = "",
8 @Field var shareType: ShareType = ShareType.Text,
9- @Field var mimeType: String = "text/plain"
10+ @Field var mimeType: String = "text/plain",
11+ @Field var originalName: String? = null
12 ) : Record
13
14 @OptimizedRecord
15diff --git a/android/src/main/java/expo/modules/sharing/dataParsers/SimpleShareIntentDataParser.kt b/android/src/main/java/expo/modules/sharing/dataParsers/SimpleShareIntentDataParser.kt
16index 8dd50e8..481cdb4 100644
17--- a/android/src/main/java/expo/modules/sharing/dataParsers/SimpleShareIntentDataParser.kt
18+++ b/android/src/main/java/expo/modules/sharing/dataParsers/SimpleShareIntentDataParser.kt
19@@ -3,6 +3,7 @@ package expo.modules.sharing
20 import android.content.Context
21 import android.content.Intent
22 import android.net.Uri
23+import android.provider.OpenableColumns
24
25 internal class SimpleShareIntentDataParser {
26 companion object {
27@@ -17,21 +18,26 @@ internal class SimpleShareIntentDataParser {
28 }
29
30 private fun handleSendAction(context: Context, intent: Intent, type: String): List<SharePayload> {
31- return if (type == "text/plain") {
32- val text = intent.getStringExtra(Intent.EXTRA_TEXT) ?: return emptyList()
33- val isUrl = android.util.Patterns.WEB_URL.matcher(text).matches()
34-
35- listOf(
36+ val stream = intent.getParcelableExtraCompat<Uri>(Intent.EXTRA_STREAM)
37+ val text = intent.getStringExtra(Intent.EXTRA_TEXT)
38+ if (stream == null) {
39+ if (!type.startsWith("text/") || text == null) return emptyList()
40+ return listOf(
41 SharePayload().apply {
42 value = text
43- shareType = if (isUrl) ShareType.Url else ShareType.Text
44- mimeType = "text/plain"
45+ shareType = if (android.util.Patterns.WEB_URL.matcher(text).matches()) ShareType.Url else ShareType.Text
46+ mimeType = type
47 }
48 )
49- } else {
50- val uri = intent.getParcelableExtraCompat<Uri>(Intent.EXTRA_STREAM)
51- listOfNotNull(uri?.let { createUriPayload(context, it, type) })
52 }
53+ val filePayload = createUriPayload(context, stream, type)
54+ if (text.isNullOrBlank()) return listOf(filePayload)
55+ val textPayload = SharePayload().apply {
56+ value = text
57+ shareType = if (android.util.Patterns.WEB_URL.matcher(text).matches()) ShareType.Url else ShareType.Text
58+ mimeType = "text/plain"
59+ }
60+ return listOf(textPayload, filePayload)
61 }
62
63 private fun handleSendMultipleAction(context: Context, intent: Intent, type: String): List<SharePayload> {
64@@ -41,10 +47,25 @@ internal class SimpleShareIntentDataParser {
65
66 private fun createUriPayload(context: Context, uri: Uri, defaultType: String): SharePayload {
67 val specificType = context.contentResolver.getType(uri) ?: defaultType
68+ // A blank DISPLAY_NAME must stay null: consumers treat originalName as
69+ // the attachment name, and an empty name fails contract validation.
70+ val displayName = runCatching {
71+ context.contentResolver.query(
72+ uri,
73+ arrayOf(OpenableColumns.DISPLAY_NAME),
74+ null,
75+ null,
76+ null
77+ )?.use { cursor ->
78+ val column = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)
79+ if (column >= 0 && cursor.moveToFirst()) cursor.getString(column) else null
80+ }
81+ }.getOrNull()?.takeIf { it.isNotBlank() }
82 return SharePayload().apply {
83 value = uri.toString()
84- shareType = ShareType.fromMimeType(specificType)
85+ shareType = if (specificType.startsWith("text/")) ShareType.File else ShareType.fromMimeType(specificType)
86 mimeType = specificType
87+ originalName = displayName
88 }
89 }
90 }
91diff --git a/build/Sharing.types.d.ts b/build/Sharing.types.d.ts
92index 74544e0..92bd2f5 100644
93--- a/build/Sharing.types.d.ts
94+++ b/build/Sharing.types.d.ts
95@@ -100,6 +100,11 @@ export type SharePayload = {
96 * @default 'text/plain'
97 */
98 mimeType?: string;
99+ /**
100+ * The display name of a shared file, when the source app provided one.
101+ * Populated on Android from the content resolver's `DISPLAY_NAME`.
102+ */
103+ originalName?: string | null;
104 };
105 export type BaseResolvedSharePayload = SharePayload & {
106 /**
107diff --git a/src/Sharing.types.ts b/src/Sharing.types.ts
108index 18af320..3a52b70 100644
109--- a/src/Sharing.types.ts
110+++ b/src/Sharing.types.ts
111@@ -108,6 +108,12 @@ export type SharePayload = {
112 * @default 'text/plain'
113 */
114 mimeType?: string;
115+
116+ /**
117+ * The display name of a shared file, when the source app provided one.
118+ * Populated on Android from the content resolver's `DISPLAY_NAME`.
119+ */
120+ originalName?: string | null;
121 };
122
123 export type BaseResolvedSharePayload = SharePayload & {
patches/expo-widgets@57.0.15.patch deleted-148
......@@ -1,148 +0,0 @@
1diff --git a/build/Widgets.types.d.ts b/build/Widgets.types.d.ts
2index 15e026868625ce20a3e359e5cc8e5c7e937c4650..f5cc83174ede4fb6e01cbce494f61e088eb4eed8 100644
3--- a/build/Widgets.types.d.ts
4+++ b/build/Widgets.types.d.ts
5@@ -90,6 +90,10 @@ export type LiveActivityEnvironment = {
6 * The color scheme of the activity's environment.
7 */
8 colorScheme: 'light' | 'dark';
9+ /** The rendering mode supplied by WidgetKit for this presentation. */
10+ widgetRenderingMode?: WidgetRenderingMode;
11+ /** Whether the presentation OS supports Liquid Glass. @platform iOS 26+ */
12+ isLiquidGlassAvailable?: boolean;
13 /**
14 * Whether the activity is displayed in a context with reduced luminance.
15 * @platform iOS 16+
16diff --git a/ios/Widgets/Utils.swift b/ios/Widgets/Utils.swift
17index 2b4c044b597de7e0fab42dbc47af14d8bb521838..801f0aed65ea2659f221d477dd841787d9146c26 100644
18--- a/ios/Widgets/Utils.swift
19+++ b/ios/Widgets/Utils.swift
20@@ -91,6 +91,10 @@ func getLiveActivityEnvironment(for environment: EnvironmentValues, in context:
21 "colorScheme": "\(environment.colorScheme)"
22 ]
23
24+ if #available(iOS 26.0, *) {
25+ env["isLiquidGlassAvailable"] = true
26+ }
27+ env["widgetRenderingMode"] = environment.widgetRenderingMode.description
28 env["isLuminanceReduced"] = environment.isLuminanceReduced
29 env["isActivityFullscreen"] = environment.isActivityFullscreen
30 if #available(iOS 16.2, *) {
31diff --git a/ios/Widgets/WidgetLiveActivity.swift b/ios/Widgets/WidgetLiveActivity.swift
32index 24d4571a52d3ebe9d785b5d049d8e134a149d513..7051c23b17ac91552e5b5c54606c57086c0ebbea 100644
33--- a/ios/Widgets/WidgetLiveActivity.swift
34+++ b/ios/Widgets/WidgetLiveActivity.swift
35@@ -20,53 +20,41 @@ struct LiveActivityAttributes: ActivityAttributes {
36
37 @available(iOS 16.1, *)
38 public struct WidgetLiveActivity: Widget {
39- @Environment(\.self) var env
40-
41 let widgetContext: AppContext = AppContext()
42
43 public init() {}
44
45 public var body: some WidgetConfiguration {
46 ActivityConfiguration(for: LiveActivityAttributes.self) { context in
47- let nodes = getLiveActivityNodes(
48- forName: context.state.name,
49- props: context.state.props,
50- environment: getLiveActivityEnvironment(for: env, in: context)
51- )
52 // Only apply widgetURL when the activity has one: a hierarchy with more than one
53 // widgetURL modifier is undefined behavior, and layouts can set their own through
54 // the widgetURL modifier from @expo/ui.
55- let banner = LiveActivityBannerView(context: context, nodes: nodes)
56+ let banner = LiveActivityBannerView(context: context)
57 if let url = context.attributes.url.flatMap(URL.init(string:)) {
58 banner.widgetURL(url)
59 } else {
60 banner
61 }
62 } dynamicIsland: { context in
63- let nodes = getLiveActivityNodes(
64- forName: context.state.name,
65- props: context.state.props,
66- environment: getLiveActivityEnvironment(for: env, in: context)
67- )
68 let island = DynamicIsland {
69 DynamicIslandExpandedRegion(.center) {
70- LiveActivitySectionView(context: context, nodes: nodes, sectionName: "expandedCenter")
71+ LiveActivitySectionView(context: context, sectionName: "expandedCenter")
72 }
73 DynamicIslandExpandedRegion(.leading) {
74- LiveActivitySectionView(context: context, nodes: nodes, sectionName: "expandedLeading")
75+ LiveActivitySectionView(context: context, sectionName: "expandedLeading")
76 }
77 DynamicIslandExpandedRegion(.trailing) {
78- LiveActivitySectionView(context: context, nodes: nodes, sectionName: "expandedTrailing")
79+ LiveActivitySectionView(context: context, sectionName: "expandedTrailing")
80 }
81 DynamicIslandExpandedRegion(.bottom) {
82- LiveActivitySectionView(context: context, nodes: nodes, sectionName: "expandedBottom")
83+ LiveActivitySectionView(context: context, sectionName: "expandedBottom")
84 }
85 } compactLeading: {
86- LiveActivitySectionView(context: context, nodes: nodes, sectionName: "compactLeading")
87+ LiveActivitySectionView(context: context, sectionName: "compactLeading")
88 } compactTrailing: {
89- LiveActivitySectionView(context: context, nodes: nodes, sectionName: "compactTrailing")
90+ LiveActivitySectionView(context: context, sectionName: "compactTrailing")
91 } minimal: {
92- LiveActivitySectionView(context: context, nodes: nodes, sectionName: "minimal")
93+ LiveActivitySectionView(context: context, sectionName: "minimal")
94 }
95 if let url = context.attributes.url.flatMap(URL.init(string:)) {
96 return island.widgetURL(url)
97@@ -79,11 +67,16 @@ public struct WidgetLiveActivity: Widget {
98
99 @available(iOS 16.1, *)
100 private struct LiveActivitySectionView: View {
101+ @Environment(\.self) var env
102 let context: ActivityViewContext<LiveActivityAttributes>
103- let nodes: [String: Any]
104 let sectionName: String
105
106 var body: some View {
107+ let nodes = getLiveActivityNodes(
108+ forName: context.state.name,
109+ props: context.state.props,
110+ environment: getLiveActivityEnvironment(for: env, in: context)
111+ )
112 if let node = nodes[sectionName] as? [String: Any] {
113 WidgetsDynamicView(name: context.activityID, kind: .liveActivity, node: node)
114 } else {
115@@ -94,10 +87,17 @@ private struct LiveActivitySectionView: View {
116
117 @available(iOS 16.1, *)
118 private struct LiveActivityBannerView: View {
119+ // Read inside the rendered view: Widget-level values do not include the
120+ // presentation's color scheme, rendering mode, or reduced-luminance state.
121+ @Environment(\.self) var env
122 var context: ActivityViewContext<LiveActivityAttributes>
123- let nodes: [String: Any]
124
125 var body: some View {
126+ let nodes = getLiveActivityNodes(
127+ forName: context.state.name,
128+ props: context.state.props,
129+ environment: getLiveActivityEnvironment(for: env, in: context)
130+ )
131 if #available(iOS 18.0, *) {
132 LiveActivityBanner(context: context, nodes: nodes)
133 } else if let node = nodes["banner"] as? [String: Any] {
134diff --git a/src/Widgets.types.ts b/src/Widgets.types.ts
135index fee5c7475b52218fa0e192a1d347dd32cb0fe1f8..1d3a097b45d8eb5d13e5cedd26f0414caa83a5d6 100644
136--- a/src/Widgets.types.ts
137+++ b/src/Widgets.types.ts
138@@ -104,6 +104,10 @@ export type LiveActivityEnvironment = {
139 * The color scheme of the activity's environment.
140 */
141 colorScheme: 'light' | 'dark';
142+ /** The rendering mode supplied by WidgetKit for this presentation. */
143+ widgetRenderingMode?: WidgetRenderingMode;
144+ /** Whether the presentation OS supports Liquid Glass. @platform iOS 26+ */
145+ isLiquidGlassAvailable?: boolean;
146 /**
147 * Whether the activity is displayed in a context with reduced luminance.
148 * @platform iOS 16+
patches/expo-widgets@58.0.9.patch created+162
......@@ -0,0 +1,162 @@
1diff --git a/build/Widgets.types.d.ts b/build/Widgets.types.d.ts
2index c9f4dfe..dc0792e 100644
3--- a/build/Widgets.types.d.ts
4+++ b/build/Widgets.types.d.ts
5@@ -93,6 +93,10 @@ export type LiveActivityEnvironment = {
6 * The color scheme of the activity's environment.
7 */
8 colorScheme: 'light' | 'dark';
9+ /** The rendering mode supplied by WidgetKit for this presentation. */
10+ widgetRenderingMode?: WidgetRenderingMode;
11+ /** Whether the presentation OS supports Liquid Glass. @platform iOS 26+ */
12+ isLiquidGlassAvailable?: boolean;
13 /**
14 * Whether the activity is displayed in a context with reduced luminance.
15 * @platform iOS 16+
16diff --git a/ios/Widgets/Utils.swift b/ios/Widgets/Utils.swift
17index 76b2199..6cb52c3 100644
18--- a/ios/Widgets/Utils.swift
19+++ b/ios/Widgets/Utils.swift
20@@ -125,6 +125,10 @@ func getLiveActivityEnvironment(for environment: EnvironmentValues, in context:
21 "isStale": context.isStale
22 ]
23
24+ if #available(iOS 26.0, *) {
25+ env["isLiquidGlassAvailable"] = true
26+ }
27+ env["widgetRenderingMode"] = environment.widgetRenderingMode.description
28 if #available(iOS 18.0, *) {
29 env["isActivityUpdateReduced"] = environment.isActivityUpdateReduced
30 env["activityFamily"] = "\(environment.activityFamily)"
31diff --git a/ios/Widgets/WidgetLiveActivity.swift b/ios/Widgets/WidgetLiveActivity.swift
32index 4d135c4..dae4744 100644
33--- a/ios/Widgets/WidgetLiveActivity.swift
34+++ b/ios/Widgets/WidgetLiveActivity.swift
35@@ -19,53 +19,41 @@ struct LiveActivityAttributes: ActivityAttributes {
36 }
37
38 public struct WidgetLiveActivity: Widget {
39- @Environment(\.self) var env
40-
41 let widgetContext: AppContext = AppContext()
42
43 public init() {}
44
45 public var body: some WidgetConfiguration {
46 ActivityConfiguration(for: LiveActivityAttributes.self) { context in
47- let nodes = getLiveActivityNodes(
48- forName: context.state.name,
49- props: context.state.props,
50- environment: getLiveActivityEnvironment(for: env, in: context)
51- )
52 // Only apply widgetURL when the activity has one: a hierarchy with more than one
53 // widgetURL modifier is undefined behavior, and layouts can set their own through
54 // the widgetURL modifier from @expo/ui.
55- let banner = LiveActivityBannerView(context: context, nodes: nodes)
56+ let banner = LiveActivityBannerView(context: context)
57 if let url = context.attributes.url.flatMap(URL.init(string:)) {
58 banner.widgetURL(url)
59 } else {
60 banner
61 }
62 } dynamicIsland: { context in
63- let nodes = getLiveActivityNodes(
64- forName: context.state.name,
65- props: context.state.props,
66- environment: getLiveActivityEnvironment(for: env, in: context)
67- )
68 let island = DynamicIsland {
69 DynamicIslandExpandedRegion(.center) {
70- LiveActivitySectionView(context: context, nodes: nodes, sectionName: "expandedCenter")
71+ LiveActivitySectionView(context: context, sectionName: "expandedCenter")
72 }
73 DynamicIslandExpandedRegion(.leading) {
74- LiveActivitySectionView(context: context, nodes: nodes, sectionName: "expandedLeading")
75+ LiveActivitySectionView(context: context, sectionName: "expandedLeading")
76 }
77 DynamicIslandExpandedRegion(.trailing) {
78- LiveActivitySectionView(context: context, nodes: nodes, sectionName: "expandedTrailing")
79+ LiveActivitySectionView(context: context, sectionName: "expandedTrailing")
80 }
81 DynamicIslandExpandedRegion(.bottom) {
82- LiveActivitySectionView(context: context, nodes: nodes, sectionName: "expandedBottom")
83+ LiveActivitySectionView(context: context, sectionName: "expandedBottom")
84 }
85 } compactLeading: {
86- LiveActivitySectionView(context: context, nodes: nodes, sectionName: "compactLeading")
87+ LiveActivitySectionView(context: context, sectionName: "compactLeading")
88 } compactTrailing: {
89- LiveActivitySectionView(context: context, nodes: nodes, sectionName: "compactTrailing")
90+ LiveActivitySectionView(context: context, sectionName: "compactTrailing")
91 } minimal: {
92- LiveActivitySectionView(context: context, nodes: nodes, sectionName: "minimal")
93+ LiveActivitySectionView(context: context, sectionName: "minimal")
94 }
95 if let url = context.attributes.url.flatMap(URL.init(string:)) {
96 return island.widgetURL(url)
97@@ -77,11 +65,16 @@ public struct WidgetLiveActivity: Widget {
98 }
99
100 private struct LiveActivitySectionView: View {
101+ @Environment(\.self) var env
102 let context: ActivityViewContext<LiveActivityAttributes>
103- let nodes: [String: Any]
104 let sectionName: String
105
106 var body: some View {
107+ let nodes = getLiveActivityNodes(
108+ forName: context.state.name,
109+ props: context.state.props,
110+ environment: getLiveActivityEnvironment(for: env, in: context)
111+ )
112 if let node = nodes[sectionName] as? [String: Any] {
113 WidgetsDynamicView(name: context.activityID, kind: .liveActivity, node: node)
114 } else {
115@@ -91,10 +84,17 @@ private struct LiveActivitySectionView: View {
116 }
117
118 private struct LiveActivityBannerView: View {
119+ // Read inside the rendered view: Widget-level values do not include the
120+ // presentation's color scheme, rendering mode, or reduced-luminance state.
121+ @Environment(\.self) var env
122 var context: ActivityViewContext<LiveActivityAttributes>
123- let nodes: [String: Any]
124
125 var body: some View {
126+ let nodes = getLiveActivityNodes(
127+ forName: context.state.name,
128+ props: context.state.props,
129+ environment: getLiveActivityEnvironment(for: env, in: context)
130+ )
131 if #available(iOS 18.0, *) {
132 LiveActivityBanner(context: context, nodes: nodes)
133 } else if let node = nodes["banner"] as? [String: Any] {
134diff --git a/scripts/build-layout-registry.mjs b/scripts/build-layout-registry.mjs
135index d52a60e..fa9bd77 100644
136--- a/scripts/build-layout-registry.mjs
137+++ b/scripts/build-layout-registry.mjs
138@@ -154,6 +154,8 @@ function createLayoutRegistry(expectedWidgets, capturedLayouts) {
139 return registry;
140 }
141
142-if (process.argv[1] && path.resolve(process.argv[1]) === __filename) {
143+// Compare real paths: pnpm exposes the package through a symlink, so the
144+// invoked path and import.meta.url differ while naming the same file.
145+if (process.argv[1] && fs.realpathSync(path.resolve(process.argv[1])) === fs.realpathSync(__filename)) {
146 await main();
147 }
148diff --git a/src/Widgets.types.ts b/src/Widgets.types.ts
149index 0770613..924fa00 100644
150--- a/src/Widgets.types.ts
151+++ b/src/Widgets.types.ts
152@@ -107,6 +107,10 @@ export type LiveActivityEnvironment = {
153 * The color scheme of the activity's environment.
154 */
155 colorScheme: 'light' | 'dark';
156+ /** The rendering mode supplied by WidgetKit for this presentation. */
157+ widgetRenderingMode?: WidgetRenderingMode;
158+ /** Whether the presentation OS supports Liquid Glass. @platform iOS 26+ */
159+ isLiquidGlassAvailable?: boolean;
160 /**
161 * Whether the activity is displayed in a context with reduced luminance.
162 * @platform iOS 16+
patches/react-native-gesture-handler@2.32.0.patch deleted-237
......@@ -1,237 +0,0 @@
1diff --git a/apple/Handlers/RNHoverHandler.m b/apple/Handlers/RNHoverHandler.m
2index 320cb8cb2652bfcfe1ecc65ebd81a8d208e4260f..a88ac5f04a9663fd7a62ee89e42d85ec41dcaf55 100644
3--- a/apple/Handlers/RNHoverHandler.m
4+++ b/apple/Handlers/RNHoverHandler.m
5@@ -132,8 +132,10 @@ - (void)unbindFromView
6 {
7 #if CHECK_TARGET(13_4)
8 if (@available(iOS 13.4, *)) {
9+ // The superclass detaches the recognizer, clearing recognizer.view. Remove
10+ // the interaction from its own view before it can be recycled by Fabric.
11+ [_pointerInteraction.view removeInteraction:_pointerInteraction];
12 [super unbindFromView];
13- [self.recognizer.view removeInteraction:_pointerInteraction];
14 }
15 #endif
16 }
17diff --git a/lib/commonjs/components/ReanimatedSwipeable/ReanimatedSwipeable.js b/lib/commonjs/components/ReanimatedSwipeable/ReanimatedSwipeable.js
18index 551ab92bf58db0b79d428dcd2f2df898ef686493..13db26d88bff975bc5d46bb6432cbf9fda3d489a 100644
19--- a/lib/commonjs/components/ReanimatedSwipeable/ReanimatedSwipeable.js
20+++ b/lib/commonjs/components/ReanimatedSwipeable/ReanimatedSwipeable.js
21@@ -34,11 +34,13 @@ const Swipeable = props => {
22 enableTrackpadTwoFingerGesture = DEFAULT_ENABLE_TRACKING_TWO_FINGER_GESTURE,
23 dragOffsetFromLeftEdge = DEFAULT_DRAG_OFFSET,
24 dragOffsetFromRightEdge = DEFAULT_DRAG_OFFSET,
25+ failOffsetY,
26 friction = DEFAULT_FRICTION,
27 overshootFriction = DEFAULT_OVERSHOOT_FRICTION,
28 onSwipeableOpenStartDrag,
29 onSwipeableCloseStartDrag,
30 onSwipeableWillOpen,
31+ onSwipeableRelease,
32 onSwipeableWillClose,
33 onSwipeableOpen,
34 onSwipeableClose,
35@@ -248,8 +250,13 @@ const Swipeable = props => {
36 toValue = -rightWidth.value;
37 }
38 }
39+ // Let a UI-thread full-swipe commit take over before the return spring.
40+ if (onSwipeableRelease?.(appliedTranslation)) {
41+ return;
42+ }
43+
44 animateRow(toValue, velocityX / friction);
45- }, [animateRow, friction, leftThreshold, leftWidth, rightThreshold, rightWidth, rowState, userDrag]);
46+ }, [animateRow, friction, leftThreshold, leftWidth, rightThreshold, rightWidth, rowState, userDrag, onSwipeableRelease, appliedTranslation]);
47 const close = (0, _react.useCallback)(() => {
48 'worklet';
49
50@@ -285,11 +292,14 @@ const Swipeable = props => {
51 }).onFinalize(() => {
52 dragStarted.value = false;
53 });
54+ if (failOffsetY !== undefined) {
55+ pan.failOffsetY(failOffsetY);
56+ }
57 Object.entries(relationProps).forEach(([relationName, relation]) => {
58 (0, _utils.applyRelationProp)(pan, relationName, relation);
59 });
60 return pan;
61- }, [enabled, hitSlop, enableTrackpadTwoFingerGesture, dragOffsetFromRightEdge, dragOffsetFromLeftEdge, updateElementWidths, relationProps, userDrag, rowState, dragStarted, updateAnimatedEvent, onSwipeableOpenStartDrag, onSwipeableCloseStartDrag, handleRelease]);
62+ }, [enabled, hitSlop, enableTrackpadTwoFingerGesture, dragOffsetFromRightEdge, dragOffsetFromLeftEdge, failOffsetY, updateElementWidths, relationProps, userDrag, rowState, dragStarted, updateAnimatedEvent, onSwipeableOpenStartDrag, onSwipeableCloseStartDrag, handleRelease]);
63 (0, _react.useImperativeHandle)(ref, () => swipeableMethods, [swipeableMethods]);
64 const animatedStyle = (0, _reactNativeReanimated.useAnimatedStyle)(() => ({
65 transform: [{
66diff --git a/lib/module/components/ReanimatedSwipeable/ReanimatedSwipeable.js b/lib/module/components/ReanimatedSwipeable/ReanimatedSwipeable.js
67index a2835d5416ffd5cf9a04e98774516b9e6569691e..055afce410d6eb655532e7a09371dfc22eae5e9c 100644
68--- a/lib/module/components/ReanimatedSwipeable/ReanimatedSwipeable.js
69+++ b/lib/module/components/ReanimatedSwipeable/ReanimatedSwipeable.js
70@@ -29,11 +29,13 @@ const Swipeable = props => {
71 enableTrackpadTwoFingerGesture = DEFAULT_ENABLE_TRACKING_TWO_FINGER_GESTURE,
72 dragOffsetFromLeftEdge = DEFAULT_DRAG_OFFSET,
73 dragOffsetFromRightEdge = DEFAULT_DRAG_OFFSET,
74+ failOffsetY,
75 friction = DEFAULT_FRICTION,
76 overshootFriction = DEFAULT_OVERSHOOT_FRICTION,
77 onSwipeableOpenStartDrag,
78 onSwipeableCloseStartDrag,
79 onSwipeableWillOpen,
80+ onSwipeableRelease,
81 onSwipeableWillClose,
82 onSwipeableOpen,
83 onSwipeableClose,
84@@ -243,8 +245,13 @@ const Swipeable = props => {
85 toValue = -rightWidth.value;
86 }
87 }
88+ // Let a UI-thread full-swipe commit take over before the return spring.
89+ if (onSwipeableRelease?.(appliedTranslation)) {
90+ return;
91+ }
92+
93 animateRow(toValue, velocityX / friction);
94- }, [animateRow, friction, leftThreshold, leftWidth, rightThreshold, rightWidth, rowState, userDrag]);
95+ }, [animateRow, friction, leftThreshold, leftWidth, rightThreshold, rightWidth, rowState, userDrag, onSwipeableRelease, appliedTranslation]);
96 const close = useCallback(() => {
97 'worklet';
98
99@@ -280,11 +287,14 @@ const Swipeable = props => {
100 }).onFinalize(() => {
101 dragStarted.value = false;
102 });
103+ if (failOffsetY !== undefined) {
104+ pan.failOffsetY(failOffsetY);
105+ }
106 Object.entries(relationProps).forEach(([relationName, relation]) => {
107 applyRelationProp(pan, relationName, relation);
108 });
109 return pan;
110- }, [enabled, hitSlop, enableTrackpadTwoFingerGesture, dragOffsetFromRightEdge, dragOffsetFromLeftEdge, updateElementWidths, relationProps, userDrag, rowState, dragStarted, updateAnimatedEvent, onSwipeableOpenStartDrag, onSwipeableCloseStartDrag, handleRelease]);
111+ }, [enabled, hitSlop, enableTrackpadTwoFingerGesture, dragOffsetFromRightEdge, dragOffsetFromLeftEdge, failOffsetY, updateElementWidths, relationProps, userDrag, rowState, dragStarted, updateAnimatedEvent, onSwipeableOpenStartDrag, onSwipeableCloseStartDrag, handleRelease]);
112 useImperativeHandle(ref, () => swipeableMethods, [swipeableMethods]);
113 const animatedStyle = useAnimatedStyle(() => ({
114 transform: [{
115diff --git a/lib/typescript/components/ReanimatedSwipeable/ReanimatedSwipeableProps.d.ts b/lib/typescript/components/ReanimatedSwipeable/ReanimatedSwipeableProps.d.ts
116index ac8b76830d468edfbc29052b452a36221323c3de..cac72ebaafaf746af7640783a16e99c93ecad2a4 100644
117--- a/lib/typescript/components/ReanimatedSwipeable/ReanimatedSwipeableProps.d.ts
118+++ b/lib/typescript/components/ReanimatedSwipeable/ReanimatedSwipeableProps.d.ts
119@@ -64,6 +64,13 @@ export interface SwipeableProps {
120 * a swipe. The default value is 10.
121 */
122 dragOffsetFromRightEdge?: number;
123+ /**
124+ * Range along the Y axis (in points) that, once exceeded before the swipe
125+ * activates, makes the pan fail. Lets vertically-dominant pans (list
126+ * scrolling, especially trackpad two-finger pans) skip the swipe entirely.
127+ * Passed straight to the underlying Pan gesture's `failOffsetY`.
128+ */
129+ failOffsetY?: number | [start: number, end: number];
130 /**
131 * Value indicating if the swipeable panel can be pulled further than the left
132 * actions panel's width. It is set to true by default as long as the left
133@@ -90,6 +97,13 @@ export interface SwipeableProps {
134 * Called when action panel is closed.
135 */
136 onSwipeableClose?: (direction: SwipeDirection.LEFT | SwipeDirection.RIGHT) => void;
137+ /**
138+ * UI-thread worklet called on release before the built-in spring starts.
139+ * Return true to consume the release and take ownership of translation.
140+ * The caller must reset or remove the row after its custom animation.
141+ */
142+ onSwipeableRelease?: (translation: SharedValue<number>) => boolean;
143+
144 /**
145 * Called when action panel starts animating on open (either right or left).
146 */
147diff --git a/src/components/ReanimatedSwipeable/ReanimatedSwipeable.tsx b/src/components/ReanimatedSwipeable/ReanimatedSwipeable.tsx
148index b6134c908624adc590ebd264e90e558b88e235d5..fa4b1c1749bd0e86cbf5f5546f295d8099e1a481 100644
149--- a/src/components/ReanimatedSwipeable/ReanimatedSwipeable.tsx
150+++ b/src/components/ReanimatedSwipeable/ReanimatedSwipeable.tsx
151@@ -58,11 +58,13 @@ const Swipeable = (props: SwipeableProps) => {
152 enableTrackpadTwoFingerGesture = DEFAULT_ENABLE_TRACKING_TWO_FINGER_GESTURE,
153 dragOffsetFromLeftEdge = DEFAULT_DRAG_OFFSET,
154 dragOffsetFromRightEdge = DEFAULT_DRAG_OFFSET,
155+ failOffsetY,
156 friction = DEFAULT_FRICTION,
157 overshootFriction = DEFAULT_OVERSHOOT_FRICTION,
158 onSwipeableOpenStartDrag,
159 onSwipeableCloseStartDrag,
160 onSwipeableWillOpen,
161+ onSwipeableRelease,
162 onSwipeableWillClose,
163 onSwipeableOpen,
164 onSwipeableClose,
165@@ -457,6 +459,11 @@ const Swipeable = (props: SwipeableProps) => {
166 }
167 }
168
169+ // Let a UI-thread full-swipe commit take over before the return spring.
170+ if (onSwipeableRelease?.(appliedTranslation)) {
171+ return;
172+ }
173+
174 animateRow(toValue, velocityX / friction);
175 },
176 [
177@@ -468,6 +475,8 @@ const Swipeable = (props: SwipeableProps) => {
178 rightWidth,
179 rowState,
180 userDrag,
181+ onSwipeableRelease,
182+ appliedTranslation,
183 ]
184 );
185
186@@ -537,6 +546,10 @@ const Swipeable = (props: SwipeableProps) => {
187 dragStarted.value = false;
188 });
189
190+ if (failOffsetY !== undefined) {
191+ pan.failOffsetY(failOffsetY);
192+ }
193+
194 Object.entries(relationProps).forEach(([relationName, relation]) => {
195 applyRelationProp(
196 pan,
197@@ -552,6 +565,7 @@ const Swipeable = (props: SwipeableProps) => {
198 enableTrackpadTwoFingerGesture,
199 dragOffsetFromRightEdge,
200 dragOffsetFromLeftEdge,
201+ failOffsetY,
202 updateElementWidths,
203 relationProps,
204 userDrag,
205diff --git a/src/components/ReanimatedSwipeable/ReanimatedSwipeableProps.ts b/src/components/ReanimatedSwipeable/ReanimatedSwipeableProps.ts
206index 0c0e517e0d340faf50ff78c3d48e7a2bbcf808ec..3ab14d240da346b1927792e480f5b1e902b03bf8 100644
207--- a/src/components/ReanimatedSwipeable/ReanimatedSwipeableProps.ts
208+++ b/src/components/ReanimatedSwipeable/ReanimatedSwipeableProps.ts
209@@ -77,6 +77,14 @@ export interface SwipeableProps {
210 */
211 dragOffsetFromRightEdge?: number;
212
213+ /**
214+ * Range along the Y axis (in points) that, once exceeded before the swipe
215+ * activates, makes the pan fail. Lets vertically-dominant pans (list
216+ * scrolling, especially trackpad two-finger pans) skip the swipe entirely.
217+ * Passed straight to the underlying Pan gesture's `failOffsetY`.
218+ */
219+ failOffsetY?: number | [start: number, end: number];
220+
221 /**
222 * Value indicating if the swipeable panel can be pulled further than the left
223 * actions panel's width. It is set to true by default as long as the left
224@@ -112,6 +120,13 @@ export interface SwipeableProps {
225 direction: SwipeDirection.LEFT | SwipeDirection.RIGHT
226 ) => void;
227
228+ /**
229+ * UI-thread worklet called on release before the built-in spring starts.
230+ * Return true to consume the release and take ownership of translation.
231+ * The caller must reset or remove the row after its custom animation.
232+ */
233+ onSwipeableRelease?: (translation: SharedValue<number>) => boolean;
234+
235 /**
236 * Called when action panel starts animating on open (either right or left).
237 */
patches/react-native-gesture-handler@3.2.1.patch created+151
......@@ -0,0 +1,151 @@
1diff --git a/lib/module/components/ReanimatedSwipeable/ReanimatedSwipeable.js b/lib/module/components/ReanimatedSwipeable/ReanimatedSwipeable.js
2index 4ab38424d1f5fc8b2686dd4a0a8058c454a9874d..0c5e0eaa995af50e5f8c02909dc6825121cc61af 100644
3--- a/lib/module/components/ReanimatedSwipeable/ReanimatedSwipeable.js
4+++ b/lib/module/components/ReanimatedSwipeable/ReanimatedSwipeable.js
5@@ -31,11 +31,13 @@ const Swipeable = props => {
6 enableTrackpadTwoFingerGesture = DEFAULT_ENABLE_TRACKING_TWO_FINGER_GESTURE,
7 dragOffsetFromLeft = DEFAULT_DRAG_OFFSET,
8 dragOffsetFromRight = -DEFAULT_DRAG_OFFSET,
9+ failOffsetY,
10 friction = DEFAULT_FRICTION,
11 overshootFriction = DEFAULT_OVERSHOOT_FRICTION,
12 onSwipeableOpenStartDrag,
13 onSwipeableCloseStartDrag,
14 onSwipeableWillOpen,
15+ onSwipeableRelease,
16 onSwipeableWillClose,
17 onSwipeableOpen,
18 onSwipeableClose,
19@@ -276,8 +278,12 @@ const Swipeable = props => {
20 toValue = -rightWidth.value;
21 }
22 }
23+ // Let a UI-thread full-swipe commit take over before the return spring.
24+ if (onSwipeableRelease?.(appliedTranslation)) {
25+ return;
26+ }
27 animateRow(toValue, velocityX / friction);
28- }, [animateRow, friction, leftThreshold, leftWidth, rightThreshold, rightWidth, rowState, userDrag]);
29+ }, [animateRow, friction, leftThreshold, leftWidth, rightThreshold, rightWidth, rowState, userDrag, onSwipeableRelease, appliedTranslation]);
30 const close = useCallback(() => {
31 'worklet';
32
33@@ -302,6 +308,7 @@ const Swipeable = props => {
34 enabled: enabled ?? true,
35 enableTrackpadTwoFingerGesture: enableTrackpadTwoFingerGesture,
36 activeOffsetX: [dragOffsetFromRight, dragOffsetFromLeft],
37+ failOffsetY,
38 simultaneousWith,
39 requireToFail,
40 block,
41diff --git a/lib/typescript/components/ReanimatedSwipeable/ReanimatedSwipeableProps.d.ts b/lib/typescript/components/ReanimatedSwipeable/ReanimatedSwipeableProps.d.ts
42index e97b6dbbced1bcbd359cf35293b7f10cbf13b0e7..de07f26423bee66ecd7d0f9bb33233bcb3215751 100644
43--- a/lib/typescript/components/ReanimatedSwipeable/ReanimatedSwipeableProps.d.ts
44+++ b/lib/typescript/components/ReanimatedSwipeable/ReanimatedSwipeableProps.d.ts
45@@ -59,6 +59,12 @@ export type SwipeableProps = {
46 * Called when action panel is closed.
47 */
48 onSwipeableClose?: (direction: SwipeDirection.LEFT | SwipeDirection.RIGHT) => void;
49+ /**
50+ * UI-thread worklet called on release before the built-in spring starts.
51+ * Return true to consume the release and take ownership of translation.
52+ * The caller must reset or remove the row after its custom animation.
53+ */
54+ onSwipeableRelease?: (translation: SharedValue<number>) => boolean;
55 /**
56 * Called when action panel starts animating on open (either right or left).
57 */
58@@ -150,6 +156,13 @@ export type SwipeableProps = {
59 * The horizontal offset from the starting point required to trigger a left-swipe gesture. Defaults to -10.
60 */
61 dragOffsetFromRight?: number;
62+ /**
63+ * Range along the Y axis (in points) that, once exceeded before the swipe
64+ * activates, makes the pan fail. Lets vertically-dominant pans (list
65+ * scrolling, especially trackpad two-finger pans) skip the swipe entirely.
66+ * Passed straight to the underlying Pan gesture's `failOffsetY`.
67+ */
68+ failOffsetY?: number | [start: number, end: number];
69 }>;
70 export interface SwipeableMethods {
71 close: () => void;
72diff --git a/src/components/ReanimatedSwipeable/ReanimatedSwipeable.tsx b/src/components/ReanimatedSwipeable/ReanimatedSwipeable.tsx
73index 4881db1dc7575adc6610569035a8990cee414f3e..8431b738a9ffd09df48e1106b2bd5b62251d536c 100644
74--- a/src/components/ReanimatedSwipeable/ReanimatedSwipeable.tsx
75+++ b/src/components/ReanimatedSwipeable/ReanimatedSwipeable.tsx
76@@ -61,11 +61,13 @@ const Swipeable = (props: SwipeableProps) => {
77 enableTrackpadTwoFingerGesture = DEFAULT_ENABLE_TRACKING_TWO_FINGER_GESTURE,
78 dragOffsetFromLeft = DEFAULT_DRAG_OFFSET,
79 dragOffsetFromRight = -DEFAULT_DRAG_OFFSET,
80+ failOffsetY,
81 friction = DEFAULT_FRICTION,
82 overshootFriction = DEFAULT_OVERSHOOT_FRICTION,
83 onSwipeableOpenStartDrag,
84 onSwipeableCloseStartDrag,
85 onSwipeableWillOpen,
86+ onSwipeableRelease,
87 onSwipeableWillClose,
88 onSwipeableOpen,
89 onSwipeableClose,
90@@ -491,6 +493,11 @@ const Swipeable = (props: SwipeableProps) => {
91 }
92 }
93
94+ // Let a UI-thread full-swipe commit take over before the return spring.
95+ if (onSwipeableRelease?.(appliedTranslation)) {
96+ return;
97+ }
98+
99 animateRow(toValue, velocityX / friction);
100 },
101 [
102@@ -502,6 +509,8 @@ const Swipeable = (props: SwipeableProps) => {
103 rightWidth,
104 rowState,
105 userDrag,
106+ onSwipeableRelease,
107+ appliedTranslation,
108 ]
109 );
110
111@@ -530,6 +539,7 @@ const Swipeable = (props: SwipeableProps) => {
112 enabled: enabled ?? true,
113 enableTrackpadTwoFingerGesture: enableTrackpadTwoFingerGesture,
114 activeOffsetX: [dragOffsetFromRight, dragOffsetFromLeft],
115+ failOffsetY,
116 simultaneousWith,
117 requireToFail,
118 block,
119diff --git a/src/components/ReanimatedSwipeable/ReanimatedSwipeableProps.ts b/src/components/ReanimatedSwipeable/ReanimatedSwipeableProps.ts
120index 1e1246f709feb04c01cf3221472cc1219a8fffac..f526d4fe2d2738becbe8d29c59d1105afa11ae60 100644
121--- a/src/components/ReanimatedSwipeable/ReanimatedSwipeableProps.ts
122+++ b/src/components/ReanimatedSwipeable/ReanimatedSwipeableProps.ts
123@@ -77,6 +77,13 @@ export type SwipeableProps = {
124 direction: SwipeDirection.LEFT | SwipeDirection.RIGHT
125 ) => void;
126
127+ /**
128+ * UI-thread worklet called on release before the built-in spring starts.
129+ * Return true to consume the release and take ownership of translation.
130+ * The caller must reset or remove the row after its custom animation.
131+ */
132+ onSwipeableRelease?: (translation: SharedValue<number>) => boolean;
133+
134 /**
135 * Called when action panel starts animating on open (either right or left).
136 */
137@@ -196,6 +203,14 @@ export type SwipeableProps = {
138 * The horizontal offset from the starting point required to trigger a left-swipe gesture. Defaults to -10.
139 */
140 dragOffsetFromRight?: number;
141+
142+ /**
143+ * Range along the Y axis (in points) that, once exceeded before the swipe
144+ * activates, makes the pan fail. Lets vertically-dominant pans (list
145+ * scrolling, especially trackpad two-finger pans) skip the swipe entirely.
146+ * Passed straight to the underlying Pan gesture's `failOffsetY`.
147+ */
148+ failOffsetY?: number | [start: number, end: number];
149 }>;
150
151 export interface SwipeableMethods {
patches/react-native-keyboard-controller@1.21.13.patch deleted-869
......@@ -1,869 +0,0 @@
1diff --git a/lib/commonjs/components/KeyboardChatScrollView/index.js b/lib/commonjs/components/KeyboardChatScrollView/index.js
2index db8cfb1d289f91563f13c4dd842c783c99facc32..64c7e38ad8d9e866b15a53e561509e6b0ad33cb9 100644
3--- a/lib/commonjs/components/KeyboardChatScrollView/index.js
4+++ b/lib/commonjs/components/KeyboardChatScrollView/index.js
5@@ -26,9 +26,12 @@ const KeyboardChatScrollView = /*#__PURE__*/(0, _react.forwardRef)(({
6 offset = 0,
7 extraContentPadding = ZERO_CONTENT_PADDING,
8 blankSpace = ZERO_BLANK_SPACE,
9+ adjustedInsetCompensation = 0,
10+ adjustedStartInsetCompensation = 0,
11 applyWorkaroundForContentInsetHitTestBug = false,
12 onLayout: onLayoutProp,
13 onContentSizeChange: onContentSizeChangeProp,
14+ onContentInsetChange,
15 onEndVisible,
16 ...rest
17 }, ref) => {
18@@ -50,13 +53,17 @@ const KeyboardChatScrollView = /*#__PURE__*/(0, _react.forwardRef)(({
19 freeze: freezeSV,
20 offset,
21 blankSpace,
22- extraContentPadding
23+ extraContentPadding,
24+ adjustedInsetCompensation,
25+ adjustedStartInsetCompensation
26 });
27 (0, _useExtraContentPadding.useExtraContentPadding)({
28 scrollViewRef,
29 extraContentPadding,
30 keyboardPadding: padding,
31 blankSpace,
32+ adjustedInsetCompensation,
33+ adjustedStartInsetCompensation,
34 scroll,
35 layout,
36 size,
37@@ -82,10 +89,26 @@ const KeyboardChatScrollView = /*#__PURE__*/(0, _react.forwardRef)(({
38 // a bug for you, please open an issue.
39 const totalPadding = (0, _reactNativeReanimated.useDerivedValue)(() => Math.min(layout.value.height, Math.max(blankSpace.value, padding.value + extraContentPadding.value)));
40
41+ // iOS applies the destination contentInset and contentOffset together at
42+ // keyboard-animation start. Keep that native target behavior, but report
43+ // the presentation height so virtualized-list layout follows the keyboard.
44+ const reportedPadding = (0, _reactNativeReanimated.useDerivedValue)(() => _reactNative.Platform.OS === "ios" ? Math.min(layout.value.height, Math.max(blankSpace.value, currentHeight.value + extraContentPadding.value)) : totalPadding.value);
45+
46+ // Mirror the effective bottom padding (keyboard + composer + blank floor)
47+ // to the consumer - a virtualized list needs it in its own scroll math or
48+ // its end/maintain targets point at the under-the-keyboard resting offset.
49+ (0, _reactNativeReanimated.useAnimatedReaction)(() => reportedPadding.value, (current, previous) => {
50+ if (onContentInsetChange && current !== previous) {
51+ (0, _reactNativeReanimated.runOnJS)(onContentInsetChange)({
52+ bottom: current
53+ });
54+ }
55+ }, [onContentInsetChange]);
56+
57 // Scroll indicator inset = keyboard + extraContentPadding (excludes blankSpace).
58 // Apps that render into the unsafe area can supply a negative
59 // scrollIndicatorInsets adjustment at the application layer.
60- const indicatorPadding = (0, _reactNativeReanimated.useDerivedValue)(() => padding.value + extraContentPadding.value);
61+ const indicatorPadding = (0, _reactNativeReanimated.useDerivedValue)(() => padding.value);
62 const onLayout = (0, _react.useCallback)(e => {
63 onLayoutInternal(e);
64 onLayoutProp === null || onLayoutProp === void 0 || onLayoutProp(e);
65diff --git a/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/helpers.js b/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/helpers.js
66index 4d33b3fe426070cf312fc493ce902b2c24d853ea..e619708b95865afd8b43dd8f0a6523fcf67b1f53 100644
67--- a/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/helpers.js
68+++ b/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/helpers.js
69@@ -206,7 +206,7 @@ const clampedScrollTarget = (offsetBeforeScroll, keyboardHeight, contentHeight,
70 * ```
71 */
72 exports.clampedScrollTarget = clampedScrollTarget;
73-const computeIOSContentOffset = (relativeScroll, keyboardHeight, contentHeight, layoutHeight, inverted, totalPaddingForMaxScroll) => {
74+const computeIOSContentOffset = (relativeScroll, keyboardHeight, contentHeight, layoutHeight, inverted, totalPaddingForMaxScroll, startInsetCompensation = 0) => {
75 "worklet";
76
77 const paddingForMax = totalPaddingForMaxScroll !== undefined ? totalPaddingForMaxScroll : keyboardHeight;
78@@ -214,8 +214,9 @@ const computeIOSContentOffset = (relativeScroll, keyboardHeight, contentHeight,
79 const maxScroll = Math.max(contentHeight - layoutHeight, 0);
80 return Math.max(Math.min(relativeScroll - keyboardHeight, maxScroll), -paddingForMax);
81 }
82- const maxScroll = Math.max(contentHeight - layoutHeight + paddingForMax, 0);
83- return Math.min(Math.max(keyboardHeight + relativeScroll, 0), maxScroll);
84+ const minScroll = -startInsetCompensation;
85+ const maxScroll = Math.max(contentHeight - layoutHeight + paddingForMax, minScroll);
86+ return Math.min(Math.max(keyboardHeight + relativeScroll, minScroll), maxScroll);
87 };
88 exports.computeIOSContentOffset = computeIOSContentOffset;
89 //# sourceMappingURL=helpers.js.map
90diff --git a/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/index.ios.js b/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/index.ios.js
91index 2073da84b8b2be291aa3181700c2b18a75d0fc56..7ae9bb220ce3cc23c788a79677afdc7d9547a27c 100644
92--- a/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/index.ios.js
93+++ b/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/index.ios.js
94@@ -32,7 +32,9 @@ function useChatKeyboard(scrollViewRef, options) {
95 freeze,
96 offset,
97 blankSpace,
98- extraContentPadding
99+ extraContentPadding,
100+ adjustedInsetCompensation,
101+ adjustedStartInsetCompensation
102 } = options;
103 const padding = (0, _reactNativeReanimated.useSharedValue)(0);
104 const currentHeight = (0, _reactNativeReanimated.useSharedValue)(0);
105@@ -58,6 +60,9 @@ function useChatKeyboard(scrollViewRef, options) {
106 targetKeyboardHeight.value = e.height;
107 }
108 const effective = (0, _helpers.getEffectiveHeight)(e.height, targetKeyboardHeight.value, offset);
109+ if (e.duration === 0) {
110+ currentHeight.value = effective;
111+ }
112 const atEnd = (0, _helpers.isScrollAtEnd)(scroll.value, layout.value.height, size.value.height, inverted);
113
114 // Scale minimum padding absorption by how much of it is visible.
115@@ -66,7 +71,7 @@ function useChatKeyboard(scrollViewRef, options) {
116 const visiblePadding = visibleFraction * blankSpace.value;
117 const minimumPaddingAbsorbed = Math.max(0, visiblePadding - extraContentPadding.value);
118 const scrollEffective = (0, _helpers.getScrollEffective)(effective, minimumPaddingAbsorbed);
119- const actualTotalPadding = Math.max(blankSpace.value, effective + extraContentPadding.value);
120+ const actualTotalPadding = Math.max(blankSpace.value, effective + extraContentPadding.value) + adjustedInsetCompensation;
121
122 // persistent mode: when keyboard shrinks, clamp to valid range
123 if (keyboardLiftBehavior === "persistent" && effective < padding.value) {
124@@ -76,8 +81,8 @@ function useChatKeyboard(scrollViewRef, options) {
125 const maxScroll = Math.max(size.value.height - layout.value.height, 0);
126 contentOffsetY.value = Math.max(-actualTotalPadding, Math.min(scroll.value, maxScroll));
127 } else {
128- const maxScroll = Math.max(size.value.height - layout.value.height + actualTotalPadding, 0);
129- contentOffsetY.value = Math.max(0, Math.min(scroll.value, maxScroll));
130+ const maxScroll = Math.max(size.value.height - layout.value.height + actualTotalPadding, -adjustedStartInsetCompensation);
131+ contentOffsetY.value = Math.max(-adjustedStartInsetCompensation, Math.min(scroll.value, maxScroll));
132 }
133 return;
134 }
135@@ -91,8 +96,8 @@ function useChatKeyboard(scrollViewRef, options) {
136 const maxScroll = Math.max(size.value.height - layout.value.height, 0);
137 contentOffsetY.value = Math.max(-actualTotalPadding, Math.min(scroll.value, maxScroll));
138 } else {
139- const maxScroll = Math.max(size.value.height - layout.value.height + actualTotalPadding, 0);
140- contentOffsetY.value = Math.max(0, Math.min(scroll.value, maxScroll));
141+ const maxScroll = Math.max(size.value.height - layout.value.height + actualTotalPadding, -adjustedStartInsetCompensation);
142+ contentOffsetY.value = Math.max(-adjustedStartInsetCompensation, Math.min(scroll.value, maxScroll));
143 }
144 return;
145 }
146@@ -118,12 +123,23 @@ function useChatKeyboard(scrollViewRef, options) {
147 contentOffsetY.value = scroll.value;
148 return;
149 }
150- contentOffsetY.value = (0, _helpers.computeIOSContentOffset)(relativeScroll, scrollEffective, size.value.height, layout.value.height, inverted, actualTotalPadding);
151+ contentOffsetY.value = (0, _helpers.computeIOSContentOffset)(relativeScroll, scrollEffective, size.value.height, layout.value.height, inverted, actualTotalPadding, adjustedStartInsetCompensation);
152+ },
153+ onMove: e => {
154+ "worklet";
155+
156+ if (freeze.value) {
157+ return;
158+ }
159+ currentHeight.value = (0, _helpers.getEffectiveHeight)(e.height, targetKeyboardHeight.value, offset);
160 },
161- onMove: () => {
162+ onInteractive: e => {
163 "worklet";
164
165- // iOS doesn't need per-frame updates (contentOffset handles it)
166+ if (freeze.value) {
167+ return;
168+ }
169+ currentHeight.value = (0, _helpers.getEffectiveHeight)(e.height, targetKeyboardHeight.value, offset);
170 },
171 onEnd: e => {
172 "worklet";
173@@ -132,9 +148,10 @@ function useChatKeyboard(scrollViewRef, options) {
174 return;
175 }
176 const effective = (0, _helpers.getEffectiveHeight)(e.height, targetKeyboardHeight.value, offset);
177+ currentHeight.value = effective;
178 padding.value = effective;
179 }
180- }, [inverted, keyboardLiftBehavior, offset, extraContentPadding]);
181+ }, [inverted, keyboardLiftBehavior, offset, extraContentPadding, adjustedInsetCompensation, adjustedStartInsetCompensation]);
182 return {
183 padding,
184 currentHeight,
185diff --git a/lib/commonjs/components/KeyboardChatScrollView/useExtraContentPadding/index.js b/lib/commonjs/components/KeyboardChatScrollView/useExtraContentPadding/index.js
186index 0d50bdfeb7bbc5c14a31ed344f8a690e4fd340b3..e0b73653fd1dd23f0f2e2c85835a3d107e3f666d 100644
187--- a/lib/commonjs/components/KeyboardChatScrollView/useExtraContentPadding/index.js
188+++ b/lib/commonjs/components/KeyboardChatScrollView/useExtraContentPadding/index.js
189@@ -29,6 +29,8 @@ function useExtraContentPadding(options) {
190 extraContentPadding,
191 keyboardPadding,
192 blankSpace,
193+ adjustedInsetCompensation,
194+ adjustedStartInsetCompensation,
195 scroll,
196 layout,
197 size,
198@@ -68,8 +70,8 @@ function useExtraContentPadding(options) {
199 }
200
201 // Compute effective delta considering blankSpace floor
202- const previousTotal = Math.max(blankSpace.value, keyboardPadding.value + previous);
203- const currentTotal = Math.max(blankSpace.value, keyboardPadding.value + current);
204+ const previousTotal = Math.max(blankSpace.value, keyboardPadding.value + previous) + adjustedInsetCompensation;
205+ const currentTotal = Math.max(blankSpace.value, keyboardPadding.value + current) + adjustedInsetCompensation;
206 const effectiveDelta = currentTotal - previousTotal;
207 if (effectiveDelta === 0) {
208 // blankSpace absorbed the change
209@@ -88,10 +90,11 @@ function useExtraContentPadding(options) {
210 const target = Math.max(scroll.value - effectiveDelta, -currentTotal);
211 scrollToTarget(target);
212 } else {
213- const maxScroll = Math.max(size.value.height - layout.value.height + currentTotal, 0);
214- const target = Math.min(scroll.value + effectiveDelta, maxScroll);
215+ const minScroll = -adjustedStartInsetCompensation;
216+ const maxScroll = Math.max(size.value.height - layout.value.height + currentTotal, minScroll);
217+ const target = Math.max(minScroll, Math.min(scroll.value + effectiveDelta, maxScroll));
218 scrollToTarget(target);
219 }
220- }, [inverted, keyboardLiftBehavior]);
221+ }, [inverted, keyboardLiftBehavior, adjustedInsetCompensation, adjustedStartInsetCompensation]);
222 }
223 //# sourceMappingURL=index.js.map
224diff --git a/lib/module/components/KeyboardChatScrollView/index.js b/lib/module/components/KeyboardChatScrollView/index.js
225index 612dd8bd9bd6cc3e30a5acac937ea3383eb1b630..76b858a6590ad0592cc663864ea822db55eaeceb 100644
226--- a/lib/module/components/KeyboardChatScrollView/index.js
227+++ b/lib/module/components/KeyboardChatScrollView/index.js
228@@ -1,7 +1,7 @@
229 function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
230 import React, { forwardRef, useCallback, useMemo } from "react";
231-import { StyleSheet } from "react-native";
232-import { makeMutable, useAnimatedRef, useAnimatedStyle, useDerivedValue } from "react-native-reanimated";
233+import { Platform, StyleSheet } from "react-native";
234+import { makeMutable, runOnJS, useAnimatedReaction, useAnimatedRef, useAnimatedStyle, useDerivedValue } from "react-native-reanimated";
235 import Reanimated from "react-native-reanimated";
236 import useCombinedRef from "../hooks/useCombinedRef";
237 import ScrollViewWithBottomPadding from "../ScrollViewWithBottomPadding";
238@@ -19,9 +19,12 @@ const KeyboardChatScrollView = /*#__PURE__*/forwardRef(({
239 offset = 0,
240 extraContentPadding = ZERO_CONTENT_PADDING,
241 blankSpace = ZERO_BLANK_SPACE,
242+ adjustedInsetCompensation = 0,
243+ adjustedStartInsetCompensation = 0,
244 applyWorkaroundForContentInsetHitTestBug = false,
245 onLayout: onLayoutProp,
246 onContentSizeChange: onContentSizeChangeProp,
247+ onContentInsetChange,
248 onEndVisible,
249 ...rest
250 }, ref) => {
251@@ -43,13 +46,17 @@ const KeyboardChatScrollView = /*#__PURE__*/forwardRef(({
252 freeze: freezeSV,
253 offset,
254 blankSpace,
255- extraContentPadding
256+ extraContentPadding,
257+ adjustedInsetCompensation,
258+ adjustedStartInsetCompensation
259 });
260 useExtraContentPadding({
261 scrollViewRef,
262 extraContentPadding,
263 keyboardPadding: padding,
264 blankSpace,
265+ adjustedInsetCompensation,
266+ adjustedStartInsetCompensation,
267 scroll,
268 layout,
269 size,
270@@ -75,10 +82,26 @@ const KeyboardChatScrollView = /*#__PURE__*/forwardRef(({
271 // a bug for you, please open an issue.
272 const totalPadding = useDerivedValue(() => Math.min(layout.value.height, Math.max(blankSpace.value, padding.value + extraContentPadding.value)));
273
274+ // iOS applies the destination contentInset and contentOffset together at
275+ // keyboard-animation start. Keep that native target behavior, but report
276+ // the presentation height so virtualized-list layout follows the keyboard.
277+ const reportedPadding = useDerivedValue(() => Platform.OS === "ios" ? Math.min(layout.value.height, Math.max(blankSpace.value, currentHeight.value + extraContentPadding.value)) : totalPadding.value);
278+
279+ // Mirror the effective bottom padding (keyboard + composer + blank floor)
280+ // to the consumer - a virtualized list needs it in its own scroll math or
281+ // its end/maintain targets point at the under-the-keyboard resting offset.
282+ useAnimatedReaction(() => reportedPadding.value, (current, previous) => {
283+ if (onContentInsetChange && current !== previous) {
284+ runOnJS(onContentInsetChange)({
285+ bottom: current
286+ });
287+ }
288+ }, [onContentInsetChange]);
289+
290 // Scroll indicator inset = keyboard + extraContentPadding (excludes blankSpace).
291 // Apps that render into the unsafe area can supply a negative
292 // scrollIndicatorInsets adjustment at the application layer.
293- const indicatorPadding = useDerivedValue(() => padding.value + extraContentPadding.value);
294+ const indicatorPadding = useDerivedValue(() => padding.value);
295 const onLayout = useCallback(e => {
296 onLayoutInternal(e);
297 onLayoutProp === null || onLayoutProp === void 0 || onLayoutProp(e);
298diff --git a/lib/module/components/KeyboardChatScrollView/useChatKeyboard/helpers.js b/lib/module/components/KeyboardChatScrollView/useChatKeyboard/helpers.js
299index 295e2219b560519b8d033968b5105d1da3e77315..ff7ee3fe0d880c2287a7b70d5ecf952e99357adf 100644
300--- a/lib/module/components/KeyboardChatScrollView/useChatKeyboard/helpers.js
301+++ b/lib/module/components/KeyboardChatScrollView/useChatKeyboard/helpers.js
302@@ -193,7 +193,7 @@ export const clampedScrollTarget = (offsetBeforeScroll, keyboardHeight, contentH
303 * computeIOSContentOffset(100, 300, 1000, 800, false); // 400
304 * ```
305 */
306-export const computeIOSContentOffset = (relativeScroll, keyboardHeight, contentHeight, layoutHeight, inverted, totalPaddingForMaxScroll) => {
307+export const computeIOSContentOffset = (relativeScroll, keyboardHeight, contentHeight, layoutHeight, inverted, totalPaddingForMaxScroll, startInsetCompensation = 0) => {
308 "worklet";
309
310 const paddingForMax = totalPaddingForMaxScroll !== undefined ? totalPaddingForMaxScroll : keyboardHeight;
311@@ -201,7 +201,8 @@ export const computeIOSContentOffset = (relativeScroll, keyboardHeight, contentH
312 const maxScroll = Math.max(contentHeight - layoutHeight, 0);
313 return Math.max(Math.min(relativeScroll - keyboardHeight, maxScroll), -paddingForMax);
314 }
315- const maxScroll = Math.max(contentHeight - layoutHeight + paddingForMax, 0);
316- return Math.min(Math.max(keyboardHeight + relativeScroll, 0), maxScroll);
317+ const minScroll = -startInsetCompensation;
318+ const maxScroll = Math.max(contentHeight - layoutHeight + paddingForMax, minScroll);
319+ return Math.min(Math.max(keyboardHeight + relativeScroll, minScroll), maxScroll);
320 };
321 //# sourceMappingURL=helpers.js.map
322diff --git a/lib/module/components/KeyboardChatScrollView/useChatKeyboard/index.ios.js b/lib/module/components/KeyboardChatScrollView/useChatKeyboard/index.ios.js
323index 52943c3a7d6a68fe2094dc1d112c07e6b9d890e4..cc4bfae859191aeb848179028b7217098cba2340 100644
324--- a/lib/module/components/KeyboardChatScrollView/useChatKeyboard/index.ios.js
325+++ b/lib/module/components/KeyboardChatScrollView/useChatKeyboard/index.ios.js
326@@ -25,7 +25,9 @@ function useChatKeyboard(scrollViewRef, options) {
327 freeze,
328 offset,
329 blankSpace,
330- extraContentPadding
331+ extraContentPadding,
332+ adjustedInsetCompensation,
333+ adjustedStartInsetCompensation
334 } = options;
335 const padding = useSharedValue(0);
336 const currentHeight = useSharedValue(0);
337@@ -51,6 +53,9 @@ function useChatKeyboard(scrollViewRef, options) {
338 targetKeyboardHeight.value = e.height;
339 }
340 const effective = getEffectiveHeight(e.height, targetKeyboardHeight.value, offset);
341+ if (e.duration === 0) {
342+ currentHeight.value = effective;
343+ }
344 const atEnd = isScrollAtEnd(scroll.value, layout.value.height, size.value.height, inverted);
345
346 // Scale minimum padding absorption by how much of it is visible.
347@@ -59,7 +64,7 @@ function useChatKeyboard(scrollViewRef, options) {
348 const visiblePadding = visibleFraction * blankSpace.value;
349 const minimumPaddingAbsorbed = Math.max(0, visiblePadding - extraContentPadding.value);
350 const scrollEffective = getScrollEffective(effective, minimumPaddingAbsorbed);
351- const actualTotalPadding = Math.max(blankSpace.value, effective + extraContentPadding.value);
352+ const actualTotalPadding = Math.max(blankSpace.value, effective + extraContentPadding.value) + adjustedInsetCompensation;
353
354 // persistent mode: when keyboard shrinks, clamp to valid range
355 if (keyboardLiftBehavior === "persistent" && effective < padding.value) {
356@@ -69,8 +74,8 @@ function useChatKeyboard(scrollViewRef, options) {
357 const maxScroll = Math.max(size.value.height - layout.value.height, 0);
358 contentOffsetY.value = Math.max(-actualTotalPadding, Math.min(scroll.value, maxScroll));
359 } else {
360- const maxScroll = Math.max(size.value.height - layout.value.height + actualTotalPadding, 0);
361- contentOffsetY.value = Math.max(0, Math.min(scroll.value, maxScroll));
362+ const maxScroll = Math.max(size.value.height - layout.value.height + actualTotalPadding, -adjustedStartInsetCompensation);
363+ contentOffsetY.value = Math.max(-adjustedStartInsetCompensation, Math.min(scroll.value, maxScroll));
364 }
365 return;
366 }
367@@ -84,8 +89,8 @@ function useChatKeyboard(scrollViewRef, options) {
368 const maxScroll = Math.max(size.value.height - layout.value.height, 0);
369 contentOffsetY.value = Math.max(-actualTotalPadding, Math.min(scroll.value, maxScroll));
370 } else {
371- const maxScroll = Math.max(size.value.height - layout.value.height + actualTotalPadding, 0);
372- contentOffsetY.value = Math.max(0, Math.min(scroll.value, maxScroll));
373+ const maxScroll = Math.max(size.value.height - layout.value.height + actualTotalPadding, -adjustedStartInsetCompensation);
374+ contentOffsetY.value = Math.max(-adjustedStartInsetCompensation, Math.min(scroll.value, maxScroll));
375 }
376 return;
377 }
378@@ -111,12 +116,23 @@ function useChatKeyboard(scrollViewRef, options) {
379 contentOffsetY.value = scroll.value;
380 return;
381 }
382- contentOffsetY.value = computeIOSContentOffset(relativeScroll, scrollEffective, size.value.height, layout.value.height, inverted, actualTotalPadding);
383+ contentOffsetY.value = computeIOSContentOffset(relativeScroll, scrollEffective, size.value.height, layout.value.height, inverted, actualTotalPadding, adjustedStartInsetCompensation);
384+ },
385+ onMove: e => {
386+ "worklet";
387+
388+ if (freeze.value) {
389+ return;
390+ }
391+ currentHeight.value = getEffectiveHeight(e.height, targetKeyboardHeight.value, offset);
392 },
393- onMove: () => {
394+ onInteractive: e => {
395 "worklet";
396
397- // iOS doesn't need per-frame updates (contentOffset handles it)
398+ if (freeze.value) {
399+ return;
400+ }
401+ currentHeight.value = getEffectiveHeight(e.height, targetKeyboardHeight.value, offset);
402 },
403 onEnd: e => {
404 "worklet";
405@@ -125,9 +141,10 @@ function useChatKeyboard(scrollViewRef, options) {
406 return;
407 }
408 const effective = getEffectiveHeight(e.height, targetKeyboardHeight.value, offset);
409+ currentHeight.value = effective;
410 padding.value = effective;
411 }
412- }, [inverted, keyboardLiftBehavior, offset, extraContentPadding]);
413+ }, [inverted, keyboardLiftBehavior, offset, extraContentPadding, adjustedInsetCompensation, adjustedStartInsetCompensation]);
414 return {
415 padding,
416 currentHeight,
417diff --git a/lib/module/components/KeyboardChatScrollView/useExtraContentPadding/index.js b/lib/module/components/KeyboardChatScrollView/useExtraContentPadding/index.js
418index 1afa50987a8d2a5fe3f36b20945efe804d48a873..7b05d0721c50e118cf78c07913b580a31293db77 100644
419--- a/lib/module/components/KeyboardChatScrollView/useExtraContentPadding/index.js
420+++ b/lib/module/components/KeyboardChatScrollView/useExtraContentPadding/index.js
421@@ -23,6 +23,8 @@ function useExtraContentPadding(options) {
422 extraContentPadding,
423 keyboardPadding,
424 blankSpace,
425+ adjustedInsetCompensation,
426+ adjustedStartInsetCompensation,
427 scroll,
428 layout,
429 size,
430@@ -62,8 +64,8 @@ function useExtraContentPadding(options) {
431 }
432
433 // Compute effective delta considering blankSpace floor
434- const previousTotal = Math.max(blankSpace.value, keyboardPadding.value + previous);
435- const currentTotal = Math.max(blankSpace.value, keyboardPadding.value + current);
436+ const previousTotal = Math.max(blankSpace.value, keyboardPadding.value + previous) + adjustedInsetCompensation;
437+ const currentTotal = Math.max(blankSpace.value, keyboardPadding.value + current) + adjustedInsetCompensation;
438 const effectiveDelta = currentTotal - previousTotal;
439 if (effectiveDelta === 0) {
440 // blankSpace absorbed the change
441@@ -82,11 +84,12 @@ function useExtraContentPadding(options) {
442 const target = Math.max(scroll.value - effectiveDelta, -currentTotal);
443 scrollToTarget(target);
444 } else {
445- const maxScroll = Math.max(size.value.height - layout.value.height + currentTotal, 0);
446- const target = Math.min(scroll.value + effectiveDelta, maxScroll);
447+ const minScroll = -adjustedStartInsetCompensation;
448+ const maxScroll = Math.max(size.value.height - layout.value.height + currentTotal, minScroll);
449+ const target = Math.max(minScroll, Math.min(scroll.value + effectiveDelta, maxScroll));
450 scrollToTarget(target);
451 }
452- }, [inverted, keyboardLiftBehavior]);
453+ }, [inverted, keyboardLiftBehavior, adjustedInsetCompensation, adjustedStartInsetCompensation]);
454 }
455 export { useExtraContentPadding };
456 //# sourceMappingURL=index.js.map
457diff --git a/lib/typescript/components/KeyboardChatScrollView/types.d.ts b/lib/typescript/components/KeyboardChatScrollView/types.d.ts
458index a036b431f03efb9d5379527c17db6fce62bfee09..5e56bf7edec9161698a745e8e6292bfccd68d3db 100644
459--- a/lib/typescript/components/KeyboardChatScrollView/types.d.ts
460+++ b/lib/typescript/components/KeyboardChatScrollView/types.d.ts
461@@ -86,6 +86,10 @@ export type KeyboardChatScrollViewProps = {
462 * Default is `undefined` (equivalent to `0` — no minimum floor).
463 */
464 blankSpace?: SharedValue<number>;
465+ /** Extra bottom inset UIKit adds beyond the raw contentInset (safe area). Offset math only. */
466+ adjustedInsetCompensation?: number;
467+ /** Leading inset UIKit adds outside raw contentInset. Offset math only. */
468+ adjustedStartInsetCompensation?: number;
469 /**
470 * Fires whenever the effective content inset changes — the static `contentInset`
471 * prop combined with the dynamic keyboard-driven padding.
472diff --git a/lib/typescript/components/KeyboardChatScrollView/useChatKeyboard/helpers.d.ts b/lib/typescript/components/KeyboardChatScrollView/useChatKeyboard/helpers.d.ts
473index 2b51cc4737b4a05b5396da31e67e54177f43c498..3acec1fbddee6227915590a6c8d449757cb4d7b2 100644
474--- a/lib/typescript/components/KeyboardChatScrollView/useChatKeyboard/helpers.d.ts
475+++ b/lib/typescript/components/KeyboardChatScrollView/useChatKeyboard/helpers.d.ts
476@@ -129,4 +129,4 @@ export declare const clampedScrollTarget: (offsetBeforeScroll: number, keyboardH
477 * computeIOSContentOffset(100, 300, 1000, 800, false); // 400
478 * ```
479 */
480-export declare const computeIOSContentOffset: (relativeScroll: number, keyboardHeight: number, contentHeight: number, layoutHeight: number, inverted: boolean, totalPaddingForMaxScroll?: number) => number;
481+export declare const computeIOSContentOffset: (relativeScroll: number, keyboardHeight: number, contentHeight: number, layoutHeight: number, inverted: boolean, totalPaddingForMaxScroll?: number, startInsetCompensation?: number) => number;
482diff --git a/lib/typescript/components/KeyboardChatScrollView/useChatKeyboard/types.d.ts b/lib/typescript/components/KeyboardChatScrollView/useChatKeyboard/types.d.ts
483index aff9b5a8dbc2464546396437eaf6c5ae955b9f29..fdd83953271123be6caefaa786c469f0d92cce2b 100644
484--- a/lib/typescript/components/KeyboardChatScrollView/useChatKeyboard/types.d.ts
485+++ b/lib/typescript/components/KeyboardChatScrollView/useChatKeyboard/types.d.ts
486@@ -9,6 +9,10 @@ type UseChatKeyboardOptions = {
487 blankSpace: SharedValue<number>;
488 /** Extra content padding shared value — needed on iOS to correctly clamp contentOffset. */
489 extraContentPadding: SharedValue<number>;
490+ /** Safe-area extra beyond raw contentInset. Offset math only. */
491+ adjustedInsetCompensation: number;
492+ /** Leading inset UIKit adds beyond the raw contentInset. Offset math only. */
493+ adjustedStartInsetCompensation: number;
494 };
495 type UseChatKeyboardReturn = {
496 /** Extra scrollable space (= keyboard height). Used as contentInset on iOS, contentInsetBottom/contentInsetTop on Android. */
497diff --git a/lib/typescript/components/KeyboardChatScrollView/useExtraContentPadding/index.d.ts b/lib/typescript/components/KeyboardChatScrollView/useExtraContentPadding/index.d.ts
498index ec73f70544a062fbecfc1d8be92d839d3e0bea6f..45b387446587fd3e611fa02a01534bb5d9fa6bbd 100644
499--- a/lib/typescript/components/KeyboardChatScrollView/useExtraContentPadding/index.d.ts
500+++ b/lib/typescript/components/KeyboardChatScrollView/useExtraContentPadding/index.d.ts
501@@ -8,6 +8,10 @@ type UseExtraContentPaddingOptions = {
502 keyboardPadding: SharedValue<number>;
503 /** Minimum inset floor — used to absorb keyboard and extraContentPadding changes. */
504 blankSpace: SharedValue<number>;
505+ /** Safe-area extra beyond raw contentInset. Offset math only. */
506+ adjustedInsetCompensation: number;
507+ /** Leading inset UIKit adds beyond raw contentInset. Offset math only. */
508+ adjustedStartInsetCompensation: number;
509 /** Current vertical scroll offset. */
510 scroll: SharedValue<number>;
511 /** Visible viewport dimensions. */
512diff --git a/src/components/KeyboardChatScrollView/index.tsx b/src/components/KeyboardChatScrollView/index.tsx
513index 03f5f74e9aaaabc75db1c01643a655ee4fdfa5f2..277a1ecada428ffbae517d6edc720d029c8ecc10 100644
514--- a/src/components/KeyboardChatScrollView/index.tsx
515+++ b/src/components/KeyboardChatScrollView/index.tsx
516@@ -1,7 +1,9 @@
517 import React, { forwardRef, useCallback, useMemo } from "react";
518-import { StyleSheet } from "react-native";
519+import { Platform, StyleSheet } from "react-native";
520 import {
521 makeMutable,
522+ runOnJS,
523+ useAnimatedReaction,
524 useAnimatedRef,
525 useAnimatedStyle,
526 useDerivedValue,
527@@ -35,9 +37,12 @@ const KeyboardChatScrollView = forwardRef<
528 offset = 0,
529 extraContentPadding = ZERO_CONTENT_PADDING,
530 blankSpace = ZERO_BLANK_SPACE,
531+ adjustedInsetCompensation = 0,
532+ adjustedStartInsetCompensation = 0,
533 applyWorkaroundForContentInsetHitTestBug = false,
534 onLayout: onLayoutProp,
535 onContentSizeChange: onContentSizeChangeProp,
536+ onContentInsetChange,
537 onEndVisible,
538 ...rest
539 },
540@@ -64,6 +69,8 @@ const KeyboardChatScrollView = forwardRef<
541 offset,
542 blankSpace,
543 extraContentPadding,
544+ adjustedInsetCompensation,
545+ adjustedStartInsetCompensation,
546 });
547
548 useExtraContentPadding({
549@@ -71,6 +78,8 @@ const KeyboardChatScrollView = forwardRef<
550 extraContentPadding,
551 keyboardPadding: padding,
552 blankSpace,
553+ adjustedInsetCompensation,
554+ adjustedStartInsetCompensation,
555 scroll,
556 layout,
557 size,
558@@ -102,13 +111,40 @@ const KeyboardChatScrollView = forwardRef<
559 ),
560 );
561
562- // Scroll indicator inset = keyboard + extraContentPadding (excludes blankSpace).
563- // Apps that render into the unsafe area can supply a negative
564- // scrollIndicatorInsets adjustment at the application layer.
565- const indicatorPadding = useDerivedValue(
566- () => padding.value + extraContentPadding.value,
567+ // iOS applies the destination contentInset and contentOffset together at
568+ // keyboard-animation start. Keep that native target behavior, but report
569+ // the presentation height so virtualized-list layout follows the keyboard.
570+ const reportedPadding = useDerivedValue(() =>
571+ Platform.OS === "ios"
572+ ? Math.min(
573+ layout.value.height,
574+ Math.max(
575+ blankSpace.value,
576+ currentHeight.value + extraContentPadding.value,
577+ ),
578+ )
579+ : totalPadding.value,
580 );
581
582+ // Mirror the effective bottom padding (keyboard + composer + blank floor)
583+ // to the consumer — a virtualized list needs it in its own scroll math or
584+ // its end/maintain targets point at the under-the-keyboard resting offset.
585+ useAnimatedReaction(
586+ () => reportedPadding.value,
587+ (current, previous) => {
588+ if (onContentInsetChange && current !== previous) {
589+ runOnJS(onContentInsetChange)({ bottom: current });
590+ }
591+ },
592+ [onContentInsetChange],
593+ );
594+
595+ // Scroll indicator inset = keyboard only (excludes extraContentPadding and
596+ // blankSpace): with a floating composer the indicator track should run the
597+ // full height of the scroll view, behind the composer, like iOS Messages.
598+ // The keyboard still lifts it so it never disappears under the keyboard.
599+ const indicatorPadding = useDerivedValue(() => padding.value);
600+
601 const onLayout = useCallback(
602 (e: LayoutChangeEvent) => {
603 onLayoutInternal(e);
604diff --git a/src/components/KeyboardChatScrollView/types.ts b/src/components/KeyboardChatScrollView/types.ts
605index dd222b57bc7a71729524670bad3812f30920bd73..7be71b5460eb143ddf460ce5c87b843c66bfb2cd 100644
606--- a/src/components/KeyboardChatScrollView/types.ts
607+++ b/src/components/KeyboardChatScrollView/types.ts
608@@ -90,6 +90,17 @@ export type KeyboardChatScrollViewProps = {
609 * Default is `undefined` (equivalent to `0` — no minimum floor).
610 */
611 blankSpace?: SharedValue<number>;
612+ /**
613+ * Extra bottom inset UIKit adds on top of the raw `contentInset` this
614+ * component writes (e.g. the home-indicator safe area under
615+ * `contentInsetAdjustmentBehavior="automatic"`). Used ONLY in scroll-offset
616+ * math (max scroll / end pinning) — never written into `contentInset`.
617+ *
618+ * Default is `0`.
619+ */
620+ adjustedInsetCompensation?: number;
621+ /** Leading inset UIKit adds outside raw contentInset. Offset math only. */
622+ adjustedStartInsetCompensation?: number;
623 /**
624 * Fires whenever the effective content inset changes — the static `contentInset`
625 * prop combined with the dynamic keyboard-driven padding.
626diff --git a/src/components/KeyboardChatScrollView/useChatKeyboard/helpers.ts b/src/components/KeyboardChatScrollView/useChatKeyboard/helpers.ts
627index 37eacd10857cd70c51b3468c4b466e4959d0a415..3d77ab27c614f44b64da8270823942cb670b097b 100644
628--- a/src/components/KeyboardChatScrollView/useChatKeyboard/helpers.ts
629+++ b/src/components/KeyboardChatScrollView/useChatKeyboard/helpers.ts
630@@ -245,6 +245,7 @@ export const computeIOSContentOffset = (
631 layoutHeight: number,
632 inverted: boolean,
633 totalPaddingForMaxScroll?: number,
634+ startInsetCompensation: number = 0,
635 ): number => {
636 "worklet";
637
638@@ -262,7 +263,14 @@ export const computeIOSContentOffset = (
639 );
640 }
641
642- const maxScroll = Math.max(contentHeight - layoutHeight + paddingForMax, 0);
643+ const minScroll = -startInsetCompensation;
644+ const maxScroll = Math.max(
645+ contentHeight - layoutHeight + paddingForMax,
646+ minScroll,
647+ );
648
649- return Math.min(Math.max(keyboardHeight + relativeScroll, 0), maxScroll);
650+ return Math.min(
651+ Math.max(keyboardHeight + relativeScroll, minScroll),
652+ maxScroll,
653+ );
654 };
655diff --git a/src/components/KeyboardChatScrollView/useChatKeyboard/index.ios.ts b/src/components/KeyboardChatScrollView/useChatKeyboard/index.ios.ts
656index 560df54bae1a8c41a2e9ac0e2a8d2fd9b843968a..c375a8c4cc889c2fc2c0c1034788c605633192ed 100644
657--- a/src/components/KeyboardChatScrollView/useChatKeyboard/index.ios.ts
658+++ b/src/components/KeyboardChatScrollView/useChatKeyboard/index.ios.ts
659@@ -43,6 +43,8 @@ function useChatKeyboard(
660 offset,
661 blankSpace,
662 extraContentPadding,
663+ adjustedInsetCompensation,
664+ adjustedStartInsetCompensation,
665 } = options;
666
667 const padding = useSharedValue(0);
668@@ -79,6 +81,10 @@ function useChatKeyboard(
669 offset,
670 );
671
672+ if (e.duration === 0) {
673+ currentHeight.value = effective;
674+ }
675+
676 const atEnd = isScrollAtEnd(
677 scroll.value,
678 layout.value.height,
679@@ -104,10 +110,12 @@ function useChatKeyboard(
680 effective,
681 minimumPaddingAbsorbed,
682 );
683- const actualTotalPadding = Math.max(
684- blankSpace.value,
685- effective + extraContentPadding.value,
686- );
687+ // UIKit adds adjustedInsetCompensation (safe area) on top of the raw
688+ // inset; include it here so end/max-scroll targets match the real
689+ // resting offsets.
690+ const actualTotalPadding =
691+ Math.max(blankSpace.value, effective + extraContentPadding.value) +
692+ adjustedInsetCompensation;
693
694 // persistent mode: when keyboard shrinks, clamp to valid range
695 if (
696@@ -130,11 +138,11 @@ function useChatKeyboard(
697 } else {
698 const maxScroll = Math.max(
699 size.value.height - layout.value.height + actualTotalPadding,
700- 0,
701+ -adjustedStartInsetCompensation,
702 );
703
704 contentOffsetY.value = Math.max(
705- 0,
706+ -adjustedStartInsetCompensation,
707 Math.min(scroll.value, maxScroll),
708 );
709 }
710@@ -165,11 +173,11 @@ function useChatKeyboard(
711 } else {
712 const maxScroll = Math.max(
713 size.value.height - layout.value.height + actualTotalPadding,
714- 0,
715+ -adjustedStartInsetCompensation,
716 );
717
718 contentOffsetY.value = Math.max(
719- 0,
720+ -adjustedStartInsetCompensation,
721 Math.min(scroll.value, maxScroll),
722 );
723 }
724@@ -219,12 +227,34 @@ function useChatKeyboard(
725 layout.value.height,
726 inverted,
727 actualTotalPadding,
728+ adjustedStartInsetCompensation,
729 );
730 },
731- onMove: () => {
732+ onMove: (e) => {
733 "worklet";
734
735- // iOS doesn't need per-frame updates (contentOffset handles it)
736+ if (freeze.value) {
737+ return;
738+ }
739+
740+ currentHeight.value = getEffectiveHeight(
741+ e.height,
742+ targetKeyboardHeight.value,
743+ offset,
744+ );
745+ },
746+ onInteractive: (e) => {
747+ "worklet";
748+
749+ if (freeze.value) {
750+ return;
751+ }
752+
753+ currentHeight.value = getEffectiveHeight(
754+ e.height,
755+ targetKeyboardHeight.value,
756+ offset,
757+ );
758 },
759 onEnd: (e) => {
760 "worklet";
761@@ -239,10 +269,18 @@ function useChatKeyboard(
762 offset,
763 );
764
765+ currentHeight.value = effective;
766 padding.value = effective;
767 },
768 },
769- [inverted, keyboardLiftBehavior, offset, extraContentPadding],
770+ [
771+ inverted,
772+ keyboardLiftBehavior,
773+ offset,
774+ extraContentPadding,
775+ adjustedInsetCompensation,
776+ adjustedStartInsetCompensation,
777+ ],
778 );
779
780 return {
781diff --git a/src/components/KeyboardChatScrollView/useChatKeyboard/types.ts b/src/components/KeyboardChatScrollView/useChatKeyboard/types.ts
782index 02abf5cd9490900826678175462b234e07e30e92..4ee0ddd65e0b105568ab43b73997af4be8adae00 100644
783--- a/src/components/KeyboardChatScrollView/useChatKeyboard/types.ts
784+++ b/src/components/KeyboardChatScrollView/useChatKeyboard/types.ts
785@@ -11,6 +11,10 @@ type UseChatKeyboardOptions = {
786 blankSpace: SharedValue<number>;
787 /** Extra content padding shared value — needed on iOS to correctly clamp contentOffset. */
788 extraContentPadding: SharedValue<number>;
789+ /** Extra bottom inset UIKit adds beyond the raw contentInset (safe area). Offset math only. */
790+ adjustedInsetCompensation: number;
791+ /** Leading inset UIKit adds beyond the raw contentInset. Offset math only. */
792+ adjustedStartInsetCompensation: number;
793 };
794
795 type UseChatKeyboardReturn = {
796diff --git a/src/components/KeyboardChatScrollView/useExtraContentPadding/index.ts b/src/components/KeyboardChatScrollView/useExtraContentPadding/index.ts
797index 833acbe78f1b1245251ddd3431d6546decdd0ade..8f7c10cb6ab392f10df4ca43549b89c25844f0b8 100644
798--- a/src/components/KeyboardChatScrollView/useExtraContentPadding/index.ts
799+++ b/src/components/KeyboardChatScrollView/useExtraContentPadding/index.ts
800@@ -16,6 +16,10 @@ type UseExtraContentPaddingOptions = {
801 keyboardPadding: SharedValue<number>;
802 /** Minimum inset floor — used to absorb keyboard and extraContentPadding changes. */
803 blankSpace: SharedValue<number>;
804+ /** Extra bottom inset UIKit adds beyond the raw contentInset (safe area). Offset math only. */
805+ adjustedInsetCompensation: number;
806+ /** Leading inset UIKit adds beyond raw contentInset. Offset math only. */
807+ adjustedStartInsetCompensation: number;
808 /** Current vertical scroll offset. */
809 scroll: SharedValue<number>;
810 /** Visible viewport dimensions. */
811@@ -49,6 +53,8 @@ function useExtraContentPadding(options: UseExtraContentPaddingOptions): void {
812 extraContentPadding,
813 keyboardPadding,
814 blankSpace,
815+ adjustedInsetCompensation,
816+ adjustedStartInsetCompensation,
817 scroll,
818 layout,
819 size,
820@@ -97,14 +103,12 @@ function useExtraContentPadding(options: UseExtraContentPaddingOptions): void {
821 }
822
823 // Compute effective delta considering blankSpace floor
824- const previousTotal = Math.max(
825- blankSpace.value,
826- keyboardPadding.value + previous,
827- );
828- const currentTotal = Math.max(
829- blankSpace.value,
830- keyboardPadding.value + current,
831- );
832+ const previousTotal =
833+ Math.max(blankSpace.value, keyboardPadding.value + previous) +
834+ adjustedInsetCompensation;
835+ const currentTotal =
836+ Math.max(blankSpace.value, keyboardPadding.value + current) +
837+ adjustedInsetCompensation;
838 const effectiveDelta = currentTotal - previousTotal;
839
840 if (effectiveDelta === 0) {
841@@ -137,16 +141,25 @@ function useExtraContentPadding(options: UseExtraContentPaddingOptions): void {
842
843 scrollToTarget(target);
844 } else {
845+ const minScroll = -adjustedStartInsetCompensation;
846 const maxScroll = Math.max(
847 size.value.height - layout.value.height + currentTotal,
848- 0,
849+ minScroll,
850+ );
851+ const target = Math.max(
852+ minScroll,
853+ Math.min(scroll.value + effectiveDelta, maxScroll),
854 );
855- const target = Math.min(scroll.value + effectiveDelta, maxScroll);
856
857 scrollToTarget(target);
858 }
859 },
860- [inverted, keyboardLiftBehavior],
861+ [
862+ inverted,
863+ keyboardLiftBehavior,
864+ adjustedInsetCompensation,
865+ adjustedStartInsetCompensation,
866+ ],
867 );
868 }
869
patches/react-native-keyboard-controller@1.22.4.patch created+885
......@@ -0,0 +1,885 @@
1diff --git a/lib/commonjs/components/KeyboardChatScrollView/index.js b/lib/commonjs/components/KeyboardChatScrollView/index.js
2index 5617394..4f2222a 100644
3--- a/lib/commonjs/components/KeyboardChatScrollView/index.js
4+++ b/lib/commonjs/components/KeyboardChatScrollView/index.js
5@@ -27,9 +27,12 @@ const KeyboardChatScrollView = /*#__PURE__*/(0, _react.forwardRef)(({
6 offset = 0,
7 extraContentPadding = ZERO_CONTENT_PADDING,
8 blankSpace = ZERO_BLANK_SPACE,
9+ adjustedInsetCompensation = 0,
10+ adjustedStartInsetCompensation = 0,
11 applyWorkaroundForContentInsetHitTestBug = false,
12 onLayout: onLayoutProp,
13 onContentSizeChange: onContentSizeChangeProp,
14+ onContentInsetChange,
15 onEndVisible,
16 ...rest
17 }, ref) => {
18@@ -51,13 +54,17 @@ const KeyboardChatScrollView = /*#__PURE__*/(0, _react.forwardRef)(({
19 freeze: freezeSV,
20 offset,
21 blankSpace,
22- extraContentPadding
23+ extraContentPadding,
24+ adjustedInsetCompensation,
25+ adjustedStartInsetCompensation
26 });
27 (0, _useExtraContentPadding.useExtraContentPadding)({
28 scrollViewRef,
29 extraContentPadding,
30 keyboardPadding: padding,
31 blankSpace,
32+ adjustedInsetCompensation,
33+ adjustedStartInsetCompensation,
34 scroll,
35 layout,
36 size,
37@@ -88,10 +95,26 @@ const KeyboardChatScrollView = /*#__PURE__*/(0, _react.forwardRef)(({
38 // a bug for you, please open an issue.
39 const totalPadding = (0, _reactNativeReanimated.useDerivedValue)(() => Math.min(layout.value.height, Math.max(blankSpace.value, padding.value + extraContentPadding.value)));
40
41+ // iOS applies the destination contentInset and contentOffset together at
42+ // keyboard-animation start. Keep that native target behavior, but report
43+ // the presentation height so virtualized-list layout follows the keyboard.
44+ const reportedPadding = (0, _reactNativeReanimated.useDerivedValue)(() => _reactNative.Platform.OS === "ios" ? Math.min(layout.value.height, Math.max(blankSpace.value, currentHeight.value + extraContentPadding.value)) : totalPadding.value);
45+
46+ // Mirror the effective bottom padding (keyboard + composer + blank floor)
47+ // to the consumer - a virtualized list needs it in its own scroll math or
48+ // its end/maintain targets point at the under-the-keyboard resting offset.
49+ (0, _reactNativeReanimated.useAnimatedReaction)(() => reportedPadding.value, (current, previous) => {
50+ if (onContentInsetChange && current !== previous) {
51+ (0, _reactNativeReanimated.runOnJS)(onContentInsetChange)({
52+ bottom: current
53+ });
54+ }
55+ }, [onContentInsetChange]);
56+
57 // Scroll indicator inset = keyboard + extraContentPadding (excludes blankSpace).
58 // Apps that render into the unsafe area can supply a negative
59 // scrollIndicatorInsets adjustment at the application layer.
60- const indicatorPadding = (0, _reactNativeReanimated.useDerivedValue)(() => padding.value + extraContentPadding.value);
61+ const indicatorPadding = (0, _reactNativeReanimated.useDerivedValue)(() => padding.value);
62 const onLayout = (0, _react.useCallback)(e => {
63 onLayoutInternal(e);
64 onLayoutProp === null || onLayoutProp === void 0 || onLayoutProp(e);
65diff --git a/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/helpers.js b/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/helpers.js
66index 4d33b3f..6a787d3 100644
67--- a/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/helpers.js
68+++ b/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/helpers.js
69@@ -206,7 +206,7 @@ const clampedScrollTarget = (offsetBeforeScroll, keyboardHeight, contentHeight,
70 * ```
71 */
72 exports.clampedScrollTarget = clampedScrollTarget;
73-const computeIOSContentOffset = (relativeScroll, keyboardHeight, contentHeight, layoutHeight, inverted, totalPaddingForMaxScroll) => {
74+const computeIOSContentOffset = (relativeScroll, keyboardHeight, contentHeight, layoutHeight, inverted, totalPaddingForMaxScroll, startInsetCompensation = 0) => {
75 "worklet";
76
77 const paddingForMax = totalPaddingForMaxScroll !== undefined ? totalPaddingForMaxScroll : keyboardHeight;
78@@ -214,8 +214,9 @@ const computeIOSContentOffset = (relativeScroll, keyboardHeight, contentHeight,
79 const maxScroll = Math.max(contentHeight - layoutHeight, 0);
80 return Math.max(Math.min(relativeScroll - keyboardHeight, maxScroll), -paddingForMax);
81 }
82- const maxScroll = Math.max(contentHeight - layoutHeight + paddingForMax, 0);
83- return Math.min(Math.max(keyboardHeight + relativeScroll, 0), maxScroll);
84+ const minScroll = -startInsetCompensation;
85+ const maxScroll = Math.max(contentHeight - layoutHeight + paddingForMax, minScroll);
86+ return Math.min(Math.max(keyboardHeight + relativeScroll, minScroll), maxScroll);
87 };
88 exports.computeIOSContentOffset = computeIOSContentOffset;
89 //# sourceMappingURL=helpers.js.map
90\ No newline at end of file
91diff --git a/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/index.ios.js b/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/index.ios.js
92index cecee07..533a9e9 100644
93--- a/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/index.ios.js
94+++ b/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/index.ios.js
95@@ -32,7 +32,9 @@ function useChatKeyboard(scrollViewRef, options) {
96 freeze,
97 offset,
98 blankSpace,
99- extraContentPadding
100+ extraContentPadding,
101+ adjustedInsetCompensation,
102+ adjustedStartInsetCompensation
103 } = options;
104 const padding = (0, _reactNativeReanimated.useSharedValue)(0);
105 const currentHeight = (0, _reactNativeReanimated.useSharedValue)(0);
106@@ -59,6 +61,9 @@ function useChatKeyboard(scrollViewRef, options) {
107 targetKeyboardHeight.value = e.height;
108 }
109 const effective = (0, _helpers.getEffectiveHeight)(e.height, targetKeyboardHeight.value, offset);
110+ if (e.duration === 0) {
111+ currentHeight.value = effective;
112+ }
113 const atEnd = (0, _helpers.isScrollAtEnd)(scroll.value, layout.value.height, size.value.height, inverted);
114
115 // Scale minimum padding absorption by how much of it is visible.
116@@ -67,7 +72,7 @@ function useChatKeyboard(scrollViewRef, options) {
117 const visiblePadding = visibleFraction * blankSpace.value;
118 const minimumPaddingAbsorbed = Math.max(0, visiblePadding - extraContentPadding.value);
119 const scrollEffective = (0, _helpers.getScrollEffective)(effective, minimumPaddingAbsorbed);
120- const actualTotalPadding = Math.max(blankSpace.value, effective + extraContentPadding.value);
121+ const actualTotalPadding = Math.max(blankSpace.value, effective + extraContentPadding.value) + adjustedInsetCompensation;
122
123 // `onInteractive` owns the native scroll offset. When its final
124 // keyboardWillHide event arrives, consume the marker so this
125@@ -87,8 +92,8 @@ function useChatKeyboard(scrollViewRef, options) {
126 const maxScroll = Math.max(size.value.height - layout.value.height, 0);
127 contentOffsetY.value = Math.max(-actualTotalPadding, Math.min(scroll.value, maxScroll));
128 } else {
129- const maxScroll = Math.max(size.value.height - layout.value.height + actualTotalPadding, 0);
130- contentOffsetY.value = Math.max(0, Math.min(scroll.value, maxScroll));
131+ const maxScroll = Math.max(size.value.height - layout.value.height + actualTotalPadding, -adjustedStartInsetCompensation);
132+ contentOffsetY.value = Math.max(-adjustedStartInsetCompensation, Math.min(scroll.value, maxScroll));
133 }
134 return;
135 }
136@@ -102,8 +107,8 @@ function useChatKeyboard(scrollViewRef, options) {
137 const maxScroll = Math.max(size.value.height - layout.value.height, 0);
138 contentOffsetY.value = Math.max(-actualTotalPadding, Math.min(scroll.value, maxScroll));
139 } else {
140- const maxScroll = Math.max(size.value.height - layout.value.height + actualTotalPadding, 0);
141- contentOffsetY.value = Math.max(0, Math.min(scroll.value, maxScroll));
142+ const maxScroll = Math.max(size.value.height - layout.value.height + actualTotalPadding, -adjustedStartInsetCompensation);
143+ contentOffsetY.value = Math.max(-adjustedStartInsetCompensation, Math.min(scroll.value, maxScroll));
144 }
145 return;
146 }
147@@ -129,17 +134,25 @@ function useChatKeyboard(scrollViewRef, options) {
148 contentOffsetY.value = scroll.value;
149 return;
150 }
151- contentOffsetY.value = (0, _helpers.computeIOSContentOffset)(relativeScroll, scrollEffective, size.value.height, layout.value.height, inverted, actualTotalPadding);
152+ contentOffsetY.value = (0, _helpers.computeIOSContentOffset)(relativeScroll, scrollEffective, size.value.height, layout.value.height, inverted, actualTotalPadding, adjustedStartInsetCompensation);
153 },
154- onInteractive: () => {
155+ onMove: e => {
156 "worklet";
157
158- isInteractiveDismissal.value = true;
159+ if (freeze.value) {
160+ return;
161+ }
162+ currentHeight.value = (0, _helpers.getEffectiveHeight)(e.height, targetKeyboardHeight.value, offset);
163 },
164- onMove: () => {
165+ onInteractive: e => {
166 "worklet";
167
168- // iOS doesn't need per-frame updates (contentOffset handles it)
169+ isInteractiveDismissal.value = true;
170+
171+ if (freeze.value) {
172+ return;
173+ }
174+ currentHeight.value = (0, _helpers.getEffectiveHeight)(e.height, targetKeyboardHeight.value, offset);
175 },
176 onEnd: e => {
177 "worklet";
178@@ -148,9 +161,10 @@ function useChatKeyboard(scrollViewRef, options) {
179 return;
180 }
181 const effective = (0, _helpers.getEffectiveHeight)(e.height, targetKeyboardHeight.value, offset);
182+ currentHeight.value = effective;
183 padding.value = effective;
184 }
185- }, [inverted, keyboardLiftBehavior, offset, extraContentPadding]);
186+ }, [inverted, keyboardLiftBehavior, offset, extraContentPadding, adjustedInsetCompensation, adjustedStartInsetCompensation]);
187 return {
188 padding,
189 currentHeight,
190diff --git a/lib/commonjs/components/KeyboardChatScrollView/useExtraContentPadding/index.js b/lib/commonjs/components/KeyboardChatScrollView/useExtraContentPadding/index.js
191index 54a1c57..19b44fc 100644
192--- a/lib/commonjs/components/KeyboardChatScrollView/useExtraContentPadding/index.js
193+++ b/lib/commonjs/components/KeyboardChatScrollView/useExtraContentPadding/index.js
194@@ -31,6 +31,8 @@ function useExtraContentPadding(options) {
195 extraContentPadding,
196 keyboardPadding,
197 blankSpace,
198+ adjustedInsetCompensation,
199+ adjustedStartInsetCompensation,
200 scroll,
201 layout,
202 size,
203@@ -70,8 +72,8 @@ function useExtraContentPadding(options) {
204 }
205
206 // Compute effective delta considering blankSpace floor
207- const previousTotal = Math.max(blankSpace.value, keyboardPadding.value + previous);
208- const currentTotal = Math.max(blankSpace.value, keyboardPadding.value + current);
209+ const previousTotal = Math.max(blankSpace.value, keyboardPadding.value + previous) + adjustedInsetCompensation;
210+ const currentTotal = Math.max(blankSpace.value, keyboardPadding.value + current) + adjustedInsetCompensation;
211 const effectiveDelta = currentTotal - previousTotal;
212 if (effectiveDelta === 0) {
213 // blankSpace absorbed the change
214@@ -90,10 +92,11 @@ function useExtraContentPadding(options) {
215 const target = Math.max(scroll.value - effectiveDelta, -currentTotal);
216 scrollToTarget(target);
217 } else {
218- const maxScroll = Math.max(size.value.height - layout.value.height + currentTotal, 0);
219- const target = Math.min(scroll.value + effectiveDelta, maxScroll);
220+ const minScroll = -adjustedStartInsetCompensation;
221+ const maxScroll = Math.max(size.value.height - layout.value.height + currentTotal, minScroll);
222+ const target = Math.max(minScroll, Math.min(scroll.value + effectiveDelta, maxScroll));
223 scrollToTarget(target);
224 }
225- }, [inverted, keyboardLiftBehavior]);
226+ }, [inverted, keyboardLiftBehavior, adjustedInsetCompensation, adjustedStartInsetCompensation]);
227 }
228 //# sourceMappingURL=index.js.map
229\ No newline at end of file
230diff --git a/lib/module/components/KeyboardChatScrollView/index.js b/lib/module/components/KeyboardChatScrollView/index.js
231index d085394..a57c2f9 100644
232--- a/lib/module/components/KeyboardChatScrollView/index.js
233+++ b/lib/module/components/KeyboardChatScrollView/index.js
234@@ -1,7 +1,7 @@
235 function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
236 import React, { forwardRef, useCallback, useMemo } from "react";
237-import { StyleSheet } from "react-native";
238-import { makeMutable, useAnimatedRef, useAnimatedStyle, useDerivedValue } from "react-native-reanimated";
239+import { Platform, StyleSheet } from "react-native";
240+import { makeMutable, runOnJS, useAnimatedReaction, useAnimatedRef, useAnimatedStyle, useDerivedValue } from "react-native-reanimated";
241 import Reanimated from "react-native-reanimated";
242 import useCombinedRef from "../hooks/useCombinedRef";
243 import ScrollViewWithBottomPadding from "../ScrollViewWithBottomPadding";
244@@ -20,9 +20,12 @@ const KeyboardChatScrollView = /*#__PURE__*/forwardRef(({
245 offset = 0,
246 extraContentPadding = ZERO_CONTENT_PADDING,
247 blankSpace = ZERO_BLANK_SPACE,
248+ adjustedInsetCompensation = 0,
249+ adjustedStartInsetCompensation = 0,
250 applyWorkaroundForContentInsetHitTestBug = false,
251 onLayout: onLayoutProp,
252 onContentSizeChange: onContentSizeChangeProp,
253+ onContentInsetChange,
254 onEndVisible,
255 ...rest
256 }, ref) => {
257@@ -44,13 +47,17 @@ const KeyboardChatScrollView = /*#__PURE__*/forwardRef(({
258 freeze: freezeSV,
259 offset,
260 blankSpace,
261- extraContentPadding
262+ extraContentPadding,
263+ adjustedInsetCompensation,
264+ adjustedStartInsetCompensation
265 });
266 useExtraContentPadding({
267 scrollViewRef,
268 extraContentPadding,
269 keyboardPadding: padding,
270 blankSpace,
271+ adjustedInsetCompensation,
272+ adjustedStartInsetCompensation,
273 scroll,
274 layout,
275 size,
276@@ -81,10 +88,26 @@ const KeyboardChatScrollView = /*#__PURE__*/forwardRef(({
277 // a bug for you, please open an issue.
278 const totalPadding = useDerivedValue(() => Math.min(layout.value.height, Math.max(blankSpace.value, padding.value + extraContentPadding.value)));
279
280+ // iOS applies the destination contentInset and contentOffset together at
281+ // keyboard-animation start. Keep that native target behavior, but report
282+ // the presentation height so virtualized-list layout follows the keyboard.
283+ const reportedPadding = useDerivedValue(() => Platform.OS === "ios" ? Math.min(layout.value.height, Math.max(blankSpace.value, currentHeight.value + extraContentPadding.value)) : totalPadding.value);
284+
285+ // Mirror the effective bottom padding (keyboard + composer + blank floor)
286+ // to the consumer - a virtualized list needs it in its own scroll math or
287+ // its end/maintain targets point at the under-the-keyboard resting offset.
288+ useAnimatedReaction(() => reportedPadding.value, (current, previous) => {
289+ if (onContentInsetChange && current !== previous) {
290+ runOnJS(onContentInsetChange)({
291+ bottom: current
292+ });
293+ }
294+ }, [onContentInsetChange]);
295+
296 // Scroll indicator inset = keyboard + extraContentPadding (excludes blankSpace).
297 // Apps that render into the unsafe area can supply a negative
298 // scrollIndicatorInsets adjustment at the application layer.
299- const indicatorPadding = useDerivedValue(() => padding.value + extraContentPadding.value);
300+ const indicatorPadding = useDerivedValue(() => padding.value);
301 const onLayout = useCallback(e => {
302 onLayoutInternal(e);
303 onLayoutProp === null || onLayoutProp === void 0 || onLayoutProp(e);
304diff --git a/lib/module/components/KeyboardChatScrollView/useChatKeyboard/helpers.js b/lib/module/components/KeyboardChatScrollView/useChatKeyboard/helpers.js
305index 295e221..2f7b87e 100644
306--- a/lib/module/components/KeyboardChatScrollView/useChatKeyboard/helpers.js
307+++ b/lib/module/components/KeyboardChatScrollView/useChatKeyboard/helpers.js
308@@ -193,7 +193,7 @@ export const clampedScrollTarget = (offsetBeforeScroll, keyboardHeight, contentH
309 * computeIOSContentOffset(100, 300, 1000, 800, false); // 400
310 * ```
311 */
312-export const computeIOSContentOffset = (relativeScroll, keyboardHeight, contentHeight, layoutHeight, inverted, totalPaddingForMaxScroll) => {
313+export const computeIOSContentOffset = (relativeScroll, keyboardHeight, contentHeight, layoutHeight, inverted, totalPaddingForMaxScroll, startInsetCompensation = 0) => {
314 "worklet";
315
316 const paddingForMax = totalPaddingForMaxScroll !== undefined ? totalPaddingForMaxScroll : keyboardHeight;
317@@ -201,7 +201,8 @@ export const computeIOSContentOffset = (relativeScroll, keyboardHeight, contentH
318 const maxScroll = Math.max(contentHeight - layoutHeight, 0);
319 return Math.max(Math.min(relativeScroll - keyboardHeight, maxScroll), -paddingForMax);
320 }
321- const maxScroll = Math.max(contentHeight - layoutHeight + paddingForMax, 0);
322- return Math.min(Math.max(keyboardHeight + relativeScroll, 0), maxScroll);
323+ const minScroll = -startInsetCompensation;
324+ const maxScroll = Math.max(contentHeight - layoutHeight + paddingForMax, minScroll);
325+ return Math.min(Math.max(keyboardHeight + relativeScroll, minScroll), maxScroll);
326 };
327 //# sourceMappingURL=helpers.js.map
328\ No newline at end of file
329diff --git a/lib/module/components/KeyboardChatScrollView/useChatKeyboard/index.ios.js b/lib/module/components/KeyboardChatScrollView/useChatKeyboard/index.ios.js
330index 407275d..19427d7 100644
331--- a/lib/module/components/KeyboardChatScrollView/useChatKeyboard/index.ios.js
332+++ b/lib/module/components/KeyboardChatScrollView/useChatKeyboard/index.ios.js
333@@ -25,7 +25,9 @@ function useChatKeyboard(scrollViewRef, options) {
334 freeze,
335 offset,
336 blankSpace,
337- extraContentPadding
338+ extraContentPadding,
339+ adjustedInsetCompensation,
340+ adjustedStartInsetCompensation
341 } = options;
342 const padding = useSharedValue(0);
343 const currentHeight = useSharedValue(0);
344@@ -52,6 +54,9 @@ function useChatKeyboard(scrollViewRef, options) {
345 targetKeyboardHeight.value = e.height;
346 }
347 const effective = getEffectiveHeight(e.height, targetKeyboardHeight.value, offset);
348+ if (e.duration === 0) {
349+ currentHeight.value = effective;
350+ }
351 const atEnd = isScrollAtEnd(scroll.value, layout.value.height, size.value.height, inverted);
352
353 // Scale minimum padding absorption by how much of it is visible.
354@@ -60,7 +65,7 @@ function useChatKeyboard(scrollViewRef, options) {
355 const visiblePadding = visibleFraction * blankSpace.value;
356 const minimumPaddingAbsorbed = Math.max(0, visiblePadding - extraContentPadding.value);
357 const scrollEffective = getScrollEffective(effective, minimumPaddingAbsorbed);
358- const actualTotalPadding = Math.max(blankSpace.value, effective + extraContentPadding.value);
359+ const actualTotalPadding = Math.max(blankSpace.value, effective + extraContentPadding.value) + adjustedInsetCompensation;
360
361 // `onInteractive` owns the native scroll offset. When its final
362 // keyboardWillHide event arrives, consume the marker so this
363@@ -80,8 +85,8 @@ function useChatKeyboard(scrollViewRef, options) {
364 const maxScroll = Math.max(size.value.height - layout.value.height, 0);
365 contentOffsetY.value = Math.max(-actualTotalPadding, Math.min(scroll.value, maxScroll));
366 } else {
367- const maxScroll = Math.max(size.value.height - layout.value.height + actualTotalPadding, 0);
368- contentOffsetY.value = Math.max(0, Math.min(scroll.value, maxScroll));
369+ const maxScroll = Math.max(size.value.height - layout.value.height + actualTotalPadding, -adjustedStartInsetCompensation);
370+ contentOffsetY.value = Math.max(-adjustedStartInsetCompensation, Math.min(scroll.value, maxScroll));
371 }
372 return;
373 }
374@@ -95,8 +100,8 @@ function useChatKeyboard(scrollViewRef, options) {
375 const maxScroll = Math.max(size.value.height - layout.value.height, 0);
376 contentOffsetY.value = Math.max(-actualTotalPadding, Math.min(scroll.value, maxScroll));
377 } else {
378- const maxScroll = Math.max(size.value.height - layout.value.height + actualTotalPadding, 0);
379- contentOffsetY.value = Math.max(0, Math.min(scroll.value, maxScroll));
380+ const maxScroll = Math.max(size.value.height - layout.value.height + actualTotalPadding, -adjustedStartInsetCompensation);
381+ contentOffsetY.value = Math.max(-adjustedStartInsetCompensation, Math.min(scroll.value, maxScroll));
382 }
383 return;
384 }
385@@ -122,17 +127,25 @@ function useChatKeyboard(scrollViewRef, options) {
386 contentOffsetY.value = scroll.value;
387 return;
388 }
389- contentOffsetY.value = computeIOSContentOffset(relativeScroll, scrollEffective, size.value.height, layout.value.height, inverted, actualTotalPadding);
390+ contentOffsetY.value = computeIOSContentOffset(relativeScroll, scrollEffective, size.value.height, layout.value.height, inverted, actualTotalPadding, adjustedStartInsetCompensation);
391 },
392- onInteractive: () => {
393+ onMove: e => {
394 "worklet";
395
396- isInteractiveDismissal.value = true;
397+ if (freeze.value) {
398+ return;
399+ }
400+ currentHeight.value = getEffectiveHeight(e.height, targetKeyboardHeight.value, offset);
401 },
402- onMove: () => {
403+ onInteractive: e => {
404 "worklet";
405
406- // iOS doesn't need per-frame updates (contentOffset handles it)
407+ isInteractiveDismissal.value = true;
408+
409+ if (freeze.value) {
410+ return;
411+ }
412+ currentHeight.value = getEffectiveHeight(e.height, targetKeyboardHeight.value, offset);
413 },
414 onEnd: e => {
415 "worklet";
416@@ -141,9 +154,10 @@ function useChatKeyboard(scrollViewRef, options) {
417 return;
418 }
419 const effective = getEffectiveHeight(e.height, targetKeyboardHeight.value, offset);
420+ currentHeight.value = effective;
421 padding.value = effective;
422 }
423- }, [inverted, keyboardLiftBehavior, offset, extraContentPadding]);
424+ }, [inverted, keyboardLiftBehavior, offset, extraContentPadding, adjustedInsetCompensation, adjustedStartInsetCompensation]);
425 return {
426 padding,
427 currentHeight,
428diff --git a/lib/module/components/KeyboardChatScrollView/useExtraContentPadding/index.js b/lib/module/components/KeyboardChatScrollView/useExtraContentPadding/index.js
429index 5885415..6e694fa 100644
430--- a/lib/module/components/KeyboardChatScrollView/useExtraContentPadding/index.js
431+++ b/lib/module/components/KeyboardChatScrollView/useExtraContentPadding/index.js
432@@ -25,6 +25,8 @@ function useExtraContentPadding(options) {
433 extraContentPadding,
434 keyboardPadding,
435 blankSpace,
436+ adjustedInsetCompensation,
437+ adjustedStartInsetCompensation,
438 scroll,
439 layout,
440 size,
441@@ -64,8 +66,8 @@ function useExtraContentPadding(options) {
442 }
443
444 // Compute effective delta considering blankSpace floor
445- const previousTotal = Math.max(blankSpace.value, keyboardPadding.value + previous);
446- const currentTotal = Math.max(blankSpace.value, keyboardPadding.value + current);
447+ const previousTotal = Math.max(blankSpace.value, keyboardPadding.value + previous) + adjustedInsetCompensation;
448+ const currentTotal = Math.max(blankSpace.value, keyboardPadding.value + current) + adjustedInsetCompensation;
449 const effectiveDelta = currentTotal - previousTotal;
450 if (effectiveDelta === 0) {
451 // blankSpace absorbed the change
452@@ -84,11 +86,12 @@ function useExtraContentPadding(options) {
453 const target = Math.max(scroll.value - effectiveDelta, -currentTotal);
454 scrollToTarget(target);
455 } else {
456- const maxScroll = Math.max(size.value.height - layout.value.height + currentTotal, 0);
457- const target = Math.min(scroll.value + effectiveDelta, maxScroll);
458+ const minScroll = -adjustedStartInsetCompensation;
459+ const maxScroll = Math.max(size.value.height - layout.value.height + currentTotal, minScroll);
460+ const target = Math.max(minScroll, Math.min(scroll.value + effectiveDelta, maxScroll));
461 scrollToTarget(target);
462 }
463- }, [inverted, keyboardLiftBehavior]);
464+ }, [inverted, keyboardLiftBehavior, adjustedInsetCompensation, adjustedStartInsetCompensation]);
465 }
466 export { useExtraContentPadding };
467 //# sourceMappingURL=index.js.map
468\ No newline at end of file
469diff --git a/lib/typescript/components/KeyboardChatScrollView/types.d.ts b/lib/typescript/components/KeyboardChatScrollView/types.d.ts
470index eba1514..6597d80 100644
471--- a/lib/typescript/components/KeyboardChatScrollView/types.d.ts
472+++ b/lib/typescript/components/KeyboardChatScrollView/types.d.ts
473@@ -88,6 +88,10 @@ export type KeyboardChatScrollViewProps = {
474 * Default is `undefined` (equivalent to `0` — no minimum floor).
475 */
476 blankSpace?: SharedValue<number>;
477+ /** Extra bottom inset UIKit adds beyond the raw contentInset (safe area). Offset math only. */
478+ adjustedInsetCompensation?: number;
479+ /** Leading inset UIKit adds outside raw contentInset. Offset math only. */
480+ adjustedStartInsetCompensation?: number;
481 /**
482 * Fires whenever the effective content inset changes — the static `contentInset`
483 * prop combined with the dynamic keyboard-driven padding.
484diff --git a/lib/typescript/components/KeyboardChatScrollView/useChatKeyboard/helpers.d.ts b/lib/typescript/components/KeyboardChatScrollView/useChatKeyboard/helpers.d.ts
485index 2b51cc4..3acec1f 100644
486--- a/lib/typescript/components/KeyboardChatScrollView/useChatKeyboard/helpers.d.ts
487+++ b/lib/typescript/components/KeyboardChatScrollView/useChatKeyboard/helpers.d.ts
488@@ -129,4 +129,4 @@ export declare const clampedScrollTarget: (offsetBeforeScroll: number, keyboardH
489 * computeIOSContentOffset(100, 300, 1000, 800, false); // 400
490 * ```
491 */
492-export declare const computeIOSContentOffset: (relativeScroll: number, keyboardHeight: number, contentHeight: number, layoutHeight: number, inverted: boolean, totalPaddingForMaxScroll?: number) => number;
493+export declare const computeIOSContentOffset: (relativeScroll: number, keyboardHeight: number, contentHeight: number, layoutHeight: number, inverted: boolean, totalPaddingForMaxScroll?: number, startInsetCompensation?: number) => number;
494diff --git a/lib/typescript/components/KeyboardChatScrollView/useChatKeyboard/types.d.ts b/lib/typescript/components/KeyboardChatScrollView/useChatKeyboard/types.d.ts
495index aff9b5a..fdd8395 100644
496--- a/lib/typescript/components/KeyboardChatScrollView/useChatKeyboard/types.d.ts
497+++ b/lib/typescript/components/KeyboardChatScrollView/useChatKeyboard/types.d.ts
498@@ -9,6 +9,10 @@ type UseChatKeyboardOptions = {
499 blankSpace: SharedValue<number>;
500 /** Extra content padding shared value — needed on iOS to correctly clamp contentOffset. */
501 extraContentPadding: SharedValue<number>;
502+ /** Safe-area extra beyond raw contentInset. Offset math only. */
503+ adjustedInsetCompensation: number;
504+ /** Leading inset UIKit adds beyond the raw contentInset. Offset math only. */
505+ adjustedStartInsetCompensation: number;
506 };
507 type UseChatKeyboardReturn = {
508 /** Extra scrollable space (= keyboard height). Used as contentInset on iOS, contentInsetBottom/contentInsetTop on Android. */
509diff --git a/lib/typescript/components/KeyboardChatScrollView/useExtraContentPadding/index.d.ts b/lib/typescript/components/KeyboardChatScrollView/useExtraContentPadding/index.d.ts
510index ec73f70..45b3874 100644
511--- a/lib/typescript/components/KeyboardChatScrollView/useExtraContentPadding/index.d.ts
512+++ b/lib/typescript/components/KeyboardChatScrollView/useExtraContentPadding/index.d.ts
513@@ -8,6 +8,10 @@ type UseExtraContentPaddingOptions = {
514 keyboardPadding: SharedValue<number>;
515 /** Minimum inset floor — used to absorb keyboard and extraContentPadding changes. */
516 blankSpace: SharedValue<number>;
517+ /** Safe-area extra beyond raw contentInset. Offset math only. */
518+ adjustedInsetCompensation: number;
519+ /** Leading inset UIKit adds beyond raw contentInset. Offset math only. */
520+ adjustedStartInsetCompensation: number;
521 /** Current vertical scroll offset. */
522 scroll: SharedValue<number>;
523 /** Visible viewport dimensions. */
524diff --git a/src/components/KeyboardChatScrollView/index.tsx b/src/components/KeyboardChatScrollView/index.tsx
525index 554b38c..725d546 100644
526--- a/src/components/KeyboardChatScrollView/index.tsx
527+++ b/src/components/KeyboardChatScrollView/index.tsx
528@@ -1,7 +1,9 @@
529 import React, { forwardRef, useCallback, useMemo } from "react";
530-import { StyleSheet } from "react-native";
531+import { Platform, StyleSheet } from "react-native";
532 import {
533 makeMutable,
534+ runOnJS,
535+ useAnimatedReaction,
536 useAnimatedRef,
537 useAnimatedStyle,
538 useDerivedValue,
539@@ -39,9 +41,12 @@ const KeyboardChatScrollView: React.ForwardRefExoticComponent<
540 offset = 0,
541 extraContentPadding = ZERO_CONTENT_PADDING,
542 blankSpace = ZERO_BLANK_SPACE,
543+ adjustedInsetCompensation = 0,
544+ adjustedStartInsetCompensation = 0,
545 applyWorkaroundForContentInsetHitTestBug = false,
546 onLayout: onLayoutProp,
547 onContentSizeChange: onContentSizeChangeProp,
548+ onContentInsetChange,
549 onEndVisible,
550 ...rest
551 },
552@@ -68,6 +73,8 @@ const KeyboardChatScrollView: React.ForwardRefExoticComponent<
553 offset,
554 blankSpace,
555 extraContentPadding,
556+ adjustedInsetCompensation,
557+ adjustedStartInsetCompensation,
558 });
559
560 useExtraContentPadding({
561@@ -75,6 +82,8 @@ const KeyboardChatScrollView: React.ForwardRefExoticComponent<
562 extraContentPadding,
563 keyboardPadding: padding,
564 blankSpace,
565+ adjustedInsetCompensation,
566+ adjustedStartInsetCompensation,
567 scroll,
568 layout,
569 size,
570@@ -112,13 +121,40 @@ const KeyboardChatScrollView: React.ForwardRefExoticComponent<
571 ),
572 );
573
574- // Scroll indicator inset = keyboard + extraContentPadding (excludes blankSpace).
575- // Apps that render into the unsafe area can supply a negative
576- // scrollIndicatorInsets adjustment at the application layer.
577- const indicatorPadding = useDerivedValue(
578- () => padding.value + extraContentPadding.value,
579+ // iOS applies the destination contentInset and contentOffset together at
580+ // keyboard-animation start. Keep that native target behavior, but report
581+ // the presentation height so virtualized-list layout follows the keyboard.
582+ const reportedPadding = useDerivedValue(() =>
583+ Platform.OS === "ios"
584+ ? Math.min(
585+ layout.value.height,
586+ Math.max(
587+ blankSpace.value,
588+ currentHeight.value + extraContentPadding.value,
589+ ),
590+ )
591+ : totalPadding.value,
592 );
593
594+ // Mirror the effective bottom padding (keyboard + composer + blank floor)
595+ // to the consumer — a virtualized list needs it in its own scroll math or
596+ // its end/maintain targets point at the under-the-keyboard resting offset.
597+ useAnimatedReaction(
598+ () => reportedPadding.value,
599+ (current, previous) => {
600+ if (onContentInsetChange && current !== previous) {
601+ runOnJS(onContentInsetChange)({ bottom: current });
602+ }
603+ },
604+ [onContentInsetChange],
605+ );
606+
607+ // Scroll indicator inset = keyboard only (excludes extraContentPadding and
608+ // blankSpace): with a floating composer the indicator track should run the
609+ // full height of the scroll view, behind the composer, like iOS Messages.
610+ // The keyboard still lifts it so it never disappears under the keyboard.
611+ const indicatorPadding = useDerivedValue(() => padding.value);
612+
613 const onLayout = useCallback(
614 (e: LayoutChangeEvent) => {
615 onLayoutInternal(e);
616diff --git a/src/components/KeyboardChatScrollView/types.ts b/src/components/KeyboardChatScrollView/types.ts
617index b7c98c8..e1012a8 100644
618--- a/src/components/KeyboardChatScrollView/types.ts
619+++ b/src/components/KeyboardChatScrollView/types.ts
620@@ -93,6 +93,17 @@ export type KeyboardChatScrollViewProps = {
621 * Default is `undefined` (equivalent to `0` — no minimum floor).
622 */
623 blankSpace?: SharedValue<number>;
624+ /**
625+ * Extra bottom inset UIKit adds on top of the raw `contentInset` this
626+ * component writes (e.g. the home-indicator safe area under
627+ * `contentInsetAdjustmentBehavior="automatic"`). Used ONLY in scroll-offset
628+ * math (max scroll / end pinning) — never written into `contentInset`.
629+ *
630+ * Default is `0`.
631+ */
632+ adjustedInsetCompensation?: number;
633+ /** Leading inset UIKit adds outside raw contentInset. Offset math only. */
634+ adjustedStartInsetCompensation?: number;
635 /**
636 * Fires whenever the effective content inset changes — the static `contentInset`
637 * prop combined with the dynamic keyboard-driven padding.
638diff --git a/src/components/KeyboardChatScrollView/useChatKeyboard/helpers.ts b/src/components/KeyboardChatScrollView/useChatKeyboard/helpers.ts
639index 37eacd1..3d77ab2 100644
640--- a/src/components/KeyboardChatScrollView/useChatKeyboard/helpers.ts
641+++ b/src/components/KeyboardChatScrollView/useChatKeyboard/helpers.ts
642@@ -245,6 +245,7 @@ export const computeIOSContentOffset = (
643 layoutHeight: number,
644 inverted: boolean,
645 totalPaddingForMaxScroll?: number,
646+ startInsetCompensation: number = 0,
647 ): number => {
648 "worklet";
649
650@@ -262,7 +263,14 @@ export const computeIOSContentOffset = (
651 );
652 }
653
654- const maxScroll = Math.max(contentHeight - layoutHeight + paddingForMax, 0);
655+ const minScroll = -startInsetCompensation;
656+ const maxScroll = Math.max(
657+ contentHeight - layoutHeight + paddingForMax,
658+ minScroll,
659+ );
660
661- return Math.min(Math.max(keyboardHeight + relativeScroll, 0), maxScroll);
662+ return Math.min(
663+ Math.max(keyboardHeight + relativeScroll, minScroll),
664+ maxScroll,
665+ );
666 };
667diff --git a/src/components/KeyboardChatScrollView/useChatKeyboard/index.ios.ts b/src/components/KeyboardChatScrollView/useChatKeyboard/index.ios.ts
668index 129a74b..168ce1a 100644
669--- a/src/components/KeyboardChatScrollView/useChatKeyboard/index.ios.ts
670+++ b/src/components/KeyboardChatScrollView/useChatKeyboard/index.ios.ts
671@@ -43,6 +43,8 @@ function useChatKeyboard(
672 offset,
673 blankSpace,
674 extraContentPadding,
675+ adjustedInsetCompensation,
676+ adjustedStartInsetCompensation,
677 } = options;
678
679 const padding = useSharedValue(0);
680@@ -80,6 +82,10 @@ function useChatKeyboard(
681 offset,
682 );
683
684+ if (e.duration === 0) {
685+ currentHeight.value = effective;
686+ }
687+
688 const atEnd = isScrollAtEnd(
689 scroll.value,
690 layout.value.height,
691@@ -105,10 +111,12 @@ function useChatKeyboard(
692 effective,
693 minimumPaddingAbsorbed,
694 );
695- const actualTotalPadding = Math.max(
696- blankSpace.value,
697- effective + extraContentPadding.value,
698- );
699+ // UIKit adds adjustedInsetCompensation (safe area) on top of the raw
700+ // inset; include it here so end/max-scroll targets match the real
701+ // resting offsets.
702+ const actualTotalPadding =
703+ Math.max(blankSpace.value, effective + extraContentPadding.value) +
704+ adjustedInsetCompensation;
705
706 // `onInteractive` owns the native scroll offset. When its final
707 // keyboardWillHide event arrives, consume the marker so this
708@@ -142,11 +150,11 @@ function useChatKeyboard(
709 } else {
710 const maxScroll = Math.max(
711 size.value.height - layout.value.height + actualTotalPadding,
712- 0,
713+ -adjustedStartInsetCompensation,
714 );
715
716 contentOffsetY.value = Math.max(
717- 0,
718+ -adjustedStartInsetCompensation,
719 Math.min(scroll.value, maxScroll),
720 );
721 }
722@@ -177,11 +185,11 @@ function useChatKeyboard(
723 } else {
724 const maxScroll = Math.max(
725 size.value.height - layout.value.height + actualTotalPadding,
726- 0,
727+ -adjustedStartInsetCompensation,
728 );
729
730 contentOffsetY.value = Math.max(
731- 0,
732+ -adjustedStartInsetCompensation,
733 Math.min(scroll.value, maxScroll),
734 );
735 }
736@@ -231,17 +239,36 @@ function useChatKeyboard(
737 layout.value.height,
738 inverted,
739 actualTotalPadding,
740+ adjustedStartInsetCompensation,
741 );
742 },
743- onInteractive: () => {
744+ onMove: (e) => {
745 "worklet";
746
747- isInteractiveDismissal.value = true;
748+ if (freeze.value) {
749+ return;
750+ }
751+
752+ currentHeight.value = getEffectiveHeight(
753+ e.height,
754+ targetKeyboardHeight.value,
755+ offset,
756+ );
757 },
758- onMove: () => {
759+ onInteractive: (e) => {
760 "worklet";
761
762- // iOS doesn't need per-frame updates (contentOffset handles it)
763+ isInteractiveDismissal.value = true;
764+
765+ if (freeze.value) {
766+ return;
767+ }
768+
769+ currentHeight.value = getEffectiveHeight(
770+ e.height,
771+ targetKeyboardHeight.value,
772+ offset,
773+ );
774 },
775 onEnd: (e) => {
776 "worklet";
777@@ -256,10 +283,18 @@ function useChatKeyboard(
778 offset,
779 );
780
781+ currentHeight.value = effective;
782 padding.value = effective;
783 },
784 },
785- [inverted, keyboardLiftBehavior, offset, extraContentPadding],
786+ [
787+ inverted,
788+ keyboardLiftBehavior,
789+ offset,
790+ extraContentPadding,
791+ adjustedInsetCompensation,
792+ adjustedStartInsetCompensation,
793+ ],
794 );
795
796 return {
797diff --git a/src/components/KeyboardChatScrollView/useChatKeyboard/types.ts b/src/components/KeyboardChatScrollView/useChatKeyboard/types.ts
798index 02abf5c..4ee0ddd 100644
799--- a/src/components/KeyboardChatScrollView/useChatKeyboard/types.ts
800+++ b/src/components/KeyboardChatScrollView/useChatKeyboard/types.ts
801@@ -11,6 +11,10 @@ type UseChatKeyboardOptions = {
802 blankSpace: SharedValue<number>;
803 /** Extra content padding shared value — needed on iOS to correctly clamp contentOffset. */
804 extraContentPadding: SharedValue<number>;
805+ /** Extra bottom inset UIKit adds beyond the raw contentInset (safe area). Offset math only. */
806+ adjustedInsetCompensation: number;
807+ /** Leading inset UIKit adds beyond the raw contentInset. Offset math only. */
808+ adjustedStartInsetCompensation: number;
809 };
810
811 type UseChatKeyboardReturn = {
812diff --git a/src/components/KeyboardChatScrollView/useExtraContentPadding/index.ts b/src/components/KeyboardChatScrollView/useExtraContentPadding/index.ts
813index c9c93f3..76a201d 100644
814--- a/src/components/KeyboardChatScrollView/useExtraContentPadding/index.ts
815+++ b/src/components/KeyboardChatScrollView/useExtraContentPadding/index.ts
816@@ -16,6 +16,10 @@ type UseExtraContentPaddingOptions = {
817 keyboardPadding: SharedValue<number>;
818 /** Minimum inset floor — used to absorb keyboard and extraContentPadding changes. */
819 blankSpace: SharedValue<number>;
820+ /** Extra bottom inset UIKit adds beyond the raw contentInset (safe area). Offset math only. */
821+ adjustedInsetCompensation: number;
822+ /** Leading inset UIKit adds beyond raw contentInset. Offset math only. */
823+ adjustedStartInsetCompensation: number;
824 /** Current vertical scroll offset. */
825 scroll: SharedValue<number>;
826 /** Visible viewport dimensions. */
827@@ -51,6 +55,8 @@ function useExtraContentPadding(options: UseExtraContentPaddingOptions): void {
828 extraContentPadding,
829 keyboardPadding,
830 blankSpace,
831+ adjustedInsetCompensation,
832+ adjustedStartInsetCompensation,
833 scroll,
834 layout,
835 size,
836@@ -99,14 +105,12 @@ function useExtraContentPadding(options: UseExtraContentPaddingOptions): void {
837 }
838
839 // Compute effective delta considering blankSpace floor
840- const previousTotal = Math.max(
841- blankSpace.value,
842- keyboardPadding.value + previous,
843- );
844- const currentTotal = Math.max(
845- blankSpace.value,
846- keyboardPadding.value + current,
847- );
848+ const previousTotal =
849+ Math.max(blankSpace.value, keyboardPadding.value + previous) +
850+ adjustedInsetCompensation;
851+ const currentTotal =
852+ Math.max(blankSpace.value, keyboardPadding.value + current) +
853+ adjustedInsetCompensation;
854 const effectiveDelta = currentTotal - previousTotal;
855
856 if (effectiveDelta === 0) {
857@@ -139,16 +143,25 @@ function useExtraContentPadding(options: UseExtraContentPaddingOptions): void {
858
859 scrollToTarget(target);
860 } else {
861+ const minScroll = -adjustedStartInsetCompensation;
862 const maxScroll = Math.max(
863 size.value.height - layout.value.height + currentTotal,
864- 0,
865+ minScroll,
866+ );
867+ const target = Math.max(
868+ minScroll,
869+ Math.min(scroll.value + effectiveDelta, maxScroll),
870 );
871- const target = Math.min(scroll.value + effectiveDelta, maxScroll);
872
873 scrollToTarget(target);
874 }
875 },
876- [inverted, keyboardLiftBehavior],
877+ [
878+ inverted,
879+ keyboardLiftBehavior,
880+ adjustedInsetCompensation,
881+ adjustedStartInsetCompensation,
882+ ],
883 );
884 }
885
patches/react-native-nitro-modules@0.35.9.patch+16
......@@ -1,3 +1,19 @@
1diff --git a/ios/turbomodule/NativeNitroModules+NewArch.mm b/ios/turbomodule/NativeNitroModules+NewArch.mm
2--- a/ios/turbomodule/NativeNitroModules+NewArch.mm
3+++ b/ios/turbomodule/NativeNitroModules+NewArch.mm
4@@ -34,6 +34,12 @@
5 }
6 RCT_EXPORT_MODULE(NitroModules)
7
8+// RN 0.87+ passes the CallInvoker directly when installing JSI bindings.
9+- (void)installJSIBindingsWithRuntime:(jsi::Runtime&)runtime callInvoker:(const std::shared_ptr<react::CallInvoker>&)callInvoker {
10+ _callInvoker = callInvoker;
11+ [self installJSIBindingsWithRuntime:runtime];
12+}
13+
14 - (void)installJSIBindingsWithRuntime:(jsi::Runtime&)runtime {
15 // 1. Get CallInvoker we cached statically
16 std::shared_ptr<react::CallInvoker> callInvoker = _callInvoker.lock();
117diff --git a/package.json b/package.json
218index 4e4366fb9d05a6c250acfc62e79487475d8ac05b..200e4680d77cbb4f14d22eb986efde1275a0d3e8 100644
319--- a/package.json
patches/react-native-reanimated@4.5.5.patch deleted-69
......@@ -1,69 +0,0 @@
1diff --git a/Common/cpp/reanimated/LayoutAnimations/LayoutAnimationsProxyCommon.h b/Common/cpp/reanimated/LayoutAnimations/LayoutAnimationsProxyCommon.h
2index 20d042b00e4655a6647eff1a9a0890fae7e45175..fd08d36fd6c1f79adcfa0dc675420e42a9815d25 100644
3--- a/Common/cpp/reanimated/LayoutAnimations/LayoutAnimationsProxyCommon.h
4+++ b/Common/cpp/reanimated/LayoutAnimations/LayoutAnimationsProxyCommon.h
5@@ -22,6 +22,7 @@ struct LayoutAnimation {
6 Tag parentTag;
7 std::optional<double> opacity;
8 bool isViewAlreadyMounted = false;
9+ bool isExitingWhenSettled = false;
10 int count = 1;
11 LayoutAnimation &operator=(const LayoutAnimation &other) = default;
12
13diff --git a/Common/cpp/reanimated/LayoutAnimations/LayoutAnimationsProxy_Experimental.cpp b/Common/cpp/reanimated/LayoutAnimations/LayoutAnimationsProxy_Experimental.cpp
14index 0f08622518910486bb724b664e0a5dd692470b18..9f71dbc301e77656ab0c5dc453ade03eea7649f8 100644
15--- a/Common/cpp/reanimated/LayoutAnimations/LayoutAnimationsProxy_Experimental.cpp
16+++ b/Common/cpp/reanimated/LayoutAnimations/LayoutAnimationsProxy_Experimental.cpp
17@@ -353,6 +353,7 @@ std::optional<SurfaceId> LayoutAnimationsProxy_Experimental::endLayoutAnimation(
18 if (--layoutAnimation.count > 0) {
19 return {};
20 }
21+ layoutAnimation.isExitingWhenSettled = shouldRemove;
22 maybeSettledAnimationTags_.insert(tag);
23 auto surfaceId = layoutAnimation.finalView.surfaceId;
24
25@@ -478,7 +479,8 @@ void LayoutAnimationsProxy_Experimental::addOngoingAnimations(SurfaceId surfaceI
26
27 const auto layoutAnimationIt = layoutAnimations_.find(tag);
28
29- if (layoutAnimationIt == layoutAnimations_.end() || layoutAnimationIt->second.isSettled()) {
30+ if (layoutAnimationIt == layoutAnimations_.end() ||
31+ (layoutAnimationIt->second.isSettled() && layoutAnimationIt->second.isExitingWhenSettled)) {
32 continue;
33 }
34
35@@ -635,6 +637,8 @@ void LayoutAnimationsProxy_Experimental::maybeCancelAnimation(const int tag) con
36 }
37 if (layoutAnimationIt->second.isSettled()) {
38 // Already settled - cleanupAnimations will erase it together with its updateMap entry.
39+ // Do not flush a pending Update after the caller queues this view for removal.
40+ layoutAnimationIt->second.isExitingWhenSettled = true;
41 return;
42 }
43 layoutAnimations_.erase(layoutAnimationIt);
44diff --git a/Common/cpp/reanimated/LayoutAnimations/LayoutAnimationsProxy_Legacy.cpp b/Common/cpp/reanimated/LayoutAnimations/LayoutAnimationsProxy_Legacy.cpp
45index f9711f4eb6185ea99e08280ff90edd45e4152e12..ca812666ca54ec55d9d4409910b21ae97c721f2f 100644
46--- a/Common/cpp/reanimated/LayoutAnimations/LayoutAnimationsProxy_Legacy.cpp
47+++ b/Common/cpp/reanimated/LayoutAnimations/LayoutAnimationsProxy_Legacy.cpp
48@@ -228,6 +228,7 @@ std::optional<SurfaceId> LayoutAnimationsProxy_Legacy::endLayoutAnimation(int ta
49 if (--layoutAnimation.count > 0) {
50 return {};
51 }
52+ layoutAnimation.isExitingWhenSettled = shouldRemove;
53 maybeSettledAnimationTags_.insert(tag);
54 auto surfaceId = layoutAnimation.finalView.surfaceId;
55
56@@ -531,12 +532,7 @@ void LayoutAnimationsProxy_Legacy::addOngoingAnimations(SurfaceId surfaceId, Sha
57 auto layoutAnimationIt = layoutAnimations_.find(tag);
58
59 if (layoutAnimationIt == layoutAnimations_.end() ||
60- // A settled animation is normally cleaned up without applying further
61- // updates. The exception is a flaky entering animation whose opacity was
62- // never restored (the view wasn't mounted in time) - we still need to
63- // apply that pending opacity, otherwise the view stays invisible. Only
64- // entering animations carry an opacity value.
65- (layoutAnimationIt->second.isSettled() && !layoutAnimationIt->second.opacity.has_value())) {
66+ (layoutAnimationIt->second.isSettled() && layoutAnimationIt->second.isExitingWhenSettled)) {
67 continue;
68 }
69
patches/react-native-screens@4.26.2.patch deleted-2226
......@@ -1,2226 +0,0 @@
1diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt
2index fa1b77317f609983ae2434764174072e51130550..270c81c90971b0ff3038b999973dd4d128a9d140 100644
3--- a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt
4+++ b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt
5@@ -124,6 +124,34 @@ class ScreenStackHeaderConfigViewManager :
6 config.setTitle(title)
7 }
8
9+ // The t3 patch adds these iOS glass-chrome props to the native spec; they have
10+ // no Android implementation, but the codegen-generated interface requires the
11+ // setters to exist. No-ops keep the Android build compiling.
12+ override fun setSubtitle(
13+ config: ScreenStackHeaderConfig,
14+ subtitle: String?,
15+ ) = Unit
16+
17+ override fun setLargeSubtitle(
18+ config: ScreenStackHeaderConfig,
19+ largeSubtitle: String?,
20+ ) = Unit
21+
22+ override fun setNavigationItemStyle(
23+ config: ScreenStackHeaderConfig,
24+ navigationItemStyle: String?,
25+ ) = Unit
26+
27+ override fun setHeaderCenterBarButtonItems(
28+ config: ScreenStackHeaderConfig,
29+ headerCenterBarButtonItems: ReadableArray?,
30+ ) = Unit
31+
32+ override fun setHeaderToolbarItems(
33+ config: ScreenStackHeaderConfig,
34+ headerToolbarItems: ReadableArray?,
35+ ) = Unit
36+
37 override fun setTitleFontFamily(
38 config: ScreenStackHeaderConfig,
39 titleFontFamily: String?,
40diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt
41index 64f14f0c5ade16eb9519b8780d4ce013f88fbd3a..6cb1d69f97a95759c662a6006a9626925d9fefd9 100644
42--- a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt
43+++ b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt
44@@ -47,6 +47,12 @@ class ScreenStackHeaderSubviewManager :
45 Log.w("[RNScreens]", "hidesSharedBackground prop is not available on Android")
46 }
47
48+ // Bar button transition identifiers only apply on iOS.
49+ override fun setIdentifier(
50+ view: ScreenStackHeaderSubview,
51+ identifier: String?,
52+ ) = Unit
53+
54 // synchronousShadowStateUpdatesEnabled is not available on Android atm,
55 // however we must override their setters
56 override fun setSynchronousShadowStateUpdatesEnabled(
57diff --git a/ios/RNSBarButtonItem.h b/ios/RNSBarButtonItem.h
58index a26d1254eafd89268f65d968988cf6a3b8c1e457..62eea42ac26c532801189556c5f51012c3df3a52 100644
59--- a/ios/RNSBarButtonItem.h
60+++ b/ios/RNSBarButtonItem.h
61@@ -15,6 +15,10 @@ typedef void (^RNSBarButtonMenuItemAction)(NSString *menuId);
62 action:(RNSBarButtonItemAction)action
63 menuAction:(RNSBarButtonMenuItemAction)menuAction
64 imageLoader:(RCTImageLoader *)imageLoader;
65+
66++ (UIMenu *)initUIMenuWithDict:(NSDictionary<NSString *, id> *)dict
67+ menuAction:(RNSBarButtonMenuItemAction)menuAction
68+ imageLoader:(RCTImageLoader *)imageLoader;
69 #endif // defined(__cplusplus)
70
71 @end
72diff --git a/ios/RNSBarButtonItem.mm b/ios/RNSBarButtonItem.mm
73index 0eb1f09dee82edd99e3e614938233db5cdeaebfe..73298f10807520970f625e166d7f5dd1338206f1 100644
74--- a/ios/RNSBarButtonItem.mm
75+++ b/ios/RNSBarButtonItem.mm
76@@ -110,6 +110,58 @@ - (instancetype)initWithConfig:(NSDictionary<NSString *, id> *)dict
77 if (dict[@"accessibilityHint"]) {
78 self.accessibilityHint = dict[@"accessibilityHint"];
79 }
80+#if !TARGET_OS_TV && RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
81+ NSNumber *glassEffectNum = dict[@"glassEffect"];
82+ if (@available(iOS 26.0, *)) {
83+ if ([glassEffectNum boolValue]) {
84+ UIButtonConfiguration *configuration = [UIButtonConfiguration glassButtonConfiguration];
85+ configuration.cornerStyle = UIButtonConfigurationCornerStyleCapsule;
86+ UIBackgroundConfiguration *background = configuration.background;
87+ background.strokeWidth = 0.0;
88+ background.strokeColor = UIColor.clearColor;
89+ configuration.background = background;
90+ configuration.contentInsets = NSDirectionalEdgeInsetsZero;
91+ if (title != nil) {
92+ configuration.title = title;
93+ }
94+
95+ UIButton *button = [UIButton buttonWithConfiguration:configuration primaryAction:nil];
96+ button.translatesAutoresizingMaskIntoConstraints = NO;
97+ button.enabled = self.enabled;
98+ button.accessibilityLabel = self.accessibilityLabel;
99+ button.accessibilityHint = self.accessibilityHint;
100+
101+ CGFloat resolvedWidth = width != nil ? width.doubleValue : 56.0;
102+ [button.widthAnchor constraintEqualToConstant:resolvedWidth].active = YES;
103+ [button.heightAnchor constraintEqualToConstant:50.0].active = YES;
104+
105+ [[self class] resolveImageFromConfig:dict
106+ imageLoader:imageLoader
107+ completionBlock:^(UIImage *img) {
108+ UIButtonConfiguration *updatedConfiguration = button.configuration;
109+ updatedConfiguration.image = img;
110+ button.configuration = updatedConfiguration;
111+ }];
112+
113+ NSDictionary *menu = dict[@"menu"];
114+ if (menu) {
115+ button.menu = [[self class] initUIMenuWithDict:menu menuAction:menuAction imageLoader:imageLoader];
116+ button.showsMenuAsPrimaryAction = YES;
117+ } else {
118+ NSString *buttonId = dict[@"buttonId"];
119+ if (buttonId && action) {
120+ UIAction *pressAction = [UIAction actionWithHandler:^(__kindof UIAction *_Nonnull sender) {
121+ action(buttonId);
122+ }];
123+ [button addAction:pressAction forControlEvents:UIControlEventTouchUpInside];
124+ }
125+ }
126+
127+ self.customView = button;
128+ return self;
129+ }
130+ }
131+#endif
132
133 #if !TARGET_OS_TV || __TV_OS_VERSION_MAX_ALLOWED >= 170000
134 if (@available(tvOS 17.0, *)) {
135diff --git a/ios/RNSScreenStackHeaderConfig.h b/ios/RNSScreenStackHeaderConfig.h
136index 8a41697223f6c4b5cb2dd6d450fc58cbb3b27536..309ba2f762068dcf452c172f7c7cbf2a55d03cb2 100644
137--- a/ios/RNSScreenStackHeaderConfig.h
138+++ b/ios/RNSScreenStackHeaderConfig.h
139@@ -23,6 +23,8 @@
140 NS_ASSUME_NONNULL_BEGIN
141
142 @property (nonatomic, retain) NSString *title;
143+@property (nonatomic, retain) NSString *subtitle;
144+@property (nonatomic, retain) NSString *largeSubtitle;
145 @property (nonatomic, retain) NSString *titleFontFamily;
146 @property (nonatomic, retain) NSNumber *titleFontSize;
147 @property (nonatomic, retain) NSString *titleFontWeight;
148@@ -47,9 +49,12 @@ NS_ASSUME_NONNULL_BEGIN
149 @property (nonatomic) BOOL backButtonInCustomView;
150 @property (nonatomic) UISemanticContentAttribute direction;
151 @property (nonatomic) UINavigationItemBackButtonDisplayMode backButtonDisplayMode;
152+@property (nonatomic) NSInteger navigationItemStyle;
153 @property (nonatomic) RNSBlurEffectStyle blurEffect;
154 @property (nonatomic, copy, nullable) NSArray<NSDictionary<NSString *, id> *> *headerRightBarButtonItems;
155 @property (nonatomic, copy, nullable) NSArray<NSDictionary<NSString *, id> *> *headerLeftBarButtonItems;
156+@property (nonatomic, copy, nullable) NSArray<NSDictionary<NSString *, id> *> *headerCenterBarButtonItems;
157+@property (nonatomic, copy, nullable) NSArray<NSDictionary<NSString *, id> *> *headerToolbarItems;
158 @property (nonatomic, readwrite) BOOL synchronousShadowStateUpdatesEnabled;
159
160 NS_ASSUME_NONNULL_END
161diff --git a/ios/RNSScreenStackHeaderConfig.mm b/ios/RNSScreenStackHeaderConfig.mm
162index 1c844846a5c66e31cfa530ca462774d2fb6bbea1..a60b96b44e85d3f4b29dc0d190b95ab60e185033 100644
163--- a/ios/RNSScreenStackHeaderConfig.mm
164+++ b/ios/RNSScreenStackHeaderConfig.mm
165@@ -24,11 +24,46 @@
166 #import "RNSSearchBar.h"
167 #import "UINavigationBar+RNSUtility.h"
168
169+#import <objc/runtime.h>
170+
171 namespace react = facebook::react;
172
173 static const NSNumber *const DEFAULT_TITLE_FONT_SIZE = @17;
174+
175+#if !TARGET_OS_TV
176+// Each placement keeps its own cache so changes to one side do not move live
177+// items on the other side into new groups during a navigation transition.
178+static char RNSAppliedLeadingHeaderItemsKey;
179+static char RNSAppliedTrailingHeaderItemsKey;
180+static char RNSAppliedCenterHeaderItemsKey;
181+
182+// Records a placement's owner and contents, returning whether they changed.
183+static BOOL RNSUpdateHeaderItemsCache(UINavigationItem *navitem, const void *key, NSArray *itemsKey)
184+{
185+ if ([objc_getAssociatedObject(navitem, key) isEqual:itemsKey]) {
186+ return NO;
187+ }
188+ objc_setAssociatedObject(navitem, key, itemsKey, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
189+ return YES;
190+}
191+#endif
192+static char RNSAppliedToolbarConfigsKey;
193 static const NSNumber *const DEFAULT_TITLE_LARGE_FONT_SIZE = @34;
194
195+static NSInteger navigationItemStyleFromCppEquivalent(
196+ react::RNSScreenStackHeaderConfigNavigationItemStyle navigationItemStyle)
197+{
198+ switch (navigationItemStyle) {
199+ case react::RNSScreenStackHeaderConfigNavigationItemStyle::Browser:
200+ return UINavigationItemStyleBrowser;
201+ case react::RNSScreenStackHeaderConfigNavigationItemStyle::Editor:
202+ return UINavigationItemStyleEditor;
203+ case react::RNSScreenStackHeaderConfigNavigationItemStyle::Navigator:
204+ default:
205+ return UINavigationItemStyleNavigator;
206+ }
207+}
208+
209 @interface RCTImageLoader (Private)
210 - (id<RCTImageCache>)imageCache;
211 @end
212@@ -46,6 +81,9 @@ + (BOOL)rnscreens_isBlankOrNull:(NSString *)string
213 @end
214
215 @interface RNSScreenStackHeaderConfig () <RCTMountingTransactionObserving>
216+#if !TARGET_OS_TV
217+- (NSArray<UIBarButtonItemGroup *> *)barButtonItemGroupsFromItems:(NSArray<UIBarButtonItem *> *)items;
218+#endif
219 @end
220
221 @implementation RNSScreenStackHeaderConfig {
222@@ -80,6 +118,7 @@ - (void)initProps
223 self.hidden = YES;
224 _reactSubviews = [NSMutableArray new];
225 _backTitleVisible = YES;
226+ _navigationItemStyle = UINavigationItemStyleNavigator;
227 _blurEffect = RNSBlurEffectStyleNone;
228 _synchronousShadowStateUpdatesEnabled = YES;
229 }
230@@ -507,6 +546,10 @@ + (void)updateViewController:(UIViewController *)vc
231
232 if (shouldHide) {
233 navitem.title = config.title;
234+ if (@available(iOS 26.0, *)) {
235+ navitem.subtitle = config.subtitle;
236+ navitem.largeSubtitle = config.largeSubtitle;
237+ }
238
239 // Setting navigation bar visibility is split to mitigate iOS 26 bug with bar button items.
240 [navctr setNavigationBarHidden:YES animated:animated];
241@@ -523,11 +566,19 @@ + (void)updateViewController:(UIViewController *)vc
242 }
243 navitem.largeTitleDisplayMode =
244 config.largeTitle ? UINavigationItemLargeTitleDisplayModeAlways : UINavigationItemLargeTitleDisplayModeNever;
245+
246+ if (@available(iOS 16.0, *)) {
247+ navitem.style = (UINavigationItemStyle)config.navigationItemStyle;
248+ }
249 #endif
250
251 UINavigationBarAppearance *appearance = [self buildAppearance:vc withConfig:config];
252 navitem.standardAppearance = appearance;
253 navitem.compactAppearance = appearance;
254+ if (@available(iOS 26.0, *)) {
255+ navitem.subtitle = config.subtitle;
256+ navitem.largeSubtitle = config.largeSubtitle;
257+ }
258
259 // appearance does not apply to the tvOS so we need to use lagacy customization
260 #if TARGET_OS_TV
261@@ -559,8 +610,6 @@ + (void)updateViewController:(UIViewController *)vc
262 navitem.leftItemsSupplementBackButton = config.backButtonInCustomView;
263 #endif
264 navitem.titleView = nil;
265- navitem.leftBarButtonItems = nil;
266- navitem.rightBarButtonItems = nil;
267
268 #if !TARGET_OS_TV
269 // We want to set navitem.searchController to nil only if we are sure
270@@ -568,22 +617,18 @@ + (void)updateViewController:(UIViewController *)vc
271 bool searchBarPresent = false;
272 #endif /* !TARGET_OS_TV */
273
274+ NSMutableArray<UIBarButtonItem *> *subviewLeftItems = [NSMutableArray array];
275+ NSMutableArray<UIBarButtonItem *> *subviewRightItems = [NSMutableArray array];
276 for (RNSScreenStackHeaderSubview *subview in config.reactSubviews) {
277 // This code should be kept in sync on Fabric with analogous switch statement in
278 // `- [RNSScreenStackHeaderConfig replaceNavigationBarViewsWithSnapshotOfSubview:]` method.
279 switch (subview.type) {
280 case RNSScreenStackHeaderSubviewTypeLeft: {
281- NSArray<UIBarButtonItem *> *currentItems = navitem.leftBarButtonItems ?: @[];
282- NSMutableArray<UIBarButtonItem *> *mutableItems = [currentItems mutableCopy];
283- [mutableItems addObject:[subview getUIBarButtonItem]];
284- navitem.leftBarButtonItems = mutableItems;
285+ [subviewLeftItems addObject:[subview getUIBarButtonItem]];
286 break;
287 }
288 case RNSScreenStackHeaderSubviewTypeRight: {
289- NSArray<UIBarButtonItem *> *currentItems = navitem.rightBarButtonItems ?: @[];
290- NSMutableArray<UIBarButtonItem *> *mutableItems = [currentItems mutableCopy];
291- [mutableItems addObject:[subview getUIBarButtonItem]];
292- navitem.rightBarButtonItems = mutableItems;
293+ [subviewRightItems addObject:[subview getUIBarButtonItem]];
294 break;
295 }
296 case RNSScreenStackHeaderSubviewTypeCenter:
297@@ -648,10 +693,479 @@ + (void)updateViewController:(UIViewController *)vc
298 // This assignment should be done after `navitem.titleView = ...` assignment (iOS 16.0 bug).
299 // See: https://github.com/software-mansion/react-native-screens/issues/1570 (comments)
300 navitem.title = config.title;
301- navitem.leftBarButtonItems = [config barButtonItemsFromConfigs:config.headerLeftBarButtonItems
302- withCurrentItems:navitem.leftBarButtonItems];
303- navitem.rightBarButtonItems = [config barButtonItemsFromConfigs:config.headerRightBarButtonItems
304- withCurrentItems:navitem.rightBarButtonItems];
305+ // Retain the config in the key so its address cannot be reused while cached.
306+ // Items capture this config's event emitter in their press handlers, so a
307+ // remounted header-config view with value-equal configs must still rebuild
308+ // instead of dispatching presses into the old config's emitter.
309+ // getUIBarButtonItem is stable for the lifetime of its React header
310+ // subview. Include those native identities in the key so React-backed
311+ // items can use the same cache without reusing a group after its view was
312+ // replaced.
313+ // A bar button item can belong to only one group. Even if the item itself
314+ // is reused, constructing a new group removes it from the old group that
315+ // UIKit may still be animating. Preserve each unchanged placement's group,
316+ // including the empty leading group beside the system back button.
317+#if !TARGET_OS_TV
318+ if (@available(iOS 16.0, *)) {
319+ NSArray *headerLeftConfigs = config.headerLeftBarButtonItems ?: @[];
320+ NSArray *headerRightConfigs = config.headerRightBarButtonItems ?: @[];
321+ NSArray *headerCenterConfigs = config.headerCenterBarButtonItems ?: @[];
322+ if (RNSUpdateHeaderItemsCache(
323+ navitem, &RNSAppliedLeadingHeaderItemsKey, @[ config, headerLeftConfigs, subviewLeftItems ])) {
324+ NSArray *items = [config barButtonItemsFromConfigs:config.headerLeftBarButtonItems
325+ withCurrentItems:subviewLeftItems
326+ navigationItem:navitem
327+ allowsSearchBarPlacement:NO];
328+ navitem.leadingItemGroups = [config barButtonItemGroupsFromItems:items];
329+ }
330+ if (RNSUpdateHeaderItemsCache(
331+ navitem, &RNSAppliedTrailingHeaderItemsKey, @[ config, headerRightConfigs, subviewRightItems ])) {
332+ NSArray *items = [config barButtonItemsFromConfigs:config.headerRightBarButtonItems
333+ withCurrentItems:subviewRightItems
334+ navigationItem:navitem
335+ allowsSearchBarPlacement:NO];
336+ navitem.trailingItemGroups = [config barButtonItemGroupsFromItems:items];
337+ }
338+ if (@available(iOS 26.0, *)) {
339+ if (RNSUpdateHeaderItemsCache(navitem, &RNSAppliedCenterHeaderItemsKey, @[ config, headerCenterConfigs ])) {
340+ NSArray *items = [config barButtonItemsFromConfigs:config.headerCenterBarButtonItems
341+ withCurrentItems:@[]
342+ navigationItem:navitem
343+ allowsSearchBarPlacement:NO];
344+ navitem.centerItemGroups = [config barButtonItemGroupsFromItems:items];
345+ }
346+ }
347+ } else
348+#endif
349+ {
350+ NSArray<UIBarButtonItem *> *leftBarButtonItems = [config barButtonItemsFromConfigs:config.headerLeftBarButtonItems
351+ withCurrentItems:subviewLeftItems
352+ navigationItem:navitem
353+ allowsSearchBarPlacement:NO];
354+ NSArray<UIBarButtonItem *> *rightBarButtonItems = [config barButtonItemsFromConfigs:config.headerRightBarButtonItems
355+ withCurrentItems:subviewRightItems
356+ navigationItem:navitem
357+ allowsSearchBarPlacement:NO];
358+ navitem.leftBarButtonItems = leftBarButtonItems;
359+ navitem.rightBarButtonItems = rightBarButtonItems;
360+ }
361+ NSDictionary<NSString *, id> *mailSearchToolbarConfig = nil;
362+ NSMutableArray<NSDictionary<NSString *, id> *> *nonMailSearchToolbarConfigs = [NSMutableArray array];
363+ for (NSDictionary<NSString *, id> *toolbarConfig in config.headerToolbarItems) {
364+ if (toolbarConfig[@"mailSearchToolbar"]) {
365+ if (mailSearchToolbarConfig == nil) {
366+ mailSearchToolbarConfig = toolbarConfig;
367+ }
368+ } else {
369+ [nonMailSearchToolbarConfigs addObject:toolbarConfig];
370+ }
371+ }
372+ NSArray<NSDictionary<NSString *, id> *> *navigationToolbarConfigs = [nonMailSearchToolbarConfigs copy];
373+ if (mailSearchToolbarConfig == nil) {
374+ for (NSDictionary<NSString *, id> *rightConfig in config.headerRightBarButtonItems) {
375+ if ([rightConfig[@"bottomMailSearchToolbar"] boolValue]) {
376+ mailSearchToolbarConfig = rightConfig;
377+ break;
378+ }
379+ }
380+ }
381+
382+ static NSInteger const RNSMailSearchToolbarViewTag = 260628;
383+ UIView *chromeHostView = vc.view;
384+ UIView *existingMailSearchToolbar = [chromeHostView viewWithTag:RNSMailSearchToolbarViewTag];
385+ if (existingMailSearchToolbar == nil) {
386+ existingMailSearchToolbar = [vc.view viewWithTag:RNSMailSearchToolbarViewTag];
387+ }
388+ // Reuse the live toolbar when nothing it was built from changed: rebuilding
389+ // replaces the fallback UISearchTextField with a fresh empty one, dropping
390+ // the user's in-progress search text and first responder on every unrelated
391+ // header update. Keyed on the config instance (the button/search blocks
392+ // capture its event emitter), the toolbar config values, and the host width
393+ // (the width constraint constant is resolved from it at build time).
394+ static char RNSAppliedMailSearchToolbarConfigKey;
395+ NSArray *mailSearchToolbarKey = mailSearchToolbarConfig != nil
396+ ? @[ @((uintptr_t)config), mailSearchToolbarConfig, @(chromeHostView.bounds.size.width) ]
397+ : nil;
398+ BOOL reuseMailSearchToolbar = existingMailSearchToolbar != nil && mailSearchToolbarKey != nil &&
399+ [objc_getAssociatedObject(existingMailSearchToolbar, &RNSAppliedMailSearchToolbarConfigKey)
400+ isEqual:mailSearchToolbarKey];
401+ if (!reuseMailSearchToolbar) {
402+ [existingMailSearchToolbar removeFromSuperview];
403+ }
404+
405+ if (mailSearchToolbarConfig != nil && !reuseMailSearchToolbar) {
406+#if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
407+ if (@available(iOS 26.0, *)) {
408+ CGFloat horizontalInset = 18.0;
409+ NSNumber *width = mailSearchToolbarConfig[@"width"];
410+ CGFloat hostWidth = chromeHostView.bounds.size.width;
411+ if (hostWidth <= 0.0) {
412+ hostWidth = vc.view.bounds.size.width;
413+ }
414+ if (hostWidth <= 0.0) {
415+ hostWidth = [UIScreen mainScreen].bounds.size.width;
416+ }
417+ CGFloat fallbackWidth = MIN(560.0, MAX(300.0, hostWidth - (horizontalInset * 2.0)));
418+ CGFloat resolvedWidth = width != nil ? width.doubleValue : fallbackWidth;
419+ if (hostWidth > 0.0) {
420+ resolvedWidth = MIN(resolvedWidth, MAX(260.0, hostWidth - 12.0));
421+ }
422+
423+ CGFloat toolbarHeight = 48.0;
424+ CGFloat toolbarRadius = toolbarHeight / 2.0;
425+ CGFloat buttonSize = toolbarHeight;
426+ CGFloat sideButtonReserve = buttonSize + 8.0;
427+ CGFloat searchFieldHeight = 42.0;
428+ CGFloat toolbarBottomSpacing = 4.0;
429+ UIFont *searchFont = [UIFont preferredFontForTextStyle:UIFontTextStyleTitle3];
430+ NSDictionary<NSAttributedStringKey, id> *placeholderAttributes = @{
431+ NSForegroundColorAttributeName : UIColor.secondaryLabelColor,
432+ NSFontAttributeName : searchFont,
433+ };
434+ UIKeyboardLayoutGuide *keyboardLayoutGuide = chromeHostView.keyboardLayoutGuide;
435+
436+ UIView *toolbarHost = [[UIView alloc] init];
437+ toolbarHost.tag = RNSMailSearchToolbarViewTag;
438+ objc_setAssociatedObject(
439+ toolbarHost,
440+ &RNSAppliedMailSearchToolbarConfigKey,
441+ mailSearchToolbarKey,
442+ OBJC_ASSOCIATION_RETAIN_NONATOMIC);
443+ toolbarHost.translatesAutoresizingMaskIntoConstraints = NO;
444+ [chromeHostView addSubview:toolbarHost];
445+ // The screen stays mounted beneath pushed routes, so its keyboard layout
446+ // guide can track a keyboard owned by another screen. Keep the toolbar at
447+ // rest unless its own search field is editing.
448+ NSLayoutConstraint *keyboardAvoidConstraint =
449+ [toolbarHost.bottomAnchor constraintEqualToAnchor:keyboardLayoutGuide.topAnchor
450+ constant:-toolbarBottomSpacing];
451+ keyboardAvoidConstraint.priority = UILayoutPriorityDefaultLow;
452+ NSLayoutConstraint *restingBottomConstraint =
453+ [toolbarHost.bottomAnchor constraintEqualToAnchor:chromeHostView.safeAreaLayoutGuide.bottomAnchor
454+ constant:-toolbarBottomSpacing];
455+ restingBottomConstraint.priority = UILayoutPriorityDefaultHigh;
456+ [NSLayoutConstraint activateConstraints:@[
457+ [toolbarHost.centerXAnchor constraintEqualToAnchor:chromeHostView.centerXAnchor],
458+ [toolbarHost.bottomAnchor constraintLessThanOrEqualToAnchor:chromeHostView.safeAreaLayoutGuide.bottomAnchor
459+ constant:-toolbarBottomSpacing],
460+ keyboardAvoidConstraint,
461+ restingBottomConstraint,
462+ [toolbarHost.widthAnchor constraintEqualToConstant:resolvedWidth],
463+ [toolbarHost.heightAnchor constraintEqualToConstant:toolbarHeight],
464+ ]];
465+ [chromeHostView bringSubviewToFront:toolbarHost];
466+
467+ UIGlassEffect *glassEffect = [UIGlassEffect effectWithStyle:UIGlassEffectStyleRegular];
468+ glassEffect.interactive = YES;
469+ UIVisualEffectView *glassView = [[UIVisualEffectView alloc] initWithEffect:glassEffect];
470+ glassView.clipsToBounds = YES;
471+ glassView.layer.cornerRadius = toolbarRadius;
472+ glassView.translatesAutoresizingMaskIntoConstraints = NO;
473+ [toolbarHost addSubview:glassView];
474+ BOOL hasFilterButton =
475+ mailSearchToolbarConfig[@"filterButtonId"] != nil || mailSearchToolbarConfig[@"filterMenu"] != nil;
476+ BOOL hasComposeButton =
477+ mailSearchToolbarConfig[@"composeButtonId"] != nil || mailSearchToolbarConfig[@"composeMenu"] != nil;
478+ CGFloat glassLeadingInset = hasFilterButton ? sideButtonReserve : 0.0;
479+ CGFloat glassTrailingInset = hasComposeButton ? -sideButtonReserve : 0.0;
480+ NSLayoutConstraint *glassLeadingConstraint =
481+ [glassView.leadingAnchor constraintEqualToAnchor:toolbarHost.leadingAnchor constant:glassLeadingInset];
482+ NSLayoutConstraint *glassTrailingConstraint =
483+ [glassView.trailingAnchor constraintEqualToAnchor:toolbarHost.trailingAnchor constant:glassTrailingInset];
484+ [NSLayoutConstraint activateConstraints:@[
485+ glassLeadingConstraint,
486+ glassTrailingConstraint,
487+ [glassView.centerYAnchor constraintEqualToAnchor:toolbarHost.centerYAnchor],
488+ [glassView.heightAnchor constraintEqualToConstant:toolbarHeight],
489+ ]];
490+
491+ void (^emitButtonPress)(NSString *) = ^(NSString *buttonId) {
492+ auto eventEmitter = std::static_pointer_cast<const facebook::react::RNSScreenStackHeaderConfigEventEmitter>(
493+ config->_eventEmitter);
494+ if (eventEmitter && buttonId) {
495+ eventEmitter->onPressHeaderBarButtonItem(
496+ facebook::react::RNSScreenStackHeaderConfigEventEmitter::OnPressHeaderBarButtonItem{
497+ .buttonId = std::string([buttonId UTF8String])});
498+ }
499+ };
500+
501+ void (^emitMenuPress)(NSString *) = ^(NSString *menuId) {
502+ auto eventEmitter = std::static_pointer_cast<const facebook::react::RNSScreenStackHeaderConfigEventEmitter>(
503+ config->_eventEmitter);
504+ if (eventEmitter && menuId) {
505+ eventEmitter->onPressHeaderBarButtonMenuItem(
506+ facebook::react::RNSScreenStackHeaderConfigEventEmitter::OnPressHeaderBarButtonMenuItem{
507+ .menuId = std::string([menuId UTF8String])});
508+ }
509+ };
510+
511+ UIButton *(^makeGlassButton)(NSString *, NSString *, NSDictionary *) =
512+ ^UIButton *(NSString *systemImageName, NSString *buttonId, NSDictionary *menuConfig) {
513+ UIButtonConfiguration *configuration = [UIButtonConfiguration glassButtonConfiguration];
514+ configuration.cornerStyle = UIButtonConfigurationCornerStyleCapsule;
515+ configuration.image = [UIImage systemImageNamed:systemImageName ?: @"circle"];
516+ configuration.baseForegroundColor = UIColor.labelColor;
517+ UIButton *button = [UIButton buttonWithConfiguration:configuration primaryAction:nil];
518+ if (menuConfig != nil) {
519+ button.menu = [RNSBarButtonItem initUIMenuWithDict:menuConfig
520+ menuAction:emitMenuPress
521+ imageLoader:config->_imageLoader];
522+ button.showsMenuAsPrimaryAction = YES;
523+ } else if (buttonId != nil) {
524+ UIAction *action = [UIAction actionWithHandler:^(__kindof UIAction *_Nonnull action) {
525+ emitButtonPress(buttonId);
526+ }];
527+ [button addAction:action forControlEvents:UIControlEventTouchUpInside];
528+ }
529+ return button;
530+ };
531+
532+ BOOL useFallbackSearchField = [mailSearchToolbarConfig[@"useFallbackSearchField"] boolValue];
533+ UISearchBar *searchBar =
534+ !useFallbackSearchField && navitem.searchController != nil ? navitem.searchController.searchBar : nil;
535+ NSString *placeholder = mailSearchToolbarConfig[@"placeholder"];
536+ UITextField *resolvedSearchTextField = nil;
537+ if (searchBar != nil) {
538+ if (placeholder != nil) {
539+ searchBar.placeholder = placeholder;
540+ }
541+ searchBar.hidden = NO;
542+ searchBar.alpha = 1.0;
543+ searchBar.userInteractionEnabled = YES;
544+ searchBar.searchBarStyle = UISearchBarStyleMinimal;
545+ searchBar.backgroundImage = [UIImage new];
546+ searchBar.searchTextField.hidden = NO;
547+ searchBar.searchTextField.alpha = 1.0;
548+ searchBar.searchTextField.backgroundColor = UIColor.clearColor;
549+ searchBar.searchTextField.font = searchFont;
550+ searchBar.searchTextField.adjustsFontForContentSizeCategory = YES;
551+ searchBar.searchTextField.textColor = UIColor.labelColor;
552+ searchBar.searchTextField.tintColor = UIColor.labelColor;
553+ resolvedSearchTextField = searchBar.searchTextField;
554+ if (placeholder != nil) {
555+ searchBar.searchTextField.attributedPlaceholder =
556+ [[NSAttributedString alloc] initWithString:placeholder attributes:placeholderAttributes];
557+ }
558+ searchBar.translatesAutoresizingMaskIntoConstraints = NO;
559+ [glassView.contentView addSubview:searchBar];
560+ [NSLayoutConstraint activateConstraints:@[
561+ [searchBar.leadingAnchor constraintEqualToAnchor:glassView.contentView.leadingAnchor constant:8.0],
562+ [searchBar.trailingAnchor constraintEqualToAnchor:glassView.contentView.trailingAnchor constant:-8.0],
563+ [searchBar.centerYAnchor constraintEqualToAnchor:glassView.contentView.centerYAnchor],
564+ [searchBar.heightAnchor constraintEqualToConstant:searchFieldHeight],
565+ ]];
566+ } else {
567+ UISearchTextField *searchField = [UISearchTextField new];
568+ if (placeholder != nil) {
569+ searchField.placeholder = placeholder;
570+ searchField.attributedPlaceholder =
571+ [[NSAttributedString alloc] initWithString:placeholder attributes:placeholderAttributes];
572+ }
573+ searchField.borderStyle = UITextBorderStyleNone;
574+ searchField.font = searchFont;
575+ searchField.adjustsFontForContentSizeCategory = YES;
576+ searchField.textColor = UIColor.labelColor;
577+ searchField.tintColor = UIColor.labelColor;
578+ resolvedSearchTextField = searchField;
579+ searchField.translatesAutoresizingMaskIntoConstraints = NO;
580+ [glassView.contentView addSubview:searchField];
581+ [NSLayoutConstraint activateConstraints:@[
582+ [searchField.leadingAnchor constraintEqualToAnchor:glassView.contentView.leadingAnchor constant:14.0],
583+ [searchField.trailingAnchor constraintEqualToAnchor:glassView.contentView.trailingAnchor constant:-14.0],
584+ [searchField.centerYAnchor constraintEqualToAnchor:glassView.contentView.centerYAnchor],
585+ [searchField.heightAnchor constraintEqualToConstant:searchFieldHeight],
586+ ]];
587+ }
588+
589+ // A bare UISearchTextField keeps UITextField defaults (sentence
590+ // capitalization, autocorrect), unlike UISearchBar. Search queries are
591+ // identifiers, so match the autoCapitalize "none" the JS fallbacks use.
592+ if (resolvedSearchTextField != nil) {
593+ resolvedSearchTextField.autocapitalizationType = UITextAutocapitalizationTypeNone;
594+ resolvedSearchTextField.autocorrectionType = UITextAutocorrectionTypeNo;
595+ resolvedSearchTextField.spellCheckingType = UITextSpellCheckingTypeNo;
596+ }
597+
598+ NSString *searchTextChangeId = mailSearchToolbarConfig[@"searchTextChangeId"];
599+ NSString *searchTextChangeActionIdentifier = @"org.react-native-screens.mail-search-toolbar.text-change";
600+ if (resolvedSearchTextField != nil) {
601+ [resolvedSearchTextField removeActionForIdentifier:searchTextChangeActionIdentifier
602+ forControlEvents:UIControlEventEditingChanged];
603+ }
604+ if (searchTextChangeId != nil && resolvedSearchTextField != nil) {
605+ [resolvedSearchTextField
606+ addAction:[UIAction actionWithTitle:@""
607+ image:nil
608+ identifier:searchTextChangeActionIdentifier
609+ handler:^(__kindof UIAction *_Nonnull action) {
610+ UITextField *field = (UITextField *)action.sender;
611+ emitButtonPress(
612+ [NSString stringWithFormat:@"%@:%@", searchTextChangeId, field.text ?: @""]);
613+ }]
614+ forControlEvents:UIControlEventEditingChanged];
615+ }
616+
617+ UIButton *filterButton = nil;
618+ if (hasFilterButton) {
619+ filterButton = makeGlassButton(
620+ mailSearchToolbarConfig[@"filterSystemImageName"] ?: @"line.3.horizontal.decrease",
621+ mailSearchToolbarConfig[@"filterButtonId"],
622+ mailSearchToolbarConfig[@"filterMenu"]);
623+ filterButton.translatesAutoresizingMaskIntoConstraints = NO;
624+ [toolbarHost addSubview:filterButton];
625+ [NSLayoutConstraint activateConstraints:@[
626+ [filterButton.leadingAnchor constraintEqualToAnchor:toolbarHost.leadingAnchor],
627+ [filterButton.centerYAnchor constraintEqualToAnchor:toolbarHost.centerYAnchor],
628+ [filterButton.widthAnchor constraintEqualToConstant:buttonSize],
629+ [filterButton.heightAnchor constraintEqualToConstant:buttonSize],
630+ ]];
631+ }
632+
633+ UIButton *composeButton = nil;
634+ if (hasComposeButton) {
635+ composeButton = makeGlassButton(
636+ mailSearchToolbarConfig[@"composeSystemImageName"] ?: @"square.and.pencil",
637+ mailSearchToolbarConfig[@"composeButtonId"],
638+ mailSearchToolbarConfig[@"composeMenu"]);
639+ composeButton.translatesAutoresizingMaskIntoConstraints = NO;
640+ [toolbarHost addSubview:composeButton];
641+ [NSLayoutConstraint activateConstraints:@[
642+ [composeButton.trailingAnchor constraintEqualToAnchor:toolbarHost.trailingAnchor],
643+ [composeButton.centerYAnchor constraintEqualToAnchor:toolbarHost.centerYAnchor],
644+ [composeButton.widthAnchor constraintEqualToConstant:buttonSize],
645+ [composeButton.heightAnchor constraintEqualToConstant:buttonSize],
646+ ]];
647+ }
648+
649+ BOOL showsSearchDismissButton =
650+ [mailSearchToolbarConfig[@"showsSearchDismissButton"] boolValue] && resolvedSearchTextField != nil;
651+ UIButton *searchDismissButton = nil;
652+ if (showsSearchDismissButton) {
653+ searchDismissButton = makeGlassButton(@"xmark", nil, nil);
654+ searchDismissButton.accessibilityLabel = @"Dismiss search keyboard";
655+ searchDismissButton.alpha = 0.0;
656+ searchDismissButton.hidden = YES;
657+ searchDismissButton.translatesAutoresizingMaskIntoConstraints = NO;
658+ [toolbarHost addSubview:searchDismissButton];
659+ [NSLayoutConstraint activateConstraints:@[
660+ [searchDismissButton.trailingAnchor constraintEqualToAnchor:toolbarHost.trailingAnchor],
661+ [searchDismissButton.centerYAnchor constraintEqualToAnchor:toolbarHost.centerYAnchor],
662+ [searchDismissButton.widthAnchor constraintEqualToConstant:buttonSize],
663+ [searchDismissButton.heightAnchor constraintEqualToConstant:buttonSize],
664+ ]];
665+ __weak UITextField *weakSearchTextField = resolvedSearchTextField;
666+ [searchDismissButton
667+ addAction:[UIAction actionWithHandler:^(__kindof UIAction *_Nonnull action) {
668+ [weakSearchTextField resignFirstResponder];
669+ }]
670+ forControlEvents:UIControlEventTouchUpInside];
671+ }
672+
673+ __weak UIButton *weakFilterButton = filterButton;
674+ __weak UIButton *weakComposeButton = composeButton;
675+ __weak UIButton *weakSearchDismissButton = searchDismissButton;
676+ __weak NSLayoutConstraint *weakGlassLeadingConstraint = glassLeadingConstraint;
677+ __weak NSLayoutConstraint *weakGlassTrailingConstraint = glassTrailingConstraint;
678+ __weak NSLayoutConstraint *weakKeyboardAvoidConstraint = keyboardAvoidConstraint;
679+ __weak NSLayoutConstraint *weakRestingBottomConstraint = restingBottomConstraint;
680+ __weak UIView *weakToolbarHost = toolbarHost;
681+ __weak UITextField *weakSearchTextField = resolvedSearchTextField;
682+ void (^setSearchEditingAppearance)(BOOL, BOOL) = ^(BOOL isEditing, BOOL animated) {
683+ weakKeyboardAvoidConstraint.priority =
684+ isEditing ? UILayoutPriorityDefaultHigh : UILayoutPriorityDefaultLow;
685+ weakRestingBottomConstraint.priority =
686+ isEditing ? UILayoutPriorityDefaultLow : UILayoutPriorityDefaultHigh;
687+
688+ if (showsSearchDismissButton) {
689+ if (isEditing) {
690+ weakSearchDismissButton.hidden = NO;
691+ } else {
692+ weakFilterButton.hidden = NO;
693+ weakComposeButton.hidden = NO;
694+ }
695+ weakGlassLeadingConstraint.constant = isEditing ? 0.0 : glassLeadingInset;
696+ weakGlassTrailingConstraint.constant = isEditing ? -sideButtonReserve : glassTrailingInset;
697+
698+ void (^changes)(void) = ^{
699+ weakFilterButton.alpha = isEditing ? 0.0 : 1.0;
700+ weakComposeButton.alpha = isEditing ? 0.0 : 1.0;
701+ weakSearchDismissButton.alpha = isEditing ? 1.0 : 0.0;
702+ [weakToolbarHost layoutIfNeeded];
703+ };
704+ void (^completion)(BOOL) = ^(BOOL finished) {
705+ if (!finished || weakSearchTextField.isFirstResponder != isEditing) {
706+ return;
707+ }
708+ weakFilterButton.hidden = isEditing;
709+ weakComposeButton.hidden = isEditing;
710+ weakSearchDismissButton.hidden = !isEditing;
711+ };
712+ if (animated) {
713+ [UIView animateWithDuration:0.2
714+ delay:0.0
715+ options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionCurveEaseInOut
716+ animations:changes
717+ completion:completion];
718+ } else {
719+ changes();
720+ completion(YES);
721+ }
722+ }
723+ [weakToolbarHost setNeedsLayout];
724+ };
725+
726+ setSearchEditingAppearance(resolvedSearchTextField.isFirstResponder, NO);
727+ NSString *beginActionIdentifier = @"org.react-native-screens.mail-search-toolbar.keyboard-begin";
728+ NSString *endActionIdentifier = @"org.react-native-screens.mail-search-toolbar.keyboard-end";
729+ [resolvedSearchTextField removeActionForIdentifier:beginActionIdentifier
730+ forControlEvents:UIControlEventEditingDidBegin];
731+ [resolvedSearchTextField removeActionForIdentifier:endActionIdentifier
732+ forControlEvents:UIControlEventEditingDidEnd];
733+ [resolvedSearchTextField
734+ addAction:[UIAction actionWithTitle:@""
735+ image:nil
736+ identifier:beginActionIdentifier
737+ handler:^(__kindof UIAction *_Nonnull action) {
738+ setSearchEditingAppearance(YES, YES);
739+ }]
740+ forControlEvents:UIControlEventEditingDidBegin];
741+ [resolvedSearchTextField
742+ addAction:[UIAction actionWithTitle:@""
743+ image:nil
744+ identifier:endActionIdentifier
745+ handler:^(__kindof UIAction *_Nonnull action) {
746+ setSearchEditingAppearance(NO, YES);
747+ }]
748+ forControlEvents:UIControlEventEditingDidEnd];
749+ }
750+#endif
751+ }
752+
753+ NSArray *toolbarConfigsKey = navigationToolbarConfigs ?: @[];
754+ // Same reuse rule as the header item groups above (including the config
755+ // identity — cached toolbar items capture this config's event emitter).
756+ // The top-view-controller and hidden-state checks scope the skip to
757+ // same-screen refreshes, so transitions between screens with different
758+ // toolbars still reapply.
759+ NSArray *toolbarCacheKey = @[ @((uintptr_t)config), toolbarConfigsKey ];
760+ BOOL reuseToolbarItems = navctr.topViewController == vc &&
761+ navctr.isToolbarHidden == (toolbarConfigsKey.count == 0) &&
762+ [objc_getAssociatedObject(navitem, &RNSAppliedToolbarConfigsKey) isEqual:toolbarCacheKey];
763+ if (!reuseToolbarItems) {
764+ NSArray<UIBarButtonItem *> *toolbarItems = [config barButtonItemsFromConfigs:navigationToolbarConfigs
765+ withCurrentItems:@[]
766+ navigationItem:navitem
767+ allowsSearchBarPlacement:YES];
768+ if (toolbarItems.count > 0) {
769+ vc.toolbarItems = toolbarItems;
770+ [navctr setToolbarHidden:NO animated:animated];
771+ } else {
772+ vc.toolbarItems = nil;
773+ [navctr setToolbarHidden:YES animated:animated];
774+ }
775+ objc_setAssociatedObject(
776+ navitem, &RNSAppliedToolbarConfigsKey, toolbarCacheKey, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
777+ }
778
779 // Setting navigation bar visibility is split to mitigate iOS 26 bug with bar button items
780 // (setting nav bar visibility should be done after `navitem.*BarButtonItems`).
781@@ -784,6 +1289,8 @@ - (void)applySemanticContentAttributeIfNeededToNavCtrl:(UINavigationController *
782
783 - (NSArray<UIBarButtonItem *> *)barButtonItemsFromConfigs:(NSArray<NSDictionary<NSString *, id> *> *)dicts
784 withCurrentItems:(NSArray<UIBarButtonItem *> *)currentItems
785+ navigationItem:(UINavigationItem *)navitem
786+ allowsSearchBarPlacement:(BOOL)allowsSearchBarPlacement
787 {
788 if (dicts.count == 0) {
789 return currentItems;
790@@ -792,7 +1299,200 @@ - (void)applySemanticContentAttributeIfNeededToNavCtrl:(UINavigationController *
791 [items addObjectsFromArray:currentItems];
792 for (NSUInteger i = 0; i < dicts.count; i++) {
793 NSDictionary *dict = dicts[i];
794- if (dict[@"buttonId"] || dict[@"menu"]) {
795+ if (dict[@"mailSearchToolbar"]) {
796+#if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
797+ if (@available(iOS 26.0, *)) {
798+ NSNumber *width = dict[@"width"];
799+ CGFloat resolvedWidth = width != nil ? width.doubleValue : MAX(320.0, [UIScreen mainScreen].bounds.size.width - 56.0);
800+ CGFloat resolvedHeight = 58.0;
801+ UIView *container = [[UIView alloc] initWithFrame:CGRectMake(0, 0, resolvedWidth, resolvedHeight)];
802+ container.translatesAutoresizingMaskIntoConstraints = NO;
803+ [container.widthAnchor constraintEqualToConstant:resolvedWidth].active = YES;
804+ [container.heightAnchor constraintEqualToConstant:resolvedHeight].active = YES;
805+
806+ UIStackView *stackView = [[UIStackView alloc] initWithFrame:container.bounds];
807+ stackView.axis = UILayoutConstraintAxisHorizontal;
808+ stackView.alignment = UIStackViewAlignmentCenter;
809+ stackView.distribution = UIStackViewDistributionFill;
810+ stackView.spacing = 10.0;
811+ stackView.translatesAutoresizingMaskIntoConstraints = NO;
812+ [container addSubview:stackView];
813+ [NSLayoutConstraint activateConstraints:@[
814+ [stackView.leadingAnchor constraintEqualToAnchor:container.leadingAnchor],
815+ [stackView.trailingAnchor constraintEqualToAnchor:container.trailingAnchor],
816+ [stackView.centerYAnchor constraintEqualToAnchor:container.centerYAnchor],
817+ [stackView.heightAnchor constraintEqualToConstant:50.0],
818+ ]];
819+
820+ void (^emitButtonPress)(NSString *) = ^(NSString *buttonId) {
821+ auto eventEmitter = std::static_pointer_cast<const facebook::react::RNSScreenStackHeaderConfigEventEmitter>(
822+ self->_eventEmitter);
823+ if (eventEmitter && buttonId) {
824+ eventEmitter->onPressHeaderBarButtonItem(
825+ facebook::react::RNSScreenStackHeaderConfigEventEmitter::OnPressHeaderBarButtonItem{
826+ .buttonId = std::string([buttonId UTF8String])});
827+ }
828+ };
829+
830+ void (^emitMenuPress)(NSString *) = ^(NSString *menuId) {
831+ auto eventEmitter = std::static_pointer_cast<const facebook::react::RNSScreenStackHeaderConfigEventEmitter>(
832+ self->_eventEmitter);
833+ if (eventEmitter && menuId) {
834+ eventEmitter->onPressHeaderBarButtonMenuItem(
835+ facebook::react::RNSScreenStackHeaderConfigEventEmitter::OnPressHeaderBarButtonMenuItem{
836+ .menuId = std::string([menuId UTF8String])});
837+ }
838+ };
839+
840+ UIButton *(^makeGlassButton)(NSString *, NSString *, NSDictionary *) =
841+ ^UIButton *(NSString *systemImageName, NSString *buttonId, NSDictionary *menuConfig) {
842+ UIButtonConfiguration *configuration = [UIButtonConfiguration glassButtonConfiguration];
843+ configuration.cornerStyle = UIButtonConfigurationCornerStyleCapsule;
844+ configuration.image = [UIImage systemImageNamed:systemImageName ?: @"circle"];
845+
846+ UIButton *button = [UIButton buttonWithConfiguration:configuration primaryAction:nil];
847+ button.translatesAutoresizingMaskIntoConstraints = NO;
848+ [button.widthAnchor constraintEqualToConstant:58.0].active = YES;
849+ [button.heightAnchor constraintEqualToConstant:50.0].active = YES;
850+ if (menuConfig != nil) {
851+ button.menu = [RNSBarButtonItem initUIMenuWithDict:menuConfig
852+ menuAction:emitMenuPress
853+ imageLoader:self->_imageLoader];
854+ button.showsMenuAsPrimaryAction = YES;
855+ } else if (buttonId != nil) {
856+ UIAction *action = [UIAction actionWithHandler:^(__kindof UIAction *_Nonnull action) {
857+ emitButtonPress(buttonId);
858+ }];
859+ [button addAction:action forControlEvents:UIControlEventTouchUpInside];
860+ }
861+ return button;
862+ };
863+
864+ BOOL hasFilterButton = dict[@"filterButtonId"] != nil || dict[@"filterMenu"] != nil;
865+ BOOL hasComposeButton = dict[@"composeButtonId"] != nil || dict[@"composeMenu"] != nil;
866+
867+ if (hasFilterButton) {
868+ UIButton *filterButton = makeGlassButton(
869+ dict[@"filterSystemImageName"] ?: @"line.3.horizontal.decrease",
870+ dict[@"filterButtonId"],
871+ dict[@"filterMenu"]);
872+ [stackView addArrangedSubview:filterButton];
873+ }
874+
875+ UISearchBar *searchBar = navitem.searchController != nil ? navitem.searchController.searchBar : [UISearchBar new];
876+ NSString *placeholder = dict[@"placeholder"];
877+ if (placeholder != nil) {
878+ searchBar.placeholder = placeholder;
879+ }
880+ searchBar.searchBarStyle = UISearchBarStyleMinimal;
881+ searchBar.translatesAutoresizingMaskIntoConstraints = NO;
882+ [searchBar.heightAnchor constraintEqualToConstant:50.0].active = YES;
883+ [stackView addArrangedSubview:searchBar];
884+
885+ if (hasComposeButton) {
886+ UIButton *composeButton = makeGlassButton(
887+ dict[@"composeSystemImageName"] ?: @"square.and.pencil",
888+ dict[@"composeButtonId"],
889+ dict[@"composeMenu"]);
890+ [stackView addArrangedSubview:composeButton];
891+ }
892+
893+ UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:container];
894+ [items addObject:item];
895+ }
896+#endif
897+ } else if (dict[@"searchField"]) {
898+#if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
899+ if (@available(iOS 26.0, *)) {
900+ NSNumber *width = dict[@"width"];
901+ CGFloat resolvedWidth = width != nil ? width.doubleValue : 280.0;
902+ UIView *container = [[UIView alloc] initWithFrame:CGRectMake(0, 0, resolvedWidth, 44.0)];
903+ container.translatesAutoresizingMaskIntoConstraints = NO;
904+ [container.widthAnchor constraintEqualToConstant:resolvedWidth].active = YES;
905+ [container.heightAnchor constraintEqualToConstant:44.0].active = YES;
906+
907+ UISearchTextField *searchField = [UISearchTextField new];
908+ NSString *placeholder = dict[@"placeholder"];
909+ if (placeholder != nil) {
910+ searchField.placeholder = placeholder;
911+ }
912+ searchField.translatesAutoresizingMaskIntoConstraints = NO;
913+ [container addSubview:searchField];
914+ [NSLayoutConstraint activateConstraints:@[
915+ [searchField.leadingAnchor constraintEqualToAnchor:container.leadingAnchor],
916+ [searchField.trailingAnchor constraintEqualToAnchor:container.trailingAnchor],
917+ [searchField.centerYAnchor constraintEqualToAnchor:container.centerYAnchor],
918+ [searchField.heightAnchor constraintEqualToConstant:40.0],
919+ ]];
920+
921+ UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:container];
922+ [items addObject:item];
923+ }
924+#endif
925+ } else if (dict[@"searchBarPlacement"]) {
926+ if (!allowsSearchBarPlacement) {
927+ continue;
928+ }
929+#if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
930+ if (@available(iOS 26.0, *)) {
931+ NSNumber *width = dict[@"width"];
932+ UIBarButtonItem *item = nil;
933+ if ([dict[@"activatesSearchController"] boolValue]) {
934+ UIButtonConfiguration *configuration = [UIButtonConfiguration glassButtonConfiguration];
935+ configuration.cornerStyle = UIButtonConfigurationCornerStyleCapsule;
936+ configuration.image = [UIImage systemImageNamed:@"magnifyingglass"];
937+ configuration.baseForegroundColor = UIColor.labelColor;
938+ UIButton *button = [UIButton buttonWithConfiguration:configuration primaryAction:nil];
939+ button.translatesAutoresizingMaskIntoConstraints = NO;
940+ [button.widthAnchor constraintEqualToConstant:56.0].active = YES;
941+ [button.heightAnchor constraintEqualToConstant:56.0].active = YES;
942+ UIAction *action = [UIAction actionWithHandler:^(__kindof UIAction *_Nonnull action) {
943+ if (navitem.searchController != nil) {
944+ [navitem.searchController setActive:YES];
945+ [navitem.searchController.searchBar becomeFirstResponder];
946+ }
947+ }];
948+ [button addAction:action forControlEvents:UIControlEventTouchUpInside];
949+ item = [[UIBarButtonItem alloc] initWithCustomView:button];
950+ } else if ([dict[@"customView"] boolValue] && navitem.searchController != nil) {
951+ UISearchBar *searchBar = navitem.searchController.searchBar;
952+ CGFloat resolvedWidth = width != nil ? width.doubleValue : searchBar.frame.size.width;
953+ CGFloat resolvedHeight = searchBar.frame.size.height > 0 ? searchBar.frame.size.height : 44.0;
954+ UIView *container = [[UIView alloc] initWithFrame:CGRectMake(0, 0, resolvedWidth, resolvedHeight)];
955+ container.translatesAutoresizingMaskIntoConstraints = NO;
956+ [container.widthAnchor constraintEqualToConstant:resolvedWidth].active = YES;
957+ [container.heightAnchor constraintEqualToConstant:resolvedHeight].active = YES;
958+ searchBar.frame = container.bounds;
959+ searchBar.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
960+ [container addSubview:searchBar];
961+ item = [[UIBarButtonItem alloc] initWithCustomView:container];
962+ } else {
963+ item = navitem.searchBarPlacementBarButtonItem;
964+ if (width != nil) {
965+ item.width = width.doubleValue;
966+ }
967+ }
968+ NSNumber *index = dict[@"index"];
969+#if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
970+ if (@available(iOS 26.0, *)) {
971+ NSNumber *sharesBackground = dict[@"sharesBackground"];
972+ if (sharesBackground != nil) {
973+ item.sharesBackground = sharesBackground.boolValue;
974+ }
975+ NSNumber *hidesSharedBackground = dict[@"hidesSharedBackground"];
976+ if (hidesSharedBackground != nil) {
977+ item.hidesSharedBackground = hidesSharedBackground.boolValue;
978+ }
979+ }
980+#endif
981+ if (index != nil && index.integerValue >= 0 && index.integerValue < items.count) {
982+ [items insertObject:item atIndex:index.integerValue];
983+ } else {
984+ [items addObject:item];
985+ }
986+ }
987+#endif
988+ } else if (dict[@"buttonId"] || dict[@"menu"]) {
989 RNSBarButtonItem *item = [[RNSBarButtonItem alloc] initWithConfig:dict
990 action:^(NSString *buttonId) {
991 auto eventEmitter = std::static_pointer_cast<const facebook::react::RNSScreenStackHeaderConfigEventEmitter>(
992@@ -814,19 +1514,23 @@ - (void)applySemanticContentAttributeIfNeededToNavCtrl:(UINavigationController *
993 }
994 imageLoader:_imageLoader];
995 NSNumber *index = dict[@"index"];
996- if (index.integerValue < items.count) {
997+ if (index != nil && index.integerValue >= 0 && index.integerValue < items.count) {
998 [items insertObject:item atIndex:index.integerValue];
999 } else {
1000 [items addObject:item];
1001 }
1002 } else if (dict[@"spacing"]) {
1003- UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
1004- target:nil
1005- action:nil];
1006+ BOOL flexible = [dict[@"flexible"] boolValue];
1007+ UIBarButtonItem *item = [[UIBarButtonItem alloc]
1008+ initWithBarButtonSystemItem:(flexible ? UIBarButtonSystemItemFlexibleSpace : UIBarButtonSystemItemFixedSpace)
1009+ target:nil
1010+ action:nil];
1011 NSNumber *spacingValue = dict[@"spacing"];
1012- item.width = [spacingValue doubleValue];
1013+ if (!flexible) {
1014+ item.width = [spacingValue doubleValue];
1015+ }
1016 NSNumber *index = dict[@"index"];
1017- if (index.integerValue < items.count) {
1018+ if (index != nil && index.integerValue >= 0 && index.integerValue < items.count) {
1019 [items insertObject:item atIndex:index.integerValue];
1020 } else {
1021 [items addObject:item];
1022@@ -836,6 +1540,47 @@ - (void)applySemanticContentAttributeIfNeededToNavCtrl:(UINavigationController *
1023 return items;
1024 }
1025
1026+#if !TARGET_OS_TV
1027+- (NSArray<UIBarButtonItemGroup *> *)barButtonItemGroupsFromItems:(NSArray<UIBarButtonItem *> *)items
1028+{
1029+ if (items.count == 0) {
1030+ return @[];
1031+ }
1032+
1033+ NSMutableArray<UIBarButtonItemGroup *> *groups = [NSMutableArray array];
1034+ NSMutableArray<UIBarButtonItem *> *sharedRun = [NSMutableArray array];
1035+
1036+ void (^flushSharedRun)(void) = ^{
1037+ if (sharedRun.count == 0) {
1038+ return;
1039+ }
1040+ [groups addObject:[UIBarButtonItemGroup fixedGroupWithRepresentativeItem:nil
1041+ items:[sharedRun copy]]];
1042+ [sharedRun removeAllObjects];
1043+ };
1044+
1045+ for (UIBarButtonItem *item in items) {
1046+ BOOL shouldShareBackground = NO;
1047+#if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
1048+ if (@available(iOS 26.0, *)) {
1049+ shouldShareBackground = item.sharesBackground && !item.hidesSharedBackground;
1050+ }
1051+#endif
1052+
1053+ if (shouldShareBackground) {
1054+ [sharedRun addObject:item];
1055+ continue;
1056+ }
1057+
1058+ flushSharedRun();
1059+ [groups addObject:[UIBarButtonItemGroup fixedGroupWithRepresentativeItem:nil items:@[ item ]]];
1060+ }
1061+
1062+ flushSharedRun();
1063+ return groups;
1064+}
1065+#endif
1066+
1067 RNS_IGNORE_SUPER_CALL_BEGIN
1068 - (void)insertReactSubview:(RNSScreenStackHeaderSubview *)subview atIndex:(NSInteger)atIndex
1069 {
1070@@ -1023,6 +1768,8 @@ - (void)updateProps:(react::Props::Shared const &)props oldProps:(react::Props::
1071 }
1072
1073 _title = RCTNSStringFromStringNilIfEmpty(newScreenProps.title);
1074+ _subtitle = RCTNSStringFromStringNilIfEmpty(newScreenProps.subtitle);
1075+ _largeSubtitle = RCTNSStringFromStringNilIfEmpty(newScreenProps.largeSubtitle);
1076 if (newScreenProps.titleFontFamily != oldScreenProps.titleFontFamily) {
1077 _titleFontFamily = RCTNSStringFromStringNilIfEmpty(newScreenProps.titleFontFamily);
1078 }
1079@@ -1048,6 +1795,7 @@ - (void)updateProps:(react::Props::Shared const &)props oldProps:(react::Props::
1080 _disableBackButtonMenu = newScreenProps.disableBackButtonMenu;
1081 _backButtonDisplayMode =
1082 [RNSConvert UINavigationItemBackButtonDisplayModeFromCppEquivalent:newScreenProps.backButtonDisplayMode];
1083+ _navigationItemStyle = navigationItemStyleFromCppEquivalent(newScreenProps.navigationItemStyle);
1084
1085 if (newScreenProps.userInterfaceStyle != oldScreenProps.userInterfaceStyle) {
1086 _userInterfaceStyle = [RNSConvert UIUserInterfaceStyleFromCppEquivalent:newScreenProps.userInterfaceStyle];
1087@@ -1094,6 +1842,30 @@ - (void)updateProps:(react::Props::Shared const &)props oldProps:(react::Props::
1088 _headerRightBarButtonItems = array;
1089 }
1090
1091+ if (newScreenProps.headerCenterBarButtonItems != oldScreenProps.headerCenterBarButtonItems) {
1092+ const auto &vec = newScreenProps.headerCenterBarButtonItems;
1093+ NSMutableArray<NSDictionary<NSString *, id> *> *array = [NSMutableArray arrayWithCapacity:vec.size()];
1094+ for (const auto &item : vec) {
1095+ NSDictionary *dict = [RNSConvert idFromFollyDynamic:item];
1096+ if ([dict isKindOfClass:[NSDictionary class]]) {
1097+ [array addObject:dict];
1098+ }
1099+ }
1100+ _headerCenterBarButtonItems = array;
1101+ }
1102+
1103+ if (newScreenProps.headerToolbarItems != oldScreenProps.headerToolbarItems) {
1104+ const auto &vec = newScreenProps.headerToolbarItems;
1105+ NSMutableArray<NSDictionary<NSString *, id> *> *array = [NSMutableArray arrayWithCapacity:vec.size()];
1106+ for (const auto &item : vec) {
1107+ NSDictionary *dict = [RNSConvert idFromFollyDynamic:item];
1108+ if ([dict isKindOfClass:[NSDictionary class]]) {
1109+ [array addObject:dict];
1110+ }
1111+ }
1112+ _headerToolbarItems = array;
1113+ }
1114+
1115 [self updateViewControllerIfNeeded];
1116
1117 if (needsNavigationControllerLayout) {
1118diff --git a/ios/RNSScreenStack.mm b/ios/RNSScreenStack.mm
1119--- a/ios/RNSScreenStack.mm
1120+++ b/ios/RNSScreenStack.mm
1121@@ -1074,6 +1074,15 @@ RNS_IGNORE_SUPER_CALL_END
1122 return scrollView.contentSize.width > scrollView.frame.size.width;
1123 }
1124
1125+// Whether a horizontally scrollable ScrollView is resting at its leading edge, so a
1126+// pan in the back-gesture direction has nothing left to scroll. Checked in the
1127+// ScrollView's own coordinate space: React Native mirrors the view for RTL layout,
1128+// which keeps the leading edge at the minimum content offset in both directions.
1129+- (BOOL)scrollViewIsAtLeadingEdge:(UIScrollView *)scrollView
1130+{
1131+ return scrollView.contentOffset.x <= -scrollView.adjustedContentInset.left + 1.0;
1132+}
1133+
1134 // Custom method for compatibility with iOS < 13.4
1135 // RNSScreenStackView is a UIGestureRecognizerDelegate for three types of gesture recognizers:
1136 // RNSPanGestureRecognizer, RNSScreenEdgeGestureRecognizer, _UIParallaxTransitionPanGestureRecognizer
1137@@ -1167,9 +1176,11 @@ RNS_IGNORE_SUPER_CALL_END
1138 if (gestureRecognizer == _controller.interactiveContentPopGestureRecognizer &&
1139 [self isScrollViewPanGestureRecognizer:otherGestureRecognizer]) {
1140 // ScrollView should take precedence when scrolling horizontally (it should be required to fail).
1141- // However, if it does not allow for horizontal scrolling, there should be no such restriction,
1142+ // However, if it does not allow for horizontal scrolling, or is already resting at its leading
1143+ // edge so a back swipe has nothing left to scroll, there should be no such restriction,
1144 // and swiping horizontally should dismiss the screen.
1145- return [self scrollViewHasHorizontalPart:static_cast<UIScrollView *>(otherGestureRecognizer.view)];
1146+ UIScrollView *scrollView = static_cast<UIScrollView *>(otherGestureRecognizer.view);
1147+ return [self scrollViewHasHorizontalPart:scrollView] && ![self scrollViewIsAtLeadingEdge:scrollView];
1148 }
1149 }
1150
1151@@ -1189,6 +1200,15 @@ RNS_IGNORE_SUPER_CALL_END
1152 // gestureRecognizer:shouldRequireFailureOfGestureRecognizer
1153 isEdgeSwipeGestureRecognizer =
1154 isEdgeSwipeGestureRecognizer && gestureRecognizer != _controller.interactiveContentPopGestureRecognizer;
1155+
1156+ // The exception is a horizontal ScrollView resting at its leading edge: its pan recognizer would
1157+ // still begin (and merely bounce) on a back swipe, so it must yield to the pop gesture the same
1158+ // way plain content does.
1159+ if (gestureRecognizer == _controller.interactiveContentPopGestureRecognizer &&
1160+ [self isScrollViewPanGestureRecognizer:otherGestureRecognizer]) {
1161+ UIScrollView *scrollView = static_cast<UIScrollView *>(otherGestureRecognizer.view);
1162+ return [self scrollViewHasHorizontalPart:scrollView] && [self scrollViewIsAtLeadingEdge:scrollView];
1163+ }
1164 }
1165 #endif // check for iOS >= 26
1166
1167diff --git a/ios/RNSScreenStackHeaderSubview.mm b/ios/RNSScreenStackHeaderSubview.mm
1168index add33c4807e038dcd846f6c72b2fc472ded02809..489afa5fa2da09c1ec6986d1832b58bb595396ae 100644
1169--- a/ios/RNSScreenStackHeaderSubview.mm
1170+++ b/ios/RNSScreenStackHeaderSubview.mm
1171@@ -20,7 +20,9 @@ @implementation RNSScreenStackHeaderSubview {
1172 // This is a strong reference to UIBarButtonItem which creates a retain cycle.
1173 // The cycle is cleared via `invalidateUIBarButtonItem` method, called by `invalidate` callback.
1174 UIBarButtonItem *_barButtonItem;
1175+ NSString *_barButtonItemIdentifier;
1176 BOOL _hidesSharedBackground;
1177+ UILabel *_titleScrollEdgeEffectGuide;
1178 }
1179
1180 #pragma mark - Common
1181@@ -102,5 +104,24 @@ - (void)updateShadowStateWithFrame:(CGRect)frame
1182 - (void)layoutSubviews
1183 {
1184 [super layoutSubviews];
1185+#if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
1186+ if (@available(iOS 26.0, *)) {
1187+ if (_type == RNSScreenStackHeaderSubviewTypeTitle || _type == RNSScreenStackHeaderSubviewTypeCenter) {
1188+ // UIKit shapes the navigation bar's scroll-edge fade around native labels,
1189+ // but does not recognize Fabric's custom text views. An empty, non-interactive
1190+ // label supplies the title's geometry without drawing or becoming a bar item.
1191+ if (_titleScrollEdgeEffectGuide == nil) {
1192+ _titleScrollEdgeEffectGuide = [UILabel new];
1193+ _titleScrollEdgeEffectGuide.accessibilityElementsHidden = YES;
1194+ // Append after Fabric's children so their mount/unmount indices stay intact.
1195+ [self addSubview:_titleScrollEdgeEffectGuide];
1196+ }
1197+ _titleScrollEdgeEffectGuide.frame = self.bounds;
1198+ } else {
1199+ [_titleScrollEdgeEffectGuide removeFromSuperview];
1200+ _titleScrollEdgeEffectGuide = nil;
1201+ }
1202+ }
1203+#endif
1204 [self updateShadowStateInContextOfAncestorView:[self findNavigationBar]];
1205 }
1206@@ -124,6 +145,7 @@ - (void)updateProps:(react::Props::Shared const &)props oldProps:(react::Props::
1207 const auto &newHeaderSubviewProps = *std::static_pointer_cast<const react::RNSScreenStackHeaderSubviewProps>(props);
1208
1209 [self setType:[RNSConvert RNSScreenStackHeaderSubviewTypeFromCppEquivalent:newHeaderSubviewProps.type]];
1210+ [self setBarButtonItemIdentifier:RCTNSStringFromStringNilIfEmpty(newHeaderSubviewProps.identifier)];
1211 [self setHidesSharedBackground:newHeaderSubviewProps.hidesSharedBackground];
1212 [self setSynchronousShadowStateUpdatesEnabled:newHeaderSubviewProps.synchronousShadowStateUpdatesEnabled];
1213 [super updateProps:props oldProps:oldProps];
1214@@ -276,7 +298,14 @@ - (void)configureBarButtonItem
1215 #if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
1216 if (@available(iOS 26.0, *)) {
1217 if (_barButtonItem != nil) {
1218- [_barButtonItem setHidesSharedBackground:_hidesSharedBackground];
1219+ NSString *currentIdentifier = _barButtonItem.identifier;
1220+ if (currentIdentifier != _barButtonItemIdentifier &&
1221+ ![currentIdentifier isEqualToString:_barButtonItemIdentifier]) {
1222+ _barButtonItem.identifier = _barButtonItemIdentifier;
1223+ }
1224+ if (_barButtonItem.hidesSharedBackground != _hidesSharedBackground) {
1225+ _barButtonItem.hidesSharedBackground = _hidesSharedBackground;
1226+ }
1227 }
1228 }
1229 #endif // RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
1230@@ -284,10 +313,22 @@ - (void)configureBarButtonItem
1231
1232 - (void)setHidesSharedBackground:(BOOL)hidesSharedBackground
1233 {
1234+ if (_hidesSharedBackground == hidesSharedBackground) {
1235+ return;
1236+ }
1237 _hidesSharedBackground = hidesSharedBackground;
1238 [self configureBarButtonItem];
1239 }
1240
1241+- (void)setBarButtonItemIdentifier:(nullable NSString *)identifier
1242+{
1243+ if (_barButtonItemIdentifier == identifier || [_barButtonItemIdentifier isEqualToString:identifier]) {
1244+ return;
1245+ }
1246+ _barButtonItemIdentifier = [identifier copy];
1247+ [self configureBarButtonItem];
1248+}
1249+
1250 #pragma mark - Dynamic frameworks support
1251
1252 // Needed because of this: https://github.com/facebook/react-native/pull/37274
1253diff --git a/lib/commonjs/components/ScreenStackHeaderConfig.js b/lib/commonjs/components/ScreenStackHeaderConfig.js
1254index 8c509f2657105cfd86448347c1a01fb73651ff9e..e668e089a1788973cb122a150be7846364a2a2cf 100644
1255--- a/lib/commonjs/components/ScreenStackHeaderConfig.js
1256+++ b/lib/commonjs/components/ScreenStackHeaderConfig.js
1257@@ -26,17 +26,42 @@ const ScreenStackHeaderConfig = exports.ScreenStackHeaderConfig = /*#__PURE__*/_
1258 } = (0, _EdgeInsetApplicationContext.useEdgeInsetApplication)(!props.hidden, props.disableTopInsetApplication ?? false, props.disableLeftInsetApplication ?? false, props.disableRightInsetApplication ?? false, props.disableBottomInsetApplication ?? false);
1259 const {
1260 headerLeftBarButtonItems,
1261- headerRightBarButtonItems
1262+ headerRightBarButtonItems,
1263+ headerCenterBarButtonItems,
1264+ headerToolbarItems
1265 } = props;
1266 const preparedHeaderLeftBarButtonItems = headerLeftBarButtonItems && _utils.isHeaderBarButtonsAvailableForCurrentPlatform ? (0, _prepareHeaderBarButtonItems.prepareHeaderBarButtonItems)(headerLeftBarButtonItems, 'left') : undefined;
1267 const preparedHeaderRightBarButtonItems = headerRightBarButtonItems && _utils.isHeaderBarButtonsAvailableForCurrentPlatform ? (0, _prepareHeaderBarButtonItems.prepareHeaderBarButtonItems)(headerRightBarButtonItems, 'right') : undefined;
1268- const hasHeaderBarButtonItems = _utils.isHeaderBarButtonsAvailableForCurrentPlatform && (preparedHeaderLeftBarButtonItems?.length || preparedHeaderRightBarButtonItems?.length);
1269+ const preparedHeaderCenterBarButtonItems = headerCenterBarButtonItems && _utils.isHeaderBarButtonsAvailableForCurrentPlatform ? (0, _prepareHeaderBarButtonItems.prepareHeaderBarButtonItems)(headerCenterBarButtonItems, 'center') : undefined;
1270+ const preparedHeaderToolbarItems = headerToolbarItems && _utils.isHeaderBarButtonsAvailableForCurrentPlatform ? (0, _prepareHeaderBarButtonItems.prepareHeaderBarButtonItems)(headerToolbarItems, 'toolbar') : undefined;
1271+ const hasHeaderBarButtonItems = _utils.isHeaderBarButtonsAvailableForCurrentPlatform && (preparedHeaderLeftBarButtonItems?.length || preparedHeaderRightBarButtonItems?.length || preparedHeaderCenterBarButtonItems?.length || preparedHeaderToolbarItems?.length);
1272
1273 // Handle bar button item presses
1274 const onPressHeaderBarButtonItem = hasHeaderBarButtonItems ? event => {
1275- const pressedItem = [...(preparedHeaderLeftBarButtonItems ?? []), ...(preparedHeaderRightBarButtonItems ?? [])].find(item => item && 'buttonId' in item && item.buttonId === event.nativeEvent.buttonId);
1276+ const buttonId = event.nativeEvent.buttonId;
1277+ const allItems = [...(preparedHeaderLeftBarButtonItems ?? []), ...(preparedHeaderRightBarButtonItems ?? []), ...(preparedHeaderCenterBarButtonItems ?? []), ...(preparedHeaderToolbarItems ?? [])];
1278+ const pressedItem = allItems.find(item => item && 'buttonId' in item && item.buttonId === buttonId);
1279 if (pressedItem && pressedItem.type === 'button' && pressedItem.onPress) {
1280 pressedItem.onPress();
1281+ return;
1282+ }
1283+ for (const item of allItems) {
1284+ if (!item || item.type !== 'mailSearchToolbar') {
1285+ continue;
1286+ }
1287+ if (item.filterButtonId === buttonId) {
1288+ item.onFilterPress?.();
1289+ return;
1290+ }
1291+ if (item.composeButtonId === buttonId) {
1292+ item.onComposePress?.();
1293+ return;
1294+ }
1295+ const searchTextChangePrefix = item.searchTextChangeId ? `${item.searchTextChangeId}:` : undefined;
1296+ if (searchTextChangePrefix && buttonId.startsWith(searchTextChangePrefix)) {
1297+ item.onSearchTextChange?.(buttonId.slice(searchTextChangePrefix.length));
1298+ return;
1299+ }
1300 }
1301 } : undefined;
1302
1303@@ -59,7 +84,7 @@ const ScreenStackHeaderConfig = exports.ScreenStackHeaderConfig = /*#__PURE__*/_
1304 };
1305
1306 // Check each bar-button item with a menu
1307- const allItems = [...(preparedHeaderLeftBarButtonItems ?? []), ...(preparedHeaderRightBarButtonItems ?? [])];
1308+ const allItems = [...(preparedHeaderLeftBarButtonItems ?? []), ...(preparedHeaderRightBarButtonItems ?? []), ...(preparedHeaderCenterBarButtonItems ?? []), ...(preparedHeaderToolbarItems ?? [])];
1309 for (const item of allItems) {
1310 if (item && item.type === 'menu' && item.menu) {
1311 const action = findInMenu(item.menu, event.nativeEvent.menuId);
1312@@ -67,6 +92,15 @@ const ScreenStackHeaderConfig = exports.ScreenStackHeaderConfig = /*#__PURE__*/_
1313 action.onPress();
1314 return;
1315 }
1316+ } else if (item && item.type === 'mailSearchToolbar') {
1317+ const toolbarMenus = [item.filterMenu, item.composeMenu].filter(Boolean);
1318+ for (const toolbarMenu of toolbarMenus) {
1319+ const action = findInMenu(toolbarMenu, event.nativeEvent.menuId);
1320+ if (action) {
1321+ action.onPress();
1322+ return;
1323+ }
1324+ }
1325 }
1326 }
1327 } : undefined;
1328@@ -74,6 +108,8 @@ const ScreenStackHeaderConfig = exports.ScreenStackHeaderConfig = /*#__PURE__*/_
1329 userInterfaceStyle: props.experimental_userInterfaceStyle,
1330 headerLeftBarButtonItems: preparedHeaderLeftBarButtonItems,
1331 headerRightBarButtonItems: preparedHeaderRightBarButtonItems,
1332+ headerCenterBarButtonItems: preparedHeaderCenterBarButtonItems,
1333+ headerToolbarItems: preparedHeaderToolbarItems,
1334 onPressHeaderBarButtonItem: onPressHeaderBarButtonItem,
1335 onPressHeaderBarButtonMenuItem: onPressHeaderBarButtonMenuItem,
1336 ref: ref,
1337diff --git a/lib/commonjs/components/helpers/prepareHeaderBarButtonItems.js b/lib/commonjs/components/helpers/prepareHeaderBarButtonItems.js
1338index ab93f62e4a7049d63c6681cecbd6cf8b1d07ce10..9dca2ab640e92161eb647b819a989acd0d41d9fe 100644
1339--- a/lib/commonjs/components/helpers/prepareHeaderBarButtonItems.js
1340+++ b/lib/commonjs/components/helpers/prepareHeaderBarButtonItems.js
1341@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
1342 });
1343 exports.prepareHeaderBarButtonItems = void 0;
1344 var _reactNative = require("react-native");
1345-const prepareMenu = (menu, index, side, path = '') => {
1346+const prepareMenu = (menu, index, placement, path = '') => {
1347 return {
1348 ...menu,
1349 items: menu.items.map((menuItem, menuIndex) => {
1350@@ -26,7 +26,7 @@ const prepareMenu = (menu, index, side, path = '') => {
1351 xcassetName,
1352 imageSource,
1353 templateSource,
1354- ...prepareMenu(menuItem, index, side, currentPath)
1355+ ...prepareMenu(menuItem, index, placement, currentPath)
1356 };
1357 }
1358 return {
1359@@ -35,16 +35,40 @@ const prepareMenu = (menu, index, side, path = '') => {
1360 xcassetName,
1361 imageSource,
1362 templateSource,
1363- menuId: `${currentPath}-${index}-${side}`
1364+ menuId: `${currentPath}-${index}-${placement}`
1365 };
1366 })
1367 };
1368 };
1369-const prepareHeaderBarButtonItems = (barButtonItems, side) => {
1370- return barButtonItems?.map((item, index) => {
1371+const prepareHeaderBarButtonItems = (barButtonItems, placement) => {
1372+ const items = Array.isArray(barButtonItems) ? barButtonItems : barButtonItems && typeof barButtonItems === 'object' && 'type' in barButtonItems ? [barButtonItems] : undefined;
1373+ return items?.map((item, index) => {
1374 if (item.type === 'spacing') {
1375 return item;
1376 }
1377+ if (item.type === 'searchBarPlacement') {
1378+ if (placement !== 'toolbar') {
1379+ return null;
1380+ }
1381+ return {
1382+ ...item,
1383+ searchBarPlacement: true
1384+ };
1385+ }
1386+ if (item.type === 'searchField') {
1387+ return {
1388+ ...item,
1389+ searchField: true
1390+ };
1391+ }
1392+ if (item.type === 'mailSearchToolbar') {
1393+ return {
1394+ ...item,
1395+ mailSearchToolbar: true,
1396+ filterMenu: item.filterMenu ? prepareMenu(item.filterMenu, index, placement, 'filter') : undefined,
1397+ composeMenu: item.composeMenu ? prepareMenu(item.composeMenu, index, placement, 'compose') : undefined
1398+ };
1399+ }
1400 let imageSource, templateSource;
1401 if (item.icon?.type === 'imageSource') {
1402 imageSource = _reactNative.Image.resolveAssetSource(item.icon.imageSource);
1403@@ -77,17 +101,17 @@ const prepareHeaderBarButtonItems = (barButtonItems, side) => {
1404 if (item.type === 'button') {
1405 return {
1406 ...processedItem,
1407- buttonId: `${index}-${side}`
1408+ buttonId: `${index}-${placement}`
1409 };
1410 }
1411 if (item.type === 'menu') {
1412 return {
1413 ...processedItem,
1414- menu: prepareMenu(item.menu, index, side)
1415+ menu: prepareMenu(item.menu, index, placement)
1416 };
1417 }
1418 return null;
1419- });
1420+ }).filter(item => item !== null);
1421 };
1422 exports.prepareHeaderBarButtonItems = prepareHeaderBarButtonItems;
1423 //# sourceMappingURL=prepareHeaderBarButtonItems.js.map
1424\ No newline at end of file
1425diff --git a/lib/module/components/ScreenStackHeaderConfig.js b/lib/module/components/ScreenStackHeaderConfig.js
1426index 68e3ba6a78314aba908d07098bb6982d11e6ee80..db5d17bfdac19ed3e664b55b6a73ce49766ac7c5 100644
1427--- a/lib/module/components/ScreenStackHeaderConfig.js
1428+++ b/lib/module/components/ScreenStackHeaderConfig.js
1429@@ -22,17 +22,42 @@ export const ScreenStackHeaderConfig = /*#__PURE__*/React.forwardRef((props, ref
1430 } = useEdgeInsetApplication(!props.hidden, props.disableTopInsetApplication ?? false, props.disableLeftInsetApplication ?? false, props.disableRightInsetApplication ?? false, props.disableBottomInsetApplication ?? false);
1431 const {
1432 headerLeftBarButtonItems,
1433- headerRightBarButtonItems
1434+ headerRightBarButtonItems,
1435+ headerCenterBarButtonItems,
1436+ headerToolbarItems
1437 } = props;
1438 const preparedHeaderLeftBarButtonItems = headerLeftBarButtonItems && isHeaderBarButtonsAvailableForCurrentPlatform ? prepareHeaderBarButtonItems(headerLeftBarButtonItems, 'left') : undefined;
1439 const preparedHeaderRightBarButtonItems = headerRightBarButtonItems && isHeaderBarButtonsAvailableForCurrentPlatform ? prepareHeaderBarButtonItems(headerRightBarButtonItems, 'right') : undefined;
1440- const hasHeaderBarButtonItems = isHeaderBarButtonsAvailableForCurrentPlatform && (preparedHeaderLeftBarButtonItems?.length || preparedHeaderRightBarButtonItems?.length);
1441+ const preparedHeaderCenterBarButtonItems = headerCenterBarButtonItems && isHeaderBarButtonsAvailableForCurrentPlatform ? prepareHeaderBarButtonItems(headerCenterBarButtonItems, 'center') : undefined;
1442+ const preparedHeaderToolbarItems = headerToolbarItems && isHeaderBarButtonsAvailableForCurrentPlatform ? prepareHeaderBarButtonItems(headerToolbarItems, 'toolbar') : undefined;
1443+ const hasHeaderBarButtonItems = isHeaderBarButtonsAvailableForCurrentPlatform && (preparedHeaderLeftBarButtonItems?.length || preparedHeaderRightBarButtonItems?.length || preparedHeaderCenterBarButtonItems?.length || preparedHeaderToolbarItems?.length);
1444
1445 // Handle bar button item presses
1446 const onPressHeaderBarButtonItem = hasHeaderBarButtonItems ? event => {
1447- const pressedItem = [...(preparedHeaderLeftBarButtonItems ?? []), ...(preparedHeaderRightBarButtonItems ?? [])].find(item => item && 'buttonId' in item && item.buttonId === event.nativeEvent.buttonId);
1448+ const buttonId = event.nativeEvent.buttonId;
1449+ const allItems = [...(preparedHeaderLeftBarButtonItems ?? []), ...(preparedHeaderRightBarButtonItems ?? []), ...(preparedHeaderCenterBarButtonItems ?? []), ...(preparedHeaderToolbarItems ?? [])];
1450+ const pressedItem = allItems.find(item => item && 'buttonId' in item && item.buttonId === buttonId);
1451 if (pressedItem && pressedItem.type === 'button' && pressedItem.onPress) {
1452 pressedItem.onPress();
1453+ return;
1454+ }
1455+ for (const item of allItems) {
1456+ if (!item || item.type !== 'mailSearchToolbar') {
1457+ continue;
1458+ }
1459+ if (item.filterButtonId === buttonId) {
1460+ item.onFilterPress?.();
1461+ return;
1462+ }
1463+ if (item.composeButtonId === buttonId) {
1464+ item.onComposePress?.();
1465+ return;
1466+ }
1467+ const searchTextChangePrefix = item.searchTextChangeId ? `${item.searchTextChangeId}:` : undefined;
1468+ if (searchTextChangePrefix && buttonId.startsWith(searchTextChangePrefix)) {
1469+ item.onSearchTextChange?.(buttonId.slice(searchTextChangePrefix.length));
1470+ return;
1471+ }
1472 }
1473 } : undefined;
1474
1475@@ -55,7 +80,7 @@ export const ScreenStackHeaderConfig = /*#__PURE__*/React.forwardRef((props, ref
1476 };
1477
1478 // Check each bar-button item with a menu
1479- const allItems = [...(preparedHeaderLeftBarButtonItems ?? []), ...(preparedHeaderRightBarButtonItems ?? [])];
1480+ const allItems = [...(preparedHeaderLeftBarButtonItems ?? []), ...(preparedHeaderRightBarButtonItems ?? []), ...(preparedHeaderCenterBarButtonItems ?? []), ...(preparedHeaderToolbarItems ?? [])];
1481 for (const item of allItems) {
1482 if (item && item.type === 'menu' && item.menu) {
1483 const action = findInMenu(item.menu, event.nativeEvent.menuId);
1484@@ -63,6 +88,15 @@ export const ScreenStackHeaderConfig = /*#__PURE__*/React.forwardRef((props, ref
1485 action.onPress();
1486 return;
1487 }
1488+ } else if (item && item.type === 'mailSearchToolbar') {
1489+ const toolbarMenus = [item.filterMenu, item.composeMenu].filter(Boolean);
1490+ for (const toolbarMenu of toolbarMenus) {
1491+ const action = findInMenu(toolbarMenu, event.nativeEvent.menuId);
1492+ if (action) {
1493+ action.onPress();
1494+ return;
1495+ }
1496+ }
1497 }
1498 }
1499 } : undefined;
1500@@ -70,6 +104,8 @@ export const ScreenStackHeaderConfig = /*#__PURE__*/React.forwardRef((props, ref
1501 userInterfaceStyle: props.experimental_userInterfaceStyle,
1502 headerLeftBarButtonItems: preparedHeaderLeftBarButtonItems,
1503 headerRightBarButtonItems: preparedHeaderRightBarButtonItems,
1504+ headerCenterBarButtonItems: preparedHeaderCenterBarButtonItems,
1505+ headerToolbarItems: preparedHeaderToolbarItems,
1506 onPressHeaderBarButtonItem: onPressHeaderBarButtonItem,
1507 onPressHeaderBarButtonMenuItem: onPressHeaderBarButtonMenuItem,
1508 ref: ref,
1509diff --git a/lib/module/components/helpers/prepareHeaderBarButtonItems.js b/lib/module/components/helpers/prepareHeaderBarButtonItems.js
1510index 8a70ffd78617147418d628c03c580bb7ff9a8a72..bca930372d2a7c3f8e0a35c3dcf28474f899f21c 100644
1511--- a/lib/module/components/helpers/prepareHeaderBarButtonItems.js
1512+++ b/lib/module/components/helpers/prepareHeaderBarButtonItems.js
1513@@ -1,5 +1,5 @@
1514 import { Image, processColor } from 'react-native';
1515-const prepareMenu = (menu, index, side, path = '') => {
1516+const prepareMenu = (menu, index, placement, path = '') => {
1517 return {
1518 ...menu,
1519 items: menu.items.map((menuItem, menuIndex) => {
1520@@ -20,7 +20,7 @@ const prepareMenu = (menu, index, side, path = '') => {
1521 xcassetName,
1522 imageSource,
1523 templateSource,
1524- ...prepareMenu(menuItem, index, side, currentPath)
1525+ ...prepareMenu(menuItem, index, placement, currentPath)
1526 };
1527 }
1528 return {
1529@@ -29,16 +29,40 @@ const prepareMenu = (menu, index, side, path = '') => {
1530 xcassetName,
1531 imageSource,
1532 templateSource,
1533- menuId: `${currentPath}-${index}-${side}`
1534+ menuId: `${currentPath}-${index}-${placement}`
1535 };
1536 })
1537 };
1538 };
1539-export const prepareHeaderBarButtonItems = (barButtonItems, side) => {
1540- return barButtonItems?.map((item, index) => {
1541+export const prepareHeaderBarButtonItems = (barButtonItems, placement) => {
1542+ const items = Array.isArray(barButtonItems) ? barButtonItems : barButtonItems && typeof barButtonItems === 'object' && 'type' in barButtonItems ? [barButtonItems] : undefined;
1543+ return items?.map((item, index) => {
1544 if (item.type === 'spacing') {
1545 return item;
1546 }
1547+ if (item.type === 'searchBarPlacement') {
1548+ if (placement !== 'toolbar') {
1549+ return null;
1550+ }
1551+ return {
1552+ ...item,
1553+ searchBarPlacement: true
1554+ };
1555+ }
1556+ if (item.type === 'searchField') {
1557+ return {
1558+ ...item,
1559+ searchField: true
1560+ };
1561+ }
1562+ if (item.type === 'mailSearchToolbar') {
1563+ return {
1564+ ...item,
1565+ mailSearchToolbar: true,
1566+ filterMenu: item.filterMenu ? prepareMenu(item.filterMenu, index, placement, 'filter') : undefined,
1567+ composeMenu: item.composeMenu ? prepareMenu(item.composeMenu, index, placement, 'compose') : undefined
1568+ };
1569+ }
1570 let imageSource, templateSource;
1571 if (item.icon?.type === 'imageSource') {
1572 imageSource = Image.resolveAssetSource(item.icon.imageSource);
1573@@ -71,16 +95,16 @@ export const prepareHeaderBarButtonItems = (barButtonItems, side) => {
1574 if (item.type === 'button') {
1575 return {
1576 ...processedItem,
1577- buttonId: `${index}-${side}`
1578+ buttonId: `${index}-${placement}`
1579 };
1580 }
1581 if (item.type === 'menu') {
1582 return {
1583 ...processedItem,
1584- menu: prepareMenu(item.menu, index, side)
1585+ menu: prepareMenu(item.menu, index, placement)
1586 };
1587 }
1588 return null;
1589- });
1590+ }).filter(item => item !== null);
1591 };
1592 //# sourceMappingURL=prepareHeaderBarButtonItems.js.map
1593\ No newline at end of file
1594diff --git a/lib/typescript/components/helpers/prepareHeaderBarButtonItems.d.ts b/lib/typescript/components/helpers/prepareHeaderBarButtonItems.d.ts
1595index c41ef943e554754f599f2fcd157dd0dc61d78b7e..ed02d44f78ee3f1387ba93bf292be2b99bb0e3b3 100644
1596--- a/lib/typescript/components/helpers/prepareHeaderBarButtonItems.d.ts
1597+++ b/lib/typescript/components/helpers/prepareHeaderBarButtonItems.d.ts
1598@@ -1,5 +1,5 @@
1599 import { HeaderBarButtonItem } from 'react-native-screens/types';
1600-export declare const prepareHeaderBarButtonItems: (barButtonItems: HeaderBarButtonItem[], side: "left" | "right") => (import("react-native-screens/types").HeaderBarButtonItemSpacing | {
1601+export declare const prepareHeaderBarButtonItems: (barButtonItems: HeaderBarButtonItem[], side: "left" | "right" | "center" | "toolbar") => (import("react-native-screens/types").HeaderBarButtonItemSpacing | {
1602 buttonId: string;
1603 imageSource: import("react-native").ImageResolvedAssetSource | undefined;
1604 templateSource: import("react-native").ImageResolvedAssetSource | undefined;
1605@@ -161,5 +161,5 @@ export declare const prepareHeaderBarButtonItems: (barButtonItems: HeaderBarButt
1606 identifier?: string | undefined;
1607 accessibilityLabel?: string | undefined;
1608 accessibilityHint?: string | undefined;
1609-} | null)[];
1610+})[];
1611 //# sourceMappingURL=prepareHeaderBarButtonItems.d.ts.map
1612\ No newline at end of file
1613diff --git a/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts b/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts
1614index a51d8648567cff29cd2be0d5262bd15c6fc69c61..8b7439aff4d7e6fe8a72bf0bac93c3c19568b1a6 100644
1615--- a/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts
1616+++ b/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts
1617@@ -9,6 +9,7 @@ type OnPressHeaderBarButtonMenuItemEvent = Readonly<{
1618 menuId: string;
1619 }>;
1620 type BackButtonDisplayMode = 'minimal' | 'default' | 'generic';
1621+type NavigationItemStyle = 'navigator' | 'browser' | 'editor';
1622 type BlurEffect = 'none' | 'extraLight' | 'light' | 'dark' | 'regular' | 'prominent' | 'systemUltraThinMaterial' | 'systemThinMaterial' | 'systemMaterial' | 'systemThickMaterial' | 'systemChromeMaterial' | 'systemUltraThinMaterialLight' | 'systemThinMaterialLight' | 'systemMaterialLight' | 'systemThickMaterialLight' | 'systemChromeMaterialLight' | 'systemUltraThinMaterialDark' | 'systemThinMaterialDark' | 'systemMaterialDark' | 'systemThickMaterialDark' | 'systemChromeMaterialDark';
1623 type UserInterfaceStyle = 'unspecified' | 'light' | 'dark';
1624 export interface NativeProps extends ViewProps {
1625@@ -32,18 +33,23 @@ export interface NativeProps extends ViewProps {
1626 largeTitleColor?: ColorValue | undefined;
1627 translucent?: boolean | undefined;
1628 title?: string | undefined;
1629+ subtitle?: string | undefined;
1630+ largeSubtitle?: string | undefined;
1631 titleFontFamily?: string | undefined;
1632 titleFontSize?: CT.Int32 | undefined;
1633 titleFontWeight?: string | undefined;
1634 titleColor?: ColorValue | undefined;
1635 disableBackButtonMenu?: boolean | undefined;
1636 backButtonDisplayMode?: CT.WithDefault<BackButtonDisplayMode, 'default'>;
1637+ navigationItemStyle?: CT.WithDefault<NavigationItemStyle, 'navigator'>;
1638 hideBackButton?: boolean | undefined;
1639 backButtonInCustomView?: boolean | undefined;
1640 blurEffect?: CT.WithDefault<BlurEffect, 'none'>;
1641 topInsetEnabled?: boolean | undefined;
1642 headerLeftBarButtonItems?: CT.UnsafeMixed[] | undefined;
1643 headerRightBarButtonItems?: CT.UnsafeMixed[] | undefined;
1644+ headerCenterBarButtonItems?: CT.UnsafeMixed[] | undefined;
1645+ headerToolbarItems?: CT.UnsafeMixed[] | undefined;
1646 onPressHeaderBarButtonItem?: CT.DirectEventHandler<OnPressHeaderBarButtonItemEvent> | undefined;
1647 onPressHeaderBarButtonMenuItem?: CT.DirectEventHandler<OnPressHeaderBarButtonMenuItemEvent> | undefined;
1648 synchronousShadowStateUpdatesEnabled?: CT.WithDefault<boolean, true>;
1649diff --git a/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts b/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts
1650index 1ca926e6753294861f5f79ab6267dc7999f70639..94e676fdb08ff9d1cf81a1cf06a45e931b5461f1 100644
1651--- a/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts
1652+++ b/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts
1653@@ -3,6 +3,7 @@ export type HeaderSubviewTypes = 'back' | 'right' | 'left' | 'title' | 'center'
1654 export interface NativeProps extends ViewProps {
1655 type?: CT.WithDefault<HeaderSubviewTypes, 'left'>;
1656 hidesSharedBackground?: boolean | undefined;
1657+ identifier?: string | undefined;
1658 synchronousShadowStateUpdatesEnabled?: CT.WithDefault<boolean, true>;
1659 }
1660 declare const _default: import("react-native").HostComponent<NativeProps>;
1661diff --git a/lib/typescript/types.d.ts b/lib/typescript/types.d.ts
1662index 10a31341f4eff258a7f8ea6abae3eddf0dd21218..bab5031f5f9b246f15e5396f3f2fee90b91d826a 100644
1663--- a/lib/typescript/types.d.ts
1664+++ b/lib/typescript/types.d.ts
1665@@ -10,6 +10,7 @@ export type SearchBarCommands = {
1666 cancelSearch: () => void;
1667 };
1668 export type BackButtonDisplayMode = 'default' | 'generic' | 'minimal';
1669+export type NavigationItemStyle = 'navigator' | 'browser' | 'editor';
1670 export type StackPresentationTypes = 'push' | 'modal' | 'transparentModal' | 'containedModal' | 'containedTransparentModal' | 'fullScreenModal' | 'formSheet' | 'pageSheet';
1671 export type StackAnimationTypes = 'default' | 'fade' | 'fade_from_bottom' | 'flip' | 'none' | 'simple_push' | 'slide_from_bottom' | 'slide_from_right' | 'slide_from_left' | 'ios_from_right' | 'ios_from_left';
1672 export type BlurEffectTypes = BlurEffect;
1673@@ -631,6 +632,14 @@ export interface ScreenStackHeaderConfigProps extends ViewProps {
1674 * @platform ios
1675 */
1676 backButtonDisplayMode?: BackButtonDisplayMode | undefined;
1677+ /**
1678+ * Controls the UIKit `UINavigationItem.style` used by native iOS headers.
1679+ *
1680+ * `editor` matches modern document/editor-style bars with leading-aligned compact titles and glass controls.
1681+ *
1682+ * @platform ios
1683+ */
1684+ navigationItemStyle?: NavigationItemStyle | undefined;
1685 /**
1686 * Array of UIBarButtomItems to the left side of the header.
1687 *
1688@@ -643,6 +652,26 @@ export interface ScreenStackHeaderConfigProps extends ViewProps {
1689 * @platform ios
1690 */
1691 headerRightBarButtonItems?: HeaderBarButtonItem[] | undefined;
1692+ /**
1693+ * Array of UIBarButtonItems to the centered item group in modern iOS headers.
1694+ *
1695+ * This maps to `UINavigationItem.centerItemGroups` on iOS 26+ and lets
1696+ * document/editor-style chrome keep primary actions visually centered while
1697+ * leaving trailing search separate.
1698+ *
1699+ * @platform ios
1700+ */
1701+ headerCenterBarButtonItems?: HeaderBarButtonItem[] | undefined;
1702+ /**
1703+ * Array of UIBarButtonItems to display in the native toolbar attached to
1704+ * the current screen's navigation controller.
1705+ *
1706+ * On iOS 26+, this can contain a `searchBarPlacement` item to let UIKit
1707+ * render integrated Mail-style search chrome using the attached SearchBar.
1708+ *
1709+ * @platform ios
1710+ */
1711+ headerToolbarItems?: HeaderBarButtonItem[] | undefined;
1712 /**
1713 * When set to true the header will be hidden while the parent Screen is on the top of the stack. The default value is false.
1714 */
1715@@ -704,6 +733,20 @@ export interface ScreenStackHeaderConfigProps extends ViewProps {
1716 * String that can be displayed in the header as a fallback for `headerTitle`.
1717 */
1718 title?: string | undefined;
1719+ /**
1720+ * String displayed below the compact navigation title on iOS 26+.
1721+ *
1722+ * @platform ios
1723+ */
1724+ subtitle?: string | undefined;
1725+ /**
1726+ * String displayed below the large navigation title on iOS 26+.
1727+ *
1728+ * Falls back to `subtitle` when omitted.
1729+ *
1730+ * @platform ios
1731+ */
1732+ largeSubtitle?: string | undefined;
1733 /**
1734 * Allows for setting text color of the title.
1735 */
1736@@ -999,6 +1042,13 @@ export interface SearchBarProps {
1737 shouldShowHintSearchIcon?: boolean | undefined;
1738 }
1739 export interface ScreenStackHeaderSubviewProps {
1740+ /**
1741+ * An identifier used to match this item across navigation bar transitions.
1742+ * Only applicable to type="right" and type="left" subviews on iOS 26.0 and later.
1743+ *
1744+ * Read more: https://developer.apple.com/documentation/uikit/uibarbuttonitem/identifier
1745+ */
1746+ identifier?: string | undefined;
1747 /**
1748 * A boolean value indicating whether the background this item may share with other items in the bar should be hidden.
1749 * Only applicable to type="right" and type="left" subviews.
1750@@ -1037,6 +1087,11 @@ interface SharedHeaderBarButtonItem {
1751 * Read more: https://developer.apple.com/documentation/uikit/uibarbuttonitem/style-swift.property
1752 */
1753 variant?: 'plain' | 'done' | 'prominent' | undefined;
1754+ /**
1755+ * Render the item with UIButtonConfiguration.glassButtonConfiguration.
1756+ * Only available from iOS 26.0 and later.
1757+ */
1758+ glassEffect?: boolean | undefined;
1759 /**
1760 * The tint color to apply to the item.
1761 *
1762@@ -1181,8 +1236,38 @@ export interface HeaderBarButtonItemWithMenu extends SharedHeaderBarButtonItem {
1763 export interface HeaderBarButtonItemSpacing {
1764 type: 'spacing';
1765 spacing: number;
1766+ flexible?: boolean | undefined;
1767+}
1768+export interface HeaderBarButtonSearchBarPlacementItem {
1769+ type: 'searchBarPlacement';
1770+ activatesSearchController?: boolean | undefined;
1771+ customView?: boolean | undefined;
1772+ index?: number | undefined;
1773+ width?: number | undefined;
1774+}
1775+export interface HeaderBarButtonSearchFieldItem {
1776+ type: 'searchField';
1777+ placeholder?: string | undefined;
1778+ width?: number | undefined;
1779+}
1780+export interface HeaderBarButtonMailSearchToolbarItem {
1781+ type: 'mailSearchToolbar';
1782+ composeButtonId?: string | undefined;
1783+ composeMenu?: HeaderBarButtonItemWithMenu['menu'] | undefined;
1784+ composeSystemImageName?: string | undefined;
1785+ filterButtonId?: string | undefined;
1786+ filterMenu?: HeaderBarButtonItemWithMenu['menu'] | undefined;
1787+ filterSystemImageName?: string | undefined;
1788+ onComposePress?: (() => void) | undefined;
1789+ onFilterPress?: (() => void) | undefined;
1790+ onSearchTextChange?: ((text: string) => void) | undefined;
1791+ placeholder?: string | undefined;
1792+ searchTextChangeId?: string | undefined;
1793+ showsSearchDismissButton?: boolean | undefined;
1794+ useFallbackSearchField?: boolean | undefined;
1795+ width?: number | undefined;
1796 }
1797-export type HeaderBarButtonItem = HeaderBarButtonItemWithAction | HeaderBarButtonItemWithMenu | HeaderBarButtonItemSpacing;
1798+export type HeaderBarButtonItem = HeaderBarButtonItemWithAction | HeaderBarButtonItemWithMenu | HeaderBarButtonMailSearchToolbarItem | HeaderBarButtonSearchFieldItem | HeaderBarButtonSearchBarPlacementItem | HeaderBarButtonItemSpacing;
1799 /**
1800 * Custom Screen Transition
1801 */
1802diff --git a/src/components/ScreenStackHeaderConfig.tsx b/src/components/ScreenStackHeaderConfig.tsx
1803index c3a88b6f6c8362cf717372a35cdc35a6b397bdd0..9e8173da567933fd3f6819fb26bf4a0e87640767 100644
1804--- a/src/components/ScreenStackHeaderConfig.tsx
1805+++ b/src/components/ScreenStackHeaderConfig.tsx
1806@@ -48,7 +48,12 @@ export const ScreenStackHeaderConfig = React.forwardRef<
1807 props.disableBottomInsetApplication ?? false,
1808 );
1809
1810- const { headerLeftBarButtonItems, headerRightBarButtonItems } = props;
1811+ const {
1812+ headerLeftBarButtonItems,
1813+ headerRightBarButtonItems,
1814+ headerCenterBarButtonItems,
1815+ headerToolbarItems,
1816+ } = props;
1817
1818 const preparedHeaderLeftBarButtonItems =
1819 headerLeftBarButtonItems && isHeaderBarButtonsAvailableForCurrentPlatform
1820@@ -58,22 +63,36 @@ export const ScreenStackHeaderConfig = React.forwardRef<
1821 headerRightBarButtonItems && isHeaderBarButtonsAvailableForCurrentPlatform
1822 ? prepareHeaderBarButtonItems(headerRightBarButtonItems, 'right')
1823 : undefined;
1824+ const preparedHeaderCenterBarButtonItems =
1825+ headerCenterBarButtonItems && isHeaderBarButtonsAvailableForCurrentPlatform
1826+ ? prepareHeaderBarButtonItems(headerCenterBarButtonItems, 'center')
1827+ : undefined;
1828+ const preparedHeaderToolbarItems =
1829+ headerToolbarItems && isHeaderBarButtonsAvailableForCurrentPlatform
1830+ ? prepareHeaderBarButtonItems(headerToolbarItems, 'toolbar')
1831+ : undefined;
1832 const hasHeaderBarButtonItems =
1833 isHeaderBarButtonsAvailableForCurrentPlatform &&
1834 (preparedHeaderLeftBarButtonItems?.length ||
1835- preparedHeaderRightBarButtonItems?.length);
1836+ preparedHeaderRightBarButtonItems?.length ||
1837+ preparedHeaderCenterBarButtonItems?.length ||
1838+ preparedHeaderToolbarItems?.length);
1839
1840 // Handle bar button item presses
1841 const onPressHeaderBarButtonItem = hasHeaderBarButtonItems
1842 ? (event: NativeSyntheticEvent<{ buttonId: string }>) => {
1843- const pressedItem = [
1844+ const buttonId = event.nativeEvent.buttonId;
1845+ const allItems = [
1846 ...(preparedHeaderLeftBarButtonItems ?? []),
1847 ...(preparedHeaderRightBarButtonItems ?? []),
1848- ].find(
1849+ ...(preparedHeaderCenterBarButtonItems ?? []),
1850+ ...(preparedHeaderToolbarItems ?? []),
1851+ ];
1852+ const pressedItem = allItems.find(
1853 item =>
1854 item &&
1855 'buttonId' in item &&
1856- item.buttonId === event.nativeEvent.buttonId,
1857+ item.buttonId === buttonId,
1858 );
1859 if (
1860 pressedItem &&
1861@@ -81,6 +100,32 @@ export const ScreenStackHeaderConfig = React.forwardRef<
1862 pressedItem.onPress
1863 ) {
1864 pressedItem.onPress();
1865+ return;
1866+ }
1867+ for (const item of allItems) {
1868+ if (!item || item.type !== 'mailSearchToolbar') {
1869+ continue;
1870+ }
1871+ if (item.filterButtonId === buttonId) {
1872+ item.onFilterPress?.();
1873+ return;
1874+ }
1875+ if (item.composeButtonId === buttonId) {
1876+ item.onComposePress?.();
1877+ return;
1878+ }
1879+ const searchTextChangePrefix = item.searchTextChangeId
1880+ ? `${item.searchTextChangeId}:`
1881+ : undefined;
1882+ if (
1883+ searchTextChangePrefix &&
1884+ buttonId.startsWith(searchTextChangePrefix)
1885+ ) {
1886+ item.onSearchTextChange?.(
1887+ buttonId.slice(searchTextChangePrefix.length),
1888+ );
1889+ return;
1890+ }
1891 }
1892 }
1893 : undefined;
1894@@ -111,6 +156,8 @@ export const ScreenStackHeaderConfig = React.forwardRef<
1895 const allItems = [
1896 ...(preparedHeaderLeftBarButtonItems ?? []),
1897 ...(preparedHeaderRightBarButtonItems ?? []),
1898+ ...(preparedHeaderCenterBarButtonItems ?? []),
1899+ ...(preparedHeaderToolbarItems ?? []),
1900 ];
1901 for (const item of allItems) {
1902 if (item && item.type === 'menu' && item.menu) {
1903@@ -119,6 +166,17 @@ export const ScreenStackHeaderConfig = React.forwardRef<
1904 action.onPress();
1905 return;
1906 }
1907+ } else if (item && item.type === 'mailSearchToolbar') {
1908+ const toolbarMenus = [item.filterMenu, item.composeMenu].filter(
1909+ Boolean,
1910+ );
1911+ for (const toolbarMenu of toolbarMenus) {
1912+ const action = findInMenu(toolbarMenu, event.nativeEvent.menuId);
1913+ if (action) {
1914+ action.onPress();
1915+ return;
1916+ }
1917+ }
1918 }
1919 }
1920 }
1921@@ -130,6 +188,8 @@ export const ScreenStackHeaderConfig = React.forwardRef<
1922 userInterfaceStyle={props.experimental_userInterfaceStyle}
1923 headerLeftBarButtonItems={preparedHeaderLeftBarButtonItems}
1924 headerRightBarButtonItems={preparedHeaderRightBarButtonItems}
1925+ headerCenterBarButtonItems={preparedHeaderCenterBarButtonItems}
1926+ headerToolbarItems={preparedHeaderToolbarItems}
1927 onPressHeaderBarButtonItem={onPressHeaderBarButtonItem}
1928 onPressHeaderBarButtonMenuItem={onPressHeaderBarButtonMenuItem}
1929 ref={ref}
1930diff --git a/src/components/helpers/prepareHeaderBarButtonItems.ts b/src/components/helpers/prepareHeaderBarButtonItems.ts
1931index be2c24dfee77f5883b5ab1d7473be80933b5dc6f..2008a342f13806641909c19a9f4ab6829f239016 100644
1932--- a/src/components/helpers/prepareHeaderBarButtonItems.ts
1933+++ b/src/components/helpers/prepareHeaderBarButtonItems.ts
1934@@ -7,7 +7,7 @@ import {
1935 const prepareMenu = (
1936 menu: HeaderBarButtonItemWithMenu['menu'],
1937 index: number,
1938- side: 'left' | 'right',
1939+ placement: 'left' | 'right' | 'center' | 'toolbar',
1940 path: string = '',
1941 ): HeaderBarButtonItemWithMenu['menu'] => {
1942 return {
1943@@ -34,7 +34,7 @@ const prepareMenu = (
1944 xcassetName,
1945 imageSource,
1946 templateSource,
1947- ...prepareMenu(menuItem, index, side, currentPath),
1948+ ...prepareMenu(menuItem, index, placement, currentPath),
1949 };
1950 }
1951 return {
1952@@ -43,20 +43,53 @@ const prepareMenu = (
1953 xcassetName,
1954 imageSource,
1955 templateSource,
1956- menuId: `${currentPath}-${index}-${side}`,
1957+ menuId: `${currentPath}-${index}-${placement}`,
1958 };
1959 }),
1960 };
1961 };
1962
1963 export const prepareHeaderBarButtonItems = (
1964- barButtonItems: HeaderBarButtonItem[],
1965- side: 'left' | 'right',
1966+ barButtonItems:
1967+ | HeaderBarButtonItem[]
1968+ | HeaderBarButtonItem
1969+ | null
1970+ | undefined,
1971+ placement: 'left' | 'right' | 'center' | 'toolbar',
1972 ) => {
1973- return barButtonItems?.map((item, index) => {
1974+ const items = Array.isArray(barButtonItems)
1975+ ? barButtonItems
1976+ : barButtonItems && typeof barButtonItems === 'object' && 'type' in barButtonItems
1977+ ? [barButtonItems]
1978+ : undefined;
1979+
1980+ return items?.map((item, index) => {
1981 if (item.type === 'spacing') {
1982 return item;
1983 }
1984+ if (item.type === 'searchBarPlacement') {
1985+ if (placement !== 'toolbar') {
1986+ return null;
1987+ }
1988+ return {
1989+ ...item,
1990+ searchBarPlacement: true,
1991+ };
1992+ }
1993+ if (item.type === 'searchField') {
1994+ return {
1995+ ...item,
1996+ searchField: true,
1997+ };
1998+ }
1999+ if (item.type === 'mailSearchToolbar') {
2000+ return {
2001+ ...item,
2002+ mailSearchToolbar: true,
2003+ filterMenu: item.filterMenu ? prepareMenu(item.filterMenu, index, placement, 'filter') : undefined,
2004+ composeMenu: item.composeMenu ? prepareMenu(item.composeMenu, index, placement, 'compose') : undefined,
2005+ };
2006+ }
2007 let imageSource, templateSource;
2008 if (item.icon?.type === 'imageSource') {
2009 imageSource = Image.resolveAssetSource(item.icon.imageSource);
2010@@ -91,15 +124,15 @@ export const prepareHeaderBarButtonItems = (
2011 if (item.type === 'button') {
2012 return {
2013 ...processedItem,
2014- buttonId: `${index}-${side}`,
2015+ buttonId: `${index}-${placement}`,
2016 };
2017 }
2018 if (item.type === 'menu') {
2019 return {
2020 ...processedItem,
2021- menu: prepareMenu(item.menu, index, side),
2022+ menu: prepareMenu(item.menu, index, placement),
2023 };
2024 }
2025 return null;
2026- });
2027+ }).filter(item => item !== null);
2028 };
2029diff --git a/src/fabric/ScreenStackHeaderConfigNativeComponent.ts b/src/fabric/ScreenStackHeaderConfigNativeComponent.ts
2030index a80d9fef0c0ab5ce8221c5e0c7fae65162bc6164..fc16f51425702a418c09de553a54753331f19d15 100644
2031--- a/src/fabric/ScreenStackHeaderConfigNativeComponent.ts
2032+++ b/src/fabric/ScreenStackHeaderConfigNativeComponent.ts
2033@@ -14,6 +14,7 @@ type OnPressHeaderBarButtonItemEvent = Readonly<{ buttonId: string }>;
2034 type OnPressHeaderBarButtonMenuItemEvent = Readonly<{ menuId: string }>;
2035
2036 type BackButtonDisplayMode = 'minimal' | 'default' | 'generic';
2037+type NavigationItemStyle = 'navigator' | 'browser' | 'editor';
2038
2039 type BlurEffect =
2040 | 'none'
2041@@ -61,12 +62,15 @@ export interface NativeProps extends ViewProps {
2042 largeTitleColor?: ColorValue | undefined;
2043 translucent?: boolean | undefined;
2044 title?: string | undefined;
2045+ subtitle?: string | undefined;
2046+ largeSubtitle?: string | undefined;
2047 titleFontFamily?: string | undefined;
2048 titleFontSize?: CT.Int32 | undefined;
2049 titleFontWeight?: string | undefined;
2050 titleColor?: ColorValue | undefined;
2051 disableBackButtonMenu?: boolean | undefined;
2052 backButtonDisplayMode?: CT.WithDefault<BackButtonDisplayMode, 'default'>;
2053+ navigationItemStyle?: CT.WithDefault<NavigationItemStyle, 'navigator'>;
2054 hideBackButton?: boolean | undefined;
2055 backButtonInCustomView?: boolean | undefined;
2056 blurEffect?: CT.WithDefault<BlurEffect, 'none'>;
2057@@ -74,6 +78,8 @@ export interface NativeProps extends ViewProps {
2058 topInsetEnabled?: boolean | undefined;
2059 headerLeftBarButtonItems?: CT.UnsafeMixed[] | undefined;
2060 headerRightBarButtonItems?: CT.UnsafeMixed[] | undefined;
2061+ headerCenterBarButtonItems?: CT.UnsafeMixed[] | undefined;
2062+ headerToolbarItems?: CT.UnsafeMixed[] | undefined;
2063 onPressHeaderBarButtonItem?:
2064 | CT.DirectEventHandler<OnPressHeaderBarButtonItemEvent>
2065 | undefined;
2066diff --git a/src/fabric/ScreenStackHeaderSubviewNativeComponent.ts b/src/fabric/ScreenStackHeaderSubviewNativeComponent.ts
2067index 7d3fbfe08c70461936832a40a1ce8d9c11b22457..1f9caca6271b68d182b70a180f180d6a4ce3988c 100644
2068--- a/src/fabric/ScreenStackHeaderSubviewNativeComponent.ts
2069+++ b/src/fabric/ScreenStackHeaderSubviewNativeComponent.ts
2070@@ -14,6 +14,7 @@ export type HeaderSubviewTypes =
2071 export interface NativeProps extends ViewProps {
2072 type?: CT.WithDefault<HeaderSubviewTypes, 'left'>;
2073 hidesSharedBackground?: boolean | undefined;
2074+ identifier?: string | undefined;
2075 synchronousShadowStateUpdatesEnabled?: CT.WithDefault<boolean, true>;
2076 }
2077
2078diff --git a/src/types.tsx b/src/types.tsx
2079index 9c3ab4c3653ee1769addda8a6464cdf49695a601..6f242ad2bbd7152ea9f873ef7754ad47caf2466d 100644
2080--- a/src/types.tsx
2081+++ b/src/types.tsx
2082@@ -26,6 +26,7 @@ export type SearchBarCommands = {
2083 };
2084
2085 export type BackButtonDisplayMode = 'default' | 'generic' | 'minimal';
2086+export type NavigationItemStyle = 'navigator' | 'browser' | 'editor';
2087 export type StackPresentationTypes =
2088 | 'push'
2089 | 'modal'
2090@@ -735,6 +736,14 @@ export interface ScreenStackHeaderConfigProps extends ViewProps {
2091 * @platform ios
2092 */
2093 backButtonDisplayMode?: BackButtonDisplayMode | undefined;
2094+ /**
2095+ * Controls the UIKit `UINavigationItem.style` used by native iOS headers.
2096+ *
2097+ * `editor` matches modern document/editor-style bars with leading-aligned compact titles and glass controls.
2098+ *
2099+ * @platform ios
2100+ */
2101+ navigationItemStyle?: NavigationItemStyle | undefined;
2102 /**
2103 * Array of UIBarButtomItems to the left side of the header.
2104 *
2105@@ -747,6 +756,26 @@ export interface ScreenStackHeaderConfigProps extends ViewProps {
2106 * @platform ios
2107 */
2108 headerRightBarButtonItems?: HeaderBarButtonItem[] | undefined;
2109+ /**
2110+ * Array of UIBarButtonItems to the centered item group in modern iOS headers.
2111+ *
2112+ * This maps to `UINavigationItem.centerItemGroups` on iOS 26+ and lets
2113+ * document/editor-style chrome keep primary actions visually centered while
2114+ * leaving trailing search separate.
2115+ *
2116+ * @platform ios
2117+ */
2118+ headerCenterBarButtonItems?: HeaderBarButtonItem[] | undefined;
2119+ /**
2120+ * Array of UIBarButtonItems to display in the native toolbar attached to
2121+ * the current screen's navigation controller.
2122+ *
2123+ * On iOS 26+, this can contain a `searchBarPlacement` item to let UIKit
2124+ * render integrated Mail-style search chrome using the attached SearchBar.
2125+ *
2126+ * @platform ios
2127+ */
2128+ headerToolbarItems?: HeaderBarButtonItem[] | undefined;
2129 /**
2130 * When set to true the header will be hidden while the parent Screen is on the top of the stack. The default value is false.
2131 */
2132@@ -808,6 +837,20 @@ export interface ScreenStackHeaderConfigProps extends ViewProps {
2133 * String that can be displayed in the header as a fallback for `headerTitle`.
2134 */
2135 title?: string | undefined;
2136+ /**
2137+ * String displayed below the compact navigation title on iOS 26+.
2138+ *
2139+ * @platform ios
2140+ */
2141+ subtitle?: string | undefined;
2142+ /**
2143+ * String displayed below the large navigation title on iOS 26+.
2144+ *
2145+ * Falls back to `subtitle` when omitted.
2146+ *
2147+ * @platform ios
2148+ */
2149+ largeSubtitle?: string | undefined;
2150 /**
2151 * Allows for setting text color of the title.
2152 */
2153@@ -1120,6 +1163,13 @@ export interface SearchBarProps {
2154 }
2155
2156 export interface ScreenStackHeaderSubviewProps {
2157+ /**
2158+ * An identifier used to match this item across navigation bar transitions.
2159+ * Only applicable to type="right" and type="left" subviews on iOS 26.0 and later.
2160+ *
2161+ * Read more: https://developer.apple.com/documentation/uikit/uibarbuttonitem/identifier
2162+ */
2163+ identifier?: string | undefined;
2164 /**
2165 * A boolean value indicating whether the background this item may share with other items in the bar should be hidden.
2166 * Only applicable to type="right" and type="left" subviews.
2167@@ -1161,6 +1211,11 @@ interface SharedHeaderBarButtonItem {
2168 * Read more: https://developer.apple.com/documentation/uikit/uibarbuttonitem/style-swift.property
2169 */
2170 variant?: 'plain' | 'done' | 'prominent' | undefined;
2171+ /**
2172+ * Render the item with UIButtonConfiguration.glassButtonConfiguration.
2173+ * Only available from iOS 26.0 and later.
2174+ */
2175+ glassEffect?: boolean | undefined;
2176 /**
2177 * The tint color to apply to the item.
2178 *
2179@@ -1315,11 +1370,47 @@ export interface HeaderBarButtonItemWithMenu extends SharedHeaderBarButtonItem {
2180 export interface HeaderBarButtonItemSpacing {
2181 type: 'spacing';
2182 spacing: number;
2183+ flexible?: boolean | undefined;
2184+}
2185+
2186+export interface HeaderBarButtonSearchBarPlacementItem {
2187+ type: 'searchBarPlacement';
2188+ activatesSearchController?: boolean | undefined;
2189+ customView?: boolean | undefined;
2190+ index?: number | undefined;
2191+ width?: number | undefined;
2192+}
2193+
2194+export interface HeaderBarButtonSearchFieldItem {
2195+ type: 'searchField';
2196+ placeholder?: string | undefined;
2197+ width?: number | undefined;
2198+}
2199+
2200+export interface HeaderBarButtonMailSearchToolbarItem {
2201+ type: 'mailSearchToolbar';
2202+ composeButtonId?: string | undefined;
2203+ composeMenu?: HeaderBarButtonItemWithMenu['menu'] | undefined;
2204+ composeSystemImageName?: string | undefined;
2205+ filterButtonId?: string | undefined;
2206+ filterMenu?: HeaderBarButtonItemWithMenu['menu'] | undefined;
2207+ filterSystemImageName?: string | undefined;
2208+ onComposePress?: (() => void) | undefined;
2209+ onFilterPress?: (() => void) | undefined;
2210+ onSearchTextChange?: ((text: string) => void) | undefined;
2211+ placeholder?: string | undefined;
2212+ searchTextChangeId?: string | undefined;
2213+ showsSearchDismissButton?: boolean | undefined;
2214+ useFallbackSearchField?: boolean | undefined;
2215+ width?: number | undefined;
2216 }
2217
2218 export type HeaderBarButtonItem =
2219 | HeaderBarButtonItemWithAction
2220 | HeaderBarButtonItemWithMenu
2221+ | HeaderBarButtonMailSearchToolbarItem
2222+ | HeaderBarButtonSearchFieldItem
2223+ | HeaderBarButtonSearchBarPlacementItem
2224 | HeaderBarButtonItemSpacing;
2225
2226 /**
patches/react-native-screens@4.28.0.patch created+2232
......@@ -0,0 +1,2232 @@
1diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt
2index fa1b773..270c81c 100644
3--- a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt
4+++ b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt
5@@ -124,6 +124,34 @@ class ScreenStackHeaderConfigViewManager :
6 config.setTitle(title)
7 }
8
9+ // The t3 patch adds these iOS glass-chrome props to the native spec; they have
10+ // no Android implementation, but the codegen-generated interface requires the
11+ // setters to exist. No-ops keep the Android build compiling.
12+ override fun setSubtitle(
13+ config: ScreenStackHeaderConfig,
14+ subtitle: String?,
15+ ) = Unit
16+
17+ override fun setLargeSubtitle(
18+ config: ScreenStackHeaderConfig,
19+ largeSubtitle: String?,
20+ ) = Unit
21+
22+ override fun setNavigationItemStyle(
23+ config: ScreenStackHeaderConfig,
24+ navigationItemStyle: String?,
25+ ) = Unit
26+
27+ override fun setHeaderCenterBarButtonItems(
28+ config: ScreenStackHeaderConfig,
29+ headerCenterBarButtonItems: ReadableArray?,
30+ ) = Unit
31+
32+ override fun setHeaderToolbarItems(
33+ config: ScreenStackHeaderConfig,
34+ headerToolbarItems: ReadableArray?,
35+ ) = Unit
36+
37 override fun setTitleFontFamily(
38 config: ScreenStackHeaderConfig,
39 titleFontFamily: String?,
40diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt
41index 64f14f0..6cb1d69 100644
42--- a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt
43+++ b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt
44@@ -47,6 +47,12 @@ class ScreenStackHeaderSubviewManager :
45 Log.w("[RNScreens]", "hidesSharedBackground prop is not available on Android")
46 }
47
48+ // Bar button transition identifiers only apply on iOS.
49+ override fun setIdentifier(
50+ view: ScreenStackHeaderSubview,
51+ identifier: String?,
52+ ) = Unit
53+
54 // synchronousShadowStateUpdatesEnabled is not available on Android atm,
55 // however we must override their setters
56 override fun setSynchronousShadowStateUpdatesEnabled(
57diff --git a/ios/RNSBarButtonItem.h b/ios/RNSBarButtonItem.h
58index a26d125..62eea42 100644
59--- a/ios/RNSBarButtonItem.h
60+++ b/ios/RNSBarButtonItem.h
61@@ -15,6 +15,10 @@ typedef void (^RNSBarButtonMenuItemAction)(NSString *menuId);
62 action:(RNSBarButtonItemAction)action
63 menuAction:(RNSBarButtonMenuItemAction)menuAction
64 imageLoader:(RCTImageLoader *)imageLoader;
65+
66++ (UIMenu *)initUIMenuWithDict:(NSDictionary<NSString *, id> *)dict
67+ menuAction:(RNSBarButtonMenuItemAction)menuAction
68+ imageLoader:(RCTImageLoader *)imageLoader;
69 #endif // defined(__cplusplus)
70
71 @end
72diff --git a/ios/RNSBarButtonItem.mm b/ios/RNSBarButtonItem.mm
73index 76a39d4..15bd5a9 100644
74--- a/ios/RNSBarButtonItem.mm
75+++ b/ios/RNSBarButtonItem.mm
76@@ -110,6 +110,58 @@ - (instancetype)initWithConfig:(NSDictionary<NSString *, id> *)dict
77 if (dict[@"accessibilityHint"]) {
78 self.accessibilityHint = dict[@"accessibilityHint"];
79 }
80+#if !TARGET_OS_TV && RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
81+ NSNumber *glassEffectNum = dict[@"glassEffect"];
82+ if (@available(iOS 26.0, *)) {
83+ if ([glassEffectNum boolValue]) {
84+ UIButtonConfiguration *configuration = [UIButtonConfiguration glassButtonConfiguration];
85+ configuration.cornerStyle = UIButtonConfigurationCornerStyleCapsule;
86+ UIBackgroundConfiguration *background = configuration.background;
87+ background.strokeWidth = 0.0;
88+ background.strokeColor = UIColor.clearColor;
89+ configuration.background = background;
90+ configuration.contentInsets = NSDirectionalEdgeInsetsZero;
91+ if (title != nil) {
92+ configuration.title = title;
93+ }
94+
95+ UIButton *button = [UIButton buttonWithConfiguration:configuration primaryAction:nil];
96+ button.translatesAutoresizingMaskIntoConstraints = NO;
97+ button.enabled = self.enabled;
98+ button.accessibilityLabel = self.accessibilityLabel;
99+ button.accessibilityHint = self.accessibilityHint;
100+
101+ CGFloat resolvedWidth = width != nil ? width.doubleValue : 56.0;
102+ [button.widthAnchor constraintEqualToConstant:resolvedWidth].active = YES;
103+ [button.heightAnchor constraintEqualToConstant:50.0].active = YES;
104+
105+ [[self class] resolveImageFromConfig:dict
106+ imageLoader:imageLoader
107+ completionBlock:^(UIImage *img) {
108+ UIButtonConfiguration *updatedConfiguration = button.configuration;
109+ updatedConfiguration.image = img;
110+ button.configuration = updatedConfiguration;
111+ }];
112+
113+ NSDictionary *menu = dict[@"menu"];
114+ if (menu) {
115+ button.menu = [[self class] initUIMenuWithDict:menu menuAction:menuAction imageLoader:imageLoader];
116+ button.showsMenuAsPrimaryAction = YES;
117+ } else {
118+ NSString *buttonId = dict[@"buttonId"];
119+ if (buttonId && action) {
120+ UIAction *pressAction = [UIAction actionWithHandler:^(__kindof UIAction *_Nonnull sender) {
121+ action(buttonId);
122+ }];
123+ [button addAction:pressAction forControlEvents:UIControlEventTouchUpInside];
124+ }
125+ }
126+
127+ self.customView = button;
128+ return self;
129+ }
130+ }
131+#endif
132
133 #if !TARGET_OS_TV || __TV_OS_VERSION_MAX_ALLOWED >= 170000
134 if (@available(tvOS 17.0, *)) {
135diff --git a/ios/RNSScreenStack.mm b/ios/RNSScreenStack.mm
136index c233036..0c2db42 100644
137--- a/ios/RNSScreenStack.mm
138+++ b/ios/RNSScreenStack.mm
139@@ -1076,6 +1076,15 @@ - (BOOL)scrollViewHasHorizontalPart:(UIScrollView *)scrollView
140 return scrollView.contentSize.width > scrollView.frame.size.width;
141 }
142
143+// Whether a horizontally scrollable ScrollView is resting at its leading edge, so a
144+// pan in the back-gesture direction has nothing left to scroll. Checked in the
145+// ScrollView's own coordinate space: React Native mirrors the view for RTL layout,
146+// which keeps the leading edge at the minimum content offset in both directions.
147+- (BOOL)scrollViewIsAtLeadingEdge:(UIScrollView *)scrollView
148+{
149+ return scrollView.contentOffset.x <= -scrollView.adjustedContentInset.left + 1.0;
150+}
151+
152 // Custom method for compatibility with iOS < 13.4
153 // RNSScreenStackView is a UIGestureRecognizerDelegate for three types of gesture recognizers:
154 // RNSPanGestureRecognizer, RNSScreenEdgeGestureRecognizer, _UIParallaxTransitionPanGestureRecognizer
155@@ -1169,9 +1178,11 @@ - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
156 if (gestureRecognizer == _controller.interactiveContentPopGestureRecognizer &&
157 [self isScrollViewPanGestureRecognizer:otherGestureRecognizer]) {
158 // ScrollView should take precedence when scrolling horizontally (it should be required to fail).
159- // However, if it does not allow for horizontal scrolling, there should be no such restriction,
160+ // However, if it does not allow for horizontal scrolling, or is already resting at its leading
161+ // edge so a back swipe has nothing left to scroll, there should be no such restriction,
162 // and swiping horizontally should dismiss the screen.
163- return [self scrollViewHasHorizontalPart:static_cast<UIScrollView *>(otherGestureRecognizer.view)];
164+ UIScrollView *scrollView = static_cast<UIScrollView *>(otherGestureRecognizer.view);
165+ return [self scrollViewHasHorizontalPart:scrollView] && ![self scrollViewIsAtLeadingEdge:scrollView];
166 }
167 }
168
169@@ -1191,6 +1202,15 @@ - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
170 // gestureRecognizer:shouldRequireFailureOfGestureRecognizer
171 isEdgeSwipeGestureRecognizer =
172 isEdgeSwipeGestureRecognizer && gestureRecognizer != _controller.interactiveContentPopGestureRecognizer;
173+
174+ // The exception is a horizontal ScrollView resting at its leading edge: its pan recognizer would
175+ // still begin (and merely bounce) on a back swipe, so it must yield to the pop gesture the same
176+ // way plain content does.
177+ if (gestureRecognizer == _controller.interactiveContentPopGestureRecognizer &&
178+ [self isScrollViewPanGestureRecognizer:otherGestureRecognizer]) {
179+ UIScrollView *scrollView = static_cast<UIScrollView *>(otherGestureRecognizer.view);
180+ return [self scrollViewHasHorizontalPart:scrollView] && [self scrollViewIsAtLeadingEdge:scrollView];
181+ }
182 }
183 #endif // check for iOS >= 26
184
185diff --git a/ios/RNSScreenStackHeaderConfig.h b/ios/RNSScreenStackHeaderConfig.h
186index 8a41697..309ba2f 100644
187--- a/ios/RNSScreenStackHeaderConfig.h
188+++ b/ios/RNSScreenStackHeaderConfig.h
189@@ -23,6 +23,8 @@
190 NS_ASSUME_NONNULL_BEGIN
191
192 @property (nonatomic, retain) NSString *title;
193+@property (nonatomic, retain) NSString *subtitle;
194+@property (nonatomic, retain) NSString *largeSubtitle;
195 @property (nonatomic, retain) NSString *titleFontFamily;
196 @property (nonatomic, retain) NSNumber *titleFontSize;
197 @property (nonatomic, retain) NSString *titleFontWeight;
198@@ -47,9 +49,12 @@ NS_ASSUME_NONNULL_BEGIN
199 @property (nonatomic) BOOL backButtonInCustomView;
200 @property (nonatomic) UISemanticContentAttribute direction;
201 @property (nonatomic) UINavigationItemBackButtonDisplayMode backButtonDisplayMode;
202+@property (nonatomic) NSInteger navigationItemStyle;
203 @property (nonatomic) RNSBlurEffectStyle blurEffect;
204 @property (nonatomic, copy, nullable) NSArray<NSDictionary<NSString *, id> *> *headerRightBarButtonItems;
205 @property (nonatomic, copy, nullable) NSArray<NSDictionary<NSString *, id> *> *headerLeftBarButtonItems;
206+@property (nonatomic, copy, nullable) NSArray<NSDictionary<NSString *, id> *> *headerCenterBarButtonItems;
207+@property (nonatomic, copy, nullable) NSArray<NSDictionary<NSString *, id> *> *headerToolbarItems;
208 @property (nonatomic, readwrite) BOOL synchronousShadowStateUpdatesEnabled;
209
210 NS_ASSUME_NONNULL_END
211diff --git a/ios/RNSScreenStackHeaderConfig.mm b/ios/RNSScreenStackHeaderConfig.mm
212index a54cb63..4ff30b3 100644
213--- a/ios/RNSScreenStackHeaderConfig.mm
214+++ b/ios/RNSScreenStackHeaderConfig.mm
215@@ -24,11 +24,46 @@
216 #import "RNSSearchBar.h"
217 #import "UINavigationBar+RNSUtility.h"
218
219+#import <objc/runtime.h>
220+
221 namespace react = facebook::react;
222
223 static const NSNumber *const DEFAULT_TITLE_FONT_SIZE = @17;
224+
225+#if !TARGET_OS_TV
226+// Each placement keeps its own cache so changes to one side do not move live
227+// items on the other side into new groups during a navigation transition.
228+static char RNSAppliedLeadingHeaderItemsKey;
229+static char RNSAppliedTrailingHeaderItemsKey;
230+static char RNSAppliedCenterHeaderItemsKey;
231+
232+// Records a placement's owner and contents, returning whether they changed.
233+static BOOL RNSUpdateHeaderItemsCache(UINavigationItem *navitem, const void *key, NSArray *itemsKey)
234+{
235+ if ([objc_getAssociatedObject(navitem, key) isEqual:itemsKey]) {
236+ return NO;
237+ }
238+ objc_setAssociatedObject(navitem, key, itemsKey, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
239+ return YES;
240+}
241+#endif
242+static char RNSAppliedToolbarConfigsKey;
243 static const NSNumber *const DEFAULT_TITLE_LARGE_FONT_SIZE = @34;
244
245+static NSInteger navigationItemStyleFromCppEquivalent(
246+ react::RNSScreenStackHeaderConfigNavigationItemStyle navigationItemStyle)
247+{
248+ switch (navigationItemStyle) {
249+ case react::RNSScreenStackHeaderConfigNavigationItemStyle::Browser:
250+ return UINavigationItemStyleBrowser;
251+ case react::RNSScreenStackHeaderConfigNavigationItemStyle::Editor:
252+ return UINavigationItemStyleEditor;
253+ case react::RNSScreenStackHeaderConfigNavigationItemStyle::Navigator:
254+ default:
255+ return UINavigationItemStyleNavigator;
256+ }
257+}
258+
259 @interface RCTImageLoader (Private)
260 - (id<RCTImageCache>)imageCache;
261 @end
262@@ -46,6 +81,9 @@ + (BOOL)rnscreens_isBlankOrNull:(NSString *)string
263 @end
264
265 @interface RNSScreenStackHeaderConfig () <RCTMountingTransactionObserving>
266+#if !TARGET_OS_TV
267+- (NSArray<UIBarButtonItemGroup *> *)barButtonItemGroupsFromItems:(NSArray<UIBarButtonItem *> *)items;
268+#endif
269 @end
270
271 @implementation RNSScreenStackHeaderConfig {
272@@ -80,6 +118,7 @@ - (void)initProps
273 self.hidden = YES;
274 _reactSubviews = [NSMutableArray new];
275 _backTitleVisible = YES;
276+ _navigationItemStyle = UINavigationItemStyleNavigator;
277 _blurEffect = RNSBlurEffectStyleNone;
278 _synchronousShadowStateUpdatesEnabled = YES;
279 }
280@@ -507,6 +546,10 @@ + (void)updateViewController:(UIViewController *)vc
281
282 if (shouldHide) {
283 navitem.title = config.title;
284+ if (@available(iOS 26.0, *)) {
285+ navitem.subtitle = config.subtitle;
286+ navitem.largeSubtitle = config.largeSubtitle;
287+ }
288
289 // Setting navigation bar visibility is split to mitigate iOS 26 bug with bar button items.
290 [navctr setNavigationBarHidden:YES animated:animated];
291@@ -523,11 +566,19 @@ + (void)updateViewController:(UIViewController *)vc
292 }
293 navitem.largeTitleDisplayMode =
294 config.largeTitle ? UINavigationItemLargeTitleDisplayModeAlways : UINavigationItemLargeTitleDisplayModeNever;
295+
296+ if (@available(iOS 16.0, *)) {
297+ navitem.style = (UINavigationItemStyle)config.navigationItemStyle;
298+ }
299 #endif
300
301 UINavigationBarAppearance *appearance = [self buildAppearance:vc withConfig:config];
302 navitem.standardAppearance = appearance;
303 navitem.compactAppearance = appearance;
304+ if (@available(iOS 26.0, *)) {
305+ navitem.subtitle = config.subtitle;
306+ navitem.largeSubtitle = config.largeSubtitle;
307+ }
308
309 // appearance does not apply to the tvOS so we need to use lagacy customization
310 #if TARGET_OS_TV
311@@ -559,8 +610,6 @@ + (void)updateViewController:(UIViewController *)vc
312 navitem.leftItemsSupplementBackButton = config.backButtonInCustomView;
313 #endif
314 navitem.titleView = nil;
315- navitem.leftBarButtonItems = nil;
316- navitem.rightBarButtonItems = nil;
317
318 #if !TARGET_OS_TV
319 // We want to set navitem.searchController to nil only if we are sure
320@@ -568,22 +617,18 @@ + (void)updateViewController:(UIViewController *)vc
321 bool searchBarPresent = false;
322 #endif /* !TARGET_OS_TV */
323
324+ NSMutableArray<UIBarButtonItem *> *subviewLeftItems = [NSMutableArray array];
325+ NSMutableArray<UIBarButtonItem *> *subviewRightItems = [NSMutableArray array];
326 for (RNSScreenStackHeaderSubview *subview in config.reactSubviews) {
327 // This code should be kept in sync on Fabric with analogous switch statement in
328 // `- [RNSScreenStackHeaderConfig replaceNavigationBarViewsWithSnapshotOfSubview:]` method.
329 switch (subview.type) {
330 case RNSScreenStackHeaderSubviewTypeLeft: {
331- NSArray<UIBarButtonItem *> *currentItems = navitem.leftBarButtonItems ?: @[];
332- NSMutableArray<UIBarButtonItem *> *mutableItems = [currentItems mutableCopy];
333- [mutableItems addObject:[subview getUIBarButtonItem]];
334- navitem.leftBarButtonItems = mutableItems;
335+ [subviewLeftItems addObject:[subview getUIBarButtonItem]];
336 break;
337 }
338 case RNSScreenStackHeaderSubviewTypeRight: {
339- NSArray<UIBarButtonItem *> *currentItems = navitem.rightBarButtonItems ?: @[];
340- NSMutableArray<UIBarButtonItem *> *mutableItems = [currentItems mutableCopy];
341- [mutableItems addObject:[subview getUIBarButtonItem]];
342- navitem.rightBarButtonItems = mutableItems;
343+ [subviewRightItems addObject:[subview getUIBarButtonItem]];
344 break;
345 }
346 case RNSScreenStackHeaderSubviewTypeCenter:
347@@ -648,10 +693,479 @@ + (void)updateViewController:(UIViewController *)vc
348 // This assignment should be done after `navitem.titleView = ...` assignment (iOS 16.0 bug).
349 // See: https://github.com/software-mansion/react-native-screens/issues/1570 (comments)
350 navitem.title = config.title;
351- navitem.leftBarButtonItems = [config barButtonItemsFromConfigs:config.headerLeftBarButtonItems
352- withCurrentItems:navitem.leftBarButtonItems];
353- navitem.rightBarButtonItems = [config barButtonItemsFromConfigs:config.headerRightBarButtonItems
354- withCurrentItems:navitem.rightBarButtonItems];
355+ // Retain the config in the key so its address cannot be reused while cached.
356+ // Items capture this config's event emitter in their press handlers, so a
357+ // remounted header-config view with value-equal configs must still rebuild
358+ // instead of dispatching presses into the old config's emitter.
359+ // getUIBarButtonItem is stable for the lifetime of its React header
360+ // subview. Include those native identities in the key so React-backed
361+ // items can use the same cache without reusing a group after its view was
362+ // replaced.
363+ // A bar button item can belong to only one group. Even if the item itself
364+ // is reused, constructing a new group removes it from the old group that
365+ // UIKit may still be animating. Preserve each unchanged placement's group,
366+ // including the empty leading group beside the system back button.
367+#if !TARGET_OS_TV
368+ if (@available(iOS 16.0, *)) {
369+ NSArray *headerLeftConfigs = config.headerLeftBarButtonItems ?: @[];
370+ NSArray *headerRightConfigs = config.headerRightBarButtonItems ?: @[];
371+ NSArray *headerCenterConfigs = config.headerCenterBarButtonItems ?: @[];
372+ if (RNSUpdateHeaderItemsCache(
373+ navitem, &RNSAppliedLeadingHeaderItemsKey, @[ config, headerLeftConfigs, subviewLeftItems ])) {
374+ NSArray *items = [config barButtonItemsFromConfigs:config.headerLeftBarButtonItems
375+ withCurrentItems:subviewLeftItems
376+ navigationItem:navitem
377+ allowsSearchBarPlacement:NO];
378+ navitem.leadingItemGroups = [config barButtonItemGroupsFromItems:items];
379+ }
380+ if (RNSUpdateHeaderItemsCache(
381+ navitem, &RNSAppliedTrailingHeaderItemsKey, @[ config, headerRightConfigs, subviewRightItems ])) {
382+ NSArray *items = [config barButtonItemsFromConfigs:config.headerRightBarButtonItems
383+ withCurrentItems:subviewRightItems
384+ navigationItem:navitem
385+ allowsSearchBarPlacement:NO];
386+ navitem.trailingItemGroups = [config barButtonItemGroupsFromItems:items];
387+ }
388+ if (@available(iOS 26.0, *)) {
389+ if (RNSUpdateHeaderItemsCache(navitem, &RNSAppliedCenterHeaderItemsKey, @[ config, headerCenterConfigs ])) {
390+ NSArray *items = [config barButtonItemsFromConfigs:config.headerCenterBarButtonItems
391+ withCurrentItems:@[]
392+ navigationItem:navitem
393+ allowsSearchBarPlacement:NO];
394+ navitem.centerItemGroups = [config barButtonItemGroupsFromItems:items];
395+ }
396+ }
397+ } else
398+#endif
399+ {
400+ NSArray<UIBarButtonItem *> *leftBarButtonItems = [config barButtonItemsFromConfigs:config.headerLeftBarButtonItems
401+ withCurrentItems:subviewLeftItems
402+ navigationItem:navitem
403+ allowsSearchBarPlacement:NO];
404+ NSArray<UIBarButtonItem *> *rightBarButtonItems = [config barButtonItemsFromConfigs:config.headerRightBarButtonItems
405+ withCurrentItems:subviewRightItems
406+ navigationItem:navitem
407+ allowsSearchBarPlacement:NO];
408+ navitem.leftBarButtonItems = leftBarButtonItems;
409+ navitem.rightBarButtonItems = rightBarButtonItems;
410+ }
411+ NSDictionary<NSString *, id> *mailSearchToolbarConfig = nil;
412+ NSMutableArray<NSDictionary<NSString *, id> *> *nonMailSearchToolbarConfigs = [NSMutableArray array];
413+ for (NSDictionary<NSString *, id> *toolbarConfig in config.headerToolbarItems) {
414+ if (toolbarConfig[@"mailSearchToolbar"]) {
415+ if (mailSearchToolbarConfig == nil) {
416+ mailSearchToolbarConfig = toolbarConfig;
417+ }
418+ } else {
419+ [nonMailSearchToolbarConfigs addObject:toolbarConfig];
420+ }
421+ }
422+ NSArray<NSDictionary<NSString *, id> *> *navigationToolbarConfigs = [nonMailSearchToolbarConfigs copy];
423+ if (mailSearchToolbarConfig == nil) {
424+ for (NSDictionary<NSString *, id> *rightConfig in config.headerRightBarButtonItems) {
425+ if ([rightConfig[@"bottomMailSearchToolbar"] boolValue]) {
426+ mailSearchToolbarConfig = rightConfig;
427+ break;
428+ }
429+ }
430+ }
431+
432+ static NSInteger const RNSMailSearchToolbarViewTag = 260628;
433+ UIView *chromeHostView = vc.view;
434+ UIView *existingMailSearchToolbar = [chromeHostView viewWithTag:RNSMailSearchToolbarViewTag];
435+ if (existingMailSearchToolbar == nil) {
436+ existingMailSearchToolbar = [vc.view viewWithTag:RNSMailSearchToolbarViewTag];
437+ }
438+ // Reuse the live toolbar when nothing it was built from changed: rebuilding
439+ // replaces the fallback UISearchTextField with a fresh empty one, dropping
440+ // the user's in-progress search text and first responder on every unrelated
441+ // header update. Keyed on the config instance (the button/search blocks
442+ // capture its event emitter), the toolbar config values, and the host width
443+ // (the width constraint constant is resolved from it at build time).
444+ static char RNSAppliedMailSearchToolbarConfigKey;
445+ NSArray *mailSearchToolbarKey = mailSearchToolbarConfig != nil
446+ ? @[ @((uintptr_t)config), mailSearchToolbarConfig, @(chromeHostView.bounds.size.width) ]
447+ : nil;
448+ BOOL reuseMailSearchToolbar = existingMailSearchToolbar != nil && mailSearchToolbarKey != nil &&
449+ [objc_getAssociatedObject(existingMailSearchToolbar, &RNSAppliedMailSearchToolbarConfigKey)
450+ isEqual:mailSearchToolbarKey];
451+ if (!reuseMailSearchToolbar) {
452+ [existingMailSearchToolbar removeFromSuperview];
453+ }
454+
455+ if (mailSearchToolbarConfig != nil && !reuseMailSearchToolbar) {
456+#if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
457+ if (@available(iOS 26.0, *)) {
458+ CGFloat horizontalInset = 18.0;
459+ NSNumber *width = mailSearchToolbarConfig[@"width"];
460+ CGFloat hostWidth = chromeHostView.bounds.size.width;
461+ if (hostWidth <= 0.0) {
462+ hostWidth = vc.view.bounds.size.width;
463+ }
464+ if (hostWidth <= 0.0) {
465+ hostWidth = [UIScreen mainScreen].bounds.size.width;
466+ }
467+ CGFloat fallbackWidth = MIN(560.0, MAX(300.0, hostWidth - (horizontalInset * 2.0)));
468+ CGFloat resolvedWidth = width != nil ? width.doubleValue : fallbackWidth;
469+ if (hostWidth > 0.0) {
470+ resolvedWidth = MIN(resolvedWidth, MAX(260.0, hostWidth - 12.0));
471+ }
472+
473+ CGFloat toolbarHeight = 48.0;
474+ CGFloat toolbarRadius = toolbarHeight / 2.0;
475+ CGFloat buttonSize = toolbarHeight;
476+ CGFloat sideButtonReserve = buttonSize + 8.0;
477+ CGFloat searchFieldHeight = 42.0;
478+ CGFloat toolbarBottomSpacing = 4.0;
479+ UIFont *searchFont = [UIFont preferredFontForTextStyle:UIFontTextStyleTitle3];
480+ NSDictionary<NSAttributedStringKey, id> *placeholderAttributes = @{
481+ NSForegroundColorAttributeName : UIColor.secondaryLabelColor,
482+ NSFontAttributeName : searchFont,
483+ };
484+ UIKeyboardLayoutGuide *keyboardLayoutGuide = chromeHostView.keyboardLayoutGuide;
485+
486+ UIView *toolbarHost = [[UIView alloc] init];
487+ toolbarHost.tag = RNSMailSearchToolbarViewTag;
488+ objc_setAssociatedObject(
489+ toolbarHost,
490+ &RNSAppliedMailSearchToolbarConfigKey,
491+ mailSearchToolbarKey,
492+ OBJC_ASSOCIATION_RETAIN_NONATOMIC);
493+ toolbarHost.translatesAutoresizingMaskIntoConstraints = NO;
494+ [chromeHostView addSubview:toolbarHost];
495+ // The screen stays mounted beneath pushed routes, so its keyboard layout
496+ // guide can track a keyboard owned by another screen. Keep the toolbar at
497+ // rest unless its own search field is editing.
498+ NSLayoutConstraint *keyboardAvoidConstraint =
499+ [toolbarHost.bottomAnchor constraintEqualToAnchor:keyboardLayoutGuide.topAnchor
500+ constant:-toolbarBottomSpacing];
501+ keyboardAvoidConstraint.priority = UILayoutPriorityDefaultLow;
502+ NSLayoutConstraint *restingBottomConstraint =
503+ [toolbarHost.bottomAnchor constraintEqualToAnchor:chromeHostView.safeAreaLayoutGuide.bottomAnchor
504+ constant:-toolbarBottomSpacing];
505+ restingBottomConstraint.priority = UILayoutPriorityDefaultHigh;
506+ [NSLayoutConstraint activateConstraints:@[
507+ [toolbarHost.centerXAnchor constraintEqualToAnchor:chromeHostView.centerXAnchor],
508+ [toolbarHost.bottomAnchor constraintLessThanOrEqualToAnchor:chromeHostView.safeAreaLayoutGuide.bottomAnchor
509+ constant:-toolbarBottomSpacing],
510+ keyboardAvoidConstraint,
511+ restingBottomConstraint,
512+ [toolbarHost.widthAnchor constraintEqualToConstant:resolvedWidth],
513+ [toolbarHost.heightAnchor constraintEqualToConstant:toolbarHeight],
514+ ]];
515+ [chromeHostView bringSubviewToFront:toolbarHost];
516+
517+ UIGlassEffect *glassEffect = [UIGlassEffect effectWithStyle:UIGlassEffectStyleRegular];
518+ glassEffect.interactive = YES;
519+ UIVisualEffectView *glassView = [[UIVisualEffectView alloc] initWithEffect:glassEffect];
520+ glassView.clipsToBounds = YES;
521+ glassView.layer.cornerRadius = toolbarRadius;
522+ glassView.translatesAutoresizingMaskIntoConstraints = NO;
523+ [toolbarHost addSubview:glassView];
524+ BOOL hasFilterButton =
525+ mailSearchToolbarConfig[@"filterButtonId"] != nil || mailSearchToolbarConfig[@"filterMenu"] != nil;
526+ BOOL hasComposeButton =
527+ mailSearchToolbarConfig[@"composeButtonId"] != nil || mailSearchToolbarConfig[@"composeMenu"] != nil;
528+ CGFloat glassLeadingInset = hasFilterButton ? sideButtonReserve : 0.0;
529+ CGFloat glassTrailingInset = hasComposeButton ? -sideButtonReserve : 0.0;
530+ NSLayoutConstraint *glassLeadingConstraint =
531+ [glassView.leadingAnchor constraintEqualToAnchor:toolbarHost.leadingAnchor constant:glassLeadingInset];
532+ NSLayoutConstraint *glassTrailingConstraint =
533+ [glassView.trailingAnchor constraintEqualToAnchor:toolbarHost.trailingAnchor constant:glassTrailingInset];
534+ [NSLayoutConstraint activateConstraints:@[
535+ glassLeadingConstraint,
536+ glassTrailingConstraint,
537+ [glassView.centerYAnchor constraintEqualToAnchor:toolbarHost.centerYAnchor],
538+ [glassView.heightAnchor constraintEqualToConstant:toolbarHeight],
539+ ]];
540+
541+ void (^emitButtonPress)(NSString *) = ^(NSString *buttonId) {
542+ auto eventEmitter = std::static_pointer_cast<const facebook::react::RNSScreenStackHeaderConfigEventEmitter>(
543+ config->_eventEmitter);
544+ if (eventEmitter && buttonId) {
545+ eventEmitter->onPressHeaderBarButtonItem(
546+ facebook::react::RNSScreenStackHeaderConfigEventEmitter::OnPressHeaderBarButtonItem{
547+ .buttonId = std::string([buttonId UTF8String])});
548+ }
549+ };
550+
551+ void (^emitMenuPress)(NSString *) = ^(NSString *menuId) {
552+ auto eventEmitter = std::static_pointer_cast<const facebook::react::RNSScreenStackHeaderConfigEventEmitter>(
553+ config->_eventEmitter);
554+ if (eventEmitter && menuId) {
555+ eventEmitter->onPressHeaderBarButtonMenuItem(
556+ facebook::react::RNSScreenStackHeaderConfigEventEmitter::OnPressHeaderBarButtonMenuItem{
557+ .menuId = std::string([menuId UTF8String])});
558+ }
559+ };
560+
561+ UIButton *(^makeGlassButton)(NSString *, NSString *, NSDictionary *) =
562+ ^UIButton *(NSString *systemImageName, NSString *buttonId, NSDictionary *menuConfig) {
563+ UIButtonConfiguration *configuration = [UIButtonConfiguration glassButtonConfiguration];
564+ configuration.cornerStyle = UIButtonConfigurationCornerStyleCapsule;
565+ configuration.image = [UIImage systemImageNamed:systemImageName ?: @"circle"];
566+ configuration.baseForegroundColor = UIColor.labelColor;
567+ UIButton *button = [UIButton buttonWithConfiguration:configuration primaryAction:nil];
568+ if (menuConfig != nil) {
569+ button.menu = [RNSBarButtonItem initUIMenuWithDict:menuConfig
570+ menuAction:emitMenuPress
571+ imageLoader:config->_imageLoader];
572+ button.showsMenuAsPrimaryAction = YES;
573+ } else if (buttonId != nil) {
574+ UIAction *action = [UIAction actionWithHandler:^(__kindof UIAction *_Nonnull action) {
575+ emitButtonPress(buttonId);
576+ }];
577+ [button addAction:action forControlEvents:UIControlEventTouchUpInside];
578+ }
579+ return button;
580+ };
581+
582+ BOOL useFallbackSearchField = [mailSearchToolbarConfig[@"useFallbackSearchField"] boolValue];
583+ UISearchBar *searchBar =
584+ !useFallbackSearchField && navitem.searchController != nil ? navitem.searchController.searchBar : nil;
585+ NSString *placeholder = mailSearchToolbarConfig[@"placeholder"];
586+ UITextField *resolvedSearchTextField = nil;
587+ if (searchBar != nil) {
588+ if (placeholder != nil) {
589+ searchBar.placeholder = placeholder;
590+ }
591+ searchBar.hidden = NO;
592+ searchBar.alpha = 1.0;
593+ searchBar.userInteractionEnabled = YES;
594+ searchBar.searchBarStyle = UISearchBarStyleMinimal;
595+ searchBar.backgroundImage = [UIImage new];
596+ searchBar.searchTextField.hidden = NO;
597+ searchBar.searchTextField.alpha = 1.0;
598+ searchBar.searchTextField.backgroundColor = UIColor.clearColor;
599+ searchBar.searchTextField.font = searchFont;
600+ searchBar.searchTextField.adjustsFontForContentSizeCategory = YES;
601+ searchBar.searchTextField.textColor = UIColor.labelColor;
602+ searchBar.searchTextField.tintColor = UIColor.labelColor;
603+ resolvedSearchTextField = searchBar.searchTextField;
604+ if (placeholder != nil) {
605+ searchBar.searchTextField.attributedPlaceholder =
606+ [[NSAttributedString alloc] initWithString:placeholder attributes:placeholderAttributes];
607+ }
608+ searchBar.translatesAutoresizingMaskIntoConstraints = NO;
609+ [glassView.contentView addSubview:searchBar];
610+ [NSLayoutConstraint activateConstraints:@[
611+ [searchBar.leadingAnchor constraintEqualToAnchor:glassView.contentView.leadingAnchor constant:8.0],
612+ [searchBar.trailingAnchor constraintEqualToAnchor:glassView.contentView.trailingAnchor constant:-8.0],
613+ [searchBar.centerYAnchor constraintEqualToAnchor:glassView.contentView.centerYAnchor],
614+ [searchBar.heightAnchor constraintEqualToConstant:searchFieldHeight],
615+ ]];
616+ } else {
617+ UISearchTextField *searchField = [UISearchTextField new];
618+ if (placeholder != nil) {
619+ searchField.placeholder = placeholder;
620+ searchField.attributedPlaceholder =
621+ [[NSAttributedString alloc] initWithString:placeholder attributes:placeholderAttributes];
622+ }
623+ searchField.borderStyle = UITextBorderStyleNone;
624+ searchField.font = searchFont;
625+ searchField.adjustsFontForContentSizeCategory = YES;
626+ searchField.textColor = UIColor.labelColor;
627+ searchField.tintColor = UIColor.labelColor;
628+ resolvedSearchTextField = searchField;
629+ searchField.translatesAutoresizingMaskIntoConstraints = NO;
630+ [glassView.contentView addSubview:searchField];
631+ [NSLayoutConstraint activateConstraints:@[
632+ [searchField.leadingAnchor constraintEqualToAnchor:glassView.contentView.leadingAnchor constant:14.0],
633+ [searchField.trailingAnchor constraintEqualToAnchor:glassView.contentView.trailingAnchor constant:-14.0],
634+ [searchField.centerYAnchor constraintEqualToAnchor:glassView.contentView.centerYAnchor],
635+ [searchField.heightAnchor constraintEqualToConstant:searchFieldHeight],
636+ ]];
637+ }
638+
639+ // A bare UISearchTextField keeps UITextField defaults (sentence
640+ // capitalization, autocorrect), unlike UISearchBar. Search queries are
641+ // identifiers, so match the autoCapitalize "none" the JS fallbacks use.
642+ if (resolvedSearchTextField != nil) {
643+ resolvedSearchTextField.autocapitalizationType = UITextAutocapitalizationTypeNone;
644+ resolvedSearchTextField.autocorrectionType = UITextAutocorrectionTypeNo;
645+ resolvedSearchTextField.spellCheckingType = UITextSpellCheckingTypeNo;
646+ }
647+
648+ NSString *searchTextChangeId = mailSearchToolbarConfig[@"searchTextChangeId"];
649+ NSString *searchTextChangeActionIdentifier = @"org.react-native-screens.mail-search-toolbar.text-change";
650+ if (resolvedSearchTextField != nil) {
651+ [resolvedSearchTextField removeActionForIdentifier:searchTextChangeActionIdentifier
652+ forControlEvents:UIControlEventEditingChanged];
653+ }
654+ if (searchTextChangeId != nil && resolvedSearchTextField != nil) {
655+ [resolvedSearchTextField
656+ addAction:[UIAction actionWithTitle:@""
657+ image:nil
658+ identifier:searchTextChangeActionIdentifier
659+ handler:^(__kindof UIAction *_Nonnull action) {
660+ UITextField *field = (UITextField *)action.sender;
661+ emitButtonPress(
662+ [NSString stringWithFormat:@"%@:%@", searchTextChangeId, field.text ?: @""]);
663+ }]
664+ forControlEvents:UIControlEventEditingChanged];
665+ }
666+
667+ UIButton *filterButton = nil;
668+ if (hasFilterButton) {
669+ filterButton = makeGlassButton(
670+ mailSearchToolbarConfig[@"filterSystemImageName"] ?: @"line.3.horizontal.decrease",
671+ mailSearchToolbarConfig[@"filterButtonId"],
672+ mailSearchToolbarConfig[@"filterMenu"]);
673+ filterButton.translatesAutoresizingMaskIntoConstraints = NO;
674+ [toolbarHost addSubview:filterButton];
675+ [NSLayoutConstraint activateConstraints:@[
676+ [filterButton.leadingAnchor constraintEqualToAnchor:toolbarHost.leadingAnchor],
677+ [filterButton.centerYAnchor constraintEqualToAnchor:toolbarHost.centerYAnchor],
678+ [filterButton.widthAnchor constraintEqualToConstant:buttonSize],
679+ [filterButton.heightAnchor constraintEqualToConstant:buttonSize],
680+ ]];
681+ }
682+
683+ UIButton *composeButton = nil;
684+ if (hasComposeButton) {
685+ composeButton = makeGlassButton(
686+ mailSearchToolbarConfig[@"composeSystemImageName"] ?: @"square.and.pencil",
687+ mailSearchToolbarConfig[@"composeButtonId"],
688+ mailSearchToolbarConfig[@"composeMenu"]);
689+ composeButton.translatesAutoresizingMaskIntoConstraints = NO;
690+ [toolbarHost addSubview:composeButton];
691+ [NSLayoutConstraint activateConstraints:@[
692+ [composeButton.trailingAnchor constraintEqualToAnchor:toolbarHost.trailingAnchor],
693+ [composeButton.centerYAnchor constraintEqualToAnchor:toolbarHost.centerYAnchor],
694+ [composeButton.widthAnchor constraintEqualToConstant:buttonSize],
695+ [composeButton.heightAnchor constraintEqualToConstant:buttonSize],
696+ ]];
697+ }
698+
699+ BOOL showsSearchDismissButton =
700+ [mailSearchToolbarConfig[@"showsSearchDismissButton"] boolValue] && resolvedSearchTextField != nil;
701+ UIButton *searchDismissButton = nil;
702+ if (showsSearchDismissButton) {
703+ searchDismissButton = makeGlassButton(@"xmark", nil, nil);
704+ searchDismissButton.accessibilityLabel = @"Dismiss search keyboard";
705+ searchDismissButton.alpha = 0.0;
706+ searchDismissButton.hidden = YES;
707+ searchDismissButton.translatesAutoresizingMaskIntoConstraints = NO;
708+ [toolbarHost addSubview:searchDismissButton];
709+ [NSLayoutConstraint activateConstraints:@[
710+ [searchDismissButton.trailingAnchor constraintEqualToAnchor:toolbarHost.trailingAnchor],
711+ [searchDismissButton.centerYAnchor constraintEqualToAnchor:toolbarHost.centerYAnchor],
712+ [searchDismissButton.widthAnchor constraintEqualToConstant:buttonSize],
713+ [searchDismissButton.heightAnchor constraintEqualToConstant:buttonSize],
714+ ]];
715+ __weak UITextField *weakSearchTextField = resolvedSearchTextField;
716+ [searchDismissButton
717+ addAction:[UIAction actionWithHandler:^(__kindof UIAction *_Nonnull action) {
718+ [weakSearchTextField resignFirstResponder];
719+ }]
720+ forControlEvents:UIControlEventTouchUpInside];
721+ }
722+
723+ __weak UIButton *weakFilterButton = filterButton;
724+ __weak UIButton *weakComposeButton = composeButton;
725+ __weak UIButton *weakSearchDismissButton = searchDismissButton;
726+ __weak NSLayoutConstraint *weakGlassLeadingConstraint = glassLeadingConstraint;
727+ __weak NSLayoutConstraint *weakGlassTrailingConstraint = glassTrailingConstraint;
728+ __weak NSLayoutConstraint *weakKeyboardAvoidConstraint = keyboardAvoidConstraint;
729+ __weak NSLayoutConstraint *weakRestingBottomConstraint = restingBottomConstraint;
730+ __weak UIView *weakToolbarHost = toolbarHost;
731+ __weak UITextField *weakSearchTextField = resolvedSearchTextField;
732+ void (^setSearchEditingAppearance)(BOOL, BOOL) = ^(BOOL isEditing, BOOL animated) {
733+ weakKeyboardAvoidConstraint.priority =
734+ isEditing ? UILayoutPriorityDefaultHigh : UILayoutPriorityDefaultLow;
735+ weakRestingBottomConstraint.priority =
736+ isEditing ? UILayoutPriorityDefaultLow : UILayoutPriorityDefaultHigh;
737+
738+ if (showsSearchDismissButton) {
739+ if (isEditing) {
740+ weakSearchDismissButton.hidden = NO;
741+ } else {
742+ weakFilterButton.hidden = NO;
743+ weakComposeButton.hidden = NO;
744+ }
745+ weakGlassLeadingConstraint.constant = isEditing ? 0.0 : glassLeadingInset;
746+ weakGlassTrailingConstraint.constant = isEditing ? -sideButtonReserve : glassTrailingInset;
747+
748+ void (^changes)(void) = ^{
749+ weakFilterButton.alpha = isEditing ? 0.0 : 1.0;
750+ weakComposeButton.alpha = isEditing ? 0.0 : 1.0;
751+ weakSearchDismissButton.alpha = isEditing ? 1.0 : 0.0;
752+ [weakToolbarHost layoutIfNeeded];
753+ };
754+ void (^completion)(BOOL) = ^(BOOL finished) {
755+ if (!finished || weakSearchTextField.isFirstResponder != isEditing) {
756+ return;
757+ }
758+ weakFilterButton.hidden = isEditing;
759+ weakComposeButton.hidden = isEditing;
760+ weakSearchDismissButton.hidden = !isEditing;
761+ };
762+ if (animated) {
763+ [UIView animateWithDuration:0.2
764+ delay:0.0
765+ options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionCurveEaseInOut
766+ animations:changes
767+ completion:completion];
768+ } else {
769+ changes();
770+ completion(YES);
771+ }
772+ }
773+ [weakToolbarHost setNeedsLayout];
774+ };
775+
776+ setSearchEditingAppearance(resolvedSearchTextField.isFirstResponder, NO);
777+ NSString *beginActionIdentifier = @"org.react-native-screens.mail-search-toolbar.keyboard-begin";
778+ NSString *endActionIdentifier = @"org.react-native-screens.mail-search-toolbar.keyboard-end";
779+ [resolvedSearchTextField removeActionForIdentifier:beginActionIdentifier
780+ forControlEvents:UIControlEventEditingDidBegin];
781+ [resolvedSearchTextField removeActionForIdentifier:endActionIdentifier
782+ forControlEvents:UIControlEventEditingDidEnd];
783+ [resolvedSearchTextField
784+ addAction:[UIAction actionWithTitle:@""
785+ image:nil
786+ identifier:beginActionIdentifier
787+ handler:^(__kindof UIAction *_Nonnull action) {
788+ setSearchEditingAppearance(YES, YES);
789+ }]
790+ forControlEvents:UIControlEventEditingDidBegin];
791+ [resolvedSearchTextField
792+ addAction:[UIAction actionWithTitle:@""
793+ image:nil
794+ identifier:endActionIdentifier
795+ handler:^(__kindof UIAction *_Nonnull action) {
796+ setSearchEditingAppearance(NO, YES);
797+ }]
798+ forControlEvents:UIControlEventEditingDidEnd];
799+ }
800+#endif
801+ }
802+
803+ NSArray *toolbarConfigsKey = navigationToolbarConfigs ?: @[];
804+ // Same reuse rule as the header item groups above (including the config
805+ // identity — cached toolbar items capture this config's event emitter).
806+ // The top-view-controller and hidden-state checks scope the skip to
807+ // same-screen refreshes, so transitions between screens with different
808+ // toolbars still reapply.
809+ NSArray *toolbarCacheKey = @[ @((uintptr_t)config), toolbarConfigsKey ];
810+ BOOL reuseToolbarItems = navctr.topViewController == vc &&
811+ navctr.isToolbarHidden == (toolbarConfigsKey.count == 0) &&
812+ [objc_getAssociatedObject(navitem, &RNSAppliedToolbarConfigsKey) isEqual:toolbarCacheKey];
813+ if (navctr.topViewController == vc && !reuseToolbarItems) {
814+ NSArray<UIBarButtonItem *> *toolbarItems = [config barButtonItemsFromConfigs:navigationToolbarConfigs
815+ withCurrentItems:@[]
816+ navigationItem:navitem
817+ allowsSearchBarPlacement:YES];
818+ if (toolbarItems.count > 0) {
819+ vc.toolbarItems = toolbarItems;
820+ [navctr setToolbarHidden:NO animated:animated];
821+ } else {
822+ vc.toolbarItems = nil;
823+ [navctr setToolbarHidden:YES animated:animated];
824+ }
825+ objc_setAssociatedObject(
826+ navitem, &RNSAppliedToolbarConfigsKey, toolbarCacheKey, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
827+ }
828
829 // Setting navigation bar visibility is split to mitigate iOS 26 bug with bar button items
830 // (setting nav bar visibility should be done after `navitem.*BarButtonItems`).
831@@ -784,6 +1298,8 @@ - (void)applySemanticContentAttributeIfNeededToNavCtrl:(UINavigationController *
832
833 - (NSArray<UIBarButtonItem *> *)barButtonItemsFromConfigs:(NSArray<NSDictionary<NSString *, id> *> *)dicts
834 withCurrentItems:(NSArray<UIBarButtonItem *> *)currentItems
835+ navigationItem:(UINavigationItem *)navitem
836+ allowsSearchBarPlacement:(BOOL)allowsSearchBarPlacement
837 {
838 if (dicts.count == 0) {
839 return currentItems;
840@@ -792,7 +1308,200 @@ - (void)applySemanticContentAttributeIfNeededToNavCtrl:(UINavigationController *
841 [items addObjectsFromArray:currentItems];
842 for (NSUInteger i = 0; i < dicts.count; i++) {
843 NSDictionary *dict = dicts[i];
844- if (dict[@"buttonId"] || dict[@"menu"]) {
845+ if (dict[@"mailSearchToolbar"]) {
846+#if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
847+ if (@available(iOS 26.0, *)) {
848+ NSNumber *width = dict[@"width"];
849+ CGFloat resolvedWidth = width != nil ? width.doubleValue : MAX(320.0, [UIScreen mainScreen].bounds.size.width - 56.0);
850+ CGFloat resolvedHeight = 58.0;
851+ UIView *container = [[UIView alloc] initWithFrame:CGRectMake(0, 0, resolvedWidth, resolvedHeight)];
852+ container.translatesAutoresizingMaskIntoConstraints = NO;
853+ [container.widthAnchor constraintEqualToConstant:resolvedWidth].active = YES;
854+ [container.heightAnchor constraintEqualToConstant:resolvedHeight].active = YES;
855+
856+ UIStackView *stackView = [[UIStackView alloc] initWithFrame:container.bounds];
857+ stackView.axis = UILayoutConstraintAxisHorizontal;
858+ stackView.alignment = UIStackViewAlignmentCenter;
859+ stackView.distribution = UIStackViewDistributionFill;
860+ stackView.spacing = 10.0;
861+ stackView.translatesAutoresizingMaskIntoConstraints = NO;
862+ [container addSubview:stackView];
863+ [NSLayoutConstraint activateConstraints:@[
864+ [stackView.leadingAnchor constraintEqualToAnchor:container.leadingAnchor],
865+ [stackView.trailingAnchor constraintEqualToAnchor:container.trailingAnchor],
866+ [stackView.centerYAnchor constraintEqualToAnchor:container.centerYAnchor],
867+ [stackView.heightAnchor constraintEqualToConstant:50.0],
868+ ]];
869+
870+ void (^emitButtonPress)(NSString *) = ^(NSString *buttonId) {
871+ auto eventEmitter = std::static_pointer_cast<const facebook::react::RNSScreenStackHeaderConfigEventEmitter>(
872+ self->_eventEmitter);
873+ if (eventEmitter && buttonId) {
874+ eventEmitter->onPressHeaderBarButtonItem(
875+ facebook::react::RNSScreenStackHeaderConfigEventEmitter::OnPressHeaderBarButtonItem{
876+ .buttonId = std::string([buttonId UTF8String])});
877+ }
878+ };
879+
880+ void (^emitMenuPress)(NSString *) = ^(NSString *menuId) {
881+ auto eventEmitter = std::static_pointer_cast<const facebook::react::RNSScreenStackHeaderConfigEventEmitter>(
882+ self->_eventEmitter);
883+ if (eventEmitter && menuId) {
884+ eventEmitter->onPressHeaderBarButtonMenuItem(
885+ facebook::react::RNSScreenStackHeaderConfigEventEmitter::OnPressHeaderBarButtonMenuItem{
886+ .menuId = std::string([menuId UTF8String])});
887+ }
888+ };
889+
890+ UIButton *(^makeGlassButton)(NSString *, NSString *, NSDictionary *) =
891+ ^UIButton *(NSString *systemImageName, NSString *buttonId, NSDictionary *menuConfig) {
892+ UIButtonConfiguration *configuration = [UIButtonConfiguration glassButtonConfiguration];
893+ configuration.cornerStyle = UIButtonConfigurationCornerStyleCapsule;
894+ configuration.image = [UIImage systemImageNamed:systemImageName ?: @"circle"];
895+
896+ UIButton *button = [UIButton buttonWithConfiguration:configuration primaryAction:nil];
897+ button.translatesAutoresizingMaskIntoConstraints = NO;
898+ [button.widthAnchor constraintEqualToConstant:58.0].active = YES;
899+ [button.heightAnchor constraintEqualToConstant:50.0].active = YES;
900+ if (menuConfig != nil) {
901+ button.menu = [RNSBarButtonItem initUIMenuWithDict:menuConfig
902+ menuAction:emitMenuPress
903+ imageLoader:self->_imageLoader];
904+ button.showsMenuAsPrimaryAction = YES;
905+ } else if (buttonId != nil) {
906+ UIAction *action = [UIAction actionWithHandler:^(__kindof UIAction *_Nonnull action) {
907+ emitButtonPress(buttonId);
908+ }];
909+ [button addAction:action forControlEvents:UIControlEventTouchUpInside];
910+ }
911+ return button;
912+ };
913+
914+ BOOL hasFilterButton = dict[@"filterButtonId"] != nil || dict[@"filterMenu"] != nil;
915+ BOOL hasComposeButton = dict[@"composeButtonId"] != nil || dict[@"composeMenu"] != nil;
916+
917+ if (hasFilterButton) {
918+ UIButton *filterButton = makeGlassButton(
919+ dict[@"filterSystemImageName"] ?: @"line.3.horizontal.decrease",
920+ dict[@"filterButtonId"],
921+ dict[@"filterMenu"]);
922+ [stackView addArrangedSubview:filterButton];
923+ }
924+
925+ UISearchBar *searchBar = navitem.searchController != nil ? navitem.searchController.searchBar : [UISearchBar new];
926+ NSString *placeholder = dict[@"placeholder"];
927+ if (placeholder != nil) {
928+ searchBar.placeholder = placeholder;
929+ }
930+ searchBar.searchBarStyle = UISearchBarStyleMinimal;
931+ searchBar.translatesAutoresizingMaskIntoConstraints = NO;
932+ [searchBar.heightAnchor constraintEqualToConstant:50.0].active = YES;
933+ [stackView addArrangedSubview:searchBar];
934+
935+ if (hasComposeButton) {
936+ UIButton *composeButton = makeGlassButton(
937+ dict[@"composeSystemImageName"] ?: @"square.and.pencil",
938+ dict[@"composeButtonId"],
939+ dict[@"composeMenu"]);
940+ [stackView addArrangedSubview:composeButton];
941+ }
942+
943+ UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:container];
944+ [items addObject:item];
945+ }
946+#endif
947+ } else if (dict[@"searchField"]) {
948+#if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
949+ if (@available(iOS 26.0, *)) {
950+ NSNumber *width = dict[@"width"];
951+ CGFloat resolvedWidth = width != nil ? width.doubleValue : 280.0;
952+ UIView *container = [[UIView alloc] initWithFrame:CGRectMake(0, 0, resolvedWidth, 44.0)];
953+ container.translatesAutoresizingMaskIntoConstraints = NO;
954+ [container.widthAnchor constraintEqualToConstant:resolvedWidth].active = YES;
955+ [container.heightAnchor constraintEqualToConstant:44.0].active = YES;
956+
957+ UISearchTextField *searchField = [UISearchTextField new];
958+ NSString *placeholder = dict[@"placeholder"];
959+ if (placeholder != nil) {
960+ searchField.placeholder = placeholder;
961+ }
962+ searchField.translatesAutoresizingMaskIntoConstraints = NO;
963+ [container addSubview:searchField];
964+ [NSLayoutConstraint activateConstraints:@[
965+ [searchField.leadingAnchor constraintEqualToAnchor:container.leadingAnchor],
966+ [searchField.trailingAnchor constraintEqualToAnchor:container.trailingAnchor],
967+ [searchField.centerYAnchor constraintEqualToAnchor:container.centerYAnchor],
968+ [searchField.heightAnchor constraintEqualToConstant:40.0],
969+ ]];
970+
971+ UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:container];
972+ [items addObject:item];
973+ }
974+#endif
975+ } else if (dict[@"searchBarPlacement"]) {
976+ if (!allowsSearchBarPlacement) {
977+ continue;
978+ }
979+#if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
980+ if (@available(iOS 26.0, *)) {
981+ NSNumber *width = dict[@"width"];
982+ UIBarButtonItem *item = nil;
983+ if ([dict[@"activatesSearchController"] boolValue]) {
984+ UIButtonConfiguration *configuration = [UIButtonConfiguration glassButtonConfiguration];
985+ configuration.cornerStyle = UIButtonConfigurationCornerStyleCapsule;
986+ configuration.image = [UIImage systemImageNamed:@"magnifyingglass"];
987+ configuration.baseForegroundColor = UIColor.labelColor;
988+ UIButton *button = [UIButton buttonWithConfiguration:configuration primaryAction:nil];
989+ button.translatesAutoresizingMaskIntoConstraints = NO;
990+ [button.widthAnchor constraintEqualToConstant:56.0].active = YES;
991+ [button.heightAnchor constraintEqualToConstant:56.0].active = YES;
992+ UIAction *action = [UIAction actionWithHandler:^(__kindof UIAction *_Nonnull action) {
993+ if (navitem.searchController != nil) {
994+ [navitem.searchController setActive:YES];
995+ [navitem.searchController.searchBar becomeFirstResponder];
996+ }
997+ }];
998+ [button addAction:action forControlEvents:UIControlEventTouchUpInside];
999+ item = [[UIBarButtonItem alloc] initWithCustomView:button];
1000+ } else if ([dict[@"customView"] boolValue] && navitem.searchController != nil) {
1001+ UISearchBar *searchBar = navitem.searchController.searchBar;
1002+ CGFloat resolvedWidth = width != nil ? width.doubleValue : searchBar.frame.size.width;
1003+ CGFloat resolvedHeight = searchBar.frame.size.height > 0 ? searchBar.frame.size.height : 44.0;
1004+ UIView *container = [[UIView alloc] initWithFrame:CGRectMake(0, 0, resolvedWidth, resolvedHeight)];
1005+ container.translatesAutoresizingMaskIntoConstraints = NO;
1006+ [container.widthAnchor constraintEqualToConstant:resolvedWidth].active = YES;
1007+ [container.heightAnchor constraintEqualToConstant:resolvedHeight].active = YES;
1008+ searchBar.frame = container.bounds;
1009+ searchBar.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
1010+ [container addSubview:searchBar];
1011+ item = [[UIBarButtonItem alloc] initWithCustomView:container];
1012+ } else {
1013+ item = navitem.searchBarPlacementBarButtonItem;
1014+ if (width != nil) {
1015+ item.width = width.doubleValue;
1016+ }
1017+ }
1018+ NSNumber *index = dict[@"index"];
1019+#if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
1020+ if (@available(iOS 26.0, *)) {
1021+ NSNumber *sharesBackground = dict[@"sharesBackground"];
1022+ if (sharesBackground != nil) {
1023+ item.sharesBackground = sharesBackground.boolValue;
1024+ }
1025+ NSNumber *hidesSharedBackground = dict[@"hidesSharedBackground"];
1026+ if (hidesSharedBackground != nil) {
1027+ item.hidesSharedBackground = hidesSharedBackground.boolValue;
1028+ }
1029+ }
1030+#endif
1031+ if (index != nil && index.integerValue >= 0 && index.integerValue < items.count) {
1032+ [items insertObject:item atIndex:index.integerValue];
1033+ } else {
1034+ [items addObject:item];
1035+ }
1036+ }
1037+#endif
1038+ } else if (dict[@"buttonId"] || dict[@"menu"]) {
1039 RNSBarButtonItem *item = [[RNSBarButtonItem alloc] initWithConfig:dict
1040 action:^(NSString *buttonId) {
1041 auto eventEmitter = std::static_pointer_cast<const facebook::react::RNSScreenStackHeaderConfigEventEmitter>(
1042@@ -814,19 +1523,23 @@ - (void)applySemanticContentAttributeIfNeededToNavCtrl:(UINavigationController *
1043 }
1044 imageLoader:_imageLoader];
1045 NSNumber *index = dict[@"index"];
1046- if (index.integerValue < items.count) {
1047+ if (index != nil && index.integerValue >= 0 && index.integerValue < items.count) {
1048 [items insertObject:item atIndex:index.integerValue];
1049 } else {
1050 [items addObject:item];
1051 }
1052 } else if (dict[@"spacing"]) {
1053- UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
1054- target:nil
1055- action:nil];
1056+ BOOL flexible = [dict[@"flexible"] boolValue];
1057+ UIBarButtonItem *item = [[UIBarButtonItem alloc]
1058+ initWithBarButtonSystemItem:(flexible ? UIBarButtonSystemItemFlexibleSpace : UIBarButtonSystemItemFixedSpace)
1059+ target:nil
1060+ action:nil];
1061 NSNumber *spacingValue = dict[@"spacing"];
1062- item.width = [spacingValue doubleValue];
1063+ if (!flexible) {
1064+ item.width = [spacingValue doubleValue];
1065+ }
1066 NSNumber *index = dict[@"index"];
1067- if (index.integerValue < items.count) {
1068+ if (index != nil && index.integerValue >= 0 && index.integerValue < items.count) {
1069 [items insertObject:item atIndex:index.integerValue];
1070 } else {
1071 [items addObject:item];
1072@@ -836,6 +1549,47 @@ - (void)applySemanticContentAttributeIfNeededToNavCtrl:(UINavigationController *
1073 return items;
1074 }
1075
1076+#if !TARGET_OS_TV
1077+- (NSArray<UIBarButtonItemGroup *> *)barButtonItemGroupsFromItems:(NSArray<UIBarButtonItem *> *)items
1078+{
1079+ if (items.count == 0) {
1080+ return @[];
1081+ }
1082+
1083+ NSMutableArray<UIBarButtonItemGroup *> *groups = [NSMutableArray array];
1084+ NSMutableArray<UIBarButtonItem *> *sharedRun = [NSMutableArray array];
1085+
1086+ void (^flushSharedRun)(void) = ^{
1087+ if (sharedRun.count == 0) {
1088+ return;
1089+ }
1090+ [groups addObject:[UIBarButtonItemGroup fixedGroupWithRepresentativeItem:nil
1091+ items:[sharedRun copy]]];
1092+ [sharedRun removeAllObjects];
1093+ };
1094+
1095+ for (UIBarButtonItem *item in items) {
1096+ BOOL shouldShareBackground = NO;
1097+#if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
1098+ if (@available(iOS 26.0, *)) {
1099+ shouldShareBackground = item.sharesBackground && !item.hidesSharedBackground;
1100+ }
1101+#endif
1102+
1103+ if (shouldShareBackground) {
1104+ [sharedRun addObject:item];
1105+ continue;
1106+ }
1107+
1108+ flushSharedRun();
1109+ [groups addObject:[UIBarButtonItemGroup fixedGroupWithRepresentativeItem:nil items:@[ item ]]];
1110+ }
1111+
1112+ flushSharedRun();
1113+ return groups;
1114+}
1115+#endif
1116+
1117 RNS_IGNORE_SUPER_CALL_BEGIN
1118 - (void)insertReactSubview:(RNSScreenStackHeaderSubview *)subview atIndex:(NSInteger)atIndex
1119 {
1120@@ -1025,6 +1779,8 @@ - (void)updateProps:(react::Props::Shared const &)props oldProps:(react::Props::
1121 }
1122
1123 _title = RCTNSStringFromStringNilIfEmpty(newScreenProps.title);
1124+ _subtitle = RCTNSStringFromStringNilIfEmpty(newScreenProps.subtitle);
1125+ _largeSubtitle = RCTNSStringFromStringNilIfEmpty(newScreenProps.largeSubtitle);
1126 if (newScreenProps.titleFontFamily != oldScreenProps.titleFontFamily) {
1127 _titleFontFamily = RCTNSStringFromStringNilIfEmpty(newScreenProps.titleFontFamily);
1128 }
1129@@ -1050,6 +1806,7 @@ - (void)updateProps:(react::Props::Shared const &)props oldProps:(react::Props::
1130 _disableBackButtonMenu = newScreenProps.disableBackButtonMenu;
1131 _backButtonDisplayMode =
1132 [RNSConvert UINavigationItemBackButtonDisplayModeFromCppEquivalent:newScreenProps.backButtonDisplayMode];
1133+ _navigationItemStyle = navigationItemStyleFromCppEquivalent(newScreenProps.navigationItemStyle);
1134
1135 if (newScreenProps.userInterfaceStyle != oldScreenProps.userInterfaceStyle) {
1136 _userInterfaceStyle = [RNSConvert UIUserInterfaceStyleFromCppEquivalent:newScreenProps.userInterfaceStyle];
1137@@ -1096,6 +1853,30 @@ - (void)updateProps:(react::Props::Shared const &)props oldProps:(react::Props::
1138 _headerRightBarButtonItems = array;
1139 }
1140
1141+ if (newScreenProps.headerCenterBarButtonItems != oldScreenProps.headerCenterBarButtonItems) {
1142+ const auto &vec = newScreenProps.headerCenterBarButtonItems;
1143+ NSMutableArray<NSDictionary<NSString *, id> *> *array = [NSMutableArray arrayWithCapacity:vec.size()];
1144+ for (const auto &item : vec) {
1145+ NSDictionary *dict = [RNSConvert idFromFollyDynamic:item];
1146+ if ([dict isKindOfClass:[NSDictionary class]]) {
1147+ [array addObject:dict];
1148+ }
1149+ }
1150+ _headerCenterBarButtonItems = array;
1151+ }
1152+
1153+ if (newScreenProps.headerToolbarItems != oldScreenProps.headerToolbarItems) {
1154+ const auto &vec = newScreenProps.headerToolbarItems;
1155+ NSMutableArray<NSDictionary<NSString *, id> *> *array = [NSMutableArray arrayWithCapacity:vec.size()];
1156+ for (const auto &item : vec) {
1157+ NSDictionary *dict = [RNSConvert idFromFollyDynamic:item];
1158+ if ([dict isKindOfClass:[NSDictionary class]]) {
1159+ [array addObject:dict];
1160+ }
1161+ }
1162+ _headerToolbarItems = array;
1163+ }
1164+
1165 [self updateViewControllerIfNeeded];
1166
1167 if (needsNavigationControllerLayout) {
1168diff --git a/ios/RNSScreenStackHeaderSubview.mm b/ios/RNSScreenStackHeaderSubview.mm
1169index add33c4..489afa5 100644
1170--- a/ios/RNSScreenStackHeaderSubview.mm
1171+++ b/ios/RNSScreenStackHeaderSubview.mm
1172@@ -20,7 +20,9 @@ @implementation RNSScreenStackHeaderSubview {
1173 // This is a strong reference to UIBarButtonItem which creates a retain cycle.
1174 // The cycle is cleared via `invalidateUIBarButtonItem` method, called by `invalidate` callback.
1175 UIBarButtonItem *_barButtonItem;
1176+ NSString *_barButtonItemIdentifier;
1177 BOOL _hidesSharedBackground;
1178+ UILabel *_titleScrollEdgeEffectGuide;
1179 }
1180
1181 #pragma mark - Common
1182@@ -102,6 +104,25 @@ - (void)updateShadowStateWithFrame:(CGRect)frame
1183 - (void)layoutSubviews
1184 {
1185 [super layoutSubviews];
1186+#if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
1187+ if (@available(iOS 26.0, *)) {
1188+ if (_type == RNSScreenStackHeaderSubviewTypeTitle || _type == RNSScreenStackHeaderSubviewTypeCenter) {
1189+ // UIKit shapes the navigation bar's scroll-edge fade around native labels,
1190+ // but does not recognize Fabric's custom text views. An empty, non-interactive
1191+ // label supplies the title's geometry without drawing or becoming a bar item.
1192+ if (_titleScrollEdgeEffectGuide == nil) {
1193+ _titleScrollEdgeEffectGuide = [UILabel new];
1194+ _titleScrollEdgeEffectGuide.accessibilityElementsHidden = YES;
1195+ // Append after Fabric's children so their mount/unmount indices stay intact.
1196+ [self addSubview:_titleScrollEdgeEffectGuide];
1197+ }
1198+ _titleScrollEdgeEffectGuide.frame = self.bounds;
1199+ } else {
1200+ [_titleScrollEdgeEffectGuide removeFromSuperview];
1201+ _titleScrollEdgeEffectGuide = nil;
1202+ }
1203+ }
1204+#endif
1205 [self updateShadowStateInContextOfAncestorView:[self findNavigationBar]];
1206 }
1207
1208@@ -124,6 +145,7 @@ - (void)updateProps:(react::Props::Shared const &)props oldProps:(react::Props::
1209 const auto &newHeaderSubviewProps = *std::static_pointer_cast<const react::RNSScreenStackHeaderSubviewProps>(props);
1210
1211 [self setType:[RNSConvert RNSScreenStackHeaderSubviewTypeFromCppEquivalent:newHeaderSubviewProps.type]];
1212+ [self setBarButtonItemIdentifier:RCTNSStringFromStringNilIfEmpty(newHeaderSubviewProps.identifier)];
1213 [self setHidesSharedBackground:newHeaderSubviewProps.hidesSharedBackground];
1214 [self setSynchronousShadowStateUpdatesEnabled:newHeaderSubviewProps.synchronousShadowStateUpdatesEnabled];
1215 [super updateProps:props oldProps:oldProps];
1216@@ -276,7 +298,14 @@ - (void)configureBarButtonItem
1217 #if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
1218 if (@available(iOS 26.0, *)) {
1219 if (_barButtonItem != nil) {
1220- [_barButtonItem setHidesSharedBackground:_hidesSharedBackground];
1221+ NSString *currentIdentifier = _barButtonItem.identifier;
1222+ if (currentIdentifier != _barButtonItemIdentifier &&
1223+ ![currentIdentifier isEqualToString:_barButtonItemIdentifier]) {
1224+ _barButtonItem.identifier = _barButtonItemIdentifier;
1225+ }
1226+ if (_barButtonItem.hidesSharedBackground != _hidesSharedBackground) {
1227+ _barButtonItem.hidesSharedBackground = _hidesSharedBackground;
1228+ }
1229 }
1230 }
1231 #endif // RNS_IPHONE_OS_VERSION_AVAILABLE(26_0)
1232@@ -284,10 +313,22 @@ - (void)configureBarButtonItem
1233
1234 - (void)setHidesSharedBackground:(BOOL)hidesSharedBackground
1235 {
1236+ if (_hidesSharedBackground == hidesSharedBackground) {
1237+ return;
1238+ }
1239 _hidesSharedBackground = hidesSharedBackground;
1240 [self configureBarButtonItem];
1241 }
1242
1243+- (void)setBarButtonItemIdentifier:(nullable NSString *)identifier
1244+{
1245+ if (_barButtonItemIdentifier == identifier || [_barButtonItemIdentifier isEqualToString:identifier]) {
1246+ return;
1247+ }
1248+ _barButtonItemIdentifier = [identifier copy];
1249+ [self configureBarButtonItem];
1250+}
1251+
1252 #pragma mark - Dynamic frameworks support
1253
1254 // Needed because of this: https://github.com/facebook/react-native/pull/37274
1255diff --git a/lib/commonjs/components/ScreenStackHeaderConfig.js b/lib/commonjs/components/ScreenStackHeaderConfig.js
1256index 6e68cd1..9e09485 100644
1257--- a/lib/commonjs/components/ScreenStackHeaderConfig.js
1258+++ b/lib/commonjs/components/ScreenStackHeaderConfig.js
1259@@ -31,17 +31,42 @@ const ScreenStackHeaderConfig = exports.ScreenStackHeaderConfig = /*#__PURE__*/_
1260 } = (0, _EdgeInsetApplicationContext.useEdgeInsetApplication)(!props.hidden, props.disableTopInsetApplication ?? false, props.disableLeftInsetApplication ?? false, props.disableRightInsetApplication ?? false, props.disableBottomInsetApplication ?? false);
1261 const {
1262 headerLeftBarButtonItems,
1263- headerRightBarButtonItems
1264+ headerRightBarButtonItems,
1265+ headerCenterBarButtonItems,
1266+ headerToolbarItems
1267 } = props;
1268 const preparedHeaderLeftBarButtonItems = headerLeftBarButtonItems && _utils.isHeaderBarButtonsAvailableForCurrentPlatform ? (0, _prepareHeaderBarButtonItems.prepareHeaderBarButtonItems)(headerLeftBarButtonItems, 'left') : undefined;
1269 const preparedHeaderRightBarButtonItems = headerRightBarButtonItems && _utils.isHeaderBarButtonsAvailableForCurrentPlatform ? (0, _prepareHeaderBarButtonItems.prepareHeaderBarButtonItems)(headerRightBarButtonItems, 'right') : undefined;
1270- const hasHeaderBarButtonItems = _utils.isHeaderBarButtonsAvailableForCurrentPlatform && (preparedHeaderLeftBarButtonItems?.length || preparedHeaderRightBarButtonItems?.length);
1271+ const preparedHeaderCenterBarButtonItems = headerCenterBarButtonItems && _utils.isHeaderBarButtonsAvailableForCurrentPlatform ? (0, _prepareHeaderBarButtonItems.prepareHeaderBarButtonItems)(headerCenterBarButtonItems, 'center') : undefined;
1272+ const preparedHeaderToolbarItems = headerToolbarItems && _utils.isHeaderBarButtonsAvailableForCurrentPlatform ? (0, _prepareHeaderBarButtonItems.prepareHeaderBarButtonItems)(headerToolbarItems, 'toolbar') : undefined;
1273+ const hasHeaderBarButtonItems = _utils.isHeaderBarButtonsAvailableForCurrentPlatform && (preparedHeaderLeftBarButtonItems?.length || preparedHeaderRightBarButtonItems?.length || preparedHeaderCenterBarButtonItems?.length || preparedHeaderToolbarItems?.length);
1274
1275 // Handle bar button item presses
1276 const onPressHeaderBarButtonItem = hasHeaderBarButtonItems ? event => {
1277- const pressedItem = [...(preparedHeaderLeftBarButtonItems ?? []), ...(preparedHeaderRightBarButtonItems ?? [])].find(item => item && 'buttonId' in item && item.buttonId === event.nativeEvent.buttonId);
1278+ const buttonId = event.nativeEvent.buttonId;
1279+ const allItems = [...(preparedHeaderLeftBarButtonItems ?? []), ...(preparedHeaderRightBarButtonItems ?? []), ...(preparedHeaderCenterBarButtonItems ?? []), ...(preparedHeaderToolbarItems ?? [])];
1280+ const pressedItem = allItems.find(item => item && 'buttonId' in item && item.buttonId === buttonId);
1281 if (pressedItem && pressedItem.type === 'button' && pressedItem.onPress) {
1282 pressedItem.onPress();
1283+ return;
1284+ }
1285+ for (const item of allItems) {
1286+ if (!item || item.type !== 'mailSearchToolbar') {
1287+ continue;
1288+ }
1289+ if (item.filterButtonId === buttonId) {
1290+ item.onFilterPress?.();
1291+ return;
1292+ }
1293+ if (item.composeButtonId === buttonId) {
1294+ item.onComposePress?.();
1295+ return;
1296+ }
1297+ const searchTextChangePrefix = item.searchTextChangeId ? `${item.searchTextChangeId}:` : undefined;
1298+ if (searchTextChangePrefix && buttonId.startsWith(searchTextChangePrefix)) {
1299+ item.onSearchTextChange?.(buttonId.slice(searchTextChangePrefix.length));
1300+ return;
1301+ }
1302 }
1303 } : undefined;
1304
1305@@ -64,7 +89,7 @@ const ScreenStackHeaderConfig = exports.ScreenStackHeaderConfig = /*#__PURE__*/_
1306 };
1307
1308 // Check each bar-button item with a menu
1309- const allItems = [...(preparedHeaderLeftBarButtonItems ?? []), ...(preparedHeaderRightBarButtonItems ?? [])];
1310+ const allItems = [...(preparedHeaderLeftBarButtonItems ?? []), ...(preparedHeaderRightBarButtonItems ?? []), ...(preparedHeaderCenterBarButtonItems ?? []), ...(preparedHeaderToolbarItems ?? [])];
1311 for (const item of allItems) {
1312 if (item && item.type === 'menu' && item.menu) {
1313 const action = findInMenu(item.menu, event.nativeEvent.menuId);
1314@@ -72,6 +97,15 @@ const ScreenStackHeaderConfig = exports.ScreenStackHeaderConfig = /*#__PURE__*/_
1315 action.onPress();
1316 return;
1317 }
1318+ } else if (item && item.type === 'mailSearchToolbar') {
1319+ const toolbarMenus = [item.filterMenu, item.composeMenu].filter(Boolean);
1320+ for (const toolbarMenu of toolbarMenus) {
1321+ const action = findInMenu(toolbarMenu, event.nativeEvent.menuId);
1322+ if (action) {
1323+ action.onPress();
1324+ return;
1325+ }
1326+ }
1327 }
1328 }
1329 } : undefined;
1330@@ -79,6 +113,8 @@ const ScreenStackHeaderConfig = exports.ScreenStackHeaderConfig = /*#__PURE__*/_
1331 userInterfaceStyle: props.experimental_userInterfaceStyle,
1332 headerLeftBarButtonItems: preparedHeaderLeftBarButtonItems,
1333 headerRightBarButtonItems: preparedHeaderRightBarButtonItems,
1334+ headerCenterBarButtonItems: preparedHeaderCenterBarButtonItems,
1335+ headerToolbarItems: preparedHeaderToolbarItems,
1336 onPressHeaderBarButtonItem: onPressHeaderBarButtonItem,
1337 onPressHeaderBarButtonMenuItem: onPressHeaderBarButtonMenuItem,
1338 ref: ref,
1339diff --git a/lib/commonjs/components/helpers/prepareHeaderBarButtonItems.js b/lib/commonjs/components/helpers/prepareHeaderBarButtonItems.js
1340index 589b6cc..b584624 100644
1341--- a/lib/commonjs/components/helpers/prepareHeaderBarButtonItems.js
1342+++ b/lib/commonjs/components/helpers/prepareHeaderBarButtonItems.js
1343@@ -8,7 +8,7 @@ var _reactNative = require("react-native");
1344 // Local nominal type so declaration emit doesn't resolve the RN alias down to
1345 // the non-public `types_generated/.../AssetSourceResolver#ResolvedAssetSource`.
1346
1347-const prepareMenu = (menu, index, side, path = '') => {
1348+const prepareMenu = (menu, index, placement, path = '') => {
1349 return {
1350 ...menu,
1351 items: menu.items.map((menuItem, menuIndex) => {
1352@@ -29,7 +29,7 @@ const prepareMenu = (menu, index, side, path = '') => {
1353 xcassetName,
1354 imageSource,
1355 templateSource,
1356- ...prepareMenu(menuItem, index, side, currentPath)
1357+ ...prepareMenu(menuItem, index, placement, currentPath)
1358 };
1359 }
1360 return {
1361@@ -38,16 +38,40 @@ const prepareMenu = (menu, index, side, path = '') => {
1362 xcassetName,
1363 imageSource,
1364 templateSource,
1365- menuId: `${currentPath}-${index}-${side}`
1366+ menuId: `${currentPath}-${index}-${placement}`
1367 };
1368 })
1369 };
1370 };
1371-const prepareHeaderBarButtonItems = (barButtonItems, side) => {
1372- return barButtonItems?.map((item, index) => {
1373+const prepareHeaderBarButtonItems = (barButtonItems, placement) => {
1374+ const items = Array.isArray(barButtonItems) ? barButtonItems : barButtonItems && typeof barButtonItems === 'object' && 'type' in barButtonItems ? [barButtonItems] : undefined;
1375+ return items?.map((item, index) => {
1376 if (item.type === 'spacing') {
1377 return item;
1378 }
1379+ if (item.type === 'searchBarPlacement') {
1380+ if (placement !== 'toolbar') {
1381+ return null;
1382+ }
1383+ return {
1384+ ...item,
1385+ searchBarPlacement: true
1386+ };
1387+ }
1388+ if (item.type === 'searchField') {
1389+ return {
1390+ ...item,
1391+ searchField: true
1392+ };
1393+ }
1394+ if (item.type === 'mailSearchToolbar') {
1395+ return {
1396+ ...item,
1397+ mailSearchToolbar: true,
1398+ filterMenu: item.filterMenu ? prepareMenu(item.filterMenu, index, placement, 'filter') : undefined,
1399+ composeMenu: item.composeMenu ? prepareMenu(item.composeMenu, index, placement, 'compose') : undefined
1400+ };
1401+ }
1402 let imageSource, templateSource;
1403 if (item.icon?.type === 'imageSource') {
1404 imageSource = _reactNative.Image.resolveAssetSource(item.icon.imageSource);
1405@@ -80,17 +104,17 @@ const prepareHeaderBarButtonItems = (barButtonItems, side) => {
1406 if (item.type === 'button') {
1407 return {
1408 ...processedItem,
1409- buttonId: `${index}-${side}`
1410+ buttonId: `${index}-${placement}`
1411 };
1412 }
1413 if (item.type === 'menu') {
1414 return {
1415 ...processedItem,
1416- menu: prepareMenu(item.menu, index, side)
1417+ menu: prepareMenu(item.menu, index, placement)
1418 };
1419 }
1420 return null;
1421- });
1422+ }).filter(item => item !== null);
1423 };
1424 exports.prepareHeaderBarButtonItems = prepareHeaderBarButtonItems;
1425 //# sourceMappingURL=prepareHeaderBarButtonItems.js.map
1426\ No newline at end of file
1427diff --git a/lib/module/components/ScreenStackHeaderConfig.js b/lib/module/components/ScreenStackHeaderConfig.js
1428index 242898c..7cebaa3 100644
1429--- a/lib/module/components/ScreenStackHeaderConfig.js
1430+++ b/lib/module/components/ScreenStackHeaderConfig.js
1431@@ -27,17 +27,42 @@ export const ScreenStackHeaderConfig = /*#__PURE__*/React.forwardRef((props, ref
1432 } = useEdgeInsetApplication(!props.hidden, props.disableTopInsetApplication ?? false, props.disableLeftInsetApplication ?? false, props.disableRightInsetApplication ?? false, props.disableBottomInsetApplication ?? false);
1433 const {
1434 headerLeftBarButtonItems,
1435- headerRightBarButtonItems
1436+ headerRightBarButtonItems,
1437+ headerCenterBarButtonItems,
1438+ headerToolbarItems
1439 } = props;
1440 const preparedHeaderLeftBarButtonItems = headerLeftBarButtonItems && isHeaderBarButtonsAvailableForCurrentPlatform ? prepareHeaderBarButtonItems(headerLeftBarButtonItems, 'left') : undefined;
1441 const preparedHeaderRightBarButtonItems = headerRightBarButtonItems && isHeaderBarButtonsAvailableForCurrentPlatform ? prepareHeaderBarButtonItems(headerRightBarButtonItems, 'right') : undefined;
1442- const hasHeaderBarButtonItems = isHeaderBarButtonsAvailableForCurrentPlatform && (preparedHeaderLeftBarButtonItems?.length || preparedHeaderRightBarButtonItems?.length);
1443+ const preparedHeaderCenterBarButtonItems = headerCenterBarButtonItems && isHeaderBarButtonsAvailableForCurrentPlatform ? prepareHeaderBarButtonItems(headerCenterBarButtonItems, 'center') : undefined;
1444+ const preparedHeaderToolbarItems = headerToolbarItems && isHeaderBarButtonsAvailableForCurrentPlatform ? prepareHeaderBarButtonItems(headerToolbarItems, 'toolbar') : undefined;
1445+ const hasHeaderBarButtonItems = isHeaderBarButtonsAvailableForCurrentPlatform && (preparedHeaderLeftBarButtonItems?.length || preparedHeaderRightBarButtonItems?.length || preparedHeaderCenterBarButtonItems?.length || preparedHeaderToolbarItems?.length);
1446
1447 // Handle bar button item presses
1448 const onPressHeaderBarButtonItem = hasHeaderBarButtonItems ? event => {
1449- const pressedItem = [...(preparedHeaderLeftBarButtonItems ?? []), ...(preparedHeaderRightBarButtonItems ?? [])].find(item => item && 'buttonId' in item && item.buttonId === event.nativeEvent.buttonId);
1450+ const buttonId = event.nativeEvent.buttonId;
1451+ const allItems = [...(preparedHeaderLeftBarButtonItems ?? []), ...(preparedHeaderRightBarButtonItems ?? []), ...(preparedHeaderCenterBarButtonItems ?? []), ...(preparedHeaderToolbarItems ?? [])];
1452+ const pressedItem = allItems.find(item => item && 'buttonId' in item && item.buttonId === buttonId);
1453 if (pressedItem && pressedItem.type === 'button' && pressedItem.onPress) {
1454 pressedItem.onPress();
1455+ return;
1456+ }
1457+ for (const item of allItems) {
1458+ if (!item || item.type !== 'mailSearchToolbar') {
1459+ continue;
1460+ }
1461+ if (item.filterButtonId === buttonId) {
1462+ item.onFilterPress?.();
1463+ return;
1464+ }
1465+ if (item.composeButtonId === buttonId) {
1466+ item.onComposePress?.();
1467+ return;
1468+ }
1469+ const searchTextChangePrefix = item.searchTextChangeId ? `${item.searchTextChangeId}:` : undefined;
1470+ if (searchTextChangePrefix && buttonId.startsWith(searchTextChangePrefix)) {
1471+ item.onSearchTextChange?.(buttonId.slice(searchTextChangePrefix.length));
1472+ return;
1473+ }
1474 }
1475 } : undefined;
1476
1477@@ -60,7 +85,7 @@ export const ScreenStackHeaderConfig = /*#__PURE__*/React.forwardRef((props, ref
1478 };
1479
1480 // Check each bar-button item with a menu
1481- const allItems = [...(preparedHeaderLeftBarButtonItems ?? []), ...(preparedHeaderRightBarButtonItems ?? [])];
1482+ const allItems = [...(preparedHeaderLeftBarButtonItems ?? []), ...(preparedHeaderRightBarButtonItems ?? []), ...(preparedHeaderCenterBarButtonItems ?? []), ...(preparedHeaderToolbarItems ?? [])];
1483 for (const item of allItems) {
1484 if (item && item.type === 'menu' && item.menu) {
1485 const action = findInMenu(item.menu, event.nativeEvent.menuId);
1486@@ -68,6 +93,15 @@ export const ScreenStackHeaderConfig = /*#__PURE__*/React.forwardRef((props, ref
1487 action.onPress();
1488 return;
1489 }
1490+ } else if (item && item.type === 'mailSearchToolbar') {
1491+ const toolbarMenus = [item.filterMenu, item.composeMenu].filter(Boolean);
1492+ for (const toolbarMenu of toolbarMenus) {
1493+ const action = findInMenu(toolbarMenu, event.nativeEvent.menuId);
1494+ if (action) {
1495+ action.onPress();
1496+ return;
1497+ }
1498+ }
1499 }
1500 }
1501 } : undefined;
1502@@ -75,6 +109,8 @@ export const ScreenStackHeaderConfig = /*#__PURE__*/React.forwardRef((props, ref
1503 userInterfaceStyle: props.experimental_userInterfaceStyle,
1504 headerLeftBarButtonItems: preparedHeaderLeftBarButtonItems,
1505 headerRightBarButtonItems: preparedHeaderRightBarButtonItems,
1506+ headerCenterBarButtonItems: preparedHeaderCenterBarButtonItems,
1507+ headerToolbarItems: preparedHeaderToolbarItems,
1508 onPressHeaderBarButtonItem: onPressHeaderBarButtonItem,
1509 onPressHeaderBarButtonMenuItem: onPressHeaderBarButtonMenuItem,
1510 ref: ref,
1511diff --git a/lib/module/components/helpers/prepareHeaderBarButtonItems.js b/lib/module/components/helpers/prepareHeaderBarButtonItems.js
1512index 24bf271..693cfad 100644
1513--- a/lib/module/components/helpers/prepareHeaderBarButtonItems.js
1514+++ b/lib/module/components/helpers/prepareHeaderBarButtonItems.js
1515@@ -3,7 +3,7 @@ import { Image, processColor } from 'react-native';
1516 // Local nominal type so declaration emit doesn't resolve the RN alias down to
1517 // the non-public `types_generated/.../AssetSourceResolver#ResolvedAssetSource`.
1518
1519-const prepareMenu = (menu, index, side, path = '') => {
1520+const prepareMenu = (menu, index, placement, path = '') => {
1521 return {
1522 ...menu,
1523 items: menu.items.map((menuItem, menuIndex) => {
1524@@ -24,7 +24,7 @@ const prepareMenu = (menu, index, side, path = '') => {
1525 xcassetName,
1526 imageSource,
1527 templateSource,
1528- ...prepareMenu(menuItem, index, side, currentPath)
1529+ ...prepareMenu(menuItem, index, placement, currentPath)
1530 };
1531 }
1532 return {
1533@@ -33,16 +33,40 @@ const prepareMenu = (menu, index, side, path = '') => {
1534 xcassetName,
1535 imageSource,
1536 templateSource,
1537- menuId: `${currentPath}-${index}-${side}`
1538+ menuId: `${currentPath}-${index}-${placement}`
1539 };
1540 })
1541 };
1542 };
1543-export const prepareHeaderBarButtonItems = (barButtonItems, side) => {
1544- return barButtonItems?.map((item, index) => {
1545+export const prepareHeaderBarButtonItems = (barButtonItems, placement) => {
1546+ const items = Array.isArray(barButtonItems) ? barButtonItems : barButtonItems && typeof barButtonItems === 'object' && 'type' in barButtonItems ? [barButtonItems] : undefined;
1547+ return items?.map((item, index) => {
1548 if (item.type === 'spacing') {
1549 return item;
1550 }
1551+ if (item.type === 'searchBarPlacement') {
1552+ if (placement !== 'toolbar') {
1553+ return null;
1554+ }
1555+ return {
1556+ ...item,
1557+ searchBarPlacement: true
1558+ };
1559+ }
1560+ if (item.type === 'searchField') {
1561+ return {
1562+ ...item,
1563+ searchField: true
1564+ };
1565+ }
1566+ if (item.type === 'mailSearchToolbar') {
1567+ return {
1568+ ...item,
1569+ mailSearchToolbar: true,
1570+ filterMenu: item.filterMenu ? prepareMenu(item.filterMenu, index, placement, 'filter') : undefined,
1571+ composeMenu: item.composeMenu ? prepareMenu(item.composeMenu, index, placement, 'compose') : undefined
1572+ };
1573+ }
1574 let imageSource, templateSource;
1575 if (item.icon?.type === 'imageSource') {
1576 imageSource = Image.resolveAssetSource(item.icon.imageSource);
1577@@ -75,16 +99,16 @@ export const prepareHeaderBarButtonItems = (barButtonItems, side) => {
1578 if (item.type === 'button') {
1579 return {
1580 ...processedItem,
1581- buttonId: `${index}-${side}`
1582+ buttonId: `${index}-${placement}`
1583 };
1584 }
1585 if (item.type === 'menu') {
1586 return {
1587 ...processedItem,
1588- menu: prepareMenu(item.menu, index, side)
1589+ menu: prepareMenu(item.menu, index, placement)
1590 };
1591 }
1592 return null;
1593- });
1594+ }).filter(item => item !== null);
1595 };
1596 //# sourceMappingURL=prepareHeaderBarButtonItems.js.map
1597\ No newline at end of file
1598diff --git a/lib/typescript/components/helpers/prepareHeaderBarButtonItems.d.ts b/lib/typescript/components/helpers/prepareHeaderBarButtonItems.d.ts
1599index 4704a14..e2e2b78 100644
1600--- a/lib/typescript/components/helpers/prepareHeaderBarButtonItems.d.ts
1601+++ b/lib/typescript/components/helpers/prepareHeaderBarButtonItems.d.ts
1602@@ -2,7 +2,7 @@ import type { ImageResolvedAssetSource } from 'react-native';
1603 import type { HeaderBarButtonItem } from '../../types';
1604 export interface ResolvedImageAsset extends ImageResolvedAssetSource {
1605 }
1606-export declare const prepareHeaderBarButtonItems: (barButtonItems: HeaderBarButtonItem[], side: "left" | "right") => (import("../..").HeaderBarButtonItemSpacing | {
1607+export declare const prepareHeaderBarButtonItems: (barButtonItems: HeaderBarButtonItem[], side: "left" | "right" | "center" | "toolbar") => (import("../..").HeaderBarButtonItemSpacing | {
1608 buttonId: string;
1609 imageSource: ResolvedImageAsset | undefined;
1610 templateSource: ResolvedImageAsset | undefined;
1611@@ -164,5 +164,5 @@ export declare const prepareHeaderBarButtonItems: (barButtonItems: HeaderBarButt
1612 identifier?: string | undefined;
1613 accessibilityLabel?: string | undefined;
1614 accessibilityHint?: string | undefined;
1615-} | null)[];
1616+})[];
1617 //# sourceMappingURL=prepareHeaderBarButtonItems.d.ts.map
1618\ No newline at end of file
1619diff --git a/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts b/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts
1620index ec39792..434bccf 100644
1621--- a/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts
1622+++ b/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts
1623@@ -9,6 +9,7 @@ type OnPressHeaderBarButtonMenuItemEvent = Readonly<{
1624 menuId: string;
1625 }>;
1626 type BackButtonDisplayMode = 'minimal' | 'default' | 'generic';
1627+type NavigationItemStyle = 'navigator' | 'browser' | 'editor';
1628 type BlurEffect = 'none' | 'extraLight' | 'light' | 'dark' | 'regular' | 'prominent' | 'systemUltraThinMaterial' | 'systemThinMaterial' | 'systemMaterial' | 'systemThickMaterial' | 'systemChromeMaterial' | 'systemUltraThinMaterialLight' | 'systemThinMaterialLight' | 'systemMaterialLight' | 'systemThickMaterialLight' | 'systemChromeMaterialLight' | 'systemUltraThinMaterialDark' | 'systemThinMaterialDark' | 'systemMaterialDark' | 'systemThickMaterialDark' | 'systemChromeMaterialDark';
1629 type UserInterfaceStyle = 'unspecified' | 'light' | 'dark';
1630 export interface NativeProps extends ViewProps {
1631@@ -32,18 +33,23 @@ export interface NativeProps extends ViewProps {
1632 largeTitleColor?: ColorValue | undefined;
1633 translucent?: boolean | undefined;
1634 title?: string | undefined;
1635+ subtitle?: string | undefined;
1636+ largeSubtitle?: string | undefined;
1637 titleFontFamily?: string | undefined;
1638 titleFontSize?: CT.Int32 | undefined;
1639 titleFontWeight?: string | undefined;
1640 titleColor?: ColorValue | undefined;
1641 disableBackButtonMenu?: boolean | undefined;
1642 backButtonDisplayMode?: CT.WithDefault<BackButtonDisplayMode, 'default'>;
1643+ navigationItemStyle?: CT.WithDefault<NavigationItemStyle, 'navigator'>;
1644 hideBackButton?: boolean | undefined;
1645 backButtonInCustomView?: boolean | undefined;
1646 blurEffect?: CT.WithDefault<BlurEffect, 'none'>;
1647 topInsetEnabled?: boolean | undefined;
1648 headerLeftBarButtonItems?: CT.UnsafeMixed[] | undefined;
1649 headerRightBarButtonItems?: CT.UnsafeMixed[] | undefined;
1650+ headerCenterBarButtonItems?: CT.UnsafeMixed[] | undefined;
1651+ headerToolbarItems?: CT.UnsafeMixed[] | undefined;
1652 onPressHeaderBarButtonItem?: CT.DirectEventHandler<OnPressHeaderBarButtonItemEvent> | undefined;
1653 onPressHeaderBarButtonMenuItem?: CT.DirectEventHandler<OnPressHeaderBarButtonMenuItemEvent> | undefined;
1654 synchronousShadowStateUpdatesEnabled?: CT.WithDefault<boolean, true>;
1655diff --git a/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts b/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts
1656index 2cb1a79..d6ca5a4 100644
1657--- a/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts
1658+++ b/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts
1659@@ -3,6 +3,7 @@ export type HeaderSubviewTypes = 'back' | 'right' | 'left' | 'title' | 'center'
1660 export interface NativeProps extends ViewProps {
1661 type?: CT.WithDefault<HeaderSubviewTypes, 'left'>;
1662 hidesSharedBackground?: boolean | undefined;
1663+ identifier?: string | undefined;
1664 synchronousShadowStateUpdatesEnabled?: CT.WithDefault<boolean, true>;
1665 }
1666 declare const _default: HostComponent<NativeProps>;
1667diff --git a/lib/typescript/types.d.ts b/lib/typescript/types.d.ts
1668index ff37881..b487303 100644
1669--- a/lib/typescript/types.d.ts
1670+++ b/lib/typescript/types.d.ts
1671@@ -19,6 +19,7 @@ export type SearchBarCommands = {
1672 cancelSearch: () => void;
1673 };
1674 export type BackButtonDisplayMode = 'default' | 'generic' | 'minimal';
1675+export type NavigationItemStyle = 'navigator' | 'browser' | 'editor';
1676 export type StackPresentationTypes = 'push' | 'modal' | 'transparentModal' | 'containedModal' | 'containedTransparentModal' | 'fullScreenModal' | 'formSheet' | 'pageSheet';
1677 export type StackAnimationTypes = 'default' | 'fade' | 'fade_from_bottom' | 'flip' | 'none' | 'simple_push' | 'slide_from_bottom' | 'slide_from_right' | 'slide_from_left' | 'ios_from_right' | 'ios_from_left';
1678 export type BlurEffectTypes = BlurEffect;
1679@@ -650,6 +651,14 @@ export interface ScreenStackHeaderConfigProps extends ViewProps {
1680 * @platform ios
1681 */
1682 backButtonDisplayMode?: BackButtonDisplayMode | undefined;
1683+ /**
1684+ * Controls the UIKit `UINavigationItem.style` used by native iOS headers.
1685+ *
1686+ * `editor` matches modern document/editor-style bars with leading-aligned compact titles and glass controls.
1687+ *
1688+ * @platform ios
1689+ */
1690+ navigationItemStyle?: NavigationItemStyle | undefined;
1691 /**
1692 * Array of UIBarButtomItems to the left side of the header.
1693 *
1694@@ -662,6 +671,26 @@ export interface ScreenStackHeaderConfigProps extends ViewProps {
1695 * @platform ios
1696 */
1697 headerRightBarButtonItems?: HeaderBarButtonItem[] | undefined;
1698+ /**
1699+ * Array of UIBarButtonItems to the centered item group in modern iOS headers.
1700+ *
1701+ * This maps to `UINavigationItem.centerItemGroups` on iOS 26+ and lets
1702+ * document/editor-style chrome keep primary actions visually centered while
1703+ * leaving trailing search separate.
1704+ *
1705+ * @platform ios
1706+ */
1707+ headerCenterBarButtonItems?: HeaderBarButtonItem[] | undefined;
1708+ /**
1709+ * Array of UIBarButtonItems to display in the native toolbar attached to
1710+ * the current screen's navigation controller.
1711+ *
1712+ * On iOS 26+, this can contain a `searchBarPlacement` item to let UIKit
1713+ * render integrated Mail-style search chrome using the attached SearchBar.
1714+ *
1715+ * @platform ios
1716+ */
1717+ headerToolbarItems?: HeaderBarButtonItem[] | undefined;
1718 /**
1719 * When set to true the header will be hidden while the parent Screen is on the top of the stack. The default value is false.
1720 */
1721@@ -723,6 +752,20 @@ export interface ScreenStackHeaderConfigProps extends ViewProps {
1722 * String that can be displayed in the header as a fallback for `headerTitle`.
1723 */
1724 title?: string | undefined;
1725+ /**
1726+ * String displayed below the compact navigation title on iOS 26+.
1727+ *
1728+ * @platform ios
1729+ */
1730+ subtitle?: string | undefined;
1731+ /**
1732+ * String displayed below the large navigation title on iOS 26+.
1733+ *
1734+ * Falls back to `subtitle` when omitted.
1735+ *
1736+ * @platform ios
1737+ */
1738+ largeSubtitle?: string | undefined;
1739 /**
1740 * Allows for setting text color of the title.
1741 */
1742@@ -1018,6 +1061,13 @@ export interface SearchBarProps {
1743 shouldShowHintSearchIcon?: boolean | undefined;
1744 }
1745 export interface ScreenStackHeaderSubviewProps {
1746+ /**
1747+ * An identifier used to match this item across navigation bar transitions.
1748+ * Only applicable to type="right" and type="left" subviews on iOS 26.0 and later.
1749+ *
1750+ * Read more: https://developer.apple.com/documentation/uikit/uibarbuttonitem/identifier
1751+ */
1752+ identifier?: string | undefined;
1753 /**
1754 * A boolean value indicating whether the background this item may share with other items in the bar should be hidden.
1755 * Only applicable to type="right" and type="left" subviews.
1756@@ -1056,6 +1106,11 @@ interface SharedHeaderBarButtonItem {
1757 * Read more: https://developer.apple.com/documentation/uikit/uibarbuttonitem/style-swift.property
1758 */
1759 variant?: 'plain' | 'done' | 'prominent' | undefined;
1760+ /**
1761+ * Render the item with UIButtonConfiguration.glassButtonConfiguration.
1762+ * Only available from iOS 26.0 and later.
1763+ */
1764+ glassEffect?: boolean | undefined;
1765 /**
1766 * The tint color to apply to the item.
1767 *
1768@@ -1201,8 +1256,38 @@ export interface HeaderBarButtonItemWithMenu extends SharedHeaderBarButtonItem {
1769 export interface HeaderBarButtonItemSpacing {
1770 type: 'spacing';
1771 spacing: number;
1772+ flexible?: boolean | undefined;
1773+}
1774+export interface HeaderBarButtonSearchBarPlacementItem {
1775+ type: 'searchBarPlacement';
1776+ activatesSearchController?: boolean | undefined;
1777+ customView?: boolean | undefined;
1778+ index?: number | undefined;
1779+ width?: number | undefined;
1780+}
1781+export interface HeaderBarButtonSearchFieldItem {
1782+ type: 'searchField';
1783+ placeholder?: string | undefined;
1784+ width?: number | undefined;
1785+}
1786+export interface HeaderBarButtonMailSearchToolbarItem {
1787+ type: 'mailSearchToolbar';
1788+ composeButtonId?: string | undefined;
1789+ composeMenu?: HeaderBarButtonItemWithMenu['menu'] | undefined;
1790+ composeSystemImageName?: string | undefined;
1791+ filterButtonId?: string | undefined;
1792+ filterMenu?: HeaderBarButtonItemWithMenu['menu'] | undefined;
1793+ filterSystemImageName?: string | undefined;
1794+ onComposePress?: (() => void) | undefined;
1795+ onFilterPress?: (() => void) | undefined;
1796+ onSearchTextChange?: ((text: string) => void) | undefined;
1797+ placeholder?: string | undefined;
1798+ searchTextChangeId?: string | undefined;
1799+ showsSearchDismissButton?: boolean | undefined;
1800+ useFallbackSearchField?: boolean | undefined;
1801+ width?: number | undefined;
1802 }
1803-export type HeaderBarButtonItem = HeaderBarButtonItemWithAction | HeaderBarButtonItemWithMenu | HeaderBarButtonItemSpacing;
1804+export type HeaderBarButtonItem = HeaderBarButtonItemWithAction | HeaderBarButtonItemWithMenu | HeaderBarButtonMailSearchToolbarItem | HeaderBarButtonSearchFieldItem | HeaderBarButtonSearchBarPlacementItem | HeaderBarButtonItemSpacing;
1805 /**
1806 * Custom Screen Transition
1807 */
1808diff --git a/src/components/ScreenStackHeaderConfig.tsx b/src/components/ScreenStackHeaderConfig.tsx
1809index 509d6cd..761e49b 100644
1810--- a/src/components/ScreenStackHeaderConfig.tsx
1811+++ b/src/components/ScreenStackHeaderConfig.tsx
1812@@ -54,7 +54,12 @@ export const ScreenStackHeaderConfig = React.forwardRef<
1813 props.disableBottomInsetApplication ?? false,
1814 );
1815
1816- const { headerLeftBarButtonItems, headerRightBarButtonItems } = props;
1817+ const {
1818+ headerLeftBarButtonItems,
1819+ headerRightBarButtonItems,
1820+ headerCenterBarButtonItems,
1821+ headerToolbarItems,
1822+ } = props;
1823
1824 const preparedHeaderLeftBarButtonItems =
1825 headerLeftBarButtonItems && isHeaderBarButtonsAvailableForCurrentPlatform
1826@@ -64,22 +69,36 @@ export const ScreenStackHeaderConfig = React.forwardRef<
1827 headerRightBarButtonItems && isHeaderBarButtonsAvailableForCurrentPlatform
1828 ? prepareHeaderBarButtonItems(headerRightBarButtonItems, 'right')
1829 : undefined;
1830+ const preparedHeaderCenterBarButtonItems =
1831+ headerCenterBarButtonItems && isHeaderBarButtonsAvailableForCurrentPlatform
1832+ ? prepareHeaderBarButtonItems(headerCenterBarButtonItems, 'center')
1833+ : undefined;
1834+ const preparedHeaderToolbarItems =
1835+ headerToolbarItems && isHeaderBarButtonsAvailableForCurrentPlatform
1836+ ? prepareHeaderBarButtonItems(headerToolbarItems, 'toolbar')
1837+ : undefined;
1838 const hasHeaderBarButtonItems =
1839 isHeaderBarButtonsAvailableForCurrentPlatform &&
1840 (preparedHeaderLeftBarButtonItems?.length ||
1841- preparedHeaderRightBarButtonItems?.length);
1842+ preparedHeaderRightBarButtonItems?.length ||
1843+ preparedHeaderCenterBarButtonItems?.length ||
1844+ preparedHeaderToolbarItems?.length);
1845
1846 // Handle bar button item presses
1847 const onPressHeaderBarButtonItem = hasHeaderBarButtonItems
1848 ? (event: NativeSyntheticEvent<{ buttonId: string }>) => {
1849- const pressedItem = [
1850+ const buttonId = event.nativeEvent.buttonId;
1851+ const allItems = [
1852 ...(preparedHeaderLeftBarButtonItems ?? []),
1853 ...(preparedHeaderRightBarButtonItems ?? []),
1854- ].find(
1855+ ...(preparedHeaderCenterBarButtonItems ?? []),
1856+ ...(preparedHeaderToolbarItems ?? []),
1857+ ];
1858+ const pressedItem = allItems.find(
1859 item =>
1860 item &&
1861 'buttonId' in item &&
1862- item.buttonId === event.nativeEvent.buttonId,
1863+ item.buttonId === buttonId,
1864 );
1865 if (
1866 pressedItem &&
1867@@ -87,6 +106,32 @@ export const ScreenStackHeaderConfig = React.forwardRef<
1868 pressedItem.onPress
1869 ) {
1870 pressedItem.onPress();
1871+ return;
1872+ }
1873+ for (const item of allItems) {
1874+ if (!item || item.type !== 'mailSearchToolbar') {
1875+ continue;
1876+ }
1877+ if (item.filterButtonId === buttonId) {
1878+ item.onFilterPress?.();
1879+ return;
1880+ }
1881+ if (item.composeButtonId === buttonId) {
1882+ item.onComposePress?.();
1883+ return;
1884+ }
1885+ const searchTextChangePrefix = item.searchTextChangeId
1886+ ? `${item.searchTextChangeId}:`
1887+ : undefined;
1888+ if (
1889+ searchTextChangePrefix &&
1890+ buttonId.startsWith(searchTextChangePrefix)
1891+ ) {
1892+ item.onSearchTextChange?.(
1893+ buttonId.slice(searchTextChangePrefix.length),
1894+ );
1895+ return;
1896+ }
1897 }
1898 }
1899 : undefined;
1900@@ -117,6 +162,8 @@ export const ScreenStackHeaderConfig = React.forwardRef<
1901 const allItems = [
1902 ...(preparedHeaderLeftBarButtonItems ?? []),
1903 ...(preparedHeaderRightBarButtonItems ?? []),
1904+ ...(preparedHeaderCenterBarButtonItems ?? []),
1905+ ...(preparedHeaderToolbarItems ?? []),
1906 ];
1907 for (const item of allItems) {
1908 if (item && item.type === 'menu' && item.menu) {
1909@@ -125,6 +172,17 @@ export const ScreenStackHeaderConfig = React.forwardRef<
1910 action.onPress();
1911 return;
1912 }
1913+ } else if (item && item.type === 'mailSearchToolbar') {
1914+ const toolbarMenus = [item.filterMenu, item.composeMenu].filter(
1915+ Boolean,
1916+ );
1917+ for (const toolbarMenu of toolbarMenus) {
1918+ const action = findInMenu(toolbarMenu, event.nativeEvent.menuId);
1919+ if (action) {
1920+ action.onPress();
1921+ return;
1922+ }
1923+ }
1924 }
1925 }
1926 }
1927@@ -136,6 +194,8 @@ export const ScreenStackHeaderConfig = React.forwardRef<
1928 userInterfaceStyle={props.experimental_userInterfaceStyle}
1929 headerLeftBarButtonItems={preparedHeaderLeftBarButtonItems}
1930 headerRightBarButtonItems={preparedHeaderRightBarButtonItems}
1931+ headerCenterBarButtonItems={preparedHeaderCenterBarButtonItems}
1932+ headerToolbarItems={preparedHeaderToolbarItems}
1933 onPressHeaderBarButtonItem={onPressHeaderBarButtonItem}
1934 onPressHeaderBarButtonMenuItem={onPressHeaderBarButtonMenuItem}
1935 ref={ref}
1936diff --git a/src/components/helpers/prepareHeaderBarButtonItems.ts b/src/components/helpers/prepareHeaderBarButtonItems.ts
1937index 19ab7bc..9fd5ceb 100644
1938--- a/src/components/helpers/prepareHeaderBarButtonItems.ts
1939+++ b/src/components/helpers/prepareHeaderBarButtonItems.ts
1940@@ -12,7 +12,7 @@ export interface ResolvedImageAsset extends ImageResolvedAssetSource {}
1941 const prepareMenu = (
1942 menu: HeaderBarButtonItemWithMenu['menu'],
1943 index: number,
1944- side: 'left' | 'right',
1945+ placement: 'left' | 'right' | 'center' | 'toolbar',
1946 path: string = '',
1947 ): HeaderBarButtonItemWithMenu['menu'] => {
1948 return {
1949@@ -39,7 +39,7 @@ const prepareMenu = (
1950 xcassetName,
1951 imageSource,
1952 templateSource,
1953- ...prepareMenu(menuItem, index, side, currentPath),
1954+ ...prepareMenu(menuItem, index, placement, currentPath),
1955 };
1956 }
1957 return {
1958@@ -48,20 +48,53 @@ const prepareMenu = (
1959 xcassetName,
1960 imageSource,
1961 templateSource,
1962- menuId: `${currentPath}-${index}-${side}`,
1963+ menuId: `${currentPath}-${index}-${placement}`,
1964 };
1965 }),
1966 };
1967 };
1968
1969 export const prepareHeaderBarButtonItems = (
1970- barButtonItems: HeaderBarButtonItem[],
1971- side: 'left' | 'right',
1972+ barButtonItems:
1973+ | HeaderBarButtonItem[]
1974+ | HeaderBarButtonItem
1975+ | null
1976+ | undefined,
1977+ placement: 'left' | 'right' | 'center' | 'toolbar',
1978 ) => {
1979- return barButtonItems?.map((item, index) => {
1980+ const items = Array.isArray(barButtonItems)
1981+ ? barButtonItems
1982+ : barButtonItems && typeof barButtonItems === 'object' && 'type' in barButtonItems
1983+ ? [barButtonItems]
1984+ : undefined;
1985+
1986+ return items?.map((item, index) => {
1987 if (item.type === 'spacing') {
1988 return item;
1989 }
1990+ if (item.type === 'searchBarPlacement') {
1991+ if (placement !== 'toolbar') {
1992+ return null;
1993+ }
1994+ return {
1995+ ...item,
1996+ searchBarPlacement: true,
1997+ };
1998+ }
1999+ if (item.type === 'searchField') {
2000+ return {
2001+ ...item,
2002+ searchField: true,
2003+ };
2004+ }
2005+ if (item.type === 'mailSearchToolbar') {
2006+ return {
2007+ ...item,
2008+ mailSearchToolbar: true,
2009+ filterMenu: item.filterMenu ? prepareMenu(item.filterMenu, index, placement, 'filter') : undefined,
2010+ composeMenu: item.composeMenu ? prepareMenu(item.composeMenu, index, placement, 'compose') : undefined,
2011+ };
2012+ }
2013 let imageSource: ResolvedImageAsset | undefined,
2014 templateSource: ResolvedImageAsset | undefined;
2015 if (item.icon?.type === 'imageSource') {
2016@@ -97,15 +130,15 @@ export const prepareHeaderBarButtonItems = (
2017 if (item.type === 'button') {
2018 return {
2019 ...processedItem,
2020- buttonId: `${index}-${side}`,
2021+ buttonId: `${index}-${placement}`,
2022 };
2023 }
2024 if (item.type === 'menu') {
2025 return {
2026 ...processedItem,
2027- menu: prepareMenu(item.menu, index, side),
2028+ menu: prepareMenu(item.menu, index, placement),
2029 };
2030 }
2031 return null;
2032- });
2033+ }).filter(item => item !== null);
2034 };
2035diff --git a/src/fabric/ScreenStackHeaderConfigNativeComponent.ts b/src/fabric/ScreenStackHeaderConfigNativeComponent.ts
2036index da28c51..1136622 100644
2037--- a/src/fabric/ScreenStackHeaderConfigNativeComponent.ts
2038+++ b/src/fabric/ScreenStackHeaderConfigNativeComponent.ts
2039@@ -19,6 +19,7 @@ type OnPressHeaderBarButtonItemEvent = Readonly<{ buttonId: string }>;
2040 type OnPressHeaderBarButtonMenuItemEvent = Readonly<{ menuId: string }>;
2041
2042 type BackButtonDisplayMode = 'minimal' | 'default' | 'generic';
2043+type NavigationItemStyle = 'navigator' | 'browser' | 'editor';
2044
2045 type BlurEffect =
2046 | 'none'
2047@@ -66,12 +67,15 @@ export interface NativeProps extends ViewProps {
2048 largeTitleColor?: ColorValue | undefined;
2049 translucent?: boolean | undefined;
2050 title?: string | undefined;
2051+ subtitle?: string | undefined;
2052+ largeSubtitle?: string | undefined;
2053 titleFontFamily?: string | undefined;
2054 titleFontSize?: CT.Int32 | undefined;
2055 titleFontWeight?: string | undefined;
2056 titleColor?: ColorValue | undefined;
2057 disableBackButtonMenu?: boolean | undefined;
2058 backButtonDisplayMode?: CT.WithDefault<BackButtonDisplayMode, 'default'>;
2059+ navigationItemStyle?: CT.WithDefault<NavigationItemStyle, 'navigator'>;
2060 hideBackButton?: boolean | undefined;
2061 backButtonInCustomView?: boolean | undefined;
2062 blurEffect?: CT.WithDefault<BlurEffect, 'none'>;
2063@@ -79,6 +83,8 @@ export interface NativeProps extends ViewProps {
2064 topInsetEnabled?: boolean | undefined;
2065 headerLeftBarButtonItems?: CT.UnsafeMixed[] | undefined;
2066 headerRightBarButtonItems?: CT.UnsafeMixed[] | undefined;
2067+ headerCenterBarButtonItems?: CT.UnsafeMixed[] | undefined;
2068+ headerToolbarItems?: CT.UnsafeMixed[] | undefined;
2069 onPressHeaderBarButtonItem?:
2070 | CT.DirectEventHandler<OnPressHeaderBarButtonItemEvent>
2071 | undefined;
2072diff --git a/src/fabric/ScreenStackHeaderSubviewNativeComponent.ts b/src/fabric/ScreenStackHeaderSubviewNativeComponent.ts
2073index 9a6af57..03aa2b2 100644
2074--- a/src/fabric/ScreenStackHeaderSubviewNativeComponent.ts
2075+++ b/src/fabric/ScreenStackHeaderSubviewNativeComponent.ts
2076@@ -18,6 +18,7 @@ export type HeaderSubviewTypes =
2077 export interface NativeProps extends ViewProps {
2078 type?: CT.WithDefault<HeaderSubviewTypes, 'left'>;
2079 hidesSharedBackground?: boolean | undefined;
2080+ identifier?: string | undefined;
2081 synchronousShadowStateUpdatesEnabled?: CT.WithDefault<boolean, true>;
2082 }
2083
2084diff --git a/src/types.tsx b/src/types.tsx
2085index 8594b73..20c6e88 100644
2086--- a/src/types.tsx
2087+++ b/src/types.tsx
2088@@ -35,6 +35,7 @@ export type SearchBarCommands = {
2089 };
2090
2091 export type BackButtonDisplayMode = 'default' | 'generic' | 'minimal';
2092+export type NavigationItemStyle = 'navigator' | 'browser' | 'editor';
2093 export type StackPresentationTypes =
2094 | 'push'
2095 | 'modal'
2096@@ -754,6 +755,14 @@ export interface ScreenStackHeaderConfigProps extends ViewProps {
2097 * @platform ios
2098 */
2099 backButtonDisplayMode?: BackButtonDisplayMode | undefined;
2100+ /**
2101+ * Controls the UIKit `UINavigationItem.style` used by native iOS headers.
2102+ *
2103+ * `editor` matches modern document/editor-style bars with leading-aligned compact titles and glass controls.
2104+ *
2105+ * @platform ios
2106+ */
2107+ navigationItemStyle?: NavigationItemStyle | undefined;
2108 /**
2109 * Array of UIBarButtomItems to the left side of the header.
2110 *
2111@@ -766,6 +775,26 @@ export interface ScreenStackHeaderConfigProps extends ViewProps {
2112 * @platform ios
2113 */
2114 headerRightBarButtonItems?: HeaderBarButtonItem[] | undefined;
2115+ /**
2116+ * Array of UIBarButtonItems to the centered item group in modern iOS headers.
2117+ *
2118+ * This maps to `UINavigationItem.centerItemGroups` on iOS 26+ and lets
2119+ * document/editor-style chrome keep primary actions visually centered while
2120+ * leaving trailing search separate.
2121+ *
2122+ * @platform ios
2123+ */
2124+ headerCenterBarButtonItems?: HeaderBarButtonItem[] | undefined;
2125+ /**
2126+ * Array of UIBarButtonItems to display in the native toolbar attached to
2127+ * the current screen's navigation controller.
2128+ *
2129+ * On iOS 26+, this can contain a `searchBarPlacement` item to let UIKit
2130+ * render integrated Mail-style search chrome using the attached SearchBar.
2131+ *
2132+ * @platform ios
2133+ */
2134+ headerToolbarItems?: HeaderBarButtonItem[] | undefined;
2135 /**
2136 * When set to true the header will be hidden while the parent Screen is on the top of the stack. The default value is false.
2137 */
2138@@ -827,6 +856,20 @@ export interface ScreenStackHeaderConfigProps extends ViewProps {
2139 * String that can be displayed in the header as a fallback for `headerTitle`.
2140 */
2141 title?: string | undefined;
2142+ /**
2143+ * String displayed below the compact navigation title on iOS 26+.
2144+ *
2145+ * @platform ios
2146+ */
2147+ subtitle?: string | undefined;
2148+ /**
2149+ * String displayed below the large navigation title on iOS 26+.
2150+ *
2151+ * Falls back to `subtitle` when omitted.
2152+ *
2153+ * @platform ios
2154+ */
2155+ largeSubtitle?: string | undefined;
2156 /**
2157 * Allows for setting text color of the title.
2158 */
2159@@ -1139,6 +1182,13 @@ export interface SearchBarProps {
2160 }
2161
2162 export interface ScreenStackHeaderSubviewProps {
2163+ /**
2164+ * An identifier used to match this item across navigation bar transitions.
2165+ * Only applicable to type="right" and type="left" subviews on iOS 26.0 and later.
2166+ *
2167+ * Read more: https://developer.apple.com/documentation/uikit/uibarbuttonitem/identifier
2168+ */
2169+ identifier?: string | undefined;
2170 /**
2171 * A boolean value indicating whether the background this item may share with other items in the bar should be hidden.
2172 * Only applicable to type="right" and type="left" subviews.
2173@@ -1180,6 +1230,11 @@ interface SharedHeaderBarButtonItem {
2174 * Read more: https://developer.apple.com/documentation/uikit/uibarbuttonitem/style-swift.property
2175 */
2176 variant?: 'plain' | 'done' | 'prominent' | undefined;
2177+ /**
2178+ * Render the item with UIButtonConfiguration.glassButtonConfiguration.
2179+ * Only available from iOS 26.0 and later.
2180+ */
2181+ glassEffect?: boolean | undefined;
2182 /**
2183 * The tint color to apply to the item.
2184 *
2185@@ -1335,11 +1390,47 @@ export interface HeaderBarButtonItemWithMenu extends SharedHeaderBarButtonItem {
2186 export interface HeaderBarButtonItemSpacing {
2187 type: 'spacing';
2188 spacing: number;
2189+ flexible?: boolean | undefined;
2190+}
2191+
2192+export interface HeaderBarButtonSearchBarPlacementItem {
2193+ type: 'searchBarPlacement';
2194+ activatesSearchController?: boolean | undefined;
2195+ customView?: boolean | undefined;
2196+ index?: number | undefined;
2197+ width?: number | undefined;
2198+}
2199+
2200+export interface HeaderBarButtonSearchFieldItem {
2201+ type: 'searchField';
2202+ placeholder?: string | undefined;
2203+ width?: number | undefined;
2204+}
2205+
2206+export interface HeaderBarButtonMailSearchToolbarItem {
2207+ type: 'mailSearchToolbar';
2208+ composeButtonId?: string | undefined;
2209+ composeMenu?: HeaderBarButtonItemWithMenu['menu'] | undefined;
2210+ composeSystemImageName?: string | undefined;
2211+ filterButtonId?: string | undefined;
2212+ filterMenu?: HeaderBarButtonItemWithMenu['menu'] | undefined;
2213+ filterSystemImageName?: string | undefined;
2214+ onComposePress?: (() => void) | undefined;
2215+ onFilterPress?: (() => void) | undefined;
2216+ onSearchTextChange?: ((text: string) => void) | undefined;
2217+ placeholder?: string | undefined;
2218+ searchTextChangeId?: string | undefined;
2219+ showsSearchDismissButton?: boolean | undefined;
2220+ useFallbackSearchField?: boolean | undefined;
2221+ width?: number | undefined;
2222 }
2223
2224 export type HeaderBarButtonItem =
2225 | HeaderBarButtonItemWithAction
2226 | HeaderBarButtonItemWithMenu
2227+ | HeaderBarButtonMailSearchToolbarItem
2228+ | HeaderBarButtonSearchFieldItem
2229+ | HeaderBarButtonSearchBarPlacementItem
2230 | HeaderBarButtonItemSpacing;
2231
2232 /**
pnpm-lock.yaml+1316-2265
......@@ -69,52 +69,50 @@ overrides:
6969 '@effect/sql-pg': 4.0.0-rc.115
7070 '@effect/vitest': 4.0.0-rc.115
7171 '@effect/vitest>vitest': '-'
72 '@expo/dom-webview': 57.0.1
73 '@expo/metro-config': 57.0.12
74 expo-constants: 57.0.16
75 expo-modules-core: 57.0.14
72 '@expo/dom-webview': 58.0.2
73 '@expo/metro-config': 58.0.6
74 expo-constants: 58.0.9
75 expo-router: 58.0.10
76 expo-sharing>@expo/config-plugins: 58.0.4
77 expo-sharing>@expo/config-types: 58.0.2
7678 '@pierre/diffs>@shikijs/transformers': ^4.2.0
7779 '@tailwindcss/node': 4.3.3
7880 '@tailwindcss/oxide': 4.3.3
7981 '@tailwindcss/vite': 4.3.3
8082 '@types/node': 24.12.4
8183 effect: 4.0.0-rc.115
82 expo-router: 57.0.17
83 expo-sharing>@expo/config-plugins: 57.0.9
84 expo-sharing>@expo/config-types: 57.0.2
8584 node-abi: 4.33.0
8685 lightningcss: 1.33.0
8786 tailwindcss: 4.3.3
8887 vite: npm:@voidzero-dev/vite-plus-core@1.0.0
8988 yaml: ^2.9.0
9089
91packageExtensionsChecksum: sha256-k/dT9NFDl5hihRPaoFKeY11hzyutMFs5psfZLFiKJic=
90packageExtensionsChecksum: sha256-34mvKz5PLlrn2Tt9jUJC1SbK5hRE+oxwqyC1J6r09oE=
9291
9392patchedDependencies:
94 '@clerk/expo@4.6.8': a82bb41039ee88a290a87d4ab58be7be4c49fa338603b17ea646e1ec140a1cfb
93 '@clerk/expo@4.6.8': b8b22ab733de5bea846ad9e88046c10582352fe9ad86f314f368b2a823f0f281
9594 '@effect/vitest@4.0.0-rc.115': 172bd95ef73a13d322888984415d5d18d9d2aa8e13fa529eac235efac837e902
96 '@expo/metro-config@57.0.12': 96f1a75347e6ea02dc4b7034ace815d8ee39e18b8166ebfb573d9e58328f0dc2
95 '@expo/metro-config@58.0.6': 90fa980e8b6480631fb2fbb04559834e3c612db40c550cd828f11be297d8d760
9796 '@ff-labs/fff-node@0.9.4': c4e3cc2420ceb9dc650f9d189e9c24baf7e83f342998bacda5f459a4ce7927a8
9897 '@legendapp/list@3.3.5': 680cc6a5c5b4a4032e467e7b3fde22f89a84c0ee2e6eac6fda737d6277cc0806
9998 '@pierre/diffs@1.3.0-beta.10': 0ccee155b93b63d810e2c1a40c1fd676fb6fbcfa72cf6430dcedf1a3ae475ab4
10099 '@react-native-ai/apple@0.12.0': 2d09870c2848d185cb05b53ed823a46e12dba519324d8dd8e584e28731990f9d
101 '@react-native-menu/menu@2.0.0': f63d256bf6a97a873b5e628eb595bd6ef0075ddd5bdd890fc920f7a6024290dd
100 '@react-native-menu/menu@2.0.0': 1cc2d43fbd0281ca0dd1feb5ffcefee7d4419459c8daaa58effff10c657832fb
102101 '@react-navigation/native-stack@7.17.6': e667c3cef8c78bb9ff4882ee5bd23a432247b843060a9499eb5f07e9e2295552
103102 alchemy@2.0.0-beta.79: d1a03d902083946ee58121cc2787d88d1da561e9e30a5bcfcb8654692a489fb8
104103 dbus-next@0.10.2: cfff57561b0ee59b5addb3b2e6c6f20906e967507a530ab67e8db8108e520ba4
105104 effect@4.0.0-rc.115: 0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5
106 expo-audio@57.0.4: fa9a3e0442ed395d4071bb406e08c3a471c9a84700bdfa0b9ad7ff144c96041a
107 expo-modules-core@57.0.14: 6be7092f8c6f03a57b75c797d98b5f19ed62d2dd205bfc4c8adf4cef45655d7e
108 expo-notifications@57.0.15: f89252c2c08dc7b3acb8415f319ebbe15fff8c9f88a64ebe1830cd5ac5c9ac40
109 expo-sharing@57.0.17: 8d2e3b10eb3f52036a9a086800180ec6cebf3b75bccc5b1775117a7244d4ac45
110 expo-widgets@57.0.15: 319a9ded5db49c5b5215c511a138b33f44c7ea2972eb418192e8d5342fe75ce6
105 expo-audio@58.0.3: c20cb927d6848c53e7bf6ec14fe12f19daae9210165d2dbaf4e0f97ce31e8742
106 expo-blur@58.0.2: d0311b0c0b05bd94393bd9a84653cb42503d5f3c8a19eb2627c34ace08bedf18
107 expo-glass-effect@58.0.3: f750041c45ab838a3530451dc7b50d6640a79141037a1b0499c5e3412a860c57
108 expo-sharing@58.0.12: 5c85c709d951b5522b5bca897204b73ba7c17dec76e0dd155f41f8c2e833a7a8
109 expo-widgets@58.0.9: 94de7964c5a67ab40e6b79d9bdf4b7bfc50ae97b70722ee8e5a35105ca83386b
111110 node-pty@1.2.0-beta.15: f2fe901c61cde17986240002d05c172d5d0272d83ffaab8d0ebeb922763be414
112 react-native-gesture-handler@2.32.0: 0579f8e4dad02bf3183d95b02620358412983c36f9bda7425dc8bcb9643b5ce2
113 react-native-keyboard-controller@1.21.13: 6e4339347bc5bb3c9ea67d85ff5c814058b211c5750f247aba59d07869a2e787
111 react-native-gesture-handler@3.2.1: d518a937e3cb2df5e7d67f1ab6b265c74a8639e4572d1b032b7b747e9b1c01a9
112 react-native-keyboard-controller@1.22.4: a438114039aed2e280a81d95c25723132ad071e4768fe492bd92aa628ad74597
114113 react-native-nitro-markdown@0.5.8: 642b47830730acff3761fe29cf54271d18b493c0070c750097850b7ea032e00c
115 react-native-nitro-modules@0.35.9: 825622aae63a8fb5b904f3c77908a0e216261d727ea171709f2c0b6088422675
116 react-native-reanimated@4.5.5: bae9878a5bdba94e11c890e5ee164542feb622624fc81c13890063094608216d
117 react-native-screens@4.26.2: 595114f3f9ce8b9f0d99d1aafe5c12c997b7d75ca9add31d46cbedbfe347b8e0
114 react-native-nitro-modules@0.35.9: daf4a639ce3f951af630a3711e4082d58e3a11e5a79f45efb0b59925327ebde2
115 react-native-screens@4.28.0: cc1301436ee62c39860acc9ee1a1e60b7d47e6abd211c42effa62c056d165483
118116 uniwind@1.11.0: a91f3953483cfd434436de6358ff5b63c49974ef148fad91246c26ba95332625
119117
120118importers:
......@@ -144,7 +142,7 @@ importers:
144142 dependencies:
145143 '@clerk/electron':
146144 specifier: 0.0.44
147 version: 0.0.44(@clerk/electron-passkeys@0.0.3)(electron-store@8.2.0)(electron@44.4.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
145 version: 0.0.44(@clerk/electron-passkeys@0.0.3)(electron-store@8.2.0)(electron@44.4.2)(react-dom@19.3.0(react@19.3.0))(react@19.2.6)
148146 '@clerk/electron-passkeys':
149147 specifier: 0.0.3
150148 version: 0.0.3
......@@ -245,19 +243,22 @@ importers:
245243 dependencies:
246244 '@clerk/expo':
247245 specifier: 4.6.8
248 version: 4.6.8(patch_hash=a82bb41039ee88a290a87d4ab58be7be4c49fa338603b17ea646e1ec140a1cfb)(dbc31631339ce74330e188d5d7a88158)
246 version: 4.6.8(patch_hash=b8b22ab733de5bea846ad9e88046c10582352fe9ad86f314f368b2a823f0f281)(950bb7335d61b76ffb649f136fc0d4df)
249247 '@effect/atom-react':
250248 specifier: 4.0.0-rc.115
251 version: 4.0.0-rc.115(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))(react@19.2.3)(scheduler@0.27.0)
249 version: 4.0.0-rc.115(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))(react@19.3.0)(scheduler@0.27.0)
252250 '@expo-google-fonts/dm-sans':
253251 specifier: ^0.4.2
254252 version: 0.4.2
253 '@expo/metro-runtime':
254 specifier: ~58.0.9
255 version: 58.0.9(@expo/log-box@58.0.7)(expo@58.0.0)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
255256 '@expo/ui':
256 specifier: ~57.0.14
257 version: 57.0.14(@babel/core@7.29.7)(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(expo@57.0.18)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.11.4(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
257 specifier: ~58.0.9
258 version: 58.0.9(@babel/core@7.29.7)(expo@58.0.0)(react-dom@19.3.0(react@19.3.0))(react-native-worklets@0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
258259 '@legendapp/list':
259260 specifier: 'catalog:'
260 version: 3.3.5(patch_hash=680cc6a5c5b4a4032e467e7b3fde22f89a84c0ee2e6eac6fda737d6277cc0806)(react-dom@19.2.3(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
261 version: 3.3.5(patch_hash=680cc6a5c5b4a4032e467e7b3fde22f89a84c0ee2e6eac6fda737d6277cc0806)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
261262 '@material/material-color-utilities':
262263 specifier: 0.3.0
263264 version: 0.3.0
......@@ -266,22 +267,22 @@ importers:
266267 version: 1.9.1
267268 '@pierre/diffs':
268269 specifier: 'catalog:'
269 version: 1.3.0-beta.10(patch_hash=0ccee155b93b63d810e2c1a40c1fd676fb6fbcfa72cf6430dcedf1a3ae475ab4)(@shikijs/themes@4.2.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
270 version: 1.3.0-beta.10(patch_hash=0ccee155b93b63d810e2c1a40c1fd676fb6fbcfa72cf6430dcedf1a3ae475ab4)(@shikijs/themes@4.2.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
270271 '@react-native-ai/apple':
271272 specifier: 0.12.0
272 version: 0.12.0(patch_hash=2d09870c2848d185cb05b53ed823a46e12dba519324d8dd8e584e28731990f9d)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
273 version: 0.12.0(patch_hash=2d09870c2848d185cb05b53ed823a46e12dba519324d8dd8e584e28731990f9d)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))
273274 '@react-native-menu/menu':
274275 specifier: ^2.0.0
275 version: 2.0.0(patch_hash=f63d256bf6a97a873b5e628eb595bd6ef0075ddd5bdd890fc920f7a6024290dd)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
276 version: 2.0.0(patch_hash=1cc2d43fbd0281ca0dd1feb5ffcefee7d4419459c8daaa58effff10c657832fb)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
276277 '@react-navigation/elements':
277278 specifier: 2.9.26
278 version: 2.9.26(c10301b6e0c42fc6434d2b643197a81e)
279 version: 2.9.26(83de68753219ecf7f3321e065bd378be)
279280 '@react-navigation/native':
280281 specifier: 7.3.4
281 version: 7.3.4(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
282 version: 7.3.4(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
282283 '@react-navigation/native-stack':
283284 specifier: 7.17.6
284 version: 7.17.6(patch_hash=e667c3cef8c78bb9ff4882ee5bd23a432247b843060a9499eb5f07e9e2295552)(f640afa6cd4b9a1dc5422cbafdc82f53)
285 version: 7.17.6(patch_hash=e667c3cef8c78bb9ff4882ee5bd23a432247b843060a9499eb5f07e9e2295552)(cdeee8948497d4b80ffe015e2a003650)
285286 '@shikijs/core':
286287 specifier: 4.2.0
287288 version: 4.2.0
......@@ -302,7 +303,7 @@ importers:
302303 version: link:../../packages/contracts
303304 '@t3tools/mobile-markdown-text':
304305 specifier: file:./modules/t3-markdown-text
305 version: file:apps/mobile/modules/t3-markdown-text(c883758f8793b29a89016166016b354e)
306 version: file:apps/mobile/modules/t3-markdown-text(5c46709ff7a3b3b481fcdaa30ae2beb2)
306307 '@t3tools/mobile-review-diff-native':
307308 specifier: file:./modules/t3-review-diff
308309 version: file:apps/mobile/modules/t3-review-diff
......@@ -314,7 +315,7 @@ importers:
314315 version: link:../../packages/shared
315316 '@tabler/icons-react-native':
316317 specifier: ^3.44.0
317 version: 3.44.0(react-native-svg@15.15.4(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react@19.2.3)
318 version: 3.44.0(react-native-svg@15.15.5(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react@19.3.0)
318319 clsx:
319320 specifier: ^2.1.1
320321 version: 2.1.1
......@@ -325,155 +326,155 @@ importers:
325326 specifier: 4.0.0-rc.115
326327 version: 4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)
327328 expo:
328 specifier: ~57.0.18
329 version: 57.0.18(41fd11498a34454c91128cdad32f22f8)
329 specifier: 58.0.0
330 version: 58.0.0(3abfa3879936d948a635873738556226)
330331 expo-asset:
331 specifier: ~57.0.15
332 version: 57.0.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@7.0.2)
332 specifier: ~58.0.9
333 version: 58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2)
333334 expo-audio:
334 specifier: 57.0.4
335 version: 57.0.4(patch_hash=fa9a3e0442ed395d4071bb406e08c3a471c9a84700bdfa0b9ad7ff144c96041a)(expo-asset@57.0.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@7.0.2))(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
335 specifier: 58.0.3
336 version: 58.0.3(patch_hash=c20cb927d6848c53e7bf6ec14fe12f19daae9210165d2dbaf4e0f97ce31e8742)(expo-asset@58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2))(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
336337 expo-auth-session:
337 specifier: ~57.0.10
338 version: 57.0.10(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
338 specifier: ~58.0.6
339 version: 58.0.6(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2)
339340 expo-blur:
340 specifier: ~57.0.2
341 version: 57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
341 specifier: 58.0.2
342 version: 58.0.2(patch_hash=d0311b0c0b05bd94393bd9a84653cb42503d5f3c8a19eb2627c34ace08bedf18)(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
342343 expo-build-properties:
343 specifier: ~57.0.15
344 version: 57.0.15(expo@57.0.18)
344 specifier: ~58.0.9
345 version: 58.0.9(expo@58.0.0)
345346 expo-camera:
346 specifier: ~57.0.4
347 version: 57.0.4(@types/emscripten@1.41.5)(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
347 specifier: ~58.0.5
348 version: 58.0.5(@types/emscripten@1.41.5)(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
348349 expo-clipboard:
349 specifier: ~57.0.1
350 version: 57.0.1(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
350 specifier: ~58.0.2
351 version: 58.0.2(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
351352 expo-constants:
352 specifier: 57.0.16
353 version: 57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
353 specifier: 58.0.9
354 version: 58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(typescript@7.0.2)
354355 expo-crypto:
355 specifier: ~57.0.2
356 version: 57.0.2(expo@57.0.18)
356 specifier: ~58.0.3
357 version: 58.0.3(expo@58.0.0)
357358 expo-dev-client:
358 specifier: ~57.0.16
359 version: 57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
359 specifier: ~58.0.9
360 version: 58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))
360361 expo-device:
361 specifier: ~57.0.1
362 version: 57.0.1(expo@57.0.18)
362 specifier: ~58.0.3
363 version: 58.0.3(expo@58.0.0)
363364 expo-document-picker:
364 specifier: ~57.0.1
365 version: 57.0.1(expo@57.0.18)
365 specifier: ~58.0.3
366 version: 58.0.3(expo@58.0.0)
366367 expo-file-system:
367 specifier: ~57.0.6
368 version: 57.0.6(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
368 specifier: ~58.0.4
369 version: 58.0.4(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))
369370 expo-font:
370 specifier: ~57.0.2
371 version: 57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
371 specifier: ~58.0.4
372 version: 58.0.4(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
372373 expo-glass-effect:
373 specifier: ~57.0.1
374 version: 57.0.1(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
374 specifier: 58.0.3
375 version: 58.0.3(patch_hash=f750041c45ab838a3530451dc7b50d6640a79141037a1b0499c5e3412a860c57)(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
375376 expo-haptics:
376 specifier: ~57.0.2
377 version: 57.0.2(expo@57.0.18)
377 specifier: ~58.0.3
378 version: 58.0.3(expo@58.0.0)
378379 expo-image:
379 specifier: ~57.0.3
380 version: 57.0.3(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
380 specifier: ~58.0.8
381 version: 58.0.8(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
381382 expo-image-manipulator:
382 specifier: ~57.0.17
383 version: 57.0.17(expo@57.0.18)
383 specifier: ~58.0.10
384 version: 58.0.10(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
384385 expo-image-picker:
385 specifier: ~57.0.14
386 version: 57.0.14(expo@57.0.18)
386 specifier: ~58.0.9
387 version: 58.0.9(expo@58.0.0)
387388 expo-keep-awake:
388 specifier: ~57.0.2
389 version: 57.0.2(expo@57.0.18)(react@19.2.3)
389 specifier: ~58.0.2
390 version: 58.0.2(expo@58.0.0)(react@19.3.0)
390391 expo-linking:
391 specifier: ~57.0.8
392 version: 57.0.8(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
392 specifier: ~58.0.9
393 version: 58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2)
393394 expo-network:
394 specifier: ~57.0.1
395 version: 57.0.1(expo@57.0.18)(react@19.2.3)
395 specifier: ~58.0.2
396 version: 58.0.2(expo@58.0.0)(react@19.3.0)
396397 expo-notifications:
397 specifier: 57.0.15
398 version: 57.0.15(patch_hash=f89252c2c08dc7b3acb8415f319ebbe15fff8c9f88a64ebe1830cd5ac5c9ac40)(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@7.0.2)
398 specifier: ~58.0.9
399 version: 58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2)
399400 expo-paste-input:
400401 specifier: ^0.1.15
401 version: 0.1.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
402 version: 0.1.15(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
402403 expo-quick-actions:
403404 specifier: ^6.0.2
404 version: 6.0.2(expo@57.0.18)(typescript@7.0.2)
405 version: 6.0.2(expo@58.0.0)(typescript@7.0.2)
405406 expo-secure-store:
406 specifier: ~57.0.2
407 version: 57.0.2(expo@57.0.18)
407 specifier: ~58.0.1
408 version: 58.0.1(expo@58.0.0)
408409 expo-sharing:
409 specifier: 57.0.17
410 version: 57.0.17(patch_hash=8d2e3b10eb3f52036a9a086800180ec6cebf3b75bccc5b1775117a7244d4ac45)(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@7.0.2)
410 specifier: 58.0.12
411 version: 58.0.12(patch_hash=5c85c709d951b5522b5bca897204b73ba7c17dec76e0dd155f41f8c2e833a7a8)(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2)
411412 expo-splash-screen:
412 specifier: ~57.0.8
413 version: 57.0.8(expo@57.0.18)(typescript@7.0.2)
413 specifier: ~58.0.2
414 version: 58.0.2(expo@58.0.0)(typescript@7.0.2)
414415 expo-sqlite:
415 specifier: ~57.0.2
416 version: 57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
416 specifier: ~58.0.7
417 version: 58.0.7(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
417418 expo-symbols:
418 specifier: ~57.0.2
419 version: 57.0.2(expo-font@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
419 specifier: ~58.0.3
420 version: 58.0.3(expo-font@58.0.4(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
420421 expo-updates:
421 specifier: ~57.0.19
422 version: 57.0.19(expo-dev-client@57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)))(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
422 specifier: ~58.0.11
423 version: 58.0.11(expo-dev-client@58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)))(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
423424 expo-video:
424 specifier: ~57.0.3
425 version: 57.0.3(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
425 specifier: ~58.0.5
426 version: 58.0.5(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
426427 expo-web-browser:
427 specifier: ~57.0.2
428 version: 57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
428 specifier: ~58.0.3
429 version: 58.0.3(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))
429430 expo-widgets:
430 specifier: 57.0.15
431 version: 57.0.15(patch_hash=319a9ded5db49c5b5215c511a138b33f44c7ea2972eb418192e8d5342fe75ce6)(@babel/core@7.29.7)(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(expo@57.0.18)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.11.4(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
431 specifier: 58.0.9
432 version: 58.0.9(patch_hash=94de7964c5a67ab40e6b79d9bdf4b7bfc50ae97b70722ee8e5a35105ca83386b)(@babel/core@7.29.7)(expo@58.0.0)(react-dom@19.3.0(react@19.3.0))(react-native-worklets@0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
432433 react:
433 specifier: 19.2.3
434 version: 19.2.3
434 specifier: 19.3.0
435 version: 19.3.0
435436 react-dom:
436 specifier: 19.2.3
437 version: 19.2.3(react@19.2.3)
437 specifier: 19.3.0
438 version: 19.3.0(react@19.3.0)
438439 react-native:
439 specifier: 0.86.3
440 version: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
440 specifier: 0.88.0-rc.3
441 version: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
441442 react-native-gesture-handler:
442 specifier: ~2.32.0
443 version: 2.32.0(patch_hash=0579f8e4dad02bf3183d95b02620358412983c36f9bda7425dc8bcb9643b5ce2)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
443 specifier: ~3.2.1
444 version: 3.2.1(patch_hash=d518a937e3cb2df5e7d67f1ab6b265c74a8639e4572d1b032b7b747e9b1c01a9)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
444445 react-native-image-viewing:
445446 specifier: ^0.2.2
446 version: 0.2.2(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
447 version: 0.2.2(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
447448 react-native-keyboard-controller:
448 specifier: 1.21.13
449 version: 1.21.13(patch_hash=6e4339347bc5bb3c9ea67d85ff5c814058b211c5750f247aba59d07869a2e787)(react-native-reanimated@4.5.5(patch_hash=bae9878a5bdba94e11c890e5ee164542feb622624fc81c13890063094608216d)(react-native-worklets@0.11.4(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
449 specifier: 1.22.4
450 version: 1.22.4(patch_hash=a438114039aed2e280a81d95c25723132ad071e4768fe492bd92aa628ad74597)(react-native-reanimated@4.7.0(react-native-worklets@0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
450451 react-native-nitro-markdown:
451452 specifier: ^0.5.0
452 version: 0.5.8(patch_hash=642b47830730acff3761fe29cf54271d18b493c0070c750097850b7ea032e00c)(react-native-nitro-modules@0.35.9(patch_hash=825622aae63a8fb5b904f3c77908a0e216261d727ea171709f2c0b6088422675)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native-svg@15.15.4(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
453 version: 0.5.8(patch_hash=642b47830730acff3761fe29cf54271d18b493c0070c750097850b7ea032e00c)(react-native-nitro-modules@0.35.9(patch_hash=daf4a639ce3f951af630a3711e4082d58e3a11e5a79f45efb0b59925327ebde2)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native-svg@15.15.5(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
453454 react-native-nitro-modules:
454455 specifier: 0.35.9
455 version: 0.35.9(patch_hash=825622aae63a8fb5b904f3c77908a0e216261d727ea171709f2c0b6088422675)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
456 version: 0.35.9(patch_hash=daf4a639ce3f951af630a3711e4082d58e3a11e5a79f45efb0b59925327ebde2)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
456457 react-native-reanimated:
457 specifier: 4.5.5
458 version: 4.5.5(patch_hash=bae9878a5bdba94e11c890e5ee164542feb622624fc81c13890063094608216d)(react-native-worklets@0.11.4(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
458 specifier: 4.7.0
459 version: 4.7.0(react-native-worklets@0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
459460 react-native-safe-area-context:
460 specifier: ~5.7.0
461 version: 5.7.0(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
461 specifier: ~5.9.1
462 version: 5.9.1(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
462463 react-native-screens:
463 specifier: ~4.26.0
464 version: 4.26.2(patch_hash=595114f3f9ce8b9f0d99d1aafe5c12c997b7d75ca9add31d46cbedbfe347b8e0)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
464 specifier: ~4.28.0
465 version: 4.28.0(patch_hash=cc1301436ee62c39860acc9ee1a1e60b7d47e6abd211c42effa62c056d165483)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
465466 react-native-shiki-engine:
466467 specifier: ^0.3.12
467 version: 0.3.12(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
468 version: 0.3.12(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
468469 react-native-svg:
469 specifier: 15.15.4
470 version: 15.15.4(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
470 specifier: 15.15.5
471 version: 15.15.5(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
471472 react-native-webview:
472 specifier: ^13.16.1
473 version: 13.16.1(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
473 specifier: 14.0.1
474 version: 14.0.1(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
474475 react-native-worklets:
475 specifier: 0.11.4
476 version: 0.11.4(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
476 specifier: 0.13.0
477 version: 0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
477478 shiki:
478479 specifier: 4.2.0
479480 version: 4.2.0
......@@ -482,23 +483,23 @@ importers:
482483 version: 3.6.0
483484 uniwind:
484485 specifier: 1.11.0
485 version: 1.11.0(patch_hash=a91f3953483cfd434436de6358ff5b63c49974ef148fad91246c26ba95332625)(@expo/metro-config@57.0.12(patch_hash=96f1a75347e6ea02dc4b7034ace815d8ee39e18b8166ebfb573d9e58328f0dc2)(bufferutil@4.1.0)(expo@57.0.18)(typescript@7.0.2)(utf-8-validate@6.0.6))(metro-cache@0.84.5)(metro-transform-worker@0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6))(metro@0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(tailwindcss@4.3.3)
486 version: 1.11.0(patch_hash=a91f3953483cfd434436de6358ff5b63c49974ef148fad91246c26ba95332625)(@expo/metro-config@58.0.6(patch_hash=90fa980e8b6480631fb2fbb04559834e3c612db40c550cd828f11be297d8d760)(bufferutil@4.1.0)(expo@58.0.0)(typescript@7.0.2)(utf-8-validate@6.0.6))(metro-cache@0.87.1)(metro-transform-worker@0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6))(metro@0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(tailwindcss@4.3.3)
486487 devDependencies:
487488 '@effect/vitest':
488489 specifier: 4.0.0-rc.115
489490 version: 4.0.0-rc.115(patch_hash=172bd95ef73a13d322888984415d5d18d9d2aa8e13fa529eac235efac837e902)(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))
490491 '@pierre/trees':
491492 specifier: 1.0.0-beta.4
492 version: 1.0.0-beta.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
493 version: 1.0.0-beta.4(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
493494 '@types/react':
494 specifier: ~19.2.0
495 version: 19.2.16
495 specifier: ~19.3.0
496 version: 19.3.0
496497 '@types/react-dom':
497498 specifier: ~19.2.3
498 version: 19.2.3(@types/react@19.2.16)
499 version: 19.2.3(@types/react@19.3.0)
499500 babel-preset-expo:
500 specifier: ~57.0.9
501 version: 57.0.9(@babel/core@7.29.7)(@babel/runtime@7.29.7)(expo-widgets@57.0.15)(expo@57.0.18)(react-refresh@0.14.2)
501 specifier: ~58.0.6
502 version: 58.0.6(@babel/core@7.29.7)(@babel/runtime@7.29.7)(expo-widgets@58.0.9)(expo@58.0.0)(react-refresh@0.14.2)
502503 tailwindcss:
503504 specifier: 4.3.3
504505 version: 4.3.3
......@@ -595,7 +596,7 @@ importers:
595596 dependencies:
596597 '@base-ui/react':
597598 specifier: ^1.4.1
598 version: 1.5.0(@date-fns/tz@1.5.0)(@types/react@19.2.16)(date-fns@4.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
599 version: 1.5.0(@date-fns/tz@1.5.0)(@types/react@19.3.0)(date-fns@4.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
599600 '@clerk/electron':
600601 specifier: 0.0.44
601602 version: 0.0.44(@clerk/electron-passkeys@0.0.3)(electron-store@8.2.0)(electron@44.4.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
......@@ -604,7 +605,7 @@ importers:
604605 version: 6.16.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
605606 '@daypicker/react':
606607 specifier: ^10.0.1
607 version: 10.0.1(@types/react@19.2.16)(react@19.2.6)
608 version: 10.0.1(@types/react@19.3.0)(react@19.2.6)
608609 '@dnd-kit/core':
609610 specifier: ^6.3.1
610611 version: 6.3.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
......@@ -667,7 +668,7 @@ importers:
667668 version: 3.31.3
668669 '@tiptap/react':
669670 specifier: ^3.31.3
670 version: 3.31.3(@floating-ui/dom@1.7.6)(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
671 version: 3.31.3(@floating-ui/dom@1.7.6)(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)(@types/react-dom@19.2.3(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
671672 '@tiptap/starter-kit':
672673 specifier: ^3.31.3
673674 version: 3.31.3
......@@ -709,7 +710,7 @@ importers:
709710 version: 19.2.6(react@19.2.6)
710711 react-markdown:
711712 specifier: ^10.1.0
712 version: 10.1.0(@types/react@19.2.16)(react@19.2.6)
713 version: 10.1.0(@types/react@19.3.0)(react@19.2.6)
713714 rehype-raw:
714715 specifier: ^7.0.0
715716 version: 7.0.0
......@@ -727,7 +728,7 @@ importers:
727728 version: 3.6.0
728729 zustand:
729730 specifier: ^5.0.11
730 version: 5.0.14(@types/react@19.2.16)(react@19.2.6)(use-sync-external-store@1.6.0(react@19.2.6))
731 version: 5.0.14(@types/react@19.3.0)(react@19.2.6)(use-sync-external-store@1.6.0(react@19.2.6))
731732 devDependencies:
732733 '@effect/platform-node':
733734 specifier: 4.0.0-rc.115
......@@ -757,11 +758,11 @@ importers:
757758 specifier: ^4.0.4
758759 version: 4.0.4
759760 '@types/react':
760 specifier: ~19.2.14
761 version: 19.2.16
761 specifier: ~19.3.0
762 version: 19.3.0
762763 '@types/react-dom':
763764 specifier: ~19.2.3
764 version: 19.2.3(@types/react@19.2.16)
765 version: 19.2.3(@types/react@19.3.0)
765766 '@types/react-test-renderer':
766767 specifier: 19.1.0
767768 version: 19.1.0
......@@ -800,7 +801,7 @@ importers:
800801 dependencies:
801802 '@clerk/backend':
802803 specifier: 3.18.1
803 version: 3.18.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
804 version: 3.18.1(react-dom@19.3.0(react@19.3.0))(react@19.2.6)
804805 '@effect/sql-pg':
805806 specifier: 4.0.0-rc.115
806807 version: 4.0.0-rc.115(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))
......@@ -821,10 +822,10 @@ importers:
821822 version: link:../../packages/shared
822823 alchemy:
823824 specifier: 2.0.0-beta.79
824 version: 2.0.0-beta.79(patch_hash=d1a03d902083946ee58121cc2787d88d1da561e9e30a5bcfcb8654692a489fb8)(@effect/platform-node@4.0.0-rc.115(bufferutil@4.1.0)(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))(redis@6.2.1)(utf-8-validate@6.0.6))(@effect/sql-pg@4.0.0-rc.115(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)))(@types/node@24.12.4)(@types/react@19.2.16)(@voidzero-dev/vite-plus-core@1.0.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(drizzle-kit@1.0.0-rc.5-ab785fc)(drizzle-orm@1.0.0-rc.5-ab785fc(31bc26b129d6bba2f2e387113f50dba2))(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))(mongodb@6.21.0(@aws-sdk/credential-providers@3.1062.0)(socks@2.8.9))(pg@8.23.0)(react-devtools-core@6.1.5(bufferutil@4.1.0)(utf-8-validate@6.0.6))(typescript@7.0.2)(utf-8-validate@6.0.6)(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))
825 version: 2.0.0-beta.79(patch_hash=d1a03d902083946ee58121cc2787d88d1da561e9e30a5bcfcb8654692a489fb8)(@effect/platform-node@4.0.0-rc.115(bufferutil@4.1.0)(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))(redis@6.2.1)(utf-8-validate@6.0.6))(@effect/sql-pg@4.0.0-rc.115(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)))(@types/node@24.12.4)(@types/react@19.3.0)(@voidzero-dev/vite-plus-core@1.0.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(drizzle-kit@1.0.0-rc.5-ab785fc)(drizzle-orm@1.0.0-rc.5-ab785fc(7abae7c285f47308cc52e143cbe0c150))(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))(mongodb@6.21.0(@aws-sdk/credential-providers@3.1062.0)(socks@2.8.9))(pg@8.23.0)(react-devtools-core@6.1.5(bufferutil@4.1.0)(utf-8-validate@6.0.6))(typescript@7.0.2)(utf-8-validate@6.0.6)(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))
825826 drizzle-orm:
826827 specifier: 1.0.0-rc.5-ab785fc
827 version: 1.0.0-rc.5-ab785fc(31bc26b129d6bba2f2e387113f50dba2)
828 version: 1.0.0-rc.5-ab785fc(7abae7c285f47308cc52e143cbe0c150)
828829 effect:
829830 specifier: 4.0.0-rc.115
830831 version: 4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)
......@@ -1096,6 +1097,15 @@ importers:
10961097
10971098packages:
10981099
1100 2g@0.4.4:
1101 resolution: {integrity: sha512-ZwH02IRQicm+92YzJZMS8imSAJaqTPI+VASb1zMnisotnWcEP4e7nb57Mr8C2dGAA5G8ZmialbMmpkGLWgAY/w==}
1102 hasBin: true
1103 peerDependencies:
1104 typescript: '>=5.8.0'
1105 peerDependenciesMeta:
1106 typescript:
1107 optional: true
1108
10991109 '@ai-sdk/provider-utils@4.0.49':
11001110 resolution: {integrity: sha512-8e7pd+82bobqrFOaD5dG/PiEuvLYr5olaE3I56ch0jipR0H7sGD6ohwTUynv6k8O8QidWiyIbEsZCtr/2dyXIA==}
11011111 engines: {node: '>=18.17'}
......@@ -1688,12 +1698,6 @@ packages:
16881698 peerDependencies:
16891699 '@babel/core': ^7.0.0-0
16901700
1691 '@babel/plugin-transform-react-jsx@7.28.6':
1692 resolution: {integrity: sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==}
1693 engines: {node: '>=6.9.0'}
1694 peerDependencies:
1695 '@babel/core': ^7.0.0-0
1696
16971701 '@babel/plugin-transform-react-jsx@7.29.7':
16981702 resolution: {integrity: sha512-WsZulLVBUHXVj2cUcPVx6UE21TpalB6bHbSFErKT0Ib++ax24jjXe73FqlWvdylFOjiuPHYi6VCcgRad1ItN+A==}
16991703 engines: {node: '>=6.9.0'}
......@@ -1921,7 +1925,7 @@ packages:
19211925 expo: '>=54 <58'
19221926 expo-apple-authentication: '>=7.0.0'
19231927 expo-auth-session: '>=5'
1924 expo-constants: 57.0.16
1928 expo-constants: 58.0.9
19251929 expo-crypto: '>=12'
19261930 expo-local-authentication: '>=13.5.0'
19271931 expo-secure-store: '>=12.4.0'
......@@ -2286,10 +2290,6 @@ packages:
22862290 peerDependencies:
22872291 effect: 4.0.0-rc.115
22882292
2289 '@egjs/hammerjs@2.0.17':
2290 resolution: {integrity: sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==}
2291 engines: {node: '>=0.8.0'}
2292
22932293 '@electric-sql/pglite@0.3.15':
22942294 resolution: {integrity: sha512-Cj++n1Mekf9ETfdc16TlDi+cDDQF0W7EcbyRHYOAeZdsAe8M/FJg18itDTSwyHfar2WIezawM9o0EKaRGVKygQ==}
22952295
......@@ -2732,12 +2732,12 @@ packages:
27322732 '@expo-google-fonts/material-symbols@0.4.38':
27332733 resolution: {integrity: sha512-IJkBtN1o8u9BW5fvSii1MyHPQ7Q0HxbWcVBvOrOzgMLpVtZw7R2w94wBTVR7kZwv3w1JNTESMmLA5Sqn1+Z36A==}
27342734
2735 '@expo/cli@57.0.20':
2736 resolution: {integrity: sha512-ZjWz7SA5TBTyKq4+aFRUPgMFxmqHtKkDMv6d85J2UAAjdRhkNRf+B80t+rr5IFo2ywuTvyrPRBth4ei4w08olA==}
2735 '@expo/cli@58.0.9':
2736 resolution: {integrity: sha512-qoCjBSbq8sFmhPHA0jgDvkRdGvVm9Wjti0U/zlrqYrH/lVolqT8++RvWebCLIGrT1WHQ9HWOmaL7szKqbhVgiA==}
27372737 hasBin: true
27382738 peerDependencies:
27392739 expo: '*'
2740 expo-router: 57.0.17
2740 expo-router: 58.0.10
27412741 react-native: '*'
27422742 peerDependenciesMeta:
27432743 expo-router:
......@@ -2748,85 +2748,91 @@ packages:
27482748 '@expo/code-signing-certificates@0.0.6':
27492749 resolution: {integrity: sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==}
27502750
2751 '@expo/config-plugins@57.0.9':
2752 resolution: {integrity: sha512-hHgfL1avkCdEvDSw7IwlKwRYYNgcxzbNNMIk6W6lTkJpY0MajinAfeJUS0J+wPCsjUfGbVqOJM+XhPaO5ulUxg==}
2751 '@expo/config-plugins@58.0.4':
2752 resolution: {integrity: sha512-JlZSHqYPU7nrU1E68KGpoW9pcXYgHfKOeTnqXXOop/4yj9UarOe9Y26Wlp6fhXjZ28ZooBJxo3J0Z5SSuLfbDQ==}
27532753
2754 '@expo/config-types@57.0.2':
2755 resolution: {integrity: sha512-ewW08OonrcRIsRKIlFvvcmmafE5zemb1ocu3HkNwtVPyRtj2w42pZCAkMIROYpcVBaPnc3mDT9UZDzwXWC3i6g==}
2754 '@expo/config-types@58.0.2':
2755 resolution: {integrity: sha512-iXoMw0/8KVSrrGRxOnf69eB9k5iPomOH7RPJnYEErAMFCfl2QCkftkHVSUdZ3qxtpx9EjRm0MANyAoQj77U7qw==}
27562756
2757 '@expo/config@57.0.9':
2758 resolution: {integrity: sha512-dmzlKraIFxa7wLwV6K7WzI8jp6QZpW6Mc5mGjLimJUFjzh4uQdYaT3m3plEutM5yxBoBEwqzks7l+I/ljCbxAQ==}
2757 '@expo/config@58.0.1':
2758 resolution: {integrity: sha512-sFI8mxS2p3E08xOGk1fKTQiuF27EQj1evwT4fXeMoaD6RjDJJDVmwJ27FMb6d4a/NObwgieIlGtoCE0+mmfD4A==}
27592759
27602760 '@expo/devcert@1.2.1':
27612761 resolution: {integrity: sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==}
27622762
2763 '@expo/devtools@57.0.1':
2764 resolution: {integrity: sha512-GyUf+wFNkbttaX0jR7MZa9bm77U0IrLg6d2AjpxdyoXw/w4abHoXG0oFufwLMgP9zLTd5+Ct4X/ffNUTnlzZgg==}
2763 '@expo/devtools@58.0.2':
2764 resolution: {integrity: sha512-WBj/K+vv8JPSmY70ennL04YYOHkpEsGGkfuVY9lfv4XO7Qhbt5qz4q6W7maME194I5oGcimRMigUFfWNkBe90w==}
27652765 peerDependencies:
2766 expo: '*'
27662767 react: '*'
27672768 react-native: '*'
27682769 peerDependenciesMeta:
2770 expo:
2771 optional: true
27692772 react:
27702773 optional: true
27712774 react-native:
27722775 optional: true
27732776
2774 '@expo/dom-webview@57.0.1':
2775 resolution: {integrity: sha512-lAKsME4SAq+8sf56oN0DX5TBYyruupoRxbWbD2xf9RnKY8y6x8eb9LCE5pxSN0qyWdqnp+0wmyWzDkKboThKAw==}
2777 '@expo/dom-webview@58.0.2':
2778 resolution: {integrity: sha512-bLkREoP7qL3rEuzxP60xG+TjdPoGjbnZfxkvYo5imJxGWfKMOf7x962W06Pu+WWAr4gcDRk16iA+Clg8D0zjCg==}
27762779 peerDependencies:
27772780 expo: '*'
27782781 react: '*'
27792782 react-native: '*'
27802783
2781 '@expo/env@2.4.3':
2782 resolution: {integrity: sha512-M1NXeZCA1mkMkYOyIe7PlyRX0/jqFtMoJgyblnlq/vpCRfmueFT7RnGSQG8uEFDF5WHOFGijAQ3fogPh3/n5Ng==}
2784 '@expo/env@2.5.1':
2785 resolution: {integrity: sha512-FXr7sJtusDKrrtfxenRdAwbqARTasYY1+3vL3FjnlvwiWzvItnSBRbcspF6AI45jIBLbi2GHDIAorzAXhmA1+Q==}
27832786 engines: {node: '>=20.12.0'}
27842787
2785 '@expo/expo-modules-macros-plugin@0.6.1':
2786 resolution: {integrity: sha512-cpsLZE4rqkc1Y3eZTkxB98jrqY1YXgetmtxFt8q89jBRmk3quRuk1BZo+VcnCSObZardjg99r1k5xijEMONFGA==}
2787
2788 '@expo/fingerprint@0.20.11':
2789 resolution: {integrity: sha512-GC43EcjQwzpzNZISqmhvjKdi+6FTfxnC9ZxOeg6osCkYXJz94j107l0QpPLipg62khD5HAA5G5cUhevffbRC4w==}
2788 '@expo/fingerprint@0.21.2':
2789 resolution: {integrity: sha512-LlXmTyDMsTYL5gGIUbTZ9EOrGPTmykmI44tld6v/hU0aSQndbdoAtT+LHvKKy6oSMdm1yHgHd2YzuMU+9MwwZQ==}
27902790 hasBin: true
27912791
2792 '@expo/image-utils@0.11.5':
2793 resolution: {integrity: sha512-KPQBTpmpAfy/Vu9y4wPW808/qtZxjYmyJg8cm2QCPAupp+qEWA3b5zmk0ulOwQ9OgeHxuCPgUqWgkwHFo7UsrQ==}
2792 '@expo/image-utils@0.12.2':
2793 resolution: {integrity: sha512-lz4ShWkci1UYI8JhBywQM15hamJ5YLG3kz9qjNNKS7cOq4EKkzf4ZZXLEzAPpQaN1j1wWpY2MtbPIYXFLNUHsA==}
27942794
27952795 '@expo/image-utils@0.8.14':
27962796 resolution: {integrity: sha512-5Sn+jG4Cw+shC2wDMXoqSAJnvERbiwzHn05FpWtD5IBflfTIs5gUmjzwiGVyjOdlMSQhgRrw/AymPbmO9h9mpQ==}
27972797
2798 '@expo/inline-modules@0.1.7':
2799 resolution: {integrity: sha512-Bz/khd1gIJqDkje7t5ejD5e9jFbm4xEJzWSwRKadRo6gruepbw1xJ3Eb+e58OS8fY1ZNQYjzZbspnuph67sN0g==}
2798 '@expo/inline-modules@0.2.1':
2799 resolution: {integrity: sha512-WvmG1vuVbd6Py6uwYw7NUHGlOSBdJTXU8X18qBhCYXMfV8MPic0QUuFuUZGTyIzs4xUB/Pk6qgCyUdxOlJStxg==}
2800
2801 '@expo/json-file@11.2.1':
2802 resolution: {integrity: sha512-UPhKoFCj8BcwgLB1rKQ1CuR/REITnZLiqxHEHOeH1tPsdXcHGtUDh0P5bLbr7oU0nKVdtJ5rzyKx8jniMQdESQ==}
28002803
2801 '@expo/json-file@11.0.1':
2802 resolution: {integrity: sha512-zxHWj4MKKMAL29ZQSY/Fssx4Thluk40JmuGNaeS078wy/NhlFhnVi+rHHunulE3xJAJ0CM73m8VK2+GkF9eRwQ==}
2804 '@expo/local-build-cache-provider@58.0.1':
2805 resolution: {integrity: sha512-V7zXjGgivtiqLe1oa6PQUvamoTf2/HxyavUrQSmZyDDUV6/mLQoTBrslRnj41OSIlIUqah9lxrcl759vKgMxqw==}
28032806
2804 '@expo/local-build-cache-provider@57.0.8':
2805 resolution: {integrity: sha512-SEdE0pAQrr90bRh3MNR0ZuwoIBw390cYdFgbn7Vk0Mtm9EHaBfP7kYj+2hXnXZJgOEm3/JMtfoD3rV7rWA9FGg==}
2807 '@expo/log-box-utils@58.0.1':
2808 resolution: {integrity: sha512-BUDoo1BUsSNmGonRkVWBNI6moKsZxH/Tkt9a1pphOBJQMdr8/1HbhGEB84YOwaKMpMXMWAK6cwu3Ip8ax3J28g==}
28062809
2807 '@expo/log-box@57.0.4':
2808 resolution: {integrity: sha512-IxwS9s1L2muj8mj8AQSuiy7u8OFJdc02NRFo2me/Tj6DiaeG5SREqmpBE4rQpR2cadqSg5jl8Qab8Cjie616dg==}
2810 '@expo/log-box@58.0.7':
2811 resolution: {integrity: sha512-V6KY7IoeRZ7GqMRXQDrBF5w53w+a3PWWrNXnjzzkDC1uiaf2RN8qSACDPbJRUxJloL7X8EXnA7Q29i/YozxYSQ==}
28092812 peerDependencies:
2810 '@expo/dom-webview': 57.0.1
2813 '@expo/dom-webview': 58.0.2
28112814 expo: '*'
28122815 react: '*'
28132816 react-native: '*'
2817 peerDependenciesMeta:
2818 expo:
2819 optional: true
28142820
2815 '@expo/metro-config@57.0.12':
2816 resolution: {integrity: sha512-S62Lrq35HZqBFD55423pmWb8PjaiR/W02zQC1uECBmw1vTN8WZaFz4TJ0i21EeJzwfebMb9MLxL8JZ102Z6VbA==}
2821 '@expo/metro-config@58.0.6':
2822 resolution: {integrity: sha512-jznif78n3+oOjvhtvmSqBbnkOfabDvouAMIXQXC3FlGl75bygzRTYvB+L712fvZOJd+LSo1jcCg2Q3swUnJyBA==}
28172823 peerDependencies:
28182824 expo: '*'
28192825 peerDependenciesMeta:
28202826 expo:
28212827 optional: true
28222828
2823 '@expo/metro-file-map@57.0.2':
2824 resolution: {integrity: sha512-tb50nSIWwKpRufSkGuivOK0FbUxv1Uwqptb0SzFTk0bkmYmcy3gIwnCbOHTfmrQDVndRhPEiu2SYgh9Z0PCvGg==}
2829 '@expo/metro-file-map@58.0.3':
2830 resolution: {integrity: sha512-BAYHbRc89uX/mfxkK7oPe+YUXrPKE0rn3rq/e0E/PimUBeTfQjs1Y6Y7A4gLPuDTtSczyiZzFFJiTyA4MlNl5w==}
28252831
2826 '@expo/metro-runtime@57.0.14':
2827 resolution: {integrity: sha512-LVpsfF0QOzlLSKlHYpxgW1cP1NKcYeaoalLO18jYHgqseSveEkb9VOffFpicTQ7AN03odZ4fgkUF+p5YpoY4yw==}
2832 '@expo/metro-runtime@58.0.9':
2833 resolution: {integrity: sha512-nWxcO3zFVIAMf9sw8n2meAy/pHlNQ1jbUe3aDYGun+slKx41sJ+xzd/Z2LFjuP2uzoyWE0v0zekEqzsA0fQ1AQ==}
28282834 peerDependencies:
2829 '@expo/log-box': ^57.0.4
2835 '@expo/log-box': ^58.0.7
28302836 expo: '*'
28312837 react: '*'
28322838 react-dom: '*'
......@@ -2835,21 +2841,21 @@ packages:
28352841 react-dom:
28362842 optional: true
28372843
2838 '@expo/metro@56.0.2':
2839 resolution: {integrity: sha512-Ld5AeYMCCDa8bLeWhfuLbZFFjlV3f6ORqyPz2glGh6RltIngMuLf9BTC2yvHFjkKuGxL5SynijmA8xmNNWn5iA==}
2844 '@expo/metro@58.0.0-rc.0':
2845 resolution: {integrity: sha512-9ZXNH/rppKQcoW0ycTSQqnKcjuYnutWf/6YkfAh1PBeWs+W1Nuc2uMTRM0qWNc9btbD4iHZKovru3gJqMgFzFQ==}
28402846
2841 '@expo/osascript@2.7.1':
2842 resolution: {integrity: sha512-Zn03EX6In7ts2lPUW2ESUSkEhEWQN1qqsiXjadtZMJOuZRkMiAg1ZQHuvz9DjByDWNJ2pBwAGyrts9lj9k389g==}
2847 '@expo/osascript@2.8.1':
2848 resolution: {integrity: sha512-SCi+6q6uOkGhiAn6AIP/OPFgaIq/iKD2oYpnAOg2rShHStJ8ey7wyT127RbOaZXmlcY/62rHOX1WiiMnD8u/BA==}
28432849 engines: {node: '>=12'}
28442850
2845 '@expo/package-manager@1.13.1':
2846 resolution: {integrity: sha512-y/K+CaYYpZpNGZhSX4HyLT/vyIunFjNfyoxNysPBCefeLKI/VCx6f9LNPzrxayr3rCYO5bl9O8H+HRQK265Nkg==}
2851 '@expo/package-manager@1.14.1':
2852 resolution: {integrity: sha512-aw/VqeDaZsn2G5FxJUfWgWkdcl4u/JsNhlQakAEUhu5++4AitDprw4Uc0PwerH76V8Y34U/nVypL+YTVs/pi2g==}
28472853
2848 '@expo/plist@0.8.1':
2849 resolution: {integrity: sha512-3gTReGIUm0oRaMClsAJYxBnVPCl6fVpsl8HS+DTVxDhW4GyVyxg9E/Znm3BvcHtUJ51RJJI14pC1wvrNilCRHw==}
2854 '@expo/plist@0.10.1':
2855 resolution: {integrity: sha512-nuNOqj+r/hGJbZ1Ax3jUpZaOB8UAMHUrISALJEUKaCieTflYj7224EqFWmMpriCGk9wXS1gH+9GGVnSj0tWzuQ==}
28502856
2851 '@expo/prebuild-config@57.0.15':
2852 resolution: {integrity: sha512-xTbWHroj0PDmlbqvmU+zF9ZZxveJkiuyiPoeRJYRGruFHebRAWnoTdw5S7d/UCzDBI8ropGGu9g2eb2nMxtvAw==}
2857 '@expo/prebuild-config@58.0.6':
2858 resolution: {integrity: sha512-rnaPdJ+bSHRlJ2ElANH5P1QKtJSFSTxxR7FSh4qpwPfFJs6L3ozhOLP4R1z5oFCXq6MUQfYIDHb51rUfPAgDMg==}
28532859
28542860 '@expo/require-utils@55.0.5':
28552861 resolution: {integrity: sha512-U4K/CQ2VpXuwfNGsN+daKmYOt15hCP8v/pXaYH6eut7kdYZo6SfJ1yr67BIcJ+1Gzzs+QzTxswAZChKpXmceyw==}
......@@ -2859,26 +2865,26 @@ packages:
28592865 typescript:
28602866 optional: true
28612867
2862 '@expo/require-utils@57.0.5':
2863 resolution: {integrity: sha512-kTAXj9lDFEIPMsbAOGCGbjBbMF0oi7CqkYM79KOX0DDD9wSwXmlKL1z2h8OwsrBf7mbOo2DjlRvZu4BEjrIxGw==}
2868 '@expo/require-utils@58.0.2':
2869 resolution: {integrity: sha512-50w3h4s8eQze5L0PGfVAWGUWrT0ss9oHPa9INAIra43ScU+MP5s3b5qysvdv7mep9SgSX3+qdWIjcrOP5rNd+A==}
28642870 peerDependencies:
28652871 typescript: ^5.0.0 || ^5.0.0-0 || ^6.0.0 || ^7.0.0
28662872 peerDependenciesMeta:
28672873 typescript:
28682874 optional: true
28692875
2870 '@expo/router-server@57.0.8':
2871 resolution: {integrity: sha512-lEPGYoDmh97yyEcY/MFWQsfE7yIgMRnGDcnsBN7B6AiWBFSJIMEcGnO0aYPgY0ZjNWyJDi7Ee8QZRGqB+LhI6w==}
2876 '@expo/router-server@58.0.4':
2877 resolution: {integrity: sha512-zoHpJzp7ltEY5w9eCINlkeCZg0BvtXexj0SIg/B9YGgFIiGYQDbtrQYy6eDc1lUICQn6ntzql3lrunegdConvw==}
28722878 peerDependencies:
2873 '@expo/metro-runtime': ^57.0.14
2879 '@expo/metro-runtime': ^58.0.9
28742880 expo: '*'
2875 expo-constants: 57.0.16
2876 expo-font: ^57.0.1
2877 expo-router: 57.0.17
2878 expo-server: ^57.0.3
2881 expo-constants: 58.0.9
2882 expo-font: ^58.0.4
2883 expo-router: 58.0.10
2884 expo-server: ^58.0.2
28792885 react: '*'
28802886 react-dom: '*'
2881 react-server-dom-webpack: ~19.0.1 || ~19.1.2 || ~19.2.1
2887 react-server-dom-webpack: ~19.0.1 || ~19.1.2 || ~19.2.1 || ~19.3.0
28822888 peerDependenciesMeta:
28832889 '@expo/metro-runtime':
28842890 optional: true
......@@ -2889,8 +2895,8 @@ packages:
28892895 react-server-dom-webpack:
28902896 optional: true
28912897
2892 '@expo/schema-utils@57.0.2':
2893 resolution: {integrity: sha512-fMu/jyN0l1Wzv7XkeWR4IYCx1M8ryui3FdBNGrWwbRgJ7EhxXxK8E2jxP2W3pbgUwUY0V3hG8+GyfCZwny+Lxw==}
2898 '@expo/schema-utils@58.0.1':
2899 resolution: {integrity: sha512-r5ox9st0g1IYC37tKD0WYiKH6RXout9FqjSwVv0nIhRYYTXhChJfzcMnJ90zkBznKO1lZVCqdO302YVYsm3qQA==}
28942900
28952901 '@expo/sdk-runtime-versions@1.0.0':
28962902 resolution: {integrity: sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==}
......@@ -2902,8 +2908,8 @@ packages:
29022908 '@expo/sudo-prompt@9.3.2':
29032909 resolution: {integrity: sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==}
29042910
2905 '@expo/ui@57.0.14':
2906 resolution: {integrity: sha512-m8Z5dCplkOOQ70lu/xfB67qhk00Muw4U1T9frHBIW3LxxJeJZQ+jOmV6vCk6O6zVgoG/ib1et7PeX6etxI4Rsw==}
2911 '@expo/ui@58.0.9':
2912 resolution: {integrity: sha512-uKwQb8zoDlbEw6jjHMA9OPzMVmo+sbnnKUhO/VNruaE3HF3swazCbrSRIomeznOVvyPP7EJsV5jXUrQgLAWzkg==}
29072913 peerDependencies:
29082914 '@babel/core': '*'
29092915 expo: '*'
......@@ -3464,6 +3470,58 @@ packages:
34643470 resolution: {integrity: sha512-ugvXJjwF5ldtUpa7D95kruNJ41yFQDEKyF5CW4TgKJnh+W/zmlBzXXeKTyqIgwMFrkePN2JqOBqcF0M0oOunow==}
34653471 engines: {node: '>=0.3.0'}
34663472
3473 '@noxcturnal/noxcturnal-darwin-arm64@0.1.1':
3474 resolution: {integrity: sha512-Y0JXi8J4abYq88swQLqXOw0kSw0v6CfKp4tboyqPOWNVgQvUy14SMTKVyPLUpaKd0ZJGP8cvNTSQI9bZP7+5CQ==}
3475 engines: {node: '>=18'}
3476 cpu: [arm64]
3477 os: [darwin]
3478
3479 '@noxcturnal/noxcturnal-darwin-x64@0.1.1':
3480 resolution: {integrity: sha512-lAaRd5TGFKydkYaPiDl/zGxg5hOZmJknEF0thMQHhe6s90fCcP/1t3XAaNH6czUbWV2dkhPggo9ua3Mm0KisGg==}
3481 engines: {node: '>=18'}
3482 cpu: [x64]
3483 os: [darwin]
3484
3485 '@noxcturnal/noxcturnal-linux-arm64-gnu@0.1.1':
3486 resolution: {integrity: sha512-871HxfCyTzrMz/OKzG17M4OgWdPwns9a3yCo+HALvuBsed+mtY2CliJvzoQhoRw1bdICaXp6LqUsY4KhX1A+Yw==}
3487 engines: {node: '>=18'}
3488 cpu: [arm64]
3489 os: [linux]
3490 libc: [glibc]
3491
3492 '@noxcturnal/noxcturnal-linux-arm64-musl@0.1.1':
3493 resolution: {integrity: sha512-ehEOT/CgdZUpfuGVQ32u/nJU80SQVNql3J/vVTglH30MbGQlMA5Sd1VAHtYgVMtpXsIo4rlNhcvHIJ0L9by9Cg==}
3494 engines: {node: '>=18'}
3495 cpu: [arm64]
3496 os: [linux]
3497 libc: [musl]
3498
3499 '@noxcturnal/noxcturnal-linux-x64-gnu@0.1.1':
3500 resolution: {integrity: sha512-psTHW5aDNc3PpWFzQOJLmOj4oP3NZRMjpc8H1Jvu8vAqtVWakdxhICG5/q0jMkgY9iyg+mqdtHaLMeAImmCeHg==}
3501 engines: {node: '>=18'}
3502 cpu: [x64]
3503 os: [linux]
3504 libc: [glibc]
3505
3506 '@noxcturnal/noxcturnal-linux-x64-musl@0.1.1':
3507 resolution: {integrity: sha512-MSdZTx5GL6hdG0UVrL7PHbLqDoO0Mz9mf6vwkhBbVYJGM4NY0ptNHsd5j5B+0RGjQgSMQX52tC96g8e23oqi8w==}
3508 engines: {node: '>=18'}
3509 cpu: [x64]
3510 os: [linux]
3511 libc: [musl]
3512
3513 '@noxcturnal/noxcturnal-win32-arm64-msvc@0.1.1':
3514 resolution: {integrity: sha512-Bq/C94sV38ay57QS4EbwIOamGNVXRkPVDc5Wg+4gvBjhJbYs+nfH05CpwRkQBgb8SpV51FQCLQfXvk59Aab60Q==}
3515 engines: {node: '>=18'}
3516 cpu: [arm64]
3517 os: [win32]
3518
3519 '@noxcturnal/noxcturnal-win32-x64-msvc@0.1.1':
3520 resolution: {integrity: sha512-D5ZuKQyxJd/wvf9qcVSCD69spzhoHNbaib/dJGpHXQLomrDBwtzYbPVxUwEBWAaXnTqme6/TEZdl/6sG4tm4wA==}
3521 engines: {node: '>=18'}
3522 cpu: [x64]
3523 os: [win32]
3524
34673525 '@octokit/auth-token@6.0.0':
34683526 resolution: {integrity: sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==}
34693527 engines: {node: '>= 20'}
......@@ -3793,6 +3851,9 @@ packages:
37933851 '@oxc-project/types@0.127.0':
37943852 resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==}
37953853
3854 '@oxc-project/types@0.141.0':
3855 resolution: {integrity: sha512-S4as7z0j0xQkXcJlyY5ehntwK8/wRkQb9Cyqw+J/N2rkWGQGK0SxD6X6DhQTc7qsxVTBxXbxZtBJh3mr3PtIzQ==}
3856
37963857 '@oxc-project/types@0.146.0':
37973858 resolution: {integrity: sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==}
37983859
......@@ -4256,177 +4317,6 @@ packages:
42564317 yauzl:
42574318 optional: true
42584319
4259 '@radix-ui/primitive@1.1.3':
4260 resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==}
4261
4262 '@radix-ui/react-compose-refs@1.1.2':
4263 resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==}
4264 peerDependencies:
4265 '@types/react': '*'
4266 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
4267 peerDependenciesMeta:
4268 '@types/react':
4269 optional: true
4270
4271 '@radix-ui/react-context@1.1.2':
4272 resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==}
4273 peerDependencies:
4274 '@types/react': '*'
4275 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
4276 peerDependenciesMeta:
4277 '@types/react':
4278 optional: true
4279
4280 '@radix-ui/react-dialog@1.1.15':
4281 resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==}
4282 peerDependencies:
4283 '@types/react': '*'
4284 '@types/react-dom': '*'
4285 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
4286 react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
4287 peerDependenciesMeta:
4288 '@types/react':
4289 optional: true
4290 '@types/react-dom':
4291 optional: true
4292
4293 '@radix-ui/react-dismissable-layer@1.1.11':
4294 resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==}
4295 peerDependencies:
4296 '@types/react': '*'
4297 '@types/react-dom': '*'
4298 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
4299 react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
4300 peerDependenciesMeta:
4301 '@types/react':
4302 optional: true
4303 '@types/react-dom':
4304 optional: true
4305
4306 '@radix-ui/react-focus-guards@1.1.3':
4307 resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==}
4308 peerDependencies:
4309 '@types/react': '*'
4310 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
4311 peerDependenciesMeta:
4312 '@types/react':
4313 optional: true
4314
4315 '@radix-ui/react-focus-scope@1.1.7':
4316 resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==}
4317 peerDependencies:
4318 '@types/react': '*'
4319 '@types/react-dom': '*'
4320 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
4321 react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
4322 peerDependenciesMeta:
4323 '@types/react':
4324 optional: true
4325 '@types/react-dom':
4326 optional: true
4327
4328 '@radix-ui/react-id@1.1.1':
4329 resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==}
4330 peerDependencies:
4331 '@types/react': '*'
4332 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
4333 peerDependenciesMeta:
4334 '@types/react':
4335 optional: true
4336
4337 '@radix-ui/react-portal@1.1.9':
4338 resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==}
4339 peerDependencies:
4340 '@types/react': '*'
4341 '@types/react-dom': '*'
4342 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
4343 react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
4344 peerDependenciesMeta:
4345 '@types/react':
4346 optional: true
4347 '@types/react-dom':
4348 optional: true
4349
4350 '@radix-ui/react-presence@1.1.5':
4351 resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==}
4352 peerDependencies:
4353 '@types/react': '*'
4354 '@types/react-dom': '*'
4355 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
4356 react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
4357 peerDependenciesMeta:
4358 '@types/react':
4359 optional: true
4360 '@types/react-dom':
4361 optional: true
4362
4363 '@radix-ui/react-primitive@2.1.3':
4364 resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==}
4365 peerDependencies:
4366 '@types/react': '*'
4367 '@types/react-dom': '*'
4368 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
4369 react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
4370 peerDependenciesMeta:
4371 '@types/react':
4372 optional: true
4373 '@types/react-dom':
4374 optional: true
4375
4376 '@radix-ui/react-slot@1.2.3':
4377 resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==}
4378 peerDependencies:
4379 '@types/react': '*'
4380 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
4381 peerDependenciesMeta:
4382 '@types/react':
4383 optional: true
4384
4385 '@radix-ui/react-use-callback-ref@1.1.1':
4386 resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==}
4387 peerDependencies:
4388 '@types/react': '*'
4389 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
4390 peerDependenciesMeta:
4391 '@types/react':
4392 optional: true
4393
4394 '@radix-ui/react-use-controllable-state@1.2.2':
4395 resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==}
4396 peerDependencies:
4397 '@types/react': '*'
4398 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
4399 peerDependenciesMeta:
4400 '@types/react':
4401 optional: true
4402
4403 '@radix-ui/react-use-effect-event@0.0.2':
4404 resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==}
4405 peerDependencies:
4406 '@types/react': '*'
4407 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
4408 peerDependenciesMeta:
4409 '@types/react':
4410 optional: true
4411
4412 '@radix-ui/react-use-escape-keydown@1.1.1':
4413 resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==}
4414 peerDependencies:
4415 '@types/react': '*'
4416 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
4417 peerDependenciesMeta:
4418 '@types/react':
4419 optional: true
4420
4421 '@radix-ui/react-use-layout-effect@1.1.1':
4422 resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==}
4423 peerDependencies:
4424 '@types/react': '*'
4425 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
4426 peerDependenciesMeta:
4427 '@types/react':
4428 optional: true
4429
44304320 '@react-grab/cli@0.1.44':
44314321 resolution: {integrity: sha512-gMDYY2rw6OWajCcDlXSIgs2LC432YJXSb3Lm5yM187uhRgBYddoEVULi36h+IolX3r7jSb3ew7vn9FfI8NSo0A==}
44324322 hasBin: true
......@@ -4448,78 +4338,78 @@ packages:
44484338 react: '*'
44494339 react-native: '*'
44504340
4451 '@react-native/assets-registry@0.86.3':
4452 resolution: {integrity: sha512-TDhgCZA4wjJg84d5A9swiOQYPIWSKEEVdg9IwMFZDupQzW/F3QoLUrfAJOcalgqTDA9/buTB8awhE3Whwg6u9Q==}
4453 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
4341 '@react-native/asset-utils@0.88.0-rc.3':
4342 resolution: {integrity: sha512-G3P/3lF1bvZoT4Za87UiVJCpTNNF6c07sTNINXYiSxXDpPiM8piisgqdgueyy90cKH6ReL28y2S8glRiG+jkeQ==}
4343 engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0}
44544344
4455 '@react-native/babel-plugin-codegen@0.86.3':
4456 resolution: {integrity: sha512-O6Xza4JBGPIU8J7YbKTyBoYL4thpy8jMW/oaLDWdAyOwYHKIjK47pAL5HUEbOe2bWz2PEKjbYRF2ApkJv1ottQ==}
4457 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
4345 '@react-native/babel-plugin-codegen@0.88.0-rc.3':
4346 resolution: {integrity: sha512-v68EZUjkcs2ZLL1ayA2aQ79imy7BGlc6uAteKMDhA8vf0QKT92YHkSFMGA1+df38d3/v3R+AB6X6XFhixQ1EEQ==}
4347 engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0}
44584348
4459 '@react-native/babel-preset@0.86.3':
4460 resolution: {integrity: sha512-/eqs/Hy9RZRcjdcs4wj3Cqmxvtb3NM5g+Uuh1RIvsjynMO8PRsrVWWLWgBcZL/jYUo+ogXd2NFB0W8L5Bg89xw==}
4461 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
4349 '@react-native/babel-preset@0.88.0-rc.3':
4350 resolution: {integrity: sha512-xkAmd1gSQWjl5QnY0YFuMhjykdABljvuUY0McQHHLf4GJHEcpwuRPf3kM5lDq8p/y+Ui2iAbGgQsGExFY6FV0w==}
4351 engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0}
44624352 peerDependencies:
44634353 '@babel/core': '*'
44644354
4465 '@react-native/codegen@0.86.3':
4466 resolution: {integrity: sha512-Ux4jHi0fh+bdtVEcL0gaPLbY56V+SvFUDl/8sRAE1jdb4k+o7fT/4Nc29yz4X+qfjstkSqObQTMBGhdzxH9JvA==}
4467 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
4355 '@react-native/codegen@0.88.0-rc.3':
4356 resolution: {integrity: sha512-fjDCsaVPTlrYHelSogo/J9RbeeJ+dfokyw57VdtFa3HMWssCSqBmgnSoKKexQAO6U4fppAm91550DC8+02pL4A==}
4357 engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0}
44684358 peerDependencies:
44694359 '@babel/core': '*'
44704360
4471 '@react-native/community-cli-plugin@0.86.3':
4472 resolution: {integrity: sha512-qSDL9LQc5mZSZPNczT95WU9YQuPzxBklgON9vLhhqfI0yWIwKInqFx88dQ/uiEXBtf0yossthaQIqA4Ml6bF6g==}
4473 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
4361 '@react-native/community-cli-plugin@0.88.0-rc.3':
4362 resolution: {integrity: sha512-wfchdOOL4EM12jQuDY75uG9/pJ1dMckugJmAkLsyHY2akhjImdn7rq0Ea7q2nLK0talq56jTklpXQZVoVvyrAA==}
4363 engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0}
44744364 peerDependencies:
44754365 '@react-native-community/cli': '*'
4476 '@react-native/metro-config': 0.86.3
4366 '@react-native/metro-config': 0.88.0-rc.3
44774367 peerDependenciesMeta:
44784368 '@react-native-community/cli':
44794369 optional: true
44804370 '@react-native/metro-config':
44814371 optional: true
44824372
4483 '@react-native/debugger-frontend@0.86.3':
4484 resolution: {integrity: sha512-TQmeofQ0PcuylhhlleOeuzHYZfbrgm3gayXzowqUEzgRisTm1D40/J3ggqs7XkQi5HP5ZA3n8dHmKL9vIzPcsw==}
4485 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
4373 '@react-native/debugger-frontend@0.88.0-rc.3':
4374 resolution: {integrity: sha512-tv3DAqm5oTjQ9sYkr99UMKqc+VfoCZo13ZobzKD7oDRl7b+RT9wtyUiQrTuRQLrmadJ+TfU11G8xnyVmjHC/Sw==}
4375 engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0}
44864376
4487 '@react-native/debugger-shell@0.86.3':
4488 resolution: {integrity: sha512-O4ds+J7xZfxkbih9T+cAGegBdvKSPKYJm/lDgC9CpEjFMkmzWTpVLU3Qsv9sqZuo58z+sGhIcJfPsCFFWHpqbQ==}
4489 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
4377 '@react-native/debugger-shell@0.88.0-rc.3':
4378 resolution: {integrity: sha512-ECf/bl4c/eGd77tNQnCizoLqYiOTyOQ1pU7SzVGI4Nql+aZiNR+lGaz3CJB1ve4+g+00hXTyiBjPjOmfNfdEYg==}
4379 engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0}
44904380
4491 '@react-native/dev-middleware@0.86.3':
4492 resolution: {integrity: sha512-LiEPTqTg/63bYUnrPyHLfjTDCNhA/+CUqI1+DsA9tYyewtSbULd5awsva6SgE10I+2iMhgKXS3ymkhU/kSCrGA==}
4493 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
4381 '@react-native/dev-middleware@0.88.0-rc.3':
4382 resolution: {integrity: sha512-lM7ZJ/SZJAEHtN+TUlA4onk2PxRAIFSM/9v6bxtk6jkeXQyNIxFhXkqAzkI2vXV2ImtRv7XXjs4pwKkZ1jxJxg==}
4383 engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0}
44944384
4495 '@react-native/gradle-plugin@0.86.3':
4496 resolution: {integrity: sha512-lxmx0GqLEWRIpZfpYFXlYVIs3ENQwaW6Vmp6oi29l2GoQJ1wZfFZRdMimDWlGEk8LKfHar3QH3iaPMkTcK9lEQ==}
4497 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
4385 '@react-native/gradle-plugin@0.88.0-rc.3':
4386 resolution: {integrity: sha512-mH7obkxTQ2s/7hANYIaGmZWXNgVIobbZNuV1YpTvWRZrwtLsl57scHevP87c6+j9RDYjzMSLIfHvfqDFo7cqoA==}
4387 engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0}
44984388
4499 '@react-native/js-polyfills@0.86.3':
4500 resolution: {integrity: sha512-eYIJ0es967+tePBFQDnl/gidVFxLns3fnbiK6rxscQrGodvuUO6hwxpQnfNynJ8MjbbndImXihXjcnJdc7SzJg==}
4501 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
4389 '@react-native/js-polyfills@0.88.0-rc.3':
4390 resolution: {integrity: sha512-KONuwN2lvrLopOWVgLTFNwx1cwdlS5NZbmR+fQY5r6RvkHHvzbN4JqnfP2oQB0IGLxjJZPN0ljfhhPiCZ7YMdw==}
4391 engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0}
45024392
4503 '@react-native/metro-babel-transformer@0.86.3':
4504 resolution: {integrity: sha512-0nlwVkG0uT9o72nrGTKUz/IqDnCkM4zE0ihe4r+OJcxH93yBdDm58AXJ3EXZeSjv3osHEFXU7ceajdZiS34mTw==}
4505 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
4393 '@react-native/metro-babel-transformer@0.88.0-rc.3':
4394 resolution: {integrity: sha512-ekhRzsHa13fDZYTSfq5SWS88wcc+2Magy3g2oG0fup7beFrbpLxGzIm1bpBNg892htwvWHtLDuV4CUvFKka/EQ==}
4395 engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0}
45064396 peerDependencies:
45074397 '@babel/core': '*'
45084398
4509 '@react-native/metro-config@0.86.3':
4510 resolution: {integrity: sha512-qdzDMepV2xdUhsO4XC7idnnbt8K6+Hd59AjeK9y4KS86fxSQq5oL0TAbqUuajDGR7beNQoYTuS6AowN/zP0oaQ==}
4511 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
4399 '@react-native/metro-config@0.88.0-rc.3':
4400 resolution: {integrity: sha512-nyJSwizwYxZtwHAaL7PFJ+33FN9Ho9q/5h931VtLTQDr6OxrWu957K2il9Yzd/k5wAURpv+DDB3Oagl3hl2HhQ==}
4401 engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0}
45124402
4513 '@react-native/normalize-colors@0.86.3':
4514 resolution: {integrity: sha512-Cv3CDkprb67GrzuaS9BGbBJC/6G4lIw3nyKOHRKTqTTum4bn37y5+R0Z04L8mcbQN85eEohNrRwb7IOM4j6uvg==}
4403 '@react-native/normalize-colors@0.88.0-rc.3':
4404 resolution: {integrity: sha512-el4NZ16vfh2quo56hB5G8cD8Bbk8N2+hamMfeaSWE5XCQC4vyTWGrE4FORjTdLAjv4Uh8LMuX87iMgwt2adArg==}
45154405
4516 '@react-native/virtualized-lists@0.86.3':
4517 resolution: {integrity: sha512-1j44NEyNn05Ut40vHAmoSWbsIcybFkMAOBTwQt1PrESyfSS+qBoyU1LGIogNva0VIa0rQyEC5PzbA7R4/7Nhyw==}
4518 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
4406 '@react-native/virtualized-lists@0.88.0-rc.3':
4407 resolution: {integrity: sha512-0vI4q0kjrS3HPn5pg5IXkVUAmNBS67ZqKzhaAKfuxvQ3Xrr5Q5LOH7u6DphTSQ+Dy2GYeQUxSN1XqCUbpbcxxg==}
4408 engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0}
45194409 peerDependencies:
45204410 '@types/react': ^19.2.0
45214411 react: '*'
4522 react-native: 0.86.3
4412 react-native: 0.88.0-rc.3
45234413 peerDependenciesMeta:
45244414 '@types/react':
45254415 optional: true
......@@ -5379,9 +5269,6 @@ packages:
53795269 '@types/fs-extra@9.0.13':
53805270 resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==}
53815271
5382 '@types/hammerjs@2.0.46':
5383 resolution: {integrity: sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==}
5384
53855272 '@types/hast@3.0.4':
53865273 resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
53875274
......@@ -5441,8 +5328,8 @@ packages:
54415328 '@types/react-test-renderer@19.1.0':
54425329 resolution: {integrity: sha512-XD0WZrHqjNrxA/MaR9O22w/RNidWR9YZmBdRGI7wcnWGrv/3dA8wKCJ8m63Sn+tLJhcjmuhOi629N66W6kgWzQ==}
54435330
5444 '@types/react@19.2.16':
5445 resolution: {integrity: sha512-esJiCAnl0kfpNdE69f3So4WJUXy95dLZydX0KwK46riIHDzHM7O9Vtf9xCHW0PXIqvgqNrswl522kA/5yx+F4w==}
5331 '@types/react@19.3.0':
5332 resolution: {integrity: sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==}
54465333
54475334 '@types/responselike@1.0.3':
54485335 resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==}
......@@ -6058,8 +5945,8 @@ packages:
60585945 resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==}
60595946 engines: {node: '>= 14'}
60605947
6061 agent-cli-detector@0.1.6:
6062 resolution: {integrity: sha512-vKrPeEVN3upDF3GjWxsWBbwQgMtNJ8VB1cduPvK3svmmz4ENpS7yaPxbogsbe3w+xp9xp2Cu+0Ar41rjAR4+lA==}
5948 agent-cli-detector@0.1.7:
5949 resolution: {integrity: sha512-d8OWDVdZMgjhLUT9ZPgSv/BdFFF9pVuscC0JdUSz3bjwE15gcp6u/o0/JooM2yyAWC49KThFhXlgTXRa9B7yng==}
60635950 engines: {node: '>=18.18'}
60645951 hasBin: true
60655952
......@@ -6220,10 +6107,6 @@ packages:
62206107 argparse@2.0.1:
62216108 resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
62226109
6223 aria-hidden@1.2.6:
6224 resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==}
6225 engines: {node: '>=10'}
6226
62276110 aria-query@5.3.0:
62286111 resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
62296112
......@@ -6307,21 +6190,18 @@ packages:
63076190 babel-plugin-react-native-web@0.21.2:
63086191 resolution: {integrity: sha512-SPD0J6qjJn8231i0HZhlAGH6NORe+QvRSQM2mwQEzJ2Fb3E4ruWTiiicPlHjmeWShDXLcvoorOCXjeR7k/lyWA==}
63096192
6310 babel-plugin-syntax-hermes-parser@0.36.0:
6311 resolution: {integrity: sha512-LhD0xdoedDw7ansQgXbB2DADLZIK/LRXuWNBPuVzMc5S2WK5GyT89tCM+cQzxFGO0mGyLK6D5TrVOJJzAoDy8Q==}
6312
63136193 babel-plugin-syntax-hermes-parser@0.36.1:
63146194 resolution: {integrity: sha512-ycduwJbvdvIMmVvlAZqGggS+pm5Eu4Bk9pcV9Sm2Z4PJNRVsKkv0g7vHj+LeuC1gHTeF67sJXFOq61IlqCa2hA==}
63156195
63166196 babel-plugin-transform-flow-enums@0.0.2:
63176197 resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==}
63186198
6319 babel-preset-expo@57.0.9:
6320 resolution: {integrity: sha512-T19biGOBTnMp161PyBqWOoSIEeZug8/EjtuUdVob8JPQKZMTalHUQaQt+qtQQE7XsEkZJ6erb3k0CohneTFzQg==}
6199 babel-preset-expo@58.0.6:
6200 resolution: {integrity: sha512-e4PqE6comKx0CKZo2l1XlNoWE9mfabQvAHDk6CvqmDWMEh3vIJgBubZAbdBONsxaUqKON2SVnXKmmPD01iW1iA==}
63216201 peerDependencies:
63226202 '@babel/runtime': ^7.20.0
63236203 expo: '*'
6324 expo-widgets: ^57.0.13
6204 expo-widgets: ^58.0.9
63256205 react-refresh: '>=0.14.0 <1.0.0'
63266206 peerDependenciesMeta:
63276207 '@babel/runtime':
......@@ -6537,20 +6417,9 @@ packages:
65376417 resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==}
65386418 engines: {node: '>=18'}
65396419
6540 chrome-launcher@0.15.2:
6541 resolution: {integrity: sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==}
6542 engines: {node: '>=12.13.0'}
6543 hasBin: true
6544
6545 chromium-edge-launcher@0.3.0:
6546 resolution: {integrity: sha512-p03azHlGjtyRvFEee3cyvtsRYdniSkwjkzmM/KmVnqT5d7QkkwpJBhis/zCLMYdQMVJ5tt140TBNqqrZPaWeFA==}
6547
65486420 chromium-pickle-js@0.2.0:
65496421 resolution: {integrity: sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==}
65506422
6551 ci-info@2.0.0:
6552 resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==}
6553
65546423 ci-info@3.9.0:
65556424 resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
65566425 engines: {node: '>=8'}
......@@ -6873,6 +6742,10 @@ packages:
68736742 resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
68746743 engines: {node: '>= 0.4'}
68756744
6745 define-lazy-prop@2.0.0:
6746 resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==}
6747 engines: {node: '>=8'}
6748
68766749 define-properties@1.2.1:
68776750 resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
68786751 engines: {node: '>= 0.4'}
......@@ -6911,9 +6784,6 @@ packages:
69116784 resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
69126785 engines: {node: '>=8'}
69136786
6914 detect-node-es@1.1.0:
6915 resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
6916
69176787 detect-node@2.1.0:
69186788 resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==}
69196789
......@@ -6937,8 +6807,8 @@ packages:
69376807 dmg-builder@26.15.6:
69386808 resolution: {integrity: sha512-nr5vQxEhM0REomp1qiHbc6V99yrfBZy+wUU56VXADfSOlLj8PdLqsHiRe7b+FbqKesiyv4ax+k1GVwGonYKuCg==}
69396809
6940 dnssd-advertise@1.1.4:
6941 resolution: {integrity: sha512-AmGyK9WpNf06WeP5TjHZq/wNzP76OuEeaiTlKr9E/EEelYLczywUKoqRz+DPRq/ErssjT4lU+/W7wzJW+7K/ZA==}
6810 dnssd-advertise@1.1.6:
6811 resolution: {integrity: sha512-Ndrrf6BMPalkQPd/zubL+4YghH2J9NspapQ09uDXwYbvOPkP0oaqf5CkcwJ0b50kS2O3ul6yVu+jz+RY62Cejg==}
69426812
69436813 dom-accessibility-api@0.5.16:
69446814 resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==}
......@@ -7314,46 +7184,46 @@ packages:
73147184 resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==}
73157185 engines: {node: '>=12.0.0'}
73167186
7317 expo-application@57.0.2:
7318 resolution: {integrity: sha512-q31YwcXyymviAmdrtDfAg3Dld4VMxLCNAfgMHip7vZpPX4lzF/AfwsywqBJUAjQnJknzaNAkzqvMVjO5XmKYDA==}
7187 expo-application@58.0.2:
7188 resolution: {integrity: sha512-N1ivhudcdS6KmEm8S9W14L3WVgFnCUv85MU1YX+AYauJcs9IZWRoM7Wl1JU+PUUYvbVGLHoXNpu0aE3jVTdkFg==}
73197189 peerDependencies:
73207190 expo: '*'
73217191
7322 expo-asset@57.0.15:
7323 resolution: {integrity: sha512-ZoiUftQb1Nn1jvL6l1kZoUXvgRCx57tMQYxSsp+g4ZvY+jgVWp/THruXOtPtZVdC/WWZxPUTct53bfAm2EPDAQ==}
7192 expo-asset@58.0.9:
7193 resolution: {integrity: sha512-31fMfET8PyoCNGKmyjOY6fBTyTO7du80EjtrzZ/TsT+9zincWMUGwBWeby/fTXPHMEVgWQAiU2sKEteWEw8+Tg==}
73247194 peerDependencies:
73257195 expo: '*'
73267196 react: '*'
73277197 react-native: '*'
73287198
7329 expo-audio@57.0.4:
7330 resolution: {integrity: sha512-TLP8rt1UvUDzgxGnyQ0TR9hV6tNP/UJQdDu7mSK+dgEydMFoptq55D3hcUoB1gF39f3/3AUuWfOtpGM+4N4X1A==}
7199 expo-audio@58.0.3:
7200 resolution: {integrity: sha512-BwH1calLvev1jfU/ZF3GIpW76LOhevLXk+nur0FZRZyiZJYxYvvg6scO0+XAt0d7pk6/kiPIirPHFlWgb79fpw==}
73317201 peerDependencies:
73327202 expo: '*'
73337203 expo-asset: '*'
73347204 react: '*'
73357205 react-native: '*'
73367206
7337 expo-auth-session@57.0.10:
7338 resolution: {integrity: sha512-i1RY93LouEgal2e/Ly1r2Ytwed7/y6i4AUShVj4Gg49h/Okf8QpZO7XylwL43IHfKRrKkqapRDEN8mWe7z/HgA==}
7207 expo-auth-session@58.0.6:
7208 resolution: {integrity: sha512-kTTQcZ2WgFxJlV2XtlBJxikADl8zPk1T2tTcC5c2ZOpjfAXHPDF/4pC9tfyYxNe0fOjCq9+t6aVL5X0uzZdVmg==}
73397209 peerDependencies:
73407210 react: '*'
73417211 react-native: '*'
73427212
7343 expo-blur@57.0.2:
7344 resolution: {integrity: sha512-Aoud8H8lmlNkbRufyvRLefmGFELdBf1n5Te/Xm+Zx8ORINH+aXL+gKb5mbftFSha860+I7pMArz77TBYz8HDVg==}
7213 expo-blur@58.0.2:
7214 resolution: {integrity: sha512-2WKeR2FCSwTjTm+D0YLoLy/6rR583LYxlnhkB04zVkzWBiQKYCnOaUaOSsjQO2Nr/6ZpECmwXDhw4yzIuHZARQ==}
73457215 peerDependencies:
73467216 expo: '*'
73477217 react: '*'
73487218 react-native: '*'
73497219
7350 expo-build-properties@57.0.15:
7351 resolution: {integrity: sha512-qZe9pnxlBpHT7SSNDR2a3C+P34xv67Ep9I0Erh+3xCczGlokyRd4pu9h0PrBdsVlr1d0QREQ1Do/+IgrIWkQQA==}
7220 expo-build-properties@58.0.9:
7221 resolution: {integrity: sha512-NJ2Zf1/ELtXVng9J8EH6F7zSA2tfjOyaq4itda3yaiSb5a5lgLjLg1+USwPo628HI/yGILGyOwmC8zxegEUyPQ==}
73527222 peerDependencies:
73537223 expo: '*'
73547224
7355 expo-camera@57.0.4:
7356 resolution: {integrity: sha512-MqbbQ63O+cA8JbK3lfFHiD0f2jv8jB+EG/ILK6f5xnOPV9IR37yaG5+lGtRZNoOeYBzGypyOi17USItleMyuGw==}
7225 expo-camera@58.0.5:
7226 resolution: {integrity: sha512-UMc27NClJ5xnu2m/6Kz5zynOxJ7LluY0lgbu/TdxDZgGccjfM/myfLcO5r1FXaW84Llf3vTveG7SvwuRsNWIlQ==}
73577227 peerDependencies:
73587228 expo: '*'
73597229 react: '*'
......@@ -7363,101 +7233,103 @@ packages:
73637233 react-native-web:
73647234 optional: true
73657235
7366 expo-clipboard@57.0.1:
7367 resolution: {integrity: sha512-HWICri4+1ao7S6QEfcorxVumXDiDnx1guGGewjZgGJWLGxFYs0RgH8ujBs+lkTzBkMmlwADaWSlaesR+nDJt5Q==}
7236 expo-clipboard@58.0.2:
7237 resolution: {integrity: sha512-AiL1yU6iLX4sP8BZZyLzsSCo7XWysIBgVAck1vTqIkZm5PcVBeKiDgjXeJzG8nHBpti+ReeGhxbCaMQe7VbyMg==}
73687238 peerDependencies:
73697239 expo: '*'
73707240 react: '*'
73717241 react-native: '*'
73727242
7373 expo-constants@57.0.16:
7374 resolution: {integrity: sha512-HG3yJjGZo2BPTo2F1sBoxdJZRwX7d9C554EhKn8m12K62pxGolCsvPSoh/lQf95OEP9vO34wwXB2C3QFs0KG0g==}
7243 expo-constants@58.0.9:
7244 resolution: {integrity: sha512-+EaES5uHt3t3kY4VPsvM0uiOo0sjiMKuxGKqdfKaNbpCg3FI5D3qfQbgDHf5fbM09DIfXSbymKeiZx/JKQgzng==}
73757245 peerDependencies:
73767246 expo: '*'
73777247 react-native: '*'
73787248
7379 expo-crypto@57.0.2:
7380 resolution: {integrity: sha512-OGLvHK7Hb7qsONMWGB9pJw3n+iY4OnZQmM/KwQEHRMrrOmNg0Lxj9+tp9bj46aAMMzXx0FTVA2jUKoplpXPnkA==}
7249 expo-crypto@58.0.3:
7250 resolution: {integrity: sha512-i6es/jfng4LDnmgVmHMCsFPA0ns3Iur9ypH+reRLVqH2Mgi9spYqZgpuhpX3gMyu0rKYylLz2YM8n5wxvhNp7w==}
73817251 peerDependencies:
73827252 expo: '*'
73837253
7384 expo-dev-client@57.0.16:
7385 resolution: {integrity: sha512-Txss9sgzEFI0E+4I34E76vPiukeVDHnqCj0ZXy8SDijVM31/P6MCNniVbEZk7MBPQclD0aopfuaCFtkV8+r1sw==}
7254 expo-dev-client@58.0.9:
7255 resolution: {integrity: sha512-JQPBDw0bZqZCqbOVxbphTaJXdlzuHcP7rXBxakWhotNy8nA5Ek4p6E8pIJu/OMWSLleoM0Dgtz05H/ShEHBItw==}
73867256 peerDependencies:
73877257 expo: '*'
73887258
7389 expo-dev-launcher@57.0.16:
7390 resolution: {integrity: sha512-jaBr6q4A5js/r465m2mRxN8A87YOi8I6PiIt8XIt4qfQWDgw6hqGovaF1AVFGT1Z5jxkjtgK8WNz/rAeypjqPQ==}
7259 expo-dev-launcher@58.0.9:
7260 resolution: {integrity: sha512-wf7MDFbPOoTBD+ZWcFKyhxw+g1jghPL5yl9/r3PZmTiprpoMIZQXUBGpmnAHifJbA1Fhlhzm978tGU/Njr2t5Q==}
73917261 peerDependencies:
73927262 expo: '*'
73937263 react-native: '*'
73947264
7395 expo-dev-menu-interface@57.0.0:
7396 resolution: {integrity: sha512-F47VdzOHYc19FhI/jBgctpO8a5UskTIxG6a1E5t3W5gF8VImuvBQffdXXfLHhsuCl7dS3v3U0R45cleeVXO1Zg==}
7265 expo-dev-menu-interface@58.0.1:
7266 resolution: {integrity: sha512-XdjO3ZZhEq1dXm15GVtzQ0SXxSTPguJIDZib3Z8tAf2jLxfPUlQObgO/0hdnw7ssEBhTT2jQo2HAfnOSGUfj8w==}
73977267 peerDependencies:
73987268 expo: '*'
73997269
7400 expo-dev-menu@57.0.16:
7401 resolution: {integrity: sha512-KzMHtAmnr0GqyU6MCrKLzIo/AfOjcToGhzK+pFeXlcqSPOrPJbTGlZqQ3E1o2G2jZMs+M1XvXh/VgnRyJUaRGw==}
7270 expo-dev-menu@58.0.9:
7271 resolution: {integrity: sha512-+VJMHf6XeGgVhQsJY+9CqKP2JTAv6n8Ki5NJt70BF0iqM5LzWa+/vwRna+HcTVYPA1KfHErSfL2WlLJT9LDNyQ==}
74027272 peerDependencies:
74037273 expo: '*'
74047274 react-native: '*'
74057275
7406 expo-device@57.0.1:
7407 resolution: {integrity: sha512-jyEMDUticH+dhcL3GHa2aiifOvGXJsmb3oVT2R2q4i8bN7Bddy61+NkpMmuS2VAZrvoLQwf0TJJ/1vi1ukvutA==}
7276 expo-device@58.0.3:
7277 resolution: {integrity: sha512-sK1xb02joE79KQ/c9c4oCaMhErjwUoL7IfInImRyxxmuEfKuzlNldBV61mahIrT3UyvYZBEwMM0Sx76Yqn7izg==}
74087278 peerDependencies:
74097279 expo: '*'
74107280
7411 expo-document-picker@57.0.1:
7412 resolution: {integrity: sha512-qBwM5oxDZ3I9kwFD3pUE1oK/WNv9artoEKO6UpqhQgNRr0XA1ALRVWYjkF4+ge9lUNDRehjTm/jenINkzqg84g==}
7281 expo-document-picker@58.0.3:
7282 resolution: {integrity: sha512-7oNPAhvzjGoF3Yhmkpw8GppXT05I0RC6qzskW4wbRgDFhuQRhE8eUvYU7T/Bq6NX1ERu5TUbTI0QS9zo3DO1SQ==}
74137283 peerDependencies:
74147284 expo: '*'
74157285
7416 expo-eas-client@57.0.2:
7417 resolution: {integrity: sha512-EfFiqUr0o9TvTOgMbqDiV1oIdG/d7kirhqtwa7roGmm9wF+CpXUz20d9YGzO6KzJWUYgdUgu4B6Ocv0jNJUdnQ==}
7286 expo-eas-client@58.0.1:
7287 resolution: {integrity: sha512-FkomAg1uLen36v8U7jyzMKbdrMjKRSufB9qSCnhWnJynYkeWK4qAb9UyJBD/afkbTFQfq+ARImjM7IAi3V+2NA==}
74187288
7419 expo-file-system@57.0.6:
7420 resolution: {integrity: sha512-pm8PMYEW6BnVOCBJ7df9FcDmQtE1tqImuYphlfYe1ipQRLYtdCayRczJcbKIsnB3mqEyp4gC2gWmMbsAsAOjVg==}
7289 expo-file-system@58.0.4:
7290 resolution: {integrity: sha512-w7Vuh1qA4fkZOSR4Zylvdr6bgOiH5p1hvfrnNlP+Xqb1x5h8Mu13yvQKUm4A1yc7BAeZ7CXu7//dw5hDEevFUg==}
74217291 peerDependencies:
74227292 expo: '*'
74237293 react-native: '*'
74247294
7425 expo-font@57.0.2:
7426 resolution: {integrity: sha512-eWR0CAdysgVqg8VewJ8b5wKh1pa6C8YShIEU3SP0+hlSqOk4djUwuJjn3P04KHVzL3hws9FrUuPxCNmd4TGung==}
7295 expo-font@58.0.4:
7296 resolution: {integrity: sha512-AElYv+6hg7xgf8x7yL0zP8D2QrJuASU59iKC+yLd38SM6AvWFMlgBz0fkcgWtZFH7QI0Kz1WP+WsCQd06wYxBQ==}
74277297 peerDependencies:
74287298 expo: '*'
74297299 react: '*'
74307300 react-native: '*'
74317301
7432 expo-glass-effect@57.0.1:
7433 resolution: {integrity: sha512-m/n8maxqNcHk6ZDhuqXBfD5Kt1Iz3M8xykVgdB0iSCIXvF70IqWXmQhX8Psswhrp8eZ+3r0mAD0Jh/2gFA3QaA==}
7302 expo-glass-effect@58.0.3:
7303 resolution: {integrity: sha512-NoFT5j2uZecNsiDAd47z37PWYTxNJnJMrVYiAU+SggiV9K91Sc0IuIcMsuOM4sUuPBQdSTs8/I9KXk5M0Z2O/w==}
74347304 peerDependencies:
74357305 expo: '*'
74367306 react: '*'
74377307 react-native: '*'
74387308
7439 expo-haptics@57.0.2:
7440 resolution: {integrity: sha512-vPths6zTxxaGaemC7D1GKbw1iOnOAAL5oAcCFVSgVNWnuLCBefL1LkhRBaJsepiMXRh2y3vwPiXkPaf6d16blA==}
7309 expo-haptics@58.0.3:
7310 resolution: {integrity: sha512-5chRroIhYhB2CG6Ce7sE82q4EATF9O4G7oyeUlDumcVAZzpNWWJkCZ7ucajyHOj2Wc/rArg2h7jYmwI3sgxnNA==}
74417311 peerDependencies:
74427312 expo: '*'
74437313
7444 expo-image-loader@57.0.1:
7445 resolution: {integrity: sha512-uhrZKLT/cTl2mXyR28kPpVkS5O+PK9N1QA/07IFM4f5T4g0lTW1JHT3NEWwEEsGFldPmVX4j7LwUVVZxE+woug==}
7314 expo-image-loader@58.0.2:
7315 resolution: {integrity: sha512-anioFtqL5sl7556fw0vZOJBqICq0cpQAUUeQlFR40e9OJawCguWAs/FFpJYNX94DUYrp8YzlacThSWNyh0YPGw==}
74467316 peerDependencies:
74477317 expo: '*'
74487318
7449 expo-image-manipulator@57.0.17:
7450 resolution: {integrity: sha512-VpM8qAotTeSIobIAL8RAIDrZKL0jQBK/6O41NnwmdT96sd2wT263DlTbkvQ6RkcFrR9+NZiC5Um7FDBK+jFneg==}
7319 expo-image-manipulator@58.0.10:
7320 resolution: {integrity: sha512-JWapRwmOUq5RaePB1WKlEDgX/MewnRUeM6MKE0W7zEvbkyFYVn+4swUNOP3WDjDzu+To+878bqt7hcRcaqWzzA==}
74517321 peerDependencies:
74527322 expo: '*'
7323 react: '*'
7324 react-native: '*'
74537325
7454 expo-image-picker@57.0.14:
7455 resolution: {integrity: sha512-NK9XBQqOtscbB/uRts1Gm7Oki6odMN3FQPWD6fSKmNUfKM69O6kcgU25lEXFTSLZ7sLl+AopHa2X0uILd8rjaQ==}
7326 expo-image-picker@58.0.9:
7327 resolution: {integrity: sha512-irYps0kkD+t17jHhBbQfm5Y9NbWXxULGyZPP/y90td3LE5zlFvFzNCj8Qnfif+ZFtg0QaL0T2fb/p5NLbfFA0w==}
74567328 peerDependencies:
74577329 expo: '*'
74587330
7459 expo-image@57.0.3:
7460 resolution: {integrity: sha512-EYfV8tIQxXLQPHhgZxc+bESUn2NcVw1U0RM28qqFeFfHyD1sBpIYJC2JTy24OtfBowYVoUyTvgf2ykWydiZVCw==}
7331 expo-image@58.0.8:
7332 resolution: {integrity: sha512-kRzMdDK+Cp0Iunz/psYnFDvt2MGTYA2qsZrey+nkH3XrtjTJVRD9hhdnHh35vLO3LXJsUNXfEvGnNV+ghnk0Hw==}
74617333 peerDependencies:
74627334 expo: '*'
74637335 react: '*'
......@@ -7467,32 +7339,33 @@ packages:
74677339 react-native-web:
74687340 optional: true
74697341
7470 expo-json-utils@57.0.1:
7471 resolution: {integrity: sha512-cgTe1NqzQdYs/WN+3nIY5IZg8s0pb0xaTUbhYvxQDn137GbwRfHoGM2se3m3Vsl4Qu+B9G4RPEK5WJDEU2Do7g==}
7342 expo-json-utils@58.0.1:
7343 resolution: {integrity: sha512-jNHNElOUPz2/vW3CbDKRn6tTF6eE9wwVbh/Isnqp5c/CdTcONzFVR3YHN3WQ05PnkmieyEqVfeOusOd1X9FDtQ==}
74727344
7473 expo-keep-awake@57.0.2:
7474 resolution: {integrity: sha512-GqgH746wtJImmsbyHmCQoi7cOslKuWQBbJHXr53S35Bpf5UvxCAztvnitUEd7D0QvFN2rvkOhylbZpgZZfBLlQ==}
7345 expo-keep-awake@58.0.2:
7346 resolution: {integrity: sha512-UIddpQTJrYq/qsiuFHRJQwb1z1jojQ44XV2o6+bSuxLFKwO4KXp21to2GD3RkRFYLKdrEm98FLbzD9KpALkdKQ==}
74757347 peerDependencies:
74767348 expo: '*'
74777349 react: '*'
74787350
7479 expo-linking@57.0.8:
7480 resolution: {integrity: sha512-gv0ZNaF7tILbcvX8xinNbQr6GIGQStxeUAJseweP+LjC9ped7Wl6EeyIMBlDR83U6Da+8drVeqBQSMvwAXgytA==}
7351 expo-linking@58.0.9:
7352 resolution: {integrity: sha512-EhA4cClb/rB8idwcrg0zQvgPxAiB0rnjy/zF9DLxmxxkTjV1Y1X3XphfeDxmoWNNf1gL9E47K/R6wsfJcni8aA==}
74817353 peerDependencies:
7354 expo: '*'
74827355 react: '*'
74837356 react-native: '*'
74847357
7485 expo-manifests@57.0.1:
7486 resolution: {integrity: sha512-qB/mDG2dYdl+EvUeQuqP8KFYCFgFCQjJYdWIHo8SFBgDzMYmdF286DFY2M1M9Okr99wkb5M4tgA3aCcwv3aEQA==}
7358 expo-manifests@58.0.1:
7359 resolution: {integrity: sha512-fVeJJ71Fj8FJgcAUggn6QIsm7CTxsXFgekLl4pEPHgON6fmcxog63FGO0sisQ3F6yUWFR4nn8iJmgBp1Exs7ew==}
74877360 peerDependencies:
74887361 expo: '*'
74897362
7490 expo-modules-autolinking@57.0.12:
7491 resolution: {integrity: sha512-Q8KAlq37nLKsQ+HsS9NpQVpd5jCgqtu694TDUNHBUBpV9ViD82mRBh8Uug/h68RG9xnLS+kuL4nYaCuFRghHjg==}
7363 expo-modules-autolinking@58.0.6:
7364 resolution: {integrity: sha512-1O707KinH8UCUzi9JNeFqF87BJSh1fGgpwjdI/NzBhG2IoHAFQ1ngnpyqF6ikr/o01aGoBgjdCRRLfzEnop/IA==}
74927365 hasBin: true
74937366
7494 expo-modules-core@57.0.14:
7495 resolution: {integrity: sha512-Cg3aQnVsQhZcMOF/RFgPGzMuhIak5W9eR9ecwmFSeQ813r4/49ut6RMA6PqUuUKuPCUIRqnBAHfSyTm1W9nfzg==}
7367 expo-modules-core@58.0.9:
7368 resolution: {integrity: sha512-0BD1t8aWXPGGA+222KzG4MA29iZVqBNJWCKoPKFwD9ab7x9wPkazLGifAp8m3VOYKLLMbzYD8uS9XTJdiplduA==}
74967369 peerDependencies:
74977370 react: '*'
74987371 react-native: '*'
......@@ -7501,19 +7374,22 @@ packages:
75017374 react-native-worklets:
75027375 optional: true
75037376
7504 expo-modules-jsi@57.0.6:
7505 resolution: {integrity: sha512-WK0xFEe0FdZTCLCdfXK+HVNYfAmEbA6goecRxqjr0gh3XYRKAr9tikxqcM0ItLQoEPKntscPZhWcPLGvr97Tfw==}
7377 expo-modules-jsi@58.0.5:
7378 resolution: {integrity: sha512-5UMYPOEB1amqV7SCQKxJBvyZHycW4ZIeP3cwkv22pSE2nx3Hj6IymNz34TtIrCMcJAs6mO7MtG5OUsgwTp+iTQ==}
75067379 peerDependencies:
75077380 react-native: '*'
75087381
7509 expo-network@57.0.1:
7510 resolution: {integrity: sha512-ndg+FbDDlz6XTpQ6aVuVgyvrYQwMkpcUAvZIXbwrGBbLTSWNzYC/gawYu1BAeDN7O6JTGY98GBVJBov/JH7LgQ==}
7382 expo-modules-macros@0.14.0:
7383 resolution: {integrity: sha512-R6ODnfK0Za+pSZZjv0SuOTV2YkxczeavvrsLv40gueH3U7QJ8H5OlD3kkFqyT68UzDLRJhwF52D884egtNH7Rw==}
7384
7385 expo-network@58.0.2:
7386 resolution: {integrity: sha512-+Ek0nuLcZmW4f35L1lg4vo3lpotV0OUehFj8y5z0w/VEAw3WOeEzXh7Eo3TS6lIvsbyIJO7woWx8fYjMbGnhbA==}
75117387 peerDependencies:
75127388 expo: '*'
75137389 react: '*'
75147390
7515 expo-notifications@57.0.15:
7516 resolution: {integrity: sha512-H91z4WSFukSQP3dThgh6PCPFrT6VHeR+J2f7CuCOE72JV7YEGcBCir103QY58ocKsdgkodQpnkTU2m8LTHkWLg==}
7391 expo-notifications@58.0.9:
7392 resolution: {integrity: sha512-Ygi1bvJKMiv6wP0r9b3WzDkZy28EbIeagNvxyQqcy6FoyuUpAIXbH0IgnaAjK3czPWin78jC3GsDJYeZbHFPDg==}
75177393 peerDependencies:
75187394 expo: '*'
75197395 react: '*'
......@@ -7531,52 +7407,52 @@ packages:
75317407 peerDependencies:
75327408 expo: '*'
75337409
7534 expo-secure-store@57.0.2:
7535 resolution: {integrity: sha512-PhrPMKnI7YSObLEQZOoP9evB2ZOCv9kFuG2L7cZfNlOwWjGbir711PlppkXVoM3JE8vamDrTqzMLGv266FhJJg==}
7410 expo-secure-store@58.0.1:
7411 resolution: {integrity: sha512-jYKTkbXOlKrt3DiDw+f/EGc70UfyWNJgQiBEQ8ocyEpUehouyp9GcKza3gWixgLV8CWaCx4RtxiFQ5pFWaj0XQ==}
75367412 peerDependencies:
75377413 expo: '*'
75387414
7539 expo-server@57.0.3:
7540 resolution: {integrity: sha512-aK+LdKzauHSGmsOStZtyxdzv0zWssCkxTw3m4QuOhfDSJsZaMRTd9O41d8ixU/QfELTbaJ0oRNcF7JFV/7O9YQ==}
7541 engines: {node: '>=20.16.0'}
7415 expo-server@58.0.2:
7416 resolution: {integrity: sha512-QOdIBRZ7hEhlKzDud99/4YPggg+rASCD901PuuDy/oHzSP+eQKs2B4PDwzwfYvtelDA45nOwJsyCKnBvwpuJZA==}
7417 engines: {node: ^22.13.0 || ^24.3.0 || ^26.0.0 || >=27.0.0}
75427418
7543 expo-sharing@57.0.17:
7544 resolution: {integrity: sha512-p2B4SMeNsOv6hm1NkrxRlncjwu9mmLfi0drLaEyX13Rxn4DdDFPhuaezpOK7XLogTsmWGpfR46uq6oHMvSxbfA==}
7419 expo-sharing@58.0.12:
7420 resolution: {integrity: sha512-2uwxo2+9W6WzA87FnBiwCAWkrBAoNUrNY7mJHA5k3Q5i/je6tH2N65kl5pACpYEIOOShQkOAd4zz7DVc23JydA==}
75457421 peerDependencies:
75467422 expo: '*'
75477423 react: '*'
75487424 react-native: '*'
75497425
7550 expo-splash-screen@57.0.8:
7551 resolution: {integrity: sha512-BEsrKg4niYBZa5AFzWRyGqxA4ZemtBOPwbCy+C336iGYYPuZYLEgWJGmm2xD1gRfCdrM/TP+l2ONd86Zvk3KyA==}
7426 expo-splash-screen@58.0.2:
7427 resolution: {integrity: sha512-rYs8/d8GGFKBfj1cecr8/87nfUcdSmqQq/enm8Wmv1IuC3l1dxnxFRWlnz2KORCYLUw42M2vNRqlSU9ETHt8GQ==}
75527428 peerDependencies:
75537429 expo: '*'
75547430
7555 expo-sqlite@57.0.2:
7556 resolution: {integrity: sha512-5KVbT7BQFZlIcQBXKWvwBERK3ODF6PSqct27GQKukZzAjsx2B97R+mwtYqrTUtUbw71VJrQrdr9Yl2OWYC7UpA==}
7431 expo-sqlite@58.0.7:
7432 resolution: {integrity: sha512-0ge3jryvlzEDyT7mXPEpTaqIIT65+n2noQfxBrWMdmSmuqL4L6eAYw/81C8UrXmDM97Y7vmmdR3abkMdN/a2mg==}
75577433 peerDependencies:
75587434 expo: '*'
75597435 react: '*'
75607436 react-native: '*'
75617437
7562 expo-structured-headers@57.0.0:
7563 resolution: {integrity: sha512-//t9UNPbJSEysc2x4VKJG/u7Osvv5DYJWsET5bqt/B+qcD1by/JXvSQzX3Q/YAgA96xFPontrz6OAPLbO4JKEA==}
7438 expo-structured-headers@58.0.1:
7439 resolution: {integrity: sha512-wIduvAIUdGQk82osLjFiYYq3TFHUdG4RgmN+C//EySxn/2PTu0RsJsdgBtXrp/OT3YGeesNgfzb1mFxq5Zhp0g==}
75647440
7565 expo-symbols@57.0.2:
7566 resolution: {integrity: sha512-qZ0iqOflm5lZGwRsQ5Y8sDksw3GAUKwHSX1bJBoocXf7gu14vafIXXYWte+JT9VfXAUGyKodJhLHP/GoOrcNWg==}
7441 expo-symbols@58.0.3:
7442 resolution: {integrity: sha512-WmO6gAjvUlgS3gFgvuHN/JRPsfHaDPiPj31i28YBN5yjg/B/k2UiPHFgqfktm8Tyy+rVtUr4ttMp91sibnybRw==}
75677443 peerDependencies:
75687444 expo: '*'
75697445 expo-font: '*'
75707446 react: '*'
75717447 react-native: '*'
75727448
7573 expo-updates-interface@57.0.1:
7574 resolution: {integrity: sha512-+LUWwJ0gf/TEKMVdQAw/Gjih4dvrk+URgy24X9qEGKuuMDZqjBRm9T4yQyBVALGL5TTdPUaB6ILxx3lshm3pwQ==}
7449 expo-updates-interface@58.0.1:
7450 resolution: {integrity: sha512-OF+3BtMXtUsXWDfpHVNus9yHpx7WjMwjxDfeeN9LQBYSq/UtYmNNHBSfzChYTuqljWFSOAHRfsDykV9EB73Wlg==}
75757451 peerDependencies:
75767452 expo: '*'
75777453
7578 expo-updates@57.0.19:
7579 resolution: {integrity: sha512-xX4KIUa8H2xKmiVDe/uEehD96MV6nyyF/OCrE+PBYfOEp6BbS8bYkHZfNFcoDCKMRuT6pg9JrCi8OmnoWlM/2A==}
7454 expo-updates@58.0.11:
7455 resolution: {integrity: sha512-7mijq0yyFhPExPO/IS/feFrmrbR6pZP3WOAYf07RkfW/3lacLBxWt5/rKG9QMe7ydbvjqMednhca1Rx48lB2mg==}
75807456 hasBin: true
75817457 peerDependencies:
75827458 expo: '*'
......@@ -7587,31 +7463,32 @@ packages:
75877463 expo-dev-client:
75887464 optional: true
75897465
7590 expo-video@57.0.3:
7591 resolution: {integrity: sha512-Z+rLdBSzICwoHm/HUxND5fm5nfgqiB+QPWAOKxmA8ScYwvxG1UGjZ6OaayvPc3GkT4aucsbycmFO0uUv/qnIhg==}
7466 expo-video@58.0.5:
7467 resolution: {integrity: sha512-iJM0z/HR7Gocywq5Z4ou1CvTMaoGrXVNb1HzzENpqF+endoJcOGZFgV5uq+OGbiLtm7S/LSm/CCtcPwvVsdcCw==}
75927468 peerDependencies:
75937469 expo: '*'
75947470 react: '*'
75957471 react-native: '*'
75967472
7597 expo-web-browser@57.0.2:
7598 resolution: {integrity: sha512-3vl5kvd7PB48ub6PpNIJUuPxO8xVa6D8RnIgNba6SXRwqFprOfeEZgwTgtm41kz0AAtvMOztUVNEUkwrHKjqMQ==}
7473 expo-web-browser@58.0.3:
7474 resolution: {integrity: sha512-SEPI0pphJ6rCTtJ01OWNRDTxvEqCTl3TkVRC3erUC1CGUrz5UWCzK+ejUx4F1WEayfj4j9tQAw0JDc+dzDq26g==}
75997475 peerDependencies:
76007476 expo: '*'
76017477 react-native: '*'
76027478
7603 expo-widgets@57.0.15:
7604 resolution: {integrity: sha512-dlwbUCLaxOZFcIejxtOo95NyqJMa4Sop4NPzJEvvD2MwXERBqxkp8RExxVDAEiBRIdAYqC1u02SnIJWT/27f7g==}
7479 expo-widgets@58.0.9:
7480 resolution: {integrity: sha512-wGmI39qtJ6965rJA1bgAuKA2rEHfecoL939wxnBsSz3mvAAnSsjUNytP1rsVc0cBooPCssxqJST9EXGzee5Hfg==}
76057481 peerDependencies:
76067482 expo: '*'
76077483 react: '*'
76087484 react-native: '*'
76097485
7610 expo@57.0.18:
7611 resolution: {integrity: sha512-6nax9hJPhf9dWrstliXUABTJXDNIJrfJKcCtjSxuYVs2Yf127GIhKf3wsEYSFUl+LFdRbPPTNaweJePH159wZA==}
7486 expo@58.0.0:
7487 resolution: {integrity: sha512-/KiC8tFY0hHl/mm49AFgNUFEQbnPthVh9o7EuDCSnTVpor8Cm/x1oqRyE97dxPT640lwuHO55xFO6OXopzjKXA==}
7488 engines: {node: ^22.13.0 || ^24.3.0 || ^26.0.0 || >=27.0.0}
76127489 hasBin: true
76137490 peerDependencies:
7614 '@expo/dom-webview': 57.0.1
7491 '@expo/dom-webview': 58.0.2
76157492 '@expo/metro-runtime': '*'
76167493 react: '*'
76177494 react-dom: '*'
......@@ -7755,12 +7632,25 @@ packages:
77557632 flow-enums-runtime@0.0.6:
77567633 resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==}
77577634
7635 flow-estree@0.327.0:
7636 resolution: {integrity: sha512-f9vK751YUzD0qaHSpKc5/qQM6gqOlgGS+4ZRqTNcZOpVqn3mC55yEQ6dUG2K1eaVm5FbKkz9CFWe6XNvrkQFQg==}
7637 engines: {node: '>=18'}
7638
7639 flow-estree@0.331.0:
7640 resolution: {integrity: sha512-FVLYkSL/ITb/QXBEQvNWPjPooRGswuUtGOwrH+puSlMDneNkxy640+FZsk/TfKL+b7Wbw/Fg9FTUv2bMQDpj2w==}
7641 engines: {node: '>=18'}
7642
7643 flow-parser@0.327.0:
7644 resolution: {integrity: sha512-/MYZ5hXWf5ozpbdfUDmazMgQXviLxWEiRLH3MppEGDdW0itRVqmB5UaU7QX+SBCDNiq+gEesSVn8nlxmPDyDkw==}
7645 engines: {node: '>=0.4.0'}
7646
7647 flow-parser@0.331.0:
7648 resolution: {integrity: sha512-vEZcHIlnKeN8JSVtYFczj8sWJfHIJOkz+YG00O/oul/Bete+t1ZhTi+O6JRRLFYvGW+yJkZ0YgL16iStnbkUqQ==}
7649 engines: {node: '>=0.4.0'}
7650
77587651 fontace@0.4.1:
77597652 resolution: {integrity: sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==}
77607653
7761 fontfaceobserver@2.3.0:
7762 resolution: {integrity: sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==}
7763
77647654 fontkitten@1.0.3:
77657655 resolution: {integrity: sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==}
77667656 engines: {node: '>=20'}
......@@ -7840,10 +7730,6 @@ packages:
78407730 resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
78417731 engines: {node: '>= 0.4'}
78427732
7843 get-nonce@1.0.1:
7844 resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
7845 engines: {node: '>=6'}
7846
78477733 get-proto@1.0.1:
78487734 resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
78497735 engines: {node: '>= 0.4'}
......@@ -7963,24 +7849,12 @@ packages:
79637849 heic-to@1.5.2:
79647850 resolution: {integrity: sha512-8Fns+lZHAWmz5U5IUxDeXKwIf3foBoKNPLxxFY4B0MkLjNuomEIHCoDbDE+x/llFK3NCEO1cu4+n3iUKY+Svmw==}
79657851
7966 hermes-compiler@250829098.0.17:
7967 resolution: {integrity: sha512-qG1PXzTEtriF6oQLZF3vyHhSMxOdW5h2TqqLri0rdpstPustd2fSvRZQMVAPdlhgFwBfYnj3OUZtiO6LjYsEFw==}
7968
7969 hermes-estree@0.35.0:
7970 resolution: {integrity: sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg==}
7971
7972 hermes-estree@0.36.0:
7973 resolution: {integrity: sha512-A1+8zn5oss2CFP7pKsOaxorQG6FNIz1WU1VDqruLPPZl3LVgeE2C5xfFg8Ow6/Ow4mSslLLtYP1J3n38eKyW9w==}
7852 hermes-compiler@260318099.0.4:
7853 resolution: {integrity: sha512-8odcPFkPC82HlqCl0C5QI9mBN4rEAT+IAo55sJhzwKw//K3qZloiv3ex6J2O8CuBbhdmkJozfidNsset2KH25w==}
79747854
79757855 hermes-estree@0.36.1:
79767856 resolution: {integrity: sha512-guv1nQ6IJ7S83NRFPWc3SA7IBZrdNC9kapwOq6uXvF4wP+sDCgjzQbKPCoyYmoyZRzztF/n/c36l/rccCZSiCw==}
79777857
7978 hermes-parser@0.35.0:
7979 resolution: {integrity: sha512-9JLjeHxBx8T4CAsydZR49PNZUaix+WpQJwu9p2010lu+7Kwl6D/7wYFFJxoz+aXkaaClp9Zfg6W6/zVlSJORaA==}
7980
7981 hermes-parser@0.36.0:
7982 resolution: {integrity: sha512-GdpwMmH5x6IpC1cijvcvYnlPB60Mh6kTSF/NFdYV/j56gYdi+0RIakYs+eqOV+bbO0SW7mgVVGSsTJxyPQfo3w==}
7983
79847858 hermes-parser@0.36.1:
79857859 resolution: {integrity: sha512-GApNk4zLHi2UWoWZZkx7LNCOSzLSc5lB55pZ/PhK7ycFeg7u5LcF88p/WbpIi1XUDtE0MpHE3uRR3u3KB7TjSQ==}
79867860
......@@ -7988,9 +7862,6 @@ packages:
79887862 resolution: {integrity: sha512-ciq6hFsSG/Bpt2DmrZJtv+56zpPdnq+NQ4ijEFrveKN0ZG1mhl/LdT1NQZ9se6ty1fACcI4d4vYqC9v8EYpH2A==}
79897863 hasBin: true
79907864
7991 hoist-non-react-statics@3.3.2:
7992 resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==}
7993
79947865 hono@4.13.7:
79957866 resolution: {integrity: sha512-c8/gF9ac8Y78/agExVocyLevgR+JlpNB444Py0FSX8pJoPdYUfUzRcXtYEYGwt6l19qIlVZPN5Mfsw9jFShmQQ==}
79967867 engines: {node: '>=16.9.0'}
......@@ -8057,11 +7928,6 @@ packages:
80577928 resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==}
80587929 engines: {node: '>= 4'}
80597930
8060 image-size@1.2.1:
8061 resolution: {integrity: sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==}
8062 engines: {node: '>=16.x'}
8063 hasBin: true
8064
80657931 immediate@3.0.6:
80667932 resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==}
80677933
......@@ -8347,9 +8213,6 @@ packages:
83478213 lie@3.3.0:
83488214 resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==}
83498215
8350 lighthouse-logger@1.4.2:
8351 resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==}
8352
83538216 lightningcss-android-arm64@1.33.0:
83548217 resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==}
83558218 engines: {node: '>= 12.0.0'}
......@@ -8517,9 +8380,6 @@ packages:
85178380 markdown-table@3.0.4:
85188381 resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==}
85198382
8520 marky@1.3.0:
8521 resolution: {integrity: sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==}
8522
85238383 matcher@3.0.0:
85248384 resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==}
85258385 engines: {node: '>=10'}
......@@ -8608,120 +8468,62 @@ packages:
86088468 meshoptimizer@0.22.0:
86098469 resolution: {integrity: sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==}
86108470
8611 metro-babel-transformer@0.84.4:
8612 resolution: {integrity: sha512-rvCfz8snl9h20VcvpOHxZuHP1SlAkv4HXbzw7nyyVwu6Eqo5PRerbakQ9XmUCOsRy70spJ37O+G1TK8oMzo48g==}
8613 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
8614
8615 metro-babel-transformer@0.84.5:
8616 resolution: {integrity: sha512-2WbHILKMiJUzfdjmGOQOqU1bWi9//gqiclc/tkk/AIsrrVw3efhZ1uhkOwMTxUEPOzqoo091H0olLmVZH5FHGQ==}
8617 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
8618
8619 metro-cache-key@0.84.4:
8620 resolution: {integrity: sha512-wVO79aGrkYImpnaVS4+d5RrRBRPX31QtvKB3wKGBuiNSznduZTQHzsrJZRroFJSwnygrzdsGUtDQPuqqFjFdvw==}
8621 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
8622
8623 metro-cache-key@0.84.5:
8624 resolution: {integrity: sha512-3dPB2TnvGjjf0/9O7AXVQURKXuQNauTZE7WpTGTlR017Gh/B5y0m/2wcqxfveUguHSpu89KhVxCAlr2k/H7uhQ==}
8625 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
8626
8627 metro-cache@0.84.4:
8628 resolution: {integrity: sha512-gpcFQdSLUwUCk71saKoE64jLFbx2nwTfVCcPSULMNT8QYq0p1eZZE29Jvd0HtT/UlhC3ZOutLxJME5xqD2JUZg==}
8629 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
8471 metro-babel-transformer@0.87.1:
8472 resolution: {integrity: sha512-orvRIGpb0yK1yMbk5YP3dhVKjmoxUkRB9fdltGJxNppEqus/1tFpNuf9KnGFR3Qjg0izoUrJ4z6WgoBvdkXPrA==}
8473 engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0}
86308474
8631 metro-cache@0.84.5:
8632 resolution: {integrity: sha512-WHS0n2OxQqtwEjSeQFPePNrMvEFhmQcUQM9cRJMHByWoi/GMWFBEWOf7hVkAM/0KRutAXNbDlSu/cZB6CyxgQQ==}
8633 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
8475 metro-cache-key@0.87.1:
8476 resolution: {integrity: sha512-scqVVPMA2c+RVO12I3wyMDp5xCkRPLsyrcG4Qc3xfU5JR0EW/0sz2tjty+5UjMUtG09uiM1KYQ8HjWg7OQXHtw==}
8477 engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0}
86348478
8635 metro-config@0.84.4:
8636 resolution: {integrity: sha512-PMotGDjXcXLWo2TMRH+VR99phFNgYTwqh4OoieIKK3yTJa1Jmkl+fZJxDO0jfBvNF+WESHciHvpNuBtXaF3B0Q==}
8637 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
8479 metro-cache@0.87.1:
8480 resolution: {integrity: sha512-juNPaj0Xi5tkLp8imXqvbSnEIijwKG36m7OiFFVJMqEkiURwAjkMFVek3/xpix1+LVQqO7kjVp3PvuvIM61mKQ==}
8481 engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0}
86388482
8639 metro-config@0.84.5:
8640 resolution: {integrity: sha512-zie+uN6oohscowi2S7ByU+wUw6CrT4ZxW9uAbONOObSxx86RGmnIAmjXHLkfmcdYoY7jzOPEbqcI6oeVmqyBQA==}
8641 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
8483 metro-config@0.87.1:
8484 resolution: {integrity: sha512-NmkDlc/qZAdo5gTkVTuO2AKE/khemRKRH5IA+SKfqUBJigI5GqZ5TOXhmEokhlkAqzjt8dyzKhzI6FHvXoXaTQ==}
8485 engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0}
86428486
8643 metro-core@0.84.4:
8644 resolution: {integrity: sha512-HONpWC5LGXZn3ffkd4Hu6AIrfE7j4Z0g0wMo/goV24WOB3lhuFZ40KgvaDiSw8iyQHloMYay5N/wPX+z8oN/PQ==}
8645 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
8487 metro-core@0.87.1:
8488 resolution: {integrity: sha512-xizzky/4+c/Mkznege8OW05j7bSdM39VPoEps61Se4+hf32UQujmbvLvIE9+UnP6kNEPVomk0Fw8NsBK9iRQmw==}
8489 engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0}
86468490
8647 metro-core@0.84.5:
8648 resolution: {integrity: sha512-xwm605hCi5Y6eJTTb8ZWo6pkUcoBEIyiQOfkZh5GwtDwUrP9SNhTQZhzJHrBCwwxlf3Ptl/pxWJgQ1rsNYMnrA==}
8649 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
8491 metro-file-map@0.87.1:
8492 resolution: {integrity: sha512-9sPuNCojC3pS4vj+ZPY7FXmHGpdJeckXuKXQrDAfJvZc60AF8owRFTkI8XdwlwrmPIB2w++KraK9FMEXvC4wJw==}
8493 engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0}
86508494
8651 metro-file-map@0.84.4:
8652 resolution: {integrity: sha512-KSVDi/u60hKPx++NLu3MTIvyjzNoJnFAF8PQFxaj1jiSka/wjw+Ua6sNuJ0TDHQv+7AAoFQxeMgaRAe8Yic5wQ==}
8653 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
8495 metro-minify-terser@0.87.1:
8496 resolution: {integrity: sha512-YK4k1oO1wV48hfE+Nbw2rJCnAgeabzrgT/xH5ha5n9gbK4p3HYFC898cERUiyTl9vRh58CNTiXRc88f7y6PfKg==}
8497 engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0}
86548498
8655 metro-file-map@0.84.5:
8656 resolution: {integrity: sha512-mlm/JL8toSbSc2akpKIGmzvrVRSCgZ5vkbycI34oMLoOnLGuLyC8WTyVJ6P0hZG/usDaGwZSl/s9BCRriqjGJA==}
8657 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
8499 metro-resolver@0.87.1:
8500 resolution: {integrity: sha512-FXH/brY69wT6sPxaSW8BhMmDGD/6irmBr/cL4rUi+VWwqR3pbvdcfUOfyjcHucgQ7pe5IW3xJY21eHKLVKNumQ==}
8501 engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0}
86588502
8659 metro-minify-terser@0.84.4:
8660 resolution: {integrity: sha512-5qpbaVOMC7CPitIpuewzVeGw7E+C3ykbv2mqTjQLl85Z3annSVGlSCTcsZjqXZzjupfK4Ztj3dDc4kc44NZwtQ==}
8661 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
8503 metro-runtime@0.87.1:
8504 resolution: {integrity: sha512-kjeuSvInsM6OzBjkCQsWxnkrKZFMKtnkCl38oXWRI9lDGs2L9hGs9Tak9sQYJ9h3gtDujneB7wZio+irgqJKDw==}
8505 engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0}
86628506
8663 metro-minify-terser@0.84.5:
8664 resolution: {integrity: sha512-BJoFwCEDsYnagPqarayInv2+diCDNDdLlaof/p6s9w4gh+gc9HXYM+pDvsKGKKUumpZswNF3Z/ftTMqKl/5IBg==}
8665 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
8507 metro-source-map@0.87.1:
8508 resolution: {integrity: sha512-Bqpm0PBGdy53pigIJb4HRF7QxD2pUOdgSmVh/4AWbP635kSCv+Y6ltVxUZgSnzS/QbSmzyCGijmRPlXMj2/qHw==}
8509 engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0}
86668510
8667 metro-resolver@0.84.4:
8668 resolution: {integrity: sha512-1qLgbxQ5ZGhhutuPot1Yp348ofDsATL2WkrHF65TobqTT9K3P9qJXw38bomk7ncp5B7OYMfWwtyBZo1lCV792A==}
8669 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
8670
8671 metro-resolver@0.84.5:
8672 resolution: {integrity: sha512-VSSnepg1k6LyCwtb6eirWdAWlpKwBG8Rdtsr1mU38rMelFyWgh3/QuMSiZIZAIjwg/fsa8GhW5/FO54CAUPCEA==}
8673 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
8674
8675 metro-runtime@0.84.4:
8676 resolution: {integrity: sha512-Jibypds4g7AhzdRKY+kDoj51s5EXMwgyp5ddtlreDAsWefMdOx+agWqgm0H2XSZ/ueanHHVM89fnf5OJnlxa8Q==}
8677 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
8678
8679 metro-runtime@0.84.5:
8680 resolution: {integrity: sha512-U1m2+d1Pr+JO2/iVXBB2OfXXityz7tqwIorxfrT15IEgaHvpJBq/OHiqnOWPKJbUl3JcxjcdviZZOKk85oK4Qg==}
8681 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
8682
8683 metro-source-map@0.84.4:
8684 resolution: {integrity: sha512-jbWkPxIesVuo1IWkvezmMJld6iu8nD62GsrZiV6jP37AOdbo4OBq1FJ+qkOg8sV05wAHB//jAbziuW0SlJfW4g==}
8685 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
8686
8687 metro-source-map@0.84.5:
8688 resolution: {integrity: sha512-2BtV5L9uPc49F13Gn5wiP6bX/EncqzqTIk2VL/0F/96Vo0YEOjluT/qktQjFODfqGFsucwnh5mPEAl/2jVEfeg==}
8689 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
8690
8691 metro-symbolicate@0.84.4:
8692 resolution: {integrity: sha512-OnfpacxUqGPZQ27t8qK9mFa7uqHIlVWeqRqkCbvMvreEBiamEeOn8krKtcwgP5M4cYDPwuSmCTopHMVthqG4zA==}
8693 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
8694 hasBin: true
8695
8696 metro-symbolicate@0.84.5:
8697 resolution: {integrity: sha512-rQ40zYDAkaWBN9yvjUuAD0ZpzBMZSoKyGYXnb5JrfbKjun7fTvfoLHL3KXFYenBTYZkQtlp4cKSCv/1utxFyOw==}
8698 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
8511 metro-symbolicate@0.87.1:
8512 resolution: {integrity: sha512-rcGvwabrg0lbXGRGRKl14PY3My3+dkno2jZYhdJEuH2DmjTtTkV5bYwgto4JtV/Lbe+sXE6GO1UGg654430uow==}
8513 engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0}
86998514 hasBin: true
87008515
8701 metro-transform-plugins@0.84.4:
8702 resolution: {integrity: sha512-kehr6HbAecqD0/a3xLXobELdPaAmRAl8bel0qagPF4vhZtux93nS8S4eq2kgKt6J2GnQpVjSoW1PXdst04mwow==}
8703 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
8516 metro-transform-plugins@0.87.1:
8517 resolution: {integrity: sha512-qMiJ/x+VfqumFJJSefKS6nj8uojzC29b2/aK8vlMuFABIqGjDucICEOXd2Yt6k/XMFAgAcaJvShUOT0HLyYaPw==}
8518 engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0}
87048519
8705 metro-transform-plugins@0.84.5:
8706 resolution: {integrity: sha512-+InaSVGaOyt0DyRo4Y/zIdPI6CZwnbNho5LAL23tgmuGwv7fyfkF7kKfPjZcfxXBcoYdTLLFnCfCH/dHSiCqNg==}
8707 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
8520 metro-transform-worker@0.87.1:
8521 resolution: {integrity: sha512-VOzs3OV405FuOLYdAhqA2wsn1F9lvueDVxMDLvCKaQ44U+yknIqphJ9eMjjsGwLDZiJq9sW3DMLhjD27JxQgqQ==}
8522 engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0}
87088523
8709 metro-transform-worker@0.84.4:
8710 resolution: {integrity: sha512-W1IYMvvXTu4MxYr7d9h7CeG2vpIr3bmLLIavkPY4O1ilzDrvS8z/NEe6y+pC44Ff7raMXQgYSfdqDUwN/i39gg==}
8711 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
8712
8713 metro-transform-worker@0.84.5:
8714 resolution: {integrity: sha512-ui1Z8x4s5RL36gMmKLaMMO7O9NNDHNdthEZSCDQHAau3JcAsTaFOK6I+2q4I/kW5u8hSEjJk9L45TXSVJw6g1A==}
8715 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
8716
8717 metro@0.84.4:
8718 resolution: {integrity: sha512-8ETTubqfD6ornDy2zYDvRcKnVDOXdFJsjetYDBsY4oAsb6NJkiwFR+FaMESyGppFmQUyBQA4H4sFGxzcQSGtFA==}
8719 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
8720 hasBin: true
8721
8722 metro@0.84.5:
8723 resolution: {integrity: sha512-r1liLkyFZMVSEMNjU1CJU5pRzs3NdkxHqXS60O25c0rCIqAR+cGk7rPydw/g0WAIKVXojIBIF45yYBPagJGcgw==}
8724 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
8524 metro@0.87.1:
8525 resolution: {integrity: sha512-1oyLU9elM7hPAsKIqKooEekwxiuWr27+MZBhUROPhzcbXhMDxK64GPF/hCXwBZVp1F89ODavCrBmJtLx9WtBoQ==}
8526 engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0}
87258527 hasBin: true
87268528
87278529 micromark-core-commonmark@2.0.3:
......@@ -8900,11 +8702,6 @@ packages:
89008702 resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
89018703 hasBin: true
89028704
8903 mkdirp@1.0.4:
8904 resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
8905 engines: {node: '>=10'}
8906 hasBin: true
8907
89088705 modern-tar@0.8.5:
89098706 resolution: {integrity: sha512-snEhs+6G5Tjd4I7tLCDOaoln2RgE0bD19RzEKgvgK2hZ5VKy3MpLhLTZ2fWpXSTg4K2cyPwp+VHATFJhxfnOeA==}
89108707 engines: {node: '>=18.0.0'}
......@@ -9061,6 +8858,10 @@ packages:
90618858 resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==}
90628859 engines: {node: '>=10'}
90638860
8861 noxcturnal@0.1.1:
8862 resolution: {integrity: sha512-Fa9SvpVNi+2AVr9CI6mkxqIIeGQNlVRLZsXdinOx1xrvV5ZvCsyBff9QRJdwnzlVnn1AIpksFe9SW9sDfzYKLw==}
8863 engines: {node: '>=18'}
8864
90648865 npm-package-arg@11.0.3:
90658866 resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==}
90668867 engines: {node: ^16.14.0 || >=18.0.0}
......@@ -9087,13 +8888,9 @@ packages:
90878888 oas-validator@5.0.8:
90888889 resolution: {integrity: sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==}
90898890
9090 ob1@0.84.4:
9091 resolution: {integrity: sha512-eJXMpz4aQHXF/YBB9ddqZDIS+ooO91hObo9FoW/xBkr54/zCwYYCDqT/O54vNo8kOkWs5Ou/y28NgdrV0edQNA==}
9092 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
9093
9094 ob1@0.84.5:
9095 resolution: {integrity: sha512-aH9RkoZc7w/90HBamFxTw8ZLFr05wXS+iOnvmrgo53Ep8Pyrm5FieQSaPIVROkfFVQISeD/zo92fes26TOwe+A==}
9096 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
8891 ob1@0.87.1:
8892 resolution: {integrity: sha512-i8iA8uij0g1YQzS8uOJPSRCgwDjO9warIHUAu1Fqj877Wc3wlfxDYBioYWgKTBF2+URVJttyDWSEpmd99nlvtQ==}
8893 engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0}
90978894
90988895 object-assign@4.1.1:
90998896 resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
......@@ -9150,9 +8947,9 @@ packages:
91508947 oniguruma-to-es@4.3.6:
91518948 resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==}
91528949
9153 open@7.4.2:
9154 resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==}
9155 engines: {node: '>=8'}
8950 open@8.4.2:
8951 resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
8952 engines: {node: '>=12'}
91568953
91578954 ora@3.4.0:
91588955 resolution: {integrity: sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==}
......@@ -9558,9 +9355,6 @@ packages:
95589355 resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==}
95599356 engines: {node: '>=6'}
95609357
9561 queue@6.0.2:
9562 resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==}
9563
95649358 quick-lru@5.1.1:
95659359 resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==}
95669360 engines: {node: '>=10'}
......@@ -9589,16 +9383,16 @@ packages:
95899383 react-devtools-core@6.1.5:
95909384 resolution: {integrity: sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==}
95919385
9592 react-dom@19.2.3:
9593 resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==}
9594 peerDependencies:
9595 react: ^19.2.3
9596
95979386 react-dom@19.2.6:
95989387 resolution: {integrity: sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==}
95999388 peerDependencies:
96009389 react: ^19.2.6
96019390
9391 react-dom@19.3.0:
9392 resolution: {integrity: sha512-JDk8dgif51OjFoDE70+OT9ICyYr+69HlmihNwp1+Nsfbna3t5sIiCa9ZJktDmQ4/1b/rn26hIAR2uYXDMr5r0Q==}
9393 peerDependencies:
9394 react: ^19.3.0
9395
96029396 react-freeze@1.0.4:
96039397 resolution: {integrity: sha512-r4F0Sec0BLxWicc7HEyo2x3/2icUTrRmDjaaRyzzn+7aDyFZliszMDOgLVwSnQnYENOlL1o569Ze2HZefk8clA==}
96049398 engines: {node: '>=10'}
......@@ -9614,9 +9408,6 @@ packages:
96149408 react:
96159409 optional: true
96169410
9617 react-is@16.13.1:
9618 resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
9619
96209411 react-is@17.0.2:
96219412 resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
96229413
......@@ -9632,8 +9423,8 @@ packages:
96329423 '@types/react': '>=18'
96339424 react: '>=18'
96349425
9635 react-native-gesture-handler@2.32.0:
9636 resolution: {integrity: sha512-uYIMOKlKENORq2SABE+jIjbPU+h5I/sQKcq2v16zRq848nwEp1fWRVwML4QWqijc8UcXJC25o54S8GQd4Mf2OA==}
9426 react-native-gesture-handler@3.2.1:
9427 resolution: {integrity: sha512-VEWscxUN29aeccbD2McF0LSXrwOhSdisaSRFiEWg0O/3WrVghNJp/tOtLrCgzb9gfcZ3xdA+K2Sp8F5G3iHx/Q==}
96379428 peerDependencies:
96389429 react: '*'
96399430 react-native: '*'
......@@ -9650,8 +9441,8 @@ packages:
96509441 react: '*'
96519442 react-native: '*'
96529443
9653 react-native-keyboard-controller@1.21.13:
9654 resolution: {integrity: sha512-FLr0MucraPyCGykRAcPM8Bv0JT5TcG1juQGMI+GLDuuaoOUKUY3SMUnRhHn7IgSM8KlxpcNQmMPNDmGpOw1OcA==}
9444 react-native-keyboard-controller@1.22.4:
9445 resolution: {integrity: sha512-2by3oJBQqKH9UAydlBeiEpivxIyTbt345bmverLym7vbEp4NXckWQLF0STnVuXYccRak5/sd3wMYDJPhv/9+3g==}
96559446 peerDependencies:
96569447 react: '*'
96579448 react-native: '*'
......@@ -9677,21 +9468,21 @@ packages:
96779468 react: '*'
96789469 react-native: '*'
96799470
9680 react-native-reanimated@4.5.5:
9681 resolution: {integrity: sha512-xtJXZRZ1vkec1AIUVG02St2sbyZS5jc7227TlDu/HonqUYPeZAfiC4RI2jqL1dVMNBu1+7oBx/c9QkjF2kg6Lg==}
9471 react-native-reanimated@4.7.0:
9472 resolution: {integrity: sha512-8TyTrPisqz7WzmbhCz8F60Uw7NI2QeYWrY5Hk58/kurCA5L5KuHmhyQjxeq5k2YalpXUAKbdkn/mAMZWm/fU0g==}
96829473 peerDependencies:
96839474 react: '*'
9684 react-native: 0.83 - 0.86
9685 react-native-worklets: 0.10.x - 0.11.x
9475 react-native: 0.86 - 0.88
9476 react-native-worklets: 0.13.x
96869477
9687 react-native-safe-area-context@5.7.0:
9688 resolution: {integrity: sha512-/9/MtQz8ODphjsLdZ+GZAIcC/RtoqW9EeShf7Uvnfgm/pzYrJ75y3PV/J1wuAV1T5Dye5ygq4EAW20RoBq0ABQ==}
9478 react-native-safe-area-context@5.9.1:
9479 resolution: {integrity: sha512-Zpx9Iwg6VhgNarWFpcIM61xK2lUbSfSXemQUmcvOVRpux49lJsUompY1S3E5jKUJbLq233qEpj28DgmXVsgZMQ==}
96899480 peerDependencies:
96909481 react: '*'
96919482 react-native: '*'
96929483
9693 react-native-screens@4.26.2:
9694 resolution: {integrity: sha512-2XnWsZToKj76trGtEZzx5ELD/qOICFEprEeUntImmitQFVUkea27fiWdUSITArI356Y1qynpXZINW+Unbhky/A==}
9484 react-native-screens@4.28.0:
9485 resolution: {integrity: sha512-0/79Z8RCibuaAHti+DJ2Dq0m6UFWh4+p1bH58K3cjiQ7IDWs5kU9tCAj4lXcJMHHonbF2mIE2BeaPSEvOpIiFg==}
96959486 peerDependencies:
96969487 react: '*'
96979488 react-native: '*'
......@@ -9702,8 +9493,8 @@ packages:
97029493 react: '*'
97039494 react-native: '*'
97049495
9705 react-native-svg@15.15.4:
9706 resolution: {integrity: sha512-boT/vIRgj6zZKBpfTPJJiYWMbZE9duBMOwPK6kCSTgxsS947IFMOq9OgIFkpWZTB7t229H24pDRkh3W9ZK/J1A==}
9496 react-native-svg@15.15.5:
9497 resolution: {integrity: sha512-L4go5jA+GWutdJ/JucuN20cjAbMg1HmMtAP+wZ+3JLCf6Jd0bhXQHxciRP/AQm/FlrIEZwkMcHNZP+FXAiic0w==}
97079498 peerDependencies:
97089499 react: '*'
97099500 react-native: '*'
......@@ -9713,39 +9504,28 @@ packages:
97139504 peerDependencies:
97149505 react-native: '*'
97159506
9716 react-native-webview@13.16.1:
9717 resolution: {integrity: sha512-If0eHhoEdOYDcHsX+xBFwHMbWBGK1BvGDQDQdVkwtSIXiq1uiqjkpWVP2uQ1as94J0CzvFE9PUNDuhiX0Z6ubw==}
9507 react-native-webview@14.0.1:
9508 resolution: {integrity: sha512-lBUuvFk459Mo+5vUNqwzGvn+I8rDJE6zvOulG2hWWudeEOJfWTsQwOfuYnRu+27djUIXrESFfC+EQE3PGu+FWA==}
97189509 peerDependencies:
97199510 react: '*'
97209511 react-native: '*'
97219512
9722 react-native-worklets@0.10.1:
9723 resolution: {integrity: sha512-62mRM19bDpfpdI8HLkEErcdOsrAPDtE9lA/sw+5lLRpzBHNhxaoj9QyY2KjXqUmirelxkX4zuPGTC3VdA0feJA==}
9724 peerDependencies:
9725 '@babel/core': '*'
9726 '@react-native/metro-config': '*'
9727 react: '*'
9728 react-native: 0.83 - 0.86
9729
9730 react-native-worklets@0.11.4:
9731 resolution: {integrity: sha512-yNiDDQAVvt1wacBhnrEMTBlQzZ8Y8Rg7Dbdxs/r595EXw4REsZGE5sY1Ug8SmlQUT+0L+fX7oY0SuCs0mjiA4w==}
9513 react-native-worklets@0.13.0:
9514 resolution: {integrity: sha512-1OrhAeAKaZF4XrBa4YbPQbKzNOpjh52HDlId8e6ete1OCHNdAlrQHzG4gznJ225EAj3dgQXHViJvK51M9B52jQ==}
97329515 peerDependencies:
97339516 '@babel/core': '*'
97349517 '@react-native/metro-config': '*'
97359518 react: '*'
9736 react-native: 0.83 - 0.86
9519 react-native: 0.86 - 0.88
97379520
9738 react-native@0.86.3:
9739 resolution: {integrity: sha512-JR5s3bM9ezud+Mw24GlNXNfthqPIKwrQgPPJcam+L97t2sKjjEavhCzBn+fyqZZRcM5+XlhYxpTxVkK7e1n38Q==}
9740 engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0}
9521 react-native@0.88.0-rc.3:
9522 resolution: {integrity: sha512-8gTeprAQP1j3B8lUJGZNmo33jH41Hmrd1Jm9PoOr7D/uImnifPqkagpFSKyK9fPJTWtwAK2TLDqTo+eFxlUcvA==}
9523 engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0}
97419524 hasBin: true
97429525 peerDependencies:
9743 '@react-native/jest-preset': 0.86.3
97449526 '@types/react': ^19.1.1
9745 react: ^19.2.3
9527 react: ^19.3.0
97469528 peerDependenciesMeta:
9747 '@react-native/jest-preset':
9748 optional: true
97499529 '@types/react':
97509530 optional: true
97519531
......@@ -9753,49 +9533,19 @@ packages:
97539533 resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==}
97549534 engines: {node: '>=0.10.0'}
97559535
9756 react-remove-scroll-bar@2.3.8:
9757 resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==}
9758 engines: {node: '>=10'}
9759 peerDependencies:
9760 '@types/react': '*'
9761 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
9762 peerDependenciesMeta:
9763 '@types/react':
9764 optional: true
9765
9766 react-remove-scroll@2.7.2:
9767 resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==}
9768 engines: {node: '>=10'}
9769 peerDependencies:
9770 '@types/react': '*'
9771 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
9772 peerDependenciesMeta:
9773 '@types/react':
9774 optional: true
9775
9776 react-style-singleton@2.2.3:
9777 resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==}
9778 engines: {node: '>=10'}
9779 peerDependencies:
9780 '@types/react': '*'
9781 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
9782 peerDependenciesMeta:
9783 '@types/react':
9784 optional: true
9785
97869536 react-test-renderer@19.2.6:
97879537 resolution: {integrity: sha512-GbS6V23YduFTPiWJ5xICbKEjRcqx1Z90js/V5miqhz7qp/d6xSe9Dd6NjSQODFRdzdsqRMPW82E/sFpPRbY5Mw==}
97889538 peerDependencies:
97899539 react: ^19.2.6
97909540
9791 react@19.2.3:
9792 resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==}
9793 engines: {node: '>=0.10.0'}
9794
97959541 react@19.2.6:
97969542 resolution: {integrity: sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==}
97979543 engines: {node: '>=0.10.0'}
97989544
9545 react@19.3.0:
9546 resolution: {integrity: sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==}
9547 engines: {node: '>=0.10.0'}
9548
97999549 read-binary-file-arch@1.0.6:
98009550 resolution: {integrity: sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==}
98019551 hasBin: true
......@@ -9994,6 +9744,9 @@ packages:
99949744 scheduler@0.27.0:
99959745 resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==}
99969746
9747 scheduler@0.28.0:
9748 resolution: {integrity: sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==}
9749
99979750 schema-utils@4.3.3:
99989751 resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==}
99999752 engines: {node: '>= 10.13.0'}
......@@ -10615,7 +10368,7 @@ packages:
1061510368 resolution: {integrity: sha512-e2mYlHrZzAQtZUf3STrfVDTetspv7p5vm/cu6p8kjLRQaL9r6QFG+MlwZ3hrI2LHnzgzjbSo+MwvoE380zz2JQ==}
1061610369 hasBin: true
1061710370 peerDependencies:
10618 '@expo/metro-config': 57.0.12
10371 '@expo/metro-config': 58.0.6
1061910372 metro: '*'
1062010373 metro-cache: '*'
1062110374 metro-transform-worker: '*'
......@@ -10723,31 +10476,11 @@ packages:
1072310476 uri-js@4.4.1:
1072410477 resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
1072510478
10726 use-callback-ref@1.3.3:
10727 resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==}
10728 engines: {node: '>=10'}
10729 peerDependencies:
10730 '@types/react': '*'
10731 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
10732 peerDependenciesMeta:
10733 '@types/react':
10734 optional: true
10735
1073610479 use-latest-callback@0.2.6:
1073710480 resolution: {integrity: sha512-FvRG9i1HSo0wagmX63Vrm8SnlUU3LMM3WyZkQ76RnslpBrX694AdG4A0zQBx2B3ZifFA0yv/BaEHGBnEax5rZg==}
1073810481 peerDependencies:
1073910482 react: '>=16.8'
1074010483
10741 use-sidecar@1.1.3:
10742 resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==}
10743 engines: {node: '>=10'}
10744 peerDependencies:
10745 '@types/react': '*'
10746 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
10747 peerDependenciesMeta:
10748 '@types/react':
10749 optional: true
10750
1075110484 use-sync-external-store@1.6.0:
1075210485 resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==}
1075310486 peerDependencies:
......@@ -10788,12 +10521,6 @@ packages:
1078810521 resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
1078910522 engines: {node: '>= 0.8'}
1079010523
10791 vaul@1.1.2:
10792 resolution: {integrity: sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==}
10793 peerDependencies:
10794 react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc
10795 react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc
10796
1079710524 vfile-location@5.0.3:
1079810525 resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==}
1079910526
......@@ -11007,8 +10734,8 @@ packages:
1100710734 resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==}
1100810735 engines: {node: '>=20'}
1100910736
11010 whatwg-url-minimum@0.1.2:
11011 resolution: {integrity: sha512-XPEm0XFQWNVG292lII1PrRRJl3sItrs7CettZ4ncYxuDVpLyy+NwlGyut2hXI0JswcJUxeCH+CyOJK0ZzAXD6A==}
10737 whatwg-url-minimum@0.2.0:
10738 resolution: {integrity: sha512-BtjXU1caNcCFfETP2DhqSeVPfRDl2MTUitI107RE34rJXjR/izfUtR5IoTFOK1WqjNLXbbeqaCH/mQAOLjpc8g==}
1101210739
1101310740 whatwg-url@14.2.0:
1101410741 resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==}
......@@ -11241,6 +10968,10 @@ packages:
1124110968
1124210969snapshots:
1124310970
10971 2g@0.4.4(typescript@7.0.2):
10972 optionalDependencies:
10973 typescript: 7.0.2
10974
1124410975 '@ai-sdk/provider-utils@4.0.49(zod@4.4.3)':
1124510976 dependencies:
1124610977 '@ai-sdk/provider': 3.0.15
......@@ -11285,9 +11016,9 @@ snapshots:
1128511016 chokidar: 5.0.0
1128611017 rolldown: 1.2.5
1128711018
11288 '@alchemy.run/sigil@0.0.0-alpha.11(@types/react@19.2.16)(react-devtools-core@6.1.5(bufferutil@4.1.0)(utf-8-validate@6.0.6))':
11019 '@alchemy.run/sigil@0.0.0-alpha.11(@types/react@19.3.0)(react-devtools-core@6.1.5(bufferutil@4.1.0)(utf-8-validate@6.0.6))':
1128911020 optionalDependencies:
11290 '@types/react': 19.2.16
11021 '@types/react': 19.3.0
1129111022 react-devtools-core: 6.1.5(bufferutil@4.1.0)(utf-8-validate@6.0.6)
1129211023
1129311024 '@anthropic-ai/claude-agent-sdk@0.3.276(@anthropic-ai/sdk@0.93.0(zod@4.6.5))(@modelcontextprotocol/sdk@1.29.0(zod@4.6.5))(zod@4.6.5)':
......@@ -11745,7 +11476,7 @@ snapshots:
1174511476 '@babel/helper-module-imports@7.29.7':
1174611477 dependencies:
1174711478 '@babel/traverse': 7.29.7
11748 '@babel/types': 7.29.7
11479 '@babel/types': 7.29.8
1174911480 transitivePeerDependencies:
1175011481 - supports-color
1175111482
......@@ -11810,7 +11541,7 @@ snapshots:
1181011541
1181111542 '@babel/parser@7.29.7':
1181211543 dependencies:
11813 '@babel/types': 7.29.7
11544 '@babel/types': 7.29.8
1181411545
1181511546 '@babel/parser@7.29.8':
1181611547 dependencies:
......@@ -12045,17 +11776,6 @@ snapshots:
1204511776 '@babel/core': 7.29.7
1204611777 '@babel/helper-plugin-utils': 7.29.7
1204711778
12048 '@babel/plugin-transform-react-jsx@7.28.6(@babel/core@7.29.7)':
12049 dependencies:
12050 '@babel/core': 7.29.7
12051 '@babel/helper-annotate-as-pure': 7.29.7
12052 '@babel/helper-module-imports': 7.29.7
12053 '@babel/helper-plugin-utils': 7.29.7
12054 '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7)
12055 '@babel/types': 7.29.7
12056 transitivePeerDependencies:
12057 - supports-color
12058
1205911779 '@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7)':
1206011780 dependencies:
1206111781 '@babel/core': 7.29.7
......@@ -12063,7 +11783,7 @@ snapshots:
1206311783 '@babel/helper-module-imports': 7.29.7
1206411784 '@babel/helper-plugin-utils': 7.29.7
1206511785 '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7)
12066 '@babel/types': 7.29.7
11786 '@babel/types': 7.29.8
1206711787 transitivePeerDependencies:
1206811788 - supports-color
1206911789
......@@ -12158,10 +11878,10 @@ snapshots:
1215811878 '@babel/helper-string-parser': 7.29.7
1215911879 '@babel/helper-validator-identifier': 7.29.7
1216011880
12161 '@base-ui/react@1.5.0(@date-fns/tz@1.5.0)(@types/react@19.2.16)(date-fns@4.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
11881 '@base-ui/react@1.5.0(@date-fns/tz@1.5.0)(@types/react@19.3.0)(date-fns@4.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
1216211882 dependencies:
1216311883 '@babel/runtime': 7.29.7
12164 '@base-ui/utils': 0.2.9(@types/react@19.2.16)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
11884 '@base-ui/utils': 0.2.9(@types/react@19.3.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
1216511885 '@floating-ui/react-dom': 2.1.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
1216611886 '@floating-ui/utils': 0.2.11
1216711887 react: 19.2.6
......@@ -12169,10 +11889,10 @@ snapshots:
1216911889 use-sync-external-store: 1.6.0(react@19.2.6)
1217011890 optionalDependencies:
1217111891 '@date-fns/tz': 1.5.0
12172 '@types/react': 19.2.16
11892 '@types/react': 19.3.0
1217311893 date-fns: 4.4.0
1217411894
12175 '@base-ui/utils@0.2.9(@types/react@19.2.16)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
11895 '@base-ui/utils@0.2.9(@types/react@19.3.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
1217611896 dependencies:
1217711897 '@babel/runtime': 7.29.7
1217811898 '@floating-ui/utils': 0.2.11
......@@ -12181,7 +11901,7 @@ snapshots:
1218111901 reselect: 5.2.0
1218211902 use-sync-external-store: 1.6.0(react@19.2.6)
1218311903 optionalDependencies:
12184 '@types/react': 19.2.16
11904 '@types/react': 19.3.0
1218511905
1218611906 '@blazediff/core@1.10.0': {}
1218711907
......@@ -12236,18 +11956,18 @@ snapshots:
1223611956 fast-wrap-ansi: 0.2.2
1223711957 sisteransi: 1.0.5
1223811958
12239 '@clerk/backend@3.18.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
11959 '@clerk/backend@3.18.1(react-dom@19.3.0(react@19.3.0))(react@19.2.6)':
1224011960 dependencies:
12241 '@clerk/shared': 4.33.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
11961 '@clerk/shared': 4.33.0(react-dom@19.3.0(react@19.3.0))(react@19.2.6)
1224211962 standardwebhooks: 1.0.0
1224311963 tslib: 2.8.1
1224411964 transitivePeerDependencies:
1224511965 - react
1224611966 - react-dom
1224711967
12248 '@clerk/clerk-js@6.32.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
11968 '@clerk/clerk-js@6.32.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
1224911969 dependencies:
12250 '@clerk/shared': 4.33.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
11970 '@clerk/shared': 4.33.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
1225111971 '@stripe/stripe-js': 5.6.0
1225211972 '@swc/helpers': 0.5.21
1225311973 '@tanstack/query-core': 5.102.8
......@@ -12262,9 +11982,26 @@ snapshots:
1226211982 - react
1226311983 - react-dom
1226411984
12265 '@clerk/clerk-js@6.32.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
11985 '@clerk/clerk-js@6.32.1(react-dom@19.3.0(react@19.3.0))(react@19.2.6)':
1226611986 dependencies:
12267 '@clerk/shared': 4.33.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
11987 '@clerk/shared': 4.33.0(react-dom@19.3.0(react@19.3.0))(react@19.2.6)
11988 '@stripe/stripe-js': 5.6.0
11989 '@swc/helpers': 0.5.21
11990 '@tanstack/query-core': 5.102.8
11991 '@zxcvbn-ts/core': 3.0.4
11992 '@zxcvbn-ts/language-common': 3.0.4
11993 alien-signals: 2.0.6
11994 browser-tabs-lock: 1.3.0
11995 core-js: 3.47.0
11996 crypto-js: 4.2.0
11997 dequal: 2.0.3
11998 transitivePeerDependencies:
11999 - react
12000 - react-dom
12001
12002 '@clerk/clerk-js@6.32.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
12003 dependencies:
12004 '@clerk/shared': 4.33.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
1226812005 '@stripe/stripe-js': 5.6.0
1226912006 '@swc/helpers': 0.5.21
1227012007 '@tanstack/query-core': 5.102.8
......@@ -12311,36 +12048,42 @@ snapshots:
1231112048 electron-store: 8.2.0
1231212049 react-dom: 19.2.6(react@19.2.6)
1231312050
12314 '@clerk/expo@4.6.8(patch_hash=a82bb41039ee88a290a87d4ab58be7be4c49fa338603b17ea646e1ec140a1cfb)(dbc31631339ce74330e188d5d7a88158)':
12051 '@clerk/electron@0.0.44(@clerk/electron-passkeys@0.0.3)(electron-store@8.2.0)(electron@44.4.2)(react-dom@19.3.0(react@19.3.0))(react@19.2.6)':
12052 dependencies:
12053 '@clerk/clerk-js': 6.32.1(react-dom@19.3.0(react@19.3.0))(react@19.2.6)
12054 '@clerk/react': 6.16.1(react-dom@19.3.0(react@19.3.0))(react@19.2.6)
12055 '@clerk/shared': 4.33.0(react-dom@19.3.0(react@19.3.0))(react@19.2.6)
12056 electron: 44.4.2
12057 react: 19.2.6
12058 tslib: 2.8.1
12059 optionalDependencies:
12060 '@clerk/electron-passkeys': 0.0.3
12061 electron-store: 8.2.0
12062 react-dom: 19.3.0(react@19.3.0)
12063
12064 '@clerk/expo@4.6.8(patch_hash=b8b22ab733de5bea846ad9e88046c10582352fe9ad86f314f368b2a823f0f281)(950bb7335d61b76ffb649f136fc0d4df)':
1231512065 dependencies:
12316 '@clerk/clerk-js': 6.32.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
12317 '@clerk/react': 6.16.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
12318 '@clerk/shared': 4.33.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
12319 '@expo/config-plugins': 57.0.9(typescript@7.0.2)
12066 '@clerk/clerk-js': 6.32.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
12067 '@clerk/react': 6.16.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
12068 '@clerk/shared': 4.33.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
12069 '@expo/config-plugins': 58.0.4(typescript@7.0.2)
1232012070 base-64: 1.0.0
12321 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
12322 react: 19.2.3
12323 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
12324 react-native-url-polyfill: 4.0.0(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
12071 expo: 58.0.0(3abfa3879936d948a635873738556226)
12072 react: 19.3.0
12073 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
12074 react-native-url-polyfill: 4.0.0(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))
1232512075 tslib: 2.8.1
1232612076 optionalDependencies:
12327 expo-auth-session: 57.0.10(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
12328 expo-constants: 57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
12329 expo-crypto: 57.0.2(expo@57.0.18)
12330 expo-secure-store: 57.0.2(expo@57.0.18)
12331 expo-web-browser: 57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
12332 react-dom: 19.2.3(react@19.2.3)
12077 expo-auth-session: 58.0.6(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2)
12078 expo-constants: 58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(typescript@7.0.2)
12079 expo-crypto: 58.0.3(expo@58.0.0)
12080 expo-secure-store: 58.0.1(expo@58.0.0)
12081 expo-web-browser: 58.0.3(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))
12082 react-dom: 19.3.0(react@19.3.0)
1233312083 transitivePeerDependencies:
1233412084 - supports-color
1233512085 - typescript
1233612086
12337 '@clerk/react@6.16.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
12338 dependencies:
12339 '@clerk/shared': 4.33.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
12340 react: 19.2.3
12341 react-dom: 19.2.3(react@19.2.3)
12342 tslib: 2.8.1
12343
1234412087 '@clerk/react@6.16.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
1234512088 dependencies:
1234612089 '@clerk/shared': 4.33.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
......@@ -12348,17 +12091,31 @@ snapshots:
1234812091 react-dom: 19.2.6(react@19.2.6)
1234912092 tslib: 2.8.1
1235012093
12351 '@clerk/shared@4.33.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
12094 '@clerk/react@6.16.1(react-dom@19.3.0(react@19.3.0))(react@19.2.6)':
12095 dependencies:
12096 '@clerk/shared': 4.33.0(react-dom@19.3.0(react@19.3.0))(react@19.2.6)
12097 react: 19.2.6
12098 react-dom: 19.3.0(react@19.3.0)
12099 tslib: 2.8.1
12100
12101 '@clerk/react@6.16.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
12102 dependencies:
12103 '@clerk/shared': 4.33.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
12104 react: 19.3.0
12105 react-dom: 19.3.0(react@19.3.0)
12106 tslib: 2.8.1
12107
12108 '@clerk/shared@4.33.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
1235212109 dependencies:
1235312110 '@tanstack/query-core': 5.102.8
1235412111 dequal: 2.0.3
1235512112 glob-to-regexp: 0.4.1
1235612113 js-cookie: 3.0.8
1235712114 optionalDependencies:
12358 react: 19.2.3
12359 react-dom: 19.2.3(react@19.2.3)
12115 react: 19.2.6
12116 react-dom: 19.2.6(react@19.2.6)
1236012117
12361 '@clerk/shared@4.33.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
12118 '@clerk/shared@4.33.0(react-dom@19.3.0(react@19.3.0))(react@19.2.6)':
1236212119 dependencies:
1236312120 '@tanstack/query-core': 5.102.8
1236412121 dequal: 2.0.3
......@@ -12366,7 +12123,17 @@ snapshots:
1236612123 js-cookie: 3.0.8
1236712124 optionalDependencies:
1236812125 react: 19.2.6
12369 react-dom: 19.2.6(react@19.2.6)
12126 react-dom: 19.3.0(react@19.3.0)
12127
12128 '@clerk/shared@4.33.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
12129 dependencies:
12130 '@tanstack/query-core': 5.102.8
12131 dequal: 2.0.3
12132 glob-to-regexp: 0.4.1
12133 js-cookie: 3.0.8
12134 optionalDependencies:
12135 react: 19.3.0
12136 react-dom: 19.3.0(react@19.3.0)
1237012137
1237112138 '@cloudflare/unenv-preset@2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260901.1)':
1237212139 dependencies:
......@@ -12446,12 +12213,12 @@ snapshots:
1244612213
1244712214 '@date-fns/tz@1.5.0': {}
1244812215
12449 '@daypicker/react@10.0.1(@types/react@19.2.16)(react@19.2.6)':
12216 '@daypicker/react@10.0.1(@types/react@19.3.0)(react@19.2.6)':
1245012217 dependencies:
1245112218 react: 19.2.6
12452 react-day-picker: 10.0.1(@types/react@19.2.16)(react@19.2.6)
12219 react-day-picker: 10.0.1(@types/react@19.3.0)(react@19.2.6)
1245312220 optionalDependencies:
12454 '@types/react': 19.2.16
12221 '@types/react': 19.3.0
1245512222
1245612223 '@dimforge/rapier3d-compat@0.12.0': {}
1245712224
......@@ -12549,16 +12316,16 @@ snapshots:
1254912316
1255012317 '@drizzle-team/brocli@0.12.0': {}
1255112318
12552 '@effect/atom-react@4.0.0-rc.115(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))(react@19.2.3)(scheduler@0.27.0)':
12319 '@effect/atom-react@4.0.0-rc.115(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))(react@19.2.6)(scheduler@0.27.0)':
1255312320 dependencies:
1255412321 effect: 4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)
12555 react: 19.2.3
12322 react: 19.2.6
1255612323 scheduler: 0.27.0
1255712324
12558 '@effect/atom-react@4.0.0-rc.115(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))(react@19.2.6)(scheduler@0.27.0)':
12325 '@effect/atom-react@4.0.0-rc.115(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))(react@19.3.0)(scheduler@0.27.0)':
1255912326 dependencies:
1256012327 effect: 4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)
12561 react: 19.2.6
12328 react: 19.3.0
1256212329 scheduler: 0.27.0
1256312330
1256412331 '@effect/openapi-generator@4.0.0-rc.115(@effect/platform-node@4.0.0-rc.115(bufferutil@4.1.0)(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))(redis@6.2.1)(utf-8-validate@6.0.6))(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))(encoding@0.1.13)':
......@@ -12641,10 +12408,6 @@ snapshots:
1264112408 dependencies:
1264212409 effect: 4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)
1264312410
12644 '@egjs/hammerjs@2.0.17':
12645 dependencies:
12646 '@types/hammerjs': 2.0.46
12647
1264812411 '@electric-sql/pglite@0.3.15':
1264912412 optional: true
1265012413
......@@ -12999,110 +12762,36 @@ snapshots:
1299912762
1300012763 '@expo-google-fonts/material-symbols@0.4.38': {}
1300112764
13002 '@expo/cli@57.0.20(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.14)(bufferutil@4.1.0)(expo-constants@57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)))(expo-font@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(expo@57.0.18)(react-dom@19.2.3(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@7.0.2)(utf-8-validate@6.0.6)':
13003 dependencies:
13004 '@expo/code-signing-certificates': 0.0.6
13005 '@expo/config': 57.0.9(typescript@7.0.2)
13006 '@expo/config-plugins': 57.0.9(typescript@7.0.2)
13007 '@expo/devcert': 1.2.1
13008 '@expo/env': 2.4.3
13009 '@expo/image-utils': 0.11.5(typescript@7.0.2)
13010 '@expo/inline-modules': 0.1.7(typescript@7.0.2)
13011 '@expo/json-file': 11.0.1
13012 '@expo/log-box': 57.0.4(@expo/dom-webview@57.0.1)(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
13013 '@expo/metro': 56.0.2(bufferutil@4.1.0)(utf-8-validate@6.0.6)
13014 '@expo/metro-config': 57.0.12(patch_hash=96f1a75347e6ea02dc4b7034ace815d8ee39e18b8166ebfb573d9e58328f0dc2)(bufferutil@4.1.0)(expo@57.0.18)(typescript@7.0.2)(utf-8-validate@6.0.6)
13015 '@expo/metro-file-map': 57.0.2
13016 '@expo/osascript': 2.7.1
13017 '@expo/package-manager': 1.13.1
13018 '@expo/plist': 0.8.1
13019 '@expo/prebuild-config': 57.0.15(typescript@7.0.2)
13020 '@expo/require-utils': 57.0.5(typescript@7.0.2)
13021 '@expo/router-server': 57.0.8(@expo/metro-runtime@57.0.14)(expo-constants@57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)))(expo-font@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(expo-server@57.0.3)(expo@57.0.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
13022 '@expo/schema-utils': 57.0.2
13023 '@expo/spawn-async': 1.8.0
13024 '@expo/ws-tunnel': 2.0.0(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))
13025 '@expo/xcpretty': 4.4.4
13026 '@react-native/dev-middleware': 0.86.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)
13027 accepts: 1.3.8
13028 agent-cli-detector: 0.1.6
13029 arg: 5.0.2
13030 bplist-creator: 0.1.0
13031 bplist-parser: 0.3.2
13032 chalk: 4.1.2
13033 ci-info: 3.9.0
13034 compression: 1.8.1
13035 connect: 3.7.0
13036 debug: 4.4.3
13037 dnssd-advertise: 1.1.4
13038 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
13039 expo-server: 57.0.3
13040 fetch-nodeshim: 0.4.10
13041 getenv: 2.0.0
13042 glob: 13.0.6
13043 lan-network: 0.2.1
13044 multitars: 1.0.2
13045 node-forge: 1.4.0
13046 npm-package-arg: 11.0.3
13047 ora: 3.4.0
13048 picomatch: 4.0.7
13049 pretty-format: 29.7.0
13050 progress: 2.0.3
13051 prompts: 2.4.2
13052 resolve-from: 5.0.0
13053 sandbox-cli-detector: 0.2.0
13054 semver: 7.8.5
13055 send: 0.19.2
13056 slugify: 1.6.9
13057 stacktrace-parser: 0.1.11
13058 structured-headers: 0.4.1
13059 terminal-link: 2.1.1
13060 toqr: 0.1.1
13061 wrap-ansi: 7.0.0
13062 ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)
13063 zod: 3.25.76
13064 optionalDependencies:
13065 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
13066 transitivePeerDependencies:
13067 - '@expo/dom-webview'
13068 - '@expo/metro-runtime'
13069 - bufferutil
13070 - expo-constants
13071 - expo-font
13072 - react
13073 - react-dom
13074 - react-server-dom-webpack
13075 - supports-color
13076 - typescript
13077 - utf-8-validate
13078
13079 '@expo/cli@57.0.20(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.14)(bufferutil@4.1.0)(expo-constants@57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)))(expo-font@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(expo@57.0.18)(react-dom@19.2.6(react@19.2.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)(typescript@7.0.2)(utf-8-validate@6.0.6)':
12765 '@expo/cli@58.0.9(@expo/dom-webview@58.0.2)(@expo/metro-runtime@58.0.9)(bufferutil@4.1.0)(expo-constants@58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(typescript@7.0.2))(expo-font@58.0.4(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(expo@58.0.0)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2)(utf-8-validate@6.0.6)':
1308012766 dependencies:
12767 2g: 0.4.4(typescript@7.0.2)
1308112768 '@expo/code-signing-certificates': 0.0.6
13082 '@expo/config': 57.0.9(typescript@7.0.2)
13083 '@expo/config-plugins': 57.0.9(typescript@7.0.2)
12769 '@expo/config': 58.0.1(typescript@7.0.2)
12770 '@expo/config-plugins': 58.0.4(typescript@7.0.2)
1308412771 '@expo/devcert': 1.2.1
13085 '@expo/env': 2.4.3
13086 '@expo/image-utils': 0.11.5(typescript@7.0.2)
13087 '@expo/inline-modules': 0.1.7(typescript@7.0.2)
13088 '@expo/json-file': 11.0.1
13089 '@expo/log-box': 57.0.4(@expo/dom-webview@57.0.1)(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
13090 '@expo/metro': 56.0.2(bufferutil@4.1.0)(utf-8-validate@6.0.6)
13091 '@expo/metro-config': 57.0.12(patch_hash=96f1a75347e6ea02dc4b7034ace815d8ee39e18b8166ebfb573d9e58328f0dc2)(bufferutil@4.1.0)(expo@57.0.18)(typescript@7.0.2)(utf-8-validate@6.0.6)
13092 '@expo/metro-file-map': 57.0.2
13093 '@expo/osascript': 2.7.1
13094 '@expo/package-manager': 1.13.1
13095 '@expo/plist': 0.8.1
13096 '@expo/prebuild-config': 57.0.15(typescript@7.0.2)
13097 '@expo/require-utils': 57.0.5(typescript@7.0.2)
13098 '@expo/router-server': 57.0.8(@expo/metro-runtime@57.0.14)(expo-constants@57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)))(expo-font@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(expo-server@57.0.3)(expo@57.0.18)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
13099 '@expo/schema-utils': 57.0.2
12772 '@expo/env': 2.5.1
12773 '@expo/image-utils': 0.12.2(typescript@7.0.2)
12774 '@expo/inline-modules': 0.2.1(typescript@7.0.2)
12775 '@expo/json-file': 11.2.1
12776 '@expo/log-box': 58.0.7(@expo/dom-webview@58.0.2)(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
12777 '@expo/log-box-utils': 58.0.1
12778 '@expo/metro': 58.0.0-rc.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)
12779 '@expo/metro-config': 58.0.6(patch_hash=90fa980e8b6480631fb2fbb04559834e3c612db40c550cd828f11be297d8d760)(bufferutil@4.1.0)(expo@58.0.0)(typescript@7.0.2)(utf-8-validate@6.0.6)
12780 '@expo/metro-file-map': 58.0.3(typescript@7.0.2)
12781 '@expo/osascript': 2.8.1
12782 '@expo/package-manager': 1.14.1
12783 '@expo/plist': 0.10.1
12784 '@expo/prebuild-config': 58.0.6(typescript@7.0.2)
12785 '@expo/require-utils': 58.0.2(typescript@7.0.2)
12786 '@expo/router-server': 58.0.4(@expo/metro-runtime@58.0.9)(expo-constants@58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(typescript@7.0.2))(expo-font@58.0.4(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(expo-server@58.0.2)(expo@58.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
12787 '@expo/schema-utils': 58.0.1
1310012788 '@expo/spawn-async': 1.8.0
1310112789 '@expo/ws-tunnel': 2.0.0(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))
1310212790 '@expo/xcpretty': 4.4.4
13103 '@react-native/dev-middleware': 0.86.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)
12791 '@react-native/dev-middleware': 0.88.0-rc.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)
12792 '@react-native/js-polyfills': 0.88.0-rc.3
1310412793 accepts: 1.3.8
13105 agent-cli-detector: 0.1.6
12794 agent-cli-detector: 0.1.7
1310612795 arg: 5.0.2
1310712796 bplist-creator: 0.1.0
1310812797 bplist-parser: 0.3.2
......@@ -13110,10 +12799,9 @@ snapshots:
1311012799 ci-info: 3.9.0
1311112800 compression: 1.8.1
1311212801 connect: 3.7.0
13113 debug: 4.4.3
13114 dnssd-advertise: 1.1.4
13115 expo: 57.0.18(0bf40d5ad6281d8f1e92517b24812edb)
13116 expo-server: 57.0.3
12802 dnssd-advertise: 1.1.6
12803 expo: 58.0.0(3abfa3879936d948a635873738556226)
12804 expo-server: 58.0.2
1311712805 fetch-nodeshim: 0.4.10
1311812806 getenv: 2.0.0
1311912807 glob: 13.0.6
......@@ -13139,7 +12827,7 @@ snapshots:
1313912827 ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)
1314012828 zod: 3.25.76
1314112829 optionalDependencies:
13142 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)
12830 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1314312831 transitivePeerDependencies:
1314412832 - '@expo/dom-webview'
1314512833 - '@expo/metro-runtime'
......@@ -13152,18 +12840,17 @@ snapshots:
1315212840 - supports-color
1315312841 - typescript
1315412842 - utf-8-validate
13155 optional: true
1315612843
1315712844 '@expo/code-signing-certificates@0.0.6':
1315812845 dependencies:
1315912846 node-forge: 1.4.0
1316012847
13161 '@expo/config-plugins@57.0.9(typescript@7.0.2)':
12848 '@expo/config-plugins@58.0.4(typescript@7.0.2)':
1316212849 dependencies:
13163 '@expo/config-types': 57.0.2
13164 '@expo/json-file': 11.0.1
13165 '@expo/plist': 0.8.1
13166 '@expo/require-utils': 57.0.5(typescript@7.0.2)
12850 '@expo/config-types': 58.0.2
12851 '@expo/json-file': 11.2.1
12852 '@expo/plist': 0.10.1
12853 '@expo/require-utils': 58.0.2(typescript@7.0.2)
1316712854 '@expo/sdk-runtime-versions': 1.0.0
1316812855 chalk: 4.1.2
1316912856 debug: 4.4.3
......@@ -13177,14 +12864,14 @@ snapshots:
1317712864 - supports-color
1317812865 - typescript
1317912866
13180 '@expo/config-types@57.0.2': {}
12867 '@expo/config-types@58.0.2': {}
1318112868
13182 '@expo/config@57.0.9(typescript@7.0.2)':
12869 '@expo/config@58.0.1(typescript@7.0.2)':
1318312870 dependencies:
13184 '@expo/config-plugins': 57.0.9(typescript@7.0.2)
13185 '@expo/config-types': 57.0.2
13186 '@expo/json-file': 11.0.1
13187 '@expo/require-utils': 57.0.5(typescript@7.0.2)
12871 '@expo/config-plugins': 58.0.4(typescript@7.0.2)
12872 '@expo/config-types': 58.0.2
12873 '@expo/json-file': 11.2.1
12874 '@expo/require-utils': 58.0.2(typescript@7.0.2)
1318812875 deepmerge: 4.3.1
1318912876 getenv: 2.0.0
1319012877 glob: 13.0.6
......@@ -13202,35 +12889,21 @@ snapshots:
1320212889 transitivePeerDependencies:
1320312890 - supports-color
1320412891
13205 '@expo/devtools@57.0.1(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':
12892 '@expo/devtools@58.0.2(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)':
1320612893 dependencies:
1320712894 chalk: 4.1.2
1320812895 optionalDependencies:
13209 react: 19.2.3
13210 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
13211
13212 '@expo/devtools@57.0.1(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)':
13213 dependencies:
13214 chalk: 4.1.2
13215 optionalDependencies:
13216 react: 19.2.6
13217 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)
13218 optional: true
13219
13220 '@expo/dom-webview@57.0.1(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':
13221 dependencies:
13222 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
13223 react: 19.2.3
13224 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
12896 expo: 58.0.0(3abfa3879936d948a635873738556226)
12897 react: 19.3.0
12898 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1322512899
13226 '@expo/dom-webview@57.0.1(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)':
12900 '@expo/dom-webview@58.0.2(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)':
1322712901 dependencies:
13228 expo: 57.0.18(0bf40d5ad6281d8f1e92517b24812edb)
13229 react: 19.2.6
13230 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)
13231 optional: true
12902 expo: 58.0.0(3abfa3879936d948a635873738556226)
12903 react: 19.3.0
12904 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1323212905
13233 '@expo/env@2.4.3':
12906 '@expo/env@2.5.1':
1323412907 dependencies:
1323512908 chalk: 4.1.2
1323612909 debug: 4.4.3
......@@ -13238,11 +12911,9 @@ snapshots:
1323812911 transitivePeerDependencies:
1323912912 - supports-color
1324012913
13241 '@expo/expo-modules-macros-plugin@0.6.1': {}
13242
13243 '@expo/fingerprint@0.20.11':
12914 '@expo/fingerprint@0.21.2':
1324412915 dependencies:
13245 '@expo/env': 2.4.3
12916 '@expo/env': 2.5.1
1324612917 '@expo/spawn-async': 1.8.0
1324712918 arg: 5.0.2
1324812919 chalk: 4.1.2
......@@ -13256,9 +12927,9 @@ snapshots:
1325612927 transitivePeerDependencies:
1325712928 - supports-color
1325812929
13259 '@expo/image-utils@0.11.5(typescript@7.0.2)':
12930 '@expo/image-utils@0.12.2(typescript@7.0.2)':
1326012931 dependencies:
13261 '@expo/require-utils': 57.0.5(typescript@7.0.2)
12932 '@expo/require-utils': 58.0.2(typescript@7.0.2)
1326212933 '@expo/spawn-async': 1.8.0
1326312934 chalk: 4.1.2
1326412935 getenv: 2.0.0
......@@ -13282,59 +12953,56 @@ snapshots:
1328212953 - supports-color
1328312954 - typescript
1328412955
13285 '@expo/inline-modules@0.1.7(typescript@7.0.2)':
12956 '@expo/inline-modules@0.2.1(typescript@7.0.2)':
1328612957 dependencies:
13287 '@expo/config-plugins': 57.0.9(typescript@7.0.2)
12958 '@expo/config-plugins': 58.0.4(typescript@7.0.2)
1328812959 transitivePeerDependencies:
1328912960 - supports-color
1329012961 - typescript
1329112962
13292 '@expo/json-file@11.0.1':
12963 '@expo/json-file@11.2.1':
1329312964 dependencies:
1329412965 '@babel/code-frame': 7.29.7
1329512966 json5: 2.2.3
1329612967
13297 '@expo/local-build-cache-provider@57.0.8(typescript@7.0.2)':
12968 '@expo/local-build-cache-provider@58.0.1(typescript@7.0.2)':
1329812969 dependencies:
13299 '@expo/config': 57.0.9(typescript@7.0.2)
12970 '@expo/config': 58.0.1(typescript@7.0.2)
1330012971 chalk: 4.1.2
1330112972 transitivePeerDependencies:
1330212973 - supports-color
1330312974 - typescript
1330412975
13305 '@expo/log-box@57.0.4(@expo/dom-webview@57.0.1)(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':
13306 dependencies:
13307 '@expo/dom-webview': 57.0.1(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
13308 anser: 1.4.10
13309 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
13310 react: 19.2.3
13311 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
13312 stacktrace-parser: 0.1.11
12976 '@expo/log-box-utils@58.0.1': {}
1331312977
13314 '@expo/log-box@57.0.4(@expo/dom-webview@57.0.1)(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)':
12978 '@expo/log-box@58.0.7(@expo/dom-webview@58.0.2)(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)':
1331512979 dependencies:
13316 '@expo/dom-webview': 57.0.1(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
12980 '@expo/dom-webview': 58.0.2(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
12981 '@expo/log-box-utils': 58.0.1
1331712982 anser: 1.4.10
13318 expo: 57.0.18(0bf40d5ad6281d8f1e92517b24812edb)
13319 react: 19.2.6
13320 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)
12983 react: 19.3.0
12984 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1332112985 stacktrace-parser: 0.1.11
13322 optional: true
12986 optionalDependencies:
12987 expo: 58.0.0(3abfa3879936d948a635873738556226)
1332312988
13324 '@expo/metro-config@57.0.12(patch_hash=96f1a75347e6ea02dc4b7034ace815d8ee39e18b8166ebfb573d9e58328f0dc2)(bufferutil@4.1.0)(expo@57.0.18)(typescript@7.0.2)(utf-8-validate@6.0.6)':
12989 '@expo/metro-config@58.0.6(patch_hash=90fa980e8b6480631fb2fbb04559834e3c612db40c550cd828f11be297d8d760)(bufferutil@4.1.0)(expo@58.0.0)(typescript@7.0.2)(utf-8-validate@6.0.6)':
1332512990 dependencies:
12991 2g: 0.4.4(typescript@7.0.2)
1332612992 '@babel/code-frame': 7.29.7
1332712993 '@babel/core': 7.29.7
1332812994 '@babel/generator': 7.29.7
13329 '@expo/config': 57.0.9(typescript@7.0.2)
13330 '@expo/env': 2.4.3
13331 '@expo/json-file': 11.0.1
13332 '@expo/metro': 56.0.2(bufferutil@4.1.0)(utf-8-validate@6.0.6)
13333 '@expo/require-utils': 57.0.5(typescript@7.0.2)
12995 '@expo/config': 58.0.1(typescript@7.0.2)
12996 '@expo/env': 2.5.1
12997 '@expo/json-file': 11.2.1
12998 '@expo/metro': 58.0.0-rc.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)
12999 '@expo/require-utils': 58.0.2(typescript@7.0.2)
1333413000 '@expo/spawn-async': 1.8.0
1333513001 '@jridgewell/gen-mapping': 0.3.13
1333613002 '@jridgewell/remapping': 2.3.5
1333713003 '@jridgewell/sourcemap-codec': 1.6.0
13004 '@jridgewell/trace-mapping': 0.3.31
13005 '@react-native/js-polyfills': 0.88.0-rc.3
1333813006 browserslist: 4.29.0
1333913007 chalk: 4.1.2
1334013008 debug: 4.4.3
......@@ -13343,19 +13011,21 @@ snapshots:
1334313011 hermes-parser: 0.36.1
1334413012 jsc-safe-url: 0.2.4
1334513013 lightningcss: 1.33.0
13014 noxcturnal: 0.1.1
1334613015 picomatch: 4.0.7
1334713016 postcss: 8.5.28
1334813017 resolve-from: 5.0.0
1334913018 optionalDependencies:
13350 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
13019 expo: 58.0.0(3abfa3879936d948a635873738556226)
1335113020 transitivePeerDependencies:
1335213021 - bufferutil
1335313022 - supports-color
1335413023 - typescript
1335513024 - utf-8-validate
1335613025
13357 '@expo/metro-file-map@57.0.2':
13026 '@expo/metro-file-map@58.0.3(typescript@7.0.2)':
1335813027 dependencies:
13028 2g: 0.4.4(typescript@7.0.2)
1335913029 debug: 4.4.3
1336013030 fb-watchman: 2.0.2
1336113031 invariant: 2.2.4
......@@ -13364,85 +13034,71 @@ snapshots:
1336413034 walker: 1.0.8
1336513035 transitivePeerDependencies:
1336613036 - supports-color
13037 - typescript
1336713038
13368 '@expo/metro-runtime@57.0.14(@expo/log-box@57.0.4)(expo@57.0.18)(react-dom@19.2.3(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':
13369 dependencies:
13370 '@expo/log-box': 57.0.4(@expo/dom-webview@57.0.1)(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
13371 anser: 1.4.10
13372 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
13373 pretty-format: 29.7.0
13374 react: 19.2.3
13375 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
13376 stacktrace-parser: 0.1.11
13377 whatwg-fetch: 3.6.20
13378 optionalDependencies:
13379 react-dom: 19.2.3(react@19.2.3)
13380 optional: true
13381
13382 '@expo/metro-runtime@57.0.14(@expo/log-box@57.0.4)(expo@57.0.18)(react-dom@19.2.6(react@19.2.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)':
13039 '@expo/metro-runtime@58.0.9(@expo/log-box@58.0.7)(expo@58.0.0)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)':
1338313040 dependencies:
13384 '@expo/log-box': 57.0.4(@expo/dom-webview@57.0.1)(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
13041 '@expo/log-box': 58.0.7(@expo/dom-webview@58.0.2)(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
1338513042 anser: 1.4.10
13386 expo: 57.0.18(0bf40d5ad6281d8f1e92517b24812edb)
13043 expo: 58.0.0(3abfa3879936d948a635873738556226)
1338713044 pretty-format: 29.7.0
13388 react: 19.2.6
13389 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)
13045 react: 19.3.0
13046 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1339013047 stacktrace-parser: 0.1.11
1339113048 whatwg-fetch: 3.6.20
1339213049 optionalDependencies:
13393 react-dom: 19.2.6(react@19.2.6)
13394 optional: true
13395
13396 '@expo/metro@56.0.2(bufferutil@4.1.0)(utf-8-validate@6.0.6)':
13397 dependencies:
13398 metro: 0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6)
13399 metro-babel-transformer: 0.84.5
13400 metro-cache: 0.84.5
13401 metro-cache-key: 0.84.5
13402 metro-config: 0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6)
13403 metro-core: 0.84.5
13404 metro-file-map: 0.84.5
13405 metro-minify-terser: 0.84.5
13406 metro-resolver: 0.84.5
13407 metro-runtime: 0.84.5
13408 metro-source-map: 0.84.5
13409 metro-symbolicate: 0.84.5
13410 metro-transform-plugins: 0.84.5
13411 metro-transform-worker: 0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6)
13050 react-dom: 19.3.0(react@19.3.0)
13051
13052 '@expo/metro@58.0.0-rc.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)':
13053 dependencies:
13054 metro: 0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)
13055 metro-babel-transformer: 0.87.1
13056 metro-cache: 0.87.1
13057 metro-cache-key: 0.87.1
13058 metro-config: 0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)
13059 metro-core: 0.87.1
13060 metro-file-map: 0.87.1
13061 metro-minify-terser: 0.87.1
13062 metro-resolver: 0.87.1
13063 metro-runtime: 0.87.1
13064 metro-source-map: 0.87.1
13065 metro-symbolicate: 0.87.1
13066 metro-transform-plugins: 0.87.1
13067 metro-transform-worker: 0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)
1341213068 transitivePeerDependencies:
1341313069 - bufferutil
1341413070 - supports-color
1341513071 - utf-8-validate
1341613072
13417 '@expo/osascript@2.7.1':
13073 '@expo/osascript@2.8.1':
1341813074 dependencies:
1341913075 '@expo/spawn-async': 1.8.0
1342013076
13421 '@expo/package-manager@1.13.1':
13077 '@expo/package-manager@1.14.1':
1342213078 dependencies:
13423 '@expo/json-file': 11.0.1
13079 '@expo/json-file': 11.2.1
1342413080 '@expo/spawn-async': 1.8.0
1342513081 chalk: 4.1.2
1342613082 npm-package-arg: 11.0.3
1342713083 ora: 3.4.0
1342813084 resolve-workspace-root: 2.0.1
1342913085
13430 '@expo/plist@0.8.1':
13086 '@expo/plist@0.10.1':
1343113087 dependencies:
1343213088 '@xmldom/xmldom': 0.8.15
1343313089 base64-js: 1.5.1
1343413090 xmlbuilder: 15.1.1
1343513091
13436 '@expo/prebuild-config@57.0.15(typescript@7.0.2)':
13092 '@expo/prebuild-config@58.0.6(typescript@7.0.2)':
1343713093 dependencies:
13438 '@expo/config': 57.0.9(typescript@7.0.2)
13439 '@expo/config-plugins': 57.0.9(typescript@7.0.2)
13440 '@expo/config-types': 57.0.2
13441 '@expo/image-utils': 0.11.5(typescript@7.0.2)
13442 '@expo/json-file': 11.0.1
13443 '@react-native/normalize-colors': 0.86.3
13094 '@expo/config': 58.0.1(typescript@7.0.2)
13095 '@expo/config-plugins': 58.0.4(typescript@7.0.2)
13096 '@expo/config-types': 58.0.2
13097 '@expo/image-utils': 0.12.2(typescript@7.0.2)
13098 '@expo/json-file': 11.2.1
13099 '@react-native/normalize-colors': 0.88.0-rc.3
1344413100 debug: 4.4.3
13445 expo-modules-autolinking: 57.0.12(typescript@7.0.2)
13101 expo-modules-autolinking: 58.0.6(typescript@7.0.2)
1344613102 resolve-from: 5.0.0
1344713103 semver: 7.8.5
1344813104 transitivePeerDependencies:
......@@ -13459,7 +13115,7 @@ snapshots:
1345913115 transitivePeerDependencies:
1346013116 - supports-color
1346113117
13462 '@expo/require-utils@57.0.5(typescript@7.0.2)':
13118 '@expo/require-utils@58.0.2(typescript@7.0.2)':
1346313119 dependencies:
1346413120 '@babel/code-frame': 7.29.7
1346513121 '@babel/core': 7.29.7
......@@ -13469,36 +13125,21 @@ snapshots:
1346913125 transitivePeerDependencies:
1347013126 - supports-color
1347113127
13472 '@expo/router-server@57.0.8(@expo/metro-runtime@57.0.14)(expo-constants@57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)))(expo-font@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(expo-server@57.0.3)(expo@57.0.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
13473 dependencies:
13474 debug: 4.4.3
13475 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
13476 expo-constants: 57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
13477 expo-font: 57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
13478 expo-server: 57.0.3
13479 react: 19.2.3
13480 optionalDependencies:
13481 '@expo/metro-runtime': 57.0.14(@expo/log-box@57.0.4)(expo@57.0.18)(react-dom@19.2.3(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
13482 react-dom: 19.2.3(react@19.2.3)
13483 transitivePeerDependencies:
13484 - supports-color
13485
13486 '@expo/router-server@57.0.8(@expo/metro-runtime@57.0.14)(expo-constants@57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)))(expo-font@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(expo-server@57.0.3)(expo@57.0.18)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
13128 '@expo/router-server@58.0.4(@expo/metro-runtime@58.0.9)(expo-constants@58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(typescript@7.0.2))(expo-font@58.0.4(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(expo-server@58.0.2)(expo@58.0.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
1348713129 dependencies:
1348813130 debug: 4.4.3
13489 expo: 57.0.18(0bf40d5ad6281d8f1e92517b24812edb)
13490 expo-constants: 57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))
13491 expo-font: 57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
13492 expo-server: 57.0.3
13493 react: 19.2.6
13131 expo: 58.0.0(3abfa3879936d948a635873738556226)
13132 expo-constants: 58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(typescript@7.0.2)
13133 expo-font: 58.0.4(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
13134 expo-server: 58.0.2
13135 react: 19.3.0
1349413136 optionalDependencies:
13495 '@expo/metro-runtime': 57.0.14(@expo/log-box@57.0.4)(expo@57.0.18)(react-dom@19.2.6(react@19.2.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
13496 react-dom: 19.2.6(react@19.2.6)
13137 '@expo/metro-runtime': 58.0.9(@expo/log-box@58.0.7)(expo@58.0.0)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
13138 react-dom: 19.3.0(react@19.3.0)
1349713139 transitivePeerDependencies:
1349813140 - supports-color
13499 optional: true
1350013141
13501 '@expo/schema-utils@57.0.2': {}
13142 '@expo/schema-utils@58.0.1': {}
1350213143
1350313144 '@expo/sdk-runtime-versions@1.0.0': {}
1350413145
......@@ -13508,20 +13149,16 @@ snapshots:
1350813149
1350913150 '@expo/sudo-prompt@9.3.2': {}
1351013151
13511 '@expo/ui@57.0.14(@babel/core@7.29.7)(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(expo@57.0.18)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.11.4(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':
13152 '@expo/ui@58.0.9(@babel/core@7.29.7)(expo@58.0.0)(react-dom@19.3.0(react@19.3.0))(react-native-worklets@0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)':
1351213153 dependencies:
13513 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
13514 react: 19.2.3
13515 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
13154 expo: 58.0.0(3abfa3879936d948a635873738556226)
13155 react: 19.3.0
13156 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1351613157 sf-symbols-typescript: 2.2.0
13517 vaul: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
1351813158 optionalDependencies:
1351913159 '@babel/core': 7.29.7
13520 react-dom: 19.2.3(react@19.2.3)
13521 react-native-worklets: 0.11.4(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
13522 transitivePeerDependencies:
13523 - '@types/react'
13524 - '@types/react-dom'
13160 react-dom: 19.3.0(react@19.3.0)
13161 react-native-worklets: 0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
1352513162
1352613163 '@expo/ws-tunnel@2.0.0(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))':
1352713164 dependencies:
......@@ -13784,14 +13421,6 @@ snapshots:
1378413421 dependencies:
1378513422 jsbi: 4.3.2
1378613423
13787 '@legendapp/list@3.3.5(patch_hash=680cc6a5c5b4a4032e467e7b3fde22f89a84c0ee2e6eac6fda737d6277cc0806)(react-dom@19.2.3(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':
13788 dependencies:
13789 react: 19.2.3
13790 use-sync-external-store: 1.6.0(react@19.2.3)
13791 optionalDependencies:
13792 react-dom: 19.2.3(react@19.2.3)
13793 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
13794
1379513424 '@legendapp/list@3.3.5(patch_hash=680cc6a5c5b4a4032e467e7b3fde22f89a84c0ee2e6eac6fda737d6277cc0806)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
1379613425 dependencies:
1379713426 react: 19.2.6
......@@ -13799,6 +13428,14 @@ snapshots:
1379913428 optionalDependencies:
1380013429 react-dom: 19.2.6(react@19.2.6)
1380113430
13431 '@legendapp/list@3.3.5(patch_hash=680cc6a5c5b4a4032e467e7b3fde22f89a84c0ee2e6eac6fda737d6277cc0806)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)':
13432 dependencies:
13433 react: 19.3.0
13434 use-sync-external-store: 1.6.0(react@19.3.0)
13435 optionalDependencies:
13436 react-dom: 19.3.0(react@19.3.0)
13437 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
13438
1380213439 '@libsql/client@0.17.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)':
1380313440 dependencies:
1380413441 '@libsql/core': 0.17.3
......@@ -14006,6 +13643,30 @@ snapshots:
1400613643
1400713644 '@nornagon/put@0.0.8': {}
1400813645
13646 '@noxcturnal/noxcturnal-darwin-arm64@0.1.1':
13647 optional: true
13648
13649 '@noxcturnal/noxcturnal-darwin-x64@0.1.1':
13650 optional: true
13651
13652 '@noxcturnal/noxcturnal-linux-arm64-gnu@0.1.1':
13653 optional: true
13654
13655 '@noxcturnal/noxcturnal-linux-arm64-musl@0.1.1':
13656 optional: true
13657
13658 '@noxcturnal/noxcturnal-linux-x64-gnu@0.1.1':
13659 optional: true
13660
13661 '@noxcturnal/noxcturnal-linux-x64-musl@0.1.1':
13662 optional: true
13663
13664 '@noxcturnal/noxcturnal-win32-arm64-msvc@0.1.1':
13665 optional: true
13666
13667 '@noxcturnal/noxcturnal-win32-x64-msvc@0.1.1':
13668 optional: true
13669
1400913670 '@octokit/auth-token@6.0.0': {}
1401013671
1401113672 '@octokit/core@7.0.6':
......@@ -14216,6 +13877,8 @@ snapshots:
1421613877 '@oxc-project/types@0.127.0':
1421713878 optional: true
1421813879
13880 '@oxc-project/types@0.141.0': {}
13881
1421913882 '@oxc-project/types@0.146.0': {}
1422013883
1422113884 '@oxc-project/types@0.147.0': {}
......@@ -14444,16 +14107,16 @@ snapshots:
1444414107 tslib: 2.8.1
1444514108 webcrypto-core: 1.9.2
1444614109
14447 '@pierre/diffs@1.3.0-beta.10(patch_hash=0ccee155b93b63d810e2c1a40c1fd676fb6fbcfa72cf6430dcedf1a3ae475ab4)(@shikijs/themes@4.2.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
14110 '@pierre/diffs@1.3.0-beta.10(patch_hash=0ccee155b93b63d810e2c1a40c1fd676fb6fbcfa72cf6430dcedf1a3ae475ab4)(@shikijs/themes@4.2.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
1444814111 dependencies:
1444914112 '@pierre/theme': 1.1.0
14450 '@pierre/theming': 0.0.2(@pierre/theme@1.1.0)(@shikijs/themes@4.2.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(shiki@4.2.0)
14113 '@pierre/theming': 0.0.2(@pierre/theme@1.1.0)(@shikijs/themes@4.2.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(shiki@4.2.0)
1445114114 '@shikijs/transformers': 4.2.0
1445214115 diff: 9.0.0
1445314116 hast-util-to-html: 9.0.5
1445414117 lru_map: 0.4.1
14455 react: 19.2.3
14456 react-dom: 19.2.3(react@19.2.3)
14118 react: 19.3.0
14119 react-dom: 19.3.0(react@19.3.0)
1445714120 shiki: 4.2.0
1445814121 transitivePeerDependencies:
1445914122 - '@shikijs/themes'
......@@ -14474,12 +14137,12 @@ snapshots:
1447414137
1447514138 '@pierre/theme@1.1.0': {}
1447614139
14477 '@pierre/theming@0.0.2(@pierre/theme@1.1.0)(@shikijs/themes@4.2.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(shiki@4.2.0)':
14140 '@pierre/theming@0.0.2(@pierre/theme@1.1.0)(@shikijs/themes@4.2.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(shiki@4.2.0)':
1447814141 optionalDependencies:
1447914142 '@pierre/theme': 1.1.0
1448014143 '@shikijs/themes': 4.2.0
14481 react: 19.2.3
14482 react-dom: 19.2.3(react@19.2.3)
14144 react: 19.3.0
14145 react-dom: 19.3.0(react@19.3.0)
1448314146 shiki: 4.2.0
1448414147
1448514148 '@pierre/theming@0.0.2(@pierre/theme@1.1.0)(@shikijs/themes@4.3.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(shiki@4.2.0)':
......@@ -14490,19 +14153,19 @@ snapshots:
1449014153 react-dom: 19.2.6(react@19.2.6)
1449114154 shiki: 4.2.0
1449214155
14493 '@pierre/trees@1.0.0-beta.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
14156 '@pierre/trees@1.0.0-beta.4(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
1449414157 dependencies:
1449514158 preact: 11.0.0-beta.0
1449614159 preact-render-to-string: 6.6.5(preact@11.0.0-beta.0)
14497 react: 19.2.3
14498 react-dom: 19.2.3(react@19.2.3)
14160 react: 19.2.6
14161 react-dom: 19.2.6(react@19.2.6)
1449914162
14500 '@pierre/trees@1.0.0-beta.4(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
14163 '@pierre/trees@1.0.0-beta.4(react-dom@19.3.0(react@19.3.0))(react@19.3.0)':
1450114164 dependencies:
1450214165 preact: 11.0.0-beta.0
1450314166 preact-render-to-string: 6.6.5(preact@11.0.0-beta.0)
14504 react: 19.2.6
14505 react-dom: 19.2.6(react@19.2.6)
14167 react: 19.3.0
14168 react-dom: 19.3.0(react@19.3.0)
1450614169
1450714170 '@polka/url@1.0.0-next.29': {}
1450814171
......@@ -14513,149 +14176,6 @@ snapshots:
1451314176 optionalDependencies:
1451414177 yauzl: 3.4.0
1451514178
14516 '@radix-ui/primitive@1.1.3': {}
14517
14518 '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.16)(react@19.2.3)':
14519 dependencies:
14520 react: 19.2.3
14521 optionalDependencies:
14522 '@types/react': 19.2.16
14523
14524 '@radix-ui/react-context@1.1.2(@types/react@19.2.16)(react@19.2.3)':
14525 dependencies:
14526 react: 19.2.3
14527 optionalDependencies:
14528 '@types/react': 19.2.16
14529
14530 '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
14531 dependencies:
14532 '@radix-ui/primitive': 1.1.3
14533 '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.16)(react@19.2.3)
14534 '@radix-ui/react-context': 1.1.2(@types/react@19.2.16)(react@19.2.3)
14535 '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
14536 '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.16)(react@19.2.3)
14537 '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
14538 '@radix-ui/react-id': 1.1.1(@types/react@19.2.16)(react@19.2.3)
14539 '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
14540 '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
14541 '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
14542 '@radix-ui/react-slot': 1.2.3(@types/react@19.2.16)(react@19.2.3)
14543 '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.16)(react@19.2.3)
14544 aria-hidden: 1.2.6
14545 react: 19.2.3
14546 react-dom: 19.2.3(react@19.2.3)
14547 react-remove-scroll: 2.7.2(@types/react@19.2.16)(react@19.2.3)
14548 optionalDependencies:
14549 '@types/react': 19.2.16
14550 '@types/react-dom': 19.2.3(@types/react@19.2.16)
14551
14552 '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
14553 dependencies:
14554 '@radix-ui/primitive': 1.1.3
14555 '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.16)(react@19.2.3)
14556 '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
14557 '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.16)(react@19.2.3)
14558 '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.16)(react@19.2.3)
14559 react: 19.2.3
14560 react-dom: 19.2.3(react@19.2.3)
14561 optionalDependencies:
14562 '@types/react': 19.2.16
14563 '@types/react-dom': 19.2.3(@types/react@19.2.16)
14564
14565 '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.16)(react@19.2.3)':
14566 dependencies:
14567 react: 19.2.3
14568 optionalDependencies:
14569 '@types/react': 19.2.16
14570
14571 '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
14572 dependencies:
14573 '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.16)(react@19.2.3)
14574 '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
14575 '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.16)(react@19.2.3)
14576 react: 19.2.3
14577 react-dom: 19.2.3(react@19.2.3)
14578 optionalDependencies:
14579 '@types/react': 19.2.16
14580 '@types/react-dom': 19.2.3(@types/react@19.2.16)
14581
14582 '@radix-ui/react-id@1.1.1(@types/react@19.2.16)(react@19.2.3)':
14583 dependencies:
14584 '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.16)(react@19.2.3)
14585 react: 19.2.3
14586 optionalDependencies:
14587 '@types/react': 19.2.16
14588
14589 '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
14590 dependencies:
14591 '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
14592 '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.16)(react@19.2.3)
14593 react: 19.2.3
14594 react-dom: 19.2.3(react@19.2.3)
14595 optionalDependencies:
14596 '@types/react': 19.2.16
14597 '@types/react-dom': 19.2.3(@types/react@19.2.16)
14598
14599 '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
14600 dependencies:
14601 '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.16)(react@19.2.3)
14602 '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.16)(react@19.2.3)
14603 react: 19.2.3
14604 react-dom: 19.2.3(react@19.2.3)
14605 optionalDependencies:
14606 '@types/react': 19.2.16
14607 '@types/react-dom': 19.2.3(@types/react@19.2.16)
14608
14609 '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
14610 dependencies:
14611 '@radix-ui/react-slot': 1.2.3(@types/react@19.2.16)(react@19.2.3)
14612 react: 19.2.3
14613 react-dom: 19.2.3(react@19.2.3)
14614 optionalDependencies:
14615 '@types/react': 19.2.16
14616 '@types/react-dom': 19.2.3(@types/react@19.2.16)
14617
14618 '@radix-ui/react-slot@1.2.3(@types/react@19.2.16)(react@19.2.3)':
14619 dependencies:
14620 '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.16)(react@19.2.3)
14621 react: 19.2.3
14622 optionalDependencies:
14623 '@types/react': 19.2.16
14624
14625 '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.16)(react@19.2.3)':
14626 dependencies:
14627 react: 19.2.3
14628 optionalDependencies:
14629 '@types/react': 19.2.16
14630
14631 '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.16)(react@19.2.3)':
14632 dependencies:
14633 '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.16)(react@19.2.3)
14634 '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.16)(react@19.2.3)
14635 react: 19.2.3
14636 optionalDependencies:
14637 '@types/react': 19.2.16
14638
14639 '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.16)(react@19.2.3)':
14640 dependencies:
14641 '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.16)(react@19.2.3)
14642 react: 19.2.3
14643 optionalDependencies:
14644 '@types/react': 19.2.16
14645
14646 '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.16)(react@19.2.3)':
14647 dependencies:
14648 '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.16)(react@19.2.3)
14649 react: 19.2.3
14650 optionalDependencies:
14651 '@types/react': 19.2.16
14652
14653 '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.16)(react@19.2.3)':
14654 dependencies:
14655 react: 19.2.3
14656 optionalDependencies:
14657 '@types/react': 19.2.16
14658
1465914179 '@react-grab/cli@0.1.44':
1466014180 dependencies:
1466114181 agent-install: 0.0.5
......@@ -14667,35 +14187,35 @@ snapshots:
1466714187 prompts: 2.4.2
1466814188 tinyexec: 1.2.4
1466914189
14670 '@react-native-ai/apple@0.12.0(patch_hash=2d09870c2848d185cb05b53ed823a46e12dba519324d8dd8e584e28731990f9d)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))':
14190 '@react-native-ai/apple@0.12.0(patch_hash=2d09870c2848d185cb05b53ed823a46e12dba519324d8dd8e584e28731990f9d)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))':
1467114191 dependencies:
1467214192 '@ai-sdk/provider': 3.0.15
1467314193 '@ai-sdk/provider-utils': 4.0.49(zod@4.4.3)
14674 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
14194 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1467514195 zod: 4.4.3
1467614196
14677 '@react-native-masked-view/masked-view@0.3.2(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':
14197 '@react-native-masked-view/masked-view@0.3.2(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)':
1467814198 dependencies:
14679 react: 19.2.3
14680 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
14199 react: 19.3.0
14200 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1468114201 optional: true
1468214202
14683 '@react-native-menu/menu@2.0.0(patch_hash=f63d256bf6a97a873b5e628eb595bd6ef0075ddd5bdd890fc920f7a6024290dd)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':
14203 '@react-native-menu/menu@2.0.0(patch_hash=1cc2d43fbd0281ca0dd1feb5ffcefee7d4419459c8daaa58effff10c657832fb)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)':
1468414204 dependencies:
14685 react: 19.2.3
14686 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
14205 react: 19.3.0
14206 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1468714207
14688 '@react-native/assets-registry@0.86.3': {}
14208 '@react-native/asset-utils@0.88.0-rc.3': {}
1468914209
14690 '@react-native/babel-plugin-codegen@0.86.3(@babel/core@7.29.7)':
14210 '@react-native/babel-plugin-codegen@0.88.0-rc.3(@babel/core@7.29.7)':
1469114211 dependencies:
1469214212 '@babel/traverse': 7.29.7
14693 '@react-native/codegen': 0.86.3(@babel/core@7.29.7)
14213 '@react-native/codegen': 0.88.0-rc.3(@babel/core@7.29.7)
1469414214 transitivePeerDependencies:
1469514215 - '@babel/core'
1469614216 - supports-color
1469714217
14698 '@react-native/babel-preset@0.86.3(@babel/core@7.29.7)':
14218 '@react-native/babel-preset@0.88.0-rc.3(@babel/core@7.29.7)':
1469914219 dependencies:
1470014220 '@babel/core': 7.29.7
1470114221 '@babel/plugin-proposal-export-default-from': 7.29.7(@babel/core@7.29.7)
......@@ -14726,42 +14246,42 @@ snapshots:
1472614246 '@babel/plugin-transform-runtime': 7.29.7(@babel/core@7.29.7)
1472714247 '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7)
1472814248 '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7)
14729 '@react-native/babel-plugin-codegen': 0.86.3(@babel/core@7.29.7)
14730 babel-plugin-syntax-hermes-parser: 0.36.0
14249 '@react-native/babel-plugin-codegen': 0.88.0-rc.3(@babel/core@7.29.7)
1473114250 babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.29.7)
14251 flow-parser: 0.327.0
1473214252 react-refresh: 0.14.2
1473314253 transitivePeerDependencies:
1473414254 - supports-color
1473514255
14736 '@react-native/codegen@0.86.3(@babel/core@7.29.7)':
14256 '@react-native/codegen@0.88.0-rc.3(@babel/core@7.29.7)':
1473714257 dependencies:
1473814258 '@babel/core': 7.29.7
14739 '@babel/parser': 7.29.7
14740 hermes-parser: 0.36.0
14259 '@babel/parser': 7.29.8
14260 flow-parser: 0.327.0
1474114261 invariant: 2.2.4
1474214262 nullthrows: 1.1.1
1474314263 tinyglobby: 0.2.17
1474414264 yargs: 17.7.2
1474514265
14746 '@react-native/community-cli-plugin@0.86.3(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(utf-8-validate@6.0.6)':
14266 '@react-native/community-cli-plugin@0.88.0-rc.3(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(utf-8-validate@6.0.6)':
1474714267 dependencies:
14748 '@react-native/dev-middleware': 0.86.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)
14268 '@react-native/asset-utils': 0.88.0-rc.3
14269 '@react-native/dev-middleware': 0.88.0-rc.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)
14270 commander: 12.1.0
1474914271 debug: 4.4.3
1475014272 invariant: 2.2.4
14751 metro: 0.84.4(bufferutil@4.1.0)(utf-8-validate@6.0.6)
14752 metro-config: 0.84.4(bufferutil@4.1.0)(utf-8-validate@6.0.6)
14753 metro-core: 0.84.4
14273 metro: 0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)
1475414274 semver: 7.8.5
1475514275 optionalDependencies:
14756 '@react-native/metro-config': 0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6)
14276 '@react-native/metro-config': 0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6)
1475714277 transitivePeerDependencies:
1475814278 - bufferutil
1475914279 - supports-color
1476014280 - utf-8-validate
1476114281
14762 '@react-native/debugger-frontend@0.86.3': {}
14282 '@react-native/debugger-frontend@0.88.0-rc.3': {}
1476314283
14764 '@react-native/debugger-shell@0.86.3':
14284 '@react-native/debugger-shell@0.88.0-rc.3':
1476514285 dependencies:
1476614286 cross-spawn: 7.0.6
1476714287 debug: 4.4.3
......@@ -14769,18 +14289,16 @@ snapshots:
1476914289 transitivePeerDependencies:
1477014290 - supports-color
1477114291
14772 '@react-native/dev-middleware@0.86.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)':
14292 '@react-native/dev-middleware@0.88.0-rc.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)':
1477314293 dependencies:
1477414294 '@isaacs/ttlcache': 1.4.1
14775 '@react-native/debugger-frontend': 0.86.3
14776 '@react-native/debugger-shell': 0.86.3
14777 chrome-launcher: 0.15.2
14778 chromium-edge-launcher: 0.3.0
14295 '@react-native/debugger-frontend': 0.88.0-rc.3
14296 '@react-native/debugger-shell': 0.88.0-rc.3
1477914297 connect: 3.7.0
1478014298 debug: 4.4.3
1478114299 invariant: 2.2.4
1478214300 nullthrows: 1.1.1
14783 open: 7.4.2
14301 open: 8.4.2
1478414302 serve-static: 1.16.3
1478514303 ws: 7.5.11(bufferutil@4.1.0)(utf-8-validate@6.0.6)
1478614304 transitivePeerDependencies:
......@@ -14788,100 +14306,90 @@ snapshots:
1478814306 - supports-color
1478914307 - utf-8-validate
1479014308
14791 '@react-native/gradle-plugin@0.86.3': {}
14309 '@react-native/gradle-plugin@0.88.0-rc.3': {}
1479214310
14793 '@react-native/js-polyfills@0.86.3': {}
14311 '@react-native/js-polyfills@0.88.0-rc.3': {}
1479414312
14795 '@react-native/metro-babel-transformer@0.86.3(@babel/core@7.29.7)':
14313 '@react-native/metro-babel-transformer@0.88.0-rc.3(@babel/core@7.29.7)':
1479614314 dependencies:
1479714315 '@babel/core': 7.29.7
14798 '@react-native/babel-preset': 0.86.3(@babel/core@7.29.7)
14799 hermes-parser: 0.36.0
14316 '@react-native/babel-preset': 0.88.0-rc.3(@babel/core@7.29.7)
14317 flow-parser: 0.327.0
1480014318 nullthrows: 1.1.1
1480114319 transitivePeerDependencies:
1480214320 - supports-color
1480314321
14804 '@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6)':
14322 '@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6)':
1480514323 dependencies:
14806 '@react-native/js-polyfills': 0.86.3
14807 '@react-native/metro-babel-transformer': 0.86.3(@babel/core@7.29.7)
14808 metro-config: 0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6)
14809 metro-runtime: 0.84.5
14324 '@react-native/js-polyfills': 0.88.0-rc.3
14325 '@react-native/metro-babel-transformer': 0.88.0-rc.3(@babel/core@7.29.7)
14326 metro-config: 0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)
14327 metro-runtime: 0.87.1
1481014328 transitivePeerDependencies:
1481114329 - '@babel/core'
1481214330 - bufferutil
1481314331 - supports-color
1481414332 - utf-8-validate
1481514333
14816 '@react-native/normalize-colors@0.86.3': {}
14334 '@react-native/normalize-colors@0.88.0-rc.3': {}
1481714335
14818 '@react-native/virtualized-lists@0.86.3(@types/react@19.2.16)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':
14336 '@react-native/virtualized-lists@0.88.0-rc.3(@types/react@19.3.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)':
1481914337 dependencies:
1482014338 invariant: 2.2.4
1482114339 nullthrows: 1.1.1
14822 react: 19.2.3
14823 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
14340 react: 19.3.0
14341 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1482414342 optionalDependencies:
14825 '@types/react': 19.2.16
14343 '@types/react': 19.3.0
1482614344
14827 '@react-native/virtualized-lists@0.86.3(@types/react@19.2.16)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)':
14828 dependencies:
14829 invariant: 2.2.4
14830 nullthrows: 1.1.1
14831 react: 19.2.6
14832 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)
14833 optionalDependencies:
14834 '@types/react': 19.2.16
14835 optional: true
14836
14837 '@react-navigation/core@7.21.13(react@19.2.3)':
14345 '@react-navigation/core@7.21.13(react@19.3.0)':
1483814346 dependencies:
1483914347 '@react-navigation/routers': 7.6.4
1484014348 escape-string-regexp: 4.0.0
1484114349 fast-deep-equal: 3.1.3
1484214350 nanoid: 3.3.19
1484314351 query-string: 7.1.3
14844 react: 19.2.3
14352 react: 19.3.0
1484514353 react-is: 19.2.7
14846 use-latest-callback: 0.2.6(react@19.2.3)
14847 use-sync-external-store: 1.6.0(react@19.2.3)
14354 use-latest-callback: 0.2.6(react@19.3.0)
14355 use-sync-external-store: 1.6.0(react@19.3.0)
1484814356
14849 '@react-navigation/elements@2.9.26(c10301b6e0c42fc6434d2b643197a81e)':
14357 '@react-navigation/elements@2.9.26(83de68753219ecf7f3321e065bd378be)':
1485014358 dependencies:
14851 '@react-navigation/native': 7.3.4(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
14359 '@react-navigation/native': 7.3.4(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
1485214360 color: 4.2.3
14853 react: 19.2.3
14854 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
14855 react-native-safe-area-context: 5.7.0(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
14856 use-latest-callback: 0.2.6(react@19.2.3)
14857 use-sync-external-store: 1.6.0(react@19.2.3)
14361 react: 19.3.0
14362 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
14363 react-native-safe-area-context: 5.9.1(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
14364 use-latest-callback: 0.2.6(react@19.3.0)
14365 use-sync-external-store: 1.6.0(react@19.3.0)
1485814366 optionalDependencies:
14859 '@react-native-masked-view/masked-view': 0.3.2(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
14367 '@react-native-masked-view/masked-view': 0.3.2(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
1486014368
14861 '@react-navigation/native-stack@7.17.6(patch_hash=e667c3cef8c78bb9ff4882ee5bd23a432247b843060a9499eb5f07e9e2295552)(f640afa6cd4b9a1dc5422cbafdc82f53)':
14369 '@react-navigation/native-stack@7.17.6(patch_hash=e667c3cef8c78bb9ff4882ee5bd23a432247b843060a9499eb5f07e9e2295552)(cdeee8948497d4b80ffe015e2a003650)':
1486214370 dependencies:
14863 '@react-navigation/elements': 2.9.26(c10301b6e0c42fc6434d2b643197a81e)
14864 '@react-navigation/native': 7.3.4(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
14371 '@react-navigation/elements': 2.9.26(83de68753219ecf7f3321e065bd378be)
14372 '@react-navigation/native': 7.3.4(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
1486514373 color: 4.2.3
14866 react: 19.2.3
14867 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
14868 react-native-safe-area-context: 5.7.0(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
14869 react-native-screens: 4.26.2(patch_hash=595114f3f9ce8b9f0d99d1aafe5c12c997b7d75ca9add31d46cbedbfe347b8e0)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
14374 react: 19.3.0
14375 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
14376 react-native-safe-area-context: 5.9.1(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
14377 react-native-screens: 4.28.0(patch_hash=cc1301436ee62c39860acc9ee1a1e60b7d47e6abd211c42effa62c056d165483)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
1487014378 sf-symbols-typescript: 2.2.0
1487114379 warn-once: 0.1.1
1487214380 transitivePeerDependencies:
1487314381 - '@react-native-masked-view/masked-view'
1487414382
14875 '@react-navigation/native@7.3.4(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':
14383 '@react-navigation/native@7.3.4(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)':
1487614384 dependencies:
14877 '@react-navigation/core': 7.21.13(react@19.2.3)
14385 '@react-navigation/core': 7.21.13(react@19.3.0)
1487814386 escape-string-regexp: 4.0.0
1487914387 fast-deep-equal: 3.1.3
1488014388 nanoid: 3.3.19
14881 react: 19.2.3
14882 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
14389 react: 19.3.0
14390 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1488314391 standard-navigation: 0.0.7
14884 use-latest-callback: 0.2.6(react@19.2.3)
14392 use-latest-callback: 0.2.6(react@19.3.0)
1488514393
1488614394 '@react-navigation/routers@7.6.4':
1488714395 dependencies:
......@@ -15153,28 +14661,28 @@ snapshots:
1515314661 dependencies:
1515414662 defer-to-connect: 2.0.1
1515514663
15156 '@t3tools/mobile-markdown-text@file:apps/mobile/modules/t3-markdown-text(c883758f8793b29a89016166016b354e)':
14664 '@t3tools/mobile-markdown-text@file:apps/mobile/modules/t3-markdown-text(5c46709ff7a3b3b481fcdaa30ae2beb2)':
1515714665 dependencies:
1515814666 '@t3tools/client-runtime': link:packages/client-runtime
1515914667 '@t3tools/shared': link:packages/shared
15160 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
15161 expo-asset: 57.0.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@7.0.2)
15162 expo-clipboard: 57.0.1(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
15163 expo-haptics: 57.0.2(expo@57.0.18)
15164 expo-symbols: 57.0.2(expo-font@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
15165 react: 19.2.3
15166 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
15167 react-native-nitro-markdown: 0.5.8(patch_hash=642b47830730acff3761fe29cf54271d18b493c0070c750097850b7ea032e00c)(react-native-nitro-modules@0.35.9(patch_hash=825622aae63a8fb5b904f3c77908a0e216261d727ea171709f2c0b6088422675)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native-svg@15.15.4(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
14668 expo: 58.0.0(3abfa3879936d948a635873738556226)
14669 expo-asset: 58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2)
14670 expo-clipboard: 58.0.2(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
14671 expo-haptics: 58.0.3(expo@58.0.0)
14672 expo-symbols: 58.0.3(expo-font@58.0.4(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
14673 react: 19.3.0
14674 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
14675 react-native-nitro-markdown: 0.5.8(patch_hash=642b47830730acff3761fe29cf54271d18b493c0070c750097850b7ea032e00c)(react-native-nitro-modules@0.35.9(patch_hash=daf4a639ce3f951af630a3711e4082d58e3a11e5a79f45efb0b59925327ebde2)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native-svg@15.15.5(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
1516814676
1516914677 '@t3tools/mobile-review-diff-native@file:apps/mobile/modules/t3-review-diff': {}
1517014678
1517114679 '@t3tools/mobile-terminal-native@file:apps/mobile/modules/t3-terminal': {}
1517214680
15173 '@tabler/icons-react-native@3.44.0(react-native-svg@15.15.4(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react@19.2.3)':
14681 '@tabler/icons-react-native@3.44.0(react-native-svg@15.15.5(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react@19.3.0)':
1517414682 dependencies:
1517514683 '@tabler/icons': 3.44.0
15176 react: 19.2.3
15177 react-native-svg: 15.15.4(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
14684 react: 19.3.0
14685 react-native-svg: 15.15.5(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
1517814686
1517914687 '@tabler/icons@3.44.0': {}
1518014688
......@@ -15296,7 +14804,7 @@ snapshots:
1529614804
1529714805 '@tanstack/router-generator@1.167.12':
1529814806 dependencies:
15299 '@babel/types': 7.29.7
14807 '@babel/types': 7.29.8
1530014808 '@tanstack/router-core': 1.171.8
1530114809 '@tanstack/router-utils': 1.162.1
1530214810 '@tanstack/virtual-file-routes': 1.162.0
......@@ -15333,7 +14841,7 @@ snapshots:
1533314841 '@babel/core': 7.29.7
1533414842 '@babel/generator': 7.29.7
1533514843 '@babel/parser': 7.29.7
15336 '@babel/types': 7.29.7
14844 '@babel/types': 7.29.8
1533714845 ansis: 4.3.1
1533814846 babel-dead-code-elimination: 1.0.12
1533914847 diff: 8.0.3
......@@ -15500,12 +15008,12 @@ snapshots:
1550015008 prosemirror-transform: 1.12.1
1550115009 prosemirror-view: 1.42.3
1550215010
15503 '@tiptap/react@3.31.3(@floating-ui/dom@1.7.6)(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
15011 '@tiptap/react@3.31.3(@floating-ui/dom@1.7.6)(@tiptap/core@3.31.3(@tiptap/pm@3.31.3))(@tiptap/pm@3.31.3)(@types/react-dom@19.2.3(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
1550415012 dependencies:
1550515013 '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3)
1550615014 '@tiptap/pm': 3.31.3
15507 '@types/react': 19.2.16
15508 '@types/react-dom': 19.2.3(@types/react@19.2.16)
15015 '@types/react': 19.3.0
15016 '@types/react-dom': 19.2.3(@types/react@19.3.0)
1550915017 '@types/use-sync-external-store': 0.0.6
1551015018 fast-equals: 5.4.2
1551115019 react: 19.2.6
......@@ -15570,16 +15078,16 @@ snapshots:
1557015078
1557115079 '@types/babel__generator@7.27.0':
1557215080 dependencies:
15573 '@babel/types': 7.29.7
15081 '@babel/types': 7.29.8
1557415082
1557515083 '@types/babel__template@7.4.4':
1557615084 dependencies:
1557715085 '@babel/parser': 7.29.7
15578 '@babel/types': 7.29.7
15086 '@babel/types': 7.29.8
1557915087
1558015088 '@types/babel__traverse@7.28.0':
1558115089 dependencies:
15582 '@babel/types': 7.29.7
15090 '@babel/types': 7.29.8
1558315091
1558415092 '@types/body-parser@1.19.6':
1558515093 dependencies:
......@@ -15640,8 +15148,6 @@ snapshots:
1564015148 dependencies:
1564115149 '@types/node': 24.12.4
1564215150
15643 '@types/hammerjs@2.0.46': {}
15644
1564515151 '@types/hast@3.0.4':
1564615152 dependencies:
1564715153 '@types/unist': 3.0.3
......@@ -15696,15 +15202,15 @@ snapshots:
1569615202
1569715203 '@types/range-parser@1.2.7': {}
1569815204
15699 '@types/react-dom@19.2.3(@types/react@19.2.16)':
15205 '@types/react-dom@19.2.3(@types/react@19.3.0)':
1570015206 dependencies:
15701 '@types/react': 19.2.16
15207 '@types/react': 19.3.0
1570215208
1570315209 '@types/react-test-renderer@19.1.0':
1570415210 dependencies:
15705 '@types/react': 19.2.16
15211 '@types/react': 19.3.0
1570615212
15707 '@types/react@19.2.16':
15213 '@types/react@19.3.0':
1570815214 dependencies:
1570915215 csstype: 3.2.3
1571015216
......@@ -16185,7 +15691,7 @@ snapshots:
1618515691
1618615692 agent-base@7.1.4: {}
1618715693
16188 agent-cli-detector@0.1.6: {}
15694 agent-cli-detector@0.1.7: {}
1618915695
1619015696 agent-install@0.0.5:
1619115697 dependencies:
......@@ -16228,12 +15734,12 @@ snapshots:
1622815734 json-schema-traverse: 1.0.0
1622915735 require-from-string: 2.0.2
1623015736
16231 ? alchemy@2.0.0-beta.79(patch_hash=d1a03d902083946ee58121cc2787d88d1da561e9e30a5bcfcb8654692a489fb8)(@effect/platform-node@4.0.0-rc.115(bufferutil@4.1.0)(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))(redis@6.2.1)(utf-8-validate@6.0.6))(@effect/sql-pg@4.0.0-rc.115(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)))(@types/node@24.12.4)(@types/react@19.2.16)(@voidzero-dev/vite-plus-core@1.0.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(drizzle-kit@1.0.0-rc.5-ab785fc)(drizzle-orm@1.0.0-rc.5-ab785fc(31bc26b129d6bba2f2e387113f50dba2))(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))(mongodb@6.21.0(@aws-sdk/credential-providers@3.1062.0)(socks@2.8.9))(pg@8.23.0)(react-devtools-core@6.1.5(bufferutil@4.1.0)(utf-8-validate@6.0.6))(typescript@7.0.2)(utf-8-validate@6.0.6)(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))
15737 ? alchemy@2.0.0-beta.79(patch_hash=d1a03d902083946ee58121cc2787d88d1da561e9e30a5bcfcb8654692a489fb8)(@effect/platform-node@4.0.0-rc.115(bufferutil@4.1.0)(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))(redis@6.2.1)(utf-8-validate@6.0.6))(@effect/sql-pg@4.0.0-rc.115(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)))(@types/node@24.12.4)(@types/react@19.3.0)(@voidzero-dev/vite-plus-core@1.0.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(drizzle-kit@1.0.0-rc.5-ab785fc)(drizzle-orm@1.0.0-rc.5-ab785fc(7abae7c285f47308cc52e143cbe0c150))(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))(mongodb@6.21.0(@aws-sdk/credential-providers@3.1062.0)(socks@2.8.9))(pg@8.23.0)(react-devtools-core@6.1.5(bufferutil@4.1.0)(utf-8-validate@6.0.6))(typescript@7.0.2)(utf-8-validate@6.0.6)(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))
1623215738 : dependencies:
1623315739 '@alchemy.run/cloudflare-runtime': 2.0.0-beta.79(@distilled.cloud/cloudflare@1.0.0-rc.12(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)))(@effect/platform-node@4.0.0-rc.115(bufferutil@4.1.0)(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))(redis@6.2.1)(utf-8-validate@6.0.6))(@types/node@24.12.4)(@voidzero-dev/vite-plus-core@1.0.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))(rolldown@1.2.5)(typescript@7.0.2)
1623415740 '@alchemy.run/floci': 2.0.0-beta.79(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))
1623515741 '@alchemy.run/node-utils': 2.0.0-beta.79
16236 '@alchemy.run/sigil': 0.0.0-alpha.11(@types/react@19.2.16)(react-devtools-core@6.1.5(bufferutil@4.1.0)(utf-8-validate@6.0.6))
15742 '@alchemy.run/sigil': 0.0.0-alpha.11(@types/react@19.3.0)(react-devtools-core@6.1.5(bufferutil@4.1.0)(utf-8-validate@6.0.6))
1623715743 '@aws-sdk/credential-providers': 3.1062.0
1623815744 '@distilled.cloud/aws': 1.0.0-rc.12(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))
1623915745 '@distilled.cloud/axiom': 1.0.0-rc.12(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))
......@@ -16268,7 +15774,7 @@ snapshots:
1626815774 '@effect/platform-node': 4.0.0-rc.115(bufferutil@4.1.0)(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))(redis@6.2.1)(utf-8-validate@6.0.6)
1626915775 '@effect/sql-pg': 4.0.0-rc.115(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))
1627015776 drizzle-kit: 1.0.0-rc.5-ab785fc
16271 drizzle-orm: 1.0.0-rc.5-ab785fc(31bc26b129d6bba2f2e387113f50dba2)
15777 drizzle-orm: 1.0.0-rc.5-ab785fc(7abae7c285f47308cc52e143cbe0c150)
1627215778 mongodb: 6.21.0(@aws-sdk/credential-providers@3.1062.0)(socks@2.8.9)
1627315779 pg: 8.23.0
1627415780 vite: '@voidzero-dev/vite-plus-core@1.0.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)'
......@@ -16375,10 +15881,6 @@ snapshots:
1637515881
1637615882 argparse@2.0.1: {}
1637715883
16378 aria-hidden@1.2.6:
16379 dependencies:
16380 tslib: 2.8.1
16381
1638215884 aria-query@5.3.0:
1638315885 dependencies:
1638415886 dequal: 2.0.3
......@@ -16512,9 +16014,9 @@ snapshots:
1651216014 babel-dead-code-elimination@1.0.12:
1651316015 dependencies:
1651416016 '@babel/core': 7.29.7
16515 '@babel/parser': 7.29.7
16017 '@babel/parser': 7.29.8
1651616018 '@babel/traverse': 7.29.7
16517 '@babel/types': 7.29.7
16019 '@babel/types': 7.29.8
1651816020 transitivePeerDependencies:
1651916021 - supports-color
1652016022
......@@ -16548,10 +16050,6 @@ snapshots:
1654816050
1654916051 babel-plugin-react-native-web@0.21.2: {}
1655016052
16551 babel-plugin-syntax-hermes-parser@0.36.0:
16552 dependencies:
16553 hermes-parser: 0.36.0
16554
1655516053 babel-plugin-syntax-hermes-parser@0.36.1:
1655616054 dependencies:
1655716055 hermes-parser: 0.36.1
......@@ -16562,7 +16060,7 @@ snapshots:
1656216060 transitivePeerDependencies:
1656316061 - '@babel/core'
1656416062
16565 babel-preset-expo@57.0.9(@babel/core@7.29.7)(@babel/runtime@7.29.7)(expo-widgets@57.0.15)(expo@57.0.18)(react-refresh@0.14.2):
16063 babel-preset-expo@58.0.6(@babel/core@7.29.7)(@babel/runtime@7.29.7)(expo-widgets@58.0.9)(expo@58.0.0)(react-refresh@0.14.2):
1656616064 dependencies:
1656716065 '@babel/generator': 7.29.7
1656816066 '@babel/helper-module-imports': 7.29.7
......@@ -16593,14 +16091,14 @@ snapshots:
1659316091 '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.29.7)
1659416092 '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.29.7)
1659516093 '@babel/plugin-transform-react-display-name': 7.29.7(@babel/core@7.29.7)
16596 '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.29.7)
16094 '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7)
1659716095 '@babel/plugin-transform-react-jsx-development': 7.29.7(@babel/core@7.29.7)
1659816096 '@babel/plugin-transform-react-pure-annotations': 7.29.7(@babel/core@7.29.7)
1659916097 '@babel/plugin-transform-runtime': 7.29.7(@babel/core@7.29.7)
1660016098 '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7)
1660116099 '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7)
1660216100 '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7)
16603 '@react-native/babel-plugin-codegen': 0.86.3(@babel/core@7.29.7)
16101 '@react-native/babel-plugin-codegen': 0.88.0-rc.3(@babel/core@7.29.7)
1660416102 babel-plugin-react-compiler: 1.0.0
1660516103 babel-plugin-react-native-web: 0.21.2
1660616104 babel-plugin-syntax-hermes-parser: 0.36.1
......@@ -16609,8 +16107,8 @@ snapshots:
1660916107 react-refresh: 0.14.2
1661016108 optionalDependencies:
1661116109 '@babel/runtime': 7.29.7
16612 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
16613 expo-widgets: 57.0.15(patch_hash=319a9ded5db49c5b5215c511a138b33f44c7ea2972eb418192e8d5342fe75ce6)(@babel/core@7.29.7)(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(expo@57.0.18)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.11.4(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
16110 expo: 58.0.0(3abfa3879936d948a635873738556226)
16111 expo-widgets: 58.0.9(patch_hash=94de7964c5a67ab40e6b79d9bdf4b7bfc50ae97b70722ee8e5a35105ca83386b)(@babel/core@7.29.7)(expo@58.0.0)(react-dom@19.3.0(react@19.3.0))(react-native-worklets@0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
1661416112 transitivePeerDependencies:
1661516113 - '@babel/core'
1661616114 - supports-color
......@@ -16829,29 +16327,8 @@ snapshots:
1682916327
1683016328 chownr@3.0.0: {}
1683116329
16832 chrome-launcher@0.15.2:
16833 dependencies:
16834 '@types/node': 24.12.4
16835 escape-string-regexp: 4.0.0
16836 is-wsl: 2.2.0
16837 lighthouse-logger: 1.4.2
16838 transitivePeerDependencies:
16839 - supports-color
16840
16841 chromium-edge-launcher@0.3.0:
16842 dependencies:
16843 '@types/node': 24.12.4
16844 escape-string-regexp: 4.0.0
16845 is-wsl: 2.2.0
16846 lighthouse-logger: 1.4.2
16847 mkdirp: 1.0.4
16848 transitivePeerDependencies:
16849 - supports-color
16850
1685116330 chromium-pickle-js@0.2.0: {}
1685216331
16853 ci-info@2.0.0: {}
16854
1685516332 ci-info@3.9.0: {}
1685616333
1685716334 ci-info@4.3.1: {}
......@@ -17150,6 +16627,8 @@ snapshots:
1715016627 gopd: 1.2.0
1715116628 optional: true
1715216629
16630 define-lazy-prop@2.0.0: {}
16631
1715316632 define-properties@1.2.1:
1715416633 dependencies:
1715516634 define-data-property: 1.1.4
......@@ -17176,8 +16655,6 @@ snapshots:
1717616655
1717716656 detect-libc@2.1.2: {}
1717816657
17179 detect-node-es@1.1.0: {}
17180
1718116658 detect-node@2.1.0:
1718216659 optional: true
1718316660
......@@ -17206,7 +16683,7 @@ snapshots:
1720616683 - electron-builder-squirrel-windows
1720716684 - supports-color
1720816685
17209 dnssd-advertise@1.1.4: {}
16686 dnssd-advertise@1.1.6: {}
1721016687
1721116688 dom-accessibility-api@0.5.16: {}
1721216689
......@@ -17246,7 +16723,7 @@ snapshots:
1724616723 get-tsconfig: 4.14.3
1724716724 jiti: 2.7.0
1724816725
17249 drizzle-orm@1.0.0-rc.5-ab785fc(31bc26b129d6bba2f2e387113f50dba2):
16726 drizzle-orm@1.0.0-rc.5-ab785fc(7abae7c285f47308cc52e143cbe0c150):
1725016727 optionalDependencies:
1725116728 '@cloudflare/workers-types': 4.20260604.1
1725216729 '@effect/sql-d1': 4.0.0-rc.115(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))
......@@ -17257,7 +16734,7 @@ snapshots:
1725716734 '@libsql/client': 0.17.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)
1725816735 bun-types: 1.3.14
1725916736 effect: 4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)
17260 expo-sqlite: 57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
16737 expo-sqlite: 58.0.7(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
1726116738 pg: 8.23.0
1726216739 valibot: 1.2.0(typescript@7.0.2)
1726316740 zod: 4.4.3
......@@ -17526,231 +17003,195 @@ snapshots:
1752617003
1752717004 expect-type@1.4.0: {}
1752817005
17529 expo-application@57.0.2(expo@57.0.18):
17006 expo-application@58.0.2(expo@58.0.0):
1753017007 dependencies:
17531 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17008 expo: 58.0.0(3abfa3879936d948a635873738556226)
1753217009
17533 expo-asset@57.0.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@7.0.2):
17010 expo-asset@58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2):
1753417011 dependencies:
17535 '@expo/image-utils': 0.11.5(typescript@7.0.2)
17536 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17537 expo-constants: 57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
17538 react: 19.2.3
17539 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
17012 '@expo/image-utils': 0.12.2(typescript@7.0.2)
17013 expo: 58.0.0(3abfa3879936d948a635873738556226)
17014 expo-constants: 58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(typescript@7.0.2)
17015 react: 19.3.0
17016 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1754017017 transitivePeerDependencies:
1754117018 - supports-color
1754217019 - typescript
1754317020
17544 expo-asset@57.0.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)(typescript@7.0.2):
17021 expo-audio@58.0.3(patch_hash=c20cb927d6848c53e7bf6ec14fe12f19daae9210165d2dbaf4e0f97ce31e8742)(expo-asset@58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2))(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0):
1754517022 dependencies:
17546 '@expo/image-utils': 0.11.5(typescript@7.0.2)
17547 expo: 57.0.18(0bf40d5ad6281d8f1e92517b24812edb)
17548 expo-constants: 57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))
17549 react: 19.2.6
17550 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)
17551 transitivePeerDependencies:
17552 - supports-color
17553 - typescript
17554 optional: true
17555
17556 expo-audio@57.0.4(patch_hash=fa9a3e0442ed395d4071bb406e08c3a471c9a84700bdfa0b9ad7ff144c96041a)(expo-asset@57.0.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@7.0.2))(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
17557 dependencies:
17558 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17559 expo-asset: 57.0.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@7.0.2)
17560 react: 19.2.3
17561 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
17023 expo: 58.0.0(3abfa3879936d948a635873738556226)
17024 expo-asset: 58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2)
17025 react: 19.3.0
17026 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1756217027
17563 expo-auth-session@57.0.10(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
17028 expo-auth-session@58.0.6(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2):
1756417029 dependencies:
17565 expo-application: 57.0.2(expo@57.0.18)
17566 expo-constants: 57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
17567 expo-crypto: 57.0.2(expo@57.0.18)
17568 expo-linking: 57.0.8(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
17569 expo-web-browser: 57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
17030 expo-application: 58.0.2(expo@58.0.0)
17031 expo-constants: 58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(typescript@7.0.2)
17032 expo-crypto: 58.0.3(expo@58.0.0)
17033 expo-linking: 58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2)
17034 expo-web-browser: 58.0.3(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))
1757017035 invariant: 2.2.4
17571 react: 19.2.3
17572 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
17036 react: 19.3.0
17037 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1757317038 transitivePeerDependencies:
1757417039 - expo
1757517040 - supports-color
17041 - typescript
1757617042
17577 expo-blur@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
17043 expo-blur@58.0.2(patch_hash=d0311b0c0b05bd94393bd9a84653cb42503d5f3c8a19eb2627c34ace08bedf18)(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0):
1757817044 dependencies:
17579 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17580 react: 19.2.3
17581 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
17045 expo: 58.0.0(3abfa3879936d948a635873738556226)
17046 react: 19.3.0
17047 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1758217048
17583 expo-build-properties@57.0.15(expo@57.0.18):
17049 expo-build-properties@58.0.9(expo@58.0.0):
1758417050 dependencies:
17585 '@expo/schema-utils': 57.0.2
17586 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17051 '@expo/schema-utils': 58.0.1
17052 expo: 58.0.0(3abfa3879936d948a635873738556226)
1758717053 resolve-from: 5.0.0
1758817054 semver: 7.8.5
1758917055
17590 expo-camera@57.0.4(@types/emscripten@1.41.5)(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
17056 expo-camera@58.0.5(@types/emscripten@1.41.5)(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0):
1759117057 dependencies:
1759217058 barcode-detector: 3.2.0(@types/emscripten@1.41.5)
17593 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17594 react: 19.2.3
17595 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
17059 expo: 58.0.0(3abfa3879936d948a635873738556226)
17060 react: 19.3.0
17061 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1759617062 transitivePeerDependencies:
1759717063 - '@types/emscripten'
1759817064
17599 expo-clipboard@57.0.1(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
17600 dependencies:
17601 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17602 react: 19.2.3
17603 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
17604
17605 expo-constants@57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)):
17065 expo-clipboard@58.0.2(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0):
1760617066 dependencies:
17607 '@expo/env': 2.4.3
17608 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17609 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
17610 transitivePeerDependencies:
17611 - supports-color
17067 expo: 58.0.0(3abfa3879936d948a635873738556226)
17068 react: 19.3.0
17069 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1761217070
17613 expo-constants@57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)):
17071 expo-constants@58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(typescript@7.0.2):
1761417072 dependencies:
17615 '@expo/env': 2.4.3
17616 expo: 57.0.18(0bf40d5ad6281d8f1e92517b24812edb)
17617 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)
17073 '@expo/env': 2.5.1
17074 '@expo/require-utils': 58.0.2(typescript@7.0.2)
17075 expo: 58.0.0(3abfa3879936d948a635873738556226)
17076 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1761817077 transitivePeerDependencies:
1761917078 - supports-color
17620 optional: true
17079 - typescript
1762117080
17622 expo-crypto@57.0.2(expo@57.0.18):
17081 expo-crypto@58.0.3(expo@58.0.0):
1762317082 dependencies:
17624 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17083 expo: 58.0.0(3abfa3879936d948a635873738556226)
1762517084
17626 expo-dev-client@57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)):
17085 expo-dev-client@58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)):
1762717086 dependencies:
17628 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17629 expo-dev-launcher: 57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
17630 expo-dev-menu: 57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
17631 expo-dev-menu-interface: 57.0.0(expo@57.0.18)
17632 expo-manifests: 57.0.1(expo@57.0.18)
17633 expo-updates-interface: 57.0.1(expo@57.0.18)
17087 expo: 58.0.0(3abfa3879936d948a635873738556226)
17088 expo-dev-launcher: 58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))
17089 expo-dev-menu: 58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))
17090 expo-dev-menu-interface: 58.0.1(expo@58.0.0)
17091 expo-manifests: 58.0.1(expo@58.0.0)
17092 expo-updates-interface: 58.0.1(expo@58.0.0)
1763417093 transitivePeerDependencies:
1763517094 - react-native
1763617095
17637 expo-dev-launcher@57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)):
17096 expo-dev-launcher@58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)):
1763817097 dependencies:
17639 '@expo/schema-utils': 57.0.2
17640 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17641 expo-dev-menu: 57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
17642 expo-manifests: 57.0.1(expo@57.0.18)
17643 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
17098 '@expo/schema-utils': 58.0.1
17099 expo: 58.0.0(3abfa3879936d948a635873738556226)
17100 expo-dev-menu: 58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))
17101 expo-manifests: 58.0.1(expo@58.0.0)
17102 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1764417103
17645 expo-dev-menu-interface@57.0.0(expo@57.0.18):
17104 expo-dev-menu-interface@58.0.1(expo@58.0.0):
1764617105 dependencies:
17647 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17106 expo: 58.0.0(3abfa3879936d948a635873738556226)
1764817107
17649 expo-dev-menu@57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)):
17108 expo-dev-menu@58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)):
1765017109 dependencies:
17651 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17652 expo-dev-menu-interface: 57.0.0(expo@57.0.18)
17653 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
17110 expo: 58.0.0(3abfa3879936d948a635873738556226)
17111 expo-dev-menu-interface: 58.0.1(expo@58.0.0)
17112 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1765417113
17655 expo-device@57.0.1(expo@57.0.18):
17114 expo-device@58.0.3(expo@58.0.0):
1765617115 dependencies:
17657 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17116 expo: 58.0.0(3abfa3879936d948a635873738556226)
1765817117 ua-parser-js: 0.7.41
1765917118
17660 expo-document-picker@57.0.1(expo@57.0.18):
17119 expo-document-picker@58.0.3(expo@58.0.0):
1766117120 dependencies:
17662 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17121 expo: 58.0.0(3abfa3879936d948a635873738556226)
1766317122
17664 expo-eas-client@57.0.2: {}
17123 expo-eas-client@58.0.1: {}
1766517124
17666 expo-file-system@57.0.6(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)):
17125 expo-file-system@58.0.4(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)):
1766717126 dependencies:
17668 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17669 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
17127 expo: 58.0.0(3abfa3879936d948a635873738556226)
17128 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1767017129
17671 expo-file-system@57.0.6(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)):
17130 expo-font@58.0.4(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0):
1767217131 dependencies:
17673 expo: 57.0.18(0bf40d5ad6281d8f1e92517b24812edb)
17674 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)
17675 optional: true
17132 expo: 58.0.0(3abfa3879936d948a635873738556226)
17133 react: 19.3.0
17134 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1767617135
17677 expo-font@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
17136 expo-glass-effect@58.0.3(patch_hash=f750041c45ab838a3530451dc7b50d6640a79141037a1b0499c5e3412a860c57)(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0):
1767817137 dependencies:
17679 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17680 fontfaceobserver: 2.3.0
17681 react: 19.2.3
17682 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
17138 expo: 58.0.0(3abfa3879936d948a635873738556226)
17139 react: 19.3.0
17140 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1768317141
17684 expo-font@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6):
17142 expo-haptics@58.0.3(expo@58.0.0):
1768517143 dependencies:
17686 expo: 57.0.18(0bf40d5ad6281d8f1e92517b24812edb)
17687 fontfaceobserver: 2.3.0
17688 react: 19.2.6
17689 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)
17690 optional: true
17691
17692 expo-glass-effect@57.0.1(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
17693 dependencies:
17694 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17695 react: 19.2.3
17696 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
17697
17698 expo-haptics@57.0.2(expo@57.0.18):
17699 dependencies:
17700 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17144 expo: 58.0.0(3abfa3879936d948a635873738556226)
1770117145
17702 expo-image-loader@57.0.1(expo@57.0.18):
17146 expo-image-loader@58.0.2(expo@58.0.0):
1770317147 dependencies:
17704 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17148 expo: 58.0.0(3abfa3879936d948a635873738556226)
1770517149
17706 expo-image-manipulator@57.0.17(expo@57.0.18):
17150 expo-image-manipulator@58.0.10(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0):
1770717151 dependencies:
17708 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17709 expo-image-loader: 57.0.1(expo@57.0.18)
17152 expo: 58.0.0(3abfa3879936d948a635873738556226)
17153 expo-image-loader: 58.0.2(expo@58.0.0)
17154 react: 19.3.0
17155 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1771017156
17711 expo-image-picker@57.0.14(expo@57.0.18):
17157 expo-image-picker@58.0.9(expo@58.0.0):
1771217158 dependencies:
17713 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17714 expo-image-loader: 57.0.1(expo@57.0.18)
17159 expo: 58.0.0(3abfa3879936d948a635873738556226)
17160 expo-image-loader: 58.0.2(expo@58.0.0)
1771517161
17716 expo-image@57.0.3(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
17162 expo-image@58.0.8(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0):
1771717163 dependencies:
17718 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17719 react: 19.2.3
17720 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
17164 expo: 58.0.0(3abfa3879936d948a635873738556226)
17165 react: 19.3.0
17166 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1772117167 sf-symbols-typescript: 2.2.0
1772217168
17723 expo-json-utils@57.0.1: {}
17169 expo-json-utils@58.0.1: {}
1772417170
17725 expo-keep-awake@57.0.2(expo@57.0.18)(react@19.2.3):
17171 expo-keep-awake@58.0.2(expo@58.0.0)(react@19.3.0):
1772617172 dependencies:
17727 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17728 react: 19.2.3
17173 expo: 58.0.0(3abfa3879936d948a635873738556226)
17174 react: 19.3.0
1772917175
17730 expo-keep-awake@57.0.2(expo@57.0.18)(react@19.2.6):
17176 expo-linking@58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2):
1773117177 dependencies:
17732 expo: 57.0.18(0bf40d5ad6281d8f1e92517b24812edb)
17733 react: 19.2.6
17734 optional: true
17735
17736 expo-linking@57.0.8(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
17737 dependencies:
17738 expo-constants: 57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
17178 expo: 58.0.0(3abfa3879936d948a635873738556226)
17179 expo-constants: 58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(typescript@7.0.2)
1773917180 invariant: 2.2.4
17740 react: 19.2.3
17741 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
17181 react: 19.3.0
17182 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1774217183 transitivePeerDependencies:
17743 - expo
1774417184 - supports-color
17185 - typescript
1774517186
17746 expo-manifests@57.0.1(expo@57.0.18):
17187 expo-manifests@58.0.1(expo@58.0.0):
1774717188 dependencies:
17748 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17749 expo-json-utils: 57.0.1
17189 expo: 58.0.0(3abfa3879936d948a635873738556226)
17190 expo-json-utils: 58.0.1
1775017191
17751 expo-modules-autolinking@57.0.12(typescript@7.0.2):
17192 expo-modules-autolinking@58.0.6(typescript@7.0.2):
1775217193 dependencies:
17753 '@expo/require-utils': 57.0.5(typescript@7.0.2)
17194 '@expo/require-utils': 58.0.2(typescript@7.0.2)
1775417195 '@expo/spawn-async': 1.8.0
1775517196 chalk: 4.1.2
1775617197 commander: 7.2.0
......@@ -17758,253 +17199,187 @@ snapshots:
1775817199 - supports-color
1775917200 - typescript
1776017201
17761 expo-modules-core@57.0.14(patch_hash=6be7092f8c6f03a57b75c797d98b5f19ed62d2dd205bfc4c8adf4cef45655d7e)(react-native-worklets@0.10.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6):
17762 dependencies:
17763 '@expo/expo-modules-macros-plugin': 0.6.1
17764 expo-modules-jsi: 57.0.6(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))
17765 invariant: 2.2.4
17766 react: 19.2.6
17767 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)
17768 optionalDependencies:
17769 react-native-worklets: 0.10.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
17770 optional: true
17771
17772 expo-modules-core@57.0.14(patch_hash=6be7092f8c6f03a57b75c797d98b5f19ed62d2dd205bfc4c8adf4cef45655d7e)(react-native-worklets@0.11.4(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
17202 expo-modules-core@58.0.9(react-native-worklets@0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0):
1777317203 dependencies:
17774 '@expo/expo-modules-macros-plugin': 0.6.1
17775 expo-modules-jsi: 57.0.6(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
17204 expo-modules-jsi: 58.0.5(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))
17205 expo-modules-macros: 0.14.0
1777617206 invariant: 2.2.4
17777 react: 19.2.3
17778 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
17207 react: 19.3.0
17208 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1777917209 optionalDependencies:
17780 react-native-worklets: 0.11.4(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
17210 react-native-worklets: 0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
1778117211
17782 expo-modules-jsi@57.0.6(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)):
17212 expo-modules-jsi@58.0.5(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)):
1778317213 dependencies:
17784 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
17214 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1778517215
17786 expo-modules-jsi@57.0.6(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)):
17787 dependencies:
17788 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)
17789 optional: true
17216 expo-modules-macros@0.14.0: {}
1779017217
17791 expo-network@57.0.1(expo@57.0.18)(react@19.2.3):
17218 expo-network@58.0.2(expo@58.0.0)(react@19.3.0):
1779217219 dependencies:
17793 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17794 react: 19.2.3
17220 expo: 58.0.0(3abfa3879936d948a635873738556226)
17221 react: 19.3.0
1779517222
17796 expo-notifications@57.0.15(patch_hash=f89252c2c08dc7b3acb8415f319ebbe15fff8c9f88a64ebe1830cd5ac5c9ac40)(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@7.0.2):
17223 expo-notifications@58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2):
1779717224 dependencies:
17798 '@expo/image-utils': 0.11.5(typescript@7.0.2)
17225 '@expo/image-utils': 0.12.2(typescript@7.0.2)
1779917226 abort-controller: 3.0.0
1780017227 badgin: 1.2.3
17801 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17802 expo-application: 57.0.2(expo@57.0.18)
17803 expo-constants: 57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
17804 react: 19.2.3
17805 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
17228 expo: 58.0.0(3abfa3879936d948a635873738556226)
17229 expo-application: 58.0.2(expo@58.0.0)
17230 expo-constants: 58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(typescript@7.0.2)
17231 react: 19.3.0
17232 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1780617233 transitivePeerDependencies:
1780717234 - supports-color
1780817235 - typescript
1780917236
17810 expo-paste-input@0.1.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
17237 expo-paste-input@0.1.15(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0):
1781117238 dependencies:
17812 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17813 react: 19.2.3
17814 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
17239 expo: 58.0.0(3abfa3879936d948a635873738556226)
17240 react: 19.3.0
17241 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1781517242
17816 expo-quick-actions@6.0.2(expo@57.0.18)(typescript@7.0.2):
17243 expo-quick-actions@6.0.2(expo@58.0.0)(typescript@7.0.2):
1781717244 dependencies:
1781817245 '@expo/image-utils': 0.8.14(typescript@7.0.2)
17819 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17246 expo: 58.0.0(3abfa3879936d948a635873738556226)
1782017247 schema-utils: 4.3.3
1782117248 sf-symbols-typescript: 2.2.0
1782217249 transitivePeerDependencies:
1782317250 - supports-color
1782417251 - typescript
1782517252
17826 expo-secure-store@57.0.2(expo@57.0.18):
17253 expo-secure-store@58.0.1(expo@58.0.0):
1782717254 dependencies:
17828 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17255 expo: 58.0.0(3abfa3879936d948a635873738556226)
1782917256
17830 expo-server@57.0.3: {}
17257 expo-server@58.0.2: {}
1783117258
17832 expo-sharing@57.0.17(patch_hash=8d2e3b10eb3f52036a9a086800180ec6cebf3b75bccc5b1775117a7244d4ac45)(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@7.0.2):
17259 expo-sharing@58.0.12(patch_hash=5c85c709d951b5522b5bca897204b73ba7c17dec76e0dd155f41f8c2e833a7a8)(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2):
1783317260 dependencies:
17834 '@expo/config-plugins': 57.0.9(typescript@7.0.2)
17835 '@expo/config-types': 57.0.2
17836 '@expo/plist': 0.8.1
17837 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17838 react: 19.2.3
17839 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
17261 '@expo/config-plugins': 58.0.4(typescript@7.0.2)
17262 '@expo/config-types': 58.0.2
17263 '@expo/plist': 0.10.1
17264 expo: 58.0.0(3abfa3879936d948a635873738556226)
17265 react: 19.3.0
17266 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1784017267 transitivePeerDependencies:
1784117268 - supports-color
1784217269 - typescript
1784317270
17844 expo-splash-screen@57.0.8(expo@57.0.18)(typescript@7.0.2):
17271 expo-splash-screen@58.0.2(expo@58.0.0)(typescript@7.0.2):
1784517272 dependencies:
17846 '@expo/config-plugins': 57.0.9(typescript@7.0.2)
17847 '@expo/image-utils': 0.11.5(typescript@7.0.2)
17848 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17273 '@expo/config-plugins': 58.0.4(typescript@7.0.2)
17274 '@expo/image-utils': 0.12.2(typescript@7.0.2)
17275 expo: 58.0.0(3abfa3879936d948a635873738556226)
1784917276 xml2js: 0.6.0
1785017277 transitivePeerDependencies:
1785117278 - supports-color
1785217279 - typescript
1785317280
17854 expo-sqlite@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
17281 expo-sqlite@58.0.7(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0):
1785517282 dependencies:
1785617283 await-lock: 2.2.2
17857 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17858 react: 19.2.3
17859 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
17284 expo: 58.0.0(3abfa3879936d948a635873738556226)
17285 react: 19.3.0
17286 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1786017287
17861 expo-sqlite@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6):
17862 dependencies:
17863 await-lock: 2.2.2
17864 expo: 57.0.18(0bf40d5ad6281d8f1e92517b24812edb)
17865 react: 19.2.6
17866 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)
17867 optional: true
17868
17869 expo-structured-headers@57.0.0: {}
17288 expo-structured-headers@58.0.1: {}
1787017289
17871 expo-symbols@57.0.2(expo-font@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
17290 expo-symbols@58.0.3(expo-font@58.0.4(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0):
1787217291 dependencies:
1787317292 '@expo-google-fonts/material-symbols': 0.4.38
17874 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17875 expo-font: 57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
17876 react: 19.2.3
17877 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
17293 expo: 58.0.0(3abfa3879936d948a635873738556226)
17294 expo-font: 58.0.4(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
17295 react: 19.3.0
17296 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1787817297 sf-symbols-typescript: 2.2.0
1787917298
17880 expo-updates-interface@57.0.1(expo@57.0.18):
17299 expo-updates-interface@58.0.1(expo@58.0.0):
1788117300 dependencies:
17882 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17301 expo: 58.0.0(3abfa3879936d948a635873738556226)
1788317302
17884 expo-updates@57.0.19(expo-dev-client@57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)))(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
17303 expo-updates@58.0.11(expo-dev-client@58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)))(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0):
1788517304 dependencies:
1788617305 '@expo/code-signing-certificates': 0.0.6
17887 '@expo/plist': 0.8.1
17306 '@expo/plist': 0.10.1
1788817307 '@expo/spawn-async': 1.8.0
1788917308 arg: 4.1.3
1789017309 chalk: 4.1.2
1789117310 debug: 4.4.3
17892 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17893 expo-eas-client: 57.0.2
17894 expo-manifests: 57.0.1(expo@57.0.18)
17895 expo-structured-headers: 57.0.0
17896 expo-updates-interface: 57.0.1(expo@57.0.18)
17311 expo: 58.0.0(3abfa3879936d948a635873738556226)
17312 expo-eas-client: 58.0.1
17313 expo-manifests: 58.0.1(expo@58.0.0)
17314 expo-structured-headers: 58.0.1
17315 expo-updates-interface: 58.0.1(expo@58.0.0)
1789717316 getenv: 2.0.0
1789817317 glob: 13.0.6
1789917318 ignore: 5.3.2
1790017319 nullthrows: 1.1.1
17901 react: 19.2.3
17902 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
17320 react: 19.3.0
17321 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1790317322 resolve-from: 5.0.0
1790417323 optionalDependencies:
17905 expo-dev-client: 57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
17324 expo-dev-client: 58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))
1790617325 transitivePeerDependencies:
1790717326 - supports-color
1790817327
17909 expo-video@57.0.3(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
17328 expo-video@58.0.5(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0):
1791017329 dependencies:
17911 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17912 react: 19.2.3
17913 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
17330 expo: 58.0.0(3abfa3879936d948a635873738556226)
17331 react: 19.3.0
17332 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1791417333
17915 expo-web-browser@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)):
17334 expo-web-browser@58.0.3(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)):
1791617335 dependencies:
17917 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17918 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
17336 expo: 58.0.0(3abfa3879936d948a635873738556226)
17337 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1791917338
17920 expo-widgets@57.0.15(patch_hash=319a9ded5db49c5b5215c511a138b33f44c7ea2972eb418192e8d5342fe75ce6)(@babel/core@7.29.7)(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(expo@57.0.18)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.11.4(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
17339 expo-widgets@58.0.9(patch_hash=94de7964c5a67ab40e6b79d9bdf4b7bfc50ae97b70722ee8e5a35105ca83386b)(@babel/core@7.29.7)(expo@58.0.0)(react-dom@19.3.0(react@19.3.0))(react-native-worklets@0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0):
1792117340 dependencies:
17922 '@expo/plist': 0.8.1
17923 '@expo/ui': 57.0.14(@babel/core@7.29.7)(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(expo@57.0.18)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.11.4(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
17924 expo: 57.0.18(41fd11498a34454c91128cdad32f22f8)
17925 react: 19.2.3
17926 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
17341 '@expo/plist': 0.10.1
17342 '@expo/ui': 58.0.9(@babel/core@7.29.7)(expo@58.0.0)(react-dom@19.3.0(react@19.3.0))(react-native-worklets@0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
17343 expo: 58.0.0(3abfa3879936d948a635873738556226)
17344 react: 19.3.0
17345 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1792717346 transitivePeerDependencies:
1792817347 - '@babel/core'
17929 - '@types/react'
17930 - '@types/react-dom'
1793117348 - react-dom
1793217349 - react-native-worklets
1793317350
17934 expo@57.0.18(0bf40d5ad6281d8f1e92517b24812edb):
17935 dependencies:
17936 '@babel/runtime': 7.29.7
17937 '@expo/cli': 57.0.20(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.14)(bufferutil@4.1.0)(expo-constants@57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)))(expo-font@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(expo@57.0.18)(react-dom@19.2.6(react@19.2.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)(typescript@7.0.2)(utf-8-validate@6.0.6)
17938 '@expo/config': 57.0.9(typescript@7.0.2)
17939 '@expo/config-plugins': 57.0.9(typescript@7.0.2)
17940 '@expo/devtools': 57.0.1(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
17941 '@expo/fingerprint': 0.20.11
17942 '@expo/local-build-cache-provider': 57.0.8(typescript@7.0.2)
17943 '@expo/log-box': 57.0.4(@expo/dom-webview@57.0.1)(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
17944 '@expo/metro': 56.0.2(bufferutil@4.1.0)(utf-8-validate@6.0.6)
17945 '@expo/metro-config': 57.0.12(patch_hash=96f1a75347e6ea02dc4b7034ace815d8ee39e18b8166ebfb573d9e58328f0dc2)(bufferutil@4.1.0)(expo@57.0.18)(typescript@7.0.2)(utf-8-validate@6.0.6)
17946 '@ungap/structured-clone': 1.3.1
17947 babel-preset-expo: 57.0.9(@babel/core@7.29.7)(@babel/runtime@7.29.7)(expo-widgets@57.0.15)(expo@57.0.18)(react-refresh@0.14.2)
17948 expo-asset: 57.0.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)(typescript@7.0.2)
17949 expo-constants: 57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))
17950 expo-file-system: 57.0.6(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))
17951 expo-font: 57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
17952 expo-keep-awake: 57.0.2(expo@57.0.18)(react@19.2.6)
17953 expo-modules-autolinking: 57.0.12(typescript@7.0.2)
17954 expo-modules-core: 57.0.14(patch_hash=6be7092f8c6f03a57b75c797d98b5f19ed62d2dd205bfc4c8adf4cef45655d7e)(react-native-worklets@0.10.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
17955 pretty-format: 29.7.0
17956 react: 19.2.6
17957 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)
17958 react-refresh: 0.14.2
17959 whatwg-url-minimum: 0.1.2
17960 optionalDependencies:
17961 '@expo/dom-webview': 57.0.1(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
17962 '@expo/metro-runtime': 57.0.14(@expo/log-box@57.0.4)(expo@57.0.18)(react-dom@19.2.6(react@19.2.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
17963 react-dom: 19.2.6(react@19.2.6)
17964 react-native-webview: 13.16.1(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
17965 transitivePeerDependencies:
17966 - '@babel/core'
17967 - bufferutil
17968 - expo-router
17969 - expo-widgets
17970 - react-native-worklets
17971 - react-server-dom-webpack
17972 - supports-color
17973 - typescript
17974 - utf-8-validate
17975 optional: true
17976
17977 expo@57.0.18(41fd11498a34454c91128cdad32f22f8):
17351 expo@58.0.0(3abfa3879936d948a635873738556226):
1797817352 dependencies:
1797917353 '@babel/runtime': 7.29.7
17980 '@expo/cli': 57.0.20(@expo/dom-webview@57.0.1)(@expo/metro-runtime@57.0.14)(bufferutil@4.1.0)(expo-constants@57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)))(expo-font@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(expo@57.0.18)(react-dom@19.2.3(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@7.0.2)(utf-8-validate@6.0.6)
17981 '@expo/config': 57.0.9(typescript@7.0.2)
17982 '@expo/config-plugins': 57.0.9(typescript@7.0.2)
17983 '@expo/devtools': 57.0.1(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
17984 '@expo/fingerprint': 0.20.11
17985 '@expo/local-build-cache-provider': 57.0.8(typescript@7.0.2)
17986 '@expo/log-box': 57.0.4(@expo/dom-webview@57.0.1)(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
17987 '@expo/metro': 56.0.2(bufferutil@4.1.0)(utf-8-validate@6.0.6)
17988 '@expo/metro-config': 57.0.12(patch_hash=96f1a75347e6ea02dc4b7034ace815d8ee39e18b8166ebfb573d9e58328f0dc2)(bufferutil@4.1.0)(expo@57.0.18)(typescript@7.0.2)(utf-8-validate@6.0.6)
17354 '@expo/cli': 58.0.9(@expo/dom-webview@58.0.2)(@expo/metro-runtime@58.0.9)(bufferutil@4.1.0)(expo-constants@58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(typescript@7.0.2))(expo-font@58.0.4(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(expo@58.0.0)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2)(utf-8-validate@6.0.6)
17355 '@expo/config': 58.0.1(typescript@7.0.2)
17356 '@expo/config-plugins': 58.0.4(typescript@7.0.2)
17357 '@expo/devtools': 58.0.2(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
17358 '@expo/fingerprint': 0.21.2
17359 '@expo/local-build-cache-provider': 58.0.1(typescript@7.0.2)
17360 '@expo/log-box': 58.0.7(@expo/dom-webview@58.0.2)(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
17361 '@expo/log-box-utils': 58.0.1
17362 '@expo/metro': 58.0.0-rc.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)
17363 '@expo/metro-config': 58.0.6(patch_hash=90fa980e8b6480631fb2fbb04559834e3c612db40c550cd828f11be297d8d760)(bufferutil@4.1.0)(expo@58.0.0)(typescript@7.0.2)(utf-8-validate@6.0.6)
1798917364 '@ungap/structured-clone': 1.3.1
17990 babel-preset-expo: 57.0.9(@babel/core@7.29.7)(@babel/runtime@7.29.7)(expo-widgets@57.0.15)(expo@57.0.18)(react-refresh@0.14.2)
17991 expo-asset: 57.0.15(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@7.0.2)
17992 expo-constants: 57.0.16(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
17993 expo-file-system: 57.0.6(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
17994 expo-font: 57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
17995 expo-keep-awake: 57.0.2(expo@57.0.18)(react@19.2.3)
17996 expo-modules-autolinking: 57.0.12(typescript@7.0.2)
17997 expo-modules-core: 57.0.14(patch_hash=6be7092f8c6f03a57b75c797d98b5f19ed62d2dd205bfc4c8adf4cef45655d7e)(react-native-worklets@0.11.4(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
17365 babel-preset-expo: 58.0.6(@babel/core@7.29.7)(@babel/runtime@7.29.7)(expo-widgets@58.0.9)(expo@58.0.0)(react-refresh@0.14.2)
17366 expo-asset: 58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2)
17367 expo-constants: 58.0.9(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(typescript@7.0.2)
17368 expo-file-system: 58.0.4(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))
17369 expo-font: 58.0.4(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
17370 expo-keep-awake: 58.0.2(expo@58.0.0)(react@19.3.0)
17371 expo-modules-autolinking: 58.0.6(typescript@7.0.2)
17372 expo-modules-core: 58.0.9(react-native-worklets@0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
1799817373 pretty-format: 29.7.0
17999 react: 19.2.3
18000 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
17374 react: 19.3.0
17375 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
1800117376 react-refresh: 0.14.2
18002 whatwg-url-minimum: 0.1.2
17377 whatwg-url-minimum: 0.2.0
1800317378 optionalDependencies:
18004 '@expo/dom-webview': 57.0.1(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
18005 '@expo/metro-runtime': 57.0.14(@expo/log-box@57.0.4)(expo@57.0.18)(react-dom@19.2.3(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
18006 react-dom: 19.2.3(react@19.2.3)
18007 react-native-webview: 13.16.1(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
17379 '@expo/dom-webview': 58.0.2(expo@58.0.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
17380 '@expo/metro-runtime': 58.0.9(@expo/log-box@58.0.7)(expo@58.0.0)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
17381 react-dom: 19.3.0(react@19.3.0)
17382 react-native-webview: 14.0.1(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
1800817383 transitivePeerDependencies:
1800917384 - '@babel/core'
1801017385 - bufferutil
......@@ -18185,12 +17560,22 @@ snapshots:
1818517560
1818617561 flow-enums-runtime@0.0.6: {}
1818717562
17563 flow-estree@0.327.0: {}
17564
17565 flow-estree@0.331.0: {}
17566
17567 flow-parser@0.327.0:
17568 dependencies:
17569 flow-estree: 0.327.0
17570
17571 flow-parser@0.331.0:
17572 dependencies:
17573 flow-estree: 0.331.0
17574
1818817575 fontace@0.4.1:
1818917576 dependencies:
1819017577 fontkitten: 1.0.3
1819117578
18192 fontfaceobserver@2.3.0: {}
18193
1819417579 fontkitten@1.0.3:
1819517580 dependencies:
1819617581 tiny-inflate: 1.0.3
......@@ -18279,8 +17664,6 @@ snapshots:
1827917664 hasown: 2.0.4
1828017665 math-intrinsics: 1.1.0
1828117666
18282 get-nonce@1.0.1: {}
18283
1828417667 get-proto@1.0.1:
1828517668 dependencies:
1828617669 dunder-proto: 1.0.1
......@@ -18487,32 +17870,16 @@ snapshots:
1848717870
1848817871 heic-to@1.5.2: {}
1848917872
18490 hermes-compiler@250829098.0.17: {}
18491
18492 hermes-estree@0.35.0: {}
18493
18494 hermes-estree@0.36.0: {}
17873 hermes-compiler@260318099.0.4: {}
1849517874
1849617875 hermes-estree@0.36.1: {}
1849717876
18498 hermes-parser@0.35.0:
18499 dependencies:
18500 hermes-estree: 0.35.0
18501
18502 hermes-parser@0.36.0:
18503 dependencies:
18504 hermes-estree: 0.36.0
18505
1850617877 hermes-parser@0.36.1:
1850717878 dependencies:
1850817879 hermes-estree: 0.36.1
1850917880
1851017881 hexy@0.2.11: {}
1851117882
18512 hoist-non-react-statics@3.3.2:
18513 dependencies:
18514 react-is: 16.13.1
18515
1851617883 hono@4.13.7: {}
1851717884
1851817885 hosted-git-info@4.1.0:
......@@ -18582,10 +17949,6 @@ snapshots:
1858217949
1858317950 ignore@7.0.5: {}
1858417951
18585 image-size@1.2.1:
18586 dependencies:
18587 queue: 6.0.2
18588
1858917952 immediate@3.0.6: {}
1859017953
1859117954 inflight@1.0.6:
......@@ -18865,13 +18228,6 @@ snapshots:
1886518228 dependencies:
1886618229 immediate: 3.0.6
1886718230
18868 lighthouse-logger@1.4.2:
18869 dependencies:
18870 debug: 2.6.9
18871 marky: 1.3.0
18872 transitivePeerDependencies:
18873 - supports-color
18874
1887518231 lightningcss-android-arm64@1.33.0:
1887618232 optional: true
1887718233
......@@ -19001,8 +18357,6 @@ snapshots:
1900118357
1900218358 markdown-table@3.0.4: {}
1900318359
19004 marky@1.3.0: {}
19005
1900618360 matcher@3.0.0:
1900718361 dependencies:
1900818362 escape-string-regexp: 4.0.0
......@@ -19201,109 +18555,50 @@ snapshots:
1920118555
1920218556 meshoptimizer@0.22.0: {}
1920318557
19204 metro-babel-transformer@0.84.4:
18558 metro-babel-transformer@0.87.1:
1920518559 dependencies:
1920618560 '@babel/core': 7.29.7
1920718561 flow-enums-runtime: 0.0.6
19208 hermes-parser: 0.35.0
19209 metro-cache-key: 0.84.4
18562 flow-parser: 0.331.0
18563 metro-cache-key: 0.87.1
1921018564 nullthrows: 1.1.1
1921118565 transitivePeerDependencies:
1921218566 - supports-color
1921318567
19214 metro-babel-transformer@0.84.5:
18568 metro-cache-key@0.87.1:
1921518569 dependencies:
19216 '@babel/core': 7.29.7
1921718570 flow-enums-runtime: 0.0.6
19218 hermes-parser: 0.35.0
19219 metro-cache-key: 0.84.5
19220 nullthrows: 1.1.1
19221 transitivePeerDependencies:
19222 - supports-color
1922318571
19224 metro-cache-key@0.84.4:
19225 dependencies:
19226 flow-enums-runtime: 0.0.6
19227
19228 metro-cache-key@0.84.5:
19229 dependencies:
19230 flow-enums-runtime: 0.0.6
19231
19232 metro-cache@0.84.4:
18572 metro-cache@0.87.1:
1923318573 dependencies:
1923418574 exponential-backoff: 3.1.3
1923518575 flow-enums-runtime: 0.0.6
1923618576 https-proxy-agent: 7.0.6
19237 metro-core: 0.84.4
18577 metro-core: 0.87.1
1923818578 transitivePeerDependencies:
1923918579 - supports-color
1924018580
19241 metro-cache@0.84.5:
19242 dependencies:
19243 exponential-backoff: 3.1.3
19244 flow-enums-runtime: 0.0.6
19245 https-proxy-agent: 7.0.6
19246 metro-core: 0.84.5
19247 transitivePeerDependencies:
19248 - supports-color
19249
19250 metro-config@0.84.4(bufferutil@4.1.0)(utf-8-validate@6.0.6):
18581 metro-config@0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6):
1925118582 dependencies:
1925218583 connect: 3.7.0
1925318584 flow-enums-runtime: 0.0.6
1925418585 jest-validate: 29.7.0
19255 metro: 0.84.4(bufferutil@4.1.0)(utf-8-validate@6.0.6)
19256 metro-cache: 0.84.4
19257 metro-core: 0.84.4
19258 metro-runtime: 0.84.4
19259 yaml: 2.9.0
18586 metro: 0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)
18587 metro-cache: 0.87.1
18588 metro-core: 0.87.1
18589 metro-runtime: 0.87.1
1926018590 transitivePeerDependencies:
1926118591 - bufferutil
1926218592 - supports-color
1926318593 - utf-8-validate
1926418594
19265 metro-config@0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6):
19266 dependencies:
19267 connect: 3.7.0
19268 flow-enums-runtime: 0.0.6
19269 jest-validate: 29.7.0
19270 metro: 0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6)
19271 metro-cache: 0.84.5
19272 metro-core: 0.84.5
19273 metro-runtime: 0.84.5
19274 yaml: 2.9.0
19275 transitivePeerDependencies:
19276 - bufferutil
19277 - supports-color
19278 - utf-8-validate
19279
19280 metro-core@0.84.4:
18595 metro-core@0.87.1:
1928118596 dependencies:
1928218597 flow-enums-runtime: 0.0.6
1928318598 lodash.throttle: 4.1.1
19284 metro-resolver: 0.84.4
19285
19286 metro-core@0.84.5:
19287 dependencies:
19288 flow-enums-runtime: 0.0.6
19289 lodash.throttle: 4.1.1
19290 metro-resolver: 0.84.5
19291
19292 metro-file-map@0.84.4:
19293 dependencies:
19294 debug: 4.4.3
19295 fb-watchman: 2.0.2
19296 flow-enums-runtime: 0.0.6
19297 graceful-fs: 4.2.11
19298 invariant: 2.2.4
19299 jest-worker: 29.7.0
19300 micromatch: 4.0.8
19301 nullthrows: 1.1.1
19302 walker: 1.0.8
19303 transitivePeerDependencies:
19304 - supports-color
18599 metro-resolver: 0.87.1
1930518600
19306 metro-file-map@0.84.5:
18601 metro-file-map@0.87.1:
1930718602 dependencies:
1930818603 debug: 4.4.3
1930918604 fb-watchman: 2.0.2
......@@ -19313,89 +18608,49 @@ snapshots:
1931318608 jest-worker: 29.7.0
1931418609 micromatch: 4.0.8
1931518610 nullthrows: 1.1.1
19316 walker: 1.0.8
1931718611 transitivePeerDependencies:
1931818612 - supports-color
1931918613
19320 metro-minify-terser@0.84.4:
18614 metro-minify-terser@0.87.1:
1932118615 dependencies:
1932218616 flow-enums-runtime: 0.0.6
1932318617 terser: 5.48.0
1932418618
19325 metro-minify-terser@0.84.5:
18619 metro-resolver@0.87.1:
1932618620 dependencies:
1932718621 flow-enums-runtime: 0.0.6
19328 terser: 5.48.0
19329
19330 metro-resolver@0.84.4:
19331 dependencies:
19332 flow-enums-runtime: 0.0.6
19333
19334 metro-resolver@0.84.5:
19335 dependencies:
19336 flow-enums-runtime: 0.0.6
19337
19338 metro-runtime@0.84.4:
19339 dependencies:
19340 '@babel/runtime': 7.29.7
19341 flow-enums-runtime: 0.0.6
1934218622
19343 metro-runtime@0.84.5:
18623 metro-runtime@0.87.1:
1934418624 dependencies:
1934518625 '@babel/runtime': 7.29.7
1934618626 flow-enums-runtime: 0.0.6
1934718627
19348 metro-source-map@0.84.4:
19349 dependencies:
19350 '@babel/traverse': 7.29.7
19351 '@babel/types': 7.29.7
19352 flow-enums-runtime: 0.0.6
19353 invariant: 2.2.4
19354 metro-symbolicate: 0.84.4
19355 nullthrows: 1.1.1
19356 ob1: 0.84.4
19357 source-map: 0.5.7
19358 vlq: 1.0.1
19359 transitivePeerDependencies:
19360 - supports-color
19361
19362 metro-source-map@0.84.5:
18628 metro-source-map@0.87.1:
1936318629 dependencies:
1936418630 '@babel/traverse': 7.29.7
1936518631 '@babel/types': 7.29.8
1936618632 flow-enums-runtime: 0.0.6
1936718633 invariant: 2.2.4
19368 metro-symbolicate: 0.84.5
19369 nullthrows: 1.1.1
19370 ob1: 0.84.5
19371 source-map: 0.5.7
19372 vlq: 1.0.1
19373 transitivePeerDependencies:
19374 - supports-color
19375
19376 metro-symbolicate@0.84.4:
19377 dependencies:
19378 flow-enums-runtime: 0.0.6
19379 invariant: 2.2.4
19380 metro-source-map: 0.84.4
18634 metro-symbolicate: 0.87.1
1938118635 nullthrows: 1.1.1
18636 ob1: 0.87.1
1938218637 source-map: 0.5.7
1938318638 vlq: 1.0.1
1938418639 transitivePeerDependencies:
1938518640 - supports-color
1938618641
19387 metro-symbolicate@0.84.5:
18642 metro-symbolicate@0.87.1:
1938818643 dependencies:
1938918644 flow-enums-runtime: 0.0.6
1939018645 invariant: 2.2.4
19391 metro-source-map: 0.84.5
18646 metro-source-map: 0.87.1
1939218647 nullthrows: 1.1.1
1939318648 source-map: 0.5.7
1939418649 vlq: 1.0.1
1939518650 transitivePeerDependencies:
1939618651 - supports-color
1939718652
19398 metro-transform-plugins@0.84.4:
18653 metro-transform-plugins@0.87.1:
1939918654 dependencies:
1940018655 '@babel/core': 7.29.7
1940118656 '@babel/generator': 7.29.7
......@@ -19406,104 +18661,27 @@ snapshots:
1940618661 transitivePeerDependencies:
1940718662 - supports-color
1940818663
19409 metro-transform-plugins@0.84.5:
19410 dependencies:
19411 '@babel/core': 7.29.7
19412 '@babel/generator': 7.29.7
19413 '@babel/template': 7.29.7
19414 '@babel/traverse': 7.29.7
19415 flow-enums-runtime: 0.0.6
19416 nullthrows: 1.1.1
19417 transitivePeerDependencies:
19418 - supports-color
19419
19420 metro-transform-worker@0.84.4(bufferutil@4.1.0)(utf-8-validate@6.0.6):
18664 metro-transform-worker@0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6):
1942118665 dependencies:
1942218666 '@babel/core': 7.29.7
1942318667 '@babel/generator': 7.29.7
1942418668 '@babel/parser': 7.29.8
1942518669 '@babel/types': 7.29.8
1942618670 flow-enums-runtime: 0.0.6
19427 metro: 0.84.4(bufferutil@4.1.0)(utf-8-validate@6.0.6)
19428 metro-babel-transformer: 0.84.4
19429 metro-cache: 0.84.4
19430 metro-cache-key: 0.84.4
19431 metro-minify-terser: 0.84.4
19432 metro-source-map: 0.84.4
19433 metro-transform-plugins: 0.84.4
18671 metro: 0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)
18672 metro-babel-transformer: 0.87.1
18673 metro-cache: 0.87.1
18674 metro-cache-key: 0.87.1
18675 metro-minify-terser: 0.87.1
18676 metro-source-map: 0.87.1
18677 metro-transform-plugins: 0.87.1
1943418678 nullthrows: 1.1.1
1943518679 transitivePeerDependencies:
1943618680 - bufferutil
1943718681 - supports-color
1943818682 - utf-8-validate
1943918683
19440 metro-transform-worker@0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6):
19441 dependencies:
19442 '@babel/core': 7.29.7
19443 '@babel/generator': 7.29.7
19444 '@babel/parser': 7.29.8
19445 '@babel/types': 7.29.8
19446 flow-enums-runtime: 0.0.6
19447 metro: 0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6)
19448 metro-babel-transformer: 0.84.5
19449 metro-cache: 0.84.5
19450 metro-cache-key: 0.84.5
19451 metro-minify-terser: 0.84.5
19452 metro-source-map: 0.84.5
19453 metro-transform-plugins: 0.84.5
19454 nullthrows: 1.1.1
19455 transitivePeerDependencies:
19456 - bufferutil
19457 - supports-color
19458 - utf-8-validate
19459
19460 metro@0.84.4(bufferutil@4.1.0)(utf-8-validate@6.0.6):
19461 dependencies:
19462 '@babel/code-frame': 7.29.7
19463 '@babel/core': 7.29.7
19464 '@babel/generator': 7.29.7
19465 '@babel/parser': 7.29.7
19466 '@babel/template': 7.29.7
19467 '@babel/traverse': 7.29.7
19468 '@babel/types': 7.29.7
19469 accepts: 2.0.0
19470 ci-info: 2.0.0
19471 connect: 3.7.0
19472 debug: 4.4.3
19473 error-stack-parser: 2.1.4
19474 flow-enums-runtime: 0.0.6
19475 graceful-fs: 4.2.11
19476 hermes-parser: 0.35.0
19477 image-size: 1.2.1
19478 invariant: 2.2.4
19479 jest-worker: 29.7.0
19480 jsc-safe-url: 0.2.4
19481 lodash.throttle: 4.1.1
19482 metro-babel-transformer: 0.84.4
19483 metro-cache: 0.84.4
19484 metro-cache-key: 0.84.4
19485 metro-config: 0.84.4(bufferutil@4.1.0)(utf-8-validate@6.0.6)
19486 metro-core: 0.84.4
19487 metro-file-map: 0.84.4
19488 metro-resolver: 0.84.4
19489 metro-runtime: 0.84.4
19490 metro-source-map: 0.84.4
19491 metro-symbolicate: 0.84.4
19492 metro-transform-plugins: 0.84.4
19493 metro-transform-worker: 0.84.4(bufferutil@4.1.0)(utf-8-validate@6.0.6)
19494 mime-types: 3.0.2
19495 nullthrows: 1.1.1
19496 serialize-error: 2.1.0
19497 source-map: 0.5.7
19498 throat: 5.0.0
19499 ws: 7.5.11(bufferutil@4.1.0)(utf-8-validate@6.0.6)
19500 yargs: 17.7.2
19501 transitivePeerDependencies:
19502 - bufferutil
19503 - supports-color
19504 - utf-8-validate
19505
19506 metro@0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6):
18684 metro@0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6):
1950718685 dependencies:
1950818686 '@babel/code-frame': 7.29.7
1950918687 '@babel/core': 7.29.7
......@@ -19513,29 +18691,28 @@ snapshots:
1951318691 '@babel/traverse': 7.29.7
1951418692 '@babel/types': 7.29.8
1951518693 accepts: 2.0.0
19516 ci-info: 2.0.0
1951718694 connect: 3.7.0
1951818695 debug: 4.4.3
1951918696 error-stack-parser: 2.1.4
1952018697 flow-enums-runtime: 0.0.6
18698 flow-parser: 0.331.0
1952118699 graceful-fs: 4.2.11
19522 hermes-parser: 0.35.0
1952318700 invariant: 2.2.4
1952418701 jest-worker: 29.7.0
1952518702 jsc-safe-url: 0.2.4
1952618703 lodash.throttle: 4.1.1
19527 metro-babel-transformer: 0.84.5
19528 metro-cache: 0.84.5
19529 metro-cache-key: 0.84.5
19530 metro-config: 0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6)
19531 metro-core: 0.84.5
19532 metro-file-map: 0.84.5
19533 metro-resolver: 0.84.5
19534 metro-runtime: 0.84.5
19535 metro-source-map: 0.84.5
19536 metro-symbolicate: 0.84.5
19537 metro-transform-plugins: 0.84.5
19538 metro-transform-worker: 0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6)
18704 metro-babel-transformer: 0.87.1
18705 metro-cache: 0.87.1
18706 metro-cache-key: 0.87.1
18707 metro-config: 0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)
18708 metro-core: 0.87.1
18709 metro-file-map: 0.87.1
18710 metro-resolver: 0.87.1
18711 metro-runtime: 0.87.1
18712 metro-source-map: 0.87.1
18713 metro-symbolicate: 0.87.1
18714 metro-transform-plugins: 0.87.1
18715 metro-transform-worker: 0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)
1953918716 mime-types: 3.0.2
1954018717 nullthrows: 1.1.1
1954118718 serialize-error: 2.1.0
......@@ -19812,8 +18989,6 @@ snapshots:
1981218989 dependencies:
1981318990 minimist: 1.2.8
1981418991
19815 mkdirp@1.0.4: {}
19816
1981718992 modern-tar@0.8.5: {}
1981818993
1981918994 mongodb-connection-string-url@3.0.2:
......@@ -19947,6 +19122,20 @@ snapshots:
1994719122
1994819123 normalize-url@6.1.0: {}
1994919124
19125 noxcturnal@0.1.1:
19126 dependencies:
19127 '@babel/code-frame': 7.29.7
19128 '@oxc-project/types': 0.141.0
19129 optionalDependencies:
19130 '@noxcturnal/noxcturnal-darwin-arm64': 0.1.1
19131 '@noxcturnal/noxcturnal-darwin-x64': 0.1.1
19132 '@noxcturnal/noxcturnal-linux-arm64-gnu': 0.1.1
19133 '@noxcturnal/noxcturnal-linux-arm64-musl': 0.1.1
19134 '@noxcturnal/noxcturnal-linux-x64-gnu': 0.1.1
19135 '@noxcturnal/noxcturnal-linux-x64-musl': 0.1.1
19136 '@noxcturnal/noxcturnal-win32-arm64-msvc': 0.1.1
19137 '@noxcturnal/noxcturnal-win32-x64-msvc': 0.1.1
19138
1995019139 npm-package-arg@11.0.3:
1995119140 dependencies:
1995219141 hosted-git-info: 7.0.2
......@@ -19991,11 +19180,7 @@ snapshots:
1999119180 should: 13.2.3
1999219181 yaml: 2.9.0
1999319182
19994 ob1@0.84.4:
19995 dependencies:
19996 flow-enums-runtime: 0.0.6
19997
19998 ob1@0.84.5:
19183 ob1@0.87.1:
1999919184 dependencies:
2000019185 flow-enums-runtime: 0.0.6
2000119186
......@@ -20050,8 +19235,9 @@ snapshots:
2005019235 regex: 6.1.0
2005119236 regex-recursion: 6.0.2
2005219237
20053 open@7.4.2:
19238 open@8.4.2:
2005419239 dependencies:
19240 define-lazy-prop: 2.0.0
2005519241 is-docker: 2.2.1
2005619242 is-wsl: 2.2.0
2005719243
......@@ -20573,10 +19759,6 @@ snapshots:
2057319759 split-on-first: 1.1.0
2057419760 strict-uri-encode: 2.0.0
2057519761
20576 queue@6.0.2:
20577 dependencies:
20578 inherits: 2.0.4
20579
2058019762 quick-lru@5.1.1: {}
2058119763
2058219764 radix3@1.1.2: {}
......@@ -20590,13 +19772,13 @@ snapshots:
2059019772 iconv-lite: 0.7.2
2059119773 unpipe: 1.0.0
2059219774
20593 react-day-picker@10.0.1(@types/react@19.2.16)(react@19.2.6):
19775 react-day-picker@10.0.1(@types/react@19.3.0)(react@19.2.6):
2059419776 dependencies:
2059519777 '@date-fns/tz': 1.5.0
2059619778 date-fns: 4.4.0
2059719779 react: 19.2.6
2059819780 optionalDependencies:
20599 '@types/react': 19.2.16
19781 '@types/react': 19.3.0
2060019782
2060119783 react-devtools-core@6.1.5(bufferutil@4.1.0)(utf-8-validate@6.0.6):
2060219784 dependencies:
......@@ -20606,19 +19788,19 @@ snapshots:
2060619788 - bufferutil
2060719789 - utf-8-validate
2060819790
20609 react-dom@19.2.3(react@19.2.3):
20610 dependencies:
20611 react: 19.2.3
20612 scheduler: 0.27.0
20613
2061419791 react-dom@19.2.6(react@19.2.6):
2061519792 dependencies:
2061619793 react: 19.2.6
2061719794 scheduler: 0.27.0
2061819795
20619 react-freeze@1.0.4(react@19.2.3):
19796 react-dom@19.3.0(react@19.3.0):
19797 dependencies:
19798 react: 19.3.0
19799 scheduler: 0.28.0
19800
19801 react-freeze@1.0.4(react@19.3.0):
2062019802 dependencies:
20621 react: 19.2.3
19803 react: 19.3.0
2062219804
2062319805 react-grab@0.1.44(react@19.2.6):
2062419806 dependencies:
......@@ -20627,19 +19809,17 @@ snapshots:
2062719809 optionalDependencies:
2062819810 react: 19.2.6
2062919811
20630 react-is@16.13.1: {}
20631
2063219812 react-is@17.0.2: {}
2063319813
2063419814 react-is@18.3.1: {}
2063519815
2063619816 react-is@19.2.7: {}
2063719817
20638 react-markdown@10.1.0(@types/react@19.2.16)(react@19.2.6):
19818 react-markdown@10.1.0(@types/react@19.3.0)(react@19.2.6):
2063919819 dependencies:
2064019820 '@types/hast': 3.0.4
2064119821 '@types/mdast': 4.0.4
20642 '@types/react': 19.2.16
19822 '@types/react': 19.3.0
2064319823 devlop: 1.1.0
2064419824 hast-util-to-jsx-runtime: 2.3.6
2064519825 html-url-attributes: 3.0.1
......@@ -20653,122 +19833,89 @@ snapshots:
2065319833 transitivePeerDependencies:
2065419834 - supports-color
2065519835
20656 react-native-gesture-handler@2.32.0(patch_hash=0579f8e4dad02bf3183d95b02620358412983c36f9bda7425dc8bcb9643b5ce2)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
19836 react-native-gesture-handler@3.2.1(patch_hash=d518a937e3cb2df5e7d67f1ab6b265c74a8639e4572d1b032b7b747e9b1c01a9)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0):
2065719837 dependencies:
20658 '@egjs/hammerjs': 2.0.17
2065919838 '@types/react-test-renderer': 19.1.0
20660 hoist-non-react-statics: 3.3.2
2066119839 invariant: 2.2.4
20662 react: 19.2.3
20663 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
19840 react: 19.3.0
19841 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
2066419842
20665 react-native-image-viewing@0.2.2(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
19843 react-native-image-viewing@0.2.2(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0):
2066619844 dependencies:
20667 react: 19.2.3
20668 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
19845 react: 19.3.0
19846 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
2066919847
20670 react-native-is-edge-to-edge@1.3.1(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
19848 react-native-is-edge-to-edge@1.3.1(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0):
2067119849 dependencies:
20672 react: 19.2.3
20673 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
19850 react: 19.3.0
19851 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
2067419852
20675 ? react-native-keyboard-controller@1.21.13(patch_hash=6e4339347bc5bb3c9ea67d85ff5c814058b211c5750f247aba59d07869a2e787)(react-native-reanimated@4.5.5(patch_hash=bae9878a5bdba94e11c890e5ee164542feb622624fc81c13890063094608216d)(react-native-worklets@0.11.4(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
20676 : dependencies:
20677 react: 19.2.3
20678 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
20679 react-native-is-edge-to-edge: 1.3.1(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
20680 react-native-reanimated: 4.5.5(patch_hash=bae9878a5bdba94e11c890e5ee164542feb622624fc81c13890063094608216d)(react-native-worklets@0.11.4(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
19853 react-native-keyboard-controller@1.22.4(patch_hash=a438114039aed2e280a81d95c25723132ad071e4768fe492bd92aa628ad74597)(react-native-reanimated@4.7.0(react-native-worklets@0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0):
19854 dependencies:
19855 react: 19.3.0
19856 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
19857 react-native-is-edge-to-edge: 1.3.1(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
19858 react-native-reanimated: 4.7.0(react-native-worklets@0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
2068119859
20682 react-native-nitro-markdown@0.5.8(patch_hash=642b47830730acff3761fe29cf54271d18b493c0070c750097850b7ea032e00c)(react-native-nitro-modules@0.35.9(patch_hash=825622aae63a8fb5b904f3c77908a0e216261d727ea171709f2c0b6088422675)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native-svg@15.15.4(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
19860 react-native-nitro-markdown@0.5.8(patch_hash=642b47830730acff3761fe29cf54271d18b493c0070c750097850b7ea032e00c)(react-native-nitro-modules@0.35.9(patch_hash=daf4a639ce3f951af630a3711e4082d58e3a11e5a79f45efb0b59925327ebde2)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native-svg@15.15.5(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0):
2068319861 dependencies:
20684 react: 19.2.3
20685 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
20686 react-native-nitro-modules: 0.35.9(patch_hash=825622aae63a8fb5b904f3c77908a0e216261d727ea171709f2c0b6088422675)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
19862 react: 19.3.0
19863 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
19864 react-native-nitro-modules: 0.35.9(patch_hash=daf4a639ce3f951af630a3711e4082d58e3a11e5a79f45efb0b59925327ebde2)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
2068719865 optionalDependencies:
20688 react-native-svg: 15.15.4(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
19866 react-native-svg: 15.15.5(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
2068919867
20690 react-native-nitro-modules@0.35.9(patch_hash=825622aae63a8fb5b904f3c77908a0e216261d727ea171709f2c0b6088422675)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
19868 react-native-nitro-modules@0.35.9(patch_hash=daf4a639ce3f951af630a3711e4082d58e3a11e5a79f45efb0b59925327ebde2)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0):
2069119869 dependencies:
20692 react: 19.2.3
20693 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
19870 react: 19.3.0
19871 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
2069419872
20695 react-native-reanimated@4.5.5(patch_hash=bae9878a5bdba94e11c890e5ee164542feb622624fc81c13890063094608216d)(react-native-worklets@0.11.4(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
19873 react-native-reanimated@4.7.0(react-native-worklets@0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0):
2069619874 dependencies:
20697 react: 19.2.3
20698 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
20699 react-native-is-edge-to-edge: 1.3.1(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
20700 react-native-worklets: 0.11.4(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
19875 react: 19.3.0
19876 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
19877 react-native-is-edge-to-edge: 1.3.1(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
19878 react-native-worklets: 0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
2070119879 semver: 7.8.5
2070219880
20703 react-native-safe-area-context@5.7.0(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
19881 react-native-safe-area-context@5.9.1(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0):
2070419882 dependencies:
20705 react: 19.2.3
20706 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
19883 react: 19.3.0
19884 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
2070719885
20708 react-native-screens@4.26.2(patch_hash=595114f3f9ce8b9f0d99d1aafe5c12c997b7d75ca9add31d46cbedbfe347b8e0)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
19886 react-native-screens@4.28.0(patch_hash=cc1301436ee62c39860acc9ee1a1e60b7d47e6abd211c42effa62c056d165483)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0):
2070919887 dependencies:
20710 react: 19.2.3
20711 react-freeze: 1.0.4(react@19.2.3)
20712 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
19888 react: 19.3.0
19889 react-freeze: 1.0.4(react@19.3.0)
19890 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
2071319891 warn-once: 0.1.1
2071419892
20715 react-native-shiki-engine@0.3.12(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
19893 react-native-shiki-engine@0.3.12(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0):
2071619894 dependencies:
2071719895 '@shikijs/types': 4.3.0
2071819896 '@shikijs/vscode-textmate': 10.0.2
20719 react: 19.2.3
20720 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
19897 react: 19.3.0
19898 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
2072119899
20722 react-native-svg@15.15.4(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
19900 react-native-svg@15.15.5(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0):
2072319901 dependencies:
2072419902 css-select: 5.2.2
2072519903 css-tree: 1.1.3
20726 react: 19.2.3
20727 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
20728 warn-once: 0.1.1
20729
20730 react-native-url-polyfill@4.0.0(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)):
20731 dependencies:
20732 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
19904 react: 19.3.0
19905 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
2073319906
20734 react-native-webview@13.16.1(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
19907 react-native-url-polyfill@4.0.0(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)):
2073519908 dependencies:
20736 escape-string-regexp: 4.0.0
20737 invariant: 2.2.4
20738 react: 19.2.3
20739 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
19909 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
2074019910
20741 react-native-webview@13.16.1(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6):
19911 react-native-webview@14.0.1(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0):
2074219912 dependencies:
2074319913 escape-string-regexp: 4.0.0
2074419914 invariant: 2.2.4
20745 react: 19.2.6
20746 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)
20747 optional: true
20748
20749 react-native-worklets@0.10.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6):
20750 dependencies:
20751 '@babel/core': 7.29.7
20752 '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.29.7)
20753 '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.29.7)
20754 '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.29.7)
20755 '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.29.7)
20756 '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7)
20757 '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.29.7)
20758 '@babel/plugin-transform-template-literals': 7.29.7(@babel/core@7.29.7)
20759 '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7)
20760 '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7)
20761 '@babel/types': 7.29.8
20762 '@react-native/metro-config': 0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6)
20763 convert-source-map: 2.0.0
20764 react: 19.2.6
20765 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6)
20766 semver: 7.8.5
20767 transitivePeerDependencies:
20768 - supports-color
20769 optional: true
19915 react: 19.3.0
19916 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
2077019917
20771 react-native-worklets@0.11.4(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
19918 react-native-worklets@0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0):
2077219919 dependencies:
2077319920 '@babel/core': 7.29.7
2077419921 '@babel/generator': 7.29.7
......@@ -20782,89 +19929,43 @@ snapshots:
2078219929 '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7)
2078319930 '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7)
2078419931 '@babel/traverse': 7.29.7
20785 '@babel/types': 7.29.7
20786 '@react-native/metro-config': 0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6)
19932 '@babel/types': 7.29.8
19933 '@jridgewell/remapping': 2.3.5
19934 '@react-native/metro-config': 0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6)
2078719935 convert-source-map: 2.0.0
20788 react: 19.2.3
20789 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
20790 semver: 7.8.5
20791 transitivePeerDependencies:
20792 - supports-color
20793
20794 react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6):
20795 dependencies:
20796 '@react-native/assets-registry': 0.86.3
20797 '@react-native/codegen': 0.86.3(@babel/core@7.29.7)
20798 '@react-native/community-cli-plugin': 0.86.3(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(utf-8-validate@6.0.6)
20799 '@react-native/gradle-plugin': 0.86.3
20800 '@react-native/js-polyfills': 0.86.3
20801 '@react-native/normalize-colors': 0.86.3
20802 '@react-native/virtualized-lists': 0.86.3(@types/react@19.2.16)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
20803 abort-controller: 3.0.0
20804 anser: 1.4.10
20805 ansi-regex: 5.0.1
20806 babel-plugin-syntax-hermes-parser: 0.36.0
20807 base64-js: 1.5.1
20808 commander: 12.1.0
20809 flow-enums-runtime: 0.0.6
20810 hermes-compiler: 250829098.0.17
20811 invariant: 2.2.4
20812 memoize-one: 5.2.1
20813 metro-runtime: 0.84.4
20814 metro-source-map: 0.84.4
20815 nullthrows: 1.1.1
20816 pretty-format: 29.7.0
20817 promise: 8.3.0
20818 react: 19.2.3
20819 react-devtools-core: 6.1.5(bufferutil@4.1.0)(utf-8-validate@6.0.6)
20820 react-refresh: 0.14.2
20821 regenerator-runtime: 0.13.11
20822 scheduler: 0.27.0
19936 react: 19.3.0
19937 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
2082319938 semver: 7.8.5
20824 stacktrace-parser: 0.1.11
20825 tinyglobby: 0.2.17
2082619939 whatwg-fetch: 3.6.20
20827 ws: 7.5.11(bufferutil@4.1.0)(utf-8-validate@6.0.6)
20828 yargs: 17.7.2
20829 optionalDependencies:
20830 '@types/react': 19.2.16
2083119940 transitivePeerDependencies:
20832 - '@babel/core'
20833 - '@react-native-community/cli'
20834 - '@react-native/metro-config'
20835 - bufferutil
2083619941 - supports-color
20837 - utf-8-validate
2083819942
20839 react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6):
19943 react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6):
2084019944 dependencies:
20841 '@react-native/assets-registry': 0.86.3
20842 '@react-native/codegen': 0.86.3(@babel/core@7.29.7)
20843 '@react-native/community-cli-plugin': 0.86.3(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(utf-8-validate@6.0.6)
20844 '@react-native/gradle-plugin': 0.86.3
20845 '@react-native/js-polyfills': 0.86.3
20846 '@react-native/normalize-colors': 0.86.3
20847 '@react-native/virtualized-lists': 0.86.3(@types/react@19.2.16)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6)
20848 abort-controller: 3.0.0
19945 '@react-native/asset-utils': 0.88.0-rc.3
19946 '@react-native/codegen': 0.88.0-rc.3(@babel/core@7.29.7)
19947 '@react-native/community-cli-plugin': 0.88.0-rc.3(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(utf-8-validate@6.0.6)
19948 '@react-native/gradle-plugin': 0.88.0-rc.3
19949 '@react-native/normalize-colors': 0.88.0-rc.3
19950 '@react-native/virtualized-lists': 0.88.0-rc.3(@types/react@19.3.0)(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)
2084919951 anser: 1.4.10
2085019952 ansi-regex: 5.0.1
20851 babel-plugin-syntax-hermes-parser: 0.36.0
2085219953 base64-js: 1.5.1
20853 commander: 12.1.0
2085419954 flow-enums-runtime: 0.0.6
20855 hermes-compiler: 250829098.0.17
19955 flow-parser: 0.327.0
19956 hermes-compiler: 260318099.0.4
2085619957 invariant: 2.2.4
2085719958 memoize-one: 5.2.1
20858 metro-runtime: 0.84.4
20859 metro-source-map: 0.84.4
19959 metro-runtime: 0.87.1
19960 metro-source-map: 0.87.1
2086019961 nullthrows: 1.1.1
2086119962 pretty-format: 29.7.0
2086219963 promise: 8.3.0
20863 react: 19.2.6
19964 react: 19.3.0
2086419965 react-devtools-core: 6.1.5(bufferutil@4.1.0)(utf-8-validate@6.0.6)
2086519966 react-refresh: 0.14.2
2086619967 regenerator-runtime: 0.13.11
20867 scheduler: 0.27.0
19968 scheduler: 0.28.0
2086819969 semver: 7.8.5
2086919970 stacktrace-parser: 0.1.11
2087019971 tinyglobby: 0.2.17
......@@ -20872,7 +19973,7 @@ snapshots:
2087219973 ws: 7.5.11(bufferutil@4.1.0)(utf-8-validate@6.0.6)
2087319974 yargs: 17.7.2
2087419975 optionalDependencies:
20875 '@types/react': 19.2.16
19976 '@types/react': 19.3.0
2087619977 transitivePeerDependencies:
2087719978 - '@babel/core'
2087819979 - '@react-native-community/cli'
......@@ -20880,47 +19981,19 @@ snapshots:
2088019981 - bufferutil
2088119982 - supports-color
2088219983 - utf-8-validate
20883 optional: true
2088419984
2088519985 react-refresh@0.14.2: {}
2088619986
20887 react-remove-scroll-bar@2.3.8(@types/react@19.2.16)(react@19.2.3):
20888 dependencies:
20889 react: 19.2.3
20890 react-style-singleton: 2.2.3(@types/react@19.2.16)(react@19.2.3)
20891 tslib: 2.8.1
20892 optionalDependencies:
20893 '@types/react': 19.2.16
20894
20895 react-remove-scroll@2.7.2(@types/react@19.2.16)(react@19.2.3):
20896 dependencies:
20897 react: 19.2.3
20898 react-remove-scroll-bar: 2.3.8(@types/react@19.2.16)(react@19.2.3)
20899 react-style-singleton: 2.2.3(@types/react@19.2.16)(react@19.2.3)
20900 tslib: 2.8.1
20901 use-callback-ref: 1.3.3(@types/react@19.2.16)(react@19.2.3)
20902 use-sidecar: 1.1.3(@types/react@19.2.16)(react@19.2.3)
20903 optionalDependencies:
20904 '@types/react': 19.2.16
20905
20906 react-style-singleton@2.2.3(@types/react@19.2.16)(react@19.2.3):
20907 dependencies:
20908 get-nonce: 1.0.1
20909 react: 19.2.3
20910 tslib: 2.8.1
20911 optionalDependencies:
20912 '@types/react': 19.2.16
20913
2091419987 react-test-renderer@19.2.6(react@19.2.6):
2091519988 dependencies:
2091619989 react: 19.2.6
2091719990 react-is: 19.2.7
2091819991 scheduler: 0.27.0
2091919992
20920 react@19.2.3: {}
20921
2092219993 react@19.2.6: {}
2092319994
19995 react@19.3.0: {}
19996
2092419997 read-binary-file-arch@1.0.6:
2092519998 dependencies:
2092619999 debug: 4.4.3
......@@ -21206,6 +20279,8 @@ snapshots:
2120620279
2120720280 scheduler@0.27.0: {}
2120820281
20282 scheduler@0.28.0: {}
20283
2120920284 schema-utils@4.3.3:
2121020285 dependencies:
2121120286 '@types/json-schema': 7.0.15
......@@ -21874,20 +20949,20 @@ snapshots:
2187420949
2187520950 universalify@2.0.1: {}
2187620951
21877 uniwind@1.11.0(patch_hash=a91f3953483cfd434436de6358ff5b63c49974ef148fad91246c26ba95332625)(@expo/metro-config@57.0.12(patch_hash=96f1a75347e6ea02dc4b7034ace815d8ee39e18b8166ebfb573d9e58328f0dc2)(bufferutil@4.1.0)(expo@57.0.18)(typescript@7.0.2)(utf-8-validate@6.0.6))(metro-cache@0.84.5)(metro-transform-worker@0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6))(metro@0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(tailwindcss@4.3.3):
20952 uniwind@1.11.0(patch_hash=a91f3953483cfd434436de6358ff5b63c49974ef148fad91246c26ba95332625)(@expo/metro-config@58.0.6(patch_hash=90fa980e8b6480631fb2fbb04559834e3c612db40c550cd828f11be297d8d760)(bufferutil@4.1.0)(expo@58.0.0)(typescript@7.0.2)(utf-8-validate@6.0.6))(metro-cache@0.87.1)(metro-transform-worker@0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6))(metro@0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(tailwindcss@4.3.3):
2187820953 dependencies:
2187920954 '@tailwindcss/node': 4.3.3
2188020955 '@tailwindcss/oxide': 4.3.3
2188120956 culori: 4.0.2
2188220957 lightningcss: 1.33.0
21883 metro: 0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6)
21884 metro-cache: 0.84.5
21885 react: 19.2.3
21886 react-native: 0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
20958 metro: 0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)
20959 metro-cache: 0.87.1
20960 react: 19.3.0
20961 react-native: 0.88.0-rc.3(@babel/core@7.29.7)(@react-native/metro-config@0.88.0-rc.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)
2188720962 tailwindcss: 4.3.3
2188820963 optionalDependencies:
21889 '@expo/metro-config': 57.0.12(patch_hash=96f1a75347e6ea02dc4b7034ace815d8ee39e18b8166ebfb573d9e58328f0dc2)(bufferutil@4.1.0)(expo@57.0.18)(typescript@7.0.2)(utf-8-validate@6.0.6)
21890 metro-transform-worker: 0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6)
20964 '@expo/metro-config': 58.0.6(patch_hash=90fa980e8b6480631fb2fbb04559834e3c612db40c550cd828f11be297d8d760)(bufferutil@4.1.0)(expo@58.0.0)(typescript@7.0.2)(utf-8-validate@6.0.6)
20965 metro-transform-worker: 0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6)
2189120966
2189220967 unpipe@1.0.0: {}
2189320968
......@@ -21939,33 +21014,18 @@ snapshots:
2193921014 punycode: 2.3.1
2194021015 optional: true
2194121016
21942 use-callback-ref@1.3.3(@types/react@19.2.16)(react@19.2.3):
21943 dependencies:
21944 react: 19.2.3
21945 tslib: 2.8.1
21946 optionalDependencies:
21947 '@types/react': 19.2.16
21948
21949 use-latest-callback@0.2.6(react@19.2.3):
21017 use-latest-callback@0.2.6(react@19.3.0):
2195021018 dependencies:
21951 react: 19.2.3
21952
21953 use-sidecar@1.1.3(@types/react@19.2.16)(react@19.2.3):
21954 dependencies:
21955 detect-node-es: 1.1.0
21956 react: 19.2.3
21957 tslib: 2.8.1
21958 optionalDependencies:
21959 '@types/react': 19.2.16
21960
21961 use-sync-external-store@1.6.0(react@19.2.3):
21962 dependencies:
21963 react: 19.2.3
21019 react: 19.3.0
2196421020
2196521021 use-sync-external-store@1.6.0(react@19.2.6):
2196621022 dependencies:
2196721023 react: 19.2.6
2196821024
21025 use-sync-external-store@1.6.0(react@19.3.0):
21026 dependencies:
21027 react: 19.3.0
21028
2196921029 utf-8-validate@6.0.6:
2197021030 dependencies:
2197121031 node-gyp-build: 4.8.4
......@@ -21988,15 +21048,6 @@ snapshots:
2198821048
2198921049 vary@1.1.2: {}
2199021050
21991 vaul@1.1.2(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.3(react@19.2.3))(react@19.2.3):
21992 dependencies:
21993 '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
21994 react: 19.2.3
21995 react-dom: 19.2.3(react@19.2.3)
21996 transitivePeerDependencies:
21997 - '@types/react'
21998 - '@types/react-dom'
21999
2200021051 vfile-location@5.0.3:
2200121052 dependencies:
2200221053 '@types/unist': 3.0.3
......@@ -22235,7 +21286,7 @@ snapshots:
2223521286
2223621287 whatwg-mimetype@5.0.0: {}
2223721288
22238 whatwg-url-minimum@0.1.2: {}
21289 whatwg-url-minimum@0.2.0: {}
2223921290
2224021291 whatwg-url@14.2.0:
2224121292 dependencies:
......@@ -22461,9 +21512,9 @@ snapshots:
2246121512
2246221513 zod@4.6.5: {}
2246321514
22464 zustand@5.0.14(@types/react@19.2.16)(react@19.2.6)(use-sync-external-store@1.6.0(react@19.2.6)):
21515 zustand@5.0.14(@types/react@19.3.0)(react@19.2.6)(use-sync-external-store@1.6.0(react@19.2.6)):
2246521516 optionalDependencies:
22466 '@types/react': 19.2.16
21517 '@types/react': 19.3.0
2246721518 react: 19.2.6
2246821519 use-sync-external-store: 1.6.0(react@19.2.6)
2246921520
pnpm-workspace.yaml+77-30
......@@ -54,6 +54,9 @@ catalog:
5454 yaml: ^2.9.0
5555
5656minimumReleaseAgeExclude:
57 - expo-glass-effect@58.0.3
58 - expo-blur@58.0.2
59 - expo-audio@58.0.3
5760 - "@clerk/backend@3.18.1"
5861 - "@clerk/clerk-js@6.32.1"
5962 - "@clerk/electron@0.0.44"
......@@ -75,15 +78,40 @@ minimumReleaseAgeExclude:
7578 - alchemy@2.0.0-beta.79
7679 - effect@4.0.0-rc.115
7780 - "@legendapp/list@3.3.5"
78 - "@expo/cli@57.0.20"
79 - "@expo/env@2.4.3"
80 - "@expo/fingerprint@0.20.11"
81 - "@expo/metro-config@57.0.12"
82 - expo-constants@57.0.16
83 - expo-font@57.0.2
84 - expo-updates@57.0.19
85 - expo@57.0.18
86 - expo-widgets@57.0.15
81 - "@expo/cli@58.0.9"
82 - "@expo/env@2.5.1"
83 - "@expo/fingerprint@0.21.2"
84 - "@expo/metro-config@58.0.6"
85 - expo-constants@58.0.9
86 - expo-font@58.0.4
87 - expo-updates@58.0.11
88 - expo@58.0.0
89 - expo-widgets@58.0.9
90 - "@expo/config-plugins@58.0.4"
91 - "@expo/log-box@58.0.7"
92 - "@expo/metro-file-map@58.0.3"
93 - "@expo/metro-runtime@58.0.9"
94 - "@expo/metro@58.0.0-rc.0"
95 - "@expo/prebuild-config@58.0.6"
96 - "@expo/router-server@58.0.4"
97 - "@expo/ui@58.0.9"
98 - babel-preset-expo@58.0.6
99 - expo-asset@58.0.9
100 - expo-build-properties@58.0.9
101 - expo-dev-client@58.0.9
102 - expo-dev-launcher@58.0.9
103 - expo-dev-menu@58.0.9
104 - expo-image-manipulator@58.0.10
105 - expo-image-picker@58.0.9
106 - expo-image@58.0.8
107 - expo-linking@58.0.9
108 - expo-modules-autolinking@58.0.6
109 - expo-modules-core@58.0.9
110 - expo-modules-jsi@58.0.5
111 - expo-notifications@58.0.9
112 - expo-sharing@58.0.12
113 - expo-sqlite@58.0.7
114 - expo-symbols@58.0.3
87115 - electron@44.4.2
88116 - "@anthropic-ai/claude-agent-sdk@0.3.276"
89117 - "@alchemy.run/cloudflare-runtime@2.0.0-beta.79"
......@@ -96,6 +124,29 @@ minimumReleaseAgeExclude:
96124 - "@distilled.cloud/stripe@1.0.0-rc.12"
97125 - "@shadcn/lint@0.1.5"
98126 - cn@0.3.2
127 - "@expo/dom-webview@58.0.2"
128 - "expo-auth-session@58.0.6"
129 - "expo-camera@58.0.5"
130 - "expo-clipboard@58.0.2"
131 - "expo-crypto@58.0.3"
132 - "expo-device@58.0.3"
133 - "expo-document-picker@58.0.3"
134 - "expo-file-system@58.0.4"
135 - "expo-haptics@58.0.3"
136 - "expo-keep-awake@58.0.2"
137 - "expo-network@58.0.2"
138 - "expo-secure-store@58.0.1"
139 - "expo-splash-screen@58.0.2"
140 - "expo-video@58.0.5"
141 - "expo-web-browser@58.0.3"
142 - "react@19.3.0"
143 - "react-dom@19.3.0"
144 - "react-native@0.88.0-rc.3"
145 - "react-native-keyboard-controller@1.22.4"
146 - "react-native-worklets@0.13.0"
147 - "react-native-reanimated@4.7.0"
148 - "react-native-screens@4.28.0"
149 - "@expo/config-types@58.0.2"
99150
100151overrides:
101152 # Keep jsdom's optional peer consistent so Vite+ has one test-runner instance.
......@@ -143,11 +194,12 @@ overrides:
143194 "@effect/sql-pg": "catalog:"
144195 "@effect/vitest": "catalog:"
145196 "@effect/vitest>vitest": "-"
146 "@expo/dom-webview": 57.0.1
147 "@expo/metro-config": 57.0.12
148 expo-constants: 57.0.16
149 # Keep fresh resolution on the version carrying the permissions registry fix.
150 expo-modules-core: 57.0.14
197 "@expo/dom-webview": 58.0.2
198 "@expo/metro-config": 58.0.6
199 expo-constants: 58.0.9
200 expo-router: 58.0.10
201 "expo-sharing>@expo/config-plugins": 58.0.4
202 "expo-sharing>@expo/config-types": 58.0.2
151203 "@pierre/diffs>@shikijs/transformers": ^4.2.0
152204 # Keep one copy of these native-binary packages. lightningcss ships 11 platform binaries per
153205 # version, and the workspaces' tailwindcss ^4 ranges drift into two 4.3.x copies of the family.
......@@ -156,9 +208,6 @@ overrides:
156208 "@tailwindcss/vite": "catalog:"
157209 "@types/node": "catalog:"
158210 effect: "catalog:"
159 expo-router: 57.0.17
160 "expo-sharing>@expo/config-plugins": 57.0.9
161 "expo-sharing>@expo/config-types": 57.0.2
162211 node-abi: 4.33.0
163212 lightningcss: "catalog:"
164213 tailwindcss: "catalog:"
......@@ -168,7 +217,7 @@ overrides:
168217packageExtensions:
169218 "@clerk/expo@*":
170219 dependencies:
171 "@expo/config-plugins": 57.0.9
220 "@expo/config-plugins": 58.0.4
172221 "@effect/vitest@*":
173222 dependencies:
174223 vite-plus: "catalog:"
......@@ -181,9 +230,14 @@ packageExtensions:
181230
182231patchedDependencies:
183232 alchemy@2.0.0-beta.79: patches/alchemy@2.0.0-beta.79.patch
233 expo-glass-effect@58.0.3: patches/expo-glass-effect@58.0.3.patch
234 expo-blur@58.0.2: patches/expo-blur@58.0.2.patch
235 expo-audio@58.0.3: patches/expo-audio@58.0.3.patch
184236 "@clerk/expo@4.6.8": patches/@clerk__expo@4.6.8.patch
185237 "@effect/vitest@4.0.0-rc.115": patches/@effect__vitest@4.0.0-rc.115.patch
186 "@expo/metro-config@57.0.12": patches/@expo__metro-config@57.0.12.patch
238 "@expo/metro-config@58.0.6": patches/@expo__metro-config@58.0.6.patch
239 expo-sharing@58.0.12: patches/expo-sharing@58.0.12.patch
240 expo-widgets@58.0.9: patches/expo-widgets@58.0.9.patch
187241 "@ff-labs/fff-node@0.9.4": patches/@ff-labs__fff-node@0.9.4.patch
188242 "@legendapp/list@3.3.5": patches/@legendapp__list@3.3.5.patch
189243 "@pierre/diffs@1.3.0-beta.10": patches/@pierre%2Fdiffs@1.3.0-beta.10.patch
......@@ -192,20 +246,13 @@ patchedDependencies:
192246 "@react-navigation/native-stack@7.17.6": patches/@react-navigation%2Fnative-stack@7.17.6.patch
193247 dbus-next@0.10.2: patches/dbus-next@0.10.2.patch
194248 effect@4.0.0-rc.115: patches/effect@4.0.0-rc.115.patch
195 expo-audio@57.0.4: patches/expo-audio@57.0.4.patch
196 expo-modules-core@57.0.14: patches/expo-modules-core@57.0.14.patch
197 expo-notifications@57.0.15: patches/expo-notifications@57.0.15.patch
198 expo-sharing@57.0.17: patches/expo-sharing@57.0.17.patch
199 expo-widgets@57.0.15: patches/expo-widgets@57.0.15.patch
200249 node-pty@1.2.0-beta.15: patches/node-pty@1.2.0-beta.15.patch
201 react-native-gesture-handler@2.32.0: patches/react-native-gesture-handler@2.32.0.patch
202 react-native-keyboard-controller@1.21.13: patches/react-native-keyboard-controller@1.21.13.patch
203 react-native-nitro-modules@0.35.9: patches/react-native-nitro-modules@0.35.9.patch
204250 # Link http(s) URLs with a port or a single-label host. md4c otherwise requires a dotted host and stops at ':'.
205251 react-native-nitro-markdown@0.5.8: patches/react-native-nitro-markdown@0.5.8.patch
206 # Preserve the final layout frame. Backport of [#10171](https://github.com/software-mansion/react-native-reanimated/pull/10171).
207 react-native-reanimated@4.5.5: patches/react-native-reanimated@4.5.5.patch
208 react-native-screens@4.26.2: patches/react-native-screens@4.26.2.patch
252 react-native-gesture-handler@3.2.1: patches/react-native-gesture-handler@3.2.1.patch
253 react-native-keyboard-controller@1.22.4: patches/react-native-keyboard-controller@1.22.4.patch
254 react-native-nitro-modules@0.35.9: patches/react-native-nitro-modules@0.35.9.patch
255 react-native-screens@4.28.0: patches/react-native-screens@4.28.0.patch
209256 uniwind@1.11.0: patches/uniwind@1.11.0.patch
210257
211258peerDependencyRules:
third-party-licenses.config.json+81
......@@ -473,6 +473,87 @@
473473 "licenseId": "MIT",
474474 "copyrights": ["Copyright (c) 2025 opencode"]
475475 }
476 },
477 {
478 "license": "MIT",
479 "name": "noxcturnal",
480 "sourceUrl": "https://github.com/expo/noxcturnal",
481 "generatedNotice": {
482 "licenseId": "MIT",
483 "copyrights": ["Copyright (c) 2015-present 650 Industries, Inc. (aka Expo)"]
484 }
485 },
486 {
487 "license": "MIT",
488 "name": "@noxcturnal/noxcturnal-linux-x64-gnu",
489 "sourceUrl": "https://github.com/expo/noxcturnal",
490 "generatedNotice": {
491 "licenseId": "MIT",
492 "copyrights": ["Copyright (c) 2015-present 650 Industries, Inc. (aka Expo)"]
493 }
494 },
495 {
496 "license": "MIT",
497 "name": "@noxcturnal/noxcturnal-darwin-x64",
498 "sourceUrl": "https://github.com/expo/noxcturnal",
499 "generatedNotice": {
500 "licenseId": "MIT",
501 "copyrights": ["Copyright (c) 2015-present 650 Industries, Inc. (aka Expo)"]
502 }
503 },
504 {
505 "license": "MIT",
506 "name": "@noxcturnal/noxcturnal-linux-arm64-gnu",
507 "sourceUrl": "https://github.com/expo/noxcturnal",
508 "generatedNotice": {
509 "licenseId": "MIT",
510 "copyrights": ["Copyright (c) 2015-present 650 Industries, Inc. (aka Expo)"]
511 }
512 },
513 {
514 "license": "MIT",
515 "name": "@noxcturnal/noxcturnal-darwin-arm64",
516 "sourceUrl": "https://github.com/expo/noxcturnal",
517 "generatedNotice": {
518 "licenseId": "MIT",
519 "copyrights": ["Copyright (c) 2015-present 650 Industries, Inc. (aka Expo)"]
520 }
521 },
522 {
523 "license": "MIT",
524 "name": "@noxcturnal/noxcturnal-linux-arm64-musl",
525 "sourceUrl": "https://github.com/expo/noxcturnal",
526 "generatedNotice": {
527 "licenseId": "MIT",
528 "copyrights": ["Copyright (c) 2015-present 650 Industries, Inc. (aka Expo)"]
529 }
530 },
531 {
532 "license": "MIT",
533 "name": "@noxcturnal/noxcturnal-linux-x64-musl",
534 "sourceUrl": "https://github.com/expo/noxcturnal",
535 "generatedNotice": {
536 "licenseId": "MIT",
537 "copyrights": ["Copyright (c) 2015-present 650 Industries, Inc. (aka Expo)"]
538 }
539 },
540 {
541 "license": "MIT",
542 "name": "@noxcturnal/noxcturnal-win32-arm64-msvc",
543 "sourceUrl": "https://github.com/expo/noxcturnal",
544 "generatedNotice": {
545 "licenseId": "MIT",
546 "copyrights": ["Copyright (c) 2015-present 650 Industries, Inc. (aka Expo)"]
547 }
548 },
549 {
550 "license": "MIT",
551 "name": "@noxcturnal/noxcturnal-win32-x64-msvc",
552 "sourceUrl": "https://github.com/expo/noxcturnal",
553 "generatedNotice": {
554 "licenseId": "MIT",
555 "copyrights": ["Copyright (c) 2015-present 650 Industries, Inc. (aka Expo)"]
556 }
476557 }
477558 ]
478559}