diff --git a/shared/chat/audio/audio-recorder.native.tsx b/shared/chat/audio/audio-recorder.native.tsx index 8c422365ae39..4ad0abbd5959 100644 --- a/shared/chat/audio/audio-recorder.native.tsx +++ b/shared/chat/audio/audio-recorder.native.tsx @@ -222,9 +222,7 @@ const useIconAndOverlay = (p: { const maxCancelDrift = -120 const maxLockDrift = -100 dragYSV.set(interpolate(e.translationY, [maxLockDrift, 0], [maxLockDrift, 0], Extrapolation.CLAMP)) - dragXSV.set( - interpolate(e.translationX, [maxCancelDrift, 0], [maxCancelDrift, 0], Extrapolation.CLAMP) - ) + dragXSV.set(interpolate(e.translationX, [maxCancelDrift, 0], [maxCancelDrift, 0], Extrapolation.CLAMP)) if (e.translationX < maxCancelDrift) { canceledSV.set(1) } else if (e.translationY < maxLockDrift) { @@ -476,7 +474,8 @@ const useRecorder = (p: {ampSV: SVN; setShowAudioSend: (s: boolean) => void; sho React.useEffect(() => { return () => { setShowAudioSend(false) - onResetRef.current() + onResetRef + .current() .then(() => {}) .catch(() => {}) } diff --git a/shared/chat/conversation/header-area/index.native.tsx b/shared/chat/conversation/header-area/index.native.tsx index c1ab4b8031c1..8e4b79b3b2de 100644 --- a/shared/chat/conversation/header-area/index.native.tsx +++ b/shared/chat/conversation/header-area/index.native.tsx @@ -1,10 +1,12 @@ import * as C from '@/constants' import * as Chat from '@/stores/chat' +import {getConvoState} from '@/stores/convostate' import {useProfileState} from '@/stores/profile' import * as Kb from '@/common-adapters' import type {HeaderBackButtonProps} from '@react-navigation/elements' import {HeaderLeftButton} from '@/common-adapters/header-buttons' import {Keyboard} from 'react-native' +import type {SFSymbol} from 'sf-symbols-typescript' // import {DebugChatDumpContext} from '@/constants/chat/debug' import {assertionToDisplay} from '@/common-adapters/usernames' import {useSafeAreaFrame} from 'react-native-safe-area-context' @@ -96,22 +98,54 @@ const BadgeHeaderLeftArray = (p: HeaderBackButtonProps) => { return } +const sfIcon = (name: SFSymbol) => ({name, type: 'sfSymbol' as const}) + export const headerNavigationOptions = (route: {params?: {conversationIDKey?: string}}) => { const conversationIDKey = route.params?.conversationIDKey ?? Chat.noConversationIDKey return { - headerLeft: (props: HeaderBackButtonProps) => { - const {onLabelLayout, labelStyle, ...rest} = props - return ( - - - - ) - }, - headerRight: () => ( - - - - ), + // iOS 26: headerLeft omitted — native back button comes from tabStackOptions (headerBackVisible: true). + // BadgeHeaderUpdater in container.tsx drives unstable_headerLeftItems for the badge count. + ...(!Kb.Styles.isIOS + ? { + headerLeft: (props: HeaderBackButtonProps) => { + const {labelStyle, ...rest} = props + return ( + + + + ) + }, + } + : {}), + // iOS 26: two separate native buttons (each gets its own glass pill). + // getConvoState lets us access dispatch without hooks since this runs outside React. + ...(Kb.Styles.isIOS + ? { + unstable_headerRightItems: () => [ + { + icon: sfIcon('magnifyingglass'), + label: 'Search', + onPress: () => { + Keyboard.dismiss() + setTimeout(() => getConvoState(conversationIDKey).dispatch.toggleThreadSearch(), 100) + }, + type: 'button' as const, + }, + { + icon: sfIcon('info.circle'), + label: 'Info', + onPress: () => getConvoState(conversationIDKey).dispatch.showInfoPanel(true, undefined), + type: 'button' as const, + }, + ], + } + : { + headerRight: () => ( + + + + ), + }), headerTitle: () => ( diff --git a/shared/chat/inbox-and-conversation-header.tsx b/shared/chat/inbox-and-conversation-header.tsx index 9543be4eb0bb..ef1023f0b70e 100644 --- a/shared/chat/inbox-and-conversation-header.tsx +++ b/shared/chat/inbox-and-conversation-header.tsx @@ -17,7 +17,7 @@ const Header = () => { canBeNull={true} id={ // eslint-disable-next-line - params?.conversationIDKey ?? Chat.noConversationIDKey + (params as {conversationIDKey?: string} | undefined)?.conversationIDKey ?? Chat.noConversationIDKey } > diff --git a/shared/chat/inbox/get-options.tsx b/shared/chat/inbox/get-options.tsx index 37a081c3e206..c7e6afc12be6 100644 --- a/shared/chat/inbox/get-options.tsx +++ b/shared/chat/inbox/get-options.tsx @@ -3,8 +3,25 @@ import * as Kb from '@/common-adapters' import {HeaderNewChatButton} from './new-chat-button' const buttonWidth = 132 -export default { - freezeOnBlur: false, // let it render even if not visible + +const mobileOptions = Kb.Styles.isIOS + ? { + // iOS 26: hidesSharedBackground prevents the glass circle around the custom button + unstable_headerRightItems: () => [ + {element: , hidesSharedBackground: true, type: 'custom' as const}, + ], + } + : { + headerRight: () => , + headerRightContainerStyle: { + ...Common.defaultNavigationOptions.headerRightContainerStyle, + minWidth: buttonWidth, + paddingRight: 8, + width: buttonWidth, + } as Kb.Styles.StylesCrossPlatform, + } + +const desktopOptions = { headerLeft: () => null, headerLeftContainerStyle: { ...Common.defaultNavigationOptions.headerLeftContainerStyle, @@ -18,6 +35,11 @@ export default { paddingRight: 8, width: buttonWidth, } as Kb.Styles.StylesCrossPlatform, +} + +export default { + freezeOnBlur: false, + ...(Kb.Styles.isMobile ? mobileOptions : desktopOptions), headerTitle: () => ( Chats diff --git a/shared/chat/inbox/new-chat-button.tsx b/shared/chat/inbox/new-chat-button.tsx index b500ec31b53f..8d3089c91785 100644 --- a/shared/chat/inbox/new-chat-button.tsx +++ b/shared/chat/inbox/new-chat-button.tsx @@ -1,6 +1,15 @@ import * as C from '@/constants' import * as Chat from '@/stores/chat' import * as Kb from '@/common-adapters' +import {LiquidGlassView, isLiquidGlassSupported} from '@callstack/liquid-glass' + +const rainbowHeight = C.isElectron ? 32 : 36 +const rainbowWidth = C.isElectron ? 80 : 96 +const colorBarCommon = { + height: rainbowHeight / 4, + position: 'absolute', + width: '100%', +} as const const HeaderNewChatButton = () => { const hide = Chat.useChatState( @@ -15,19 +24,19 @@ const HeaderNewChatButton = () => { if (hide) return null - return ( + const rainbowButton = ( - - - - - - + + + + { /> ) + + // eslint-disable-next-line + if (C.isIOS && isLiquidGlassSupported) { + return ( + + {rainbowButton} + + ) + } + + return rainbowButton } +const calcBarTop = (index: number) => index * colorBarCommon.height + const styles = Kb.Styles.styleSheetCreate( () => ({ - gradientContainer: Kb.Styles.platformStyles({ - isElectron: { - height: '100%', - position: 'absolute', - width: '100%', - }, - isMobile: { - bottom: Kb.Styles.isAndroid ? 5 : 0, - left: 0, - position: 'absolute', - right: 0, - top: 0, - }, - }), - gradientGreen: Kb.Styles.platformStyles({ - common: { - backgroundColor: '#3AFFAC', - borderBottomLeftRadius: Kb.Styles.borderRadius, - borderBottomRightRadius: Kb.Styles.borderRadius, - flex: 1, - }, - }), - gradientOrange: {backgroundColor: '#FFAC3D'}, - gradientRed: Kb.Styles.platformStyles({ - common: { - backgroundColor: '#FF5D5D', - borderTopLeftRadius: Kb.Styles.borderRadius, - borderTopRightRadius: Kb.Styles.borderRadius, - flex: 1, - }, - }), - gradientYellow: {backgroundColor: '#FFF75A'}, - rainbowButton: Kb.Styles.platformStyles({ - common: { - margin: 2, - paddingLeft: Kb.Styles.globalMargins.tiny, - paddingRight: Kb.Styles.globalMargins.tiny, - }, - }), + gradientGreen: { + ...colorBarCommon, + backgroundColor: '#3AFFAC', + top: calcBarTop(3), + }, + gradientOrange: { + ...colorBarCommon, + backgroundColor: '#FFAC3D', + top: calcBarTop(1), + }, + gradientRed: { + ...colorBarCommon, + backgroundColor: '#FF5D5D', + top: calcBarTop(0), + }, + gradientYellow: { + ...colorBarCommon, + backgroundColor: '#FFF75A', + top: calcBarTop(2), + }, + rainbowButton: { + margin: 2, + paddingLeft: Kb.Styles.globalMargins.tiny, + paddingRight: Kb.Styles.globalMargins.tiny, + }, rainbowButtonContainer: Kb.Styles.platformStyles({ common: { - alignSelf: 'flex-start', - height: '100%', + borderRadius: Kb.Styles.borderRadius, + height: rainbowHeight, + overflow: 'hidden', position: 'relative', + width: rainbowWidth, }, isElectron: { ...Kb.Styles.desktopStyles.windowDraggingClickable, diff --git a/shared/common-adapters/scroll-view.d.ts b/shared/common-adapters/scroll-view.d.ts index 775b08be029d..5f51ae050079 100644 --- a/shared/common-adapters/scroll-view.d.ts +++ b/shared/common-adapters/scroll-view.d.ts @@ -29,6 +29,7 @@ export type Props = { // mobile only bounces?: boolean contentInset?: {top?: number; left?: number; bottom?: number; right?: number} + contentInsetAdjustmentBehavior?: 'automatic' | 'scrollableAxes' | 'never' | 'always' centerContent?: boolean zoomScale?: number minimumZoomScale?: number diff --git a/shared/common-adapters/text.native.tsx b/shared/common-adapters/text.native.tsx index 4ee08f2b929c..1e4b9b378a16 100644 --- a/shared/common-adapters/text.native.tsx +++ b/shared/common-adapters/text.native.tsx @@ -22,6 +22,7 @@ export function Text(p: Props) { selectable={p.selectable} numberOfLines={p.lineClamp} ellipsizeMode={p.lineClamp ? (p.ellipsizeMode ?? 'tail') : undefined} + suppressHighlighting={true} > {p.children} @@ -30,6 +31,9 @@ export function Text(p: Props) { export default Text -const styles = Styles.styleSheetCreate(() => ({ - center: {textAlign: 'center'}, -}) as const) +const styles = Styles.styleSheetCreate( + () => + ({ + center: {textAlign: 'center'}, + }) as const +) diff --git a/shared/constants/init/index.native.tsx b/shared/constants/init/index.native.tsx index cd5c6f5d82f0..59a34f3d4277 100644 --- a/shared/constants/init/index.native.tsx +++ b/shared/constants/init/index.native.tsx @@ -2,7 +2,6 @@ import {ignorePromise, neverThrowPromiseFunc, timeoutPromise} from '../utils' import {useChatState} from '@/stores/chat' import {useConfigState} from '@/stores/config' -import {useCurrentUserState} from '@/stores/current-user' import {useDaemonState} from '@/stores/daemon' import {useDarkModeState} from '@/stores/darkmode' import {useFSState} from '@/stores/fs' @@ -21,7 +20,7 @@ import logger from '@/logger' import {Alert, Linking} from 'react-native' import {isAndroid} from '@/constants/platform.native' import {wrapErrors} from '@/util/debug' -import {getTab, getVisiblePath, logState, switchTab} from '@/constants/router' +import {getTab, getVisiblePath, logState} from '@/constants/router' import {launchImageLibraryAsync} from '@/util/expo-image-picker.native' import {pickDocumentsAsync} from '@/util/expo-document-picker.native' import {setupAudioMode} from '@/util/audio.native' @@ -529,21 +528,6 @@ export const initPlatformListener = () => { }) }) - let _pendingFastSwitchTab: string | undefined - useRouterState.setState(s => { - s.dispatch.defer.tabLongPress = wrapErrors((tab: string) => { - if (tab !== Tabs.peopleTab) return - const accountRows = useConfigState.getState().configuredAccounts - const current = useCurrentUserState.getState().username - const row = accountRows.find(a => a.username !== current && a.hasStoredSecret) - if (row) { - _pendingFastSwitchTab = getTab() ?? undefined - useConfigState.getState().dispatch.setUserSwitching(true) - useConfigState.getState().dispatch.login(row.username, '') - } - }) - }) - useFSState.setState(s => { s.dispatch.defer.pickAndUploadMobile = wrapErrors( (type: T.FS.MobilePickType, parentPath: T.FS.Path) => { @@ -675,24 +659,6 @@ export const initPlatformListener = () => { }) } - useConfigState.subscribe((state, prevState) => { - const tab = _pendingFastSwitchTab - if (!tab) return - if (state.loggedIn && !prevState.loggedIn) { - _pendingFastSwitchTab = undefined - let attempts = 0 - const trySwitch = () => { - if (attempts++ > 20) return - if (getTab()) { - switchTab(tab as Tabs.AppTab) - } else { - setTimeout(trySwitch, 100) - } - } - setTimeout(trySwitch, 100) - } - }) - initSharedSubscriptions() } diff --git a/shared/constants/router.tsx b/shared/constants/router.tsx index c0b72d35ae8a..c0e3d6e07d63 100644 --- a/shared/constants/router.tsx +++ b/shared/constants/router.tsx @@ -35,6 +35,7 @@ export type PathParam = NavigateAppendType export type Navigator = NavigationContainerRef const DEBUG_NAV = __DEV__ && (false as boolean) +const rootNonModalRouteNames = new Set(['chatConversation']) export const getRootState = (): NavState | undefined => { if (!navigationRef.isReady()) return @@ -117,7 +118,7 @@ export const getModalStack = (navState?: T.Immutable) => { if (!_isLoggedIn(rs)) { return [] } - return rs.routes?.slice(1) ?? [] + return (rs.routes?.slice(1) ?? []).filter(r => !rootNonModalRouteNames.has(r.name)) } export const getVisibleScreen = (navState?: T.Immutable, _inludeModals?: boolean) => { @@ -170,8 +171,20 @@ export const clearModals = () => { const n = _getNavigator() if (!n) return const ns = getRootState() - if (_isLoggedIn(ns) && (ns?.routes?.length ?? 0) > 1) { - n.dispatch({...StackActions.popToTop(), target: ns?.key}) + if (!_isLoggedIn(ns)) { + return + } + const rootRoutes = ns?.routes ?? [] + const keepRoutes = rootRoutes.filter((route, index) => index === 0 || rootNonModalRouteNames.has(route.name)) + if (keepRoutes.length !== rootRoutes.length) { + n.dispatch({ + ...CommonActions.reset({ + ...ns, + index: keepRoutes.length - 1, + routes: keepRoutes, + } as Parameters[0]), + target: ns?.key, + }) } } @@ -282,14 +295,18 @@ export const navToThread = (conversationIDKey: T.Chat.ConversationIDKey) => { target: tabNavState.key, }) } else { - // Phone: full reset to build the chat → conversation stack + // Phone: switch to the chat tab, then push the conversation above the tabs. const nextState = { - routes: [{name: 'loggedIn', state: { - routes: [{name: Tabs.chatTab, state: { - index: 1, - routes: [{name: 'chatRoot'}, {name: 'chatConversation', params: {conversationIDKey}}], - }}], - }}], + index: 1, + routes: [ + { + name: 'loggedIn', + state: { + routes: [{name: Tabs.chatTab, state: {index: 0, routes: [{name: 'chatRoot'}]}}], + }, + }, + {name: 'chatConversation', params: {conversationIDKey}}, + ], } n.dispatch({ ...CommonActions.reset(nextState as Parameters[0]), diff --git a/shared/crypto/sub-nav/index.desktop.tsx b/shared/crypto/sub-nav/index.desktop.tsx index 9c6579fd04fd..924f054cc45d 100644 --- a/shared/crypto/sub-nav/index.desktop.tsx +++ b/shared/crypto/sub-nav/index.desktop.tsx @@ -9,7 +9,7 @@ import { createNavigatorFactory, type NavigationContainerRef, } from '@react-navigation/core' -import type {TypedNavigator, NavigatorTypeBagBase, StaticConfig} from '@react-navigation/native' +import type {TypedNavigator, NavigatorTypeBagBase} from '@react-navigation/native' import {routeMapToScreenElements} from '@/router-v2/routes' import {makeLayout} from '@/router-v2/screen-layout.desktop' import type {RouteDef, GetOptionsParams} from '@/constants/types/router' @@ -98,10 +98,7 @@ type NavType = NavigatorTypeBagBase & { } } -export const createLeftTabNavigator = createNavigatorFactory(LeftTabNavigator) as () => TypedNavigator< - NavType, - StaticConfig -> +export const createLeftTabNavigator = createNavigatorFactory(LeftTabNavigator) as unknown as () => TypedNavigator const TabNavigator = createLeftTabNavigator() const makeOptions = (rd: RouteDef) => { return ({route, navigation}: GetOptionsParams) => { @@ -110,7 +107,7 @@ const makeOptions = (rd: RouteDef) => { return {...opt} } } -const cryptoScreens = routeMapToScreenElements(cryptoSubRoutes, TabNavigator.Screen, makeLayout, makeOptions, false, false) +const cryptoScreens = routeMapToScreenElements(cryptoSubRoutes, TabNavigator.Screen, makeLayout, makeOptions, false, false, false) const CryptoSubNavigator = () => ( {cryptoScreens} diff --git a/shared/fs/nav-header/mobile-header.tsx b/shared/fs/nav-header/mobile-header.tsx index 675e4ed1a83e..d4b09e7a2f0b 100644 --- a/shared/fs/nav-header/mobile-header.tsx +++ b/shared/fs/nav-header/mobile-header.tsx @@ -25,6 +25,11 @@ const MaybePublicTag = ({path}: {path: T.FS.Path}) => ) : null +const FilesTabStatusIcon = () => { + const uploadIcon = useFSState(s => s.getUploadIconForFilesTab()) + return uploadIcon ? : null +} + const NavMobileHeader = (props: Props) => { const {expanded, setFolderViewFilter} = useFSState( C.useShallow(s => ({ @@ -50,8 +55,11 @@ const NavMobileHeader = (props: Props) => { return props.path === FS.defaultPath ? ( - - Files + + + Files + + @@ -66,6 +74,7 @@ const NavMobileHeader = (props: Props) => { ) : null} + )} @@ -108,6 +117,7 @@ const styles = Kb.Styles.styleSheetCreate( }, expandedTopContainer: Kb.Styles.platformStyles({ common: { + alignItems: 'center', backgroundColor: Kb.Styles.globalColors.white, paddingRight: Kb.Styles.globalMargins.tiny, }, @@ -115,6 +125,10 @@ const styles = Kb.Styles.styleSheetCreate( isIOS: {height: 44}, }), filename: {marginLeft: Kb.Styles.globalMargins.xtiny}, + filesTabStatusIcon: { + height: Kb.Styles.globalMargins.small, + width: Kb.Styles.globalMargins.small, + }, headerContainer: { backgroundColor: Kb.Styles.globalColors.white, borderBottomColor: Kb.Styles.globalColors.black_10, diff --git a/shared/ios/Keybase/Info.plist b/shared/ios/Keybase/Info.plist index 4169e4221386..4cf9da2c060b 100644 --- a/shared/ios/Keybase/Info.plist +++ b/shared/ios/Keybase/Info.plist @@ -122,7 +122,5 @@ CADisableMinimumFrameDurationOnPhone - UIDesignRequiresCompatibility - diff --git a/shared/ios/Podfile.lock b/shared/ios/Podfile.lock index 5b17fba19b20..0708a802c12a 100644 --- a/shared/ios/Podfile.lock +++ b/shared/ios/Podfile.lock @@ -148,6 +148,34 @@ PODS: - libwebp/sharpyuv (1.5.0) - libwebp/webp (1.5.0): - libwebp/sharpyuv + - LiquidGlass (0.7.0): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-NativeModulesApple + - React-RCTFabric + - React-renderercss + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - SocketRocket + - Yoga - lottie-ios (4.6.0) - lottie-react-native (7.3.6): - boost @@ -3228,6 +3256,7 @@ DEPENDENCIES: - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) - KBCommon (from `../../rnmodules/kb-common`) + - "LiquidGlass (from `../node_modules/@callstack/liquid-glass`)" - lottie-react-native (from `../node_modules/lottie-react-native`) - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - RCTDeprecation (from `../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`) @@ -3397,6 +3426,8 @@ EXTERNAL SOURCES: :tag: hermes-v0.14.1 KBCommon: :path: "../../rnmodules/kb-common" + LiquidGlass: + :path: "../node_modules/@callstack/liquid-glass" lottie-react-native: :path: "../node_modules/lottie-react-native" RCT-Folly: @@ -3602,6 +3633,7 @@ SPEC CHECKSUMS: libavif: 5f8e715bea24debec477006f21ef9e95432e254d libdav1d: 23581a4d8ec811ff171ed5e2e05cd27bad64c39f libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8 + LiquidGlass: 3201cf56cdcacd9b273b67fef52ddc41d48e2253 lottie-ios: 8f959969761e9c45d70353667d00af0e5b9cadb3 lottie-react-native: e542fe4b6e8eddcf893d5a8cef9f8b5c6d2f7331 RCT-Folly: 846fda9475e61ec7bcbf8a3fe81edfcaeb090669 diff --git a/shared/package.json b/shared/package.json index dc79e057133c..e028d91e8ebb 100644 --- a/shared/package.json +++ b/shared/package.json @@ -77,6 +77,7 @@ "license": "MIT", "private": true, "dependencies": { + "@callstack/liquid-glass": "0.7.0", "@gorhom/bottom-sheet": "5.2.8", "@gorhom/portal": "1.0.14", "@khanacademy/simple-markdown": "2.2.2", diff --git a/shared/people/routes.tsx b/shared/people/routes.tsx index 2c56bb3eedd8..7fc3d609715f 100644 --- a/shared/people/routes.tsx +++ b/shared/people/routes.tsx @@ -16,7 +16,6 @@ const HeaderAvatar = () => { export const newRoutes = { peopleRoot: { getOptions: { - headerLeft: () => null, headerRight: () => , headerTitle: () => , }, @@ -27,7 +26,11 @@ export const newRoutes = { const AccountSignOutButton = () => { const navigateAppend = C.useRouterState(s => s.dispatch.navigateAppend) return ( - navigateAppend(settingsLogOutTab)} style={{color: Kb.Styles.globalColors.red}}> + navigateAppend(settingsLogOutTab)} + style={{color: Kb.Styles.globalColors.red, padding: 8}} + > Sign out ) diff --git a/shared/profile/routes.tsx b/shared/profile/routes.tsx index 4a552d448b52..0df79ff872c7 100644 --- a/shared/profile/routes.tsx +++ b/shared/profile/routes.tsx @@ -51,11 +51,6 @@ export const newRoutes = { React.lazy(async () => import('./user')), { getOptions: { - headerLeft: p => { - return ( - - ) - }, headerShown: true, headerStyle: {backgroundColor: 'transparent'}, headerTitle: () => ( diff --git a/shared/router-v2/common.d.ts b/shared/router-v2/common.d.ts index f60815778341..b4f12f2ca58d 100644 --- a/shared/router-v2/common.d.ts +++ b/shared/router-v2/common.d.ts @@ -3,6 +3,8 @@ import type {NavState} from '@/constants/router' import type * as Styles from '@/styles' import type {NativeStackNavigationOptions} from '@react-navigation/native-stack' export const tabBarStyle: Styles.StylesCrossPlatform +export const tabBarBlurEffect: 'systemDefault' +export const tabBarMinimizeBehavior: 'onScrollDown' export const headerDefaultStyle: Styles.StylesCrossPlatform // Intersection with NativeStackNavigationOptions: our custom header reads container // styles that aren't in RN's native-stack types. Cast to NativeStackNavigationOptions diff --git a/shared/router-v2/common.native.tsx b/shared/router-v2/common.native.tsx index 75f93c18159e..e41622960fec 100644 --- a/shared/router-v2/common.native.tsx +++ b/shared/router-v2/common.native.tsx @@ -18,16 +18,11 @@ export const tabBarStyle = { get backgroundColor() { return Kb.Styles.globalColors.blueDarkOrGreyDarkest }, - position: 'absolute' as const, -} - -export const tabBarStyleHidden = { - height: 0, - opacity: 0, - overflow: 'hidden', - position: 'absolute', } as const +export const tabBarBlurEffect = 'systemDefault' as const +export const tabBarMinimizeBehavior = 'onScrollDown' as const + const actionWidth = 64 const DEBUGCOLORS = __DEV__ && (false as boolean) @@ -35,6 +30,7 @@ type HeaderLeftProps = Parameters>[0] // Options used by default on all navigators export const defaultNavigationOptions = { + headerBackButtonDisplayMode: 'minimal', headerBackTitle: '', headerBackVisible: false, headerBackgroundContainerStyle: { diff --git a/shared/router-v2/left-tab-navigator.desktop.tsx b/shared/router-v2/left-tab-navigator.desktop.tsx index b104de49df85..e80ac4e5d099 100644 --- a/shared/router-v2/left-tab-navigator.desktop.tsx +++ b/shared/router-v2/left-tab-navigator.desktop.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import * as Kb from '@/common-adapters' import TabBar from './tab-bar.desktop' import {useNavigationBuilder, TabRouter, createNavigatorFactory} from '@react-navigation/core' -import type {TypedNavigator, NavigatorTypeBagBase, StaticConfig} from '@react-navigation/native' +import type {TypedNavigator, NavigatorTypeBagBase} from '@react-navigation/native' import type * as Tabs from '@/constants/tabs' import {useRouterState} from '@/stores/router' import {getModalStack} from '@/constants/router' @@ -68,7 +68,4 @@ type NavType = NavigatorTypeBagBase & { } } -export const createLeftTabNavigator = createNavigatorFactory(LeftTabNavigator) as () => TypedNavigator< - NavType, - StaticConfig -> +export const createLeftTabNavigator = createNavigatorFactory(LeftTabNavigator) as unknown as () => TypedNavigator diff --git a/shared/router-v2/linking.tsx b/shared/router-v2/linking.tsx index 969e6204b51a..fa2a1041267b 100644 --- a/shared/router-v2/linking.tsx +++ b/shared/router-v2/linking.tsx @@ -84,7 +84,8 @@ const makeTabState = ( } } return { - routes: [{name: 'loggedIn', state: {routes: [tabRoute]}}], + index: 0, + routes: [{name: 'loggedIn', state: {index: 0, routes: [tabRoute]}}], } } @@ -94,11 +95,20 @@ export const makeChatConversationState = (conversationIDKey: string): PartialNav // Tablet/desktop: chatRoot with conversationIDKey param (split view) return makeTabState(Tabs.chatTab, [{name: 'chatRoot', params: {conversationIDKey}}]) } - // Phone: chatRoot + chatConversation on stack - return makeTabState(Tabs.chatTab, [ - {name: 'chatRoot'}, - {name: 'chatConversation', params: {conversationIDKey}}, - ]) + // Phone: tabs at root, conversation pushed above them + return { + index: 1, + routes: [ + { + name: 'loggedIn', + state: { + index: 0, + routes: [{name: Tabs.chatTab, state: {index: 0, routes: [{name: 'chatRoot'}]}}], + }, + }, + {name: 'chatConversation', params: {conversationIDKey}}, + ], + } } // Build state for a modal screen at root level diff --git a/shared/router-v2/router.desktop.tsx b/shared/router-v2/router.desktop.tsx index 4ff607d11e85..3f824441fbc0 100644 --- a/shared/router-v2/router.desktop.tsx +++ b/shared/router-v2/router.desktop.tsx @@ -35,7 +35,7 @@ const appTabsInnerOptions = { tabBarStyle: Common.tabBarStyle, } -const tabScreensConfig = routeMapToStaticScreens(routes, makeLayout, false, false) +const tabScreensConfig = routeMapToStaticScreens(routes, makeLayout, false, false, true) const tabComponents: Record = {} for (const tab of Tabs.desktopTabs) { @@ -59,7 +59,7 @@ function AppTabsInner() { const AppTabs = () => -const loggedOutScreensConfig = routeMapToStaticScreens(loggedOutRoutes, makeLayout, false, true) +const loggedOutScreensConfig = routeMapToStaticScreens(loggedOutRoutes, makeLayout, false, true, false) const loggedOutOptions = { header: ({navigation}) => (
@@ -144,7 +144,7 @@ const useIsLoggedOut = () => { return loggedInLoaded && !loggedIn } -const modalScreensConfig = routeMapToStaticScreens(modalRoutes, makeLayout, true, false) +const modalScreensConfig = routeMapToStaticScreens(modalRoutes, makeLayout, true, false, false) const rootNav = createNativeStackNavigator({ groups: { diff --git a/shared/router-v2/router.native.tsx b/shared/router-v2/router.native.tsx index 099819187165..1ab0c96e10c9 100644 --- a/shared/router-v2/router.native.tsx +++ b/shared/router-v2/router.native.tsx @@ -9,21 +9,24 @@ import * as Shared from './router.shared' import * as Tabs from '@/constants/tabs' import * as Common from './common.native' import logger from '@/logger' -import {StatusBar, View} from 'react-native' -import {PlatformPressable} from '@react-navigation/elements' +import {Platform, StatusBar, View} from 'react-native' import {HeaderLeftButton} from '@/common-adapters/header-buttons' -import {NavigationContainer, getFocusedRouteNameFromRoute} from '@react-navigation/native' -import {createBottomTabNavigator, type BottomTabBarButtonProps} from '@react-navigation/bottom-tabs' +import {NavigationContainer} from '@react-navigation/native' +import type {NavigationProp} from '@react-navigation/native' +// NAV8: import {createBottomTabNavigator} from '@react-navigation/bottom-tabs' +import {createNativeBottomTabNavigator} from '@react-navigation/bottom-tabs/unstable' // NAV7 import {modalRoutes, routes, loggedOutRoutes, tabRoots, routeMapToStaticScreens} from './routes' import {createNativeStackNavigator} from '@react-navigation/native-stack' import type {NativeStackNavigationOptions} from '@react-navigation/native-stack' +import type {SFSymbol} from 'sf-symbols-typescript' import {makeLayout} from './screen-layout.native' import {useRootKey} from './hooks.native' -import * as TabBar from './tab-bar.native' import {createLinkingConfig} from './linking' import {handleAppLink} from '@/constants/deeplinks' import {useDaemonState} from '@/stores/daemon' +import {useNotifState} from '@/stores/notifications' +import {usePushState} from '@/stores/push' if (module.hot) { module.hot.accept('', () => {}) @@ -40,76 +43,150 @@ const tabToLabel = new Map([ // just to get badge rollups const tabs = C.isTablet ? Tabs.tabletTabs : Tabs.phoneTabs -const Tab = createBottomTabNavigator() +// NAV8: const Tab = createBottomTabNavigator() +const Tab = createNativeBottomTabNavigator() // NAV7 const tabRoutes = routes +const settingsTabChildren = [Tabs.gitTab, Tabs.devicesTab, Tabs.settingsTab] as const -const tabStackOptions = { +const tabStackOptions = ({ + navigation, +}: { + navigation: {canGoBack: () => boolean} +}): NativeStackNavigationOptions => ({ ...Common.defaultNavigationOptions, -} as const + ...(Platform.OS === 'ios' ? {contentStyle: {backgroundColor: Kb.Styles.globalColors.transparent}} : {}), + // Use the native back button (liquid glass pill on iOS 26) for non-root screens; + // omit headerLeft entirely on root screens so no empty glass circle appears. + headerBackVisible: navigation.canGoBack(), + headerLeft: undefined, +}) + +// On phones, each tab stack only contains its root screen. All other routes live in +// the root stack (alongside chatConversation) so they render above the tab bar. +const tabRootNameSet = new Set(Object.values(tabRoots).filter(Boolean)) +const phoneRootRoutes = Object.fromEntries( + Object.entries(tabRoutes).filter(([name]) => !tabRootNameSet.has(name)) +) as typeof tabRoutes -const tabScreensConfig = routeMapToStaticScreens(tabRoutes, makeLayout, false, false) +const tabScreensConfig = routeMapToStaticScreens(tabRoutes, makeLayout, false, false, true) +const phoneRootScreensConfig = routeMapToStaticScreens( + C.isTablet ? {} : phoneRootRoutes, + makeLayout, + false, + false, + false +) const tabComponents: Record = {} for (const tab of tabs) { - const nav = createNativeStackNavigator({ - initialRouteName: tabRoots[tab], - screenOptions: tabStackOptions as NativeStackNavigationOptions, - screens: tabScreensConfig, - }) - tabComponents[tab] = nav.getComponent() + if (C.isTablet) { + const nav = createNativeStackNavigator({ + initialRouteName: tabRoots[tab], + screenOptions: tabStackOptions, + screens: tabScreensConfig, + }) + tabComponents[tab] = nav.getComponent() + } else { + const rootName = tabRoots[tab] + const rootScreenConfig = routeMapToStaticScreens( + {[rootName]: tabRoutes[rootName as keyof typeof tabRoutes]} as typeof tabRoutes, + makeLayout, + false, + false, + true + ) + const nav = createNativeStackNavigator({ + initialRouteName: rootName, + screenOptions: tabStackOptions, + screens: rootScreenConfig, + }) + tabComponents[tab] = nav.getComponent() + } } -const tabScreenOptions = ({route}: {route: {name: string}}) => { - let routeName: string | undefined - try { - routeName = getFocusedRouteNameFromRoute(route) - } catch {} - return { - tabBarStyle: routeName === 'chatConversation' ? Common.tabBarStyleHidden : Common.tabBarStyle, +const androidTabIcons = new Map([ + [Tabs.chatTab, require('../images/icons/icon-nav-chat-32.png')], + [Tabs.fsTab, require('../images/icons/icon-nav-folders-32.png')], + [Tabs.peopleTab, require('../images/icons/icon-nav-people-32.png')], + [Tabs.settingsTab, require('../images/icons/icon-nav-settings-32.png')], + [Tabs.teamsTab, require('../images/icons/icon-folder-team-32.png')], +]) + +const iosTabIcons = new Map([ + [Tabs.chatTab, {active: 'message.fill', inactive: 'message'}], + [Tabs.fsTab, {active: 'folder.fill', inactive: 'folder'}], + [Tabs.peopleTab, {active: 'person.crop.circle.fill', inactive: 'person.crop.circle'}], + [Tabs.settingsTab, {active: 'ellipsis.circle.fill', inactive: 'ellipsis.circle'}], + [Tabs.teamsTab, {active: 'person.3.fill', inactive: 'person.3'}], +]) + +const getNativeTabIcon = (tab: Tabs.Tab) => { + if (Platform.OS === 'ios') { + const icon = iosTabIcons.get(tab) + return icon + ? ({focused}: {focused: boolean}) => ({ + name: focused ? icon.active : icon.inactive, + type: 'sfSymbol' as const, + }) + : undefined } + const source = androidTabIcons.get(tab) + return source ? {source, type: 'image' as const} : undefined } -const tabStacks = tabs.map(tab => ( - { - C.useRouterState.getState().dispatch.defer.tabLongPress?.(tab) - }, - }} - component={tabComponents[tab]!} - options={tabScreenOptions} - /> -)) - -const android_rippleFix = {color: 'transparent'} -const appTabsScreenOptions = ({route}: {route: {name: string}}) => { + +const getBadgeNumber = ( + routeName: Tabs.Tab, + navBadges: ReadonlyMap, + hasPermissions: boolean +) => { + const onSettings = routeName === Tabs.settingsTab + const tabsToCount: ReadonlyArray = onSettings ? settingsTabChildren : [routeName] + const count = tabsToCount.reduce( + (res, tab) => res + (navBadges.get(tab) || 0), + onSettings && !hasPermissions ? 1 : 0 + ) + return count || undefined +} + +const appTabsScreenOptions = ( + routeName: Tabs.Tab, + navBadges: ReadonlyMap, + hasPermissions: boolean +) => { + const isIOS = Platform.OS === 'ios' return { - ...Common.defaultNavigationOptions, headerShown: false, - tabBarAccessibilityLabel: tabToLabel.get(route.name as Tabs.Tab) ?? route.name, - tabBarActiveBackgroundColor: Kb.Styles.globalColors.transparent, - tabBarButton: (p: BottomTabBarButtonProps) => ( - - {p.children} - - ), - tabBarHideOnKeyboard: true, - tabBarIcon: ({focused}: {focused: boolean}) => ( - - ), - tabBarInactiveBackgroundColor: Kb.Styles.globalColors.transparent, - tabBarLabel: ({focused}: {focused: boolean}) => ( - - ), - tabBarShowLabel: Kb.Styles.isTablet, - tabBarStyle: Common.tabBarStyle, + tabBarActiveIndicatorEnabled: false, + tabBarBadge: getBadgeNumber(routeName, navBadges, hasPermissions), + tabBarBadgeStyle: {backgroundColor: Kb.Styles.globalColors.blue}, + ...(isIOS + ? { + tabBarBlurEffect: Common.tabBarBlurEffect, + tabBarMinimizeBehavior: Common.tabBarMinimizeBehavior, + } + : {tabBarActiveTintColor: Kb.Styles.globalColors.white}), + tabBarControllerMode: (isIOS && C.isTablet ? 'auto' : undefined) as 'auto' | undefined, + tabBarIcon: getNativeTabIcon(routeName), + ...(isIOS ? {} : {tabBarInactiveTintColor: Kb.Styles.globalColors.blueLighter}), + tabBarLabel: tabToLabel.get(routeName) ?? routeName, + tabBarLabelVisibilityMode: (C.isTablet ? 'labeled' : 'selected') as 'labeled' | 'selected', + ...(isIOS ? {} : {tabBarStyle: Common.tabBarStyle}), + title: tabToLabel.get(routeName) ?? routeName, } } function AppTabs() { + const navBadges = useNotifState(s => s.navBadges) + const hasPermissions = usePushState(s => s.hasPermissions) return ( - - {tabStacks} + + {tabs.map(tab => ( + + ))} ) } @@ -117,7 +194,7 @@ function AppTabs() { const loggedOutScreenOptions = { ...Common.defaultNavigationOptions, } as const -const loggedOutScreensConfig = routeMapToStaticScreens(loggedOutRoutes, makeLayout, false, true) +const loggedOutScreensConfig = routeMapToStaticScreens(loggedOutRoutes, makeLayout, false, true, false) const loggedOutNav = createNativeStackNavigator({ initialRouteName: 'login', screenOptions: loggedOutScreenOptions as NativeStackNavigationOptions, @@ -125,33 +202,46 @@ const loggedOutNav = createNativeStackNavigator({ }) const LoggedOut = loggedOutNav.getComponent() -const rootStackScreenOptions = { - headerShown: false, // eventually do this after we pull apart modal2 etc -} satisfies NativeStackNavigationOptions -const modalScreenOptions = { - headerLeft: () => , - headerShown: true, - presentation: 'modal', - title: '', -} as const +const rootStackScreenOptions = {headerBackButtonDisplayMode: 'minimal'} satisfies NativeStackNavigationOptions +const modalScreenOptions = ({ + navigation, +}: { + navigation: NavigationProp +}): NativeStackNavigationOptions => { + const cancelItem: NativeStackNavigationOptions = + Platform.OS === 'ios' + ? { + unstable_headerLeftItems: () => [ + {label: 'Cancel', onPress: () => navigation.goBack(), type: 'button' as const}, + ], + } + : {headerLeft: () => } + return { + ...cancelItem, + headerShown: true, + presentation: 'modal', + title: '', + } +} const useIsLoggedIn = () => useConfigState(s => s.loggedIn) const useIsLoggedOut = () => !useConfigState(s => s.loggedIn) -const modalScreensConfig = routeMapToStaticScreens(modalRoutes, makeLayout, true, false) +const modalScreensConfig = routeMapToStaticScreens(modalRoutes, makeLayout, true, false, false) const rootNav = createNativeStackNavigator({ groups: { loggedIn: { if: useIsLoggedIn, screens: { - loggedIn: {screen: AppTabs}, + loggedIn: {options: {headerShown: false}, screen: AppTabs}, + ...phoneRootScreensConfig, }, }, loggedOut: { if: useIsLoggedOut, screens: { - loggedOut: {screen: LoggedOut}, + loggedOut: {options: {headerShown: false}, screen: LoggedOut}, }, }, modals: { diff --git a/shared/router-v2/router.shared.tsx b/shared/router-v2/router.shared.tsx index 9d537eadfab2..bfac734a7d84 100644 --- a/shared/router-v2/router.shared.tsx +++ b/shared/router-v2/router.shared.tsx @@ -1,9 +1,7 @@ import * as Kb from '@/common-adapters' -import UploadIcon from '@/fs/common/upload-icon' import {Splash} from '../login/loading' import type {Theme} from '@react-navigation/native' import {colors, darkColors} from '@/styles/colors' -import {useFSState} from '@/stores/fs' export function SimpleLoading() { return ( @@ -18,21 +16,6 @@ export function SimpleLoading() { ) } -export const FilesTabBadge = () => { - const uploadIcon = useFSState(s => s.getUploadIconForFilesTab()) - return uploadIcon ? : null -} - -const styles = Kb.Styles.styleSheetCreate(() => ({ - fsBadgeIconUpload: { - bottom: Kb.Styles.globalMargins.tiny, - height: Kb.Styles.globalMargins.small, - position: 'absolute', - right: Kb.Styles.globalMargins.small, - width: Kb.Styles.globalMargins.small, - }, -})) - // the nav assumes plain colors for animation in some cases so we can't use the themed colors there export const darkTheme: Theme = { colors: { diff --git a/shared/router-v2/routes.tsx b/shared/router-v2/routes.tsx index caa8a4b8df38..dcc08c870689 100644 --- a/shared/router-v2/routes.tsx +++ b/shared/router-v2/routes.tsx @@ -111,7 +111,12 @@ type LayoutFn = (props: { route: GetOptionsParams['route'] navigation: GetOptionsParams['navigation'] }) => React.ReactNode -type MakeLayoutFn = (isModal: boolean, isLoggedOut: boolean, getOptions?: GetOptions) => LayoutFn +type MakeLayoutFn = ( + isModal: boolean, + isLoggedOut: boolean, + isTabScreen: boolean, + getOptions?: GetOptions +) => LayoutFn type MakeOptionsFn = (rd: RouteDef) => (params: GetOptionsParams) => GetOptionsRet function toNavOptions(opts: GetOptionsRet): NativeStackNavigationOptions { @@ -123,7 +128,8 @@ export function routeMapToStaticScreens( rs: RouteMap, makeLayoutFn: MakeLayoutFn, isModal: boolean, - isLoggedOut: boolean + isLoggedOut: boolean, + isTabScreen: boolean ) { const result: Record< string, @@ -138,7 +144,7 @@ export function routeMapToStaticScreens( result[name] = { // Layout functions return JSX (ReactElement) and accept any route/navigation. // Cast bridges our specific KBRootParamList types to RN's generic ParamListBase. - layout: makeLayoutFn(isModal, isLoggedOut, rd.getOptions) as (props: any) => React.ReactElement, + layout: makeLayoutFn(isModal, isLoggedOut, isTabScreen, rd.getOptions) as (props: any) => React.ReactElement, options: ({route, navigation}: {route: any; navigation: any}) => { const go = rd.getOptions const opts = typeof go === 'function' ? go({navigation, route}) : go @@ -156,7 +162,8 @@ export function routeMapToScreenElements( makeLayoutFn: MakeLayoutFn, makeOptionsFn: MakeOptionsFn, isModal: boolean, - isLoggedOut: boolean + isLoggedOut: boolean, + isTabScreen: boolean ) { return (Object.keys(rs) as Array).flatMap(name => { const rd = rs[name as string] @@ -166,7 +173,7 @@ export function routeMapToScreenElements( key={String(name)} name={name} component={rd.screen} - layout={makeLayoutFn(isModal, isLoggedOut, rd.getOptions)} + layout={makeLayoutFn(isModal, isLoggedOut, isTabScreen, rd.getOptions)} options={makeOptionsFn(rd)} />, ] diff --git a/shared/router-v2/screen-layout.desktop.tsx b/shared/router-v2/screen-layout.desktop.tsx index a6c7e87c71e7..0d0ced67265c 100644 --- a/shared/router-v2/screen-layout.desktop.tsx +++ b/shared/router-v2/screen-layout.desktop.tsx @@ -176,7 +176,7 @@ type LayoutProps = { navigation: GetOptionsParams['navigation'] } -export const makeLayout = (isModal: boolean, _isLoggedOut: boolean, getOptions?: GetOptions) => { +export const makeLayout = (isModal: boolean, _isLoggedOut: boolean, _isTabScreen: boolean, getOptions?: GetOptions) => { return ({children, route, navigation}: LayoutProps) => { const navigationOptions = typeof getOptions === 'function' ? getOptions({navigation, route}) : getOptions diff --git a/shared/router-v2/screen-layout.native.tsx b/shared/router-v2/screen-layout.native.tsx index 352f97f64e61..6a7ed6f3fc11 100644 --- a/shared/router-v2/screen-layout.native.tsx +++ b/shared/router-v2/screen-layout.native.tsx @@ -1,6 +1,5 @@ import * as Kb from '@/common-adapters' import * as React from 'react' -import {useBottomTabBarHeight} from '@react-navigation/bottom-tabs' import {SafeAreaProvider, initialWindowMetrics} from 'react-native-safe-area-context' import {isTablet, isIOS} from '@/constants/platform' import type {GetOptions, GetOptionsParams} from '@/constants/types/router' @@ -14,19 +13,27 @@ type LayoutProps = { } const TabScreenWrapper = ({children}: {children: React.ReactNode}) => { - const paddingBottom = useBottomTabBarHeight() return ( - + {children} ) } -export const makeLayout = (isModal: boolean, isLoggedOut: boolean, getOptions?: GetOptions) => { +const StackScreenWrapper = ({children}: {children: React.ReactNode}) => { + return ( + + {children} + + ) +} + +export const makeLayout = ( + isModal: boolean, + isLoggedOut: boolean, + isTabScreen: boolean, + getOptions?: GetOptions +) => { return function Layout({children, route, navigation}: LayoutProps) { const navigationOptions = typeof getOptions === 'function' ? getOptions({navigation, route}) : getOptions const {modalFooter} = navigationOptions ?? {} @@ -52,9 +59,12 @@ export const makeLayout = (isModal: boolean, isLoggedOut: boolean, getOptions?: suspenseContent ) - if (!isModal && !isLoggedOut) { + if (!isModal && !isLoggedOut && isTabScreen) { return {wrappedContent} } + if (!isModal && !isLoggedOut) { + return {wrappedContent} + } return ( diff --git a/shared/router-v2/tab-bar.native.tsx b/shared/router-v2/tab-bar.native.tsx deleted file mode 100644 index 9be58e08601b..000000000000 --- a/shared/router-v2/tab-bar.native.tsx +++ /dev/null @@ -1,118 +0,0 @@ -import * as Kb from '@/common-adapters' -import * as Tabs from '@/constants/tabs' -import * as C from '@/constants' -import * as Shared from './router.shared' -import {View} from 'react-native' -import {useSafeAreaFrame} from 'react-native-safe-area-context' -import {useColorScheme} from 'react-native' -import {usePushState} from '@/stores/push' -import {useNotifState} from '@/stores/notifications' - -const settingsTabChildren = [Tabs.gitTab, Tabs.devicesTab, Tabs.settingsTab] as const -const tabs = C.isTablet ? Tabs.tabletTabs : Tabs.phoneTabs -const tabToData = new Map([ - [Tabs.chatTab, {icon: 'iconfont-nav-2-chat', label: 'Chat'}], - [Tabs.fsTab, {icon: 'iconfont-nav-2-files', label: 'Files'}], - [Tabs.teamsTab, {icon: 'iconfont-nav-2-teams', label: 'Teams'}], - [Tabs.peopleTab, {icon: 'iconfont-nav-2-people', label: 'People'}], - [Tabs.settingsTab, {icon: 'iconfont-nav-2-hamburger', label: 'More'}], -] as const) - -export function TabBarIcon(props: { - isFocused: boolean - routeName: Tabs.Tab -}) { - const {isFocused, routeName} = props - const navBadges = useNotifState(s => s.navBadges) - const hasPermissions = usePushState(s => s.hasPermissions) - const onSettings = routeName === Tabs.settingsTab - const tabsToCount: ReadonlyArray = onSettings ? settingsTabChildren : [routeName] - const badgeNumber = tabsToCount.reduce( - (res, tab) => res + (navBadges.get(tab) || 0), - // notifications gets badged on native if there's no push, special case - onSettings && !hasPermissions ? 1 : 0 - ) - const {width: screenWidth} = useSafeAreaFrame() - const data = tabToData.get(routeName) - return data ? ( - - - {!!badgeNumber && } - {routeName === Tabs.fsTab && } - - ) : null -} - -type TabIconProps = {routeName: Tabs.Tab; focused: boolean} -export function TabBarIconWrapper(p: TabIconProps) { - return -} -export function TabBarLabelWrapper(p: TabIconProps) { - const data = tabToData.get(p.routeName) - const isDarkMode = useColorScheme() === 'dark' - return ( - - {data?.label} - - ) -} - -const styles = Kb.Styles.styleSheetCreate( - () => - ({ - badge: Kb.Styles.platformStyles({ - common: { - left: 36, - position: 'absolute', - top: 3, - }, - }), - label: {marginLeft: Kb.Styles.globalMargins.medium}, - labelDarkMode: {color: Kb.Styles.globalColors.black_50}, - labelDarkModeFocused: {color: Kb.Styles.globalColors.black}, - labelLightMode: {color: Kb.Styles.globalColors.blueLighter}, - labelLightModeFocused: {color: Kb.Styles.globalColors.white}, - tab: Kb.Styles.platformStyles({ - common: { - backgroundColor: Kb.Styles.globalColors.blueDarkOrGreyDarkest, - paddingBottom: 6, - paddingLeft: 16, - paddingRight: 16, - paddingTop: 6, - }, - isTablet: {width: '100%'}, - }), - tabContainer: Kb.Styles.platformStyles({ - common: { - flex: 1, - justifyContent: 'center', - }, - isTablet: { - // This is to circumvent a React Navigation AnimatedComponent with minWidth: 64 that wraps TabBarIcon - minWidth: Kb.Styles.globalMargins.xlarge, - }, - }), - }) as const -) diff --git a/shared/settings/root-desktop-tablet.tsx b/shared/settings/root-desktop-tablet.tsx index fabf0a5d774f..cf0ea6da1308 100644 --- a/shared/settings/root-desktop-tablet.tsx +++ b/shared/settings/root-desktop-tablet.tsx @@ -6,7 +6,7 @@ import {makeLayout} from '@/router-v2/screen-layout.desktop' import type {RouteDef, GetOptionsParams} from '@/constants/types/router' import LeftNav from './sub-nav/left-nav' import {useNavigationBuilder, TabRouter, createNavigatorFactory} from '@react-navigation/core' -import type {TypedNavigator, NavigatorTypeBagBase, StaticConfig} from '@react-navigation/native' +import type {TypedNavigator, NavigatorTypeBagBase} from '@react-navigation/native' import {sharedNewRoutes} from './routes' import {settingsAccountTab} from '@/stores/settings' @@ -81,10 +81,7 @@ type NavType = NavigatorTypeBagBase & { } } -export const createLeftTabNavigator = createNavigatorFactory(LeftTabNavigator) as () => TypedNavigator< - NavType, - StaticConfig -> +export const createLeftTabNavigator = createNavigatorFactory(LeftTabNavigator) as unknown as () => TypedNavigator const TabNavigator = createLeftTabNavigator() const makeOptions = (rd: RouteDef) => { return ({route, navigation}: GetOptionsParams) => { @@ -93,7 +90,7 @@ const makeOptions = (rd: RouteDef) => { return {...opt} } } -const settingsScreens = routeMapToScreenElements(settingsSubRoutes, TabNavigator.Screen, makeLayout, makeOptions, false, false) +const settingsScreens = routeMapToScreenElements(settingsSubRoutes, TabNavigator.Screen, makeLayout, makeOptions, false, false, false) // TODO on ipad this doesn't have a stack navigator so when you go into crypto you get // a push from the parent stack. If we care just make a generic left nav / right stack diff --git a/shared/settings/root-phone.tsx b/shared/settings/root-phone.tsx index 04740ee00a17..7c3a01fc03f5 100644 --- a/shared/settings/root-phone.tsx +++ b/shared/settings/root-phone.tsx @@ -53,7 +53,7 @@ type Item = { subText?: string textColor?: string } -type Section = Omit, 'renderItem'> +type Section = {title: string; data: ReadonlyArray} function SettingsNav() { const badgeNumbers = useNotifState(s => s.navBadges) @@ -193,28 +193,30 @@ function SettingsNav() { ] return ( - item.text + index} - initialNumToRender={20} - renderItem={({item}) => { - if (item.text === 'perf') { - return - } - return item.text ? ( - item.onClick()} selected={false} /> - ) : null - }} - renderSectionHeader={({section: {title}}) => - title ? ( - - {title} - - ) : null - } - style={Kb.Styles.globalStyles.fullHeight} - sections={sections} - /> + + {sections.map(section => ( + + {section.title ? ( + + {section.title} + + ) : null} + {section.data.map((item, index) => + item.text === 'perf' ? ( + + ) : item.text ? ( + item.onClick()} + selected={false} + /> + ) : null + )} + + ))} + ) } diff --git a/shared/stores/router.tsx b/shared/stores/router.tsx index 4c88df5d7680..50f3dc3bf2ec 100644 --- a/shared/stores/router.tsx +++ b/shared/stores/router.tsx @@ -34,9 +34,6 @@ const initialStore: Store = { export type State = Store & { dispatch: { clearModals: () => void - defer: { - tabLongPress?: (tab: string) => void - } navigateAppend: (path: Util.PathParam, replace?: boolean) => void navigateUp: () => void navUpToScreen: (name: RouteKeys) => void @@ -54,9 +51,6 @@ export type State = Store & { export const useRouterState = Z.createZustand('router', (set, get) => { const dispatch: State['dispatch'] = { clearModals: Util.clearModals, - defer: { - tabLongPress: undefined, - }, navUpToScreen: Util.navUpToScreen, navigateAppend: Util.navigateAppend, navigateUp: Util.navigateUp, diff --git a/shared/team-building/list-body.tsx b/shared/team-building/list-body.tsx index e905776f41ed..ab06143a4ad5 100644 --- a/shared/team-building/list-body.tsx +++ b/shared/team-building/list-body.tsx @@ -223,8 +223,9 @@ export const ListBody = ( } ) => { const {params} = useRoute>() - const recommendedHideYourself = params.recommendedHideYourself ?? false - const teamID = params.teamID + const p = params as {recommendedHideYourself?: boolean; teamID?: string} | undefined + const recommendedHideYourself = p?.recommendedHideYourself ?? false + const teamID = p?.teamID const {searchString, selectedService} = props const {onAdd, onRemove, teamSoFar, onSearchForMore, onChangeText} = props const {namespace, highlightedIndex, /*offset, */ enterInputCounter, onFinishTeamBuilding} = props diff --git a/shared/team-building/page.tsx b/shared/team-building/page.tsx index 58adc6cf062a..8465a8ffb82e 100644 --- a/shared/team-building/page.tsx +++ b/shared/team-building/page.tsx @@ -1,30 +1,20 @@ import type {StaticScreenProps} from '@react-navigation/core' +import {useNavigation} from '@react-navigation/core' import * as Kb from '@/common-adapters' import * as React from 'react' import * as T from '@/constants/types' import * as C from '@/constants' import {ModalTitle as TeamsModalTitle} from '../teams/common' -import {createTBStore, TBProvider, useTBContext} from '@/stores/team-building' +import {TBProvider, useTBContext} from '@/stores/team-building' import {useModalHeaderState} from '@/stores/modal-header' -// Header components that read directly from the TB store (outside TBProvider context) -const TBHeaderLeft = ({namespace}: {namespace: T.TB.AllowedNamespace}) => { - const store = createTBStore(namespace) - const cancelTeamBuilding = store(s => s.dispatch.cancelTeamBuilding) - if (namespace === 'teams') { - return - } - if (Kb.Styles.isMobile) { - return ( - - Cancel - - ) - } - return null -} - -const TBHeaderRight = ({namespace, goButtonLabel}: {namespace: T.TB.AllowedNamespace; goButtonLabel?: string}) => { +const TBHeaderRight = ({ + namespace, + goButtonLabel, +}: { + namespace: T.TB.AllowedNamespace + goButtonLabel?: string +}) => { const {enabled, onAction} = useModalHeaderState( C.useShallow(s => ({enabled: s.actionEnabled, onAction: s.onAction})) ) @@ -54,24 +44,50 @@ const TBHeaderRight = ({namespace, goButtonLabel}: {namespace: T.TB.AllowedNames return null } -// Writes action state to ModalHeaderStore from inside TBProvider context -const HeaderRightUpdater = ({namespace}: {namespace: T.TB.AllowedNamespace}) => { +// Writes action state to ModalHeaderStore from inside TBProvider context. +// On iOS, also drives unstable_headerRightItems directly to avoid empty glass circles +// when no members are selected (opacity:0 components still create a glass circle on iOS 26). +const HeaderRightUpdater = ({ + namespace, + goButtonLabel, +}: { + namespace: T.TB.AllowedNamespace + goButtonLabel?: string +}) => { + const navigation = useNavigation() const hasTeamSoFar = useTBContext(s => s.teamSoFar.size > 0) const finishTeamBuilding = useTBContext(s => s.dispatch.finishTeamBuilding) const finishedTeamBuilding = useTBContext(s => s.dispatch.finishedTeamBuilding) React.useEffect(() => { if (!Kb.Styles.isMobile) return + if (namespace !== 'teams' && namespace !== 'chat' && namespace !== 'crypto') return const onFinish = namespace === 'teams' ? finishTeamBuilding : finishedTeamBuilding - if (namespace === 'teams' || namespace === 'chat' || namespace === 'crypto') { - useModalHeaderState.setState({ - actionEnabled: hasTeamSoFar, - onAction: onFinish, - }) + if (Kb.Styles.isIOS) { + const label = namespace === 'teams' ? 'Add' : (goButtonLabel ?? 'Start') + navigation.setOptions({ + unstable_headerRightItems: hasTeamSoFar + ? () => [{label, onPress: onFinish, type: 'button' as const}] + : () => [], + } as object) + } else { + useModalHeaderState.setState({actionEnabled: hasTeamSoFar, onAction: onFinish}) } return () => { - useModalHeaderState.setState({actionEnabled: false, onAction: undefined}) + if (Kb.Styles.isIOS) { + navigation.setOptions({unstable_headerRightItems: () => []} as object) + } else { + useModalHeaderState.setState({actionEnabled: false, onAction: undefined}) + } } - }, [namespace, hasTeamSoFar, finishTeamBuilding, finishedTeamBuilding]) + }, [namespace, hasTeamSoFar, finishTeamBuilding, finishedTeamBuilding, goButtonLabel, navigation]) + return null +} + +// Calls resetState when the screen is removed (e.g. default cancel button pressed) +const CancelOnRemove = () => { + const navigation = useNavigation() + const resetState = useTBContext(s => s.dispatch.resetState) + React.useEffect(() => navigation.addListener('beforeRemove', resetState), [navigation, resetState]) return null } @@ -82,8 +98,6 @@ const getOptions = ({route}: OwnProps) => { const title = typeof route.params.title === 'string' ? route.params.title : '' const goButtonLabel = route.params.goButtonLabel const common = { - headerLeft: () => , - headerRight: () => , modalStyle: {height: 560} as const, overlayAvoidTabs: false, overlayStyle: {alignSelf: 'center'} as const, @@ -110,13 +124,21 @@ const getOptions = ({route}: OwnProps) => { if (namespace === 'teams') { return { ...common, + // iOS: headerRight omitted; HeaderRightUpdater drives unstable_headerRightItems dynamically + headerRight: Kb.Styles.isIOS ? undefined : () => , headerTitle: () => ( ), } } - return common + return { + ...common, + // iOS: headerRight omitted; HeaderRightUpdater drives unstable_headerRightItems dynamically + headerRight: Kb.Styles.isIOS + ? undefined + : () => , + } } const Building = React.lazy(async () => import('./container')) @@ -124,7 +146,8 @@ type OwnProps = StaticScreenProps> const Screen = (p: OwnProps) => ( - + + ) diff --git a/shared/yarn.lock b/shared/yarn.lock index ced62934cee2..a7d1a61dade0 100644 --- a/shared/yarn.lock +++ b/shared/yarn.lock @@ -108,10 +108,10 @@ regexpu-core "^6.3.1" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.6.5", "@babel/helper-define-polyfill-provider@^0.6.6": - version "0.6.6" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.6.tgz#714dfe33d8bd710f556df59953720f6eeb6c1a14" - integrity sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA== +"@babel/helper-define-polyfill-provider@^0.6.5", "@babel/helper-define-polyfill-provider@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz#cf1e4462b613f2b54c41e6ff758d5dfcaa2c85d1" + integrity sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA== dependencies: "@babel/helper-compilation-targets" "^7.28.6" "@babel/helper-plugin-utils" "^7.28.6" @@ -212,21 +212,14 @@ "@babel/types" "^7.28.6" "@babel/helpers@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.6.tgz#fca903a313ae675617936e8998b814c415cbf5d7" - integrity sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw== + version "7.29.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.29.2.tgz#9cfbccb02b8e229892c0b07038052cc1a8709c49" + integrity sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw== dependencies: "@babel/template" "^7.28.6" - "@babel/types" "^7.28.6" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.24.4", "@babel/parser@^7.25.3", "@babel/parser@^7.28.6", "@babel/parser@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.0.tgz#669ef345add7d057e92b7ed15f0bac07611831b6" - integrity sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww== - dependencies: "@babel/types" "^7.29.0" -"@babel/parser@^7.23.9": +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.4", "@babel/parser@^7.25.3", "@babel/parser@^7.28.6", "@babel/parser@^7.29.0": version "7.29.2" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.2.tgz#58bd50b9a7951d134988a1ae177a35ef9a703ba1" integrity sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA== @@ -1055,16 +1048,11 @@ "@babel/plugin-transform-modules-commonjs" "^7.27.1" "@babel/plugin-transform-typescript" "^7.28.5" -"@babel/runtime@^7.12.5": +"@babel/runtime@^7.12.5", "@babel/runtime@^7.18.6", "@babel/runtime@^7.20.0", "@babel/runtime@^7.25.0": version "7.29.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.29.2.tgz#9a6e2d05f4b6692e1801cd4fb176ad823930ed5e" integrity sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g== -"@babel/runtime@^7.18.6", "@babel/runtime@^7.20.0", "@babel/runtime@^7.25.0": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.28.6.tgz#d267a43cb1836dc4d182cce93ae75ba954ef6d2b" - integrity sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA== - "@babel/template@^7.25.0", "@babel/template@^7.28.6", "@babel/template@^7.3.3": version "7.28.6" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.28.6.tgz#0e7e56ecedb78aeef66ce7972b082fce76a23e57" @@ -1113,6 +1101,11 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@callstack/liquid-glass@0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@callstack/liquid-glass/-/liquid-glass-0.7.0.tgz#d48dc2d348cac4da11178382fc445a9d7b2825e7" + integrity sha512-ztPuQnXG3z9kPWT0srf+yIbVZih/aifbynzormDzsFMWR6IQk3e0h8DEYic3sgW7PUa7A/GyaBBCpq10ZZvboA== + "@csstools/color-helpers@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@csstools/color-helpers/-/color-helpers-5.1.0.tgz#106c54c808cabfd1ab4c602d8505ee584c2996ef" @@ -1147,13 +1140,14 @@ integrity sha512-dDlz3W405VMFO4w5kIP9DOmELBcvFQGmLoKSdIRstBDubKFYwaNHV1NnlzMCQpXQFGWVALmeMORAuiLx18AvZQ== "@electron/asar@^4.0.0", "@electron/asar@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-4.0.1.tgz#0f0edc51ddb5bf30acb49f706d616b11a0b90668" - integrity sha512-F4Ykm1jiBGY1WV/o8Q8oFW8Nq0u+S2/vPujzNJtdSJ6C4LHC4CiGLn7c17s7SolZ23gcvCebMncmZtNc+MkxPQ== + version "4.1.1" + resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-4.1.1.tgz#9a00c1bc0cce0b793f6f142c72daad9ab23bb760" + integrity sha512-grbomy1TPEauyu+N4UdRQqSjOhsm0ZoTbprLpvJWQGYeEIMVBwSPV3Rv3E3EfqU5iFSufd/k+2KZvTDbgfesnw== dependencies: commander "^13.1.0" - glob "^11.0.1" + glob "^13.0.2" minimatch "^10.0.1" + plist "^3.1.0" "@electron/get@^2.0.0": version "2.0.3" @@ -1230,9 +1224,9 @@ yargs-parser "^22.0.0" "@electron/universal@^3.0.1": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-3.0.2.tgz#d21fabd2729f9f5edbf2d8ab088718c4ac29244c" - integrity sha512-2/NBjJhw/VXQayIIj8Mu3ZeZ+lRjx90l2aKqkQiVrA2HiFTc/KHKN8Fjj3Ta7xMAxn45mAKJCatR8xeJ/eW7Tg== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-3.0.3.tgz#a530f3b9828c17d10cbe6108d27bdcabdf755219" + integrity sha512-Do5YzO0lxpK6fDArgxiYT7TPHwQljwQ1jA6WZSYSlUNPjpVCehLnU78tdqGYAC7Zt6mc2bY/leuPpMxxN6TAVg== dependencies: "@electron/asar" "^4.0.0" "@malept/cross-spawn-promise" "^2.0.0" @@ -1420,13 +1414,13 @@ integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== "@eslint/config-array@^0.21.1": - version "0.21.1" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.21.1.tgz#7d1b0060fea407f8301e932492ba8c18aff29713" - integrity sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA== + version "0.21.2" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.21.2.tgz#f29e22057ad5316cf23836cee9a34c81fffcb7e6" + integrity sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw== dependencies: "@eslint/object-schema" "^2.1.7" debug "^4.3.1" - minimatch "^3.1.2" + minimatch "^3.1.5" "@eslint/config-helpers@^0.4.2": version "0.4.2" @@ -1443,9 +1437,9 @@ "@types/json-schema" "^7.0.15" "@eslint/eslintrc@^3.3.1": - version "3.3.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.4.tgz#e402b1920f7c1f5a15342caa432b1348cacbb641" - integrity sha512-4h4MVF8pmBsncB60r0wSJiIeUKTSD4m7FmTFThG8RHlsg9ajqckLm9OraguFGZE4vVdpiI1Q4+hFnisopmG6gQ== + version "3.3.5" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.5.tgz#c131793cfc1a7b96f24a83e0a8bbd4b881558c60" + integrity sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg== dependencies: ajv "^6.14.0" debug "^4.3.2" @@ -1454,7 +1448,7 @@ ignore "^5.2.0" import-fresh "^3.2.1" js-yaml "^4.1.1" - minimatch "^3.1.3" + minimatch "^3.1.5" strip-json-comments "^3.1.1" "@eslint/js@9.39.2": @@ -1878,11 +1872,6 @@ wrap-ansi "^8.1.0" wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" -"@isaacs/cliui@^9.0.0": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-9.0.0.tgz#4d0a3f127058043bf2e7ee169eaf30ed901302f3" - integrity sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg== - "@isaacs/ttlcache@^1.4.1": version "1.4.1" resolved "https://registry.yarnpkg.com/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz#21fb23db34e9b6220c6ba023a0118a2dd3461ea2" @@ -2276,74 +2265,74 @@ resolved "https://registry.yarnpkg.com/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz#5c23f796c47675f166d23b948cdb889184b93207" integrity sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g== -"@jsonjoy.com/fs-core@4.56.10": - version "4.56.10" - resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-core/-/fs-core-4.56.10.tgz#320728b4b7bef63abb60e7630351623899237411" - integrity sha512-PyAEA/3cnHhsGcdY+AmIU+ZPqTuZkDhCXQ2wkXypdLitSpd6d5Ivxhnq4wa2ETRWFVJGabYynBWxIijOswSmOw== +"@jsonjoy.com/fs-core@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-core/-/fs-core-4.57.1.tgz#03c0d7a7bf96030376f7194b9c5c815cb7bf71d7" + integrity sha512-YrEi/ZPmgc+GfdO0esBF04qv8boK9Dg9WpRQw/+vM8Qt3nnVIJWIa8HwZ/LXVZ0DB11XUROM8El/7yYTJX+WtA== dependencies: - "@jsonjoy.com/fs-node-builtins" "4.56.10" - "@jsonjoy.com/fs-node-utils" "4.56.10" + "@jsonjoy.com/fs-node-builtins" "4.57.1" + "@jsonjoy.com/fs-node-utils" "4.57.1" thingies "^2.5.0" -"@jsonjoy.com/fs-fsa@4.56.10": - version "4.56.10" - resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-fsa/-/fs-fsa-4.56.10.tgz#02bac88c4968ddf2effbd7452861aaed60ba3557" - integrity sha512-/FVK63ysNzTPOnCCcPoPHt77TOmachdMS422txM4KhxddLdbW1fIbFMYH0AM0ow/YchCyS5gqEjKLNyv71j/5Q== +"@jsonjoy.com/fs-fsa@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-fsa/-/fs-fsa-4.57.1.tgz#87ffa6cd695b363b58b9ccddc87a66212a1b25fd" + integrity sha512-ooEPvSW/HQDivPDPZMibHGKZf/QS4WRir1czGZmXmp3MsQqLECZEpN0JobrD8iV9BzsuwdIv+PxtWX9WpPLsIA== dependencies: - "@jsonjoy.com/fs-core" "4.56.10" - "@jsonjoy.com/fs-node-builtins" "4.56.10" - "@jsonjoy.com/fs-node-utils" "4.56.10" + "@jsonjoy.com/fs-core" "4.57.1" + "@jsonjoy.com/fs-node-builtins" "4.57.1" + "@jsonjoy.com/fs-node-utils" "4.57.1" thingies "^2.5.0" -"@jsonjoy.com/fs-node-builtins@4.56.10": - version "4.56.10" - resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.56.10.tgz#a32a5bcb093f8b34a99aa8957e993a52ec316662" - integrity sha512-uUnKz8R0YJyKq5jXpZtkGV9U0pJDt8hmYcLRrPjROheIfjMXsz82kXMgAA/qNg0wrZ1Kv+hrg7azqEZx6XZCVw== - -"@jsonjoy.com/fs-node-to-fsa@4.56.10": - version "4.56.10" - resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.56.10.tgz#33fc503e50d283ac5fc510e3accced7fccecf2f4" - integrity sha512-oH+O6Y4lhn9NyG6aEoFwIBNKZeYy66toP5LJcDOMBgL99BKQMUf/zWJspdRhMdn/3hbzQsZ8EHHsuekbFLGUWw== - dependencies: - "@jsonjoy.com/fs-fsa" "4.56.10" - "@jsonjoy.com/fs-node-builtins" "4.56.10" - "@jsonjoy.com/fs-node-utils" "4.56.10" - -"@jsonjoy.com/fs-node-utils@4.56.10": - version "4.56.10" - resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.56.10.tgz#788e95052aa99744f6e8e55b5098afc203df2b9e" - integrity sha512-8EuPBgVI2aDPwFdaNQeNpHsyqPi3rr+85tMNG/lHvQLiVjzoZsvxA//Xd8aB567LUhy4QS03ptT+unkD/DIsNg== - dependencies: - "@jsonjoy.com/fs-node-builtins" "4.56.10" - -"@jsonjoy.com/fs-node@4.56.10": - version "4.56.10" - resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node/-/fs-node-4.56.10.tgz#70b18bfaf14544a9820d2016e913dde12c6de991" - integrity sha512-7R4Gv3tkUdW3dXfXiOkqxkElxKNVdd8BDOWC0/dbERd0pXpPY+s2s1Mino+aTvkGrFPiY+mmVxA7zhskm4Ue4Q== - dependencies: - "@jsonjoy.com/fs-core" "4.56.10" - "@jsonjoy.com/fs-node-builtins" "4.56.10" - "@jsonjoy.com/fs-node-utils" "4.56.10" - "@jsonjoy.com/fs-print" "4.56.10" - "@jsonjoy.com/fs-snapshot" "4.56.10" +"@jsonjoy.com/fs-node-builtins@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.57.1.tgz#a6793654d6ffaead81f040e3becc063a265deb7c" + integrity sha512-XHkFKQ5GSH3uxm8c3ZYXVrexGdscpWKIcMWKFQpMpMJc8gA3AwOMBJXJlgpdJqmrhPyQXxaY9nbkNeYpacC0Og== + +"@jsonjoy.com/fs-node-to-fsa@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.57.1.tgz#9011872df67ac302f0b0f7fd13502993a026c306" + integrity sha512-pqGHyWWzNck4jRfaGV39hkqpY5QjRUQ/nRbNT7FYbBa0xf4bDG+TE1Gt2KWZrSkrkZZDE3qZUjYMbjwSliX6pg== + dependencies: + "@jsonjoy.com/fs-fsa" "4.57.1" + "@jsonjoy.com/fs-node-builtins" "4.57.1" + "@jsonjoy.com/fs-node-utils" "4.57.1" + +"@jsonjoy.com/fs-node-utils@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.57.1.tgz#e9d030b676f7f4074eb90a42927bac708dc4312c" + integrity sha512-vp+7ZzIB8v43G+GLXTS4oDUSQmhAsRz532QmmWBbdYA20s465JvwhkSFvX9cVTqRRAQg+vZ7zWDaIEh0lFe2gw== + dependencies: + "@jsonjoy.com/fs-node-builtins" "4.57.1" + +"@jsonjoy.com/fs-node@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node/-/fs-node-4.57.1.tgz#3dae969fe02d9450f5dfc7c12bfe3b859cb1038e" + integrity sha512-3YaKhP8gXEKN+2O49GLNfNb5l2gbnCFHyAaybbA2JkkbQP3dpdef7WcUaHAulg/c5Dg4VncHsA3NWAUSZMR5KQ== + dependencies: + "@jsonjoy.com/fs-core" "4.57.1" + "@jsonjoy.com/fs-node-builtins" "4.57.1" + "@jsonjoy.com/fs-node-utils" "4.57.1" + "@jsonjoy.com/fs-print" "4.57.1" + "@jsonjoy.com/fs-snapshot" "4.57.1" glob-to-regex.js "^1.0.0" thingies "^2.5.0" -"@jsonjoy.com/fs-print@4.56.10": - version "4.56.10" - resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-print/-/fs-print-4.56.10.tgz#7c181b9aefcc1b268be0e6233bff26310c355335" - integrity sha512-JW4fp5mAYepzFsSGrQ48ep8FXxpg4niFWHdF78wDrFGof7F3tKDJln72QFDEn/27M1yHd4v7sKHHVPh78aWcEw== +"@jsonjoy.com/fs-print@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-print/-/fs-print-4.57.1.tgz#59359be175145cd44e83f7cdfba06cb1fed23313" + integrity sha512-Ynct7ZJmfk6qoXDOKfpovNA36ITUx8rChLmRQtW08J73VOiuNsU8PB6d/Xs7fxJC2ohWR3a5AqyjmLojfrw5yw== dependencies: - "@jsonjoy.com/fs-node-utils" "4.56.10" + "@jsonjoy.com/fs-node-utils" "4.57.1" tree-dump "^1.1.0" -"@jsonjoy.com/fs-snapshot@4.56.10": - version "4.56.10" - resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.56.10.tgz#05aadd2c0eaa855b13d6cb17d29b7c8cee239c8c" - integrity sha512-DkR6l5fj7+qj0+fVKm/OOXMGfDFCGXLfyHkORH3DF8hxkpDgIHbhf/DwncBMs2igu/ST7OEkexn1gIqoU6Y+9g== +"@jsonjoy.com/fs-snapshot@4.57.1": + version "4.57.1" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.57.1.tgz#54cd9073a97e290a1650070f2ee9529a0accdb93" + integrity sha512-/oG8xBNFMbDXTq9J7vepSA1kerS5vpgd3p5QZSPd+nX59uwodGJftI51gDYyHRpP57P3WCQf7LHtBYPqwUg2Bg== dependencies: "@jsonjoy.com/buffers" "^17.65.0" - "@jsonjoy.com/fs-node-utils" "4.56.10" + "@jsonjoy.com/fs-node-utils" "4.57.1" "@jsonjoy.com/json-pack" "^17.65.0" "@jsonjoy.com/util" "^17.65.0" @@ -2640,9 +2629,9 @@ source-map "^0.7.3" "@preact/signals-core@^1.7.0": - version "1.13.0" - resolved "https://registry.yarnpkg.com/@preact/signals-core/-/signals-core-1.13.0.tgz#ed770df2855701e7b42828fae5a348edeee9a3df" - integrity sha512-slT6XeTCAbdql61GVLlGU4x7XHI7kCZV5Um5uhE4zLX4ApgiiXc0UYFvVOKq06xcovzp7p+61l68oPi563ARKg== + version "1.14.0" + resolved "https://registry.yarnpkg.com/@preact/signals-core/-/signals-core-1.14.0.tgz#3a13742301a94161790e84d0f2cbf9b5455593f7" + integrity sha512-AowtCcCU/33lFlh1zRFf/u+12rfrhtNakj7UpaGEsmMwUKpKWMVvcktOGcwBBNiB4lWrZWc01LhiyyzVklJyaQ== "@preact/signals@^1.3.1": version "1.3.4" @@ -3421,30 +3410,30 @@ integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== "@types/node@*": - version "25.3.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-25.3.2.tgz#cbc4b963e1b3503eb2bcf7c55bf48c95204918d1" - integrity sha512-RpV6r/ij22zRRdyBPcxDeKAzH43phWVKEjL2iksqo1Vz3CuBUrgmPpPhALKiRfU7OMCmeeO9vECBMsV0hMTG8Q== + version "25.5.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-25.5.0.tgz#5c99f37c443d9ccc4985866913f1ed364217da31" + integrity sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw== dependencies: undici-types "~7.18.0" "@types/node@^20.17.9": - version "20.19.35" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.19.35.tgz#117b373fd1dff528b2f9f8c2d1a85de6af8101ca" - integrity sha512-Uarfe6J91b9HAUXxjvSOdiO2UPOKLm07Q1oh0JHxoZ1y8HoqxDAu3gVrsrOHeiio0kSsoVBt4wFrKOm0dKxVPQ== + version "20.19.37" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.19.37.tgz#b4fb4033408dd97becce63ec932c9ec57a9e2919" + integrity sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw== dependencies: undici-types "~6.21.0" "@types/node@^24.9.0": - version "24.10.15" - resolved "https://registry.yarnpkg.com/@types/node/-/node-24.10.15.tgz#83e016a4c3dbf4e672dc257cf4c941527f1a3aa3" - integrity sha512-BgjLoRuSr0MTI5wA6gMw9Xy0sFudAaUuvrnjgGx9wZ522fYYLA5SYJ+1Y30vTcJEG+DRCyDHx/gzQVfofYzSdg== + version "24.12.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-24.12.0.tgz#6222e028210e5322e4f4f6767f8d88e5ea3b33d2" + integrity sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ== dependencies: undici-types "~7.16.0" "@types/qs@*": - version "6.14.0" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.14.0.tgz#d8b60cecf62f2db0fb68e5e006077b9178b85de5" - integrity sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ== + version "6.15.0" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.15.0.tgz#963ab61779843fe910639a50661b48f162bc7f79" + integrity sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow== "@types/range-parser@*": version "1.2.7" @@ -3586,7 +3575,7 @@ dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@8.57.2": +"@typescript-eslint/eslint-plugin@8.57.2", "@typescript-eslint/eslint-plugin@^8.36.0": version "8.57.2" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.2.tgz#ad0dcefeca9c2ecbe09f730d478063666aee010b" integrity sha512-NZZgp0Fm2IkD+La5PR81sd+g+8oS6JwJje+aRWsDocxHkjyRw0J5L5ZTlN3LI1LlOcGL7ph3eaIUmTXMIjLk0w== @@ -3600,21 +3589,7 @@ natural-compare "^1.4.0" ts-api-utils "^2.4.0" -"@typescript-eslint/eslint-plugin@^8.36.0": - version "8.56.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.1.tgz#b1ce606d87221daec571e293009675992f0aae76" - integrity sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A== - dependencies: - "@eslint-community/regexpp" "^4.12.2" - "@typescript-eslint/scope-manager" "8.56.1" - "@typescript-eslint/type-utils" "8.56.1" - "@typescript-eslint/utils" "8.56.1" - "@typescript-eslint/visitor-keys" "8.56.1" - ignore "^7.0.5" - natural-compare "^1.4.0" - ts-api-utils "^2.4.0" - -"@typescript-eslint/parser@8.57.2": +"@typescript-eslint/parser@8.57.2", "@typescript-eslint/parser@^8.36.0": version "8.57.2" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.57.2.tgz#b819955e39f976c0d4f95b5ed67fe22f85cd6898" integrity sha512-30ScMRHIAD33JJQkgfGW1t8CURZtjc2JpTrq5n2HFhOefbAhb7ucc7xJwdWcrEtqUIYJ73Nybpsggii6GtAHjA== @@ -3625,26 +3600,6 @@ "@typescript-eslint/visitor-keys" "8.57.2" debug "^4.4.3" -"@typescript-eslint/parser@^8.36.0": - version "8.56.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.56.1.tgz#21d13b3d456ffb08614c1d68bb9a4f8d9237cdc7" - integrity sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg== - dependencies: - "@typescript-eslint/scope-manager" "8.56.1" - "@typescript-eslint/types" "8.56.1" - "@typescript-eslint/typescript-estree" "8.56.1" - "@typescript-eslint/visitor-keys" "8.56.1" - debug "^4.4.3" - -"@typescript-eslint/project-service@8.56.1": - version "8.56.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.56.1.tgz#65c8d645f028b927bfc4928593b54e2ecd809244" - integrity sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ== - dependencies: - "@typescript-eslint/tsconfig-utils" "^8.56.1" - "@typescript-eslint/types" "^8.56.1" - debug "^4.4.3" - "@typescript-eslint/project-service@8.57.2": version "8.57.2" resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.57.2.tgz#dfbc7777f9f633f2b06b558cda3836e76f856e3c" @@ -3662,14 +3617,6 @@ "@typescript-eslint/types" "7.18.0" "@typescript-eslint/visitor-keys" "7.18.0" -"@typescript-eslint/scope-manager@8.56.1": - version "8.56.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.56.1.tgz#254df93b5789a871351335dd23e20bc164060f24" - integrity sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w== - dependencies: - "@typescript-eslint/types" "8.56.1" - "@typescript-eslint/visitor-keys" "8.56.1" - "@typescript-eslint/scope-manager@8.57.2": version "8.57.2" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.57.2.tgz#734dcde40677f430b5d963108337295bdbc09dae" @@ -3678,27 +3625,11 @@ "@typescript-eslint/types" "8.57.2" "@typescript-eslint/visitor-keys" "8.57.2" -"@typescript-eslint/tsconfig-utils@8.56.1", "@typescript-eslint/tsconfig-utils@^8.56.1": - version "8.56.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz#1afa830b0fada5865ddcabdc993b790114a879b7" - integrity sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ== - "@typescript-eslint/tsconfig-utils@8.57.2", "@typescript-eslint/tsconfig-utils@^8.57.2": version "8.57.2" resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.2.tgz#cf82dc11e884103ec13188a7352591efaa1a887e" integrity sha512-3Lm5DSM+DCowsUOJC+YqHHnKEfFh5CoGkj5Z31NQSNF4l5wdOwqGn99wmwN/LImhfY3KJnmordBq/4+VDe2eKw== -"@typescript-eslint/type-utils@8.56.1": - version "8.56.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.56.1.tgz#7a6c4fabf225d674644931e004302cbbdd2f2e24" - integrity sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg== - dependencies: - "@typescript-eslint/types" "8.56.1" - "@typescript-eslint/typescript-estree" "8.56.1" - "@typescript-eslint/utils" "8.56.1" - debug "^4.4.3" - ts-api-utils "^2.4.0" - "@typescript-eslint/type-utils@8.57.2": version "8.57.2" resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.57.2.tgz#3ec65a94e73776252991a3cf0a15d220734c28f5" @@ -3715,11 +3646,6 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9" integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== -"@typescript-eslint/types@8.56.1", "@typescript-eslint/types@^8.56.1": - version "8.56.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.56.1.tgz#975e5942bf54895291337c91b9191f6eb0632ab9" - integrity sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw== - "@typescript-eslint/types@8.57.2", "@typescript-eslint/types@^8.57.2": version "8.57.2" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.57.2.tgz#efe0da4c28b505ed458f113aa960dce2c5c671f4" @@ -3739,21 +3665,6 @@ semver "^7.6.0" ts-api-utils "^1.3.0" -"@typescript-eslint/typescript-estree@8.56.1": - version "8.56.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.1.tgz#3b9e57d8129a860c50864c42188f761bdef3eab0" - integrity sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg== - dependencies: - "@typescript-eslint/project-service" "8.56.1" - "@typescript-eslint/tsconfig-utils" "8.56.1" - "@typescript-eslint/types" "8.56.1" - "@typescript-eslint/visitor-keys" "8.56.1" - debug "^4.4.3" - minimatch "^10.2.2" - semver "^7.7.3" - tinyglobby "^0.2.15" - ts-api-utils "^2.4.0" - "@typescript-eslint/typescript-estree@8.57.2": version "8.57.2" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.2.tgz#432e61a6cf2ab565837da387e5262c159672abea" @@ -3769,17 +3680,7 @@ tinyglobby "^0.2.15" ts-api-utils "^2.4.0" -"@typescript-eslint/utils@8.56.1", "@typescript-eslint/utils@^8.0.0": - version "8.56.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.56.1.tgz#5a86acaf9f1b4c4a85a42effb217f73059f6deb7" - integrity sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA== - dependencies: - "@eslint-community/eslint-utils" "^4.9.1" - "@typescript-eslint/scope-manager" "8.56.1" - "@typescript-eslint/types" "8.56.1" - "@typescript-eslint/typescript-estree" "8.56.1" - -"@typescript-eslint/utils@8.57.2": +"@typescript-eslint/utils@8.57.2", "@typescript-eslint/utils@^8.0.0": version "8.57.2" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.57.2.tgz#46a8974c24326fb8899486728428a0f1a3115014" integrity sha512-krRIbvPK1ju1WBKIefiX+bngPs+odIQUtR7kymzPfo1POVw3jlF+nLkmexdSSd4UCbDcQn+wMBATOOmpBbqgKg== @@ -3807,14 +3708,6 @@ "@typescript-eslint/types" "7.18.0" eslint-visitor-keys "^3.4.3" -"@typescript-eslint/visitor-keys@8.56.1": - version "8.56.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.1.tgz#50e03475c33a42d123dc99e63acf1841c0231f87" - integrity sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw== - dependencies: - "@typescript-eslint/types" "8.56.1" - eslint-visitor-keys "^5.0.0" - "@typescript-eslint/visitor-keys@8.57.2": version "8.57.2" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.2.tgz#a5c9605774247336c0412beb7dc288ab2a07c11e" @@ -4528,12 +4421,12 @@ babel-plugin-module-resolver@5.0.3: resolve "^1.22.8" babel-plugin-polyfill-corejs2@^0.4.14, babel-plugin-polyfill-corejs2@^0.4.15: - version "0.4.15" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.15.tgz#808fa349686eea4741807cfaaa2aa3aa57ce120a" - integrity sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw== + version "0.4.17" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz#198f970f1c99a856b466d1187e88ce30bd199d91" + integrity sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w== dependencies: "@babel/compat-data" "^7.28.6" - "@babel/helper-define-polyfill-provider" "^0.6.6" + "@babel/helper-define-polyfill-provider" "^0.6.8" semver "^6.3.1" babel-plugin-polyfill-corejs3@^0.13.0: @@ -4545,19 +4438,19 @@ babel-plugin-polyfill-corejs3@^0.13.0: core-js-compat "^3.43.0" babel-plugin-polyfill-corejs3@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.0.tgz#65b06cda48d6e447e1e926681f5a247c6ae2b9cf" - integrity sha512-AvDcMxJ34W4Wgy4KBIIePQTAOP1Ie2WFwkQp3dB7FQ/f0lI5+nM96zUnYEOE1P9sEg0es5VCP0HxiWu5fUHZAQ== + version "0.14.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz#6ac08d2f312affb70c4c69c0fbba4cb417ee5587" + integrity sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g== dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.6" + "@babel/helper-define-polyfill-provider" "^0.6.8" core-js-compat "^3.48.0" babel-plugin-polyfill-regenerator@^0.6.5, babel-plugin-polyfill-regenerator@^0.6.6: - version "0.6.6" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.6.tgz#69f5dd263cab933c42fe5ea05e83443b374bd4bf" - integrity sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A== + version "0.6.8" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz#8a6bfd5dd54239362b3d06ce47ac52b2d95d7721" + integrity sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.6" + "@babel/helper-define-polyfill-provider" "^0.6.8" babel-plugin-react-compiler@1.0.0, babel-plugin-react-compiler@^1.0.0: version "1.0.0" @@ -4669,11 +4562,11 @@ balanced-match@^4.0.2: integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== barcode-detector@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/barcode-detector/-/barcode-detector-3.1.0.tgz#ce340cead9f267951f4c53887ac24b64c21a79c4" - integrity sha512-aQjGxrgsb/WTlw6pHZwFRO6NhFMhwHGEkd0pzV25fBn8dnRA1PA1G7bLeAzvSea646S/96nW5W3jD8wezQZ1vQ== + version "3.1.1" + resolved "https://registry.yarnpkg.com/barcode-detector/-/barcode-detector-3.1.1.tgz#4ce6ecab6eee237b53755269683309a28760c0d1" + integrity sha512-ghWlEAV93ZCUniO7Co3ih/01XPm+U30CV+NoPbO6Chj5lZzHydDAqKlrBEd+37TkoR+QTH3tnnwd8k8epGTfIg== dependencies: - zxing-wasm "3.0.0" + zxing-wasm "3.0.1" base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" @@ -4681,9 +4574,9 @@ base64-js@^1.3.1, base64-js@^1.5.1: integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== baseline-browser-mapping@^2.9.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz#5b09935025bf8a80e29130251e337c6a7fc8cbb9" - integrity sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA== + version "2.10.10" + resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.10.tgz#e74bd066724c1d8d7d8ea75fc3be25389a7a5c56" + integrity sha512-sUoJ3IMxx4AyRqO4MLeHlnGDkyXRoUG0/AI9fjK+vS72ekpV0yWVY7O0BVjmBcRtkNcsAO2QDZ4tdKKGoI6YaQ== batch@0.6.1: version "0.6.1" @@ -4713,9 +4606,9 @@ binary-extensions@^2.0.0: integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== bippy@^0.5.30: - version "0.5.30" - resolved "https://registry.yarnpkg.com/bippy/-/bippy-0.5.30.tgz#d8380ff49d9d778680e3321af828bc6c469b36a1" - integrity sha512-8CFmJAHD3gmTLDOCDHuWhjm1nxHSFZdlGoWtak9r53Uxn36ynOjxBLyxXHh/7h/XiKLyPvfdXa0gXWcD9o9lLQ== + version "0.5.32" + resolved "https://registry.yarnpkg.com/bippy/-/bippy-0.5.32.tgz#60cbed767572e7cecda2f7b7d860f7f0ae6b0874" + integrity sha512-yt1mC8eReTxjfg41YBZdN4PvsDwHFWxltoiQX0Q+Htlbf41aSniopb7ECZits01HwNAvXEh69RGk/ImlswDTEw== dependencies: "@types/react-reconciler" "^0.28.9" @@ -4821,9 +4714,9 @@ brace-expansion@^2.0.1, brace-expansion@^2.0.2: balanced-match "^1.0.0" brace-expansion@^5.0.2: - version "5.0.4" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.4.tgz#614daaecd0a688f660bbbc909a8748c3d80d4336" - integrity sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg== + version "5.0.5" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.5.tgz#dcc3a37116b79f3e1b46db994ced5d570e930fdb" + integrity sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ== dependencies: balanced-match "^4.0.2" @@ -4978,9 +4871,9 @@ camelcase@^6.2.0, camelcase@^6.3.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001759: - version "1.0.30001774" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001774.tgz#0e576b6f374063abcd499d202b9ba1301be29b70" - integrity sha512-DDdwPGz99nmIEv216hKSgLD+D4ikHQHjBC/seF98N9CPqRX4M5mSxT9eTV6oyisnJcuzxtZy4n17yKKQYmYQOA== + version "1.0.30001781" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001781.tgz#344b47c03eb8168b79c3c158b872bcfbdd02a400" + integrity sha512-RdwNCyMsNBftLjW6w01z8bKEvT6e/5tpPVEgtn22TiLGlstHOVecsX2KHFkD5e/vRnIE4EGzpuIODb3mtswtkw== chalk@^2.0.1, chalk@^2.4.2: version "2.4.2" @@ -5304,16 +5197,16 @@ cookie@~0.7.1: integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== core-js-compat@^3.43.0, core-js-compat@^3.48.0: - version "3.48.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.48.0.tgz#7efbe1fc1cbad44008190462217cc5558adaeaa6" - integrity sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q== + version "3.49.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.49.0.tgz#06145447d92f4aaf258a0c44f24b47afaeaffef6" + integrity sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA== dependencies: browserslist "^4.28.1" core-js-pure@^3.23.3: - version "3.48.0" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.48.0.tgz#7d5a3fe1ec3631b9aa76a81c843ac2ce918e5023" - integrity sha512-1slJgk89tWC51HQ1AEqG+s2VuwpTRr8ocu4n20QUcH1v9lAN0RXen0Q0AABa/DK1I7RrNWLucplOHMx8hfTGTw== + version "3.49.0" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.49.0.tgz#ff8436b7251a3832f5fdbbe3e10f7f2e58e51fb1" + integrity sha512-XM4RFka59xATyJv/cS3O3Kml72hQXUeGRuuTmMYFxwzc9/7C8OYTaIR/Ji+Yt8DXzsFLNhat15cE/JP15HrCgw== core-util-is@~1.0.0: version "1.0.3" @@ -5321,9 +5214,9 @@ core-util-is@~1.0.0: integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cosmiconfig@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" - integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== + version "9.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.1.tgz#df110631a8547b5d1a98915271986f06e3011379" + integrity sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ== dependencies: env-paths "^2.2.1" import-fresh "^3.3.0" @@ -5450,9 +5343,9 @@ date-fns@4.1.0: integrity sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg== dayjs@^1.8.15: - version "1.11.19" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.19.tgz#15dc98e854bb43917f12021806af897c58ae2938" - integrity sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw== + version "1.11.20" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.20.tgz#88d919fd639dc991415da5f4cb6f1b6650811938" + integrity sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ== debug@2.6.9, debug@^2.2.0, debug@^2.6.9: version "2.6.9" @@ -5630,9 +5523,9 @@ dns-packet@^5.2.2: "@leichtgewicht/ip-codec" "^2.0.1" dnssd-advertise@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/dnssd-advertise/-/dnssd-advertise-1.1.3.tgz#bf130e5b22f2d76b2b6b33b201e93c68c75b3786" - integrity sha512-XENsHi3MBzWOCAXif3yZvU1Ah0l+nhJj1sjWL6TnOAYKvGiFhbTx32xHN7+wLMLUOCj7Nr0evADWG4R8JtqCDA== + version "1.1.4" + resolved "https://registry.yarnpkg.com/dnssd-advertise/-/dnssd-advertise-1.1.4.tgz#0744865a4fa2569a44dcb9aff267022aaf2803b2" + integrity sha512-AmGyK9WpNf06WeP5TjHZq/wNzP76OuEeaiTlKr9E/EEelYLczywUKoqRz+DPRq/ErssjT4lU+/W7wzJW+7K/ZA== doctrine@^2.1.0: version "2.1.0" @@ -5716,9 +5609,9 @@ electron-positioner@^4.1.0: integrity sha512-726DfbI9ZNoCg+Fcu6XLuTKTnzf+6nFqv7h+K/V6Ug7IbaPMI7s9S8URnGtWFCy5N5PL4HSzRFF2mXuinftDdg== electron-to-chromium@^1.5.263: - version "1.5.302" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz#032a5802b31f7119269959c69fe2015d8dad5edb" - integrity sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg== + version "1.5.322" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.322.tgz#9c24e49f7098ca19bc87c0e9c7e0ad6ffe4fddca" + integrity sha512-vFU34OcrvMcH66T+dYC3G4nURmgfDVewMIu6Q2urXpumAPSMmzvcn04KVVV8Opikq8Vs5nUbO/8laNhNRqSzYw== electron@41.0.3: version "41.0.3" @@ -5777,9 +5670,9 @@ end-of-stream@^1.1.0: once "^1.4.0" enhanced-resolve@^5.20.0: - version "5.20.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.20.0.tgz#323c2a70d2aa7fb4bdfd6d3c24dfc705c581295d" - integrity sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ== + version "5.20.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz#eeeb3966bea62c348c40a0cc9e7912e2557d0be0" + integrity sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA== dependencies: graceful-fs "^4.2.4" tapable "^2.3.0" @@ -5907,9 +5800,9 @@ es-errors@^1.3.0: integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== es-iterator-helpers@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz#d979a9f686e2b0b72f88dbead7229924544720bc" - integrity sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w== + version "1.3.1" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.3.1.tgz#3be0f4e63438d6c5a1fb5f33b891aaad3f7dae06" + integrity sha512-zWwRvqWiuBPr0muUG/78cW3aHROFCNIQ3zpmYDpwdbnt2m+xlNyRWpHBpa2lJjSBit7BQ+RXA1iwbSmu5yJ/EQ== dependencies: call-bind "^1.0.8" call-bound "^1.0.4" @@ -5926,6 +5819,7 @@ es-iterator-helpers@^1.2.1: has-symbols "^1.1.0" internal-slot "^1.1.0" iterator.prototype "^1.1.5" + math-intrinsics "^1.1.0" safe-array-concat "^1.1.3" es-module-lexer@^2.0.0: @@ -6059,9 +5953,9 @@ eslint-plugin-ft-flow@^2.0.1: string-natural-compare "^3.0.1" eslint-plugin-jest@^29.0.1: - version "29.15.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-29.15.0.tgz#58a5917a88244f7536ae10c68b5bd58d407896f0" - integrity sha512-ZCGr7vTH2WSo2hrK5oM2RULFmMruQ7W3cX7YfwoTiPfzTGTFBMmrVIz45jZHd++cGKj/kWf02li/RhTGcANJSA== + version "29.15.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-29.15.1.tgz#f663f9f7903a7181efddea5a92d1d31e66362596" + integrity sha512-6BjyErCQauz3zfJvzLw/kAez2lf4LEpbHLvWBfEcG4EI0ZiRSwjoH2uZulMouU8kRkBH+S0rhqn11IhTvxKgKw== dependencies: "@typescript-eslint/utils" "^8.0.0" @@ -6579,18 +6473,21 @@ fast-uri@^3.0.1: resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.0.tgz#66eecff6c764c0df9b762e62ca7edcfb53b4edfa" integrity sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA== -fast-xml-builder@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fast-xml-builder/-/fast-xml-builder-1.0.0.tgz#a485d7e8381f1db983cf006f849d1066e2935241" - integrity sha512-fpZuDogrAgnyt9oDDz+5DBz0zgPdPZz6D4IR7iESxRXElrlGTRkHJ9eEt+SACRJwT0FNFrt71DFQIUFBJfX/uQ== +fast-xml-builder@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/fast-xml-builder/-/fast-xml-builder-1.1.4.tgz#0c407a1d9d5996336c0cd76f7ff785cac6413017" + integrity sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg== + dependencies: + path-expression-matcher "^1.1.3" fast-xml-parser@^5.3.6: - version "5.4.1" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.4.1.tgz#0c81b8ecfb3021e5ad83aa3df904af19a05bc601" - integrity sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A== + version "5.5.9" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.5.9.tgz#e59637abebec3dbfbb4053b532d787af6ea11527" + integrity sha512-jldvxr1MC6rtiZKgrFnDSvT8xuH+eJqxqOBThUVjYrxssYTo1avZLGql5l0a0BAERR01CadYzZ83kVEkbyDg+g== dependencies: - fast-xml-builder "^1.0.0" - strnum "^2.1.2" + fast-xml-builder "^1.1.4" + path-expression-matcher "^1.2.0" + strnum "^2.2.2" fastest-levenshtein@^1.0.12: version "1.0.16" @@ -6654,9 +6551,9 @@ fdir@^6.5.0: integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== fetch-nodeshim@^0.4.6: - version "0.4.8" - resolved "https://registry.yarnpkg.com/fetch-nodeshim/-/fetch-nodeshim-0.4.8.tgz#e87df7d8f85c6409903dac402aaf9465e36b5165" - integrity sha512-YW5vG33rabBq6JpYosLNoXoaMN69/WH26MeeX2hkDVjN6UlvRGq3Wkazl9H0kisH95aMu/HtHL64JUvv/+Nv/g== + version "0.4.9" + resolved "https://registry.yarnpkg.com/fetch-nodeshim/-/fetch-nodeshim-0.4.9.tgz#e2688d8df2de3d4e4ead5b9f6f52fe407a88f0ce" + integrity sha512-XIQWlB2A4RZ7NebXWGxS0uDMdvRHkiUDTghBVJKFg9yEOd45w/PP8cZANuPf2H08W6Cor3+2n7Q6TTZgAS3Fkw== file-entry-cache@^8.0.0: version "8.0.0" @@ -6773,9 +6670,9 @@ flat@^5.0.2: integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== flatted@^3.2.9: - version "3.3.3" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" - integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== + version "3.4.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.4.2.tgz#f5c23c107f0f37de8dbdf24f13722b3b98d52726" + integrity sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA== flora-colossus@^3.0.2: version "3.0.2" @@ -6806,7 +6703,7 @@ for-each@^0.3.3, for-each@^0.3.5: dependencies: is-callable "^1.2.7" -foreground-child@^3.1.0, foreground-child@^3.3.1: +foreground-child@^3.1.0: version "3.3.1" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== @@ -7034,19 +6931,7 @@ glob@^10.5.0: package-json-from-dist "^1.0.0" path-scurry "^1.11.1" -glob@^11.0.1: - version "11.1.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-11.1.0.tgz#4f826576e4eb99c7dad383793d2f9f08f67e50a6" - integrity sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw== - dependencies: - foreground-child "^3.3.1" - jackspeak "^4.1.1" - minimatch "^10.1.1" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^2.0.0" - -glob@^13.0.0, glob@^13.0.3: +glob@^13.0.0, glob@^13.0.2, glob@^13.0.3: version "13.0.6" resolved "https://registry.yarnpkg.com/glob/-/glob-13.0.6.tgz#078666566a425147ccacfbd2e332deb66a2be71d" integrity sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw== @@ -7994,13 +7879,6 @@ jackspeak@^3.1.2: optionalDependencies: "@pkgjs/parseargs" "^0.11.0" -jackspeak@^4.1.1: - version "4.2.3" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-4.2.3.tgz#27ef80f33b93412037c3bea4f8eddf80e1931483" - integrity sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg== - dependencies: - "@isaacs/cliui" "^9.0.0" - jest-changed-files@30.3.0: version "30.3.0" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-30.3.0.tgz#055849df695f9a9fcde0ae44024f815bbc627f3a" @@ -8664,9 +8542,9 @@ lan-network@^0.2.0: integrity sha512-EZgbsXMrGS+oK+Ta12mCjzBFse+SIewGdwrSTr5g+MSymnjpox2x05ceI20PQejJOFvOgzcXrfDk/SdY7dSCtw== launch-editor@^2.6.1, launch-editor@^2.9.1: - version "2.13.1" - resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.13.1.tgz#d96ae376a282011661a112479a4bc2b8c1d914be" - integrity sha512-lPSddlAAluRKJ7/cjRFoXUFzaX7q/YKI7yPHuEvSJVqoXvFnJov1/Ud87Aa4zULIbA9Nja4mSPK8l0z/7eV2wA== + version "2.13.2" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.13.2.tgz#41d51baaf8afb393224b89bd2bcb4e02f2306405" + integrity sha512-4VVDnbOpLXy/s8rdRCSXb+zfMeFR0WlJWpET1iA9CQdlZDfwyLjUuGQzXU4VeOoey6AicSAluWan7Etga6Kcmg== dependencies: picocolors "^1.1.1" shell-quote "^1.8.3" @@ -8692,79 +8570,79 @@ lighthouse-logger@^1.0.0: debug "^2.6.9" marky "^1.2.2" -lightningcss-android-arm64@1.31.1: - version "1.31.1" - resolved "https://registry.yarnpkg.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz#609ff48332adff452a8157a7c2842fd692a8eac4" - integrity sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg== - -lightningcss-darwin-arm64@1.31.1: - version "1.31.1" - resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz#a13da040a7929582bab3ace9a67bdc146e99fc2d" - integrity sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg== - -lightningcss-darwin-x64@1.31.1: - version "1.31.1" - resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz#f7482c311273571ec0c2bd8277c1f5f6e90e03a4" - integrity sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA== - -lightningcss-freebsd-x64@1.31.1: - version "1.31.1" - resolved "https://registry.yarnpkg.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz#91df1bb290f1cb7bb2af832d7d0d8809225e0124" - integrity sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A== - -lightningcss-linux-arm-gnueabihf@1.31.1: - version "1.31.1" - resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz#c3cad5ae8b70045f21600dc95295ab6166acf57e" - integrity sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g== - -lightningcss-linux-arm64-gnu@1.31.1: - version "1.31.1" - resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz#a5c4f6a5ac77447093f61b209c0bd7fef1f0a3e3" - integrity sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg== - -lightningcss-linux-arm64-musl@1.31.1: - version "1.31.1" - resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz#af26ab8f829b727ada0a200938a6c8796ff36900" - integrity sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg== - -lightningcss-linux-x64-gnu@1.31.1: - version "1.31.1" - resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz#a891d44e84b71c0d88959feb9a7522bbf61450ee" - integrity sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA== - -lightningcss-linux-x64-musl@1.31.1: - version "1.31.1" - resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz#8c8b21def851f4d477fa897b80cb3db2b650bc6e" - integrity sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA== - -lightningcss-win32-arm64-msvc@1.31.1: - version "1.31.1" - resolved "https://registry.yarnpkg.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz#79000fb8c57e94a91b8fc643e74d5a54407d7080" - integrity sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w== - -lightningcss-win32-x64-msvc@1.31.1: - version "1.31.1" - resolved "https://registry.yarnpkg.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz#7f025274c81c7d659829731e09c8b6f442209837" - integrity sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw== +lightningcss-android-arm64@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz#f033885116dfefd9c6f54787523e3514b61e1968" + integrity sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg== + +lightningcss-darwin-arm64@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz#50b71871b01c8199584b649e292547faea7af9b5" + integrity sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ== + +lightningcss-darwin-x64@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz#35f3e97332d130b9ca181e11b568ded6aebc6d5e" + integrity sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w== + +lightningcss-freebsd-x64@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz#9777a76472b64ed6ff94342ad64c7bafd794a575" + integrity sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig== + +lightningcss-linux-arm-gnueabihf@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz#13ae652e1ab73b9135d7b7da172f666c410ad53d" + integrity sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw== + +lightningcss-linux-arm64-gnu@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz#417858795a94592f680123a1b1f9da8a0e1ef335" + integrity sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ== + +lightningcss-linux-arm64-musl@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz#6be36692e810b718040802fd809623cffe732133" + integrity sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg== + +lightningcss-linux-x64-gnu@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz#0b7803af4eb21cfd38dd39fe2abbb53c7dd091f6" + integrity sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA== + +lightningcss-linux-x64-musl@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz#88dc8ba865ddddb1ac5ef04b0f161804418c163b" + integrity sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg== + +lightningcss-win32-arm64-msvc@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz#4f30ba3fa5e925f5b79f945e8cc0d176c3b1ab38" + integrity sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw== + +lightningcss-win32-x64-msvc@1.32.0: + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz#141aa5605645064928902bb4af045fa7d9f4220a" + integrity sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q== lightningcss@^1.30.1: - version "1.31.1" - resolved "https://registry.yarnpkg.com/lightningcss/-/lightningcss-1.31.1.tgz#1a19dd327b547a7eda1d5c296ebe1e72df5a184b" - integrity sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ== + version "1.32.0" + resolved "https://registry.yarnpkg.com/lightningcss/-/lightningcss-1.32.0.tgz#b85aae96486dcb1bf49a7c8571221273f4f1e4a9" + integrity sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ== dependencies: detect-libc "^2.0.3" optionalDependencies: - lightningcss-android-arm64 "1.31.1" - lightningcss-darwin-arm64 "1.31.1" - lightningcss-darwin-x64 "1.31.1" - lightningcss-freebsd-x64 "1.31.1" - lightningcss-linux-arm-gnueabihf "1.31.1" - lightningcss-linux-arm64-gnu "1.31.1" - lightningcss-linux-arm64-musl "1.31.1" - lightningcss-linux-x64-gnu "1.31.1" - lightningcss-linux-x64-musl "1.31.1" - lightningcss-win32-arm64-msvc "1.31.1" - lightningcss-win32-x64-msvc "1.31.1" + lightningcss-android-arm64 "1.32.0" + lightningcss-darwin-arm64 "1.32.0" + lightningcss-darwin-x64 "1.32.0" + lightningcss-freebsd-x64 "1.32.0" + lightningcss-linux-arm-gnueabihf "1.32.0" + lightningcss-linux-arm64-gnu "1.32.0" + lightningcss-linux-arm64-musl "1.32.0" + lightningcss-linux-x64-gnu "1.32.0" + lightningcss-linux-x64-musl "1.32.0" + lightningcss-win32-arm64-msvc "1.32.0" + lightningcss-win32-x64-msvc "1.32.0" lines-and-columns@^1.1.6: version "1.2.4" @@ -8914,9 +8792,9 @@ lru-cache@^10.0.1, lru-cache@^10.2.0, lru-cache@^10.4.3: integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== lru-cache@^11.0.0: - version "11.2.6" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.2.6.tgz#356bf8a29e88a7a2945507b31f6429a65a192c58" - integrity sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ== + version "11.2.7" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.2.7.tgz#9127402617f34cd6767b96daee98c28e74458d35" + integrity sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA== lru-cache@^5.1.1: version "5.1.1" @@ -8972,18 +8850,18 @@ media-typer@^1.1.0: integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== memfs@^4.43.1: - version "4.56.10" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-4.56.10.tgz#eaf2f6556db10f91f1e9ad9f1274fd988c646202" - integrity sha512-eLvzyrwqLHnLYalJP7YZ3wBe79MXktMdfQbvMrVD80K+NhrIukCVBvgP30zTJYEEDh9hZ/ep9z0KOdD7FSHo7w== - dependencies: - "@jsonjoy.com/fs-core" "4.56.10" - "@jsonjoy.com/fs-fsa" "4.56.10" - "@jsonjoy.com/fs-node" "4.56.10" - "@jsonjoy.com/fs-node-builtins" "4.56.10" - "@jsonjoy.com/fs-node-to-fsa" "4.56.10" - "@jsonjoy.com/fs-node-utils" "4.56.10" - "@jsonjoy.com/fs-print" "4.56.10" - "@jsonjoy.com/fs-snapshot" "4.56.10" + version "4.57.1" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-4.57.1.tgz#5ccee42e2aab1cf086c45baf9c4ef1ff4fffb123" + integrity sha512-WvzrWPwMQT+PtbX2Et64R4qXKK0fj/8pO85MrUCzymX3twwCiJCdvntW3HdhG1teLJcHDDLIKx5+c3HckWYZtQ== + dependencies: + "@jsonjoy.com/fs-core" "4.57.1" + "@jsonjoy.com/fs-fsa" "4.57.1" + "@jsonjoy.com/fs-node" "4.57.1" + "@jsonjoy.com/fs-node-builtins" "4.57.1" + "@jsonjoy.com/fs-node-to-fsa" "4.57.1" + "@jsonjoy.com/fs-node-utils" "4.57.1" + "@jsonjoy.com/fs-print" "4.57.1" + "@jsonjoy.com/fs-snapshot" "4.57.1" "@jsonjoy.com/json-pack" "^1.11.0" "@jsonjoy.com/util" "^1.9.0" glob-to-regex.js "^1.0.1" @@ -9038,10 +8916,10 @@ metro-babel-transformer@0.83.3: hermes-parser "0.32.0" nullthrows "^1.1.1" -metro-babel-transformer@0.83.4: - version "0.83.4" - resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.83.4.tgz#9a4068c1a4ba40c073ee7830b19ed87d3ed1557e" - integrity sha512-xfNtsYIigybqm9xVL3ygTYYNFyYTMf2lGg/Wt+znVGtwcjXoRPG80WlL5SS09ZjYVei3MoE920i7MNr7ukSULA== +metro-babel-transformer@0.83.5: + version "0.83.5" + resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.83.5.tgz#91f3fa269171ad5189ebba625f1f0aa124ce06ea" + integrity sha512-d9FfmgUEVejTiSb7bkQeLRGl6aeno2UpuPm3bo3rCYwxewj03ymvOn8s8vnS4fBqAPQ+cE9iQM40wh7nGXR+eA== dependencies: "@babel/core" "^7.25.2" flow-enums-runtime "^0.0.6" @@ -9055,10 +8933,10 @@ metro-cache-key@0.83.3: dependencies: flow-enums-runtime "^0.0.6" -metro-cache-key@0.83.4: - version "0.83.4" - resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.83.4.tgz#eb70beab737782bf36eb145a30c2e97e20de52e8" - integrity sha512-Y8E6mm1alkYIRzmfkOdrwXMzJ4HKANYiZE7J2d3iYTwmnLIQG+aoIpvla+bo6LRxH1Gm3qjEiOl+LbxvPCzIug== +metro-cache-key@0.83.5: + version "0.83.5" + resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.83.5.tgz#96896a1768f0494a375e1d5957b7ad487e508a4c" + integrity sha512-Ycl8PBajB7bhbAI7Rt0xEyiF8oJ0RWX8EKkolV1KfCUlC++V/GStMSGpPLwnnBZXZWkCC5edBPzv1Hz1Yi0Euw== dependencies: flow-enums-runtime "^0.0.6" @@ -9072,15 +8950,15 @@ metro-cache@0.83.3: https-proxy-agent "^7.0.5" metro-core "0.83.3" -metro-cache@0.83.4: - version "0.83.4" - resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.83.4.tgz#d9ff274c053e1ffcbf42b49882af9473ac5f35fb" - integrity sha512-Pm6CiksVms0cZNDDe/nFzYr1xpXzJLOSwvOjl4b3cYtXxEFllEjD6EeBgoQK5C8yk7U54PcuRaUAFSvJ+eCKbg== +metro-cache@0.83.5: + version "0.83.5" + resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.83.5.tgz#5675f4ad56905aa78fff3dec1b6bf213e0b6c86d" + integrity sha512-oH+s4U+IfZyg8J42bne2Skc90rcuESIYf86dYittcdWQtPfcaFXWpByPyTuWk3rR1Zz3Eh5HOrcVImfEhhJLng== dependencies: exponential-backoff "^3.1.1" flow-enums-runtime "^0.0.6" https-proxy-agent "^7.0.5" - metro-core "0.83.4" + metro-core "0.83.5" metro-config@0.83.3: version "0.83.3" @@ -9096,18 +8974,18 @@ metro-config@0.83.3: metro-runtime "0.83.3" yaml "^2.6.1" -metro-config@0.83.4, metro-config@^0.83.3: - version "0.83.4" - resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.83.4.tgz#10c99df962cf3a1ab6ad86bcc697dfcac0a316af" - integrity sha512-ydOgMNI9aT8l2LOTOugt1FvC7getPKG9uJo9Vclg9/RWJxbwkBF/FMBm6w5gH8NwJokSmQrbNkojXPn7nm0kGw== +metro-config@0.83.5, metro-config@^0.83.3: + version "0.83.5" + resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.83.5.tgz#a3dd20fc5d5582aa4ad3704678e52abcf4d46b2b" + integrity sha512-JQ/PAASXH7yczgV6OCUSRhZYME+NU8NYjI2RcaG5ga4QfQ3T/XdiLzpSb3awWZYlDCcQb36l4Vl7i0Zw7/Tf9w== dependencies: connect "^3.6.5" flow-enums-runtime "^0.0.6" jest-validate "^29.7.0" - metro "0.83.4" - metro-cache "0.83.4" - metro-core "0.83.4" - metro-runtime "0.83.4" + metro "0.83.5" + metro-cache "0.83.5" + metro-core "0.83.5" + metro-runtime "0.83.5" yaml "^2.6.1" metro-core@0.83.3: @@ -9119,14 +8997,14 @@ metro-core@0.83.3: lodash.throttle "^4.1.1" metro-resolver "0.83.3" -metro-core@0.83.4, metro-core@^0.83.3: - version "0.83.4" - resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.83.4.tgz#06fd79d73935748317076aab24be0bb4cbaab801" - integrity sha512-EE+j/imryd3og/6Ly9usku9vcTLQr2o4IDax/izsr6b0HRqZK9k6f5SZkGkOPqnsACLq6csPCx+2JsgF9DkVbw== +metro-core@0.83.5, metro-core@^0.83.3: + version "0.83.5" + resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.83.5.tgz#1592033633034feb5d368d22bf18e38052146970" + integrity sha512-YcVcLCrf0ed4mdLa82Qob0VxYqfhmlRxUS8+TO4gosZo/gLwSvtdeOjc/Vt0pe/lvMNrBap9LlmvZM8FIsMgJQ== dependencies: flow-enums-runtime "^0.0.6" lodash.throttle "^4.1.1" - metro-resolver "0.83.4" + metro-resolver "0.83.5" metro-file-map@0.83.3: version "0.83.3" @@ -9143,10 +9021,10 @@ metro-file-map@0.83.3: nullthrows "^1.1.1" walker "^1.0.7" -metro-file-map@0.83.4: - version "0.83.4" - resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.83.4.tgz#f694f2e4950e64daff922b80d87e98731daa756b" - integrity sha512-RSZLpGQhW9topefjJ9dp77Ff7BP88b17sb/YjxLHC1/H0lJVYYC9Cgqua21Vxe4RUJK2z64hw72g+ySLGTCawA== +metro-file-map@0.83.5: + version "0.83.5" + resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.83.5.tgz#394aa61d54b3822f10e68c18cbd1318f18865d20" + integrity sha512-ZEt8s3a1cnYbn40nyCD+CsZdYSlwtFh2kFym4lo+uvfM+UMMH+r/BsrC6rbNClSrt+B7rU9T+Te/sh/NL8ZZKQ== dependencies: debug "^4.4.0" fb-watchman "^2.0.0" @@ -9166,10 +9044,10 @@ metro-minify-terser@0.83.3: flow-enums-runtime "^0.0.6" terser "^5.15.0" -metro-minify-terser@0.83.4: - version "0.83.4" - resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.83.4.tgz#43dea24b72369e01a1831483e7b1bd49581a4cb9" - integrity sha512-KmZnpxfj0nPIRkbBNTc6xul5f5GPvWL5kQ1UkisB7qFkgh6+UiJG+L4ukJ2sK7St6+8Za/Cb68MUEYkUouIYcQ== +metro-minify-terser@0.83.5: + version "0.83.5" + resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.83.5.tgz#ee43a11a9d3442760781434c599d45eb1274e6fd" + integrity sha512-Toe4Md1wS1PBqbvB0cFxBzKEVyyuYTUb0sgifAZh/mSvLH84qA1NAWik9sISWatzvfWf3rOGoUoO5E3f193a3Q== dependencies: flow-enums-runtime "^0.0.6" terser "^5.15.0" @@ -9181,10 +9059,10 @@ metro-resolver@0.83.3: dependencies: flow-enums-runtime "^0.0.6" -metro-resolver@0.83.4: - version "0.83.4" - resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.83.4.tgz#20e9ebc45beeacc7fff657e3ad0404ad9bdffe55" - integrity sha512-drWdylyNqgdaJufz0GjU/ielv2hjcc6piegjjJwKn8l7A/72aLQpUpOHtP+GMR+kOqhSsD4MchhJ6PSANvlSEw== +metro-resolver@0.83.5: + version "0.83.5" + resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.83.5.tgz#72340ca8071941eafe92ff2dcb8e33c581870ef7" + integrity sha512-7p3GtzVUpbAweJeCcUJihJeOQl1bDuimO5ueo1K0BUpUtR41q5EilbQ3klt16UTPPMpA+tISWBtsrqU556mY1A== dependencies: flow-enums-runtime "^0.0.6" @@ -9196,10 +9074,10 @@ metro-runtime@0.83.3: "@babel/runtime" "^7.25.0" flow-enums-runtime "^0.0.6" -metro-runtime@0.83.4, metro-runtime@^0.83.3: - version "0.83.4" - resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.83.4.tgz#44296e7ddee052cf1966f484f60fc6290a1cf5df" - integrity sha512-sWj9KN311yG22Zv0kVbAp9dorB9HtTThvQKsAn6PLxrVrz+1UBsLrQSxjE/s4PtzDi1HABC648jo4K9Euz/5jw== +metro-runtime@0.83.5, metro-runtime@^0.83.3: + version "0.83.5" + resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.83.5.tgz#52c1edafc6cc82e57729cc9c21700ab1e53a1777" + integrity sha512-f+b3ue9AWTVlZe2Xrki6TAoFtKIqw30jwfk7GQ1rDUBQaE0ZQ+NkiMEtb9uwH7uAjJ87U7Tdx1Jg1OJqUfEVlA== dependencies: "@babel/runtime" "^7.25.0" flow-enums-runtime "^0.0.6" @@ -9220,18 +9098,18 @@ metro-source-map@0.83.3: source-map "^0.5.6" vlq "^1.0.0" -metro-source-map@0.83.4, metro-source-map@^0.83.3: - version "0.83.4" - resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.83.4.tgz#c39442f308708055df08545398f5d8d18b9bac7a" - integrity sha512-pPbmQwS0zgU+/0u5KPkuvlsQP0V+WYQ9qNshqupIL720QRH0vS3QR25IVVtbunofEDJchI11Q4QtIbmUyhpOBw== +metro-source-map@0.83.5, metro-source-map@^0.83.3: + version "0.83.5" + resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.83.5.tgz#384f311f83fa2bf51cbec08d77210aa951bf9ee3" + integrity sha512-VT9bb2KO2/4tWY9Z2yeZqTUao7CicKAOps9LUg2aQzsz+04QyuXL3qgf1cLUVRjA/D6G5u1RJAlN1w9VNHtODQ== dependencies: "@babel/traverse" "^7.29.0" "@babel/types" "^7.29.0" flow-enums-runtime "^0.0.6" invariant "^2.2.4" - metro-symbolicate "0.83.4" + metro-symbolicate "0.83.5" nullthrows "^1.1.1" - ob1 "0.83.4" + ob1 "0.83.5" source-map "^0.5.6" vlq "^1.0.0" @@ -9247,14 +9125,14 @@ metro-symbolicate@0.83.3: source-map "^0.5.6" vlq "^1.0.0" -metro-symbolicate@0.83.4: - version "0.83.4" - resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.83.4.tgz#147dd0109c156351fa67a686377856075ed07b5a" - integrity sha512-clyWAXDgkDHPwvldl95pcLTrJIqUj9GbZayL8tfeUs69ilsIUBpVym2lRd/8l3/8PIHCInxL868NvD2Y7OqKXg== +metro-symbolicate@0.83.5: + version "0.83.5" + resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.83.5.tgz#62167db423be6c68b4b9f39935c9cb7330cc9526" + integrity sha512-EMIkrjNRz/hF+p0RDdxoE60+dkaTLPN3vaaGkFmX5lvFdO6HPfHA/Ywznzkev+za0VhPQ5KSdz49/MALBRteHA== dependencies: flow-enums-runtime "^0.0.6" invariant "^2.2.4" - metro-source-map "0.83.4" + metro-source-map "0.83.5" nullthrows "^1.1.1" source-map "^0.5.6" vlq "^1.0.0" @@ -9271,10 +9149,10 @@ metro-transform-plugins@0.83.3: flow-enums-runtime "^0.0.6" nullthrows "^1.1.1" -metro-transform-plugins@0.83.4: - version "0.83.4" - resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.83.4.tgz#5a08d28f032c38400304141286616ce6ee5401da" - integrity sha512-c0ROVcyvdaGPUFIg2N5nEQF4xbsqB2p1PPPhVvK1d/Y7ZhBAFiwQ75so0SJok32q+I++lc/hq7IdPCp2frPGQg== +metro-transform-plugins@0.83.5: + version "0.83.5" + resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.83.5.tgz#ba21c6a5fa9bf6c5c2c222e2c8e7a668ffb3d341" + integrity sha512-KxYKzZL+lt3Os5H2nx7YkbkWVduLZL5kPrE/Yq+Prm/DE1VLhpfnO6HtPs8vimYFKOa58ncl60GpoX0h7Wm0Vw== dependencies: "@babel/core" "^7.25.2" "@babel/generator" "^7.29.1" @@ -9302,23 +9180,23 @@ metro-transform-worker@0.83.3: metro-transform-plugins "0.83.3" nullthrows "^1.1.1" -metro-transform-worker@0.83.4: - version "0.83.4" - resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.83.4.tgz#c71c53687dcf274d668aa5c6a9d4d3c00a7f7203" - integrity sha512-6I81IZLeU/0ww7OBgCPALFl0OE0FQwvIuKCtuViSiKufmislF7kVr7IHH9GYtQuZcnualQ82gYeQ11KzZQTouw== +metro-transform-worker@0.83.5: + version "0.83.5" + resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.83.5.tgz#8616b54282e727027fdb5c475aade719394a8e8a" + integrity sha512-8N4pjkNXc6ytlP9oAM6MwqkvUepNSW39LKYl9NjUMpRDazBQ7oBpQDc8Sz4aI8jnH6AGhF7s1m/ayxkN1t04yA== dependencies: "@babel/core" "^7.25.2" "@babel/generator" "^7.29.1" "@babel/parser" "^7.29.0" "@babel/types" "^7.29.0" flow-enums-runtime "^0.0.6" - metro "0.83.4" - metro-babel-transformer "0.83.4" - metro-cache "0.83.4" - metro-cache-key "0.83.4" - metro-minify-terser "0.83.4" - metro-source-map "0.83.4" - metro-transform-plugins "0.83.4" + metro "0.83.5" + metro-babel-transformer "0.83.5" + metro-cache "0.83.5" + metro-cache-key "0.83.5" + metro-minify-terser "0.83.5" + metro-source-map "0.83.5" + metro-transform-plugins "0.83.5" nullthrows "^1.1.1" metro@0.83.3: @@ -9367,10 +9245,10 @@ metro@0.83.3: ws "^7.5.10" yargs "^17.6.2" -metro@0.83.4, metro@^0.83.3: - version "0.83.4" - resolved "https://registry.yarnpkg.com/metro/-/metro-0.83.4.tgz#beddd541e8e6d227a670039548e39cae051069a2" - integrity sha512-eBkAtcob+YmvSLL+/rsFiK8dHNfDbQA2/pi0lnxg3E6LLtUpwDfdGJ9WBWXkj0PVeOhoWQyj9Rt7s/+6k/GXuA== +metro@0.83.5, metro@^0.83.3: + version "0.83.5" + resolved "https://registry.yarnpkg.com/metro/-/metro-0.83.5.tgz#f5441075d5211c980ac8c79109e9e6fa2df68924" + integrity sha512-BgsXevY1MBac/3ZYv/RfNFf/4iuW9X7f4H8ZNkiH+r667HD9sVujxcmu4jvEzGCAm4/WyKdZCuyhAcyhTHOucQ== dependencies: "@babel/code-frame" "^7.29.0" "@babel/core" "^7.25.2" @@ -9393,18 +9271,18 @@ metro@0.83.4, metro@^0.83.3: jest-worker "^29.7.0" jsc-safe-url "^0.2.2" lodash.throttle "^4.1.1" - metro-babel-transformer "0.83.4" - metro-cache "0.83.4" - metro-cache-key "0.83.4" - metro-config "0.83.4" - metro-core "0.83.4" - metro-file-map "0.83.4" - metro-resolver "0.83.4" - metro-runtime "0.83.4" - metro-source-map "0.83.4" - metro-symbolicate "0.83.4" - metro-transform-plugins "0.83.4" - metro-transform-worker "0.83.4" + metro-babel-transformer "0.83.5" + metro-cache "0.83.5" + metro-cache-key "0.83.5" + metro-config "0.83.5" + metro-core "0.83.5" + metro-file-map "0.83.5" + metro-resolver "0.83.5" + metro-runtime "0.83.5" + metro-source-map "0.83.5" + metro-symbolicate "0.83.5" + metro-transform-plugins "0.83.5" + metro-transform-worker "0.83.5" mime-types "^3.0.1" nullthrows "^1.1.1" serialize-error "^2.1.0" @@ -9485,14 +9363,14 @@ minimalistic-assert@^1.0.0: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@^10.0.1, minimatch@^10.1.1, minimatch@^10.2.2: +minimatch@^10.0.1, minimatch@^10.2.2: version "10.2.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.4.tgz#465b3accbd0218b8281f5301e27cedc697f96fde" integrity sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg== dependencies: brace-expansion "^5.0.2" -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2, minimatch@^3.1.3: +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2, minimatch@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.5.tgz#580c88f8d5445f2bd6aa8f3cadefa0de79fbd69e" integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== @@ -9632,9 +9510,9 @@ node-int64@^0.4.0: integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== node-releases@^2.0.27: - version "2.0.27" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.27.tgz#eedca519205cf20f650f61d56b070db111231e4e" - integrity sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA== + version "2.0.36" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.36.tgz#99fd6552aaeda9e17c4713b57a63964a2e325e9d" + integrity sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA== node-stream-zip@^1.9.1: version "1.15.0" @@ -9715,10 +9593,10 @@ ob1@0.83.3: dependencies: flow-enums-runtime "^0.0.6" -ob1@0.83.4: - version "0.83.4" - resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.83.4.tgz#f034e861376ca4294c5e75623389f07b48028aeb" - integrity sha512-9JiflaRKCkxKzH8uuZlax72cHzZ8iFLsNIORFOAKDgZUOfvfwYWOVS0ezGLzPp/yEhVktD+PTTImC0AAehSOBw== +ob1@0.83.5: + version "0.83.5" + resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.83.5.tgz#f9c289d759142b76577948eea7fd1f07d36f825f" + integrity sha512-vNKPYC8L5ycVANANpF/S+WZHpfnRWKx/F3AYP4QMn6ZJTh+l2HOrId0clNkEmua58NB9vmI9Qh7YOoV/4folYg== dependencies: flow-enums-runtime "^0.0.6" @@ -10090,6 +9968,11 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== +path-expression-matcher@^1.1.3, path-expression-matcher@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/path-expression-matcher/-/path-expression-matcher-1.2.0.tgz#9bdae3787f43b0857b0269e9caaa586c12c8abee" + integrity sha512-DwmPWeFn+tq7TiyJ2CxezCAirXjFxvaiD03npak3cRjlP9+OjTmSy1EpIrEbh+l6JgUundniloMLDQ/6VTdhLQ== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -10113,7 +9996,7 @@ path-scurry@^1.11.1, path-scurry@^1.6.1: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" -path-scurry@^2.0.0, path-scurry@^2.0.2: +path-scurry@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.2.tgz#6be0d0ee02a10d9e0de7a98bae65e182c9061f85" integrity sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg== @@ -10154,14 +10037,14 @@ picocolors@1.1.1, picocolors@^1.1.1: integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + version "2.3.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.2.tgz#5a942915e26b372dc0f0e6753149a16e6b1c5601" + integrity sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA== picomatch@^4.0.2, picomatch@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" - integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== + version "4.0.4" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.4.tgz#fd6f5e00a143086e074dffe4c924b8fb293b0589" + integrity sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A== pify@^2.0.0: version "2.3.0" @@ -10188,9 +10071,9 @@ pkg-up@^3.1.0: find-up "^3.0.0" pkijs@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/pkijs/-/pkijs-3.3.3.tgz#b3f04d7b2eaacb05c81675f882be374e591626ec" - integrity sha512-+KD8hJtqQMYoTuL1bbGOqxb4z+nZkTAwVdNtWwe8Tc2xNbEmdJYIYoc6Qt0uF55e6YW6KuTHw1DjQ18gMhzepw== + version "3.4.0" + resolved "https://registry.yarnpkg.com/pkijs/-/pkijs-3.4.0.tgz#d9164def30ff6d97be2d88966d5e36192499ca9c" + integrity sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw== dependencies: "@noble/hashes" "1.4.0" asn1js "^3.0.6" @@ -10260,9 +10143,9 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== postcss@^8.4.40: - version "8.5.6" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c" - integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== + version "8.5.8" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.8.tgz#6230ecc8fb02e7a0f6982e53990937857e13f399" + integrity sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg== dependencies: nanoid "^3.3.11" picocolors "^1.1.1" @@ -10285,9 +10168,9 @@ postject@^1.0.0-alpha.6: commander "^9.4.0" preact@^10.25.1: - version "10.28.4" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.28.4.tgz#8ffab01c5c0590535bdaecdd548801f44c6e483a" - integrity sha512-uKFfOHWuSNpRFVTnljsCluEFq57OKT+0QdOiQo8XWnQ/pSvg7OpX5eNOejELXJMWy+BwM2nobz0FkvzmnpCNsQ== + version "10.29.0" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.29.0.tgz#a6e5858670b659c4d471c6fea232233e03b403e8" + integrity sha512-wSAGyk2bYR1c7t3SZ3jHcM6xy0lcBcDel6lODcs9ME6Th++Dx2KU+6D3HD8wMMKGA8Wpw7OMd3/4RGzYRpzwRg== prelude-ls@^1.2.1: version "1.2.1" @@ -10397,9 +10280,9 @@ proxy-addr@~2.0.7: ipaddr.js "1.9.1" pump@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.3.tgz#151d979f1a29668dc0025ec589a455b53282268d" - integrity sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA== + version "3.0.4" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.4.tgz#1f313430527fa8b905622ebd22fe1444e757ab3c" + integrity sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA== dependencies: end-of-stream "^1.1.0" once "^1.3.1" @@ -10561,9 +10444,9 @@ react-native-gesture-handler@3.0.0-beta.2: invariant "^2.2.4" react-native-is-edge-to-edge@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.2.1.tgz#64e10851abd9d176cbf2b40562f751622bde3358" - integrity sha512-FLbPWl/MyYQWz+KwqOZsSyj2JmLKglHatd3xLZWskXOpRaio4LfEDEz8E/A6uD8QoTHW6Aobw1jbEwK7KMgR7Q== + version "1.3.1" + resolved "https://registry.yarnpkg.com/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.3.1.tgz#feb9a6a8faf0874298947edd556e5af22044e139" + integrity sha512-NIXU/iT5+ORyCc7p0z2nnlkouYKX425vuU1OEm6bMMtWWR9yvb+Xg5AZmImTKoF9abxCPqrKC3rOZsKzUYgYZA== "react-native-kb@file:../rnmodules/react-native-kb": version "0.1.1" @@ -11076,9 +10959,9 @@ safe-regex-test@^1.1.0: integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sax@>=0.6.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.4.tgz#f29c2bba80ce5b86f4343b4c2be9f2b96627cf8b" - integrity sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw== + version "1.6.0" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.6.0.tgz#da59637629307b97e7c4cb28e080a7bc38560d5b" + integrity sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA== saxes@^6.0.0: version "6.0.0" @@ -11369,9 +11252,9 @@ slice-ansi@^2.0.0: is-fullwidth-code-point "^2.0.0" slugify@^1.3.4, slugify@^1.6.6: - version "1.6.6" - resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.6.6.tgz#2d4ac0eacb47add6af9e04d3be79319cbcc7924b" - integrity sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw== + version "1.6.8" + resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.6.8.tgz#0e43855ebc7df24102d04082e0bcc3a344353604" + integrity sha512-HVk9X1E0gz3mSpoi60h/saazLKXKaZThMLU3u/aNwoYn8/xQyX2MGxL0ui2eaokkD7tF+Zo+cKTHUbe1mmmGzA== sockjs@^0.3.24: version "0.3.24" @@ -11695,10 +11578,10 @@ strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -strnum@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/strnum/-/strnum-2.1.2.tgz#a5e00ba66ab25f9cafa3726b567ce7a49170937a" - integrity sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ== +strnum@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-2.2.2.tgz#f11fd94ab62b536ba2ecc615858f3747c2881b3f" + integrity sha512-DnR90I+jtXNSTXWdwrEy9FakW7UX+qUZg28gj5fk2vxxl7uS/3bpI4fjFYVmdK9etptYBPNkpahuQnEwhwECqA== structured-headers@^0.4.1: version "0.4.1" @@ -11774,9 +11657,9 @@ tagged-tag@^1.0.0: integrity sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng== tapable@^2.0.0, tapable@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.3.0.tgz#7e3ea6d5ca31ba8e078b560f0d83ce9a14aa8be6" - integrity sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg== + version "2.3.2" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.3.2.tgz#86755feabad08d82a26b891db044808c6ad00f15" + integrity sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA== terminal-link@^2.1.1: version "2.1.1" @@ -11786,7 +11669,7 @@ terminal-link@^2.1.1: ansi-escapes "^4.2.1" supports-hyperlinks "^2.0.0" -terser-webpack-plugin@5.4.0: +terser-webpack-plugin@5.4.0, terser-webpack-plugin@^5.3.17: version "5.4.0" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.4.0.tgz#95fc4cf4437e587be11ecf37d08636089174d76b" integrity sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g== @@ -11796,20 +11679,10 @@ terser-webpack-plugin@5.4.0: schema-utils "^4.3.0" terser "^5.31.1" -terser-webpack-plugin@^5.3.17: - version "5.3.17" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.17.tgz#75ea98876297fbb190d2fbb395e982582b859a67" - integrity sha512-YR7PtUp6GMU91BgSJmlaX/rS2lGDbAF7D+Wtq7hRO+MiljNmodYvqslzCFiYVAgW+Qoaaia/QUIP4lGXufjdZw== - dependencies: - "@jridgewell/trace-mapping" "^0.3.25" - jest-worker "^27.4.5" - schema-utils "^4.3.0" - terser "^5.31.1" - terser@^5.10.0, terser@^5.15.0, terser@^5.31.1: - version "5.46.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.46.0.tgz#1b81e560d584bbdd74a8ede87b4d9477b0ff9695" - integrity sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg== + version "5.46.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.46.1.tgz#40e4b1e35d5f13130f82793a8b3eeb7ec3a92eee" + integrity sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.15.0" @@ -11826,9 +11699,9 @@ test-exclude@^6.0.0: minimatch "^3.0.4" thingies@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/thingies/-/thingies-2.5.0.tgz#5f7b882c933b85989f8466b528a6247a6881e04f" - integrity sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw== + version "2.6.0" + resolved "https://registry.yarnpkg.com/thingies/-/thingies-2.6.0.tgz#e09b98b9e6f6caf8a759eca8481fea1de974d2b1" + integrity sha512-rMHRjmlFLM1R96UYPvpmnc3LYtdFrT33JIB7L9hetGue1qAPfn1N2LJeEjxUSidu1Iku+haLZXDuEXUHNGO/lg== throat@^5.0.0: version "5.0.0" @@ -11917,9 +11790,9 @@ ts-api-utils@^1.3.0: integrity sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw== ts-api-utils@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.4.0.tgz#2690579f96d2790253bdcf1ca35d569ad78f9ad8" - integrity sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA== + version "2.5.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.5.0.tgz#4acd4a155e22734990a5ed1fe9e97f113bcb37c1" + integrity sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA== tslib@^1.9.3: version "1.14.1" @@ -11971,9 +11844,9 @@ type-fest@^4.26.1: integrity sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA== type-fest@^5.4.4: - version "5.4.4" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-5.4.4.tgz#577f165b5ecb44cfc686559cc54ca77f62aa374d" - integrity sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw== + version "5.5.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-5.5.0.tgz#78fca72f3a1f9ec964e6ae260db492b070c56f3b" + integrity sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g== dependencies: tagged-tag "^1.0.0" @@ -12637,9 +12510,9 @@ ws@^7, ws@^7.5.10: integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== ws@^8.12.1, ws@^8.18.0: - version "8.19.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.19.0.tgz#ddc2bdfa5b9ad860204f5a72a4863a8895fd8c8b" - integrity sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg== + version "8.20.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.20.0.tgz#4cd9532358eba60bc863aad1623dfb045a4d4af8" + integrity sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA== wsl-utils@^0.1.0: version "0.1.0" @@ -12700,9 +12573,9 @@ yallist@^3.0.2: integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yaml@^2.2.1, yaml@^2.2.2, yaml@^2.6.1: - version "2.8.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.2.tgz#5694f25eca0ce9c3e7a9d9e00ce0ddabbd9e35c5" - integrity sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A== + version "2.8.3" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.3.tgz#a0d6bd2efb3dd03c59370223701834e60409bd7d" + integrity sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg== yargs-parser@^18.1.2: version "18.1.3" @@ -12790,10 +12663,10 @@ zustand@5.0.12: resolved "https://registry.yarnpkg.com/zustand/-/zustand-5.0.12.tgz#ed36f647aa89965c4019b671dfc23ef6c6e3af8c" integrity sha512-i77ae3aZq4dhMlRhJVCYgMLKuSiZAaUPAct2AksxQ+gOtimhGMdXljRT21P5BNpeT4kXlLIckvkPM029OljD7g== -zxing-wasm@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/zxing-wasm/-/zxing-wasm-3.0.0.tgz#184feade580ef7763cac4f1231eae1aa6fe28a39" - integrity sha512-s7ASCPKX+QnH7Y83f4Byxmq/vDzYW7B9m6jMP5S30JGfN2A6WAUn6P3vcBmNguDhPLE6ny2fjTooQVyKBXI1qA== +zxing-wasm@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/zxing-wasm/-/zxing-wasm-3.0.1.tgz#b04c9323f2322996d9f21a02bad7fc1b450ec390" + integrity sha512-3CLj6iaGkpqPWXAB4pIWkFOR63MwqGekpMzaROFKto4dFowiPmLlC56KoMoOSXzqOCOpI5DAvMdB8ku2va6fUg== dependencies: "@types/emscripten" "^1.41.5" type-fest "^5.4.4"