authorgravatar for julius0216@outlook.comJulius Marminge <julius0216@outlook.com> 2026-10-11 22:30:20-07:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-10-12 05:30:20+00:00
log462e7f4de4fd4ae14d2b4439fd983fa9ced2790e
treee0c39b9fb454859797f5b150b276086777848c06
parent6f6197c4657f9e2e44a7e8f2fa759d00a15c1cbd
signature Signed by PGP key B5690EEEBB952194

feat(mobile): native-sized pull request action bar (#18527)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

8 files changed, 29 insertions(+), 63 deletions(-)

apps/mobile/deps/react-native-screens-5.0.0-t3.26.tgz deleted
Binary files a/apps/mobile/deps/react-native-screens-5.0.0-t3.26.tgz and /dev/null differ
apps/mobile/deps/react-native-screens-5.0.0-t3.27.tgz created
Binary files /dev/null and b/apps/mobile/deps/react-native-screens-5.0.0-t3.27.tgz differ
apps/mobile/package.json+1-1
...@@ -126,7 +126,7 @@...@@ -126,7 +126,7 @@
126 "react-native-keyboard-controller": "1.22.6",126 "react-native-keyboard-controller": "1.22.6",
127 "react-native-reanimated": "4.7.0",127 "react-native-reanimated": "4.7.0",
128 "react-native-safe-area-context": "~5.9.1",128 "react-native-safe-area-context": "~5.9.1",
129 "react-native-screens": "file:deps/react-native-screens-5.0.0-t3.26.tgz",129 "react-native-screens": "file:deps/react-native-screens-5.0.0-t3.27.tgz",
130 "react-native-shiki-engine": "^0.3.12",130 "react-native-shiki-engine": "^0.3.12",
131 "react-native-svg": "15.15.5",131 "react-native-svg": "15.15.5",
132 "react-native-webview": "14.0.1",132 "react-native-webview": "14.0.1",
apps/mobile/src/features/pull-requests/PullRequestControls.tsx+15-32
...@@ -4,7 +4,7 @@ import { useNavigation } from "@react-navigation/native";...@@ -4,7 +4,7 @@ import { useNavigation } from "@react-navigation/native";
4import type { PullRequestDetail } from "@t3tools/contracts";4import type { PullRequestDetail } from "@t3tools/contracts";
5import type { ReactNode } from "react";5import type { ReactNode } from "react";
6import { Platform, Pressable, View } from "react-native";6import { Platform, Pressable, View } from "react-native";
7import { useSafeAreaFrame, useSafeAreaInsets } from "react-native-safe-area-context";7import { useSafeAreaInsets } from "react-native-safe-area-context";
8import { AppText as Text } from "../../components/AppText";8import { AppText as Text } from "../../components/AppText";
9import { SymbolView, type AppSymbolName } from "../../components/AppSymbol";9import { SymbolView, type AppSymbolName } from "../../components/AppSymbol";
10import { MaterialButton } from "../../components/MaterialButton";10import { MaterialButton } from "../../components/MaterialButton";
...@@ -12,10 +12,7 @@ import { MaterialIconButton } from "../../components/MaterialIconButton";...@@ -12,10 +12,7 @@ import { MaterialIconButton } from "../../components/MaterialIconButton";
12import { MaterialFloatingToolbar } from "./MaterialFloatingToolbar";12import { MaterialFloatingToolbar } from "./MaterialFloatingToolbar";
13import { ControlPillMenu } from "../../components/ControlPillMenu";13import { ControlPillMenu } from "../../components/ControlPillMenu";
14import { NativeHeaderToolbar } from "../../native/StackHeader";14import { NativeHeaderToolbar } from "../../native/StackHeader";
15import {15import { useNativeLayoutMetrics } from "../../native/native-layout-metrics";
16 useNativeColumnLayoutMetrics,
17 useNativeLayoutMetrics,
18} from "../../native/native-layout-metrics";
19import { type PullRequestParams } from "./usePullRequestDiff";16import { type PullRequestParams } from "./usePullRequestDiff";
20import { usePullRequestPermissions } from "./usePullRequestPermissions";17import { usePullRequestPermissions } from "./usePullRequestPermissions";
21import { useAppearancePreferences } from "../settings/appearance/AppearancePreferencesProvider";18import { useAppearancePreferences } from "../settings/appearance/AppearancePreferencesProvider";
...@@ -117,8 +114,6 @@ export function PullRequestActionToolbar(props: {...@@ -117,8 +114,6 @@ export function PullRequestActionToolbar(props: {
117 const { draft } = usePullRequestReviewDraft(props.params);114 const { draft } = usePullRequestReviewDraft(props.params);
118 const { themeVariables: colors } = useAppearancePreferences();115 const { themeVariables: colors } = useAppearancePreferences();
119 const insets = useSafeAreaInsets();116 const insets = useSafeAreaInsets();
120 const frame = useSafeAreaFrame();
121 const columnMetrics = useNativeColumnLayoutMetrics();
122 const nativeMetrics = useNativeLayoutMetrics();117 const nativeMetrics = useNativeLayoutMetrics();
123 const verticalControls = nativeMetrics !== null && nativeMetrics.verticalBarEdge !== "none";118 const verticalControls = nativeMetrics !== null && nativeMetrics.verticalBarEdge !== "none";
124 const permissions = usePullRequestPermissions(props.params, props.pr);119 const permissions = usePullRequestPermissions(props.params, props.pr);
...@@ -140,20 +135,6 @@ export function PullRequestActionToolbar(props: {...@@ -140,20 +135,6 @@ export function PullRequestActionToolbar(props: {
140 if (!props.pr) return null;135 if (!props.pr) return null;
141 const primaryDisabled = pendingReview ? false : agent.disabled;136 const primaryDisabled = pendingReview ? false : agent.disabled;
142 const showPrimary = pendingReview || canOpenThread;137 const showPrimary = pendingReview || canOpenThread;
143 // Match the native phone tab controls; the side rail keeps intrinsic sizing.
144 const controlSize = verticalControls ? undefined : 60;
145 // Reserve the native outer margins, custom-button padding, and item gaps.
146 // UIKit needs this space to keep every action out of its overflow menu.
147 // Duo's side rail uses an intrinsic icon item instead.
148 const sideControls = Number(showAgentControls) + 1;
149 const primaryWidth = verticalControls
150 ? undefined
151 : Math.max(
152 0,
153 (columnMetrics?.width ?? frame.width - insets.left - insets.right) -
154 58 -
155 sideControls * (60 + 10 + 16),
156 );
157 if (Platform.OS === "android") {138 if (Platform.OS === "android") {
158 const primary = (139 const primary = (
159 <MaterialButton140 <MaterialButton
...@@ -230,8 +211,6 @@ export function PullRequestActionToolbar(props: {...@@ -230,8 +211,6 @@ export function PullRequestActionToolbar(props: {
230 title={primaryLabel}211 title={primaryLabel}
231 accessibilityLabel={primaryLabel}212 accessibilityLabel={primaryLabel}
232 variant="prominent"213 variant="prominent"
233 width={primaryWidth}
234 height={controlSize}
235 icon={214 icon={
236 verticalControls215 verticalControls
237 ? pendingReview216 ? pendingReview
...@@ -251,8 +230,6 @@ export function PullRequestActionToolbar(props: {...@@ -251,8 +230,6 @@ export function PullRequestActionToolbar(props: {
251 label={primaryLabel}230 label={primaryLabel}
252 accessibilityLabel={primaryLabel}231 accessibilityLabel={primaryLabel}
253 variant="prominent"232 variant="prominent"
254 width={primaryWidth}
255 height={controlSize}
256 icon={233 icon={
257 verticalControls234 verticalControls
258 ? pendingReview235 ? pendingReview
...@@ -270,8 +247,6 @@ export function PullRequestActionToolbar(props: {...@@ -270,8 +247,6 @@ export function PullRequestActionToolbar(props: {
270 const agentControl = showAgentControls ? (247 const agentControl = showAgentControls ? (
271 <NativeHeaderToolbar.Menu248 <NativeHeaderToolbar.Menu
272 identifier="pull-request-agent"249 identifier="pull-request-agent"
273 width={controlSize}
274 height={controlSize}
275 icon="sparkles"250 icon="sparkles"
276 title="AI helpers"251 title="AI helpers"
277 accessibilityLabel="PR agent actions"252 accessibilityLabel="PR agent actions"
...@@ -310,19 +285,27 @@ export function PullRequestActionToolbar(props: {...@@ -310,19 +285,27 @@ export function PullRequestActionToolbar(props: {
310 const filesControl = (285 const filesControl = (
311 <NativeHeaderToolbar.Button286 <NativeHeaderToolbar.Button
312 identifier="workspace-trailing-action"287 identifier="workspace-trailing-action"
313 width={controlSize}
314 height={controlSize}
315 icon={{ type: "image", source: require("../../../assets/icons/file-diff.png") }}288 icon={{ type: "image", source: require("../../../assets/icons/file-diff.png") }}
316 accessibilityLabel="Changed files"289 accessibilityLabel="Changed files"
317 onPress={openFiles}290 onPress={openFiles}
318 separateBackground291 separateBackground
319 />292 />
320 );293 );
294 if (verticalControls)
295 return (
296 <NativeHeaderToolbar placement="bottom">
297 {filesControl}
298 {agentControl}
299 {primaryControl}
300 </NativeHeaderToolbar>
301 );
321 return (302 return (
322 <NativeHeaderToolbar placement="bottom">303 <NativeHeaderToolbar placement="bottom">
323 {verticalControls ? filesControl : agentControl}304 {agentControl}
324 {verticalControls ? agentControl : primaryControl}305 <NativeHeaderToolbar.Spacer flexible />
325 {verticalControls ? primaryControl : filesControl}306 {primaryControl}
307 <NativeHeaderToolbar.Spacer flexible />
308 {filesControl}
326 </NativeHeaderToolbar>309 </NativeHeaderToolbar>
327 );310 );
328}311}
apps/mobile/src/native/NativeHeaderToolbar.tsx+1-11
...@@ -41,9 +41,7 @@ type NativeStackHeaderAxisBehavior = Extract<...@@ -41,9 +41,7 @@ type NativeStackHeaderAxisBehavior = Extract<
41 NativeStackHeaderItem,41 NativeStackHeaderItem,
42 { type: "button" }42 { type: "button" }
43>["axisBehavior"];43>["axisBehavior"];
44type NativeToolbarItem =44type NativeToolbarItem = NativeStackHeaderItem | HeaderBarButtonSearchBarPlacementItem;
45 | (NativeStackHeaderItem & { readonly height?: number })
46 | HeaderBarButtonSearchBarPlacementItem;
47type NativeStackOptionsWithToolbar = NativeStackNavigationOptions & {45type NativeStackOptionsWithToolbar = NativeStackNavigationOptions & {
48 unstable_headerToolbarItems?: () => NativeToolbarItem[];46 unstable_headerToolbarItems?: () => NativeToolbarItem[];
49};47};
...@@ -162,8 +160,6 @@ function convertToolbarChild(child: ReactNode): NativeToolbarItem | null {...@@ -162,8 +160,6 @@ function convertToolbarChild(child: ReactNode): NativeToolbarItem | null {
162 : () => undefined,160 : () => undefined,
163 sharesBackground: !child.props.separateBackground,161 sharesBackground: !child.props.separateBackground,
164 tintColor: child.props.tintColor as ColorValue | undefined,162 tintColor: child.props.tintColor as ColorValue | undefined,
165 width: typeof child.props.width === "number" ? child.props.width : undefined,
166 height: typeof child.props.height === "number" ? child.props.height : undefined,
167 variant:163 variant:
168 child.props.variant === "done" || child.props.variant === "prominent"164 child.props.variant === "done" || child.props.variant === "prominent"
169 ? child.props.variant165 ? child.props.variant
...@@ -189,8 +185,6 @@ function convertToolbarChild(child: ReactNode): NativeToolbarItem | null {...@@ -189,8 +185,6 @@ function convertToolbarChild(child: ReactNode): NativeToolbarItem | null {
189 },185 },
190 sharesBackground: !child.props.separateBackground,186 sharesBackground: !child.props.separateBackground,
191 tintColor: child.props.tintColor as ColorValue | undefined,187 tintColor: child.props.tintColor as ColorValue | undefined,
192 width: typeof child.props.width === "number" ? child.props.width : undefined,
193 height: typeof child.props.height === "number" ? child.props.height : undefined,
194 variant:188 variant:
195 child.props.variant === "done" || child.props.variant === "prominent"189 child.props.variant === "done" || child.props.variant === "prominent"
196 ? child.props.variant190 ? child.props.variant
...@@ -289,8 +283,6 @@ function NativeHeaderToolbarButton(_props: {...@@ -289,8 +283,6 @@ function NativeHeaderToolbarButton(_props: {
289 readonly tintColor?: ColorValue;283 readonly tintColor?: ColorValue;
290 readonly variant?: "plain" | "done" | "prominent";284 readonly variant?: "plain" | "done" | "prominent";
291 readonly identifier?: string;285 readonly identifier?: string;
292 readonly width?: number;
293 readonly height?: number;
294}) {286}) {
295 return null;287 return null;
296}288}
...@@ -308,8 +300,6 @@ function NativeHeaderToolbarMenu(_props: {...@@ -308,8 +300,6 @@ function NativeHeaderToolbarMenu(_props: {
308 readonly tintColor?: ColorValue;300 readonly tintColor?: ColorValue;
309 readonly title?: string;301 readonly title?: string;
310 readonly variant?: "plain" | "done" | "prominent";302 readonly variant?: "plain" | "done" | "prominent";
311 readonly width?: number;
312 readonly height?: number;
313}) {303}) {
314 return null;304 return null;
315}305}
apps/mobile/src/native/V5StackHeader.ios.tsx+2-9
...@@ -21,7 +21,7 @@ import {...@@ -21,7 +21,7 @@ import {
2121
22type HeaderItem = NonNullable<NonNullable<StackHeaderConfigProps["ios"]>["leadingItems"]>[number];22type HeaderItem = NonNullable<NonNullable<StackHeaderConfigProps["ios"]>["leadingItems"]>[number];
23type ToolbarItem =23type ToolbarItem =
24 | (NativeStackHeaderItem & { readonly height?: number })24 | NativeStackHeaderItem
25 | HeaderBarButtonMailSearchToolbarItem25 | HeaderBarButtonMailSearchToolbarItem
26 | HeaderBarButtonSearchBarPlacementItem;26 | HeaderBarButtonSearchBarPlacementItem;
27type Options = NativeStackNavigationOptions & {27type Options = NativeStackNavigationOptions & {
...@@ -91,10 +91,7 @@ function convertMenu(menu: MenuInput, id: string): StackHeaderMenuIOS {...@@ -91,10 +91,7 @@ function convertMenu(menu: MenuInput, id: string): StackHeaderMenuIOS {
91 return { id, type: "menu", title: menu.title, children };91 return { id, type: "menu", title: menu.title, children };
92}92}
9393
94function convertItems(94function convertItems(items: NativeStackHeaderItem[], prefix: string): HeaderItem[] {
95 items: (NativeStackHeaderItem & { readonly height?: number })[],
96 prefix: string,
97): HeaderItem[] {
98 return items.map((item, index): HeaderItem => {95 return items.map((item, index): HeaderItem => {
99 const id =96 const id =
100 item.type === "spacing" ? `${prefix}:${index}` : (item.identifier ?? `${prefix}:${index}`);97 item.type === "spacing" ? `${prefix}:${index}` : (item.identifier ?? `${prefix}:${index}`);
...@@ -121,8 +118,6 @@ function convertItems(...@@ -121,8 +118,6 @@ function convertItems(
121 menu: item.disabled ? undefined : convertMenu(item.menu, `${id}:menu`),118 menu: item.disabled ? undefined : convertMenu(item.menu, `${id}:menu`),
122 variant: item.variant,119 variant: item.variant,
123 tintColor: item.tintColor,120 tintColor: item.tintColor,
124 width: item.width,
125 height: item.height,
126 hidesSharedBackground: item.hidesSharedBackground,121 hidesSharedBackground: item.hidesSharedBackground,
127 };122 };
128 case "button":123 case "button":
...@@ -136,8 +131,6 @@ function convertItems(...@@ -136,8 +131,6 @@ function convertItems(
136 onPress: item.disabled ? undefined : item.onPress,131 onPress: item.disabled ? undefined : item.onPress,
137 variant: item.variant,132 variant: item.variant,
138 tintColor: item.tintColor,133 tintColor: item.tintColor,
139 width: item.width,
140 height: item.height,
141 hidesSharedBackground: item.hidesSharedBackground,134 hidesSharedBackground: item.hidesSharedBackground,
142 };135 };
143 }136 }
docs/operations/mobile-screens-fork.md+1-1
...@@ -1,7 +1,7 @@...@@ -1,7 +1,7 @@
1# Building the mobile Screens dependency1# Building the mobile Screens dependency
22
3The mobile v5 stack uses a committed tarball from the3The mobile v5 stack uses a committed tarball from the
4[T3 Screens fork](https://github.com/pingdotgg/react-native-screens/tree/t3-v5.0.0-t3.26).4[T3 Screens fork](https://github.com/pingdotgg/react-native-screens/tree/t3-v5.0.0-t3.27).
5The fork owns the integration changes; the app does not patch this package.5The fork owns the integration changes; the app does not patch this package.
6Each archive includes compiled JavaScript, declarations, native source and6Each archive includes compiled JavaScript, declarations, native source and
7`t3-fork.json` recording its version, source commit and upstream base.7`t3-fork.json` recording its version, source commit and upstream base.
pnpm-lock.yaml+9-9
...@@ -348,7 +348,7 @@ importers:...@@ -348,7 +348,7 @@ importers:
348 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)348 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)
349 '@react-navigation/native-stack':349 '@react-navigation/native-stack':
350 specifier: 7.17.6350 specifier: 7.17.6
351 version: 7.17.6(patch_hash=d2d52f3776e30765519748fd5e177592dc3b9cc778c52fb00e02674dfa9042c5)(02486f76aa3d9c7d88119682fcbddcde)351 version: 7.17.6(patch_hash=d2d52f3776e30765519748fd5e177592dc3b9cc778c52fb00e02674dfa9042c5)(6b53c4f789a319cd2c00cd296dcea732)
352 '@shikijs/core':352 '@shikijs/core':
353 specifier: 4.2.0353 specifier: 4.2.0
354 version: 4.2.0354 version: 4.2.0
...@@ -548,8 +548,8 @@ importers:...@@ -548,8 +548,8 @@ importers:
548 specifier: ~5.9.1548 specifier: ~5.9.1
549 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)549 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)
550 react-native-screens:550 react-native-screens:
551 specifier: file:deps/react-native-screens-5.0.0-t3.26.tgz551 specifier: file:deps/react-native-screens-5.0.0-t3.27.tgz
552 version: file:apps/mobile/deps/react-native-screens-5.0.0-t3.26.tgz(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)552 version: file:apps/mobile/deps/react-native-screens-5.0.0-t3.27.tgz(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)
553 react-native-shiki-engine:553 react-native-shiki-engine:
554 specifier: ^0.3.12554 specifier: ^0.3.12
555 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)555 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)
...@@ -10891,9 +10891,9 @@ packages:...@@ -10891,9 +10891,9 @@ packages:
10891 react: '*'10891 react: '*'
10892 react-native: '*'10892 react-native: '*'
1089310893
10894 react-native-screens@file:apps/mobile/deps/react-native-screens-5.0.0-t3.26.tgz:10894 react-native-screens@file:apps/mobile/deps/react-native-screens-5.0.0-t3.27.tgz:
10895 resolution: {integrity: sha512-OD1yeZu1HKuvBaroReihFROaofzuF2w4ORtPJXJrpAGk8AgQNusy3KaRRpeiCwIzH2KQU52SnWxrtKaYMzzQ+A==, tarball: file:apps/mobile/deps/react-native-screens-5.0.0-t3.26.tgz}10895 resolution: {integrity: sha512-krNMVmduM2fXeJYveadSz6NkYI/AFN3hAAirjk42Z9wkBrPtuhmcp3E2+Me95Xdj5LBL3G3dgltUjo5vYeEtLw==, tarball: file:apps/mobile/deps/react-native-screens-5.0.0-t3.27.tgz}
10896 version: 5.0.0-t3.2610896 version: 5.0.0-t3.27
10897 peerDependencies:10897 peerDependencies:
10898 react: '*'10898 react: '*'
10899 react-native: '*'10899 react-native: '*'
...@@ -16096,7 +16096,7 @@ snapshots:...@@ -16096,7 +16096,7 @@ snapshots:
16096 optionalDependencies:16096 optionalDependencies:
16097 '@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)16097 '@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)
1609816098
16099 '@react-navigation/native-stack@7.17.6(patch_hash=d2d52f3776e30765519748fd5e177592dc3b9cc778c52fb00e02674dfa9042c5)(02486f76aa3d9c7d88119682fcbddcde)':16099 '@react-navigation/native-stack@7.17.6(patch_hash=d2d52f3776e30765519748fd5e177592dc3b9cc778c52fb00e02674dfa9042c5)(6b53c4f789a319cd2c00cd296dcea732)':
16100 dependencies:16100 dependencies:
16101 '@react-navigation/elements': 2.9.26(83de68753219ecf7f3321e065bd378be)16101 '@react-navigation/elements': 2.9.26(83de68753219ecf7f3321e065bd378be)
16102 '@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)16102 '@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)
...@@ -16104,7 +16104,7 @@ snapshots:...@@ -16104,7 +16104,7 @@ snapshots:
16104 react: 19.3.016104 react: 19.3.0
16105 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)16105 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)
16106 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)16106 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)
16107 react-native-screens: file:apps/mobile/deps/react-native-screens-5.0.0-t3.26.tgz(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)16107 react-native-screens: file:apps/mobile/deps/react-native-screens-5.0.0-t3.27.tgz(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)
16108 sf-symbols-typescript: 2.2.016108 sf-symbols-typescript: 2.2.0
16109 warn-once: 0.1.116109 warn-once: 0.1.1
16110 transitivePeerDependencies:16110 transitivePeerDependencies:
...@@ -22097,7 +22097,7 @@ snapshots:...@@ -22097,7 +22097,7 @@ snapshots:
22097 react: 19.3.022097 react: 19.3.0
22098 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)22098 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)
2209922099
22100 react-native-screens@file:apps/mobile/deps/react-native-screens-5.0.0-t3.26.tgz(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):22100 react-native-screens@file:apps/mobile/deps/react-native-screens-5.0.0-t3.27.tgz(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):
22101 dependencies:22101 dependencies:
22102 react: 19.3.022102 react: 19.3.0
22103 react-freeze: 1.0.4(react@19.3.0)22103 react-freeze: 1.0.4(react@19.3.0)