| 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,6 +401,9 @@ const config: ExpoConfig = { |
| 401 | android: { | 401 | android: { |
| 402 | // Keep the supported floor explicit and covered by native notification tests. | 402 | // Keep the supported floor explicit and covered by native notification tests. |
| 403 | minSdkVersion: 24, | 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 | ios: { | 408 | ios: { |
| 406 | deploymentTarget: "18.0", | 409 | deploymentTarget: "18.0", |
| ... | @@ -419,7 +422,6 @@ const config: ExpoConfig = { | ... | @@ -419,7 +422,6 @@ const config: ExpoConfig = { |
| 419 | // would delete the asset catalog) and its xcodeproj mod creates the widget | 422 | // would delete the asset catalog) and its xcodeproj mod creates the widget |
| 420 | // target (which must exist before the compile phase can be attached). | 423 | // target (which must exist before the compile phase can be attached). |
| 421 | ...(!isIosPersonalTeamBuild ? ["./plugins/withWidgetLogoAsset.cjs", widgetsPlugin] : []), | 424 | ...(!isIosPersonalTeamBuild ? ["./plugins/withWidgetLogoAsset.cjs", widgetsPlugin] : []), |
| 422 | "./plugins/withIosSceneLifecycle.cjs", | ||
| 423 | "./plugins/withAndroidCleartextTraffic.cjs", | 425 | "./plugins/withAndroidCleartextTraffic.cjs", |
| 424 | "./plugins/withAndroidGradleHeap.cjs", | 426 | "./plugins/withAndroidGradleHeap.cjs", |
| 425 | "./plugins/withAndroidInputBackground.cjs", | 427 | "./plugins/withAndroidInputBackground.cjs", |
apps/mobile/modules/t3-markdown-text/ios/T3MarkdownText.mm+1-1| ... | @@ -10,7 +10,7 @@ | ... | @@ -10,7 +10,7 @@ |
| 10 | #import <react/renderer/components/T3MarkdownTextSpec/EventEmitters.h> | 10 | #import <react/renderer/components/T3MarkdownTextSpec/EventEmitters.h> |
| 11 | #import <react/renderer/components/T3MarkdownTextSpec/Props.h> | 11 | #import <react/renderer/components/T3MarkdownTextSpec/Props.h> |
| 12 | #import <react/renderer/components/T3MarkdownTextSpec/RCTComponentViewHelpers.h> | 12 | #import <react/renderer/components/T3MarkdownTextSpec/RCTComponentViewHelpers.h> |
| 13 | #import "RCTFabricComponentsPlugins.h" | 13 | #import <React/RCTFabricComponentsPlugins.h> |
| 14 | 14 | ||
| 15 | using namespace facebook::react; | 15 | using namespace facebook::react; |
| 16 | 16 |
apps/mobile/modules/t3-markdown-text/ios/T3MarkdownTextManager.mm-1| ... | @@ -1,6 +1,5 @@ | ... | @@ -1,6 +1,5 @@ |
| 1 | #import <React/RCTViewManager.h> | 1 | #import <React/RCTViewManager.h> |
| 2 | #import <React/RCTUIManager.h> | 2 | #import <React/RCTUIManager.h> |
| 3 | #import "RCTBridge.h" | ||
| 4 | #import "Utils.h" | 3 | #import "Utils.h" |
| 5 | 4 | ||
| 6 | @interface T3MarkdownTextManager : RCTViewManager | 5 | @interface T3MarkdownTextManager : RCTViewManager |
apps/mobile/modules/t3-markdown-text/ios/T3MarkdownTextRun.mm+1-1| ... | @@ -4,7 +4,7 @@ | ... | @@ -4,7 +4,7 @@ |
| 4 | #import <react/renderer/components/T3MarkdownTextSpec/EventEmitters.h> | 4 | #import <react/renderer/components/T3MarkdownTextSpec/EventEmitters.h> |
| 5 | #import <react/renderer/components/T3MarkdownTextSpec/Props.h> | 5 | #import <react/renderer/components/T3MarkdownTextSpec/Props.h> |
| 6 | #import <react/renderer/components/T3MarkdownTextSpec/RCTComponentViewHelpers.h> | 6 | #import <react/renderer/components/T3MarkdownTextSpec/RCTComponentViewHelpers.h> |
| 7 | #import "RCTFabricComponentsPlugins.h" | 7 | #import <React/RCTFabricComponentsPlugins.h> |
| 8 | #import "Utils.h" | 8 | #import "Utils.h" |
| 9 | 9 | ||
| 10 | using namespace facebook::react; | 10 | using namespace facebook::react; |
apps/mobile/modules/t3-markdown-text/src/MarkdownTextPrimitive.tsx+9-4| ... | @@ -6,6 +6,7 @@ import { | ... | @@ -6,6 +6,7 @@ import { |
| 6 | StyleSheet, | 6 | StyleSheet, |
| 7 | Text as RNText, | 7 | Text as RNText, |
| 8 | type ColorValue, | 8 | type ColorValue, |
| 9 | type TextInstance, | ||
| 9 | type TextProps, | 10 | type TextProps, |
| 10 | type ViewStyle, | 11 | type ViewStyle, |
| 11 | } from "react-native"; | 12 | } from "react-native"; |
| ... | @@ -43,7 +44,7 @@ export type ContextMenuActionEvent = { | ... | @@ -43,7 +44,7 @@ export type ContextMenuActionEvent = { |
| 43 | * while the React Native Text fallback reports measured `TextLayoutLine`s. | 44 | * while the React Native Text fallback reports measured `TextLayoutLine`s. |
| 44 | */ | 45 | */ |
| 45 | export type MarkdownTextPrimitiveProps = Omit<TextProps, "onTextLayout"> & { | 46 | export type MarkdownTextPrimitiveProps = Omit<TextProps, "onTextLayout"> & { |
| 46 | nativeTextRef?: Ref<RNText>; | 47 | nativeTextRef?: Ref<TextInstance>; |
| 47 | selectionHandleColor?: ColorValue; | 48 | selectionHandleColor?: ColorValue; |
| 48 | uiTextView?: boolean; | 49 | uiTextView?: boolean; |
| 49 | contextMenuConfig?: string; | 50 | contextMenuConfig?: string; |
| ... | @@ -134,13 +135,17 @@ function AndroidMarkdownText({ | ... | @@ -134,13 +135,17 @@ function AndroidMarkdownText({ |
| 134 | contextClipboardConfig: _contextClipboardConfig, | 135 | contextClipboardConfig: _contextClipboardConfig, |
| 135 | ...props | 136 | ...props |
| 136 | }: MarkdownTextPrimitiveProps) { | 137 | }: MarkdownTextPrimitiveProps) { |
| 137 | const textRef = React.useRef<RNText | null>(null); | 138 | const textRef = React.useRef<TextInstance | null>(null); |
| 138 | React.useImperativeHandle<RNText | null, RNText | null>(nativeTextRef, () => textRef.current, []); | 139 | React.useImperativeHandle<TextInstance | null, TextInstance | null>( |
| 140 | nativeTextRef, | ||
| 141 | () => textRef.current, | ||
| 142 | [], | ||
| 143 | ); | ||
| 139 | const color = processColor(selectionHandleColor); | 144 | const color = processColor(selectionHandleColor); |
| 140 | const applyHandleColor = React.useCallback(() => { | 145 | const applyHandleColor = React.useCallback(() => { |
| 141 | if (!textRef.current || typeof color !== "number") return; | 146 | if (!textRef.current || typeof color !== "number") return; |
| 142 | const reactTag = findNodeHandle(textRef.current); | 147 | const reactTag = findNodeHandle(textRef.current); |
| 143 | if (reactTag !== null) setMarkdownSelectionHandleColor(reactTag, color); | 148 | if (reactTag != null) setMarkdownSelectionHandleColor(reactTag, color); |
| 144 | }, [color]); | 149 | }, [color]); |
| 145 | 150 | ||
| 146 | // RN's selectionColor only sets the highlight. Retint mounted handles when | 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,14 +6,14 @@ import { |
| 6 | Linking, | 6 | Linking, |
| 7 | Platform, | 7 | Platform, |
| 8 | StyleSheet, | 8 | StyleSheet, |
| 9 | Text as RNText, | 9 | type TextInstance, |
| 10 | type TextStyle, | 10 | type TextStyle, |
| 11 | useColorScheme, | 11 | useColorScheme, |
| 12 | View, | 12 | View, |
| 13 | } from "react-native"; | 13 | } from "react-native"; |
| 14 | 14 | ||
| 15 | import { MarkdownTextPrimitive } from "./MarkdownTextPrimitive"; | 15 | import { MarkdownTextPrimitive } from "./MarkdownTextPrimitive"; |
| 16 | import { markdownFileIconSource } from "./markdownFileIcons"; | 16 | import { markdownFileIconSource, markdownIconAssetUri } from "./markdownFileIcons"; |
| 17 | import { markdownLinkIconSource } from "./markdownLinkIcons"; | 17 | import { markdownLinkIconSource } from "./markdownLinkIcons"; |
| 18 | import { resolveMarkdownFileIcon, resolveMarkdownLinkIcon } from "./markdownLinks"; | 18 | import { resolveMarkdownFileIcon, resolveMarkdownLinkIcon } from "./markdownLinks"; |
| 19 | import type { NativeMarkdownTextRun } from "./nativeMarkdownText"; | 19 | import type { NativeMarkdownTextRun } from "./nativeMarkdownText"; |
| ... | @@ -236,11 +236,11 @@ export function NativeMarkdownSelectableText(props: { | ... | @@ -236,11 +236,11 @@ export function NativeMarkdownSelectableText(props: { |
| 236 | interactive: Boolean(run.href), | 236 | interactive: Boolean(run.href), |
| 237 | iconUri: | 237 | iconUri: |
| 238 | !contextReference && run.fileIcon | 238 | !contextReference && run.fileIcon |
| 239 | ? Image.resolveAssetSource(markdownFileIconSource(run.fileIcon)).uri | 239 | ? markdownIconAssetUri(markdownFileIconSource(run.fileIcon)) |
| 240 | : contextRecord?.kind === "mention" && "path" in contextRecord | 240 | : contextRecord?.kind === "mention" && "path" in contextRecord |
| 241 | ? Image.resolveAssetSource( | 241 | ? markdownIconAssetUri( |
| 242 | markdownFileIconSource(resolveMarkdownFileIcon(contextRecord.path)), | 242 | markdownFileIconSource(resolveMarkdownFileIcon(contextRecord.path)), |
| 243 | ).uri | 243 | ) |
| 244 | : undefined, | 244 | : undefined, |
| 245 | fontSize: props.textStyle.fontSize * 0.8, | 245 | fontSize: props.textStyle.fontSize * 0.8, |
| 246 | foreground: props.textStyle.color, | 246 | foreground: props.textStyle.color, |
| ... | @@ -297,10 +297,12 @@ export function NativeMarkdownSelectableText(props: { | ... | @@ -297,10 +297,12 @@ export function NativeMarkdownSelectableText(props: { |
| 297 | ? JSON.stringify({ fragment: contextClipboardFragment, ranges }) | 297 | ? JSON.stringify({ fragment: contextClipboardFragment, ranges }) |
| 298 | : ""; | 298 | : ""; |
| 299 | const attachAndroidText = useCallback( | 299 | const attachAndroidText = useCallback( |
| 300 | (textView: RNText | null) => { | 300 | (textView: TextInstance | null) => { |
| 301 | if (Platform.OS !== "android" || !containsInlineIcon || !textView) return; | 301 | if (Platform.OS !== "android" || !containsInlineIcon || !textView) return; |
| 302 | const reactTag = findNodeHandle(textView); | 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 | [containsInlineIcon, contextClipboardConfig], | 307 | [containsInlineIcon, contextClipboardConfig], |
| 306 | ); | 308 | ); |
| ... | @@ -358,6 +360,12 @@ export function NativeMarkdownSelectableText(props: { | ... | @@ -358,6 +360,12 @@ export function NativeMarkdownSelectableText(props: { |
| 358 | else void Linking.openURL(href); | 360 | else void Linking.openURL(href); |
| 359 | } | 361 | } |
| 360 | : undefined; | 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 | return ( | 369 | return ( |
| 362 | <MarkdownTextPrimitive | 370 | <MarkdownTextPrimitive |
| 363 | key={key} | 371 | key={key} |
| ... | @@ -366,12 +374,12 @@ export function NativeMarkdownSelectableText(props: { | ... | @@ -366,12 +374,12 @@ export function NativeMarkdownSelectableText(props: { |
| 366 | Platform.OS === "ios" | 374 | Platform.OS === "ios" |
| 367 | ? chip | 375 | ? chip |
| 368 | ? `t3-chip:${JSON.stringify(chip)}` | 376 | ? `t3-chip:${JSON.stringify(chip)}` |
| 369 | : run.fileIcon | 377 | : fileIconUri |
| 370 | ? `t3-file:${Image.resolveAssetSource(markdownFileIconSource(run.fileIcon)).uri}` | 378 | ? `t3-file:${fileIconUri}` |
| 371 | : run.skillName | 379 | : run.skillName |
| 372 | ? "t3-skill:sf:cube" | 380 | ? "t3-skill:sf:cube" |
| 373 | : linkIcon | 381 | : linkIconUri |
| 374 | ? `t3-link:${Image.resolveAssetSource(markdownLinkIconSource(linkIcon)).uri}` | 382 | ? `t3-link:${linkIconUri}` |
| 375 | : undefined | 383 | : undefined |
| 376 | : undefined | 384 | : undefined |
| 377 | } | 385 | } |
apps/mobile/modules/t3-markdown-text/src/T3MarkdownTextNativeComponent.ts+9-15| ... | @@ -1,13 +1,7 @@ | ... | @@ -1,13 +1,7 @@ |
| 1 | import codegenNativeComponent from "react-native/Libraries/Utilities/codegenNativeComponent"; | 1 | import { codegenNativeComponent, type CodegenTypes, type ViewProps } from "react-native"; |
| 2 | import type { ViewProps } from "react-native"; | ||
| 3 | import type { | ||
| 4 | BubblingEventHandler, | ||
| 5 | Int32, | ||
| 6 | WithDefault, | ||
| 7 | } from "react-native/Libraries/Types/CodegenTypes"; | ||
| 8 | 2 | ||
| 9 | interface TargetedEvent { | 3 | interface TargetedEvent { |
| 10 | target: Int32; | 4 | target: CodegenTypes.Int32; |
| 11 | } | 5 | } |
| 12 | 6 | ||
| 13 | interface TextLayoutEvent extends TargetedEvent { | 7 | interface TextLayoutEvent extends TargetedEvent { |
| ... | @@ -21,19 +15,19 @@ interface TextLayoutEvent extends TargetedEvent { | ... | @@ -21,19 +15,19 @@ interface TextLayoutEvent extends TargetedEvent { |
| 21 | * @property end - The end index of the selected range (0-based, exclusive) | 15 | * @property end - The end index of the selected range (0-based, exclusive) |
| 22 | */ | 16 | */ |
| 23 | interface SelectionChangeEvent extends TargetedEvent { | 17 | interface SelectionChangeEvent extends TargetedEvent { |
| 24 | start: Int32; | 18 | start: CodegenTypes.Int32; |
| 25 | end: Int32; | 19 | end: CodegenTypes.Int32; |
| 26 | } | 20 | } |
| 27 | 21 | ||
| 28 | type EllipsizeMode = "head" | "middle" | "tail" | "clip"; | 22 | type EllipsizeMode = "head" | "middle" | "tail" | "clip"; |
| 29 | 23 | ||
| 30 | interface NativeProps extends ViewProps { | 24 | interface NativeProps extends ViewProps { |
| 31 | contextClipboardConfig?: string; | 25 | contextClipboardConfig?: string; |
| 32 | numberOfLines?: Int32; | 26 | numberOfLines?: CodegenTypes.Int32; |
| 33 | allowFontScaling?: WithDefault<boolean, true>; | 27 | allowFontScaling?: CodegenTypes.WithDefault<boolean, true>; |
| 34 | ellipsizeMode?: WithDefault<EllipsizeMode, "tail">; | 28 | ellipsizeMode?: CodegenTypes.WithDefault<EllipsizeMode, "tail">; |
| 35 | selectable?: boolean; | 29 | selectable?: boolean; |
| 36 | onTextLayout?: BubblingEventHandler<TextLayoutEvent>; | 30 | onTextLayout?: CodegenTypes.BubblingEventHandler<TextLayoutEvent>; |
| 37 | /** | 31 | /** |
| 38 | * Callback fired when the text selection changes. | 32 | * Callback fired when the text selection changes. |
| 39 | * | 33 | * |
| ... | @@ -48,7 +42,7 @@ interface NativeProps extends ViewProps { | ... | @@ -48,7 +42,7 @@ interface NativeProps extends ViewProps { |
| 48 | * </MarkdownTextPrimitive> | 42 | * </MarkdownTextPrimitive> |
| 49 | * ``` | 43 | * ``` |
| 50 | */ | 44 | */ |
| 51 | onSelectionChange?: BubblingEventHandler<SelectionChangeEvent>; | 45 | onSelectionChange?: CodegenTypes.BubblingEventHandler<SelectionChangeEvent>; |
| 52 | } | 46 | } |
| 53 | 47 | ||
| 54 | export default codegenNativeComponent<NativeProps>("T3MarkdownText", { | 48 | export default codegenNativeComponent<NativeProps>("T3MarkdownText", { |
apps/mobile/modules/t3-markdown-text/src/T3MarkdownTextRunNativeComponent.ts+19-21| ... | @@ -1,14 +1,12 @@ | ... | @@ -1,14 +1,12 @@ |
| 1 | import type { ColorValue, ViewProps } from "react-native"; | 1 | import { |
| 2 | import type { | 2 | codegenNativeComponent, |
| 3 | BubblingEventHandler, | 3 | type CodegenTypes, |
| 4 | Float, | 4 | type ColorValue, |
| 5 | Int32, | 5 | type ViewProps, |
| 6 | WithDefault, | 6 | } from "react-native"; |
| 7 | } from "react-native/Libraries/Types/CodegenTypes"; | ||
| 8 | import codegenNativeComponent from "react-native/Libraries/Utilities/codegenNativeComponent"; | ||
| 9 | 7 | ||
| 10 | interface TargetedEvent { | 8 | interface TargetedEvent { |
| 11 | target: Int32; | 9 | target: CodegenTypes.Int32; |
| 12 | } | 10 | } |
| 13 | 11 | ||
| 14 | interface ContextMenuActionEvent extends TargetedEvent { | 12 | interface ContextMenuActionEvent extends TargetedEvent { |
| ... | @@ -35,21 +33,21 @@ type TextAlign = "auto" | "left" | "right" | "center" | "justify"; | ... | @@ -35,21 +33,21 @@ type TextAlign = "auto" | "left" | "right" | "center" | "justify"; |
| 35 | interface NativeProps extends ViewProps { | 33 | interface NativeProps extends ViewProps { |
| 36 | text: string; | 34 | text: string; |
| 37 | color?: ColorValue; | 35 | color?: ColorValue; |
| 38 | fontSize?: Float; | 36 | fontSize?: CodegenTypes.Float; |
| 39 | fontStyle?: WithDefault<FontStyle, "normal">; | 37 | fontStyle?: CodegenTypes.WithDefault<FontStyle, "normal">; |
| 40 | fontWeight?: WithDefault<NativeFontWeight, "normal">; | 38 | fontWeight?: CodegenTypes.WithDefault<NativeFontWeight, "normal">; |
| 41 | fontFamily?: string; | 39 | fontFamily?: string; |
| 42 | letterSpacing?: Float; | 40 | letterSpacing?: CodegenTypes.Float; |
| 43 | lineHeight?: Float; | 41 | lineHeight?: CodegenTypes.Float; |
| 44 | textDecorationLine?: WithDefault<TextDecorationLine, "none">; | 42 | textDecorationLine?: CodegenTypes.WithDefault<TextDecorationLine, "none">; |
| 45 | textDecorationStyle?: WithDefault<TextDecorationStyle, "solid">; | 43 | textDecorationStyle?: CodegenTypes.WithDefault<TextDecorationStyle, "solid">; |
| 46 | textDecorationColor?: ColorValue; | 44 | textDecorationColor?: ColorValue; |
| 47 | textAlign?: WithDefault<TextAlign, "auto">; | 45 | textAlign?: CodegenTypes.WithDefault<TextAlign, "auto">; |
| 48 | shadowRadius?: WithDefault<Float, 0>; | 46 | shadowRadius?: CodegenTypes.WithDefault<CodegenTypes.Float, 0>; |
| 49 | contextMenuConfig?: string; | 47 | contextMenuConfig?: string; |
| 50 | onPress?: BubblingEventHandler<TargetedEvent>; | 48 | onPress?: CodegenTypes.BubblingEventHandler<TargetedEvent>; |
| 51 | onLongPress?: BubblingEventHandler<TargetedEvent>; | 49 | onLongPress?: CodegenTypes.BubblingEventHandler<TargetedEvent>; |
| 52 | onContextMenuAction?: BubblingEventHandler<ContextMenuActionEvent>; | 50 | onContextMenuAction?: CodegenTypes.BubblingEventHandler<ContextMenuActionEvent>; |
| 53 | } | 51 | } |
| 54 | 52 | ||
| 55 | export default codegenNativeComponent<NativeProps>("T3MarkdownTextRun", { | 53 | export default codegenNativeComponent<NativeProps>("T3MarkdownTextRun", { |
apps/mobile/modules/t3-markdown-text/src/markdownFileIcons.ts+10-1| ... | @@ -1,4 +1,4 @@ | ... | @@ -1,4 +1,4 @@ |
| 1 | import type { ImageSourcePropType } from "react-native"; | 1 | import { Image, type ImageSourcePropType } from "react-native"; |
| 2 | 2 | ||
| 3 | import type { MarkdownFileIcon } from "./markdownLinks"; | 3 | import type { MarkdownFileIcon } from "./markdownLinks"; |
| 4 | import { MARKDOWN_FILE_ICON_SOURCES } from "./markdownFileIcons.generated"; | 4 | import { MARKDOWN_FILE_ICON_SOURCES } from "./markdownFileIcons.generated"; |
| ... | @@ -6,3 +6,12 @@ import { MARKDOWN_FILE_ICON_SOURCES } from "./markdownFileIcons.generated"; | ... | @@ -6,3 +6,12 @@ import { MARKDOWN_FILE_ICON_SOURCES } from "./markdownFileIcons.generated"; |
| 6 | export function markdownFileIconSource(icon: MarkdownFileIcon): ImageSourcePropType { | 6 | export function markdownFileIconSource(icon: MarkdownFileIcon): ImageSourcePropType { |
| 7 | return MARKDOWN_FILE_ICON_SOURCES[icon]; | 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,7 +49,8 @@ |
| 49 | "@clerk/expo": "catalog:", | 49 | "@clerk/expo": "catalog:", |
| 50 | "@effect/atom-react": "catalog:", | 50 | "@effect/atom-react": "catalog:", |
| 51 | "@expo-google-fonts/dm-sans": "^0.4.2", | 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 | "@legendapp/list": "catalog:", | 54 | "@legendapp/list": "catalog:", |
| 54 | "@material/material-color-utilities": "0.3.0", | 55 | "@material/material-color-utilities": "0.3.0", |
| 55 | "@noble/curves": "catalog:", | 56 | "@noble/curves": "catalog:", |
| ... | @@ -73,56 +74,56 @@ | ... | @@ -73,56 +74,56 @@ |
| 73 | "clsx": "^2.1.1", | 74 | "clsx": "^2.1.1", |
| 74 | "diff": "8.0.3", | 75 | "diff": "8.0.3", |
| 75 | "effect": "catalog:", | 76 | "effect": "catalog:", |
| 76 | "expo": "~57.0.18", | 77 | "expo": "58.0.0", |
| 77 | "expo-asset": "~57.0.15", | 78 | "expo-asset": "~58.0.9", |
| 78 | "expo-audio": "57.0.4", | 79 | "expo-audio": "58.0.3", |
| 79 | "expo-auth-session": "~57.0.10", | 80 | "expo-auth-session": "~58.0.6", |
| 80 | "expo-blur": "~57.0.2", | 81 | "expo-blur": "58.0.2", |
| 81 | "expo-build-properties": "~57.0.15", | 82 | "expo-build-properties": "~58.0.9", |
| 82 | "expo-camera": "~57.0.4", | 83 | "expo-camera": "~58.0.5", |
| 83 | "expo-clipboard": "~57.0.1", | 84 | "expo-clipboard": "~58.0.2", |
| 84 | "expo-constants": "~57.0.16", | 85 | "expo-constants": "~58.0.9", |
| 85 | "expo-crypto": "~57.0.2", | 86 | "expo-crypto": "~58.0.3", |
| 86 | "expo-dev-client": "~57.0.16", | 87 | "expo-dev-client": "~58.0.9", |
| 87 | "expo-device": "~57.0.1", | 88 | "expo-device": "~58.0.3", |
| 88 | "expo-document-picker": "~57.0.1", | 89 | "expo-document-picker": "~58.0.3", |
| 89 | "expo-file-system": "~57.0.6", | 90 | "expo-file-system": "~58.0.4", |
| 90 | "expo-font": "~57.0.2", | 91 | "expo-font": "~58.0.4", |
| 91 | "expo-glass-effect": "~57.0.1", | 92 | "expo-glass-effect": "58.0.3", |
| 92 | "expo-haptics": "~57.0.2", | 93 | "expo-haptics": "~58.0.3", |
| 93 | "expo-image": "~57.0.3", | 94 | "expo-image": "~58.0.8", |
| 94 | "expo-image-manipulator": "~57.0.17", | 95 | "expo-image-manipulator": "~58.0.10", |
| 95 | "expo-image-picker": "~57.0.14", | 96 | "expo-image-picker": "~58.0.9", |
| 96 | "expo-keep-awake": "~57.0.2", | 97 | "expo-keep-awake": "~58.0.2", |
| 97 | "expo-linking": "~57.0.8", | 98 | "expo-linking": "~58.0.9", |
| 98 | "expo-network": "~57.0.1", | 99 | "expo-network": "~58.0.2", |
| 99 | "expo-notifications": "57.0.15", | 100 | "expo-notifications": "~58.0.9", |
| 100 | "expo-paste-input": "^0.1.15", | 101 | "expo-paste-input": "^0.1.15", |
| 101 | "expo-quick-actions": "^6.0.2", | 102 | "expo-quick-actions": "^6.0.2", |
| 102 | "expo-secure-store": "~57.0.2", | 103 | "expo-secure-store": "~58.0.1", |
| 103 | "expo-sharing": "57.0.17", | 104 | "expo-sharing": "58.0.12", |
| 104 | "expo-splash-screen": "~57.0.8", | 105 | "expo-splash-screen": "~58.0.2", |
| 105 | "expo-sqlite": "~57.0.2", | 106 | "expo-sqlite": "~58.0.7", |
| 106 | "expo-symbols": "~57.0.2", | 107 | "expo-symbols": "~58.0.3", |
| 107 | "expo-updates": "~57.0.19", | 108 | "expo-updates": "~58.0.11", |
| 108 | "expo-video": "~57.0.3", | 109 | "expo-video": "~58.0.5", |
| 109 | "expo-web-browser": "~57.0.2", | 110 | "expo-web-browser": "~58.0.3", |
| 110 | "expo-widgets": "57.0.15", | 111 | "expo-widgets": "58.0.9", |
| 111 | "react": "19.2.3", | 112 | "react": "19.3.0", |
| 112 | "react-dom": "19.2.3", | 113 | "react-dom": "19.3.0", |
| 113 | "react-native": "0.86.3", | 114 | "react-native": "0.88.0-rc.3", |
| 114 | "react-native-gesture-handler": "~2.32.0", | 115 | "react-native-gesture-handler": "~3.2.1", |
| 115 | "react-native-image-viewing": "^0.2.2", | 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 | "react-native-nitro-markdown": "^0.5.0", | 118 | "react-native-nitro-markdown": "^0.5.0", |
| 118 | "react-native-nitro-modules": "0.35.9", | 119 | "react-native-nitro-modules": "0.35.9", |
| 119 | "react-native-reanimated": "4.5.5", | 120 | "react-native-reanimated": "4.7.0", |
| 120 | "react-native-safe-area-context": "~5.7.0", | 121 | "react-native-safe-area-context": "~5.9.1", |
| 121 | "react-native-screens": "~4.26.0", | 122 | "react-native-screens": "~4.28.0", |
| 122 | "react-native-shiki-engine": "^0.3.12", | 123 | "react-native-shiki-engine": "^0.3.12", |
| 123 | "react-native-svg": "15.15.4", | 124 | "react-native-svg": "15.15.5", |
| 124 | "react-native-webview": "^13.16.1", | 125 | "react-native-webview": "14.0.1", |
| 125 | "react-native-worklets": "0.11.4", | 126 | "react-native-worklets": "0.13.0", |
| 126 | "shiki": "4.2.0", | 127 | "shiki": "4.2.0", |
| 127 | "tailwind-merge": "^3.5.0", | 128 | "tailwind-merge": "^3.5.0", |
| 128 | "uniwind": "1.11.0" | 129 | "uniwind": "1.11.0" |
| ... | @@ -130,9 +131,9 @@ | ... | @@ -130,9 +131,9 @@ |
| 130 | "devDependencies": { | 131 | "devDependencies": { |
| 131 | "@effect/vitest": "catalog:", | 132 | "@effect/vitest": "catalog:", |
| 132 | "@pierre/trees": "1.0.0-beta.4", | 133 | "@pierre/trees": "1.0.0-beta.4", |
| 133 | "@types/react": "~19.2.0", | 134 | "@types/react": "~19.3.0", |
| 134 | "@types/react-dom": "~19.2.3", | 135 | "@types/react-dom": "~19.2.3", |
| 135 | "babel-preset-expo": "~57.0.9", | 136 | "babel-preset-expo": "~58.0.6", |
| 136 | "tailwindcss": "^4.0.0", | 137 | "tailwindcss": "^4.0.0", |
| 137 | "typescript": "catalog:" | 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,10 +76,7 @@ function AppContent() { |
| 76 | <GestureHandlerRootView className="flex-1"> | 76 | <GestureHandlerRootView className="flex-1"> |
| 77 | <KeyboardProvider statusBarTranslucent> | 77 | <KeyboardProvider statusBarTranslucent> |
| 78 | <SafeAreaProvider> | 78 | <SafeAreaProvider> |
| 79 | <StatusBar | 79 | <StatusBar barStyle={themeAppearance === "dark" ? "light-content" : "dark-content"} /> |
| 80 | barStyle={themeAppearance === "dark" ? "light-content" : "dark-content"} | ||
| 81 | translucent | ||
| 82 | /> | ||
| 83 | {/* The navigation theme drives the NATIVE header appearance: native-stack | 80 | {/* The navigation theme drives the NATIVE header appearance: native-stack |
| 84 | forwards `dark` as the nav bar's overrideUserInterfaceStyle. Without | 81 | forwards `dark` as the nav bar's overrideUserInterfaceStyle. Without |
| 85 | this, React Navigation defaults to its light theme and every native | 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,7 +520,12 @@ function RootStackLayout(props: { |
| 520 | const navigation = useNavigation(); | 520 | const navigation = useNavigation(); |
| 521 | const { pendingShare } = useIncomingShare(); | 521 | const { pendingShare } = useIncomingShare(); |
| 522 | const sharePresentationRef = useRef(EMPTY_INCOMING_SHARE_PRESENTATION_STATE); | 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 | // Presents the T3 Connect onboarding sheet after an in-session sign-in. | 529 | // Presents the T3 Connect onboarding sheet after an in-session sign-in. |
| 525 | useConnectOnboardingNavigation(); | 530 | useConnectOnboardingNavigation(); |
| 526 | // Launcher app shortcuts: routes shortcut taps and tracks opened threads. | 531 | // Launcher app shortcuts: routes shortcut taps and tracks opened threads. |
| ... | @@ -540,11 +545,6 @@ function RootStackLayout(props: { | ... | @@ -540,11 +545,6 @@ function RootStackLayout(props: { |
| 540 | params: { incomingShareId: transition.shareIdToPresent }, | 545 | params: { incomingShareId: transition.shareIdToPresent }, |
| 541 | }); | 546 | }); |
| 542 | }, [navigation, pendingShare, props.state]); | 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 | return ( | 549 | return ( |
| 550 | <HardwareKeyboardCommandProvider pathname={pathname}> | 550 | <HardwareKeyboardCommandProvider pathname={pathname}> |
apps/mobile/src/components/AndroidAnchoredMenu.tsx+3-3| ... | @@ -1,7 +1,7 @@ | ... | @@ -1,7 +1,7 @@ |
| 1 | import type { MenuAction, MenuComponentProps } from "@react-native-menu/menu"; | 1 | import type { MenuAction, MenuComponentProps } from "@react-native-menu/menu"; |
| 2 | import type { ReactNode } from "react"; | 2 | import type { ReactNode } from "react"; |
| 3 | import { useCallback, useEffect, useRef, useState } from "react"; | 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 | import { BackHandler, Pressable, ScrollView, View } from "react-native"; | 5 | import { BackHandler, Pressable, ScrollView, View } from "react-native"; |
| 6 | import { useKeyboardState } from "react-native-keyboard-controller"; | 6 | import { useKeyboardState } from "react-native-keyboard-controller"; |
| 7 | import Animated, { FadeIn } from "react-native-reanimated"; | 7 | import Animated, { FadeIn } from "react-native-reanimated"; |
| ... | @@ -73,8 +73,8 @@ export function AndroidAnchoredMenu(props: AndroidAnchoredMenuProps) { | ... | @@ -73,8 +73,8 @@ export function AndroidAnchoredMenu(props: AndroidAnchoredMenuProps) { |
| 73 | overlay === null | 73 | overlay === null |
| 74 | ? desiredMenuWidth | 74 | ? desiredMenuWidth |
| 75 | : Math.min(desiredMenuWidth, Math.max(0, overlay.width - 2 * SCREEN_MARGIN)); | 75 | : Math.min(desiredMenuWidth, Math.max(0, overlay.width - 2 * SCREEN_MARGIN)); |
| 76 | const anchorRef = useRef<View>(null); | 76 | const anchorRef = useRef<ViewInstance>(null); |
| 77 | const overlayRef = useRef<View>(null); | 77 | const overlayRef = useRef<ViewInstance>(null); |
| 78 | 78 | ||
| 79 | const keyboardVisible = useKeyboardState((state) => state.isVisible); | 79 | const keyboardVisible = useKeyboardState((state) => state.isVisible); |
| 80 | const keyboardHeight = useKeyboardState((state) => state.height); | 80 | const keyboardHeight = useKeyboardState((state) => state.height); |
apps/mobile/src/components/AppText.tsx+2-1| ... | @@ -2,6 +2,7 @@ import { | ... | @@ -2,6 +2,7 @@ import { |
| 2 | Platform, | 2 | Platform, |
| 3 | Text as RNText, | 3 | Text as RNText, |
| 4 | TextInput as RNTextInput, | 4 | TextInput as RNTextInput, |
| 5 | type TextInputInstance, | ||
| 5 | type TextInputProps as RNTextInputProps, | 6 | type TextInputProps as RNTextInputProps, |
| 6 | type TextProps as RNTextProps, | 7 | type TextProps as RNTextProps, |
| 7 | } from "react-native"; | 8 | } from "react-native"; |
| ... | @@ -26,7 +27,7 @@ export function AppText({ className, ...props }: AppTextProps) { | ... | @@ -26,7 +27,7 @@ export function AppText({ className, ...props }: AppTextProps) { |
| 26 | 27 | ||
| 27 | export type AppTextInputProps = Omit<RNTextInputProps, "placeholderTextColor"> & { | 28 | export type AppTextInputProps = Omit<RNTextInputProps, "placeholderTextColor"> & { |
| 28 | readonly className?: string; | 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,7 +127,7 @@ async function materializeDataUrlPreview(id: string, dataUrl: string): Promise<s |
| 127 | const file = new File(directory, `${id}.${extension}`); | 127 | const file = new File(directory, `${id}.${extension}`); |
| 128 | if (!file.exists) { | 128 | if (!file.exists) { |
| 129 | file.create(); | 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 | return file.uri; | 132 | return file.uri; |
| 133 | } | 133 | } |
apps/mobile/src/components/GlassSurface.tsx+9-2| ... | @@ -1,6 +1,13 @@ | ... | @@ -1,6 +1,13 @@ |
| 1 | import { GlassView, isGlassEffectAPIAvailable } from "expo-glass-effect"; | 1 | import { GlassView, isGlassEffectAPIAvailable } from "expo-glass-effect"; |
| 2 | import type { ReactNode, Ref } from "react"; | 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 | import { withUniwind } from "uniwind"; | 11 | import { withUniwind } from "uniwind"; |
| 5 | 12 | ||
| 6 | import { cn } from "../lib/cn"; | 13 | import { cn } from "../lib/cn"; |
| ... | @@ -14,7 +21,7 @@ const ThemedGlassView = withUniwind(GlassView, { | ... | @@ -14,7 +21,7 @@ const ThemedGlassView = withUniwind(GlassView, { |
| 14 | }); | 21 | }); |
| 15 | 22 | ||
| 16 | interface GlassSurfaceProps extends ViewProps { | 23 | interface GlassSurfaceProps extends ViewProps { |
| 17 | readonly ref?: Ref<View>; | 24 | readonly ref?: Ref<ViewInstance>; |
| 18 | readonly children: ReactNode; | 25 | readonly children: ReactNode; |
| 19 | readonly glassEffectStyle?: "clear" | "regular" | "none"; | 26 | readonly glassEffectStyle?: "clear" | "regular" | "none"; |
| 20 | readonly tintColor?: ColorValue; | 27 | readonly tintColor?: ColorValue; |
apps/mobile/src/components/LoadingScreen.tsx+1-1| ... | @@ -15,7 +15,7 @@ export function LoadingScreen(props: { | ... | @@ -15,7 +15,7 @@ export function LoadingScreen(props: { |
| 15 | 15 | ||
| 16 | return ( | 16 | return ( |
| 17 | <View className="flex-1 bg-screen" style={{ paddingTop: insets.top }}> | 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 | <View className="flex-1 items-center justify-center gap-5 px-6"> | 19 | <View className="flex-1 items-center justify-center gap-5 px-6"> |
| 20 | <BrandMark compact /> | 20 | <BrandMark compact /> |
| 21 | {messagePlacement === "above-spinner" ? ( | 21 | {messagePlacement === "above-spinner" ? ( |
apps/mobile/src/components/MaterialSearchField.tsx+2-2| ... | @@ -1,5 +1,5 @@ | ... | @@ -1,5 +1,5 @@ |
| 1 | import type { RefObject } from "react"; | 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 | import { SymbolView } from "./AppSymbol"; | 4 | import { SymbolView } from "./AppSymbol"; |
| 5 | import { useAndroidControlSizing } from "./useAndroidControlSizing"; | 5 | import { useAndroidControlSizing } from "./useAndroidControlSizing"; |
| ... | @@ -12,7 +12,7 @@ export function MaterialSearchField({ | ... | @@ -12,7 +12,7 @@ export function MaterialSearchField({ |
| 12 | value, | 12 | value, |
| 13 | onChangeText, | 13 | onChangeText, |
| 14 | }: { | 14 | }: { |
| 15 | readonly inputRef: RefObject<TextInput | null>; | 15 | readonly inputRef: RefObject<TextInputInstance | null>; |
| 16 | readonly accessibilityLabel: string; | 16 | readonly accessibilityLabel: string; |
| 17 | readonly clearAccessibilityLabel: string; | 17 | readonly clearAccessibilityLabel: string; |
| 18 | readonly placeholder: string; | 18 | readonly placeholder: string; |
apps/mobile/src/components/ScreenHeader.android.tsx+9-2| ... | @@ -1,5 +1,12 @@ | ... | @@ -1,5 +1,12 @@ |
| 1 | import { useCallback, useEffect, useRef, useState } from "react"; | 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 | import { useMaterialToolbarLayout } from "./useMaterialToolbarLayout"; | 10 | import { useMaterialToolbarLayout } from "./useMaterialToolbarLayout"; |
| 4 | import { NativeStackScreenOptions } from "../native/StackHeader"; | 11 | import { NativeStackScreenOptions } from "../native/StackHeader"; |
| 5 | import { AndroidWorkspaceSidebarButton } from "../features/layout/workspace-sidebar-toolbar"; | 12 | import { AndroidWorkspaceSidebarButton } from "../features/layout/workspace-sidebar-toolbar"; |
| ... | @@ -18,7 +25,7 @@ export function ScreenHeader(props: ScreenHeaderProps) { | ... | @@ -18,7 +25,7 @@ export function ScreenHeader(props: ScreenHeaderProps) { |
| 18 | const { paddingTop, paddingBottom } = useMaterialToolbarLayout(); | 25 | const { paddingTop, paddingBottom } = useMaterialToolbarLayout(); |
| 19 | const { scale, buttonSize, iconSize, smallIconSize } = useAndroidControlSizing(); | 26 | const { scale, buttonSize, iconSize, smallIconSize } = useAndroidControlSizing(); |
| 20 | const { themeVariables } = useAppearancePreferences(); | 27 | const { themeVariables } = useAppearancePreferences(); |
| 21 | const inputRef = useRef<TextInput>(null); | 28 | const inputRef = useRef<TextInputInstance>(null); |
| 22 | const [searchOpen, setSearchOpen] = useState(false); | 29 | const [searchOpen, setSearchOpen] = useState(false); |
| 23 | const searching = search !== undefined && (searchOpen || search.value.length > 0); | 30 | const searching = search !== undefined && (searchOpen || search.value.length > 0); |
| 24 | const onSearchChange = search?.onChangeText; | 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,7 +14,7 @@ import * as Queue from "effect/Queue"; |
| 14 | import * as Schedule from "effect/Schedule"; | 14 | import * as Schedule from "effect/Schedule"; |
| 15 | import * as Stream from "effect/Stream"; | 15 | import * as Stream from "effect/Stream"; |
| 16 | import * as SubscriptionRef from "effect/SubscriptionRef"; | 16 | import * as SubscriptionRef from "effect/SubscriptionRef"; |
| 17 | import { AppState, type AppStateStatus } from "react-native"; | 17 | import { AppState } from "react-native"; |
| 18 | 18 | ||
| 19 | import * as MobileStorage from "../persistence/mobile-storage"; | 19 | import * as MobileStorage from "../persistence/mobile-storage"; |
| 20 | import { | 20 | import { |
| ... | @@ -27,8 +27,10 @@ const REPORT_INTERVAL_MS = 25_000; | ... | @@ -27,8 +27,10 @@ const REPORT_INTERVAL_MS = 25_000; |
| 27 | const LEASE_TTL_MS = 45_000; | 27 | const LEASE_TTL_MS = 45_000; |
| 28 | const BASELINE_SCOPES: ReadonlyArray<BackgroundScope> = [{ type: "provider-status" }]; | 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 | function normalizeAppState( | 32 | function normalizeAppState( |
| 31 | state: AppStateStatus, | 33 | state: string | null | undefined, |
| 32 | ): NonNullable<ClientActivityReportInput["appState"]> { | 34 | ): NonNullable<ClientActivityReportInput["appState"]> { |
| 33 | if (state === "active" || state === "inactive" || state === "background") return state; | 35 | if (state === "active" || state === "inactive" || state === "background") return state; |
| 34 | return "unknown"; | 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,12 +2,27 @@ import { useEffect, useRef } from "react"; |
| 2 | import * as Notifications from "expo-notifications"; | 2 | import * as Notifications from "expo-notifications"; |
| 3 | import { useLinkTo } from "@react-navigation/native"; | 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 | import { consumeLastAgentNotificationResponse } from "./notificationResponseConsumer"; | 7 | import { consumeLastAgentNotificationResponse } from "./notificationResponseConsumer"; |
| 7 | 8 | ||
| 8 | export function useAgentNotificationNavigation(): void { | 9 | export function useAgentNotificationNavigation(pathname: string): void { |
| 9 | const linkTo = useLinkTo(); | 10 | const linkTo = useLinkTo(); |
| 10 | const handledResponseIds = useRef(new Set<string>()); | 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 | useEffect(() => { | 27 | useEffect(() => { |
| 13 | const handleResponse = (response: Notifications.NotificationResponse): void => { | 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,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 | export function extractAgentNotificationDeepLink(response: unknown): string | null { | 85 | export function extractAgentNotificationDeepLink(response: unknown): string | null { |
| 73 | const data = dataFromNotificationResponse(response); | 86 | const data = dataFromNotificationResponse(response); |
| 74 | const deepLink = data?.deepLink; | 87 | const deepLink = data?.deepLink; |
apps/mobile/src/features/archive/ArchivedThreadsScreen.tsx+4-6| ... | @@ -20,7 +20,7 @@ import { | ... | @@ -20,7 +20,7 @@ import { |
| 20 | useWindowDimensions, | 20 | useWindowDimensions, |
| 21 | View, | 21 | View, |
| 22 | } from "react-native"; | 22 | } from "react-native"; |
| 23 | import { Gesture, GestureDetector } from "react-native-gesture-handler"; | 23 | import { GestureDetector, useNativeGesture } from "react-native-gesture-handler"; |
| 24 | import type { SwipeableMethods } from "react-native-gesture-handler/ReanimatedSwipeable"; | 24 | import type { SwipeableMethods } from "react-native-gesture-handler/ReanimatedSwipeable"; |
| 25 | 25 | ||
| 26 | import { AppText as Text } from "../../components/AppText"; | 26 | import { AppText as Text } from "../../components/AppText"; |
| ... | @@ -185,9 +185,7 @@ function ArchivedThreadRow(props: { | ... | @@ -185,9 +185,7 @@ function ArchivedThreadRow(props: { |
| 185 | readonly onDelete: () => void; | 185 | readonly onDelete: () => void; |
| 186 | readonly onSwipeableClose: (methods: SwipeableMethods) => void; | 186 | readonly onSwipeableClose: (methods: SwipeableMethods) => void; |
| 187 | readonly onSwipeableWillOpen: (methods: SwipeableMethods) => void; | 187 | readonly onSwipeableWillOpen: (methods: SwipeableMethods) => void; |
| 188 | readonly simultaneousSwipeGesture?: ComponentProps< | 188 | readonly simultaneousSwipeGesture?: ComponentProps<typeof ThreadSwipeable>["simultaneousWith"]; |
| 189 | typeof ThreadSwipeable | ||
| 190 | >["simultaneousWithExternalGesture"]; | ||
| 191 | readonly onUnarchive: () => void; | 189 | readonly onUnarchive: () => void; |
| 192 | readonly thread: EnvironmentThreadShell; | 190 | readonly thread: EnvironmentThreadShell; |
| 193 | }) { | 191 | }) { |
| ... | @@ -221,7 +219,7 @@ function ArchivedThreadRow(props: { | ... | @@ -221,7 +219,7 @@ function ArchivedThreadRow(props: { |
| 221 | label: "Unarchive", | 219 | label: "Unarchive", |
| 222 | onPress: props.onUnarchive, | 220 | onPress: props.onUnarchive, |
| 223 | }} | 221 | }} |
| 224 | simultaneousWithExternalGesture={props.simultaneousSwipeGesture} | 222 | simultaneousWith={props.simultaneousSwipeGesture} |
| 225 | threadTitle={props.thread.title} | 223 | threadTitle={props.thread.title} |
| 226 | > | 224 | > |
| 227 | {() => ( | 225 | {() => ( |
| ... | @@ -303,7 +301,7 @@ export function ArchivedThreadsScreen(props: { | ... | @@ -303,7 +301,7 @@ export function ArchivedThreadsScreen(props: { |
| 303 | }) { | 301 | }) { |
| 304 | const { onDeleteThread, onUnarchiveThread } = props; | 302 | const { onDeleteThread, onUnarchiveThread } = props; |
| 305 | const openSwipeableRef = useRef<SwipeableMethods | null>(null); | 303 | const openSwipeableRef = useRef<SwipeableMethods | null>(null); |
| 306 | const archiveScrollGesture = useMemo(() => Gesture.Native(), []); | 304 | const archiveScrollGesture = useNativeGesture(); |
| 307 | const environmentLabelsById = useMemo( | 305 | const environmentLabelsById = useMemo( |
| 308 | () => | 306 | () => |
| 309 | new Map( | 307 | new Map( |
apps/mobile/src/features/connection/CloudEnvironmentRows.tsx+2-8| ... | @@ -13,13 +13,7 @@ import { | ... | @@ -13,13 +13,7 @@ import { |
| 13 | } from "@t3tools/contracts"; | 13 | } from "@t3tools/contracts"; |
| 14 | import { useAtomValue } from "@effect/atom-react"; | 14 | import { useAtomValue } from "@effect/atom-react"; |
| 15 | import { useCallback, useState } from "react"; | 15 | import { useCallback, useState } from "react"; |
| 16 | import { | 16 | import { ActivityIndicator, Pressable, type TextLayoutEvent, View } from "react-native"; |
| 17 | ActivityIndicator, | ||
| 18 | Pressable, | ||
| 19 | type NativeSyntheticEvent, | ||
| 20 | type TextLayoutEventData, | ||
| 21 | View, | ||
| 22 | } from "react-native"; | ||
| 23 | 17 | ||
| 24 | import { AppText as Text } from "../../components/AppText"; | 18 | import { AppText as Text } from "../../components/AppText"; |
| 25 | import { EnvironmentMachineSymbol } from "../../components/EnvironmentMachineSymbol"; | 19 | import { EnvironmentMachineSymbol } from "../../components/EnvironmentMachineSymbol"; |
| ... | @@ -334,7 +328,7 @@ function CloudEnvironmentRowShell(props: { | ... | @@ -334,7 +328,7 @@ function CloudEnvironmentRowShell(props: { |
| 334 | const isErrorExpanded = errorCanExpand && props.errorExpanded; | 328 | const isErrorExpanded = errorCanExpand && props.errorExpanded; |
| 335 | const StatusContainer = errorCanExpand ? Pressable : View; | 329 | const StatusContainer = errorCanExpand ? Pressable : View; |
| 336 | const onMeasuredErrorTextLayout = useCallback( | 330 | const onMeasuredErrorTextLayout = useCallback( |
| 337 | (event: NativeSyntheticEvent<TextLayoutEventData>) => { | 331 | (event: TextLayoutEvent) => { |
| 338 | if (!props.connectionError) { | 332 | if (!props.connectionError) { |
| 339 | return; | 333 | return; |
| 340 | } | 334 | } |
apps/mobile/src/features/devices/DeviceStreamWebView.tsx+2-2| ... | @@ -89,7 +89,7 @@ function DeviceStreamDocumentView({ | ... | @@ -89,7 +89,7 @@ function DeviceStreamDocumentView({ |
| 89 | readonly onStreaming: () => void; | 89 | readonly onStreaming: () => void; |
| 90 | readonly onRecoverProcess: () => boolean; | 90 | readonly onRecoverProcess: () => boolean; |
| 91 | }) { | 91 | }) { |
| 92 | const webView = useRef<WebView>(null); | 92 | const webView = useRef<WebView<object>>(null); |
| 93 | const active = useRef(true); | 93 | const active = useRef(true); |
| 94 | const failed = useRef(false); | 94 | const failed = useRef(false); |
| 95 | const [status, setStatus] = useState<DeviceStreamStatus>("connecting"); | 95 | const [status, setStatus] = useState<DeviceStreamStatus>("connecting"); |
| ... | @@ -148,7 +148,7 @@ function DeviceStreamDocumentView({ | ... | @@ -148,7 +148,7 @@ function DeviceStreamDocumentView({ |
| 148 | }; | 148 | }; |
| 149 | return ( | 149 | return ( |
| 150 | <View className="flex-1" style={{ backgroundColor: background }}> | 150 | <View className="flex-1" style={{ backgroundColor: background }}> |
| 151 | <WebView | 151 | <WebView<object> |
| 152 | ref={webView} | 152 | ref={webView} |
| 153 | source={source} | 153 | source={source} |
| 154 | originWhitelist={["*"]} | 154 | originWhitelist={["*"]} |
apps/mobile/src/features/files/MaterialFilesHeader.tsx+2-2| ... | @@ -1,5 +1,5 @@ | ... | @@ -1,5 +1,5 @@ |
| 1 | import { useCallback, useEffect, useRef, useState, type ReactNode } from "react"; | 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 | import { AndroidHeaderIconButton, AndroidScreenHeader } from "../../components/AndroidScreenHeader"; | 4 | import { AndroidHeaderIconButton, AndroidScreenHeader } from "../../components/AndroidScreenHeader"; |
| 5 | import { AndroidAnchoredMenu } from "../../components/AndroidAnchoredMenu"; | 5 | import { AndroidAnchoredMenu } from "../../components/AndroidAnchoredMenu"; |
| ... | @@ -16,7 +16,7 @@ export function MaterialFilesHeader(props: { | ... | @@ -16,7 +16,7 @@ export function MaterialFilesHeader(props: { |
| 16 | readonly leading?: ReactNode; | 16 | readonly leading?: ReactNode; |
| 17 | }) { | 17 | }) { |
| 18 | const { paddingTop, paddingBottom } = useMaterialToolbarLayout(); | 18 | const { paddingTop, paddingBottom } = useMaterialToolbarLayout(); |
| 19 | const searchRef = useRef<TextInput>(null); | 19 | const searchRef = useRef<TextInputInstance>(null); |
| 20 | const [searchOpen, setSearchOpen] = useState(false); | 20 | const [searchOpen, setSearchOpen] = useState(false); |
| 21 | const searching = searchOpen || props.searchQuery.length > 0; | 21 | const searching = searchOpen || props.searchQuery.length > 0; |
| 22 | const { onSearchQueryChange } = props; | 22 | const { onSearchQueryChange } = props; |
apps/mobile/src/features/home/HomeScreen.tsx+4-4| ... | @@ -309,8 +309,8 @@ export function HomeScreen(props: HomeScreenProps) { | ... | @@ -309,8 +309,8 @@ export function HomeScreen(props: HomeScreenProps) { |
| 309 | (event: GestureResponderEvent, started: boolean) => { | 309 | (event: GestureResponderEvent, started: boolean) => { |
| 310 | const { changedTouches, touches } = event.nativeEvent; | 310 | const { changedTouches, touches } = event.nativeEvent; |
| 311 | swipeRowActivation.trackTouches( | 311 | swipeRowActivation.trackTouches( |
| 312 | started ? changedTouches.map((touch) => touch.identifier) : [], | 312 | started ? changedTouches.map((touch) => String(touch.identifier)) : [], |
| 313 | touches.map((touch) => touch.identifier), | 313 | touches.map((touch) => String(touch.identifier)), |
| 314 | ); | 314 | ); |
| 315 | }, | 315 | }, |
| 316 | [swipeRowActivation], | 316 | [swipeRowActivation], |
| ... | @@ -945,7 +945,7 @@ export function HomeScreen(props: HomeScreenProps) { | ... | @@ -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 | // Project scoping lives in the header filter menu (no inline chip row on | 950 | // Project scoping lives in the header filter menu (no inline chip row on |
| 951 | // mobile — the menu is the one filter surface). | 951 | // mobile — the menu is the one filter surface). |
| ... | @@ -954,7 +954,7 @@ export function HomeScreen(props: HomeScreenProps) { | ... | @@ -954,7 +954,7 @@ export function HomeScreen(props: HomeScreenProps) { |
| 954 | // Use the v2 project scope for its empty state. Snoozed threads need no | 954 | // Use the v2 project scope for its empty state. Snoozed threads need no |
| 955 | // special empty state: their shelf header is a list row even while collapsed. | 955 | // special empty state: their shelf header is a list row even while collapsed. |
| 956 | const v2ListEmpty = | 956 | const v2ListEmpty = |
| 957 | hasSearchQuery && threadSearch.isPending ? null : hasSearchQuery ? ( | 957 | hasSearchQuery && threadSearch.isPending ? undefined : hasSearchQuery ? ( |
| 958 | <EmptyState | 958 | <EmptyState |
| 959 | title="No results" | 959 | title="No results" |
| 960 | detail={`No threads matching "${props.searchQuery}".`} | 960 | detail={`No threads matching "${props.searchQuery}".`} |
apps/mobile/src/features/home/MaterialThreadListToolbar.tsx+8-2| ... | @@ -1,5 +1,11 @@ | ... | @@ -1,5 +1,11 @@ |
| 1 | import { useCallback, useEffect, useRef, useState, type ComponentProps } from "react"; | 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 | import { useSafeAreaInsets } from "react-native-safe-area-context"; | 9 | import { useSafeAreaInsets } from "react-native-safe-area-context"; |
| 4 | import type { MenuAction } from "@react-native-menu/menu"; | 10 | import type { MenuAction } from "@react-native-menu/menu"; |
| 5 | 11 | ||
| ... | @@ -33,7 +39,7 @@ export function MaterialThreadListToolbar(props: { | ... | @@ -33,7 +39,7 @@ export function MaterialThreadListToolbar(props: { |
| 33 | const { height: toolbarHeight, ...headerPadding } = useMaterialToolbarLayout(); | 39 | const { height: toolbarHeight, ...headerPadding } = useMaterialToolbarLayout(); |
| 34 | const { state } = useWorkspaceState(); | 40 | const { state } = useWorkspaceState(); |
| 35 | const { onRequestVisibility, onSearchQueryChange } = props; | 41 | const { onRequestVisibility, onSearchQueryChange } = props; |
| 36 | const searchRef = useRef<TextInput>(null); | 42 | const searchRef = useRef<TextInputInstance>(null); |
| 37 | const [searchOpen, setSearchOpen] = useState(false); | 43 | const [searchOpen, setSearchOpen] = useState(false); |
| 38 | const searching = searchOpen || props.searchQuery.length > 0; | 44 | const searching = searchOpen || props.searchQuery.length > 0; |
| 39 | const openSearch = useCallback(() => { | 45 | const openSearch = useCallback(() => { |
apps/mobile/src/features/home/thread-swipe-actions.tsx+3-5| ... | @@ -266,9 +266,7 @@ interface ThreadSwipeableProps { | ... | @@ -266,9 +266,7 @@ interface ThreadSwipeableProps { |
| 266 | readonly resetKey?: string; | 266 | readonly resetKey?: string; |
| 267 | /** Paints the row without swipe machinery; see swipe-row-activation. */ | 267 | /** Paints the row without swipe machinery; see swipe-row-activation. */ |
| 268 | readonly dormant?: boolean; | 268 | readonly dormant?: boolean; |
| 269 | readonly simultaneousWithExternalGesture?: ComponentProps< | 269 | readonly simultaneousWith?: ComponentProps<typeof ReanimatedSwipeable>["simultaneousWith"]; |
| 270 | typeof ReanimatedSwipeable | ||
| 271 | >["simultaneousWithExternalGesture"]; | ||
| 272 | readonly threadTitle: string; | 270 | readonly threadTitle: string; |
| 273 | } | 271 | } |
| 274 | 272 | ||
| ... | @@ -433,7 +431,7 @@ function ThreadSwipeableRow(props: ThreadSwipeableProps) { | ... | @@ -433,7 +431,7 @@ function ThreadSwipeableRow(props: ThreadSwipeableProps) { |
| 433 | animationOptions={THREAD_SWIPE_SPRING} | 431 | animationOptions={THREAD_SWIPE_SPRING} |
| 434 | childrenContainerStyle={{ backgroundColor: props.backgroundColor }} | 432 | childrenContainerStyle={{ backgroundColor: props.backgroundColor }} |
| 435 | containerStyle={[{ backgroundColor: props.backgroundColor }, props.containerStyle]} | 433 | containerStyle={[{ backgroundColor: props.backgroundColor }, props.containerStyle]} |
| 436 | dragOffsetFromRightEdge={8} | 434 | dragOffsetFromRight={-8} |
| 437 | enabled={!isDismissing && props.enabled !== false && gateEnabled} | 435 | enabled={!isDismissing && props.enabled !== false && gateEnabled} |
| 438 | enableTrackpadTwoFingerGesture={props.enableTrackpadSwipe ?? true} | 436 | enableTrackpadTwoFingerGesture={props.enableTrackpadSwipe ?? true} |
| 439 | // Fail the swipe once the pan is vertically dominant (patched-in RNGH | 437 | // Fail the swipe once the pan is vertically dominant (patched-in RNGH |
| ... | @@ -497,7 +495,7 @@ function ThreadSwipeableRow(props: ThreadSwipeableProps) { | ... | @@ -497,7 +495,7 @@ function ThreadSwipeableRow(props: ThreadSwipeableProps) { |
| 497 | </Animated.View> | 495 | </Animated.View> |
| 498 | )} | 496 | )} |
| 499 | rightThreshold={actionsWidth * 0.42} | 497 | rightThreshold={actionsWidth * 0.42} |
| 500 | simultaneousWithExternalGesture={props.simultaneousWithExternalGesture} | 498 | simultaneousWith={props.simultaneousWith} |
| 501 | > | 499 | > |
| 502 | {props.children(close)} | 500 | {props.children(close)} |
| 503 | </ReanimatedSwipeable> | 501 | </ReanimatedSwipeable> |
apps/mobile/src/features/keyboard/CommandPalette.tsx+2-1| ... | @@ -12,6 +12,7 @@ import { | ... | @@ -12,6 +12,7 @@ import { |
| 12 | TextInput, | 12 | TextInput, |
| 13 | useWindowDimensions, | 13 | useWindowDimensions, |
| 14 | View, | 14 | View, |
| 15 | type TextInputInstance, | ||
| 15 | } from "react-native"; | 16 | } from "react-native"; |
| 16 | 17 | ||
| 17 | import { GestureHandlerRootView } from "react-native-gesture-handler"; | 18 | import { GestureHandlerRootView } from "react-native-gesture-handler"; |
| ... | @@ -151,7 +152,7 @@ export function CommandPalette(props: { | ... | @@ -151,7 +152,7 @@ export function CommandPalette(props: { |
| 151 | const [visible, setVisible] = useState(true); | 152 | const [visible, setVisible] = useState(true); |
| 152 | const pendingAction = useRef<(() => void) | null>(null); | 153 | const pendingAction = useRef<(() => void) | null>(null); |
| 153 | const closing = useRef(false); | 154 | const closing = useRef(false); |
| 154 | const inputRef = useRef<TextInput>(null); | 155 | const inputRef = useRef<TextInputInstance>(null); |
| 155 | const listRef = useRef<FlatList<CommandPaletteItem>>(null); | 156 | const listRef = useRef<FlatList<CommandPaletteItem>>(null); |
| 156 | const { width, height } = useWindowDimensions(); | 157 | const { width, height } = useWindowDimensions(); |
| 157 | const searchEnvironmentIds = useMemo( | 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,7 +68,7 @@ export async function writeIncomingShareDraft(draft: IncomingShareDraft): Promis |
| 68 | if (!file.exists) { | 68 | if (!file.exists) { |
| 69 | file.create({ intermediates: true, overwrite: true }); | 69 | file.create({ intermediates: true, overwrite: true }); |
| 70 | } | 70 | } |
| 71 | file.write(JSON.stringify(draft)); | 71 | await file.write(JSON.stringify(draft)); |
| 72 | } catch (cause) { | 72 | } catch (cause) { |
| 73 | throw new IncomingShareStorageError({ operation: "write", shareId: draft.id, cause }); | 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 +6,7 @@ import { |
| 6 | View, | 6 | View, |
| 7 | type LayoutChangeEvent, | 7 | type LayoutChangeEvent, |
| 8 | type NativeSyntheticEvent, | 8 | type NativeSyntheticEvent, |
| 9 | type TextInputInstance, | ||
| 9 | type ViewProps, | 10 | type ViewProps, |
| 10 | } from "react-native"; | 11 | } from "react-native"; |
| 11 | 12 | ||
| ... | @@ -61,7 +62,7 @@ function estimateGridSize(input: { | ... | @@ -61,7 +62,7 @@ function estimateGridSize(input: { |
| 61 | 62 | ||
| 62 | const FallbackTerminalSurface = memo(function FallbackTerminalSurface(props: TerminalSurfaceProps) { | 63 | const FallbackTerminalSurface = memo(function FallbackTerminalSurface(props: TerminalSurfaceProps) { |
| 63 | const fontSize = props.fontSize ?? MOBILE_TYPOGRAPHY.label.fontSize; | 64 | const fontSize = props.fontSize ?? MOBILE_TYPOGRAPHY.label.fontSize; |
| 64 | const inputRef = useRef<TextInput>(null); | 65 | const inputRef = useRef<TextInputInstance>(null); |
| 65 | const { themeAppearance, themeId } = useAppearancePreferences(); | 66 | const { themeAppearance, themeId } = useAppearancePreferences(); |
| 66 | const theme = props.theme ?? getMobileTerminalTheme(themeId, themeAppearance); | 67 | const theme = props.theme ?? getMobileTerminalTheme(themeId, themeAppearance); |
| 67 | const statusLabel = props.isRunning | 68 | const statusLabel = props.isRunning |
apps/mobile/src/features/threads/CustomSnoozeSheet.ios.tsx+3-3| ... | @@ -139,7 +139,7 @@ export function CustomSnoozeSheet(props: { | ... | @@ -139,7 +139,7 @@ export function CustomSnoozeSheet(props: { |
| 139 | modifiers={[ | 139 | modifiers={[ |
| 140 | datePickerStyle("wheel"), | 140 | datePickerStyle("wheel"), |
| 141 | labelsHidden(), | 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,7 +154,7 @@ export function CustomSnoozeSheet(props: { |
| 154 | modifiers={[ | 154 | modifiers={[ |
| 155 | pickerStyle("wheel"), | 155 | pickerStyle("wheel"), |
| 156 | labelsHidden(), | 156 | labelsHidden(), |
| 157 | frame({ minWidth: 0, maxWidth: Infinity, height: 180 }), | 157 | frame({ minWidth: 0, maxWidth: Infinity, minHeight: 180, maxHeight: 180 }), |
| 158 | clipped(), | 158 | clipped(), |
| 159 | ]} | 159 | ]} |
| 160 | > | 160 | > |
| ... | @@ -177,7 +177,7 @@ export function CustomSnoozeSheet(props: { | ... | @@ -177,7 +177,7 @@ export function CustomSnoozeSheet(props: { |
| 177 | modifiers={[ | 177 | modifiers={[ |
| 178 | pickerStyle("wheel"), | 178 | pickerStyle("wheel"), |
| 179 | labelsHidden(), | 179 | labelsHidden(), |
| 180 | frame({ minWidth: 0, maxWidth: Infinity, height: 180 }), | 180 | frame({ minWidth: 0, maxWidth: Infinity, minHeight: 180, maxHeight: 180 }), |
| 181 | clipped(), | 181 | clipped(), |
| 182 | ]} | 182 | ]} |
| 183 | > | 183 | > |
apps/mobile/src/features/threads/ThreadDetailScreen.tsx+2-1| ... | @@ -47,6 +47,7 @@ import { | ... | @@ -47,6 +47,7 @@ import { |
| 47 | useWindowDimensions, | 47 | useWindowDimensions, |
| 48 | View, | 48 | View, |
| 49 | type GestureResponderEvent, | 49 | type GestureResponderEvent, |
| 50 | type ViewInstance, | ||
| 50 | } from "react-native"; | 51 | } from "react-native"; |
| 51 | import { | 52 | import { |
| 52 | KeyboardController, | 53 | KeyboardController, |
| ... | @@ -321,7 +322,7 @@ export const ThreadDetailScreen = memo(function ThreadDetailScreen(props: Thread | ... | @@ -321,7 +322,7 @@ export const ThreadDetailScreen = memo(function ThreadDetailScreen(props: Thread |
| 321 | const composerEditorRef = useRef<ComposerEditorHandle>(null); | 322 | const composerEditorRef = useRef<ComposerEditorHandle>(null); |
| 322 | const draftMessageRef = useRef(props.draftMessage); | 323 | const draftMessageRef = useRef(props.draftMessage); |
| 323 | draftMessageRef.current = props.draftMessage; | 324 | draftMessageRef.current = props.draftMessage; |
| 324 | const composerOverlayRef = useRef<View>(null); | 325 | const composerOverlayRef = useRef<ViewInstance>(null); |
| 325 | const listRef = useRef<LegendListRef>(null); | 326 | const listRef = useRef<LegendListRef>(null); |
| 326 | const feedTouchStartRef = useRef<{ pageX: number; pageY: number } | null>(null); | 327 | const feedTouchStartRef = useRef<{ pageX: number; pageY: number } | null>(null); |
| 327 | const selectedThreadKeyRef = useRef(selectedThreadKey); | 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,9 +14,9 @@ import type { MenuAction } from "@react-native-menu/menu"; |
| 14 | import { useAtomValue } from "@effect/atom-react"; | 14 | import { useAtomValue } from "@effect/atom-react"; |
| 15 | import { type EnvironmentId, resolveEnvironmentMachineKind } from "@t3tools/contracts"; | 15 | import { type EnvironmentId, resolveEnvironmentMachineKind } from "@t3tools/contracts"; |
| 16 | import { useCallback, useEffect, useMemo, useRef, useState } from "react"; | 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 | import { Platform, StyleSheet, TextInput, View } from "react-native"; | 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 | import type { SwipeableMethods } from "react-native-gesture-handler/ReanimatedSwipeable"; | 20 | import type { SwipeableMethods } from "react-native-gesture-handler/ReanimatedSwipeable"; |
| 21 | import { useSafeAreaInsets } from "react-native-safe-area-context"; | 21 | import { useSafeAreaInsets } from "react-native-safe-area-context"; |
| 22 | import type { SearchBarCommands } from "react-native-screens"; | 22 | import type { SearchBarCommands } from "react-native-screens"; |
| ... | @@ -139,10 +139,10 @@ function ThreadNavigationSidebarPane( | ... | @@ -139,10 +139,10 @@ function ThreadNavigationSidebarPane( |
| 139 | const threads = useThreadShells(); | 139 | const threads = useThreadShells(); |
| 140 | const { environments: workspaceEnvironments, state: catalogState } = useWorkspaceState(); | 140 | const { environments: workspaceEnvironments, state: catalogState } = useWorkspaceState(); |
| 141 | const { savedConnectionsById } = useSavedRemoteConnections(); | 141 | const { savedConnectionsById } = useSavedRemoteConnections(); |
| 142 | const searchInputRef = useRef<TextInput>(null); | 142 | const searchInputRef = useRef<TextInputInstance>(null); |
| 143 | const searchBarRef = useRef<SearchBarCommands>(null); | 143 | const searchBarRef = useRef<SearchBarCommands>(null); |
| 144 | const openSwipeableRef = useRef<SwipeableMethods | null>(null); | 144 | const openSwipeableRef = useRef<SwipeableMethods | null>(null); |
| 145 | const sidebarScrollGesture = useMemo(() => Gesture.Native(), []); | 145 | const sidebarScrollGesture = useNativeGesture(); |
| 146 | const { | 146 | const { |
| 147 | archiveThread, | 147 | archiveThread, |
| 148 | confirmDeleteThread, | 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,9 +523,7 @@ export const ThreadListV2Row = memo(function ThreadListV2Row(props: { |
| 523 | readonly activationKey?: string; | 523 | readonly activationKey?: string; |
| 524 | readonly searchMatch?: EnvironmentThreadSearchMatch; | 524 | readonly searchMatch?: EnvironmentThreadSearchMatch; |
| 525 | readonly searchQuery?: string; | 525 | readonly searchQuery?: string; |
| 526 | readonly simultaneousSwipeGesture?: ComponentProps< | 526 | readonly simultaneousSwipeGesture?: ComponentProps<typeof ThreadSwipeable>["simultaneousWith"]; |
| 527 | typeof ThreadSwipeable | ||
| 528 | >["simultaneousWithExternalGesture"]; | ||
| 529 | }) { | 527 | }) { |
| 530 | const { width: windowWidth } = useWindowDimensions(); | 528 | const { width: windowWidth } = useWindowDimensions(); |
| 531 | const { | 529 | const { |
| ... | @@ -1198,7 +1196,7 @@ export const ThreadListV2Row = memo(function ThreadListV2Row(props: { | ... | @@ -1198,7 +1196,7 @@ export const ThreadListV2Row = memo(function ThreadListV2Row(props: { |
| 1198 | primaryAction={primaryAction} | 1196 | primaryAction={primaryAction} |
| 1199 | secondaryAction={secondaryAction} | 1197 | secondaryAction={secondaryAction} |
| 1200 | resetKey={`${thread.environmentId}:${thread.id}:${variant}:${snoozedRow}:${thread.settledAt}:${thread.unsettledAt}:${thread.snoozedUntil}`} | 1198 | resetKey={`${thread.environmentId}:${thread.id}:${variant}:${snoozedRow}:${thread.settledAt}:${thread.unsettledAt}:${thread.snoozedUntil}`} |
| 1201 | simultaneousWithExternalGesture={props.simultaneousSwipeGesture} | 1199 | simultaneousWith={props.simultaneousSwipeGesture} |
| 1202 | threadTitle={thread.title} | 1200 | threadTitle={thread.title} |
| 1203 | > | 1201 | > |
| 1204 | {(close) => ( | 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,6 +14,6 @@ export async function writeFileAtomically(file: File, contents: string): Promise |
| 14 | tempFileSequence += 1; | 14 | tempFileSequence += 1; |
| 15 | const temp = new FileConstructor(file.parentDirectory, `${file.name}.${tempFileSequence}.tmp`); | 15 | const temp = new FileConstructor(file.parentDirectory, `${file.name}.${tempFileSequence}.tmp`); |
| 16 | temp.create({ intermediates: true, overwrite: true }); | 16 | temp.create({ intermediates: true, overwrite: true }); |
| 17 | temp.write(contents); | 17 | await temp.write(contents); |
| 18 | temp.moveSync(file, { overwrite: true }); | 18 | temp.moveSync(file, { overwrite: true }); |
| 19 | } | 19 | } |
apps/mobile/src/lib/attachmentUpload.ts+1-1| ... | @@ -276,7 +276,7 @@ async function uploadFileBytes( | ... | @@ -276,7 +276,7 @@ async function uploadFileBytes( |
| 276 | try { | 276 | try { |
| 277 | if (fileUri === undefined && inlineDataUrl !== undefined) { | 277 | if (fileUri === undefined && inlineDataUrl !== undefined) { |
| 278 | file.create(); | 278 | file.create(); |
| 279 | file.write(inlineDataUrl.slice(inlineDataUrl.indexOf(",") + 1), { | 279 | await file.write(inlineDataUrl.slice(inlineDataUrl.indexOf(",") + 1), { |
| 280 | encoding: "base64", | 280 | encoding: "base64", |
| 281 | }); | 281 | }); |
| 282 | } | 282 | } |
apps/mobile/src/lib/composerImages.ts+2-2| ... | @@ -161,7 +161,7 @@ export async function persistComposerAttachmentFile( | ... | @@ -161,7 +161,7 @@ export async function persistComposerAttachmentFile( |
| 161 | try { | 161 | try { |
| 162 | let copiedBytes = 0; | 162 | let copiedBytes = 0; |
| 163 | while (true) { | 163 | while (true) { |
| 164 | const chunk = reader.readBytes( | 164 | const chunk = await reader.readBytes( |
| 165 | Math.min(ATTACHMENT_COPY_CHUNK_BYTES, maxBytes - copiedBytes + 1), | 165 | Math.min(ATTACHMENT_COPY_CHUNK_BYTES, maxBytes - copiedBytes + 1), |
| 166 | ); | 166 | ); |
| 167 | if (chunk.byteLength === 0) { | 167 | if (chunk.byteLength === 0) { |
| ... | @@ -171,7 +171,7 @@ export async function persistComposerAttachmentFile( | ... | @@ -171,7 +171,7 @@ export async function persistComposerAttachmentFile( |
| 171 | if (copiedBytes > maxBytes) { | 171 | if (copiedBytes > maxBytes) { |
| 172 | throw new Error(fileAttachmentTooLargeMessage(name, maxBytes)); | 172 | throw new Error(fileAttachmentTooLargeMessage(name, maxBytes)); |
| 173 | } | 173 | } |
| 174 | writer.writeBytes(chunk); | 174 | await writer.writeBytes(chunk); |
| 175 | } | 175 | } |
| 176 | } finally { | 176 | } finally { |
| 177 | writer.close(); | 177 | writer.close(); |
apps/mobile/src/native/T3ComposerEditor.ios.tsx+7-4| ... | @@ -13,9 +13,12 @@ import { | ... | @@ -13,9 +13,12 @@ import { |
| 13 | type Ref, | 13 | type Ref, |
| 14 | } from "react"; | 14 | } from "react"; |
| 15 | import type { NativeSyntheticEvent, StyleProp, ViewProps, ViewStyle } from "react-native"; | 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 | import { | 22 | import { |
| 20 | composerChipSizeSuffix, | 23 | composerChipSizeSuffix, |
| 21 | contextChipPresentation, | 24 | contextChipPresentation, |
| ... | @@ -109,8 +112,8 @@ function basename(path: string): string { | ... | @@ -109,8 +112,8 @@ function basename(path: string): string { |
| 109 | return separator >= 0 ? path.slice(separator + 1) : path; | 112 | return separator >= 0 ? path.slice(separator + 1) : path; |
| 110 | } | 113 | } |
| 111 | 114 | ||
| 112 | function fileIconUri(path: string): string { | 115 | function fileIconUri(path: string): string | null { |
| 113 | return Image.resolveAssetSource(markdownFileIconSource(resolveMarkdownFileIcon(path))).uri; | 116 | return markdownIconAssetUri(markdownFileIconSource(resolveMarkdownFileIcon(path))) ?? null; |
| 114 | } | 117 | } |
| 115 | 118 | ||
| 116 | export function ComposerEditor({ | 119 | export function ComposerEditor({ |
apps/mobile/src/native/T3ComposerEditor.native.tsx+6-3| ... | @@ -16,7 +16,10 @@ import { | ... | @@ -16,7 +16,10 @@ import { |
| 16 | import type { NativeSyntheticEvent, ViewProps } from "react-native"; | 16 | import type { NativeSyntheticEvent, ViewProps } from "react-native"; |
| 17 | import { Image, Platform, StyleSheet } from "react-native"; | 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 | import { | 23 | import { |
| 21 | composerChipSizeSuffix, | 24 | composerChipSizeSuffix, |
| 22 | contextChipPresentation, | 25 | contextChipPresentation, |
| ... | @@ -110,8 +113,8 @@ function basename(path: string): string { | ... | @@ -110,8 +113,8 @@ function basename(path: string): string { |
| 110 | return separator >= 0 ? path.slice(separator + 1) : path; | 113 | return separator >= 0 ? path.slice(separator + 1) : path; |
| 111 | } | 114 | } |
| 112 | 115 | ||
| 113 | function fileIconUri(path: string): string { | 116 | function fileIconUri(path: string): string | null { |
| 114 | return Image.resolveAssetSource(markdownFileIconSource(resolveMarkdownFileIcon(path))).uri; | 117 | return markdownIconAssetUri(markdownFileIconSource(resolveMarkdownFileIcon(path))) ?? null; |
| 115 | } | 118 | } |
| 116 | 119 | ||
| 117 | export function ComposerEditor({ | 120 | export function ComposerEditor({ |
apps/mobile/src/native/T3ComposerEditor.tsx+2-2| ... | @@ -1,6 +1,6 @@ | ... | @@ -1,6 +1,6 @@ |
| 1 | import { TextInputWrapper } from "expo-paste-input"; | 1 | import { TextInputWrapper } from "expo-paste-input"; |
| 2 | import { useImperativeHandle, useRef } from "react"; | 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 | import { useFontFamily } from "../lib/useFontFamily"; | 5 | import { useFontFamily } from "../lib/useFontFamily"; |
| 6 | import { useScaledTextRole } from "../features/settings/appearance/useScaledTextRole"; | 6 | import { useScaledTextRole } from "../features/settings/appearance/useScaledTextRole"; |
| ... | @@ -21,7 +21,7 @@ export function ComposerEditor({ | ... | @@ -21,7 +21,7 @@ export function ComposerEditor({ |
| 21 | readOnly = false, | 21 | readOnly = false, |
| 22 | ...props | 22 | ...props |
| 23 | }: ComposerEditorProps) { | 23 | }: ComposerEditorProps) { |
| 24 | const inputRef = useRef<RNTextInput>(null); | 24 | const inputRef = useRef<TextInputInstance>(null); |
| 25 | const bodyText = useScaledTextRole("body"); | 25 | const bodyText = useScaledTextRole("body"); |
| 26 | const fontFamily = useFontFamily("regular"); | 26 | const fontFamily = useFontFamily("regular"); |
| 27 | const handlePaste = useNativePaste((uris) => onPasteImages?.(uris)); | 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,7 +4,7 @@ import type { NativeSyntheticEvent, ViewProps } from "react-native"; |
| 4 | 4 | ||
| 5 | import type { HardwareKeyboardCommand } from "../features/keyboard/hardwareKeyboardCommands"; | 5 | import type { HardwareKeyboardCommand } from "../features/keyboard/hardwareKeyboardCommands"; |
| 6 | 6 | ||
| 7 | interface NativeKeyboardCommandsProps extends ViewProps, PropsWithChildren { | 7 | interface NativeKeyboardCommandsProps extends ViewProps { |
| 8 | readonly enabledCommands: ReadonlyArray<HardwareKeyboardCommand>; | 8 | readonly enabledCommands: ReadonlyArray<HardwareKeyboardCommand>; |
| 9 | readonly onCommand: ( | 9 | readonly onCommand: ( |
| 10 | event: NativeSyntheticEvent<{ readonly command: HardwareKeyboardCommand }>, | 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,7 +4,7 @@ import type { NativeSyntheticEvent, ViewProps } from "react-native"; |
| 4 | 4 | ||
| 5 | import type { HardwareKeyboardCommand } from "../features/keyboard/hardwareKeyboardCommands"; | 5 | import type { HardwareKeyboardCommand } from "../features/keyboard/hardwareKeyboardCommands"; |
| 6 | 6 | ||
| 7 | interface NativeKeyboardCommandsProps extends ViewProps, PropsWithChildren { | 7 | interface NativeKeyboardCommandsProps extends ViewProps { |
| 8 | readonly enabledCommands: ReadonlyArray<HardwareKeyboardCommand>; | 8 | readonly enabledCommands: ReadonlyArray<HardwareKeyboardCommand>; |
| 9 | readonly onCommand: ( | 9 | readonly onCommand: ( |
| 10 | event: NativeSyntheticEvent<{ readonly command: HardwareKeyboardCommand }>, | 10 | event: NativeSyntheticEvent<{ readonly command: HardwareKeyboardCommand }>, |
apps/mobile/src/widgets/SubscriptionUsage.tsx+1-1| ... | @@ -29,7 +29,7 @@ function SubscriptionUsage( | ... | @@ -29,7 +29,7 @@ function SubscriptionUsage( |
| 29 | // The extension evaluates this function without the app's module scope. | 29 | // The extension evaluates this function without the app's module scope. |
| 30 | const family = environment.widgetFamily; | 30 | const family = environment.widgetFamily; |
| 31 | // Gallery snapshots can render an old timeline entry after it has expired. | 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 | const accessory = family === "accessoryRectangular"; | 33 | const accessory = family === "accessoryRectangular"; |
| 34 | const compact = | 34 | const compact = |
| 35 | family === "systemSmall" || accessory || environment.levelOfDetail === "simplified"; | 35 | family === "systemSmall" || accessory || environment.levelOfDetail === "simplified"; |
apps/mobile/tsconfig.json+1-1| ... | @@ -1,5 +1,5 @@ | ... | @@ -1,5 +1,5 @@ |
| 1 | { | 1 | { |
| 2 | "extends": "expo/tsconfig.base", | 2 | "extends": "expo/tsconfig.base.json", |
| 3 | "compilerOptions": { | 3 | "compilerOptions": { |
| 4 | "allowImportingTsExtensions": true, | 4 | "allowImportingTsExtensions": true, |
| 5 | "strict": true, | 5 | "strict": true, |
apps/web/package.json+1-1| ... | @@ -68,7 +68,7 @@ | ... | @@ -68,7 +68,7 @@ |
| 68 | "@types/compression": "^1.8.1", | 68 | "@types/compression": "^1.8.1", |
| 69 | "@types/culori": "^4.0.1", | 69 | "@types/culori": "^4.0.1", |
| 70 | "@types/mdast": "^4.0.4", | 70 | "@types/mdast": "^4.0.4", |
| 71 | "@types/react": "~19.2.14", | 71 | "@types/react": "~19.3.0", |
| 72 | "@types/react-dom": "~19.2.3", | 72 | "@types/react-dom": "~19.2.3", |
| 73 | "@types/react-test-renderer": "19.1.0", | 73 | "@types/react-test-renderer": "19.1.0", |
| 74 | "@vercel/config": "^0.3.0", | 74 | "@vercel/config": "^0.3.0", |
patches/@clerk__expo@4.6.8.patch+17| ... | @@ -1,3 +1,20 @@ | ... | @@ -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 | diff --git a/ios/ClerkAuthNativeView.swift b/ios/ClerkAuthNativeView.swift | 18 | diff --git a/ios/ClerkAuthNativeView.swift b/ios/ClerkAuthNativeView.swift |
| 2 | index 5f8d2ba66d5b232890af75c22b173c86d2ef546b..b170304cbf2fbaae8032db8dd6f89b6a59c6e3fe 100644 | 19 | index 5f8d2ba66d5b232890af75c22b173c86d2ef546b..b170304cbf2fbaae8032db8dd6f89b6a59c6e3fe 100644 |
| 3 | --- a/ios/ClerkAuthNativeView.swift | 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,6 +2,14 @@ diff --git a/ios/MenuViewManager.mm b/ios/MenuViewManager.mm |
| 2 | index 3d149b3e7426b8f7c999603ddf1e15e12331c33a..e80fe2caae86e339fcb03408419a7d64b3e5b04f 100644 | 2 | index 3d149b3e7426b8f7c999603ddf1e15e12331c33a..e80fe2caae86e339fcb03408419a7d64b3e5b04f 100644 |
| 3 | --- a/ios/MenuViewManager.mm | 3 | --- a/ios/MenuViewManager.mm |
| 4 | +++ b/ios/MenuViewManager.mm | 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 | @@ -65,6 +65,10 @@ - (UIView *)view | 13 | @@ -65,6 +65,10 @@ - (UIView *)view |
| 6 | * onOpenMenu: callback to be called when the menu is opened | 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,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 | diff --git a/package.json b/package.json | 17 | diff --git a/package.json b/package.json |
| 2 | index 4e4366fb9d05a6c250acfc62e79487475d8ac05b..200e4680d77cbb4f14d22eb986efde1275a0d3e8 100644 | 18 | index 4e4366fb9d05a6c250acfc62e79487475d8ac05b..200e4680d77cbb4f14d22eb986efde1275a0d3e8 100644 |
| 3 | --- a/package.json | 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,52 +69,50 @@ overrides: |
| 69 | '@effect/sql-pg': 4.0.0-rc.115 | 69 | '@effect/sql-pg': 4.0.0-rc.115 |
| 70 | '@effect/vitest': 4.0.0-rc.115 | 70 | '@effect/vitest': 4.0.0-rc.115 |
| 71 | '@effect/vitest>vitest': '-' | 71 | '@effect/vitest>vitest': '-' |
| 72 | '@expo/dom-webview': 57.0.1 | 72 | '@expo/dom-webview': 58.0.2 |
| 73 | '@expo/metro-config': 57.0.12 | 73 | '@expo/metro-config': 58.0.6 |
| 74 | expo-constants: 57.0.16 | 74 | expo-constants: 58.0.9 |
| 75 | expo-modules-core: 57.0.14 | 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 | '@pierre/diffs>@shikijs/transformers': ^4.2.0 | 78 | '@pierre/diffs>@shikijs/transformers': ^4.2.0 |
| 77 | '@tailwindcss/node': 4.3.3 | 79 | '@tailwindcss/node': 4.3.3 |
| 78 | '@tailwindcss/oxide': 4.3.3 | 80 | '@tailwindcss/oxide': 4.3.3 |
| 79 | '@tailwindcss/vite': 4.3.3 | 81 | '@tailwindcss/vite': 4.3.3 |
| 80 | '@types/node': 24.12.4 | 82 | '@types/node': 24.12.4 |
| 81 | effect: 4.0.0-rc.115 | 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 | node-abi: 4.33.0 | 84 | node-abi: 4.33.0 |
| 86 | lightningcss: 1.33.0 | 85 | lightningcss: 1.33.0 |
| 87 | tailwindcss: 4.3.3 | 86 | tailwindcss: 4.3.3 |
| 88 | vite: npm:@voidzero-dev/vite-plus-core@1.0.0 | 87 | vite: npm:@voidzero-dev/vite-plus-core@1.0.0 |
| 89 | yaml: ^2.9.0 | 88 | yaml: ^2.9.0 |
| 90 | 89 | ||
| 91 | packageExtensionsChecksum: sha256-k/dT9NFDl5hihRPaoFKeY11hzyutMFs5psfZLFiKJic= | 90 | packageExtensionsChecksum: sha256-34mvKz5PLlrn2Tt9jUJC1SbK5hRE+oxwqyC1J6r09oE= |
| 92 | 91 | ||
| 93 | patchedDependencies: | 92 | patchedDependencies: |
| 94 | '@clerk/expo@4.6.8': a82bb41039ee88a290a87d4ab58be7be4c49fa338603b17ea646e1ec140a1cfb | 93 | '@clerk/expo@4.6.8': b8b22ab733de5bea846ad9e88046c10582352fe9ad86f314f368b2a823f0f281 |
| 95 | '@effect/vitest@4.0.0-rc.115': 172bd95ef73a13d322888984415d5d18d9d2aa8e13fa529eac235efac837e902 | 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 | '@ff-labs/fff-node@0.9.4': c4e3cc2420ceb9dc650f9d189e9c24baf7e83f342998bacda5f459a4ce7927a8 | 96 | '@ff-labs/fff-node@0.9.4': c4e3cc2420ceb9dc650f9d189e9c24baf7e83f342998bacda5f459a4ce7927a8 |
| 98 | '@legendapp/list@3.3.5': 680cc6a5c5b4a4032e467e7b3fde22f89a84c0ee2e6eac6fda737d6277cc0806 | 97 | '@legendapp/list@3.3.5': 680cc6a5c5b4a4032e467e7b3fde22f89a84c0ee2e6eac6fda737d6277cc0806 |
| 99 | '@pierre/diffs@1.3.0-beta.10': 0ccee155b93b63d810e2c1a40c1fd676fb6fbcfa72cf6430dcedf1a3ae475ab4 | 98 | '@pierre/diffs@1.3.0-beta.10': 0ccee155b93b63d810e2c1a40c1fd676fb6fbcfa72cf6430dcedf1a3ae475ab4 |
| 100 | '@react-native-ai/apple@0.12.0': 2d09870c2848d185cb05b53ed823a46e12dba519324d8dd8e584e28731990f9d | 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 | '@react-navigation/native-stack@7.17.6': e667c3cef8c78bb9ff4882ee5bd23a432247b843060a9499eb5f07e9e2295552 | 101 | '@react-navigation/native-stack@7.17.6': e667c3cef8c78bb9ff4882ee5bd23a432247b843060a9499eb5f07e9e2295552 |
| 103 | alchemy@2.0.0-beta.79: d1a03d902083946ee58121cc2787d88d1da561e9e30a5bcfcb8654692a489fb8 | 102 | alchemy@2.0.0-beta.79: d1a03d902083946ee58121cc2787d88d1da561e9e30a5bcfcb8654692a489fb8 |
| 104 | dbus-next@0.10.2: cfff57561b0ee59b5addb3b2e6c6f20906e967507a530ab67e8db8108e520ba4 | 103 | dbus-next@0.10.2: cfff57561b0ee59b5addb3b2e6c6f20906e967507a530ab67e8db8108e520ba4 |
| 105 | effect@4.0.0-rc.115: 0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5 | 104 | effect@4.0.0-rc.115: 0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5 |
| 106 | expo-audio@57.0.4: fa9a3e0442ed395d4071bb406e08c3a471c9a84700bdfa0b9ad7ff144c96041a | 105 | expo-audio@58.0.3: c20cb927d6848c53e7bf6ec14fe12f19daae9210165d2dbaf4e0f97ce31e8742 |
| 107 | expo-modules-core@57.0.14: 6be7092f8c6f03a57b75c797d98b5f19ed62d2dd205bfc4c8adf4cef45655d7e | 106 | expo-blur@58.0.2: d0311b0c0b05bd94393bd9a84653cb42503d5f3c8a19eb2627c34ace08bedf18 |
| 108 | expo-notifications@57.0.15: f89252c2c08dc7b3acb8415f319ebbe15fff8c9f88a64ebe1830cd5ac5c9ac40 | 107 | expo-glass-effect@58.0.3: f750041c45ab838a3530451dc7b50d6640a79141037a1b0499c5e3412a860c57 |
| 109 | expo-sharing@57.0.17: 8d2e3b10eb3f52036a9a086800180ec6cebf3b75bccc5b1775117a7244d4ac45 | 108 | expo-sharing@58.0.12: 5c85c709d951b5522b5bca897204b73ba7c17dec76e0dd155f41f8c2e833a7a8 |
| 110 | expo-widgets@57.0.15: 319a9ded5db49c5b5215c511a138b33f44c7ea2972eb418192e8d5342fe75ce6 | 109 | expo-widgets@58.0.9: 94de7964c5a67ab40e6b79d9bdf4b7bfc50ae97b70722ee8e5a35105ca83386b |
| 111 | node-pty@1.2.0-beta.15: f2fe901c61cde17986240002d05c172d5d0272d83ffaab8d0ebeb922763be414 | 110 | node-pty@1.2.0-beta.15: f2fe901c61cde17986240002d05c172d5d0272d83ffaab8d0ebeb922763be414 |
| 112 | react-native-gesture-handler@2.32.0: 0579f8e4dad02bf3183d95b02620358412983c36f9bda7425dc8bcb9643b5ce2 | 111 | react-native-gesture-handler@3.2.1: d518a937e3cb2df5e7d67f1ab6b265c74a8639e4572d1b032b7b747e9b1c01a9 |
| 113 | react-native-keyboard-controller@1.21.13: 6e4339347bc5bb3c9ea67d85ff5c814058b211c5750f247aba59d07869a2e787 | 112 | react-native-keyboard-controller@1.22.4: a438114039aed2e280a81d95c25723132ad071e4768fe492bd92aa628ad74597 |
| 114 | react-native-nitro-markdown@0.5.8: 642b47830730acff3761fe29cf54271d18b493c0070c750097850b7ea032e00c | 113 | react-native-nitro-markdown@0.5.8: 642b47830730acff3761fe29cf54271d18b493c0070c750097850b7ea032e00c |
| 115 | react-native-nitro-modules@0.35.9: 825622aae63a8fb5b904f3c77908a0e216261d727ea171709f2c0b6088422675 | 114 | react-native-nitro-modules@0.35.9: daf4a639ce3f951af630a3711e4082d58e3a11e5a79f45efb0b59925327ebde2 |
| 116 | react-native-reanimated@4.5.5: bae9878a5bdba94e11c890e5ee164542feb622624fc81c13890063094608216d | 115 | react-native-screens@4.28.0: cc1301436ee62c39860acc9ee1a1e60b7d47e6abd211c42effa62c056d165483 |
| 117 | react-native-screens@4.26.2: 595114f3f9ce8b9f0d99d1aafe5c12c997b7d75ca9add31d46cbedbfe347b8e0 | ||
| 118 | uniwind@1.11.0: a91f3953483cfd434436de6358ff5b63c49974ef148fad91246c26ba95332625 | 116 | uniwind@1.11.0: a91f3953483cfd434436de6358ff5b63c49974ef148fad91246c26ba95332625 |
| 119 | 117 | ||
| 120 | importers: | 118 | importers: |
| ... | @@ -144,7 +142,7 @@ importers: | ... | @@ -144,7 +142,7 @@ importers: |
| 144 | dependencies: | 142 | dependencies: |
| 145 | '@clerk/electron': | 143 | '@clerk/electron': |
| 146 | specifier: 0.0.44 | 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 | '@clerk/electron-passkeys': | 146 | '@clerk/electron-passkeys': |
| 149 | specifier: 0.0.3 | 147 | specifier: 0.0.3 |
| 150 | version: 0.0.3 | 148 | version: 0.0.3 |
| ... | @@ -245,19 +243,22 @@ importers: | ... | @@ -245,19 +243,22 @@ importers: |
| 245 | dependencies: | 243 | dependencies: |
| 246 | '@clerk/expo': | 244 | '@clerk/expo': |
| 247 | specifier: 4.6.8 | 245 | specifier: 4.6.8 |
| 248 | version: 4.6.8(patch_hash=a82bb41039ee88a290a87d4ab58be7be4c49fa338603b17ea646e1ec140a1cfb)(dbc31631339ce74330e188d5d7a88158) | 246 | version: 4.6.8(patch_hash=b8b22ab733de5bea846ad9e88046c10582352fe9ad86f314f368b2a823f0f281)(950bb7335d61b76ffb649f136fc0d4df) |
| 249 | '@effect/atom-react': | 247 | '@effect/atom-react': |
| 250 | specifier: 4.0.0-rc.115 | 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 | '@expo-google-fonts/dm-sans': | 250 | '@expo-google-fonts/dm-sans': |
| 253 | specifier: ^0.4.2 | 251 | specifier: ^0.4.2 |
| 254 | version: 0.4.2 | 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 | '@expo/ui': | 256 | '@expo/ui': |
| 256 | specifier: ~57.0.14 | 257 | specifier: ~58.0.9 |
| 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) | 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 | '@legendapp/list': | 259 | '@legendapp/list': |
| 259 | specifier: 'catalog:' | 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 | '@material/material-color-utilities': | 262 | '@material/material-color-utilities': |
| 262 | specifier: 0.3.0 | 263 | specifier: 0.3.0 |
| 263 | version: 0.3.0 | 264 | version: 0.3.0 |
| ... | @@ -266,22 +267,22 @@ importers: | ... | @@ -266,22 +267,22 @@ importers: |
| 266 | version: 1.9.1 | 267 | version: 1.9.1 |
| 267 | '@pierre/diffs': | 268 | '@pierre/diffs': |
| 268 | specifier: 'catalog:' | 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 | '@react-native-ai/apple': | 271 | '@react-native-ai/apple': |
| 271 | specifier: 0.12.0 | 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 | '@react-native-menu/menu': | 274 | '@react-native-menu/menu': |
| 274 | specifier: ^2.0.0 | 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 | '@react-navigation/elements': | 277 | '@react-navigation/elements': |
| 277 | specifier: 2.9.26 | 278 | specifier: 2.9.26 |
| 278 | version: 2.9.26(c10301b6e0c42fc6434d2b643197a81e) | 279 | version: 2.9.26(83de68753219ecf7f3321e065bd378be) |
| 279 | '@react-navigation/native': | 280 | '@react-navigation/native': |
| 280 | specifier: 7.3.4 | 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 | '@react-navigation/native-stack': | 283 | '@react-navigation/native-stack': |
| 283 | specifier: 7.17.6 | 284 | specifier: 7.17.6 |
| 284 | version: 7.17.6(patch_hash=e667c3cef8c78bb9ff4882ee5bd23a432247b843060a9499eb5f07e9e2295552)(f640afa6cd4b9a1dc5422cbafdc82f53) | 285 | version: 7.17.6(patch_hash=e667c3cef8c78bb9ff4882ee5bd23a432247b843060a9499eb5f07e9e2295552)(cdeee8948497d4b80ffe015e2a003650) |
| 285 | '@shikijs/core': | 286 | '@shikijs/core': |
| 286 | specifier: 4.2.0 | 287 | specifier: 4.2.0 |
| 287 | version: 4.2.0 | 288 | version: 4.2.0 |
| ... | @@ -302,7 +303,7 @@ importers: | ... | @@ -302,7 +303,7 @@ importers: |
| 302 | version: link:../../packages/contracts | 303 | version: link:../../packages/contracts |
| 303 | '@t3tools/mobile-markdown-text': | 304 | '@t3tools/mobile-markdown-text': |
| 304 | specifier: file:./modules/t3-markdown-text | 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 | '@t3tools/mobile-review-diff-native': | 307 | '@t3tools/mobile-review-diff-native': |
| 307 | specifier: file:./modules/t3-review-diff | 308 | specifier: file:./modules/t3-review-diff |
| 308 | version: file:apps/mobile/modules/t3-review-diff | 309 | version: file:apps/mobile/modules/t3-review-diff |
| ... | @@ -314,7 +315,7 @@ importers: | ... | @@ -314,7 +315,7 @@ importers: |
| 314 | version: link:../../packages/shared | 315 | version: link:../../packages/shared |
| 315 | '@tabler/icons-react-native': | 316 | '@tabler/icons-react-native': |
| 316 | specifier: ^3.44.0 | 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 | clsx: | 319 | clsx: |
| 319 | specifier: ^2.1.1 | 320 | specifier: ^2.1.1 |
| 320 | version: 2.1.1 | 321 | version: 2.1.1 |
| ... | @@ -325,155 +326,155 @@ importers: | ... | @@ -325,155 +326,155 @@ importers: |
| 325 | specifier: 4.0.0-rc.115 | 326 | specifier: 4.0.0-rc.115 |
| 326 | version: 4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5) | 327 | version: 4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5) |
| 327 | expo: | 328 | expo: |
| 328 | specifier: ~57.0.18 | 329 | specifier: 58.0.0 |
| 329 | version: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 330 | version: 58.0.0(3abfa3879936d948a635873738556226) |
| 330 | expo-asset: | 331 | expo-asset: |
| 331 | specifier: ~57.0.15 | 332 | specifier: ~58.0.9 |
| 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) | 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 | expo-audio: | 334 | expo-audio: |
| 334 | specifier: 57.0.4 | 335 | specifier: 58.0.3 |
| 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) | 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 | expo-auth-session: | 337 | expo-auth-session: |
| 337 | specifier: ~57.0.10 | 338 | specifier: ~58.0.6 |
| 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) | 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 | expo-blur: | 340 | expo-blur: |
| 340 | specifier: ~57.0.2 | 341 | specifier: 58.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) | 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 | expo-build-properties: | 343 | expo-build-properties: |
| 343 | specifier: ~57.0.15 | 344 | specifier: ~58.0.9 |
| 344 | version: 57.0.15(expo@57.0.18) | 345 | version: 58.0.9(expo@58.0.0) |
| 345 | expo-camera: | 346 | expo-camera: |
| 346 | specifier: ~57.0.4 | 347 | specifier: ~58.0.5 |
| 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) | 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 | expo-clipboard: | 349 | expo-clipboard: |
| 349 | specifier: ~57.0.1 | 350 | specifier: ~58.0.2 |
| 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) | 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 | expo-constants: | 352 | expo-constants: |
| 352 | specifier: 57.0.16 | 353 | specifier: 58.0.9 |
| 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)) | 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 | expo-crypto: | 355 | expo-crypto: |
| 355 | specifier: ~57.0.2 | 356 | specifier: ~58.0.3 |
| 356 | version: 57.0.2(expo@57.0.18) | 357 | version: 58.0.3(expo@58.0.0) |
| 357 | expo-dev-client: | 358 | expo-dev-client: |
| 358 | specifier: ~57.0.16 | 359 | specifier: ~58.0.9 |
| 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)) | 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 | expo-device: | 361 | expo-device: |
| 361 | specifier: ~57.0.1 | 362 | specifier: ~58.0.3 |
| 362 | version: 57.0.1(expo@57.0.18) | 363 | version: 58.0.3(expo@58.0.0) |
| 363 | expo-document-picker: | 364 | expo-document-picker: |
| 364 | specifier: ~57.0.1 | 365 | specifier: ~58.0.3 |
| 365 | version: 57.0.1(expo@57.0.18) | 366 | version: 58.0.3(expo@58.0.0) |
| 366 | expo-file-system: | 367 | expo-file-system: |
| 367 | specifier: ~57.0.6 | 368 | specifier: ~58.0.4 |
| 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)) | 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 | expo-font: | 370 | expo-font: |
| 370 | specifier: ~57.0.2 | 371 | specifier: ~58.0.4 |
| 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) | 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 | expo-glass-effect: | 373 | expo-glass-effect: |
| 373 | specifier: ~57.0.1 | 374 | specifier: 58.0.3 |
| 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) | 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 | expo-haptics: | 376 | expo-haptics: |
| 376 | specifier: ~57.0.2 | 377 | specifier: ~58.0.3 |
| 377 | version: 57.0.2(expo@57.0.18) | 378 | version: 58.0.3(expo@58.0.0) |
| 378 | expo-image: | 379 | expo-image: |
| 379 | specifier: ~57.0.3 | 380 | specifier: ~58.0.8 |
| 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) | 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 | expo-image-manipulator: | 382 | expo-image-manipulator: |
| 382 | specifier: ~57.0.17 | 383 | specifier: ~58.0.10 |
| 383 | version: 57.0.17(expo@57.0.18) | 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 | expo-image-picker: | 385 | expo-image-picker: |
| 385 | specifier: ~57.0.14 | 386 | specifier: ~58.0.9 |
| 386 | version: 57.0.14(expo@57.0.18) | 387 | version: 58.0.9(expo@58.0.0) |
| 387 | expo-keep-awake: | 388 | expo-keep-awake: |
| 388 | specifier: ~57.0.2 | 389 | specifier: ~58.0.2 |
| 389 | version: 57.0.2(expo@57.0.18)(react@19.2.3) | 390 | version: 58.0.2(expo@58.0.0)(react@19.3.0) |
| 390 | expo-linking: | 391 | expo-linking: |
| 391 | specifier: ~57.0.8 | 392 | specifier: ~58.0.9 |
| 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) | 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 | expo-network: | 394 | expo-network: |
| 394 | specifier: ~57.0.1 | 395 | specifier: ~58.0.2 |
| 395 | version: 57.0.1(expo@57.0.18)(react@19.2.3) | 396 | version: 58.0.2(expo@58.0.0)(react@19.3.0) |
| 396 | expo-notifications: | 397 | expo-notifications: |
| 397 | specifier: 57.0.15 | 398 | specifier: ~58.0.9 |
| 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) | 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 | expo-paste-input: | 400 | expo-paste-input: |
| 400 | specifier: ^0.1.15 | 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 | expo-quick-actions: | 403 | expo-quick-actions: |
| 403 | specifier: ^6.0.2 | 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 | expo-secure-store: | 406 | expo-secure-store: |
| 406 | specifier: ~57.0.2 | 407 | specifier: ~58.0.1 |
| 407 | version: 57.0.2(expo@57.0.18) | 408 | version: 58.0.1(expo@58.0.0) |
| 408 | expo-sharing: | 409 | expo-sharing: |
| 409 | specifier: 57.0.17 | 410 | specifier: 58.0.12 |
| 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) | 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 | expo-splash-screen: | 412 | expo-splash-screen: |
| 412 | specifier: ~57.0.8 | 413 | specifier: ~58.0.2 |
| 413 | version: 57.0.8(expo@57.0.18)(typescript@7.0.2) | 414 | version: 58.0.2(expo@58.0.0)(typescript@7.0.2) |
| 414 | expo-sqlite: | 415 | expo-sqlite: |
| 415 | specifier: ~57.0.2 | 416 | specifier: ~58.0.7 |
| 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) | 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 | expo-symbols: | 418 | expo-symbols: |
| 418 | specifier: ~57.0.2 | 419 | specifier: ~58.0.3 |
| 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) | 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 | expo-updates: | 421 | expo-updates: |
| 421 | specifier: ~57.0.19 | 422 | specifier: ~58.0.11 |
| 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) | 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 | expo-video: | 424 | expo-video: |
| 424 | specifier: ~57.0.3 | 425 | specifier: ~58.0.5 |
| 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) | 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 | expo-web-browser: | 427 | expo-web-browser: |
| 427 | specifier: ~57.0.2 | 428 | specifier: ~58.0.3 |
| 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)) | 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 | expo-widgets: | 430 | expo-widgets: |
| 430 | specifier: 57.0.15 | 431 | specifier: 58.0.9 |
| 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) | 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 | react: | 433 | react: |
| 433 | specifier: 19.2.3 | 434 | specifier: 19.3.0 |
| 434 | version: 19.2.3 | 435 | version: 19.3.0 |
| 435 | react-dom: | 436 | react-dom: |
| 436 | specifier: 19.2.3 | 437 | specifier: 19.3.0 |
| 437 | version: 19.2.3(react@19.2.3) | 438 | version: 19.3.0(react@19.3.0) |
| 438 | react-native: | 439 | react-native: |
| 439 | specifier: 0.86.3 | 440 | specifier: 0.88.0-rc.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) | 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 | react-native-gesture-handler: | 442 | react-native-gesture-handler: |
| 442 | specifier: ~2.32.0 | 443 | specifier: ~3.2.1 |
| 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) | 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 | react-native-image-viewing: | 445 | react-native-image-viewing: |
| 445 | specifier: ^0.2.2 | 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 | react-native-keyboard-controller: | 448 | react-native-keyboard-controller: |
| 448 | specifier: 1.21.13 | 449 | specifier: 1.22.4 |
| 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) | 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 | react-native-nitro-markdown: | 451 | react-native-nitro-markdown: |
| 451 | specifier: ^0.5.0 | 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 | react-native-nitro-modules: | 454 | react-native-nitro-modules: |
| 454 | specifier: 0.35.9 | 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 | react-native-reanimated: | 457 | react-native-reanimated: |
| 457 | specifier: 4.5.5 | 458 | specifier: 4.7.0 |
| 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) | 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 | react-native-safe-area-context: | 460 | react-native-safe-area-context: |
| 460 | specifier: ~5.7.0 | 461 | specifier: ~5.9.1 |
| 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) | 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 | react-native-screens: | 463 | react-native-screens: |
| 463 | specifier: ~4.26.0 | 464 | specifier: ~4.28.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) | 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 | react-native-shiki-engine: | 466 | react-native-shiki-engine: |
| 466 | specifier: ^0.3.12 | 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 | react-native-svg: | 469 | react-native-svg: |
| 469 | specifier: 15.15.4 | 470 | specifier: 15.15.5 |
| 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) | 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 | react-native-webview: | 472 | react-native-webview: |
| 472 | specifier: ^13.16.1 | 473 | specifier: 14.0.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) | 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 | react-native-worklets: | 475 | react-native-worklets: |
| 475 | specifier: 0.11.4 | 476 | specifier: 0.13.0 |
| 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) | 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 | shiki: | 478 | shiki: |
| 478 | specifier: 4.2.0 | 479 | specifier: 4.2.0 |
| 479 | version: 4.2.0 | 480 | version: 4.2.0 |
| ... | @@ -482,23 +483,23 @@ importers: | ... | @@ -482,23 +483,23 @@ importers: |
| 482 | version: 3.6.0 | 483 | version: 3.6.0 |
| 483 | uniwind: | 484 | uniwind: |
| 484 | specifier: 1.11.0 | 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 | devDependencies: | 487 | devDependencies: |
| 487 | '@effect/vitest': | 488 | '@effect/vitest': |
| 488 | specifier: 4.0.0-rc.115 | 489 | specifier: 4.0.0-rc.115 |
| 489 | version: 4.0.0-rc.115(patch_hash=172bd95ef73a13d322888984415d5d18d9d2aa8e13fa529eac235efac837e902)(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)) | 490 | version: 4.0.0-rc.115(patch_hash=172bd95ef73a13d322888984415d5d18d9d2aa8e13fa529eac235efac837e902)(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)) |
| 490 | '@pierre/trees': | 491 | '@pierre/trees': |
| 491 | specifier: 1.0.0-beta.4 | 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 | '@types/react': | 494 | '@types/react': |
| 494 | specifier: ~19.2.0 | 495 | specifier: ~19.3.0 |
| 495 | version: 19.2.16 | 496 | version: 19.3.0 |
| 496 | '@types/react-dom': | 497 | '@types/react-dom': |
| 497 | specifier: ~19.2.3 | 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 | babel-preset-expo: | 500 | babel-preset-expo: |
| 500 | specifier: ~57.0.9 | 501 | specifier: ~58.0.6 |
| 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) | 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 | tailwindcss: | 503 | tailwindcss: |
| 503 | specifier: 4.3.3 | 504 | specifier: 4.3.3 |
| 504 | version: 4.3.3 | 505 | version: 4.3.3 |
| ... | @@ -595,7 +596,7 @@ importers: | ... | @@ -595,7 +596,7 @@ importers: |
| 595 | dependencies: | 596 | dependencies: |
| 596 | '@base-ui/react': | 597 | '@base-ui/react': |
| 597 | specifier: ^1.4.1 | 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 | '@clerk/electron': | 600 | '@clerk/electron': |
| 600 | specifier: 0.0.44 | 601 | specifier: 0.0.44 |
| 601 | 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) | 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,7 +605,7 @@ importers: |
| 604 | version: 6.16.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) | 605 | version: 6.16.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) |
| 605 | '@daypicker/react': | 606 | '@daypicker/react': |
| 606 | specifier: ^10.0.1 | 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 | '@dnd-kit/core': | 609 | '@dnd-kit/core': |
| 609 | specifier: ^6.3.1 | 610 | specifier: ^6.3.1 |
| 610 | version: 6.3.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) | 611 | version: 6.3.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) |
| ... | @@ -667,7 +668,7 @@ importers: | ... | @@ -667,7 +668,7 @@ importers: |
| 667 | version: 3.31.3 | 668 | version: 3.31.3 |
| 668 | '@tiptap/react': | 669 | '@tiptap/react': |
| 669 | specifier: ^3.31.3 | 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 | '@tiptap/starter-kit': | 672 | '@tiptap/starter-kit': |
| 672 | specifier: ^3.31.3 | 673 | specifier: ^3.31.3 |
| 673 | version: 3.31.3 | 674 | version: 3.31.3 |
| ... | @@ -709,7 +710,7 @@ importers: | ... | @@ -709,7 +710,7 @@ importers: |
| 709 | version: 19.2.6(react@19.2.6) | 710 | version: 19.2.6(react@19.2.6) |
| 710 | react-markdown: | 711 | react-markdown: |
| 711 | specifier: ^10.1.0 | 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 | rehype-raw: | 714 | rehype-raw: |
| 714 | specifier: ^7.0.0 | 715 | specifier: ^7.0.0 |
| 715 | version: 7.0.0 | 716 | version: 7.0.0 |
| ... | @@ -727,7 +728,7 @@ importers: | ... | @@ -727,7 +728,7 @@ importers: |
| 727 | version: 3.6.0 | 728 | version: 3.6.0 |
| 728 | zustand: | 729 | zustand: |
| 729 | specifier: ^5.0.11 | 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 | devDependencies: | 732 | devDependencies: |
| 732 | '@effect/platform-node': | 733 | '@effect/platform-node': |
| 733 | specifier: 4.0.0-rc.115 | 734 | specifier: 4.0.0-rc.115 |
| ... | @@ -757,11 +758,11 @@ importers: | ... | @@ -757,11 +758,11 @@ importers: |
| 757 | specifier: ^4.0.4 | 758 | specifier: ^4.0.4 |
| 758 | version: 4.0.4 | 759 | version: 4.0.4 |
| 759 | '@types/react': | 760 | '@types/react': |
| 760 | specifier: ~19.2.14 | 761 | specifier: ~19.3.0 |
| 761 | version: 19.2.16 | 762 | version: 19.3.0 |
| 762 | '@types/react-dom': | 763 | '@types/react-dom': |
| 763 | specifier: ~19.2.3 | 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 | '@types/react-test-renderer': | 766 | '@types/react-test-renderer': |
| 766 | specifier: 19.1.0 | 767 | specifier: 19.1.0 |
| 767 | version: 19.1.0 | 768 | version: 19.1.0 |
| ... | @@ -800,7 +801,7 @@ importers: | ... | @@ -800,7 +801,7 @@ importers: |
| 800 | dependencies: | 801 | dependencies: |
| 801 | '@clerk/backend': | 802 | '@clerk/backend': |
| 802 | specifier: 3.18.1 | 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 | '@effect/sql-pg': | 805 | '@effect/sql-pg': |
| 805 | specifier: 4.0.0-rc.115 | 806 | specifier: 4.0.0-rc.115 |
| 806 | version: 4.0.0-rc.115(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)) | 807 | version: 4.0.0-rc.115(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)) |
| ... | @@ -821,10 +822,10 @@ importers: | ... | @@ -821,10 +822,10 @@ importers: |
| 821 | version: link:../../packages/shared | 822 | version: link:../../packages/shared |
| 822 | alchemy: | 823 | alchemy: |
| 823 | specifier: 2.0.0-beta.79 | 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 | drizzle-orm: | 826 | drizzle-orm: |
| 826 | specifier: 1.0.0-rc.5-ab785fc | 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 | effect: | 829 | effect: |
| 829 | specifier: 4.0.0-rc.115 | 830 | specifier: 4.0.0-rc.115 |
| 830 | version: 4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5) | 831 | version: 4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5) |
| ... | @@ -1096,6 +1097,15 @@ importers: | ... | @@ -1096,6 +1097,15 @@ importers: |
| 1096 | 1097 | ||
| 1097 | packages: | 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 | '@ai-sdk/provider-utils@4.0.49': | 1109 | '@ai-sdk/provider-utils@4.0.49': |
| 1100 | resolution: {integrity: sha512-8e7pd+82bobqrFOaD5dG/PiEuvLYr5olaE3I56ch0jipR0H7sGD6ohwTUynv6k8O8QidWiyIbEsZCtr/2dyXIA==} | 1110 | resolution: {integrity: sha512-8e7pd+82bobqrFOaD5dG/PiEuvLYr5olaE3I56ch0jipR0H7sGD6ohwTUynv6k8O8QidWiyIbEsZCtr/2dyXIA==} |
| 1101 | engines: {node: '>=18.17'} | 1111 | engines: {node: '>=18.17'} |
| ... | @@ -1688,12 +1698,6 @@ packages: | ... | @@ -1688,12 +1698,6 @@ packages: |
| 1688 | peerDependencies: | 1698 | peerDependencies: |
| 1689 | '@babel/core': ^7.0.0-0 | 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 | '@babel/plugin-transform-react-jsx@7.29.7': | 1701 | '@babel/plugin-transform-react-jsx@7.29.7': |
| 1698 | resolution: {integrity: sha512-WsZulLVBUHXVj2cUcPVx6UE21TpalB6bHbSFErKT0Ib++ax24jjXe73FqlWvdylFOjiuPHYi6VCcgRad1ItN+A==} | 1702 | resolution: {integrity: sha512-WsZulLVBUHXVj2cUcPVx6UE21TpalB6bHbSFErKT0Ib++ax24jjXe73FqlWvdylFOjiuPHYi6VCcgRad1ItN+A==} |
| 1699 | engines: {node: '>=6.9.0'} | 1703 | engines: {node: '>=6.9.0'} |
| ... | @@ -1921,7 +1925,7 @@ packages: | ... | @@ -1921,7 +1925,7 @@ packages: |
| 1921 | expo: '>=54 <58' | 1925 | expo: '>=54 <58' |
| 1922 | expo-apple-authentication: '>=7.0.0' | 1926 | expo-apple-authentication: '>=7.0.0' |
| 1923 | expo-auth-session: '>=5' | 1927 | expo-auth-session: '>=5' |
| 1924 | expo-constants: 57.0.16 | 1928 | expo-constants: 58.0.9 |
| 1925 | expo-crypto: '>=12' | 1929 | expo-crypto: '>=12' |
| 1926 | expo-local-authentication: '>=13.5.0' | 1930 | expo-local-authentication: '>=13.5.0' |
| 1927 | expo-secure-store: '>=12.4.0' | 1931 | expo-secure-store: '>=12.4.0' |
| ... | @@ -2286,10 +2290,6 @@ packages: | ... | @@ -2286,10 +2290,6 @@ packages: |
| 2286 | peerDependencies: | 2290 | peerDependencies: |
| 2287 | effect: 4.0.0-rc.115 | 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 | '@electric-sql/pglite@0.3.15': | 2293 | '@electric-sql/pglite@0.3.15': |
| 2294 | resolution: {integrity: sha512-Cj++n1Mekf9ETfdc16TlDi+cDDQF0W7EcbyRHYOAeZdsAe8M/FJg18itDTSwyHfar2WIezawM9o0EKaRGVKygQ==} | 2294 | resolution: {integrity: sha512-Cj++n1Mekf9ETfdc16TlDi+cDDQF0W7EcbyRHYOAeZdsAe8M/FJg18itDTSwyHfar2WIezawM9o0EKaRGVKygQ==} |
| 2295 | 2295 | ||
| ... | @@ -2732,12 +2732,12 @@ packages: | ... | @@ -2732,12 +2732,12 @@ packages: |
| 2732 | '@expo-google-fonts/material-symbols@0.4.38': | 2732 | '@expo-google-fonts/material-symbols@0.4.38': |
| 2733 | resolution: {integrity: sha512-IJkBtN1o8u9BW5fvSii1MyHPQ7Q0HxbWcVBvOrOzgMLpVtZw7R2w94wBTVR7kZwv3w1JNTESMmLA5Sqn1+Z36A==} | 2733 | resolution: {integrity: sha512-IJkBtN1o8u9BW5fvSii1MyHPQ7Q0HxbWcVBvOrOzgMLpVtZw7R2w94wBTVR7kZwv3w1JNTESMmLA5Sqn1+Z36A==} |
| 2734 | 2734 | ||
| 2735 | '@expo/cli@57.0.20': | 2735 | '@expo/cli@58.0.9': |
| 2736 | resolution: {integrity: sha512-ZjWz7SA5TBTyKq4+aFRUPgMFxmqHtKkDMv6d85J2UAAjdRhkNRf+B80t+rr5IFo2ywuTvyrPRBth4ei4w08olA==} | 2736 | resolution: {integrity: sha512-qoCjBSbq8sFmhPHA0jgDvkRdGvVm9Wjti0U/zlrqYrH/lVolqT8++RvWebCLIGrT1WHQ9HWOmaL7szKqbhVgiA==} |
| 2737 | hasBin: true | 2737 | hasBin: true |
| 2738 | peerDependencies: | 2738 | peerDependencies: |
| 2739 | expo: '*' | 2739 | expo: '*' |
| 2740 | expo-router: 57.0.17 | 2740 | expo-router: 58.0.10 |
| 2741 | react-native: '*' | 2741 | react-native: '*' |
| 2742 | peerDependenciesMeta: | 2742 | peerDependenciesMeta: |
| 2743 | expo-router: | 2743 | expo-router: |
| ... | @@ -2748,85 +2748,91 @@ packages: | ... | @@ -2748,85 +2748,91 @@ packages: |
| 2748 | '@expo/code-signing-certificates@0.0.6': | 2748 | '@expo/code-signing-certificates@0.0.6': |
| 2749 | resolution: {integrity: sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==} | 2749 | resolution: {integrity: sha512-iNe0puxwBNEcuua9gmTGzq+SuMDa0iATai1FlFTMHJ/vUmKvN/V//drXoLJkVb5i5H3iE/n/qIJxyoBnXouD0w==} |
| 2750 | 2750 | ||
| 2751 | '@expo/config-plugins@57.0.9': | 2751 | '@expo/config-plugins@58.0.4': |
| 2752 | resolution: {integrity: sha512-hHgfL1avkCdEvDSw7IwlKwRYYNgcxzbNNMIk6W6lTkJpY0MajinAfeJUS0J+wPCsjUfGbVqOJM+XhPaO5ulUxg==} | 2752 | resolution: {integrity: sha512-JlZSHqYPU7nrU1E68KGpoW9pcXYgHfKOeTnqXXOop/4yj9UarOe9Y26Wlp6fhXjZ28ZooBJxo3J0Z5SSuLfbDQ==} |
| 2753 | 2753 | ||
| 2754 | '@expo/config-types@57.0.2': | 2754 | '@expo/config-types@58.0.2': |
| 2755 | resolution: {integrity: sha512-ewW08OonrcRIsRKIlFvvcmmafE5zemb1ocu3HkNwtVPyRtj2w42pZCAkMIROYpcVBaPnc3mDT9UZDzwXWC3i6g==} | 2755 | resolution: {integrity: sha512-iXoMw0/8KVSrrGRxOnf69eB9k5iPomOH7RPJnYEErAMFCfl2QCkftkHVSUdZ3qxtpx9EjRm0MANyAoQj77U7qw==} |
| 2756 | 2756 | ||
| 2757 | '@expo/config@57.0.9': | 2757 | '@expo/config@58.0.1': |
| 2758 | resolution: {integrity: sha512-dmzlKraIFxa7wLwV6K7WzI8jp6QZpW6Mc5mGjLimJUFjzh4uQdYaT3m3plEutM5yxBoBEwqzks7l+I/ljCbxAQ==} | 2758 | resolution: {integrity: sha512-sFI8mxS2p3E08xOGk1fKTQiuF27EQj1evwT4fXeMoaD6RjDJJDVmwJ27FMb6d4a/NObwgieIlGtoCE0+mmfD4A==} |
| 2759 | 2759 | ||
| 2760 | '@expo/devcert@1.2.1': | 2760 | '@expo/devcert@1.2.1': |
| 2761 | resolution: {integrity: sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==} | 2761 | resolution: {integrity: sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==} |
| 2762 | 2762 | ||
| 2763 | '@expo/devtools@57.0.1': | 2763 | '@expo/devtools@58.0.2': |
| 2764 | resolution: {integrity: sha512-GyUf+wFNkbttaX0jR7MZa9bm77U0IrLg6d2AjpxdyoXw/w4abHoXG0oFufwLMgP9zLTd5+Ct4X/ffNUTnlzZgg==} | 2764 | resolution: {integrity: sha512-WBj/K+vv8JPSmY70ennL04YYOHkpEsGGkfuVY9lfv4XO7Qhbt5qz4q6W7maME194I5oGcimRMigUFfWNkBe90w==} |
| 2765 | peerDependencies: | 2765 | peerDependencies: |
| 2766 | expo: '*' | ||
| 2766 | react: '*' | 2767 | react: '*' |
| 2767 | react-native: '*' | 2768 | react-native: '*' |
| 2768 | peerDependenciesMeta: | 2769 | peerDependenciesMeta: |
| 2770 | expo: | ||
| 2771 | optional: true | ||
| 2769 | react: | 2772 | react: |
| 2770 | optional: true | 2773 | optional: true |
| 2771 | react-native: | 2774 | react-native: |
| 2772 | optional: true | 2775 | optional: true |
| 2773 | 2776 | ||
| 2774 | '@expo/dom-webview@57.0.1': | 2777 | '@expo/dom-webview@58.0.2': |
| 2775 | resolution: {integrity: sha512-lAKsME4SAq+8sf56oN0DX5TBYyruupoRxbWbD2xf9RnKY8y6x8eb9LCE5pxSN0qyWdqnp+0wmyWzDkKboThKAw==} | 2778 | resolution: {integrity: sha512-bLkREoP7qL3rEuzxP60xG+TjdPoGjbnZfxkvYo5imJxGWfKMOf7x962W06Pu+WWAr4gcDRk16iA+Clg8D0zjCg==} |
| 2776 | peerDependencies: | 2779 | peerDependencies: |
| 2777 | expo: '*' | 2780 | expo: '*' |
| 2778 | react: '*' | 2781 | react: '*' |
| 2779 | react-native: '*' | 2782 | react-native: '*' |
| 2780 | 2783 | ||
| 2781 | '@expo/env@2.4.3': | 2784 | '@expo/env@2.5.1': |
| 2782 | resolution: {integrity: sha512-M1NXeZCA1mkMkYOyIe7PlyRX0/jqFtMoJgyblnlq/vpCRfmueFT7RnGSQG8uEFDF5WHOFGijAQ3fogPh3/n5Ng==} | 2785 | resolution: {integrity: sha512-FXr7sJtusDKrrtfxenRdAwbqARTasYY1+3vL3FjnlvwiWzvItnSBRbcspF6AI45jIBLbi2GHDIAorzAXhmA1+Q==} |
| 2783 | engines: {node: '>=20.12.0'} | 2786 | engines: {node: '>=20.12.0'} |
| 2784 | 2787 | ||
| 2785 | '@expo/expo-modules-macros-plugin@0.6.1': | 2788 | '@expo/fingerprint@0.21.2': |
| 2786 | resolution: {integrity: sha512-cpsLZE4rqkc1Y3eZTkxB98jrqY1YXgetmtxFt8q89jBRmk3quRuk1BZo+VcnCSObZardjg99r1k5xijEMONFGA==} | 2789 | resolution: {integrity: sha512-LlXmTyDMsTYL5gGIUbTZ9EOrGPTmykmI44tld6v/hU0aSQndbdoAtT+LHvKKy6oSMdm1yHgHd2YzuMU+9MwwZQ==} |
| 2787 | |||
| 2788 | '@expo/fingerprint@0.20.11': | ||
| 2789 | resolution: {integrity: sha512-GC43EcjQwzpzNZISqmhvjKdi+6FTfxnC9ZxOeg6osCkYXJz94j107l0QpPLipg62khD5HAA5G5cUhevffbRC4w==} | ||
| 2790 | hasBin: true | 2790 | hasBin: true |
| 2791 | 2791 | ||
| 2792 | '@expo/image-utils@0.11.5': | 2792 | '@expo/image-utils@0.12.2': |
| 2793 | resolution: {integrity: sha512-KPQBTpmpAfy/Vu9y4wPW808/qtZxjYmyJg8cm2QCPAupp+qEWA3b5zmk0ulOwQ9OgeHxuCPgUqWgkwHFo7UsrQ==} | 2793 | resolution: {integrity: sha512-lz4ShWkci1UYI8JhBywQM15hamJ5YLG3kz9qjNNKS7cOq4EKkzf4ZZXLEzAPpQaN1j1wWpY2MtbPIYXFLNUHsA==} |
| 2794 | 2794 | ||
| 2795 | '@expo/image-utils@0.8.14': | 2795 | '@expo/image-utils@0.8.14': |
| 2796 | resolution: {integrity: sha512-5Sn+jG4Cw+shC2wDMXoqSAJnvERbiwzHn05FpWtD5IBflfTIs5gUmjzwiGVyjOdlMSQhgRrw/AymPbmO9h9mpQ==} | 2796 | resolution: {integrity: sha512-5Sn+jG4Cw+shC2wDMXoqSAJnvERbiwzHn05FpWtD5IBflfTIs5gUmjzwiGVyjOdlMSQhgRrw/AymPbmO9h9mpQ==} |
| 2797 | 2797 | ||
| 2798 | '@expo/inline-modules@0.1.7': | 2798 | '@expo/inline-modules@0.2.1': |
| 2799 | resolution: {integrity: sha512-Bz/khd1gIJqDkje7t5ejD5e9jFbm4xEJzWSwRKadRo6gruepbw1xJ3Eb+e58OS8fY1ZNQYjzZbspnuph67sN0g==} | 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': | 2804 | '@expo/local-build-cache-provider@58.0.1': |
| 2802 | resolution: {integrity: sha512-zxHWj4MKKMAL29ZQSY/Fssx4Thluk40JmuGNaeS078wy/NhlFhnVi+rHHunulE3xJAJ0CM73m8VK2+GkF9eRwQ==} | 2805 | resolution: {integrity: sha512-V7zXjGgivtiqLe1oa6PQUvamoTf2/HxyavUrQSmZyDDUV6/mLQoTBrslRnj41OSIlIUqah9lxrcl759vKgMxqw==} |
| 2803 | 2806 | ||
| 2804 | '@expo/local-build-cache-provider@57.0.8': | 2807 | '@expo/log-box-utils@58.0.1': |
| 2805 | resolution: {integrity: sha512-SEdE0pAQrr90bRh3MNR0ZuwoIBw390cYdFgbn7Vk0Mtm9EHaBfP7kYj+2hXnXZJgOEm3/JMtfoD3rV7rWA9FGg==} | 2808 | resolution: {integrity: sha512-BUDoo1BUsSNmGonRkVWBNI6moKsZxH/Tkt9a1pphOBJQMdr8/1HbhGEB84YOwaKMpMXMWAK6cwu3Ip8ax3J28g==} |
| 2806 | 2809 | ||
| 2807 | '@expo/log-box@57.0.4': | 2810 | '@expo/log-box@58.0.7': |
| 2808 | resolution: {integrity: sha512-IxwS9s1L2muj8mj8AQSuiy7u8OFJdc02NRFo2me/Tj6DiaeG5SREqmpBE4rQpR2cadqSg5jl8Qab8Cjie616dg==} | 2811 | resolution: {integrity: sha512-V6KY7IoeRZ7GqMRXQDrBF5w53w+a3PWWrNXnjzzkDC1uiaf2RN8qSACDPbJRUxJloL7X8EXnA7Q29i/YozxYSQ==} |
| 2809 | peerDependencies: | 2812 | peerDependencies: |
| 2810 | '@expo/dom-webview': 57.0.1 | 2813 | '@expo/dom-webview': 58.0.2 |
| 2811 | expo: '*' | 2814 | expo: '*' |
| 2812 | react: '*' | 2815 | react: '*' |
| 2813 | react-native: '*' | 2816 | react-native: '*' |
| 2817 | peerDependenciesMeta: | ||
| 2818 | expo: | ||
| 2819 | optional: true | ||
| 2814 | 2820 | ||
| 2815 | '@expo/metro-config@57.0.12': | 2821 | '@expo/metro-config@58.0.6': |
| 2816 | resolution: {integrity: sha512-S62Lrq35HZqBFD55423pmWb8PjaiR/W02zQC1uECBmw1vTN8WZaFz4TJ0i21EeJzwfebMb9MLxL8JZ102Z6VbA==} | 2822 | resolution: {integrity: sha512-jznif78n3+oOjvhtvmSqBbnkOfabDvouAMIXQXC3FlGl75bygzRTYvB+L712fvZOJd+LSo1jcCg2Q3swUnJyBA==} |
| 2817 | peerDependencies: | 2823 | peerDependencies: |
| 2818 | expo: '*' | 2824 | expo: '*' |
| 2819 | peerDependenciesMeta: | 2825 | peerDependenciesMeta: |
| 2820 | expo: | 2826 | expo: |
| 2821 | optional: true | 2827 | optional: true |
| 2822 | 2828 | ||
| 2823 | '@expo/metro-file-map@57.0.2': | 2829 | '@expo/metro-file-map@58.0.3': |
| 2824 | resolution: {integrity: sha512-tb50nSIWwKpRufSkGuivOK0FbUxv1Uwqptb0SzFTk0bkmYmcy3gIwnCbOHTfmrQDVndRhPEiu2SYgh9Z0PCvGg==} | 2830 | resolution: {integrity: sha512-BAYHbRc89uX/mfxkK7oPe+YUXrPKE0rn3rq/e0E/PimUBeTfQjs1Y6Y7A4gLPuDTtSczyiZzFFJiTyA4MlNl5w==} |
| 2825 | 2831 | ||
| 2826 | '@expo/metro-runtime@57.0.14': | 2832 | '@expo/metro-runtime@58.0.9': |
| 2827 | resolution: {integrity: sha512-LVpsfF0QOzlLSKlHYpxgW1cP1NKcYeaoalLO18jYHgqseSveEkb9VOffFpicTQ7AN03odZ4fgkUF+p5YpoY4yw==} | 2833 | resolution: {integrity: sha512-nWxcO3zFVIAMf9sw8n2meAy/pHlNQ1jbUe3aDYGun+slKx41sJ+xzd/Z2LFjuP2uzoyWE0v0zekEqzsA0fQ1AQ==} |
| 2828 | peerDependencies: | 2834 | peerDependencies: |
| 2829 | '@expo/log-box': ^57.0.4 | 2835 | '@expo/log-box': ^58.0.7 |
| 2830 | expo: '*' | 2836 | expo: '*' |
| 2831 | react: '*' | 2837 | react: '*' |
| 2832 | react-dom: '*' | 2838 | react-dom: '*' |
| ... | @@ -2835,21 +2841,21 @@ packages: | ... | @@ -2835,21 +2841,21 @@ packages: |
| 2835 | react-dom: | 2841 | react-dom: |
| 2836 | optional: true | 2842 | optional: true |
| 2837 | 2843 | ||
| 2838 | '@expo/metro@56.0.2': | 2844 | '@expo/metro@58.0.0-rc.0': |
| 2839 | resolution: {integrity: sha512-Ld5AeYMCCDa8bLeWhfuLbZFFjlV3f6ORqyPz2glGh6RltIngMuLf9BTC2yvHFjkKuGxL5SynijmA8xmNNWn5iA==} | 2845 | resolution: {integrity: sha512-9ZXNH/rppKQcoW0ycTSQqnKcjuYnutWf/6YkfAh1PBeWs+W1Nuc2uMTRM0qWNc9btbD4iHZKovru3gJqMgFzFQ==} |
| 2840 | 2846 | ||
| 2841 | '@expo/osascript@2.7.1': | 2847 | '@expo/osascript@2.8.1': |
| 2842 | resolution: {integrity: sha512-Zn03EX6In7ts2lPUW2ESUSkEhEWQN1qqsiXjadtZMJOuZRkMiAg1ZQHuvz9DjByDWNJ2pBwAGyrts9lj9k389g==} | 2848 | resolution: {integrity: sha512-SCi+6q6uOkGhiAn6AIP/OPFgaIq/iKD2oYpnAOg2rShHStJ8ey7wyT127RbOaZXmlcY/62rHOX1WiiMnD8u/BA==} |
| 2843 | engines: {node: '>=12'} | 2849 | engines: {node: '>=12'} |
| 2844 | 2850 | ||
| 2845 | '@expo/package-manager@1.13.1': | 2851 | '@expo/package-manager@1.14.1': |
| 2846 | resolution: {integrity: sha512-y/K+CaYYpZpNGZhSX4HyLT/vyIunFjNfyoxNysPBCefeLKI/VCx6f9LNPzrxayr3rCYO5bl9O8H+HRQK265Nkg==} | 2852 | resolution: {integrity: sha512-aw/VqeDaZsn2G5FxJUfWgWkdcl4u/JsNhlQakAEUhu5++4AitDprw4Uc0PwerH76V8Y34U/nVypL+YTVs/pi2g==} |
| 2847 | 2853 | ||
| 2848 | '@expo/plist@0.8.1': | 2854 | '@expo/plist@0.10.1': |
| 2849 | resolution: {integrity: sha512-3gTReGIUm0oRaMClsAJYxBnVPCl6fVpsl8HS+DTVxDhW4GyVyxg9E/Znm3BvcHtUJ51RJJI14pC1wvrNilCRHw==} | 2855 | resolution: {integrity: sha512-nuNOqj+r/hGJbZ1Ax3jUpZaOB8UAMHUrISALJEUKaCieTflYj7224EqFWmMpriCGk9wXS1gH+9GGVnSj0tWzuQ==} |
| 2850 | 2856 | ||
| 2851 | '@expo/prebuild-config@57.0.15': | 2857 | '@expo/prebuild-config@58.0.6': |
| 2852 | resolution: {integrity: sha512-xTbWHroj0PDmlbqvmU+zF9ZZxveJkiuyiPoeRJYRGruFHebRAWnoTdw5S7d/UCzDBI8ropGGu9g2eb2nMxtvAw==} | 2858 | resolution: {integrity: sha512-rnaPdJ+bSHRlJ2ElANH5P1QKtJSFSTxxR7FSh4qpwPfFJs6L3ozhOLP4R1z5oFCXq6MUQfYIDHb51rUfPAgDMg==} |
| 2853 | 2859 | ||
| 2854 | '@expo/require-utils@55.0.5': | 2860 | '@expo/require-utils@55.0.5': |
| 2855 | resolution: {integrity: sha512-U4K/CQ2VpXuwfNGsN+daKmYOt15hCP8v/pXaYH6eut7kdYZo6SfJ1yr67BIcJ+1Gzzs+QzTxswAZChKpXmceyw==} | 2861 | resolution: {integrity: sha512-U4K/CQ2VpXuwfNGsN+daKmYOt15hCP8v/pXaYH6eut7kdYZo6SfJ1yr67BIcJ+1Gzzs+QzTxswAZChKpXmceyw==} |
| ... | @@ -2859,26 +2865,26 @@ packages: | ... | @@ -2859,26 +2865,26 @@ packages: |
| 2859 | typescript: | 2865 | typescript: |
| 2860 | optional: true | 2866 | optional: true |
| 2861 | 2867 | ||
| 2862 | '@expo/require-utils@57.0.5': | 2868 | '@expo/require-utils@58.0.2': |
| 2863 | resolution: {integrity: sha512-kTAXj9lDFEIPMsbAOGCGbjBbMF0oi7CqkYM79KOX0DDD9wSwXmlKL1z2h8OwsrBf7mbOo2DjlRvZu4BEjrIxGw==} | 2869 | resolution: {integrity: sha512-50w3h4s8eQze5L0PGfVAWGUWrT0ss9oHPa9INAIra43ScU+MP5s3b5qysvdv7mep9SgSX3+qdWIjcrOP5rNd+A==} |
| 2864 | peerDependencies: | 2870 | peerDependencies: |
| 2865 | typescript: ^5.0.0 || ^5.0.0-0 || ^6.0.0 || ^7.0.0 | 2871 | typescript: ^5.0.0 || ^5.0.0-0 || ^6.0.0 || ^7.0.0 |
| 2866 | peerDependenciesMeta: | 2872 | peerDependenciesMeta: |
| 2867 | typescript: | 2873 | typescript: |
| 2868 | optional: true | 2874 | optional: true |
| 2869 | 2875 | ||
| 2870 | '@expo/router-server@57.0.8': | 2876 | '@expo/router-server@58.0.4': |
| 2871 | resolution: {integrity: sha512-lEPGYoDmh97yyEcY/MFWQsfE7yIgMRnGDcnsBN7B6AiWBFSJIMEcGnO0aYPgY0ZjNWyJDi7Ee8QZRGqB+LhI6w==} | 2877 | resolution: {integrity: sha512-zoHpJzp7ltEY5w9eCINlkeCZg0BvtXexj0SIg/B9YGgFIiGYQDbtrQYy6eDc1lUICQn6ntzql3lrunegdConvw==} |
| 2872 | peerDependencies: | 2878 | peerDependencies: |
| 2873 | '@expo/metro-runtime': ^57.0.14 | 2879 | '@expo/metro-runtime': ^58.0.9 |
| 2874 | expo: '*' | 2880 | expo: '*' |
| 2875 | expo-constants: 57.0.16 | 2881 | expo-constants: 58.0.9 |
| 2876 | expo-font: ^57.0.1 | 2882 | expo-font: ^58.0.4 |
| 2877 | expo-router: 57.0.17 | 2883 | expo-router: 58.0.10 |
| 2878 | expo-server: ^57.0.3 | 2884 | expo-server: ^58.0.2 |
| 2879 | react: '*' | 2885 | react: '*' |
| 2880 | react-dom: '*' | 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 | peerDependenciesMeta: | 2888 | peerDependenciesMeta: |
| 2883 | '@expo/metro-runtime': | 2889 | '@expo/metro-runtime': |
| 2884 | optional: true | 2890 | optional: true |
| ... | @@ -2889,8 +2895,8 @@ packages: | ... | @@ -2889,8 +2895,8 @@ packages: |
| 2889 | react-server-dom-webpack: | 2895 | react-server-dom-webpack: |
| 2890 | optional: true | 2896 | optional: true |
| 2891 | 2897 | ||
| 2892 | '@expo/schema-utils@57.0.2': | 2898 | '@expo/schema-utils@58.0.1': |
| 2893 | resolution: {integrity: sha512-fMu/jyN0l1Wzv7XkeWR4IYCx1M8ryui3FdBNGrWwbRgJ7EhxXxK8E2jxP2W3pbgUwUY0V3hG8+GyfCZwny+Lxw==} | 2899 | resolution: {integrity: sha512-r5ox9st0g1IYC37tKD0WYiKH6RXout9FqjSwVv0nIhRYYTXhChJfzcMnJ90zkBznKO1lZVCqdO302YVYsm3qQA==} |
| 2894 | 2900 | ||
| 2895 | '@expo/sdk-runtime-versions@1.0.0': | 2901 | '@expo/sdk-runtime-versions@1.0.0': |
| 2896 | resolution: {integrity: sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==} | 2902 | resolution: {integrity: sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==} |
| ... | @@ -2902,8 +2908,8 @@ packages: | ... | @@ -2902,8 +2908,8 @@ packages: |
| 2902 | '@expo/sudo-prompt@9.3.2': | 2908 | '@expo/sudo-prompt@9.3.2': |
| 2903 | resolution: {integrity: sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==} | 2909 | resolution: {integrity: sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==} |
| 2904 | 2910 | ||
| 2905 | '@expo/ui@57.0.14': | 2911 | '@expo/ui@58.0.9': |
| 2906 | resolution: {integrity: sha512-m8Z5dCplkOOQ70lu/xfB67qhk00Muw4U1T9frHBIW3LxxJeJZQ+jOmV6vCk6O6zVgoG/ib1et7PeX6etxI4Rsw==} | 2912 | resolution: {integrity: sha512-uKwQb8zoDlbEw6jjHMA9OPzMVmo+sbnnKUhO/VNruaE3HF3swazCbrSRIomeznOVvyPP7EJsV5jXUrQgLAWzkg==} |
| 2907 | peerDependencies: | 2913 | peerDependencies: |
| 2908 | '@babel/core': '*' | 2914 | '@babel/core': '*' |
| 2909 | expo: '*' | 2915 | expo: '*' |
| ... | @@ -3464,6 +3470,58 @@ packages: | ... | @@ -3464,6 +3470,58 @@ packages: |
| 3464 | resolution: {integrity: sha512-ugvXJjwF5ldtUpa7D95kruNJ41yFQDEKyF5CW4TgKJnh+W/zmlBzXXeKTyqIgwMFrkePN2JqOBqcF0M0oOunow==} | 3470 | resolution: {integrity: sha512-ugvXJjwF5ldtUpa7D95kruNJ41yFQDEKyF5CW4TgKJnh+W/zmlBzXXeKTyqIgwMFrkePN2JqOBqcF0M0oOunow==} |
| 3465 | engines: {node: '>=0.3.0'} | 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 | '@octokit/auth-token@6.0.0': | 3525 | '@octokit/auth-token@6.0.0': |
| 3468 | resolution: {integrity: sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==} | 3526 | resolution: {integrity: sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==} |
| 3469 | engines: {node: '>= 20'} | 3527 | engines: {node: '>= 20'} |
| ... | @@ -3793,6 +3851,9 @@ packages: | ... | @@ -3793,6 +3851,9 @@ packages: |
| 3793 | '@oxc-project/types@0.127.0': | 3851 | '@oxc-project/types@0.127.0': |
| 3794 | resolution: {integrity: sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==} | 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 | '@oxc-project/types@0.146.0': | 3857 | '@oxc-project/types@0.146.0': |
| 3797 | resolution: {integrity: sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==} | 3858 | resolution: {integrity: sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==} |
| 3798 | 3859 | ||
| ... | @@ -4256,177 +4317,6 @@ packages: | ... | @@ -4256,177 +4317,6 @@ packages: |
| 4256 | yauzl: | 4317 | yauzl: |
| 4257 | optional: true | 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 | '@react-grab/cli@0.1.44': | 4320 | '@react-grab/cli@0.1.44': |
| 4431 | resolution: {integrity: sha512-gMDYY2rw6OWajCcDlXSIgs2LC432YJXSb3Lm5yM187uhRgBYddoEVULi36h+IolX3r7jSb3ew7vn9FfI8NSo0A==} | 4321 | resolution: {integrity: sha512-gMDYY2rw6OWajCcDlXSIgs2LC432YJXSb3Lm5yM187uhRgBYddoEVULi36h+IolX3r7jSb3ew7vn9FfI8NSo0A==} |
| 4432 | hasBin: true | 4322 | hasBin: true |
| ... | @@ -4448,78 +4338,78 @@ packages: | ... | @@ -4448,78 +4338,78 @@ packages: |
| 4448 | react: '*' | 4338 | react: '*' |
| 4449 | react-native: '*' | 4339 | react-native: '*' |
| 4450 | 4340 | ||
| 4451 | '@react-native/assets-registry@0.86.3': | 4341 | '@react-native/asset-utils@0.88.0-rc.3': |
| 4452 | resolution: {integrity: sha512-TDhgCZA4wjJg84d5A9swiOQYPIWSKEEVdg9IwMFZDupQzW/F3QoLUrfAJOcalgqTDA9/buTB8awhE3Whwg6u9Q==} | 4342 | resolution: {integrity: sha512-G3P/3lF1bvZoT4Za87UiVJCpTNNF6c07sTNINXYiSxXDpPiM8piisgqdgueyy90cKH6ReL28y2S8glRiG+jkeQ==} |
| 4453 | engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} | 4343 | engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} |
| 4454 | 4344 | ||
| 4455 | '@react-native/babel-plugin-codegen@0.86.3': | 4345 | '@react-native/babel-plugin-codegen@0.88.0-rc.3': |
| 4456 | resolution: {integrity: sha512-O6Xza4JBGPIU8J7YbKTyBoYL4thpy8jMW/oaLDWdAyOwYHKIjK47pAL5HUEbOe2bWz2PEKjbYRF2ApkJv1ottQ==} | 4346 | resolution: {integrity: sha512-v68EZUjkcs2ZLL1ayA2aQ79imy7BGlc6uAteKMDhA8vf0QKT92YHkSFMGA1+df38d3/v3R+AB6X6XFhixQ1EEQ==} |
| 4457 | engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} | 4347 | engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} |
| 4458 | 4348 | ||
| 4459 | '@react-native/babel-preset@0.86.3': | 4349 | '@react-native/babel-preset@0.88.0-rc.3': |
| 4460 | resolution: {integrity: sha512-/eqs/Hy9RZRcjdcs4wj3Cqmxvtb3NM5g+Uuh1RIvsjynMO8PRsrVWWLWgBcZL/jYUo+ogXd2NFB0W8L5Bg89xw==} | 4350 | resolution: {integrity: sha512-xkAmd1gSQWjl5QnY0YFuMhjykdABljvuUY0McQHHLf4GJHEcpwuRPf3kM5lDq8p/y+Ui2iAbGgQsGExFY6FV0w==} |
| 4461 | engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} | 4351 | engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} |
| 4462 | peerDependencies: | 4352 | peerDependencies: |
| 4463 | '@babel/core': '*' | 4353 | '@babel/core': '*' |
| 4464 | 4354 | ||
| 4465 | '@react-native/codegen@0.86.3': | 4355 | '@react-native/codegen@0.88.0-rc.3': |
| 4466 | resolution: {integrity: sha512-Ux4jHi0fh+bdtVEcL0gaPLbY56V+SvFUDl/8sRAE1jdb4k+o7fT/4Nc29yz4X+qfjstkSqObQTMBGhdzxH9JvA==} | 4356 | resolution: {integrity: sha512-fjDCsaVPTlrYHelSogo/J9RbeeJ+dfokyw57VdtFa3HMWssCSqBmgnSoKKexQAO6U4fppAm91550DC8+02pL4A==} |
| 4467 | engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} | 4357 | engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} |
| 4468 | peerDependencies: | 4358 | peerDependencies: |
| 4469 | '@babel/core': '*' | 4359 | '@babel/core': '*' |
| 4470 | 4360 | ||
| 4471 | '@react-native/community-cli-plugin@0.86.3': | 4361 | '@react-native/community-cli-plugin@0.88.0-rc.3': |
| 4472 | resolution: {integrity: sha512-qSDL9LQc5mZSZPNczT95WU9YQuPzxBklgON9vLhhqfI0yWIwKInqFx88dQ/uiEXBtf0yossthaQIqA4Ml6bF6g==} | 4362 | resolution: {integrity: sha512-wfchdOOL4EM12jQuDY75uG9/pJ1dMckugJmAkLsyHY2akhjImdn7rq0Ea7q2nLK0talq56jTklpXQZVoVvyrAA==} |
| 4473 | engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} | 4363 | engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} |
| 4474 | peerDependencies: | 4364 | peerDependencies: |
| 4475 | '@react-native-community/cli': '*' | 4365 | '@react-native-community/cli': '*' |
| 4476 | '@react-native/metro-config': 0.86.3 | 4366 | '@react-native/metro-config': 0.88.0-rc.3 |
| 4477 | peerDependenciesMeta: | 4367 | peerDependenciesMeta: |
| 4478 | '@react-native-community/cli': | 4368 | '@react-native-community/cli': |
| 4479 | optional: true | 4369 | optional: true |
| 4480 | '@react-native/metro-config': | 4370 | '@react-native/metro-config': |
| 4481 | optional: true | 4371 | optional: true |
| 4482 | 4372 | ||
| 4483 | '@react-native/debugger-frontend@0.86.3': | 4373 | '@react-native/debugger-frontend@0.88.0-rc.3': |
| 4484 | resolution: {integrity: sha512-TQmeofQ0PcuylhhlleOeuzHYZfbrgm3gayXzowqUEzgRisTm1D40/J3ggqs7XkQi5HP5ZA3n8dHmKL9vIzPcsw==} | 4374 | resolution: {integrity: sha512-tv3DAqm5oTjQ9sYkr99UMKqc+VfoCZo13ZobzKD7oDRl7b+RT9wtyUiQrTuRQLrmadJ+TfU11G8xnyVmjHC/Sw==} |
| 4485 | engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} | 4375 | engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} |
| 4486 | 4376 | ||
| 4487 | '@react-native/debugger-shell@0.86.3': | 4377 | '@react-native/debugger-shell@0.88.0-rc.3': |
| 4488 | resolution: {integrity: sha512-O4ds+J7xZfxkbih9T+cAGegBdvKSPKYJm/lDgC9CpEjFMkmzWTpVLU3Qsv9sqZuo58z+sGhIcJfPsCFFWHpqbQ==} | 4378 | resolution: {integrity: sha512-ECf/bl4c/eGd77tNQnCizoLqYiOTyOQ1pU7SzVGI4Nql+aZiNR+lGaz3CJB1ve4+g+00hXTyiBjPjOmfNfdEYg==} |
| 4489 | engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} | 4379 | engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} |
| 4490 | 4380 | ||
| 4491 | '@react-native/dev-middleware@0.86.3': | 4381 | '@react-native/dev-middleware@0.88.0-rc.3': |
| 4492 | resolution: {integrity: sha512-LiEPTqTg/63bYUnrPyHLfjTDCNhA/+CUqI1+DsA9tYyewtSbULd5awsva6SgE10I+2iMhgKXS3ymkhU/kSCrGA==} | 4382 | resolution: {integrity: sha512-lM7ZJ/SZJAEHtN+TUlA4onk2PxRAIFSM/9v6bxtk6jkeXQyNIxFhXkqAzkI2vXV2ImtRv7XXjs4pwKkZ1jxJxg==} |
| 4493 | engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} | 4383 | engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} |
| 4494 | 4384 | ||
| 4495 | '@react-native/gradle-plugin@0.86.3': | 4385 | '@react-native/gradle-plugin@0.88.0-rc.3': |
| 4496 | resolution: {integrity: sha512-lxmx0GqLEWRIpZfpYFXlYVIs3ENQwaW6Vmp6oi29l2GoQJ1wZfFZRdMimDWlGEk8LKfHar3QH3iaPMkTcK9lEQ==} | 4386 | resolution: {integrity: sha512-mH7obkxTQ2s/7hANYIaGmZWXNgVIobbZNuV1YpTvWRZrwtLsl57scHevP87c6+j9RDYjzMSLIfHvfqDFo7cqoA==} |
| 4497 | engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} | 4387 | engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} |
| 4498 | 4388 | ||
| 4499 | '@react-native/js-polyfills@0.86.3': | 4389 | '@react-native/js-polyfills@0.88.0-rc.3': |
| 4500 | resolution: {integrity: sha512-eYIJ0es967+tePBFQDnl/gidVFxLns3fnbiK6rxscQrGodvuUO6hwxpQnfNynJ8MjbbndImXihXjcnJdc7SzJg==} | 4390 | resolution: {integrity: sha512-KONuwN2lvrLopOWVgLTFNwx1cwdlS5NZbmR+fQY5r6RvkHHvzbN4JqnfP2oQB0IGLxjJZPN0ljfhhPiCZ7YMdw==} |
| 4501 | engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} | 4391 | engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} |
| 4502 | 4392 | ||
| 4503 | '@react-native/metro-babel-transformer@0.86.3': | 4393 | '@react-native/metro-babel-transformer@0.88.0-rc.3': |
| 4504 | resolution: {integrity: sha512-0nlwVkG0uT9o72nrGTKUz/IqDnCkM4zE0ihe4r+OJcxH93yBdDm58AXJ3EXZeSjv3osHEFXU7ceajdZiS34mTw==} | 4394 | resolution: {integrity: sha512-ekhRzsHa13fDZYTSfq5SWS88wcc+2Magy3g2oG0fup7beFrbpLxGzIm1bpBNg892htwvWHtLDuV4CUvFKka/EQ==} |
| 4505 | engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} | 4395 | engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} |
| 4506 | peerDependencies: | 4396 | peerDependencies: |
| 4507 | '@babel/core': '*' | 4397 | '@babel/core': '*' |
| 4508 | 4398 | ||
| 4509 | '@react-native/metro-config@0.86.3': | 4399 | '@react-native/metro-config@0.88.0-rc.3': |
| 4510 | resolution: {integrity: sha512-qdzDMepV2xdUhsO4XC7idnnbt8K6+Hd59AjeK9y4KS86fxSQq5oL0TAbqUuajDGR7beNQoYTuS6AowN/zP0oaQ==} | 4400 | resolution: {integrity: sha512-nyJSwizwYxZtwHAaL7PFJ+33FN9Ho9q/5h931VtLTQDr6OxrWu957K2il9Yzd/k5wAURpv+DDB3Oagl3hl2HhQ==} |
| 4511 | engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} | 4401 | engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} |
| 4512 | 4402 | ||
| 4513 | '@react-native/normalize-colors@0.86.3': | 4403 | '@react-native/normalize-colors@0.88.0-rc.3': |
| 4514 | resolution: {integrity: sha512-Cv3CDkprb67GrzuaS9BGbBJC/6G4lIw3nyKOHRKTqTTum4bn37y5+R0Z04L8mcbQN85eEohNrRwb7IOM4j6uvg==} | 4404 | resolution: {integrity: sha512-el4NZ16vfh2quo56hB5G8cD8Bbk8N2+hamMfeaSWE5XCQC4vyTWGrE4FORjTdLAjv4Uh8LMuX87iMgwt2adArg==} |
| 4515 | 4405 | ||
| 4516 | '@react-native/virtualized-lists@0.86.3': | 4406 | '@react-native/virtualized-lists@0.88.0-rc.3': |
| 4517 | resolution: {integrity: sha512-1j44NEyNn05Ut40vHAmoSWbsIcybFkMAOBTwQt1PrESyfSS+qBoyU1LGIogNva0VIa0rQyEC5PzbA7R4/7Nhyw==} | 4407 | resolution: {integrity: sha512-0vI4q0kjrS3HPn5pg5IXkVUAmNBS67ZqKzhaAKfuxvQ3Xrr5Q5LOH7u6DphTSQ+Dy2GYeQUxSN1XqCUbpbcxxg==} |
| 4518 | engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} | 4408 | engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} |
| 4519 | peerDependencies: | 4409 | peerDependencies: |
| 4520 | '@types/react': ^19.2.0 | 4410 | '@types/react': ^19.2.0 |
| 4521 | react: '*' | 4411 | react: '*' |
| 4522 | react-native: 0.86.3 | 4412 | react-native: 0.88.0-rc.3 |
| 4523 | peerDependenciesMeta: | 4413 | peerDependenciesMeta: |
| 4524 | '@types/react': | 4414 | '@types/react': |
| 4525 | optional: true | 4415 | optional: true |
| ... | @@ -5379,9 +5269,6 @@ packages: | ... | @@ -5379,9 +5269,6 @@ packages: |
| 5379 | '@types/fs-extra@9.0.13': | 5269 | '@types/fs-extra@9.0.13': |
| 5380 | resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} | 5270 | resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} |
| 5381 | 5271 | ||
| 5382 | '@types/hammerjs@2.0.46': | ||
| 5383 | resolution: {integrity: sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==} | ||
| 5384 | |||
| 5385 | '@types/hast@3.0.4': | 5272 | '@types/hast@3.0.4': |
| 5386 | resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} | 5273 | resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} |
| 5387 | 5274 | ||
| ... | @@ -5441,8 +5328,8 @@ packages: | ... | @@ -5441,8 +5328,8 @@ packages: |
| 5441 | '@types/react-test-renderer@19.1.0': | 5328 | '@types/react-test-renderer@19.1.0': |
| 5442 | resolution: {integrity: sha512-XD0WZrHqjNrxA/MaR9O22w/RNidWR9YZmBdRGI7wcnWGrv/3dA8wKCJ8m63Sn+tLJhcjmuhOi629N66W6kgWzQ==} | 5329 | resolution: {integrity: sha512-XD0WZrHqjNrxA/MaR9O22w/RNidWR9YZmBdRGI7wcnWGrv/3dA8wKCJ8m63Sn+tLJhcjmuhOi629N66W6kgWzQ==} |
| 5443 | 5330 | ||
| 5444 | '@types/react@19.2.16': | 5331 | '@types/react@19.3.0': |
| 5445 | resolution: {integrity: sha512-esJiCAnl0kfpNdE69f3So4WJUXy95dLZydX0KwK46riIHDzHM7O9Vtf9xCHW0PXIqvgqNrswl522kA/5yx+F4w==} | 5332 | resolution: {integrity: sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==} |
| 5446 | 5333 | ||
| 5447 | '@types/responselike@1.0.3': | 5334 | '@types/responselike@1.0.3': |
| 5448 | resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} | 5335 | resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} |
| ... | @@ -6058,8 +5945,8 @@ packages: | ... | @@ -6058,8 +5945,8 @@ packages: |
| 6058 | resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} | 5945 | resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} |
| 6059 | engines: {node: '>= 14'} | 5946 | engines: {node: '>= 14'} |
| 6060 | 5947 | ||
| 6061 | agent-cli-detector@0.1.6: | 5948 | agent-cli-detector@0.1.7: |
| 6062 | resolution: {integrity: sha512-vKrPeEVN3upDF3GjWxsWBbwQgMtNJ8VB1cduPvK3svmmz4ENpS7yaPxbogsbe3w+xp9xp2Cu+0Ar41rjAR4+lA==} | 5949 | resolution: {integrity: sha512-d8OWDVdZMgjhLUT9ZPgSv/BdFFF9pVuscC0JdUSz3bjwE15gcp6u/o0/JooM2yyAWC49KThFhXlgTXRa9B7yng==} |
| 6063 | engines: {node: '>=18.18'} | 5950 | engines: {node: '>=18.18'} |
| 6064 | hasBin: true | 5951 | hasBin: true |
| 6065 | 5952 | ||
| ... | @@ -6220,10 +6107,6 @@ packages: | ... | @@ -6220,10 +6107,6 @@ packages: |
| 6220 | argparse@2.0.1: | 6107 | argparse@2.0.1: |
| 6221 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} | 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 | aria-query@5.3.0: | 6110 | aria-query@5.3.0: |
| 6228 | resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} | 6111 | resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} |
| 6229 | 6112 | ||
| ... | @@ -6307,21 +6190,18 @@ packages: | ... | @@ -6307,21 +6190,18 @@ packages: |
| 6307 | babel-plugin-react-native-web@0.21.2: | 6190 | babel-plugin-react-native-web@0.21.2: |
| 6308 | resolution: {integrity: sha512-SPD0J6qjJn8231i0HZhlAGH6NORe+QvRSQM2mwQEzJ2Fb3E4ruWTiiicPlHjmeWShDXLcvoorOCXjeR7k/lyWA==} | 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 | babel-plugin-syntax-hermes-parser@0.36.1: | 6193 | babel-plugin-syntax-hermes-parser@0.36.1: |
| 6314 | resolution: {integrity: sha512-ycduwJbvdvIMmVvlAZqGggS+pm5Eu4Bk9pcV9Sm2Z4PJNRVsKkv0g7vHj+LeuC1gHTeF67sJXFOq61IlqCa2hA==} | 6194 | resolution: {integrity: sha512-ycduwJbvdvIMmVvlAZqGggS+pm5Eu4Bk9pcV9Sm2Z4PJNRVsKkv0g7vHj+LeuC1gHTeF67sJXFOq61IlqCa2hA==} |
| 6315 | 6195 | ||
| 6316 | babel-plugin-transform-flow-enums@0.0.2: | 6196 | babel-plugin-transform-flow-enums@0.0.2: |
| 6317 | resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==} | 6197 | resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==} |
| 6318 | 6198 | ||
| 6319 | babel-preset-expo@57.0.9: | 6199 | babel-preset-expo@58.0.6: |
| 6320 | resolution: {integrity: sha512-T19biGOBTnMp161PyBqWOoSIEeZug8/EjtuUdVob8JPQKZMTalHUQaQt+qtQQE7XsEkZJ6erb3k0CohneTFzQg==} | 6200 | resolution: {integrity: sha512-e4PqE6comKx0CKZo2l1XlNoWE9mfabQvAHDk6CvqmDWMEh3vIJgBubZAbdBONsxaUqKON2SVnXKmmPD01iW1iA==} |
| 6321 | peerDependencies: | 6201 | peerDependencies: |
| 6322 | '@babel/runtime': ^7.20.0 | 6202 | '@babel/runtime': ^7.20.0 |
| 6323 | expo: '*' | 6203 | expo: '*' |
| 6324 | expo-widgets: ^57.0.13 | 6204 | expo-widgets: ^58.0.9 |
| 6325 | react-refresh: '>=0.14.0 <1.0.0' | 6205 | react-refresh: '>=0.14.0 <1.0.0' |
| 6326 | peerDependenciesMeta: | 6206 | peerDependenciesMeta: |
| 6327 | '@babel/runtime': | 6207 | '@babel/runtime': |
| ... | @@ -6537,20 +6417,9 @@ packages: | ... | @@ -6537,20 +6417,9 @@ packages: |
| 6537 | resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} | 6417 | resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} |
| 6538 | engines: {node: '>=18'} | 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 | chromium-pickle-js@0.2.0: | 6420 | chromium-pickle-js@0.2.0: |
| 6549 | resolution: {integrity: sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==} | 6421 | resolution: {integrity: sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==} |
| 6550 | 6422 | ||
| 6551 | ci-info@2.0.0: | ||
| 6552 | resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} | ||
| 6553 | |||
| 6554 | ci-info@3.9.0: | 6423 | ci-info@3.9.0: |
| 6555 | resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} | 6424 | resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} |
| 6556 | engines: {node: '>=8'} | 6425 | engines: {node: '>=8'} |
| ... | @@ -6873,6 +6742,10 @@ packages: | ... | @@ -6873,6 +6742,10 @@ packages: |
| 6873 | resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} | 6742 | resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} |
| 6874 | engines: {node: '>= 0.4'} | 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 | define-properties@1.2.1: | 6749 | define-properties@1.2.1: |
| 6877 | resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} | 6750 | resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} |
| 6878 | engines: {node: '>= 0.4'} | 6751 | engines: {node: '>= 0.4'} |
| ... | @@ -6911,9 +6784,6 @@ packages: | ... | @@ -6911,9 +6784,6 @@ packages: |
| 6911 | resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} | 6784 | resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} |
| 6912 | engines: {node: '>=8'} | 6785 | engines: {node: '>=8'} |
| 6913 | 6786 | ||
| 6914 | detect-node-es@1.1.0: | ||
| 6915 | resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} | ||
| 6916 | |||
| 6917 | detect-node@2.1.0: | 6787 | detect-node@2.1.0: |
| 6918 | resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} | 6788 | resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} |
| 6919 | 6789 | ||
| ... | @@ -6937,8 +6807,8 @@ packages: | ... | @@ -6937,8 +6807,8 @@ packages: |
| 6937 | dmg-builder@26.15.6: | 6807 | dmg-builder@26.15.6: |
| 6938 | resolution: {integrity: sha512-nr5vQxEhM0REomp1qiHbc6V99yrfBZy+wUU56VXADfSOlLj8PdLqsHiRe7b+FbqKesiyv4ax+k1GVwGonYKuCg==} | 6808 | resolution: {integrity: sha512-nr5vQxEhM0REomp1qiHbc6V99yrfBZy+wUU56VXADfSOlLj8PdLqsHiRe7b+FbqKesiyv4ax+k1GVwGonYKuCg==} |
| 6939 | 6809 | ||
| 6940 | dnssd-advertise@1.1.4: | 6810 | dnssd-advertise@1.1.6: |
| 6941 | resolution: {integrity: sha512-AmGyK9WpNf06WeP5TjHZq/wNzP76OuEeaiTlKr9E/EEelYLczywUKoqRz+DPRq/ErssjT4lU+/W7wzJW+7K/ZA==} | 6811 | resolution: {integrity: sha512-Ndrrf6BMPalkQPd/zubL+4YghH2J9NspapQ09uDXwYbvOPkP0oaqf5CkcwJ0b50kS2O3ul6yVu+jz+RY62Cejg==} |
| 6942 | 6812 | ||
| 6943 | dom-accessibility-api@0.5.16: | 6813 | dom-accessibility-api@0.5.16: |
| 6944 | resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} | 6814 | resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} |
| ... | @@ -7314,46 +7184,46 @@ packages: | ... | @@ -7314,46 +7184,46 @@ packages: |
| 7314 | resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} | 7184 | resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} |
| 7315 | engines: {node: '>=12.0.0'} | 7185 | engines: {node: '>=12.0.0'} |
| 7316 | 7186 | ||
| 7317 | expo-application@57.0.2: | 7187 | expo-application@58.0.2: |
| 7318 | resolution: {integrity: sha512-q31YwcXyymviAmdrtDfAg3Dld4VMxLCNAfgMHip7vZpPX4lzF/AfwsywqBJUAjQnJknzaNAkzqvMVjO5XmKYDA==} | 7188 | resolution: {integrity: sha512-N1ivhudcdS6KmEm8S9W14L3WVgFnCUv85MU1YX+AYauJcs9IZWRoM7Wl1JU+PUUYvbVGLHoXNpu0aE3jVTdkFg==} |
| 7319 | peerDependencies: | 7189 | peerDependencies: |
| 7320 | expo: '*' | 7190 | expo: '*' |
| 7321 | 7191 | ||
| 7322 | expo-asset@57.0.15: | 7192 | expo-asset@58.0.9: |
| 7323 | resolution: {integrity: sha512-ZoiUftQb1Nn1jvL6l1kZoUXvgRCx57tMQYxSsp+g4ZvY+jgVWp/THruXOtPtZVdC/WWZxPUTct53bfAm2EPDAQ==} | 7193 | resolution: {integrity: sha512-31fMfET8PyoCNGKmyjOY6fBTyTO7du80EjtrzZ/TsT+9zincWMUGwBWeby/fTXPHMEVgWQAiU2sKEteWEw8+Tg==} |
| 7324 | peerDependencies: | 7194 | peerDependencies: |
| 7325 | expo: '*' | 7195 | expo: '*' |
| 7326 | react: '*' | 7196 | react: '*' |
| 7327 | react-native: '*' | 7197 | react-native: '*' |
| 7328 | 7198 | ||
| 7329 | expo-audio@57.0.4: | 7199 | expo-audio@58.0.3: |
| 7330 | resolution: {integrity: sha512-TLP8rt1UvUDzgxGnyQ0TR9hV6tNP/UJQdDu7mSK+dgEydMFoptq55D3hcUoB1gF39f3/3AUuWfOtpGM+4N4X1A==} | 7200 | resolution: {integrity: sha512-BwH1calLvev1jfU/ZF3GIpW76LOhevLXk+nur0FZRZyiZJYxYvvg6scO0+XAt0d7pk6/kiPIirPHFlWgb79fpw==} |
| 7331 | peerDependencies: | 7201 | peerDependencies: |
| 7332 | expo: '*' | 7202 | expo: '*' |
| 7333 | expo-asset: '*' | 7203 | expo-asset: '*' |
| 7334 | react: '*' | 7204 | react: '*' |
| 7335 | react-native: '*' | 7205 | react-native: '*' |
| 7336 | 7206 | ||
| 7337 | expo-auth-session@57.0.10: | 7207 | expo-auth-session@58.0.6: |
| 7338 | resolution: {integrity: sha512-i1RY93LouEgal2e/Ly1r2Ytwed7/y6i4AUShVj4Gg49h/Okf8QpZO7XylwL43IHfKRrKkqapRDEN8mWe7z/HgA==} | 7208 | resolution: {integrity: sha512-kTTQcZ2WgFxJlV2XtlBJxikADl8zPk1T2tTcC5c2ZOpjfAXHPDF/4pC9tfyYxNe0fOjCq9+t6aVL5X0uzZdVmg==} |
| 7339 | peerDependencies: | 7209 | peerDependencies: |
| 7340 | react: '*' | 7210 | react: '*' |
| 7341 | react-native: '*' | 7211 | react-native: '*' |
| 7342 | 7212 | ||
| 7343 | expo-blur@57.0.2: | 7213 | expo-blur@58.0.2: |
| 7344 | resolution: {integrity: sha512-Aoud8H8lmlNkbRufyvRLefmGFELdBf1n5Te/Xm+Zx8ORINH+aXL+gKb5mbftFSha860+I7pMArz77TBYz8HDVg==} | 7214 | resolution: {integrity: sha512-2WKeR2FCSwTjTm+D0YLoLy/6rR583LYxlnhkB04zVkzWBiQKYCnOaUaOSsjQO2Nr/6ZpECmwXDhw4yzIuHZARQ==} |
| 7345 | peerDependencies: | 7215 | peerDependencies: |
| 7346 | expo: '*' | 7216 | expo: '*' |
| 7347 | react: '*' | 7217 | react: '*' |
| 7348 | react-native: '*' | 7218 | react-native: '*' |
| 7349 | 7219 | ||
| 7350 | expo-build-properties@57.0.15: | 7220 | expo-build-properties@58.0.9: |
| 7351 | resolution: {integrity: sha512-qZe9pnxlBpHT7SSNDR2a3C+P34xv67Ep9I0Erh+3xCczGlokyRd4pu9h0PrBdsVlr1d0QREQ1Do/+IgrIWkQQA==} | 7221 | resolution: {integrity: sha512-NJ2Zf1/ELtXVng9J8EH6F7zSA2tfjOyaq4itda3yaiSb5a5lgLjLg1+USwPo628HI/yGILGyOwmC8zxegEUyPQ==} |
| 7352 | peerDependencies: | 7222 | peerDependencies: |
| 7353 | expo: '*' | 7223 | expo: '*' |
| 7354 | 7224 | ||
| 7355 | expo-camera@57.0.4: | 7225 | expo-camera@58.0.5: |
| 7356 | resolution: {integrity: sha512-MqbbQ63O+cA8JbK3lfFHiD0f2jv8jB+EG/ILK6f5xnOPV9IR37yaG5+lGtRZNoOeYBzGypyOi17USItleMyuGw==} | 7226 | resolution: {integrity: sha512-UMc27NClJ5xnu2m/6Kz5zynOxJ7LluY0lgbu/TdxDZgGccjfM/myfLcO5r1FXaW84Llf3vTveG7SvwuRsNWIlQ==} |
| 7357 | peerDependencies: | 7227 | peerDependencies: |
| 7358 | expo: '*' | 7228 | expo: '*' |
| 7359 | react: '*' | 7229 | react: '*' |
| ... | @@ -7363,101 +7233,103 @@ packages: | ... | @@ -7363,101 +7233,103 @@ packages: |
| 7363 | react-native-web: | 7233 | react-native-web: |
| 7364 | optional: true | 7234 | optional: true |
| 7365 | 7235 | ||
| 7366 | expo-clipboard@57.0.1: | 7236 | expo-clipboard@58.0.2: |
| 7367 | resolution: {integrity: sha512-HWICri4+1ao7S6QEfcorxVumXDiDnx1guGGewjZgGJWLGxFYs0RgH8ujBs+lkTzBkMmlwADaWSlaesR+nDJt5Q==} | 7237 | resolution: {integrity: sha512-AiL1yU6iLX4sP8BZZyLzsSCo7XWysIBgVAck1vTqIkZm5PcVBeKiDgjXeJzG8nHBpti+ReeGhxbCaMQe7VbyMg==} |
| 7368 | peerDependencies: | 7238 | peerDependencies: |
| 7369 | expo: '*' | 7239 | expo: '*' |
| 7370 | react: '*' | 7240 | react: '*' |
| 7371 | react-native: '*' | 7241 | react-native: '*' |
| 7372 | 7242 | ||
| 7373 | expo-constants@57.0.16: | 7243 | expo-constants@58.0.9: |
| 7374 | resolution: {integrity: sha512-HG3yJjGZo2BPTo2F1sBoxdJZRwX7d9C554EhKn8m12K62pxGolCsvPSoh/lQf95OEP9vO34wwXB2C3QFs0KG0g==} | 7244 | resolution: {integrity: sha512-+EaES5uHt3t3kY4VPsvM0uiOo0sjiMKuxGKqdfKaNbpCg3FI5D3qfQbgDHf5fbM09DIfXSbymKeiZx/JKQgzng==} |
| 7375 | peerDependencies: | 7245 | peerDependencies: |
| 7376 | expo: '*' | 7246 | expo: '*' |
| 7377 | react-native: '*' | 7247 | react-native: '*' |
| 7378 | 7248 | ||
| 7379 | expo-crypto@57.0.2: | 7249 | expo-crypto@58.0.3: |
| 7380 | resolution: {integrity: sha512-OGLvHK7Hb7qsONMWGB9pJw3n+iY4OnZQmM/KwQEHRMrrOmNg0Lxj9+tp9bj46aAMMzXx0FTVA2jUKoplpXPnkA==} | 7250 | resolution: {integrity: sha512-i6es/jfng4LDnmgVmHMCsFPA0ns3Iur9ypH+reRLVqH2Mgi9spYqZgpuhpX3gMyu0rKYylLz2YM8n5wxvhNp7w==} |
| 7381 | peerDependencies: | 7251 | peerDependencies: |
| 7382 | expo: '*' | 7252 | expo: '*' |
| 7383 | 7253 | ||
| 7384 | expo-dev-client@57.0.16: | 7254 | expo-dev-client@58.0.9: |
| 7385 | resolution: {integrity: sha512-Txss9sgzEFI0E+4I34E76vPiukeVDHnqCj0ZXy8SDijVM31/P6MCNniVbEZk7MBPQclD0aopfuaCFtkV8+r1sw==} | 7255 | resolution: {integrity: sha512-JQPBDw0bZqZCqbOVxbphTaJXdlzuHcP7rXBxakWhotNy8nA5Ek4p6E8pIJu/OMWSLleoM0Dgtz05H/ShEHBItw==} |
| 7386 | peerDependencies: | 7256 | peerDependencies: |
| 7387 | expo: '*' | 7257 | expo: '*' |
| 7388 | 7258 | ||
| 7389 | expo-dev-launcher@57.0.16: | 7259 | expo-dev-launcher@58.0.9: |
| 7390 | resolution: {integrity: sha512-jaBr6q4A5js/r465m2mRxN8A87YOi8I6PiIt8XIt4qfQWDgw6hqGovaF1AVFGT1Z5jxkjtgK8WNz/rAeypjqPQ==} | 7260 | resolution: {integrity: sha512-wf7MDFbPOoTBD+ZWcFKyhxw+g1jghPL5yl9/r3PZmTiprpoMIZQXUBGpmnAHifJbA1Fhlhzm978tGU/Njr2t5Q==} |
| 7391 | peerDependencies: | 7261 | peerDependencies: |
| 7392 | expo: '*' | 7262 | expo: '*' |
| 7393 | react-native: '*' | 7263 | react-native: '*' |
| 7394 | 7264 | ||
| 7395 | expo-dev-menu-interface@57.0.0: | 7265 | expo-dev-menu-interface@58.0.1: |
| 7396 | resolution: {integrity: sha512-F47VdzOHYc19FhI/jBgctpO8a5UskTIxG6a1E5t3W5gF8VImuvBQffdXXfLHhsuCl7dS3v3U0R45cleeVXO1Zg==} | 7266 | resolution: {integrity: sha512-XdjO3ZZhEq1dXm15GVtzQ0SXxSTPguJIDZib3Z8tAf2jLxfPUlQObgO/0hdnw7ssEBhTT2jQo2HAfnOSGUfj8w==} |
| 7397 | peerDependencies: | 7267 | peerDependencies: |
| 7398 | expo: '*' | 7268 | expo: '*' |
| 7399 | 7269 | ||
| 7400 | expo-dev-menu@57.0.16: | 7270 | expo-dev-menu@58.0.9: |
| 7401 | resolution: {integrity: sha512-KzMHtAmnr0GqyU6MCrKLzIo/AfOjcToGhzK+pFeXlcqSPOrPJbTGlZqQ3E1o2G2jZMs+M1XvXh/VgnRyJUaRGw==} | 7271 | resolution: {integrity: sha512-+VJMHf6XeGgVhQsJY+9CqKP2JTAv6n8Ki5NJt70BF0iqM5LzWa+/vwRna+HcTVYPA1KfHErSfL2WlLJT9LDNyQ==} |
| 7402 | peerDependencies: | 7272 | peerDependencies: |
| 7403 | expo: '*' | 7273 | expo: '*' |
| 7404 | react-native: '*' | 7274 | react-native: '*' |
| 7405 | 7275 | ||
| 7406 | expo-device@57.0.1: | 7276 | expo-device@58.0.3: |
| 7407 | resolution: {integrity: sha512-jyEMDUticH+dhcL3GHa2aiifOvGXJsmb3oVT2R2q4i8bN7Bddy61+NkpMmuS2VAZrvoLQwf0TJJ/1vi1ukvutA==} | 7277 | resolution: {integrity: sha512-sK1xb02joE79KQ/c9c4oCaMhErjwUoL7IfInImRyxxmuEfKuzlNldBV61mahIrT3UyvYZBEwMM0Sx76Yqn7izg==} |
| 7408 | peerDependencies: | 7278 | peerDependencies: |
| 7409 | expo: '*' | 7279 | expo: '*' |
| 7410 | 7280 | ||
| 7411 | expo-document-picker@57.0.1: | 7281 | expo-document-picker@58.0.3: |
| 7412 | resolution: {integrity: sha512-qBwM5oxDZ3I9kwFD3pUE1oK/WNv9artoEKO6UpqhQgNRr0XA1ALRVWYjkF4+ge9lUNDRehjTm/jenINkzqg84g==} | 7282 | resolution: {integrity: sha512-7oNPAhvzjGoF3Yhmkpw8GppXT05I0RC6qzskW4wbRgDFhuQRhE8eUvYU7T/Bq6NX1ERu5TUbTI0QS9zo3DO1SQ==} |
| 7413 | peerDependencies: | 7283 | peerDependencies: |
| 7414 | expo: '*' | 7284 | expo: '*' |
| 7415 | 7285 | ||
| 7416 | expo-eas-client@57.0.2: | 7286 | expo-eas-client@58.0.1: |
| 7417 | resolution: {integrity: sha512-EfFiqUr0o9TvTOgMbqDiV1oIdG/d7kirhqtwa7roGmm9wF+CpXUz20d9YGzO6KzJWUYgdUgu4B6Ocv0jNJUdnQ==} | 7287 | resolution: {integrity: sha512-FkomAg1uLen36v8U7jyzMKbdrMjKRSufB9qSCnhWnJynYkeWK4qAb9UyJBD/afkbTFQfq+ARImjM7IAi3V+2NA==} |
| 7418 | 7288 | ||
| 7419 | expo-file-system@57.0.6: | 7289 | expo-file-system@58.0.4: |
| 7420 | resolution: {integrity: sha512-pm8PMYEW6BnVOCBJ7df9FcDmQtE1tqImuYphlfYe1ipQRLYtdCayRczJcbKIsnB3mqEyp4gC2gWmMbsAsAOjVg==} | 7290 | resolution: {integrity: sha512-w7Vuh1qA4fkZOSR4Zylvdr6bgOiH5p1hvfrnNlP+Xqb1x5h8Mu13yvQKUm4A1yc7BAeZ7CXu7//dw5hDEevFUg==} |
| 7421 | peerDependencies: | 7291 | peerDependencies: |
| 7422 | expo: '*' | 7292 | expo: '*' |
| 7423 | react-native: '*' | 7293 | react-native: '*' |
| 7424 | 7294 | ||
| 7425 | expo-font@57.0.2: | 7295 | expo-font@58.0.4: |
| 7426 | resolution: {integrity: sha512-eWR0CAdysgVqg8VewJ8b5wKh1pa6C8YShIEU3SP0+hlSqOk4djUwuJjn3P04KHVzL3hws9FrUuPxCNmd4TGung==} | 7296 | resolution: {integrity: sha512-AElYv+6hg7xgf8x7yL0zP8D2QrJuASU59iKC+yLd38SM6AvWFMlgBz0fkcgWtZFH7QI0Kz1WP+WsCQd06wYxBQ==} |
| 7427 | peerDependencies: | 7297 | peerDependencies: |
| 7428 | expo: '*' | 7298 | expo: '*' |
| 7429 | react: '*' | 7299 | react: '*' |
| 7430 | react-native: '*' | 7300 | react-native: '*' |
| 7431 | 7301 | ||
| 7432 | expo-glass-effect@57.0.1: | 7302 | expo-glass-effect@58.0.3: |
| 7433 | resolution: {integrity: sha512-m/n8maxqNcHk6ZDhuqXBfD5Kt1Iz3M8xykVgdB0iSCIXvF70IqWXmQhX8Psswhrp8eZ+3r0mAD0Jh/2gFA3QaA==} | 7303 | resolution: {integrity: sha512-NoFT5j2uZecNsiDAd47z37PWYTxNJnJMrVYiAU+SggiV9K91Sc0IuIcMsuOM4sUuPBQdSTs8/I9KXk5M0Z2O/w==} |
| 7434 | peerDependencies: | 7304 | peerDependencies: |
| 7435 | expo: '*' | 7305 | expo: '*' |
| 7436 | react: '*' | 7306 | react: '*' |
| 7437 | react-native: '*' | 7307 | react-native: '*' |
| 7438 | 7308 | ||
| 7439 | expo-haptics@57.0.2: | 7309 | expo-haptics@58.0.3: |
| 7440 | resolution: {integrity: sha512-vPths6zTxxaGaemC7D1GKbw1iOnOAAL5oAcCFVSgVNWnuLCBefL1LkhRBaJsepiMXRh2y3vwPiXkPaf6d16blA==} | 7310 | resolution: {integrity: sha512-5chRroIhYhB2CG6Ce7sE82q4EATF9O4G7oyeUlDumcVAZzpNWWJkCZ7ucajyHOj2Wc/rArg2h7jYmwI3sgxnNA==} |
| 7441 | peerDependencies: | 7311 | peerDependencies: |
| 7442 | expo: '*' | 7312 | expo: '*' |
| 7443 | 7313 | ||
| 7444 | expo-image-loader@57.0.1: | 7314 | expo-image-loader@58.0.2: |
| 7445 | resolution: {integrity: sha512-uhrZKLT/cTl2mXyR28kPpVkS5O+PK9N1QA/07IFM4f5T4g0lTW1JHT3NEWwEEsGFldPmVX4j7LwUVVZxE+woug==} | 7315 | resolution: {integrity: sha512-anioFtqL5sl7556fw0vZOJBqICq0cpQAUUeQlFR40e9OJawCguWAs/FFpJYNX94DUYrp8YzlacThSWNyh0YPGw==} |
| 7446 | peerDependencies: | 7316 | peerDependencies: |
| 7447 | expo: '*' | 7317 | expo: '*' |
| 7448 | 7318 | ||
| 7449 | expo-image-manipulator@57.0.17: | 7319 | expo-image-manipulator@58.0.10: |
| 7450 | resolution: {integrity: sha512-VpM8qAotTeSIobIAL8RAIDrZKL0jQBK/6O41NnwmdT96sd2wT263DlTbkvQ6RkcFrR9+NZiC5Um7FDBK+jFneg==} | 7320 | resolution: {integrity: sha512-JWapRwmOUq5RaePB1WKlEDgX/MewnRUeM6MKE0W7zEvbkyFYVn+4swUNOP3WDjDzu+To+878bqt7hcRcaqWzzA==} |
| 7451 | peerDependencies: | 7321 | peerDependencies: |
| 7452 | expo: '*' | 7322 | expo: '*' |
| 7323 | react: '*' | ||
| 7324 | react-native: '*' | ||
| 7453 | 7325 | ||
| 7454 | expo-image-picker@57.0.14: | 7326 | expo-image-picker@58.0.9: |
| 7455 | resolution: {integrity: sha512-NK9XBQqOtscbB/uRts1Gm7Oki6odMN3FQPWD6fSKmNUfKM69O6kcgU25lEXFTSLZ7sLl+AopHa2X0uILd8rjaQ==} | 7327 | resolution: {integrity: sha512-irYps0kkD+t17jHhBbQfm5Y9NbWXxULGyZPP/y90td3LE5zlFvFzNCj8Qnfif+ZFtg0QaL0T2fb/p5NLbfFA0w==} |
| 7456 | peerDependencies: | 7328 | peerDependencies: |
| 7457 | expo: '*' | 7329 | expo: '*' |
| 7458 | 7330 | ||
| 7459 | expo-image@57.0.3: | 7331 | expo-image@58.0.8: |
| 7460 | resolution: {integrity: sha512-EYfV8tIQxXLQPHhgZxc+bESUn2NcVw1U0RM28qqFeFfHyD1sBpIYJC2JTy24OtfBowYVoUyTvgf2ykWydiZVCw==} | 7332 | resolution: {integrity: sha512-kRzMdDK+Cp0Iunz/psYnFDvt2MGTYA2qsZrey+nkH3XrtjTJVRD9hhdnHh35vLO3LXJsUNXfEvGnNV+ghnk0Hw==} |
| 7461 | peerDependencies: | 7333 | peerDependencies: |
| 7462 | expo: '*' | 7334 | expo: '*' |
| 7463 | react: '*' | 7335 | react: '*' |
| ... | @@ -7467,32 +7339,33 @@ packages: | ... | @@ -7467,32 +7339,33 @@ packages: |
| 7467 | react-native-web: | 7339 | react-native-web: |
| 7468 | optional: true | 7340 | optional: true |
| 7469 | 7341 | ||
| 7470 | expo-json-utils@57.0.1: | 7342 | expo-json-utils@58.0.1: |
| 7471 | resolution: {integrity: sha512-cgTe1NqzQdYs/WN+3nIY5IZg8s0pb0xaTUbhYvxQDn137GbwRfHoGM2se3m3Vsl4Qu+B9G4RPEK5WJDEU2Do7g==} | 7343 | resolution: {integrity: sha512-jNHNElOUPz2/vW3CbDKRn6tTF6eE9wwVbh/Isnqp5c/CdTcONzFVR3YHN3WQ05PnkmieyEqVfeOusOd1X9FDtQ==} |
| 7472 | 7344 | ||
| 7473 | expo-keep-awake@57.0.2: | 7345 | expo-keep-awake@58.0.2: |
| 7474 | resolution: {integrity: sha512-GqgH746wtJImmsbyHmCQoi7cOslKuWQBbJHXr53S35Bpf5UvxCAztvnitUEd7D0QvFN2rvkOhylbZpgZZfBLlQ==} | 7346 | resolution: {integrity: sha512-UIddpQTJrYq/qsiuFHRJQwb1z1jojQ44XV2o6+bSuxLFKwO4KXp21to2GD3RkRFYLKdrEm98FLbzD9KpALkdKQ==} |
| 7475 | peerDependencies: | 7347 | peerDependencies: |
| 7476 | expo: '*' | 7348 | expo: '*' |
| 7477 | react: '*' | 7349 | react: '*' |
| 7478 | 7350 | ||
| 7479 | expo-linking@57.0.8: | 7351 | expo-linking@58.0.9: |
| 7480 | resolution: {integrity: sha512-gv0ZNaF7tILbcvX8xinNbQr6GIGQStxeUAJseweP+LjC9ped7Wl6EeyIMBlDR83U6Da+8drVeqBQSMvwAXgytA==} | 7352 | resolution: {integrity: sha512-EhA4cClb/rB8idwcrg0zQvgPxAiB0rnjy/zF9DLxmxxkTjV1Y1X3XphfeDxmoWNNf1gL9E47K/R6wsfJcni8aA==} |
| 7481 | peerDependencies: | 7353 | peerDependencies: |
| 7354 | expo: '*' | ||
| 7482 | react: '*' | 7355 | react: '*' |
| 7483 | react-native: '*' | 7356 | react-native: '*' |
| 7484 | 7357 | ||
| 7485 | expo-manifests@57.0.1: | 7358 | expo-manifests@58.0.1: |
| 7486 | resolution: {integrity: sha512-qB/mDG2dYdl+EvUeQuqP8KFYCFgFCQjJYdWIHo8SFBgDzMYmdF286DFY2M1M9Okr99wkb5M4tgA3aCcwv3aEQA==} | 7359 | resolution: {integrity: sha512-fVeJJ71Fj8FJgcAUggn6QIsm7CTxsXFgekLl4pEPHgON6fmcxog63FGO0sisQ3F6yUWFR4nn8iJmgBp1Exs7ew==} |
| 7487 | peerDependencies: | 7360 | peerDependencies: |
| 7488 | expo: '*' | 7361 | expo: '*' |
| 7489 | 7362 | ||
| 7490 | expo-modules-autolinking@57.0.12: | 7363 | expo-modules-autolinking@58.0.6: |
| 7491 | resolution: {integrity: sha512-Q8KAlq37nLKsQ+HsS9NpQVpd5jCgqtu694TDUNHBUBpV9ViD82mRBh8Uug/h68RG9xnLS+kuL4nYaCuFRghHjg==} | 7364 | resolution: {integrity: sha512-1O707KinH8UCUzi9JNeFqF87BJSh1fGgpwjdI/NzBhG2IoHAFQ1ngnpyqF6ikr/o01aGoBgjdCRRLfzEnop/IA==} |
| 7492 | hasBin: true | 7365 | hasBin: true |
| 7493 | 7366 | ||
| 7494 | expo-modules-core@57.0.14: | 7367 | expo-modules-core@58.0.9: |
| 7495 | resolution: {integrity: sha512-Cg3aQnVsQhZcMOF/RFgPGzMuhIak5W9eR9ecwmFSeQ813r4/49ut6RMA6PqUuUKuPCUIRqnBAHfSyTm1W9nfzg==} | 7368 | resolution: {integrity: sha512-0BD1t8aWXPGGA+222KzG4MA29iZVqBNJWCKoPKFwD9ab7x9wPkazLGifAp8m3VOYKLLMbzYD8uS9XTJdiplduA==} |
| 7496 | peerDependencies: | 7369 | peerDependencies: |
| 7497 | react: '*' | 7370 | react: '*' |
| 7498 | react-native: '*' | 7371 | react-native: '*' |
| ... | @@ -7501,19 +7374,22 @@ packages: | ... | @@ -7501,19 +7374,22 @@ packages: |
| 7501 | react-native-worklets: | 7374 | react-native-worklets: |
| 7502 | optional: true | 7375 | optional: true |
| 7503 | 7376 | ||
| 7504 | expo-modules-jsi@57.0.6: | 7377 | expo-modules-jsi@58.0.5: |
| 7505 | resolution: {integrity: sha512-WK0xFEe0FdZTCLCdfXK+HVNYfAmEbA6goecRxqjr0gh3XYRKAr9tikxqcM0ItLQoEPKntscPZhWcPLGvr97Tfw==} | 7378 | resolution: {integrity: sha512-5UMYPOEB1amqV7SCQKxJBvyZHycW4ZIeP3cwkv22pSE2nx3Hj6IymNz34TtIrCMcJAs6mO7MtG5OUsgwTp+iTQ==} |
| 7506 | peerDependencies: | 7379 | peerDependencies: |
| 7507 | react-native: '*' | 7380 | react-native: '*' |
| 7508 | 7381 | ||
| 7509 | expo-network@57.0.1: | 7382 | expo-modules-macros@0.14.0: |
| 7510 | resolution: {integrity: sha512-ndg+FbDDlz6XTpQ6aVuVgyvrYQwMkpcUAvZIXbwrGBbLTSWNzYC/gawYu1BAeDN7O6JTGY98GBVJBov/JH7LgQ==} | 7383 | resolution: {integrity: sha512-R6ODnfK0Za+pSZZjv0SuOTV2YkxczeavvrsLv40gueH3U7QJ8H5OlD3kkFqyT68UzDLRJhwF52D884egtNH7Rw==} |
| 7384 | |||
| 7385 | expo-network@58.0.2: | ||
| 7386 | resolution: {integrity: sha512-+Ek0nuLcZmW4f35L1lg4vo3lpotV0OUehFj8y5z0w/VEAw3WOeEzXh7Eo3TS6lIvsbyIJO7woWx8fYjMbGnhbA==} | ||
| 7511 | peerDependencies: | 7387 | peerDependencies: |
| 7512 | expo: '*' | 7388 | expo: '*' |
| 7513 | react: '*' | 7389 | react: '*' |
| 7514 | 7390 | ||
| 7515 | expo-notifications@57.0.15: | 7391 | expo-notifications@58.0.9: |
| 7516 | resolution: {integrity: sha512-H91z4WSFukSQP3dThgh6PCPFrT6VHeR+J2f7CuCOE72JV7YEGcBCir103QY58ocKsdgkodQpnkTU2m8LTHkWLg==} | 7392 | resolution: {integrity: sha512-Ygi1bvJKMiv6wP0r9b3WzDkZy28EbIeagNvxyQqcy6FoyuUpAIXbH0IgnaAjK3czPWin78jC3GsDJYeZbHFPDg==} |
| 7517 | peerDependencies: | 7393 | peerDependencies: |
| 7518 | expo: '*' | 7394 | expo: '*' |
| 7519 | react: '*' | 7395 | react: '*' |
| ... | @@ -7531,52 +7407,52 @@ packages: | ... | @@ -7531,52 +7407,52 @@ packages: |
| 7531 | peerDependencies: | 7407 | peerDependencies: |
| 7532 | expo: '*' | 7408 | expo: '*' |
| 7533 | 7409 | ||
| 7534 | expo-secure-store@57.0.2: | 7410 | expo-secure-store@58.0.1: |
| 7535 | resolution: {integrity: sha512-PhrPMKnI7YSObLEQZOoP9evB2ZOCv9kFuG2L7cZfNlOwWjGbir711PlppkXVoM3JE8vamDrTqzMLGv266FhJJg==} | 7411 | resolution: {integrity: sha512-jYKTkbXOlKrt3DiDw+f/EGc70UfyWNJgQiBEQ8ocyEpUehouyp9GcKza3gWixgLV8CWaCx4RtxiFQ5pFWaj0XQ==} |
| 7536 | peerDependencies: | 7412 | peerDependencies: |
| 7537 | expo: '*' | 7413 | expo: '*' |
| 7538 | 7414 | ||
| 7539 | expo-server@57.0.3: | 7415 | expo-server@58.0.2: |
| 7540 | resolution: {integrity: sha512-aK+LdKzauHSGmsOStZtyxdzv0zWssCkxTw3m4QuOhfDSJsZaMRTd9O41d8ixU/QfELTbaJ0oRNcF7JFV/7O9YQ==} | 7416 | resolution: {integrity: sha512-QOdIBRZ7hEhlKzDud99/4YPggg+rASCD901PuuDy/oHzSP+eQKs2B4PDwzwfYvtelDA45nOwJsyCKnBvwpuJZA==} |
| 7541 | engines: {node: '>=20.16.0'} | 7417 | engines: {node: ^22.13.0 || ^24.3.0 || ^26.0.0 || >=27.0.0} |
| 7542 | 7418 | ||
| 7543 | expo-sharing@57.0.17: | 7419 | expo-sharing@58.0.12: |
| 7544 | resolution: {integrity: sha512-p2B4SMeNsOv6hm1NkrxRlncjwu9mmLfi0drLaEyX13Rxn4DdDFPhuaezpOK7XLogTsmWGpfR46uq6oHMvSxbfA==} | 7420 | resolution: {integrity: sha512-2uwxo2+9W6WzA87FnBiwCAWkrBAoNUrNY7mJHA5k3Q5i/je6tH2N65kl5pACpYEIOOShQkOAd4zz7DVc23JydA==} |
| 7545 | peerDependencies: | 7421 | peerDependencies: |
| 7546 | expo: '*' | 7422 | expo: '*' |
| 7547 | react: '*' | 7423 | react: '*' |
| 7548 | react-native: '*' | 7424 | react-native: '*' |
| 7549 | 7425 | ||
| 7550 | expo-splash-screen@57.0.8: | 7426 | expo-splash-screen@58.0.2: |
| 7551 | resolution: {integrity: sha512-BEsrKg4niYBZa5AFzWRyGqxA4ZemtBOPwbCy+C336iGYYPuZYLEgWJGmm2xD1gRfCdrM/TP+l2ONd86Zvk3KyA==} | 7427 | resolution: {integrity: sha512-rYs8/d8GGFKBfj1cecr8/87nfUcdSmqQq/enm8Wmv1IuC3l1dxnxFRWlnz2KORCYLUw42M2vNRqlSU9ETHt8GQ==} |
| 7552 | peerDependencies: | 7428 | peerDependencies: |
| 7553 | expo: '*' | 7429 | expo: '*' |
| 7554 | 7430 | ||
| 7555 | expo-sqlite@57.0.2: | 7431 | expo-sqlite@58.0.7: |
| 7556 | resolution: {integrity: sha512-5KVbT7BQFZlIcQBXKWvwBERK3ODF6PSqct27GQKukZzAjsx2B97R+mwtYqrTUtUbw71VJrQrdr9Yl2OWYC7UpA==} | 7432 | resolution: {integrity: sha512-0ge3jryvlzEDyT7mXPEpTaqIIT65+n2noQfxBrWMdmSmuqL4L6eAYw/81C8UrXmDM97Y7vmmdR3abkMdN/a2mg==} |
| 7557 | peerDependencies: | 7433 | peerDependencies: |
| 7558 | expo: '*' | 7434 | expo: '*' |
| 7559 | react: '*' | 7435 | react: '*' |
| 7560 | react-native: '*' | 7436 | react-native: '*' |
| 7561 | 7437 | ||
| 7562 | expo-structured-headers@57.0.0: | 7438 | expo-structured-headers@58.0.1: |
| 7563 | resolution: {integrity: sha512-//t9UNPbJSEysc2x4VKJG/u7Osvv5DYJWsET5bqt/B+qcD1by/JXvSQzX3Q/YAgA96xFPontrz6OAPLbO4JKEA==} | 7439 | resolution: {integrity: sha512-wIduvAIUdGQk82osLjFiYYq3TFHUdG4RgmN+C//EySxn/2PTu0RsJsdgBtXrp/OT3YGeesNgfzb1mFxq5Zhp0g==} |
| 7564 | 7440 | ||
| 7565 | expo-symbols@57.0.2: | 7441 | expo-symbols@58.0.3: |
| 7566 | resolution: {integrity: sha512-qZ0iqOflm5lZGwRsQ5Y8sDksw3GAUKwHSX1bJBoocXf7gu14vafIXXYWte+JT9VfXAUGyKodJhLHP/GoOrcNWg==} | 7442 | resolution: {integrity: sha512-WmO6gAjvUlgS3gFgvuHN/JRPsfHaDPiPj31i28YBN5yjg/B/k2UiPHFgqfktm8Tyy+rVtUr4ttMp91sibnybRw==} |
| 7567 | peerDependencies: | 7443 | peerDependencies: |
| 7568 | expo: '*' | 7444 | expo: '*' |
| 7569 | expo-font: '*' | 7445 | expo-font: '*' |
| 7570 | react: '*' | 7446 | react: '*' |
| 7571 | react-native: '*' | 7447 | react-native: '*' |
| 7572 | 7448 | ||
| 7573 | expo-updates-interface@57.0.1: | 7449 | expo-updates-interface@58.0.1: |
| 7574 | resolution: {integrity: sha512-+LUWwJ0gf/TEKMVdQAw/Gjih4dvrk+URgy24X9qEGKuuMDZqjBRm9T4yQyBVALGL5TTdPUaB6ILxx3lshm3pwQ==} | 7450 | resolution: {integrity: sha512-OF+3BtMXtUsXWDfpHVNus9yHpx7WjMwjxDfeeN9LQBYSq/UtYmNNHBSfzChYTuqljWFSOAHRfsDykV9EB73Wlg==} |
| 7575 | peerDependencies: | 7451 | peerDependencies: |
| 7576 | expo: '*' | 7452 | expo: '*' |
| 7577 | 7453 | ||
| 7578 | expo-updates@57.0.19: | 7454 | expo-updates@58.0.11: |
| 7579 | resolution: {integrity: sha512-xX4KIUa8H2xKmiVDe/uEehD96MV6nyyF/OCrE+PBYfOEp6BbS8bYkHZfNFcoDCKMRuT6pg9JrCi8OmnoWlM/2A==} | 7455 | resolution: {integrity: sha512-7mijq0yyFhPExPO/IS/feFrmrbR6pZP3WOAYf07RkfW/3lacLBxWt5/rKG9QMe7ydbvjqMednhca1Rx48lB2mg==} |
| 7580 | hasBin: true | 7456 | hasBin: true |
| 7581 | peerDependencies: | 7457 | peerDependencies: |
| 7582 | expo: '*' | 7458 | expo: '*' |
| ... | @@ -7587,31 +7463,32 @@ packages: | ... | @@ -7587,31 +7463,32 @@ packages: |
| 7587 | expo-dev-client: | 7463 | expo-dev-client: |
| 7588 | optional: true | 7464 | optional: true |
| 7589 | 7465 | ||
| 7590 | expo-video@57.0.3: | 7466 | expo-video@58.0.5: |
| 7591 | resolution: {integrity: sha512-Z+rLdBSzICwoHm/HUxND5fm5nfgqiB+QPWAOKxmA8ScYwvxG1UGjZ6OaayvPc3GkT4aucsbycmFO0uUv/qnIhg==} | 7467 | resolution: {integrity: sha512-iJM0z/HR7Gocywq5Z4ou1CvTMaoGrXVNb1HzzENpqF+endoJcOGZFgV5uq+OGbiLtm7S/LSm/CCtcPwvVsdcCw==} |
| 7592 | peerDependencies: | 7468 | peerDependencies: |
| 7593 | expo: '*' | 7469 | expo: '*' |
| 7594 | react: '*' | 7470 | react: '*' |
| 7595 | react-native: '*' | 7471 | react-native: '*' |
| 7596 | 7472 | ||
| 7597 | expo-web-browser@57.0.2: | 7473 | expo-web-browser@58.0.3: |
| 7598 | resolution: {integrity: sha512-3vl5kvd7PB48ub6PpNIJUuPxO8xVa6D8RnIgNba6SXRwqFprOfeEZgwTgtm41kz0AAtvMOztUVNEUkwrHKjqMQ==} | 7474 | resolution: {integrity: sha512-SEPI0pphJ6rCTtJ01OWNRDTxvEqCTl3TkVRC3erUC1CGUrz5UWCzK+ejUx4F1WEayfj4j9tQAw0JDc+dzDq26g==} |
| 7599 | peerDependencies: | 7475 | peerDependencies: |
| 7600 | expo: '*' | 7476 | expo: '*' |
| 7601 | react-native: '*' | 7477 | react-native: '*' |
| 7602 | 7478 | ||
| 7603 | expo-widgets@57.0.15: | 7479 | expo-widgets@58.0.9: |
| 7604 | resolution: {integrity: sha512-dlwbUCLaxOZFcIejxtOo95NyqJMa4Sop4NPzJEvvD2MwXERBqxkp8RExxVDAEiBRIdAYqC1u02SnIJWT/27f7g==} | 7480 | resolution: {integrity: sha512-wGmI39qtJ6965rJA1bgAuKA2rEHfecoL939wxnBsSz3mvAAnSsjUNytP1rsVc0cBooPCssxqJST9EXGzee5Hfg==} |
| 7605 | peerDependencies: | 7481 | peerDependencies: |
| 7606 | expo: '*' | 7482 | expo: '*' |
| 7607 | react: '*' | 7483 | react: '*' |
| 7608 | react-native: '*' | 7484 | react-native: '*' |
| 7609 | 7485 | ||
| 7610 | expo@57.0.18: | 7486 | expo@58.0.0: |
| 7611 | resolution: {integrity: sha512-6nax9hJPhf9dWrstliXUABTJXDNIJrfJKcCtjSxuYVs2Yf127GIhKf3wsEYSFUl+LFdRbPPTNaweJePH159wZA==} | 7487 | resolution: {integrity: sha512-/KiC8tFY0hHl/mm49AFgNUFEQbnPthVh9o7EuDCSnTVpor8Cm/x1oqRyE97dxPT640lwuHO55xFO6OXopzjKXA==} |
| 7488 | engines: {node: ^22.13.0 || ^24.3.0 || ^26.0.0 || >=27.0.0} | ||
| 7612 | hasBin: true | 7489 | hasBin: true |
| 7613 | peerDependencies: | 7490 | peerDependencies: |
| 7614 | '@expo/dom-webview': 57.0.1 | 7491 | '@expo/dom-webview': 58.0.2 |
| 7615 | '@expo/metro-runtime': '*' | 7492 | '@expo/metro-runtime': '*' |
| 7616 | react: '*' | 7493 | react: '*' |
| 7617 | react-dom: '*' | 7494 | react-dom: '*' |
| ... | @@ -7755,12 +7632,25 @@ packages: | ... | @@ -7755,12 +7632,25 @@ packages: |
| 7755 | flow-enums-runtime@0.0.6: | 7632 | flow-enums-runtime@0.0.6: |
| 7756 | resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==} | 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 | fontace@0.4.1: | 7651 | fontace@0.4.1: |
| 7759 | resolution: {integrity: sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==} | 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 | fontkitten@1.0.3: | 7654 | fontkitten@1.0.3: |
| 7765 | resolution: {integrity: sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==} | 7655 | resolution: {integrity: sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==} |
| 7766 | engines: {node: '>=20'} | 7656 | engines: {node: '>=20'} |
| ... | @@ -7840,10 +7730,6 @@ packages: | ... | @@ -7840,10 +7730,6 @@ packages: |
| 7840 | resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} | 7730 | resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} |
| 7841 | engines: {node: '>= 0.4'} | 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 | get-proto@1.0.1: | 7733 | get-proto@1.0.1: |
| 7848 | resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} | 7734 | resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} |
| 7849 | engines: {node: '>= 0.4'} | 7735 | engines: {node: '>= 0.4'} |
| ... | @@ -7963,24 +7849,12 @@ packages: | ... | @@ -7963,24 +7849,12 @@ packages: |
| 7963 | heic-to@1.5.2: | 7849 | heic-to@1.5.2: |
| 7964 | resolution: {integrity: sha512-8Fns+lZHAWmz5U5IUxDeXKwIf3foBoKNPLxxFY4B0MkLjNuomEIHCoDbDE+x/llFK3NCEO1cu4+n3iUKY+Svmw==} | 7850 | resolution: {integrity: sha512-8Fns+lZHAWmz5U5IUxDeXKwIf3foBoKNPLxxFY4B0MkLjNuomEIHCoDbDE+x/llFK3NCEO1cu4+n3iUKY+Svmw==} |
| 7965 | 7851 | ||
| 7966 | hermes-compiler@250829098.0.17: | 7852 | hermes-compiler@260318099.0.4: |
| 7967 | resolution: {integrity: sha512-qG1PXzTEtriF6oQLZF3vyHhSMxOdW5h2TqqLri0rdpstPustd2fSvRZQMVAPdlhgFwBfYnj3OUZtiO6LjYsEFw==} | 7853 | resolution: {integrity: sha512-8odcPFkPC82HlqCl0C5QI9mBN4rEAT+IAo55sJhzwKw//K3qZloiv3ex6J2O8CuBbhdmkJozfidNsset2KH25w==} |
| 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==} | ||
| 7974 | 7854 | ||
| 7975 | hermes-estree@0.36.1: | 7855 | hermes-estree@0.36.1: |
| 7976 | resolution: {integrity: sha512-guv1nQ6IJ7S83NRFPWc3SA7IBZrdNC9kapwOq6uXvF4wP+sDCgjzQbKPCoyYmoyZRzztF/n/c36l/rccCZSiCw==} | 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 | hermes-parser@0.36.1: | 7858 | hermes-parser@0.36.1: |
| 7985 | resolution: {integrity: sha512-GApNk4zLHi2UWoWZZkx7LNCOSzLSc5lB55pZ/PhK7ycFeg7u5LcF88p/WbpIi1XUDtE0MpHE3uRR3u3KB7TjSQ==} | 7859 | resolution: {integrity: sha512-GApNk4zLHi2UWoWZZkx7LNCOSzLSc5lB55pZ/PhK7ycFeg7u5LcF88p/WbpIi1XUDtE0MpHE3uRR3u3KB7TjSQ==} |
| 7986 | 7860 | ||
| ... | @@ -7988,9 +7862,6 @@ packages: | ... | @@ -7988,9 +7862,6 @@ packages: |
| 7988 | resolution: {integrity: sha512-ciq6hFsSG/Bpt2DmrZJtv+56zpPdnq+NQ4ijEFrveKN0ZG1mhl/LdT1NQZ9se6ty1fACcI4d4vYqC9v8EYpH2A==} | 7862 | resolution: {integrity: sha512-ciq6hFsSG/Bpt2DmrZJtv+56zpPdnq+NQ4ijEFrveKN0ZG1mhl/LdT1NQZ9se6ty1fACcI4d4vYqC9v8EYpH2A==} |
| 7989 | hasBin: true | 7863 | hasBin: true |
| 7990 | 7864 | ||
| 7991 | hoist-non-react-statics@3.3.2: | ||
| 7992 | resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} | ||
| 7993 | |||
| 7994 | hono@4.13.7: | 7865 | hono@4.13.7: |
| 7995 | resolution: {integrity: sha512-c8/gF9ac8Y78/agExVocyLevgR+JlpNB444Py0FSX8pJoPdYUfUzRcXtYEYGwt6l19qIlVZPN5Mfsw9jFShmQQ==} | 7866 | resolution: {integrity: sha512-c8/gF9ac8Y78/agExVocyLevgR+JlpNB444Py0FSX8pJoPdYUfUzRcXtYEYGwt6l19qIlVZPN5Mfsw9jFShmQQ==} |
| 7996 | engines: {node: '>=16.9.0'} | 7867 | engines: {node: '>=16.9.0'} |
| ... | @@ -8057,11 +7928,6 @@ packages: | ... | @@ -8057,11 +7928,6 @@ packages: |
| 8057 | resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} | 7928 | resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} |
| 8058 | engines: {node: '>= 4'} | 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 | immediate@3.0.6: | 7931 | immediate@3.0.6: |
| 8066 | resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} | 7932 | resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} |
| 8067 | 7933 | ||
| ... | @@ -8347,9 +8213,6 @@ packages: | ... | @@ -8347,9 +8213,6 @@ packages: |
| 8347 | lie@3.3.0: | 8213 | lie@3.3.0: |
| 8348 | resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} | 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 | lightningcss-android-arm64@1.33.0: | 8216 | lightningcss-android-arm64@1.33.0: |
| 8354 | resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} | 8217 | resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} |
| 8355 | engines: {node: '>= 12.0.0'} | 8218 | engines: {node: '>= 12.0.0'} |
| ... | @@ -8517,9 +8380,6 @@ packages: | ... | @@ -8517,9 +8380,6 @@ packages: |
| 8517 | markdown-table@3.0.4: | 8380 | markdown-table@3.0.4: |
| 8518 | resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} | 8381 | resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} |
| 8519 | 8382 | ||
| 8520 | marky@1.3.0: | ||
| 8521 | resolution: {integrity: sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==} | ||
| 8522 | |||
| 8523 | matcher@3.0.0: | 8383 | matcher@3.0.0: |
| 8524 | resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} | 8384 | resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} |
| 8525 | engines: {node: '>=10'} | 8385 | engines: {node: '>=10'} |
| ... | @@ -8608,120 +8468,62 @@ packages: | ... | @@ -8608,120 +8468,62 @@ packages: |
| 8608 | meshoptimizer@0.22.0: | 8468 | meshoptimizer@0.22.0: |
| 8609 | resolution: {integrity: sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==} | 8469 | resolution: {integrity: sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==} |
| 8610 | 8470 | ||
| 8611 | metro-babel-transformer@0.84.4: | 8471 | metro-babel-transformer@0.87.1: |
| 8612 | resolution: {integrity: sha512-rvCfz8snl9h20VcvpOHxZuHP1SlAkv4HXbzw7nyyVwu6Eqo5PRerbakQ9XmUCOsRy70spJ37O+G1TK8oMzo48g==} | 8472 | resolution: {integrity: sha512-orvRIGpb0yK1yMbk5YP3dhVKjmoxUkRB9fdltGJxNppEqus/1tFpNuf9KnGFR3Qjg0izoUrJ4z6WgoBvdkXPrA==} |
| 8613 | engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} | 8473 | engines: {node: ^22.13.0 || ^24.3.0 || >= 26.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} | ||
| 8630 | 8474 | ||
| 8631 | metro-cache@0.84.5: | 8475 | metro-cache-key@0.87.1: |
| 8632 | resolution: {integrity: sha512-WHS0n2OxQqtwEjSeQFPePNrMvEFhmQcUQM9cRJMHByWoi/GMWFBEWOf7hVkAM/0KRutAXNbDlSu/cZB6CyxgQQ==} | 8476 | resolution: {integrity: sha512-scqVVPMA2c+RVO12I3wyMDp5xCkRPLsyrcG4Qc3xfU5JR0EW/0sz2tjty+5UjMUtG09uiM1KYQ8HjWg7OQXHtw==} |
| 8633 | engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} | 8477 | engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} |
| 8634 | 8478 | ||
| 8635 | metro-config@0.84.4: | 8479 | metro-cache@0.87.1: |
| 8636 | resolution: {integrity: sha512-PMotGDjXcXLWo2TMRH+VR99phFNgYTwqh4OoieIKK3yTJa1Jmkl+fZJxDO0jfBvNF+WESHciHvpNuBtXaF3B0Q==} | 8480 | resolution: {integrity: sha512-juNPaj0Xi5tkLp8imXqvbSnEIijwKG36m7OiFFVJMqEkiURwAjkMFVek3/xpix1+LVQqO7kjVp3PvuvIM61mKQ==} |
| 8637 | engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} | 8481 | engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} |
| 8638 | 8482 | ||
| 8639 | metro-config@0.84.5: | 8483 | metro-config@0.87.1: |
| 8640 | resolution: {integrity: sha512-zie+uN6oohscowi2S7ByU+wUw6CrT4ZxW9uAbONOObSxx86RGmnIAmjXHLkfmcdYoY7jzOPEbqcI6oeVmqyBQA==} | 8484 | resolution: {integrity: sha512-NmkDlc/qZAdo5gTkVTuO2AKE/khemRKRH5IA+SKfqUBJigI5GqZ5TOXhmEokhlkAqzjt8dyzKhzI6FHvXoXaTQ==} |
| 8641 | engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} | 8485 | engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} |
| 8642 | 8486 | ||
| 8643 | metro-core@0.84.4: | 8487 | metro-core@0.87.1: |
| 8644 | resolution: {integrity: sha512-HONpWC5LGXZn3ffkd4Hu6AIrfE7j4Z0g0wMo/goV24WOB3lhuFZ40KgvaDiSw8iyQHloMYay5N/wPX+z8oN/PQ==} | 8488 | resolution: {integrity: sha512-xizzky/4+c/Mkznege8OW05j7bSdM39VPoEps61Se4+hf32UQujmbvLvIE9+UnP6kNEPVomk0Fw8NsBK9iRQmw==} |
| 8645 | engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} | 8489 | engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} |
| 8646 | 8490 | ||
| 8647 | metro-core@0.84.5: | 8491 | metro-file-map@0.87.1: |
| 8648 | resolution: {integrity: sha512-xwm605hCi5Y6eJTTb8ZWo6pkUcoBEIyiQOfkZh5GwtDwUrP9SNhTQZhzJHrBCwwxlf3Ptl/pxWJgQ1rsNYMnrA==} | 8492 | resolution: {integrity: sha512-9sPuNCojC3pS4vj+ZPY7FXmHGpdJeckXuKXQrDAfJvZc60AF8owRFTkI8XdwlwrmPIB2w++KraK9FMEXvC4wJw==} |
| 8649 | engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} | 8493 | engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} |
| 8650 | 8494 | ||
| 8651 | metro-file-map@0.84.4: | 8495 | metro-minify-terser@0.87.1: |
| 8652 | resolution: {integrity: sha512-KSVDi/u60hKPx++NLu3MTIvyjzNoJnFAF8PQFxaj1jiSka/wjw+Ua6sNuJ0TDHQv+7AAoFQxeMgaRAe8Yic5wQ==} | 8496 | resolution: {integrity: sha512-YK4k1oO1wV48hfE+Nbw2rJCnAgeabzrgT/xH5ha5n9gbK4p3HYFC898cERUiyTl9vRh58CNTiXRc88f7y6PfKg==} |
| 8653 | engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} | 8497 | engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} |
| 8654 | 8498 | ||
| 8655 | metro-file-map@0.84.5: | 8499 | metro-resolver@0.87.1: |
| 8656 | resolution: {integrity: sha512-mlm/JL8toSbSc2akpKIGmzvrVRSCgZ5vkbycI34oMLoOnLGuLyC8WTyVJ6P0hZG/usDaGwZSl/s9BCRriqjGJA==} | 8500 | resolution: {integrity: sha512-FXH/brY69wT6sPxaSW8BhMmDGD/6irmBr/cL4rUi+VWwqR3pbvdcfUOfyjcHucgQ7pe5IW3xJY21eHKLVKNumQ==} |
| 8657 | engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} | 8501 | engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} |
| 8658 | 8502 | ||
| 8659 | metro-minify-terser@0.84.4: | 8503 | metro-runtime@0.87.1: |
| 8660 | resolution: {integrity: sha512-5qpbaVOMC7CPitIpuewzVeGw7E+C3ykbv2mqTjQLl85Z3annSVGlSCTcsZjqXZzjupfK4Ztj3dDc4kc44NZwtQ==} | 8504 | resolution: {integrity: sha512-kjeuSvInsM6OzBjkCQsWxnkrKZFMKtnkCl38oXWRI9lDGs2L9hGs9Tak9sQYJ9h3gtDujneB7wZio+irgqJKDw==} |
| 8661 | engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} | 8505 | engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} |
| 8662 | 8506 | ||
| 8663 | metro-minify-terser@0.84.5: | 8507 | metro-source-map@0.87.1: |
| 8664 | resolution: {integrity: sha512-BJoFwCEDsYnagPqarayInv2+diCDNDdLlaof/p6s9w4gh+gc9HXYM+pDvsKGKKUumpZswNF3Z/ftTMqKl/5IBg==} | 8508 | resolution: {integrity: sha512-Bqpm0PBGdy53pigIJb4HRF7QxD2pUOdgSmVh/4AWbP635kSCv+Y6ltVxUZgSnzS/QbSmzyCGijmRPlXMj2/qHw==} |
| 8665 | engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} | 8509 | engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} |
| 8666 | 8510 | ||
| 8667 | metro-resolver@0.84.4: | 8511 | metro-symbolicate@0.87.1: |
| 8668 | resolution: {integrity: sha512-1qLgbxQ5ZGhhutuPot1Yp348ofDsATL2WkrHF65TobqTT9K3P9qJXw38bomk7ncp5B7OYMfWwtyBZo1lCV792A==} | 8512 | resolution: {integrity: sha512-rcGvwabrg0lbXGRGRKl14PY3My3+dkno2jZYhdJEuH2DmjTtTkV5bYwgto4JtV/Lbe+sXE6GO1UGg654430uow==} |
| 8669 | engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} | 8513 | engines: {node: ^22.13.0 || ^24.3.0 || >= 26.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} | ||
| 8699 | hasBin: true | 8514 | hasBin: true |
| 8700 | 8515 | ||
| 8701 | metro-transform-plugins@0.84.4: | 8516 | metro-transform-plugins@0.87.1: |
| 8702 | resolution: {integrity: sha512-kehr6HbAecqD0/a3xLXobELdPaAmRAl8bel0qagPF4vhZtux93nS8S4eq2kgKt6J2GnQpVjSoW1PXdst04mwow==} | 8517 | resolution: {integrity: sha512-qMiJ/x+VfqumFJJSefKS6nj8uojzC29b2/aK8vlMuFABIqGjDucICEOXd2Yt6k/XMFAgAcaJvShUOT0HLyYaPw==} |
| 8703 | engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} | 8518 | engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} |
| 8704 | 8519 | ||
| 8705 | metro-transform-plugins@0.84.5: | 8520 | metro-transform-worker@0.87.1: |
| 8706 | resolution: {integrity: sha512-+InaSVGaOyt0DyRo4Y/zIdPI6CZwnbNho5LAL23tgmuGwv7fyfkF7kKfPjZcfxXBcoYdTLLFnCfCH/dHSiCqNg==} | 8521 | resolution: {integrity: sha512-VOzs3OV405FuOLYdAhqA2wsn1F9lvueDVxMDLvCKaQ44U+yknIqphJ9eMjjsGwLDZiJq9sW3DMLhjD27JxQgqQ==} |
| 8707 | engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} | 8522 | engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} |
| 8708 | 8523 | ||
| 8709 | metro-transform-worker@0.84.4: | 8524 | metro@0.87.1: |
| 8710 | resolution: {integrity: sha512-W1IYMvvXTu4MxYr7d9h7CeG2vpIr3bmLLIavkPY4O1ilzDrvS8z/NEe6y+pC44Ff7raMXQgYSfdqDUwN/i39gg==} | 8525 | resolution: {integrity: sha512-1oyLU9elM7hPAsKIqKooEekwxiuWr27+MZBhUROPhzcbXhMDxK64GPF/hCXwBZVp1F89ODavCrBmJtLx9WtBoQ==} |
| 8711 | engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} | 8526 | engines: {node: ^22.13.0 || ^24.3.0 || >= 26.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} | ||
| 8725 | hasBin: true | 8527 | hasBin: true |
| 8726 | 8528 | ||
| 8727 | micromark-core-commonmark@2.0.3: | 8529 | micromark-core-commonmark@2.0.3: |
| ... | @@ -8900,11 +8702,6 @@ packages: | ... | @@ -8900,11 +8702,6 @@ packages: |
| 8900 | resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} | 8702 | resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} |
| 8901 | hasBin: true | 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 | modern-tar@0.8.5: | 8705 | modern-tar@0.8.5: |
| 8909 | resolution: {integrity: sha512-snEhs+6G5Tjd4I7tLCDOaoln2RgE0bD19RzEKgvgK2hZ5VKy3MpLhLTZ2fWpXSTg4K2cyPwp+VHATFJhxfnOeA==} | 8706 | resolution: {integrity: sha512-snEhs+6G5Tjd4I7tLCDOaoln2RgE0bD19RzEKgvgK2hZ5VKy3MpLhLTZ2fWpXSTg4K2cyPwp+VHATFJhxfnOeA==} |
| 8910 | engines: {node: '>=18.0.0'} | 8707 | engines: {node: '>=18.0.0'} |
| ... | @@ -9061,6 +8858,10 @@ packages: | ... | @@ -9061,6 +8858,10 @@ packages: |
| 9061 | resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} | 8858 | resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} |
| 9062 | engines: {node: '>=10'} | 8859 | engines: {node: '>=10'} |
| 9063 | 8860 | ||
| 8861 | noxcturnal@0.1.1: | ||
| 8862 | resolution: {integrity: sha512-Fa9SvpVNi+2AVr9CI6mkxqIIeGQNlVRLZsXdinOx1xrvV5ZvCsyBff9QRJdwnzlVnn1AIpksFe9SW9sDfzYKLw==} | ||
| 8863 | engines: {node: '>=18'} | ||
| 8864 | |||
| 9064 | npm-package-arg@11.0.3: | 8865 | npm-package-arg@11.0.3: |
| 9065 | resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==} | 8866 | resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==} |
| 9066 | engines: {node: ^16.14.0 || >=18.0.0} | 8867 | engines: {node: ^16.14.0 || >=18.0.0} |
| ... | @@ -9087,13 +8888,9 @@ packages: | ... | @@ -9087,13 +8888,9 @@ packages: |
| 9087 | oas-validator@5.0.8: | 8888 | oas-validator@5.0.8: |
| 9088 | resolution: {integrity: sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==} | 8889 | resolution: {integrity: sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==} |
| 9089 | 8890 | ||
| 9090 | ob1@0.84.4: | 8891 | ob1@0.87.1: |
| 9091 | resolution: {integrity: sha512-eJXMpz4aQHXF/YBB9ddqZDIS+ooO91hObo9FoW/xBkr54/zCwYYCDqT/O54vNo8kOkWs5Ou/y28NgdrV0edQNA==} | 8892 | resolution: {integrity: sha512-i8iA8uij0g1YQzS8uOJPSRCgwDjO9warIHUAu1Fqj877Wc3wlfxDYBioYWgKTBF2+URVJttyDWSEpmd99nlvtQ==} |
| 9092 | engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} | 8893 | engines: {node: ^22.13.0 || ^24.3.0 || >= 26.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} | ||
| 9097 | 8894 | ||
| 9098 | object-assign@4.1.1: | 8895 | object-assign@4.1.1: |
| 9099 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} | 8896 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} |
| ... | @@ -9150,9 +8947,9 @@ packages: | ... | @@ -9150,9 +8947,9 @@ packages: |
| 9150 | oniguruma-to-es@4.3.6: | 8947 | oniguruma-to-es@4.3.6: |
| 9151 | resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} | 8948 | resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} |
| 9152 | 8949 | ||
| 9153 | open@7.4.2: | 8950 | open@8.4.2: |
| 9154 | resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} | 8951 | resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} |
| 9155 | engines: {node: '>=8'} | 8952 | engines: {node: '>=12'} |
| 9156 | 8953 | ||
| 9157 | ora@3.4.0: | 8954 | ora@3.4.0: |
| 9158 | resolution: {integrity: sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==} | 8955 | resolution: {integrity: sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==} |
| ... | @@ -9558,9 +9355,6 @@ packages: | ... | @@ -9558,9 +9355,6 @@ packages: |
| 9558 | resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} | 9355 | resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} |
| 9559 | engines: {node: '>=6'} | 9356 | engines: {node: '>=6'} |
| 9560 | 9357 | ||
| 9561 | queue@6.0.2: | ||
| 9562 | resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} | ||
| 9563 | |||
| 9564 | quick-lru@5.1.1: | 9358 | quick-lru@5.1.1: |
| 9565 | resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} | 9359 | resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} |
| 9566 | engines: {node: '>=10'} | 9360 | engines: {node: '>=10'} |
| ... | @@ -9589,16 +9383,16 @@ packages: | ... | @@ -9589,16 +9383,16 @@ packages: |
| 9589 | react-devtools-core@6.1.5: | 9383 | react-devtools-core@6.1.5: |
| 9590 | resolution: {integrity: sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==} | 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 | react-dom@19.2.6: | 9386 | react-dom@19.2.6: |
| 9598 | resolution: {integrity: sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==} | 9387 | resolution: {integrity: sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==} |
| 9599 | peerDependencies: | 9388 | peerDependencies: |
| 9600 | react: ^19.2.6 | 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 | react-freeze@1.0.4: | 9396 | react-freeze@1.0.4: |
| 9603 | resolution: {integrity: sha512-r4F0Sec0BLxWicc7HEyo2x3/2icUTrRmDjaaRyzzn+7aDyFZliszMDOgLVwSnQnYENOlL1o569Ze2HZefk8clA==} | 9397 | resolution: {integrity: sha512-r4F0Sec0BLxWicc7HEyo2x3/2icUTrRmDjaaRyzzn+7aDyFZliszMDOgLVwSnQnYENOlL1o569Ze2HZefk8clA==} |
| 9604 | engines: {node: '>=10'} | 9398 | engines: {node: '>=10'} |
| ... | @@ -9614,9 +9408,6 @@ packages: | ... | @@ -9614,9 +9408,6 @@ packages: |
| 9614 | react: | 9408 | react: |
| 9615 | optional: true | 9409 | optional: true |
| 9616 | 9410 | ||
| 9617 | react-is@16.13.1: | ||
| 9618 | resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} | ||
| 9619 | |||
| 9620 | react-is@17.0.2: | 9411 | react-is@17.0.2: |
| 9621 | resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} | 9412 | resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} |
| 9622 | 9413 | ||
| ... | @@ -9632,8 +9423,8 @@ packages: | ... | @@ -9632,8 +9423,8 @@ packages: |
| 9632 | '@types/react': '>=18' | 9423 | '@types/react': '>=18' |
| 9633 | react: '>=18' | 9424 | react: '>=18' |
| 9634 | 9425 | ||
| 9635 | react-native-gesture-handler@2.32.0: | 9426 | react-native-gesture-handler@3.2.1: |
| 9636 | resolution: {integrity: sha512-uYIMOKlKENORq2SABE+jIjbPU+h5I/sQKcq2v16zRq848nwEp1fWRVwML4QWqijc8UcXJC25o54S8GQd4Mf2OA==} | 9427 | resolution: {integrity: sha512-VEWscxUN29aeccbD2McF0LSXrwOhSdisaSRFiEWg0O/3WrVghNJp/tOtLrCgzb9gfcZ3xdA+K2Sp8F5G3iHx/Q==} |
| 9637 | peerDependencies: | 9428 | peerDependencies: |
| 9638 | react: '*' | 9429 | react: '*' |
| 9639 | react-native: '*' | 9430 | react-native: '*' |
| ... | @@ -9650,8 +9441,8 @@ packages: | ... | @@ -9650,8 +9441,8 @@ packages: |
| 9650 | react: '*' | 9441 | react: '*' |
| 9651 | react-native: '*' | 9442 | react-native: '*' |
| 9652 | 9443 | ||
| 9653 | react-native-keyboard-controller@1.21.13: | 9444 | react-native-keyboard-controller@1.22.4: |
| 9654 | resolution: {integrity: sha512-FLr0MucraPyCGykRAcPM8Bv0JT5TcG1juQGMI+GLDuuaoOUKUY3SMUnRhHn7IgSM8KlxpcNQmMPNDmGpOw1OcA==} | 9445 | resolution: {integrity: sha512-2by3oJBQqKH9UAydlBeiEpivxIyTbt345bmverLym7vbEp4NXckWQLF0STnVuXYccRak5/sd3wMYDJPhv/9+3g==} |
| 9655 | peerDependencies: | 9446 | peerDependencies: |
| 9656 | react: '*' | 9447 | react: '*' |
| 9657 | react-native: '*' | 9448 | react-native: '*' |
| ... | @@ -9677,21 +9468,21 @@ packages: | ... | @@ -9677,21 +9468,21 @@ packages: |
| 9677 | react: '*' | 9468 | react: '*' |
| 9678 | react-native: '*' | 9469 | react-native: '*' |
| 9679 | 9470 | ||
| 9680 | react-native-reanimated@4.5.5: | 9471 | react-native-reanimated@4.7.0: |
| 9681 | resolution: {integrity: sha512-xtJXZRZ1vkec1AIUVG02St2sbyZS5jc7227TlDu/HonqUYPeZAfiC4RI2jqL1dVMNBu1+7oBx/c9QkjF2kg6Lg==} | 9472 | resolution: {integrity: sha512-8TyTrPisqz7WzmbhCz8F60Uw7NI2QeYWrY5Hk58/kurCA5L5KuHmhyQjxeq5k2YalpXUAKbdkn/mAMZWm/fU0g==} |
| 9682 | peerDependencies: | 9473 | peerDependencies: |
| 9683 | react: '*' | 9474 | react: '*' |
| 9684 | react-native: 0.83 - 0.86 | 9475 | react-native: 0.86 - 0.88 |
| 9685 | react-native-worklets: 0.10.x - 0.11.x | 9476 | react-native-worklets: 0.13.x |
| 9686 | 9477 | ||
| 9687 | react-native-safe-area-context@5.7.0: | 9478 | react-native-safe-area-context@5.9.1: |
| 9688 | resolution: {integrity: sha512-/9/MtQz8ODphjsLdZ+GZAIcC/RtoqW9EeShf7Uvnfgm/pzYrJ75y3PV/J1wuAV1T5Dye5ygq4EAW20RoBq0ABQ==} | 9479 | resolution: {integrity: sha512-Zpx9Iwg6VhgNarWFpcIM61xK2lUbSfSXemQUmcvOVRpux49lJsUompY1S3E5jKUJbLq233qEpj28DgmXVsgZMQ==} |
| 9689 | peerDependencies: | 9480 | peerDependencies: |
| 9690 | react: '*' | 9481 | react: '*' |
| 9691 | react-native: '*' | 9482 | react-native: '*' |
| 9692 | 9483 | ||
| 9693 | react-native-screens@4.26.2: | 9484 | react-native-screens@4.28.0: |
| 9694 | resolution: {integrity: sha512-2XnWsZToKj76trGtEZzx5ELD/qOICFEprEeUntImmitQFVUkea27fiWdUSITArI356Y1qynpXZINW+Unbhky/A==} | 9485 | resolution: {integrity: sha512-0/79Z8RCibuaAHti+DJ2Dq0m6UFWh4+p1bH58K3cjiQ7IDWs5kU9tCAj4lXcJMHHonbF2mIE2BeaPSEvOpIiFg==} |
| 9695 | peerDependencies: | 9486 | peerDependencies: |
| 9696 | react: '*' | 9487 | react: '*' |
| 9697 | react-native: '*' | 9488 | react-native: '*' |
| ... | @@ -9702,8 +9493,8 @@ packages: | ... | @@ -9702,8 +9493,8 @@ packages: |
| 9702 | react: '*' | 9493 | react: '*' |
| 9703 | react-native: '*' | 9494 | react-native: '*' |
| 9704 | 9495 | ||
| 9705 | react-native-svg@15.15.4: | 9496 | react-native-svg@15.15.5: |
| 9706 | resolution: {integrity: sha512-boT/vIRgj6zZKBpfTPJJiYWMbZE9duBMOwPK6kCSTgxsS947IFMOq9OgIFkpWZTB7t229H24pDRkh3W9ZK/J1A==} | 9497 | resolution: {integrity: sha512-L4go5jA+GWutdJ/JucuN20cjAbMg1HmMtAP+wZ+3JLCf6Jd0bhXQHxciRP/AQm/FlrIEZwkMcHNZP+FXAiic0w==} |
| 9707 | peerDependencies: | 9498 | peerDependencies: |
| 9708 | react: '*' | 9499 | react: '*' |
| 9709 | react-native: '*' | 9500 | react-native: '*' |
| ... | @@ -9713,39 +9504,28 @@ packages: | ... | @@ -9713,39 +9504,28 @@ packages: |
| 9713 | peerDependencies: | 9504 | peerDependencies: |
| 9714 | react-native: '*' | 9505 | react-native: '*' |
| 9715 | 9506 | ||
| 9716 | react-native-webview@13.16.1: | 9507 | react-native-webview@14.0.1: |
| 9717 | resolution: {integrity: sha512-If0eHhoEdOYDcHsX+xBFwHMbWBGK1BvGDQDQdVkwtSIXiq1uiqjkpWVP2uQ1as94J0CzvFE9PUNDuhiX0Z6ubw==} | 9508 | resolution: {integrity: sha512-lBUuvFk459Mo+5vUNqwzGvn+I8rDJE6zvOulG2hWWudeEOJfWTsQwOfuYnRu+27djUIXrESFfC+EQE3PGu+FWA==} |
| 9718 | peerDependencies: | 9509 | peerDependencies: |
| 9719 | react: '*' | 9510 | react: '*' |
| 9720 | react-native: '*' | 9511 | react-native: '*' |
| 9721 | 9512 | ||
| 9722 | react-native-worklets@0.10.1: | 9513 | react-native-worklets@0.13.0: |
| 9723 | resolution: {integrity: sha512-62mRM19bDpfpdI8HLkEErcdOsrAPDtE9lA/sw+5lLRpzBHNhxaoj9QyY2KjXqUmirelxkX4zuPGTC3VdA0feJA==} | 9514 | resolution: {integrity: sha512-1OrhAeAKaZF4XrBa4YbPQbKzNOpjh52HDlId8e6ete1OCHNdAlrQHzG4gznJ225EAj3dgQXHViJvK51M9B52jQ==} |
| 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==} | ||
| 9732 | peerDependencies: | 9515 | peerDependencies: |
| 9733 | '@babel/core': '*' | 9516 | '@babel/core': '*' |
| 9734 | '@react-native/metro-config': '*' | 9517 | '@react-native/metro-config': '*' |
| 9735 | react: '*' | 9518 | react: '*' |
| 9736 | react-native: 0.83 - 0.86 | 9519 | react-native: 0.86 - 0.88 |
| 9737 | 9520 | ||
| 9738 | react-native@0.86.3: | 9521 | react-native@0.88.0-rc.3: |
| 9739 | resolution: {integrity: sha512-JR5s3bM9ezud+Mw24GlNXNfthqPIKwrQgPPJcam+L97t2sKjjEavhCzBn+fyqZZRcM5+XlhYxpTxVkK7e1n38Q==} | 9522 | resolution: {integrity: sha512-8gTeprAQP1j3B8lUJGZNmo33jH41Hmrd1Jm9PoOr7D/uImnifPqkagpFSKyK9fPJTWtwAK2TLDqTo+eFxlUcvA==} |
| 9740 | engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} | 9523 | engines: {node: ^22.13.0 || ^24.3.0 || >= 26.0.0} |
| 9741 | hasBin: true | 9524 | hasBin: true |
| 9742 | peerDependencies: | 9525 | peerDependencies: |
| 9743 | '@react-native/jest-preset': 0.86.3 | ||
| 9744 | '@types/react': ^19.1.1 | 9526 | '@types/react': ^19.1.1 |
| 9745 | react: ^19.2.3 | 9527 | react: ^19.3.0 |
| 9746 | peerDependenciesMeta: | 9528 | peerDependenciesMeta: |
| 9747 | '@react-native/jest-preset': | ||
| 9748 | optional: true | ||
| 9749 | '@types/react': | 9529 | '@types/react': |
| 9750 | optional: true | 9530 | optional: true |
| 9751 | 9531 | ||
| ... | @@ -9753,49 +9533,19 @@ packages: | ... | @@ -9753,49 +9533,19 @@ packages: |
| 9753 | resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} | 9533 | resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} |
| 9754 | engines: {node: '>=0.10.0'} | 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 | react-test-renderer@19.2.6: | 9536 | react-test-renderer@19.2.6: |
| 9787 | resolution: {integrity: sha512-GbS6V23YduFTPiWJ5xICbKEjRcqx1Z90js/V5miqhz7qp/d6xSe9Dd6NjSQODFRdzdsqRMPW82E/sFpPRbY5Mw==} | 9537 | resolution: {integrity: sha512-GbS6V23YduFTPiWJ5xICbKEjRcqx1Z90js/V5miqhz7qp/d6xSe9Dd6NjSQODFRdzdsqRMPW82E/sFpPRbY5Mw==} |
| 9788 | peerDependencies: | 9538 | peerDependencies: |
| 9789 | react: ^19.2.6 | 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 | react@19.2.6: | 9541 | react@19.2.6: |
| 9796 | resolution: {integrity: sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==} | 9542 | resolution: {integrity: sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==} |
| 9797 | engines: {node: '>=0.10.0'} | 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 | read-binary-file-arch@1.0.6: | 9549 | read-binary-file-arch@1.0.6: |
| 9800 | resolution: {integrity: sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==} | 9550 | resolution: {integrity: sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==} |
| 9801 | hasBin: true | 9551 | hasBin: true |
| ... | @@ -9994,6 +9744,9 @@ packages: | ... | @@ -9994,6 +9744,9 @@ packages: |
| 9994 | scheduler@0.27.0: | 9744 | scheduler@0.27.0: |
| 9995 | resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} | 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 | schema-utils@4.3.3: | 9750 | schema-utils@4.3.3: |
| 9998 | resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} | 9751 | resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} |
| 9999 | engines: {node: '>= 10.13.0'} | 9752 | engines: {node: '>= 10.13.0'} |
| ... | @@ -10615,7 +10368,7 @@ packages: | ... | @@ -10615,7 +10368,7 @@ packages: |
| 10615 | resolution: {integrity: sha512-e2mYlHrZzAQtZUf3STrfVDTetspv7p5vm/cu6p8kjLRQaL9r6QFG+MlwZ3hrI2LHnzgzjbSo+MwvoE380zz2JQ==} | 10368 | resolution: {integrity: sha512-e2mYlHrZzAQtZUf3STrfVDTetspv7p5vm/cu6p8kjLRQaL9r6QFG+MlwZ3hrI2LHnzgzjbSo+MwvoE380zz2JQ==} |
| 10616 | hasBin: true | 10369 | hasBin: true |
| 10617 | peerDependencies: | 10370 | peerDependencies: |
| 10618 | '@expo/metro-config': 57.0.12 | 10371 | '@expo/metro-config': 58.0.6 |
| 10619 | metro: '*' | 10372 | metro: '*' |
| 10620 | metro-cache: '*' | 10373 | metro-cache: '*' |
| 10621 | metro-transform-worker: '*' | 10374 | metro-transform-worker: '*' |
| ... | @@ -10723,31 +10476,11 @@ packages: | ... | @@ -10723,31 +10476,11 @@ packages: |
| 10723 | uri-js@4.4.1: | 10476 | uri-js@4.4.1: |
| 10724 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} | 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 | use-latest-callback@0.2.6: | 10479 | use-latest-callback@0.2.6: |
| 10737 | resolution: {integrity: sha512-FvRG9i1HSo0wagmX63Vrm8SnlUU3LMM3WyZkQ76RnslpBrX694AdG4A0zQBx2B3ZifFA0yv/BaEHGBnEax5rZg==} | 10480 | resolution: {integrity: sha512-FvRG9i1HSo0wagmX63Vrm8SnlUU3LMM3WyZkQ76RnslpBrX694AdG4A0zQBx2B3ZifFA0yv/BaEHGBnEax5rZg==} |
| 10738 | peerDependencies: | 10481 | peerDependencies: |
| 10739 | react: '>=16.8' | 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 | use-sync-external-store@1.6.0: | 10484 | use-sync-external-store@1.6.0: |
| 10752 | resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} | 10485 | resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} |
| 10753 | peerDependencies: | 10486 | peerDependencies: |
| ... | @@ -10788,12 +10521,6 @@ packages: | ... | @@ -10788,12 +10521,6 @@ packages: |
| 10788 | resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} | 10521 | resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} |
| 10789 | engines: {node: '>= 0.8'} | 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 | vfile-location@5.0.3: | 10524 | vfile-location@5.0.3: |
| 10798 | resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} | 10525 | resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} |
| 10799 | 10526 | ||
| ... | @@ -11007,8 +10734,8 @@ packages: | ... | @@ -11007,8 +10734,8 @@ packages: |
| 11007 | resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} | 10734 | resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} |
| 11008 | engines: {node: '>=20'} | 10735 | engines: {node: '>=20'} |
| 11009 | 10736 | ||
| 11010 | whatwg-url-minimum@0.1.2: | 10737 | whatwg-url-minimum@0.2.0: |
| 11011 | resolution: {integrity: sha512-XPEm0XFQWNVG292lII1PrRRJl3sItrs7CettZ4ncYxuDVpLyy+NwlGyut2hXI0JswcJUxeCH+CyOJK0ZzAXD6A==} | 10738 | resolution: {integrity: sha512-BtjXU1caNcCFfETP2DhqSeVPfRDl2MTUitI107RE34rJXjR/izfUtR5IoTFOK1WqjNLXbbeqaCH/mQAOLjpc8g==} |
| 11012 | 10739 | ||
| 11013 | whatwg-url@14.2.0: | 10740 | whatwg-url@14.2.0: |
| 11014 | resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} | 10741 | resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} |
| ... | @@ -11241,6 +10968,10 @@ packages: | ... | @@ -11241,6 +10968,10 @@ packages: |
| 11241 | 10968 | ||
| 11242 | snapshots: | 10969 | snapshots: |
| 11243 | 10970 | ||
| 10971 | 2g@0.4.4(typescript@7.0.2): | ||
| 10972 | optionalDependencies: | ||
| 10973 | typescript: 7.0.2 | ||
| 10974 | |||
| 11244 | '@ai-sdk/provider-utils@4.0.49(zod@4.4.3)': | 10975 | '@ai-sdk/provider-utils@4.0.49(zod@4.4.3)': |
| 11245 | dependencies: | 10976 | dependencies: |
| 11246 | '@ai-sdk/provider': 3.0.15 | 10977 | '@ai-sdk/provider': 3.0.15 |
| ... | @@ -11285,9 +11016,9 @@ snapshots: | ... | @@ -11285,9 +11016,9 @@ snapshots: |
| 11285 | chokidar: 5.0.0 | 11016 | chokidar: 5.0.0 |
| 11286 | rolldown: 1.2.5 | 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 | optionalDependencies: | 11020 | optionalDependencies: |
| 11290 | '@types/react': 19.2.16 | 11021 | '@types/react': 19.3.0 |
| 11291 | react-devtools-core: 6.1.5(bufferutil@4.1.0)(utf-8-validate@6.0.6) | 11022 | react-devtools-core: 6.1.5(bufferutil@4.1.0)(utf-8-validate@6.0.6) |
| 11292 | 11023 | ||
| 11293 | '@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)': | 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,7 +11476,7 @@ snapshots: |
| 11745 | '@babel/helper-module-imports@7.29.7': | 11476 | '@babel/helper-module-imports@7.29.7': |
| 11746 | dependencies: | 11477 | dependencies: |
| 11747 | '@babel/traverse': 7.29.7 | 11478 | '@babel/traverse': 7.29.7 |
| 11748 | '@babel/types': 7.29.7 | 11479 | '@babel/types': 7.29.8 |
| 11749 | transitivePeerDependencies: | 11480 | transitivePeerDependencies: |
| 11750 | - supports-color | 11481 | - supports-color |
| 11751 | 11482 | ||
| ... | @@ -11810,7 +11541,7 @@ snapshots: | ... | @@ -11810,7 +11541,7 @@ snapshots: |
| 11810 | 11541 | ||
| 11811 | '@babel/parser@7.29.7': | 11542 | '@babel/parser@7.29.7': |
| 11812 | dependencies: | 11543 | dependencies: |
| 11813 | '@babel/types': 7.29.7 | 11544 | '@babel/types': 7.29.8 |
| 11814 | 11545 | ||
| 11815 | '@babel/parser@7.29.8': | 11546 | '@babel/parser@7.29.8': |
| 11816 | dependencies: | 11547 | dependencies: |
| ... | @@ -12045,17 +11776,6 @@ snapshots: | ... | @@ -12045,17 +11776,6 @@ snapshots: |
| 12045 | '@babel/core': 7.29.7 | 11776 | '@babel/core': 7.29.7 |
| 12046 | '@babel/helper-plugin-utils': 7.29.7 | 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 | '@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7)': | 11779 | '@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7)': |
| 12060 | dependencies: | 11780 | dependencies: |
| 12061 | '@babel/core': 7.29.7 | 11781 | '@babel/core': 7.29.7 |
| ... | @@ -12063,7 +11783,7 @@ snapshots: | ... | @@ -12063,7 +11783,7 @@ snapshots: |
| 12063 | '@babel/helper-module-imports': 7.29.7 | 11783 | '@babel/helper-module-imports': 7.29.7 |
| 12064 | '@babel/helper-plugin-utils': 7.29.7 | 11784 | '@babel/helper-plugin-utils': 7.29.7 |
| 12065 | '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) | 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 | transitivePeerDependencies: | 11787 | transitivePeerDependencies: |
| 12068 | - supports-color | 11788 | - supports-color |
| 12069 | 11789 | ||
| ... | @@ -12158,10 +11878,10 @@ snapshots: | ... | @@ -12158,10 +11878,10 @@ snapshots: |
| 12158 | '@babel/helper-string-parser': 7.29.7 | 11878 | '@babel/helper-string-parser': 7.29.7 |
| 12159 | '@babel/helper-validator-identifier': 7.29.7 | 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 | dependencies: | 11882 | dependencies: |
| 12163 | '@babel/runtime': 7.29.7 | 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 | '@floating-ui/react-dom': 2.1.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6) | 11885 | '@floating-ui/react-dom': 2.1.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6) |
| 12166 | '@floating-ui/utils': 0.2.11 | 11886 | '@floating-ui/utils': 0.2.11 |
| 12167 | react: 19.2.6 | 11887 | react: 19.2.6 |
| ... | @@ -12169,10 +11889,10 @@ snapshots: | ... | @@ -12169,10 +11889,10 @@ snapshots: |
| 12169 | use-sync-external-store: 1.6.0(react@19.2.6) | 11889 | use-sync-external-store: 1.6.0(react@19.2.6) |
| 12170 | optionalDependencies: | 11890 | optionalDependencies: |
| 12171 | '@date-fns/tz': 1.5.0 | 11891 | '@date-fns/tz': 1.5.0 |
| 12172 | '@types/react': 19.2.16 | 11892 | '@types/react': 19.3.0 |
| 12173 | date-fns: 4.4.0 | 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 | dependencies: | 11896 | dependencies: |
| 12177 | '@babel/runtime': 7.29.7 | 11897 | '@babel/runtime': 7.29.7 |
| 12178 | '@floating-ui/utils': 0.2.11 | 11898 | '@floating-ui/utils': 0.2.11 |
| ... | @@ -12181,7 +11901,7 @@ snapshots: | ... | @@ -12181,7 +11901,7 @@ snapshots: |
| 12181 | reselect: 5.2.0 | 11901 | reselect: 5.2.0 |
| 12182 | use-sync-external-store: 1.6.0(react@19.2.6) | 11902 | use-sync-external-store: 1.6.0(react@19.2.6) |
| 12183 | optionalDependencies: | 11903 | optionalDependencies: |
| 12184 | '@types/react': 19.2.16 | 11904 | '@types/react': 19.3.0 |
| 12185 | 11905 | ||
| 12186 | '@blazediff/core@1.10.0': {} | 11906 | '@blazediff/core@1.10.0': {} |
| 12187 | 11907 | ||
| ... | @@ -12236,18 +11956,18 @@ snapshots: | ... | @@ -12236,18 +11956,18 @@ snapshots: |
| 12236 | fast-wrap-ansi: 0.2.2 | 11956 | fast-wrap-ansi: 0.2.2 |
| 12237 | sisteransi: 1.0.5 | 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 | dependencies: | 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 | standardwebhooks: 1.0.0 | 11962 | standardwebhooks: 1.0.0 |
| 12243 | tslib: 2.8.1 | 11963 | tslib: 2.8.1 |
| 12244 | transitivePeerDependencies: | 11964 | transitivePeerDependencies: |
| 12245 | - react | 11965 | - react |
| 12246 | - react-dom | 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 | dependencies: | 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 | '@stripe/stripe-js': 5.6.0 | 11971 | '@stripe/stripe-js': 5.6.0 |
| 12252 | '@swc/helpers': 0.5.21 | 11972 | '@swc/helpers': 0.5.21 |
| 12253 | '@tanstack/query-core': 5.102.8 | 11973 | '@tanstack/query-core': 5.102.8 |
| ... | @@ -12262,9 +11982,26 @@ snapshots: | ... | @@ -12262,9 +11982,26 @@ snapshots: |
| 12262 | - react | 11982 | - react |
| 12263 | - react-dom | 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 | dependencies: | 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 | '@stripe/stripe-js': 5.6.0 | 12005 | '@stripe/stripe-js': 5.6.0 |
| 12269 | '@swc/helpers': 0.5.21 | 12006 | '@swc/helpers': 0.5.21 |
| 12270 | '@tanstack/query-core': 5.102.8 | 12007 | '@tanstack/query-core': 5.102.8 |
| ... | @@ -12311,36 +12048,42 @@ snapshots: | ... | @@ -12311,36 +12048,42 @@ snapshots: |
| 12311 | electron-store: 8.2.0 | 12048 | electron-store: 8.2.0 |
| 12312 | react-dom: 19.2.6(react@19.2.6) | 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 | dependencies: | 12065 | dependencies: |
| 12316 | '@clerk/clerk-js': 6.32.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3) | 12066 | '@clerk/clerk-js': 6.32.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0) |
| 12317 | '@clerk/react': 6.16.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3) | 12067 | '@clerk/react': 6.16.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0) |
| 12318 | '@clerk/shared': 4.33.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) | 12068 | '@clerk/shared': 4.33.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) |
| 12319 | '@expo/config-plugins': 57.0.9(typescript@7.0.2) | 12069 | '@expo/config-plugins': 58.0.4(typescript@7.0.2) |
| 12320 | base-64: 1.0.0 | 12070 | base-64: 1.0.0 |
| 12321 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 12071 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 12322 | react: 19.2.3 | 12072 | react: 19.3.0 |
| 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) | 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) |
| 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)) | 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 | tslib: 2.8.1 | 12075 | tslib: 2.8.1 |
| 12326 | optionalDependencies: | 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) | 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) |
| 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)) | 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) |
| 12329 | expo-crypto: 57.0.2(expo@57.0.18) | 12079 | expo-crypto: 58.0.3(expo@58.0.0) |
| 12330 | expo-secure-store: 57.0.2(expo@57.0.18) | 12080 | expo-secure-store: 58.0.1(expo@58.0.0) |
| 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)) | 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)) |
| 12332 | react-dom: 19.2.3(react@19.2.3) | 12082 | react-dom: 19.3.0(react@19.3.0) |
| 12333 | transitivePeerDependencies: | 12083 | transitivePeerDependencies: |
| 12334 | - supports-color | 12084 | - supports-color |
| 12335 | - typescript | 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 | '@clerk/react@6.16.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': | 12087 | '@clerk/react@6.16.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': |
| 12345 | dependencies: | 12088 | dependencies: |
| 12346 | '@clerk/shared': 4.33.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) | 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,17 +12091,31 @@ snapshots: |
| 12348 | react-dom: 19.2.6(react@19.2.6) | 12091 | react-dom: 19.2.6(react@19.2.6) |
| 12349 | tslib: 2.8.1 | 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 | dependencies: | 12109 | dependencies: |
| 12353 | '@tanstack/query-core': 5.102.8 | 12110 | '@tanstack/query-core': 5.102.8 |
| 12354 | dequal: 2.0.3 | 12111 | dequal: 2.0.3 |
| 12355 | glob-to-regexp: 0.4.1 | 12112 | glob-to-regexp: 0.4.1 |
| 12356 | js-cookie: 3.0.8 | 12113 | js-cookie: 3.0.8 |
| 12357 | optionalDependencies: | 12114 | optionalDependencies: |
| 12358 | react: 19.2.3 | 12115 | react: 19.2.6 |
| 12359 | react-dom: 19.2.3(react@19.2.3) | 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 | dependencies: | 12119 | dependencies: |
| 12363 | '@tanstack/query-core': 5.102.8 | 12120 | '@tanstack/query-core': 5.102.8 |
| 12364 | dequal: 2.0.3 | 12121 | dequal: 2.0.3 |
| ... | @@ -12366,7 +12123,17 @@ snapshots: | ... | @@ -12366,7 +12123,17 @@ snapshots: |
| 12366 | js-cookie: 3.0.8 | 12123 | js-cookie: 3.0.8 |
| 12367 | optionalDependencies: | 12124 | optionalDependencies: |
| 12368 | react: 19.2.6 | 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 | '@cloudflare/unenv-preset@2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260901.1)': | 12138 | '@cloudflare/unenv-preset@2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260901.1)': |
| 12372 | dependencies: | 12139 | dependencies: |
| ... | @@ -12446,12 +12213,12 @@ snapshots: | ... | @@ -12446,12 +12213,12 @@ snapshots: |
| 12446 | 12213 | ||
| 12447 | '@date-fns/tz@1.5.0': {} | 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 | dependencies: | 12217 | dependencies: |
| 12451 | react: 19.2.6 | 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 | optionalDependencies: | 12220 | optionalDependencies: |
| 12454 | '@types/react': 19.2.16 | 12221 | '@types/react': 19.3.0 |
| 12455 | 12222 | ||
| 12456 | '@dimforge/rapier3d-compat@0.12.0': {} | 12223 | '@dimforge/rapier3d-compat@0.12.0': {} |
| 12457 | 12224 | ||
| ... | @@ -12549,16 +12316,16 @@ snapshots: | ... | @@ -12549,16 +12316,16 @@ snapshots: |
| 12549 | 12316 | ||
| 12550 | '@drizzle-team/brocli@0.12.0': {} | 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 | dependencies: | 12320 | dependencies: |
| 12554 | effect: 4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5) | 12321 | effect: 4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5) |
| 12555 | react: 19.2.3 | 12322 | react: 19.2.6 |
| 12556 | scheduler: 0.27.0 | 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 | dependencies: | 12326 | dependencies: |
| 12560 | effect: 4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5) | 12327 | effect: 4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5) |
| 12561 | react: 19.2.6 | 12328 | react: 19.3.0 |
| 12562 | scheduler: 0.27.0 | 12329 | scheduler: 0.27.0 |
| 12563 | 12330 | ||
| 12564 | '@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)': | 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,10 +12408,6 @@ snapshots: |
| 12641 | dependencies: | 12408 | dependencies: |
| 12642 | effect: 4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5) | 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 | '@electric-sql/pglite@0.3.15': | 12411 | '@electric-sql/pglite@0.3.15': |
| 12649 | optional: true | 12412 | optional: true |
| 12650 | 12413 | ||
| ... | @@ -12999,110 +12762,36 @@ snapshots: | ... | @@ -12999,110 +12762,36 @@ snapshots: |
| 12999 | 12762 | ||
| 13000 | '@expo-google-fonts/material-symbols@0.4.38': {} | 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)': | 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)': |
| 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)': | ||
| 13080 | dependencies: | 12766 | dependencies: |
| 12767 | 2g: 0.4.4(typescript@7.0.2) | ||
| 13081 | '@expo/code-signing-certificates': 0.0.6 | 12768 | '@expo/code-signing-certificates': 0.0.6 |
| 13082 | '@expo/config': 57.0.9(typescript@7.0.2) | 12769 | '@expo/config': 58.0.1(typescript@7.0.2) |
| 13083 | '@expo/config-plugins': 57.0.9(typescript@7.0.2) | 12770 | '@expo/config-plugins': 58.0.4(typescript@7.0.2) |
| 13084 | '@expo/devcert': 1.2.1 | 12771 | '@expo/devcert': 1.2.1 |
| 13085 | '@expo/env': 2.4.3 | 12772 | '@expo/env': 2.5.1 |
| 13086 | '@expo/image-utils': 0.11.5(typescript@7.0.2) | 12773 | '@expo/image-utils': 0.12.2(typescript@7.0.2) |
| 13087 | '@expo/inline-modules': 0.1.7(typescript@7.0.2) | 12774 | '@expo/inline-modules': 0.2.1(typescript@7.0.2) |
| 13088 | '@expo/json-file': 11.0.1 | 12775 | '@expo/json-file': 11.2.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) | 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) |
| 13090 | '@expo/metro': 56.0.2(bufferutil@4.1.0)(utf-8-validate@6.0.6) | 12777 | '@expo/log-box-utils': 58.0.1 |
| 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) | 12778 | '@expo/metro': 58.0.0-rc.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) |
| 13092 | '@expo/metro-file-map': 57.0.2 | 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) |
| 13093 | '@expo/osascript': 2.7.1 | 12780 | '@expo/metro-file-map': 58.0.3(typescript@7.0.2) |
| 13094 | '@expo/package-manager': 1.13.1 | 12781 | '@expo/osascript': 2.8.1 |
| 13095 | '@expo/plist': 0.8.1 | 12782 | '@expo/package-manager': 1.14.1 |
| 13096 | '@expo/prebuild-config': 57.0.15(typescript@7.0.2) | 12783 | '@expo/plist': 0.10.1 |
| 13097 | '@expo/require-utils': 57.0.5(typescript@7.0.2) | 12784 | '@expo/prebuild-config': 58.0.6(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) | 12785 | '@expo/require-utils': 58.0.2(typescript@7.0.2) |
| 13099 | '@expo/schema-utils': 57.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 | '@expo/spawn-async': 1.8.0 | 12788 | '@expo/spawn-async': 1.8.0 |
| 13101 | '@expo/ws-tunnel': 2.0.0(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)) | 12789 | '@expo/ws-tunnel': 2.0.0(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)) |
| 13102 | '@expo/xcpretty': 4.4.4 | 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 | accepts: 1.3.8 | 12793 | accepts: 1.3.8 |
| 13105 | agent-cli-detector: 0.1.6 | 12794 | agent-cli-detector: 0.1.7 |
| 13106 | arg: 5.0.2 | 12795 | arg: 5.0.2 |
| 13107 | bplist-creator: 0.1.0 | 12796 | bplist-creator: 0.1.0 |
| 13108 | bplist-parser: 0.3.2 | 12797 | bplist-parser: 0.3.2 |
| ... | @@ -13110,10 +12799,9 @@ snapshots: | ... | @@ -13110,10 +12799,9 @@ snapshots: |
| 13110 | ci-info: 3.9.0 | 12799 | ci-info: 3.9.0 |
| 13111 | compression: 1.8.1 | 12800 | compression: 1.8.1 |
| 13112 | connect: 3.7.0 | 12801 | connect: 3.7.0 |
| 13113 | debug: 4.4.3 | 12802 | dnssd-advertise: 1.1.6 |
| 13114 | dnssd-advertise: 1.1.4 | 12803 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 13115 | expo: 57.0.18(0bf40d5ad6281d8f1e92517b24812edb) | 12804 | expo-server: 58.0.2 |
| 13116 | expo-server: 57.0.3 | ||
| 13117 | fetch-nodeshim: 0.4.10 | 12805 | fetch-nodeshim: 0.4.10 |
| 13118 | getenv: 2.0.0 | 12806 | getenv: 2.0.0 |
| 13119 | glob: 13.0.6 | 12807 | glob: 13.0.6 |
| ... | @@ -13139,7 +12827,7 @@ snapshots: | ... | @@ -13139,7 +12827,7 @@ snapshots: |
| 13139 | ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) | 12827 | ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) |
| 13140 | zod: 3.25.76 | 12828 | zod: 3.25.76 |
| 13141 | optionalDependencies: | 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 | transitivePeerDependencies: | 12831 | transitivePeerDependencies: |
| 13144 | - '@expo/dom-webview' | 12832 | - '@expo/dom-webview' |
| 13145 | - '@expo/metro-runtime' | 12833 | - '@expo/metro-runtime' |
| ... | @@ -13152,18 +12840,17 @@ snapshots: | ... | @@ -13152,18 +12840,17 @@ snapshots: |
| 13152 | - supports-color | 12840 | - supports-color |
| 13153 | - typescript | 12841 | - typescript |
| 13154 | - utf-8-validate | 12842 | - utf-8-validate |
| 13155 | optional: true | ||
| 13156 | 12843 | ||
| 13157 | '@expo/code-signing-certificates@0.0.6': | 12844 | '@expo/code-signing-certificates@0.0.6': |
| 13158 | dependencies: | 12845 | dependencies: |
| 13159 | node-forge: 1.4.0 | 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 | dependencies: | 12849 | dependencies: |
| 13163 | '@expo/config-types': 57.0.2 | 12850 | '@expo/config-types': 58.0.2 |
| 13164 | '@expo/json-file': 11.0.1 | 12851 | '@expo/json-file': 11.2.1 |
| 13165 | '@expo/plist': 0.8.1 | 12852 | '@expo/plist': 0.10.1 |
| 13166 | '@expo/require-utils': 57.0.5(typescript@7.0.2) | 12853 | '@expo/require-utils': 58.0.2(typescript@7.0.2) |
| 13167 | '@expo/sdk-runtime-versions': 1.0.0 | 12854 | '@expo/sdk-runtime-versions': 1.0.0 |
| 13168 | chalk: 4.1.2 | 12855 | chalk: 4.1.2 |
| 13169 | debug: 4.4.3 | 12856 | debug: 4.4.3 |
| ... | @@ -13177,14 +12864,14 @@ snapshots: | ... | @@ -13177,14 +12864,14 @@ snapshots: |
| 13177 | - supports-color | 12864 | - supports-color |
| 13178 | - typescript | 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 | dependencies: | 12870 | dependencies: |
| 13184 | '@expo/config-plugins': 57.0.9(typescript@7.0.2) | 12871 | '@expo/config-plugins': 58.0.4(typescript@7.0.2) |
| 13185 | '@expo/config-types': 57.0.2 | 12872 | '@expo/config-types': 58.0.2 |
| 13186 | '@expo/json-file': 11.0.1 | 12873 | '@expo/json-file': 11.2.1 |
| 13187 | '@expo/require-utils': 57.0.5(typescript@7.0.2) | 12874 | '@expo/require-utils': 58.0.2(typescript@7.0.2) |
| 13188 | deepmerge: 4.3.1 | 12875 | deepmerge: 4.3.1 |
| 13189 | getenv: 2.0.0 | 12876 | getenv: 2.0.0 |
| 13190 | glob: 13.0.6 | 12877 | glob: 13.0.6 |
| ... | @@ -13202,35 +12889,21 @@ snapshots: | ... | @@ -13202,35 +12889,21 @@ snapshots: |
| 13202 | transitivePeerDependencies: | 12889 | transitivePeerDependencies: |
| 13203 | - supports-color | 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 | dependencies: | 12893 | dependencies: |
| 13207 | chalk: 4.1.2 | 12894 | chalk: 4.1.2 |
| 13208 | optionalDependencies: | 12895 | optionalDependencies: |
| 13209 | react: 19.2.3 | 12896 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 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) | 12897 | react: 19.3.0 |
| 13211 | 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) | |
| 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) | ||
| 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 | dependencies: | 12901 | dependencies: |
| 13228 | expo: 57.0.18(0bf40d5ad6281d8f1e92517b24812edb) | 12902 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 13229 | react: 19.2.6 | 12903 | react: 19.3.0 |
| 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) | 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) |
| 13231 | optional: true | ||
| 13232 | 12905 | ||
| 13233 | '@expo/env@2.4.3': | 12906 | '@expo/env@2.5.1': |
| 13234 | dependencies: | 12907 | dependencies: |
| 13235 | chalk: 4.1.2 | 12908 | chalk: 4.1.2 |
| 13236 | debug: 4.4.3 | 12909 | debug: 4.4.3 |
| ... | @@ -13238,11 +12911,9 @@ snapshots: | ... | @@ -13238,11 +12911,9 @@ snapshots: |
| 13238 | transitivePeerDependencies: | 12911 | transitivePeerDependencies: |
| 13239 | - supports-color | 12912 | - supports-color |
| 13240 | 12913 | ||
| 13241 | '@expo/expo-modules-macros-plugin@0.6.1': {} | 12914 | '@expo/fingerprint@0.21.2': |
| 13242 | |||
| 13243 | '@expo/fingerprint@0.20.11': | ||
| 13244 | dependencies: | 12915 | dependencies: |
| 13245 | '@expo/env': 2.4.3 | 12916 | '@expo/env': 2.5.1 |
| 13246 | '@expo/spawn-async': 1.8.0 | 12917 | '@expo/spawn-async': 1.8.0 |
| 13247 | arg: 5.0.2 | 12918 | arg: 5.0.2 |
| 13248 | chalk: 4.1.2 | 12919 | chalk: 4.1.2 |
| ... | @@ -13256,9 +12927,9 @@ snapshots: | ... | @@ -13256,9 +12927,9 @@ snapshots: |
| 13256 | transitivePeerDependencies: | 12927 | transitivePeerDependencies: |
| 13257 | - supports-color | 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 | dependencies: | 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 | '@expo/spawn-async': 1.8.0 | 12933 | '@expo/spawn-async': 1.8.0 |
| 13263 | chalk: 4.1.2 | 12934 | chalk: 4.1.2 |
| 13264 | getenv: 2.0.0 | 12935 | getenv: 2.0.0 |
| ... | @@ -13282,59 +12953,56 @@ snapshots: | ... | @@ -13282,59 +12953,56 @@ snapshots: |
| 13282 | - supports-color | 12953 | - supports-color |
| 13283 | - typescript | 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 | dependencies: | 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 | transitivePeerDependencies: | 12959 | transitivePeerDependencies: |
| 13289 | - supports-color | 12960 | - supports-color |
| 13290 | - typescript | 12961 | - typescript |
| 13291 | 12962 | ||
| 13292 | '@expo/json-file@11.0.1': | 12963 | '@expo/json-file@11.2.1': |
| 13293 | dependencies: | 12964 | dependencies: |
| 13294 | '@babel/code-frame': 7.29.7 | 12965 | '@babel/code-frame': 7.29.7 |
| 13295 | json5: 2.2.3 | 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 | dependencies: | 12969 | dependencies: |
| 13299 | '@expo/config': 57.0.9(typescript@7.0.2) | 12970 | '@expo/config': 58.0.1(typescript@7.0.2) |
| 13300 | chalk: 4.1.2 | 12971 | chalk: 4.1.2 |
| 13301 | transitivePeerDependencies: | 12972 | transitivePeerDependencies: |
| 13302 | - supports-color | 12973 | - supports-color |
| 13303 | - typescript | 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)': | 12976 | '@expo/log-box-utils@58.0.1': {} |
| 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 | ||
| 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 | dependencies: | 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 | anser: 1.4.10 | 12982 | anser: 1.4.10 |
| 13318 | expo: 57.0.18(0bf40d5ad6281d8f1e92517b24812edb) | 12983 | react: 19.3.0 |
| 13319 | react: 19.2.6 | 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) |
| 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) | ||
| 13321 | stacktrace-parser: 0.1.11 | 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 | dependencies: | 12990 | dependencies: |
| 12991 | 2g: 0.4.4(typescript@7.0.2) | ||
| 13326 | '@babel/code-frame': 7.29.7 | 12992 | '@babel/code-frame': 7.29.7 |
| 13327 | '@babel/core': 7.29.7 | 12993 | '@babel/core': 7.29.7 |
| 13328 | '@babel/generator': 7.29.7 | 12994 | '@babel/generator': 7.29.7 |
| 13329 | '@expo/config': 57.0.9(typescript@7.0.2) | 12995 | '@expo/config': 58.0.1(typescript@7.0.2) |
| 13330 | '@expo/env': 2.4.3 | 12996 | '@expo/env': 2.5.1 |
| 13331 | '@expo/json-file': 11.0.1 | 12997 | '@expo/json-file': 11.2.1 |
| 13332 | '@expo/metro': 56.0.2(bufferutil@4.1.0)(utf-8-validate@6.0.6) | 12998 | '@expo/metro': 58.0.0-rc.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) |
| 13333 | '@expo/require-utils': 57.0.5(typescript@7.0.2) | 12999 | '@expo/require-utils': 58.0.2(typescript@7.0.2) |
| 13334 | '@expo/spawn-async': 1.8.0 | 13000 | '@expo/spawn-async': 1.8.0 |
| 13335 | '@jridgewell/gen-mapping': 0.3.13 | 13001 | '@jridgewell/gen-mapping': 0.3.13 |
| 13336 | '@jridgewell/remapping': 2.3.5 | 13002 | '@jridgewell/remapping': 2.3.5 |
| 13337 | '@jridgewell/sourcemap-codec': 1.6.0 | 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 | browserslist: 4.29.0 | 13006 | browserslist: 4.29.0 |
| 13339 | chalk: 4.1.2 | 13007 | chalk: 4.1.2 |
| 13340 | debug: 4.4.3 | 13008 | debug: 4.4.3 |
| ... | @@ -13343,19 +13011,21 @@ snapshots: | ... | @@ -13343,19 +13011,21 @@ snapshots: |
| 13343 | hermes-parser: 0.36.1 | 13011 | hermes-parser: 0.36.1 |
| 13344 | jsc-safe-url: 0.2.4 | 13012 | jsc-safe-url: 0.2.4 |
| 13345 | lightningcss: 1.33.0 | 13013 | lightningcss: 1.33.0 |
| 13014 | noxcturnal: 0.1.1 | ||
| 13346 | picomatch: 4.0.7 | 13015 | picomatch: 4.0.7 |
| 13347 | postcss: 8.5.28 | 13016 | postcss: 8.5.28 |
| 13348 | resolve-from: 5.0.0 | 13017 | resolve-from: 5.0.0 |
| 13349 | optionalDependencies: | 13018 | optionalDependencies: |
| 13350 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 13019 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 13351 | transitivePeerDependencies: | 13020 | transitivePeerDependencies: |
| 13352 | - bufferutil | 13021 | - bufferutil |
| 13353 | - supports-color | 13022 | - supports-color |
| 13354 | - typescript | 13023 | - typescript |
| 13355 | - utf-8-validate | 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 | dependencies: | 13027 | dependencies: |
| 13028 | 2g: 0.4.4(typescript@7.0.2) | ||
| 13359 | debug: 4.4.3 | 13029 | debug: 4.4.3 |
| 13360 | fb-watchman: 2.0.2 | 13030 | fb-watchman: 2.0.2 |
| 13361 | invariant: 2.2.4 | 13031 | invariant: 2.2.4 |
| ... | @@ -13364,85 +13034,71 @@ snapshots: | ... | @@ -13364,85 +13034,71 @@ snapshots: |
| 13364 | walker: 1.0.8 | 13034 | walker: 1.0.8 |
| 13365 | transitivePeerDependencies: | 13035 | transitivePeerDependencies: |
| 13366 | - supports-color | 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)': | 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)': |
| 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)': | ||
| 13383 | dependencies: | 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 | anser: 1.4.10 | 13042 | anser: 1.4.10 |
| 13386 | expo: 57.0.18(0bf40d5ad6281d8f1e92517b24812edb) | 13043 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 13387 | pretty-format: 29.7.0 | 13044 | pretty-format: 29.7.0 |
| 13388 | react: 19.2.6 | 13045 | react: 19.3.0 |
| 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) | 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 | stacktrace-parser: 0.1.11 | 13047 | stacktrace-parser: 0.1.11 |
| 13391 | whatwg-fetch: 3.6.20 | 13048 | whatwg-fetch: 3.6.20 |
| 13392 | optionalDependencies: | 13049 | optionalDependencies: |
| 13393 | react-dom: 19.2.6(react@19.2.6) | 13050 | react-dom: 19.3.0(react@19.3.0) |
| 13394 | optional: true | 13051 | |
| 13395 | 13052 | '@expo/metro@58.0.0-rc.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)': | |
| 13396 | '@expo/metro@56.0.2(bufferutil@4.1.0)(utf-8-validate@6.0.6)': | 13053 | dependencies: |
| 13397 | dependencies: | 13054 | metro: 0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) |
| 13398 | metro: 0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6) | 13055 | metro-babel-transformer: 0.87.1 |
| 13399 | metro-babel-transformer: 0.84.5 | 13056 | metro-cache: 0.87.1 |
| 13400 | metro-cache: 0.84.5 | 13057 | metro-cache-key: 0.87.1 |
| 13401 | metro-cache-key: 0.84.5 | 13058 | metro-config: 0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) |
| 13402 | metro-config: 0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6) | 13059 | metro-core: 0.87.1 |
| 13403 | metro-core: 0.84.5 | 13060 | metro-file-map: 0.87.1 |
| 13404 | metro-file-map: 0.84.5 | 13061 | metro-minify-terser: 0.87.1 |
| 13405 | metro-minify-terser: 0.84.5 | 13062 | metro-resolver: 0.87.1 |
| 13406 | metro-resolver: 0.84.5 | 13063 | metro-runtime: 0.87.1 |
| 13407 | metro-runtime: 0.84.5 | 13064 | metro-source-map: 0.87.1 |
| 13408 | metro-source-map: 0.84.5 | 13065 | metro-symbolicate: 0.87.1 |
| 13409 | metro-symbolicate: 0.84.5 | 13066 | metro-transform-plugins: 0.87.1 |
| 13410 | metro-transform-plugins: 0.84.5 | 13067 | metro-transform-worker: 0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) |
| 13411 | metro-transform-worker: 0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6) | ||
| 13412 | transitivePeerDependencies: | 13068 | transitivePeerDependencies: |
| 13413 | - bufferutil | 13069 | - bufferutil |
| 13414 | - supports-color | 13070 | - supports-color |
| 13415 | - utf-8-validate | 13071 | - utf-8-validate |
| 13416 | 13072 | ||
| 13417 | '@expo/osascript@2.7.1': | 13073 | '@expo/osascript@2.8.1': |
| 13418 | dependencies: | 13074 | dependencies: |
| 13419 | '@expo/spawn-async': 1.8.0 | 13075 | '@expo/spawn-async': 1.8.0 |
| 13420 | 13076 | ||
| 13421 | '@expo/package-manager@1.13.1': | 13077 | '@expo/package-manager@1.14.1': |
| 13422 | dependencies: | 13078 | dependencies: |
| 13423 | '@expo/json-file': 11.0.1 | 13079 | '@expo/json-file': 11.2.1 |
| 13424 | '@expo/spawn-async': 1.8.0 | 13080 | '@expo/spawn-async': 1.8.0 |
| 13425 | chalk: 4.1.2 | 13081 | chalk: 4.1.2 |
| 13426 | npm-package-arg: 11.0.3 | 13082 | npm-package-arg: 11.0.3 |
| 13427 | ora: 3.4.0 | 13083 | ora: 3.4.0 |
| 13428 | resolve-workspace-root: 2.0.1 | 13084 | resolve-workspace-root: 2.0.1 |
| 13429 | 13085 | ||
| 13430 | '@expo/plist@0.8.1': | 13086 | '@expo/plist@0.10.1': |
| 13431 | dependencies: | 13087 | dependencies: |
| 13432 | '@xmldom/xmldom': 0.8.15 | 13088 | '@xmldom/xmldom': 0.8.15 |
| 13433 | base64-js: 1.5.1 | 13089 | base64-js: 1.5.1 |
| 13434 | xmlbuilder: 15.1.1 | 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 | dependencies: | 13093 | dependencies: |
| 13438 | '@expo/config': 57.0.9(typescript@7.0.2) | 13094 | '@expo/config': 58.0.1(typescript@7.0.2) |
| 13439 | '@expo/config-plugins': 57.0.9(typescript@7.0.2) | 13095 | '@expo/config-plugins': 58.0.4(typescript@7.0.2) |
| 13440 | '@expo/config-types': 57.0.2 | 13096 | '@expo/config-types': 58.0.2 |
| 13441 | '@expo/image-utils': 0.11.5(typescript@7.0.2) | 13097 | '@expo/image-utils': 0.12.2(typescript@7.0.2) |
| 13442 | '@expo/json-file': 11.0.1 | 13098 | '@expo/json-file': 11.2.1 |
| 13443 | '@react-native/normalize-colors': 0.86.3 | 13099 | '@react-native/normalize-colors': 0.88.0-rc.3 |
| 13444 | debug: 4.4.3 | 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 | resolve-from: 5.0.0 | 13102 | resolve-from: 5.0.0 |
| 13447 | semver: 7.8.5 | 13103 | semver: 7.8.5 |
| 13448 | transitivePeerDependencies: | 13104 | transitivePeerDependencies: |
| ... | @@ -13459,7 +13115,7 @@ snapshots: | ... | @@ -13459,7 +13115,7 @@ snapshots: |
| 13459 | transitivePeerDependencies: | 13115 | transitivePeerDependencies: |
| 13460 | - supports-color | 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 | dependencies: | 13119 | dependencies: |
| 13464 | '@babel/code-frame': 7.29.7 | 13120 | '@babel/code-frame': 7.29.7 |
| 13465 | '@babel/core': 7.29.7 | 13121 | '@babel/core': 7.29.7 |
| ... | @@ -13469,36 +13125,21 @@ snapshots: | ... | @@ -13469,36 +13125,21 @@ snapshots: |
| 13469 | transitivePeerDependencies: | 13125 | transitivePeerDependencies: |
| 13470 | - supports-color | 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)': | 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)': |
| 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)': | ||
| 13487 | dependencies: | 13129 | dependencies: |
| 13488 | debug: 4.4.3 | 13130 | debug: 4.4.3 |
| 13489 | expo: 57.0.18(0bf40d5ad6281d8f1e92517b24812edb) | 13131 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 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)) | 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) |
| 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) | 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) |
| 13492 | expo-server: 57.0.3 | 13134 | expo-server: 58.0.2 |
| 13493 | react: 19.2.6 | 13135 | react: 19.3.0 |
| 13494 | optionalDependencies: | 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) | 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) |
| 13496 | react-dom: 19.2.6(react@19.2.6) | 13138 | react-dom: 19.3.0(react@19.3.0) |
| 13497 | transitivePeerDependencies: | 13139 | transitivePeerDependencies: |
| 13498 | - supports-color | 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 | '@expo/sdk-runtime-versions@1.0.0': {} | 13144 | '@expo/sdk-runtime-versions@1.0.0': {} |
| 13504 | 13145 | ||
| ... | @@ -13508,20 +13149,16 @@ snapshots: | ... | @@ -13508,20 +13149,16 @@ snapshots: |
| 13508 | 13149 | ||
| 13509 | '@expo/sudo-prompt@9.3.2': {} | 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 | dependencies: | 13153 | dependencies: |
| 13513 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 13154 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 13514 | react: 19.2.3 | 13155 | react: 19.3.0 |
| 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) | 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 | sf-symbols-typescript: 2.2.0 | 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 | optionalDependencies: | 13158 | optionalDependencies: |
| 13519 | '@babel/core': 7.29.7 | 13159 | '@babel/core': 7.29.7 |
| 13520 | react-dom: 19.2.3(react@19.2.3) | 13160 | react-dom: 19.3.0(react@19.3.0) |
| 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) | 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) |
| 13522 | transitivePeerDependencies: | ||
| 13523 | - '@types/react' | ||
| 13524 | - '@types/react-dom' | ||
| 13525 | 13162 | ||
| 13526 | '@expo/ws-tunnel@2.0.0(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))': | 13163 | '@expo/ws-tunnel@2.0.0(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))': |
| 13527 | dependencies: | 13164 | dependencies: |
| ... | @@ -13784,14 +13421,6 @@ snapshots: | ... | @@ -13784,14 +13421,6 @@ snapshots: |
| 13784 | dependencies: | 13421 | dependencies: |
| 13785 | jsbi: 4.3.2 | 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 | '@legendapp/list@3.3.5(patch_hash=680cc6a5c5b4a4032e467e7b3fde22f89a84c0ee2e6eac6fda737d6277cc0806)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': | 13424 | '@legendapp/list@3.3.5(patch_hash=680cc6a5c5b4a4032e467e7b3fde22f89a84c0ee2e6eac6fda737d6277cc0806)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': |
| 13796 | dependencies: | 13425 | dependencies: |
| 13797 | react: 19.2.6 | 13426 | react: 19.2.6 |
| ... | @@ -13799,6 +13428,14 @@ snapshots: | ... | @@ -13799,6 +13428,14 @@ snapshots: |
| 13799 | optionalDependencies: | 13428 | optionalDependencies: |
| 13800 | react-dom: 19.2.6(react@19.2.6) | 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 | '@libsql/client@0.17.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)': | 13439 | '@libsql/client@0.17.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)': |
| 13803 | dependencies: | 13440 | dependencies: |
| 13804 | '@libsql/core': 0.17.3 | 13441 | '@libsql/core': 0.17.3 |
| ... | @@ -14006,6 +13643,30 @@ snapshots: | ... | @@ -14006,6 +13643,30 @@ snapshots: |
| 14006 | 13643 | ||
| 14007 | '@nornagon/put@0.0.8': {} | 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 | '@octokit/auth-token@6.0.0': {} | 13670 | '@octokit/auth-token@6.0.0': {} |
| 14010 | 13671 | ||
| 14011 | '@octokit/core@7.0.6': | 13672 | '@octokit/core@7.0.6': |
| ... | @@ -14216,6 +13877,8 @@ snapshots: | ... | @@ -14216,6 +13877,8 @@ snapshots: |
| 14216 | '@oxc-project/types@0.127.0': | 13877 | '@oxc-project/types@0.127.0': |
| 14217 | optional: true | 13878 | optional: true |
| 14218 | 13879 | ||
| 13880 | '@oxc-project/types@0.141.0': {} | ||
| 13881 | |||
| 14219 | '@oxc-project/types@0.146.0': {} | 13882 | '@oxc-project/types@0.146.0': {} |
| 14220 | 13883 | ||
| 14221 | '@oxc-project/types@0.147.0': {} | 13884 | '@oxc-project/types@0.147.0': {} |
| ... | @@ -14444,16 +14107,16 @@ snapshots: | ... | @@ -14444,16 +14107,16 @@ snapshots: |
| 14444 | tslib: 2.8.1 | 14107 | tslib: 2.8.1 |
| 14445 | webcrypto-core: 1.9.2 | 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 | dependencies: | 14111 | dependencies: |
| 14449 | '@pierre/theme': 1.1.0 | 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 | '@shikijs/transformers': 4.2.0 | 14114 | '@shikijs/transformers': 4.2.0 |
| 14452 | diff: 9.0.0 | 14115 | diff: 9.0.0 |
| 14453 | hast-util-to-html: 9.0.5 | 14116 | hast-util-to-html: 9.0.5 |
| 14454 | lru_map: 0.4.1 | 14117 | lru_map: 0.4.1 |
| 14455 | react: 19.2.3 | 14118 | react: 19.3.0 |
| 14456 | react-dom: 19.2.3(react@19.2.3) | 14119 | react-dom: 19.3.0(react@19.3.0) |
| 14457 | shiki: 4.2.0 | 14120 | shiki: 4.2.0 |
| 14458 | transitivePeerDependencies: | 14121 | transitivePeerDependencies: |
| 14459 | - '@shikijs/themes' | 14122 | - '@shikijs/themes' |
| ... | @@ -14474,12 +14137,12 @@ snapshots: | ... | @@ -14474,12 +14137,12 @@ snapshots: |
| 14474 | 14137 | ||
| 14475 | '@pierre/theme@1.1.0': {} | 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 | optionalDependencies: | 14141 | optionalDependencies: |
| 14479 | '@pierre/theme': 1.1.0 | 14142 | '@pierre/theme': 1.1.0 |
| 14480 | '@shikijs/themes': 4.2.0 | 14143 | '@shikijs/themes': 4.2.0 |
| 14481 | react: 19.2.3 | 14144 | react: 19.3.0 |
| 14482 | react-dom: 19.2.3(react@19.2.3) | 14145 | react-dom: 19.3.0(react@19.3.0) |
| 14483 | shiki: 4.2.0 | 14146 | shiki: 4.2.0 |
| 14484 | 14147 | ||
| 14485 | '@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)': | 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,19 +14153,19 @@ snapshots: |
| 14490 | react-dom: 19.2.6(react@19.2.6) | 14153 | react-dom: 19.2.6(react@19.2.6) |
| 14491 | shiki: 4.2.0 | 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 | dependencies: | 14157 | dependencies: |
| 14495 | preact: 11.0.0-beta.0 | 14158 | preact: 11.0.0-beta.0 |
| 14496 | preact-render-to-string: 6.6.5(preact@11.0.0-beta.0) | 14159 | preact-render-to-string: 6.6.5(preact@11.0.0-beta.0) |
| 14497 | react: 19.2.3 | 14160 | react: 19.2.6 |
| 14498 | react-dom: 19.2.3(react@19.2.3) | 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 | dependencies: | 14164 | dependencies: |
| 14502 | preact: 11.0.0-beta.0 | 14165 | preact: 11.0.0-beta.0 |
| 14503 | preact-render-to-string: 6.6.5(preact@11.0.0-beta.0) | 14166 | preact-render-to-string: 6.6.5(preact@11.0.0-beta.0) |
| 14504 | react: 19.2.6 | 14167 | react: 19.3.0 |
| 14505 | react-dom: 19.2.6(react@19.2.6) | 14168 | react-dom: 19.3.0(react@19.3.0) |
| 14506 | 14169 | ||
| 14507 | '@polka/url@1.0.0-next.29': {} | 14170 | '@polka/url@1.0.0-next.29': {} |
| 14508 | 14171 | ||
| ... | @@ -14513,149 +14176,6 @@ snapshots: | ... | @@ -14513,149 +14176,6 @@ snapshots: |
| 14513 | optionalDependencies: | 14176 | optionalDependencies: |
| 14514 | yauzl: 3.4.0 | 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 | '@react-grab/cli@0.1.44': | 14179 | '@react-grab/cli@0.1.44': |
| 14660 | dependencies: | 14180 | dependencies: |
| 14661 | agent-install: 0.0.5 | 14181 | agent-install: 0.0.5 |
| ... | @@ -14667,35 +14187,35 @@ snapshots: | ... | @@ -14667,35 +14187,35 @@ snapshots: |
| 14667 | prompts: 2.4.2 | 14187 | prompts: 2.4.2 |
| 14668 | tinyexec: 1.2.4 | 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 | dependencies: | 14191 | dependencies: |
| 14672 | '@ai-sdk/provider': 3.0.15 | 14192 | '@ai-sdk/provider': 3.0.15 |
| 14673 | '@ai-sdk/provider-utils': 4.0.49(zod@4.4.3) | 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 | zod: 4.4.3 | 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 | dependencies: | 14198 | dependencies: |
| 14679 | react: 19.2.3 | 14199 | react: 19.3.0 |
| 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) | 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 | optional: true | 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 | dependencies: | 14204 | dependencies: |
| 14685 | react: 19.2.3 | 14205 | react: 19.3.0 |
| 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) | 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 | dependencies: | 14211 | dependencies: |
| 14692 | '@babel/traverse': 7.29.7 | 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 | transitivePeerDependencies: | 14214 | transitivePeerDependencies: |
| 14695 | - '@babel/core' | 14215 | - '@babel/core' |
| 14696 | - supports-color | 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 | dependencies: | 14219 | dependencies: |
| 14700 | '@babel/core': 7.29.7 | 14220 | '@babel/core': 7.29.7 |
| 14701 | '@babel/plugin-proposal-export-default-from': 7.29.7(@babel/core@7.29.7) | 14221 | '@babel/plugin-proposal-export-default-from': 7.29.7(@babel/core@7.29.7) |
| ... | @@ -14726,42 +14246,42 @@ snapshots: | ... | @@ -14726,42 +14246,42 @@ snapshots: |
| 14726 | '@babel/plugin-transform-runtime': 7.29.7(@babel/core@7.29.7) | 14246 | '@babel/plugin-transform-runtime': 7.29.7(@babel/core@7.29.7) |
| 14727 | '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) | 14247 | '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) |
| 14728 | '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7) | 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) | 14249 | '@react-native/babel-plugin-codegen': 0.88.0-rc.3(@babel/core@7.29.7) |
| 14730 | babel-plugin-syntax-hermes-parser: 0.36.0 | ||
| 14731 | babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.29.7) | 14250 | babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.29.7) |
| 14251 | flow-parser: 0.327.0 | ||
| 14732 | react-refresh: 0.14.2 | 14252 | react-refresh: 0.14.2 |
| 14733 | transitivePeerDependencies: | 14253 | transitivePeerDependencies: |
| 14734 | - supports-color | 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 | dependencies: | 14257 | dependencies: |
| 14738 | '@babel/core': 7.29.7 | 14258 | '@babel/core': 7.29.7 |
| 14739 | '@babel/parser': 7.29.7 | 14259 | '@babel/parser': 7.29.8 |
| 14740 | hermes-parser: 0.36.0 | 14260 | flow-parser: 0.327.0 |
| 14741 | invariant: 2.2.4 | 14261 | invariant: 2.2.4 |
| 14742 | nullthrows: 1.1.1 | 14262 | nullthrows: 1.1.1 |
| 14743 | tinyglobby: 0.2.17 | 14263 | tinyglobby: 0.2.17 |
| 14744 | yargs: 17.7.2 | 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 | dependencies: | 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 | debug: 4.4.3 | 14271 | debug: 4.4.3 |
| 14750 | invariant: 2.2.4 | 14272 | invariant: 2.2.4 |
| 14751 | metro: 0.84.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) | 14273 | metro: 0.87.1(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 | ||
| 14754 | semver: 7.8.5 | 14274 | semver: 7.8.5 |
| 14755 | optionalDependencies: | 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 | transitivePeerDependencies: | 14277 | transitivePeerDependencies: |
| 14758 | - bufferutil | 14278 | - bufferutil |
| 14759 | - supports-color | 14279 | - supports-color |
| 14760 | - utf-8-validate | 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 | dependencies: | 14285 | dependencies: |
| 14766 | cross-spawn: 7.0.6 | 14286 | cross-spawn: 7.0.6 |
| 14767 | debug: 4.4.3 | 14287 | debug: 4.4.3 |
| ... | @@ -14769,18 +14289,16 @@ snapshots: | ... | @@ -14769,18 +14289,16 @@ snapshots: |
| 14769 | transitivePeerDependencies: | 14289 | transitivePeerDependencies: |
| 14770 | - supports-color | 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 | dependencies: | 14293 | dependencies: |
| 14774 | '@isaacs/ttlcache': 1.4.1 | 14294 | '@isaacs/ttlcache': 1.4.1 |
| 14775 | '@react-native/debugger-frontend': 0.86.3 | 14295 | '@react-native/debugger-frontend': 0.88.0-rc.3 |
| 14776 | '@react-native/debugger-shell': 0.86.3 | 14296 | '@react-native/debugger-shell': 0.88.0-rc.3 |
| 14777 | chrome-launcher: 0.15.2 | ||
| 14778 | chromium-edge-launcher: 0.3.0 | ||
| 14779 | connect: 3.7.0 | 14297 | connect: 3.7.0 |
| 14780 | debug: 4.4.3 | 14298 | debug: 4.4.3 |
| 14781 | invariant: 2.2.4 | 14299 | invariant: 2.2.4 |
| 14782 | nullthrows: 1.1.1 | 14300 | nullthrows: 1.1.1 |
| 14783 | open: 7.4.2 | 14301 | open: 8.4.2 |
| 14784 | serve-static: 1.16.3 | 14302 | serve-static: 1.16.3 |
| 14785 | ws: 7.5.11(bufferutil@4.1.0)(utf-8-validate@6.0.6) | 14303 | ws: 7.5.11(bufferutil@4.1.0)(utf-8-validate@6.0.6) |
| 14786 | transitivePeerDependencies: | 14304 | transitivePeerDependencies: |
| ... | @@ -14788,100 +14306,90 @@ snapshots: | ... | @@ -14788,100 +14306,90 @@ snapshots: |
| 14788 | - supports-color | 14306 | - supports-color |
| 14789 | - utf-8-validate | 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 | dependencies: | 14314 | dependencies: |
| 14797 | '@babel/core': 7.29.7 | 14315 | '@babel/core': 7.29.7 |
| 14798 | '@react-native/babel-preset': 0.86.3(@babel/core@7.29.7) | 14316 | '@react-native/babel-preset': 0.88.0-rc.3(@babel/core@7.29.7) |
| 14799 | hermes-parser: 0.36.0 | 14317 | flow-parser: 0.327.0 |
| 14800 | nullthrows: 1.1.1 | 14318 | nullthrows: 1.1.1 |
| 14801 | transitivePeerDependencies: | 14319 | transitivePeerDependencies: |
| 14802 | - supports-color | 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 | dependencies: | 14323 | dependencies: |
| 14806 | '@react-native/js-polyfills': 0.86.3 | 14324 | '@react-native/js-polyfills': 0.88.0-rc.3 |
| 14807 | '@react-native/metro-babel-transformer': 0.86.3(@babel/core@7.29.7) | 14325 | '@react-native/metro-babel-transformer': 0.88.0-rc.3(@babel/core@7.29.7) |
| 14808 | metro-config: 0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6) | 14326 | metro-config: 0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) |
| 14809 | metro-runtime: 0.84.5 | 14327 | metro-runtime: 0.87.1 |
| 14810 | transitivePeerDependencies: | 14328 | transitivePeerDependencies: |
| 14811 | - '@babel/core' | 14329 | - '@babel/core' |
| 14812 | - bufferutil | 14330 | - bufferutil |
| 14813 | - supports-color | 14331 | - supports-color |
| 14814 | - utf-8-validate | 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 | dependencies: | 14337 | dependencies: |
| 14820 | invariant: 2.2.4 | 14338 | invariant: 2.2.4 |
| 14821 | nullthrows: 1.1.1 | 14339 | nullthrows: 1.1.1 |
| 14822 | react: 19.2.3 | 14340 | react: 19.3.0 |
| 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) | 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 | optionalDependencies: | 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)': | 14345 | '@react-navigation/core@7.21.13(react@19.3.0)': |
| 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)': | ||
| 14838 | dependencies: | 14346 | dependencies: |
| 14839 | '@react-navigation/routers': 7.6.4 | 14347 | '@react-navigation/routers': 7.6.4 |
| 14840 | escape-string-regexp: 4.0.0 | 14348 | escape-string-regexp: 4.0.0 |
| 14841 | fast-deep-equal: 3.1.3 | 14349 | fast-deep-equal: 3.1.3 |
| 14842 | nanoid: 3.3.19 | 14350 | nanoid: 3.3.19 |
| 14843 | query-string: 7.1.3 | 14351 | query-string: 7.1.3 |
| 14844 | react: 19.2.3 | 14352 | react: 19.3.0 |
| 14845 | react-is: 19.2.7 | 14353 | react-is: 19.2.7 |
| 14846 | use-latest-callback: 0.2.6(react@19.2.3) | 14354 | use-latest-callback: 0.2.6(react@19.3.0) |
| 14847 | use-sync-external-store: 1.6.0(react@19.2.3) | 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 | dependencies: | 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 | color: 4.2.3 | 14360 | color: 4.2.3 |
| 14853 | react: 19.2.3 | 14361 | react: 19.3.0 |
| 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) | 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) |
| 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) | 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) |
| 14856 | use-latest-callback: 0.2.6(react@19.2.3) | 14364 | use-latest-callback: 0.2.6(react@19.3.0) |
| 14857 | use-sync-external-store: 1.6.0(react@19.2.3) | 14365 | use-sync-external-store: 1.6.0(react@19.3.0) |
| 14858 | optionalDependencies: | 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 | dependencies: | 14370 | dependencies: |
| 14863 | '@react-navigation/elements': 2.9.26(c10301b6e0c42fc6434d2b643197a81e) | 14371 | '@react-navigation/elements': 2.9.26(83de68753219ecf7f3321e065bd378be) |
| 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) | 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 | color: 4.2.3 | 14373 | color: 4.2.3 |
| 14866 | react: 19.2.3 | 14374 | react: 19.3.0 |
| 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) | 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) |
| 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) | 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) |
| 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) | 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 | sf-symbols-typescript: 2.2.0 | 14378 | sf-symbols-typescript: 2.2.0 |
| 14871 | warn-once: 0.1.1 | 14379 | warn-once: 0.1.1 |
| 14872 | transitivePeerDependencies: | 14380 | transitivePeerDependencies: |
| 14873 | - '@react-native-masked-view/masked-view' | 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 | dependencies: | 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 | escape-string-regexp: 4.0.0 | 14386 | escape-string-regexp: 4.0.0 |
| 14879 | fast-deep-equal: 3.1.3 | 14387 | fast-deep-equal: 3.1.3 |
| 14880 | nanoid: 3.3.19 | 14388 | nanoid: 3.3.19 |
| 14881 | react: 19.2.3 | 14389 | react: 19.3.0 |
| 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) | 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 | standard-navigation: 0.0.7 | 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 | '@react-navigation/routers@7.6.4': | 14394 | '@react-navigation/routers@7.6.4': |
| 14887 | dependencies: | 14395 | dependencies: |
| ... | @@ -15153,28 +14661,28 @@ snapshots: | ... | @@ -15153,28 +14661,28 @@ snapshots: |
| 15153 | dependencies: | 14661 | dependencies: |
| 15154 | defer-to-connect: 2.0.1 | 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 | dependencies: | 14665 | dependencies: |
| 15158 | '@t3tools/client-runtime': link:packages/client-runtime | 14666 | '@t3tools/client-runtime': link:packages/client-runtime |
| 15159 | '@t3tools/shared': link:packages/shared | 14667 | '@t3tools/shared': link:packages/shared |
| 15160 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 14668 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 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) | 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) |
| 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) | 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) |
| 15163 | expo-haptics: 57.0.2(expo@57.0.18) | 14671 | expo-haptics: 58.0.3(expo@58.0.0) |
| 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) | 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) |
| 15165 | react: 19.2.3 | 14673 | react: 19.3.0 |
| 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) | 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) |
| 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) | 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 | '@t3tools/mobile-review-diff-native@file:apps/mobile/modules/t3-review-diff': {} | 14677 | '@t3tools/mobile-review-diff-native@file:apps/mobile/modules/t3-review-diff': {} |
| 15170 | 14678 | ||
| 15171 | '@t3tools/mobile-terminal-native@file:apps/mobile/modules/t3-terminal': {} | 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 | dependencies: | 14682 | dependencies: |
| 15175 | '@tabler/icons': 3.44.0 | 14683 | '@tabler/icons': 3.44.0 |
| 15176 | react: 19.2.3 | 14684 | react: 19.3.0 |
| 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) | 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 | '@tabler/icons@3.44.0': {} | 14687 | '@tabler/icons@3.44.0': {} |
| 15180 | 14688 | ||
| ... | @@ -15296,7 +14804,7 @@ snapshots: | ... | @@ -15296,7 +14804,7 @@ snapshots: |
| 15296 | 14804 | ||
| 15297 | '@tanstack/router-generator@1.167.12': | 14805 | '@tanstack/router-generator@1.167.12': |
| 15298 | dependencies: | 14806 | dependencies: |
| 15299 | '@babel/types': 7.29.7 | 14807 | '@babel/types': 7.29.8 |
| 15300 | '@tanstack/router-core': 1.171.8 | 14808 | '@tanstack/router-core': 1.171.8 |
| 15301 | '@tanstack/router-utils': 1.162.1 | 14809 | '@tanstack/router-utils': 1.162.1 |
| 15302 | '@tanstack/virtual-file-routes': 1.162.0 | 14810 | '@tanstack/virtual-file-routes': 1.162.0 |
| ... | @@ -15333,7 +14841,7 @@ snapshots: | ... | @@ -15333,7 +14841,7 @@ snapshots: |
| 15333 | '@babel/core': 7.29.7 | 14841 | '@babel/core': 7.29.7 |
| 15334 | '@babel/generator': 7.29.7 | 14842 | '@babel/generator': 7.29.7 |
| 15335 | '@babel/parser': 7.29.7 | 14843 | '@babel/parser': 7.29.7 |
| 15336 | '@babel/types': 7.29.7 | 14844 | '@babel/types': 7.29.8 |
| 15337 | ansis: 4.3.1 | 14845 | ansis: 4.3.1 |
| 15338 | babel-dead-code-elimination: 1.0.12 | 14846 | babel-dead-code-elimination: 1.0.12 |
| 15339 | diff: 8.0.3 | 14847 | diff: 8.0.3 |
| ... | @@ -15500,12 +15008,12 @@ snapshots: | ... | @@ -15500,12 +15008,12 @@ snapshots: |
| 15500 | prosemirror-transform: 1.12.1 | 15008 | prosemirror-transform: 1.12.1 |
| 15501 | prosemirror-view: 1.42.3 | 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 | dependencies: | 15012 | dependencies: |
| 15505 | '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3) | 15013 | '@tiptap/core': 3.31.3(@tiptap/pm@3.31.3) |
| 15506 | '@tiptap/pm': 3.31.3 | 15014 | '@tiptap/pm': 3.31.3 |
| 15507 | '@types/react': 19.2.16 | 15015 | '@types/react': 19.3.0 |
| 15508 | '@types/react-dom': 19.2.3(@types/react@19.2.16) | 15016 | '@types/react-dom': 19.2.3(@types/react@19.3.0) |
| 15509 | '@types/use-sync-external-store': 0.0.6 | 15017 | '@types/use-sync-external-store': 0.0.6 |
| 15510 | fast-equals: 5.4.2 | 15018 | fast-equals: 5.4.2 |
| 15511 | react: 19.2.6 | 15019 | react: 19.2.6 |
| ... | @@ -15570,16 +15078,16 @@ snapshots: | ... | @@ -15570,16 +15078,16 @@ snapshots: |
| 15570 | 15078 | ||
| 15571 | '@types/babel__generator@7.27.0': | 15079 | '@types/babel__generator@7.27.0': |
| 15572 | dependencies: | 15080 | dependencies: |
| 15573 | '@babel/types': 7.29.7 | 15081 | '@babel/types': 7.29.8 |
| 15574 | 15082 | ||
| 15575 | '@types/babel__template@7.4.4': | 15083 | '@types/babel__template@7.4.4': |
| 15576 | dependencies: | 15084 | dependencies: |
| 15577 | '@babel/parser': 7.29.7 | 15085 | '@babel/parser': 7.29.7 |
| 15578 | '@babel/types': 7.29.7 | 15086 | '@babel/types': 7.29.8 |
| 15579 | 15087 | ||
| 15580 | '@types/babel__traverse@7.28.0': | 15088 | '@types/babel__traverse@7.28.0': |
| 15581 | dependencies: | 15089 | dependencies: |
| 15582 | '@babel/types': 7.29.7 | 15090 | '@babel/types': 7.29.8 |
| 15583 | 15091 | ||
| 15584 | '@types/body-parser@1.19.6': | 15092 | '@types/body-parser@1.19.6': |
| 15585 | dependencies: | 15093 | dependencies: |
| ... | @@ -15640,8 +15148,6 @@ snapshots: | ... | @@ -15640,8 +15148,6 @@ snapshots: |
| 15640 | dependencies: | 15148 | dependencies: |
| 15641 | '@types/node': 24.12.4 | 15149 | '@types/node': 24.12.4 |
| 15642 | 15150 | ||
| 15643 | '@types/hammerjs@2.0.46': {} | ||
| 15644 | |||
| 15645 | '@types/hast@3.0.4': | 15151 | '@types/hast@3.0.4': |
| 15646 | dependencies: | 15152 | dependencies: |
| 15647 | '@types/unist': 3.0.3 | 15153 | '@types/unist': 3.0.3 |
| ... | @@ -15696,15 +15202,15 @@ snapshots: | ... | @@ -15696,15 +15202,15 @@ snapshots: |
| 15696 | 15202 | ||
| 15697 | '@types/range-parser@1.2.7': {} | 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 | dependencies: | 15206 | dependencies: |
| 15701 | '@types/react': 19.2.16 | 15207 | '@types/react': 19.3.0 |
| 15702 | 15208 | ||
| 15703 | '@types/react-test-renderer@19.1.0': | 15209 | '@types/react-test-renderer@19.1.0': |
| 15704 | dependencies: | 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 | dependencies: | 15214 | dependencies: |
| 15709 | csstype: 3.2.3 | 15215 | csstype: 3.2.3 |
| 15710 | 15216 | ||
| ... | @@ -16185,7 +15691,7 @@ snapshots: | ... | @@ -16185,7 +15691,7 @@ snapshots: |
| 16185 | 15691 | ||
| 16186 | agent-base@7.1.4: {} | 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 | agent-install@0.0.5: | 15696 | agent-install@0.0.5: |
| 16191 | dependencies: | 15697 | dependencies: |
| ... | @@ -16228,12 +15734,12 @@ snapshots: | ... | @@ -16228,12 +15734,12 @@ snapshots: |
| 16228 | json-schema-traverse: 1.0.0 | 15734 | json-schema-traverse: 1.0.0 |
| 16229 | require-from-string: 2.0.2 | 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 | : dependencies: | 15738 | : dependencies: |
| 16233 | '@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) | 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 | '@alchemy.run/floci': 2.0.0-beta.79(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)) | 15740 | '@alchemy.run/floci': 2.0.0-beta.79(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)) |
| 16235 | '@alchemy.run/node-utils': 2.0.0-beta.79 | 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 | '@aws-sdk/credential-providers': 3.1062.0 | 15743 | '@aws-sdk/credential-providers': 3.1062.0 |
| 16238 | '@distilled.cloud/aws': 1.0.0-rc.12(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)) | 15744 | '@distilled.cloud/aws': 1.0.0-rc.12(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)) |
| 16239 | '@distilled.cloud/axiom': 1.0.0-rc.12(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)) | 15745 | '@distilled.cloud/axiom': 1.0.0-rc.12(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)) |
| ... | @@ -16268,7 +15774,7 @@ snapshots: | ... | @@ -16268,7 +15774,7 @@ snapshots: |
| 16268 | '@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) | 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 | '@effect/sql-pg': 4.0.0-rc.115(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)) | 15775 | '@effect/sql-pg': 4.0.0-rc.115(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)) |
| 16270 | drizzle-kit: 1.0.0-rc.5-ab785fc | 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 | mongodb: 6.21.0(@aws-sdk/credential-providers@3.1062.0)(socks@2.8.9) | 15778 | mongodb: 6.21.0(@aws-sdk/credential-providers@3.1062.0)(socks@2.8.9) |
| 16273 | pg: 8.23.0 | 15779 | pg: 8.23.0 |
| 16274 | 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)' | 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,10 +15881,6 @@ snapshots: |
| 16375 | 15881 | ||
| 16376 | argparse@2.0.1: {} | 15882 | argparse@2.0.1: {} |
| 16377 | 15883 | ||
| 16378 | aria-hidden@1.2.6: | ||
| 16379 | dependencies: | ||
| 16380 | tslib: 2.8.1 | ||
| 16381 | |||
| 16382 | aria-query@5.3.0: | 15884 | aria-query@5.3.0: |
| 16383 | dependencies: | 15885 | dependencies: |
| 16384 | dequal: 2.0.3 | 15886 | dequal: 2.0.3 |
| ... | @@ -16512,9 +16014,9 @@ snapshots: | ... | @@ -16512,9 +16014,9 @@ snapshots: |
| 16512 | babel-dead-code-elimination@1.0.12: | 16014 | babel-dead-code-elimination@1.0.12: |
| 16513 | dependencies: | 16015 | dependencies: |
| 16514 | '@babel/core': 7.29.7 | 16016 | '@babel/core': 7.29.7 |
| 16515 | '@babel/parser': 7.29.7 | 16017 | '@babel/parser': 7.29.8 |
| 16516 | '@babel/traverse': 7.29.7 | 16018 | '@babel/traverse': 7.29.7 |
| 16517 | '@babel/types': 7.29.7 | 16019 | '@babel/types': 7.29.8 |
| 16518 | transitivePeerDependencies: | 16020 | transitivePeerDependencies: |
| 16519 | - supports-color | 16021 | - supports-color |
| 16520 | 16022 | ||
| ... | @@ -16548,10 +16050,6 @@ snapshots: | ... | @@ -16548,10 +16050,6 @@ snapshots: |
| 16548 | 16050 | ||
| 16549 | babel-plugin-react-native-web@0.21.2: {} | 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 | babel-plugin-syntax-hermes-parser@0.36.1: | 16053 | babel-plugin-syntax-hermes-parser@0.36.1: |
| 16556 | dependencies: | 16054 | dependencies: |
| 16557 | hermes-parser: 0.36.1 | 16055 | hermes-parser: 0.36.1 |
| ... | @@ -16562,7 +16060,7 @@ snapshots: | ... | @@ -16562,7 +16060,7 @@ snapshots: |
| 16562 | transitivePeerDependencies: | 16060 | transitivePeerDependencies: |
| 16563 | - '@babel/core' | 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 | dependencies: | 16064 | dependencies: |
| 16567 | '@babel/generator': 7.29.7 | 16065 | '@babel/generator': 7.29.7 |
| 16568 | '@babel/helper-module-imports': 7.29.7 | 16066 | '@babel/helper-module-imports': 7.29.7 |
| ... | @@ -16593,14 +16091,14 @@ snapshots: | ... | @@ -16593,14 +16091,14 @@ snapshots: |
| 16593 | '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.29.7) | 16091 | '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.29.7) |
| 16594 | '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.29.7) | 16092 | '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.29.7) |
| 16595 | '@babel/plugin-transform-react-display-name': 7.29.7(@babel/core@7.29.7) | 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 | '@babel/plugin-transform-react-jsx-development': 7.29.7(@babel/core@7.29.7) | 16095 | '@babel/plugin-transform-react-jsx-development': 7.29.7(@babel/core@7.29.7) |
| 16598 | '@babel/plugin-transform-react-pure-annotations': 7.29.7(@babel/core@7.29.7) | 16096 | '@babel/plugin-transform-react-pure-annotations': 7.29.7(@babel/core@7.29.7) |
| 16599 | '@babel/plugin-transform-runtime': 7.29.7(@babel/core@7.29.7) | 16097 | '@babel/plugin-transform-runtime': 7.29.7(@babel/core@7.29.7) |
| 16600 | '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) | 16098 | '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) |
| 16601 | '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7) | 16099 | '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7) |
| 16602 | '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7) | 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 | babel-plugin-react-compiler: 1.0.0 | 16102 | babel-plugin-react-compiler: 1.0.0 |
| 16605 | babel-plugin-react-native-web: 0.21.2 | 16103 | babel-plugin-react-native-web: 0.21.2 |
| 16606 | babel-plugin-syntax-hermes-parser: 0.36.1 | 16104 | babel-plugin-syntax-hermes-parser: 0.36.1 |
| ... | @@ -16609,8 +16107,8 @@ snapshots: | ... | @@ -16609,8 +16107,8 @@ snapshots: |
| 16609 | react-refresh: 0.14.2 | 16107 | react-refresh: 0.14.2 |
| 16610 | optionalDependencies: | 16108 | optionalDependencies: |
| 16611 | '@babel/runtime': 7.29.7 | 16109 | '@babel/runtime': 7.29.7 |
| 16612 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 16110 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 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) | 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 | transitivePeerDependencies: | 16112 | transitivePeerDependencies: |
| 16615 | - '@babel/core' | 16113 | - '@babel/core' |
| 16616 | - supports-color | 16114 | - supports-color |
| ... | @@ -16829,29 +16327,8 @@ snapshots: | ... | @@ -16829,29 +16327,8 @@ snapshots: |
| 16829 | 16327 | ||
| 16830 | chownr@3.0.0: {} | 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 | chromium-pickle-js@0.2.0: {} | 16330 | chromium-pickle-js@0.2.0: {} |
| 16852 | 16331 | ||
| 16853 | ci-info@2.0.0: {} | ||
| 16854 | |||
| 16855 | ci-info@3.9.0: {} | 16332 | ci-info@3.9.0: {} |
| 16856 | 16333 | ||
| 16857 | ci-info@4.3.1: {} | 16334 | ci-info@4.3.1: {} |
| ... | @@ -17150,6 +16627,8 @@ snapshots: | ... | @@ -17150,6 +16627,8 @@ snapshots: |
| 17150 | gopd: 1.2.0 | 16627 | gopd: 1.2.0 |
| 17151 | optional: true | 16628 | optional: true |
| 17152 | 16629 | ||
| 16630 | define-lazy-prop@2.0.0: {} | ||
| 16631 | |||
| 17153 | define-properties@1.2.1: | 16632 | define-properties@1.2.1: |
| 17154 | dependencies: | 16633 | dependencies: |
| 17155 | define-data-property: 1.1.4 | 16634 | define-data-property: 1.1.4 |
| ... | @@ -17176,8 +16655,6 @@ snapshots: | ... | @@ -17176,8 +16655,6 @@ snapshots: |
| 17176 | 16655 | ||
| 17177 | detect-libc@2.1.2: {} | 16656 | detect-libc@2.1.2: {} |
| 17178 | 16657 | ||
| 17179 | detect-node-es@1.1.0: {} | ||
| 17180 | |||
| 17181 | detect-node@2.1.0: | 16658 | detect-node@2.1.0: |
| 17182 | optional: true | 16659 | optional: true |
| 17183 | 16660 | ||
| ... | @@ -17206,7 +16683,7 @@ snapshots: | ... | @@ -17206,7 +16683,7 @@ snapshots: |
| 17206 | - electron-builder-squirrel-windows | 16683 | - electron-builder-squirrel-windows |
| 17207 | - supports-color | 16684 | - supports-color |
| 17208 | 16685 | ||
| 17209 | dnssd-advertise@1.1.4: {} | 16686 | dnssd-advertise@1.1.6: {} |
| 17210 | 16687 | ||
| 17211 | dom-accessibility-api@0.5.16: {} | 16688 | dom-accessibility-api@0.5.16: {} |
| 17212 | 16689 | ||
| ... | @@ -17246,7 +16723,7 @@ snapshots: | ... | @@ -17246,7 +16723,7 @@ snapshots: |
| 17246 | get-tsconfig: 4.14.3 | 16723 | get-tsconfig: 4.14.3 |
| 17247 | jiti: 2.7.0 | 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 | optionalDependencies: | 16727 | optionalDependencies: |
| 17251 | '@cloudflare/workers-types': 4.20260604.1 | 16728 | '@cloudflare/workers-types': 4.20260604.1 |
| 17252 | '@effect/sql-d1': 4.0.0-rc.115(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)) | 16729 | '@effect/sql-d1': 4.0.0-rc.115(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)) |
| ... | @@ -17257,7 +16734,7 @@ snapshots: | ... | @@ -17257,7 +16734,7 @@ snapshots: |
| 17257 | '@libsql/client': 0.17.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) | 16734 | '@libsql/client': 0.17.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) |
| 17258 | bun-types: 1.3.14 | 16735 | bun-types: 1.3.14 |
| 17259 | effect: 4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5) | 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 | pg: 8.23.0 | 16738 | pg: 8.23.0 |
| 17262 | valibot: 1.2.0(typescript@7.0.2) | 16739 | valibot: 1.2.0(typescript@7.0.2) |
| 17263 | zod: 4.4.3 | 16740 | zod: 4.4.3 |
| ... | @@ -17526,231 +17003,195 @@ snapshots: | ... | @@ -17526,231 +17003,195 @@ snapshots: |
| 17526 | 17003 | ||
| 17527 | expect-type@1.4.0: {} | 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 | dependencies: | 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 | dependencies: | 17011 | dependencies: |
| 17535 | '@expo/image-utils': 0.11.5(typescript@7.0.2) | 17012 | '@expo/image-utils': 0.12.2(typescript@7.0.2) |
| 17536 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 17013 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 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)) | 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) |
| 17538 | react: 19.2.3 | 17015 | react: 19.3.0 |
| 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) | 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 | transitivePeerDependencies: | 17017 | transitivePeerDependencies: |
| 17541 | - supports-color | 17018 | - supports-color |
| 17542 | - typescript | 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 | dependencies: | 17022 | dependencies: |
| 17546 | '@expo/image-utils': 0.11.5(typescript@7.0.2) | 17023 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 17547 | expo: 57.0.18(0bf40d5ad6281d8f1e92517b24812edb) | 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) |
| 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)) | 17025 | react: 19.3.0 |
| 17549 | react: 19.2.6 | 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) |
| 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) | ||
| 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 | dependencies: | 17029 | dependencies: |
| 17565 | expo-application: 57.0.2(expo@57.0.18) | 17030 | expo-application: 58.0.2(expo@58.0.0) |
| 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)) | 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) |
| 17567 | expo-crypto: 57.0.2(expo@57.0.18) | 17032 | expo-crypto: 58.0.3(expo@58.0.0) |
| 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) | 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) |
| 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)) | 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 | invariant: 2.2.4 | 17035 | invariant: 2.2.4 |
| 17571 | react: 19.2.3 | 17036 | react: 19.3.0 |
| 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) | 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 | transitivePeerDependencies: | 17038 | transitivePeerDependencies: |
| 17574 | - expo | 17039 | - expo |
| 17575 | - supports-color | 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 | dependencies: | 17044 | dependencies: |
| 17579 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 17045 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 17580 | react: 19.2.3 | 17046 | react: 19.3.0 |
| 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) | 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 | dependencies: | 17050 | dependencies: |
| 17585 | '@expo/schema-utils': 57.0.2 | 17051 | '@expo/schema-utils': 58.0.1 |
| 17586 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 17052 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 17587 | resolve-from: 5.0.0 | 17053 | resolve-from: 5.0.0 |
| 17588 | semver: 7.8.5 | 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 | dependencies: | 17057 | dependencies: |
| 17592 | barcode-detector: 3.2.0(@types/emscripten@1.41.5) | 17058 | barcode-detector: 3.2.0(@types/emscripten@1.41.5) |
| 17593 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 17059 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 17594 | react: 19.2.3 | 17060 | react: 19.3.0 |
| 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) | 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 | transitivePeerDependencies: | 17062 | transitivePeerDependencies: |
| 17597 | - '@types/emscripten' | 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): | 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): |
| 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)): | ||
| 17606 | dependencies: | 17066 | dependencies: |
| 17607 | '@expo/env': 2.4.3 | 17067 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 17608 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 17068 | react: 19.3.0 |
| 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) | 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) |
| 17610 | transitivePeerDependencies: | ||
| 17611 | - supports-color | ||
| 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 | dependencies: | 17072 | dependencies: |
| 17615 | '@expo/env': 2.4.3 | 17073 | '@expo/env': 2.5.1 |
| 17616 | expo: 57.0.18(0bf40d5ad6281d8f1e92517b24812edb) | 17074 | '@expo/require-utils': 58.0.2(typescript@7.0.2) |
| 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) | 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 | transitivePeerDependencies: | 17077 | transitivePeerDependencies: |
| 17619 | - supports-color | 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 | dependencies: | 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 | dependencies: | 17086 | dependencies: |
| 17628 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 17087 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 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)) | 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)) |
| 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)) | 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)) |
| 17631 | expo-dev-menu-interface: 57.0.0(expo@57.0.18) | 17090 | expo-dev-menu-interface: 58.0.1(expo@58.0.0) |
| 17632 | expo-manifests: 57.0.1(expo@57.0.18) | 17091 | expo-manifests: 58.0.1(expo@58.0.0) |
| 17633 | expo-updates-interface: 57.0.1(expo@57.0.18) | 17092 | expo-updates-interface: 58.0.1(expo@58.0.0) |
| 17634 | transitivePeerDependencies: | 17093 | transitivePeerDependencies: |
| 17635 | - react-native | 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 | dependencies: | 17097 | dependencies: |
| 17639 | '@expo/schema-utils': 57.0.2 | 17098 | '@expo/schema-utils': 58.0.1 |
| 17640 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 17099 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 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)) | 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)) |
| 17642 | expo-manifests: 57.0.1(expo@57.0.18) | 17101 | expo-manifests: 58.0.1(expo@58.0.0) |
| 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) | 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 | dependencies: | 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 | dependencies: | 17109 | dependencies: |
| 17651 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 17110 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 17652 | expo-dev-menu-interface: 57.0.0(expo@57.0.18) | 17111 | expo-dev-menu-interface: 58.0.1(expo@58.0.0) |
| 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) | 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 | dependencies: | 17115 | dependencies: |
| 17657 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 17116 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 17658 | ua-parser-js: 0.7.41 | 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 | dependencies: | 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 | dependencies: | 17126 | dependencies: |
| 17668 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 17127 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 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) | 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 | dependencies: | 17131 | dependencies: |
| 17673 | expo: 57.0.18(0bf40d5ad6281d8f1e92517b24812edb) | 17132 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 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) | 17133 | react: 19.3.0 |
| 17675 | optional: true | 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 | dependencies: | 17137 | dependencies: |
| 17679 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 17138 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 17680 | fontfaceobserver: 2.3.0 | 17139 | react: 19.3.0 |
| 17681 | react: 19.2.3 | 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) |
| 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) | ||
| 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 | dependencies: | 17143 | dependencies: |
| 17686 | expo: 57.0.18(0bf40d5ad6281d8f1e92517b24812edb) | 17144 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 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) | ||
| 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 | dependencies: | 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 | dependencies: | 17151 | dependencies: |
| 17708 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 17152 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 17709 | expo-image-loader: 57.0.1(expo@57.0.18) | 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 | dependencies: | 17158 | dependencies: |
| 17713 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 17159 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 17714 | expo-image-loader: 57.0.1(expo@57.0.18) | 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 | dependencies: | 17163 | dependencies: |
| 17718 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 17164 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 17719 | react: 19.2.3 | 17165 | react: 19.3.0 |
| 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) | 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 | sf-symbols-typescript: 2.2.0 | 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 | dependencies: | 17172 | dependencies: |
| 17727 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 17173 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 17728 | react: 19.2.3 | 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 | dependencies: | 17177 | dependencies: |
| 17732 | expo: 57.0.18(0bf40d5ad6281d8f1e92517b24812edb) | 17178 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 17733 | react: 19.2.6 | 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) |
| 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)) | ||
| 17739 | invariant: 2.2.4 | 17180 | invariant: 2.2.4 |
| 17740 | react: 19.2.3 | 17181 | react: 19.3.0 |
| 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) | 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 | transitivePeerDependencies: | 17183 | transitivePeerDependencies: |
| 17743 | - expo | ||
| 17744 | - supports-color | 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 | dependencies: | 17188 | dependencies: |
| 17748 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 17189 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 17749 | expo-json-utils: 57.0.1 | 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 | dependencies: | 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 | '@expo/spawn-async': 1.8.0 | 17195 | '@expo/spawn-async': 1.8.0 |
| 17755 | chalk: 4.1.2 | 17196 | chalk: 4.1.2 |
| 17756 | commander: 7.2.0 | 17197 | commander: 7.2.0 |
| ... | @@ -17758,253 +17199,187 @@ snapshots: | ... | @@ -17758,253 +17199,187 @@ snapshots: |
| 17758 | - supports-color | 17199 | - supports-color |
| 17759 | - typescript | 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): | 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): |
| 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): | ||
| 17773 | dependencies: | 17203 | dependencies: |
| 17774 | '@expo/expo-modules-macros-plugin': 0.6.1 | 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)) |
| 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)) | 17205 | expo-modules-macros: 0.14.0 |
| 17776 | invariant: 2.2.4 | 17206 | invariant: 2.2.4 |
| 17777 | react: 19.2.3 | 17207 | react: 19.3.0 |
| 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) | 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 | optionalDependencies: | 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 | dependencies: | 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)): | 17216 | expo-modules-macros@0.14.0: {} |
| 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 | ||
| 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 | dependencies: | 17219 | dependencies: |
| 17793 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 17220 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 17794 | react: 19.2.3 | 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 | dependencies: | 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 | abort-controller: 3.0.0 | 17226 | abort-controller: 3.0.0 |
| 17800 | badgin: 1.2.3 | 17227 | badgin: 1.2.3 |
| 17801 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 17228 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 17802 | expo-application: 57.0.2(expo@57.0.18) | 17229 | expo-application: 58.0.2(expo@58.0.0) |
| 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)) | 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) |
| 17804 | react: 19.2.3 | 17231 | react: 19.3.0 |
| 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) | 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 | transitivePeerDependencies: | 17233 | transitivePeerDependencies: |
| 17807 | - supports-color | 17234 | - supports-color |
| 17808 | - typescript | 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 | dependencies: | 17238 | dependencies: |
| 17812 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 17239 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 17813 | react: 19.2.3 | 17240 | react: 19.3.0 |
| 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) | 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 | dependencies: | 17244 | dependencies: |
| 17818 | '@expo/image-utils': 0.8.14(typescript@7.0.2) | 17245 | '@expo/image-utils': 0.8.14(typescript@7.0.2) |
| 17819 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 17246 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 17820 | schema-utils: 4.3.3 | 17247 | schema-utils: 4.3.3 |
| 17821 | sf-symbols-typescript: 2.2.0 | 17248 | sf-symbols-typescript: 2.2.0 |
| 17822 | transitivePeerDependencies: | 17249 | transitivePeerDependencies: |
| 17823 | - supports-color | 17250 | - supports-color |
| 17824 | - typescript | 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 | dependencies: | 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 | dependencies: | 17260 | dependencies: |
| 17834 | '@expo/config-plugins': 57.0.9(typescript@7.0.2) | 17261 | '@expo/config-plugins': 58.0.4(typescript@7.0.2) |
| 17835 | '@expo/config-types': 57.0.2 | 17262 | '@expo/config-types': 58.0.2 |
| 17836 | '@expo/plist': 0.8.1 | 17263 | '@expo/plist': 0.10.1 |
| 17837 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 17264 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 17838 | react: 19.2.3 | 17265 | react: 19.3.0 |
| 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) | 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 | transitivePeerDependencies: | 17267 | transitivePeerDependencies: |
| 17841 | - supports-color | 17268 | - supports-color |
| 17842 | - typescript | 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 | dependencies: | 17272 | dependencies: |
| 17846 | '@expo/config-plugins': 57.0.9(typescript@7.0.2) | 17273 | '@expo/config-plugins': 58.0.4(typescript@7.0.2) |
| 17847 | '@expo/image-utils': 0.11.5(typescript@7.0.2) | 17274 | '@expo/image-utils': 0.12.2(typescript@7.0.2) |
| 17848 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 17275 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 17849 | xml2js: 0.6.0 | 17276 | xml2js: 0.6.0 |
| 17850 | transitivePeerDependencies: | 17277 | transitivePeerDependencies: |
| 17851 | - supports-color | 17278 | - supports-color |
| 17852 | - typescript | 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 | dependencies: | 17282 | dependencies: |
| 17856 | await-lock: 2.2.2 | 17283 | await-lock: 2.2.2 |
| 17857 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 17284 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 17858 | react: 19.2.3 | 17285 | react: 19.3.0 |
| 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) | 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): | 17288 | expo-structured-headers@58.0.1: {} |
| 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: {} | ||
| 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 | dependencies: | 17291 | dependencies: |
| 17873 | '@expo-google-fonts/material-symbols': 0.4.38 | 17292 | '@expo-google-fonts/material-symbols': 0.4.38 |
| 17874 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 17293 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 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) | 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) |
| 17876 | react: 19.2.3 | 17295 | react: 19.3.0 |
| 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) | 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 | sf-symbols-typescript: 2.2.0 | 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 | dependencies: | 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 | dependencies: | 17304 | dependencies: |
| 17886 | '@expo/code-signing-certificates': 0.0.6 | 17305 | '@expo/code-signing-certificates': 0.0.6 |
| 17887 | '@expo/plist': 0.8.1 | 17306 | '@expo/plist': 0.10.1 |
| 17888 | '@expo/spawn-async': 1.8.0 | 17307 | '@expo/spawn-async': 1.8.0 |
| 17889 | arg: 4.1.3 | 17308 | arg: 4.1.3 |
| 17890 | chalk: 4.1.2 | 17309 | chalk: 4.1.2 |
| 17891 | debug: 4.4.3 | 17310 | debug: 4.4.3 |
| 17892 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 17311 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 17893 | expo-eas-client: 57.0.2 | 17312 | expo-eas-client: 58.0.1 |
| 17894 | expo-manifests: 57.0.1(expo@57.0.18) | 17313 | expo-manifests: 58.0.1(expo@58.0.0) |
| 17895 | expo-structured-headers: 57.0.0 | 17314 | expo-structured-headers: 58.0.1 |
| 17896 | expo-updates-interface: 57.0.1(expo@57.0.18) | 17315 | expo-updates-interface: 58.0.1(expo@58.0.0) |
| 17897 | getenv: 2.0.0 | 17316 | getenv: 2.0.0 |
| 17898 | glob: 13.0.6 | 17317 | glob: 13.0.6 |
| 17899 | ignore: 5.3.2 | 17318 | ignore: 5.3.2 |
| 17900 | nullthrows: 1.1.1 | 17319 | nullthrows: 1.1.1 |
| 17901 | react: 19.2.3 | 17320 | react: 19.3.0 |
| 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) | 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 | resolve-from: 5.0.0 | 17322 | resolve-from: 5.0.0 |
| 17904 | optionalDependencies: | 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 | transitivePeerDependencies: | 17325 | transitivePeerDependencies: |
| 17907 | - supports-color | 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 | dependencies: | 17329 | dependencies: |
| 17911 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 17330 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 17912 | react: 19.2.3 | 17331 | react: 19.3.0 |
| 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) | 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 | dependencies: | 17335 | dependencies: |
| 17917 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 17336 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 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) | 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 | dependencies: | 17340 | dependencies: |
| 17922 | '@expo/plist': 0.8.1 | 17341 | '@expo/plist': 0.10.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) | 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) |
| 17924 | expo: 57.0.18(41fd11498a34454c91128cdad32f22f8) | 17343 | expo: 58.0.0(3abfa3879936d948a635873738556226) |
| 17925 | react: 19.2.3 | 17344 | react: 19.3.0 |
| 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) | 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 | transitivePeerDependencies: | 17346 | transitivePeerDependencies: |
| 17928 | - '@babel/core' | 17347 | - '@babel/core' |
| 17929 | - '@types/react' | ||
| 17930 | - '@types/react-dom' | ||
| 17931 | - react-dom | 17348 | - react-dom |
| 17932 | - react-native-worklets | 17349 | - react-native-worklets |
| 17933 | 17350 | ||
| 17934 | expo@57.0.18(0bf40d5ad6281d8f1e92517b24812edb): | 17351 | expo@58.0.0(3abfa3879936d948a635873738556226): |
| 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): | ||
| 17978 | dependencies: | 17352 | dependencies: |
| 17979 | '@babel/runtime': 7.29.7 | 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) | 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) |
| 17981 | '@expo/config': 57.0.9(typescript@7.0.2) | 17355 | '@expo/config': 58.0.1(typescript@7.0.2) |
| 17982 | '@expo/config-plugins': 57.0.9(typescript@7.0.2) | 17356 | '@expo/config-plugins': 58.0.4(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) | 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) |
| 17984 | '@expo/fingerprint': 0.20.11 | 17358 | '@expo/fingerprint': 0.21.2 |
| 17985 | '@expo/local-build-cache-provider': 57.0.8(typescript@7.0.2) | 17359 | '@expo/local-build-cache-provider': 58.0.1(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) | 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) |
| 17987 | '@expo/metro': 56.0.2(bufferutil@4.1.0)(utf-8-validate@6.0.6) | 17361 | '@expo/log-box-utils': 58.0.1 |
| 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) | 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 | '@ungap/structured-clone': 1.3.1 | 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) | 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) |
| 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) | 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) |
| 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)) | 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) |
| 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)) | 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)) |
| 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) | 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) |
| 17995 | expo-keep-awake: 57.0.2(expo@57.0.18)(react@19.2.3) | 17370 | expo-keep-awake: 58.0.2(expo@58.0.0)(react@19.3.0) |
| 17996 | expo-modules-autolinking: 57.0.12(typescript@7.0.2) | 17371 | expo-modules-autolinking: 58.0.6(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) | 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 | pretty-format: 29.7.0 | 17373 | pretty-format: 29.7.0 |
| 17999 | react: 19.2.3 | 17374 | react: 19.3.0 |
| 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) | 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 | react-refresh: 0.14.2 | 17376 | react-refresh: 0.14.2 |
| 18002 | whatwg-url-minimum: 0.1.2 | 17377 | whatwg-url-minimum: 0.2.0 |
| 18003 | optionalDependencies: | 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) | 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) |
| 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) | 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) |
| 18006 | react-dom: 19.2.3(react@19.2.3) | 17381 | react-dom: 19.3.0(react@19.3.0) |
| 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) | 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 | transitivePeerDependencies: | 17383 | transitivePeerDependencies: |
| 18009 | - '@babel/core' | 17384 | - '@babel/core' |
| 18010 | - bufferutil | 17385 | - bufferutil |
| ... | @@ -18185,12 +17560,22 @@ snapshots: | ... | @@ -18185,12 +17560,22 @@ snapshots: |
| 18185 | 17560 | ||
| 18186 | flow-enums-runtime@0.0.6: {} | 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 | fontace@0.4.1: | 17575 | fontace@0.4.1: |
| 18189 | dependencies: | 17576 | dependencies: |
| 18190 | fontkitten: 1.0.3 | 17577 | fontkitten: 1.0.3 |
| 18191 | 17578 | ||
| 18192 | fontfaceobserver@2.3.0: {} | ||
| 18193 | |||
| 18194 | fontkitten@1.0.3: | 17579 | fontkitten@1.0.3: |
| 18195 | dependencies: | 17580 | dependencies: |
| 18196 | tiny-inflate: 1.0.3 | 17581 | tiny-inflate: 1.0.3 |
| ... | @@ -18279,8 +17664,6 @@ snapshots: | ... | @@ -18279,8 +17664,6 @@ snapshots: |
| 18279 | hasown: 2.0.4 | 17664 | hasown: 2.0.4 |
| 18280 | math-intrinsics: 1.1.0 | 17665 | math-intrinsics: 1.1.0 |
| 18281 | 17666 | ||
| 18282 | get-nonce@1.0.1: {} | ||
| 18283 | |||
| 18284 | get-proto@1.0.1: | 17667 | get-proto@1.0.1: |
| 18285 | dependencies: | 17668 | dependencies: |
| 18286 | dunder-proto: 1.0.1 | 17669 | dunder-proto: 1.0.1 |
| ... | @@ -18487,32 +17870,16 @@ snapshots: | ... | @@ -18487,32 +17870,16 @@ snapshots: |
| 18487 | 17870 | ||
| 18488 | heic-to@1.5.2: {} | 17871 | heic-to@1.5.2: {} |
| 18489 | 17872 | ||
| 18490 | hermes-compiler@250829098.0.17: {} | 17873 | hermes-compiler@260318099.0.4: {} |
| 18491 | |||
| 18492 | hermes-estree@0.35.0: {} | ||
| 18493 | |||
| 18494 | hermes-estree@0.36.0: {} | ||
| 18495 | 17874 | ||
| 18496 | hermes-estree@0.36.1: {} | 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 | hermes-parser@0.36.1: | 17877 | hermes-parser@0.36.1: |
| 18507 | dependencies: | 17878 | dependencies: |
| 18508 | hermes-estree: 0.36.1 | 17879 | hermes-estree: 0.36.1 |
| 18509 | 17880 | ||
| 18510 | hexy@0.2.11: {} | 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 | hono@4.13.7: {} | 17883 | hono@4.13.7: {} |
| 18517 | 17884 | ||
| 18518 | hosted-git-info@4.1.0: | 17885 | hosted-git-info@4.1.0: |
| ... | @@ -18582,10 +17949,6 @@ snapshots: | ... | @@ -18582,10 +17949,6 @@ snapshots: |
| 18582 | 17949 | ||
| 18583 | ignore@7.0.5: {} | 17950 | ignore@7.0.5: {} |
| 18584 | 17951 | ||
| 18585 | image-size@1.2.1: | ||
| 18586 | dependencies: | ||
| 18587 | queue: 6.0.2 | ||
| 18588 | |||
| 18589 | immediate@3.0.6: {} | 17952 | immediate@3.0.6: {} |
| 18590 | 17953 | ||
| 18591 | inflight@1.0.6: | 17954 | inflight@1.0.6: |
| ... | @@ -18865,13 +18228,6 @@ snapshots: | ... | @@ -18865,13 +18228,6 @@ snapshots: |
| 18865 | dependencies: | 18228 | dependencies: |
| 18866 | immediate: 3.0.6 | 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 | lightningcss-android-arm64@1.33.0: | 18231 | lightningcss-android-arm64@1.33.0: |
| 18876 | optional: true | 18232 | optional: true |
| 18877 | 18233 | ||
| ... | @@ -19001,8 +18357,6 @@ snapshots: | ... | @@ -19001,8 +18357,6 @@ snapshots: |
| 19001 | 18357 | ||
| 19002 | markdown-table@3.0.4: {} | 18358 | markdown-table@3.0.4: {} |
| 19003 | 18359 | ||
| 19004 | marky@1.3.0: {} | ||
| 19005 | |||
| 19006 | matcher@3.0.0: | 18360 | matcher@3.0.0: |
| 19007 | dependencies: | 18361 | dependencies: |
| 19008 | escape-string-regexp: 4.0.0 | 18362 | escape-string-regexp: 4.0.0 |
| ... | @@ -19201,109 +18555,50 @@ snapshots: | ... | @@ -19201,109 +18555,50 @@ snapshots: |
| 19201 | 18555 | ||
| 19202 | meshoptimizer@0.22.0: {} | 18556 | meshoptimizer@0.22.0: {} |
| 19203 | 18557 | ||
| 19204 | metro-babel-transformer@0.84.4: | 18558 | metro-babel-transformer@0.87.1: |
| 19205 | dependencies: | 18559 | dependencies: |
| 19206 | '@babel/core': 7.29.7 | 18560 | '@babel/core': 7.29.7 |
| 19207 | flow-enums-runtime: 0.0.6 | 18561 | flow-enums-runtime: 0.0.6 |
| 19208 | hermes-parser: 0.35.0 | 18562 | flow-parser: 0.331.0 |
| 19209 | metro-cache-key: 0.84.4 | 18563 | metro-cache-key: 0.87.1 |
| 19210 | nullthrows: 1.1.1 | 18564 | nullthrows: 1.1.1 |
| 19211 | transitivePeerDependencies: | 18565 | transitivePeerDependencies: |
| 19212 | - supports-color | 18566 | - supports-color |
| 19213 | 18567 | ||
| 19214 | metro-babel-transformer@0.84.5: | 18568 | metro-cache-key@0.87.1: |
| 19215 | dependencies: | 18569 | dependencies: |
| 19216 | '@babel/core': 7.29.7 | ||
| 19217 | flow-enums-runtime: 0.0.6 | 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: | 18572 | metro-cache@0.87.1: |
| 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: | ||
| 19233 | dependencies: | 18573 | dependencies: |
| 19234 | exponential-backoff: 3.1.3 | 18574 | exponential-backoff: 3.1.3 |
| 19235 | flow-enums-runtime: 0.0.6 | 18575 | flow-enums-runtime: 0.0.6 |
| 19236 | https-proxy-agent: 7.0.6 | 18576 | https-proxy-agent: 7.0.6 |
| 19237 | metro-core: 0.84.4 | 18577 | metro-core: 0.87.1 |
| 19238 | transitivePeerDependencies: | 18578 | transitivePeerDependencies: |
| 19239 | - supports-color | 18579 | - supports-color |
| 19240 | 18580 | ||
| 19241 | metro-cache@0.84.5: | 18581 | metro-config@0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6): |
| 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): | ||
| 19251 | dependencies: | 18582 | dependencies: |
| 19252 | connect: 3.7.0 | 18583 | connect: 3.7.0 |
| 19253 | flow-enums-runtime: 0.0.6 | 18584 | flow-enums-runtime: 0.0.6 |
| 19254 | jest-validate: 29.7.0 | 18585 | jest-validate: 29.7.0 |
| 19255 | metro: 0.84.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) | 18586 | metro: 0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) |
| 19256 | metro-cache: 0.84.4 | 18587 | metro-cache: 0.87.1 |
| 19257 | metro-core: 0.84.4 | 18588 | metro-core: 0.87.1 |
| 19258 | metro-runtime: 0.84.4 | 18589 | metro-runtime: 0.87.1 |
| 19259 | yaml: 2.9.0 | ||
| 19260 | transitivePeerDependencies: | 18590 | transitivePeerDependencies: |
| 19261 | - bufferutil | 18591 | - bufferutil |
| 19262 | - supports-color | 18592 | - supports-color |
| 19263 | - utf-8-validate | 18593 | - utf-8-validate |
| 19264 | 18594 | ||
| 19265 | metro-config@0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6): | 18595 | metro-core@0.87.1: |
| 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: | ||
| 19281 | dependencies: | 18596 | dependencies: |
| 19282 | flow-enums-runtime: 0.0.6 | 18597 | flow-enums-runtime: 0.0.6 |
| 19283 | lodash.throttle: 4.1.1 | 18598 | lodash.throttle: 4.1.1 |
| 19284 | metro-resolver: 0.84.4 | 18599 | metro-resolver: 0.87.1 |
| 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 | ||
| 19305 | 18600 | ||
| 19306 | metro-file-map@0.84.5: | 18601 | metro-file-map@0.87.1: |
| 19307 | dependencies: | 18602 | dependencies: |
| 19308 | debug: 4.4.3 | 18603 | debug: 4.4.3 |
| 19309 | fb-watchman: 2.0.2 | 18604 | fb-watchman: 2.0.2 |
| ... | @@ -19313,89 +18608,49 @@ snapshots: | ... | @@ -19313,89 +18608,49 @@ snapshots: |
| 19313 | jest-worker: 29.7.0 | 18608 | jest-worker: 29.7.0 |
| 19314 | micromatch: 4.0.8 | 18609 | micromatch: 4.0.8 |
| 19315 | nullthrows: 1.1.1 | 18610 | nullthrows: 1.1.1 |
| 19316 | walker: 1.0.8 | ||
| 19317 | transitivePeerDependencies: | 18611 | transitivePeerDependencies: |
| 19318 | - supports-color | 18612 | - supports-color |
| 19319 | 18613 | ||
| 19320 | metro-minify-terser@0.84.4: | 18614 | metro-minify-terser@0.87.1: |
| 19321 | dependencies: | 18615 | dependencies: |
| 19322 | flow-enums-runtime: 0.0.6 | 18616 | flow-enums-runtime: 0.0.6 |
| 19323 | terser: 5.48.0 | 18617 | terser: 5.48.0 |
| 19324 | 18618 | ||
| 19325 | metro-minify-terser@0.84.5: | 18619 | metro-resolver@0.87.1: |
| 19326 | dependencies: | 18620 | dependencies: |
| 19327 | flow-enums-runtime: 0.0.6 | 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 | dependencies: | 18624 | dependencies: |
| 19345 | '@babel/runtime': 7.29.7 | 18625 | '@babel/runtime': 7.29.7 |
| 19346 | flow-enums-runtime: 0.0.6 | 18626 | flow-enums-runtime: 0.0.6 |
| 19347 | 18627 | ||
| 19348 | metro-source-map@0.84.4: | 18628 | metro-source-map@0.87.1: |
| 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: | ||
| 19363 | dependencies: | 18629 | dependencies: |
| 19364 | '@babel/traverse': 7.29.7 | 18630 | '@babel/traverse': 7.29.7 |
| 19365 | '@babel/types': 7.29.8 | 18631 | '@babel/types': 7.29.8 |
| 19366 | flow-enums-runtime: 0.0.6 | 18632 | flow-enums-runtime: 0.0.6 |
| 19367 | invariant: 2.2.4 | 18633 | invariant: 2.2.4 |
| 19368 | metro-symbolicate: 0.84.5 | 18634 | metro-symbolicate: 0.87.1 |
| 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 | ||
| 19381 | nullthrows: 1.1.1 | 18635 | nullthrows: 1.1.1 |
| 18636 | ob1: 0.87.1 | ||
| 19382 | source-map: 0.5.7 | 18637 | source-map: 0.5.7 |
| 19383 | vlq: 1.0.1 | 18638 | vlq: 1.0.1 |
| 19384 | transitivePeerDependencies: | 18639 | transitivePeerDependencies: |
| 19385 | - supports-color | 18640 | - supports-color |
| 19386 | 18641 | ||
| 19387 | metro-symbolicate@0.84.5: | 18642 | metro-symbolicate@0.87.1: |
| 19388 | dependencies: | 18643 | dependencies: |
| 19389 | flow-enums-runtime: 0.0.6 | 18644 | flow-enums-runtime: 0.0.6 |
| 19390 | invariant: 2.2.4 | 18645 | invariant: 2.2.4 |
| 19391 | metro-source-map: 0.84.5 | 18646 | metro-source-map: 0.87.1 |
| 19392 | nullthrows: 1.1.1 | 18647 | nullthrows: 1.1.1 |
| 19393 | source-map: 0.5.7 | 18648 | source-map: 0.5.7 |
| 19394 | vlq: 1.0.1 | 18649 | vlq: 1.0.1 |
| 19395 | transitivePeerDependencies: | 18650 | transitivePeerDependencies: |
| 19396 | - supports-color | 18651 | - supports-color |
| 19397 | 18652 | ||
| 19398 | metro-transform-plugins@0.84.4: | 18653 | metro-transform-plugins@0.87.1: |
| 19399 | dependencies: | 18654 | dependencies: |
| 19400 | '@babel/core': 7.29.7 | 18655 | '@babel/core': 7.29.7 |
| 19401 | '@babel/generator': 7.29.7 | 18656 | '@babel/generator': 7.29.7 |
| ... | @@ -19406,104 +18661,27 @@ snapshots: | ... | @@ -19406,104 +18661,27 @@ snapshots: |
| 19406 | transitivePeerDependencies: | 18661 | transitivePeerDependencies: |
| 19407 | - supports-color | 18662 | - supports-color |
| 19408 | 18663 | ||
| 19409 | metro-transform-plugins@0.84.5: | 18664 | metro-transform-worker@0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6): |
| 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): | ||
| 19421 | dependencies: | 18665 | dependencies: |
| 19422 | '@babel/core': 7.29.7 | 18666 | '@babel/core': 7.29.7 |
| 19423 | '@babel/generator': 7.29.7 | 18667 | '@babel/generator': 7.29.7 |
| 19424 | '@babel/parser': 7.29.8 | 18668 | '@babel/parser': 7.29.8 |
| 19425 | '@babel/types': 7.29.8 | 18669 | '@babel/types': 7.29.8 |
| 19426 | flow-enums-runtime: 0.0.6 | 18670 | flow-enums-runtime: 0.0.6 |
| 19427 | metro: 0.84.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) | 18671 | metro: 0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) |
| 19428 | metro-babel-transformer: 0.84.4 | 18672 | metro-babel-transformer: 0.87.1 |
| 19429 | metro-cache: 0.84.4 | 18673 | metro-cache: 0.87.1 |
| 19430 | metro-cache-key: 0.84.4 | 18674 | metro-cache-key: 0.87.1 |
| 19431 | metro-minify-terser: 0.84.4 | 18675 | metro-minify-terser: 0.87.1 |
| 19432 | metro-source-map: 0.84.4 | 18676 | metro-source-map: 0.87.1 |
| 19433 | metro-transform-plugins: 0.84.4 | 18677 | metro-transform-plugins: 0.87.1 |
| 19434 | nullthrows: 1.1.1 | 18678 | nullthrows: 1.1.1 |
| 19435 | transitivePeerDependencies: | 18679 | transitivePeerDependencies: |
| 19436 | - bufferutil | 18680 | - bufferutil |
| 19437 | - supports-color | 18681 | - supports-color |
| 19438 | - utf-8-validate | 18682 | - utf-8-validate |
| 19439 | 18683 | ||
| 19440 | metro-transform-worker@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): |
| 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): | ||
| 19507 | dependencies: | 18685 | dependencies: |
| 19508 | '@babel/code-frame': 7.29.7 | 18686 | '@babel/code-frame': 7.29.7 |
| 19509 | '@babel/core': 7.29.7 | 18687 | '@babel/core': 7.29.7 |
| ... | @@ -19513,29 +18691,28 @@ snapshots: | ... | @@ -19513,29 +18691,28 @@ snapshots: |
| 19513 | '@babel/traverse': 7.29.7 | 18691 | '@babel/traverse': 7.29.7 |
| 19514 | '@babel/types': 7.29.8 | 18692 | '@babel/types': 7.29.8 |
| 19515 | accepts: 2.0.0 | 18693 | accepts: 2.0.0 |
| 19516 | ci-info: 2.0.0 | ||
| 19517 | connect: 3.7.0 | 18694 | connect: 3.7.0 |
| 19518 | debug: 4.4.3 | 18695 | debug: 4.4.3 |
| 19519 | error-stack-parser: 2.1.4 | 18696 | error-stack-parser: 2.1.4 |
| 19520 | flow-enums-runtime: 0.0.6 | 18697 | flow-enums-runtime: 0.0.6 |
| 18698 | flow-parser: 0.331.0 | ||
| 19521 | graceful-fs: 4.2.11 | 18699 | graceful-fs: 4.2.11 |
| 19522 | hermes-parser: 0.35.0 | ||
| 19523 | invariant: 2.2.4 | 18700 | invariant: 2.2.4 |
| 19524 | jest-worker: 29.7.0 | 18701 | jest-worker: 29.7.0 |
| 19525 | jsc-safe-url: 0.2.4 | 18702 | jsc-safe-url: 0.2.4 |
| 19526 | lodash.throttle: 4.1.1 | 18703 | lodash.throttle: 4.1.1 |
| 19527 | metro-babel-transformer: 0.84.5 | 18704 | metro-babel-transformer: 0.87.1 |
| 19528 | metro-cache: 0.84.5 | 18705 | metro-cache: 0.87.1 |
| 19529 | metro-cache-key: 0.84.5 | 18706 | metro-cache-key: 0.87.1 |
| 19530 | metro-config: 0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6) | 18707 | metro-config: 0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) |
| 19531 | metro-core: 0.84.5 | 18708 | metro-core: 0.87.1 |
| 19532 | metro-file-map: 0.84.5 | 18709 | metro-file-map: 0.87.1 |
| 19533 | metro-resolver: 0.84.5 | 18710 | metro-resolver: 0.87.1 |
| 19534 | metro-runtime: 0.84.5 | 18711 | metro-runtime: 0.87.1 |
| 19535 | metro-source-map: 0.84.5 | 18712 | metro-source-map: 0.87.1 |
| 19536 | metro-symbolicate: 0.84.5 | 18713 | metro-symbolicate: 0.87.1 |
| 19537 | metro-transform-plugins: 0.84.5 | 18714 | metro-transform-plugins: 0.87.1 |
| 19538 | metro-transform-worker: 0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6) | 18715 | metro-transform-worker: 0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) |
| 19539 | mime-types: 3.0.2 | 18716 | mime-types: 3.0.2 |
| 19540 | nullthrows: 1.1.1 | 18717 | nullthrows: 1.1.1 |
| 19541 | serialize-error: 2.1.0 | 18718 | serialize-error: 2.1.0 |
| ... | @@ -19812,8 +18989,6 @@ snapshots: | ... | @@ -19812,8 +18989,6 @@ snapshots: |
| 19812 | dependencies: | 18989 | dependencies: |
| 19813 | minimist: 1.2.8 | 18990 | minimist: 1.2.8 |
| 19814 | 18991 | ||
| 19815 | mkdirp@1.0.4: {} | ||
| 19816 | |||
| 19817 | modern-tar@0.8.5: {} | 18992 | modern-tar@0.8.5: {} |
| 19818 | 18993 | ||
| 19819 | mongodb-connection-string-url@3.0.2: | 18994 | mongodb-connection-string-url@3.0.2: |
| ... | @@ -19947,6 +19122,20 @@ snapshots: | ... | @@ -19947,6 +19122,20 @@ snapshots: |
| 19947 | 19122 | ||
| 19948 | normalize-url@6.1.0: {} | 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 | npm-package-arg@11.0.3: | 19139 | npm-package-arg@11.0.3: |
| 19951 | dependencies: | 19140 | dependencies: |
| 19952 | hosted-git-info: 7.0.2 | 19141 | hosted-git-info: 7.0.2 |
| ... | @@ -19991,11 +19180,7 @@ snapshots: | ... | @@ -19991,11 +19180,7 @@ snapshots: |
| 19991 | should: 13.2.3 | 19180 | should: 13.2.3 |
| 19992 | yaml: 2.9.0 | 19181 | yaml: 2.9.0 |
| 19993 | 19182 | ||
| 19994 | ob1@0.84.4: | 19183 | ob1@0.87.1: |
| 19995 | dependencies: | ||
| 19996 | flow-enums-runtime: 0.0.6 | ||
| 19997 | |||
| 19998 | ob1@0.84.5: | ||
| 19999 | dependencies: | 19184 | dependencies: |
| 20000 | flow-enums-runtime: 0.0.6 | 19185 | flow-enums-runtime: 0.0.6 |
| 20001 | 19186 | ||
| ... | @@ -20050,8 +19235,9 @@ snapshots: | ... | @@ -20050,8 +19235,9 @@ snapshots: |
| 20050 | regex: 6.1.0 | 19235 | regex: 6.1.0 |
| 20051 | regex-recursion: 6.0.2 | 19236 | regex-recursion: 6.0.2 |
| 20052 | 19237 | ||
| 20053 | open@7.4.2: | 19238 | open@8.4.2: |
| 20054 | dependencies: | 19239 | dependencies: |
| 19240 | define-lazy-prop: 2.0.0 | ||
| 20055 | is-docker: 2.2.1 | 19241 | is-docker: 2.2.1 |
| 20056 | is-wsl: 2.2.0 | 19242 | is-wsl: 2.2.0 |
| 20057 | 19243 | ||
| ... | @@ -20573,10 +19759,6 @@ snapshots: | ... | @@ -20573,10 +19759,6 @@ snapshots: |
| 20573 | split-on-first: 1.1.0 | 19759 | split-on-first: 1.1.0 |
| 20574 | strict-uri-encode: 2.0.0 | 19760 | strict-uri-encode: 2.0.0 |
| 20575 | 19761 | ||
| 20576 | queue@6.0.2: | ||
| 20577 | dependencies: | ||
| 20578 | inherits: 2.0.4 | ||
| 20579 | |||
| 20580 | quick-lru@5.1.1: {} | 19762 | quick-lru@5.1.1: {} |
| 20581 | 19763 | ||
| 20582 | radix3@1.1.2: {} | 19764 | radix3@1.1.2: {} |
| ... | @@ -20590,13 +19772,13 @@ snapshots: | ... | @@ -20590,13 +19772,13 @@ snapshots: |
| 20590 | iconv-lite: 0.7.2 | 19772 | iconv-lite: 0.7.2 |
| 20591 | unpipe: 1.0.0 | 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 | dependencies: | 19776 | dependencies: |
| 20595 | '@date-fns/tz': 1.5.0 | 19777 | '@date-fns/tz': 1.5.0 |
| 20596 | date-fns: 4.4.0 | 19778 | date-fns: 4.4.0 |
| 20597 | react: 19.2.6 | 19779 | react: 19.2.6 |
| 20598 | optionalDependencies: | 19780 | optionalDependencies: |
| 20599 | '@types/react': 19.2.16 | 19781 | '@types/react': 19.3.0 |
| 20600 | 19782 | ||
| 20601 | react-devtools-core@6.1.5(bufferutil@4.1.0)(utf-8-validate@6.0.6): | 19783 | react-devtools-core@6.1.5(bufferutil@4.1.0)(utf-8-validate@6.0.6): |
| 20602 | dependencies: | 19784 | dependencies: |
| ... | @@ -20606,19 +19788,19 @@ snapshots: | ... | @@ -20606,19 +19788,19 @@ snapshots: |
| 20606 | - bufferutil | 19788 | - bufferutil |
| 20607 | - utf-8-validate | 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 | react-dom@19.2.6(react@19.2.6): | 19791 | react-dom@19.2.6(react@19.2.6): |
| 20615 | dependencies: | 19792 | dependencies: |
| 20616 | react: 19.2.6 | 19793 | react: 19.2.6 |
| 20617 | scheduler: 0.27.0 | 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 | dependencies: | 19802 | dependencies: |
| 20621 | react: 19.2.3 | 19803 | react: 19.3.0 |
| 20622 | 19804 | ||
| 20623 | react-grab@0.1.44(react@19.2.6): | 19805 | react-grab@0.1.44(react@19.2.6): |
| 20624 | dependencies: | 19806 | dependencies: |
| ... | @@ -20627,19 +19809,17 @@ snapshots: | ... | @@ -20627,19 +19809,17 @@ snapshots: |
| 20627 | optionalDependencies: | 19809 | optionalDependencies: |
| 20628 | react: 19.2.6 | 19810 | react: 19.2.6 |
| 20629 | 19811 | ||
| 20630 | react-is@16.13.1: {} | ||
| 20631 | |||
| 20632 | react-is@17.0.2: {} | 19812 | react-is@17.0.2: {} |
| 20633 | 19813 | ||
| 20634 | react-is@18.3.1: {} | 19814 | react-is@18.3.1: {} |
| 20635 | 19815 | ||
| 20636 | react-is@19.2.7: {} | 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 | dependencies: | 19819 | dependencies: |
| 20640 | '@types/hast': 3.0.4 | 19820 | '@types/hast': 3.0.4 |
| 20641 | '@types/mdast': 4.0.4 | 19821 | '@types/mdast': 4.0.4 |
| 20642 | '@types/react': 19.2.16 | 19822 | '@types/react': 19.3.0 |
| 20643 | devlop: 1.1.0 | 19823 | devlop: 1.1.0 |
| 20644 | hast-util-to-jsx-runtime: 2.3.6 | 19824 | hast-util-to-jsx-runtime: 2.3.6 |
| 20645 | html-url-attributes: 3.0.1 | 19825 | html-url-attributes: 3.0.1 |
| ... | @@ -20653,122 +19833,89 @@ snapshots: | ... | @@ -20653,122 +19833,89 @@ snapshots: |
| 20653 | transitivePeerDependencies: | 19833 | transitivePeerDependencies: |
| 20654 | - supports-color | 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 | dependencies: | 19837 | dependencies: |
| 20658 | '@egjs/hammerjs': 2.0.17 | ||
| 20659 | '@types/react-test-renderer': 19.1.0 | 19838 | '@types/react-test-renderer': 19.1.0 |
| 20660 | hoist-non-react-statics: 3.3.2 | ||
| 20661 | invariant: 2.2.4 | 19839 | invariant: 2.2.4 |
| 20662 | react: 19.2.3 | 19840 | react: 19.3.0 |
| 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) | 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 | dependencies: | 19844 | dependencies: |
| 20667 | react: 19.2.3 | 19845 | react: 19.3.0 |
| 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) | 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 | dependencies: | 19849 | dependencies: |
| 20672 | react: 19.2.3 | 19850 | react: 19.3.0 |
| 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) | 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) | 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): |
| 20676 | : dependencies: | 19854 | dependencies: |
| 20677 | react: 19.2.3 | 19855 | react: 19.3.0 |
| 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) | 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) |
| 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) | 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) |
| 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) | 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 | dependencies: | 19861 | dependencies: |
| 20684 | react: 19.2.3 | 19862 | react: 19.3.0 |
| 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) | 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) |
| 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) | 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 | optionalDependencies: | 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 | dependencies: | 19869 | dependencies: |
| 20692 | react: 19.2.3 | 19870 | react: 19.3.0 |
| 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) | 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 | dependencies: | 19874 | dependencies: |
| 20697 | react: 19.2.3 | 19875 | react: 19.3.0 |
| 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) | 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) |
| 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) | 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) |
| 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) | 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 | semver: 7.8.5 | 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 | dependencies: | 19882 | dependencies: |
| 20705 | react: 19.2.3 | 19883 | react: 19.3.0 |
| 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) | 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 | dependencies: | 19887 | dependencies: |
| 20710 | react: 19.2.3 | 19888 | react: 19.3.0 |
| 20711 | react-freeze: 1.0.4(react@19.2.3) | 19889 | react-freeze: 1.0.4(react@19.3.0) |
| 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) | 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 | warn-once: 0.1.1 | 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 | dependencies: | 19894 | dependencies: |
| 20717 | '@shikijs/types': 4.3.0 | 19895 | '@shikijs/types': 4.3.0 |
| 20718 | '@shikijs/vscode-textmate': 10.0.2 | 19896 | '@shikijs/vscode-textmate': 10.0.2 |
| 20719 | react: 19.2.3 | 19897 | react: 19.3.0 |
| 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) | 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 | dependencies: | 19901 | dependencies: |
| 20724 | css-select: 5.2.2 | 19902 | css-select: 5.2.2 |
| 20725 | css-tree: 1.1.3 | 19903 | css-tree: 1.1.3 |
| 20726 | react: 19.2.3 | 19904 | react: 19.3.0 |
| 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) | 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) |
| 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) | ||
| 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 | dependencies: | 19908 | dependencies: |
| 20736 | escape-string-regexp: 4.0.0 | 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) |
| 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) | ||
| 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 | dependencies: | 19912 | dependencies: |
| 20743 | escape-string-regexp: 4.0.0 | 19913 | escape-string-regexp: 4.0.0 |
| 20744 | invariant: 2.2.4 | 19914 | invariant: 2.2.4 |
| 20745 | react: 19.2.6 | 19915 | react: 19.3.0 |
| 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) | 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) |
| 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 | ||
| 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 | dependencies: | 19919 | dependencies: |
| 20773 | '@babel/core': 7.29.7 | 19920 | '@babel/core': 7.29.7 |
| 20774 | '@babel/generator': 7.29.7 | 19921 | '@babel/generator': 7.29.7 |
| ... | @@ -20782,89 +19929,43 @@ snapshots: | ... | @@ -20782,89 +19929,43 @@ snapshots: |
| 20782 | '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7) | 19929 | '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7) |
| 20783 | '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7) | 19930 | '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7) |
| 20784 | '@babel/traverse': 7.29.7 | 19931 | '@babel/traverse': 7.29.7 |
| 20785 | '@babel/types': 7.29.7 | 19932 | '@babel/types': 7.29.8 |
| 20786 | '@react-native/metro-config': 0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6) | 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 | convert-source-map: 2.0.0 | 19935 | convert-source-map: 2.0.0 |
| 20788 | react: 19.2.3 | 19936 | react: 19.3.0 |
| 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) | 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) |
| 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 | ||
| 20823 | semver: 7.8.5 | 19938 | semver: 7.8.5 |
| 20824 | stacktrace-parser: 0.1.11 | ||
| 20825 | tinyglobby: 0.2.17 | ||
| 20826 | whatwg-fetch: 3.6.20 | 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 | transitivePeerDependencies: | 19940 | transitivePeerDependencies: |
| 20832 | - '@babel/core' | ||
| 20833 | - '@react-native-community/cli' | ||
| 20834 | - '@react-native/metro-config' | ||
| 20835 | - bufferutil | ||
| 20836 | - supports-color | 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 | dependencies: | 19944 | dependencies: |
| 20841 | '@react-native/assets-registry': 0.86.3 | 19945 | '@react-native/asset-utils': 0.88.0-rc.3 |
| 20842 | '@react-native/codegen': 0.86.3(@babel/core@7.29.7) | 19946 | '@react-native/codegen': 0.88.0-rc.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) | 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) |
| 20844 | '@react-native/gradle-plugin': 0.86.3 | 19948 | '@react-native/gradle-plugin': 0.88.0-rc.3 |
| 20845 | '@react-native/js-polyfills': 0.86.3 | 19949 | '@react-native/normalize-colors': 0.88.0-rc.3 |
| 20846 | '@react-native/normalize-colors': 0.86.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) |
| 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 | ||
| 20849 | anser: 1.4.10 | 19951 | anser: 1.4.10 |
| 20850 | ansi-regex: 5.0.1 | 19952 | ansi-regex: 5.0.1 |
| 20851 | babel-plugin-syntax-hermes-parser: 0.36.0 | ||
| 20852 | base64-js: 1.5.1 | 19953 | base64-js: 1.5.1 |
| 20853 | commander: 12.1.0 | ||
| 20854 | flow-enums-runtime: 0.0.6 | 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 | invariant: 2.2.4 | 19957 | invariant: 2.2.4 |
| 20857 | memoize-one: 5.2.1 | 19958 | memoize-one: 5.2.1 |
| 20858 | metro-runtime: 0.84.4 | 19959 | metro-runtime: 0.87.1 |
| 20859 | metro-source-map: 0.84.4 | 19960 | metro-source-map: 0.87.1 |
| 20860 | nullthrows: 1.1.1 | 19961 | nullthrows: 1.1.1 |
| 20861 | pretty-format: 29.7.0 | 19962 | pretty-format: 29.7.0 |
| 20862 | promise: 8.3.0 | 19963 | promise: 8.3.0 |
| 20863 | react: 19.2.6 | 19964 | react: 19.3.0 |
| 20864 | react-devtools-core: 6.1.5(bufferutil@4.1.0)(utf-8-validate@6.0.6) | 19965 | react-devtools-core: 6.1.5(bufferutil@4.1.0)(utf-8-validate@6.0.6) |
| 20865 | react-refresh: 0.14.2 | 19966 | react-refresh: 0.14.2 |
| 20866 | regenerator-runtime: 0.13.11 | 19967 | regenerator-runtime: 0.13.11 |
| 20867 | scheduler: 0.27.0 | 19968 | scheduler: 0.28.0 |
| 20868 | semver: 7.8.5 | 19969 | semver: 7.8.5 |
| 20869 | stacktrace-parser: 0.1.11 | 19970 | stacktrace-parser: 0.1.11 |
| 20870 | tinyglobby: 0.2.17 | 19971 | tinyglobby: 0.2.17 |
| ... | @@ -20872,7 +19973,7 @@ snapshots: | ... | @@ -20872,7 +19973,7 @@ snapshots: |
| 20872 | ws: 7.5.11(bufferutil@4.1.0)(utf-8-validate@6.0.6) | 19973 | ws: 7.5.11(bufferutil@4.1.0)(utf-8-validate@6.0.6) |
| 20873 | yargs: 17.7.2 | 19974 | yargs: 17.7.2 |
| 20874 | optionalDependencies: | 19975 | optionalDependencies: |
| 20875 | '@types/react': 19.2.16 | 19976 | '@types/react': 19.3.0 |
| 20876 | transitivePeerDependencies: | 19977 | transitivePeerDependencies: |
| 20877 | - '@babel/core' | 19978 | - '@babel/core' |
| 20878 | - '@react-native-community/cli' | 19979 | - '@react-native-community/cli' |
| ... | @@ -20880,47 +19981,19 @@ snapshots: | ... | @@ -20880,47 +19981,19 @@ snapshots: |
| 20880 | - bufferutil | 19981 | - bufferutil |
| 20881 | - supports-color | 19982 | - supports-color |
| 20882 | - utf-8-validate | 19983 | - utf-8-validate |
| 20883 | optional: true | ||
| 20884 | 19984 | ||
| 20885 | react-refresh@0.14.2: {} | 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 | react-test-renderer@19.2.6(react@19.2.6): | 19987 | react-test-renderer@19.2.6(react@19.2.6): |
| 20915 | dependencies: | 19988 | dependencies: |
| 20916 | react: 19.2.6 | 19989 | react: 19.2.6 |
| 20917 | react-is: 19.2.7 | 19990 | react-is: 19.2.7 |
| 20918 | scheduler: 0.27.0 | 19991 | scheduler: 0.27.0 |
| 20919 | 19992 | ||
| 20920 | react@19.2.3: {} | ||
| 20921 | |||
| 20922 | react@19.2.6: {} | 19993 | react@19.2.6: {} |
| 20923 | 19994 | ||
| 19995 | react@19.3.0: {} | ||
| 19996 | |||
| 20924 | read-binary-file-arch@1.0.6: | 19997 | read-binary-file-arch@1.0.6: |
| 20925 | dependencies: | 19998 | dependencies: |
| 20926 | debug: 4.4.3 | 19999 | debug: 4.4.3 |
| ... | @@ -21206,6 +20279,8 @@ snapshots: | ... | @@ -21206,6 +20279,8 @@ snapshots: |
| 21206 | 20279 | ||
| 21207 | scheduler@0.27.0: {} | 20280 | scheduler@0.27.0: {} |
| 21208 | 20281 | ||
| 20282 | scheduler@0.28.0: {} | ||
| 20283 | |||
| 21209 | schema-utils@4.3.3: | 20284 | schema-utils@4.3.3: |
| 21210 | dependencies: | 20285 | dependencies: |
| 21211 | '@types/json-schema': 7.0.15 | 20286 | '@types/json-schema': 7.0.15 |
| ... | @@ -21874,20 +20949,20 @@ snapshots: | ... | @@ -21874,20 +20949,20 @@ snapshots: |
| 21874 | 20949 | ||
| 21875 | universalify@2.0.1: {} | 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 | dependencies: | 20953 | dependencies: |
| 21879 | '@tailwindcss/node': 4.3.3 | 20954 | '@tailwindcss/node': 4.3.3 |
| 21880 | '@tailwindcss/oxide': 4.3.3 | 20955 | '@tailwindcss/oxide': 4.3.3 |
| 21881 | culori: 4.0.2 | 20956 | culori: 4.0.2 |
| 21882 | lightningcss: 1.33.0 | 20957 | lightningcss: 1.33.0 |
| 21883 | metro: 0.84.5(bufferutil@4.1.0)(utf-8-validate@6.0.6) | 20958 | metro: 0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) |
| 21884 | metro-cache: 0.84.5 | 20959 | metro-cache: 0.87.1 |
| 21885 | react: 19.2.3 | 20960 | react: 19.3.0 |
| 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) | 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 | tailwindcss: 4.3.3 | 20962 | tailwindcss: 4.3.3 |
| 21888 | optionalDependencies: | 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) | 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) |
| 21890 | metro-transform-worker: 0.84.5(bufferutil@4.1.0)(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 | unpipe@1.0.0: {} | 20967 | unpipe@1.0.0: {} |
| 21893 | 20968 | ||
| ... | @@ -21939,33 +21014,18 @@ snapshots: | ... | @@ -21939,33 +21014,18 @@ snapshots: |
| 21939 | punycode: 2.3.1 | 21014 | punycode: 2.3.1 |
| 21940 | optional: true | 21015 | optional: true |
| 21941 | 21016 | ||
| 21942 | use-callback-ref@1.3.3(@types/react@19.2.16)(react@19.2.3): | 21017 | use-latest-callback@0.2.6(react@19.3.0): |
| 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): | ||
| 21950 | dependencies: | 21018 | dependencies: |
| 21951 | react: 19.2.3 | 21019 | react: 19.3.0 |
| 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 | ||
| 21964 | 21020 | ||
| 21965 | use-sync-external-store@1.6.0(react@19.2.6): | 21021 | use-sync-external-store@1.6.0(react@19.2.6): |
| 21966 | dependencies: | 21022 | dependencies: |
| 21967 | react: 19.2.6 | 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 | utf-8-validate@6.0.6: | 21029 | utf-8-validate@6.0.6: |
| 21970 | dependencies: | 21030 | dependencies: |
| 21971 | node-gyp-build: 4.8.4 | 21031 | node-gyp-build: 4.8.4 |
| ... | @@ -21988,15 +21048,6 @@ snapshots: | ... | @@ -21988,15 +21048,6 @@ snapshots: |
| 21988 | 21048 | ||
| 21989 | vary@1.1.2: {} | 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 | vfile-location@5.0.3: | 21051 | vfile-location@5.0.3: |
| 22001 | dependencies: | 21052 | dependencies: |
| 22002 | '@types/unist': 3.0.3 | 21053 | '@types/unist': 3.0.3 |
| ... | @@ -22235,7 +21286,7 @@ snapshots: | ... | @@ -22235,7 +21286,7 @@ snapshots: |
| 22235 | 21286 | ||
| 22236 | whatwg-mimetype@5.0.0: {} | 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 | whatwg-url@14.2.0: | 21291 | whatwg-url@14.2.0: |
| 22241 | dependencies: | 21292 | dependencies: |
| ... | @@ -22461,9 +21512,9 @@ snapshots: | ... | @@ -22461,9 +21512,9 @@ snapshots: |
| 22461 | 21512 | ||
| 22462 | zod@4.6.5: {} | 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 | optionalDependencies: | 21516 | optionalDependencies: |
| 22466 | '@types/react': 19.2.16 | 21517 | '@types/react': 19.3.0 |
| 22467 | react: 19.2.6 | 21518 | react: 19.2.6 |
| 22468 | use-sync-external-store: 1.6.0(react@19.2.6) | 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,6 +54,9 @@ catalog: |
| 54 | yaml: ^2.9.0 | 54 | yaml: ^2.9.0 |
| 55 | 55 | ||
| 56 | minimumReleaseAgeExclude: | 56 | minimumReleaseAgeExclude: |
| 57 | - expo-glass-effect@58.0.3 | ||
| 58 | - expo-blur@58.0.2 | ||
| 59 | - expo-audio@58.0.3 | ||
| 57 | - "@clerk/backend@3.18.1" | 60 | - "@clerk/backend@3.18.1" |
| 58 | - "@clerk/clerk-js@6.32.1" | 61 | - "@clerk/clerk-js@6.32.1" |
| 59 | - "@clerk/electron@0.0.44" | 62 | - "@clerk/electron@0.0.44" |
| ... | @@ -75,15 +78,40 @@ minimumReleaseAgeExclude: | ... | @@ -75,15 +78,40 @@ minimumReleaseAgeExclude: |
| 75 | - alchemy@2.0.0-beta.79 | 78 | - alchemy@2.0.0-beta.79 |
| 76 | - effect@4.0.0-rc.115 | 79 | - effect@4.0.0-rc.115 |
| 77 | - "@legendapp/list@3.3.5" | 80 | - "@legendapp/list@3.3.5" |
| 78 | - "@expo/cli@57.0.20" | 81 | - "@expo/cli@58.0.9" |
| 79 | - "@expo/env@2.4.3" | 82 | - "@expo/env@2.5.1" |
| 80 | - "@expo/fingerprint@0.20.11" | 83 | - "@expo/fingerprint@0.21.2" |
| 81 | - "@expo/metro-config@57.0.12" | 84 | - "@expo/metro-config@58.0.6" |
| 82 | - expo-constants@57.0.16 | 85 | - expo-constants@58.0.9 |
| 83 | - expo-font@57.0.2 | 86 | - expo-font@58.0.4 |
| 84 | - expo-updates@57.0.19 | 87 | - expo-updates@58.0.11 |
| 85 | - expo@57.0.18 | 88 | - expo@58.0.0 |
| 86 | - expo-widgets@57.0.15 | 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 | - electron@44.4.2 | 115 | - electron@44.4.2 |
| 88 | - "@anthropic-ai/claude-agent-sdk@0.3.276" | 116 | - "@anthropic-ai/claude-agent-sdk@0.3.276" |
| 89 | - "@alchemy.run/cloudflare-runtime@2.0.0-beta.79" | 117 | - "@alchemy.run/cloudflare-runtime@2.0.0-beta.79" |
| ... | @@ -96,6 +124,29 @@ minimumReleaseAgeExclude: | ... | @@ -96,6 +124,29 @@ minimumReleaseAgeExclude: |
| 96 | - "@distilled.cloud/stripe@1.0.0-rc.12" | 124 | - "@distilled.cloud/stripe@1.0.0-rc.12" |
| 97 | - "@shadcn/lint@0.1.5" | 125 | - "@shadcn/lint@0.1.5" |
| 98 | - cn@0.3.2 | 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 | overrides: | 151 | overrides: |
| 101 | # Keep jsdom's optional peer consistent so Vite+ has one test-runner instance. | 152 | # Keep jsdom's optional peer consistent so Vite+ has one test-runner instance. |
| ... | @@ -143,11 +194,12 @@ overrides: | ... | @@ -143,11 +194,12 @@ overrides: |
| 143 | "@effect/sql-pg": "catalog:" | 194 | "@effect/sql-pg": "catalog:" |
| 144 | "@effect/vitest": "catalog:" | 195 | "@effect/vitest": "catalog:" |
| 145 | "@effect/vitest>vitest": "-" | 196 | "@effect/vitest>vitest": "-" |
| 146 | "@expo/dom-webview": 57.0.1 | 197 | "@expo/dom-webview": 58.0.2 |
| 147 | "@expo/metro-config": 57.0.12 | 198 | "@expo/metro-config": 58.0.6 |
| 148 | expo-constants: 57.0.16 | 199 | expo-constants: 58.0.9 |
| 149 | # Keep fresh resolution on the version carrying the permissions registry fix. | 200 | expo-router: 58.0.10 |
| 150 | expo-modules-core: 57.0.14 | 201 | "expo-sharing>@expo/config-plugins": 58.0.4 |
| 202 | "expo-sharing>@expo/config-types": 58.0.2 | ||
| 151 | "@pierre/diffs>@shikijs/transformers": ^4.2.0 | 203 | "@pierre/diffs>@shikijs/transformers": ^4.2.0 |
| 152 | # Keep one copy of these native-binary packages. lightningcss ships 11 platform binaries per | 204 | # Keep one copy of these native-binary packages. lightningcss ships 11 platform binaries per |
| 153 | # version, and the workspaces' tailwindcss ^4 ranges drift into two 4.3.x copies of the family. | 205 | # version, and the workspaces' tailwindcss ^4 ranges drift into two 4.3.x copies of the family. |
| ... | @@ -156,9 +208,6 @@ overrides: | ... | @@ -156,9 +208,6 @@ overrides: |
| 156 | "@tailwindcss/vite": "catalog:" | 208 | "@tailwindcss/vite": "catalog:" |
| 157 | "@types/node": "catalog:" | 209 | "@types/node": "catalog:" |
| 158 | effect: "catalog:" | 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 | node-abi: 4.33.0 | 211 | node-abi: 4.33.0 |
| 163 | lightningcss: "catalog:" | 212 | lightningcss: "catalog:" |
| 164 | tailwindcss: "catalog:" | 213 | tailwindcss: "catalog:" |
| ... | @@ -168,7 +217,7 @@ overrides: | ... | @@ -168,7 +217,7 @@ overrides: |
| 168 | packageExtensions: | 217 | packageExtensions: |
| 169 | "@clerk/expo@*": | 218 | "@clerk/expo@*": |
| 170 | dependencies: | 219 | dependencies: |
| 171 | "@expo/config-plugins": 57.0.9 | 220 | "@expo/config-plugins": 58.0.4 |
| 172 | "@effect/vitest@*": | 221 | "@effect/vitest@*": |
| 173 | dependencies: | 222 | dependencies: |
| 174 | vite-plus: "catalog:" | 223 | vite-plus: "catalog:" |
| ... | @@ -181,9 +230,14 @@ packageExtensions: | ... | @@ -181,9 +230,14 @@ packageExtensions: |
| 181 | 230 | ||
| 182 | patchedDependencies: | 231 | patchedDependencies: |
| 183 | alchemy@2.0.0-beta.79: patches/alchemy@2.0.0-beta.79.patch | 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 | "@clerk/expo@4.6.8": patches/@clerk__expo@4.6.8.patch | 236 | "@clerk/expo@4.6.8": patches/@clerk__expo@4.6.8.patch |
| 185 | "@effect/vitest@4.0.0-rc.115": patches/@effect__vitest@4.0.0-rc.115.patch | 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 | "@ff-labs/fff-node@0.9.4": patches/@ff-labs__fff-node@0.9.4.patch | 241 | "@ff-labs/fff-node@0.9.4": patches/@ff-labs__fff-node@0.9.4.patch |
| 188 | "@legendapp/list@3.3.5": patches/@legendapp__list@3.3.5.patch | 242 | "@legendapp/list@3.3.5": patches/@legendapp__list@3.3.5.patch |
| 189 | "@pierre/diffs@1.3.0-beta.10": patches/@pierre%2Fdiffs@1.3.0-beta.10.patch | 243 | "@pierre/diffs@1.3.0-beta.10": patches/@pierre%2Fdiffs@1.3.0-beta.10.patch |
| ... | @@ -192,20 +246,13 @@ patchedDependencies: | ... | @@ -192,20 +246,13 @@ patchedDependencies: |
| 192 | "@react-navigation/native-stack@7.17.6": patches/@react-navigation%2Fnative-stack@7.17.6.patch | 246 | "@react-navigation/native-stack@7.17.6": patches/@react-navigation%2Fnative-stack@7.17.6.patch |
| 193 | dbus-next@0.10.2: patches/dbus-next@0.10.2.patch | 247 | dbus-next@0.10.2: patches/dbus-next@0.10.2.patch |
| 194 | effect@4.0.0-rc.115: patches/effect@4.0.0-rc.115.patch | 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 | node-pty@1.2.0-beta.15: patches/node-pty@1.2.0-beta.15.patch | 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 | # Link http(s) URLs with a port or a single-label host. md4c otherwise requires a dotted host and stops at ':'. | 250 | # Link http(s) URLs with a port or a single-label host. md4c otherwise requires a dotted host and stops at ':'. |
| 205 | react-native-nitro-markdown@0.5.8: patches/react-native-nitro-markdown@0.5.8.patch | 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). | 252 | react-native-gesture-handler@3.2.1: patches/react-native-gesture-handler@3.2.1.patch |
| 207 | react-native-reanimated@4.5.5: patches/react-native-reanimated@4.5.5.patch | 253 | react-native-keyboard-controller@1.22.4: patches/react-native-keyboard-controller@1.22.4.patch |
| 208 | react-native-screens@4.26.2: patches/react-native-screens@4.26.2.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 | uniwind@1.11.0: patches/uniwind@1.11.0.patch | 256 | uniwind@1.11.0: patches/uniwind@1.11.0.patch |
| 210 | 257 | ||
| 211 | peerDependencyRules: | 258 | peerDependencyRules: |
third-party-licenses.config.json+81| ... | @@ -473,6 +473,87 @@ | ... | @@ -473,6 +473,87 @@ |
| 473 | "licenseId": "MIT", | 473 | "licenseId": "MIT", |
| 474 | "copyrights": ["Copyright (c) 2025 opencode"] | 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 | } |