feat(rn): setting page scroll magic

Signed-off-by: Innei <tukon479@gmail.com>
This commit is contained in:
Innei 2025-01-15 21:44:21 +08:00
parent 5958ec18d8
commit 0b096166d5
No known key found for this signature in database
GPG Key ID: 0F62D33977F021F7
12 changed files with 718 additions and 89 deletions

View File

@ -70,6 +70,7 @@
"react-native": "0.76.5",
"react-native-context-menu-view": "1.16.0",
"react-native-gesture-handler": "~2.20.2",
"react-native-image-colors": "2.4.0",
"react-native-ios-context-menu": "3.1.0",
"react-native-ios-utilities": "5.1.0",
"react-native-keyboard-controller": "^1.15.0",

View File

@ -5,6 +5,6 @@ interface TabBarBackgroundContextType {
opacity: SharedValue<number>
}
export const TabBarBackgroundContext = createContext<TabBarBackgroundContextType>({
export const BottomTabBarBackgroundContext = createContext<TabBarBackgroundContextType>({
opacity: null!,
})

View File

@ -0,0 +1,6 @@
import type { Dispatch, SetStateAction } from "react"
import { createContext } from "react"
export const SetBottomTabBarVisibleContext = createContext<Dispatch<SetStateAction<boolean>>>(
() => {},
)

View File

@ -22,7 +22,7 @@ export function useFeedDrawer() {
// is drawer swipe disabled
const isDrawerSwipeDisabledAtom = atom<boolean>(false)
const isDrawerSwipeDisabledAtom = atom<boolean>(true)
export function useIsDrawerSwipeDisabled() {
return useAtomValue(isDrawerSwipeDisabledAtom)

View File

@ -1,15 +1,25 @@
import { useIsFocused } from "@react-navigation/native"
import { useContext, useEffect } from "react"
import { View } from "react-native"
import {
GroupedInsetListCard,
GroupedInsetListNavigationLink,
} from "@/src/components/ui/grouped/GroupedList"
import { SetBottomTabBarVisibleContext } from "@/src/contexts/BottomTabBarVisibleContext"
import { useSettingsNavigation } from "./hooks"
export const SettingsList = () => {
const navigation = useSettingsNavigation()
const setTabBarVisible = useContext(SetBottomTabBarVisibleContext)
const isVisible = useIsFocused()
useEffect(() => {
if (isVisible) {
setTabBarVisible(true)
}
}, [isVisible, setTabBarVisible])
return (
<View className="bg-system-grouped-background flex-1 py-4">
<GroupedInsetListCard>

View File

@ -1,15 +1,99 @@
import { Image, Text, View } from "react-native"
import { cn, getLuminance } from "@follow/utils"
import { LinearGradient } from "expo-linear-gradient"
import { useEffect, useState } from "react"
import { Animated, Image, StyleSheet, Text, View } from "react-native"
import ImageColors from "react-native-image-colors"
import { useSafeAreaInsets } from "react-native-safe-area-context"
import { useWhoami } from "@/src/store/user/hooks"
import { accentColor } from "@/src/theme/colors"
export const UserHeaderBanner = () => {
const defaultGradientColors = ["#FF5C00", "#FF8533", "#FFA666"]
export const UserHeaderBanner = ({ scrollY }: { scrollY: Animated.Value }) => {
const whoami = useWhoami()
const insets = useSafeAreaInsets()
const BANNER_HEIGHT = 200
const MAX_PULL = 100
const SCALE_FACTOR = 1.8
const TRANSLATE_Y = -(BANNER_HEIGHT * (SCALE_FACTOR - 1)) / 2
const [gradientColors, setGradientColors] = useState<string[]>(defaultGradientColors)
const [gradientLight, setGradientLight] = useState<boolean>(false)
useEffect(() => {
const extractColors = async () => {
if (!whoami?.image) return
try {
const result = await ImageColors.getColors(whoami.image, {
fallback: accentColor,
cache: true,
})
if (result.platform === "web") return
if (result.platform === "android") {
setGradientColors([
result.dominant,
result.average || result.vibrant,
result.vibrant || result.dominant,
])
const dominantLuminance = getLuminance(result.dominant)
const isLight = dominantLuminance > 0.5
setGradientLight(isLight)
} else {
const dominantLuminance = getLuminance(result.primary)
const isLight = dominantLuminance > 0.5
setGradientLight(isLight)
setGradientColors([result.primary, result.secondary, result.background])
}
} catch (error) {
console.warn("Failed to extract colors:", error)
}
}
extractColors()
}, [whoami?.image])
if (!whoami) return null
return (
<View className="h-[200px] items-center justify-center" style={{ marginTop: -insets.top }}>
<View
className="relative h-[200px] items-center justify-center"
style={{ marginTop: -insets.top }}
>
<Animated.View
className="absolute inset-0"
style={{
transform: [
{
translateY: scrollY.interpolate({
inputRange: [-MAX_PULL, 0],
outputRange: [TRANSLATE_Y, 0],
extrapolateLeft: "extend",
extrapolateRight: "clamp",
}),
},
{
scale: scrollY.interpolate({
inputRange: [-MAX_PULL, 0],
outputRange: [SCALE_FACTOR, 1],
extrapolateLeft: "extend",
extrapolateRight: "clamp",
}),
},
],
}}
>
<LinearGradient
colors={gradientColors as [string, string, ...string[]]}
start={{ x: 0, y: 0 }}
end={{ x: 1, y: 1 }}
style={StyleSheet.absoluteFillObject}
/>
</Animated.View>
<View
className="bg-system-background overflow-hidden rounded-full"
style={{ marginTop: insets.top }}
@ -20,8 +104,14 @@ export const UserHeaderBanner = () => {
</View>
<View className="mt-2">
<Text className="text-2xl font-bold">{whoami.name}</Text>
{!!whoami.handle && <Text className="text-secondary-label">@{whoami.handle}</Text>}
<Text className={cn("text-2xl font-bold", gradientLight ? "text-black" : "text-white/95")}>
{whoami.name}
</Text>
{!!whoami.handle && (
<Text className={cn(gradientLight ? "text-black/70" : "text-white/70")}>
@{whoami.handle}
</Text>
)}
</View>
</View>
)

View File

@ -1,10 +1,24 @@
import { useNavigation } from "@react-navigation/native"
import type { NativeStackNavigationProp } from "@react-navigation/native-stack"
import { useContext } from "react"
import { SetBottomTabBarVisibleContext } from "@/src/contexts/BottomTabBarVisibleContext"
type RootStackParamList = {
Account: undefined
}
export const useSettingsNavigation = () => {
return useNavigation<NativeStackNavigationProp<RootStackParamList>>()
const setTabBarVisible = useContext(SetBottomTabBarVisibleContext)
const hookValue = useNavigation<NativeStackNavigationProp<RootStackParamList>>()
return {
...hookValue,
navigate: (
name: keyof RootStackParamList,
params?: RootStackParamList[keyof RootStackParamList],
) => {
setTabBarVisible(false)
hookValue.navigate(name, params)
},
}
}

View File

@ -1,14 +1,15 @@
import { FeedViewType } from "@follow/constants"
import { PlatformPressable } from "@react-navigation/elements/src/PlatformPressable"
import { router, Tabs } from "expo-router"
import { useContext, useMemo } from "react"
import { Easing, StyleSheet, View } from "react-native"
import { useContext, useEffect, useMemo, useState } from "react"
import { Animated as RNAnimated, Easing, StyleSheet, useAnimatedValue, View } from "react-native"
import { Gesture, GestureDetector } from "react-native-gesture-handler"
import Animated, { runOnJS, useAnimatedStyle, useSharedValue } from "react-native-reanimated"
import { ThemedBlurView } from "@/src/components/common/ThemedBlurView"
import { FollowIcon } from "@/src/components/ui/logo"
import { TabBarBackgroundContext } from "@/src/contexts/TabBarBackgroundContext"
import { BottomTabBarBackgroundContext } from "@/src/contexts/BottomTabBarBackgroundContext"
import { SetBottomTabBarVisibleContext } from "@/src/contexts/BottomTabBarVisibleContext"
import { SafariCuteFi } from "@/src/icons/safari_cute_fi"
import { SafariCuteIcon } from "@/src/icons/safari_cute-re"
import { Setting7CuteFi } from "@/src/icons/setting_7_cute_fi"
@ -31,94 +32,114 @@ const fifthTap = Gesture.Tap()
export default function TabLayout() {
const opacity = useSharedValue(1)
const animatedTransformY = useAnimatedValue(1)
const [tabBarVisible, setTabBarVisible] = useState(true)
useEffect(() => {
RNAnimated.spring(animatedTransformY, {
toValue: tabBarVisible ? 1 : 0,
useNativeDriver: true,
}).start()
}, [animatedTransformY, tabBarVisible])
return (
<FeedDrawer>
<TabBarBackgroundContext.Provider value={useMemo(() => ({ opacity }), [opacity])}>
<Tabs
screenListeners={{
tabPress: () => {
opacity.value = 1
},
transitionStart: () => {
opacity.value = 1
},
}}
screenOptions={{
tabBarBackground: TabBarBackground,
tabBarStyle: {
position: "absolute",
borderTopWidth: 0,
},
animation: "fade",
transitionSpec: {
animation: "timing",
config: {
duration: 50,
easing: Easing.ease,
<BottomTabBarBackgroundContext.Provider value={useMemo(() => ({ opacity }), [opacity])}>
<SetBottomTabBarVisibleContext.Provider value={setTabBarVisible}>
<Tabs
screenListeners={{
tabPress: () => {
opacity.value = 1
},
},
}}
>
<Tabs.Screen
name="subscription"
options={{
title: "Subscriptions",
headerShown: false,
tabBarIcon: ({ color }) => (
<FollowIcon color={color} style={{ width: 20, height: 20 }} />
),
tabBarButton(props) {
return (
<GestureDetector gesture={doubleTap}>
<View className="flex-1">
<PlatformPressable {...props} />
</View>
</GestureDetector>
)
transitionStart: () => {
opacity.value = 1
},
}}
/>
<Tabs.Screen
name="discover"
options={{
title: "Discover",
headerShown: false,
tabBarIcon: ({ color, focused }) => {
const Icon = !focused ? SafariCuteIcon : SafariCuteFi
return <Icon color={color} width={24} height={24} />
screenOptions={{
tabBarBackground: TabBarBackground,
tabBarStyle: {
position: "absolute",
borderTopWidth: 0,
transform: [
{
translateY: animatedTransformY.interpolate({
inputRange: [0, 1],
outputRange: [100, 0],
}),
},
],
},
animation: "fade",
transitionSpec: {
animation: "timing",
config: {
duration: 50,
easing: Easing.ease,
},
},
}}
/>
>
<Tabs.Screen
name="subscription"
options={{
title: "Subscriptions",
headerShown: false,
tabBarIcon: ({ color }) => (
<FollowIcon color={color} style={{ width: 20, height: 20 }} />
),
tabBarButton(props) {
return (
<GestureDetector gesture={doubleTap}>
<View className="flex-1">
<PlatformPressable {...props} />
</View>
</GestureDetector>
)
},
}}
/>
<Tabs.Screen
name="discover"
options={{
title: "Discover",
headerShown: false,
tabBarIcon: ({ color, focused }) => {
const Icon = !focused ? SafariCuteIcon : SafariCuteFi
return <Icon color={color} width={24} height={24} />
},
}}
/>
<Tabs.Screen
name="settings"
options={{
title: "Settings",
headerShown: false,
tabBarButton(props) {
return (
<GestureDetector gesture={fifthTap}>
<View className="flex-1">
<PlatformPressable {...props} />
</View>
</GestureDetector>
)
},
tabBarIcon: ({ color, focused }) => {
const Icon = !focused ? Settings7CuteReIcon : Setting7CuteFi
return <Icon color={color} width={24} height={24} />
},
}}
/>
</Tabs>
</TabBarBackgroundContext.Provider>
<Tabs.Screen
name="settings"
options={{
title: "Settings",
headerShown: false,
tabBarButton(props) {
return (
<GestureDetector gesture={fifthTap}>
<View className="flex-1">
<PlatformPressable {...props} />
</View>
</GestureDetector>
)
},
tabBarIcon: ({ color, focused }) => {
const Icon = !focused ? Settings7CuteReIcon : Setting7CuteFi
return <Icon color={color} width={24} height={24} />
},
}}
/>
</Tabs>
</SetBottomTabBarVisibleContext.Provider>
</BottomTabBarBackgroundContext.Provider>
</FeedDrawer>
)
}
const AnimatedThemedBlurView = Animated.createAnimatedComponent(ThemedBlurView)
const TabBarBackground = () => {
const { opacity } = useContext(TabBarBackgroundContext)
const { opacity } = useContext(BottomTabBarBackgroundContext)
const animatedStyle = useAnimatedStyle(() => ({
opacity: opacity.value,

View File

@ -8,7 +8,7 @@ import { withTiming } from "react-native-reanimated"
import { useSafeAreaInsets } from "react-native-safe-area-context"
import { useEventCallback } from "usehooks-ts"
import { TabBarBackgroundContext } from "@/src/contexts/TabBarBackgroundContext"
import { BottomTabBarBackgroundContext } from "@/src/contexts/BottomTabBarBackgroundContext"
import { SettingRoutes } from "@/src/modules/settings/routes"
import { SettingsList } from "@/src/modules/settings/SettingsList"
import { UserHeaderBanner } from "@/src/modules/settings/UserHeaderBanner"
@ -31,7 +31,7 @@ export default function SettingsX() {
function Settings() {
const insets = useSafeAreaInsets()
const isFocused = useContext(OutIsFocused)
const { opacity } = useContext(TabBarBackgroundContext)
const { opacity } = useContext(BottomTabBarBackgroundContext)
const tabBarHeight = useBottomTabBarHeight()
const calculateOpacity = useCallback(
@ -82,7 +82,7 @@ function Settings() {
contentContainerStyle={{ paddingBottom: insets.bottom + tabBarHeight }}
scrollIndicatorInsets={{ bottom: tabBarHeight - insets.bottom }}
>
<UserHeaderBanner />
<UserHeaderBanner scrollY={animatedScrollY} />
<SettingsList />
</ScrollView>

View File

@ -1,10 +1,11 @@
import { Link, Stack } from "expo-router"
import { useEffect } from "react"
import { Text, TouchableOpacity, View } from "react-native"
import { useSafeAreaInsets } from "react-native-safe-area-context"
import { views } from "@/src/constants/views"
import { AddCuteReIcon } from "@/src/icons/add_cute_re"
import { useFeedDrawer } from "@/src/modules/feed-drawer/atoms"
import { useFeedDrawer, useSetDrawerSwipeDisabled } from "@/src/modules/feed-drawer/atoms"
import { useCurrentView } from "@/src/modules/subscription/atoms"
import { SortActionButton } from "@/src/modules/subscription/header-actions"
import { SubscriptionLists } from "@/src/modules/subscription/SubscriptionLists"
@ -16,6 +17,14 @@ import { ViewTab } from "../../../modules/subscription/ViewTab"
export default function FeedList() {
const currentView = useCurrentView()
usePrefetchUnread()
const setDrawerSwipeDisabled = useSetDrawerSwipeDisabled()
useEffect(() => {
setDrawerSwipeDisabled(false)
return () => {
setDrawerSwipeDisabled(true)
}
}, [setDrawerSwipeDisabled])
return (
<>
<Stack.Screen

View File

@ -165,3 +165,11 @@ export const rgbStringToRgb = (hex: string) => {
const [r, g, b, a] = hex.split(" ").map((s) => Number.parseFloat(s))
return `rgba(${r}, ${g}, ${b}, ${a || 1})`
}
export const getLuminance = (hexColor: string) => {
const rgb = Number.parseInt(hexColor.replace("#", ""), 16)
const r = (rgb >> 16) & 0xff
const g = (rgb >> 8) & 0xff
const b = (rgb >> 0) & 0xff
return (0.299 * r + 0.587 * g + 0.114 * b) / 255
}

View File

@ -565,6 +565,9 @@ importers:
react-native-gesture-handler:
specifier: ~2.20.2
version: 2.20.2(react-native@0.76.5(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli-server-api@14.1.0(bufferutil@4.0.8))(@types/react@18.3.14)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1))(react@18.3.1)
react-native-image-colors:
specifier: 2.4.0
version: 2.4.0(vc5zx7mqwgzirpvpjamp5nboge)
react-native-ios-context-menu:
specifier: 3.1.0
version: 3.1.0(react-native-ios-utilities@5.1.0(react-native@0.76.5(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli-server-api@14.1.0(bufferutil@4.0.8))(@types/react@18.3.14)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1))(react@18.3.1))(react-native@0.76.5(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli-server-api@14.1.0(bufferutil@4.0.8))(@types/react@18.3.14)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1))(react@18.3.1)
@ -3853,6 +3856,50 @@ packages:
resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
'@jimp/bmp@0.16.13':
resolution: {integrity: sha512-9edAxu7N2FX7vzkdl5Jo1BbACfycUtBQX+XBMcHA2bk62P8R0otgkHg798frgAk/WxQIzwxqOH6wMiCwrlAzdQ==}
peerDependencies:
'@jimp/custom': '>=0.3.5'
'@jimp/core@0.16.13':
resolution: {integrity: sha512-qXpA1tzTnlkTku9yqtuRtS/wVntvE6f3m3GNxdTdtmc+O+Wcg9Xo2ABPMh7Nc0AHbMKzwvwgB2JnjZmlmJEObg==}
'@jimp/custom@0.16.13':
resolution: {integrity: sha512-LTATglVUPGkPf15zX1wTMlZ0+AU7cGEGF6ekVF1crA8eHUWsGjrYTB+Ht4E3HTrCok8weQG+K01rJndCp/l4XA==}
'@jimp/gif@0.16.13':
resolution: {integrity: sha512-yFAMZGv3o+YcjXilMWWwS/bv1iSqykFahFMSO169uVMtfQVfa90kt4/kDwrXNR6Q9i6VHpFiGZMlF2UnHClBvg==}
peerDependencies:
'@jimp/custom': '>=0.3.5'
'@jimp/jpeg@0.16.13':
resolution: {integrity: sha512-BJHlDxzTlCqP2ThqP8J0eDrbBfod7npWCbJAcfkKqdQuFk0zBPaZ6KKaQKyKxmWJ87Z6ohANZoMKEbtvrwz1AA==}
peerDependencies:
'@jimp/custom': '>=0.3.5'
'@jimp/plugin-resize@0.16.13':
resolution: {integrity: sha512-qoqtN8LDknm3fJm9nuPygJv30O3vGhSBD2TxrsCnhtOsxKAqVPJtFVdGd/qVuZ8nqQANQmTlfqTiK9mVWQ7MiQ==}
peerDependencies:
'@jimp/custom': '>=0.3.5'
'@jimp/png@0.16.13':
resolution: {integrity: sha512-8cGqINvbWJf1G0Her9zbq9I80roEX0A+U45xFby3tDWfzn+Zz8XKDF1Nv9VUwVx0N3zpcG1RPs9hfheG4Cq2kg==}
peerDependencies:
'@jimp/custom': '>=0.3.5'
'@jimp/tiff@0.16.13':
resolution: {integrity: sha512-oJY8d9u95SwW00VPHuCNxPap6Q1+E/xM5QThb9Hu+P6EGuu6lIeLaNBMmFZyblwFbwrH+WBOZlvIzDhi4Dm/6Q==}
peerDependencies:
'@jimp/custom': '>=0.3.5'
'@jimp/types@0.16.13':
resolution: {integrity: sha512-mC0yVNUobFDjoYLg4hoUwzMKgNlxynzwt3cDXzumGvRJ7Kb8qQGOWJQjQFo5OxmGExqzPphkirdbBF88RVLBCg==}
peerDependencies:
'@jimp/custom': '>=0.3.5'
'@jimp/utils@0.16.13':
resolution: {integrity: sha512-VyCpkZzFTHXtKgVO35iKN0sYR10psGpV6SkcSeV4oF7eSYlR8Bl6aQLCzVeFjvESF7mxTmIiI3/XrMobVrtxDA==}
'@jridgewell/gen-mapping@0.3.5':
resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
engines: {node: '>=6.0.0'}
@ -5613,6 +5660,9 @@ packages:
'@tanstack/virtual-core@3.10.9':
resolution: {integrity: sha512-kBknKOKzmeR7lN+vSadaKWXaLS0SZZG+oqpQ/k80Q6g9REn6zRHS/ZYdrIzHnpHgy/eWs00SujveUN/GJT2qTw==}
'@tokenizer/token@0.3.0':
resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==}
'@tootallnate/once@2.0.0':
resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==}
engines: {node: '>= 10'}
@ -5717,6 +5767,9 @@ packages:
'@types/keyv@3.1.4':
resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
'@types/lodash@4.17.14':
resolution: {integrity: sha512-jsxagdikDiDBeIRaPYtArcT8my4tN1og7MtMRquFT3XNA6axxyHDRUemqDz/taRDdOUn0GnGHRCuff4q48sW9A==}
'@types/mdast@4.0.4':
resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
@ -5729,9 +5782,15 @@ packages:
'@types/node-forge@1.3.11':
resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==}
'@types/node@10.17.60':
resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==}
'@types/node@16.18.11':
resolution: {integrity: sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==}
'@types/node@16.9.1':
resolution: {integrity: sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==}
'@types/node@20.17.9':
resolution: {integrity: sha512-0JOXkRyLanfGPE2QRCwgxhzlBAvaRdCNMcvbd7jFfpmD4eEXll7LRwy5ymJmyeZqk7Nh7eD2LeUyQ68BbndmXw==}
@ -6227,6 +6286,9 @@ packages:
ansicolors@0.3.2:
resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==}
any-base@1.1.0:
resolution: {integrity: sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==}
any-promise@1.3.0:
resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
@ -6576,6 +6638,9 @@ packages:
blurhash@2.0.5:
resolution: {integrity: sha512-cRygWd7kGBQO3VEhPiTgq4Wc43ctsM+o46urrmPOiuAe+07fzlSB9OJVdpgDL0jPqXUVQ9ht7aq7kxOeJHRK+w==}
bmp-js@0.1.0:
resolution: {integrity: sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==}
bn.js@4.12.0:
resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==}
@ -6665,6 +6730,10 @@ packages:
buffer-equal-constant-time@1.0.1:
resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==}
buffer-equal@0.0.1:
resolution: {integrity: sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==}
engines: {node: '>=0.4.0'}
buffer-equal@1.0.1:
resolution: {integrity: sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==}
engines: {node: '>=0.4'}
@ -6816,6 +6885,9 @@ packages:
ccount@2.0.1:
resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
centra@2.7.0:
resolution: {integrity: sha512-PbFMgMSrmgx6uxCdm57RUos9Tc3fclMvhLSATYN39XsDV29B89zZ3KA89jmY0vwSGazyU+uerqwa6t+KaodPcg==}
chai@5.1.2:
resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==}
engines: {node: '>=12'}
@ -7695,6 +7767,9 @@ packages:
dom-serializer@2.0.0:
resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
dom-walk@0.1.2:
resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==}
domelementtype@2.3.0:
resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
@ -8547,6 +8622,9 @@ packages:
resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
engines: {node: '>=16.17'}
exif-parser@0.1.12:
resolution: {integrity: sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==}
expand-template@2.0.3:
resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==}
engines: {node: '>=6'}
@ -8904,6 +8982,10 @@ packages:
resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
engines: {node: '>=16.0.0'}
file-type@16.5.4:
resolution: {integrity: sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==}
engines: {node: '>=10'}
file-type@3.9.0:
resolution: {integrity: sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==}
engines: {node: '>=0.10.0'}
@ -9243,6 +9325,9 @@ packages:
resolution: {integrity: sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg==}
engines: {node: '>=6'}
gifwrap@0.9.4:
resolution: {integrity: sha512-MDMwbhASQuVeD4JKd1fKgNgCRL3fGqMM4WaqpNhWO0JiMOAjbQdumbs4BbBZEy9/M00EHEjKN3HieVhCUlwjeQ==}
giget@1.2.3:
resolution: {integrity: sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==}
hasBin: true
@ -9309,6 +9394,9 @@ packages:
resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==}
engines: {node: '>=0.10.0'}
global@4.4.0:
resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==}
globals@11.12.0:
resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
engines: {node: '>=4'}
@ -9653,6 +9741,9 @@ packages:
resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
engines: {node: '>= 4'}
image-q@4.0.0:
resolution: {integrity: sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw==}
image-size@0.7.5:
resolution: {integrity: sha512-Hiyv+mXHfFEP7LzUL/llg9RwFxxY+o9N3JVLIeG5E7iFIFAalxvRU9UZthBdYDEVnzHMgjnKJPPpay5BWf1g9g==}
engines: {node: '>=6.9.0'}
@ -9848,6 +9939,9 @@ packages:
resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==}
engines: {node: '>=18'}
is-function@1.0.2:
resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==}
is-generator-function@1.0.10:
resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==}
engines: {node: '>= 0.4'}
@ -10131,6 +10225,9 @@ packages:
resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==}
engines: {node: '>=10'}
jpeg-js@0.4.4:
resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==}
js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
@ -10472,6 +10569,9 @@ packages:
resolution: {integrity: sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==}
engines: {node: '>=18.0.0'}
load-bmfont@1.4.2:
resolution: {integrity: sha512-qElWkmjW9Oq1F9EI5Gt7aD9zcdHb9spJCW1L/dmPf7KzCCEJxq8nhHz5eCgI9aMf7vrG/wyaCqdsI+Iy9ZTlog==}
load-json-file@2.0.0:
resolution: {integrity: sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==}
engines: {node: '>=4'}
@ -10986,6 +11086,9 @@ packages:
resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==}
engines: {node: '>=10'}
min-document@2.19.0:
resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==}
min-indent@1.0.1:
resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
engines: {node: '>=4'}
@ -11273,6 +11376,9 @@ packages:
node-rsa@1.1.1:
resolution: {integrity: sha512-Jd4cvbJMryN21r5HgxQOpMEqv+ooke/korixNNK3mGqfGJmy0M77WDDzo/05969+OkMy3XW1UuZsSmW9KQm7Fw==}
node-vibrant@3.1.6:
resolution: {integrity: sha512-Wlc/hQmBMOu6xon12ZJHS2N3M+I6J8DhrD3Yo6m5175v8sFkVIN+UjhKVRcO+fqvre89ASTpmiFEP3nPO13SwA==}
nopt@5.0.0:
resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==}
engines: {node: '>=6'}
@ -11384,6 +11490,9 @@ packages:
ohash@1.1.4:
resolution: {integrity: sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==}
omggif@1.0.10:
resolution: {integrity: sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==}
on-exit-leak-free@2.1.2:
resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==}
engines: {node: '>=14.0.0'}
@ -11544,6 +11653,15 @@ packages:
resolution: {integrity: sha512-yx5DfvkN8JsHL2xk2Os9oTia467qnvRgey4ahSm2X8epehBLx/gWLcy5KI+Y36ful5DzGbCS6RazqZGgy1gHNw==}
engines: {node: '>=0.10.0'}
parse-bmfont-ascii@1.0.6:
resolution: {integrity: sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA==}
parse-bmfont-binary@1.0.6:
resolution: {integrity: sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA==}
parse-bmfont-xml@1.1.6:
resolution: {integrity: sha512-0cEliVMZEhrFDwMh4SxIyVJpqYoOWDJ9P895tFuS+XuNzI5UBmBk5U5O4KuJdTnZpSBI4LFA2+ZiJaiwfSwlMA==}
parse-color@1.0.0:
resolution: {integrity: sha512-fuDHYgFHJGbpGMgw9skY/bj3HL/Jrn4l/5rSspy00DoT4RyLnDcRvPxdZ+r6OFwIsgAuhDh4I09tAId4mI12bw==}
@ -11553,6 +11671,9 @@ packages:
parse-entities@4.0.1:
resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==}
parse-headers@2.0.5:
resolution: {integrity: sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==}
parse-json@2.2.0:
resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==}
engines: {node: '>=0.10.0'}
@ -11679,6 +11800,10 @@ packages:
resolution: {integrity: sha512-nh39Mo1eGWmZS7y+mK/dQIqg7S1lp38DpRxkyoHf0ZcUs/HDc+yyTjuOtTvSMZHmfSLuSQaX945u05Y2Q6UWZg==}
engines: {node: '>=14', npm: '>=7'}
peek-readable@4.1.0:
resolution: {integrity: sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==}
engines: {node: '>=8'}
pend@1.2.0:
resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
@ -11704,6 +11829,14 @@ packages:
resolution: {integrity: sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==}
engines: {node: '>=10'}
phin@2.9.3:
resolution: {integrity: sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==}
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
phin@3.7.1:
resolution: {integrity: sha512-GEazpTWwTZaEQ9RhL7Nyz0WwqilbqgLahDM3D0hxWwmVDI52nXEybHqiN6/elwpkJBhcuj+WbBu+QfT0uhPGfQ==}
engines: {node: '>= 8'}
picocolors@1.0.0:
resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
@ -11761,6 +11894,10 @@ packages:
resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
engines: {node: '>= 6'}
pixelmatch@4.0.2:
resolution: {integrity: sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA==}
hasBin: true
pkg-dir@3.0.0:
resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==}
engines: {node: '>=6'}
@ -12252,6 +12389,9 @@ packages:
pump@3.0.2:
resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==}
punycode@1.4.1:
resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==}
punycode@2.3.1:
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'}
@ -12275,6 +12415,10 @@ packages:
resolution: {integrity: sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==}
hasBin: true
qs@6.14.0:
resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==}
engines: {node: '>=0.6'}
query-string@7.1.3:
resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==}
engines: {node: '>=6'}
@ -12472,6 +12616,13 @@ packages:
peerDependencies:
react: ^16.6.0 || ^17.0.0 || ^18.0.0
react-native-image-colors@2.4.0:
resolution: {integrity: sha512-qlC31+UNVthByNLVuYSEQeZghOXn3uy1GLF6lHKlvT1HM1GGFH/LXNhU8iXAoQvUyzNa1bEAOTo09Hwinvp/rA==}
peerDependencies:
expo: '*'
react: '*'
react-native: '*'
react-native-ios-context-menu@3.1.0:
resolution: {integrity: sha512-qdPSXMKUp5lDgmZeUPdv5sgBFhkFrIqma+zsnqJQYOvekb6Qs17yJy1Rqhrj0bJrwuduHzZX0aYbaA8whxqpDw==}
peerDependencies:
@ -12702,6 +12853,10 @@ packages:
resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
engines: {node: '>= 6'}
readable-web-to-node-stream@3.0.2:
resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==}
engines: {node: '>=8'}
readdir-glob@1.1.3:
resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==}
@ -13213,10 +13368,26 @@ packages:
engines: {node: '>=6'}
hasBin: true
side-channel-list@1.0.0:
resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
engines: {node: '>= 0.4'}
side-channel-map@1.0.1:
resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
engines: {node: '>= 0.4'}
side-channel-weakmap@1.0.2:
resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
engines: {node: '>= 0.4'}
side-channel@1.0.6:
resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
engines: {node: '>= 0.4'}
side-channel@1.1.0:
resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
engines: {node: '>= 0.4'}
siginfo@2.0.0:
resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
@ -13534,6 +13705,10 @@ packages:
resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==}
engines: {node: '>=0.10.0'}
strtok3@6.3.0:
resolution: {integrity: sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==}
engines: {node: '>=10'}
structured-headers@0.4.1:
resolution: {integrity: sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==}
@ -13737,6 +13912,9 @@ packages:
resolution: {integrity: sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g==}
engines: {node: '>=10'}
timm@1.7.1:
resolution: {integrity: sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==}
tiny-inflate@1.0.3:
resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==}
@ -13746,6 +13924,9 @@ packages:
tinybench@2.9.0:
resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
tinycolor2@1.6.0:
resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==}
tinyexec@0.3.1:
resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==}
@ -13808,6 +13989,10 @@ packages:
resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
engines: {node: '>=0.6'}
token-types@4.2.1:
resolution: {integrity: sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==}
engines: {node: '>=10'}
tough-cookie@4.1.4:
resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==}
engines: {node: '>=6'}
@ -14238,6 +14423,10 @@ packages:
url-parse@1.5.10:
resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==}
url@0.11.4:
resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==}
engines: {node: '>= 0.4'}
use-callback-ref@1.3.2:
resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==}
engines: {node: '>=10'}
@ -14300,6 +14489,9 @@ packages:
utf8-byte-length@1.0.5:
resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==}
utif@2.0.1:
resolution: {integrity: sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==}
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
@ -14752,10 +14944,20 @@ packages:
resolution: {integrity: sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==}
engines: {node: '>=10.0.0'}
xhr@2.6.0:
resolution: {integrity: sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==}
xml-name-validator@4.0.0:
resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==}
engines: {node: '>=12'}
xml-parse-from-string@1.0.1:
resolution: {integrity: sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==}
xml2js@0.5.0:
resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==}
engines: {node: '>=4.0.0'}
xml2js@0.6.0:
resolution: {integrity: sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==}
engines: {node: '>=4.0.0'}
@ -18076,6 +18278,86 @@ snapshots:
'@types/yargs': 17.0.33
chalk: 4.1.2
'@jimp/bmp@0.16.13(@jimp/custom@0.16.13)':
dependencies:
'@babel/runtime': 7.26.0
'@jimp/custom': 0.16.13
'@jimp/utils': 0.16.13
bmp-js: 0.1.0
'@jimp/core@0.16.13':
dependencies:
'@babel/runtime': 7.26.0
'@jimp/utils': 0.16.13
any-base: 1.1.0
buffer: 5.7.1
exif-parser: 0.1.12
file-type: 16.5.4
load-bmfont: 1.4.2
mkdirp: 0.5.6
phin: 2.9.3
pixelmatch: 4.0.2
tinycolor2: 1.6.0
transitivePeerDependencies:
- debug
'@jimp/custom@0.16.13':
dependencies:
'@babel/runtime': 7.26.0
'@jimp/core': 0.16.13
transitivePeerDependencies:
- debug
'@jimp/gif@0.16.13(@jimp/custom@0.16.13)':
dependencies:
'@babel/runtime': 7.26.0
'@jimp/custom': 0.16.13
'@jimp/utils': 0.16.13
gifwrap: 0.9.4
omggif: 1.0.10
'@jimp/jpeg@0.16.13(@jimp/custom@0.16.13)':
dependencies:
'@babel/runtime': 7.26.0
'@jimp/custom': 0.16.13
'@jimp/utils': 0.16.13
jpeg-js: 0.4.4
'@jimp/plugin-resize@0.16.13(@jimp/custom@0.16.13)':
dependencies:
'@babel/runtime': 7.26.0
'@jimp/custom': 0.16.13
'@jimp/utils': 0.16.13
'@jimp/png@0.16.13(@jimp/custom@0.16.13)':
dependencies:
'@babel/runtime': 7.26.0
'@jimp/custom': 0.16.13
'@jimp/utils': 0.16.13
pngjs: 3.4.0
'@jimp/tiff@0.16.13(@jimp/custom@0.16.13)':
dependencies:
'@babel/runtime': 7.26.0
'@jimp/custom': 0.16.13
utif: 2.0.1
'@jimp/types@0.16.13(@jimp/custom@0.16.13)':
dependencies:
'@babel/runtime': 7.26.0
'@jimp/bmp': 0.16.13(@jimp/custom@0.16.13)
'@jimp/custom': 0.16.13
'@jimp/gif': 0.16.13(@jimp/custom@0.16.13)
'@jimp/jpeg': 0.16.13(@jimp/custom@0.16.13)
'@jimp/png': 0.16.13(@jimp/custom@0.16.13)
'@jimp/tiff': 0.16.13(@jimp/custom@0.16.13)
timm: 1.7.1
'@jimp/utils@0.16.13':
dependencies:
'@babel/runtime': 7.26.0
regenerator-runtime: 0.13.11
'@jridgewell/gen-mapping@0.3.5':
dependencies:
'@jridgewell/set-array': 1.2.1
@ -20294,6 +20576,8 @@ snapshots:
'@tanstack/virtual-core@3.10.9': {}
'@tokenizer/token@0.3.0': {}
'@tootallnate/once@2.0.0': {}
'@trysound/sax@0.2.0': {}
@ -20410,6 +20694,8 @@ snapshots:
dependencies:
'@types/node': 22.10.1
'@types/lodash@4.17.14': {}
'@types/mdast@4.0.4':
dependencies:
'@types/unist': 3.0.3
@ -20424,8 +20710,12 @@ snapshots:
dependencies:
'@types/node': 22.10.1
'@types/node@10.17.60': {}
'@types/node@16.18.11': {}
'@types/node@16.9.1': {}
'@types/node@20.17.9':
dependencies:
undici-types: 6.19.8
@ -21023,6 +21313,8 @@ snapshots:
ansicolors@0.3.2: {}
any-base@1.1.0: {}
any-promise@1.3.0: {}
anymatch@3.1.3:
@ -21528,6 +21820,8 @@ snapshots:
blurhash@2.0.5: {}
bmp-js@0.1.0: {}
bn.js@4.12.0: {}
bn.js@5.2.1: {}
@ -21642,6 +21936,8 @@ snapshots:
buffer-equal-constant-time@1.0.1: {}
buffer-equal@0.0.1: {}
buffer-equal@1.0.1: {}
buffer-fill@1.0.0: {}
@ -21876,6 +22172,12 @@ snapshots:
ccount@2.0.1: {}
centra@2.7.0:
dependencies:
follow-redirects: 1.15.9(debug@4.4.0)
transitivePeerDependencies:
- debug
chai@5.1.2:
dependencies:
assertion-error: 2.0.1
@ -22840,6 +23142,8 @@ snapshots:
domhandler: 5.0.3
entities: 4.5.0
dom-walk@0.1.2: {}
domelementtype@2.3.0: {}
domexception@4.0.0:
@ -24034,6 +24338,8 @@ snapshots:
signal-exit: 4.1.0
strip-final-newline: 3.0.0
exif-parser@0.1.12: {}
expand-template@2.0.3: {}
expand-tilde@2.0.2:
@ -24545,6 +24851,12 @@ snapshots:
dependencies:
flat-cache: 4.0.1
file-type@16.5.4:
dependencies:
readable-web-to-node-stream: 3.0.2
strtok3: 6.3.0
token-types: 4.2.1
file-type@3.9.0: {}
file-type@5.2.0: {}
@ -24938,6 +25250,11 @@ snapshots:
getenv@1.0.0: {}
gifwrap@0.9.4:
dependencies:
image-q: 4.0.0
omggif: 1.0.10
giget@1.2.3:
dependencies:
citty: 0.1.6
@ -25052,6 +25369,11 @@ snapshots:
is-windows: 1.0.2
which: 1.3.1
global@4.4.0:
dependencies:
min-document: 2.19.0
process: 0.11.10
globals@11.12.0: {}
globals@14.0.0: {}
@ -25524,6 +25846,10 @@ snapshots:
ignore@5.3.2: {}
image-q@4.0.0:
dependencies:
'@types/node': 16.9.1
image-size@0.7.5:
optional: true
@ -25701,6 +26027,8 @@ snapshots:
dependencies:
get-east-asian-width: 1.2.0
is-function@1.0.2: {}
is-generator-function@1.0.10:
dependencies:
has-tostringtag: 1.0.2
@ -25998,6 +26326,8 @@ snapshots:
joycon@3.1.1: {}
jpeg-js@0.4.4: {}
js-tokens@4.0.0: {}
js-yaml@3.14.1:
@ -26372,6 +26702,19 @@ snapshots:
rfdc: 1.4.1
wrap-ansi: 9.0.0
load-bmfont@1.4.2:
dependencies:
buffer-equal: 0.0.1
mime: 1.6.0
parse-bmfont-ascii: 1.0.6
parse-bmfont-binary: 1.0.6
parse-bmfont-xml: 1.1.6
phin: 3.7.1
xhr: 2.6.0
xtend: 4.0.2
transitivePeerDependencies:
- debug
load-json-file@2.0.0:
dependencies:
graceful-fs: 4.2.11
@ -27223,6 +27566,10 @@ snapshots:
mimic-response@3.1.0: {}
min-document@2.19.0:
dependencies:
dom-walk: 0.1.2
min-indent@1.0.1: {}
minimalistic-assert@1.0.1: {}
@ -27504,6 +27851,18 @@ snapshots:
dependencies:
asn1: 0.2.6
node-vibrant@3.1.6:
dependencies:
'@jimp/custom': 0.16.13
'@jimp/plugin-resize': 0.16.13(@jimp/custom@0.16.13)
'@jimp/types': 0.16.13(@jimp/custom@0.16.13)
'@types/lodash': 4.17.14
'@types/node': 10.17.60
lodash: 4.17.21
url: 0.11.4
transitivePeerDependencies:
- debug
nopt@5.0.0:
dependencies:
abbrev: 1.1.1
@ -27617,6 +27976,8 @@ snapshots:
ohash@1.1.4: {}
omggif@1.0.10: {}
on-exit-leak-free@2.1.2: {}
on-finished@2.3.0:
@ -27796,6 +28157,15 @@ snapshots:
dependencies:
author-regex: 1.0.0
parse-bmfont-ascii@1.0.6: {}
parse-bmfont-binary@1.0.6: {}
parse-bmfont-xml@1.1.6:
dependencies:
xml-parse-from-string: 1.0.1
xml2js: 0.5.0
parse-color@1.0.0:
dependencies:
color-convert: 0.5.3
@ -27817,6 +28187,8 @@ snapshots:
is-decimal: 2.0.1
is-hexadecimal: 2.0.1
parse-headers@2.0.5: {}
parse-json@2.2.0:
dependencies:
error-ex: 1.3.2
@ -27928,6 +28300,8 @@ snapshots:
pe-library@1.0.1: {}
peek-readable@4.1.0: {}
pend@1.2.0: {}
perfect-debounce@1.0.0: {}
@ -27956,6 +28330,14 @@ snapshots:
postgres-interval: 3.0.0
postgres-range: 1.1.4
phin@2.9.3: {}
phin@3.7.1:
dependencies:
centra: 2.7.0
transitivePeerDependencies:
- debug
picocolors@1.0.0: {}
picocolors@1.1.1: {}
@ -28002,6 +28384,10 @@ snapshots:
pirates@4.0.6: {}
pixelmatch@4.0.2:
dependencies:
pngjs: 3.4.0
pkg-dir@3.0.0:
dependencies:
find-up: 3.0.0
@ -28411,6 +28797,8 @@ snapshots:
end-of-stream: 1.4.4
once: 1.4.0
punycode@1.4.1: {}
punycode@2.3.1: {}
pupa@3.1.0:
@ -28427,6 +28815,10 @@ snapshots:
qrcode-terminal@0.12.0: {}
qs@6.14.0:
dependencies:
side-channel: 1.1.0
query-string@7.1.3:
dependencies:
decode-uri-component: 0.2.2
@ -28628,6 +29020,15 @@ snapshots:
react-fast-compare: 3.2.2
shallowequal: 1.1.0
react-native-image-colors@2.4.0(vc5zx7mqwgzirpvpjamp5nboge):
dependencies:
expo: 52.0.18(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@expo/metro-runtime@4.0.0(react-native@0.76.5(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli-server-api@14.1.0(bufferutil@4.0.8))(@types/react@18.3.14)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)))(bufferutil@4.0.8)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.12.5(react-native@0.76.5(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli-server-api@14.1.0(bufferutil@4.0.8))(@types/react@18.3.14)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1))(react@18.3.1))(react-native@0.76.5(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli-server-api@14.1.0(bufferutil@4.0.8))(@types/react@18.3.14)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1))(react@18.3.1)
node-vibrant: 3.1.6
react: 18.3.1
react-native: 0.76.5(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli-server-api@14.1.0(bufferutil@4.0.8))(@types/react@18.3.14)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)
transitivePeerDependencies:
- debug
react-native-ios-context-menu@3.1.0(react-native-ios-utilities@5.1.0(react-native@0.76.5(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli-server-api@14.1.0(bufferutil@4.0.8))(@types/react@18.3.14)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1))(react@18.3.1))(react-native@0.76.5(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli-server-api@14.1.0(bufferutil@4.0.8))(@types/react@18.3.14)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1))(react@18.3.1):
dependencies:
'@dominicstop/ts-event-emitter': 1.1.0
@ -28952,6 +29353,10 @@ snapshots:
string_decoder: 1.3.0
util-deprecate: 1.0.2
readable-web-to-node-stream@3.0.2:
dependencies:
readable-stream: 3.6.2
readdir-glob@1.1.3:
dependencies:
minimatch: 5.1.6
@ -29596,6 +30001,26 @@ snapshots:
minimist: 1.2.8
shelljs: 0.8.5
side-channel-list@1.0.0:
dependencies:
es-errors: 1.3.0
object-inspect: 1.13.3
side-channel-map@1.0.1:
dependencies:
call-bound: 1.0.2
es-errors: 1.3.0
get-intrinsic: 1.2.6
object-inspect: 1.13.3
side-channel-weakmap@1.0.2:
dependencies:
call-bound: 1.0.2
es-errors: 1.3.0
get-intrinsic: 1.2.6
object-inspect: 1.13.3
side-channel-map: 1.0.1
side-channel@1.0.6:
dependencies:
call-bind: 1.0.8
@ -29603,6 +30028,14 @@ snapshots:
get-intrinsic: 1.2.6
object-inspect: 1.13.3
side-channel@1.1.0:
dependencies:
es-errors: 1.3.0
object-inspect: 1.13.3
side-channel-list: 1.0.0
side-channel-map: 1.0.1
side-channel-weakmap: 1.0.2
siginfo@2.0.0: {}
signal-exit@3.0.7: {}
@ -29920,6 +30353,11 @@ snapshots:
dependencies:
escape-string-regexp: 1.0.5
strtok3@6.3.0:
dependencies:
'@tokenizer/token': 0.3.0
peek-readable: 4.1.0
structured-headers@0.4.1: {}
style-to-object@1.0.8:
@ -30186,12 +30624,16 @@ snapshots:
dependencies:
convert-hrtime: 3.0.0
timm@1.7.1: {}
tiny-inflate@1.0.3: {}
tiny-typed-emitter@2.1.0: {}
tinybench@2.9.0: {}
tinycolor2@1.6.0: {}
tinyexec@0.3.1: {}
tinyglobby@0.2.10:
@ -30240,6 +30682,11 @@ snapshots:
toidentifier@1.0.1: {}
token-types@4.2.1:
dependencies:
'@tokenizer/token': 0.3.0
ieee754: 1.2.1
tough-cookie@4.1.4:
dependencies:
psl: 1.15.0
@ -30702,6 +31149,11 @@ snapshots:
requires-port: 1.0.0
optional: true
url@0.11.4:
dependencies:
punycode: 1.4.1
qs: 6.14.0
use-callback-ref@1.3.2(@types/react@18.3.14)(react@18.3.1):
dependencies:
react: 18.3.1
@ -30753,6 +31205,10 @@ snapshots:
utf8-byte-length@1.0.5: {}
utif@2.0.1:
dependencies:
pako: 1.0.11
util-deprecate@1.0.2: {}
util@0.12.5:
@ -31264,9 +31720,23 @@ snapshots:
simple-plist: 1.3.1
uuid: 7.0.3
xhr@2.6.0:
dependencies:
global: 4.4.0
is-function: 1.0.2
parse-headers: 2.0.5
xtend: 4.0.2
xml-name-validator@4.0.0:
optional: true
xml-parse-from-string@1.0.1: {}
xml2js@0.5.0:
dependencies:
sax: 1.4.1
xmlbuilder: 11.0.1
xml2js@0.6.0:
dependencies:
sax: 1.4.1