From 0b096166d5524b6628802df6db666eb678dea73e Mon Sep 17 00:00:00 2001 From: Innei Date: Wed, 15 Jan 2025 21:44:21 +0800 Subject: [PATCH] feat(rn): setting page scroll magic Signed-off-by: Innei --- apps/mobile/package.json | 1 + ....tsx => BottomTabBarBackgroundContext.tsx} | 2 +- .../contexts/BottomTabBarVisibleContext.tsx | 6 + apps/mobile/src/modules/feed-drawer/atoms.ts | 2 +- .../src/modules/settings/SettingsList.tsx | 10 + .../src/modules/settings/UserHeaderBanner.tsx | 100 +++- apps/mobile/src/modules/settings/hooks.ts | 16 +- .../src/screens/(stack)/(tabs)/_layout.tsx | 175 ++++--- .../src/screens/(stack)/(tabs)/settings.tsx | 6 +- .../screens/(stack)/(tabs)/subscription.tsx | 11 +- packages/utils/src/color.ts | 8 + pnpm-lock.yaml | 470 ++++++++++++++++++ 12 files changed, 718 insertions(+), 89 deletions(-) rename apps/mobile/src/contexts/{TabBarBackgroundContext.tsx => BottomTabBarBackgroundContext.tsx} (68%) create mode 100644 apps/mobile/src/contexts/BottomTabBarVisibleContext.tsx diff --git a/apps/mobile/package.json b/apps/mobile/package.json index 17f7dd487..66b501171 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -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", diff --git a/apps/mobile/src/contexts/TabBarBackgroundContext.tsx b/apps/mobile/src/contexts/BottomTabBarBackgroundContext.tsx similarity index 68% rename from apps/mobile/src/contexts/TabBarBackgroundContext.tsx rename to apps/mobile/src/contexts/BottomTabBarBackgroundContext.tsx index ffab78f02..e0c8d5630 100644 --- a/apps/mobile/src/contexts/TabBarBackgroundContext.tsx +++ b/apps/mobile/src/contexts/BottomTabBarBackgroundContext.tsx @@ -5,6 +5,6 @@ interface TabBarBackgroundContextType { opacity: SharedValue } -export const TabBarBackgroundContext = createContext({ +export const BottomTabBarBackgroundContext = createContext({ opacity: null!, }) diff --git a/apps/mobile/src/contexts/BottomTabBarVisibleContext.tsx b/apps/mobile/src/contexts/BottomTabBarVisibleContext.tsx new file mode 100644 index 000000000..1a52a56d7 --- /dev/null +++ b/apps/mobile/src/contexts/BottomTabBarVisibleContext.tsx @@ -0,0 +1,6 @@ +import type { Dispatch, SetStateAction } from "react" +import { createContext } from "react" + +export const SetBottomTabBarVisibleContext = createContext>>( + () => {}, +) diff --git a/apps/mobile/src/modules/feed-drawer/atoms.ts b/apps/mobile/src/modules/feed-drawer/atoms.ts index 57fa8b3a5..558a52f65 100644 --- a/apps/mobile/src/modules/feed-drawer/atoms.ts +++ b/apps/mobile/src/modules/feed-drawer/atoms.ts @@ -22,7 +22,7 @@ export function useFeedDrawer() { // is drawer swipe disabled -const isDrawerSwipeDisabledAtom = atom(false) +const isDrawerSwipeDisabledAtom = atom(true) export function useIsDrawerSwipeDisabled() { return useAtomValue(isDrawerSwipeDisabledAtom) diff --git a/apps/mobile/src/modules/settings/SettingsList.tsx b/apps/mobile/src/modules/settings/SettingsList.tsx index e609bc1ab..b8fcc4e27 100644 --- a/apps/mobile/src/modules/settings/SettingsList.tsx +++ b/apps/mobile/src/modules/settings/SettingsList.tsx @@ -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 ( diff --git a/apps/mobile/src/modules/settings/UserHeaderBanner.tsx b/apps/mobile/src/modules/settings/UserHeaderBanner.tsx index b3e7b3e0f..c4f2dd5c1 100644 --- a/apps/mobile/src/modules/settings/UserHeaderBanner.tsx +++ b/apps/mobile/src/modules/settings/UserHeaderBanner.tsx @@ -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(defaultGradientColors) + const [gradientLight, setGradientLight] = useState(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 ( - + + + + { - {whoami.name} - {!!whoami.handle && @{whoami.handle}} + + {whoami.name} + + {!!whoami.handle && ( + + @{whoami.handle} + + )} ) diff --git a/apps/mobile/src/modules/settings/hooks.ts b/apps/mobile/src/modules/settings/hooks.ts index 52c8bdc66..ee21f70d2 100644 --- a/apps/mobile/src/modules/settings/hooks.ts +++ b/apps/mobile/src/modules/settings/hooks.ts @@ -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>() + const setTabBarVisible = useContext(SetBottomTabBarVisibleContext) + const hookValue = useNavigation>() + return { + ...hookValue, + navigate: ( + name: keyof RootStackParamList, + params?: RootStackParamList[keyof RootStackParamList], + ) => { + setTabBarVisible(false) + hookValue.navigate(name, params) + }, + } } diff --git a/apps/mobile/src/screens/(stack)/(tabs)/_layout.tsx b/apps/mobile/src/screens/(stack)/(tabs)/_layout.tsx index 9b493bed5..368fcc624 100644 --- a/apps/mobile/src/screens/(stack)/(tabs)/_layout.tsx +++ b/apps/mobile/src/screens/(stack)/(tabs)/_layout.tsx @@ -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 ( - ({ opacity }), [opacity])}> - { - 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, + ({ opacity }), [opacity])}> + + { + opacity.value = 1 }, - }, - }} - > - ( - - ), - tabBarButton(props) { - return ( - - - - - - ) + transitionStart: () => { + opacity.value = 1 }, }} - /> - { - const Icon = !focused ? SafariCuteIcon : SafariCuteFi - return + 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, + }, }, }} - /> + > + ( + + ), + tabBarButton(props) { + return ( + + + + + + ) + }, + }} + /> + { + const Icon = !focused ? SafariCuteIcon : SafariCuteFi + return + }, + }} + /> - - - - - - ) - }, - tabBarIcon: ({ color, focused }) => { - const Icon = !focused ? Settings7CuteReIcon : Setting7CuteFi - return - }, - }} - /> - - + + + + + + ) + }, + tabBarIcon: ({ color, focused }) => { + const Icon = !focused ? Settings7CuteReIcon : Setting7CuteFi + return + }, + }} + /> + + + ) } const AnimatedThemedBlurView = Animated.createAnimatedComponent(ThemedBlurView) const TabBarBackground = () => { - const { opacity } = useContext(TabBarBackgroundContext) + const { opacity } = useContext(BottomTabBarBackgroundContext) const animatedStyle = useAnimatedStyle(() => ({ opacity: opacity.value, diff --git a/apps/mobile/src/screens/(stack)/(tabs)/settings.tsx b/apps/mobile/src/screens/(stack)/(tabs)/settings.tsx index 544fead74..97557e592 100644 --- a/apps/mobile/src/screens/(stack)/(tabs)/settings.tsx +++ b/apps/mobile/src/screens/(stack)/(tabs)/settings.tsx @@ -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 }} > - + diff --git a/apps/mobile/src/screens/(stack)/(tabs)/subscription.tsx b/apps/mobile/src/screens/(stack)/(tabs)/subscription.tsx index a7384bfe2..bcdb2c043 100644 --- a/apps/mobile/src/screens/(stack)/(tabs)/subscription.tsx +++ b/apps/mobile/src/screens/(stack)/(tabs)/subscription.tsx @@ -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 ( <> { 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 +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9e1e5365f..c396c1a0c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -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