| author | |
| committer | |
| log | 8dc07f199c2e3a4d8ec1a3997a2b9c2edf12457e |
| tree | 10b8c129f4b5892fb2dc934b1f1f921a8085fdd6 |
| parent | 5cc99e1c23980d7995a13c47f969b47cb68ed1be |
| signature | Signed by PGP key B5690EEEBB952194 |
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 = { |
| 401 | 401 | android: { |
| 402 | 402 | // Keep the supported floor explicit and covered by native notification tests. |
| 403 | 403 | 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", | |
| 404 | 407 | }, |
| 405 | 408 | ios: { |
| 406 | 409 | deploymentTarget: "18.0", |
| ... | ... | @@ -419,7 +422,6 @@ const config: ExpoConfig = { |
| 419 | 422 | // would delete the asset catalog) and its xcodeproj mod creates the widget |
| 420 | 423 | // target (which must exist before the compile phase can be attached). |
| 421 | 424 | ...(!isIosPersonalTeamBuild ? ["./plugins/withWidgetLogoAsset.cjs", widgetsPlugin] : []), |
| 422 | "./plugins/withIosSceneLifecycle.cjs", | |
| 423 | 425 | "./plugins/withAndroidCleartextTraffic.cjs", |
| 424 | 426 | "./plugins/withAndroidGradleHeap.cjs", |
| 425 | 427 | "./plugins/withAndroidInputBackground.cjs", |
apps/mobile/modules/t3-markdown-text/ios/T3MarkdownText.mm+1-1| ... | ... | @@ -10,7 +10,7 @@ |
| 10 | 10 | #import <react/renderer/components/T3MarkdownTextSpec/EventEmitters.h> |
| 11 | 11 | #import <react/renderer/components/T3MarkdownTextSpec/Props.h> |
| 12 | 12 | #import <react/renderer/components/T3MarkdownTextSpec/RCTComponentViewHelpers.h> |
| 13 | #import "RCTFabricComponentsPlugins.h" | |
| 13 | #import <React/RCTFabricComponentsPlugins.h> | |
| 14 | 14 | |
| 15 | 15 | using namespace facebook::react; |
| 16 | 16 |
apps/mobile/modules/t3-markdown-text/ios/T3MarkdownTextManager.mm-1| ... | ... | @@ -1,6 +1,5 @@ |
| 1 | 1 | #import <React/RCTViewManager.h> |
| 2 | 2 | #import <React/RCTUIManager.h> |
| 3 | #import "RCTBridge.h" | |
| 4 | 3 | #import "Utils.h" |
| 5 | 4 | |
| 6 | 5 | @interface T3MarkdownTextManager : RCTViewManager |
apps/mobile/modules/t3-markdown-text/ios/T3MarkdownTextRun.mm+1-1| ... | ... | @@ -4,7 +4,7 @@ |
| 4 | 4 | #import <react/renderer/components/T3MarkdownTextSpec/EventEmitters.h> |
| 5 | 5 | #import <react/renderer/components/T3MarkdownTextSpec/Props.h> |
| 6 | 6 | #import <react/renderer/components/T3MarkdownTextSpec/RCTComponentViewHelpers.h> |
| 7 | #import "RCTFabricComponentsPlugins.h" | |
| 7 | #import <React/RCTFabricComponentsPlugins.h> | |
| 8 | 8 | #import "Utils.h" |
| 9 | 9 | |
| 10 | 10 | using namespace facebook::react; |
apps/mobile/modules/t3-markdown-text/src/MarkdownTextPrimitive.tsx+9-4| ... | ... | @@ -6,6 +6,7 @@ import { |
| 6 | 6 | StyleSheet, |
| 7 | 7 | Text as RNText, |
| 8 | 8 | type ColorValue, |
| 9 | type TextInstance, | |
| 9 | 10 | type TextProps, |
| 10 | 11 | type ViewStyle, |
| 11 | 12 | } from "react-native"; |
| ... | ... | @@ -43,7 +44,7 @@ export type ContextMenuActionEvent = { |
| 43 | 44 | * while the React Native Text fallback reports measured `TextLayoutLine`s. |
| 44 | 45 | */ |
| 45 | 46 | export type MarkdownTextPrimitiveProps = Omit<TextProps, "onTextLayout"> & { |
| 46 | nativeTextRef?: Ref<RNText>; | |
| 47 | nativeTextRef?: Ref<TextInstance>; | |
| 47 | 48 | selectionHandleColor?: ColorValue; |
| 48 | 49 | uiTextView?: boolean; |
| 49 | 50 | contextMenuConfig?: string; |
| ... | ... | @@ -134,13 +135,17 @@ function AndroidMarkdownText({ |
| 134 | 135 | contextClipboardConfig: _contextClipboardConfig, |
| 135 | 136 | ...props |
| 136 | 137 | }: 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 | ); | |
| 139 | 144 | const color = processColor(selectionHandleColor); |
| 140 | 145 | const applyHandleColor = React.useCallback(() => { |
| 141 | 146 | if (!textRef.current || typeof color !== "number") return; |
| 142 | 147 | const reactTag = findNodeHandle(textRef.current); |
| 143 | if (reactTag !== null) setMarkdownSelectionHandleColor(reactTag, color); | |
| 148 | if (reactTag != null) setMarkdownSelectionHandleColor(reactTag, color); | |
| 144 | 149 | }, [color]); |
| 145 | 150 | |
| 146 | 151 | // 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 { |
| 6 | 6 | Linking, |
| 7 | 7 | Platform, |
| 8 | 8 | StyleSheet, |
| 9 | Text as RNText, | |
| 9 | type TextInstance, | |
| 10 | 10 | type TextStyle, |
| 11 | 11 | useColorScheme, |
| 12 | 12 | View, |
| 13 | 13 | } from "react-native"; |
| 14 | 14 | |
| 15 | 15 | import { MarkdownTextPrimitive } from "./MarkdownTextPrimitive"; |
| 16 | import { markdownFileIconSource } from "./markdownFileIcons"; | |
| 16 | import { markdownFileIconSource, markdownIconAssetUri } from "./markdownFileIcons"; | |
| 17 | 17 | import { markdownLinkIconSource } from "./markdownLinkIcons"; |
| 18 | 18 | import { resolveMarkdownFileIcon, resolveMarkdownLinkIcon } from "./markdownLinks"; |
| 19 | 19 | import type { NativeMarkdownTextRun } from "./nativeMarkdownText"; |
| ... | ... | @@ -236,11 +236,11 @@ export function NativeMarkdownSelectableText(props: { |
| 236 | 236 | interactive: Boolean(run.href), |
| 237 | 237 | iconUri: |
| 238 | 238 | !contextReference && run.fileIcon |
| 239 | ? Image.resolveAssetSource(markdownFileIconSource(run.fileIcon)).uri | |
| 239 | ? markdownIconAssetUri(markdownFileIconSource(run.fileIcon)) | |
| 240 | 240 | : contextRecord?.kind === "mention" && "path" in contextRecord |
| 241 | ? Image.resolveAssetSource( | |
| 241 | ? markdownIconAssetUri( | |
| 242 | 242 | markdownFileIconSource(resolveMarkdownFileIcon(contextRecord.path)), |
| 243 | ).uri | |
| 243 | ) | |
| 244 | 244 | : undefined, |
| 245 | 245 | fontSize: props.textStyle.fontSize * 0.8, |
| 246 | 246 | foreground: props.textStyle.color, |
| ... | ... | @@ -297,10 +297,12 @@ export function NativeMarkdownSelectableText(props: { |
| 297 | 297 | ? JSON.stringify({ fragment: contextClipboardFragment, ranges }) |
| 298 | 298 | : ""; |
| 299 | 299 | const attachAndroidText = useCallback( |
| 300 | (textView: RNText | null) => { | |
| 300 | (textView: TextInstance | null) => { | |
| 301 | 301 | if (Platform.OS !== "android" || !containsInlineIcon || !textView) return; |
| 302 | 302 | const reactTag = findNodeHandle(textView); |
| 303 | if (reactTag !== null) installMarkdownCopySanitizer(reactTag, contextClipboardConfig); | |
| 303 | if (typeof reactTag === "number") { | |
| 304 | installMarkdownCopySanitizer(reactTag, contextClipboardConfig); | |
| 305 | } | |
| 304 | 306 | }, |
| 305 | 307 | [containsInlineIcon, contextClipboardConfig], |
| 306 | 308 | ); |
| ... | ... | @@ -358,6 +360,12 @@ export function NativeMarkdownSelectableText(props: { |
| 358 | 360 | else void Linking.openURL(href); |
| 359 | 361 | } |
| 360 | 362 | : undefined; |
| 363 | const fileIconUri = run.fileIcon | |
| 364 | ? markdownIconAssetUri(markdownFileIconSource(run.fileIcon)) | |
| 365 | : undefined; | |
| 366 | const linkIconUri = linkIcon | |
| 367 | ? markdownIconAssetUri(markdownLinkIconSource(linkIcon)) | |
| 368 | : undefined; | |
| 361 | 369 | return ( |
| 362 | 370 | <MarkdownTextPrimitive |
| 363 | 371 | key={key} |
| ... | ... | @@ -366,12 +374,12 @@ export function NativeMarkdownSelectableText(props: { |
| 366 | 374 | Platform.OS === "ios" |
| 367 | 375 | ? chip |
| 368 | 376 | ? `t3-chip:${JSON.stringify(chip)}` |
| 369 | : run.fileIcon | |
| 370 | ? `t3-file:${Image.resolveAssetSource(markdownFileIconSource(run.fileIcon)).uri}` | |
| 377 | : fileIconUri | |
| 378 | ? `t3-file:${fileIconUri}` | |
| 371 | 379 | : run.skillName |
| 372 | 380 | ? "t3-skill:sf:cube" |
| 373 | : linkIcon | |
| 374 | ? `t3-link:${Image.resolveAssetSource(markdownLinkIconSource(linkIcon)).uri}` | |
| 381 | : linkIconUri | |
| 382 | ? `t3-link:${linkIconUri}` | |
| 375 | 383 | : undefined |
| 376 | 384 | : undefined |
| 377 | 385 | } |
apps/mobile/modules/t3-markdown-text/src/T3MarkdownTextNativeComponent.ts+9-15| ... | ... | @@ -1,13 +1,7 @@ |
| 1 | import codegenNativeComponent from "react-native/Libraries/Utilities/codegenNativeComponent"; | |
| 2 | import type { ViewProps } from "react-native"; | |
| 3 | import type { | |
| 4 | BubblingEventHandler, | |
| 5 | Int32, | |
| 6 | WithDefault, | |
| 7 | } from "react-native/Libraries/Types/CodegenTypes"; | |
| 1 | import { codegenNativeComponent, type CodegenTypes, type ViewProps } from "react-native"; | |
| 8 | 2 | |
| 9 | 3 | interface TargetedEvent { |
| 10 | target: Int32; | |
| 4 | target: CodegenTypes.Int32; | |
| 11 | 5 | } |
| 12 | 6 | |
| 13 | 7 | interface TextLayoutEvent extends TargetedEvent { |
| ... | ... | @@ -21,19 +15,19 @@ interface TextLayoutEvent extends TargetedEvent { |
| 21 | 15 | * @property end - The end index of the selected range (0-based, exclusive) |
| 22 | 16 | */ |
| 23 | 17 | interface SelectionChangeEvent extends TargetedEvent { |
| 24 | start: Int32; | |
| 25 | end: Int32; | |
| 18 | start: CodegenTypes.Int32; | |
| 19 | end: CodegenTypes.Int32; | |
| 26 | 20 | } |
| 27 | 21 | |
| 28 | 22 | type EllipsizeMode = "head" | "middle" | "tail" | "clip"; |
| 29 | 23 | |
| 30 | 24 | interface NativeProps extends ViewProps { |
| 31 | 25 | 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">; | |
| 35 | 29 | selectable?: boolean; |
| 36 | onTextLayout?: BubblingEventHandler<TextLayoutEvent>; | |
| 30 | onTextLayout?: CodegenTypes.BubblingEventHandler<TextLayoutEvent>; | |
| 37 | 31 | /** |
| 38 | 32 | * Callback fired when the text selection changes. |
| 39 | 33 | * |
| ... | ... | @@ -48,7 +42,7 @@ interface NativeProps extends ViewProps { |
| 48 | 42 | * </MarkdownTextPrimitive> |
| 49 | 43 | * ``` |
| 50 | 44 | */ |
| 51 | onSelectionChange?: BubblingEventHandler<SelectionChangeEvent>; | |
| 45 | onSelectionChange?: CodegenTypes.BubblingEventHandler<SelectionChangeEvent>; | |
| 52 | 46 | } |
| 53 | 47 | |
| 54 | 48 | export default codegenNativeComponent<NativeProps>("T3MarkdownText", { |
apps/mobile/modules/t3-markdown-text/src/T3MarkdownTextRunNativeComponent.ts+19-21| ... | ... | @@ -1,14 +1,12 @@ |
| 1 | import type { ColorValue, ViewProps } from "react-native"; | |
| 2 | import type { | |
| 3 | BubblingEventHandler, | |
| 4 | Float, | |
| 5 | Int32, | |
| 6 | WithDefault, | |
| 7 | } from "react-native/Libraries/Types/CodegenTypes"; | |
| 8 | import codegenNativeComponent from "react-native/Libraries/Utilities/codegenNativeComponent"; | |
| 1 | import { | |
| 2 | codegenNativeComponent, | |
| 3 | type CodegenTypes, | |
| 4 | type ColorValue, | |
| 5 | type ViewProps, | |
| 6 | } from "react-native"; | |
| 9 | 7 | |
| 10 | 8 | interface TargetedEvent { |
| 11 | target: Int32; | |
| 9 | target: CodegenTypes.Int32; | |
| 12 | 10 | } |
| 13 | 11 | |
| 14 | 12 | interface ContextMenuActionEvent extends TargetedEvent { |
| ... | ... | @@ -35,21 +33,21 @@ type TextAlign = "auto" | "left" | "right" | "center" | "justify"; |
| 35 | 33 | interface NativeProps extends ViewProps { |
| 36 | 34 | text: string; |
| 37 | 35 | 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">; | |
| 41 | 39 | 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">; | |
| 46 | 44 | 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>; | |
| 49 | 47 | 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>; | |
| 53 | 51 | } |
| 54 | 52 | |
| 55 | 53 | export default codegenNativeComponent<NativeProps>("T3MarkdownTextRun", { |
apps/mobile/modules/t3-markdown-text/src/markdownFileIcons.ts+10-1| ... | ... | @@ -1,4 +1,4 @@ |
| 1 | import type { ImageSourcePropType } from "react-native"; | |
| 1 | import { Image, type ImageSourcePropType } from "react-native"; | |
| 2 | 2 | |
| 3 | 3 | import type { MarkdownFileIcon } from "./markdownLinks"; |
| 4 | 4 | import { MARKDOWN_FILE_ICON_SOURCES } from "./markdownFileIcons.generated"; |
| ... | ... | @@ -6,3 +6,12 @@ import { MARKDOWN_FILE_ICON_SOURCES } from "./markdownFileIcons.generated"; |
| 6 | 6 | export function markdownFileIconSource(icon: MarkdownFileIcon): ImageSourcePropType { |
| 7 | 7 | return MARKDOWN_FILE_ICON_SOURCES[icon]; |
| 8 | 8 | } |
| 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 | */ | |
| 15 | export function markdownIconAssetUri(source: ImageSourcePropType): string | undefined { | |
| 16 | return Image.resolveAssetSource(source)?.uri; | |
| 17 | } |
apps/mobile/package.json+48-47| ... | ... | @@ -49,7 +49,8 @@ |
| 49 | 49 | "@clerk/expo": "catalog:", |
| 50 | 50 | "@effect/atom-react": "catalog:", |
| 51 | 51 | "@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", | |
| 53 | 54 | "@legendapp/list": "catalog:", |
| 54 | 55 | "@material/material-color-utilities": "0.3.0", |
| 55 | 56 | "@noble/curves": "catalog:", |
| ... | ... | @@ -73,56 +74,56 @@ |
| 73 | 74 | "clsx": "^2.1.1", |
| 74 | 75 | "diff": "8.0.3", |
| 75 | 76 | "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", | |
| 100 | 101 | "expo-paste-input": "^0.1.15", |
| 101 | 102 | "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", | |
| 115 | 116 | "react-native-image-viewing": "^0.2.2", |
| 116 | "react-native-keyboard-controller": "1.21.13", | |
| 117 | "react-native-keyboard-controller": "1.22.4", | |
| 117 | 118 | "react-native-nitro-markdown": "^0.5.0", |
| 118 | 119 | "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", | |
| 122 | 123 | "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", | |
| 126 | 127 | "shiki": "4.2.0", |
| 127 | 128 | "tailwind-merge": "^3.5.0", |
| 128 | 129 | "uniwind": "1.11.0" |
| ... | ... | @@ -130,9 +131,9 @@ |
| 130 | 131 | "devDependencies": { |
| 131 | 132 | "@effect/vitest": "catalog:", |
| 132 | 133 | "@pierre/trees": "1.0.0-beta.4", |
| 133 | "@types/react": "~19.2.0", | |
| 134 | "@types/react": "~19.3.0", | |
| 134 | 135 | "@types/react-dom": "~19.2.3", |
| 135 | "babel-preset-expo": "~57.0.9", | |
| 136 | "babel-preset-expo": "~58.0.6", | |
| 136 | 137 | "tailwindcss": "^4.0.0", |
| 137 | 138 | "typescript": "catalog:" |
| 138 | 139 | }, |
apps/mobile/plugins/withIosSceneLifecycle.cjs deleted-123| ... | ... | @@ -1,123 +0,0 @@ |
| 1 | const { withAppDelegate, withInfoPlist } = require("expo/config-plugins"); | |
| 2 | ||
| 3 | const SCENE_DELEGATE = ` | |
| 4 | ||
| 5 | class 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 | ||
| 72 | module.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 @@ |
| 1 | import { describe, expect, it } from "vitest"; | |
| 2 | import withIosSceneLifecycle from "./withIosSceneLifecycle.cjs"; | |
| 3 | ||
| 4 | const 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 | ||
| 15 | async 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 | ||
| 25 | describe("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() { |
| 76 | 76 | <GestureHandlerRootView className="flex-1"> |
| 77 | 77 | <KeyboardProvider statusBarTranslucent> |
| 78 | 78 | <SafeAreaProvider> |
| 79 | <StatusBar | |
| 80 | barStyle={themeAppearance === "dark" ? "light-content" : "dark-content"} | |
| 81 | translucent | |
| 82 | /> | |
| 79 | <StatusBar barStyle={themeAppearance === "dark" ? "light-content" : "dark-content"} /> | |
| 83 | 80 | {/* The navigation theme drives the NATIVE header appearance: native-stack |
| 84 | 81 | forwards `dark` as the nav bar's overrideUserInterfaceStyle. Without |
| 85 | 82 | 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: { |
| 520 | 520 | const navigation = useNavigation(); |
| 521 | 521 | const { pendingShare } = useIncomingShare(); |
| 522 | 522 | 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); | |
| 524 | 529 | // Presents the T3 Connect onboarding sheet after an in-session sign-in. |
| 525 | 530 | useConnectOnboardingNavigation(); |
| 526 | 531 | // Launcher app shortcuts: routes shortcut taps and tracks opened threads. |
| ... | ... | @@ -540,11 +545,6 @@ function RootStackLayout(props: { |
| 540 | 545 | params: { incomingShareId: transition.shareIdToPresent }, |
| 541 | 546 | }); |
| 542 | 547 | }, [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); | |
| 548 | 548 | |
| 549 | 549 | return ( |
| 550 | 550 | <HardwareKeyboardCommandProvider pathname={pathname}> |
apps/mobile/src/components/AndroidAnchoredMenu.tsx+3-3| ... | ... | @@ -1,7 +1,7 @@ |
| 1 | 1 | import type { MenuAction, MenuComponentProps } from "@react-native-menu/menu"; |
| 2 | 2 | import type { ReactNode } from "react"; |
| 3 | 3 | import { useCallback, useEffect, useRef, useState } from "react"; |
| 4 | import type { StyleProp, ViewStyle } from "react-native"; | |
| 4 | import type { StyleProp, ViewInstance, ViewStyle } from "react-native"; | |
| 5 | 5 | import { BackHandler, Pressable, ScrollView, View } from "react-native"; |
| 6 | 6 | import { useKeyboardState } from "react-native-keyboard-controller"; |
| 7 | 7 | import Animated, { FadeIn } from "react-native-reanimated"; |
| ... | ... | @@ -73,8 +73,8 @@ export function AndroidAnchoredMenu(props: AndroidAnchoredMenuProps) { |
| 73 | 73 | overlay === null |
| 74 | 74 | ? desiredMenuWidth |
| 75 | 75 | : 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); | |
| 78 | 78 | |
| 79 | 79 | const keyboardVisible = useKeyboardState((state) => state.isVisible); |
| 80 | 80 | const keyboardHeight = useKeyboardState((state) => state.height); |
apps/mobile/src/components/AppText.tsx+2-1| ... | ... | @@ -2,6 +2,7 @@ import { |
| 2 | 2 | Platform, |
| 3 | 3 | Text as RNText, |
| 4 | 4 | TextInput as RNTextInput, |
| 5 | type TextInputInstance, | |
| 5 | 6 | type TextInputProps as RNTextInputProps, |
| 6 | 7 | type TextProps as RNTextProps, |
| 7 | 8 | } from "react-native"; |
| ... | ... | @@ -26,7 +27,7 @@ export function AppText({ className, ...props }: AppTextProps) { |
| 26 | 27 | |
| 27 | 28 | export type AppTextInputProps = Omit<RNTextInputProps, "placeholderTextColor"> & { |
| 28 | 29 | readonly className?: string; |
| 29 | readonly ref?: React.Ref<RNTextInput>; | |
| 30 | readonly ref?: React.Ref<TextInputInstance>; | |
| 30 | 31 | }; |
| 31 | 32 | |
| 32 | 33 | /** |
apps/mobile/src/components/ComposerAttachmentStrip.tsx+1-1| ... | ... | @@ -127,7 +127,7 @@ async function materializeDataUrlPreview(id: string, dataUrl: string): Promise<s |
| 127 | 127 | const file = new File(directory, `${id}.${extension}`); |
| 128 | 128 | if (!file.exists) { |
| 129 | 129 | file.create(); |
| 130 | file.write(dataUrl.slice(comma + 1), { encoding: "base64" }); | |
| 130 | await file.write(dataUrl.slice(comma + 1), { encoding: "base64" }); | |
| 131 | 131 | } |
| 132 | 132 | return file.uri; |
| 133 | 133 | } |
apps/mobile/src/components/GlassSurface.tsx+9-2| ... | ... | @@ -1,6 +1,13 @@ |
| 1 | 1 | import { GlassView, isGlassEffectAPIAvailable } from "expo-glass-effect"; |
| 2 | 2 | import type { ReactNode, Ref } from "react"; |
| 3 | import { Platform, View, type ColorValue, type ViewProps, type ViewStyle } from "react-native"; | |
| 3 | import { | |
| 4 | Platform, | |
| 5 | View, | |
| 6 | type ColorValue, | |
| 7 | type ViewInstance, | |
| 8 | type ViewProps, | |
| 9 | type ViewStyle, | |
| 10 | } from "react-native"; | |
| 4 | 11 | import { withUniwind } from "uniwind"; |
| 5 | 12 | |
| 6 | 13 | import { cn } from "../lib/cn"; |
| ... | ... | @@ -14,7 +21,7 @@ const ThemedGlassView = withUniwind(GlassView, { |
| 14 | 21 | }); |
| 15 | 22 | |
| 16 | 23 | interface GlassSurfaceProps extends ViewProps { |
| 17 | readonly ref?: Ref<View>; | |
| 24 | readonly ref?: Ref<ViewInstance>; | |
| 18 | 25 | readonly children: ReactNode; |
| 19 | 26 | readonly glassEffectStyle?: "clear" | "regular" | "none"; |
| 20 | 27 | readonly tintColor?: ColorValue; |
apps/mobile/src/components/LoadingScreen.tsx+1-1| ... | ... | @@ -15,7 +15,7 @@ export function LoadingScreen(props: { |
| 15 | 15 | |
| 16 | 16 | return ( |
| 17 | 17 | <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"} /> | |
| 19 | 19 | <View className="flex-1 items-center justify-center gap-5 px-6"> |
| 20 | 20 | <BrandMark compact /> |
| 21 | 21 | {messagePlacement === "above-spinner" ? ( |
apps/mobile/src/components/MaterialSearchField.tsx+2-2| ... | ... | @@ -1,5 +1,5 @@ |
| 1 | 1 | import type { RefObject } from "react"; |
| 2 | import { Pressable, TextInput, View } from "react-native"; | |
| 2 | import { Pressable, TextInput, type TextInputInstance, View } from "react-native"; | |
| 3 | 3 | |
| 4 | 4 | import { SymbolView } from "./AppSymbol"; |
| 5 | 5 | import { useAndroidControlSizing } from "./useAndroidControlSizing"; |
| ... | ... | @@ -12,7 +12,7 @@ export function MaterialSearchField({ |
| 12 | 12 | value, |
| 13 | 13 | onChangeText, |
| 14 | 14 | }: { |
| 15 | readonly inputRef: RefObject<TextInput | null>; | |
| 15 | readonly inputRef: RefObject<TextInputInstance | null>; | |
| 16 | 16 | readonly accessibilityLabel: string; |
| 17 | 17 | readonly clearAccessibilityLabel: string; |
| 18 | 18 | readonly placeholder: string; |
apps/mobile/src/components/ScreenHeader.android.tsx+9-2| ... | ... | @@ -1,5 +1,12 @@ |
| 1 | 1 | import { useCallback, useEffect, useRef, useState } from "react"; |
| 2 | import { BackHandler, Keyboard, Pressable, TextInput, View } from "react-native"; | |
| 2 | import { | |
| 3 | BackHandler, | |
| 4 | Keyboard, | |
| 5 | Pressable, | |
| 6 | TextInput, | |
| 7 | type TextInputInstance, | |
| 8 | View, | |
| 9 | } from "react-native"; | |
| 3 | 10 | import { useMaterialToolbarLayout } from "./useMaterialToolbarLayout"; |
| 4 | 11 | import { NativeStackScreenOptions } from "../native/StackHeader"; |
| 5 | 12 | import { AndroidWorkspaceSidebarButton } from "../features/layout/workspace-sidebar-toolbar"; |
| ... | ... | @@ -18,7 +25,7 @@ export function ScreenHeader(props: ScreenHeaderProps) { |
| 18 | 25 | const { paddingTop, paddingBottom } = useMaterialToolbarLayout(); |
| 19 | 26 | const { scale, buttonSize, iconSize, smallIconSize } = useAndroidControlSizing(); |
| 20 | 27 | const { themeVariables } = useAppearancePreferences(); |
| 21 | const inputRef = useRef<TextInput>(null); | |
| 28 | const inputRef = useRef<TextInputInstance>(null); | |
| 22 | 29 | const [searchOpen, setSearchOpen] = useState(false); |
| 23 | 30 | const searching = search !== undefined && (searchOpen || search.value.length > 0); |
| 24 | 31 | const onSearchChange = search?.onChangeText; |
apps/mobile/src/connection/background-activity.ts+4-2| ... | ... | @@ -14,7 +14,7 @@ import * as Queue from "effect/Queue"; |
| 14 | 14 | import * as Schedule from "effect/Schedule"; |
| 15 | 15 | import * as Stream from "effect/Stream"; |
| 16 | 16 | import * as SubscriptionRef from "effect/SubscriptionRef"; |
| 17 | import { AppState, type AppStateStatus } from "react-native"; | |
| 17 | import { AppState } from "react-native"; | |
| 18 | 18 | |
| 19 | 19 | import * as MobileStorage from "../persistence/mobile-storage"; |
| 20 | 20 | import { |
| ... | ... | @@ -27,8 +27,10 @@ const REPORT_INTERVAL_MS = 25_000; |
| 27 | 27 | const LEASE_TTL_MS = 45_000; |
| 28 | 28 | const BASELINE_SCOPES: ReadonlyArray<BackgroundScope> = [{ type: "provider-status" }]; |
| 29 | 29 | |
| 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. | |
| 30 | 32 | function normalizeAppState( |
| 31 | state: AppStateStatus, | |
| 33 | state: string | null | undefined, | |
| 32 | 34 | ): NonNullable<ClientActivityReportInput["appState"]> { |
| 33 | 35 | if (state === "active" || state === "inactive" || state === "background") return state; |
| 34 | 36 | return "unknown"; |
apps/mobile/src/features/agent-awareness/foregroundNotificationBehavior.test.ts created+61| ... | ... | @@ -0,0 +1,61 @@ |
| 1 | import type { Notification } from "expo-notifications"; | |
| 2 | import { describe, expect, it } from "vite-plus/test"; | |
| 3 | ||
| 4 | import { foregroundNotificationBehavior } from "./foregroundNotificationBehavior"; | |
| 5 | import { threadDeepLinkOnScreen } from "./notificationPayload"; | |
| 6 | ||
| 7 | function 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 | ||
| 14 | describe("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 | ||
| 29 | describe("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 @@ |
| 1 | import type { Notification, NotificationBehavior } from "expo-notifications"; | |
| 2 | ||
| 3 | import { extractAgentNotificationDeepLink } from "./notificationPayload"; | |
| 4 | ||
| 5 | const SHOW: NotificationBehavior = { | |
| 6 | shouldShowBanner: true, | |
| 7 | shouldShowList: true, | |
| 8 | shouldPlaySound: true, | |
| 9 | shouldSetBadge: false, | |
| 10 | }; | |
| 11 | ||
| 12 | const 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 | */ | |
| 26 | export 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"; |
| 2 | 2 | import * as Notifications from "expo-notifications"; |
| 3 | 3 | import { useLinkTo } from "@react-navigation/native"; |
| 4 | 4 | |
| 5 | import { routeAgentNotificationResponseOnce } from "./notificationPayload"; | |
| 5 | import { foregroundNotificationBehavior } from "./foregroundNotificationBehavior"; | |
| 6 | import { routeAgentNotificationResponseOnce, threadDeepLinkOnScreen } from "./notificationPayload"; | |
| 6 | 7 | import { consumeLastAgentNotificationResponse } from "./notificationResponseConsumer"; |
| 7 | 8 | |
| 8 | export function useAgentNotificationNavigation(): void { | |
| 9 | export function useAgentNotificationNavigation(pathname: string): void { | |
| 9 | 10 | const linkTo = useLinkTo(); |
| 10 | 11 | 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 | }, []); | |
| 11 | 26 | |
| 12 | 27 | useEffect(() => { |
| 13 | 28 | 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 { |
| 69 | 69 | } |
| 70 | 70 | } |
| 71 | 71 | |
| 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 | */ | |
| 77 | export 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 | ||
| 72 | 85 | export function extractAgentNotificationDeepLink(response: unknown): string | null { |
| 73 | 86 | const data = dataFromNotificationResponse(response); |
| 74 | 87 | const deepLink = data?.deepLink; |
apps/mobile/src/features/archive/ArchivedThreadsScreen.tsx+4-6| ... | ... | @@ -20,7 +20,7 @@ import { |
| 20 | 20 | useWindowDimensions, |
| 21 | 21 | View, |
| 22 | 22 | } from "react-native"; |
| 23 | import { Gesture, GestureDetector } from "react-native-gesture-handler"; | |
| 23 | import { GestureDetector, useNativeGesture } from "react-native-gesture-handler"; | |
| 24 | 24 | import type { SwipeableMethods } from "react-native-gesture-handler/ReanimatedSwipeable"; |
| 25 | 25 | |
| 26 | 26 | import { AppText as Text } from "../../components/AppText"; |
| ... | ... | @@ -185,9 +185,7 @@ function ArchivedThreadRow(props: { |
| 185 | 185 | readonly onDelete: () => void; |
| 186 | 186 | readonly onSwipeableClose: (methods: SwipeableMethods) => void; |
| 187 | 187 | readonly onSwipeableWillOpen: (methods: SwipeableMethods) => void; |
| 188 | readonly simultaneousSwipeGesture?: ComponentProps< | |
| 189 | typeof ThreadSwipeable | |
| 190 | >["simultaneousWithExternalGesture"]; | |
| 188 | readonly simultaneousSwipeGesture?: ComponentProps<typeof ThreadSwipeable>["simultaneousWith"]; | |
| 191 | 189 | readonly onUnarchive: () => void; |
| 192 | 190 | readonly thread: EnvironmentThreadShell; |
| 193 | 191 | }) { |
| ... | ... | @@ -221,7 +219,7 @@ function ArchivedThreadRow(props: { |
| 221 | 219 | label: "Unarchive", |
| 222 | 220 | onPress: props.onUnarchive, |
| 223 | 221 | }} |
| 224 | simultaneousWithExternalGesture={props.simultaneousSwipeGesture} | |
| 222 | simultaneousWith={props.simultaneousSwipeGesture} | |
| 225 | 223 | threadTitle={props.thread.title} |
| 226 | 224 | > |
| 227 | 225 | {() => ( |
| ... | ... | @@ -303,7 +301,7 @@ export function ArchivedThreadsScreen(props: { |
| 303 | 301 | }) { |
| 304 | 302 | const { onDeleteThread, onUnarchiveThread } = props; |
| 305 | 303 | const openSwipeableRef = useRef<SwipeableMethods | null>(null); |
| 306 | const archiveScrollGesture = useMemo(() => Gesture.Native(), []); | |
| 304 | const archiveScrollGesture = useNativeGesture(); | |
| 307 | 305 | const environmentLabelsById = useMemo( |
| 308 | 306 | () => |
| 309 | 307 | new Map( |
apps/mobile/src/features/connection/CloudEnvironmentRows.tsx+2-8| ... | ... | @@ -13,13 +13,7 @@ import { |
| 13 | 13 | } from "@t3tools/contracts"; |
| 14 | 14 | import { useAtomValue } from "@effect/atom-react"; |
| 15 | 15 | import { useCallback, useState } from "react"; |
| 16 | import { | |
| 17 | ActivityIndicator, | |
| 18 | Pressable, | |
| 19 | type NativeSyntheticEvent, | |
| 20 | type TextLayoutEventData, | |
| 21 | View, | |
| 22 | } from "react-native"; | |
| 16 | import { ActivityIndicator, Pressable, type TextLayoutEvent, View } from "react-native"; | |
| 23 | 17 | |
| 24 | 18 | import { AppText as Text } from "../../components/AppText"; |
| 25 | 19 | import { EnvironmentMachineSymbol } from "../../components/EnvironmentMachineSymbol"; |
| ... | ... | @@ -334,7 +328,7 @@ function CloudEnvironmentRowShell(props: { |
| 334 | 328 | const isErrorExpanded = errorCanExpand && props.errorExpanded; |
| 335 | 329 | const StatusContainer = errorCanExpand ? Pressable : View; |
| 336 | 330 | const onMeasuredErrorTextLayout = useCallback( |
| 337 | (event: NativeSyntheticEvent<TextLayoutEventData>) => { | |
| 331 | (event: TextLayoutEvent) => { | |
| 338 | 332 | if (!props.connectionError) { |
| 339 | 333 | return; |
| 340 | 334 | } |
apps/mobile/src/features/devices/DeviceStreamWebView.tsx+2-2| ... | ... | @@ -89,7 +89,7 @@ function DeviceStreamDocumentView({ |
| 89 | 89 | readonly onStreaming: () => void; |
| 90 | 90 | readonly onRecoverProcess: () => boolean; |
| 91 | 91 | }) { |
| 92 | const webView = useRef<WebView>(null); | |
| 92 | const webView = useRef<WebView<object>>(null); | |
| 93 | 93 | const active = useRef(true); |
| 94 | 94 | const failed = useRef(false); |
| 95 | 95 | const [status, setStatus] = useState<DeviceStreamStatus>("connecting"); |
| ... | ... | @@ -148,7 +148,7 @@ function DeviceStreamDocumentView({ |
| 148 | 148 | }; |
| 149 | 149 | return ( |
| 150 | 150 | <View className="flex-1" style={{ backgroundColor: background }}> |
| 151 | <WebView | |
| 151 | <WebView<object> | |
| 152 | 152 | ref={webView} |
| 153 | 153 | source={source} |
| 154 | 154 | originWhitelist={["*"]} |
apps/mobile/src/features/files/MaterialFilesHeader.tsx+2-2| ... | ... | @@ -1,5 +1,5 @@ |
| 1 | 1 | import { useCallback, useEffect, useRef, useState, type ReactNode } from "react"; |
| 2 | import { BackHandler, Keyboard, type TextInput, View } from "react-native"; | |
| 2 | import { BackHandler, Keyboard, type TextInputInstance, View } from "react-native"; | |
| 3 | 3 | |
| 4 | 4 | import { AndroidHeaderIconButton, AndroidScreenHeader } from "../../components/AndroidScreenHeader"; |
| 5 | 5 | import { AndroidAnchoredMenu } from "../../components/AndroidAnchoredMenu"; |
| ... | ... | @@ -16,7 +16,7 @@ export function MaterialFilesHeader(props: { |
| 16 | 16 | readonly leading?: ReactNode; |
| 17 | 17 | }) { |
| 18 | 18 | const { paddingTop, paddingBottom } = useMaterialToolbarLayout(); |
| 19 | const searchRef = useRef<TextInput>(null); | |
| 19 | const searchRef = useRef<TextInputInstance>(null); | |
| 20 | 20 | const [searchOpen, setSearchOpen] = useState(false); |
| 21 | 21 | const searching = searchOpen || props.searchQuery.length > 0; |
| 22 | 22 | const { onSearchQueryChange } = props; |
apps/mobile/src/features/home/HomeScreen.tsx+4-4| ... | ... | @@ -309,8 +309,8 @@ export function HomeScreen(props: HomeScreenProps) { |
| 309 | 309 | (event: GestureResponderEvent, started: boolean) => { |
| 310 | 310 | const { changedTouches, touches } = event.nativeEvent; |
| 311 | 311 | 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)), | |
| 314 | 314 | ); |
| 315 | 315 | }, |
| 316 | 316 | [swipeRowActivation], |
| ... | ... | @@ -945,7 +945,7 @@ export function HomeScreen(props: HomeScreenProps) { |
| 945 | 945 | ); |
| 946 | 946 | } |
| 947 | 947 | |
| 948 | const listHeader = Platform.OS === "ios" ? null : <HomeTopContentSpacer />; | |
| 948 | const listHeader = Platform.OS === "ios" ? undefined : <HomeTopContentSpacer />; | |
| 949 | 949 | |
| 950 | 950 | // Project scoping lives in the header filter menu (no inline chip row on |
| 951 | 951 | // mobile — the menu is the one filter surface). |
| ... | ... | @@ -954,7 +954,7 @@ export function HomeScreen(props: HomeScreenProps) { |
| 954 | 954 | // Use the v2 project scope for its empty state. Snoozed threads need no |
| 955 | 955 | // special empty state: their shelf header is a list row even while collapsed. |
| 956 | 956 | const v2ListEmpty = |
| 957 | hasSearchQuery && threadSearch.isPending ? null : hasSearchQuery ? ( | |
| 957 | hasSearchQuery && threadSearch.isPending ? undefined : hasSearchQuery ? ( | |
| 958 | 958 | <EmptyState |
| 959 | 959 | title="No results" |
| 960 | 960 | detail={`No threads matching "${props.searchQuery}".`} |
apps/mobile/src/features/home/MaterialThreadListToolbar.tsx+8-2| ... | ... | @@ -1,5 +1,11 @@ |
| 1 | 1 | import { useCallback, useEffect, useRef, useState, type ComponentProps } from "react"; |
| 2 | import { BackHandler, Keyboard, type TextInput, View, type LayoutChangeEvent } from "react-native"; | |
| 2 | import { | |
| 3 | BackHandler, | |
| 4 | Keyboard, | |
| 5 | type TextInputInstance, | |
| 6 | View, | |
| 7 | type LayoutChangeEvent, | |
| 8 | } from "react-native"; | |
| 3 | 9 | import { useSafeAreaInsets } from "react-native-safe-area-context"; |
| 4 | 10 | import type { MenuAction } from "@react-native-menu/menu"; |
| 5 | 11 | |
| ... | ... | @@ -33,7 +39,7 @@ export function MaterialThreadListToolbar(props: { |
| 33 | 39 | const { height: toolbarHeight, ...headerPadding } = useMaterialToolbarLayout(); |
| 34 | 40 | const { state } = useWorkspaceState(); |
| 35 | 41 | const { onRequestVisibility, onSearchQueryChange } = props; |
| 36 | const searchRef = useRef<TextInput>(null); | |
| 42 | const searchRef = useRef<TextInputInstance>(null); | |
| 37 | 43 | const [searchOpen, setSearchOpen] = useState(false); |
| 38 | 44 | const searching = searchOpen || props.searchQuery.length > 0; |
| 39 | 45 | const openSearch = useCallback(() => { |
apps/mobile/src/features/home/thread-swipe-actions.tsx+3-5| ... | ... | @@ -266,9 +266,7 @@ interface ThreadSwipeableProps { |
| 266 | 266 | readonly resetKey?: string; |
| 267 | 267 | /** Paints the row without swipe machinery; see swipe-row-activation. */ |
| 268 | 268 | readonly dormant?: boolean; |
| 269 | readonly simultaneousWithExternalGesture?: ComponentProps< | |
| 270 | typeof ReanimatedSwipeable | |
| 271 | >["simultaneousWithExternalGesture"]; | |
| 269 | readonly simultaneousWith?: ComponentProps<typeof ReanimatedSwipeable>["simultaneousWith"]; | |
| 272 | 270 | readonly threadTitle: string; |
| 273 | 271 | } |
| 274 | 272 | |
| ... | ... | @@ -433,7 +431,7 @@ function ThreadSwipeableRow(props: ThreadSwipeableProps) { |
| 433 | 431 | animationOptions={THREAD_SWIPE_SPRING} |
| 434 | 432 | childrenContainerStyle={{ backgroundColor: props.backgroundColor }} |
| 435 | 433 | containerStyle={[{ backgroundColor: props.backgroundColor }, props.containerStyle]} |
| 436 | dragOffsetFromRightEdge={8} | |
| 434 | dragOffsetFromRight={-8} | |
| 437 | 435 | enabled={!isDismissing && props.enabled !== false && gateEnabled} |
| 438 | 436 | enableTrackpadTwoFingerGesture={props.enableTrackpadSwipe ?? true} |
| 439 | 437 | // Fail the swipe once the pan is vertically dominant (patched-in RNGH |
| ... | ... | @@ -497,7 +495,7 @@ function ThreadSwipeableRow(props: ThreadSwipeableProps) { |
| 497 | 495 | </Animated.View> |
| 498 | 496 | )} |
| 499 | 497 | rightThreshold={actionsWidth * 0.42} |
| 500 | simultaneousWithExternalGesture={props.simultaneousWithExternalGesture} | |
| 498 | simultaneousWith={props.simultaneousWith} | |
| 501 | 499 | > |
| 502 | 500 | {props.children(close)} |
| 503 | 501 | </ReanimatedSwipeable> |
apps/mobile/src/features/keyboard/CommandPalette.tsx+2-1| ... | ... | @@ -12,6 +12,7 @@ import { |
| 12 | 12 | TextInput, |
| 13 | 13 | useWindowDimensions, |
| 14 | 14 | View, |
| 15 | type TextInputInstance, | |
| 15 | 16 | } from "react-native"; |
| 16 | 17 | |
| 17 | 18 | import { GestureHandlerRootView } from "react-native-gesture-handler"; |
| ... | ... | @@ -151,7 +152,7 @@ export function CommandPalette(props: { |
| 151 | 152 | const [visible, setVisible] = useState(true); |
| 152 | 153 | const pendingAction = useRef<(() => void) | null>(null); |
| 153 | 154 | const closing = useRef(false); |
| 154 | const inputRef = useRef<TextInput>(null); | |
| 155 | const inputRef = useRef<TextInputInstance>(null); | |
| 155 | 156 | const listRef = useRef<FlatList<CommandPaletteItem>>(null); |
| 156 | 157 | const { width, height } = useWindowDimensions(); |
| 157 | 158 | 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 |
| 68 | 68 | if (!file.exists) { |
| 69 | 69 | file.create({ intermediates: true, overwrite: true }); |
| 70 | 70 | } |
| 71 | file.write(JSON.stringify(draft)); | |
| 71 | await file.write(JSON.stringify(draft)); | |
| 72 | 72 | } catch (cause) { |
| 73 | 73 | throw new IncomingShareStorageError({ operation: "write", shareId: draft.id, cause }); |
| 74 | 74 | } |
apps/mobile/src/features/terminal/NativeTerminalSurface.tsx+2-1| ... | ... | @@ -6,6 +6,7 @@ import { |
| 6 | 6 | View, |
| 7 | 7 | type LayoutChangeEvent, |
| 8 | 8 | type NativeSyntheticEvent, |
| 9 | type TextInputInstance, | |
| 9 | 10 | type ViewProps, |
| 10 | 11 | } from "react-native"; |
| 11 | 12 | |
| ... | ... | @@ -61,7 +62,7 @@ function estimateGridSize(input: { |
| 61 | 62 | |
| 62 | 63 | const FallbackTerminalSurface = memo(function FallbackTerminalSurface(props: TerminalSurfaceProps) { |
| 63 | 64 | const fontSize = props.fontSize ?? MOBILE_TYPOGRAPHY.label.fontSize; |
| 64 | const inputRef = useRef<TextInput>(null); | |
| 65 | const inputRef = useRef<TextInputInstance>(null); | |
| 65 | 66 | const { themeAppearance, themeId } = useAppearancePreferences(); |
| 66 | 67 | const theme = props.theme ?? getMobileTerminalTheme(themeId, themeAppearance); |
| 67 | 68 | const statusLabel = props.isRunning |
apps/mobile/src/features/threads/CustomSnoozeSheet.ios.tsx+3-3| ... | ... | @@ -139,7 +139,7 @@ export function CustomSnoozeSheet(props: { |
| 139 | 139 | modifiers={[ |
| 140 | 140 | datePickerStyle("wheel"), |
| 141 | 141 | labelsHidden(), |
| 142 | frame({ maxWidth: Infinity, height: 180 }), | |
| 142 | frame({ maxWidth: Infinity, minHeight: 180, maxHeight: 180 }), | |
| 143 | 143 | ]} |
| 144 | 144 | /> |
| 145 | 145 | ) : ( |
| ... | ... | @@ -154,7 +154,7 @@ export function CustomSnoozeSheet(props: { |
| 154 | 154 | modifiers={[ |
| 155 | 155 | pickerStyle("wheel"), |
| 156 | 156 | labelsHidden(), |
| 157 | frame({ minWidth: 0, maxWidth: Infinity, height: 180 }), | |
| 157 | frame({ minWidth: 0, maxWidth: Infinity, minHeight: 180, maxHeight: 180 }), | |
| 158 | 158 | clipped(), |
| 159 | 159 | ]} |
| 160 | 160 | > |
| ... | ... | @@ -177,7 +177,7 @@ export function CustomSnoozeSheet(props: { |
| 177 | 177 | modifiers={[ |
| 178 | 178 | pickerStyle("wheel"), |
| 179 | 179 | labelsHidden(), |
| 180 | frame({ minWidth: 0, maxWidth: Infinity, height: 180 }), | |
| 180 | frame({ minWidth: 0, maxWidth: Infinity, minHeight: 180, maxHeight: 180 }), | |
| 181 | 181 | clipped(), |
| 182 | 182 | ]} |
| 183 | 183 | > |
apps/mobile/src/features/threads/ThreadDetailScreen.tsx+2-1| ... | ... | @@ -47,6 +47,7 @@ import { |
| 47 | 47 | useWindowDimensions, |
| 48 | 48 | View, |
| 49 | 49 | type GestureResponderEvent, |
| 50 | type ViewInstance, | |
| 50 | 51 | } from "react-native"; |
| 51 | 52 | import { |
| 52 | 53 | KeyboardController, |
| ... | ... | @@ -321,7 +322,7 @@ export const ThreadDetailScreen = memo(function ThreadDetailScreen(props: Thread |
| 321 | 322 | const composerEditorRef = useRef<ComposerEditorHandle>(null); |
| 322 | 323 | const draftMessageRef = useRef(props.draftMessage); |
| 323 | 324 | draftMessageRef.current = props.draftMessage; |
| 324 | const composerOverlayRef = useRef<View>(null); | |
| 325 | const composerOverlayRef = useRef<ViewInstance>(null); | |
| 325 | 326 | const listRef = useRef<LegendListRef>(null); |
| 326 | 327 | const feedTouchStartRef = useRef<{ pageX: number; pageY: number } | null>(null); |
| 327 | 328 | 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"; |
| 14 | 14 | import { useAtomValue } from "@effect/atom-react"; |
| 15 | 15 | import { type EnvironmentId, resolveEnvironmentMachineKind } from "@t3tools/contracts"; |
| 16 | 16 | import { useCallback, useEffect, useMemo, useRef, useState } from "react"; |
| 17 | import type { LayoutChangeEvent } from "react-native"; | |
| 17 | import type { LayoutChangeEvent, TextInputInstance } from "react-native"; | |
| 18 | 18 | import { Platform, StyleSheet, TextInput, View } from "react-native"; |
| 19 | import { Gesture, GestureDetector } from "react-native-gesture-handler"; | |
| 19 | import { GestureDetector, useNativeGesture } from "react-native-gesture-handler"; | |
| 20 | 20 | import type { SwipeableMethods } from "react-native-gesture-handler/ReanimatedSwipeable"; |
| 21 | 21 | import { useSafeAreaInsets } from "react-native-safe-area-context"; |
| 22 | 22 | import type { SearchBarCommands } from "react-native-screens"; |
| ... | ... | @@ -139,10 +139,10 @@ function ThreadNavigationSidebarPane( |
| 139 | 139 | const threads = useThreadShells(); |
| 140 | 140 | const { environments: workspaceEnvironments, state: catalogState } = useWorkspaceState(); |
| 141 | 141 | const { savedConnectionsById } = useSavedRemoteConnections(); |
| 142 | const searchInputRef = useRef<TextInput>(null); | |
| 142 | const searchInputRef = useRef<TextInputInstance>(null); | |
| 143 | 143 | const searchBarRef = useRef<SearchBarCommands>(null); |
| 144 | 144 | const openSwipeableRef = useRef<SwipeableMethods | null>(null); |
| 145 | const sidebarScrollGesture = useMemo(() => Gesture.Native(), []); | |
| 145 | const sidebarScrollGesture = useNativeGesture(); | |
| 146 | 146 | const { |
| 147 | 147 | archiveThread, |
| 148 | 148 | confirmDeleteThread, |
apps/mobile/src/features/threads/thread-list-v2-items.tsx+2-4| ... | ... | @@ -523,9 +523,7 @@ export const ThreadListV2Row = memo(function ThreadListV2Row(props: { |
| 523 | 523 | readonly activationKey?: string; |
| 524 | 524 | readonly searchMatch?: EnvironmentThreadSearchMatch; |
| 525 | 525 | readonly searchQuery?: string; |
| 526 | readonly simultaneousSwipeGesture?: ComponentProps< | |
| 527 | typeof ThreadSwipeable | |
| 528 | >["simultaneousWithExternalGesture"]; | |
| 526 | readonly simultaneousSwipeGesture?: ComponentProps<typeof ThreadSwipeable>["simultaneousWith"]; | |
| 529 | 527 | }) { |
| 530 | 528 | const { width: windowWidth } = useWindowDimensions(); |
| 531 | 529 | const { |
| ... | ... | @@ -1198,7 +1196,7 @@ export const ThreadListV2Row = memo(function ThreadListV2Row(props: { |
| 1198 | 1196 | primaryAction={primaryAction} |
| 1199 | 1197 | secondaryAction={secondaryAction} |
| 1200 | 1198 | resetKey={`${thread.environmentId}:${thread.id}:${variant}:${snoozedRow}:${thread.settledAt}:${thread.unsettledAt}:${thread.snoozedUntil}`} |
| 1201 | simultaneousWithExternalGesture={props.simultaneousSwipeGesture} | |
| 1199 | simultaneousWith={props.simultaneousSwipeGesture} | |
| 1202 | 1200 | threadTitle={thread.title} |
| 1203 | 1201 | > |
| 1204 | 1202 | {(close) => ( |
apps/mobile/src/lib/atomic-file.ts+1-1| ... | ... | @@ -14,6 +14,6 @@ export async function writeFileAtomically(file: File, contents: string): Promise |
| 14 | 14 | tempFileSequence += 1; |
| 15 | 15 | const temp = new FileConstructor(file.parentDirectory, `${file.name}.${tempFileSequence}.tmp`); |
| 16 | 16 | temp.create({ intermediates: true, overwrite: true }); |
| 17 | temp.write(contents); | |
| 17 | await temp.write(contents); | |
| 18 | 18 | temp.moveSync(file, { overwrite: true }); |
| 19 | 19 | } |
apps/mobile/src/lib/attachmentUpload.ts+1-1| ... | ... | @@ -276,7 +276,7 @@ async function uploadFileBytes( |
| 276 | 276 | try { |
| 277 | 277 | if (fileUri === undefined && inlineDataUrl !== undefined) { |
| 278 | 278 | file.create(); |
| 279 | file.write(inlineDataUrl.slice(inlineDataUrl.indexOf(",") + 1), { | |
| 279 | await file.write(inlineDataUrl.slice(inlineDataUrl.indexOf(",") + 1), { | |
| 280 | 280 | encoding: "base64", |
| 281 | 281 | }); |
| 282 | 282 | } |
apps/mobile/src/lib/composerImages.ts+2-2| ... | ... | @@ -161,7 +161,7 @@ export async function persistComposerAttachmentFile( |
| 161 | 161 | try { |
| 162 | 162 | let copiedBytes = 0; |
| 163 | 163 | while (true) { |
| 164 | const chunk = reader.readBytes( | |
| 164 | const chunk = await reader.readBytes( | |
| 165 | 165 | Math.min(ATTACHMENT_COPY_CHUNK_BYTES, maxBytes - copiedBytes + 1), |
| 166 | 166 | ); |
| 167 | 167 | if (chunk.byteLength === 0) { |
| ... | ... | @@ -171,7 +171,7 @@ export async function persistComposerAttachmentFile( |
| 171 | 171 | if (copiedBytes > maxBytes) { |
| 172 | 172 | throw new Error(fileAttachmentTooLargeMessage(name, maxBytes)); |
| 173 | 173 | } |
| 174 | writer.writeBytes(chunk); | |
| 174 | await writer.writeBytes(chunk); | |
| 175 | 175 | } |
| 176 | 176 | } finally { |
| 177 | 177 | writer.close(); |
apps/mobile/src/native/T3ComposerEditor.ios.tsx+7-4| ... | ... | @@ -13,9 +13,12 @@ import { |
| 13 | 13 | type Ref, |
| 14 | 14 | } from "react"; |
| 15 | 15 | import type { NativeSyntheticEvent, StyleProp, ViewProps, ViewStyle } from "react-native"; |
| 16 | import { Image, StyleSheet } from "react-native"; | |
| 16 | import { StyleSheet } from "react-native"; | |
| 17 | 17 | |
| 18 | import { markdownFileIconSource } from "@t3tools/mobile-markdown-text/file-icons"; | |
| 18 | import { | |
| 19 | markdownFileIconSource, | |
| 20 | markdownIconAssetUri, | |
| 21 | } from "@t3tools/mobile-markdown-text/file-icons"; | |
| 19 | 22 | import { |
| 20 | 23 | composerChipSizeSuffix, |
| 21 | 24 | contextChipPresentation, |
| ... | ... | @@ -109,8 +112,8 @@ function basename(path: string): string { |
| 109 | 112 | return separator >= 0 ? path.slice(separator + 1) : path; |
| 110 | 113 | } |
| 111 | 114 | |
| 112 | function fileIconUri(path: string): string { | |
| 113 | return Image.resolveAssetSource(markdownFileIconSource(resolveMarkdownFileIcon(path))).uri; | |
| 115 | function fileIconUri(path: string): string | null { | |
| 116 | return markdownIconAssetUri(markdownFileIconSource(resolveMarkdownFileIcon(path))) ?? null; | |
| 114 | 117 | } |
| 115 | 118 | |
| 116 | 119 | export function ComposerEditor({ |
apps/mobile/src/native/T3ComposerEditor.native.tsx+6-3| ... | ... | @@ -16,7 +16,10 @@ import { |
| 16 | 16 | import type { NativeSyntheticEvent, ViewProps } from "react-native"; |
| 17 | 17 | import { Image, Platform, StyleSheet } from "react-native"; |
| 18 | 18 | |
| 19 | import { markdownFileIconSource } from "@t3tools/mobile-markdown-text/file-icons"; | |
| 19 | import { | |
| 20 | markdownFileIconSource, | |
| 21 | markdownIconAssetUri, | |
| 22 | } from "@t3tools/mobile-markdown-text/file-icons"; | |
| 20 | 23 | import { |
| 21 | 24 | composerChipSizeSuffix, |
| 22 | 25 | contextChipPresentation, |
| ... | ... | @@ -110,8 +113,8 @@ function basename(path: string): string { |
| 110 | 113 | return separator >= 0 ? path.slice(separator + 1) : path; |
| 111 | 114 | } |
| 112 | 115 | |
| 113 | function fileIconUri(path: string): string { | |
| 114 | return Image.resolveAssetSource(markdownFileIconSource(resolveMarkdownFileIcon(path))).uri; | |
| 116 | function fileIconUri(path: string): string | null { | |
| 117 | return markdownIconAssetUri(markdownFileIconSource(resolveMarkdownFileIcon(path))) ?? null; | |
| 115 | 118 | } |
| 116 | 119 | |
| 117 | 120 | export function ComposerEditor({ |
apps/mobile/src/native/T3ComposerEditor.tsx+2-2| ... | ... | @@ -1,6 +1,6 @@ |
| 1 | 1 | import { TextInputWrapper } from "expo-paste-input"; |
| 2 | 2 | import { useImperativeHandle, useRef } from "react"; |
| 3 | import { TextInput, type TextInput as RNTextInput } from "react-native"; | |
| 3 | import { TextInput, type TextInputInstance } from "react-native"; | |
| 4 | 4 | |
| 5 | 5 | import { useFontFamily } from "../lib/useFontFamily"; |
| 6 | 6 | import { useScaledTextRole } from "../features/settings/appearance/useScaledTextRole"; |
| ... | ... | @@ -21,7 +21,7 @@ export function ComposerEditor({ |
| 21 | 21 | readOnly = false, |
| 22 | 22 | ...props |
| 23 | 23 | }: ComposerEditorProps) { |
| 24 | const inputRef = useRef<RNTextInput>(null); | |
| 24 | const inputRef = useRef<TextInputInstance>(null); | |
| 25 | 25 | const bodyText = useScaledTextRole("body"); |
| 26 | 26 | const fontFamily = useFontFamily("regular"); |
| 27 | 27 | 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"; |
| 4 | 4 | |
| 5 | 5 | import type { HardwareKeyboardCommand } from "../features/keyboard/hardwareKeyboardCommands"; |
| 6 | 6 | |
| 7 | interface NativeKeyboardCommandsProps extends ViewProps, PropsWithChildren { | |
| 7 | interface NativeKeyboardCommandsProps extends ViewProps { | |
| 8 | 8 | readonly enabledCommands: ReadonlyArray<HardwareKeyboardCommand>; |
| 9 | 9 | readonly onCommand: ( |
| 10 | 10 | 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"; |
| 4 | 4 | |
| 5 | 5 | import type { HardwareKeyboardCommand } from "../features/keyboard/hardwareKeyboardCommands"; |
| 6 | 6 | |
| 7 | interface NativeKeyboardCommandsProps extends ViewProps, PropsWithChildren { | |
| 7 | interface NativeKeyboardCommandsProps extends ViewProps { | |
| 8 | 8 | readonly enabledCommands: ReadonlyArray<HardwareKeyboardCommand>; |
| 9 | 9 | readonly onCommand: ( |
| 10 | 10 | event: NativeSyntheticEvent<{ readonly command: HardwareKeyboardCommand }>, |
apps/mobile/src/widgets/SubscriptionUsage.tsx+1-1| ... | ... | @@ -29,7 +29,7 @@ function SubscriptionUsage( |
| 29 | 29 | // The extension evaluates this function without the app's module scope. |
| 30 | 30 | const family = environment.widgetFamily; |
| 31 | 31 | // 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()); | |
| 33 | 33 | const accessory = family === "accessoryRectangular"; |
| 34 | 34 | const compact = |
| 35 | 35 | family === "systemSmall" || accessory || environment.levelOfDetail === "simplified"; |
apps/mobile/tsconfig.json+1-1| ... | ... | @@ -1,5 +1,5 @@ |
| 1 | 1 | { |
| 2 | "extends": "expo/tsconfig.base", | |
| 2 | "extends": "expo/tsconfig.base.json", | |
| 3 | 3 | "compilerOptions": { |
| 4 | 4 | "allowImportingTsExtensions": true, |
| 5 | 5 | "strict": true, |
apps/web/package.json+1-1| ... | ... | @@ -68,7 +68,7 @@ |
| 68 | 68 | "@types/compression": "^1.8.1", |
| 69 | 69 | "@types/culori": "^4.0.1", |
| 70 | 70 | "@types/mdast": "^4.0.4", |
| 71 | "@types/react": "~19.2.14", | |
| 71 | "@types/react": "~19.3.0", | |
| 72 | 72 | "@types/react-dom": "~19.2.3", |
| 73 | 73 | "@types/react-test-renderer": "19.1.0", |
| 74 | 74 | "@vercel/config": "^0.3.0", |
patches/@clerk__expo@4.6.8.patch+17| ... | ... | @@ -1,3 +1,20 @@ |
| 1 | diff --git a/android/build.gradle b/android/build.gradle | |
| 2 | index 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 | } | |
| 1 | 18 | diff --git a/ios/ClerkAuthNativeView.swift b/ios/ClerkAuthNativeView.swift |
| 2 | 19 | index 5f8d2ba66d5b232890af75c22b173c86d2ef546b..b170304cbf2fbaae8032db8dd6f89b6a59c6e3fe 100644 |
| 3 | 20 | --- a/ios/ClerkAuthNativeView.swift |
patches/@expo__metro-config@57.0.12.patch deleted-86| ... | ... | @@ -1,86 +0,0 @@ |
| 1 | diff --git a/build/serializer/sourceMap.js b/build/serializer/sourceMap.js | |
| 2 | index 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 @@ |
| 1 | diff --git a/build/serializer/sourceMap.js b/build/serializer/sourceMap.js | |
| 2 | index 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 |
| 2 | 2 | index 3d149b3e7426b8f7c999603ddf1e15e12331c33a..e80fe2caae86e339fcb03408419a7d64b3e5b04f 100644 |
| 3 | 3 | --- a/ios/MenuViewManager.mm |
| 4 | 4 | +++ 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 | |
| 5 | 13 | @@ -65,6 +65,10 @@ - (UIView *)view |
| 6 | 14 | * onOpenMenu: callback to be called when the menu is opened |
| 7 | 15 | */ |
patches/expo-audio@57.0.4.patch deleted-24| ... | ... | @@ -1,24 +0,0 @@ |
| 1 | diff --git a/ios/AudioRecorder.swift b/ios/AudioRecorder.swift | |
| 2 | index 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 @@ |
| 1 | diff --git a/ios/AudioRecorder.swift b/ios/AudioRecorder.swift | |
| 2 | index 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 @@ |
| 1 | diff --git a/build/BlurView.types.d.ts b/build/BlurView.types.d.ts | |
| 2 | index 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'; | |
| 29 | diff --git a/src/BlurView.types.ts b/src/BlurView.types.ts | |
| 30 | index 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 @@ |
| 1 | diff --git a/build/GlassContainer.types.d.ts b/build/GlassContainer.types.d.ts | |
| 2 | index 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; | |
| 19 | diff --git a/build/GlassView.types.d.ts b/build/GlassView.types.d.ts | |
| 20 | index 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; | |
| 37 | diff --git a/src/GlassContainer.types.ts b/src/GlassContainer.types.ts | |
| 38 | index 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; | |
| 55 | diff --git a/src/GlassView.types.ts b/src/GlassView.types.ts | |
| 56 | index 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 @@ |
| 1 | diff --git a/android/src/main/java/expo/modules/sharing/SharingRecords.kt b/android/src/main/java/expo/modules/sharing/SharingRecords.kt | |
| 2 | index 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 | |
| 15 | diff --git a/android/src/main/java/expo/modules/sharing/dataParsers/SimpleShareIntentDataParser.kt b/android/src/main/java/expo/modules/sharing/dataParsers/SimpleShareIntentDataParser.kt | |
| 16 | index 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 | } | |
| 91 | diff --git a/build/Sharing.types.d.ts b/build/Sharing.types.d.ts | |
| 92 | index 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 | /** | |
| 107 | diff --git a/src/Sharing.types.ts b/src/Sharing.types.ts | |
| 108 | index 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 @@ |
| 1 | diff --git a/android/src/main/java/expo/modules/sharing/SharingRecords.kt b/android/src/main/java/expo/modules/sharing/SharingRecords.kt | |
| 2 | index 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 | |
| 15 | diff --git a/android/src/main/java/expo/modules/sharing/dataParsers/SimpleShareIntentDataParser.kt b/android/src/main/java/expo/modules/sharing/dataParsers/SimpleShareIntentDataParser.kt | |
| 16 | index 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 | } | |
| 91 | diff --git a/build/Sharing.types.d.ts b/build/Sharing.types.d.ts | |
| 92 | index 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 | /** | |
| 107 | diff --git a/src/Sharing.types.ts b/src/Sharing.types.ts | |
| 108 | index 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 @@ |
| 1 | diff --git a/build/Widgets.types.d.ts b/build/Widgets.types.d.ts | |
| 2 | index 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+ | |
| 16 | diff --git a/ios/Widgets/Utils.swift b/ios/Widgets/Utils.swift | |
| 17 | index 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, *) { | |
| 31 | diff --git a/ios/Widgets/WidgetLiveActivity.swift b/ios/Widgets/WidgetLiveActivity.swift | |
| 32 | index 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] { | |
| 134 | diff --git a/src/Widgets.types.ts b/src/Widgets.types.ts | |
| 135 | index 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 @@ |
| 1 | diff --git a/build/Widgets.types.d.ts b/build/Widgets.types.d.ts | |
| 2 | index 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+ | |
| 16 | diff --git a/ios/Widgets/Utils.swift b/ios/Widgets/Utils.swift | |
| 17 | index 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)" | |
| 31 | diff --git a/ios/Widgets/WidgetLiveActivity.swift b/ios/Widgets/WidgetLiveActivity.swift | |
| 32 | index 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] { | |
| 134 | diff --git a/scripts/build-layout-registry.mjs b/scripts/build-layout-registry.mjs | |
| 135 | index 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 | } | |
| 148 | diff --git a/src/Widgets.types.ts b/src/Widgets.types.ts | |
| 149 | index 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 @@ |
| 1 | diff --git a/apple/Handlers/RNHoverHandler.m b/apple/Handlers/RNHoverHandler.m | |
| 2 | index 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 | } | |
| 17 | diff --git a/lib/commonjs/components/ReanimatedSwipeable/ReanimatedSwipeable.js b/lib/commonjs/components/ReanimatedSwipeable/ReanimatedSwipeable.js | |
| 18 | index 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: [{ | |
| 66 | diff --git a/lib/module/components/ReanimatedSwipeable/ReanimatedSwipeable.js b/lib/module/components/ReanimatedSwipeable/ReanimatedSwipeable.js | |
| 67 | index 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: [{ | |
| 115 | diff --git a/lib/typescript/components/ReanimatedSwipeable/ReanimatedSwipeableProps.d.ts b/lib/typescript/components/ReanimatedSwipeable/ReanimatedSwipeableProps.d.ts | |
| 116 | index 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 | */ | |
| 147 | diff --git a/src/components/ReanimatedSwipeable/ReanimatedSwipeable.tsx b/src/components/ReanimatedSwipeable/ReanimatedSwipeable.tsx | |
| 148 | index 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, | |
| 205 | diff --git a/src/components/ReanimatedSwipeable/ReanimatedSwipeableProps.ts b/src/components/ReanimatedSwipeable/ReanimatedSwipeableProps.ts | |
| 206 | index 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 @@ |
| 1 | diff --git a/lib/module/components/ReanimatedSwipeable/ReanimatedSwipeable.js b/lib/module/components/ReanimatedSwipeable/ReanimatedSwipeable.js | |
| 2 | index 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, | |
| 41 | diff --git a/lib/typescript/components/ReanimatedSwipeable/ReanimatedSwipeableProps.d.ts b/lib/typescript/components/ReanimatedSwipeable/ReanimatedSwipeableProps.d.ts | |
| 42 | index 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; | |
| 72 | diff --git a/src/components/ReanimatedSwipeable/ReanimatedSwipeable.tsx b/src/components/ReanimatedSwipeable/ReanimatedSwipeable.tsx | |
| 73 | index 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, | |
| 119 | diff --git a/src/components/ReanimatedSwipeable/ReanimatedSwipeableProps.ts b/src/components/ReanimatedSwipeable/ReanimatedSwipeableProps.ts | |
| 120 | index 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 @@ |
| 1 | diff --git a/lib/commonjs/components/KeyboardChatScrollView/index.js b/lib/commonjs/components/KeyboardChatScrollView/index.js | |
| 2 | index 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); | |
| 65 | diff --git a/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/helpers.js b/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/helpers.js | |
| 66 | index 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 | |
| 90 | diff --git a/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/index.ios.js b/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/index.ios.js | |
| 91 | index 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, | |
| 185 | diff --git a/lib/commonjs/components/KeyboardChatScrollView/useExtraContentPadding/index.js b/lib/commonjs/components/KeyboardChatScrollView/useExtraContentPadding/index.js | |
| 186 | index 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 | |
| 224 | diff --git a/lib/module/components/KeyboardChatScrollView/index.js b/lib/module/components/KeyboardChatScrollView/index.js | |
| 225 | index 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); | |
| 298 | diff --git a/lib/module/components/KeyboardChatScrollView/useChatKeyboard/helpers.js b/lib/module/components/KeyboardChatScrollView/useChatKeyboard/helpers.js | |
| 299 | index 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 | |
| 322 | diff --git a/lib/module/components/KeyboardChatScrollView/useChatKeyboard/index.ios.js b/lib/module/components/KeyboardChatScrollView/useChatKeyboard/index.ios.js | |
| 323 | index 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, | |
| 417 | diff --git a/lib/module/components/KeyboardChatScrollView/useExtraContentPadding/index.js b/lib/module/components/KeyboardChatScrollView/useExtraContentPadding/index.js | |
| 418 | index 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 | |
| 457 | diff --git a/lib/typescript/components/KeyboardChatScrollView/types.d.ts b/lib/typescript/components/KeyboardChatScrollView/types.d.ts | |
| 458 | index 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. | |
| 472 | diff --git a/lib/typescript/components/KeyboardChatScrollView/useChatKeyboard/helpers.d.ts b/lib/typescript/components/KeyboardChatScrollView/useChatKeyboard/helpers.d.ts | |
| 473 | index 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; | |
| 482 | diff --git a/lib/typescript/components/KeyboardChatScrollView/useChatKeyboard/types.d.ts b/lib/typescript/components/KeyboardChatScrollView/useChatKeyboard/types.d.ts | |
| 483 | index 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. */ | |
| 497 | diff --git a/lib/typescript/components/KeyboardChatScrollView/useExtraContentPadding/index.d.ts b/lib/typescript/components/KeyboardChatScrollView/useExtraContentPadding/index.d.ts | |
| 498 | index 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. */ | |
| 512 | diff --git a/src/components/KeyboardChatScrollView/index.tsx b/src/components/KeyboardChatScrollView/index.tsx | |
| 513 | index 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); | |
| 604 | diff --git a/src/components/KeyboardChatScrollView/types.ts b/src/components/KeyboardChatScrollView/types.ts | |
| 605 | index 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. | |
| 626 | diff --git a/src/components/KeyboardChatScrollView/useChatKeyboard/helpers.ts b/src/components/KeyboardChatScrollView/useChatKeyboard/helpers.ts | |
| 627 | index 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 | }; | |
| 655 | diff --git a/src/components/KeyboardChatScrollView/useChatKeyboard/index.ios.ts b/src/components/KeyboardChatScrollView/useChatKeyboard/index.ios.ts | |
| 656 | index 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 { | |
| 781 | diff --git a/src/components/KeyboardChatScrollView/useChatKeyboard/types.ts b/src/components/KeyboardChatScrollView/useChatKeyboard/types.ts | |
| 782 | index 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 = { | |
| 796 | diff --git a/src/components/KeyboardChatScrollView/useExtraContentPadding/index.ts b/src/components/KeyboardChatScrollView/useExtraContentPadding/index.ts | |
| 797 | index 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 @@ |
| 1 | diff --git a/lib/commonjs/components/KeyboardChatScrollView/index.js b/lib/commonjs/components/KeyboardChatScrollView/index.js | |
| 2 | index 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); | |
| 65 | diff --git a/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/helpers.js b/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/helpers.js | |
| 66 | index 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 | |
| 91 | diff --git a/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/index.ios.js b/lib/commonjs/components/KeyboardChatScrollView/useChatKeyboard/index.ios.js | |
| 92 | index 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, | |
| 190 | diff --git a/lib/commonjs/components/KeyboardChatScrollView/useExtraContentPadding/index.js b/lib/commonjs/components/KeyboardChatScrollView/useExtraContentPadding/index.js | |
| 191 | index 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 | |
| 230 | diff --git a/lib/module/components/KeyboardChatScrollView/index.js b/lib/module/components/KeyboardChatScrollView/index.js | |
| 231 | index 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); | |
| 304 | diff --git a/lib/module/components/KeyboardChatScrollView/useChatKeyboard/helpers.js b/lib/module/components/KeyboardChatScrollView/useChatKeyboard/helpers.js | |
| 305 | index 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 | |
| 329 | diff --git a/lib/module/components/KeyboardChatScrollView/useChatKeyboard/index.ios.js b/lib/module/components/KeyboardChatScrollView/useChatKeyboard/index.ios.js | |
| 330 | index 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, | |
| 428 | diff --git a/lib/module/components/KeyboardChatScrollView/useExtraContentPadding/index.js b/lib/module/components/KeyboardChatScrollView/useExtraContentPadding/index.js | |
| 429 | index 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 | |
| 469 | diff --git a/lib/typescript/components/KeyboardChatScrollView/types.d.ts b/lib/typescript/components/KeyboardChatScrollView/types.d.ts | |
| 470 | index 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. | |
| 484 | diff --git a/lib/typescript/components/KeyboardChatScrollView/useChatKeyboard/helpers.d.ts b/lib/typescript/components/KeyboardChatScrollView/useChatKeyboard/helpers.d.ts | |
| 485 | index 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; | |
| 494 | diff --git a/lib/typescript/components/KeyboardChatScrollView/useChatKeyboard/types.d.ts b/lib/typescript/components/KeyboardChatScrollView/useChatKeyboard/types.d.ts | |
| 495 | index 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. */ | |
| 509 | diff --git a/lib/typescript/components/KeyboardChatScrollView/useExtraContentPadding/index.d.ts b/lib/typescript/components/KeyboardChatScrollView/useExtraContentPadding/index.d.ts | |
| 510 | index 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. */ | |
| 524 | diff --git a/src/components/KeyboardChatScrollView/index.tsx b/src/components/KeyboardChatScrollView/index.tsx | |
| 525 | index 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); | |
| 616 | diff --git a/src/components/KeyboardChatScrollView/types.ts b/src/components/KeyboardChatScrollView/types.ts | |
| 617 | index 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. | |
| 638 | diff --git a/src/components/KeyboardChatScrollView/useChatKeyboard/helpers.ts b/src/components/KeyboardChatScrollView/useChatKeyboard/helpers.ts | |
| 639 | index 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 | }; | |
| 667 | diff --git a/src/components/KeyboardChatScrollView/useChatKeyboard/index.ios.ts b/src/components/KeyboardChatScrollView/useChatKeyboard/index.ios.ts | |
| 668 | index 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 { | |
| 797 | diff --git a/src/components/KeyboardChatScrollView/useChatKeyboard/types.ts b/src/components/KeyboardChatScrollView/useChatKeyboard/types.ts | |
| 798 | index 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 = { | |
| 812 | diff --git a/src/components/KeyboardChatScrollView/useExtraContentPadding/index.ts b/src/components/KeyboardChatScrollView/useExtraContentPadding/index.ts | |
| 813 | index 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 @@ |
| 1 | diff --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(); | |
| 1 | 17 | diff --git a/package.json b/package.json |
| 2 | 18 | index 4e4366fb9d05a6c250acfc62e79487475d8ac05b..200e4680d77cbb4f14d22eb986efde1275a0d3e8 100644 |
| 3 | 19 | --- a/package.json |
patches/react-native-reanimated@4.5.5.patch deleted-69| ... | ... | @@ -1,69 +0,0 @@ |
| 1 | diff --git a/Common/cpp/reanimated/LayoutAnimations/LayoutAnimationsProxyCommon.h b/Common/cpp/reanimated/LayoutAnimations/LayoutAnimationsProxyCommon.h | |
| 2 | index 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 | ||
| 13 | diff --git a/Common/cpp/reanimated/LayoutAnimations/LayoutAnimationsProxy_Experimental.cpp b/Common/cpp/reanimated/LayoutAnimations/LayoutAnimationsProxy_Experimental.cpp | |
| 14 | index 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); | |
| 44 | diff --git a/Common/cpp/reanimated/LayoutAnimations/LayoutAnimationsProxy_Legacy.cpp b/Common/cpp/reanimated/LayoutAnimations/LayoutAnimationsProxy_Legacy.cpp | |
| 45 | index 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 @@ |
| 1 | diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt | |
| 2 | index 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?, | |
| 40 | diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt | |
| 41 | index 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( | |
| 57 | diff --git a/ios/RNSBarButtonItem.h b/ios/RNSBarButtonItem.h | |
| 58 | index 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 | |
| 72 | diff --git a/ios/RNSBarButtonItem.mm b/ios/RNSBarButtonItem.mm | |
| 73 | index 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, *)) { | |
| 135 | diff --git a/ios/RNSScreenStackHeaderConfig.h b/ios/RNSScreenStackHeaderConfig.h | |
| 136 | index 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 | |
| 161 | diff --git a/ios/RNSScreenStackHeaderConfig.mm b/ios/RNSScreenStackHeaderConfig.mm | |
| 162 | index 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) { | |
| 1118 | diff --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 | ||
| 1167 | diff --git a/ios/RNSScreenStackHeaderSubview.mm b/ios/RNSScreenStackHeaderSubview.mm | |
| 1168 | index 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 | |
| 1253 | diff --git a/lib/commonjs/components/ScreenStackHeaderConfig.js b/lib/commonjs/components/ScreenStackHeaderConfig.js | |
| 1254 | index 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, | |
| 1337 | diff --git a/lib/commonjs/components/helpers/prepareHeaderBarButtonItems.js b/lib/commonjs/components/helpers/prepareHeaderBarButtonItems.js | |
| 1338 | index 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 | |
| 1425 | diff --git a/lib/module/components/ScreenStackHeaderConfig.js b/lib/module/components/ScreenStackHeaderConfig.js | |
| 1426 | index 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, | |
| 1509 | diff --git a/lib/module/components/helpers/prepareHeaderBarButtonItems.js b/lib/module/components/helpers/prepareHeaderBarButtonItems.js | |
| 1510 | index 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 | |
| 1594 | diff --git a/lib/typescript/components/helpers/prepareHeaderBarButtonItems.d.ts b/lib/typescript/components/helpers/prepareHeaderBarButtonItems.d.ts | |
| 1595 | index 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 | |
| 1613 | diff --git a/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts b/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts | |
| 1614 | index 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>; | |
| 1649 | diff --git a/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts b/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts | |
| 1650 | index 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>; | |
| 1661 | diff --git a/lib/typescript/types.d.ts b/lib/typescript/types.d.ts | |
| 1662 | index 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 | */ | |
| 1802 | diff --git a/src/components/ScreenStackHeaderConfig.tsx b/src/components/ScreenStackHeaderConfig.tsx | |
| 1803 | index 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} | |
| 1930 | diff --git a/src/components/helpers/prepareHeaderBarButtonItems.ts b/src/components/helpers/prepareHeaderBarButtonItems.ts | |
| 1931 | index 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 | }; | |
| 2029 | diff --git a/src/fabric/ScreenStackHeaderConfigNativeComponent.ts b/src/fabric/ScreenStackHeaderConfigNativeComponent.ts | |
| 2030 | index 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; | |
| 2066 | diff --git a/src/fabric/ScreenStackHeaderSubviewNativeComponent.ts b/src/fabric/ScreenStackHeaderSubviewNativeComponent.ts | |
| 2067 | index 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 | ||
| 2078 | diff --git a/src/types.tsx b/src/types.tsx | |
| 2079 | index 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 @@ |
| 1 | diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt | |
| 2 | index 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?, | |
| 40 | diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt | |
| 41 | index 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( | |
| 57 | diff --git a/ios/RNSBarButtonItem.h b/ios/RNSBarButtonItem.h | |
| 58 | index 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 | |
| 72 | diff --git a/ios/RNSBarButtonItem.mm b/ios/RNSBarButtonItem.mm | |
| 73 | index 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, *)) { | |
| 135 | diff --git a/ios/RNSScreenStack.mm b/ios/RNSScreenStack.mm | |
| 136 | index 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 | ||
| 185 | diff --git a/ios/RNSScreenStackHeaderConfig.h b/ios/RNSScreenStackHeaderConfig.h | |
| 186 | index 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 | |
| 211 | diff --git a/ios/RNSScreenStackHeaderConfig.mm b/ios/RNSScreenStackHeaderConfig.mm | |
| 212 | index 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) { | |
| 1168 | diff --git a/ios/RNSScreenStackHeaderSubview.mm b/ios/RNSScreenStackHeaderSubview.mm | |
| 1169 | index 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 | |
| 1255 | diff --git a/lib/commonjs/components/ScreenStackHeaderConfig.js b/lib/commonjs/components/ScreenStackHeaderConfig.js | |
| 1256 | index 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, | |
| 1339 | diff --git a/lib/commonjs/components/helpers/prepareHeaderBarButtonItems.js b/lib/commonjs/components/helpers/prepareHeaderBarButtonItems.js | |
| 1340 | index 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 | |
| 1427 | diff --git a/lib/module/components/ScreenStackHeaderConfig.js b/lib/module/components/ScreenStackHeaderConfig.js | |
| 1428 | index 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, | |
| 1511 | diff --git a/lib/module/components/helpers/prepareHeaderBarButtonItems.js b/lib/module/components/helpers/prepareHeaderBarButtonItems.js | |
| 1512 | index 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 | |
| 1598 | diff --git a/lib/typescript/components/helpers/prepareHeaderBarButtonItems.d.ts b/lib/typescript/components/helpers/prepareHeaderBarButtonItems.d.ts | |
| 1599 | index 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 | |
| 1619 | diff --git a/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts b/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts | |
| 1620 | index 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>; | |
| 1655 | diff --git a/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts b/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts | |
| 1656 | index 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>; | |
| 1667 | diff --git a/lib/typescript/types.d.ts b/lib/typescript/types.d.ts | |
| 1668 | index 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 | */ | |
| 1808 | diff --git a/src/components/ScreenStackHeaderConfig.tsx b/src/components/ScreenStackHeaderConfig.tsx | |
| 1809 | index 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} | |
| 1936 | diff --git a/src/components/helpers/prepareHeaderBarButtonItems.ts b/src/components/helpers/prepareHeaderBarButtonItems.ts | |
| 1937 | index 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 | }; | |
| 2035 | diff --git a/src/fabric/ScreenStackHeaderConfigNativeComponent.ts b/src/fabric/ScreenStackHeaderConfigNativeComponent.ts | |
| 2036 | index 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; | |
| 2072 | diff --git a/src/fabric/ScreenStackHeaderSubviewNativeComponent.ts b/src/fabric/ScreenStackHeaderSubviewNativeComponent.ts | |
| 2073 | index 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 | ||
| 2084 | diff --git a/src/types.tsx b/src/types.tsx | |
| 2085 | index 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: |
| 69 | 69 | '@effect/sql-pg': 4.0.0-rc.115 |
| 70 | 70 | '@effect/vitest': 4.0.0-rc.115 |
| 71 | 71 | '@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 | |
| 76 | 78 | '@pierre/diffs>@shikijs/transformers': ^4.2.0 |
| 77 | 79 | '@tailwindcss/node': 4.3.3 |
| 78 | 80 | '@tailwindcss/oxide': 4.3.3 |
| 79 | 81 | '@tailwindcss/vite': 4.3.3 |
| 80 | 82 | '@types/node': 24.12.4 |
| 81 | 83 | 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 | |
| 85 | 84 | node-abi: 4.33.0 |
| 86 | 85 | lightningcss: 1.33.0 |
| 87 | 86 | tailwindcss: 4.3.3 |
| 88 | 87 | vite: npm:@voidzero-dev/vite-plus-core@1.0.0 |
| 89 | 88 | yaml: ^2.9.0 |
| 90 | 89 | |
| 91 | packageExtensionsChecksum: sha256-k/dT9NFDl5hihRPaoFKeY11hzyutMFs5psfZLFiKJic= | |
| 90 | packageExtensionsChecksum: sha256-34mvKz5PLlrn2Tt9jUJC1SbK5hRE+oxwqyC1J6r09oE= | |
| 92 | 91 | |
| 93 | 92 | patchedDependencies: |
| 94 | '@clerk/expo@4.6.8': a82bb41039ee88a290a87d4ab58be7be4c49fa338603b17ea646e1ec140a1cfb | |
| 93 | '@clerk/expo@4.6.8': b8b22ab733de5bea846ad9e88046c10582352fe9ad86f314f368b2a823f0f281 | |
| 95 | 94 | '@effect/vitest@4.0.0-rc.115': 172bd95ef73a13d322888984415d5d18d9d2aa8e13fa529eac235efac837e902 |
| 96 | '@expo/metro-config@57.0.12': 96f1a75347e6ea02dc4b7034ace815d8ee39e18b8166ebfb573d9e58328f0dc2 | |
| 95 | '@expo/metro-config@58.0.6': 90fa980e8b6480631fb2fbb04559834e3c612db40c550cd828f11be297d8d760 | |
| 97 | 96 | '@ff-labs/fff-node@0.9.4': c4e3cc2420ceb9dc650f9d189e9c24baf7e83f342998bacda5f459a4ce7927a8 |
| 98 | 97 | '@legendapp/list@3.3.5': 680cc6a5c5b4a4032e467e7b3fde22f89a84c0ee2e6eac6fda737d6277cc0806 |
| 99 | 98 | '@pierre/diffs@1.3.0-beta.10': 0ccee155b93b63d810e2c1a40c1fd676fb6fbcfa72cf6430dcedf1a3ae475ab4 |
| 100 | 99 | '@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 | |
| 102 | 101 | '@react-navigation/native-stack@7.17.6': e667c3cef8c78bb9ff4882ee5bd23a432247b843060a9499eb5f07e9e2295552 |
| 103 | 102 | alchemy@2.0.0-beta.79: d1a03d902083946ee58121cc2787d88d1da561e9e30a5bcfcb8654692a489fb8 |
| 104 | 103 | dbus-next@0.10.2: cfff57561b0ee59b5addb3b2e6c6f20906e967507a530ab67e8db8108e520ba4 |
| 105 | 104 | 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 | |
| 111 | 110 | 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 | |
| 114 | 113 | 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 | |
| 118 | 116 | uniwind@1.11.0: a91f3953483cfd434436de6358ff5b63c49974ef148fad91246c26ba95332625 |
| 119 | 117 | |
| 120 | 118 | importers: |
| ... | ... | @@ -144,7 +142,7 @@ importers: |
| 144 | 142 | dependencies: |
| 145 | 143 | '@clerk/electron': |
| 146 | 144 | 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) | |
| 148 | 146 | '@clerk/electron-passkeys': |
| 149 | 147 | specifier: 0.0.3 |
| 150 | 148 | version: 0.0.3 |
| ... | ... | @@ -245,19 +243,22 @@ importers: |
| 245 | 243 | dependencies: |
| 246 | 244 | '@clerk/expo': |
| 247 | 245 | specifier: 4.6.8 |
| 248 | version: 4.6.8(patch_hash=a82bb41039ee88a290a87d4ab58be7be4c49fa338603b17ea646e1ec140a1cfb)(dbc31631339ce74330e188d5d7a88158) | |
| 246 | version: 4.6.8(patch_hash=b8b22ab733de5bea846ad9e88046c10582352fe9ad86f314f368b2a823f0f281)(950bb7335d61b76ffb649f136fc0d4df) | |
| 249 | 247 | '@effect/atom-react': |
| 250 | 248 | 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) | |
| 252 | 250 | '@expo-google-fonts/dm-sans': |
| 253 | 251 | specifier: ^0.4.2 |
| 254 | 252 | 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) | |
| 255 | 256 | '@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) | |
| 258 | 259 | '@legendapp/list': |
| 259 | 260 | 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) | |
| 261 | 262 | '@material/material-color-utilities': |
| 262 | 263 | specifier: 0.3.0 |
| 263 | 264 | version: 0.3.0 |
| ... | ... | @@ -266,22 +267,22 @@ importers: |
| 266 | 267 | version: 1.9.1 |
| 267 | 268 | '@pierre/diffs': |
| 268 | 269 | 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) | |
| 270 | 271 | '@react-native-ai/apple': |
| 271 | 272 | 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)) | |
| 273 | 274 | '@react-native-menu/menu': |
| 274 | 275 | 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) | |
| 276 | 277 | '@react-navigation/elements': |
| 277 | 278 | specifier: 2.9.26 |
| 278 | version: 2.9.26(c10301b6e0c42fc6434d2b643197a81e) | |
| 279 | version: 2.9.26(83de68753219ecf7f3321e065bd378be) | |
| 279 | 280 | '@react-navigation/native': |
| 280 | 281 | 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) | |
| 282 | 283 | '@react-navigation/native-stack': |
| 283 | 284 | specifier: 7.17.6 |
| 284 | version: 7.17.6(patch_hash=e667c3cef8c78bb9ff4882ee5bd23a432247b843060a9499eb5f07e9e2295552)(f640afa6cd4b9a1dc5422cbafdc82f53) | |
| 285 | version: 7.17.6(patch_hash=e667c3cef8c78bb9ff4882ee5bd23a432247b843060a9499eb5f07e9e2295552)(cdeee8948497d4b80ffe015e2a003650) | |
| 285 | 286 | '@shikijs/core': |
| 286 | 287 | specifier: 4.2.0 |
| 287 | 288 | version: 4.2.0 |
| ... | ... | @@ -302,7 +303,7 @@ importers: |
| 302 | 303 | version: link:../../packages/contracts |
| 303 | 304 | '@t3tools/mobile-markdown-text': |
| 304 | 305 | 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) | |
| 306 | 307 | '@t3tools/mobile-review-diff-native': |
| 307 | 308 | specifier: file:./modules/t3-review-diff |
| 308 | 309 | version: file:apps/mobile/modules/t3-review-diff |
| ... | ... | @@ -314,7 +315,7 @@ importers: |
| 314 | 315 | version: link:../../packages/shared |
| 315 | 316 | '@tabler/icons-react-native': |
| 316 | 317 | 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) | |
| 318 | 319 | clsx: |
| 319 | 320 | specifier: ^2.1.1 |
| 320 | 321 | version: 2.1.1 |
| ... | ... | @@ -325,155 +326,155 @@ importers: |
| 325 | 326 | specifier: 4.0.0-rc.115 |
| 326 | 327 | version: 4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5) |
| 327 | 328 | expo: |
| 328 | specifier: ~57.0.18 | |
| 329 | version: 57.0.18(41fd11498a34454c91128cdad32f22f8) | |
| 329 | specifier: 58.0.0 | |
| 330 | version: 58.0.0(3abfa3879936d948a635873738556226) | |
| 330 | 331 | 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) | |
| 333 | 334 | 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) | |
| 336 | 337 | 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) | |
| 339 | 340 | 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) | |
| 342 | 343 | 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) | |
| 345 | 346 | 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) | |
| 348 | 349 | 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) | |
| 351 | 352 | 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) | |
| 354 | 355 | 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) | |
| 357 | 358 | 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)) | |
| 360 | 361 | 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) | |
| 363 | 364 | 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) | |
| 366 | 367 | 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)) | |
| 369 | 370 | 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) | |
| 372 | 373 | 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) | |
| 375 | 376 | 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) | |
| 378 | 379 | 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) | |
| 381 | 382 | 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) | |
| 384 | 385 | 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) | |
| 387 | 388 | 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) | |
| 390 | 391 | 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) | |
| 393 | 394 | 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) | |
| 396 | 397 | 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) | |
| 399 | 400 | expo-paste-input: |
| 400 | 401 | 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) | |
| 402 | 403 | expo-quick-actions: |
| 403 | 404 | 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) | |
| 405 | 406 | 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) | |
| 408 | 409 | 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) | |
| 411 | 412 | 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) | |
| 414 | 415 | 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) | |
| 417 | 418 | 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) | |
| 420 | 421 | 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) | |
| 423 | 424 | 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) | |
| 426 | 427 | 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)) | |
| 429 | 430 | 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) | |
| 432 | 433 | react: |
| 433 | specifier: 19.2.3 | |
| 434 | version: 19.2.3 | |
| 434 | specifier: 19.3.0 | |
| 435 | version: 19.3.0 | |
| 435 | 436 | 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) | |
| 438 | 439 | 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) | |
| 441 | 442 | 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) | |
| 444 | 445 | react-native-image-viewing: |
| 445 | 446 | 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) | |
| 447 | 448 | 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) | |
| 450 | 451 | react-native-nitro-markdown: |
| 451 | 452 | 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) | |
| 453 | 454 | react-native-nitro-modules: |
| 454 | 455 | 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) | |
| 456 | 457 | 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) | |
| 459 | 460 | 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) | |
| 462 | 463 | 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) | |
| 465 | 466 | react-native-shiki-engine: |
| 466 | 467 | 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) | |
| 468 | 469 | 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) | |
| 471 | 472 | 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) | |
| 474 | 475 | 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) | |
| 477 | 478 | shiki: |
| 478 | 479 | specifier: 4.2.0 |
| 479 | 480 | version: 4.2.0 |
| ... | ... | @@ -482,23 +483,23 @@ importers: |
| 482 | 483 | version: 3.6.0 |
| 483 | 484 | uniwind: |
| 484 | 485 | 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) | |
| 486 | 487 | devDependencies: |
| 487 | 488 | '@effect/vitest': |
| 488 | 489 | specifier: 4.0.0-rc.115 |
| 489 | 490 | version: 4.0.0-rc.115(patch_hash=172bd95ef73a13d322888984415d5d18d9d2aa8e13fa529eac235efac837e902)(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)) |
| 490 | 491 | '@pierre/trees': |
| 491 | 492 | 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) | |
| 493 | 494 | '@types/react': |
| 494 | specifier: ~19.2.0 | |
| 495 | version: 19.2.16 | |
| 495 | specifier: ~19.3.0 | |
| 496 | version: 19.3.0 | |
| 496 | 497 | '@types/react-dom': |
| 497 | 498 | specifier: ~19.2.3 |
| 498 | version: 19.2.3(@types/react@19.2.16) | |
| 499 | version: 19.2.3(@types/react@19.3.0) | |
| 499 | 500 | 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) | |
| 502 | 503 | tailwindcss: |
| 503 | 504 | specifier: 4.3.3 |
| 504 | 505 | version: 4.3.3 |
| ... | ... | @@ -595,7 +596,7 @@ importers: |
| 595 | 596 | dependencies: |
| 596 | 597 | '@base-ui/react': |
| 597 | 598 | 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) | |
| 599 | 600 | '@clerk/electron': |
| 600 | 601 | specifier: 0.0.44 |
| 601 | 602 | 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: |
| 604 | 605 | version: 6.16.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) |
| 605 | 606 | '@daypicker/react': |
| 606 | 607 | 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) | |
| 608 | 609 | '@dnd-kit/core': |
| 609 | 610 | specifier: ^6.3.1 |
| 610 | 611 | version: 6.3.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) |
| ... | ... | @@ -667,7 +668,7 @@ importers: |
| 667 | 668 | version: 3.31.3 |
| 668 | 669 | '@tiptap/react': |
| 669 | 670 | 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) | |
| 671 | 672 | '@tiptap/starter-kit': |
| 672 | 673 | specifier: ^3.31.3 |
| 673 | 674 | version: 3.31.3 |
| ... | ... | @@ -709,7 +710,7 @@ importers: |
| 709 | 710 | version: 19.2.6(react@19.2.6) |
| 710 | 711 | react-markdown: |
| 711 | 712 | 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) | |
| 713 | 714 | rehype-raw: |
| 714 | 715 | specifier: ^7.0.0 |
| 715 | 716 | version: 7.0.0 |
| ... | ... | @@ -727,7 +728,7 @@ importers: |
| 727 | 728 | version: 3.6.0 |
| 728 | 729 | zustand: |
| 729 | 730 | 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)) | |
| 731 | 732 | devDependencies: |
| 732 | 733 | '@effect/platform-node': |
| 733 | 734 | specifier: 4.0.0-rc.115 |
| ... | ... | @@ -757,11 +758,11 @@ importers: |
| 757 | 758 | specifier: ^4.0.4 |
| 758 | 759 | version: 4.0.4 |
| 759 | 760 | '@types/react': |
| 760 | specifier: ~19.2.14 | |
| 761 | version: 19.2.16 | |
| 761 | specifier: ~19.3.0 | |
| 762 | version: 19.3.0 | |
| 762 | 763 | '@types/react-dom': |
| 763 | 764 | specifier: ~19.2.3 |
| 764 | version: 19.2.3(@types/react@19.2.16) | |
| 765 | version: 19.2.3(@types/react@19.3.0) | |
| 765 | 766 | '@types/react-test-renderer': |
| 766 | 767 | specifier: 19.1.0 |
| 767 | 768 | version: 19.1.0 |
| ... | ... | @@ -800,7 +801,7 @@ importers: |
| 800 | 801 | dependencies: |
| 801 | 802 | '@clerk/backend': |
| 802 | 803 | 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) | |
| 804 | 805 | '@effect/sql-pg': |
| 805 | 806 | specifier: 4.0.0-rc.115 |
| 806 | 807 | version: 4.0.0-rc.115(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)) |
| ... | ... | @@ -821,10 +822,10 @@ importers: |
| 821 | 822 | version: link:../../packages/shared |
| 822 | 823 | alchemy: |
| 823 | 824 | 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)) | |
| 825 | 826 | drizzle-orm: |
| 826 | 827 | 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) | |
| 828 | 829 | effect: |
| 829 | 830 | specifier: 4.0.0-rc.115 |
| 830 | 831 | version: 4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5) |
| ... | ... | @@ -1096,6 +1097,15 @@ importers: |
| 1096 | 1097 | |
| 1097 | 1098 | packages: |
| 1098 | 1099 | |
| 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 | ||
| 1099 | 1109 | '@ai-sdk/provider-utils@4.0.49': |
| 1100 | 1110 | resolution: {integrity: sha512-8e7pd+82bobqrFOaD5dG/PiEuvLYr5olaE3I56ch0jipR0H7sGD6ohwTUynv6k8O8QidWiyIbEsZCtr/2dyXIA==} |
| 1101 | 1111 | engines: {node: '>=18.17'} |
| ... | ... | @@ -1688,12 +1698,6 @@ packages: |
| 1688 | 1698 | peerDependencies: |
| 1689 | 1699 | '@babel/core': ^7.0.0-0 |
| 1690 | 1700 | |
| 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 | ||
| 1697 | 1701 | '@babel/plugin-transform-react-jsx@7.29.7': |
| 1698 | 1702 | resolution: {integrity: sha512-WsZulLVBUHXVj2cUcPVx6UE21TpalB6bHbSFErKT0Ib++ax24jjXe73FqlWvdylFOjiuPHYi6VCcgRad1ItN+A==} |
| 1699 | 1703 | engines: {node: '>=6.9.0'} |
| ... | ... | @@ -1921,7 +1925,7 @@ packages: |
| 1921 | 1925 | expo: '>=54 <58' |
| 1922 | 1926 | expo-apple-authentication: '>=7.0.0' |
| 1923 | 1927 | expo-auth-session: '>=5' |
| 1924 | expo-constants: 57.0.16 | |
| 1928 | expo-constants: 58.0.9 | |
| 1925 | 1929 | expo-crypto: '>=12' |
| 1926 | 1930 | expo-local-authentication: '>=13.5.0' |
| 1927 | 1931 | expo-secure-store: '>=12.4.0' |
| ... | ... | @@ -2286,10 +2290,6 @@ packages: |
| 2286 | 2290 | peerDependencies: |
| 2287 | 2291 | effect: 4.0.0-rc.115 |
| 2288 | 2292 | |
| 2289 | '@egjs/hammerjs@2.0.17': | |
| 2290 | resolution: {integrity: sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==} | |
| 2291 | engines: {node: '>=0.8.0'} | |
| 2292 | ||
| 2293 | 2293 | '@electric-sql/pglite@0.3.15': |
| 2294 | 2294 | resolution: {integrity: sha512-Cj++n1Mekf9ETfdc16TlDi+cDDQF0W7EcbyRHYOAeZdsAe8M/FJg18itDTSwyHfar2WIezawM9o0EKaRGVKygQ==} |
| 2295 | 2295 | |
| ... | ... | @@ -2732,12 +2732,12 @@ packages: |
| 2732 | 2732 | '@expo-google-fonts/material-symbols@0.4.38': |
| 2733 | 2733 | resolution: {integrity: sha512-IJkBtN1o8u9BW5fvSii1MyHPQ7Q0HxbWcVBvOrOzgMLpVtZw7R2w94wBTVR7kZwv3w1JNTESMmLA5Sqn1+Z36A==} |
| 2734 | 2734 | |
| 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==} | |
| 2737 | 2737 | hasBin: true |
| 2738 | 2738 | peerDependencies: |
| 2739 | 2739 | expo: '*' |
| 2740 | expo-router: 57.0.17 | |
| 2740 | expo-router: 58.0.10 | |
| 2741 | 2741 | react-native: '*' |
| 2742 | 2742 | peerDependenciesMeta: |
| 2743 | 2743 | expo-router: |
| ... | ... | @@ -2748,85 +2748,91 @@ packages: |
| 2748 | 2748 | '@expo/code-signing-certificates@0.0.6': |
| 2749 | 2749 | resolution: {integrity: sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==} |
| 2750 | 2750 | |
| 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==} | |
| 2753 | 2753 | |
| 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==} | |
| 2756 | 2756 | |
| 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==} | |
| 2759 | 2759 | |
| 2760 | 2760 | '@expo/devcert@1.2.1': |
| 2761 | 2761 | resolution: {integrity: sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==} |
| 2762 | 2762 | |
| 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==} | |
| 2765 | 2765 | peerDependencies: |
| 2766 | expo: '*' | |
| 2766 | 2767 | react: '*' |
| 2767 | 2768 | react-native: '*' |
| 2768 | 2769 | peerDependenciesMeta: |
| 2770 | expo: | |
| 2771 | optional: true | |
| 2769 | 2772 | react: |
| 2770 | 2773 | optional: true |
| 2771 | 2774 | react-native: |
| 2772 | 2775 | optional: true |
| 2773 | 2776 | |
| 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==} | |
| 2776 | 2779 | peerDependencies: |
| 2777 | 2780 | expo: '*' |
| 2778 | 2781 | react: '*' |
| 2779 | 2782 | react-native: '*' |
| 2780 | 2783 | |
| 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==} | |
| 2783 | 2786 | engines: {node: '>=20.12.0'} |
| 2784 | 2787 | |
| 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==} | |
| 2790 | 2790 | hasBin: true |
| 2791 | 2791 | |
| 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==} | |
| 2794 | 2794 | |
| 2795 | 2795 | '@expo/image-utils@0.8.14': |
| 2796 | 2796 | resolution: {integrity: sha512-5Sn+jG4Cw+shC2wDMXoqSAJnvERbiwzHn05FpWtD5IBflfTIs5gUmjzwiGVyjOdlMSQhgRrw/AymPbmO9h9mpQ==} |
| 2797 | 2797 | |
| 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==} | |
| 2800 | 2803 | |
| 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==} | |
| 2803 | 2806 | |
| 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==} | |
| 2806 | 2809 | |
| 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==} | |
| 2809 | 2812 | peerDependencies: |
| 2810 | '@expo/dom-webview': 57.0.1 | |
| 2813 | '@expo/dom-webview': 58.0.2 | |
| 2811 | 2814 | expo: '*' |
| 2812 | 2815 | react: '*' |
| 2813 | 2816 | react-native: '*' |
| 2817 | peerDependenciesMeta: | |
| 2818 | expo: | |
| 2819 | optional: true | |
| 2814 | 2820 | |
| 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==} | |
| 2817 | 2823 | peerDependencies: |
| 2818 | 2824 | expo: '*' |
| 2819 | 2825 | peerDependenciesMeta: |
| 2820 | 2826 | expo: |
| 2821 | 2827 | optional: true |
| 2822 | 2828 | |
| 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==} | |
| 2825 | 2831 | |
| 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==} | |
| 2828 | 2834 | peerDependencies: |
| 2829 | '@expo/log-box': ^57.0.4 | |
| 2835 | '@expo/log-box': ^58.0.7 | |
| 2830 | 2836 | expo: '*' |
| 2831 | 2837 | react: '*' |
| 2832 | 2838 | react-dom: '*' |
| ... | ... | @@ -2835,21 +2841,21 @@ packages: |
| 2835 | 2841 | react-dom: |
| 2836 | 2842 | optional: true |
| 2837 | 2843 | |
| 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==} | |
| 2840 | 2846 | |
| 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==} | |
| 2843 | 2849 | engines: {node: '>=12'} |
| 2844 | 2850 | |
| 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==} | |
| 2847 | 2853 | |
| 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==} | |
| 2850 | 2856 | |
| 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==} | |
| 2853 | 2859 | |
| 2854 | 2860 | '@expo/require-utils@55.0.5': |
| 2855 | 2861 | resolution: {integrity: sha512-U4K/CQ2VpXuwfNGsN+daKmYOt15hCP8v/pXaYH6eut7kdYZo6SfJ1yr67BIcJ+1Gzzs+QzTxswAZChKpXmceyw==} |
| ... | ... | @@ -2859,26 +2865,26 @@ packages: |
| 2859 | 2865 | typescript: |
| 2860 | 2866 | optional: true |
| 2861 | 2867 | |
| 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==} | |
| 2864 | 2870 | peerDependencies: |
| 2865 | 2871 | typescript: ^5.0.0 || ^5.0.0-0 || ^6.0.0 || ^7.0.0 |
| 2866 | 2872 | peerDependenciesMeta: |
| 2867 | 2873 | typescript: |
| 2868 | 2874 | optional: true |
| 2869 | 2875 | |
| 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==} | |
| 2872 | 2878 | peerDependencies: |
| 2873 | '@expo/metro-runtime': ^57.0.14 | |
| 2879 | '@expo/metro-runtime': ^58.0.9 | |
| 2874 | 2880 | 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 | |
| 2879 | 2885 | react: '*' |
| 2880 | 2886 | 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 | |
| 2882 | 2888 | peerDependenciesMeta: |
| 2883 | 2889 | '@expo/metro-runtime': |
| 2884 | 2890 | optional: true |
| ... | ... | @@ -2889,8 +2895,8 @@ packages: |
| 2889 | 2895 | react-server-dom-webpack: |
| 2890 | 2896 | optional: true |
| 2891 | 2897 | |
| 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==} | |
| 2894 | 2900 | |
| 2895 | 2901 | '@expo/sdk-runtime-versions@1.0.0': |
| 2896 | 2902 | resolution: {integrity: sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==} |
| ... | ... | @@ -2902,8 +2908,8 @@ packages: |
| 2902 | 2908 | '@expo/sudo-prompt@9.3.2': |
| 2903 | 2909 | resolution: {integrity: sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==} |
| 2904 | 2910 | |
| 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==} | |
| 2907 | 2913 | peerDependencies: |
| 2908 | 2914 | '@babel/core': '*' |
| 2909 | 2915 | expo: '*' |
| ... | ... | @@ -3464,6 +3470,58 @@ packages: |
| 3464 | 3470 | resolution: {integrity: sha512-ugvXJjwF5ldtUpa7D95kruNJ41yFQDEKyF5CW4TgKJnh+W/zmlBzXXeKTyqIgwMFrkePN2JqOBqcF0M0oOunow==} |
| 3465 | 3471 | engines: {node: '>=0.3.0'} |
| 3466 | 3472 | |
| 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 | ||
| 3467 | 3525 | '@octokit/auth-token@6.0.0': |
| 3468 | 3526 | resolution: {integrity: sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==} |
| 3469 | 3527 | engines: {node: '>= 20'} |
| ... | ... | @@ -3793,6 +3851,9 @@ packages: |
| 3793 | 3851 | '@oxc-project/types@0.127.0': |
| 3794 | 3852 | resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==} |
| 3795 | 3853 | |
| 3854 | '@oxc-project/types@0.141.0': | |
| 3855 | resolution: {integrity: sha512-S4as7z0j0xQkXcJlyY5ehntwK8/wRkQb9Cyqw+J/N2rkWGQGK0SxD6X6DhQTc7qsxVTBxXbxZtBJh3mr3PtIzQ==} | |
| 3856 | ||
| 3796 | 3857 | '@oxc-project/types@0.146.0': |
| 3797 | 3858 | resolution: {integrity: sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==} |
| 3798 | 3859 | |
| ... | ... | @@ -4256,177 +4317,6 @@ packages: |
| 4256 | 4317 | yauzl: |
| 4257 | 4318 | optional: true |
| 4258 | 4319 | |
| 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 | ||
| 4430 | 4320 | '@react-grab/cli@0.1.44': |
| 4431 | 4321 | resolution: {integrity: sha512-gMDYY2rw6OWajCcDlXSIgs2LC432YJXSb3Lm5yM187uhRgBYddoEVULi36h+IolX3r7jSb3ew7vn9FfI8NSo0A==} |
| 4432 | 4322 | hasBin: true |
| ... | ... | @@ -4448,78 +4338,78 @@ packages: |
| 4448 | 4338 | react: '*' |
| 4449 | 4339 | react-native: '*' |
| 4450 | 4340 | |
| 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} | |
| 4454 | 4344 | |
| 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} | |
| 4458 | 4348 | |
| 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} | |
| 4462 | 4352 | peerDependencies: |
| 4463 | 4353 | '@babel/core': '*' |
| 4464 | 4354 | |
| 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} | |
| 4468 | 4358 | peerDependencies: |
| 4469 | 4359 | '@babel/core': '*' |
| 4470 | 4360 | |
| 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} | |
| 4474 | 4364 | peerDependencies: |
| 4475 | 4365 | '@react-native-community/cli': '*' |
| 4476 | '@react-native/metro-config': 0.86.3 | |
| 4366 | '@react-native/metro-config': 0.88.0-rc.3 | |
| 4477 | 4367 | peerDependenciesMeta: |
| 4478 | 4368 | '@react-native-community/cli': |
| 4479 | 4369 | optional: true |
| 4480 | 4370 | '@react-native/metro-config': |
| 4481 | 4371 | optional: true |
| 4482 | 4372 | |
| 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} | |
| 4486 | 4376 | |
| 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} | |
| 4490 | 4380 | |
| 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} | |
| 4494 | 4384 | |
| 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} | |
| 4498 | 4388 | |
| 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} | |
| 4502 | 4392 | |
| 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} | |
| 4506 | 4396 | peerDependencies: |
| 4507 | 4397 | '@babel/core': '*' |
| 4508 | 4398 | |
| 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} | |
| 4512 | 4402 | |
| 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==} | |
| 4515 | 4405 | |
| 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} | |
| 4519 | 4409 | peerDependencies: |
| 4520 | 4410 | '@types/react': ^19.2.0 |
| 4521 | 4411 | react: '*' |
| 4522 | react-native: 0.86.3 | |
| 4412 | react-native: 0.88.0-rc.3 | |
| 4523 | 4413 | peerDependenciesMeta: |
| 4524 | 4414 | '@types/react': |
| 4525 | 4415 | optional: true |
| ... | ... | @@ -5379,9 +5269,6 @@ packages: |
| 5379 | 5269 | '@types/fs-extra@9.0.13': |
| 5380 | 5270 | resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} |
| 5381 | 5271 | |
| 5382 | '@types/hammerjs@2.0.46': | |
| 5383 | resolution: {integrity: sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==} | |
| 5384 | ||
| 5385 | 5272 | '@types/hast@3.0.4': |
| 5386 | 5273 | resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} |
| 5387 | 5274 | |
| ... | ... | @@ -5441,8 +5328,8 @@ packages: |
| 5441 | 5328 | '@types/react-test-renderer@19.1.0': |
| 5442 | 5329 | resolution: {integrity: sha512-XD0WZrHqjNrxA/MaR9O22w/RNidWR9YZmBdRGI7wcnWGrv/3dA8wKCJ8m63Sn+tLJhcjmuhOi629N66W6kgWzQ==} |
| 5443 | 5330 | |
| 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==} | |
| 5446 | 5333 | |
| 5447 | 5334 | '@types/responselike@1.0.3': |
| 5448 | 5335 | resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} |
| ... | ... | @@ -6058,8 +5945,8 @@ packages: |
| 6058 | 5945 | resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} |
| 6059 | 5946 | engines: {node: '>= 14'} |
| 6060 | 5947 | |
| 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==} | |
| 6063 | 5950 | engines: {node: '>=18.18'} |
| 6064 | 5951 | hasBin: true |
| 6065 | 5952 | |
| ... | ... | @@ -6220,10 +6107,6 @@ packages: |
| 6220 | 6107 | argparse@2.0.1: |
| 6221 | 6108 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} |
| 6222 | 6109 | |
| 6223 | aria-hidden@1.2.6: | |
| 6224 | resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} | |
| 6225 | engines: {node: '>=10'} | |
| 6226 | ||
| 6227 | 6110 | aria-query@5.3.0: |
| 6228 | 6111 | resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} |
| 6229 | 6112 | |
| ... | ... | @@ -6307,21 +6190,18 @@ packages: |
| 6307 | 6190 | babel-plugin-react-native-web@0.21.2: |
| 6308 | 6191 | resolution: {integrity: sha512-SPD0J6qjJn8231i0HZhlAGH6NORe+QvRSQM2mwQEzJ2Fb3E4ruWTiiicPlHjmeWShDXLcvoorOCXjeR7k/lyWA==} |
| 6309 | 6192 | |
| 6310 | babel-plugin-syntax-hermes-parser@0.36.0: | |
| 6311 | resolution: {integrity: sha512-LhD0xdoedDw7ansQgXbB2DADLZIK/LRXuWNBPuVzMc5S2WK5GyT89tCM+cQzxFGO0mGyLK6D5TrVOJJzAoDy8Q==} | |
| 6312 | ||
| 6313 | 6193 | babel-plugin-syntax-hermes-parser@0.36.1: |
| 6314 | 6194 | resolution: {integrity: sha512-ycduwJbvdvIMmVvlAZqGggS+pm5Eu4Bk9pcV9Sm2Z4PJNRVsKkv0g7vHj+LeuC1gHTeF67sJXFOq61IlqCa2hA==} |
| 6315 | 6195 | |
| 6316 | 6196 | babel-plugin-transform-flow-enums@0.0.2: |
| 6317 | 6197 | resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==} |
| 6318 | 6198 | |
| 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==} | |
| 6321 | 6201 | peerDependencies: |
| 6322 | 6202 | '@babel/runtime': ^7.20.0 |
| 6323 | 6203 | expo: '*' |
| 6324 | expo-widgets: ^57.0.13 | |
| 6204 | expo-widgets: ^58.0.9 | |
| 6325 | 6205 | react-refresh: '>=0.14.0 <1.0.0' |
| 6326 | 6206 | peerDependenciesMeta: |
| 6327 | 6207 | '@babel/runtime': |
| ... | ... | @@ -6537,20 +6417,9 @@ packages: |
| 6537 | 6417 | resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} |
| 6538 | 6418 | engines: {node: '>=18'} |
| 6539 | 6419 | |
| 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 | ||
| 6548 | 6420 | chromium-pickle-js@0.2.0: |
| 6549 | 6421 | resolution: {integrity: sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==} |
| 6550 | 6422 | |
| 6551 | ci-info@2.0.0: | |
| 6552 | resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} | |
| 6553 | ||
| 6554 | 6423 | ci-info@3.9.0: |
| 6555 | 6424 | resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} |
| 6556 | 6425 | engines: {node: '>=8'} |
| ... | ... | @@ -6873,6 +6742,10 @@ packages: |
| 6873 | 6742 | resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} |
| 6874 | 6743 | engines: {node: '>= 0.4'} |
| 6875 | 6744 | |
| 6745 | define-lazy-prop@2.0.0: | |
| 6746 | resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} | |
| 6747 | engines: {node: '>=8'} | |
| 6748 | ||
| 6876 | 6749 | define-properties@1.2.1: |
| 6877 | 6750 | resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} |
| 6878 | 6751 | engines: {node: '>= 0.4'} |
| ... | ... | @@ -6911,9 +6784,6 @@ packages: |
| 6911 | 6784 | resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} |
| 6912 | 6785 | engines: {node: '>=8'} |
| 6913 | 6786 | |
| 6914 | detect-node-es@1.1.0: | |
| 6915 | resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} | |
| 6916 | ||
| 6917 | 6787 | detect-node@2.1.0: |
| 6918 | 6788 | resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} |
| 6919 | 6789 | |
| ... | ... | @@ -6937,8 +6807,8 @@ packages: |
| 6937 | 6807 | dmg-builder@26.15.6: |
| 6938 | 6808 | resolution: {integrity: sha512-nr5vQxEhM0REomp1qiHbc6V99yrfBZy+wUU56VXADfSOlLj8PdLqsHiRe7b+FbqKesiyv4ax+k1GVwGonYKuCg==} |
| 6939 | 6809 | |
| 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==} | |
| 6942 | 6812 | |
| 6943 | 6813 | dom-accessibility-api@0.5.16: |
| 6944 | 6814 | resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} |
| ... | ... | @@ -7314,46 +7184,46 @@ packages: |
| 7314 | 7184 | resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} |
| 7315 | 7185 | engines: {node: '>=12.0.0'} |
| 7316 | 7186 | |
| 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==} | |
| 7319 | 7189 | peerDependencies: |
| 7320 | 7190 | expo: '*' |
| 7321 | 7191 | |
| 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==} | |
| 7324 | 7194 | peerDependencies: |
| 7325 | 7195 | expo: '*' |
| 7326 | 7196 | react: '*' |
| 7327 | 7197 | react-native: '*' |
| 7328 | 7198 | |
| 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==} | |
| 7331 | 7201 | peerDependencies: |
| 7332 | 7202 | expo: '*' |
| 7333 | 7203 | expo-asset: '*' |
| 7334 | 7204 | react: '*' |
| 7335 | 7205 | react-native: '*' |
| 7336 | 7206 | |
| 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==} | |
| 7339 | 7209 | peerDependencies: |
| 7340 | 7210 | react: '*' |
| 7341 | 7211 | react-native: '*' |
| 7342 | 7212 | |
| 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==} | |
| 7345 | 7215 | peerDependencies: |
| 7346 | 7216 | expo: '*' |
| 7347 | 7217 | react: '*' |
| 7348 | 7218 | react-native: '*' |
| 7349 | 7219 | |
| 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==} | |
| 7352 | 7222 | peerDependencies: |
| 7353 | 7223 | expo: '*' |
| 7354 | 7224 | |
| 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==} | |
| 7357 | 7227 | peerDependencies: |
| 7358 | 7228 | expo: '*' |
| 7359 | 7229 | react: '*' |
| ... | ... | @@ -7363,101 +7233,103 @@ packages: |
| 7363 | 7233 | react-native-web: |
| 7364 | 7234 | optional: true |
| 7365 | 7235 | |
| 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==} | |
| 7368 | 7238 | peerDependencies: |
| 7369 | 7239 | expo: '*' |
| 7370 | 7240 | react: '*' |
| 7371 | 7241 | react-native: '*' |
| 7372 | 7242 | |
| 7373 | expo-constants@57.0.16: | |
| 7374 | resolution: {integrity: sha512-HG3yJjGZo2BPTo2F1sBoxdJZRwX7d9C554EhKn8m12K62pxGolCsvPSoh/lQf95OEP9vO34wwXB2C3QFs0KG0g==} | |
| 7243 | expo-constants@58.0.9: | |
| 7244 | resolution: {integrity: sha512-+EaES5uHt3t3kY4VPsvM0uiOo0sjiMKuxGKqdfKaNbpCg3FI5D3qfQbgDHf5fbM09DIfXSbymKeiZx/JKQgzng==} | |
| 7375 | 7245 | peerDependencies: |
| 7376 | 7246 | expo: '*' |
| 7377 | 7247 | react-native: '*' |
| 7378 | 7248 | |
| 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==} | |
| 7381 | 7251 | peerDependencies: |
| 7382 | 7252 | expo: '*' |
| 7383 | 7253 | |
| 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==} | |
| 7386 | 7256 | peerDependencies: |
| 7387 | 7257 | expo: '*' |
| 7388 | 7258 | |
| 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==} | |
| 7391 | 7261 | peerDependencies: |
| 7392 | 7262 | expo: '*' |
| 7393 | 7263 | react-native: '*' |
| 7394 | 7264 | |
| 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==} | |
| 7397 | 7267 | peerDependencies: |
| 7398 | 7268 | expo: '*' |
| 7399 | 7269 | |
| 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==} | |
| 7402 | 7272 | peerDependencies: |
| 7403 | 7273 | expo: '*' |
| 7404 | 7274 | react-native: '*' |
| 7405 | 7275 | |
| 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==} | |
| 7408 | 7278 | peerDependencies: |
| 7409 | 7279 | expo: '*' |
| 7410 | 7280 | |
| 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==} | |
| 7413 | 7283 | peerDependencies: |
| 7414 | 7284 | expo: '*' |
| 7415 | 7285 | |
| 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==} | |
| 7418 | 7288 | |
| 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==} | |
| 7421 | 7291 | peerDependencies: |
| 7422 | 7292 | expo: '*' |
| 7423 | 7293 | react-native: '*' |
| 7424 | 7294 | |
| 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==} | |
| 7427 | 7297 | peerDependencies: |
| 7428 | 7298 | expo: '*' |
| 7429 | 7299 | react: '*' |
| 7430 | 7300 | react-native: '*' |
| 7431 | 7301 | |
| 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==} | |
| 7434 | 7304 | peerDependencies: |
| 7435 | 7305 | expo: '*' |
| 7436 | 7306 | react: '*' |
| 7437 | 7307 | react-native: '*' |
| 7438 | 7308 | |
| 7439 | expo-haptics@57.0.2: | |
| 7440 | resolution: {integrity: sha512-vPths6zTxxaGaemC7D1GKbw1iOnOAAL5oAcCFVSgVNWnuLCBefL1LkhRBaJsepiMXRh2y3vwPiXkPaf6d16blA==} | |
| 7309 | expo-haptics@58.0.3: | |
| 7310 | resolution: {integrity: sha512-5chRroIhYhB2CG6Ce7sE82q4EATF9O4G7oyeUlDumcVAZzpNWWJkCZ7ucajyHOj2Wc/rArg2h7jYmwI3sgxnNA==} | |
| 7441 | 7311 | peerDependencies: |
| 7442 | 7312 | expo: '*' |
| 7443 | 7313 | |
| 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==} | |
| 7446 | 7316 | peerDependencies: |
| 7447 | 7317 | expo: '*' |
| 7448 | 7318 | |
| 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==} | |
| 7451 | 7321 | peerDependencies: |
| 7452 | 7322 | expo: '*' |
| 7323 | react: '*' | |
| 7324 | react-native: '*' | |
| 7453 | 7325 | |
| 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==} | |
| 7456 | 7328 | peerDependencies: |
| 7457 | 7329 | expo: '*' |
| 7458 | 7330 | |
| 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==} | |
| 7461 | 7333 | peerDependencies: |
| 7462 | 7334 | expo: '*' |
| 7463 | 7335 | react: '*' |
| ... | ... | @@ -7467,32 +7339,33 @@ packages: |
| 7467 | 7339 | react-native-web: |
| 7468 | 7340 | optional: true |
| 7469 | 7341 | |
| 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==} | |
| 7472 | 7344 | |
| 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==} | |
| 7475 | 7347 | peerDependencies: |
| 7476 | 7348 | expo: '*' |
| 7477 | 7349 | react: '*' |
| 7478 | 7350 | |
| 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==} | |
| 7481 | 7353 | peerDependencies: |
| 7354 | expo: '*' | |
| 7482 | 7355 | react: '*' |
| 7483 | 7356 | react-native: '*' |
| 7484 | 7357 | |
| 7485 | expo-manifests@57.0.1: | |
| 7486 | resolution: {integrity: sha512-qB/mDG2dYdl+EvUeQuqP8KFYCFgFCQjJYdWIHo8SFBgDzMYmdF286DFY2M1M9Okr99wkb5M4tgA3aCcwv3aEQA==} | |
| 7358 | expo-manifests@58.0.1: | |
| 7359 | resolution: {integrity: sha512-fVeJJ71Fj8FJgcAUggn6QIsm7CTxsXFgekLl4pEPHgON6fmcxog63FGO0sisQ3F6yUWFR4nn8iJmgBp1Exs7ew==} | |
| 7487 | 7360 | peerDependencies: |
| 7488 | 7361 | expo: '*' |
| 7489 | 7362 | |
| 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==} | |
| 7492 | 7365 | hasBin: true |
| 7493 | 7366 | |
| 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==} | |
| 7496 | 7369 | peerDependencies: |
| 7497 | 7370 | react: '*' |
| 7498 | 7371 | react-native: '*' |
| ... | ... | @@ -7501,19 +7374,22 @@ packages: |
| 7501 | 7374 | react-native-worklets: |
| 7502 | 7375 | optional: true |
| 7503 | 7376 | |
| 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==} | |
| 7506 | 7379 | peerDependencies: |
| 7507 | 7380 | react-native: '*' |
| 7508 | 7381 | |
| 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==} | |
| 7511 | 7387 | peerDependencies: |
| 7512 | 7388 | expo: '*' |
| 7513 | 7389 | react: '*' |
| 7514 | 7390 | |
| 7515 | expo-notifications@57.0.15: | |
| 7516 | resolution: {integrity: sha512-H91z4WSFukSQP3dThgh6PCPFrT6VHeR+J2f7CuCOE72JV7YEGcBCir103QY58ocKsdgkodQpnkTU2m8LTHkWLg==} | |
| 7391 | expo-notifications@58.0.9: | |
| 7392 | resolution: {integrity: sha512-Ygi1bvJKMiv6wP0r9b3WzDkZy28EbIeagNvxyQqcy6FoyuUpAIXbH0IgnaAjK3czPWin78jC3GsDJYeZbHFPDg==} | |
| 7517 | 7393 | peerDependencies: |
| 7518 | 7394 | expo: '*' |
| 7519 | 7395 | react: '*' |
| ... | ... | @@ -7531,52 +7407,52 @@ packages: |
| 7531 | 7407 | peerDependencies: |
| 7532 | 7408 | expo: '*' |
| 7533 | 7409 | |
| 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==} | |
| 7536 | 7412 | peerDependencies: |
| 7537 | 7413 | expo: '*' |
| 7538 | 7414 | |
| 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} | |
| 7542 | 7418 | |
| 7543 | expo-sharing@57.0.17: | |
| 7544 | resolution: {integrity: sha512-p2B4SMeNsOv6hm1NkrxRlncjwu9mmLfi0drLaEyX13Rxn4DdDFPhuaezpOK7XLogTsmWGpfR46uq6oHMvSxbfA==} | |
| 7419 | expo-sharing@58.0.12: | |
| 7420 | resolution: {integrity: sha512-2uwxo2+9W6WzA87FnBiwCAWkrBAoNUrNY7mJHA5k3Q5i/je6tH2N65kl5pACpYEIOOShQkOAd4zz7DVc23JydA==} | |
| 7545 | 7421 | peerDependencies: |
| 7546 | 7422 | expo: '*' |
| 7547 | 7423 | react: '*' |
| 7548 | 7424 | react-native: '*' |
| 7549 | 7425 | |
| 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==} | |
| 7552 | 7428 | peerDependencies: |
| 7553 | 7429 | expo: '*' |
| 7554 | 7430 | |
| 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==} | |
| 7557 | 7433 | peerDependencies: |
| 7558 | 7434 | expo: '*' |
| 7559 | 7435 | react: '*' |
| 7560 | 7436 | react-native: '*' |
| 7561 | 7437 | |
| 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==} | |
| 7564 | 7440 | |
| 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==} | |
| 7567 | 7443 | peerDependencies: |
| 7568 | 7444 | expo: '*' |
| 7569 | 7445 | expo-font: '*' |
| 7570 | 7446 | react: '*' |
| 7571 | 7447 | react-native: '*' |
| 7572 | 7448 | |
| 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==} | |
| 7575 | 7451 | peerDependencies: |
| 7576 | 7452 | expo: '*' |
| 7577 | 7453 | |
| 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==} | |
| 7580 | 7456 | hasBin: true |
| 7581 | 7457 | peerDependencies: |
| 7582 | 7458 | expo: '*' |
| ... | ... | @@ -7587,31 +7463,32 @@ packages: |
| 7587 | 7463 | expo-dev-client: |
| 7588 | 7464 | optional: true |
| 7589 | 7465 | |
| 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==} | |
| 7592 | 7468 | peerDependencies: |
| 7593 | 7469 | expo: '*' |
| 7594 | 7470 | react: '*' |
| 7595 | 7471 | react-native: '*' |
| 7596 | 7472 | |
| 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==} | |
| 7599 | 7475 | peerDependencies: |
| 7600 | 7476 | expo: '*' |
| 7601 | 7477 | react-native: '*' |
| 7602 | 7478 | |
| 7603 | expo-widgets@57.0.15: | |
| 7604 | resolution: {integrity: sha512-dlwbUCLaxOZFcIejxtOo95NyqJMa4Sop4NPzJEvvD2MwXERBqxkp8RExxVDAEiBRIdAYqC1u02SnIJWT/27f7g==} | |
| 7479 | expo-widgets@58.0.9: | |
| 7480 | resolution: {integrity: sha512-wGmI39qtJ6965rJA1bgAuKA2rEHfecoL939wxnBsSz3mvAAnSsjUNytP1rsVc0cBooPCssxqJST9EXGzee5Hfg==} | |
| 7605 | 7481 | peerDependencies: |
| 7606 | 7482 | expo: '*' |
| 7607 | 7483 | react: '*' |
| 7608 | 7484 | react-native: '*' |
| 7609 | 7485 | |
| 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} | |
| 7612 | 7489 | hasBin: true |
| 7613 | 7490 | peerDependencies: |
| 7614 | '@expo/dom-webview': 57.0.1 | |
| 7491 | '@expo/dom-webview': 58.0.2 | |
| 7615 | 7492 | '@expo/metro-runtime': '*' |
| 7616 | 7493 | react: '*' |
| 7617 | 7494 | react-dom: '*' |
| ... | ... | @@ -7755,12 +7632,25 @@ packages: |
| 7755 | 7632 | flow-enums-runtime@0.0.6: |
| 7756 | 7633 | resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==} |
| 7757 | 7634 | |
| 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 | ||
| 7758 | 7651 | fontace@0.4.1: |
| 7759 | 7652 | resolution: {integrity: sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==} |
| 7760 | 7653 | |
| 7761 | fontfaceobserver@2.3.0: | |
| 7762 | resolution: {integrity: sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==} | |
| 7763 | ||
| 7764 | 7654 | fontkitten@1.0.3: |
| 7765 | 7655 | resolution: {integrity: sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==} |
| 7766 | 7656 | engines: {node: '>=20'} |
| ... | ... | @@ -7840,10 +7730,6 @@ packages: |
| 7840 | 7730 | resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} |
| 7841 | 7731 | engines: {node: '>= 0.4'} |
| 7842 | 7732 | |
| 7843 | get-nonce@1.0.1: | |
| 7844 | resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} | |
| 7845 | engines: {node: '>=6'} | |
| 7846 | ||
| 7847 | 7733 | get-proto@1.0.1: |
| 7848 | 7734 | resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} |
| 7849 | 7735 | engines: {node: '>= 0.4'} |
| ... | ... | @@ -7963,24 +7849,12 @@ packages: |
| 7963 | 7849 | heic-to@1.5.2: |
| 7964 | 7850 | resolution: {integrity: sha512-8Fns+lZHAWmz5U5IUxDeXKwIf3foBoKNPLxxFY4B0MkLjNuomEIHCoDbDE+x/llFK3NCEO1cu4+n3iUKY+Svmw==} |
| 7965 | 7851 | |
| 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==} | |
| 7974 | 7854 | |
| 7975 | 7855 | hermes-estree@0.36.1: |
| 7976 | 7856 | resolution: {integrity: sha512-guv1nQ6IJ7S83NRFPWc3SA7IBZrdNC9kapwOq6uXvF4wP+sDCgjzQbKPCoyYmoyZRzztF/n/c36l/rccCZSiCw==} |
| 7977 | 7857 | |
| 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 | ||
| 7984 | 7858 | hermes-parser@0.36.1: |
| 7985 | 7859 | resolution: {integrity: sha512-GApNk4zLHi2UWoWZZkx7LNCOSzLSc5lB55pZ/PhK7ycFeg7u5LcF88p/WbpIi1XUDtE0MpHE3uRR3u3KB7TjSQ==} |
| 7986 | 7860 | |
| ... | ... | @@ -7988,9 +7862,6 @@ packages: |
| 7988 | 7862 | resolution: {integrity: sha512-ciq6hFsSG/Bpt2DmrZJtv+56zpPdnq+NQ4ijEFrveKN0ZG1mhl/LdT1NQZ9se6ty1fACcI4d4vYqC9v8EYpH2A==} |
| 7989 | 7863 | hasBin: true |
| 7990 | 7864 | |
| 7991 | hoist-non-react-statics@3.3.2: | |
| 7992 | resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} | |
| 7993 | ||
| 7994 | 7865 | hono@4.13.7: |
| 7995 | 7866 | resolution: {integrity: sha512-c8/gF9ac8Y78/agExVocyLevgR+JlpNB444Py0FSX8pJoPdYUfUzRcXtYEYGwt6l19qIlVZPN5Mfsw9jFShmQQ==} |
| 7996 | 7867 | engines: {node: '>=16.9.0'} |
| ... | ... | @@ -8057,11 +7928,6 @@ packages: |
| 8057 | 7928 | resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} |
| 8058 | 7929 | engines: {node: '>= 4'} |
| 8059 | 7930 | |
| 8060 | image-size@1.2.1: | |
| 8061 | resolution: {integrity: sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==} | |
| 8062 | engines: {node: '>=16.x'} | |
| 8063 | hasBin: true | |
| 8064 | ||
| 8065 | 7931 | immediate@3.0.6: |
| 8066 | 7932 | resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} |
| 8067 | 7933 | |
| ... | ... | @@ -8347,9 +8213,6 @@ packages: |
| 8347 | 8213 | lie@3.3.0: |
| 8348 | 8214 | resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} |
| 8349 | 8215 | |
| 8350 | lighthouse-logger@1.4.2: | |
| 8351 | resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} | |
| 8352 | ||
| 8353 | 8216 | lightningcss-android-arm64@1.33.0: |
| 8354 | 8217 | resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} |
| 8355 | 8218 | engines: {node: '>= 12.0.0'} |
| ... | ... | @@ -8517,9 +8380,6 @@ packages: |
| 8517 | 8380 | markdown-table@3.0.4: |
| 8518 | 8381 | resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} |
| 8519 | 8382 | |
| 8520 | marky@1.3.0: | |
| 8521 | resolution: {integrity: sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==} | |
| 8522 | ||
| 8523 | 8383 | matcher@3.0.0: |
| 8524 | 8384 | resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} |
| 8525 | 8385 | engines: {node: '>=10'} |
| ... | ... | @@ -8608,120 +8468,62 @@ packages: |
| 8608 | 8468 | meshoptimizer@0.22.0: |
| 8609 | 8469 | resolution: {integrity: sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==} |
| 8610 | 8470 | |
| 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} | |
| 8630 | 8474 | |
| 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} | |
| 8634 | 8478 | |
| 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} | |
| 8638 | 8482 | |
| 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} | |
| 8642 | 8486 | |
| 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} | |
| 8646 | 8490 | |
| 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} | |
| 8650 | 8494 | |
| 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} | |
| 8654 | 8498 | |
| 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} | |
| 8658 | 8502 | |
| 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} | |
| 8662 | 8506 | |
| 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} | |
| 8666 | 8510 | |
| 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} | |
| 8699 | 8514 | hasBin: true |
| 8700 | 8515 | |
| 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} | |
| 8704 | 8519 | |
| 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} | |
| 8708 | 8523 | |
| 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} | |
| 8725 | 8527 | hasBin: true |
| 8726 | 8528 | |
| 8727 | 8529 | micromark-core-commonmark@2.0.3: |
| ... | ... | @@ -8900,11 +8702,6 @@ packages: |
| 8900 | 8702 | resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} |
| 8901 | 8703 | hasBin: true |
| 8902 | 8704 | |
| 8903 | mkdirp@1.0.4: | |
| 8904 | resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} | |
| 8905 | engines: {node: '>=10'} | |
| 8906 | hasBin: true | |
| 8907 | ||
| 8908 | 8705 | modern-tar@0.8.5: |
| 8909 | 8706 | resolution: {integrity: sha512-snEhs+6G5Tjd4I7tLCDOaoln2RgE0bD19RzEKgvgK2hZ5VKy3MpLhLTZ2fWpXSTg4K2cyPwp+VHATFJhxfnOeA==} |
| 8910 | 8707 | engines: {node: '>=18.0.0'} |
| ... | ... | @@ -9061,6 +8858,10 @@ packages: |
| 9061 | 8858 | resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} |
| 9062 | 8859 | engines: {node: '>=10'} |
| 9063 | 8860 | |
| 8861 | noxcturnal@0.1.1: | |
| 8862 | resolution: {integrity: sha512-Fa9SvpVNi+2AVr9CI6mkxqIIeGQNlVRLZsXdinOx1xrvV5ZvCsyBff9QRJdwnzlVnn1AIpksFe9SW9sDfzYKLw==} | |
| 8863 | engines: {node: '>=18'} | |
| 8864 | ||
| 9064 | 8865 | npm-package-arg@11.0.3: |
| 9065 | 8866 | resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==} |
| 9066 | 8867 | engines: {node: ^16.14.0 || >=18.0.0} |
| ... | ... | @@ -9087,13 +8888,9 @@ packages: |
| 9087 | 8888 | oas-validator@5.0.8: |
| 9088 | 8889 | resolution: {integrity: sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==} |
| 9089 | 8890 | |
| 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} | |
| 9097 | 8894 | |
| 9098 | 8895 | object-assign@4.1.1: |
| 9099 | 8896 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} |
| ... | ... | @@ -9150,9 +8947,9 @@ packages: |
| 9150 | 8947 | oniguruma-to-es@4.3.6: |
| 9151 | 8948 | resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} |
| 9152 | 8949 | |
| 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'} | |
| 9156 | 8953 | |
| 9157 | 8954 | ora@3.4.0: |
| 9158 | 8955 | resolution: {integrity: sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==} |
| ... | ... | @@ -9558,9 +9355,6 @@ packages: |
| 9558 | 9355 | resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} |
| 9559 | 9356 | engines: {node: '>=6'} |
| 9560 | 9357 | |
| 9561 | queue@6.0.2: | |
| 9562 | resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} | |
| 9563 | ||
| 9564 | 9358 | quick-lru@5.1.1: |
| 9565 | 9359 | resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} |
| 9566 | 9360 | engines: {node: '>=10'} |
| ... | ... | @@ -9589,16 +9383,16 @@ packages: |
| 9589 | 9383 | react-devtools-core@6.1.5: |
| 9590 | 9384 | resolution: {integrity: sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==} |
| 9591 | 9385 | |
| 9592 | react-dom@19.2.3: | |
| 9593 | resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==} | |
| 9594 | peerDependencies: | |
| 9595 | react: ^19.2.3 | |
| 9596 | ||
| 9597 | 9386 | react-dom@19.2.6: |
| 9598 | 9387 | resolution: {integrity: sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==} |
| 9599 | 9388 | peerDependencies: |
| 9600 | 9389 | react: ^19.2.6 |
| 9601 | 9390 | |
| 9391 | react-dom@19.3.0: | |
| 9392 | resolution: {integrity: sha512-JDk8dgif51OjFoDE70+OT9ICyYr+69HlmihNwp1+Nsfbna3t5sIiCa9ZJktDmQ4/1b/rn26hIAR2uYXDMr5r0Q==} | |
| 9393 | peerDependencies: | |
| 9394 | react: ^19.3.0 | |
| 9395 | ||
| 9602 | 9396 | react-freeze@1.0.4: |
| 9603 | 9397 | resolution: {integrity: sha512-r4F0Sec0BLxWicc7HEyo2x3/2icUTrRmDjaaRyzzn+7aDyFZliszMDOgLVwSnQnYENOlL1o569Ze2HZefk8clA==} |
| 9604 | 9398 | engines: {node: '>=10'} |
| ... | ... | @@ -9614,9 +9408,6 @@ packages: |
| 9614 | 9408 | react: |
| 9615 | 9409 | optional: true |
| 9616 | 9410 | |
| 9617 | react-is@16.13.1: | |
| 9618 | resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} | |
| 9619 | ||
| 9620 | 9411 | react-is@17.0.2: |
| 9621 | 9412 | resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} |
| 9622 | 9413 | |
| ... | ... | @@ -9632,8 +9423,8 @@ packages: |
| 9632 | 9423 | '@types/react': '>=18' |
| 9633 | 9424 | react: '>=18' |
| 9634 | 9425 | |
| 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==} | |
| 9637 | 9428 | peerDependencies: |
| 9638 | 9429 | react: '*' |
| 9639 | 9430 | react-native: '*' |
| ... | ... | @@ -9650,8 +9441,8 @@ packages: |
| 9650 | 9441 | react: '*' |
| 9651 | 9442 | react-native: '*' |
| 9652 | 9443 | |
| 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==} | |
| 9655 | 9446 | peerDependencies: |
| 9656 | 9447 | react: '*' |
| 9657 | 9448 | react-native: '*' |
| ... | ... | @@ -9677,21 +9468,21 @@ packages: |
| 9677 | 9468 | react: '*' |
| 9678 | 9469 | react-native: '*' |
| 9679 | 9470 | |
| 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==} | |
| 9682 | 9473 | peerDependencies: |
| 9683 | 9474 | 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 | |
| 9686 | 9477 | |
| 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==} | |
| 9689 | 9480 | peerDependencies: |
| 9690 | 9481 | react: '*' |
| 9691 | 9482 | react-native: '*' |
| 9692 | 9483 | |
| 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==} | |
| 9695 | 9486 | peerDependencies: |
| 9696 | 9487 | react: '*' |
| 9697 | 9488 | react-native: '*' |
| ... | ... | @@ -9702,8 +9493,8 @@ packages: |
| 9702 | 9493 | react: '*' |
| 9703 | 9494 | react-native: '*' |
| 9704 | 9495 | |
| 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==} | |
| 9707 | 9498 | peerDependencies: |
| 9708 | 9499 | react: '*' |
| 9709 | 9500 | react-native: '*' |
| ... | ... | @@ -9713,39 +9504,28 @@ packages: |
| 9713 | 9504 | peerDependencies: |
| 9714 | 9505 | react-native: '*' |
| 9715 | 9506 | |
| 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==} | |
| 9718 | 9509 | peerDependencies: |
| 9719 | 9510 | react: '*' |
| 9720 | 9511 | react-native: '*' |
| 9721 | 9512 | |
| 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==} | |
| 9732 | 9515 | peerDependencies: |
| 9733 | 9516 | '@babel/core': '*' |
| 9734 | 9517 | '@react-native/metro-config': '*' |
| 9735 | 9518 | react: '*' |
| 9736 | react-native: 0.83 - 0.86 | |
| 9519 | react-native: 0.86 - 0.88 | |
| 9737 | 9520 | |
| 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} | |
| 9741 | 9524 | hasBin: true |
| 9742 | 9525 | peerDependencies: |
| 9743 | '@react-native/jest-preset': 0.86.3 | |
| 9744 | 9526 | '@types/react': ^19.1.1 |
| 9745 | react: ^19.2.3 | |
| 9527 | react: ^19.3.0 | |
| 9746 | 9528 | peerDependenciesMeta: |
| 9747 | '@react-native/jest-preset': | |
| 9748 | optional: true | |
| 9749 | 9529 | '@types/react': |
| 9750 | 9530 | optional: true |
| 9751 | 9531 | |
| ... | ... | @@ -9753,49 +9533,19 @@ packages: |
| 9753 | 9533 | resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} |
| 9754 | 9534 | engines: {node: '>=0.10.0'} |
| 9755 | 9535 | |
| 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 | ||
| 9786 | 9536 | react-test-renderer@19.2.6: |
| 9787 | 9537 | resolution: {integrity: sha512-GbS6V23YduFTPiWJ5xICbKEjRcqx1Z90js/V5miqhz7qp/d6xSe9Dd6NjSQODFRdzdsqRMPW82E/sFpPRbY5Mw==} |
| 9788 | 9538 | peerDependencies: |
| 9789 | 9539 | react: ^19.2.6 |
| 9790 | 9540 | |
| 9791 | react@19.2.3: | |
| 9792 | resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==} | |
| 9793 | engines: {node: '>=0.10.0'} | |
| 9794 | ||
| 9795 | 9541 | react@19.2.6: |
| 9796 | 9542 | resolution: {integrity: sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==} |
| 9797 | 9543 | engines: {node: '>=0.10.0'} |
| 9798 | 9544 | |
| 9545 | react@19.3.0: | |
| 9546 | resolution: {integrity: sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==} | |
| 9547 | engines: {node: '>=0.10.0'} | |
| 9548 | ||
| 9799 | 9549 | read-binary-file-arch@1.0.6: |
| 9800 | 9550 | resolution: {integrity: sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==} |
| 9801 | 9551 | hasBin: true |
| ... | ... | @@ -9994,6 +9744,9 @@ packages: |
| 9994 | 9744 | scheduler@0.27.0: |
| 9995 | 9745 | resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} |
| 9996 | 9746 | |
| 9747 | scheduler@0.28.0: | |
| 9748 | resolution: {integrity: sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==} | |
| 9749 | ||
| 9997 | 9750 | schema-utils@4.3.3: |
| 9998 | 9751 | resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} |
| 9999 | 9752 | engines: {node: '>= 10.13.0'} |
| ... | ... | @@ -10615,7 +10368,7 @@ packages: |
| 10615 | 10368 | resolution: {integrity: sha512-e2mYlHrZzAQtZUf3STrfVDTetspv7p5vm/cu6p8kjLRQaL9r6QFG+MlwZ3hrI2LHnzgzjbSo+MwvoE380zz2JQ==} |
| 10616 | 10369 | hasBin: true |
| 10617 | 10370 | peerDependencies: |
| 10618 | '@expo/metro-config': 57.0.12 | |
| 10371 | '@expo/metro-config': 58.0.6 | |
| 10619 | 10372 | metro: '*' |
| 10620 | 10373 | metro-cache: '*' |
| 10621 | 10374 | metro-transform-worker: '*' |
| ... | ... | @@ -10723,31 +10476,11 @@ packages: |
| 10723 | 10476 | uri-js@4.4.1: |
| 10724 | 10477 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} |
| 10725 | 10478 | |
| 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 | ||
| 10736 | 10479 | use-latest-callback@0.2.6: |
| 10737 | 10480 | resolution: {integrity: sha512-FvRG9i1HSo0wagmX63Vrm8SnlUU3LMM3WyZkQ76RnslpBrX694AdG4A0zQBx2B3ZifFA0yv/BaEHGBnEax5rZg==} |
| 10738 | 10481 | peerDependencies: |
| 10739 | 10482 | react: '>=16.8' |
| 10740 | 10483 | |
| 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 | ||
| 10751 | 10484 | use-sync-external-store@1.6.0: |
| 10752 | 10485 | resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} |
| 10753 | 10486 | peerDependencies: |
| ... | ... | @@ -10788,12 +10521,6 @@ packages: |
| 10788 | 10521 | resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} |
| 10789 | 10522 | engines: {node: '>= 0.8'} |
| 10790 | 10523 | |
| 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 | ||
| 10797 | 10524 | vfile-location@5.0.3: |
| 10798 | 10525 | resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} |
| 10799 | 10526 | |
| ... | ... | @@ -11007,8 +10734,8 @@ packages: |
| 11007 | 10734 | resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} |
| 11008 | 10735 | engines: {node: '>=20'} |
| 11009 | 10736 | |
| 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==} | |
| 11012 | 10739 | |
| 11013 | 10740 | whatwg-url@14.2.0: |
| 11014 | 10741 | resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} |
| ... | ... | @@ -11241,6 +10968,10 @@ packages: |
| 11241 | 10968 | |
| 11242 | 10969 | snapshots: |
| 11243 | 10970 | |
| 10971 | 2g@0.4.4(typescript@7.0.2): | |
| 10972 | optionalDependencies: | |
| 10973 | typescript: 7.0.2 | |
| 10974 | ||
| 11244 | 10975 | '@ai-sdk/provider-utils@4.0.49(zod@4.4.3)': |
| 11245 | 10976 | dependencies: |
| 11246 | 10977 | '@ai-sdk/provider': 3.0.15 |
| ... | ... | @@ -11285,9 +11016,9 @@ snapshots: |
| 11285 | 11016 | chokidar: 5.0.0 |
| 11286 | 11017 | rolldown: 1.2.5 |
| 11287 | 11018 | |
| 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))': | |
| 11289 | 11020 | optionalDependencies: |
| 11290 | '@types/react': 19.2.16 | |
| 11021 | '@types/react': 19.3.0 | |
| 11291 | 11022 | react-devtools-core: 6.1.5(bufferutil@4.1.0)(utf-8-validate@6.0.6) |
| 11292 | 11023 | |
| 11293 | 11024 | '@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: |
| 11745 | 11476 | '@babel/helper-module-imports@7.29.7': |
| 11746 | 11477 | dependencies: |
| 11747 | 11478 | '@babel/traverse': 7.29.7 |
| 11748 | '@babel/types': 7.29.7 | |
| 11479 | '@babel/types': 7.29.8 | |
| 11749 | 11480 | transitivePeerDependencies: |
| 11750 | 11481 | - supports-color |
| 11751 | 11482 | |
| ... | ... | @@ -11810,7 +11541,7 @@ snapshots: |
| 11810 | 11541 | |
| 11811 | 11542 | '@babel/parser@7.29.7': |
| 11812 | 11543 | dependencies: |
| 11813 | '@babel/types': 7.29.7 | |
| 11544 | '@babel/types': 7.29.8 | |
| 11814 | 11545 | |
| 11815 | 11546 | '@babel/parser@7.29.8': |
| 11816 | 11547 | dependencies: |
| ... | ... | @@ -12045,17 +11776,6 @@ snapshots: |
| 12045 | 11776 | '@babel/core': 7.29.7 |
| 12046 | 11777 | '@babel/helper-plugin-utils': 7.29.7 |
| 12047 | 11778 | |
| 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 | ||
| 12059 | 11779 | '@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7)': |
| 12060 | 11780 | dependencies: |
| 12061 | 11781 | '@babel/core': 7.29.7 |
| ... | ... | @@ -12063,7 +11783,7 @@ snapshots: |
| 12063 | 11783 | '@babel/helper-module-imports': 7.29.7 |
| 12064 | 11784 | '@babel/helper-plugin-utils': 7.29.7 |
| 12065 | 11785 | '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) |
| 12066 | '@babel/types': 7.29.7 | |
| 11786 | '@babel/types': 7.29.8 | |
| 12067 | 11787 | transitivePeerDependencies: |
| 12068 | 11788 | - supports-color |
| 12069 | 11789 | |
| ... | ... | @@ -12158,10 +11878,10 @@ snapshots: |
| 12158 | 11878 | '@babel/helper-string-parser': 7.29.7 |
| 12159 | 11879 | '@babel/helper-validator-identifier': 7.29.7 |
| 12160 | 11880 | |
| 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)': | |
| 12162 | 11882 | dependencies: |
| 12163 | 11883 | '@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) | |
| 12165 | 11885 | '@floating-ui/react-dom': 2.1.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6) |
| 12166 | 11886 | '@floating-ui/utils': 0.2.11 |
| 12167 | 11887 | react: 19.2.6 |
| ... | ... | @@ -12169,10 +11889,10 @@ snapshots: |
| 12169 | 11889 | use-sync-external-store: 1.6.0(react@19.2.6) |
| 12170 | 11890 | optionalDependencies: |
| 12171 | 11891 | '@date-fns/tz': 1.5.0 |
| 12172 | '@types/react': 19.2.16 | |
| 11892 | '@types/react': 19.3.0 | |
| 12173 | 11893 | date-fns: 4.4.0 |
| 12174 | 11894 | |
| 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)': | |
| 12176 | 11896 | dependencies: |
| 12177 | 11897 | '@babel/runtime': 7.29.7 |
| 12178 | 11898 | '@floating-ui/utils': 0.2.11 |
| ... | ... | @@ -12181,7 +11901,7 @@ snapshots: |
| 12181 | 11901 | reselect: 5.2.0 |
| 12182 | 11902 | use-sync-external-store: 1.6.0(react@19.2.6) |
| 12183 | 11903 | optionalDependencies: |
| 12184 | '@types/react': 19.2.16 | |
| 11904 | '@types/react': 19.3.0 | |
| 12185 | 11905 | |
| 12186 | 11906 | '@blazediff/core@1.10.0': {} |
| 12187 | 11907 | |
| ... | ... | @@ -12236,18 +11956,18 @@ snapshots: |
| 12236 | 11956 | fast-wrap-ansi: 0.2.2 |
| 12237 | 11957 | sisteransi: 1.0.5 |
| 12238 | 11958 | |
| 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)': | |
| 12240 | 11960 | 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) | |
| 12242 | 11962 | standardwebhooks: 1.0.0 |
| 12243 | 11963 | tslib: 2.8.1 |
| 12244 | 11964 | transitivePeerDependencies: |
| 12245 | 11965 | - react |
| 12246 | 11966 | - react-dom |
| 12247 | 11967 | |
| 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)': | |
| 12249 | 11969 | 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) | |
| 12251 | 11971 | '@stripe/stripe-js': 5.6.0 |
| 12252 | 11972 | '@swc/helpers': 0.5.21 |
| 12253 | 11973 | '@tanstack/query-core': 5.102.8 |
| ... | ... | @@ -12262,9 +11982,26 @@ snapshots: |
| 12262 | 11982 | - react |
| 12263 | 11983 | - react-dom |
| 12264 | 11984 | |
| 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)': | |
| 12266 | 11986 | 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) | |
| 12268 | 12005 | '@stripe/stripe-js': 5.6.0 |
| 12269 | 12006 | '@swc/helpers': 0.5.21 |
| 12270 | 12007 | '@tanstack/query-core': 5.102.8 |
| ... | ... | @@ -12311,36 +12048,42 @@ snapshots: |
| 12311 | 12048 | electron-store: 8.2.0 |
| 12312 | 12049 | react-dom: 19.2.6(react@19.2.6) |
| 12313 | 12050 | |
| 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)': | |
| 12315 | 12065 | 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) | |
| 12320 | 12070 | 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)) | |
| 12325 | 12075 | tslib: 2.8.1 |
| 12326 | 12076 | 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) | |
| 12333 | 12083 | transitivePeerDependencies: |
| 12334 | 12084 | - supports-color |
| 12335 | 12085 | - typescript |
| 12336 | 12086 | |
| 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 | ||
| 12344 | 12087 | '@clerk/react@6.16.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': |
| 12345 | 12088 | dependencies: |
| 12346 | 12089 | '@clerk/shared': 4.33.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) |
| ... | ... | @@ -12348,17 +12091,31 @@ snapshots: |
| 12348 | 12091 | react-dom: 19.2.6(react@19.2.6) |
| 12349 | 12092 | tslib: 2.8.1 |
| 12350 | 12093 | |
| 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)': | |
| 12352 | 12109 | dependencies: |
| 12353 | 12110 | '@tanstack/query-core': 5.102.8 |
| 12354 | 12111 | dequal: 2.0.3 |
| 12355 | 12112 | glob-to-regexp: 0.4.1 |
| 12356 | 12113 | js-cookie: 3.0.8 |
| 12357 | 12114 | 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) | |
| 12360 | 12117 | |
| 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)': | |
| 12362 | 12119 | dependencies: |
| 12363 | 12120 | '@tanstack/query-core': 5.102.8 |
| 12364 | 12121 | dequal: 2.0.3 |
| ... | ... | @@ -12366,7 +12123,17 @@ snapshots: |
| 12366 | 12123 | js-cookie: 3.0.8 |
| 12367 | 12124 | optionalDependencies: |
| 12368 | 12125 | 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) | |
| 12370 | 12137 | |
| 12371 | 12138 | '@cloudflare/unenv-preset@2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260901.1)': |
| 12372 | 12139 | dependencies: |
| ... | ... | @@ -12446,12 +12213,12 @@ snapshots: |
| 12446 | 12213 | |
| 12447 | 12214 | '@date-fns/tz@1.5.0': {} |
| 12448 | 12215 | |
| 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)': | |
| 12450 | 12217 | dependencies: |
| 12451 | 12218 | 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) | |
| 12453 | 12220 | optionalDependencies: |
| 12454 | '@types/react': 19.2.16 | |
| 12221 | '@types/react': 19.3.0 | |
| 12455 | 12222 | |
| 12456 | 12223 | '@dimforge/rapier3d-compat@0.12.0': {} |
| 12457 | 12224 | |
| ... | ... | @@ -12549,16 +12316,16 @@ snapshots: |
| 12549 | 12316 | |
| 12550 | 12317 | '@drizzle-team/brocli@0.12.0': {} |
| 12551 | 12318 | |
| 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)': | |
| 12553 | 12320 | dependencies: |
| 12554 | 12321 | effect: 4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5) |
| 12555 | react: 19.2.3 | |
| 12322 | react: 19.2.6 | |
| 12556 | 12323 | scheduler: 0.27.0 |
| 12557 | 12324 | |
| 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)': | |
| 12559 | 12326 | dependencies: |
| 12560 | 12327 | effect: 4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5) |
| 12561 | react: 19.2.6 | |
| 12328 | react: 19.3.0 | |
| 12562 | 12329 | scheduler: 0.27.0 |
| 12563 | 12330 | |
| 12564 | 12331 | '@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: |
| 12641 | 12408 | dependencies: |
| 12642 | 12409 | effect: 4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5) |
| 12643 | 12410 | |
| 12644 | '@egjs/hammerjs@2.0.17': | |
| 12645 | dependencies: | |
| 12646 | '@types/hammerjs': 2.0.46 | |
| 12647 | ||
| 12648 | 12411 | '@electric-sql/pglite@0.3.15': |
| 12649 | 12412 | optional: true |
| 12650 | 12413 | |
| ... | ... | @@ -12999,110 +12762,36 @@ snapshots: |
| 12999 | 12762 | |
| 13000 | 12763 | '@expo-google-fonts/material-symbols@0.4.38': {} |
| 13001 | 12764 | |
| 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)': | |
| 13080 | 12766 | dependencies: |
| 12767 | 2g: 0.4.4(typescript@7.0.2) | |
| 13081 | 12768 | '@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) | |
| 13084 | 12771 | '@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 | |
| 13100 | 12788 | '@expo/spawn-async': 1.8.0 |
| 13101 | 12789 | '@expo/ws-tunnel': 2.0.0(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)) |
| 13102 | 12790 | '@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 | |
| 13104 | 12793 | accepts: 1.3.8 |
| 13105 | agent-cli-detector: 0.1.6 | |
| 12794 | agent-cli-detector: 0.1.7 | |
| 13106 | 12795 | arg: 5.0.2 |
| 13107 | 12796 | bplist-creator: 0.1.0 |
| 13108 | 12797 | bplist-parser: 0.3.2 |
| ... | ... | @@ -13110,10 +12799,9 @@ snapshots: |
| 13110 | 12799 | ci-info: 3.9.0 |
| 13111 | 12800 | compression: 1.8.1 |
| 13112 | 12801 | 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 | |
| 13117 | 12805 | fetch-nodeshim: 0.4.10 |
| 13118 | 12806 | getenv: 2.0.0 |
| 13119 | 12807 | glob: 13.0.6 |
| ... | ... | @@ -13139,7 +12827,7 @@ snapshots: |
| 13139 | 12827 | ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) |
| 13140 | 12828 | zod: 3.25.76 |
| 13141 | 12829 | 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) | |
| 13143 | 12831 | transitivePeerDependencies: |
| 13144 | 12832 | - '@expo/dom-webview' |
| 13145 | 12833 | - '@expo/metro-runtime' |
| ... | ... | @@ -13152,18 +12840,17 @@ snapshots: |
| 13152 | 12840 | - supports-color |
| 13153 | 12841 | - typescript |
| 13154 | 12842 | - utf-8-validate |
| 13155 | optional: true | |
| 13156 | 12843 | |
| 13157 | 12844 | '@expo/code-signing-certificates@0.0.6': |
| 13158 | 12845 | dependencies: |
| 13159 | 12846 | node-forge: 1.4.0 |
| 13160 | 12847 | |
| 13161 | '@expo/config-plugins@57.0.9(typescript@7.0.2)': | |
| 12848 | '@expo/config-plugins@58.0.4(typescript@7.0.2)': | |
| 13162 | 12849 | 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) | |
| 13167 | 12854 | '@expo/sdk-runtime-versions': 1.0.0 |
| 13168 | 12855 | chalk: 4.1.2 |
| 13169 | 12856 | debug: 4.4.3 |
| ... | ... | @@ -13177,14 +12864,14 @@ snapshots: |
| 13177 | 12864 | - supports-color |
| 13178 | 12865 | - typescript |
| 13179 | 12866 | |
| 13180 | '@expo/config-types@57.0.2': {} | |
| 12867 | '@expo/config-types@58.0.2': {} | |
| 13181 | 12868 | |
| 13182 | '@expo/config@57.0.9(typescript@7.0.2)': | |
| 12869 | '@expo/config@58.0.1(typescript@7.0.2)': | |
| 13183 | 12870 | 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) | |
| 13188 | 12875 | deepmerge: 4.3.1 |
| 13189 | 12876 | getenv: 2.0.0 |
| 13190 | 12877 | glob: 13.0.6 |
| ... | ... | @@ -13202,35 +12889,21 @@ snapshots: |
| 13202 | 12889 | transitivePeerDependencies: |
| 13203 | 12890 | - supports-color |
| 13204 | 12891 | |
| 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)': | |
| 13206 | 12893 | dependencies: |
| 13207 | 12894 | chalk: 4.1.2 |
| 13208 | 12895 | 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) | |
| 13225 | 12899 | |
| 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)': | |
| 13227 | 12901 | 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) | |
| 13232 | 12905 | |
| 13233 | '@expo/env@2.4.3': | |
| 12906 | '@expo/env@2.5.1': | |
| 13234 | 12907 | dependencies: |
| 13235 | 12908 | chalk: 4.1.2 |
| 13236 | 12909 | debug: 4.4.3 |
| ... | ... | @@ -13238,11 +12911,9 @@ snapshots: |
| 13238 | 12911 | transitivePeerDependencies: |
| 13239 | 12912 | - supports-color |
| 13240 | 12913 | |
| 13241 | '@expo/expo-modules-macros-plugin@0.6.1': {} | |
| 13242 | ||
| 13243 | '@expo/fingerprint@0.20.11': | |
| 12914 | '@expo/fingerprint@0.21.2': | |
| 13244 | 12915 | dependencies: |
| 13245 | '@expo/env': 2.4.3 | |
| 12916 | '@expo/env': 2.5.1 | |
| 13246 | 12917 | '@expo/spawn-async': 1.8.0 |
| 13247 | 12918 | arg: 5.0.2 |
| 13248 | 12919 | chalk: 4.1.2 |
| ... | ... | @@ -13256,9 +12927,9 @@ snapshots: |
| 13256 | 12927 | transitivePeerDependencies: |
| 13257 | 12928 | - supports-color |
| 13258 | 12929 | |
| 13259 | '@expo/image-utils@0.11.5(typescript@7.0.2)': | |
| 12930 | '@expo/image-utils@0.12.2(typescript@7.0.2)': | |
| 13260 | 12931 | dependencies: |
| 13261 | '@expo/require-utils': 57.0.5(typescript@7.0.2) | |
| 12932 | '@expo/require-utils': 58.0.2(typescript@7.0.2) | |
| 13262 | 12933 | '@expo/spawn-async': 1.8.0 |
| 13263 | 12934 | chalk: 4.1.2 |
| 13264 | 12935 | getenv: 2.0.0 |
| ... | ... | @@ -13282,59 +12953,56 @@ snapshots: |
| 13282 | 12953 | - supports-color |
| 13283 | 12954 | - typescript |
| 13284 | 12955 | |
| 13285 | '@expo/inline-modules@0.1.7(typescript@7.0.2)': | |
| 12956 | '@expo/inline-modules@0.2.1(typescript@7.0.2)': | |
| 13286 | 12957 | dependencies: |
| 13287 | '@expo/config-plugins': 57.0.9(typescript@7.0.2) | |
| 12958 | '@expo/config-plugins': 58.0.4(typescript@7.0.2) | |
| 13288 | 12959 | transitivePeerDependencies: |
| 13289 | 12960 | - supports-color |
| 13290 | 12961 | - typescript |
| 13291 | 12962 | |
| 13292 | '@expo/json-file@11.0.1': | |
| 12963 | '@expo/json-file@11.2.1': | |
| 13293 | 12964 | dependencies: |
| 13294 | 12965 | '@babel/code-frame': 7.29.7 |
| 13295 | 12966 | json5: 2.2.3 |
| 13296 | 12967 | |
| 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)': | |
| 13298 | 12969 | dependencies: |
| 13299 | '@expo/config': 57.0.9(typescript@7.0.2) | |
| 12970 | '@expo/config': 58.0.1(typescript@7.0.2) | |
| 13300 | 12971 | chalk: 4.1.2 |
| 13301 | 12972 | transitivePeerDependencies: |
| 13302 | 12973 | - supports-color |
| 13303 | 12974 | - typescript |
| 13304 | 12975 | |
| 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': {} | |
| 13313 | 12977 | |
| 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)': | |
| 13315 | 12979 | 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 | |
| 13317 | 12982 | 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) | |
| 13321 | 12985 | stacktrace-parser: 0.1.11 |
| 13322 | optional: true | |
| 12986 | optionalDependencies: | |
| 12987 | expo: 58.0.0(3abfa3879936d948a635873738556226) | |
| 13323 | 12988 | |
| 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)': | |
| 13325 | 12990 | dependencies: |
| 12991 | 2g: 0.4.4(typescript@7.0.2) | |
| 13326 | 12992 | '@babel/code-frame': 7.29.7 |
| 13327 | 12993 | '@babel/core': 7.29.7 |
| 13328 | 12994 | '@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) | |
| 13334 | 13000 | '@expo/spawn-async': 1.8.0 |
| 13335 | 13001 | '@jridgewell/gen-mapping': 0.3.13 |
| 13336 | 13002 | '@jridgewell/remapping': 2.3.5 |
| 13337 | 13003 | '@jridgewell/sourcemap-codec': 1.6.0 |
| 13004 | '@jridgewell/trace-mapping': 0.3.31 | |
| 13005 | '@react-native/js-polyfills': 0.88.0-rc.3 | |
| 13338 | 13006 | browserslist: 4.29.0 |
| 13339 | 13007 | chalk: 4.1.2 |
| 13340 | 13008 | debug: 4.4.3 |
| ... | ... | @@ -13343,19 +13011,21 @@ snapshots: |
| 13343 | 13011 | hermes-parser: 0.36.1 |
| 13344 | 13012 | jsc-safe-url: 0.2.4 |
| 13345 | 13013 | lightningcss: 1.33.0 |
| 13014 | noxcturnal: 0.1.1 | |
| 13346 | 13015 | picomatch: 4.0.7 |
| 13347 | 13016 | postcss: 8.5.28 |
| 13348 | 13017 | resolve-from: 5.0.0 |
| 13349 | 13018 | optionalDependencies: |
| 13350 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | |
| 13019 | expo: 58.0.0(3abfa3879936d948a635873738556226) | |
| 13351 | 13020 | transitivePeerDependencies: |
| 13352 | 13021 | - bufferutil |
| 13353 | 13022 | - supports-color |
| 13354 | 13023 | - typescript |
| 13355 | 13024 | - utf-8-validate |
| 13356 | 13025 | |
| 13357 | '@expo/metro-file-map@57.0.2': | |
| 13026 | '@expo/metro-file-map@58.0.3(typescript@7.0.2)': | |
| 13358 | 13027 | dependencies: |
| 13028 | 2g: 0.4.4(typescript@7.0.2) | |
| 13359 | 13029 | debug: 4.4.3 |
| 13360 | 13030 | fb-watchman: 2.0.2 |
| 13361 | 13031 | invariant: 2.2.4 |
| ... | ... | @@ -13364,85 +13034,71 @@ snapshots: |
| 13364 | 13034 | walker: 1.0.8 |
| 13365 | 13035 | transitivePeerDependencies: |
| 13366 | 13036 | - supports-color |
| 13037 | - typescript | |
| 13367 | 13038 | |
| 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)': | |
| 13383 | 13040 | 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) | |
| 13385 | 13042 | anser: 1.4.10 |
| 13386 | expo: 57.0.18(0bf40d5ad6281d8f1e92517b24812edb) | |
| 13043 | expo: 58.0.0(3abfa3879936d948a635873738556226) | |
| 13387 | 13044 | 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) | |
| 13390 | 13047 | stacktrace-parser: 0.1.11 |
| 13391 | 13048 | whatwg-fetch: 3.6.20 |
| 13392 | 13049 | 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) | |
| 13412 | 13068 | transitivePeerDependencies: |
| 13413 | 13069 | - bufferutil |
| 13414 | 13070 | - supports-color |
| 13415 | 13071 | - utf-8-validate |
| 13416 | 13072 | |
| 13417 | '@expo/osascript@2.7.1': | |
| 13073 | '@expo/osascript@2.8.1': | |
| 13418 | 13074 | dependencies: |
| 13419 | 13075 | '@expo/spawn-async': 1.8.0 |
| 13420 | 13076 | |
| 13421 | '@expo/package-manager@1.13.1': | |
| 13077 | '@expo/package-manager@1.14.1': | |
| 13422 | 13078 | dependencies: |
| 13423 | '@expo/json-file': 11.0.1 | |
| 13079 | '@expo/json-file': 11.2.1 | |
| 13424 | 13080 | '@expo/spawn-async': 1.8.0 |
| 13425 | 13081 | chalk: 4.1.2 |
| 13426 | 13082 | npm-package-arg: 11.0.3 |
| 13427 | 13083 | ora: 3.4.0 |
| 13428 | 13084 | resolve-workspace-root: 2.0.1 |
| 13429 | 13085 | |
| 13430 | '@expo/plist@0.8.1': | |
| 13086 | '@expo/plist@0.10.1': | |
| 13431 | 13087 | dependencies: |
| 13432 | 13088 | '@xmldom/xmldom': 0.8.15 |
| 13433 | 13089 | base64-js: 1.5.1 |
| 13434 | 13090 | xmlbuilder: 15.1.1 |
| 13435 | 13091 | |
| 13436 | '@expo/prebuild-config@57.0.15(typescript@7.0.2)': | |
| 13092 | '@expo/prebuild-config@58.0.6(typescript@7.0.2)': | |
| 13437 | 13093 | 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 | |
| 13444 | 13100 | 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) | |
| 13446 | 13102 | resolve-from: 5.0.0 |
| 13447 | 13103 | semver: 7.8.5 |
| 13448 | 13104 | transitivePeerDependencies: |
| ... | ... | @@ -13459,7 +13115,7 @@ snapshots: |
| 13459 | 13115 | transitivePeerDependencies: |
| 13460 | 13116 | - supports-color |
| 13461 | 13117 | |
| 13462 | '@expo/require-utils@57.0.5(typescript@7.0.2)': | |
| 13118 | '@expo/require-utils@58.0.2(typescript@7.0.2)': | |
| 13463 | 13119 | dependencies: |
| 13464 | 13120 | '@babel/code-frame': 7.29.7 |
| 13465 | 13121 | '@babel/core': 7.29.7 |
| ... | ... | @@ -13469,36 +13125,21 @@ snapshots: |
| 13469 | 13125 | transitivePeerDependencies: |
| 13470 | 13126 | - supports-color |
| 13471 | 13127 | |
| 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)': | |
| 13487 | 13129 | dependencies: |
| 13488 | 13130 | 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 | |
| 13494 | 13136 | 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) | |
| 13497 | 13139 | transitivePeerDependencies: |
| 13498 | 13140 | - supports-color |
| 13499 | optional: true | |
| 13500 | 13141 | |
| 13501 | '@expo/schema-utils@57.0.2': {} | |
| 13142 | '@expo/schema-utils@58.0.1': {} | |
| 13502 | 13143 | |
| 13503 | 13144 | '@expo/sdk-runtime-versions@1.0.0': {} |
| 13504 | 13145 | |
| ... | ... | @@ -13508,20 +13149,16 @@ snapshots: |
| 13508 | 13149 | |
| 13509 | 13150 | '@expo/sudo-prompt@9.3.2': {} |
| 13510 | 13151 | |
| 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)': | |
| 13512 | 13153 | 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) | |
| 13516 | 13157 | 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) | |
| 13518 | 13158 | optionalDependencies: |
| 13519 | 13159 | '@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) | |
| 13525 | 13162 | |
| 13526 | 13163 | '@expo/ws-tunnel@2.0.0(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))': |
| 13527 | 13164 | dependencies: |
| ... | ... | @@ -13784,14 +13421,6 @@ snapshots: |
| 13784 | 13421 | dependencies: |
| 13785 | 13422 | jsbi: 4.3.2 |
| 13786 | 13423 | |
| 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 | ||
| 13795 | 13424 | '@legendapp/list@3.3.5(patch_hash=680cc6a5c5b4a4032e467e7b3fde22f89a84c0ee2e6eac6fda737d6277cc0806)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': |
| 13796 | 13425 | dependencies: |
| 13797 | 13426 | react: 19.2.6 |
| ... | ... | @@ -13799,6 +13428,14 @@ snapshots: |
| 13799 | 13428 | optionalDependencies: |
| 13800 | 13429 | react-dom: 19.2.6(react@19.2.6) |
| 13801 | 13430 | |
| 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 | ||
| 13802 | 13439 | '@libsql/client@0.17.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)': |
| 13803 | 13440 | dependencies: |
| 13804 | 13441 | '@libsql/core': 0.17.3 |
| ... | ... | @@ -14006,6 +13643,30 @@ snapshots: |
| 14006 | 13643 | |
| 14007 | 13644 | '@nornagon/put@0.0.8': {} |
| 14008 | 13645 | |
| 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 | ||
| 14009 | 13670 | '@octokit/auth-token@6.0.0': {} |
| 14010 | 13671 | |
| 14011 | 13672 | '@octokit/core@7.0.6': |
| ... | ... | @@ -14216,6 +13877,8 @@ snapshots: |
| 14216 | 13877 | '@oxc-project/types@0.127.0': |
| 14217 | 13878 | optional: true |
| 14218 | 13879 | |
| 13880 | '@oxc-project/types@0.141.0': {} | |
| 13881 | ||
| 14219 | 13882 | '@oxc-project/types@0.146.0': {} |
| 14220 | 13883 | |
| 14221 | 13884 | '@oxc-project/types@0.147.0': {} |
| ... | ... | @@ -14444,16 +14107,16 @@ snapshots: |
| 14444 | 14107 | tslib: 2.8.1 |
| 14445 | 14108 | webcrypto-core: 1.9.2 |
| 14446 | 14109 | |
| 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)': | |
| 14448 | 14111 | dependencies: |
| 14449 | 14112 | '@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) | |
| 14451 | 14114 | '@shikijs/transformers': 4.2.0 |
| 14452 | 14115 | diff: 9.0.0 |
| 14453 | 14116 | hast-util-to-html: 9.0.5 |
| 14454 | 14117 | 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) | |
| 14457 | 14120 | shiki: 4.2.0 |
| 14458 | 14121 | transitivePeerDependencies: |
| 14459 | 14122 | - '@shikijs/themes' |
| ... | ... | @@ -14474,12 +14137,12 @@ snapshots: |
| 14474 | 14137 | |
| 14475 | 14138 | '@pierre/theme@1.1.0': {} |
| 14476 | 14139 | |
| 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)': | |
| 14478 | 14141 | optionalDependencies: |
| 14479 | 14142 | '@pierre/theme': 1.1.0 |
| 14480 | 14143 | '@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) | |
| 14483 | 14146 | shiki: 4.2.0 |
| 14484 | 14147 | |
| 14485 | 14148 | '@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: |
| 14490 | 14153 | react-dom: 19.2.6(react@19.2.6) |
| 14491 | 14154 | shiki: 4.2.0 |
| 14492 | 14155 | |
| 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)': | |
| 14494 | 14157 | dependencies: |
| 14495 | 14158 | preact: 11.0.0-beta.0 |
| 14496 | 14159 | 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) | |
| 14499 | 14162 | |
| 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)': | |
| 14501 | 14164 | dependencies: |
| 14502 | 14165 | preact: 11.0.0-beta.0 |
| 14503 | 14166 | 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) | |
| 14506 | 14169 | |
| 14507 | 14170 | '@polka/url@1.0.0-next.29': {} |
| 14508 | 14171 | |
| ... | ... | @@ -14513,149 +14176,6 @@ snapshots: |
| 14513 | 14176 | optionalDependencies: |
| 14514 | 14177 | yauzl: 3.4.0 |
| 14515 | 14178 | |
| 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 | ||
| 14659 | 14179 | '@react-grab/cli@0.1.44': |
| 14660 | 14180 | dependencies: |
| 14661 | 14181 | agent-install: 0.0.5 |
| ... | ... | @@ -14667,35 +14187,35 @@ snapshots: |
| 14667 | 14187 | prompts: 2.4.2 |
| 14668 | 14188 | tinyexec: 1.2.4 |
| 14669 | 14189 | |
| 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))': | |
| 14671 | 14191 | dependencies: |
| 14672 | 14192 | '@ai-sdk/provider': 3.0.15 |
| 14673 | 14193 | '@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) | |
| 14675 | 14195 | zod: 4.4.3 |
| 14676 | 14196 | |
| 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)': | |
| 14678 | 14198 | 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) | |
| 14681 | 14201 | optional: true |
| 14682 | 14202 | |
| 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)': | |
| 14684 | 14204 | 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) | |
| 14687 | 14207 | |
| 14688 | '@react-native/assets-registry@0.86.3': {} | |
| 14208 | '@react-native/asset-utils@0.88.0-rc.3': {} | |
| 14689 | 14209 | |
| 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)': | |
| 14691 | 14211 | dependencies: |
| 14692 | 14212 | '@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) | |
| 14694 | 14214 | transitivePeerDependencies: |
| 14695 | 14215 | - '@babel/core' |
| 14696 | 14216 | - supports-color |
| 14697 | 14217 | |
| 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)': | |
| 14699 | 14219 | dependencies: |
| 14700 | 14220 | '@babel/core': 7.29.7 |
| 14701 | 14221 | '@babel/plugin-proposal-export-default-from': 7.29.7(@babel/core@7.29.7) |
| ... | ... | @@ -14726,42 +14246,42 @@ snapshots: |
| 14726 | 14246 | '@babel/plugin-transform-runtime': 7.29.7(@babel/core@7.29.7) |
| 14727 | 14247 | '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) |
| 14728 | 14248 | '@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) | |
| 14731 | 14250 | babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.29.7) |
| 14251 | flow-parser: 0.327.0 | |
| 14732 | 14252 | react-refresh: 0.14.2 |
| 14733 | 14253 | transitivePeerDependencies: |
| 14734 | 14254 | - supports-color |
| 14735 | 14255 | |
| 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)': | |
| 14737 | 14257 | dependencies: |
| 14738 | 14258 | '@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 | |
| 14741 | 14261 | invariant: 2.2.4 |
| 14742 | 14262 | nullthrows: 1.1.1 |
| 14743 | 14263 | tinyglobby: 0.2.17 |
| 14744 | 14264 | yargs: 17.7.2 |
| 14745 | 14265 | |
| 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)': | |
| 14747 | 14267 | 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 | |
| 14749 | 14271 | debug: 4.4.3 |
| 14750 | 14272 | 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) | |
| 14754 | 14274 | semver: 7.8.5 |
| 14755 | 14275 | 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) | |
| 14757 | 14277 | transitivePeerDependencies: |
| 14758 | 14278 | - bufferutil |
| 14759 | 14279 | - supports-color |
| 14760 | 14280 | - utf-8-validate |
| 14761 | 14281 | |
| 14762 | '@react-native/debugger-frontend@0.86.3': {} | |
| 14282 | '@react-native/debugger-frontend@0.88.0-rc.3': {} | |
| 14763 | 14283 | |
| 14764 | '@react-native/debugger-shell@0.86.3': | |
| 14284 | '@react-native/debugger-shell@0.88.0-rc.3': | |
| 14765 | 14285 | dependencies: |
| 14766 | 14286 | cross-spawn: 7.0.6 |
| 14767 | 14287 | debug: 4.4.3 |
| ... | ... | @@ -14769,18 +14289,16 @@ snapshots: |
| 14769 | 14289 | transitivePeerDependencies: |
| 14770 | 14290 | - supports-color |
| 14771 | 14291 | |
| 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)': | |
| 14773 | 14293 | dependencies: |
| 14774 | 14294 | '@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 | |
| 14779 | 14297 | connect: 3.7.0 |
| 14780 | 14298 | debug: 4.4.3 |
| 14781 | 14299 | invariant: 2.2.4 |
| 14782 | 14300 | nullthrows: 1.1.1 |
| 14783 | open: 7.4.2 | |
| 14301 | open: 8.4.2 | |
| 14784 | 14302 | serve-static: 1.16.3 |
| 14785 | 14303 | ws: 7.5.11(bufferutil@4.1.0)(utf-8-validate@6.0.6) |
| 14786 | 14304 | transitivePeerDependencies: |
| ... | ... | @@ -14788,100 +14306,90 @@ snapshots: |
| 14788 | 14306 | - supports-color |
| 14789 | 14307 | - utf-8-validate |
| 14790 | 14308 | |
| 14791 | '@react-native/gradle-plugin@0.86.3': {} | |
| 14309 | '@react-native/gradle-plugin@0.88.0-rc.3': {} | |
| 14792 | 14310 | |
| 14793 | '@react-native/js-polyfills@0.86.3': {} | |
| 14311 | '@react-native/js-polyfills@0.88.0-rc.3': {} | |
| 14794 | 14312 | |
| 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)': | |
| 14796 | 14314 | dependencies: |
| 14797 | 14315 | '@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 | |
| 14800 | 14318 | nullthrows: 1.1.1 |
| 14801 | 14319 | transitivePeerDependencies: |
| 14802 | 14320 | - supports-color |
| 14803 | 14321 | |
| 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)': | |
| 14805 | 14323 | 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 | |
| 14810 | 14328 | transitivePeerDependencies: |
| 14811 | 14329 | - '@babel/core' |
| 14812 | 14330 | - bufferutil |
| 14813 | 14331 | - supports-color |
| 14814 | 14332 | - utf-8-validate |
| 14815 | 14333 | |
| 14816 | '@react-native/normalize-colors@0.86.3': {} | |
| 14334 | '@react-native/normalize-colors@0.88.0-rc.3': {} | |
| 14817 | 14335 | |
| 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)': | |
| 14819 | 14337 | dependencies: |
| 14820 | 14338 | invariant: 2.2.4 |
| 14821 | 14339 | 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) | |
| 14824 | 14342 | optionalDependencies: |
| 14825 | '@types/react': 19.2.16 | |
| 14343 | '@types/react': 19.3.0 | |
| 14826 | 14344 | |
| 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)': | |
| 14838 | 14346 | dependencies: |
| 14839 | 14347 | '@react-navigation/routers': 7.6.4 |
| 14840 | 14348 | escape-string-regexp: 4.0.0 |
| 14841 | 14349 | fast-deep-equal: 3.1.3 |
| 14842 | 14350 | nanoid: 3.3.19 |
| 14843 | 14351 | query-string: 7.1.3 |
| 14844 | react: 19.2.3 | |
| 14352 | react: 19.3.0 | |
| 14845 | 14353 | 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) | |
| 14848 | 14356 | |
| 14849 | '@react-navigation/elements@2.9.26(c10301b6e0c42fc6434d2b643197a81e)': | |
| 14357 | '@react-navigation/elements@2.9.26(83de68753219ecf7f3321e065bd378be)': | |
| 14850 | 14358 | 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) | |
| 14852 | 14360 | 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) | |
| 14858 | 14366 | 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) | |
| 14860 | 14368 | |
| 14861 | '@react-navigation/native-stack@7.17.6(patch_hash=e667c3cef8c78bb9ff4882ee5bd23a432247b843060a9499eb5f07e9e2295552)(f640afa6cd4b9a1dc5422cbafdc82f53)': | |
| 14369 | '@react-navigation/native-stack@7.17.6(patch_hash=e667c3cef8c78bb9ff4882ee5bd23a432247b843060a9499eb5f07e9e2295552)(cdeee8948497d4b80ffe015e2a003650)': | |
| 14862 | 14370 | 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) | |
| 14865 | 14373 | 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) | |
| 14870 | 14378 | sf-symbols-typescript: 2.2.0 |
| 14871 | 14379 | warn-once: 0.1.1 |
| 14872 | 14380 | transitivePeerDependencies: |
| 14873 | 14381 | - '@react-native-masked-view/masked-view' |
| 14874 | 14382 | |
| 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)': | |
| 14876 | 14384 | dependencies: |
| 14877 | '@react-navigation/core': 7.21.13(react@19.2.3) | |
| 14385 | '@react-navigation/core': 7.21.13(react@19.3.0) | |
| 14878 | 14386 | escape-string-regexp: 4.0.0 |
| 14879 | 14387 | fast-deep-equal: 3.1.3 |
| 14880 | 14388 | 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) | |
| 14883 | 14391 | 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) | |
| 14885 | 14393 | |
| 14886 | 14394 | '@react-navigation/routers@7.6.4': |
| 14887 | 14395 | dependencies: |
| ... | ... | @@ -15153,28 +14661,28 @@ snapshots: |
| 15153 | 14661 | dependencies: |
| 15154 | 14662 | defer-to-connect: 2.0.1 |
| 15155 | 14663 | |
| 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)': | |
| 15157 | 14665 | dependencies: |
| 15158 | 14666 | '@t3tools/client-runtime': link:packages/client-runtime |
| 15159 | 14667 | '@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) | |
| 15168 | 14676 | |
| 15169 | 14677 | '@t3tools/mobile-review-diff-native@file:apps/mobile/modules/t3-review-diff': {} |
| 15170 | 14678 | |
| 15171 | 14679 | '@t3tools/mobile-terminal-native@file:apps/mobile/modules/t3-terminal': {} |
| 15172 | 14680 | |
| 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)': | |
| 15174 | 14682 | dependencies: |
| 15175 | 14683 | '@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) | |
| 15178 | 14686 | |
| 15179 | 14687 | '@tabler/icons@3.44.0': {} |
| 15180 | 14688 | |
| ... | ... | @@ -15296,7 +14804,7 @@ snapshots: |
| 15296 | 14804 | |
| 15297 | 14805 | '@tanstack/router-generator@1.167.12': |
| 15298 | 14806 | dependencies: |
| 15299 | '@babel/types': 7.29.7 | |
| 14807 | '@babel/types': 7.29.8 | |
| 15300 | 14808 | '@tanstack/router-core': 1.171.8 |
| 15301 | 14809 | '@tanstack/router-utils': 1.162.1 |
| 15302 | 14810 | '@tanstack/virtual-file-routes': 1.162.0 |
| ... | ... | @@ -15333,7 +14841,7 @@ snapshots: |
| 15333 | 14841 | '@babel/core': 7.29.7 |
| 15334 | 14842 | '@babel/generator': 7.29.7 |
| 15335 | 14843 | '@babel/parser': 7.29.7 |
| 15336 | '@babel/types': 7.29.7 | |
| 14844 | '@babel/types': 7.29.8 | |
| 15337 | 14845 | ansis: 4.3.1 |
| 15338 | 14846 | babel-dead-code-elimination: 1.0.12 |
| 15339 | 14847 | diff: 8.0.3 |
| ... | ... | @@ -15500,12 +15008,12 @@ snapshots: |
| 15500 | 15008 | prosemirror-transform: 1.12.1 |
| 15501 | 15009 | prosemirror-view: 1.42.3 |
| 15502 | 15010 | |
| 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)': | |
| 15504 | 15012 | dependencies: |
| 15505 | 15013 | '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3) |
| 15506 | 15014 | '@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) | |
| 15509 | 15017 | '@types/use-sync-external-store': 0.0.6 |
| 15510 | 15018 | fast-equals: 5.4.2 |
| 15511 | 15019 | react: 19.2.6 |
| ... | ... | @@ -15570,16 +15078,16 @@ snapshots: |
| 15570 | 15078 | |
| 15571 | 15079 | '@types/babel__generator@7.27.0': |
| 15572 | 15080 | dependencies: |
| 15573 | '@babel/types': 7.29.7 | |
| 15081 | '@babel/types': 7.29.8 | |
| 15574 | 15082 | |
| 15575 | 15083 | '@types/babel__template@7.4.4': |
| 15576 | 15084 | dependencies: |
| 15577 | 15085 | '@babel/parser': 7.29.7 |
| 15578 | '@babel/types': 7.29.7 | |
| 15086 | '@babel/types': 7.29.8 | |
| 15579 | 15087 | |
| 15580 | 15088 | '@types/babel__traverse@7.28.0': |
| 15581 | 15089 | dependencies: |
| 15582 | '@babel/types': 7.29.7 | |
| 15090 | '@babel/types': 7.29.8 | |
| 15583 | 15091 | |
| 15584 | 15092 | '@types/body-parser@1.19.6': |
| 15585 | 15093 | dependencies: |
| ... | ... | @@ -15640,8 +15148,6 @@ snapshots: |
| 15640 | 15148 | dependencies: |
| 15641 | 15149 | '@types/node': 24.12.4 |
| 15642 | 15150 | |
| 15643 | '@types/hammerjs@2.0.46': {} | |
| 15644 | ||
| 15645 | 15151 | '@types/hast@3.0.4': |
| 15646 | 15152 | dependencies: |
| 15647 | 15153 | '@types/unist': 3.0.3 |
| ... | ... | @@ -15696,15 +15202,15 @@ snapshots: |
| 15696 | 15202 | |
| 15697 | 15203 | '@types/range-parser@1.2.7': {} |
| 15698 | 15204 | |
| 15699 | '@types/react-dom@19.2.3(@types/react@19.2.16)': | |
| 15205 | '@types/react-dom@19.2.3(@types/react@19.3.0)': | |
| 15700 | 15206 | dependencies: |
| 15701 | '@types/react': 19.2.16 | |
| 15207 | '@types/react': 19.3.0 | |
| 15702 | 15208 | |
| 15703 | 15209 | '@types/react-test-renderer@19.1.0': |
| 15704 | 15210 | dependencies: |
| 15705 | '@types/react': 19.2.16 | |
| 15211 | '@types/react': 19.3.0 | |
| 15706 | 15212 | |
| 15707 | '@types/react@19.2.16': | |
| 15213 | '@types/react@19.3.0': | |
| 15708 | 15214 | dependencies: |
| 15709 | 15215 | csstype: 3.2.3 |
| 15710 | 15216 | |
| ... | ... | @@ -16185,7 +15691,7 @@ snapshots: |
| 16185 | 15691 | |
| 16186 | 15692 | agent-base@7.1.4: {} |
| 16187 | 15693 | |
| 16188 | agent-cli-detector@0.1.6: {} | |
| 15694 | agent-cli-detector@0.1.7: {} | |
| 16189 | 15695 | |
| 16190 | 15696 | agent-install@0.0.5: |
| 16191 | 15697 | dependencies: |
| ... | ... | @@ -16228,12 +15734,12 @@ snapshots: |
| 16228 | 15734 | json-schema-traverse: 1.0.0 |
| 16229 | 15735 | require-from-string: 2.0.2 |
| 16230 | 15736 | |
| 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)) | |
| 16232 | 15738 | : dependencies: |
| 16233 | 15739 | '@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) |
| 16234 | 15740 | '@alchemy.run/floci': 2.0.0-beta.79(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)) |
| 16235 | 15741 | '@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)) | |
| 16237 | 15743 | '@aws-sdk/credential-providers': 3.1062.0 |
| 16238 | 15744 | '@distilled.cloud/aws': 1.0.0-rc.12(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)) |
| 16239 | 15745 | '@distilled.cloud/axiom': 1.0.0-rc.12(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)) |
| ... | ... | @@ -16268,7 +15774,7 @@ snapshots: |
| 16268 | 15774 | '@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) |
| 16269 | 15775 | '@effect/sql-pg': 4.0.0-rc.115(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)) |
| 16270 | 15776 | 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) | |
| 16272 | 15778 | mongodb: 6.21.0(@aws-sdk/credential-providers@3.1062.0)(socks@2.8.9) |
| 16273 | 15779 | pg: 8.23.0 |
| 16274 | 15780 | 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: |
| 16375 | 15881 | |
| 16376 | 15882 | argparse@2.0.1: {} |
| 16377 | 15883 | |
| 16378 | aria-hidden@1.2.6: | |
| 16379 | dependencies: | |
| 16380 | tslib: 2.8.1 | |
| 16381 | ||
| 16382 | 15884 | aria-query@5.3.0: |
| 16383 | 15885 | dependencies: |
| 16384 | 15886 | dequal: 2.0.3 |
| ... | ... | @@ -16512,9 +16014,9 @@ snapshots: |
| 16512 | 16014 | babel-dead-code-elimination@1.0.12: |
| 16513 | 16015 | dependencies: |
| 16514 | 16016 | '@babel/core': 7.29.7 |
| 16515 | '@babel/parser': 7.29.7 | |
| 16017 | '@babel/parser': 7.29.8 | |
| 16516 | 16018 | '@babel/traverse': 7.29.7 |
| 16517 | '@babel/types': 7.29.7 | |
| 16019 | '@babel/types': 7.29.8 | |
| 16518 | 16020 | transitivePeerDependencies: |
| 16519 | 16021 | - supports-color |
| 16520 | 16022 | |
| ... | ... | @@ -16548,10 +16050,6 @@ snapshots: |
| 16548 | 16050 | |
| 16549 | 16051 | babel-plugin-react-native-web@0.21.2: {} |
| 16550 | 16052 | |
| 16551 | babel-plugin-syntax-hermes-parser@0.36.0: | |
| 16552 | dependencies: | |
| 16553 | hermes-parser: 0.36.0 | |
| 16554 | ||
| 16555 | 16053 | babel-plugin-syntax-hermes-parser@0.36.1: |
| 16556 | 16054 | dependencies: |
| 16557 | 16055 | hermes-parser: 0.36.1 |
| ... | ... | @@ -16562,7 +16060,7 @@ snapshots: |
| 16562 | 16060 | transitivePeerDependencies: |
| 16563 | 16061 | - '@babel/core' |
| 16564 | 16062 | |
| 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): | |
| 16566 | 16064 | dependencies: |
| 16567 | 16065 | '@babel/generator': 7.29.7 |
| 16568 | 16066 | '@babel/helper-module-imports': 7.29.7 |
| ... | ... | @@ -16593,14 +16091,14 @@ snapshots: |
| 16593 | 16091 | '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.29.7) |
| 16594 | 16092 | '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.29.7) |
| 16595 | 16093 | '@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) | |
| 16597 | 16095 | '@babel/plugin-transform-react-jsx-development': 7.29.7(@babel/core@7.29.7) |
| 16598 | 16096 | '@babel/plugin-transform-react-pure-annotations': 7.29.7(@babel/core@7.29.7) |
| 16599 | 16097 | '@babel/plugin-transform-runtime': 7.29.7(@babel/core@7.29.7) |
| 16600 | 16098 | '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) |
| 16601 | 16099 | '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7) |
| 16602 | 16100 | '@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) | |
| 16604 | 16102 | babel-plugin-react-compiler: 1.0.0 |
| 16605 | 16103 | babel-plugin-react-native-web: 0.21.2 |
| 16606 | 16104 | babel-plugin-syntax-hermes-parser: 0.36.1 |
| ... | ... | @@ -16609,8 +16107,8 @@ snapshots: |
| 16609 | 16107 | react-refresh: 0.14.2 |
| 16610 | 16108 | optionalDependencies: |
| 16611 | 16109 | '@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) | |
| 16614 | 16112 | transitivePeerDependencies: |
| 16615 | 16113 | - '@babel/core' |
| 16616 | 16114 | - supports-color |
| ... | ... | @@ -16829,29 +16327,8 @@ snapshots: |
| 16829 | 16327 | |
| 16830 | 16328 | chownr@3.0.0: {} |
| 16831 | 16329 | |
| 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 | ||
| 16851 | 16330 | chromium-pickle-js@0.2.0: {} |
| 16852 | 16331 | |
| 16853 | ci-info@2.0.0: {} | |
| 16854 | ||
| 16855 | 16332 | ci-info@3.9.0: {} |
| 16856 | 16333 | |
| 16857 | 16334 | ci-info@4.3.1: {} |
| ... | ... | @@ -17150,6 +16627,8 @@ snapshots: |
| 17150 | 16627 | gopd: 1.2.0 |
| 17151 | 16628 | optional: true |
| 17152 | 16629 | |
| 16630 | define-lazy-prop@2.0.0: {} | |
| 16631 | ||
| 17153 | 16632 | define-properties@1.2.1: |
| 17154 | 16633 | dependencies: |
| 17155 | 16634 | define-data-property: 1.1.4 |
| ... | ... | @@ -17176,8 +16655,6 @@ snapshots: |
| 17176 | 16655 | |
| 17177 | 16656 | detect-libc@2.1.2: {} |
| 17178 | 16657 | |
| 17179 | detect-node-es@1.1.0: {} | |
| 17180 | ||
| 17181 | 16658 | detect-node@2.1.0: |
| 17182 | 16659 | optional: true |
| 17183 | 16660 | |
| ... | ... | @@ -17206,7 +16683,7 @@ snapshots: |
| 17206 | 16683 | - electron-builder-squirrel-windows |
| 17207 | 16684 | - supports-color |
| 17208 | 16685 | |
| 17209 | dnssd-advertise@1.1.4: {} | |
| 16686 | dnssd-advertise@1.1.6: {} | |
| 17210 | 16687 | |
| 17211 | 16688 | dom-accessibility-api@0.5.16: {} |
| 17212 | 16689 | |
| ... | ... | @@ -17246,7 +16723,7 @@ snapshots: |
| 17246 | 16723 | get-tsconfig: 4.14.3 |
| 17247 | 16724 | jiti: 2.7.0 |
| 17248 | 16725 | |
| 17249 | drizzle-orm@1.0.0-rc.5-ab785fc(31bc26b129d6bba2f2e387113f50dba2): | |
| 16726 | drizzle-orm@1.0.0-rc.5-ab785fc(7abae7c285f47308cc52e143cbe0c150): | |
| 17250 | 16727 | optionalDependencies: |
| 17251 | 16728 | '@cloudflare/workers-types': 4.20260604.1 |
| 17252 | 16729 | '@effect/sql-d1': 4.0.0-rc.115(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)) |
| ... | ... | @@ -17257,7 +16734,7 @@ snapshots: |
| 17257 | 16734 | '@libsql/client': 0.17.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) |
| 17258 | 16735 | bun-types: 1.3.14 |
| 17259 | 16736 | 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) | |
| 17261 | 16738 | pg: 8.23.0 |
| 17262 | 16739 | valibot: 1.2.0(typescript@7.0.2) |
| 17263 | 16740 | zod: 4.4.3 |
| ... | ... | @@ -17526,231 +17003,195 @@ snapshots: |
| 17526 | 17003 | |
| 17527 | 17004 | expect-type@1.4.0: {} |
| 17528 | 17005 | |
| 17529 | expo-application@57.0.2(expo@57.0.18): | |
| 17006 | expo-application@58.0.2(expo@58.0.0): | |
| 17530 | 17007 | dependencies: |
| 17531 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | |
| 17008 | expo: 58.0.0(3abfa3879936d948a635873738556226) | |
| 17532 | 17009 | |
| 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): | |
| 17534 | 17011 | 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) | |
| 17540 | 17017 | transitivePeerDependencies: |
| 17541 | 17018 | - supports-color |
| 17542 | 17019 | - typescript |
| 17543 | 17020 | |
| 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): | |
| 17545 | 17022 | 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) | |
| 17562 | 17027 | |
| 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): | |
| 17564 | 17029 | 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)) | |
| 17570 | 17035 | 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) | |
| 17573 | 17038 | transitivePeerDependencies: |
| 17574 | 17039 | - expo |
| 17575 | 17040 | - supports-color |
| 17041 | - typescript | |
| 17576 | 17042 | |
| 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): | |
| 17578 | 17044 | 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) | |
| 17582 | 17048 | |
| 17583 | expo-build-properties@57.0.15(expo@57.0.18): | |
| 17049 | expo-build-properties@58.0.9(expo@58.0.0): | |
| 17584 | 17050 | 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) | |
| 17587 | 17053 | resolve-from: 5.0.0 |
| 17588 | 17054 | semver: 7.8.5 |
| 17589 | 17055 | |
| 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): | |
| 17591 | 17057 | dependencies: |
| 17592 | 17058 | 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) | |
| 17596 | 17062 | transitivePeerDependencies: |
| 17597 | 17063 | - '@types/emscripten' |
| 17598 | 17064 | |
| 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): | |
| 17606 | 17066 | 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) | |
| 17612 | 17070 | |
| 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): | |
| 17614 | 17072 | 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) | |
| 17618 | 17077 | transitivePeerDependencies: |
| 17619 | 17078 | - supports-color |
| 17620 | optional: true | |
| 17079 | - typescript | |
| 17621 | 17080 | |
| 17622 | expo-crypto@57.0.2(expo@57.0.18): | |
| 17081 | expo-crypto@58.0.3(expo@58.0.0): | |
| 17623 | 17082 | dependencies: |
| 17624 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | |
| 17083 | expo: 58.0.0(3abfa3879936d948a635873738556226) | |
| 17625 | 17084 | |
| 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)): | |
| 17627 | 17086 | 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) | |
| 17634 | 17093 | transitivePeerDependencies: |
| 17635 | 17094 | - react-native |
| 17636 | 17095 | |
| 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)): | |
| 17638 | 17097 | 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) | |
| 17644 | 17103 | |
| 17645 | expo-dev-menu-interface@57.0.0(expo@57.0.18): | |
| 17104 | expo-dev-menu-interface@58.0.1(expo@58.0.0): | |
| 17646 | 17105 | dependencies: |
| 17647 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | |
| 17106 | expo: 58.0.0(3abfa3879936d948a635873738556226) | |
| 17648 | 17107 | |
| 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)): | |
| 17650 | 17109 | 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) | |
| 17654 | 17113 | |
| 17655 | expo-device@57.0.1(expo@57.0.18): | |
| 17114 | expo-device@58.0.3(expo@58.0.0): | |
| 17656 | 17115 | dependencies: |
| 17657 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | |
| 17116 | expo: 58.0.0(3abfa3879936d948a635873738556226) | |
| 17658 | 17117 | ua-parser-js: 0.7.41 |
| 17659 | 17118 | |
| 17660 | expo-document-picker@57.0.1(expo@57.0.18): | |
| 17119 | expo-document-picker@58.0.3(expo@58.0.0): | |
| 17661 | 17120 | dependencies: |
| 17662 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | |
| 17121 | expo: 58.0.0(3abfa3879936d948a635873738556226) | |
| 17663 | 17122 | |
| 17664 | expo-eas-client@57.0.2: {} | |
| 17123 | expo-eas-client@58.0.1: {} | |
| 17665 | 17124 | |
| 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)): | |
| 17667 | 17126 | 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) | |
| 17670 | 17129 | |
| 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): | |
| 17672 | 17131 | 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) | |
| 17676 | 17135 | |
| 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): | |
| 17678 | 17137 | 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) | |
| 17683 | 17141 | |
| 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): | |
| 17685 | 17143 | 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) | |
| 17701 | 17145 | |
| 17702 | expo-image-loader@57.0.1(expo@57.0.18): | |
| 17146 | expo-image-loader@58.0.2(expo@58.0.0): | |
| 17703 | 17147 | dependencies: |
| 17704 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | |
| 17148 | expo: 58.0.0(3abfa3879936d948a635873738556226) | |
| 17705 | 17149 | |
| 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): | |
| 17707 | 17151 | 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) | |
| 17710 | 17156 | |
| 17711 | expo-image-picker@57.0.14(expo@57.0.18): | |
| 17157 | expo-image-picker@58.0.9(expo@58.0.0): | |
| 17712 | 17158 | 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) | |
| 17715 | 17161 | |
| 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): | |
| 17717 | 17163 | 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) | |
| 17721 | 17167 | sf-symbols-typescript: 2.2.0 |
| 17722 | 17168 | |
| 17723 | expo-json-utils@57.0.1: {} | |
| 17169 | expo-json-utils@58.0.1: {} | |
| 17724 | 17170 | |
| 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): | |
| 17726 | 17172 | dependencies: |
| 17727 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | |
| 17728 | react: 19.2.3 | |
| 17173 | expo: 58.0.0(3abfa3879936d948a635873738556226) | |
| 17174 | react: 19.3.0 | |
| 17729 | 17175 | |
| 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): | |
| 17731 | 17177 | 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) | |
| 17739 | 17180 | 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) | |
| 17742 | 17183 | transitivePeerDependencies: |
| 17743 | - expo | |
| 17744 | 17184 | - supports-color |
| 17185 | - typescript | |
| 17745 | 17186 | |
| 17746 | expo-manifests@57.0.1(expo@57.0.18): | |
| 17187 | expo-manifests@58.0.1(expo@58.0.0): | |
| 17747 | 17188 | 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 | |
| 17750 | 17191 | |
| 17751 | expo-modules-autolinking@57.0.12(typescript@7.0.2): | |
| 17192 | expo-modules-autolinking@58.0.6(typescript@7.0.2): | |
| 17752 | 17193 | dependencies: |
| 17753 | '@expo/require-utils': 57.0.5(typescript@7.0.2) | |
| 17194 | '@expo/require-utils': 58.0.2(typescript@7.0.2) | |
| 17754 | 17195 | '@expo/spawn-async': 1.8.0 |
| 17755 | 17196 | chalk: 4.1.2 |
| 17756 | 17197 | commander: 7.2.0 |
| ... | ... | @@ -17758,253 +17199,187 @@ snapshots: |
| 17758 | 17199 | - supports-color |
| 17759 | 17200 | - typescript |
| 17760 | 17201 | |
| 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): | |
| 17773 | 17203 | 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 | |
| 17776 | 17206 | 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) | |
| 17779 | 17209 | 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) | |
| 17781 | 17211 | |
| 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)): | |
| 17783 | 17213 | 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) | |
| 17785 | 17215 | |
| 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: {} | |
| 17790 | 17217 | |
| 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): | |
| 17792 | 17219 | dependencies: |
| 17793 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | |
| 17794 | react: 19.2.3 | |
| 17220 | expo: 58.0.0(3abfa3879936d948a635873738556226) | |
| 17221 | react: 19.3.0 | |
| 17795 | 17222 | |
| 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): | |
| 17797 | 17224 | dependencies: |
| 17798 | '@expo/image-utils': 0.11.5(typescript@7.0.2) | |
| 17225 | '@expo/image-utils': 0.12.2(typescript@7.0.2) | |
| 17799 | 17226 | abort-controller: 3.0.0 |
| 17800 | 17227 | 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) | |
| 17806 | 17233 | transitivePeerDependencies: |
| 17807 | 17234 | - supports-color |
| 17808 | 17235 | - typescript |
| 17809 | 17236 | |
| 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): | |
| 17811 | 17238 | 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) | |
| 17815 | 17242 | |
| 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): | |
| 17817 | 17244 | dependencies: |
| 17818 | 17245 | '@expo/image-utils': 0.8.14(typescript@7.0.2) |
| 17819 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | |
| 17246 | expo: 58.0.0(3abfa3879936d948a635873738556226) | |
| 17820 | 17247 | schema-utils: 4.3.3 |
| 17821 | 17248 | sf-symbols-typescript: 2.2.0 |
| 17822 | 17249 | transitivePeerDependencies: |
| 17823 | 17250 | - supports-color |
| 17824 | 17251 | - typescript |
| 17825 | 17252 | |
| 17826 | expo-secure-store@57.0.2(expo@57.0.18): | |
| 17253 | expo-secure-store@58.0.1(expo@58.0.0): | |
| 17827 | 17254 | dependencies: |
| 17828 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | |
| 17255 | expo: 58.0.0(3abfa3879936d948a635873738556226) | |
| 17829 | 17256 | |
| 17830 | expo-server@57.0.3: {} | |
| 17257 | expo-server@58.0.2: {} | |
| 17831 | 17258 | |
| 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): | |
| 17833 | 17260 | 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) | |
| 17840 | 17267 | transitivePeerDependencies: |
| 17841 | 17268 | - supports-color |
| 17842 | 17269 | - typescript |
| 17843 | 17270 | |
| 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): | |
| 17845 | 17272 | 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) | |
| 17849 | 17276 | xml2js: 0.6.0 |
| 17850 | 17277 | transitivePeerDependencies: |
| 17851 | 17278 | - supports-color |
| 17852 | 17279 | - typescript |
| 17853 | 17280 | |
| 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): | |
| 17855 | 17282 | dependencies: |
| 17856 | 17283 | 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) | |
| 17860 | 17287 | |
| 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: {} | |
| 17870 | 17289 | |
| 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): | |
| 17872 | 17291 | dependencies: |
| 17873 | 17292 | '@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) | |
| 17878 | 17297 | sf-symbols-typescript: 2.2.0 |
| 17879 | 17298 | |
| 17880 | expo-updates-interface@57.0.1(expo@57.0.18): | |
| 17299 | expo-updates-interface@58.0.1(expo@58.0.0): | |
| 17881 | 17300 | dependencies: |
| 17882 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | |
| 17301 | expo: 58.0.0(3abfa3879936d948a635873738556226) | |
| 17883 | 17302 | |
| 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): | |
| 17885 | 17304 | dependencies: |
| 17886 | 17305 | '@expo/code-signing-certificates': 0.0.6 |
| 17887 | '@expo/plist': 0.8.1 | |
| 17306 | '@expo/plist': 0.10.1 | |
| 17888 | 17307 | '@expo/spawn-async': 1.8.0 |
| 17889 | 17308 | arg: 4.1.3 |
| 17890 | 17309 | chalk: 4.1.2 |
| 17891 | 17310 | 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) | |
| 17897 | 17316 | getenv: 2.0.0 |
| 17898 | 17317 | glob: 13.0.6 |
| 17899 | 17318 | ignore: 5.3.2 |
| 17900 | 17319 | 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) | |
| 17903 | 17322 | resolve-from: 5.0.0 |
| 17904 | 17323 | 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)) | |
| 17906 | 17325 | transitivePeerDependencies: |
| 17907 | 17326 | - supports-color |
| 17908 | 17327 | |
| 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): | |
| 17910 | 17329 | 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) | |
| 17914 | 17333 | |
| 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)): | |
| 17916 | 17335 | 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) | |
| 17919 | 17338 | |
| 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): | |
| 17921 | 17340 | 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) | |
| 17927 | 17346 | transitivePeerDependencies: |
| 17928 | 17347 | - '@babel/core' |
| 17929 | - '@types/react' | |
| 17930 | - '@types/react-dom' | |
| 17931 | 17348 | - react-dom |
| 17932 | 17349 | - react-native-worklets |
| 17933 | 17350 | |
| 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): | |
| 17978 | 17352 | dependencies: |
| 17979 | 17353 | '@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) | |
| 17989 | 17364 | '@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) | |
| 17998 | 17373 | 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) | |
| 18001 | 17376 | react-refresh: 0.14.2 |
| 18002 | whatwg-url-minimum: 0.1.2 | |
| 17377 | whatwg-url-minimum: 0.2.0 | |
| 18003 | 17378 | 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) | |
| 18008 | 17383 | transitivePeerDependencies: |
| 18009 | 17384 | - '@babel/core' |
| 18010 | 17385 | - bufferutil |
| ... | ... | @@ -18185,12 +17560,22 @@ snapshots: |
| 18185 | 17560 | |
| 18186 | 17561 | flow-enums-runtime@0.0.6: {} |
| 18187 | 17562 | |
| 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 | ||
| 18188 | 17575 | fontace@0.4.1: |
| 18189 | 17576 | dependencies: |
| 18190 | 17577 | fontkitten: 1.0.3 |
| 18191 | 17578 | |
| 18192 | fontfaceobserver@2.3.0: {} | |
| 18193 | ||
| 18194 | 17579 | fontkitten@1.0.3: |
| 18195 | 17580 | dependencies: |
| 18196 | 17581 | tiny-inflate: 1.0.3 |
| ... | ... | @@ -18279,8 +17664,6 @@ snapshots: |
| 18279 | 17664 | hasown: 2.0.4 |
| 18280 | 17665 | math-intrinsics: 1.1.0 |
| 18281 | 17666 | |
| 18282 | get-nonce@1.0.1: {} | |
| 18283 | ||
| 18284 | 17667 | get-proto@1.0.1: |
| 18285 | 17668 | dependencies: |
| 18286 | 17669 | dunder-proto: 1.0.1 |
| ... | ... | @@ -18487,32 +17870,16 @@ snapshots: |
| 18487 | 17870 | |
| 18488 | 17871 | heic-to@1.5.2: {} |
| 18489 | 17872 | |
| 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: {} | |
| 18495 | 17874 | |
| 18496 | 17875 | hermes-estree@0.36.1: {} |
| 18497 | 17876 | |
| 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 | ||
| 18506 | 17877 | hermes-parser@0.36.1: |
| 18507 | 17878 | dependencies: |
| 18508 | 17879 | hermes-estree: 0.36.1 |
| 18509 | 17880 | |
| 18510 | 17881 | hexy@0.2.11: {} |
| 18511 | 17882 | |
| 18512 | hoist-non-react-statics@3.3.2: | |
| 18513 | dependencies: | |
| 18514 | react-is: 16.13.1 | |
| 18515 | ||
| 18516 | 17883 | hono@4.13.7: {} |
| 18517 | 17884 | |
| 18518 | 17885 | hosted-git-info@4.1.0: |
| ... | ... | @@ -18582,10 +17949,6 @@ snapshots: |
| 18582 | 17949 | |
| 18583 | 17950 | ignore@7.0.5: {} |
| 18584 | 17951 | |
| 18585 | image-size@1.2.1: | |
| 18586 | dependencies: | |
| 18587 | queue: 6.0.2 | |
| 18588 | ||
| 18589 | 17952 | immediate@3.0.6: {} |
| 18590 | 17953 | |
| 18591 | 17954 | inflight@1.0.6: |
| ... | ... | @@ -18865,13 +18228,6 @@ snapshots: |
| 18865 | 18228 | dependencies: |
| 18866 | 18229 | immediate: 3.0.6 |
| 18867 | 18230 | |
| 18868 | lighthouse-logger@1.4.2: | |
| 18869 | dependencies: | |
| 18870 | debug: 2.6.9 | |
| 18871 | marky: 1.3.0 | |
| 18872 | transitivePeerDependencies: | |
| 18873 | - supports-color | |
| 18874 | ||
| 18875 | 18231 | lightningcss-android-arm64@1.33.0: |
| 18876 | 18232 | optional: true |
| 18877 | 18233 | |
| ... | ... | @@ -19001,8 +18357,6 @@ snapshots: |
| 19001 | 18357 | |
| 19002 | 18358 | markdown-table@3.0.4: {} |
| 19003 | 18359 | |
| 19004 | marky@1.3.0: {} | |
| 19005 | ||
| 19006 | 18360 | matcher@3.0.0: |
| 19007 | 18361 | dependencies: |
| 19008 | 18362 | escape-string-regexp: 4.0.0 |
| ... | ... | @@ -19201,109 +18555,50 @@ snapshots: |
| 19201 | 18555 | |
| 19202 | 18556 | meshoptimizer@0.22.0: {} |
| 19203 | 18557 | |
| 19204 | metro-babel-transformer@0.84.4: | |
| 18558 | metro-babel-transformer@0.87.1: | |
| 19205 | 18559 | dependencies: |
| 19206 | 18560 | '@babel/core': 7.29.7 |
| 19207 | 18561 | 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 | |
| 19210 | 18564 | nullthrows: 1.1.1 |
| 19211 | 18565 | transitivePeerDependencies: |
| 19212 | 18566 | - supports-color |
| 19213 | 18567 | |
| 19214 | metro-babel-transformer@0.84.5: | |
| 18568 | metro-cache-key@0.87.1: | |
| 19215 | 18569 | dependencies: |
| 19216 | '@babel/core': 7.29.7 | |
| 19217 | 18570 | 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 | |
| 19223 | 18571 | |
| 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: | |
| 19233 | 18573 | dependencies: |
| 19234 | 18574 | exponential-backoff: 3.1.3 |
| 19235 | 18575 | flow-enums-runtime: 0.0.6 |
| 19236 | 18576 | https-proxy-agent: 7.0.6 |
| 19237 | metro-core: 0.84.4 | |
| 18577 | metro-core: 0.87.1 | |
| 19238 | 18578 | transitivePeerDependencies: |
| 19239 | 18579 | - supports-color |
| 19240 | 18580 | |
| 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): | |
| 19251 | 18582 | dependencies: |
| 19252 | 18583 | connect: 3.7.0 |
| 19253 | 18584 | flow-enums-runtime: 0.0.6 |
| 19254 | 18585 | 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 | |
| 19260 | 18590 | transitivePeerDependencies: |
| 19261 | 18591 | - bufferutil |
| 19262 | 18592 | - supports-color |
| 19263 | 18593 | - utf-8-validate |
| 19264 | 18594 | |
| 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: | |
| 19281 | 18596 | dependencies: |
| 19282 | 18597 | flow-enums-runtime: 0.0.6 |
| 19283 | 18598 | 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 | |
| 19305 | 18600 | |
| 19306 | metro-file-map@0.84.5: | |
| 18601 | metro-file-map@0.87.1: | |
| 19307 | 18602 | dependencies: |
| 19308 | 18603 | debug: 4.4.3 |
| 19309 | 18604 | fb-watchman: 2.0.2 |
| ... | ... | @@ -19313,89 +18608,49 @@ snapshots: |
| 19313 | 18608 | jest-worker: 29.7.0 |
| 19314 | 18609 | micromatch: 4.0.8 |
| 19315 | 18610 | nullthrows: 1.1.1 |
| 19316 | walker: 1.0.8 | |
| 19317 | 18611 | transitivePeerDependencies: |
| 19318 | 18612 | - supports-color |
| 19319 | 18613 | |
| 19320 | metro-minify-terser@0.84.4: | |
| 18614 | metro-minify-terser@0.87.1: | |
| 19321 | 18615 | dependencies: |
| 19322 | 18616 | flow-enums-runtime: 0.0.6 |
| 19323 | 18617 | terser: 5.48.0 |
| 19324 | 18618 | |
| 19325 | metro-minify-terser@0.84.5: | |
| 18619 | metro-resolver@0.87.1: | |
| 19326 | 18620 | dependencies: |
| 19327 | 18621 | 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 | |
| 19342 | 18622 | |
| 19343 | metro-runtime@0.84.5: | |
| 18623 | metro-runtime@0.87.1: | |
| 19344 | 18624 | dependencies: |
| 19345 | 18625 | '@babel/runtime': 7.29.7 |
| 19346 | 18626 | flow-enums-runtime: 0.0.6 |
| 19347 | 18627 | |
| 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: | |
| 19363 | 18629 | dependencies: |
| 19364 | 18630 | '@babel/traverse': 7.29.7 |
| 19365 | 18631 | '@babel/types': 7.29.8 |
| 19366 | 18632 | flow-enums-runtime: 0.0.6 |
| 19367 | 18633 | 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 | |
| 19381 | 18635 | nullthrows: 1.1.1 |
| 18636 | ob1: 0.87.1 | |
| 19382 | 18637 | source-map: 0.5.7 |
| 19383 | 18638 | vlq: 1.0.1 |
| 19384 | 18639 | transitivePeerDependencies: |
| 19385 | 18640 | - supports-color |
| 19386 | 18641 | |
| 19387 | metro-symbolicate@0.84.5: | |
| 18642 | metro-symbolicate@0.87.1: | |
| 19388 | 18643 | dependencies: |
| 19389 | 18644 | flow-enums-runtime: 0.0.6 |
| 19390 | 18645 | invariant: 2.2.4 |
| 19391 | metro-source-map: 0.84.5 | |
| 18646 | metro-source-map: 0.87.1 | |
| 19392 | 18647 | nullthrows: 1.1.1 |
| 19393 | 18648 | source-map: 0.5.7 |
| 19394 | 18649 | vlq: 1.0.1 |
| 19395 | 18650 | transitivePeerDependencies: |
| 19396 | 18651 | - supports-color |
| 19397 | 18652 | |
| 19398 | metro-transform-plugins@0.84.4: | |
| 18653 | metro-transform-plugins@0.87.1: | |
| 19399 | 18654 | dependencies: |
| 19400 | 18655 | '@babel/core': 7.29.7 |
| 19401 | 18656 | '@babel/generator': 7.29.7 |
| ... | ... | @@ -19406,104 +18661,27 @@ snapshots: |
| 19406 | 18661 | transitivePeerDependencies: |
| 19407 | 18662 | - supports-color |
| 19408 | 18663 | |
| 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): | |
| 19421 | 18665 | dependencies: |
| 19422 | 18666 | '@babel/core': 7.29.7 |
| 19423 | 18667 | '@babel/generator': 7.29.7 |
| 19424 | 18668 | '@babel/parser': 7.29.8 |
| 19425 | 18669 | '@babel/types': 7.29.8 |
| 19426 | 18670 | 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 | |
| 19434 | 18678 | nullthrows: 1.1.1 |
| 19435 | 18679 | transitivePeerDependencies: |
| 19436 | 18680 | - bufferutil |
| 19437 | 18681 | - supports-color |
| 19438 | 18682 | - utf-8-validate |
| 19439 | 18683 | |
| 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): | |
| 19507 | 18685 | dependencies: |
| 19508 | 18686 | '@babel/code-frame': 7.29.7 |
| 19509 | 18687 | '@babel/core': 7.29.7 |
| ... | ... | @@ -19513,29 +18691,28 @@ snapshots: |
| 19513 | 18691 | '@babel/traverse': 7.29.7 |
| 19514 | 18692 | '@babel/types': 7.29.8 |
| 19515 | 18693 | accepts: 2.0.0 |
| 19516 | ci-info: 2.0.0 | |
| 19517 | 18694 | connect: 3.7.0 |
| 19518 | 18695 | debug: 4.4.3 |
| 19519 | 18696 | error-stack-parser: 2.1.4 |
| 19520 | 18697 | flow-enums-runtime: 0.0.6 |
| 18698 | flow-parser: 0.331.0 | |
| 19521 | 18699 | graceful-fs: 4.2.11 |
| 19522 | hermes-parser: 0.35.0 | |
| 19523 | 18700 | invariant: 2.2.4 |
| 19524 | 18701 | jest-worker: 29.7.0 |
| 19525 | 18702 | jsc-safe-url: 0.2.4 |
| 19526 | 18703 | 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) | |
| 19539 | 18716 | mime-types: 3.0.2 |
| 19540 | 18717 | nullthrows: 1.1.1 |
| 19541 | 18718 | serialize-error: 2.1.0 |
| ... | ... | @@ -19812,8 +18989,6 @@ snapshots: |
| 19812 | 18989 | dependencies: |
| 19813 | 18990 | minimist: 1.2.8 |
| 19814 | 18991 | |
| 19815 | mkdirp@1.0.4: {} | |
| 19816 | ||
| 19817 | 18992 | modern-tar@0.8.5: {} |
| 19818 | 18993 | |
| 19819 | 18994 | mongodb-connection-string-url@3.0.2: |
| ... | ... | @@ -19947,6 +19122,20 @@ snapshots: |
| 19947 | 19122 | |
| 19948 | 19123 | normalize-url@6.1.0: {} |
| 19949 | 19124 | |
| 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 | ||
| 19950 | 19139 | npm-package-arg@11.0.3: |
| 19951 | 19140 | dependencies: |
| 19952 | 19141 | hosted-git-info: 7.0.2 |
| ... | ... | @@ -19991,11 +19180,7 @@ snapshots: |
| 19991 | 19180 | should: 13.2.3 |
| 19992 | 19181 | yaml: 2.9.0 |
| 19993 | 19182 | |
| 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: | |
| 19999 | 19184 | dependencies: |
| 20000 | 19185 | flow-enums-runtime: 0.0.6 |
| 20001 | 19186 | |
| ... | ... | @@ -20050,8 +19235,9 @@ snapshots: |
| 20050 | 19235 | regex: 6.1.0 |
| 20051 | 19236 | regex-recursion: 6.0.2 |
| 20052 | 19237 | |
| 20053 | open@7.4.2: | |
| 19238 | open@8.4.2: | |
| 20054 | 19239 | dependencies: |
| 19240 | define-lazy-prop: 2.0.0 | |
| 20055 | 19241 | is-docker: 2.2.1 |
| 20056 | 19242 | is-wsl: 2.2.0 |
| 20057 | 19243 | |
| ... | ... | @@ -20573,10 +19759,6 @@ snapshots: |
| 20573 | 19759 | split-on-first: 1.1.0 |
| 20574 | 19760 | strict-uri-encode: 2.0.0 |
| 20575 | 19761 | |
| 20576 | queue@6.0.2: | |
| 20577 | dependencies: | |
| 20578 | inherits: 2.0.4 | |
| 20579 | ||
| 20580 | 19762 | quick-lru@5.1.1: {} |
| 20581 | 19763 | |
| 20582 | 19764 | radix3@1.1.2: {} |
| ... | ... | @@ -20590,13 +19772,13 @@ snapshots: |
| 20590 | 19772 | iconv-lite: 0.7.2 |
| 20591 | 19773 | unpipe: 1.0.0 |
| 20592 | 19774 | |
| 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): | |
| 20594 | 19776 | dependencies: |
| 20595 | 19777 | '@date-fns/tz': 1.5.0 |
| 20596 | 19778 | date-fns: 4.4.0 |
| 20597 | 19779 | react: 19.2.6 |
| 20598 | 19780 | optionalDependencies: |
| 20599 | '@types/react': 19.2.16 | |
| 19781 | '@types/react': 19.3.0 | |
| 20600 | 19782 | |
| 20601 | 19783 | react-devtools-core@6.1.5(bufferutil@4.1.0)(utf-8-validate@6.0.6): |
| 20602 | 19784 | dependencies: |
| ... | ... | @@ -20606,19 +19788,19 @@ snapshots: |
| 20606 | 19788 | - bufferutil |
| 20607 | 19789 | - utf-8-validate |
| 20608 | 19790 | |
| 20609 | react-dom@19.2.3(react@19.2.3): | |
| 20610 | dependencies: | |
| 20611 | react: 19.2.3 | |
| 20612 | scheduler: 0.27.0 | |
| 20613 | ||
| 20614 | 19791 | react-dom@19.2.6(react@19.2.6): |
| 20615 | 19792 | dependencies: |
| 20616 | 19793 | react: 19.2.6 |
| 20617 | 19794 | scheduler: 0.27.0 |
| 20618 | 19795 | |
| 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): | |
| 20620 | 19802 | dependencies: |
| 20621 | react: 19.2.3 | |
| 19803 | react: 19.3.0 | |
| 20622 | 19804 | |
| 20623 | 19805 | react-grab@0.1.44(react@19.2.6): |
| 20624 | 19806 | dependencies: |
| ... | ... | @@ -20627,19 +19809,17 @@ snapshots: |
| 20627 | 19809 | optionalDependencies: |
| 20628 | 19810 | react: 19.2.6 |
| 20629 | 19811 | |
| 20630 | react-is@16.13.1: {} | |
| 20631 | ||
| 20632 | 19812 | react-is@17.0.2: {} |
| 20633 | 19813 | |
| 20634 | 19814 | react-is@18.3.1: {} |
| 20635 | 19815 | |
| 20636 | 19816 | react-is@19.2.7: {} |
| 20637 | 19817 | |
| 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): | |
| 20639 | 19819 | dependencies: |
| 20640 | 19820 | '@types/hast': 3.0.4 |
| 20641 | 19821 | '@types/mdast': 4.0.4 |
| 20642 | '@types/react': 19.2.16 | |
| 19822 | '@types/react': 19.3.0 | |
| 20643 | 19823 | devlop: 1.1.0 |
| 20644 | 19824 | hast-util-to-jsx-runtime: 2.3.6 |
| 20645 | 19825 | html-url-attributes: 3.0.1 |
| ... | ... | @@ -20653,122 +19833,89 @@ snapshots: |
| 20653 | 19833 | transitivePeerDependencies: |
| 20654 | 19834 | - supports-color |
| 20655 | 19835 | |
| 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): | |
| 20657 | 19837 | dependencies: |
| 20658 | '@egjs/hammerjs': 2.0.17 | |
| 20659 | 19838 | '@types/react-test-renderer': 19.1.0 |
| 20660 | hoist-non-react-statics: 3.3.2 | |
| 20661 | 19839 | 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) | |
| 20664 | 19842 | |
| 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): | |
| 20666 | 19844 | 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) | |
| 20669 | 19847 | |
| 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): | |
| 20671 | 19849 | 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) | |
| 20674 | 19852 | |
| 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) | |
| 20681 | 19859 | |
| 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): | |
| 20683 | 19861 | 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) | |
| 20687 | 19865 | 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) | |
| 20689 | 19867 | |
| 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): | |
| 20691 | 19869 | 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) | |
| 20694 | 19872 | |
| 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): | |
| 20696 | 19874 | 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) | |
| 20701 | 19879 | semver: 7.8.5 |
| 20702 | 19880 | |
| 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): | |
| 20704 | 19882 | 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) | |
| 20707 | 19885 | |
| 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): | |
| 20709 | 19887 | 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) | |
| 20713 | 19891 | warn-once: 0.1.1 |
| 20714 | 19892 | |
| 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): | |
| 20716 | 19894 | dependencies: |
| 20717 | 19895 | '@shikijs/types': 4.3.0 |
| 20718 | 19896 | '@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) | |
| 20721 | 19899 | |
| 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): | |
| 20723 | 19901 | dependencies: |
| 20724 | 19902 | css-select: 5.2.2 |
| 20725 | 19903 | 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) | |
| 20733 | 19906 | |
| 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)): | |
| 20735 | 19908 | 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) | |
| 20740 | 19910 | |
| 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): | |
| 20742 | 19912 | dependencies: |
| 20743 | 19913 | escape-string-regexp: 4.0.0 |
| 20744 | 19914 | 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) | |
| 20770 | 19917 | |
| 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): | |
| 20772 | 19919 | dependencies: |
| 20773 | 19920 | '@babel/core': 7.29.7 |
| 20774 | 19921 | '@babel/generator': 7.29.7 |
| ... | ... | @@ -20782,89 +19929,43 @@ snapshots: |
| 20782 | 19929 | '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7) |
| 20783 | 19930 | '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7) |
| 20784 | 19931 | '@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) | |
| 20787 | 19935 | 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) | |
| 20823 | 19938 | semver: 7.8.5 |
| 20824 | stacktrace-parser: 0.1.11 | |
| 20825 | tinyglobby: 0.2.17 | |
| 20826 | 19939 | 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 | |
| 20831 | 19940 | transitivePeerDependencies: |
| 20832 | - '@babel/core' | |
| 20833 | - '@react-native-community/cli' | |
| 20834 | - '@react-native/metro-config' | |
| 20835 | - bufferutil | |
| 20836 | 19941 | - supports-color |
| 20837 | - utf-8-validate | |
| 20838 | 19942 | |
| 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): | |
| 20840 | 19944 | 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) | |
| 20849 | 19951 | anser: 1.4.10 |
| 20850 | 19952 | ansi-regex: 5.0.1 |
| 20851 | babel-plugin-syntax-hermes-parser: 0.36.0 | |
| 20852 | 19953 | base64-js: 1.5.1 |
| 20853 | commander: 12.1.0 | |
| 20854 | 19954 | flow-enums-runtime: 0.0.6 |
| 20855 | hermes-compiler: 250829098.0.17 | |
| 19955 | flow-parser: 0.327.0 | |
| 19956 | hermes-compiler: 260318099.0.4 | |
| 20856 | 19957 | invariant: 2.2.4 |
| 20857 | 19958 | 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 | |
| 20860 | 19961 | nullthrows: 1.1.1 |
| 20861 | 19962 | pretty-format: 29.7.0 |
| 20862 | 19963 | promise: 8.3.0 |
| 20863 | react: 19.2.6 | |
| 19964 | react: 19.3.0 | |
| 20864 | 19965 | react-devtools-core: 6.1.5(bufferutil@4.1.0)(utf-8-validate@6.0.6) |
| 20865 | 19966 | react-refresh: 0.14.2 |
| 20866 | 19967 | regenerator-runtime: 0.13.11 |
| 20867 | scheduler: 0.27.0 | |
| 19968 | scheduler: 0.28.0 | |
| 20868 | 19969 | semver: 7.8.5 |
| 20869 | 19970 | stacktrace-parser: 0.1.11 |
| 20870 | 19971 | tinyglobby: 0.2.17 |
| ... | ... | @@ -20872,7 +19973,7 @@ snapshots: |
| 20872 | 19973 | ws: 7.5.11(bufferutil@4.1.0)(utf-8-validate@6.0.6) |
| 20873 | 19974 | yargs: 17.7.2 |
| 20874 | 19975 | optionalDependencies: |
| 20875 | '@types/react': 19.2.16 | |
| 19976 | '@types/react': 19.3.0 | |
| 20876 | 19977 | transitivePeerDependencies: |
| 20877 | 19978 | - '@babel/core' |
| 20878 | 19979 | - '@react-native-community/cli' |
| ... | ... | @@ -20880,47 +19981,19 @@ snapshots: |
| 20880 | 19981 | - bufferutil |
| 20881 | 19982 | - supports-color |
| 20882 | 19983 | - utf-8-validate |
| 20883 | optional: true | |
| 20884 | 19984 | |
| 20885 | 19985 | react-refresh@0.14.2: {} |
| 20886 | 19986 | |
| 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 | ||
| 20914 | 19987 | react-test-renderer@19.2.6(react@19.2.6): |
| 20915 | 19988 | dependencies: |
| 20916 | 19989 | react: 19.2.6 |
| 20917 | 19990 | react-is: 19.2.7 |
| 20918 | 19991 | scheduler: 0.27.0 |
| 20919 | 19992 | |
| 20920 | react@19.2.3: {} | |
| 20921 | ||
| 20922 | 19993 | react@19.2.6: {} |
| 20923 | 19994 | |
| 19995 | react@19.3.0: {} | |
| 19996 | ||
| 20924 | 19997 | read-binary-file-arch@1.0.6: |
| 20925 | 19998 | dependencies: |
| 20926 | 19999 | debug: 4.4.3 |
| ... | ... | @@ -21206,6 +20279,8 @@ snapshots: |
| 21206 | 20279 | |
| 21207 | 20280 | scheduler@0.27.0: {} |
| 21208 | 20281 | |
| 20282 | scheduler@0.28.0: {} | |
| 20283 | ||
| 21209 | 20284 | schema-utils@4.3.3: |
| 21210 | 20285 | dependencies: |
| 21211 | 20286 | '@types/json-schema': 7.0.15 |
| ... | ... | @@ -21874,20 +20949,20 @@ snapshots: |
| 21874 | 20949 | |
| 21875 | 20950 | universalify@2.0.1: {} |
| 21876 | 20951 | |
| 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): | |
| 21878 | 20953 | dependencies: |
| 21879 | 20954 | '@tailwindcss/node': 4.3.3 |
| 21880 | 20955 | '@tailwindcss/oxide': 4.3.3 |
| 21881 | 20956 | culori: 4.0.2 |
| 21882 | 20957 | 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) | |
| 21887 | 20962 | tailwindcss: 4.3.3 |
| 21888 | 20963 | 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) | |
| 21891 | 20966 | |
| 21892 | 20967 | unpipe@1.0.0: {} |
| 21893 | 20968 | |
| ... | ... | @@ -21939,33 +21014,18 @@ snapshots: |
| 21939 | 21014 | punycode: 2.3.1 |
| 21940 | 21015 | optional: true |
| 21941 | 21016 | |
| 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): | |
| 21950 | 21018 | 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 | |
| 21964 | 21020 | |
| 21965 | 21021 | use-sync-external-store@1.6.0(react@19.2.6): |
| 21966 | 21022 | dependencies: |
| 21967 | 21023 | react: 19.2.6 |
| 21968 | 21024 | |
| 21025 | use-sync-external-store@1.6.0(react@19.3.0): | |
| 21026 | dependencies: | |
| 21027 | react: 19.3.0 | |
| 21028 | ||
| 21969 | 21029 | utf-8-validate@6.0.6: |
| 21970 | 21030 | dependencies: |
| 21971 | 21031 | node-gyp-build: 4.8.4 |
| ... | ... | @@ -21988,15 +21048,6 @@ snapshots: |
| 21988 | 21048 | |
| 21989 | 21049 | vary@1.1.2: {} |
| 21990 | 21050 | |
| 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 | ||
| 22000 | 21051 | vfile-location@5.0.3: |
| 22001 | 21052 | dependencies: |
| 22002 | 21053 | '@types/unist': 3.0.3 |
| ... | ... | @@ -22235,7 +21286,7 @@ snapshots: |
| 22235 | 21286 | |
| 22236 | 21287 | whatwg-mimetype@5.0.0: {} |
| 22237 | 21288 | |
| 22238 | whatwg-url-minimum@0.1.2: {} | |
| 21289 | whatwg-url-minimum@0.2.0: {} | |
| 22239 | 21290 | |
| 22240 | 21291 | whatwg-url@14.2.0: |
| 22241 | 21292 | dependencies: |
| ... | ... | @@ -22461,9 +21512,9 @@ snapshots: |
| 22461 | 21512 | |
| 22462 | 21513 | zod@4.6.5: {} |
| 22463 | 21514 | |
| 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)): | |
| 22465 | 21516 | optionalDependencies: |
| 22466 | '@types/react': 19.2.16 | |
| 21517 | '@types/react': 19.3.0 | |
| 22467 | 21518 | react: 19.2.6 |
| 22468 | 21519 | use-sync-external-store: 1.6.0(react@19.2.6) |
| 22469 | 21520 |
pnpm-workspace.yaml+77-30| ... | ... | @@ -54,6 +54,9 @@ catalog: |
| 54 | 54 | yaml: ^2.9.0 |
| 55 | 55 | |
| 56 | 56 | minimumReleaseAgeExclude: |
| 57 | - expo-glass-effect@58.0.3 | |
| 58 | - expo-blur@58.0.2 | |
| 59 | - expo-audio@58.0.3 | |
| 57 | 60 | - "@clerk/backend@3.18.1" |
| 58 | 61 | - "@clerk/clerk-js@6.32.1" |
| 59 | 62 | - "@clerk/electron@0.0.44" |
| ... | ... | @@ -75,15 +78,40 @@ minimumReleaseAgeExclude: |
| 75 | 78 | - alchemy@2.0.0-beta.79 |
| 76 | 79 | - effect@4.0.0-rc.115 |
| 77 | 80 | - "@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 | |
| 87 | 115 | - electron@44.4.2 |
| 88 | 116 | - "@anthropic-ai/claude-agent-sdk@0.3.276" |
| 89 | 117 | - "@alchemy.run/cloudflare-runtime@2.0.0-beta.79" |
| ... | ... | @@ -96,6 +124,29 @@ minimumReleaseAgeExclude: |
| 96 | 124 | - "@distilled.cloud/stripe@1.0.0-rc.12" |
| 97 | 125 | - "@shadcn/lint@0.1.5" |
| 98 | 126 | - 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" | |
| 99 | 150 | |
| 100 | 151 | overrides: |
| 101 | 152 | # Keep jsdom's optional peer consistent so Vite+ has one test-runner instance. |
| ... | ... | @@ -143,11 +194,12 @@ overrides: |
| 143 | 194 | "@effect/sql-pg": "catalog:" |
| 144 | 195 | "@effect/vitest": "catalog:" |
| 145 | 196 | "@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 | |
| 151 | 203 | "@pierre/diffs>@shikijs/transformers": ^4.2.0 |
| 152 | 204 | # Keep one copy of these native-binary packages. lightningcss ships 11 platform binaries per |
| 153 | 205 | # version, and the workspaces' tailwindcss ^4 ranges drift into two 4.3.x copies of the family. |
| ... | ... | @@ -156,9 +208,6 @@ overrides: |
| 156 | 208 | "@tailwindcss/vite": "catalog:" |
| 157 | 209 | "@types/node": "catalog:" |
| 158 | 210 | 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 | |
| 162 | 211 | node-abi: 4.33.0 |
| 163 | 212 | lightningcss: "catalog:" |
| 164 | 213 | tailwindcss: "catalog:" |
| ... | ... | @@ -168,7 +217,7 @@ overrides: |
| 168 | 217 | packageExtensions: |
| 169 | 218 | "@clerk/expo@*": |
| 170 | 219 | dependencies: |
| 171 | "@expo/config-plugins": 57.0.9 | |
| 220 | "@expo/config-plugins": 58.0.4 | |
| 172 | 221 | "@effect/vitest@*": |
| 173 | 222 | dependencies: |
| 174 | 223 | vite-plus: "catalog:" |
| ... | ... | @@ -181,9 +230,14 @@ packageExtensions: |
| 181 | 230 | |
| 182 | 231 | patchedDependencies: |
| 183 | 232 | 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 | |
| 184 | 236 | "@clerk/expo@4.6.8": patches/@clerk__expo@4.6.8.patch |
| 185 | 237 | "@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 | |
| 187 | 241 | "@ff-labs/fff-node@0.9.4": patches/@ff-labs__fff-node@0.9.4.patch |
| 188 | 242 | "@legendapp/list@3.3.5": patches/@legendapp__list@3.3.5.patch |
| 189 | 243 | "@pierre/diffs@1.3.0-beta.10": patches/@pierre%2Fdiffs@1.3.0-beta.10.patch |
| ... | ... | @@ -192,20 +246,13 @@ patchedDependencies: |
| 192 | 246 | "@react-navigation/native-stack@7.17.6": patches/@react-navigation%2Fnative-stack@7.17.6.patch |
| 193 | 247 | dbus-next@0.10.2: patches/dbus-next@0.10.2.patch |
| 194 | 248 | 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 | |
| 200 | 249 | 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 | |
| 204 | 250 | # Link http(s) URLs with a port or a single-label host. md4c otherwise requires a dotted host and stops at ':'. |
| 205 | 251 | 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 | |
| 209 | 256 | uniwind@1.11.0: patches/uniwind@1.11.0.patch |
| 210 | 257 | |
| 211 | 258 | peerDependencyRules: |
third-party-licenses.config.json+81| ... | ... | @@ -473,6 +473,87 @@ |
| 473 | 473 | "licenseId": "MIT", |
| 474 | 474 | "copyrights": ["Copyright (c) 2025 opencode"] |
| 475 | 475 | } |
| 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 | } | |
| 476 | 557 | } |
| 477 | 558 | ] |
| 478 | 559 | } |