Bluesky app fork with some witchin' additions 💫

Merge with upstream https://github.com/bluesky-social/social-app/

xan.lol 40b6cc32 5b8beb4a

verified
+4 -4
bskyweb/templates/post.html
··· 108 108 {% else %} 109 109 <meta property="og:title" content="@{{ profileHandle }}"> 110 110 {% endif -%} 111 - <meta name="description" content="This post requires authentication to view."> 112 - <meta property="og:description" content="This post requires authentication to view."> 113 - <meta property="twitter:description" content="This post requires authentication to view."> 111 + <meta name="description" content="This author has chosen to make their posts visible only to people who are signed in."> 112 + <meta property="og:description" content="This author has chosen to make their posts visible only to people who are signed in."> 113 + <meta property="twitter:description" content="This author has chosen to make their posts visible only to people who are signed in."> 114 114 <meta name="twitter:card" content="summary"> 115 115 {% endif -%} 116 116 {%- endblock %} ··· 129 129 <div id="bsky_post_summary"> 130 130 <h3>Post</h3> 131 131 <p id="bsky_handle">{{ profileHandle }}</p> 132 - <p id="bsky_post_text">This post requires authentication to view.</p> 132 + <p id="bsky_post_text">This author has chosen to make their posts visible only to people who are signed in.</p> 133 133 </div> 134 134 {% endif -%} 135 135 {%- endblock %}
+10 -10
package.json
··· 62 62 "intl:compile-if-needed": "is-ci || [ -f src/locale/locales/en/messages.js ] || yarn intl:compile", 63 63 "intl:pull": "crowdin download translations --verbose -b main", 64 64 "intl:push": "crowdin push translations --verbose -b main", 65 + "intl:push-sources": "crowdin push sources --verbose -b main", 65 66 "nuke": "rm -rf ./node_modules && rm -rf ./ios && rm -rf ./android", 66 67 "update-extensions": "bash scripts/updateExtensions.sh", 67 68 "export": "npx expo export --dump-sourcemap && yarn upload-native-sourcemaps", ··· 98 99 "@miblanchard/react-native-slider": "^2.6.0", 99 100 "@mozzius/expo-dynamic-app-icon": "^1.8.0", 100 101 "@react-native-async-storage/async-storage": "2.2.0", 101 - "@react-navigation/bottom-tabs": "^7.3.13", 102 - "@react-navigation/drawer": "^7.3.12", 103 - "@react-navigation/native": "^7.1.9", 104 - "@react-navigation/native-stack": "^7.3.13", 102 + "@react-navigation/bottom-tabs": "^7.9.0", 103 + "@react-navigation/native": "^7.1.26", 104 + "@react-navigation/native-stack": "^7.9.0", 105 105 "@sentry/react-native": "~6.20.0", 106 106 "@tanstack/query-async-storage-persister": "^5.25.0", 107 107 "@tanstack/react-query": "5.25.0", ··· 175 175 "libphonenumber-js": "^1.12.31", 176 176 "lodash.chunk": "^4.2.0", 177 177 "lodash.debounce": "^4.0.8", 178 - "lodash.isequal": "^4.5.0", 178 + "fast-deep-equal": "^3.1.3", 179 179 "lodash.shuffle": "^4.2.0", 180 180 "lodash.throttle": "^4.1.1", 181 181 "multiformats": "9.9.0", ··· 195 195 "react-native-compressor": "^1.13.0", 196 196 "react-native-date-picker": "^5.0.13", 197 197 "react-native-device-attest": "^0.1.6", 198 - "react-native-drawer-layout": "^4.1.8", 198 + "react-native-drawer-layout": "^4.2.1", 199 199 "react-native-edge-to-edge": "^1.6.0", 200 200 "react-native-gesture-handler": "~2.28.0", 201 201 "react-native-get-random-values": "~1.11.0", ··· 205 205 "react-native-qrcode-styled": "^0.3.3", 206 206 "react-native-reanimated": "^3.19.1", 207 207 "react-native-safe-area-context": "~5.6.0", 208 - "react-native-screens": "~4.16.0", 208 + "react-native-screens": "^4.19.0", 209 209 "react-native-svg": "15.12.1", 210 210 "react-native-uitextview": "^1.4.0", 211 211 "react-native-url-polyfill": "^1.3.0", ··· 223 223 "tippy.js": "^6.3.7", 224 224 "tlds": "^1.234.0", 225 225 "tldts": "^6.1.46", 226 + "unicode-segmenter": "^0.14.5", 226 227 "zod": "^3.20.2" 227 228 }, 228 229 "devDependencies": { ··· 245 246 "@types/jest": "29.5.14", 246 247 "@types/lodash.chunk": "^4.2.7", 247 248 "@types/lodash.debounce": "^4.0.7", 248 - "@types/lodash.isequal": "^4.5.6", 249 249 "@types/lodash.shuffle": "^4.2.7", 250 250 "@types/psl": "^1.1.1", 251 251 "@types/react": "^19.1.12", ··· 274 274 "jest-junit": "^16.0.0", 275 275 "lint-staged": "^13.2.3", 276 276 "lockfile-lint": "^4.14.0", 277 - "metro-react-native-babel-preset": "^0.77.0", 278 277 "prettier": "^3.6.0", 279 278 "react-native-dotenv": "^3.4.11", 280 279 "react-refresh": "^0.14.0", ··· 291 290 "**/expo-constants": "18.0.8", 292 291 "**/expo-device": "7.1.4", 293 292 "**/zod": "3.23.8", 294 - "**/multiformats": "9.9.0" 293 + "**/multiformats": "9.9.0", 294 + "unicode-segmenter": "0.14.5" 295 295 }, 296 296 "jest": { 297 297 "preset": "jest-expo/ios",
+2 -2
patches/react-native-drawer-layout+4.1.10.patch patches/react-native-drawer-layout+4.2.1.patch
··· 1 1 diff --git a/node_modules/react-native-drawer-layout/lib/module/views/Drawer.native.js b/node_modules/react-native-drawer-layout/lib/module/views/Drawer.native.js 2 - index efa71f9..a23c624 100644 2 + index 40fdcdb..770fd67 100644 3 3 --- a/node_modules/react-native-drawer-layout/lib/module/views/Drawer.native.js 4 4 +++ b/node_modules/react-native-drawer-layout/lib/module/views/Drawer.native.js 5 5 @@ -124,15 +124,21 @@ export function Drawer({ ··· 31 31 - }, finished => runOnJS(onAnimationEnd)(open, finished)); 32 32 + }, finished => { 33 33 + animatingTo.value = null; 34 - + runOnJS(onAnimationEnd)(open, finished) 34 + + runOnJS(onAnimationEnd)(open, finished); 35 35 + }); 36 36 if (open) { 37 37 runOnJS(onOpen)();
-326
patches/react-native-screens+4.16.0.patch
··· 1 - diff --git a/node_modules/react-native-screens/ios/RNSScreen.mm b/node_modules/react-native-screens/ios/RNSScreen.mm 2 - index b62a2e2..cb469db 100644 3 - --- a/node_modules/react-native-screens/ios/RNSScreen.mm 4 - +++ b/node_modules/react-native-screens/ios/RNSScreen.mm 5 - @@ -729,9 +729,26 @@ - (void)notifyTransitionProgress:(double)progress closing:(BOOL)closing goingFor 6 - #endif 7 - } 8 - 9 - -#if !RCT_NEW_ARCH_ENABLED 10 - +- (void)willMoveToWindow:(UIWindow *)newWindow 11 - +{ 12 - + if (@available(iOS 26, *)) { 13 - + // In iOS 26, as soon as another screen appears in transition, it is interactable 14 - + // To avoid glitches resulting from clicking buttons mid transition, we temporarily disable all interactions 15 - + // Disabling interactions for parent navigation controller won't be enough in case of nested stack 16 - + // Furthermore, a stack put inside a modal will exist in an entirely different hierarchy 17 - + // To be sure, we block interactions on the whole window. 18 - + // Note that newWindows is nil when moving from instead of moving to, and Obj-C handles nil correctly 19 - + newWindow.userInteractionEnabled = false; 20 - + } 21 - +} 22 - + 23 - - (void)presentationControllerWillDismiss:(UIPresentationController *)presentationController 24 - { 25 - + if (@available(iOS 26, *)) { 26 - + // Disable interactions to disallow multiple modals dismissed at once; see willMoveToWindow 27 - + presentationController.containerView.window.userInteractionEnabled = false; 28 - + } 29 - +#if !RCT_NEW_ARCH_ENABLED 30 - // On Paper, we need to call both "cancel" and "reset" here because RN's gesture 31 - // recognizer does not handle the scenario when it gets cancelled by other top 32 - // level gesture recognizer. In this case by the modal dismiss gesture. 33 - @@ -744,8 +761,8 @@ - (void)presentationControllerWillDismiss:(UIPresentationController *)presentati 34 - // down. 35 - [_touchHandler cancel]; 36 - [_touchHandler reset]; 37 - -} 38 - #endif // !RCT_NEW_ARCH_ENABLED 39 - +} 40 - 41 - - (BOOL)presentationControllerShouldDismiss:(UIPresentationController *)presentationController 42 - { 43 - @@ -757,6 +774,10 @@ - (BOOL)presentationControllerShouldDismiss:(UIPresentationController *)presenta 44 - 45 - - (void)presentationControllerDidAttemptToDismiss:(UIPresentationController *)presentationController 46 - { 47 - + if (@available(iOS 26, *)) { 48 - + // Reenable interactions; see presentationControllerWillDismiss 49 - + presentationController.containerView.window.userInteractionEnabled = true; 50 - + } 51 - // NOTE(kkafar): We should consider depracating the use of gesture cancel here & align 52 - // with usePreventRemove API of react-navigation v7. 53 - [self notifyGestureCancel]; 54 - @@ -767,6 +788,11 @@ - (void)presentationControllerDidAttemptToDismiss:(UIPresentationController *)pr 55 - 56 - - (void)presentationControllerDidDismiss:(UIPresentationController *)presentationController 57 - { 58 - + if (@available(iOS 26, *)) { 59 - + // Reenable interactions; see presentationControllerWillDismiss 60 - + // Dismissed screen doesn't hold a reference to window, but presentingViewController.view does 61 - + presentationController.presentingViewController.view.window.userInteractionEnabled = true; 62 - + } 63 - if ([_reactSuperview respondsToSelector:@selector(presentationControllerDidDismiss:)]) { 64 - [_reactSuperview performSelector:@selector(presentationControllerDidDismiss:) withObject:presentationController]; 65 - } 66 - @@ -1518,6 +1544,10 @@ - (void)viewWillDisappear:(BOOL)animated 67 - 68 - - (void)viewDidAppear:(BOOL)animated 69 - { 70 - + if (@available(iOS 26, *)) { 71 - + // Reenable interactions, see willMoveToWindow 72 - + self.view.window.userInteractionEnabled = true; 73 - + } 74 - [super viewDidAppear:animated]; 75 - if (!_isSwiping || _shouldNotify) { 76 - // we are going forward or dismissing without swipe 77 - diff --git a/node_modules/react-native-screens/ios/RNSScreenStack.mm b/node_modules/react-native-screens/ios/RNSScreenStack.mm 78 - index 229dc58..10b365b 100644 79 - --- a/node_modules/react-native-screens/ios/RNSScreenStack.mm 80 - +++ b/node_modules/react-native-screens/ios/RNSScreenStack.mm 81 - @@ -62,26 +62,6 @@ @interface RNSScreenStackView () < 82 - 83 - @implementation RNSNavigationController 84 - 85 - -#if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0) 86 - -- (void)viewDidLoad 87 - -{ 88 - - // iOS 26 introduces new gesture recognizer which replaces our RNSPanGestureRecognizer. 89 - - // The problem is that we are not able to handle it here for various reasons: 90 - - // - the new recognizer comes with its own delegate and our current approach is to wire 91 - - // all recognizers to RNSScreenStackView; to be 100% sure we don't break the logic, 92 - - // we would have to decorate its delegate and call it after our code, which would 93 - - // break other recognizers that the stack view is the delegate for 94 - - // - when RNSScreenStackView.setupGestureHandler method is called, the recognizer hasn't been 95 - - // loaded yet and there is no other place to configure in a not "hacky" way 96 - - // - the official docs warn us to not use it for anything other than "setting up failure requirements with it" 97 - - // - we expose fullScreenGestureEnabled prop to enable/disable the feature, 98 - - // so we need control over the delegate 99 - - if (@available(iOS 26.0, *)) { 100 - - self.interactiveContentPopGestureRecognizer.enabled = NO; 101 - - } 102 - -} 103 - -#endif // iOS 26 104 - - 105 - #if !TARGET_OS_TV 106 - - (UIViewController *)childViewControllerForStatusBarStyle 107 - { 108 - @@ -219,50 +199,6 @@ - (bool)onRepeatedTabSelectionOfTabScreenController:(RNSTabsScreenViewController 109 - return false; 110 - } 111 - 112 - -#pragma mark - UINavigationBarDelegate 113 - - 114 - -#if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0) 115 - -- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item 116 - -{ 117 - - if (@available(iOS 26, *)) { 118 - - // To prevent popping multiple screens when back button is pressed repeatedly, 119 - - // We allow for pop operation to proceed only if no transition is in progress, 120 - - // which we check indirectly by checking if transitionCoordinator is set. 121 - - // If it's not, we are safe to proceed. 122 - - if (self.transitionCoordinator == nil) { 123 - - // We still need to disable interactions for back button so click effects are not applied, 124 - - // and there is unfortunately no better place for it currently 125 - - UIView *button = [navigationBar rnscreens_findBackButtonWrapperView]; 126 - - if (button != nil) { 127 - - button.userInteractionEnabled = false; 128 - - } 129 - - 130 - - return true; 131 - - } 132 - - 133 - - return false; 134 - - } 135 - - 136 - - return true; 137 - -} 138 - - 139 - -- (void)navigationBar:(UINavigationBar *)navigationBar didPopItem:(UINavigationItem *)item 140 - -{ 141 - - if (@available(iOS 26, *)) { 142 - - // Reset interactions on back button -> see navigationBar:shouldPopItem 143 - - // IMPORTANT: This reset won't execute when preventNativeDismiss is on. 144 - - // However, on iOS 26, unlike in previous versions, the back button instance changes 145 - - // when handling preventNativeDismiss and userIteractionEnabled is reset. 146 - - // The instance also changes when regular screen pop happens, but in that case 147 - - // the value of userInteractionEnabled is carried on, and we reset it here. 148 - - UIView *button = [navigationBar rnscreens_findBackButtonWrapperView]; 149 - - if (button != nil) { 150 - - button.userInteractionEnabled = true; 151 - - } 152 - - } 153 - -} 154 - -#endif // Check for iOS >= 26 155 - - 156 - #pragma mark - RNSFrameCorrectionProvider 157 - 158 - #ifdef RNS_GAMMA_ENABLED 159 - @@ -327,7 +263,7 @@ @implementation RNSScreenStackView { 160 - UINavigationController *_controller; 161 - NSMutableArray<RNSScreenView *> *_reactSubviews; 162 - BOOL _invalidated; 163 - - BOOL _isFullWidthSwiping; 164 - + BOOL _isFullWidthSwipingWithPanGesture; // used only for content swipe with RNSPanGestureRecognizer 165 - RNSPercentDrivenInteractiveTransition *_interactionController; 166 - __weak RNSScreenStackManager *_manager; 167 - BOOL _updateScheduled; 168 - @@ -522,6 +458,11 @@ - (void)reactAddControllerToClosestParent:(UIViewController *)controller 169 - [self addSubview:controller.view]; 170 - #if !TARGET_OS_TV 171 - _controller.interactivePopGestureRecognizer.delegate = self; 172 - + #if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0) 173 - + if (@available(iOS 26, *)) { 174 - + _controller.interactiveContentPopGestureRecognizer.delegate = self; 175 - + } 176 - +#endif // Check for iOS >= 26.0 177 - #endif 178 - [controller didMoveToParentViewController:parentView.reactViewController]; 179 - // On iOS pre 12 we observed that `willShowViewController` delegate method does not always 180 - @@ -943,7 +884,7 @@ - (void)dismissOnReload 181 - // when preventing the native dismiss with back button, we have to return the animator. 182 - // Also, we need to return the animator when full width swiping even if the animation is not custom, 183 - // otherwise the screen will be just popped immediately due to no animation 184 - - ((operation == UINavigationControllerOperationPop && shouldCancelDismiss) || _isFullWidthSwiping || 185 - + ((operation == UINavigationControllerOperationPop && shouldCancelDismiss) || _isFullWidthSwipingWithPanGesture || 186 - [RNSScreenStackAnimator isCustomAnimation:screen.stackAnimation] || _customAnimation)) { 187 - return [[RNSScreenStackAnimator alloc] initWithOperation:operation]; 188 - } 189 - @@ -967,23 +908,39 @@ - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer 190 - } 191 - RNSScreenView *topScreen = _reactSubviews.lastObject; 192 - 193 - + BOOL customAnimationOnSwipePropSetAndSelectedAnimationIsCustom = 194 - + topScreen.customAnimationOnSwipe && [RNSScreenStackAnimator isCustomAnimation:topScreen.stackAnimation]; 195 - + 196 - #if TARGET_OS_TV || TARGET_OS_VISION 197 - [self cancelTouchesInParent]; 198 - return YES; 199 - #else 200 - - // RNSPanGestureRecognizer will receive events iff topScreen.fullScreenSwipeEnabled == YES; 201 - - // Events are filtered in gestureRecognizer:shouldReceivePressOrTouchEvent: method 202 - if ([gestureRecognizer isKindOfClass:[RNSPanGestureRecognizer class]]) { 203 - - if ([self isInGestureResponseDistance:gestureRecognizer topScreen:topScreen]) { 204 - - _isFullWidthSwiping = YES; 205 - - [self cancelTouchesInParent]; 206 - - return YES; 207 - + // On iOS < 26, we have a custom full screen swipe recognizer that functions similarily 208 - + // to interactiveContentPopGestureRecognizer introduced in iOS 26. 209 - + // On iOS >= 26, we want to use the native one, but we are unable to handle custom animations 210 - + // with native interactiveContentPopGestureRecognizer, so we have to fallback to the old implementation. 211 - + // In this case, the old one should behave as close as the new native one, having only the difference 212 - + // in animation, and without any customization that is exclusive for it (e.g. gestureResponseDistance). 213 - + if (@available(iOS 26, *)) { 214 - + if (customAnimationOnSwipePropSetAndSelectedAnimationIsCustom) { 215 - + _isFullWidthSwipingWithPanGesture = YES; 216 - + [self cancelTouchesInParent]; 217 - + return YES; 218 - + } 219 - + return NO; 220 - + } else { 221 - + if ([self isInGestureResponseDistance:gestureRecognizer topScreen:topScreen]) { 222 - + _isFullWidthSwipingWithPanGesture = YES; 223 - + [self cancelTouchesInParent]; 224 - + return YES; 225 - + } 226 - + return NO; 227 - } 228 - - return NO; 229 - } 230 - 231 - // Now we're dealing with RNSScreenEdgeGestureRecognizer (or _UIParallaxTransitionPanGestureRecognizer) 232 - - if (topScreen.customAnimationOnSwipe && [RNSScreenStackAnimator isCustomAnimation:topScreen.stackAnimation]) { 233 - + if (customAnimationOnSwipePropSetAndSelectedAnimationIsCustom) { 234 - if ([gestureRecognizer isKindOfClass:[RNSScreenEdgeGestureRecognizer class]]) { 235 - UIRectEdge edges = ((RNSScreenEdgeGestureRecognizer *)gestureRecognizer).edges; 236 - BOOL isRTL = _controller.view.semanticContentAttribute == UISemanticContentAttributeForceRightToLeft; 237 - @@ -1028,7 +985,9 @@ - (void)setupGestureHandlers 238 - rightEdgeSwipeGestureRecognizer.delegate = self; 239 - [self addGestureRecognizer:rightEdgeSwipeGestureRecognizer]; 240 - 241 - - // gesture recognizer for full width swipe gesture 242 - + // Starting from iOS 26, RNSPanGestureRecognizer has been mostly replaced by native 243 - + // interactiveContentPopGestureRecognizer. It still needs to handle custom dismiss animations, 244 - + // which we are not able to handle with the latter. 245 - RNSPanGestureRecognizer *panRecognizer = [[RNSPanGestureRecognizer alloc] initWithTarget:self 246 - action:@selector(handleSwipe:)]; 247 - panRecognizer.delegate = self; 248 - @@ -1091,7 +1050,7 @@ - (void)handleSwipe:(UIPanGestureRecognizer *)gestureRecognizer 249 - [_interactionController cancelInteractiveTransition]; 250 - } 251 - _interactionController = nil; 252 - - _isFullWidthSwiping = NO; 253 - + _isFullWidthSwipingWithPanGesture = NO; 254 - } 255 - default: { 256 - break; 257 - @@ -1225,14 +1184,6 @@ - (BOOL)isScrollViewPanGestureRecognizer:(UIGestureRecognizer *)gestureRecognize 258 - // Be careful when adding another type of gesture recognizer. 259 - - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceivePressOrTouchEvent:(NSObject *)event 260 - { 261 - - if (@available(iOS 26, *)) { 262 - - // in iOS 26, you can swipe to pop screen before the previous one finished transitioning; 263 - - // this prevents from registering the second gesture 264 - - if ([self isTransitionInProgress]) { 265 - - return NO; 266 - - } 267 - - } 268 - - 269 - RNSScreenView *topScreen = _reactSubviews.lastObject; 270 - 271 - for (RNSScreenView *s in _reactSubviews.reverseObjectEnumerator) { 272 - @@ -1249,10 +1200,30 @@ - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceive 273 - return NO; 274 - } 275 - 276 - + BOOL customAnimationOnSwipePropSetAndSelectedAnimationIsCustom = 277 - + topScreen.customAnimationOnSwipe && [RNSScreenStackAnimator isCustomAnimation:topScreen.stackAnimation]; 278 - +#if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0) 279 - + if (@available(iOS 26, *)) { 280 - + // On iOS 26, fullScreenSwipeEnabled takes no effect, and depending on whether custom animations are on, 281 - + // we select either interactiveContentPopGestureRecognizer or RNSPanGestureRecognizer 282 - + if (([gestureRecognizer isKindOfClass:[RNSPanGestureRecognizer class]] && 283 - + !customAnimationOnSwipePropSetAndSelectedAnimationIsCustom) || 284 - + (gestureRecognizer == _controller.interactiveContentPopGestureRecognizer && 285 - + customAnimationOnSwipePropSetAndSelectedAnimationIsCustom)) { 286 - + return NO; 287 - + } 288 - + } else { 289 - + // We want to pass events to RNSPanGestureRecognizer iff full screen swipe is enabled. 290 - + if ([gestureRecognizer isKindOfClass:[RNSPanGestureRecognizer class]]) { 291 - + return topScreen.fullScreenSwipeEnabled; 292 - + } 293 - + } 294 - +#else // check for iOS >= 26 295 - // We want to pass events to RNSPanGestureRecognizer iff full screen swipe is enabled. 296 - if ([gestureRecognizer isKindOfClass:[RNSPanGestureRecognizer class]]) { 297 - return topScreen.fullScreenSwipeEnabled; 298 - } 299 - +#endif // check for iOS >= 26 300 - 301 - // RNSScreenEdgeGestureRecognizer || _UIParallaxTransitionPanGestureRecognizer 302 - return YES; 303 - @@ -1268,15 +1239,6 @@ - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceive 304 - return [self gestureRecognizer:gestureRecognizer shouldReceivePressOrTouchEvent:touch]; 305 - } 306 - 307 - -- (BOOL)isTransitionInProgress 308 - -{ 309 - - if (_controller.transitionCoordinator != nil) { 310 - - return YES; 311 - - } 312 - - 313 - - return NO; 314 - -} 315 - - 316 - - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 317 - shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 318 - { 319 - @@ -1289,7 +1251,6 @@ - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 320 - if (gestureRecognizer.state == UIGestureRecognizerStateBegan || isBackGesture) { 321 - return NO; 322 - } 323 - - 324 - return YES; 325 - } 326 - return NO;
+13 -3
src/Navigation.tsx
··· 646 646 * The TabsNavigator is used by native mobile to represent the routes 647 647 * in 3 distinct tab-stacks with a different root screen on each. 648 648 */ 649 - function TabsNavigator() { 649 + function TabsNavigator({ 650 + layout, 651 + }: { 652 + layout: React.ComponentProps<typeof Tab.Navigator>['layout'] 653 + }) { 650 654 const tabBar = useCallback( 651 655 (props: JSX.IntrinsicAttributes & BottomTabBarProps) => ( 652 656 <BottomBar {...props} /> ··· 659 663 initialRouteName="HomeTab" 660 664 backBehavior="initialRoute" 661 665 screenOptions={{headerShown: false, lazy: true}} 662 - tabBar={tabBar}> 666 + tabBar={tabBar} 667 + layout={layout}> 663 668 <Tab.Screen name="HomeTab" getComponent={() => HomeTabNavigator} /> 664 669 <Tab.Screen name="SearchTab" getComponent={() => SearchTabNavigator} /> 665 670 <Tab.Screen ··· 767 772 * The FlatNavigator is used by Web to represent the routes 768 773 * in a single ("flat") stack. 769 774 */ 770 - const FlatNavigator = () => { 775 + const FlatNavigator = ({ 776 + layout, 777 + }: { 778 + layout: React.ComponentProps<typeof Flat.Navigator>['layout'] 779 + }) => { 771 780 const t = useTheme() 772 781 const numUnread = useUnreadNotifications() 773 782 const screenListeners = useWebScrollRestoration() ··· 775 784 776 785 return ( 777 786 <Flat.Navigator 787 + layout={layout} 778 788 screenListeners={screenListeners} 779 789 screenOptions={screenOptions(t)}> 780 790 <Flat.Screen
-2
src/components/FeedInterstitials.tsx
··· 776 776 } 777 777 778 778 function SeeMoreSuggestedProfilesCard({onPress}: {onPress: () => void}) { 779 - const t = useTheme() 780 779 const {_} = useLingui() 781 780 782 781 return ( ··· 790 789 a.gap_sm, 791 790 a.p_md, 792 791 a.rounded_lg, 793 - t.atoms.shadow_sm, 794 792 {width: FINAL_CARD_WIDTH}, 795 793 ]}> 796 794 <ButtonIcon icon={ArrowRight} size="lg" />
+12 -1
src/components/Post/Embed/ExternalEmbed/Gif.tsx
··· 11 11 import {useLingui} from '@lingui/react' 12 12 13 13 import {HITSLOP_20} from '#/lib/constants' 14 + import {clamp} from '#/lib/numbers' 14 15 import {type EmbedPlayerParams} from '#/lib/strings/embed-player' 15 16 import {isWeb} from '#/platform/detection' 16 17 import {useAutoplayDisabled} from '#/state/preferences' ··· 111 112 playerRef.current?.toggleAsync() 112 113 }, []) 113 114 115 + let aspectRatio = 1 116 + if (params.dimensions) { 117 + aspectRatio = clamp( 118 + params.dimensions.width / params.dimensions.height, 119 + 0.75, 120 + 4, 121 + ) 122 + } 123 + 114 124 return ( 115 125 <View 116 126 style={[ ··· 118 128 a.overflow_hidden, 119 129 a.border, 120 130 t.atoms.border_contrast_low, 121 - {aspectRatio: params.dimensions!.width / params.dimensions!.height}, 131 + {backgroundColor: t.palette.black}, 132 + {aspectRatio}, 122 133 style, 123 134 ]}> 124 135 <View
+29 -13
src/components/Post/Embed/index.tsx
··· 1 - import React from 'react' 1 + import {useCallback, useMemo} from 'react' 2 2 import {View} from 'react-native' 3 3 import { 4 4 type $Typed, ··· 12 12 import {useLingui} from '@lingui/react' 13 13 import {useQueryClient} from '@tanstack/react-query' 14 14 15 - import {usePalette} from '#/lib/hooks/usePalette' 16 15 import {makeProfileLink} from '#/lib/routes/links' 17 16 import {useDirectFetchRecords} from '#/state/preferences/direct-fetch-records' 18 17 import {useModerationOpts} from '#/state/preferences/moderation-opts' ··· 22 21 import {Link} from '#/view/com/util/Link' 23 22 import {PostMeta} from '#/view/com/util/PostMeta' 24 23 import {atoms as a, useTheme} from '#/alf' 24 + import {useInteractionState} from '#/components/hooks/useInteractionState' 25 25 import {ContentHider} from '#/components/moderation/ContentHider' 26 26 import {PostAlerts} from '#/components/moderation/PostAlerts' 27 27 import {RichText} from '#/components/RichText' ··· 318 318 visibilityLabel?: string 319 319 }) { 320 320 const moderationOpts = useModerationOpts() 321 - const quote = React.useMemo<$Typed<AppBskyFeedDefs.PostView>>( 321 + const quote = useMemo<$Typed<AppBskyFeedDefs.PostView>>( 322 322 () => ({ 323 323 ...embed.view, 324 324 $type: 'app.bsky.feed.defs#postView', ··· 327 327 }), 328 328 [embed], 329 329 ) 330 - const moderation = React.useMemo(() => { 330 + const moderation = useMemo(() => { 331 331 return moderationOpts ? moderatePost(quote, moderationOpts) : undefined 332 332 }, [quote, moderationOpts]) 333 333 334 334 const t = useTheme() 335 335 const queryClient = useQueryClient() 336 - const pal = usePalette('default') 337 336 const itemUrip = new AtUri(quote.uri) 338 337 const itemHref = makeProfileLink(quote.author, 'post', itemUrip.rkey) 339 338 const itemTitle = `Post by ${quote.author.handle}` 340 339 341 - const richText = React.useMemo(() => { 340 + const richText = useMemo(() => { 342 341 if ( 343 342 !bsky.dangerousIsType<AppBskyFeedPost.Record>( 344 343 quote.record, ··· 352 351 : undefined 353 352 }, [quote.record]) 354 353 355 - const onBeforePress = React.useCallback(() => { 354 + const onBeforePress = useCallback(() => { 356 355 unstableCacheProfileView(queryClient, quote.author) 357 356 onOpen?.() 358 357 }, [queryClient, quote.author, onOpen]) 359 358 360 - const [hover, setHover] = React.useState(false) 359 + const { 360 + state: hover, 361 + onIn: onPointerEnter, 362 + onOut: onPointerLeave, 363 + } = useInteractionState() 364 + const { 365 + state: pressed, 366 + onIn: onPressIn, 367 + onOut: onPressOut, 368 + } = useInteractionState() 361 369 return ( 362 370 <View 363 371 style={[a.mt_sm]} 364 - onPointerEnter={() => setHover(true)} 365 - onPointerLeave={() => setHover(false)}> 372 + onPointerEnter={onPointerEnter} 373 + onPointerLeave={onPointerLeave}> 366 374 <ContentHider 367 375 modui={moderation?.ui('contentList')} 368 376 style={[a.rounded_md, a.border, t.atoms.border_contrast_low, style]} ··· 370 378 childContainerStyle={[a.pt_sm]}> 371 379 {({active}) => ( 372 380 <> 373 - {!active && <SubtleHover hover={hover} style={[a.rounded_md]} />} 381 + {!active && ( 382 + <SubtleHover 383 + native 384 + hover={hover || pressed} 385 + style={[a.rounded_md]} 386 + /> 387 + )} 374 388 <Link 375 389 style={[!active && a.p_md]} 376 - hoverStyle={{borderColor: pal.colors.borderLinkHover}} 390 + hoverStyle={t.atoms.border_contrast_high} 377 391 href={itemHref} 378 392 title={itemTitle} 379 - onBeforePress={onBeforePress}> 393 + onBeforePress={onBeforePress} 394 + onPressIn={onPressIn} 395 + onPressOut={onPressOut}> 380 396 <View pointerEvents="none"> 381 397 <PostMeta 382 398 author={quote.author}
+3 -3
src/components/dialogs/lists/CreateOrEditListDialog.tsx
··· 5 5 import {useLingui} from '@lingui/react' 6 6 7 7 import {cleanError} from '#/lib/strings/errors' 8 - import {useWarnMaxGraphemeCount} from '#/lib/strings/helpers' 8 + import {isOverMaxGraphemeCount} from '#/lib/strings/helpers' 9 9 import {richTextToString} from '#/lib/strings/rich-text-helpers' 10 10 import {shortenLinks, stripInvalidMentions} from '#/lib/strings/rich-text-manip' 11 11 import {logger} from '#/logger' ··· 262 262 _, 263 263 ]) 264 264 265 - const displayNameTooLong = useWarnMaxGraphemeCount({ 265 + const displayNameTooLong = isOverMaxGraphemeCount({ 266 266 text: displayName, 267 267 maxCount: DISPLAY_NAME_MAX_GRAPHEMES, 268 268 }) 269 - const descriptionTooLong = useWarnMaxGraphemeCount({ 269 + const descriptionTooLong = isOverMaxGraphemeCount({ 270 270 text: descriptionRt, 271 271 maxCount: DESCRIPTION_MAX_GRAPHEMES, 272 272 })
+1 -2
src/components/moderation/ReportDialog/index.tsx
··· 1 1 import React from 'react' 2 - import {Pressable, View} from 'react-native' 3 - import {type ScrollView} from 'react-native-gesture-handler' 2 + import {Pressable, type ScrollView, View} from 'react-native' 4 3 import {type AppBskyLabelerDefs, BSKY_LABELER_DID} from '@atproto/api' 5 4 import {msg, Trans} from '@lingui/macro' 6 5 import {useLingui} from '@lingui/react'
+7 -27
src/lib/strings/helpers.ts
··· 1 - import {useCallback, useMemo} from 'react' 2 1 import {type RichText} from '@atproto/api' 3 - import Graphemer from 'graphemer' 2 + import {countGraphemes} from 'unicode-segmenter/grapheme' 4 3 5 4 import {shortenLinks} from './rich-text-manip' 6 5 ··· 29 28 return str 30 29 } 31 30 32 - export function useEnforceMaxGraphemeCount() { 33 - const splitter = useMemo(() => new Graphemer(), []) 34 - 35 - return useCallback( 36 - (text: string, maxCount: number) => { 37 - if (splitter.countGraphemes(text) > maxCount) { 38 - return splitter.splitGraphemes(text).slice(0, maxCount).join('') 39 - } else { 40 - return text 41 - } 42 - }, 43 - [splitter], 44 - ) 45 - } 46 - 47 - export function useWarnMaxGraphemeCount({ 31 + export function isOverMaxGraphemeCount({ 48 32 text, 49 33 maxCount, 50 34 }: { 51 35 text: string | RichText 52 36 maxCount: number 53 37 }) { 54 - const splitter = useMemo(() => new Graphemer(), []) 55 - 56 - return useMemo(() => { 57 - if (typeof text === 'string') { 58 - return splitter.countGraphemes(text) > maxCount 59 - } else { 60 - return shortenLinks(text).graphemeLength > maxCount 61 - } 62 - }, [splitter, maxCount, text]) 38 + if (typeof text === 'string') { 39 + return countGraphemes(text) > maxCount 40 + } else { 41 + return shortenLinks(text).graphemeLength > maxCount 42 + } 63 43 } 64 44 65 45 export function countLines(str: string | undefined): number {
+2 -1
src/locale/i18n.ts
··· 138 138 await Promise.all([ 139 139 import('@formatjs/intl-pluralrules/locale-data/eo'), 140 140 import('@formatjs/intl-numberformat/locale-data/eo'), 141 - import('@formatjs/intl-displaynames/locale-data/eo'), 141 + // borked, see https://github.com/bluesky-social/social-app/pull/9574 142 + // import('@formatjs/intl-displaynames/locale-data/eo'), 142 143 ]) 143 144 break 144 145 }
+122 -119
src/locale/locales/en/messages.po
··· 436 436 msgstr "" 437 437 438 438 #: src/screens/Settings/FindContactsSettings.tsx:430 439 - msgid "{numMatches, plural, one {1 contact found} other {# contacts found}}" 439 + msgid "{numMatches, plural, one {# contact found} other {# contacts found}}" 440 440 msgstr "" 441 441 442 442 #: src/components/NewskieDialog.tsx:113 ··· 574 574 msgid "A screenshot of a profile page with a bell icon next to the follow button, indicating the new activity notifications feature." 575 575 msgstr "" 576 576 577 - #: src/Navigation.tsx:534 577 + #: src/Navigation.tsx:535 578 578 #: src/screens/Settings/AboutSettings.tsx:75 579 579 #: src/screens/Settings/Settings.tsx:262 580 580 #: src/screens/Settings/Settings.tsx:265 ··· 609 609 msgid "Accessibility" 610 610 msgstr "" 611 611 612 - #: src/Navigation.tsx:385 612 + #: src/Navigation.tsx:386 613 613 msgid "Accessibility Settings" 614 614 msgstr "" 615 615 616 - #: src/Navigation.tsx:401 616 + #: src/Navigation.tsx:402 617 617 #: src/screens/Login/LoginForm.tsx:194 618 618 #: src/screens/Settings/AccountSettings.tsx:51 619 619 #: src/screens/Settings/Settings.tsx:180 ··· 648 648 msgid "Account Muted by List" 649 649 msgstr "" 650 650 651 - #: src/screens/Settings/Settings.tsx:644 651 + #: src/screens/Settings/Settings.tsx:646 652 652 msgid "Account options" 653 653 msgstr "" 654 654 ··· 656 656 msgid "Account provider" 657 657 msgstr "" 658 658 659 - #: src/screens/Settings/Settings.tsx:680 659 + #: src/screens/Settings/Settings.tsx:682 660 660 msgid "Account removed from quick access" 661 661 msgstr "" 662 662 ··· 688 688 msgid "Activity from others" 689 689 msgstr "" 690 690 691 - #: src/Navigation.tsx:502 691 + #: src/Navigation.tsx:503 692 692 msgid "Activity notifications" 693 693 msgstr "" 694 694 ··· 770 770 msgid "Add emoji reaction" 771 771 msgstr "" 772 772 773 - #: src/view/com/feeds/ComposerPrompt.tsx:224 773 + #: src/view/com/feeds/ComposerPrompt.tsx:222 774 774 msgid "Add image" 775 775 msgstr "" 776 776 ··· 1011 1011 msgid "Already signed in as @{0}" 1012 1012 msgstr "" 1013 1013 1014 - #: src/components/Post/Embed/ExternalEmbed/Gif.tsx:186 1014 + #: src/components/Post/Embed/ExternalEmbed/Gif.tsx:197 1015 1015 #: src/view/com/composer/GifAltText.tsx:100 1016 1016 #: src/view/com/composer/photos/Gallery.tsx:188 1017 1017 msgid "ALT" ··· 1027 1027 msgid "Alt text" 1028 1028 msgstr "" 1029 1029 1030 - #: src/components/Post/Embed/ExternalEmbed/Gif.tsx:191 1030 + #: src/components/Post/Embed/ExternalEmbed/Gif.tsx:202 1031 1031 msgid "Alt Text" 1032 1032 msgstr "" 1033 1033 ··· 1167 1167 msgid "Animals" 1168 1168 msgstr "" 1169 1169 1170 - #: src/components/Post/Embed/ExternalEmbed/Gif.tsx:149 1170 + #: src/components/Post/Embed/ExternalEmbed/Gif.tsx:160 1171 1171 msgid "Animated GIF" 1172 1172 msgstr "" 1173 1173 ··· 1193 1193 msgid "Anyone who follows me" 1194 1194 msgstr "" 1195 1195 1196 - #: src/Navigation.tsx:542 1196 + #: src/Navigation.tsx:543 1197 1197 #: src/screens/Settings/AppIconSettings/index.tsx:67 1198 1198 #: src/screens/Settings/AppIconSettings/SettingsListItem.tsx:18 1199 1199 #: src/screens/Settings/AppIconSettings/SettingsListItem.tsx:23 ··· 1234 1234 msgid "App passwords" 1235 1235 msgstr "" 1236 1236 1237 - #: src/Navigation.tsx:353 1237 + #: src/Navigation.tsx:354 1238 1238 #: src/screens/Settings/AppPasswords.tsx:50 1239 1239 msgid "App Passwords" 1240 1240 msgstr "" ··· 1270 1270 msgid "Appeal this decision" 1271 1271 msgstr "" 1272 1272 1273 - #: src/Navigation.tsx:393 1273 + #: src/Navigation.tsx:394 1274 1274 #: src/screens/Settings/AppearanceSettings.tsx:73 1275 1275 #: src/screens/Settings/Settings.tsx:230 1276 1276 #: src/screens/Settings/Settings.tsx:233 ··· 1520 1520 msgid "Blocked accounts" 1521 1521 msgstr "" 1522 1522 1523 - #: src/Navigation.tsx:194 1523 + #: src/Navigation.tsx:195 1524 1524 #: src/view/screens/ModerationBlockedAccounts.tsx:104 1525 1525 msgid "Blocked Accounts" 1526 1526 msgstr "" ··· 1642 1642 msgid "Browse custom feeds" 1643 1643 msgstr "" 1644 1644 1645 - #: src/components/FeedInterstitials.tsx:778 1645 + #: src/components/FeedInterstitials.tsx:777 1646 1646 msgid "Browse more accounts" 1647 1647 msgstr "" 1648 1648 1649 - #: src/components/FeedInterstitials.tsx:907 1649 + #: src/components/FeedInterstitials.tsx:905 1650 1650 msgid "Browse more feeds on the Explore page" 1651 1651 msgstr "" 1652 1652 1653 - #: src/components/FeedInterstitials.tsx:888 1654 - #: src/components/FeedInterstitials.tsx:891 1653 + #: src/components/FeedInterstitials.tsx:886 1654 + #: src/components/FeedInterstitials.tsx:889 1655 1655 msgid "Browse more suggestions" 1656 1656 msgstr "" 1657 1657 1658 - #: src/components/FeedInterstitials.tsx:916 1658 + #: src/components/FeedInterstitials.tsx:914 1659 1659 msgid "Browse more suggestions on the Explore page" 1660 1660 msgstr "" 1661 1661 ··· 1872 1872 msgstr "" 1873 1873 1874 1874 #: src/lib/hooks/useNotificationHandler.ts:99 1875 - #: src/Navigation.tsx:559 1875 + #: src/Navigation.tsx:560 1876 1876 #: src/view/shell/bottom-bar/BottomBar.tsx:221 1877 1877 #: src/view/shell/desktop/LeftNav.tsx:608 1878 1878 #: src/view/shell/Drawer.tsx:466 ··· 1898 1898 msgid "Chat muted" 1899 1899 msgstr "" 1900 1900 1901 - #: src/Navigation.tsx:569 1901 + #: src/Navigation.tsx:570 1902 1902 #: src/screens/Messages/components/InboxPreview.tsx:22 1903 1903 msgid "Chat request inbox" 1904 1904 msgstr "" ··· 1910 1910 msgstr "" 1911 1911 1912 1912 #: src/components/dms/ConvoMenu.tsx:78 1913 - #: src/Navigation.tsx:564 1913 + #: src/Navigation.tsx:565 1914 1914 #: src/screens/Messages/ChatList.tsx:81 1915 1915 #: src/screens/Messages/ChatList.tsx:85 1916 1916 #: src/screens/Messages/ChatList.tsx:380 ··· 2081 2081 #: src/components/live/EditLiveDialog.tsx:235 2082 2082 #: src/components/NewskieDialog.tsx:167 2083 2083 #: src/components/NewskieDialog.tsx:173 2084 - #: src/components/Post/Embed/ExternalEmbed/Gif.tsx:197 2084 + #: src/components/Post/Embed/ExternalEmbed/Gif.tsx:208 2085 2085 #: src/components/ProgressGuide/FollowDialog.tsx:440 2086 2086 #: src/components/StarterPack/Wizard/WizardEditListDialog.tsx:118 2087 2087 #: src/components/StarterPack/Wizard/WizardEditListDialog.tsx:124 ··· 2199 2199 msgstr "" 2200 2200 2201 2201 #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:45 2202 - #: src/Navigation.tsx:343 2202 + #: src/Navigation.tsx:344 2203 2203 #: src/view/screens/CommunityGuidelines.tsx:37 2204 2204 msgid "Community Guidelines" 2205 2205 msgstr "" ··· 2298 2298 2299 2299 #: src/components/ageAssurance/AgeAssuranceAppealDialog.tsx:93 2300 2300 msgid "Contact us" 2301 + msgstr "" 2302 + 2303 + #: src/screens/Settings/FindContactsSettings.tsx:498 2304 + msgid "Contacts imported" 2301 2305 msgstr "" 2302 2306 2303 2307 #: src/screens/Settings/FindContactsSettings.tsx:471 2304 2308 msgid "Contacts removed" 2305 2309 msgstr "" 2306 2310 2307 - #: src/screens/Settings/FindContactsSettings.tsx:498 2308 - msgid "Contacts uploaded" 2309 - msgstr "" 2310 - 2311 2311 #: src/screens/Settings/ContentAndMediaSettings.tsx:51 2312 2312 msgid "Content & Media" 2313 2313 msgstr "" ··· 2317 2317 msgid "Content and media" 2318 2318 msgstr "" 2319 2319 2320 - #: src/Navigation.tsx:518 2320 + #: src/Navigation.tsx:519 2321 2321 msgid "Content and Media" 2322 2322 msgstr "" 2323 2323 ··· 2515 2515 2516 2516 #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:40 2517 2517 #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:107 2518 - #: src/Navigation.tsx:348 2518 + #: src/Navigation.tsx:349 2519 2519 #: src/view/screens/CopyrightPolicy.tsx:34 2520 2520 msgid "Copyright Policy" 2521 2521 msgstr "" ··· 2604 2604 2605 2605 #: src/components/StarterPack/ProfileStarterPacks.tsx:206 2606 2606 #: src/components/StarterPack/ProfileStarterPacks.tsx:315 2607 - #: src/Navigation.tsx:599 2607 + #: src/Navigation.tsx:600 2608 2608 msgid "Create a starter pack" 2609 2609 msgstr "" 2610 2610 ··· 3230 3230 msgid "Edit moderation list" 3231 3231 msgstr "" 3232 3232 3233 - #: src/Navigation.tsx:358 3233 + #: src/Navigation.tsx:359 3234 3234 #: src/view/screens/Feeds.tsx:518 3235 3235 msgid "Edit My Feeds" 3236 3236 msgstr "" ··· 3272 3272 msgid "Edit who can reply" 3273 3273 msgstr "" 3274 3274 3275 - #: src/Navigation.tsx:604 3275 + #: src/Navigation.tsx:605 3276 3276 msgid "Edit your starter pack" 3277 3277 msgstr "" 3278 3278 ··· 3601 3601 msgid "Explicit sexual images." 3602 3602 msgstr "" 3603 3603 3604 - #: src/Navigation.tsx:778 3604 + #: src/Navigation.tsx:780 3605 3605 #: src/screens/Search/Shell.tsx:327 3606 3606 #: src/view/shell/desktop/LeftNav.tsx:690 3607 3607 #: src/view/shell/Drawer.tsx:414 ··· 3637 3637 msgid "External media may allow websites to collect information about you and your device. No information is sent or requested until you press the \"play\" button." 3638 3638 msgstr "" 3639 3639 3640 - #: src/Navigation.tsx:377 3640 + #: src/Navigation.tsx:378 3641 3641 #: src/screens/Settings/ExternalMediaPreferences.tsx:34 3642 3642 msgid "External Media Preferences" 3643 3643 msgstr "" ··· 3874 3874 msgid "False information about elections" 3875 3875 msgstr "" 3876 3876 3877 - #: src/Navigation.tsx:293 3877 + #: src/Navigation.tsx:294 3878 3878 msgid "Feed" 3879 3879 msgstr "" 3880 3880 ··· 3915 3915 msgid "Feedback sent to feed operator" 3916 3916 msgstr "" 3917 3917 3918 - #: src/Navigation.tsx:584 3918 + #: src/Navigation.tsx:585 3919 3919 #: src/screens/SavedFeeds.tsx:108 3920 3920 #: src/screens/Search/SearchResults.tsx:78 3921 3921 #: src/screens/StarterPack/StarterPackScreen.tsx:190 ··· 3986 3986 msgid "Find accounts to follow" 3987 3987 msgstr "" 3988 3988 3989 - #: src/Navigation.tsx:425 3990 - #: src/Navigation.tsx:626 3989 + #: src/Navigation.tsx:426 3990 + #: src/Navigation.tsx:627 3991 3991 msgid "Find Contacts" 3992 3992 msgstr "" 3993 3993 ··· 4141 4141 msgid "Followed by <0>{0}</0>, <1>{1}</1>, and {2, plural, one {# other} other {# others}}" 4142 4142 msgstr "" 4143 4143 4144 - #: src/Navigation.tsx:247 4144 + #: src/Navigation.tsx:248 4145 4145 msgid "Followers of @{0} that you know" 4146 4146 msgstr "" 4147 4147 ··· 4184 4184 msgid "Following feed preferences" 4185 4185 msgstr "" 4186 4186 4187 - #: src/Navigation.tsx:364 4187 + #: src/Navigation.tsx:365 4188 4188 #: src/screens/Settings/FollowingFeedPreferences.tsx:56 4189 4189 msgid "Following Feed Preferences" 4190 4190 msgstr "" ··· 4510 4510 msgid "Harming or endangering minors" 4511 4511 msgstr "" 4512 4512 4513 - #: src/Navigation.tsx:549 4513 + #: src/Navigation.tsx:550 4514 4514 msgid "Hashtag" 4515 4515 msgstr "" 4516 4516 ··· 4696 4696 msgid "Hold up! We’re gradually giving access to video, and you’re still waiting in line. Check back soon!" 4697 4697 msgstr "" 4698 4698 4699 - #: src/Navigation.tsx:773 4700 - #: src/Navigation.tsx:793 4699 + #: src/Navigation.tsx:775 4700 + #: src/Navigation.tsx:795 4701 4701 #: src/view/shell/bottom-bar/BottomBar.tsx:178 4702 4702 #: src/view/shell/desktop/LeftNav.tsx:672 4703 4703 #: src/view/shell/Drawer.tsx:440 ··· 4853 4853 msgid "Import contacts to find your friends" 4854 4854 msgstr "" 4855 4855 4856 + #: src/screens/Settings/FindContactsSettings.tsx:507 4857 + msgid "Imported on {0}" 4858 + msgstr "" 4859 + 4856 4860 #: src/ageAssurance/components/NoAccessScreen.tsx:204 4857 4861 msgid "In order to provide an age-appropriate experience, we need to know your birthdate. This is a one-time thing, and your data will be kept private." 4858 4862 msgstr "" ··· 5081 5085 msgid "Labels on your content" 5082 5086 msgstr "" 5083 5087 5084 - #: src/Navigation.tsx:220 5088 + #: src/Navigation.tsx:221 5085 5089 msgid "Language Settings" 5086 5090 msgstr "" 5087 5091 ··· 5258 5262 msgid "Like 10 posts to train the Discover feed" 5259 5263 msgstr "" 5260 5264 5261 - #: src/Navigation.tsx:462 5265 + #: src/Navigation.tsx:463 5262 5266 msgid "Like notifications" 5263 5267 msgstr "" 5264 5268 ··· 5270 5274 msgid "Like this labeler" 5271 5275 msgstr "" 5272 5276 5273 - #: src/Navigation.tsx:298 5274 - #: src/Navigation.tsx:303 5277 + #: src/Navigation.tsx:299 5278 + #: src/Navigation.tsx:304 5275 5279 msgid "Liked by" 5276 5280 msgstr "" 5277 5281 ··· 5306 5310 msgid "Likes of your reposts" 5307 5311 msgstr "" 5308 5312 5309 - #: src/Navigation.tsx:486 5313 + #: src/Navigation.tsx:487 5310 5314 msgid "Likes of your reposts notifications" 5311 5315 msgstr "" 5312 5316 ··· 5319 5323 msgid "Linear" 5320 5324 msgstr "" 5321 5325 5322 - #: src/Navigation.tsx:253 5326 + #: src/Navigation.tsx:254 5323 5327 msgid "List" 5324 5328 msgstr "" 5325 5329 ··· 5399 5403 msgid "List unmuted" 5400 5404 msgstr "" 5401 5405 5402 - #: src/Navigation.tsx:174 5406 + #: src/Navigation.tsx:175 5403 5407 #: src/view/screens/Lists.tsx:67 5404 5408 #: src/view/screens/Profile.tsx:233 5405 5409 #: src/view/screens/Profile.tsx:241 ··· 5464 5468 msgid "Loading..." 5465 5469 msgstr "" 5466 5470 5467 - #: src/Navigation.tsx:323 5471 + #: src/Navigation.tsx:324 5468 5472 msgid "Log" 5469 5473 msgstr "" 5470 5474 ··· 5559 5563 msgid "Media that may be disturbing or inappropriate for some audiences." 5560 5564 msgstr "" 5561 5565 5562 - #: src/Navigation.tsx:446 5566 + #: src/Navigation.tsx:447 5563 5567 msgid "Mention notifications" 5564 5568 msgstr "" 5565 5569 ··· 5612 5616 msgid "Message options" 5613 5617 msgstr "" 5614 5618 5615 - #: src/Navigation.tsx:788 5619 + #: src/Navigation.tsx:790 5616 5620 msgid "Messages" 5617 5621 msgstr "" 5618 5622 ··· 5625 5629 msgid "Minor harassment or bullying" 5626 5630 msgstr "" 5627 5631 5628 - #: src/Navigation.tsx:510 5632 + #: src/Navigation.tsx:511 5629 5633 msgid "Miscellaneous notifications" 5630 5634 msgstr "" 5631 5635 ··· 5633 5637 msgid "Misleading" 5634 5638 msgstr "" 5635 5639 5636 - #: src/Navigation.tsx:179 5640 + #: src/Navigation.tsx:180 5637 5641 #: src/screens/Moderation/index.tsx:99 5638 5642 #: src/screens/Settings/Settings.tsx:194 5639 5643 #: src/screens/Settings/Settings.tsx:197 ··· 5672 5676 msgid "Moderation lists" 5673 5677 msgstr "" 5674 5678 5675 - #: src/Navigation.tsx:184 5679 + #: src/Navigation.tsx:185 5676 5680 #: src/view/screens/ModerationModlists.tsx:67 5677 5681 msgid "Moderation Lists" 5678 5682 msgstr "" ··· 5681 5685 msgid "moderation settings" 5682 5686 msgstr "" 5683 5687 5684 - #: src/Navigation.tsx:313 5688 + #: src/Navigation.tsx:314 5685 5689 msgid "Moderation states" 5686 5690 msgstr "" 5687 5691 ··· 5804 5808 msgid "Muted accounts" 5805 5809 msgstr "" 5806 5810 5807 - #: src/Navigation.tsx:189 5811 + #: src/Navigation.tsx:190 5808 5812 #: src/view/screens/ModerationMutedAccounts.tsx:116 5809 5813 msgid "Muted Accounts" 5810 5814 msgstr "" ··· 5903 5907 msgid "New Feature" 5904 5908 msgstr "" 5905 5909 5906 - #: src/Navigation.tsx:478 5910 + #: src/Navigation.tsx:479 5907 5911 msgid "New follower notifications" 5908 5912 msgstr "" 5909 5913 ··· 6209 6213 msgid "Not followed by anyone you're following" 6210 6214 msgstr "" 6211 6215 6212 - #: src/Navigation.tsx:169 6216 + #: src/Navigation.tsx:170 6213 6217 #: src/view/screens/Profile.tsx:132 6214 6218 msgid "Not Found" 6215 6219 msgstr "" ··· 6235 6239 msgid "Nothing saved yet" 6236 6240 msgstr "" 6237 6241 6238 - #: src/Navigation.tsx:432 6239 - #: src/Navigation.tsx:579 6242 + #: src/Navigation.tsx:433 6243 + #: src/Navigation.tsx:580 6240 6244 #: src/view/screens/Notifications.tsx:136 6241 6245 msgid "Notification settings" 6242 6246 msgstr "" ··· 6249 6253 msgid "Notification Sounds" 6250 6254 msgstr "" 6251 6255 6252 - #: src/Navigation.tsx:574 6253 - #: src/Navigation.tsx:783 6256 + #: src/Navigation.tsx:575 6257 + #: src/Navigation.tsx:785 6254 6258 #: src/screens/Notifications/ActivityList.tsx:30 6255 6259 #: src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx:90 6256 6260 #: src/screens/Settings/NotificationSettings/index.tsx:92 ··· 6392 6396 msgid "Open avatar creator" 6393 6397 msgstr "" 6394 6398 6395 - #: src/view/com/feeds/ComposerPrompt.tsx:202 6399 + #: src/view/com/feeds/ComposerPrompt.tsx:200 6396 6400 msgid "Open camera" 6397 6401 msgstr "" 6398 6402 ··· 6501 6505 msgid "Opens composer" 6502 6506 msgstr "" 6503 6507 6504 - #: src/view/com/feeds/ComposerPrompt.tsx:203 6508 + #: src/view/com/feeds/ComposerPrompt.tsx:201 6505 6509 msgid "Opens device camera" 6506 6510 msgstr "" 6507 6511 ··· 6532 6536 msgid "Opens helpdesk in browser" 6533 6537 msgstr "" 6534 6538 6535 - #: src/view/com/feeds/ComposerPrompt.tsx:225 6539 + #: src/view/com/feeds/ComposerPrompt.tsx:223 6536 6540 msgid "Opens image picker" 6537 6541 msgstr "" 6538 6542 ··· 6675 6679 msgid "Password updated!" 6676 6680 msgstr "" 6677 6681 6678 - #: src/components/Post/Embed/ExternalEmbed/Gif.tsx:43 6682 + #: src/components/Post/Embed/ExternalEmbed/Gif.tsx:44 6679 6683 #: src/components/Post/Embed/VideoEmbed/VideoEmbedInner/VideoEmbedInnerNative.tsx:137 6680 6684 #: src/components/Post/Embed/VideoEmbed/VideoEmbedInner/web-controls/VideoControls.tsx:369 6681 6685 msgid "Pause" ··· 6691 6695 msgid "People" 6692 6696 msgstr "" 6693 6697 6694 - #: src/Navigation.tsx:240 6698 + #: src/Navigation.tsx:241 6695 6699 msgid "People followed by @{0}" 6696 6700 msgstr "" 6697 6701 6698 - #: src/Navigation.tsx:233 6702 + #: src/Navigation.tsx:234 6699 6703 msgid "People following @{0}" 6700 6704 msgstr "" 6701 6705 ··· 6786 6790 msgid "Pinned to your feeds" 6787 6791 msgstr "" 6788 6792 6789 - #: src/components/Post/Embed/ExternalEmbed/Gif.tsx:43 6793 + #: src/components/Post/Embed/ExternalEmbed/Gif.tsx:44 6790 6794 #: src/components/Post/Embed/VideoEmbed/VideoEmbedInner/VideoEmbedInnerNative.tsx:137 6791 6795 #: src/components/Post/Embed/VideoEmbed/VideoEmbedInner/web-controls/VideoControls.tsx:370 6792 6796 msgid "Play" ··· 6805 6809 msgid "Play Video" 6806 6810 msgstr "" 6807 6811 6808 - #: src/components/Post/Embed/ExternalEmbed/Gif.tsx:42 6812 + #: src/components/Post/Embed/ExternalEmbed/Gif.tsx:43 6809 6813 msgid "Plays or pauses the GIF" 6810 6814 msgstr "" 6811 6815 ··· 6953 6957 msgid "Please sign in as @{0}" 6954 6958 msgstr "" 6955 6959 6960 + #: src/screens/Settings/FindContactsSettings.tsx:102 6961 + msgid "Please use the native app to import your contacts." 6962 + msgstr "" 6963 + 6956 6964 #: src/screens/FindContactsFlowScreen.tsx:71 6957 - #: src/screens/Settings/FindContactsSettings.tsx:102 6958 6965 msgid "Please use the native app to sync your contacts." 6959 6966 msgstr "" 6960 6967 ··· 7004 7011 msgid "Post blocked" 7005 7012 msgstr "" 7006 7013 7007 - #: src/Navigation.tsx:266 7008 - #: src/Navigation.tsx:273 7009 - #: src/Navigation.tsx:280 7010 - #: src/Navigation.tsx:287 7014 + #: src/Navigation.tsx:267 7015 + #: src/Navigation.tsx:274 7016 + #: src/Navigation.tsx:281 7017 + #: src/Navigation.tsx:288 7011 7018 msgid "Post by @{0}" 7012 7019 msgstr "" 7013 7020 ··· 7041 7048 msgid "Post interaction settings" 7042 7049 msgstr "" 7043 7050 7044 - #: src/Navigation.tsx:200 7051 + #: src/Navigation.tsx:201 7045 7052 #: src/screens/ModerationInteractionSettings/index.tsx:34 7046 7053 msgid "Post Interaction Settings" 7047 7054 msgstr "" ··· 7140 7147 msgid "Privacy and security" 7141 7148 msgstr "" 7142 7149 7143 - #: src/Navigation.tsx:409 7144 - #: src/Navigation.tsx:417 7150 + #: src/Navigation.tsx:410 7151 + #: src/Navigation.tsx:418 7145 7152 #: src/screens/Settings/ActivityPrivacySettings.tsx:40 7146 7153 #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:44 7147 7154 msgid "Privacy and Security" ··· 7154 7161 7155 7162 #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:35 7156 7163 #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:102 7157 - #: src/Navigation.tsx:333 7164 + #: src/Navigation.tsx:334 7158 7165 #: src/screens/Settings/AboutSettings.tsx:92 7159 7166 #: src/screens/Settings/AboutSettings.tsx:95 7160 7167 #: src/view/screens/PrivacyPolicy.tsx:34 ··· 7253 7260 msgid "QR code saved to your camera roll!" 7254 7261 msgstr "" 7255 7262 7256 - #: src/Navigation.tsx:454 7263 + #: src/Navigation.tsx:455 7257 7264 msgid "Quote notifications" 7258 7265 msgstr "" 7259 7266 ··· 7414 7421 #: src/components/StarterPack/Wizard/WizardListCard.tsx:105 7415 7422 #: src/components/StarterPack/Wizard/WizardListCard.tsx:112 7416 7423 #: src/screens/Bookmarks/index.tsx:266 7417 - #: src/screens/Settings/Settings.tsx:682 7424 + #: src/screens/Settings/Settings.tsx:684 7418 7425 #: src/view/com/modals/UserAddRemoveLists.tsx:235 7419 7426 #: src/view/com/posts/PostFeedErrorMessage.tsx:220 7420 7427 msgid "Remove" ··· 7428 7435 msgid "Remove {historyItem}" 7429 7436 msgstr "" 7430 7437 7431 - #: src/screens/Settings/Settings.tsx:661 7432 - #: src/screens/Settings/Settings.tsx:664 7438 + #: src/screens/Settings/Settings.tsx:663 7439 + #: src/screens/Settings/Settings.tsx:666 7433 7440 msgid "Remove account" 7434 7441 msgstr "" 7435 7442 ··· 7474 7481 msgid "Remove from my feeds" 7475 7482 msgstr "" 7476 7483 7477 - #: src/screens/Settings/Settings.tsx:674 7484 + #: src/screens/Settings/Settings.tsx:676 7478 7485 msgid "Remove from quick access?" 7479 7486 msgstr "" 7480 7487 ··· 7641 7648 msgid "Reply Hidden by You" 7642 7649 msgstr "" 7643 7650 7644 - #: src/Navigation.tsx:438 7651 + #: src/Navigation.tsx:439 7645 7652 msgid "Reply notifications" 7646 7653 msgstr "" 7647 7654 ··· 7756 7763 msgid "Repost ({0, plural, one {# repost} other {# reposts}})" 7757 7764 msgstr "" 7758 7765 7759 - #: src/Navigation.tsx:470 7766 + #: src/Navigation.tsx:471 7760 7767 msgid "Repost notifications" 7761 7768 msgstr "" 7762 7769 ··· 7797 7804 msgid "Reposts of your reposts" 7798 7805 msgstr "" 7799 7806 7800 - #: src/Navigation.tsx:494 7807 + #: src/Navigation.tsx:495 7801 7808 msgid "Reposts of your reposts notifications" 7802 7809 msgstr "" 7803 7810 ··· 8006 8013 msgstr "" 8007 8014 8008 8015 #: src/components/dialogs/nuxs/BookmarksAnnouncement.tsx:143 8009 - #: src/Navigation.tsx:618 8016 + #: src/Navigation.tsx:619 8010 8017 #: src/screens/Bookmarks/index.tsx:60 8011 8018 msgid "Saved Posts" 8012 8019 msgstr "" ··· 8052 8059 msgid "Search" 8053 8060 msgstr "" 8054 8061 8055 - #: src/Navigation.tsx:259 8062 + #: src/Navigation.tsx:260 8056 8063 #: src/screens/Profile/ProfileSearch.tsx:37 8057 8064 msgid "Search @{0}'s posts" 8058 8065 msgstr "" ··· 8169 8176 msgstr "" 8170 8177 8171 8178 #: src/components/FeedInterstitials.tsx:730 8172 - #: src/components/FeedInterstitials.tsx:793 8179 + #: src/components/FeedInterstitials.tsx:791 8173 8180 msgid "See more" 8174 8181 msgstr "" 8175 8182 ··· 8448 8455 msgid "Sets email for password reset" 8449 8456 msgstr "" 8450 8457 8451 - #: src/Navigation.tsx:215 8458 + #: src/Navigation.tsx:216 8452 8459 #: src/screens/Settings/Settings.tsx:105 8453 8460 #: src/view/shell/desktop/LeftNav.tsx:805 8454 8461 #: src/view/shell/Drawer.tsx:609 ··· 8593 8600 msgid "Share your favorite feed!" 8594 8601 msgstr "" 8595 8602 8596 - #: src/Navigation.tsx:318 8603 + #: src/Navigation.tsx:319 8597 8604 msgid "Shared Preferences Tester" 8598 8605 msgstr "" 8599 8606 ··· 8603 8610 msgid "Show" 8604 8611 msgstr "" 8605 8612 8606 - #: src/components/Post/Embed/ExternalEmbed/Gif.tsx:178 8613 + #: src/components/Post/Embed/ExternalEmbed/Gif.tsx:189 8607 8614 msgid "Show alt text" 8608 8615 msgstr "" 8609 8616 ··· 8842 8849 msgid "Some of your verifications are invalid." 8843 8850 msgstr "" 8844 8851 8845 - #: src/components/FeedInterstitials.tsx:870 8852 + #: src/components/FeedInterstitials.tsx:868 8846 8853 msgid "Some other feeds you might like" 8847 8854 msgstr "" 8848 8855 ··· 8956 8963 msgid "Start chat with {displayName}" 8957 8964 msgstr "" 8958 8965 8959 - #: src/Navigation.tsx:589 8960 - #: src/Navigation.tsx:594 8966 + #: src/Navigation.tsx:590 8967 + #: src/Navigation.tsx:595 8961 8968 #: src/screens/StarterPack/Wizard/index.tsx:209 8962 8969 msgid "Starter Pack" 8963 8970 msgstr "" ··· 9010 9017 msgid "Stored as part of a secure code for matching with others" 9011 9018 msgstr "" 9012 9019 9013 - #: src/Navigation.tsx:308 9020 + #: src/Navigation.tsx:309 9014 9021 #: src/screens/Settings/Settings.tsx:466 9015 9022 msgid "Storybook" 9016 9023 msgstr "" ··· 9101 9108 msgid "Sunset" 9102 9109 msgstr "" 9103 9110 9104 - #: src/Navigation.tsx:328 9111 + #: src/Navigation.tsx:329 9105 9112 #: src/view/screens/Support.tsx:34 9106 9113 #: src/view/screens/Support.tsx:37 9107 9114 msgid "Support" ··· 9215 9222 #: src/components/dialogs/BirthDateSettings.tsx:182 9216 9223 #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:30 9217 9224 #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:97 9218 - #: src/Navigation.tsx:338 9225 + #: src/Navigation.tsx:339 9219 9226 #: src/screens/Settings/AboutSettings.tsx:84 9220 9227 #: src/screens/Settings/AboutSettings.tsx:87 9221 9228 #: src/view/screens/TermsOfService.tsx:34 ··· 9528 9535 msgid "This appeal will be sent to Bluesky's moderation service." 9529 9536 msgstr "" 9530 9537 9538 + #: src/screens/PostThread/components/ThreadItemAnchorNoUnauthenticated.tsx:27 9539 + #: src/screens/PostThread/components/ThreadItemPostNoUnauthenticated.tsx:47 9540 + msgid "This author has chosen to make their posts visible only to people who are signed in." 9541 + msgstr "" 9542 + 9531 9543 #: src/screens/Messages/components/MessageListError.tsx:18 9532 9544 msgid "This chat was disconnected" 9533 9545 msgstr "" ··· 9737 9749 msgid "This will delete \"{0}\" from your muted words. You can always add it back later." 9738 9750 msgstr "" 9739 9751 9740 - #: src/screens/Settings/Settings.tsx:676 9752 + #: src/screens/Settings/Settings.tsx:678 9741 9753 msgid "This will remove @{0} from the quick access list." 9742 9754 msgstr "" 9743 9755 ··· 9764 9776 msgid "Threaded" 9765 9777 msgstr "" 9766 9778 9767 - #: src/Navigation.tsx:371 9779 + #: src/Navigation.tsx:372 9768 9780 msgid "Threads Preferences" 9769 9781 msgstr "" 9770 9782 ··· 9830 9842 msgid "Top replies first" 9831 9843 msgstr "" 9832 9844 9833 - #: src/Navigation.tsx:554 9845 + #: src/Navigation.tsx:555 9834 9846 msgid "Topic" 9835 9847 msgstr "" 9836 9848 ··· 10200 10212 msgid "Upload from Library" 10201 10213 msgstr "" 10202 10214 10203 - #: src/screens/Settings/FindContactsSettings.tsx:507 10204 - msgid "Uploaded on {0}" 10205 - msgstr "" 10206 - 10207 10215 #: src/lib/api/index.ts:302 10208 10216 msgid "Uploading images..." 10209 10217 msgstr "" ··· 10341 10349 msgid "Verification settings" 10342 10350 msgstr "" 10343 10351 10344 - #: src/Navigation.tsx:208 10352 + #: src/Navigation.tsx:209 10345 10353 #: src/screens/Moderation/VerificationSettings.tsx:32 10346 10354 msgid "Verification Settings" 10347 10355 msgstr "" ··· 10447 10455 msgid "Video failed to process" 10448 10456 msgstr "" 10449 10457 10450 - #: src/Navigation.tsx:610 10458 + #: src/Navigation.tsx:611 10451 10459 msgid "Video Feed" 10452 10460 msgstr "" 10453 10461 ··· 10858 10866 #: src/view/com/auth/SplashScreen.tsx:51 10859 10867 #: src/view/com/auth/SplashScreen.web.tsx:103 10860 10868 #: src/view/com/composer/Composer.tsx:857 10861 - #: src/view/com/feeds/ComposerPrompt.tsx:193 10869 + #: src/view/com/feeds/ComposerPrompt.tsx:191 10862 10870 msgid "What's up?" 10863 10871 msgstr "" 10864 10872 ··· 11278 11286 msgid "You must grant access to your photo library to save a QR code" 11279 11287 msgstr "" 11280 11288 11281 - #: src/screens/PostThread/components/ThreadItemAnchorNoUnauthenticated.tsx:27 11282 - #: src/screens/PostThread/components/ThreadItemPostNoUnauthenticated.tsx:47 11283 - msgid "You must sign in to view this post." 11284 - msgstr "" 11285 - 11286 11289 #: src/view/com/composer/SelectMediaButton.tsx:442 11287 11290 msgid "You need to allow access to your media library." 11288 11291 msgstr "" ··· 11524 11527 msgid "Your full handle will be <0>@{0}</0>" 11525 11528 msgstr "" 11526 11529 11527 - #: src/Navigation.tsx:526 11530 + #: src/Navigation.tsx:527 11528 11531 #: src/screens/Search/modules/ExploreInterestsCard.tsx:67 11529 11532 #: src/screens/Settings/ContentAndMediaSettings.tsx:92 11530 11533 #: src/screens/Settings/ContentAndMediaSettings.tsx:95
+2 -2
src/screens/Messages/components/MessageInput.tsx
··· 14 14 import {useSafeAreaInsets} from 'react-native-safe-area-context' 15 15 import {msg} from '@lingui/macro' 16 16 import {useLingui} from '@lingui/react' 17 - import Graphemer from 'graphemer' 17 + import {countGraphemes} from 'unicode-segmenter/grapheme' 18 18 19 19 import {HITSLOP_10, MAX_DM_GRAPHEME_LENGTH} from '#/lib/constants' 20 20 import {useHaptics} from '#/lib/haptics' ··· 78 78 if (!hasEmbed && message.trim() === '') { 79 79 return 80 80 } 81 - if (new Graphemer().countGraphemes(message) > MAX_DM_GRAPHEME_LENGTH) { 81 + if (countGraphemes(message) > MAX_DM_GRAPHEME_LENGTH) { 82 82 Toast.show(_(msg`Message is too long`), 'xmark') 83 83 return 84 84 }
+2 -2
src/screens/Messages/components/MessageInput.web.tsx
··· 2 2 import {Pressable, View} from 'react-native' 3 3 import {msg} from '@lingui/macro' 4 4 import {useLingui} from '@lingui/react' 5 - import Graphemer from 'graphemer' 6 5 import {flushSync} from 'react-dom' 7 6 import TextareaAutosize from 'react-textarea-autosize' 7 + import {countGraphemes} from 'unicode-segmenter/grapheme' 8 8 9 9 import {isSafari, isTouchDevice} from '#/lib/browser' 10 10 import {MAX_DM_GRAPHEME_LENGTH} from '#/lib/constants' ··· 59 59 if (!hasEmbed && message.trim() === '') { 60 60 return 61 61 } 62 - if (new Graphemer().countGraphemes(message) > MAX_DM_GRAPHEME_LENGTH) { 62 + if (countGraphemes(message) > MAX_DM_GRAPHEME_LENGTH) { 63 63 Toast.show(_(msg`Message is too long`), 'xmark') 64 64 return 65 65 }
+1 -1
src/screens/ModerationInteractionSettings/index.tsx
··· 2 2 import {View} from 'react-native' 3 3 import {msg, Trans} from '@lingui/macro' 4 4 import {useLingui} from '@lingui/react' 5 - import deepEqual from 'lodash.isequal' 5 + import deepEqual from 'fast-deep-equal' 6 6 7 7 import {logger} from '#/logger' 8 8 import {usePostInteractionSettingsMutation} from '#/state/queries/post-interaction-settings'
+4 -1
src/screens/PostThread/components/ThreadItemAnchorNoUnauthenticated.tsx
··· 24 24 25 25 <View style={[a.py_sm]}> 26 26 <Text style={[a.text_xl, a.italic, t.atoms.text_contrast_medium]}> 27 - <Trans>You must sign in to view this post.</Trans> 27 + <Trans> 28 + This author has chosen to make their posts visible only to people 29 + who are signed in. 30 + </Trans> 28 31 </Text> 29 32 </View> 30 33 </View>
+4 -1
src/screens/PostThread/components/ThreadItemPostNoUnauthenticated.tsx
··· 44 44 </Skele.Circle> 45 45 46 46 <Text style={[a.text_md, a.italic, t.atoms.text_contrast_medium]}> 47 - <Trans>You must sign in to view this post.</Trans> 47 + <Trans> 48 + This author has chosen to make their posts visible only to people 49 + who are signed in. 50 + </Trans> 48 51 </Text> 49 52 </Skele.Row> 50 53 <View
+3 -3
src/screens/Profile/Header/EditProfileDialog.tsx
··· 6 6 7 7 import {urls} from '#/lib/constants' 8 8 import {cleanError} from '#/lib/strings/errors' 9 - import {useWarnMaxGraphemeCount} from '#/lib/strings/helpers' 9 + import {isOverMaxGraphemeCount} from '#/lib/strings/helpers' 10 10 import {logger} from '#/logger' 11 11 import {type ImageMeta} from '#/state/gallery' 12 12 import {useEnableSquareAvatars} from '#/state/preferences/enable-square-avatars' ··· 208 208 _, 209 209 ]) 210 210 211 - const displayNameTooLong = useWarnMaxGraphemeCount({ 211 + const displayNameTooLong = isOverMaxGraphemeCount({ 212 212 text: displayName, 213 213 maxCount: DISPLAY_NAME_MAX_GRAPHEMES, 214 214 }) 215 - const descriptionTooLong = useWarnMaxGraphemeCount({ 215 + const descriptionTooLong = isOverMaxGraphemeCount({ 216 216 text: description, 217 217 maxCount: DESCRIPTION_MAX_GRAPHEMES, 218 218 })
+4 -4
src/screens/Settings/FindContactsSettings.tsx
··· 99 99 ) : ( 100 100 <ErrorScreen 101 101 title={_(msg`Not available on this platform.`)} 102 - message={_(msg`Please use the native app to sync your contacts.`)} 102 + message={_(msg`Please use the native app to import your contacts.`)} 103 103 /> 104 104 )} 105 105 </Layout.Screen> ··· 429 429 <Text style={[a.text_md, a.font_semi_bold]}> 430 430 <Plural 431 431 value={numMatches} 432 - one="1 contact found" 432 + one="# contact found" 433 433 other="# contacts found" 434 434 /> 435 435 </Text> ··· 495 495 <View style={[a.px_xl, a.py_xl, a.gap_4xl]}> 496 496 <View style={[a.gap_xs, a.align_start]}> 497 497 <Text style={[a.text_md, a.font_semi_bold]}> 498 - <Trans>Contacts uploaded</Trans> 498 + <Trans>Contacts imported</Trans> 499 499 </Text> 500 500 <View style={[a.gap_2xs]}> 501 501 <Text ··· 505 505 <Text 506 506 style={[a.text_sm, a.leading_snug, t.atoms.text_contrast_medium]}> 507 507 <Trans> 508 - Uploaded on{' '} 508 + Imported on{' '} 509 509 {i18n.date(new Date(syncedAt), { 510 510 dateStyle: 'long', 511 511 })}
+3 -1
src/screens/Settings/Settings.tsx
··· 644 644 ) : ( 645 645 <View style={[{width: 28}]} /> 646 646 )} 647 - <SettingsList.ItemText> 647 + <SettingsList.ItemText 648 + numberOfLines={1} 649 + style={[a.pr_2xl, a.leading_snug]}> 648 650 {sanitizeHandle(account.handle, '@')} 649 651 </SettingsList.ItemText> 650 652 {pendingDid === account.did && <SettingsList.ItemIcon icon={Loader} />}
+9 -14
src/screens/Takendown.tsx
··· 1 - import {useMemo, useState} from 'react' 1 + import {useState} from 'react' 2 2 import {View} from 'react-native' 3 3 import {KeyboardAwareScrollView} from 'react-native-keyboard-controller' 4 4 import {useSafeAreaInsets} from 'react-native-safe-area-context' ··· 6 6 import {msg, Trans} from '@lingui/macro' 7 7 import {useLingui} from '@lingui/react' 8 8 import {useMutation} from '@tanstack/react-query' 9 - import Graphemer from 'graphemer' 9 + import {countGraphemes} from 'unicode-segmenter/grapheme' 10 10 11 11 import { 12 12 BLUESKY_MOD_SERVICE_HEADERS, ··· 37 37 const agent = useAgent() 38 38 const [isAppealling, setIsAppealling] = useState(false) 39 39 const [reason, setReason] = useState('') 40 - const graphemer = useMemo(() => new Graphemer(), []) 41 40 42 - const reasonGraphemeLength = useMemo(() => { 43 - return graphemer.countGraphemes(reason) 44 - }, [graphemer, reason]) 41 + const reasonGraphemeLength = countGraphemes(reason) 42 + const isOverMaxLength = 43 + reasonGraphemeLength > MAX_REPORT_REASON_GRAPHEME_LENGTH 45 44 46 45 const { 47 46 mutate: submitAppeal, ··· 72 71 const primaryBtn = 73 72 isAppealling && !isSuccess ? ( 74 73 <Button 75 - variant="solid" 76 74 color="primary" 77 75 size="large" 78 76 label={_(msg`Submit appeal`)} 79 77 onPress={() => submitAppeal(reason)} 80 - disabled={ 81 - isPending || reasonGraphemeLength > MAX_REPORT_REASON_GRAPHEME_LENGTH 82 - }> 78 + disabled={isPending || isOverMaxLength}> 83 79 <ButtonText> 84 80 <Trans>Submit Appeal</Trans> 85 81 </ButtonText> ··· 87 83 </Button> 88 84 ) : ( 89 85 <Button 90 - variant="solid" 91 86 size="large" 92 87 color="secondary_inverted" 93 88 label={_(msg`Sign out`)} ··· 204 199 <Text 205 200 style={[ 206 201 a.text_md, 207 - a.leading_normal, 202 + a.leading_snug, 208 203 {color: t.palette.negative_500}, 209 204 a.mt_lg, 210 205 ]}> ··· 213 208 )} 214 209 </View> 215 210 ) : ( 216 - <P style={[t.atoms.text_contrast_medium]}> 211 + <P style={[t.atoms.text_contrast_medium, a.leading_snug]}> 217 212 <Trans> 218 213 Your account was found to be in violation of the{' '} 219 214 <SimpleInlineLinkText 220 215 label={_(msg`Bluesky Social Terms of Service`)} 221 216 to="https://bsky.social/about/support/tos" 222 - style={[a.text_md, a.leading_normal]}> 217 + style={[a.text_md, a.leading_snug]}> 223 218 Bluesky Social Terms of Service 224 219 </SimpleInlineLinkText> 225 220 . You have been sent an email outlining the specific violation
+3 -5
src/view/com/composer/text-input/TextInput.web.tsx
··· 20 20 import {generateJSON} from '@tiptap/html' 21 21 import {Fragment, Node, Slice} from '@tiptap/pm/model' 22 22 import {EditorContent, type JSONContent, useEditor} from '@tiptap/react' 23 - import Graphemer from 'graphemer' 23 + import {splitGraphemes} from 'unicode-segmenter/grapheme' 24 24 25 25 import {useColorSchemeStyle} from '#/lib/hooks/useColorSchemeStyle' 26 26 import {blobToDataUri, isUriImage} from '#/lib/media/util' ··· 218 218 // all the lines get mushed together -sfn 219 219 '\n', 220 220 ) 221 - const graphemes = new Graphemer().splitGraphemes(textBefore) 221 + const graphemes = [...splitGraphemes(textBefore)] 222 222 223 223 if (graphemes.length > 0) { 224 224 const lastGrapheme = graphemes[graphemes.length - 1] ··· 289 289 290 290 markdownFacets.push({ 291 291 index: {byteStart, byteEnd}, 292 - features: [ 293 - { $type: 'app.bsky.richtext.facet#link', uri: validUrl }, 294 - ], 292 + features: [{$type: 'app.bsky.richtext.facet#link', uri: validUrl}], 295 293 }) 296 294 } 297 295
-36
src/view/com/composer/text-input/hooks/useGrapheme.tsx
··· 1 - import {useCallback, useMemo} from 'react' 2 - import Graphemer from 'graphemer' 3 - 4 - export const useGrapheme = () => { 5 - const splitter = useMemo(() => new Graphemer(), []) 6 - 7 - const getGraphemeString = useCallback( 8 - (name: string, length: number) => { 9 - let remainingCharacters = 0 10 - 11 - if (name.length > length) { 12 - const graphemes = splitter.splitGraphemes(name) 13 - 14 - if (graphemes.length > length) { 15 - remainingCharacters = 0 16 - name = `${graphemes.slice(0, length).join('')}…` 17 - } else { 18 - remainingCharacters = length - graphemes.length 19 - name = graphemes.join('') 20 - } 21 - } else { 22 - remainingCharacters = length - name.length 23 - } 24 - 25 - return { 26 - name, 27 - remainingCharacters, 28 - } 29 - }, 30 - [splitter], 31 - ) 32 - 33 - return { 34 - getGraphemeString, 35 - } 36 - }
+1 -1
src/view/com/composer/threadgate/ThreadgateBtn.tsx
··· 4 4 import {type AppBskyFeedPostgate} from '@atproto/api' 5 5 import {msg, Trans} from '@lingui/macro' 6 6 import {useLingui} from '@lingui/react' 7 - import deepEqual from 'lodash.isequal' 7 + import deepEqual from 'fast-deep-equal' 8 8 9 9 import {isNetworkError} from '#/lib/strings/errors' 10 10 import {logger} from '#/logger'
+22 -5
src/view/com/composer/videos/SubtitleDialog.tsx
··· 4 4 import {useLingui} from '@lingui/react' 5 5 6 6 import {MAX_ALT_TEXT} from '#/lib/constants' 7 - import {useEnforceMaxGraphemeCount} from '#/lib/strings/helpers' 7 + import {isOverMaxGraphemeCount} from '#/lib/strings/helpers' 8 8 import {LANGUAGES} from '#/locale/languages' 9 9 import {isWeb} from '#/platform/detection' 10 10 import {useLanguagePrefs} from '#/state/preferences' ··· 73 73 const control = Dialog.useDialogContext() 74 74 const {_} = useLingui() 75 75 const t = useTheme() 76 - const enforceLen = useEnforceMaxGraphemeCount() 77 76 const {primaryLanguage} = useLanguagePrefs() 78 77 79 78 const [altText, setAltText] = useState(defaultAltText) ··· 94 93 ) 95 94 96 95 const subtitleMissingLanguage = captions.some(sub => sub.lang === '') 96 + 97 + const isOverMaxLength = isOverMaxGraphemeCount({ 98 + text: altText, 99 + maxCount: MAX_ALT_TEXT, 100 + }) 97 101 98 102 return ( 99 103 <Dialog.ScrollableInner label={_(msg`Video settings`)}> ··· 101 105 <Text style={[a.text_xl, a.font_semi_bold, a.leading_tight]}> 102 106 <Trans>Alt text</Trans> 103 107 </Text> 104 - <TextField.Root> 108 + <TextField.Root isInvalid={isOverMaxLength}> 105 109 <Dialog.Input 106 110 label={_(msg`Alt text`)} 107 111 placeholder={_(msg`Add alt text (optional)`)} 108 112 value={altText} 109 - onChangeText={evt => setAltText(enforceLen(evt, MAX_ALT_TEXT))} 113 + onChangeText={setAltText} 110 114 maxLength={MAX_ALT_TEXT * 10} 111 115 multiline 112 116 style={{maxHeight: 300}} ··· 119 123 /> 120 124 </TextField.Root> 121 125 126 + {isOverMaxLength && ( 127 + <Text 128 + style={[ 129 + a.text_md, 130 + {color: t.palette.negative_500}, 131 + a.leading_snug, 132 + a.mt_md, 133 + ]}> 134 + <Trans>Alt text must be less than {MAX_ALT_TEXT} characters.</Trans> 135 + </Text> 136 + )} 137 + 122 138 {isWeb && ( 123 139 <> 124 140 <View ··· 174 190 saveAltText(altText) 175 191 control.close() 176 192 }} 177 - style={a.mt_lg}> 193 + style={a.mt_lg} 194 + disabled={isOverMaxLength}> 178 195 <ButtonText> 179 196 <Trans>Done</Trans> 180 197 </ButtonText>
+5 -7
src/view/com/feeds/ComposerPrompt.tsx
··· 1 1 import {useCallback, useState} from 'react' 2 2 import {Keyboard, Pressable, View} from 'react-native' 3 - import {msg} from '@lingui/macro' 3 + import {msg, Trans} from '@lingui/macro' 4 4 import {useLingui} from '@lingui/react' 5 5 6 6 import {useOpenComposer} from '#/lib/hooks/useOpenComposer' ··· 168 168 <SubtleHover hover={hover} /> 169 169 <UserAvatar 170 170 avatar={profile.avatar} 171 - size={40} 171 + size={42} 172 172 type={profile.associated?.labeler ? 'labeler' : 'user'} 173 173 /> 174 174 <View ··· 184 184 ]}> 185 185 <Text 186 186 style={[ 187 - t.atoms.text_contrast_low, 187 + t.atoms.text_contrast_medium, 188 188 a.text_md, 189 - { 190 - includeFontPadding: false, 191 - }, 189 + {includeFontPadding: false}, 192 190 ]}> 193 - {_(msg`What's up?`)} 191 + <Trans>What's up?</Trans> 194 192 </Text> 195 193 <View style={[a.flex_row, a.gap_md]}> 196 194 {isNative && (
+3
src/view/shell/BlockDrawerGesture.web.tsx
··· 1 + export function BlockDrawerGesture({children}: {children: React.ReactNode}) { 2 + return children 3 + }
+5 -1
src/view/shell/createNativeStackNavigatorWithAuth.tsx
··· 50 50 function NativeStackNavigator({ 51 51 id, 52 52 initialRouteName, 53 + UNSTABLE_routeNamesChangeBehavior, 53 54 children, 54 55 layout, 55 56 screenListeners, 56 57 screenOptions, 57 58 screenLayout, 59 + UNSTABLE_router, 58 60 ...rest 59 61 }: NativeStackNavigatorProps) { 60 62 // --- this is copy and pasted from the original native stack navigator --- ··· 68 70 >(StackRouter, { 69 71 id, 70 72 initialRouteName, 73 + UNSTABLE_routeNamesChangeBehavior, 71 74 children, 72 75 layout, 73 76 screenListeners, 74 77 screenOptions, 75 78 screenLayout, 79 + UNSTABLE_router, 76 80 }) 77 81 78 82 React.useEffect( ··· 169 173 170 174 export function createNativeStackNavigatorWithAuth< 171 175 const ParamList extends ParamListBase, 172 - const NavigatorID extends string | undefined = undefined, 176 + const NavigatorID extends string | undefined = string | undefined, 173 177 const TypeBag extends NavigatorTypeBagBase = { 174 178 ParamList: ParamList 175 179 NavigatorID: NavigatorID
+8 -3
src/view/shell/index.tsx
··· 91 91 } 92 92 }, [dedupe, navigation]) 93 93 94 + const drawerLayout = useCallback( 95 + ({children}: {children: React.ReactNode}) => ( 96 + <DrawerLayout>{children}</DrawerLayout> 97 + ), 98 + [], 99 + ) 100 + 94 101 return ( 95 102 <> 96 103 <View style={[a.h_full]}> 97 104 <ErrorBoundary 98 105 style={{paddingTop: insets.top, paddingBottom: insets.bottom}}> 99 - <DrawerLayout> 100 - <TabsNavigator /> 101 - </DrawerLayout> 106 + <TabsNavigator layout={drawerLayout} /> 102 107 </ErrorBoundary> 103 108 </View> 104 109
+39 -59
src/view/shell/index.web.tsx
··· 1 - import {useEffect, useLayoutEffect, useState} from 'react' 1 + import {useCallback, useEffect, useLayoutEffect, useState} from 'react' 2 2 import {StyleSheet, TouchableWithoutFeedback, View} from 'react-native' 3 3 import {msg} from '@lingui/macro' 4 4 import {useLingui} from '@lingui/react' ··· 6 6 import {RemoveScrollBar} from 'react-remove-scroll-bar' 7 7 8 8 import {useIntentHandler} from '#/lib/hooks/useIntentHandler' 9 - import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' 10 9 import {type NavigationProp} from '#/lib/routes/types' 11 10 import {useSession} from '#/state/session' 12 11 import {useIsDrawerOpen, useSetDrawerOpen} from '#/state/shell' ··· 17 16 import {ErrorBoundary} from '#/view/com/util/ErrorBoundary' 18 17 import {Deactivated} from '#/screens/Deactivated' 19 18 import {Takendown} from '#/screens/Takendown' 20 - import {atoms as a, select, useTheme} from '#/alf' 19 + import {atoms as a, select, useBreakpoints, useTheme} from '#/alf' 21 20 import {AgeAssuranceRedirectDialog} from '#/components/ageAssurance/AgeAssuranceRedirectDialog' 22 21 import {EmailDialog} from '#/components/dialogs/EmailDialog' 23 22 import {LinkWarningDialog} from '#/components/dialogs/LinkWarning' ··· 39 38 import {DrawerContent} from './Drawer' 40 39 41 40 function ShellInner() { 42 - const t = useTheme() 43 - const isDrawerOpen = useIsDrawerOpen() 44 - const setDrawerOpen = useSetDrawerOpen() 45 - const {isDesktop} = useWebMediaQueries() 46 41 const navigator = useNavigation<NavigationProp>() 47 42 const closeAllActiveElements = useCloseAllActiveElements() 48 - const {_} = useLingui() 49 - const showDrawer = !isDesktop && isDrawerOpen 50 - const [showDrawerDelayedExit, setShowDrawerDelayedExit] = useState(showDrawer) 51 43 const {state: policyUpdateState} = usePolicyUpdateContext() 52 44 const welcomeModalControl = useWelcomeModal() 53 45 54 - useLayoutEffect(() => { 55 - const rootElement = document.documentElement 56 - rootElement.className = `html` 57 - rootElement.style.setProperty( 58 - 'background', 59 - `${t.atoms.bg.backgroundColor}`, 60 - 'important', 61 - ) 62 - }, [t.atoms.bg.backgroundColor, t.name]) 63 - 64 - useLayoutEffect(() => { 65 - const color = t.palette.primary_500 66 - 67 - const styleId = 'prosemirror-mention-color' 68 - let style = document.getElementById(styleId) as HTMLStyleElement | null 69 - 70 - if (!style) { 71 - style = document.createElement('style') 72 - style.id = styleId 73 - document.head.appendChild(style) 74 - } 75 - 76 - style.innerHTML = ` 77 - .ProseMirror .mention { 78 - color: ${color} !important; 79 - } 80 - .ProseMirror a, 81 - .ProseMirror .autolink { 82 - color: ${color} !important; 83 - } 84 - ` 85 - }, [t.palette.primary_500]) 86 - 87 - useLayoutEffect(() => { 88 - if (showDrawer !== showDrawerDelayedExit) { 89 - if (showDrawer) { 90 - setShowDrawerDelayedExit(true) 91 - } else { 92 - const timeout = setTimeout(() => { 93 - setShowDrawerDelayedExit(false) 94 - }, 160) 95 - return () => clearTimeout(timeout) 96 - } 97 - } 98 - }, [showDrawer, showDrawerDelayedExit]) 99 - 100 46 useComposerKeyboardShortcut() 101 47 useIntentHandler() 102 48 ··· 107 53 return unsubscribe 108 54 }, [navigator, closeAllActiveElements]) 109 55 56 + const drawerLayout = useCallback( 57 + ({children}: {children: React.ReactNode}) => ( 58 + <DrawerLayout>{children}</DrawerLayout> 59 + ), 60 + [], 61 + ) 110 62 return ( 111 63 <> 112 64 <ErrorBoundary> 113 - <FlatNavigator /> 65 + <FlatNavigator layout={drawerLayout} /> 114 66 </ErrorBoundary> 115 67 <Composer winHeight={0} /> 116 68 <ModalsContainer /> ··· 133 85 </> 134 86 )} 135 87 88 + <PolicyUpdateOverlayPortalOutlet /> 89 + </> 90 + ) 91 + } 92 + 93 + function DrawerLayout({children}: {children: React.ReactNode}) { 94 + const t = useTheme() 95 + const isDrawerOpen = useIsDrawerOpen() 96 + const setDrawerOpen = useSetDrawerOpen() 97 + const {gtTablet} = useBreakpoints() 98 + const {_} = useLingui() 99 + const showDrawer = !gtTablet && isDrawerOpen 100 + const [showDrawerDelayedExit, setShowDrawerDelayedExit] = useState(showDrawer) 101 + 102 + useLayoutEffect(() => { 103 + if (showDrawer !== showDrawerDelayedExit) { 104 + if (showDrawer) { 105 + setShowDrawerDelayedExit(true) 106 + } else { 107 + const timeout = setTimeout(() => { 108 + setShowDrawerDelayedExit(false) 109 + }, 160) 110 + return () => clearTimeout(timeout) 111 + } 112 + } 113 + }, [showDrawer, showDrawerDelayedExit]) 114 + 115 + return ( 116 + <> 117 + {children} 136 118 {showDrawerDelayedExit && ( 137 119 <> 138 120 <RemoveScrollBar /> ··· 170 152 </TouchableWithoutFeedback> 171 153 </> 172 154 )} 173 - 174 - <PolicyUpdateOverlayPortalOutlet /> 175 155 </> 176 156 ) 177 157 }
+1
webpack.config.js
··· 27 27 'unicode-segmenter/grapheme': require 28 28 .resolve('unicode-segmenter/grapheme') 29 29 .replace(/\.cjs$/, '.js'), 30 + 'react-native-gesture-handler': false, // RNGH should not be used on web, so let's cause a build error if it sneaks in 30 31 }) 31 32 config.module.rules = [ 32 33 ...(config.module.rules || []),
+97 -450
yarn.lock
··· 1483 1483 js-tokens "^4.0.0" 1484 1484 picocolors "^1.0.0" 1485 1485 1486 - "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": 1486 + "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": 1487 1487 version "7.22.9" 1488 1488 resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" 1489 1489 integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== ··· 1719 1719 "@babel/traverse" "^7.25.9" 1720 1720 "@babel/types" "^7.25.9" 1721 1721 1722 - "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.10", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": 1722 + "@babel/helper-compilation-targets@^7.22.10", "@babel/helper-compilation-targets@^7.22.6": 1723 1723 version "7.22.10" 1724 1724 resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz#01d648bbc25dd88f513d862ee0df27b7d4e67024" 1725 1725 integrity sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q== ··· 1830 1830 "@babel/traverse" "^7.28.3" 1831 1831 semver "^6.3.1" 1832 1832 1833 - "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": 1833 + "@babel/helper-create-regexp-features-plugin@^7.18.6": 1834 1834 version "7.22.9" 1835 1835 resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz#9d8e61a8d9366fe66198f57c40565663de0825f6" 1836 1836 integrity sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw== ··· 1848 1848 regexpu-core "^6.1.1" 1849 1849 semver "^6.3.1" 1850 1850 1851 - "@babel/helper-define-polyfill-provider@^0.4.2": 1852 - version "0.4.2" 1853 - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz#82c825cadeeeee7aad237618ebbe8fa1710015d7" 1854 - integrity sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw== 1855 - dependencies: 1856 - "@babel/helper-compilation-targets" "^7.22.6" 1857 - "@babel/helper-plugin-utils" "^7.22.5" 1858 - debug "^4.1.1" 1859 - lodash.debounce "^4.0.8" 1860 - resolve "^1.14.2" 1861 - 1862 1851 "@babel/helper-define-polyfill-provider@^0.6.2", "@babel/helper-define-polyfill-provider@^0.6.3": 1863 1852 version "0.6.3" 1864 1853 resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz#f4f2792fae2ef382074bc2d713522cf24e6ddb21" ··· 1870 1859 lodash.debounce "^4.0.8" 1871 1860 resolve "^1.14.2" 1872 1861 1873 - "@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.5": 1874 - version "7.22.5" 1875 - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" 1876 - integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== 1877 - 1878 1862 "@babel/helper-environment-visitor@^7.22.20": 1879 1863 version "7.22.20" 1880 1864 resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" 1881 1865 integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== 1866 + 1867 + "@babel/helper-environment-visitor@^7.22.5": 1868 + version "7.22.5" 1869 + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" 1870 + integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== 1882 1871 1883 1872 "@babel/helper-environment-visitor@^7.24.6": 1884 1873 version "7.24.6" ··· 2060 2049 dependencies: 2061 2050 "@babel/types" "^7.27.1" 2062 2051 2063 - "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0": 2052 + "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0": 2064 2053 version "7.22.5" 2065 2054 resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" 2066 2055 integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== ··· 2080 2069 resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" 2081 2070 integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== 2082 2071 2083 - "@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.22.5": 2084 - version "7.22.9" 2085 - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz#53a25b7484e722d7efb9c350c75c032d4628de82" 2086 - integrity sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ== 2087 - dependencies: 2088 - "@babel/helper-annotate-as-pure" "^7.22.5" 2089 - "@babel/helper-environment-visitor" "^7.22.5" 2090 - "@babel/helper-wrap-function" "^7.22.9" 2091 - 2092 2072 "@babel/helper-remap-async-to-generator@^7.25.9": 2093 2073 version "7.25.9" 2094 2074 resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz#e53956ab3d5b9fb88be04b3e2f31b523afd34b92" ··· 2098 2078 "@babel/helper-wrap-function" "^7.25.9" 2099 2079 "@babel/traverse" "^7.25.9" 2100 2080 2101 - "@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": 2081 + "@babel/helper-replace-supers@^7.22.9": 2102 2082 version "7.22.9" 2103 2083 resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz#cbdc27d6d8d18cd22c81ae4293765a5d9afd0779" 2104 2084 integrity sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg== ··· 2163 2143 "@babel/traverse" "^7.25.9" 2164 2144 "@babel/types" "^7.25.9" 2165 2145 2166 - "@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": 2146 + "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": 2167 2147 version "7.22.5" 2168 2148 resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" 2169 2149 integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== ··· 2287 2267 resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" 2288 2268 integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== 2289 2269 2290 - "@babel/helper-wrap-function@^7.22.9": 2291 - version "7.22.10" 2292 - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz#d845e043880ed0b8c18bd194a12005cb16d2f614" 2293 - integrity sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ== 2294 - dependencies: 2295 - "@babel/helper-function-name" "^7.22.5" 2296 - "@babel/template" "^7.22.5" 2297 - "@babel/types" "^7.22.10" 2298 - 2299 2270 "@babel/helper-wrap-function@^7.25.9": 2300 2271 version "7.25.9" 2301 2272 resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz#d99dfd595312e6c894bd7d237470025c85eea9d0" ··· 2450 2421 dependencies: 2451 2422 "@babel/helper-plugin-utils" "^7.25.9" 2452 2423 "@babel/traverse" "^7.25.9" 2453 - 2454 - "@babel/plugin-proposal-async-generator-functions@^7.0.0": 2455 - version "7.20.7" 2456 - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" 2457 - integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== 2458 - dependencies: 2459 - "@babel/helper-environment-visitor" "^7.18.9" 2460 - "@babel/helper-plugin-utils" "^7.20.2" 2461 - "@babel/helper-remap-async-to-generator" "^7.18.9" 2462 - "@babel/plugin-syntax-async-generators" "^7.8.4" 2463 - 2464 - "@babel/plugin-proposal-class-properties@^7.18.0": 2465 - version "7.18.6" 2466 - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" 2467 - integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== 2468 - dependencies: 2469 - "@babel/helper-create-class-features-plugin" "^7.18.6" 2470 - "@babel/helper-plugin-utils" "^7.18.6" 2471 2424 2472 2425 "@babel/plugin-proposal-decorators@^7.12.9": 2473 2426 version "7.22.10" ··· 2480 2433 "@babel/helper-split-export-declaration" "^7.22.6" 2481 2434 "@babel/plugin-syntax-decorators" "^7.22.10" 2482 2435 2483 - "@babel/plugin-proposal-export-default-from@^7.0.0": 2484 - version "7.22.5" 2485 - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.22.5.tgz#825924eda1fad382c3de4db6fe1711b6fa03362f" 2486 - integrity sha512-UCe1X/hplyv6A5g2WnQ90tnHRvYL29dabCWww92lO7VdfMVTVReBTRrhiMrKQejHD9oVkdnRdwYuzUZkBVQisg== 2487 - dependencies: 2488 - "@babel/helper-plugin-utils" "^7.22.5" 2489 - "@babel/plugin-syntax-export-default-from" "^7.22.5" 2490 - 2491 2436 "@babel/plugin-proposal-export-default-from@^7.24.7": 2492 2437 version "7.25.9" 2493 2438 resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.25.9.tgz#52702be6ef8367fc8f18b8438278332beeb8f87c" ··· 2495 2440 dependencies: 2496 2441 "@babel/helper-plugin-utils" "^7.25.9" 2497 2442 2498 - "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.0": 2499 - version "7.18.6" 2500 - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" 2501 - integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== 2502 - dependencies: 2503 - "@babel/helper-plugin-utils" "^7.18.6" 2504 - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" 2505 - 2506 - "@babel/plugin-proposal-numeric-separator@^7.0.0": 2507 - version "7.18.6" 2508 - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" 2509 - integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== 2510 - dependencies: 2511 - "@babel/helper-plugin-utils" "^7.18.6" 2512 - "@babel/plugin-syntax-numeric-separator" "^7.10.4" 2513 - 2514 - "@babel/plugin-proposal-object-rest-spread@^7.20.0": 2515 - version "7.20.7" 2516 - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" 2517 - integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== 2518 - dependencies: 2519 - "@babel/compat-data" "^7.20.5" 2520 - "@babel/helper-compilation-targets" "^7.20.7" 2521 - "@babel/helper-plugin-utils" "^7.20.2" 2522 - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" 2523 - "@babel/plugin-transform-parameters" "^7.20.7" 2524 - 2525 - "@babel/plugin-proposal-optional-catch-binding@^7.0.0": 2526 - version "7.18.6" 2527 - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" 2528 - integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== 2529 - dependencies: 2530 - "@babel/helper-plugin-utils" "^7.18.6" 2531 - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" 2532 - 2533 - "@babel/plugin-proposal-optional-chaining@^7.20.0": 2534 - version "7.21.0" 2535 - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" 2536 - integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== 2537 - dependencies: 2538 - "@babel/helper-plugin-utils" "^7.20.2" 2539 - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" 2540 - "@babel/plugin-syntax-optional-chaining" "^7.8.3" 2541 - 2542 2443 "@babel/plugin-proposal-private-methods@^7.18.6": 2543 2444 version "7.18.6" 2544 2445 resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" ··· 2580 2481 dependencies: 2581 2482 "@babel/helper-plugin-utils" "^7.22.5" 2582 2483 2583 - "@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": 2484 + "@babel/plugin-syntax-dynamic-import@^7.8.3": 2584 2485 version "7.8.3" 2585 2486 resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" 2586 2487 integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== 2587 2488 dependencies: 2588 2489 "@babel/helper-plugin-utils" "^7.8.0" 2589 2490 2590 - "@babel/plugin-syntax-export-default-from@^7.0.0", "@babel/plugin-syntax-export-default-from@^7.22.5": 2591 - version "7.22.5" 2592 - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.22.5.tgz#ac3a24b362a04415a017ab96b9b4483d0e2a6e44" 2593 - integrity sha512-ODAqWWXB/yReh/jVQDag/3/tl6lgBueQkk/TcfW/59Oykm4c8a55XloX0CTk2k2VJiFWMgHby9xNX29IbCv9dQ== 2594 - dependencies: 2595 - "@babel/helper-plugin-utils" "^7.22.5" 2596 - 2597 2491 "@babel/plugin-syntax-export-default-from@^7.24.7": 2598 2492 version "7.25.9" 2599 2493 resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.25.9.tgz#86614767a9ff140366f0c3766ef218beb32a730a" ··· 2601 2495 dependencies: 2602 2496 "@babel/helper-plugin-utils" "^7.25.9" 2603 2497 2604 - "@babel/plugin-syntax-flow@^7.12.1", "@babel/plugin-syntax-flow@^7.18.0", "@babel/plugin-syntax-flow@^7.22.5": 2498 + "@babel/plugin-syntax-flow@^7.12.1": 2605 2499 version "7.22.5" 2606 2500 resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz#163b820b9e7696ce134df3ee716d9c0c98035859" 2607 2501 integrity sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ== ··· 2678 2572 dependencies: 2679 2573 "@babel/helper-plugin-utils" "^7.10.4" 2680 2574 2681 - "@babel/plugin-syntax-nullish-coalescing-operator@^7.0.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": 2575 + "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": 2682 2576 version "7.8.3" 2683 2577 resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" 2684 2578 integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== 2685 2579 dependencies: 2686 2580 "@babel/helper-plugin-utils" "^7.8.0" 2687 2581 2688 - "@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": 2582 + "@babel/plugin-syntax-numeric-separator@^7.8.3": 2689 2583 version "7.10.4" 2690 2584 resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" 2691 2585 integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== ··· 2706 2600 dependencies: 2707 2601 "@babel/helper-plugin-utils" "^7.8.0" 2708 2602 2709 - "@babel/plugin-syntax-optional-chaining@^7.0.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": 2603 + "@babel/plugin-syntax-optional-chaining@^7.8.3": 2710 2604 version "7.8.3" 2711 2605 resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" 2712 2606 integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== ··· 2749 2643 "@babel/helper-create-regexp-features-plugin" "^7.18.6" 2750 2644 "@babel/helper-plugin-utils" "^7.18.6" 2751 2645 2752 - "@babel/plugin-transform-arrow-functions@^7.0.0": 2753 - version "7.22.5" 2754 - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958" 2755 - integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== 2756 - dependencies: 2757 - "@babel/helper-plugin-utils" "^7.22.5" 2758 - 2759 2646 "@babel/plugin-transform-arrow-functions@^7.0.0-0": 2760 2647 version "7.24.1" 2761 2648 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz#2bf263617060c9cc45bcdbf492b8cc805082bf27" ··· 2779 2666 "@babel/helper-remap-async-to-generator" "^7.25.9" 2780 2667 "@babel/traverse" "^7.25.9" 2781 2668 2782 - "@babel/plugin-transform-async-to-generator@^7.20.0": 2783 - version "7.22.5" 2784 - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775" 2785 - integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== 2786 - dependencies: 2787 - "@babel/helper-module-imports" "^7.22.5" 2788 - "@babel/helper-plugin-utils" "^7.22.5" 2789 - "@babel/helper-remap-async-to-generator" "^7.22.5" 2790 - 2791 2669 "@babel/plugin-transform-async-to-generator@^7.24.7", "@babel/plugin-transform-async-to-generator@^7.25.9": 2792 2670 version "7.25.9" 2793 2671 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz#c80008dacae51482793e5a9c08b39a5be7e12d71" ··· 2804 2682 dependencies: 2805 2683 "@babel/helper-plugin-utils" "^7.25.9" 2806 2684 2807 - "@babel/plugin-transform-block-scoping@^7.0.0": 2808 - version "7.22.10" 2809 - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz#88a1dccc3383899eb5e660534a76a22ecee64faa" 2810 - integrity sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg== 2811 - dependencies: 2812 - "@babel/helper-plugin-utils" "^7.22.5" 2813 - 2814 2685 "@babel/plugin-transform-block-scoping@^7.25.0", "@babel/plugin-transform-block-scoping@^7.25.9": 2815 2686 version "7.25.9" 2816 2687 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz#c33665e46b06759c93687ca0f84395b80c0473a1" ··· 2842 2713 "@babel/helper-create-class-features-plugin" "^7.28.3" 2843 2714 "@babel/helper-plugin-utils" "^7.27.1" 2844 2715 2845 - "@babel/plugin-transform-classes@^7.0.0": 2846 - version "7.22.6" 2847 - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz#e04d7d804ed5b8501311293d1a0e6d43e94c3363" 2848 - integrity sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ== 2849 - dependencies: 2850 - "@babel/helper-annotate-as-pure" "^7.22.5" 2851 - "@babel/helper-compilation-targets" "^7.22.6" 2852 - "@babel/helper-environment-visitor" "^7.22.5" 2853 - "@babel/helper-function-name" "^7.22.5" 2854 - "@babel/helper-optimise-call-expression" "^7.22.5" 2855 - "@babel/helper-plugin-utils" "^7.22.5" 2856 - "@babel/helper-replace-supers" "^7.22.5" 2857 - "@babel/helper-split-export-declaration" "^7.22.6" 2858 - globals "^11.1.0" 2859 - 2860 2716 "@babel/plugin-transform-classes@^7.0.0-0", "@babel/plugin-transform-classes@^7.25.4", "@babel/plugin-transform-classes@^7.25.9": 2861 2717 version "7.25.9" 2862 2718 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz#7152457f7880b593a63ade8a861e6e26a4469f52" ··· 2869 2725 "@babel/traverse" "^7.25.9" 2870 2726 globals "^11.1.0" 2871 2727 2872 - "@babel/plugin-transform-computed-properties@^7.0.0": 2873 - version "7.22.5" 2874 - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869" 2875 - integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== 2876 - dependencies: 2877 - "@babel/helper-plugin-utils" "^7.22.5" 2878 - "@babel/template" "^7.22.5" 2879 - 2880 2728 "@babel/plugin-transform-computed-properties@^7.24.7", "@babel/plugin-transform-computed-properties@^7.25.9": 2881 2729 version "7.25.9" 2882 2730 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz#db36492c78460e534b8852b1d5befe3c923ef10b" ··· 2885 2733 "@babel/helper-plugin-utils" "^7.25.9" 2886 2734 "@babel/template" "^7.25.9" 2887 2735 2888 - "@babel/plugin-transform-destructuring@^7.20.0": 2889 - version "7.22.10" 2890 - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz#38e2273814a58c810b6c34ea293be4973c4eb5e2" 2891 - integrity sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw== 2892 - dependencies: 2893 - "@babel/helper-plugin-utils" "^7.22.5" 2894 - 2895 2736 "@babel/plugin-transform-destructuring@^7.24.8", "@babel/plugin-transform-destructuring@^7.25.9": 2896 2737 version "7.25.9" 2897 2738 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz#966ea2595c498224340883602d3cfd7a0c79cea1" ··· 2944 2785 dependencies: 2945 2786 "@babel/helper-plugin-utils" "^7.25.9" 2946 2787 2947 - "@babel/plugin-transform-flow-strip-types@^7.20.0": 2948 - version "7.22.5" 2949 - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.22.5.tgz#0bb17110c7bf5b35a60754b2f00c58302381dee2" 2950 - integrity sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA== 2951 - dependencies: 2952 - "@babel/helper-plugin-utils" "^7.22.5" 2953 - "@babel/plugin-syntax-flow" "^7.22.5" 2954 - 2955 2788 "@babel/plugin-transform-flow-strip-types@^7.25.2": 2956 2789 version "7.25.9" 2957 2790 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.9.tgz#85879b42a8f5948fd6317069978e98f23ef8aec1" ··· 2968 2801 "@babel/helper-plugin-utils" "^7.25.9" 2969 2802 "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" 2970 2803 2971 - "@babel/plugin-transform-function-name@^7.0.0": 2972 - version "7.22.5" 2973 - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143" 2974 - integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== 2975 - dependencies: 2976 - "@babel/helper-compilation-targets" "^7.22.5" 2977 - "@babel/helper-function-name" "^7.22.5" 2978 - "@babel/helper-plugin-utils" "^7.22.5" 2979 - 2980 2804 "@babel/plugin-transform-function-name@^7.25.1", "@babel/plugin-transform-function-name@^7.25.9": 2981 2805 version "7.25.9" 2982 2806 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz#939d956e68a606661005bfd550c4fc2ef95f7b97" ··· 2992 2816 integrity sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw== 2993 2817 dependencies: 2994 2818 "@babel/helper-plugin-utils" "^7.25.9" 2995 - 2996 - "@babel/plugin-transform-literals@^7.0.0": 2997 - version "7.22.5" 2998 - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920" 2999 - integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== 3000 - dependencies: 3001 - "@babel/helper-plugin-utils" "^7.22.5" 3002 2819 3003 2820 "@babel/plugin-transform-literals@^7.25.2", "@babel/plugin-transform-literals@^7.25.9": 3004 2821 version "7.25.9" ··· 3029 2846 "@babel/helper-module-transforms" "^7.25.9" 3030 2847 "@babel/helper-plugin-utils" "^7.25.9" 3031 2848 3032 - "@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.22.5": 2849 + "@babel/plugin-transform-modules-commonjs@^7.22.5": 3033 2850 version "7.22.5" 3034 2851 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz#7d9875908d19b8c0536085af7b053fd5bd651bfa" 3035 2852 integrity sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA== ··· 3074 2891 "@babel/helper-module-transforms" "^7.25.9" 3075 2892 "@babel/helper-plugin-utils" "^7.25.9" 3076 2893 3077 - "@babel/plugin-transform-named-capturing-groups-regex@^7.0.0": 3078 - version "7.22.5" 3079 - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" 3080 - integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== 3081 - dependencies: 3082 - "@babel/helper-create-regexp-features-plugin" "^7.22.5" 3083 - "@babel/helper-plugin-utils" "^7.22.5" 3084 - 3085 2894 "@babel/plugin-transform-named-capturing-groups-regex@^7.24.7", "@babel/plugin-transform-named-capturing-groups-regex@^7.25.9": 3086 2895 version "7.25.9" 3087 2896 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz#454990ae6cc22fd2a0fa60b3a2c6f63a38064e6a" ··· 3160 2969 "@babel/helper-plugin-utils" "^7.25.9" 3161 2970 "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" 3162 2971 3163 - "@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.20.7": 3164 - version "7.22.5" 3165 - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz#c3542dd3c39b42c8069936e48717a8d179d63a18" 3166 - integrity sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg== 3167 - dependencies: 3168 - "@babel/helper-plugin-utils" "^7.22.5" 3169 - 3170 2972 "@babel/plugin-transform-parameters@^7.24.7", "@babel/plugin-transform-parameters@^7.25.9": 3171 2973 version "7.25.9" 3172 2974 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz#b856842205b3e77e18b7a7a1b94958069c7ba257" ··· 3198 3000 dependencies: 3199 3001 "@babel/helper-plugin-utils" "^7.25.9" 3200 3002 3201 - "@babel/plugin-transform-react-display-name@^7.0.0": 3202 - version "7.22.5" 3203 - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz#3c4326f9fce31c7968d6cb9debcaf32d9e279a2b" 3204 - integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw== 3205 - dependencies: 3206 - "@babel/helper-plugin-utils" "^7.22.5" 3207 - 3208 3003 "@babel/plugin-transform-react-display-name@^7.23.3": 3209 3004 version "7.23.3" 3210 3005 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz#70529f034dd1e561045ad3c8152a267f0d7b6200" ··· 3226 3021 dependencies: 3227 3022 "@babel/plugin-transform-react-jsx" "^7.22.5" 3228 3023 3229 - "@babel/plugin-transform-react-jsx-self@^7.0.0": 3230 - version "7.22.5" 3231 - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz#ca2fdc11bc20d4d46de01137318b13d04e481d8e" 3232 - integrity sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g== 3233 - dependencies: 3234 - "@babel/helper-plugin-utils" "^7.22.5" 3235 - 3236 3024 "@babel/plugin-transform-react-jsx-self@^7.24.7": 3237 3025 version "7.25.9" 3238 3026 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz#c0b6cae9c1b73967f7f9eb2fca9536ba2fad2858" ··· 3240 3028 dependencies: 3241 3029 "@babel/helper-plugin-utils" "^7.25.9" 3242 3030 3243 - "@babel/plugin-transform-react-jsx-source@^7.0.0": 3244 - version "7.22.5" 3245 - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz#49af1615bfdf6ed9d3e9e43e425e0b2b65d15b6c" 3246 - integrity sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w== 3247 - dependencies: 3248 - "@babel/helper-plugin-utils" "^7.22.5" 3249 - 3250 3031 "@babel/plugin-transform-react-jsx-source@^7.24.7": 3251 3032 version "7.25.9" 3252 3033 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz#4c6b8daa520b5f155b5fb55547d7c9fa91417503" ··· 3254 3035 dependencies: 3255 3036 "@babel/helper-plugin-utils" "^7.25.9" 3256 3037 3257 - "@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.22.5": 3258 - version "7.22.5" 3259 - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz#932c291eb6dd1153359e2a90cb5e557dcf068416" 3260 - integrity sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA== 3261 - dependencies: 3262 - "@babel/helper-annotate-as-pure" "^7.22.5" 3263 - "@babel/helper-module-imports" "^7.22.5" 3264 - "@babel/helper-plugin-utils" "^7.22.5" 3265 - "@babel/plugin-syntax-jsx" "^7.22.5" 3266 - "@babel/types" "^7.22.5" 3267 - 3268 3038 "@babel/plugin-transform-react-jsx@^7.22.15": 3269 3039 version "7.23.4" 3270 3040 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz#393f99185110cea87184ea47bcb4a7b0c2e39312" ··· 3276 3046 "@babel/plugin-syntax-jsx" "^7.23.3" 3277 3047 "@babel/types" "^7.23.4" 3278 3048 3049 + "@babel/plugin-transform-react-jsx@^7.22.5": 3050 + version "7.22.5" 3051 + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz#932c291eb6dd1153359e2a90cb5e557dcf068416" 3052 + integrity sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA== 3053 + dependencies: 3054 + "@babel/helper-annotate-as-pure" "^7.22.5" 3055 + "@babel/helper-module-imports" "^7.22.5" 3056 + "@babel/helper-plugin-utils" "^7.22.5" 3057 + "@babel/plugin-syntax-jsx" "^7.22.5" 3058 + "@babel/types" "^7.22.5" 3059 + 3279 3060 "@babel/plugin-transform-react-jsx@^7.25.2": 3280 3061 version "7.25.9" 3281 3062 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz#06367940d8325b36edff5e2b9cbe782947ca4166" ··· 3318 3099 dependencies: 3319 3100 "@babel/helper-plugin-utils" "^7.25.9" 3320 3101 3321 - "@babel/plugin-transform-runtime@^7.0.0": 3322 - version "7.22.10" 3323 - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.10.tgz#89eda6daf1d3af6f36fb368766553054c8d7cd46" 3324 - integrity sha512-RchI7HePu1eu0CYNKHHHQdfenZcM4nz8rew5B1VWqeRKdcwW5aQ5HeG9eTUbWiAS1UrmHVLmoxTWHt3iLD/NhA== 3325 - dependencies: 3326 - "@babel/helper-module-imports" "^7.22.5" 3327 - "@babel/helper-plugin-utils" "^7.22.5" 3328 - babel-plugin-polyfill-corejs2 "^0.4.5" 3329 - babel-plugin-polyfill-corejs3 "^0.8.3" 3330 - babel-plugin-polyfill-regenerator "^0.5.2" 3331 - semver "^6.3.1" 3332 - 3333 3102 "@babel/plugin-transform-runtime@^7.24.7": 3334 3103 version "7.25.9" 3335 3104 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz#62723ea3f5b31ffbe676da9d6dae17138ae580ea" ··· 3342 3111 babel-plugin-polyfill-regenerator "^0.6.1" 3343 3112 semver "^6.3.1" 3344 3113 3345 - "@babel/plugin-transform-shorthand-properties@^7.0.0": 3346 - version "7.22.5" 3347 - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624" 3348 - integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== 3349 - dependencies: 3350 - "@babel/helper-plugin-utils" "^7.22.5" 3351 - 3352 3114 "@babel/plugin-transform-shorthand-properties@^7.0.0-0": 3353 3115 version "7.24.1" 3354 3116 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz#ba9a09144cf55d35ec6b93a32253becad8ee5b55" ··· 3363 3125 dependencies: 3364 3126 "@babel/helper-plugin-utils" "^7.25.9" 3365 3127 3366 - "@babel/plugin-transform-spread@^7.0.0": 3367 - version "7.22.5" 3368 - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b" 3369 - integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== 3370 - dependencies: 3371 - "@babel/helper-plugin-utils" "^7.22.5" 3372 - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" 3373 - 3374 3128 "@babel/plugin-transform-spread@^7.24.7", "@babel/plugin-transform-spread@^7.25.9": 3375 3129 version "7.25.9" 3376 3130 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz#24a35153931b4ba3d13cec4a7748c21ab5514ef9" ··· 3379 3133 "@babel/helper-plugin-utils" "^7.25.9" 3380 3134 "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" 3381 3135 3382 - "@babel/plugin-transform-sticky-regex@^7.0.0": 3383 - version "7.22.5" 3384 - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz#295aba1595bfc8197abd02eae5fc288c0deb26aa" 3385 - integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== 3386 - dependencies: 3387 - "@babel/helper-plugin-utils" "^7.22.5" 3388 - 3389 3136 "@babel/plugin-transform-sticky-regex@^7.24.7", "@babel/plugin-transform-sticky-regex@^7.25.9": 3390 3137 version "7.25.9" 3391 3138 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz#c7f02b944e986a417817b20ba2c504dfc1453d32" ··· 3414 3161 dependencies: 3415 3162 "@babel/helper-plugin-utils" "^7.25.9" 3416 3163 3417 - "@babel/plugin-transform-typescript@^7.22.5", "@babel/plugin-transform-typescript@^7.5.0": 3164 + "@babel/plugin-transform-typescript@^7.22.5": 3418 3165 version "7.22.10" 3419 3166 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.10.tgz#aadd98fab871f0bb5717bcc24c31aaaa455af923" 3420 3167 integrity sha512-7++c8I/ymsDo4QQBAgbraXLzIM6jmfao11KgIBEYZRReWzNWH9NtNgJcyrZiXsOPh523FQm6LfpLyy/U5fn46A== ··· 3459 3206 dependencies: 3460 3207 "@babel/helper-create-regexp-features-plugin" "^7.25.9" 3461 3208 "@babel/helper-plugin-utils" "^7.25.9" 3462 - 3463 - "@babel/plugin-transform-unicode-regex@^7.0.0": 3464 - version "7.22.5" 3465 - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz#ce7e7bb3ef208c4ff67e02a22816656256d7a183" 3466 - integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== 3467 - dependencies: 3468 - "@babel/helper-create-regexp-features-plugin" "^7.22.5" 3469 - "@babel/helper-plugin-utils" "^7.22.5" 3470 3209 3471 3210 "@babel/plugin-transform-unicode-regex@^7.0.0-0", "@babel/plugin-transform-unicode-regex@^7.24.7", "@babel/plugin-transform-unicode-regex@^7.25.9": 3472 3211 version "7.25.9" ··· 3628 3367 dependencies: 3629 3368 regenerator-runtime "^0.14.0" 3630 3369 3631 - "@babel/template@^7.0.0", "@babel/template@^7.22.5", "@babel/template@^7.3.3": 3632 - version "7.22.5" 3633 - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" 3634 - integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== 3635 - dependencies: 3636 - "@babel/code-frame" "^7.22.5" 3637 - "@babel/parser" "^7.22.5" 3638 - "@babel/types" "^7.22.5" 3639 - 3640 3370 "@babel/template@^7.22.15": 3641 3371 version "7.22.15" 3642 3372 resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" ··· 3645 3375 "@babel/code-frame" "^7.22.13" 3646 3376 "@babel/parser" "^7.22.15" 3647 3377 "@babel/types" "^7.22.15" 3378 + 3379 + "@babel/template@^7.22.5", "@babel/template@^7.3.3": 3380 + version "7.22.5" 3381 + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" 3382 + integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== 3383 + dependencies: 3384 + "@babel/code-frame" "^7.22.5" 3385 + "@babel/parser" "^7.22.5" 3386 + "@babel/types" "^7.22.5" 3648 3387 3649 3388 "@babel/template@^7.24.0": 3650 3389 version "7.24.0" ··· 6549 6288 invariant "^2.2.4" 6550 6289 nullthrows "^1.1.1" 6551 6290 6552 - "@react-navigation/bottom-tabs@^7.3.13": 6553 - version "7.3.14" 6554 - resolved "https://registry.yarnpkg.com/@react-navigation/bottom-tabs/-/bottom-tabs-7.3.14.tgz#9ee02baea86ab24abe267726665bc69c6df0bf4c" 6555 - integrity sha512-s2qinJggS2HYZdCOey9A+fN+bNpWeEKwiL/FjAVOTcv+uofxPWN6CtEZUZGPEjfRjis/srURBmCmpNZSI6sQ9Q== 6291 + "@react-navigation/bottom-tabs@^7.9.0": 6292 + version "7.9.0" 6293 + resolved "https://registry.yarnpkg.com/@react-navigation/bottom-tabs/-/bottom-tabs-7.9.0.tgz#b546adb0cedd72a1f0179e00b74039b3c8abb6bd" 6294 + integrity sha512-024FWdHp3ZsE5rP8tmGI4vh+1z3wg8u8E9Frep8eeGoYo1h9rQhvgofQDGxknmrKsb7t8o8Dim+IZSvl57cPFQ== 6556 6295 dependencies: 6557 - "@react-navigation/elements" "^2.4.3" 6296 + "@react-navigation/elements" "^2.9.3" 6558 6297 color "^4.2.3" 6298 + sf-symbols-typescript "^2.1.0" 6559 6299 6560 - "@react-navigation/core@^7.10.0": 6561 - version "7.10.0" 6562 - resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-7.10.0.tgz#8205ea6b84ce34b2fc2c196701b4cd9b434211b9" 6563 - integrity sha512-qZBA5gGm+9liT4+EHk+kl9apwvqh7HqhLF1XeX6SQRmC/n2QI0u1B8OevKc+EPUDEM9Od15IuwT/GRbSs7/Umw== 6300 + "@react-navigation/core@^7.13.7": 6301 + version "7.13.7" 6302 + resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-7.13.7.tgz#1263903a703b5f183a08c22dfc5c3735ac4ef91c" 6303 + integrity sha512-k2ABo3250vq1ovOh/iVwXS6Hwr5PVRGXoPh/ewVFOOuEKTvOx9i//OBzt8EF+HokBxS2HBRlR2b+aCOmscRqBw== 6564 6304 dependencies: 6565 - "@react-navigation/routers" "^7.4.0" 6305 + "@react-navigation/routers" "^7.5.3" 6566 6306 escape-string-regexp "^4.0.0" 6307 + fast-deep-equal "^3.1.3" 6567 6308 nanoid "^3.3.11" 6568 6309 query-string "^7.1.3" 6569 6310 react-is "^19.1.0" 6570 - use-latest-callback "^0.2.3" 6311 + use-latest-callback "^0.2.4" 6571 6312 use-sync-external-store "^1.5.0" 6572 6313 6573 - "@react-navigation/drawer@^7.3.12": 6574 - version "7.4.1" 6575 - resolved "https://registry.yarnpkg.com/@react-navigation/drawer/-/drawer-7.4.1.tgz#50517d8c57f09cdbfc20a485c47016066b918e76" 6576 - integrity sha512-kj5wL31smDLw/6l+0KPR5cjaOZg6oHJCl3RPQonFPuYolUPZBVnuS++uvlifWcD/mqdGmhl3rgLTircRH4vQ7Q== 6314 + "@react-navigation/elements@^2.9.3": 6315 + version "2.9.3" 6316 + resolved "https://registry.yarnpkg.com/@react-navigation/elements/-/elements-2.9.3.tgz#505ae38af347a0bc5326155318a3d9a54e2071e3" 6317 + integrity sha512-3+eyvWiVPIEf6tN9UdduhOEHcTuNe3R5WovgiVkfH9+jApHMTZDc2loePTpY/i2HDJhObhhChpJzO6BVjrpdYQ== 6577 6318 dependencies: 6578 - "@react-navigation/elements" "^2.4.3" 6579 6319 color "^4.2.3" 6580 - react-native-drawer-layout "^4.1.10" 6581 - use-latest-callback "^0.2.3" 6320 + use-latest-callback "^0.2.4" 6321 + use-sync-external-store "^1.5.0" 6582 6322 6583 - "@react-navigation/elements@^2.4.3": 6584 - version "2.4.3" 6585 - resolved "https://registry.yarnpkg.com/@react-navigation/elements/-/elements-2.4.3.tgz#cc1dde4c98739d35a0c9c23872316063962cfaee" 6586 - integrity sha512-psoNmnZ0DQIt9nxxPITVLtYW04PGCAfnmd/Pcd3yhiBs93aj+HYKH+SDZDpUnXMf3BN7Wvo4+jPI+/Xjqb+m9w== 6323 + "@react-navigation/native-stack@^7.9.0": 6324 + version "7.9.0" 6325 + resolved "https://registry.yarnpkg.com/@react-navigation/native-stack/-/native-stack-7.9.0.tgz#4fcd08a403ff86c465a908f3b49f86ab3f66d06a" 6326 + integrity sha512-C/mNPhI0Pnerl7C2cB+6fAkdgSmfKECMERrbyfjx3P6JmEuTC54o+GV1c62FUmlRaRUassVHbtw4EeaY2uLh0g== 6587 6327 dependencies: 6328 + "@react-navigation/elements" "^2.9.3" 6588 6329 color "^4.2.3" 6589 - 6590 - "@react-navigation/native-stack@^7.3.13": 6591 - version "7.3.14" 6592 - resolved "https://registry.yarnpkg.com/@react-navigation/native-stack/-/native-stack-7.3.14.tgz#d1c90f2e50cd13bbced923991cf2faee8083f725" 6593 - integrity sha512-45Sf7ReqSCIySXS5nrKtLGmNlFXm5x+u32YQMwKDONCqVGOBCfo4ryKqeQq1EMJ7Py6IDyOwHMhA+jhNOxnfPw== 6594 - dependencies: 6595 - "@react-navigation/elements" "^2.4.3" 6330 + sf-symbols-typescript "^2.1.0" 6596 6331 warn-once "^0.1.1" 6597 6332 6598 - "@react-navigation/native@^7.1.9": 6599 - version "7.1.10" 6600 - resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-7.1.10.tgz#768f674f7c09b6a57215762052aa62a7dc107402" 6601 - integrity sha512-Ug4IML0DkAxZTMF/E7lyyLXSclkGAYElY2cxZWITwfBjtlVeda0NjsdnTWY5EGjnd7bwvhTIUC+CO6qSlrDn5A== 6333 + "@react-navigation/native@^7.1.26": 6334 + version "7.1.26" 6335 + resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-7.1.26.tgz#220672e115f39014b95ca3ce8f2c37076a0e74f4" 6336 + integrity sha512-RhKmeD0E2ejzKS6z8elAfdfwShpcdkYY8zJzvHYLq+wv183BBcElTeyMLcIX6wIn7QutXeI92Yi21t7aUWfqNQ== 6602 6337 dependencies: 6603 - "@react-navigation/core" "^7.10.0" 6338 + "@react-navigation/core" "^7.13.7" 6604 6339 escape-string-regexp "^4.0.0" 6605 6340 fast-deep-equal "^3.1.3" 6606 6341 nanoid "^3.3.11" 6607 - use-latest-callback "^0.2.3" 6342 + use-latest-callback "^0.2.4" 6608 6343 6609 - "@react-navigation/routers@^7.4.0": 6610 - version "7.4.0" 6611 - resolved "https://registry.yarnpkg.com/@react-navigation/routers/-/routers-7.4.0.tgz#5bace799713ac163310c18711b98dfbe418c6b36" 6612 - integrity sha512-th5THnuWKJlmr7GGHiicy979di11ycDWub9iIXbEDvQwmwmsRzppmVbfs2nD8bC/MgyMgqWu/gxfys+HqN+kcw== 6344 + "@react-navigation/routers@^7.5.3": 6345 + version "7.5.3" 6346 + resolved "https://registry.yarnpkg.com/@react-navigation/routers/-/routers-7.5.3.tgz#8002930ef5f62351be2475d0dffde3ffaee174d7" 6347 + integrity sha512-1tJHg4KKRJuQ1/EvJxatrMef3NZXEPzwUIUZ3n1yJ2t7Q97siwRtbynRpQG9/69ebbtiZ8W3ScOZF/OmhvM4Rg== 6613 6348 dependencies: 6614 6349 nanoid "^3.3.11" 6615 6350 ··· 7813 7548 dependencies: 7814 7549 "@types/lodash" "*" 7815 7550 7816 - "@types/lodash.isequal@^4.5.6": 7817 - version "4.5.6" 7818 - resolved "https://registry.yarnpkg.com/@types/lodash.isequal/-/lodash.isequal-4.5.6.tgz#ff42a1b8e20caa59a97e446a77dc57db923bc02b" 7819 - integrity sha512-Ww4UGSe3DmtvLLJm2F16hDwEQSv7U0Rr8SujLUA2wHI2D2dm8kPu6Et+/y303LfjTIwSBKXB/YTUcAKpem/XEg== 7820 - dependencies: 7821 - "@types/lodash" "*" 7822 - 7823 7551 "@types/lodash.shuffle@^4.2.7": 7824 7552 version "4.2.7" 7825 7553 resolved "https://registry.yarnpkg.com/@types/lodash.shuffle/-/lodash.shuffle-4.2.7.tgz#b714d829af948a266b0df1477d629c70de2f4c72" ··· 8885 8613 "@babel/helper-define-polyfill-provider" "^0.6.3" 8886 8614 semver "^6.3.1" 8887 8615 8888 - babel-plugin-polyfill-corejs2@^0.4.5: 8889 - version "0.4.5" 8890 - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz#8097b4cb4af5b64a1d11332b6fb72ef5e64a054c" 8891 - integrity sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg== 8892 - dependencies: 8893 - "@babel/compat-data" "^7.22.6" 8894 - "@babel/helper-define-polyfill-provider" "^0.4.2" 8895 - semver "^6.3.1" 8896 - 8897 8616 babel-plugin-polyfill-corejs3@^0.10.6: 8898 8617 version "0.10.6" 8899 8618 resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz#2deda57caef50f59c525aeb4964d3b2f867710c7" ··· 8901 8620 dependencies: 8902 8621 "@babel/helper-define-polyfill-provider" "^0.6.2" 8903 8622 core-js-compat "^3.38.0" 8904 - 8905 - babel-plugin-polyfill-corejs3@^0.8.3: 8906 - version "0.8.3" 8907 - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz#b4f719d0ad9bb8e0c23e3e630c0c8ec6dd7a1c52" 8908 - integrity sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA== 8909 - dependencies: 8910 - "@babel/helper-define-polyfill-provider" "^0.4.2" 8911 - core-js-compat "^3.31.0" 8912 - 8913 - babel-plugin-polyfill-regenerator@^0.5.2: 8914 - version "0.5.2" 8915 - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz#80d0f3e1098c080c8b5a65f41e9427af692dc326" 8916 - integrity sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA== 8917 - dependencies: 8918 - "@babel/helper-define-polyfill-provider" "^0.4.2" 8919 8623 8920 8624 babel-plugin-polyfill-regenerator@^0.6.1: 8921 8625 version "0.6.3" ··· 9235 8939 resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" 9236 8940 integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== 9237 8941 9238 - browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.21.9: 8942 + browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.21.4, browserslist@^4.21.9: 9239 8943 version "4.21.10" 9240 8944 resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" 9241 8945 integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== ··· 9844 9548 normalize-path "^3.0.0" 9845 9549 schema-utils "^4.0.0" 9846 9550 serialize-javascript "^6.0.0" 9847 - 9848 - core-js-compat@^3.31.0: 9849 - version "3.32.1" 9850 - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.32.1.tgz#55f9a7d297c0761a8eb1d31b593e0f5b6ffae964" 9851 - integrity sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA== 9852 - dependencies: 9853 - browserslist "^4.21.10" 9854 9551 9855 9552 core-js-compat@^3.38.0, core-js-compat@^3.38.1: 9856 9553 version "3.39.0" ··· 14587 14284 resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" 14588 14285 integrity sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg== 14589 14286 14590 - lodash.isequal@^4.5.0: 14591 - version "4.5.0" 14592 - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" 14593 - integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== 14594 - 14595 14287 lodash.memoize@^4.1.2: 14596 14288 version "4.1.2" 14597 14289 resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" ··· 14905 14597 flow-enums-runtime "^0.0.6" 14906 14598 terser "^5.15.0" 14907 14599 14908 - metro-react-native-babel-preset@^0.77.0: 14909 - version "0.77.0" 14910 - resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.77.0.tgz#47457eca8e36b77156afbe790247a70dbb40faaa" 14911 - integrity sha512-HPPD+bTxADtoE4y/4t1txgTQ1LVR6imOBy7RMHUsqMVTbekoi8Ph5YI9vKX2VMPtVWeFt0w9YnCSLPa76GcXsA== 14912 - dependencies: 14913 - "@babel/core" "^7.20.0" 14914 - "@babel/plugin-proposal-async-generator-functions" "^7.0.0" 14915 - "@babel/plugin-proposal-class-properties" "^7.18.0" 14916 - "@babel/plugin-proposal-export-default-from" "^7.0.0" 14917 - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.0" 14918 - "@babel/plugin-proposal-numeric-separator" "^7.0.0" 14919 - "@babel/plugin-proposal-object-rest-spread" "^7.20.0" 14920 - "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" 14921 - "@babel/plugin-proposal-optional-chaining" "^7.20.0" 14922 - "@babel/plugin-syntax-dynamic-import" "^7.8.0" 14923 - "@babel/plugin-syntax-export-default-from" "^7.0.0" 14924 - "@babel/plugin-syntax-flow" "^7.18.0" 14925 - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" 14926 - "@babel/plugin-syntax-optional-chaining" "^7.0.0" 14927 - "@babel/plugin-transform-arrow-functions" "^7.0.0" 14928 - "@babel/plugin-transform-async-to-generator" "^7.20.0" 14929 - "@babel/plugin-transform-block-scoping" "^7.0.0" 14930 - "@babel/plugin-transform-classes" "^7.0.0" 14931 - "@babel/plugin-transform-computed-properties" "^7.0.0" 14932 - "@babel/plugin-transform-destructuring" "^7.20.0" 14933 - "@babel/plugin-transform-flow-strip-types" "^7.20.0" 14934 - "@babel/plugin-transform-function-name" "^7.0.0" 14935 - "@babel/plugin-transform-literals" "^7.0.0" 14936 - "@babel/plugin-transform-modules-commonjs" "^7.0.0" 14937 - "@babel/plugin-transform-named-capturing-groups-regex" "^7.0.0" 14938 - "@babel/plugin-transform-parameters" "^7.0.0" 14939 - "@babel/plugin-transform-react-display-name" "^7.0.0" 14940 - "@babel/plugin-transform-react-jsx" "^7.0.0" 14941 - "@babel/plugin-transform-react-jsx-self" "^7.0.0" 14942 - "@babel/plugin-transform-react-jsx-source" "^7.0.0" 14943 - "@babel/plugin-transform-runtime" "^7.0.0" 14944 - "@babel/plugin-transform-shorthand-properties" "^7.0.0" 14945 - "@babel/plugin-transform-spread" "^7.0.0" 14946 - "@babel/plugin-transform-sticky-regex" "^7.0.0" 14947 - "@babel/plugin-transform-typescript" "^7.5.0" 14948 - "@babel/plugin-transform-unicode-regex" "^7.0.0" 14949 - "@babel/template" "^7.0.0" 14950 - babel-plugin-transform-flow-enums "^0.0.2" 14951 - react-refresh "^0.4.0" 14952 - 14953 14600 metro-resolver@0.83.2: 14954 14601 version "0.83.2" 14955 14602 resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.83.2.tgz#d4a40a602615baacfb94d8a773e8b93eaac70d0f" ··· 17070 16717 dependencies: 17071 16718 dotenv "^16.4.5" 17072 16719 17073 - react-native-drawer-layout@^4.1.10, react-native-drawer-layout@^4.1.8: 17074 - version "4.1.10" 17075 - resolved "https://registry.yarnpkg.com/react-native-drawer-layout/-/react-native-drawer-layout-4.1.10.tgz#9007cb747767ca8e1c9c3337671ad35ed95ad4d9" 17076 - integrity sha512-wejQo0F+EffCkOkRh+DP6ENWMB+aWEHkXV8Pd564PmtoySZLUsV/ksYrh/mrufh7T7EuvGT8+fNHz7mMRYftWg== 16720 + react-native-drawer-layout@^4.2.1: 16721 + version "4.2.1" 16722 + resolved "https://registry.yarnpkg.com/react-native-drawer-layout/-/react-native-drawer-layout-4.2.1.tgz#5c89425662c9b5216a227dbc87bc7f38c4ec8719" 16723 + integrity sha512-liwRJ7ynRU/ogRlUdiK1Yoi1VzUSq2Vu/RU+UgqlMB3XduslZ1DZg/mTX0f1uCEV2dJ4ec+1fRa3OlIierfyZg== 17077 16724 dependencies: 17078 - use-latest-callback "^0.2.3" 16725 + color "^4.2.3" 16726 + use-latest-callback "^0.2.4" 17079 16727 17080 16728 react-native-edge-to-edge@^1.6.0: 17081 16729 version "1.6.0" ··· 17164 16812 resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-5.6.1.tgz#cb4d249ef1a6f7e8fd0cfdfa9764838dffda26b6" 17165 16813 integrity sha512-/wJE58HLEAkATzhhX1xSr+fostLsK8Q97EfpfMDKo8jlOc1QKESSX/FQrhk7HhQH/2uSaox4Y86sNaI02kteiA== 17166 16814 17167 - react-native-screens@~4.16.0: 17168 - version "4.16.0" 17169 - resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-4.16.0.tgz#efa42e77a092aa0b5277c9ae41391ea0240e0870" 17170 - integrity sha512-yIAyh7F/9uWkOzCi1/2FqvNvK6Wb9Y1+Kzn16SuGfN9YFJDTbwlzGRvePCNTOX0recpLQF3kc2FmvMUhyTCH1Q== 16815 + react-native-screens@^4.19.0: 16816 + version "4.19.0" 16817 + resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-4.19.0.tgz#d00f2ec070d7426204eaf34ef6c64396a6871e1d" 16818 + integrity sha512-qSDAO3AL5bti0Ri7KZRSVmWlhDr8MV86N5GruiKVQfEL7Zx2nUi3Dl62lqHUAD/LnDvOPuDDsMHCfIpYSv3hPQ== 17171 16819 dependencies: 17172 16820 react-freeze "^1.0.0" 17173 - react-native-is-edge-to-edge "^1.2.1" 17174 16821 warn-once "^0.1.0" 17175 16822 17176 16823 react-native-svg@15.12.1: ··· 17284 16931 version "0.14.2" 17285 16932 resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" 17286 16933 integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== 17287 - 17288 - react-refresh@^0.4.0: 17289 - version "0.4.3" 17290 - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.4.3.tgz#966f1750c191672e76e16c2efa569150cc73ab53" 17291 - integrity sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA== 17292 16934 17293 16935 react-remove-scroll-bar@^2.3.7, react-remove-scroll-bar@^2.3.8: 17294 16936 version "2.3.8" ··· 18143 17785 version "1.2.0" 18144 17786 resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 18145 17787 integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 17788 + 17789 + sf-symbols-typescript@^2.1.0: 17790 + version "2.2.0" 17791 + resolved "https://registry.yarnpkg.com/sf-symbols-typescript/-/sf-symbols-typescript-2.2.0.tgz#926d6e0715e3d8784cadf7658431e36581254208" 17792 + integrity sha512-TPbeg0b7ylrswdGCji8FRGFAKuqbpQlLbL8SOle3j1iHSs5Ob5mhvMAxWN2UItOjgALAB5Zp3fmMfj8mbWvXKw== 18146 17793 18147 17794 shallow-equal@^3.1.0: 18148 17795 version "3.1.0" ··· 19526 19173 resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" 19527 19174 integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== 19528 19175 19529 - unicode-segmenter@^0.14.0: 19530 - version "0.14.0" 19531 - resolved "https://registry.yarnpkg.com/unicode-segmenter/-/unicode-segmenter-0.14.0.tgz#090128182bcc710327a1b7e4af4f5834444eaa61" 19532 - integrity sha512-AH4lhPCJANUnSLEKnM4byboctePJzltF4xj8b+NbNiYeAkAXGh7px2K/4NANFp7dnr6+zB3e6HLu8Jj8SKyvYg== 19176 + unicode-segmenter@0.14.5, unicode-segmenter@^0.14.0, unicode-segmenter@^0.14.5: 19177 + version "0.14.5" 19178 + resolved "https://registry.yarnpkg.com/unicode-segmenter/-/unicode-segmenter-0.14.5.tgz#c658f6dd30de172cdcd94542adc205ba43fb63c6" 19179 + integrity sha512-jHGmj2LUuqDcX3hqY12Ql+uhUTn8huuxNZGq7GvtF6bSybzH3aFgedYu/KTzQStEgt1Ra2F3HxadNXsNjb3m3g== 19533 19180 19534 19181 unimodules-app-loader@~6.0.8: 19535 19182 version "6.0.8" ··· 19645 19292 resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" 19646 19293 integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== 19647 19294 19648 - use-latest-callback@^0.2.3: 19649 - version "0.2.3" 19650 - resolved "https://registry.yarnpkg.com/use-latest-callback/-/use-latest-callback-0.2.3.tgz#2d644d3063040b9bc2d4c55bb525a13ae3de9e16" 19651 - integrity sha512-7vI3fBuyRcP91pazVboc4qu+6ZqM8izPWX9k7cRnT8hbD5svslcknsh3S9BUhaK11OmgTV4oWZZVSeQAiV53SQ== 19295 + use-latest-callback@^0.2.4: 19296 + version "0.2.6" 19297 + resolved "https://registry.yarnpkg.com/use-latest-callback/-/use-latest-callback-0.2.6.tgz#e5ea752808c86219acc179ace0ae3c1203255e77" 19298 + integrity sha512-FvRG9i1HSo0wagmX63Vrm8SnlUU3LMM3WyZkQ76RnslpBrX694AdG4A0zQBx2B3ZifFA0yv/BaEHGBnEax5rZg== 19652 19299 19653 19300 use-latest@^1.2.1: 19654 19301 version "1.2.1"