Bluesky app fork with some witchin' additions 💫

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

xan.lol 40b6cc32 5b8beb4a

verified
+421 -1109
+4 -4
bskyweb/templates/post.html
··· 108 {% else %} 109 <meta property="og:title" content="@{{ profileHandle }}"> 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."> 114 <meta name="twitter:card" content="summary"> 115 {% endif -%} 116 {%- endblock %} ··· 129 <div id="bsky_post_summary"> 130 <h3>Post</h3> 131 <p id="bsky_handle">{{ profileHandle }}</p> 132 - <p id="bsky_post_text">This post requires authentication to view.</p> 133 </div> 134 {% endif -%} 135 {%- endblock %}
··· 108 {% else %} 109 <meta property="og:title" content="@{{ profileHandle }}"> 110 {% endif -%} 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 <meta name="twitter:card" content="summary"> 115 {% endif -%} 116 {%- endblock %} ··· 129 <div id="bsky_post_summary"> 130 <h3>Post</h3> 131 <p id="bsky_handle">{{ profileHandle }}</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 </div> 134 {% endif -%} 135 {%- endblock %}
+10 -10
package.json
··· 62 "intl:compile-if-needed": "is-ci || [ -f src/locale/locales/en/messages.js ] || yarn intl:compile", 63 "intl:pull": "crowdin download translations --verbose -b main", 64 "intl:push": "crowdin push translations --verbose -b main", 65 "nuke": "rm -rf ./node_modules && rm -rf ./ios && rm -rf ./android", 66 "update-extensions": "bash scripts/updateExtensions.sh", 67 "export": "npx expo export --dump-sourcemap && yarn upload-native-sourcemaps", ··· 98 "@miblanchard/react-native-slider": "^2.6.0", 99 "@mozzius/expo-dynamic-app-icon": "^1.8.0", 100 "@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", 105 "@sentry/react-native": "~6.20.0", 106 "@tanstack/query-async-storage-persister": "^5.25.0", 107 "@tanstack/react-query": "5.25.0", ··· 175 "libphonenumber-js": "^1.12.31", 176 "lodash.chunk": "^4.2.0", 177 "lodash.debounce": "^4.0.8", 178 - "lodash.isequal": "^4.5.0", 179 "lodash.shuffle": "^4.2.0", 180 "lodash.throttle": "^4.1.1", 181 "multiformats": "9.9.0", ··· 195 "react-native-compressor": "^1.13.0", 196 "react-native-date-picker": "^5.0.13", 197 "react-native-device-attest": "^0.1.6", 198 - "react-native-drawer-layout": "^4.1.8", 199 "react-native-edge-to-edge": "^1.6.0", 200 "react-native-gesture-handler": "~2.28.0", 201 "react-native-get-random-values": "~1.11.0", ··· 205 "react-native-qrcode-styled": "^0.3.3", 206 "react-native-reanimated": "^3.19.1", 207 "react-native-safe-area-context": "~5.6.0", 208 - "react-native-screens": "~4.16.0", 209 "react-native-svg": "15.12.1", 210 "react-native-uitextview": "^1.4.0", 211 "react-native-url-polyfill": "^1.3.0", ··· 223 "tippy.js": "^6.3.7", 224 "tlds": "^1.234.0", 225 "tldts": "^6.1.46", 226 "zod": "^3.20.2" 227 }, 228 "devDependencies": { ··· 245 "@types/jest": "29.5.14", 246 "@types/lodash.chunk": "^4.2.7", 247 "@types/lodash.debounce": "^4.0.7", 248 - "@types/lodash.isequal": "^4.5.6", 249 "@types/lodash.shuffle": "^4.2.7", 250 "@types/psl": "^1.1.1", 251 "@types/react": "^19.1.12", ··· 274 "jest-junit": "^16.0.0", 275 "lint-staged": "^13.2.3", 276 "lockfile-lint": "^4.14.0", 277 - "metro-react-native-babel-preset": "^0.77.0", 278 "prettier": "^3.6.0", 279 "react-native-dotenv": "^3.4.11", 280 "react-refresh": "^0.14.0", ··· 291 "**/expo-constants": "18.0.8", 292 "**/expo-device": "7.1.4", 293 "**/zod": "3.23.8", 294 - "**/multiformats": "9.9.0" 295 }, 296 "jest": { 297 "preset": "jest-expo/ios",
··· 62 "intl:compile-if-needed": "is-ci || [ -f src/locale/locales/en/messages.js ] || yarn intl:compile", 63 "intl:pull": "crowdin download translations --verbose -b main", 64 "intl:push": "crowdin push translations --verbose -b main", 65 + "intl:push-sources": "crowdin push sources --verbose -b main", 66 "nuke": "rm -rf ./node_modules && rm -rf ./ios && rm -rf ./android", 67 "update-extensions": "bash scripts/updateExtensions.sh", 68 "export": "npx expo export --dump-sourcemap && yarn upload-native-sourcemaps", ··· 99 "@miblanchard/react-native-slider": "^2.6.0", 100 "@mozzius/expo-dynamic-app-icon": "^1.8.0", 101 "@react-native-async-storage/async-storage": "2.2.0", 102 + "@react-navigation/bottom-tabs": "^7.9.0", 103 + "@react-navigation/native": "^7.1.26", 104 + "@react-navigation/native-stack": "^7.9.0", 105 "@sentry/react-native": "~6.20.0", 106 "@tanstack/query-async-storage-persister": "^5.25.0", 107 "@tanstack/react-query": "5.25.0", ··· 175 "libphonenumber-js": "^1.12.31", 176 "lodash.chunk": "^4.2.0", 177 "lodash.debounce": "^4.0.8", 178 + "fast-deep-equal": "^3.1.3", 179 "lodash.shuffle": "^4.2.0", 180 "lodash.throttle": "^4.1.1", 181 "multiformats": "9.9.0", ··· 195 "react-native-compressor": "^1.13.0", 196 "react-native-date-picker": "^5.0.13", 197 "react-native-device-attest": "^0.1.6", 198 + "react-native-drawer-layout": "^4.2.1", 199 "react-native-edge-to-edge": "^1.6.0", 200 "react-native-gesture-handler": "~2.28.0", 201 "react-native-get-random-values": "~1.11.0", ··· 205 "react-native-qrcode-styled": "^0.3.3", 206 "react-native-reanimated": "^3.19.1", 207 "react-native-safe-area-context": "~5.6.0", 208 + "react-native-screens": "^4.19.0", 209 "react-native-svg": "15.12.1", 210 "react-native-uitextview": "^1.4.0", 211 "react-native-url-polyfill": "^1.3.0", ··· 223 "tippy.js": "^6.3.7", 224 "tlds": "^1.234.0", 225 "tldts": "^6.1.46", 226 + "unicode-segmenter": "^0.14.5", 227 "zod": "^3.20.2" 228 }, 229 "devDependencies": { ··· 246 "@types/jest": "29.5.14", 247 "@types/lodash.chunk": "^4.2.7", 248 "@types/lodash.debounce": "^4.0.7", 249 "@types/lodash.shuffle": "^4.2.7", 250 "@types/psl": "^1.1.1", 251 "@types/react": "^19.1.12", ··· 274 "jest-junit": "^16.0.0", 275 "lint-staged": "^13.2.3", 276 "lockfile-lint": "^4.14.0", 277 "prettier": "^3.6.0", 278 "react-native-dotenv": "^3.4.11", 279 "react-refresh": "^0.14.0", ··· 290 "**/expo-constants": "18.0.8", 291 "**/expo-device": "7.1.4", 292 "**/zod": "3.23.8", 293 + "**/multiformats": "9.9.0", 294 + "unicode-segmenter": "0.14.5" 295 }, 296 "jest": { 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 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 3 --- a/node_modules/react-native-drawer-layout/lib/module/views/Drawer.native.js 4 +++ b/node_modules/react-native-drawer-layout/lib/module/views/Drawer.native.js 5 @@ -124,15 +124,21 @@ export function Drawer({ ··· 31 - }, finished => runOnJS(onAnimationEnd)(open, finished)); 32 + }, finished => { 33 + animatingTo.value = null; 34 - + runOnJS(onAnimationEnd)(open, finished) 35 + }); 36 if (open) { 37 runOnJS(onOpen)();
··· 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 40fdcdb..770fd67 100644 3 --- a/node_modules/react-native-drawer-layout/lib/module/views/Drawer.native.js 4 +++ b/node_modules/react-native-drawer-layout/lib/module/views/Drawer.native.js 5 @@ -124,15 +124,21 @@ export function Drawer({ ··· 31 - }, finished => runOnJS(onAnimationEnd)(open, finished)); 32 + }, finished => { 33 + animatingTo.value = null; 34 + + runOnJS(onAnimationEnd)(open, finished); 35 + }); 36 if (open) { 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 * The TabsNavigator is used by native mobile to represent the routes 647 * in 3 distinct tab-stacks with a different root screen on each. 648 */ 649 - function TabsNavigator() { 650 const tabBar = useCallback( 651 (props: JSX.IntrinsicAttributes & BottomTabBarProps) => ( 652 <BottomBar {...props} /> ··· 659 initialRouteName="HomeTab" 660 backBehavior="initialRoute" 661 screenOptions={{headerShown: false, lazy: true}} 662 - tabBar={tabBar}> 663 <Tab.Screen name="HomeTab" getComponent={() => HomeTabNavigator} /> 664 <Tab.Screen name="SearchTab" getComponent={() => SearchTabNavigator} /> 665 <Tab.Screen ··· 767 * The FlatNavigator is used by Web to represent the routes 768 * in a single ("flat") stack. 769 */ 770 - const FlatNavigator = () => { 771 const t = useTheme() 772 const numUnread = useUnreadNotifications() 773 const screenListeners = useWebScrollRestoration() ··· 775 776 return ( 777 <Flat.Navigator 778 screenListeners={screenListeners} 779 screenOptions={screenOptions(t)}> 780 <Flat.Screen
··· 646 * The TabsNavigator is used by native mobile to represent the routes 647 * in 3 distinct tab-stacks with a different root screen on each. 648 */ 649 + function TabsNavigator({ 650 + layout, 651 + }: { 652 + layout: React.ComponentProps<typeof Tab.Navigator>['layout'] 653 + }) { 654 const tabBar = useCallback( 655 (props: JSX.IntrinsicAttributes & BottomTabBarProps) => ( 656 <BottomBar {...props} /> ··· 663 initialRouteName="HomeTab" 664 backBehavior="initialRoute" 665 screenOptions={{headerShown: false, lazy: true}} 666 + tabBar={tabBar} 667 + layout={layout}> 668 <Tab.Screen name="HomeTab" getComponent={() => HomeTabNavigator} /> 669 <Tab.Screen name="SearchTab" getComponent={() => SearchTabNavigator} /> 670 <Tab.Screen ··· 772 * The FlatNavigator is used by Web to represent the routes 773 * in a single ("flat") stack. 774 */ 775 + const FlatNavigator = ({ 776 + layout, 777 + }: { 778 + layout: React.ComponentProps<typeof Flat.Navigator>['layout'] 779 + }) => { 780 const t = useTheme() 781 const numUnread = useUnreadNotifications() 782 const screenListeners = useWebScrollRestoration() ··· 784 785 return ( 786 <Flat.Navigator 787 + layout={layout} 788 screenListeners={screenListeners} 789 screenOptions={screenOptions(t)}> 790 <Flat.Screen
-2
src/components/FeedInterstitials.tsx
··· 776 } 777 778 function SeeMoreSuggestedProfilesCard({onPress}: {onPress: () => void}) { 779 - const t = useTheme() 780 const {_} = useLingui() 781 782 return ( ··· 790 a.gap_sm, 791 a.p_md, 792 a.rounded_lg, 793 - t.atoms.shadow_sm, 794 {width: FINAL_CARD_WIDTH}, 795 ]}> 796 <ButtonIcon icon={ArrowRight} size="lg" />
··· 776 } 777 778 function SeeMoreSuggestedProfilesCard({onPress}: {onPress: () => void}) { 779 const {_} = useLingui() 780 781 return ( ··· 789 a.gap_sm, 790 a.p_md, 791 a.rounded_lg, 792 {width: FINAL_CARD_WIDTH}, 793 ]}> 794 <ButtonIcon icon={ArrowRight} size="lg" />
+12 -1
src/components/Post/Embed/ExternalEmbed/Gif.tsx
··· 11 import {useLingui} from '@lingui/react' 12 13 import {HITSLOP_20} from '#/lib/constants' 14 import {type EmbedPlayerParams} from '#/lib/strings/embed-player' 15 import {isWeb} from '#/platform/detection' 16 import {useAutoplayDisabled} from '#/state/preferences' ··· 111 playerRef.current?.toggleAsync() 112 }, []) 113 114 return ( 115 <View 116 style={[ ··· 118 a.overflow_hidden, 119 a.border, 120 t.atoms.border_contrast_low, 121 - {aspectRatio: params.dimensions!.width / params.dimensions!.height}, 122 style, 123 ]}> 124 <View
··· 11 import {useLingui} from '@lingui/react' 12 13 import {HITSLOP_20} from '#/lib/constants' 14 + import {clamp} from '#/lib/numbers' 15 import {type EmbedPlayerParams} from '#/lib/strings/embed-player' 16 import {isWeb} from '#/platform/detection' 17 import {useAutoplayDisabled} from '#/state/preferences' ··· 112 playerRef.current?.toggleAsync() 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 + 124 return ( 125 <View 126 style={[ ··· 128 a.overflow_hidden, 129 a.border, 130 t.atoms.border_contrast_low, 131 + {backgroundColor: t.palette.black}, 132 + {aspectRatio}, 133 style, 134 ]}> 135 <View
+29 -13
src/components/Post/Embed/index.tsx
··· 1 - import React from 'react' 2 import {View} from 'react-native' 3 import { 4 type $Typed, ··· 12 import {useLingui} from '@lingui/react' 13 import {useQueryClient} from '@tanstack/react-query' 14 15 - import {usePalette} from '#/lib/hooks/usePalette' 16 import {makeProfileLink} from '#/lib/routes/links' 17 import {useDirectFetchRecords} from '#/state/preferences/direct-fetch-records' 18 import {useModerationOpts} from '#/state/preferences/moderation-opts' ··· 22 import {Link} from '#/view/com/util/Link' 23 import {PostMeta} from '#/view/com/util/PostMeta' 24 import {atoms as a, useTheme} from '#/alf' 25 import {ContentHider} from '#/components/moderation/ContentHider' 26 import {PostAlerts} from '#/components/moderation/PostAlerts' 27 import {RichText} from '#/components/RichText' ··· 318 visibilityLabel?: string 319 }) { 320 const moderationOpts = useModerationOpts() 321 - const quote = React.useMemo<$Typed<AppBskyFeedDefs.PostView>>( 322 () => ({ 323 ...embed.view, 324 $type: 'app.bsky.feed.defs#postView', ··· 327 }), 328 [embed], 329 ) 330 - const moderation = React.useMemo(() => { 331 return moderationOpts ? moderatePost(quote, moderationOpts) : undefined 332 }, [quote, moderationOpts]) 333 334 const t = useTheme() 335 const queryClient = useQueryClient() 336 - const pal = usePalette('default') 337 const itemUrip = new AtUri(quote.uri) 338 const itemHref = makeProfileLink(quote.author, 'post', itemUrip.rkey) 339 const itemTitle = `Post by ${quote.author.handle}` 340 341 - const richText = React.useMemo(() => { 342 if ( 343 !bsky.dangerousIsType<AppBskyFeedPost.Record>( 344 quote.record, ··· 352 : undefined 353 }, [quote.record]) 354 355 - const onBeforePress = React.useCallback(() => { 356 unstableCacheProfileView(queryClient, quote.author) 357 onOpen?.() 358 }, [queryClient, quote.author, onOpen]) 359 360 - const [hover, setHover] = React.useState(false) 361 return ( 362 <View 363 style={[a.mt_sm]} 364 - onPointerEnter={() => setHover(true)} 365 - onPointerLeave={() => setHover(false)}> 366 <ContentHider 367 modui={moderation?.ui('contentList')} 368 style={[a.rounded_md, a.border, t.atoms.border_contrast_low, style]} ··· 370 childContainerStyle={[a.pt_sm]}> 371 {({active}) => ( 372 <> 373 - {!active && <SubtleHover hover={hover} style={[a.rounded_md]} />} 374 <Link 375 style={[!active && a.p_md]} 376 - hoverStyle={{borderColor: pal.colors.borderLinkHover}} 377 href={itemHref} 378 title={itemTitle} 379 - onBeforePress={onBeforePress}> 380 <View pointerEvents="none"> 381 <PostMeta 382 author={quote.author}
··· 1 + import {useCallback, useMemo} from 'react' 2 import {View} from 'react-native' 3 import { 4 type $Typed, ··· 12 import {useLingui} from '@lingui/react' 13 import {useQueryClient} from '@tanstack/react-query' 14 15 import {makeProfileLink} from '#/lib/routes/links' 16 import {useDirectFetchRecords} from '#/state/preferences/direct-fetch-records' 17 import {useModerationOpts} from '#/state/preferences/moderation-opts' ··· 21 import {Link} from '#/view/com/util/Link' 22 import {PostMeta} from '#/view/com/util/PostMeta' 23 import {atoms as a, useTheme} from '#/alf' 24 + import {useInteractionState} from '#/components/hooks/useInteractionState' 25 import {ContentHider} from '#/components/moderation/ContentHider' 26 import {PostAlerts} from '#/components/moderation/PostAlerts' 27 import {RichText} from '#/components/RichText' ··· 318 visibilityLabel?: string 319 }) { 320 const moderationOpts = useModerationOpts() 321 + const quote = useMemo<$Typed<AppBskyFeedDefs.PostView>>( 322 () => ({ 323 ...embed.view, 324 $type: 'app.bsky.feed.defs#postView', ··· 327 }), 328 [embed], 329 ) 330 + const moderation = useMemo(() => { 331 return moderationOpts ? moderatePost(quote, moderationOpts) : undefined 332 }, [quote, moderationOpts]) 333 334 const t = useTheme() 335 const queryClient = useQueryClient() 336 const itemUrip = new AtUri(quote.uri) 337 const itemHref = makeProfileLink(quote.author, 'post', itemUrip.rkey) 338 const itemTitle = `Post by ${quote.author.handle}` 339 340 + const richText = useMemo(() => { 341 if ( 342 !bsky.dangerousIsType<AppBskyFeedPost.Record>( 343 quote.record, ··· 351 : undefined 352 }, [quote.record]) 353 354 + const onBeforePress = useCallback(() => { 355 unstableCacheProfileView(queryClient, quote.author) 356 onOpen?.() 357 }, [queryClient, quote.author, onOpen]) 358 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() 369 return ( 370 <View 371 style={[a.mt_sm]} 372 + onPointerEnter={onPointerEnter} 373 + onPointerLeave={onPointerLeave}> 374 <ContentHider 375 modui={moderation?.ui('contentList')} 376 style={[a.rounded_md, a.border, t.atoms.border_contrast_low, style]} ··· 378 childContainerStyle={[a.pt_sm]}> 379 {({active}) => ( 380 <> 381 + {!active && ( 382 + <SubtleHover 383 + native 384 + hover={hover || pressed} 385 + style={[a.rounded_md]} 386 + /> 387 + )} 388 <Link 389 style={[!active && a.p_md]} 390 + hoverStyle={t.atoms.border_contrast_high} 391 href={itemHref} 392 title={itemTitle} 393 + onBeforePress={onBeforePress} 394 + onPressIn={onPressIn} 395 + onPressOut={onPressOut}> 396 <View pointerEvents="none"> 397 <PostMeta 398 author={quote.author}
+3 -3
src/components/dialogs/lists/CreateOrEditListDialog.tsx
··· 5 import {useLingui} from '@lingui/react' 6 7 import {cleanError} from '#/lib/strings/errors' 8 - import {useWarnMaxGraphemeCount} from '#/lib/strings/helpers' 9 import {richTextToString} from '#/lib/strings/rich-text-helpers' 10 import {shortenLinks, stripInvalidMentions} from '#/lib/strings/rich-text-manip' 11 import {logger} from '#/logger' ··· 262 _, 263 ]) 264 265 - const displayNameTooLong = useWarnMaxGraphemeCount({ 266 text: displayName, 267 maxCount: DISPLAY_NAME_MAX_GRAPHEMES, 268 }) 269 - const descriptionTooLong = useWarnMaxGraphemeCount({ 270 text: descriptionRt, 271 maxCount: DESCRIPTION_MAX_GRAPHEMES, 272 })
··· 5 import {useLingui} from '@lingui/react' 6 7 import {cleanError} from '#/lib/strings/errors' 8 + import {isOverMaxGraphemeCount} from '#/lib/strings/helpers' 9 import {richTextToString} from '#/lib/strings/rich-text-helpers' 10 import {shortenLinks, stripInvalidMentions} from '#/lib/strings/rich-text-manip' 11 import {logger} from '#/logger' ··· 262 _, 263 ]) 264 265 + const displayNameTooLong = isOverMaxGraphemeCount({ 266 text: displayName, 267 maxCount: DISPLAY_NAME_MAX_GRAPHEMES, 268 }) 269 + const descriptionTooLong = isOverMaxGraphemeCount({ 270 text: descriptionRt, 271 maxCount: DESCRIPTION_MAX_GRAPHEMES, 272 })
+1 -2
src/components/moderation/ReportDialog/index.tsx
··· 1 import React from 'react' 2 - import {Pressable, View} from 'react-native' 3 - import {type ScrollView} from 'react-native-gesture-handler' 4 import {type AppBskyLabelerDefs, BSKY_LABELER_DID} from '@atproto/api' 5 import {msg, Trans} from '@lingui/macro' 6 import {useLingui} from '@lingui/react'
··· 1 import React from 'react' 2 + import {Pressable, type ScrollView, View} from 'react-native' 3 import {type AppBskyLabelerDefs, BSKY_LABELER_DID} from '@atproto/api' 4 import {msg, Trans} from '@lingui/macro' 5 import {useLingui} from '@lingui/react'
+7 -27
src/lib/strings/helpers.ts
··· 1 - import {useCallback, useMemo} from 'react' 2 import {type RichText} from '@atproto/api' 3 - import Graphemer from 'graphemer' 4 5 import {shortenLinks} from './rich-text-manip' 6 ··· 29 return str 30 } 31 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({ 48 text, 49 maxCount, 50 }: { 51 text: string | RichText 52 maxCount: number 53 }) { 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]) 63 } 64 65 export function countLines(str: string | undefined): number {
··· 1 import {type RichText} from '@atproto/api' 2 + import {countGraphemes} from 'unicode-segmenter/grapheme' 3 4 import {shortenLinks} from './rich-text-manip' 5 ··· 28 return str 29 } 30 31 + export function isOverMaxGraphemeCount({ 32 text, 33 maxCount, 34 }: { 35 text: string | RichText 36 maxCount: number 37 }) { 38 + if (typeof text === 'string') { 39 + return countGraphemes(text) > maxCount 40 + } else { 41 + return shortenLinks(text).graphemeLength > maxCount 42 + } 43 } 44 45 export function countLines(str: string | undefined): number {
+2 -1
src/locale/i18n.ts
··· 138 await Promise.all([ 139 import('@formatjs/intl-pluralrules/locale-data/eo'), 140 import('@formatjs/intl-numberformat/locale-data/eo'), 141 - import('@formatjs/intl-displaynames/locale-data/eo'), 142 ]) 143 break 144 }
··· 138 await Promise.all([ 139 import('@formatjs/intl-pluralrules/locale-data/eo'), 140 import('@formatjs/intl-numberformat/locale-data/eo'), 141 + // borked, see https://github.com/bluesky-social/social-app/pull/9574 142 + // import('@formatjs/intl-displaynames/locale-data/eo'), 143 ]) 144 break 145 }
+122 -119
src/locale/locales/en/messages.po
··· 436 msgstr "" 437 438 #: src/screens/Settings/FindContactsSettings.tsx:430 439 - msgid "{numMatches, plural, one {1 contact found} other {# contacts found}}" 440 msgstr "" 441 442 #: src/components/NewskieDialog.tsx:113 ··· 574 msgid "A screenshot of a profile page with a bell icon next to the follow button, indicating the new activity notifications feature." 575 msgstr "" 576 577 - #: src/Navigation.tsx:534 578 #: src/screens/Settings/AboutSettings.tsx:75 579 #: src/screens/Settings/Settings.tsx:262 580 #: src/screens/Settings/Settings.tsx:265 ··· 609 msgid "Accessibility" 610 msgstr "" 611 612 - #: src/Navigation.tsx:385 613 msgid "Accessibility Settings" 614 msgstr "" 615 616 - #: src/Navigation.tsx:401 617 #: src/screens/Login/LoginForm.tsx:194 618 #: src/screens/Settings/AccountSettings.tsx:51 619 #: src/screens/Settings/Settings.tsx:180 ··· 648 msgid "Account Muted by List" 649 msgstr "" 650 651 - #: src/screens/Settings/Settings.tsx:644 652 msgid "Account options" 653 msgstr "" 654 ··· 656 msgid "Account provider" 657 msgstr "" 658 659 - #: src/screens/Settings/Settings.tsx:680 660 msgid "Account removed from quick access" 661 msgstr "" 662 ··· 688 msgid "Activity from others" 689 msgstr "" 690 691 - #: src/Navigation.tsx:502 692 msgid "Activity notifications" 693 msgstr "" 694 ··· 770 msgid "Add emoji reaction" 771 msgstr "" 772 773 - #: src/view/com/feeds/ComposerPrompt.tsx:224 774 msgid "Add image" 775 msgstr "" 776 ··· 1011 msgid "Already signed in as @{0}" 1012 msgstr "" 1013 1014 - #: src/components/Post/Embed/ExternalEmbed/Gif.tsx:186 1015 #: src/view/com/composer/GifAltText.tsx:100 1016 #: src/view/com/composer/photos/Gallery.tsx:188 1017 msgid "ALT" ··· 1027 msgid "Alt text" 1028 msgstr "" 1029 1030 - #: src/components/Post/Embed/ExternalEmbed/Gif.tsx:191 1031 msgid "Alt Text" 1032 msgstr "" 1033 ··· 1167 msgid "Animals" 1168 msgstr "" 1169 1170 - #: src/components/Post/Embed/ExternalEmbed/Gif.tsx:149 1171 msgid "Animated GIF" 1172 msgstr "" 1173 ··· 1193 msgid "Anyone who follows me" 1194 msgstr "" 1195 1196 - #: src/Navigation.tsx:542 1197 #: src/screens/Settings/AppIconSettings/index.tsx:67 1198 #: src/screens/Settings/AppIconSettings/SettingsListItem.tsx:18 1199 #: src/screens/Settings/AppIconSettings/SettingsListItem.tsx:23 ··· 1234 msgid "App passwords" 1235 msgstr "" 1236 1237 - #: src/Navigation.tsx:353 1238 #: src/screens/Settings/AppPasswords.tsx:50 1239 msgid "App Passwords" 1240 msgstr "" ··· 1270 msgid "Appeal this decision" 1271 msgstr "" 1272 1273 - #: src/Navigation.tsx:393 1274 #: src/screens/Settings/AppearanceSettings.tsx:73 1275 #: src/screens/Settings/Settings.tsx:230 1276 #: src/screens/Settings/Settings.tsx:233 ··· 1520 msgid "Blocked accounts" 1521 msgstr "" 1522 1523 - #: src/Navigation.tsx:194 1524 #: src/view/screens/ModerationBlockedAccounts.tsx:104 1525 msgid "Blocked Accounts" 1526 msgstr "" ··· 1642 msgid "Browse custom feeds" 1643 msgstr "" 1644 1645 - #: src/components/FeedInterstitials.tsx:778 1646 msgid "Browse more accounts" 1647 msgstr "" 1648 1649 - #: src/components/FeedInterstitials.tsx:907 1650 msgid "Browse more feeds on the Explore page" 1651 msgstr "" 1652 1653 - #: src/components/FeedInterstitials.tsx:888 1654 - #: src/components/FeedInterstitials.tsx:891 1655 msgid "Browse more suggestions" 1656 msgstr "" 1657 1658 - #: src/components/FeedInterstitials.tsx:916 1659 msgid "Browse more suggestions on the Explore page" 1660 msgstr "" 1661 ··· 1872 msgstr "" 1873 1874 #: src/lib/hooks/useNotificationHandler.ts:99 1875 - #: src/Navigation.tsx:559 1876 #: src/view/shell/bottom-bar/BottomBar.tsx:221 1877 #: src/view/shell/desktop/LeftNav.tsx:608 1878 #: src/view/shell/Drawer.tsx:466 ··· 1898 msgid "Chat muted" 1899 msgstr "" 1900 1901 - #: src/Navigation.tsx:569 1902 #: src/screens/Messages/components/InboxPreview.tsx:22 1903 msgid "Chat request inbox" 1904 msgstr "" ··· 1910 msgstr "" 1911 1912 #: src/components/dms/ConvoMenu.tsx:78 1913 - #: src/Navigation.tsx:564 1914 #: src/screens/Messages/ChatList.tsx:81 1915 #: src/screens/Messages/ChatList.tsx:85 1916 #: src/screens/Messages/ChatList.tsx:380 ··· 2081 #: src/components/live/EditLiveDialog.tsx:235 2082 #: src/components/NewskieDialog.tsx:167 2083 #: src/components/NewskieDialog.tsx:173 2084 - #: src/components/Post/Embed/ExternalEmbed/Gif.tsx:197 2085 #: src/components/ProgressGuide/FollowDialog.tsx:440 2086 #: src/components/StarterPack/Wizard/WizardEditListDialog.tsx:118 2087 #: src/components/StarterPack/Wizard/WizardEditListDialog.tsx:124 ··· 2199 msgstr "" 2200 2201 #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:45 2202 - #: src/Navigation.tsx:343 2203 #: src/view/screens/CommunityGuidelines.tsx:37 2204 msgid "Community Guidelines" 2205 msgstr "" ··· 2298 2299 #: src/components/ageAssurance/AgeAssuranceAppealDialog.tsx:93 2300 msgid "Contact us" 2301 msgstr "" 2302 2303 #: src/screens/Settings/FindContactsSettings.tsx:471 2304 msgid "Contacts removed" 2305 msgstr "" 2306 2307 - #: src/screens/Settings/FindContactsSettings.tsx:498 2308 - msgid "Contacts uploaded" 2309 - msgstr "" 2310 - 2311 #: src/screens/Settings/ContentAndMediaSettings.tsx:51 2312 msgid "Content & Media" 2313 msgstr "" ··· 2317 msgid "Content and media" 2318 msgstr "" 2319 2320 - #: src/Navigation.tsx:518 2321 msgid "Content and Media" 2322 msgstr "" 2323 ··· 2515 2516 #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:40 2517 #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:107 2518 - #: src/Navigation.tsx:348 2519 #: src/view/screens/CopyrightPolicy.tsx:34 2520 msgid "Copyright Policy" 2521 msgstr "" ··· 2604 2605 #: src/components/StarterPack/ProfileStarterPacks.tsx:206 2606 #: src/components/StarterPack/ProfileStarterPacks.tsx:315 2607 - #: src/Navigation.tsx:599 2608 msgid "Create a starter pack" 2609 msgstr "" 2610 ··· 3230 msgid "Edit moderation list" 3231 msgstr "" 3232 3233 - #: src/Navigation.tsx:358 3234 #: src/view/screens/Feeds.tsx:518 3235 msgid "Edit My Feeds" 3236 msgstr "" ··· 3272 msgid "Edit who can reply" 3273 msgstr "" 3274 3275 - #: src/Navigation.tsx:604 3276 msgid "Edit your starter pack" 3277 msgstr "" 3278 ··· 3601 msgid "Explicit sexual images." 3602 msgstr "" 3603 3604 - #: src/Navigation.tsx:778 3605 #: src/screens/Search/Shell.tsx:327 3606 #: src/view/shell/desktop/LeftNav.tsx:690 3607 #: src/view/shell/Drawer.tsx:414 ··· 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 msgstr "" 3639 3640 - #: src/Navigation.tsx:377 3641 #: src/screens/Settings/ExternalMediaPreferences.tsx:34 3642 msgid "External Media Preferences" 3643 msgstr "" ··· 3874 msgid "False information about elections" 3875 msgstr "" 3876 3877 - #: src/Navigation.tsx:293 3878 msgid "Feed" 3879 msgstr "" 3880 ··· 3915 msgid "Feedback sent to feed operator" 3916 msgstr "" 3917 3918 - #: src/Navigation.tsx:584 3919 #: src/screens/SavedFeeds.tsx:108 3920 #: src/screens/Search/SearchResults.tsx:78 3921 #: src/screens/StarterPack/StarterPackScreen.tsx:190 ··· 3986 msgid "Find accounts to follow" 3987 msgstr "" 3988 3989 - #: src/Navigation.tsx:425 3990 - #: src/Navigation.tsx:626 3991 msgid "Find Contacts" 3992 msgstr "" 3993 ··· 4141 msgid "Followed by <0>{0}</0>, <1>{1}</1>, and {2, plural, one {# other} other {# others}}" 4142 msgstr "" 4143 4144 - #: src/Navigation.tsx:247 4145 msgid "Followers of @{0} that you know" 4146 msgstr "" 4147 ··· 4184 msgid "Following feed preferences" 4185 msgstr "" 4186 4187 - #: src/Navigation.tsx:364 4188 #: src/screens/Settings/FollowingFeedPreferences.tsx:56 4189 msgid "Following Feed Preferences" 4190 msgstr "" ··· 4510 msgid "Harming or endangering minors" 4511 msgstr "" 4512 4513 - #: src/Navigation.tsx:549 4514 msgid "Hashtag" 4515 msgstr "" 4516 ··· 4696 msgid "Hold up! We’re gradually giving access to video, and you’re still waiting in line. Check back soon!" 4697 msgstr "" 4698 4699 - #: src/Navigation.tsx:773 4700 - #: src/Navigation.tsx:793 4701 #: src/view/shell/bottom-bar/BottomBar.tsx:178 4702 #: src/view/shell/desktop/LeftNav.tsx:672 4703 #: src/view/shell/Drawer.tsx:440 ··· 4853 msgid "Import contacts to find your friends" 4854 msgstr "" 4855 4856 #: src/ageAssurance/components/NoAccessScreen.tsx:204 4857 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 msgstr "" ··· 5081 msgid "Labels on your content" 5082 msgstr "" 5083 5084 - #: src/Navigation.tsx:220 5085 msgid "Language Settings" 5086 msgstr "" 5087 ··· 5258 msgid "Like 10 posts to train the Discover feed" 5259 msgstr "" 5260 5261 - #: src/Navigation.tsx:462 5262 msgid "Like notifications" 5263 msgstr "" 5264 ··· 5270 msgid "Like this labeler" 5271 msgstr "" 5272 5273 - #: src/Navigation.tsx:298 5274 - #: src/Navigation.tsx:303 5275 msgid "Liked by" 5276 msgstr "" 5277 ··· 5306 msgid "Likes of your reposts" 5307 msgstr "" 5308 5309 - #: src/Navigation.tsx:486 5310 msgid "Likes of your reposts notifications" 5311 msgstr "" 5312 ··· 5319 msgid "Linear" 5320 msgstr "" 5321 5322 - #: src/Navigation.tsx:253 5323 msgid "List" 5324 msgstr "" 5325 ··· 5399 msgid "List unmuted" 5400 msgstr "" 5401 5402 - #: src/Navigation.tsx:174 5403 #: src/view/screens/Lists.tsx:67 5404 #: src/view/screens/Profile.tsx:233 5405 #: src/view/screens/Profile.tsx:241 ··· 5464 msgid "Loading..." 5465 msgstr "" 5466 5467 - #: src/Navigation.tsx:323 5468 msgid "Log" 5469 msgstr "" 5470 ··· 5559 msgid "Media that may be disturbing or inappropriate for some audiences." 5560 msgstr "" 5561 5562 - #: src/Navigation.tsx:446 5563 msgid "Mention notifications" 5564 msgstr "" 5565 ··· 5612 msgid "Message options" 5613 msgstr "" 5614 5615 - #: src/Navigation.tsx:788 5616 msgid "Messages" 5617 msgstr "" 5618 ··· 5625 msgid "Minor harassment or bullying" 5626 msgstr "" 5627 5628 - #: src/Navigation.tsx:510 5629 msgid "Miscellaneous notifications" 5630 msgstr "" 5631 ··· 5633 msgid "Misleading" 5634 msgstr "" 5635 5636 - #: src/Navigation.tsx:179 5637 #: src/screens/Moderation/index.tsx:99 5638 #: src/screens/Settings/Settings.tsx:194 5639 #: src/screens/Settings/Settings.tsx:197 ··· 5672 msgid "Moderation lists" 5673 msgstr "" 5674 5675 - #: src/Navigation.tsx:184 5676 #: src/view/screens/ModerationModlists.tsx:67 5677 msgid "Moderation Lists" 5678 msgstr "" ··· 5681 msgid "moderation settings" 5682 msgstr "" 5683 5684 - #: src/Navigation.tsx:313 5685 msgid "Moderation states" 5686 msgstr "" 5687 ··· 5804 msgid "Muted accounts" 5805 msgstr "" 5806 5807 - #: src/Navigation.tsx:189 5808 #: src/view/screens/ModerationMutedAccounts.tsx:116 5809 msgid "Muted Accounts" 5810 msgstr "" ··· 5903 msgid "New Feature" 5904 msgstr "" 5905 5906 - #: src/Navigation.tsx:478 5907 msgid "New follower notifications" 5908 msgstr "" 5909 ··· 6209 msgid "Not followed by anyone you're following" 6210 msgstr "" 6211 6212 - #: src/Navigation.tsx:169 6213 #: src/view/screens/Profile.tsx:132 6214 msgid "Not Found" 6215 msgstr "" ··· 6235 msgid "Nothing saved yet" 6236 msgstr "" 6237 6238 - #: src/Navigation.tsx:432 6239 - #: src/Navigation.tsx:579 6240 #: src/view/screens/Notifications.tsx:136 6241 msgid "Notification settings" 6242 msgstr "" ··· 6249 msgid "Notification Sounds" 6250 msgstr "" 6251 6252 - #: src/Navigation.tsx:574 6253 - #: src/Navigation.tsx:783 6254 #: src/screens/Notifications/ActivityList.tsx:30 6255 #: src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx:90 6256 #: src/screens/Settings/NotificationSettings/index.tsx:92 ··· 6392 msgid "Open avatar creator" 6393 msgstr "" 6394 6395 - #: src/view/com/feeds/ComposerPrompt.tsx:202 6396 msgid "Open camera" 6397 msgstr "" 6398 ··· 6501 msgid "Opens composer" 6502 msgstr "" 6503 6504 - #: src/view/com/feeds/ComposerPrompt.tsx:203 6505 msgid "Opens device camera" 6506 msgstr "" 6507 ··· 6532 msgid "Opens helpdesk in browser" 6533 msgstr "" 6534 6535 - #: src/view/com/feeds/ComposerPrompt.tsx:225 6536 msgid "Opens image picker" 6537 msgstr "" 6538 ··· 6675 msgid "Password updated!" 6676 msgstr "" 6677 6678 - #: src/components/Post/Embed/ExternalEmbed/Gif.tsx:43 6679 #: src/components/Post/Embed/VideoEmbed/VideoEmbedInner/VideoEmbedInnerNative.tsx:137 6680 #: src/components/Post/Embed/VideoEmbed/VideoEmbedInner/web-controls/VideoControls.tsx:369 6681 msgid "Pause" ··· 6691 msgid "People" 6692 msgstr "" 6693 6694 - #: src/Navigation.tsx:240 6695 msgid "People followed by @{0}" 6696 msgstr "" 6697 6698 - #: src/Navigation.tsx:233 6699 msgid "People following @{0}" 6700 msgstr "" 6701 ··· 6786 msgid "Pinned to your feeds" 6787 msgstr "" 6788 6789 - #: src/components/Post/Embed/ExternalEmbed/Gif.tsx:43 6790 #: src/components/Post/Embed/VideoEmbed/VideoEmbedInner/VideoEmbedInnerNative.tsx:137 6791 #: src/components/Post/Embed/VideoEmbed/VideoEmbedInner/web-controls/VideoControls.tsx:370 6792 msgid "Play" ··· 6805 msgid "Play Video" 6806 msgstr "" 6807 6808 - #: src/components/Post/Embed/ExternalEmbed/Gif.tsx:42 6809 msgid "Plays or pauses the GIF" 6810 msgstr "" 6811 ··· 6953 msgid "Please sign in as @{0}" 6954 msgstr "" 6955 6956 #: src/screens/FindContactsFlowScreen.tsx:71 6957 - #: src/screens/Settings/FindContactsSettings.tsx:102 6958 msgid "Please use the native app to sync your contacts." 6959 msgstr "" 6960 ··· 7004 msgid "Post blocked" 7005 msgstr "" 7006 7007 - #: src/Navigation.tsx:266 7008 - #: src/Navigation.tsx:273 7009 - #: src/Navigation.tsx:280 7010 - #: src/Navigation.tsx:287 7011 msgid "Post by @{0}" 7012 msgstr "" 7013 ··· 7041 msgid "Post interaction settings" 7042 msgstr "" 7043 7044 - #: src/Navigation.tsx:200 7045 #: src/screens/ModerationInteractionSettings/index.tsx:34 7046 msgid "Post Interaction Settings" 7047 msgstr "" ··· 7140 msgid "Privacy and security" 7141 msgstr "" 7142 7143 - #: src/Navigation.tsx:409 7144 - #: src/Navigation.tsx:417 7145 #: src/screens/Settings/ActivityPrivacySettings.tsx:40 7146 #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:44 7147 msgid "Privacy and Security" ··· 7154 7155 #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:35 7156 #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:102 7157 - #: src/Navigation.tsx:333 7158 #: src/screens/Settings/AboutSettings.tsx:92 7159 #: src/screens/Settings/AboutSettings.tsx:95 7160 #: src/view/screens/PrivacyPolicy.tsx:34 ··· 7253 msgid "QR code saved to your camera roll!" 7254 msgstr "" 7255 7256 - #: src/Navigation.tsx:454 7257 msgid "Quote notifications" 7258 msgstr "" 7259 ··· 7414 #: src/components/StarterPack/Wizard/WizardListCard.tsx:105 7415 #: src/components/StarterPack/Wizard/WizardListCard.tsx:112 7416 #: src/screens/Bookmarks/index.tsx:266 7417 - #: src/screens/Settings/Settings.tsx:682 7418 #: src/view/com/modals/UserAddRemoveLists.tsx:235 7419 #: src/view/com/posts/PostFeedErrorMessage.tsx:220 7420 msgid "Remove" ··· 7428 msgid "Remove {historyItem}" 7429 msgstr "" 7430 7431 - #: src/screens/Settings/Settings.tsx:661 7432 - #: src/screens/Settings/Settings.tsx:664 7433 msgid "Remove account" 7434 msgstr "" 7435 ··· 7474 msgid "Remove from my feeds" 7475 msgstr "" 7476 7477 - #: src/screens/Settings/Settings.tsx:674 7478 msgid "Remove from quick access?" 7479 msgstr "" 7480 ··· 7641 msgid "Reply Hidden by You" 7642 msgstr "" 7643 7644 - #: src/Navigation.tsx:438 7645 msgid "Reply notifications" 7646 msgstr "" 7647 ··· 7756 msgid "Repost ({0, plural, one {# repost} other {# reposts}})" 7757 msgstr "" 7758 7759 - #: src/Navigation.tsx:470 7760 msgid "Repost notifications" 7761 msgstr "" 7762 ··· 7797 msgid "Reposts of your reposts" 7798 msgstr "" 7799 7800 - #: src/Navigation.tsx:494 7801 msgid "Reposts of your reposts notifications" 7802 msgstr "" 7803 ··· 8006 msgstr "" 8007 8008 #: src/components/dialogs/nuxs/BookmarksAnnouncement.tsx:143 8009 - #: src/Navigation.tsx:618 8010 #: src/screens/Bookmarks/index.tsx:60 8011 msgid "Saved Posts" 8012 msgstr "" ··· 8052 msgid "Search" 8053 msgstr "" 8054 8055 - #: src/Navigation.tsx:259 8056 #: src/screens/Profile/ProfileSearch.tsx:37 8057 msgid "Search @{0}'s posts" 8058 msgstr "" ··· 8169 msgstr "" 8170 8171 #: src/components/FeedInterstitials.tsx:730 8172 - #: src/components/FeedInterstitials.tsx:793 8173 msgid "See more" 8174 msgstr "" 8175 ··· 8448 msgid "Sets email for password reset" 8449 msgstr "" 8450 8451 - #: src/Navigation.tsx:215 8452 #: src/screens/Settings/Settings.tsx:105 8453 #: src/view/shell/desktop/LeftNav.tsx:805 8454 #: src/view/shell/Drawer.tsx:609 ··· 8593 msgid "Share your favorite feed!" 8594 msgstr "" 8595 8596 - #: src/Navigation.tsx:318 8597 msgid "Shared Preferences Tester" 8598 msgstr "" 8599 ··· 8603 msgid "Show" 8604 msgstr "" 8605 8606 - #: src/components/Post/Embed/ExternalEmbed/Gif.tsx:178 8607 msgid "Show alt text" 8608 msgstr "" 8609 ··· 8842 msgid "Some of your verifications are invalid." 8843 msgstr "" 8844 8845 - #: src/components/FeedInterstitials.tsx:870 8846 msgid "Some other feeds you might like" 8847 msgstr "" 8848 ··· 8956 msgid "Start chat with {displayName}" 8957 msgstr "" 8958 8959 - #: src/Navigation.tsx:589 8960 - #: src/Navigation.tsx:594 8961 #: src/screens/StarterPack/Wizard/index.tsx:209 8962 msgid "Starter Pack" 8963 msgstr "" ··· 9010 msgid "Stored as part of a secure code for matching with others" 9011 msgstr "" 9012 9013 - #: src/Navigation.tsx:308 9014 #: src/screens/Settings/Settings.tsx:466 9015 msgid "Storybook" 9016 msgstr "" ··· 9101 msgid "Sunset" 9102 msgstr "" 9103 9104 - #: src/Navigation.tsx:328 9105 #: src/view/screens/Support.tsx:34 9106 #: src/view/screens/Support.tsx:37 9107 msgid "Support" ··· 9215 #: src/components/dialogs/BirthDateSettings.tsx:182 9216 #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:30 9217 #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:97 9218 - #: src/Navigation.tsx:338 9219 #: src/screens/Settings/AboutSettings.tsx:84 9220 #: src/screens/Settings/AboutSettings.tsx:87 9221 #: src/view/screens/TermsOfService.tsx:34 ··· 9528 msgid "This appeal will be sent to Bluesky's moderation service." 9529 msgstr "" 9530 9531 #: src/screens/Messages/components/MessageListError.tsx:18 9532 msgid "This chat was disconnected" 9533 msgstr "" ··· 9737 msgid "This will delete \"{0}\" from your muted words. You can always add it back later." 9738 msgstr "" 9739 9740 - #: src/screens/Settings/Settings.tsx:676 9741 msgid "This will remove @{0} from the quick access list." 9742 msgstr "" 9743 ··· 9764 msgid "Threaded" 9765 msgstr "" 9766 9767 - #: src/Navigation.tsx:371 9768 msgid "Threads Preferences" 9769 msgstr "" 9770 ··· 9830 msgid "Top replies first" 9831 msgstr "" 9832 9833 - #: src/Navigation.tsx:554 9834 msgid "Topic" 9835 msgstr "" 9836 ··· 10200 msgid "Upload from Library" 10201 msgstr "" 10202 10203 - #: src/screens/Settings/FindContactsSettings.tsx:507 10204 - msgid "Uploaded on {0}" 10205 - msgstr "" 10206 - 10207 #: src/lib/api/index.ts:302 10208 msgid "Uploading images..." 10209 msgstr "" ··· 10341 msgid "Verification settings" 10342 msgstr "" 10343 10344 - #: src/Navigation.tsx:208 10345 #: src/screens/Moderation/VerificationSettings.tsx:32 10346 msgid "Verification Settings" 10347 msgstr "" ··· 10447 msgid "Video failed to process" 10448 msgstr "" 10449 10450 - #: src/Navigation.tsx:610 10451 msgid "Video Feed" 10452 msgstr "" 10453 ··· 10858 #: src/view/com/auth/SplashScreen.tsx:51 10859 #: src/view/com/auth/SplashScreen.web.tsx:103 10860 #: src/view/com/composer/Composer.tsx:857 10861 - #: src/view/com/feeds/ComposerPrompt.tsx:193 10862 msgid "What's up?" 10863 msgstr "" 10864 ··· 11278 msgid "You must grant access to your photo library to save a QR code" 11279 msgstr "" 11280 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 #: src/view/com/composer/SelectMediaButton.tsx:442 11287 msgid "You need to allow access to your media library." 11288 msgstr "" ··· 11524 msgid "Your full handle will be <0>@{0}</0>" 11525 msgstr "" 11526 11527 - #: src/Navigation.tsx:526 11528 #: src/screens/Search/modules/ExploreInterestsCard.tsx:67 11529 #: src/screens/Settings/ContentAndMediaSettings.tsx:92 11530 #: src/screens/Settings/ContentAndMediaSettings.tsx:95
··· 436 msgstr "" 437 438 #: src/screens/Settings/FindContactsSettings.tsx:430 439 + msgid "{numMatches, plural, one {# contact found} other {# contacts found}}" 440 msgstr "" 441 442 #: src/components/NewskieDialog.tsx:113 ··· 574 msgid "A screenshot of a profile page with a bell icon next to the follow button, indicating the new activity notifications feature." 575 msgstr "" 576 577 + #: src/Navigation.tsx:535 578 #: src/screens/Settings/AboutSettings.tsx:75 579 #: src/screens/Settings/Settings.tsx:262 580 #: src/screens/Settings/Settings.tsx:265 ··· 609 msgid "Accessibility" 610 msgstr "" 611 612 + #: src/Navigation.tsx:386 613 msgid "Accessibility Settings" 614 msgstr "" 615 616 + #: src/Navigation.tsx:402 617 #: src/screens/Login/LoginForm.tsx:194 618 #: src/screens/Settings/AccountSettings.tsx:51 619 #: src/screens/Settings/Settings.tsx:180 ··· 648 msgid "Account Muted by List" 649 msgstr "" 650 651 + #: src/screens/Settings/Settings.tsx:646 652 msgid "Account options" 653 msgstr "" 654 ··· 656 msgid "Account provider" 657 msgstr "" 658 659 + #: src/screens/Settings/Settings.tsx:682 660 msgid "Account removed from quick access" 661 msgstr "" 662 ··· 688 msgid "Activity from others" 689 msgstr "" 690 691 + #: src/Navigation.tsx:503 692 msgid "Activity notifications" 693 msgstr "" 694 ··· 770 msgid "Add emoji reaction" 771 msgstr "" 772 773 + #: src/view/com/feeds/ComposerPrompt.tsx:222 774 msgid "Add image" 775 msgstr "" 776 ··· 1011 msgid "Already signed in as @{0}" 1012 msgstr "" 1013 1014 + #: src/components/Post/Embed/ExternalEmbed/Gif.tsx:197 1015 #: src/view/com/composer/GifAltText.tsx:100 1016 #: src/view/com/composer/photos/Gallery.tsx:188 1017 msgid "ALT" ··· 1027 msgid "Alt text" 1028 msgstr "" 1029 1030 + #: src/components/Post/Embed/ExternalEmbed/Gif.tsx:202 1031 msgid "Alt Text" 1032 msgstr "" 1033 ··· 1167 msgid "Animals" 1168 msgstr "" 1169 1170 + #: src/components/Post/Embed/ExternalEmbed/Gif.tsx:160 1171 msgid "Animated GIF" 1172 msgstr "" 1173 ··· 1193 msgid "Anyone who follows me" 1194 msgstr "" 1195 1196 + #: src/Navigation.tsx:543 1197 #: src/screens/Settings/AppIconSettings/index.tsx:67 1198 #: src/screens/Settings/AppIconSettings/SettingsListItem.tsx:18 1199 #: src/screens/Settings/AppIconSettings/SettingsListItem.tsx:23 ··· 1234 msgid "App passwords" 1235 msgstr "" 1236 1237 + #: src/Navigation.tsx:354 1238 #: src/screens/Settings/AppPasswords.tsx:50 1239 msgid "App Passwords" 1240 msgstr "" ··· 1270 msgid "Appeal this decision" 1271 msgstr "" 1272 1273 + #: src/Navigation.tsx:394 1274 #: src/screens/Settings/AppearanceSettings.tsx:73 1275 #: src/screens/Settings/Settings.tsx:230 1276 #: src/screens/Settings/Settings.tsx:233 ··· 1520 msgid "Blocked accounts" 1521 msgstr "" 1522 1523 + #: src/Navigation.tsx:195 1524 #: src/view/screens/ModerationBlockedAccounts.tsx:104 1525 msgid "Blocked Accounts" 1526 msgstr "" ··· 1642 msgid "Browse custom feeds" 1643 msgstr "" 1644 1645 + #: src/components/FeedInterstitials.tsx:777 1646 msgid "Browse more accounts" 1647 msgstr "" 1648 1649 + #: src/components/FeedInterstitials.tsx:905 1650 msgid "Browse more feeds on the Explore page" 1651 msgstr "" 1652 1653 + #: src/components/FeedInterstitials.tsx:886 1654 + #: src/components/FeedInterstitials.tsx:889 1655 msgid "Browse more suggestions" 1656 msgstr "" 1657 1658 + #: src/components/FeedInterstitials.tsx:914 1659 msgid "Browse more suggestions on the Explore page" 1660 msgstr "" 1661 ··· 1872 msgstr "" 1873 1874 #: src/lib/hooks/useNotificationHandler.ts:99 1875 + #: src/Navigation.tsx:560 1876 #: src/view/shell/bottom-bar/BottomBar.tsx:221 1877 #: src/view/shell/desktop/LeftNav.tsx:608 1878 #: src/view/shell/Drawer.tsx:466 ··· 1898 msgid "Chat muted" 1899 msgstr "" 1900 1901 + #: src/Navigation.tsx:570 1902 #: src/screens/Messages/components/InboxPreview.tsx:22 1903 msgid "Chat request inbox" 1904 msgstr "" ··· 1910 msgstr "" 1911 1912 #: src/components/dms/ConvoMenu.tsx:78 1913 + #: src/Navigation.tsx:565 1914 #: src/screens/Messages/ChatList.tsx:81 1915 #: src/screens/Messages/ChatList.tsx:85 1916 #: src/screens/Messages/ChatList.tsx:380 ··· 2081 #: src/components/live/EditLiveDialog.tsx:235 2082 #: src/components/NewskieDialog.tsx:167 2083 #: src/components/NewskieDialog.tsx:173 2084 + #: src/components/Post/Embed/ExternalEmbed/Gif.tsx:208 2085 #: src/components/ProgressGuide/FollowDialog.tsx:440 2086 #: src/components/StarterPack/Wizard/WizardEditListDialog.tsx:118 2087 #: src/components/StarterPack/Wizard/WizardEditListDialog.tsx:124 ··· 2199 msgstr "" 2200 2201 #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:45 2202 + #: src/Navigation.tsx:344 2203 #: src/view/screens/CommunityGuidelines.tsx:37 2204 msgid "Community Guidelines" 2205 msgstr "" ··· 2298 2299 #: src/components/ageAssurance/AgeAssuranceAppealDialog.tsx:93 2300 msgid "Contact us" 2301 + msgstr "" 2302 + 2303 + #: src/screens/Settings/FindContactsSettings.tsx:498 2304 + msgid "Contacts imported" 2305 msgstr "" 2306 2307 #: src/screens/Settings/FindContactsSettings.tsx:471 2308 msgid "Contacts removed" 2309 msgstr "" 2310 2311 #: src/screens/Settings/ContentAndMediaSettings.tsx:51 2312 msgid "Content & Media" 2313 msgstr "" ··· 2317 msgid "Content and media" 2318 msgstr "" 2319 2320 + #: src/Navigation.tsx:519 2321 msgid "Content and Media" 2322 msgstr "" 2323 ··· 2515 2516 #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:40 2517 #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:107 2518 + #: src/Navigation.tsx:349 2519 #: src/view/screens/CopyrightPolicy.tsx:34 2520 msgid "Copyright Policy" 2521 msgstr "" ··· 2604 2605 #: src/components/StarterPack/ProfileStarterPacks.tsx:206 2606 #: src/components/StarterPack/ProfileStarterPacks.tsx:315 2607 + #: src/Navigation.tsx:600 2608 msgid "Create a starter pack" 2609 msgstr "" 2610 ··· 3230 msgid "Edit moderation list" 3231 msgstr "" 3232 3233 + #: src/Navigation.tsx:359 3234 #: src/view/screens/Feeds.tsx:518 3235 msgid "Edit My Feeds" 3236 msgstr "" ··· 3272 msgid "Edit who can reply" 3273 msgstr "" 3274 3275 + #: src/Navigation.tsx:605 3276 msgid "Edit your starter pack" 3277 msgstr "" 3278 ··· 3601 msgid "Explicit sexual images." 3602 msgstr "" 3603 3604 + #: src/Navigation.tsx:780 3605 #: src/screens/Search/Shell.tsx:327 3606 #: src/view/shell/desktop/LeftNav.tsx:690 3607 #: src/view/shell/Drawer.tsx:414 ··· 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 msgstr "" 3639 3640 + #: src/Navigation.tsx:378 3641 #: src/screens/Settings/ExternalMediaPreferences.tsx:34 3642 msgid "External Media Preferences" 3643 msgstr "" ··· 3874 msgid "False information about elections" 3875 msgstr "" 3876 3877 + #: src/Navigation.tsx:294 3878 msgid "Feed" 3879 msgstr "" 3880 ··· 3915 msgid "Feedback sent to feed operator" 3916 msgstr "" 3917 3918 + #: src/Navigation.tsx:585 3919 #: src/screens/SavedFeeds.tsx:108 3920 #: src/screens/Search/SearchResults.tsx:78 3921 #: src/screens/StarterPack/StarterPackScreen.tsx:190 ··· 3986 msgid "Find accounts to follow" 3987 msgstr "" 3988 3989 + #: src/Navigation.tsx:426 3990 + #: src/Navigation.tsx:627 3991 msgid "Find Contacts" 3992 msgstr "" 3993 ··· 4141 msgid "Followed by <0>{0}</0>, <1>{1}</1>, and {2, plural, one {# other} other {# others}}" 4142 msgstr "" 4143 4144 + #: src/Navigation.tsx:248 4145 msgid "Followers of @{0} that you know" 4146 msgstr "" 4147 ··· 4184 msgid "Following feed preferences" 4185 msgstr "" 4186 4187 + #: src/Navigation.tsx:365 4188 #: src/screens/Settings/FollowingFeedPreferences.tsx:56 4189 msgid "Following Feed Preferences" 4190 msgstr "" ··· 4510 msgid "Harming or endangering minors" 4511 msgstr "" 4512 4513 + #: src/Navigation.tsx:550 4514 msgid "Hashtag" 4515 msgstr "" 4516 ··· 4696 msgid "Hold up! We’re gradually giving access to video, and you’re still waiting in line. Check back soon!" 4697 msgstr "" 4698 4699 + #: src/Navigation.tsx:775 4700 + #: src/Navigation.tsx:795 4701 #: src/view/shell/bottom-bar/BottomBar.tsx:178 4702 #: src/view/shell/desktop/LeftNav.tsx:672 4703 #: src/view/shell/Drawer.tsx:440 ··· 4853 msgid "Import contacts to find your friends" 4854 msgstr "" 4855 4856 + #: src/screens/Settings/FindContactsSettings.tsx:507 4857 + msgid "Imported on {0}" 4858 + msgstr "" 4859 + 4860 #: src/ageAssurance/components/NoAccessScreen.tsx:204 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." 4862 msgstr "" ··· 5085 msgid "Labels on your content" 5086 msgstr "" 5087 5088 + #: src/Navigation.tsx:221 5089 msgid "Language Settings" 5090 msgstr "" 5091 ··· 5262 msgid "Like 10 posts to train the Discover feed" 5263 msgstr "" 5264 5265 + #: src/Navigation.tsx:463 5266 msgid "Like notifications" 5267 msgstr "" 5268 ··· 5274 msgid "Like this labeler" 5275 msgstr "" 5276 5277 + #: src/Navigation.tsx:299 5278 + #: src/Navigation.tsx:304 5279 msgid "Liked by" 5280 msgstr "" 5281 ··· 5310 msgid "Likes of your reposts" 5311 msgstr "" 5312 5313 + #: src/Navigation.tsx:487 5314 msgid "Likes of your reposts notifications" 5315 msgstr "" 5316 ··· 5323 msgid "Linear" 5324 msgstr "" 5325 5326 + #: src/Navigation.tsx:254 5327 msgid "List" 5328 msgstr "" 5329 ··· 5403 msgid "List unmuted" 5404 msgstr "" 5405 5406 + #: src/Navigation.tsx:175 5407 #: src/view/screens/Lists.tsx:67 5408 #: src/view/screens/Profile.tsx:233 5409 #: src/view/screens/Profile.tsx:241 ··· 5468 msgid "Loading..." 5469 msgstr "" 5470 5471 + #: src/Navigation.tsx:324 5472 msgid "Log" 5473 msgstr "" 5474 ··· 5563 msgid "Media that may be disturbing or inappropriate for some audiences." 5564 msgstr "" 5565 5566 + #: src/Navigation.tsx:447 5567 msgid "Mention notifications" 5568 msgstr "" 5569 ··· 5616 msgid "Message options" 5617 msgstr "" 5618 5619 + #: src/Navigation.tsx:790 5620 msgid "Messages" 5621 msgstr "" 5622 ··· 5629 msgid "Minor harassment or bullying" 5630 msgstr "" 5631 5632 + #: src/Navigation.tsx:511 5633 msgid "Miscellaneous notifications" 5634 msgstr "" 5635 ··· 5637 msgid "Misleading" 5638 msgstr "" 5639 5640 + #: src/Navigation.tsx:180 5641 #: src/screens/Moderation/index.tsx:99 5642 #: src/screens/Settings/Settings.tsx:194 5643 #: src/screens/Settings/Settings.tsx:197 ··· 5676 msgid "Moderation lists" 5677 msgstr "" 5678 5679 + #: src/Navigation.tsx:185 5680 #: src/view/screens/ModerationModlists.tsx:67 5681 msgid "Moderation Lists" 5682 msgstr "" ··· 5685 msgid "moderation settings" 5686 msgstr "" 5687 5688 + #: src/Navigation.tsx:314 5689 msgid "Moderation states" 5690 msgstr "" 5691 ··· 5808 msgid "Muted accounts" 5809 msgstr "" 5810 5811 + #: src/Navigation.tsx:190 5812 #: src/view/screens/ModerationMutedAccounts.tsx:116 5813 msgid "Muted Accounts" 5814 msgstr "" ··· 5907 msgid "New Feature" 5908 msgstr "" 5909 5910 + #: src/Navigation.tsx:479 5911 msgid "New follower notifications" 5912 msgstr "" 5913 ··· 6213 msgid "Not followed by anyone you're following" 6214 msgstr "" 6215 6216 + #: src/Navigation.tsx:170 6217 #: src/view/screens/Profile.tsx:132 6218 msgid "Not Found" 6219 msgstr "" ··· 6239 msgid "Nothing saved yet" 6240 msgstr "" 6241 6242 + #: src/Navigation.tsx:433 6243 + #: src/Navigation.tsx:580 6244 #: src/view/screens/Notifications.tsx:136 6245 msgid "Notification settings" 6246 msgstr "" ··· 6253 msgid "Notification Sounds" 6254 msgstr "" 6255 6256 + #: src/Navigation.tsx:575 6257 + #: src/Navigation.tsx:785 6258 #: src/screens/Notifications/ActivityList.tsx:30 6259 #: src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx:90 6260 #: src/screens/Settings/NotificationSettings/index.tsx:92 ··· 6396 msgid "Open avatar creator" 6397 msgstr "" 6398 6399 + #: src/view/com/feeds/ComposerPrompt.tsx:200 6400 msgid "Open camera" 6401 msgstr "" 6402 ··· 6505 msgid "Opens composer" 6506 msgstr "" 6507 6508 + #: src/view/com/feeds/ComposerPrompt.tsx:201 6509 msgid "Opens device camera" 6510 msgstr "" 6511 ··· 6536 msgid "Opens helpdesk in browser" 6537 msgstr "" 6538 6539 + #: src/view/com/feeds/ComposerPrompt.tsx:223 6540 msgid "Opens image picker" 6541 msgstr "" 6542 ··· 6679 msgid "Password updated!" 6680 msgstr "" 6681 6682 + #: src/components/Post/Embed/ExternalEmbed/Gif.tsx:44 6683 #: src/components/Post/Embed/VideoEmbed/VideoEmbedInner/VideoEmbedInnerNative.tsx:137 6684 #: src/components/Post/Embed/VideoEmbed/VideoEmbedInner/web-controls/VideoControls.tsx:369 6685 msgid "Pause" ··· 6695 msgid "People" 6696 msgstr "" 6697 6698 + #: src/Navigation.tsx:241 6699 msgid "People followed by @{0}" 6700 msgstr "" 6701 6702 + #: src/Navigation.tsx:234 6703 msgid "People following @{0}" 6704 msgstr "" 6705 ··· 6790 msgid "Pinned to your feeds" 6791 msgstr "" 6792 6793 + #: src/components/Post/Embed/ExternalEmbed/Gif.tsx:44 6794 #: src/components/Post/Embed/VideoEmbed/VideoEmbedInner/VideoEmbedInnerNative.tsx:137 6795 #: src/components/Post/Embed/VideoEmbed/VideoEmbedInner/web-controls/VideoControls.tsx:370 6796 msgid "Play" ··· 6809 msgid "Play Video" 6810 msgstr "" 6811 6812 + #: src/components/Post/Embed/ExternalEmbed/Gif.tsx:43 6813 msgid "Plays or pauses the GIF" 6814 msgstr "" 6815 ··· 6957 msgid "Please sign in as @{0}" 6958 msgstr "" 6959 6960 + #: src/screens/Settings/FindContactsSettings.tsx:102 6961 + msgid "Please use the native app to import your contacts." 6962 + msgstr "" 6963 + 6964 #: src/screens/FindContactsFlowScreen.tsx:71 6965 msgid "Please use the native app to sync your contacts." 6966 msgstr "" 6967 ··· 7011 msgid "Post blocked" 7012 msgstr "" 7013 7014 + #: src/Navigation.tsx:267 7015 + #: src/Navigation.tsx:274 7016 + #: src/Navigation.tsx:281 7017 + #: src/Navigation.tsx:288 7018 msgid "Post by @{0}" 7019 msgstr "" 7020 ··· 7048 msgid "Post interaction settings" 7049 msgstr "" 7050 7051 + #: src/Navigation.tsx:201 7052 #: src/screens/ModerationInteractionSettings/index.tsx:34 7053 msgid "Post Interaction Settings" 7054 msgstr "" ··· 7147 msgid "Privacy and security" 7148 msgstr "" 7149 7150 + #: src/Navigation.tsx:410 7151 + #: src/Navigation.tsx:418 7152 #: src/screens/Settings/ActivityPrivacySettings.tsx:40 7153 #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:44 7154 msgid "Privacy and Security" ··· 7161 7162 #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:35 7163 #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:102 7164 + #: src/Navigation.tsx:334 7165 #: src/screens/Settings/AboutSettings.tsx:92 7166 #: src/screens/Settings/AboutSettings.tsx:95 7167 #: src/view/screens/PrivacyPolicy.tsx:34 ··· 7260 msgid "QR code saved to your camera roll!" 7261 msgstr "" 7262 7263 + #: src/Navigation.tsx:455 7264 msgid "Quote notifications" 7265 msgstr "" 7266 ··· 7421 #: src/components/StarterPack/Wizard/WizardListCard.tsx:105 7422 #: src/components/StarterPack/Wizard/WizardListCard.tsx:112 7423 #: src/screens/Bookmarks/index.tsx:266 7424 + #: src/screens/Settings/Settings.tsx:684 7425 #: src/view/com/modals/UserAddRemoveLists.tsx:235 7426 #: src/view/com/posts/PostFeedErrorMessage.tsx:220 7427 msgid "Remove" ··· 7435 msgid "Remove {historyItem}" 7436 msgstr "" 7437 7438 + #: src/screens/Settings/Settings.tsx:663 7439 + #: src/screens/Settings/Settings.tsx:666 7440 msgid "Remove account" 7441 msgstr "" 7442 ··· 7481 msgid "Remove from my feeds" 7482 msgstr "" 7483 7484 + #: src/screens/Settings/Settings.tsx:676 7485 msgid "Remove from quick access?" 7486 msgstr "" 7487 ··· 7648 msgid "Reply Hidden by You" 7649 msgstr "" 7650 7651 + #: src/Navigation.tsx:439 7652 msgid "Reply notifications" 7653 msgstr "" 7654 ··· 7763 msgid "Repost ({0, plural, one {# repost} other {# reposts}})" 7764 msgstr "" 7765 7766 + #: src/Navigation.tsx:471 7767 msgid "Repost notifications" 7768 msgstr "" 7769 ··· 7804 msgid "Reposts of your reposts" 7805 msgstr "" 7806 7807 + #: src/Navigation.tsx:495 7808 msgid "Reposts of your reposts notifications" 7809 msgstr "" 7810 ··· 8013 msgstr "" 8014 8015 #: src/components/dialogs/nuxs/BookmarksAnnouncement.tsx:143 8016 + #: src/Navigation.tsx:619 8017 #: src/screens/Bookmarks/index.tsx:60 8018 msgid "Saved Posts" 8019 msgstr "" ··· 8059 msgid "Search" 8060 msgstr "" 8061 8062 + #: src/Navigation.tsx:260 8063 #: src/screens/Profile/ProfileSearch.tsx:37 8064 msgid "Search @{0}'s posts" 8065 msgstr "" ··· 8176 msgstr "" 8177 8178 #: src/components/FeedInterstitials.tsx:730 8179 + #: src/components/FeedInterstitials.tsx:791 8180 msgid "See more" 8181 msgstr "" 8182 ··· 8455 msgid "Sets email for password reset" 8456 msgstr "" 8457 8458 + #: src/Navigation.tsx:216 8459 #: src/screens/Settings/Settings.tsx:105 8460 #: src/view/shell/desktop/LeftNav.tsx:805 8461 #: src/view/shell/Drawer.tsx:609 ··· 8600 msgid "Share your favorite feed!" 8601 msgstr "" 8602 8603 + #: src/Navigation.tsx:319 8604 msgid "Shared Preferences Tester" 8605 msgstr "" 8606 ··· 8610 msgid "Show" 8611 msgstr "" 8612 8613 + #: src/components/Post/Embed/ExternalEmbed/Gif.tsx:189 8614 msgid "Show alt text" 8615 msgstr "" 8616 ··· 8849 msgid "Some of your verifications are invalid." 8850 msgstr "" 8851 8852 + #: src/components/FeedInterstitials.tsx:868 8853 msgid "Some other feeds you might like" 8854 msgstr "" 8855 ··· 8963 msgid "Start chat with {displayName}" 8964 msgstr "" 8965 8966 + #: src/Navigation.tsx:590 8967 + #: src/Navigation.tsx:595 8968 #: src/screens/StarterPack/Wizard/index.tsx:209 8969 msgid "Starter Pack" 8970 msgstr "" ··· 9017 msgid "Stored as part of a secure code for matching with others" 9018 msgstr "" 9019 9020 + #: src/Navigation.tsx:309 9021 #: src/screens/Settings/Settings.tsx:466 9022 msgid "Storybook" 9023 msgstr "" ··· 9108 msgid "Sunset" 9109 msgstr "" 9110 9111 + #: src/Navigation.tsx:329 9112 #: src/view/screens/Support.tsx:34 9113 #: src/view/screens/Support.tsx:37 9114 msgid "Support" ··· 9222 #: src/components/dialogs/BirthDateSettings.tsx:182 9223 #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:30 9224 #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:97 9225 + #: src/Navigation.tsx:339 9226 #: src/screens/Settings/AboutSettings.tsx:84 9227 #: src/screens/Settings/AboutSettings.tsx:87 9228 #: src/view/screens/TermsOfService.tsx:34 ··· 9535 msgid "This appeal will be sent to Bluesky's moderation service." 9536 msgstr "" 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 + 9543 #: src/screens/Messages/components/MessageListError.tsx:18 9544 msgid "This chat was disconnected" 9545 msgstr "" ··· 9749 msgid "This will delete \"{0}\" from your muted words. You can always add it back later." 9750 msgstr "" 9751 9752 + #: src/screens/Settings/Settings.tsx:678 9753 msgid "This will remove @{0} from the quick access list." 9754 msgstr "" 9755 ··· 9776 msgid "Threaded" 9777 msgstr "" 9778 9779 + #: src/Navigation.tsx:372 9780 msgid "Threads Preferences" 9781 msgstr "" 9782 ··· 9842 msgid "Top replies first" 9843 msgstr "" 9844 9845 + #: src/Navigation.tsx:555 9846 msgid "Topic" 9847 msgstr "" 9848 ··· 10212 msgid "Upload from Library" 10213 msgstr "" 10214 10215 #: src/lib/api/index.ts:302 10216 msgid "Uploading images..." 10217 msgstr "" ··· 10349 msgid "Verification settings" 10350 msgstr "" 10351 10352 + #: src/Navigation.tsx:209 10353 #: src/screens/Moderation/VerificationSettings.tsx:32 10354 msgid "Verification Settings" 10355 msgstr "" ··· 10455 msgid "Video failed to process" 10456 msgstr "" 10457 10458 + #: src/Navigation.tsx:611 10459 msgid "Video Feed" 10460 msgstr "" 10461 ··· 10866 #: src/view/com/auth/SplashScreen.tsx:51 10867 #: src/view/com/auth/SplashScreen.web.tsx:103 10868 #: src/view/com/composer/Composer.tsx:857 10869 + #: src/view/com/feeds/ComposerPrompt.tsx:191 10870 msgid "What's up?" 10871 msgstr "" 10872 ··· 11286 msgid "You must grant access to your photo library to save a QR code" 11287 msgstr "" 11288 11289 #: src/view/com/composer/SelectMediaButton.tsx:442 11290 msgid "You need to allow access to your media library." 11291 msgstr "" ··· 11527 msgid "Your full handle will be <0>@{0}</0>" 11528 msgstr "" 11529 11530 + #: src/Navigation.tsx:527 11531 #: src/screens/Search/modules/ExploreInterestsCard.tsx:67 11532 #: src/screens/Settings/ContentAndMediaSettings.tsx:92 11533 #: src/screens/Settings/ContentAndMediaSettings.tsx:95
+2 -2
src/screens/Messages/components/MessageInput.tsx
··· 14 import {useSafeAreaInsets} from 'react-native-safe-area-context' 15 import {msg} from '@lingui/macro' 16 import {useLingui} from '@lingui/react' 17 - import Graphemer from 'graphemer' 18 19 import {HITSLOP_10, MAX_DM_GRAPHEME_LENGTH} from '#/lib/constants' 20 import {useHaptics} from '#/lib/haptics' ··· 78 if (!hasEmbed && message.trim() === '') { 79 return 80 } 81 - if (new Graphemer().countGraphemes(message) > MAX_DM_GRAPHEME_LENGTH) { 82 Toast.show(_(msg`Message is too long`), 'xmark') 83 return 84 }
··· 14 import {useSafeAreaInsets} from 'react-native-safe-area-context' 15 import {msg} from '@lingui/macro' 16 import {useLingui} from '@lingui/react' 17 + import {countGraphemes} from 'unicode-segmenter/grapheme' 18 19 import {HITSLOP_10, MAX_DM_GRAPHEME_LENGTH} from '#/lib/constants' 20 import {useHaptics} from '#/lib/haptics' ··· 78 if (!hasEmbed && message.trim() === '') { 79 return 80 } 81 + if (countGraphemes(message) > MAX_DM_GRAPHEME_LENGTH) { 82 Toast.show(_(msg`Message is too long`), 'xmark') 83 return 84 }
+2 -2
src/screens/Messages/components/MessageInput.web.tsx
··· 2 import {Pressable, View} from 'react-native' 3 import {msg} from '@lingui/macro' 4 import {useLingui} from '@lingui/react' 5 - import Graphemer from 'graphemer' 6 import {flushSync} from 'react-dom' 7 import TextareaAutosize from 'react-textarea-autosize' 8 9 import {isSafari, isTouchDevice} from '#/lib/browser' 10 import {MAX_DM_GRAPHEME_LENGTH} from '#/lib/constants' ··· 59 if (!hasEmbed && message.trim() === '') { 60 return 61 } 62 - if (new Graphemer().countGraphemes(message) > MAX_DM_GRAPHEME_LENGTH) { 63 Toast.show(_(msg`Message is too long`), 'xmark') 64 return 65 }
··· 2 import {Pressable, View} from 'react-native' 3 import {msg} from '@lingui/macro' 4 import {useLingui} from '@lingui/react' 5 import {flushSync} from 'react-dom' 6 import TextareaAutosize from 'react-textarea-autosize' 7 + import {countGraphemes} from 'unicode-segmenter/grapheme' 8 9 import {isSafari, isTouchDevice} from '#/lib/browser' 10 import {MAX_DM_GRAPHEME_LENGTH} from '#/lib/constants' ··· 59 if (!hasEmbed && message.trim() === '') { 60 return 61 } 62 + if (countGraphemes(message) > MAX_DM_GRAPHEME_LENGTH) { 63 Toast.show(_(msg`Message is too long`), 'xmark') 64 return 65 }
+1 -1
src/screens/ModerationInteractionSettings/index.tsx
··· 2 import {View} from 'react-native' 3 import {msg, Trans} from '@lingui/macro' 4 import {useLingui} from '@lingui/react' 5 - import deepEqual from 'lodash.isequal' 6 7 import {logger} from '#/logger' 8 import {usePostInteractionSettingsMutation} from '#/state/queries/post-interaction-settings'
··· 2 import {View} from 'react-native' 3 import {msg, Trans} from '@lingui/macro' 4 import {useLingui} from '@lingui/react' 5 + import deepEqual from 'fast-deep-equal' 6 7 import {logger} from '#/logger' 8 import {usePostInteractionSettingsMutation} from '#/state/queries/post-interaction-settings'
+4 -1
src/screens/PostThread/components/ThreadItemAnchorNoUnauthenticated.tsx
··· 24 25 <View style={[a.py_sm]}> 26 <Text style={[a.text_xl, a.italic, t.atoms.text_contrast_medium]}> 27 - <Trans>You must sign in to view this post.</Trans> 28 </Text> 29 </View> 30 </View>
··· 24 25 <View style={[a.py_sm]}> 26 <Text style={[a.text_xl, a.italic, t.atoms.text_contrast_medium]}> 27 + <Trans> 28 + This author has chosen to make their posts visible only to people 29 + who are signed in. 30 + </Trans> 31 </Text> 32 </View> 33 </View>
+4 -1
src/screens/PostThread/components/ThreadItemPostNoUnauthenticated.tsx
··· 44 </Skele.Circle> 45 46 <Text style={[a.text_md, a.italic, t.atoms.text_contrast_medium]}> 47 - <Trans>You must sign in to view this post.</Trans> 48 </Text> 49 </Skele.Row> 50 <View
··· 44 </Skele.Circle> 45 46 <Text style={[a.text_md, a.italic, t.atoms.text_contrast_medium]}> 47 + <Trans> 48 + This author has chosen to make their posts visible only to people 49 + who are signed in. 50 + </Trans> 51 </Text> 52 </Skele.Row> 53 <View
+3 -3
src/screens/Profile/Header/EditProfileDialog.tsx
··· 6 7 import {urls} from '#/lib/constants' 8 import {cleanError} from '#/lib/strings/errors' 9 - import {useWarnMaxGraphemeCount} from '#/lib/strings/helpers' 10 import {logger} from '#/logger' 11 import {type ImageMeta} from '#/state/gallery' 12 import {useEnableSquareAvatars} from '#/state/preferences/enable-square-avatars' ··· 208 _, 209 ]) 210 211 - const displayNameTooLong = useWarnMaxGraphemeCount({ 212 text: displayName, 213 maxCount: DISPLAY_NAME_MAX_GRAPHEMES, 214 }) 215 - const descriptionTooLong = useWarnMaxGraphemeCount({ 216 text: description, 217 maxCount: DESCRIPTION_MAX_GRAPHEMES, 218 })
··· 6 7 import {urls} from '#/lib/constants' 8 import {cleanError} from '#/lib/strings/errors' 9 + import {isOverMaxGraphemeCount} from '#/lib/strings/helpers' 10 import {logger} from '#/logger' 11 import {type ImageMeta} from '#/state/gallery' 12 import {useEnableSquareAvatars} from '#/state/preferences/enable-square-avatars' ··· 208 _, 209 ]) 210 211 + const displayNameTooLong = isOverMaxGraphemeCount({ 212 text: displayName, 213 maxCount: DISPLAY_NAME_MAX_GRAPHEMES, 214 }) 215 + const descriptionTooLong = isOverMaxGraphemeCount({ 216 text: description, 217 maxCount: DESCRIPTION_MAX_GRAPHEMES, 218 })
+4 -4
src/screens/Settings/FindContactsSettings.tsx
··· 99 ) : ( 100 <ErrorScreen 101 title={_(msg`Not available on this platform.`)} 102 - message={_(msg`Please use the native app to sync your contacts.`)} 103 /> 104 )} 105 </Layout.Screen> ··· 429 <Text style={[a.text_md, a.font_semi_bold]}> 430 <Plural 431 value={numMatches} 432 - one="1 contact found" 433 other="# contacts found" 434 /> 435 </Text> ··· 495 <View style={[a.px_xl, a.py_xl, a.gap_4xl]}> 496 <View style={[a.gap_xs, a.align_start]}> 497 <Text style={[a.text_md, a.font_semi_bold]}> 498 - <Trans>Contacts uploaded</Trans> 499 </Text> 500 <View style={[a.gap_2xs]}> 501 <Text ··· 505 <Text 506 style={[a.text_sm, a.leading_snug, t.atoms.text_contrast_medium]}> 507 <Trans> 508 - Uploaded on{' '} 509 {i18n.date(new Date(syncedAt), { 510 dateStyle: 'long', 511 })}
··· 99 ) : ( 100 <ErrorScreen 101 title={_(msg`Not available on this platform.`)} 102 + message={_(msg`Please use the native app to import your contacts.`)} 103 /> 104 )} 105 </Layout.Screen> ··· 429 <Text style={[a.text_md, a.font_semi_bold]}> 430 <Plural 431 value={numMatches} 432 + one="# contact found" 433 other="# contacts found" 434 /> 435 </Text> ··· 495 <View style={[a.px_xl, a.py_xl, a.gap_4xl]}> 496 <View style={[a.gap_xs, a.align_start]}> 497 <Text style={[a.text_md, a.font_semi_bold]}> 498 + <Trans>Contacts imported</Trans> 499 </Text> 500 <View style={[a.gap_2xs]}> 501 <Text ··· 505 <Text 506 style={[a.text_sm, a.leading_snug, t.atoms.text_contrast_medium]}> 507 <Trans> 508 + Imported on{' '} 509 {i18n.date(new Date(syncedAt), { 510 dateStyle: 'long', 511 })}
+3 -1
src/screens/Settings/Settings.tsx
··· 644 ) : ( 645 <View style={[{width: 28}]} /> 646 )} 647 - <SettingsList.ItemText> 648 {sanitizeHandle(account.handle, '@')} 649 </SettingsList.ItemText> 650 {pendingDid === account.did && <SettingsList.ItemIcon icon={Loader} />}
··· 644 ) : ( 645 <View style={[{width: 28}]} /> 646 )} 647 + <SettingsList.ItemText 648 + numberOfLines={1} 649 + style={[a.pr_2xl, a.leading_snug]}> 650 {sanitizeHandle(account.handle, '@')} 651 </SettingsList.ItemText> 652 {pendingDid === account.did && <SettingsList.ItemIcon icon={Loader} />}
+9 -14
src/screens/Takendown.tsx
··· 1 - import {useMemo, useState} from 'react' 2 import {View} from 'react-native' 3 import {KeyboardAwareScrollView} from 'react-native-keyboard-controller' 4 import {useSafeAreaInsets} from 'react-native-safe-area-context' ··· 6 import {msg, Trans} from '@lingui/macro' 7 import {useLingui} from '@lingui/react' 8 import {useMutation} from '@tanstack/react-query' 9 - import Graphemer from 'graphemer' 10 11 import { 12 BLUESKY_MOD_SERVICE_HEADERS, ··· 37 const agent = useAgent() 38 const [isAppealling, setIsAppealling] = useState(false) 39 const [reason, setReason] = useState('') 40 - const graphemer = useMemo(() => new Graphemer(), []) 41 42 - const reasonGraphemeLength = useMemo(() => { 43 - return graphemer.countGraphemes(reason) 44 - }, [graphemer, reason]) 45 46 const { 47 mutate: submitAppeal, ··· 72 const primaryBtn = 73 isAppealling && !isSuccess ? ( 74 <Button 75 - variant="solid" 76 color="primary" 77 size="large" 78 label={_(msg`Submit appeal`)} 79 onPress={() => submitAppeal(reason)} 80 - disabled={ 81 - isPending || reasonGraphemeLength > MAX_REPORT_REASON_GRAPHEME_LENGTH 82 - }> 83 <ButtonText> 84 <Trans>Submit Appeal</Trans> 85 </ButtonText> ··· 87 </Button> 88 ) : ( 89 <Button 90 - variant="solid" 91 size="large" 92 color="secondary_inverted" 93 label={_(msg`Sign out`)} ··· 204 <Text 205 style={[ 206 a.text_md, 207 - a.leading_normal, 208 {color: t.palette.negative_500}, 209 a.mt_lg, 210 ]}> ··· 213 )} 214 </View> 215 ) : ( 216 - <P style={[t.atoms.text_contrast_medium]}> 217 <Trans> 218 Your account was found to be in violation of the{' '} 219 <SimpleInlineLinkText 220 label={_(msg`Bluesky Social Terms of Service`)} 221 to="https://bsky.social/about/support/tos" 222 - style={[a.text_md, a.leading_normal]}> 223 Bluesky Social Terms of Service 224 </SimpleInlineLinkText> 225 . You have been sent an email outlining the specific violation
··· 1 + import {useState} from 'react' 2 import {View} from 'react-native' 3 import {KeyboardAwareScrollView} from 'react-native-keyboard-controller' 4 import {useSafeAreaInsets} from 'react-native-safe-area-context' ··· 6 import {msg, Trans} from '@lingui/macro' 7 import {useLingui} from '@lingui/react' 8 import {useMutation} from '@tanstack/react-query' 9 + import {countGraphemes} from 'unicode-segmenter/grapheme' 10 11 import { 12 BLUESKY_MOD_SERVICE_HEADERS, ··· 37 const agent = useAgent() 38 const [isAppealling, setIsAppealling] = useState(false) 39 const [reason, setReason] = useState('') 40 41 + const reasonGraphemeLength = countGraphemes(reason) 42 + const isOverMaxLength = 43 + reasonGraphemeLength > MAX_REPORT_REASON_GRAPHEME_LENGTH 44 45 const { 46 mutate: submitAppeal, ··· 71 const primaryBtn = 72 isAppealling && !isSuccess ? ( 73 <Button 74 color="primary" 75 size="large" 76 label={_(msg`Submit appeal`)} 77 onPress={() => submitAppeal(reason)} 78 + disabled={isPending || isOverMaxLength}> 79 <ButtonText> 80 <Trans>Submit Appeal</Trans> 81 </ButtonText> ··· 83 </Button> 84 ) : ( 85 <Button 86 size="large" 87 color="secondary_inverted" 88 label={_(msg`Sign out`)} ··· 199 <Text 200 style={[ 201 a.text_md, 202 + a.leading_snug, 203 {color: t.palette.negative_500}, 204 a.mt_lg, 205 ]}> ··· 208 )} 209 </View> 210 ) : ( 211 + <P style={[t.atoms.text_contrast_medium, a.leading_snug]}> 212 <Trans> 213 Your account was found to be in violation of the{' '} 214 <SimpleInlineLinkText 215 label={_(msg`Bluesky Social Terms of Service`)} 216 to="https://bsky.social/about/support/tos" 217 + style={[a.text_md, a.leading_snug]}> 218 Bluesky Social Terms of Service 219 </SimpleInlineLinkText> 220 . You have been sent an email outlining the specific violation
+3 -5
src/view/com/composer/text-input/TextInput.web.tsx
··· 20 import {generateJSON} from '@tiptap/html' 21 import {Fragment, Node, Slice} from '@tiptap/pm/model' 22 import {EditorContent, type JSONContent, useEditor} from '@tiptap/react' 23 - import Graphemer from 'graphemer' 24 25 import {useColorSchemeStyle} from '#/lib/hooks/useColorSchemeStyle' 26 import {blobToDataUri, isUriImage} from '#/lib/media/util' ··· 218 // all the lines get mushed together -sfn 219 '\n', 220 ) 221 - const graphemes = new Graphemer().splitGraphemes(textBefore) 222 223 if (graphemes.length > 0) { 224 const lastGrapheme = graphemes[graphemes.length - 1] ··· 289 290 markdownFacets.push({ 291 index: {byteStart, byteEnd}, 292 - features: [ 293 - { $type: 'app.bsky.richtext.facet#link', uri: validUrl }, 294 - ], 295 }) 296 } 297
··· 20 import {generateJSON} from '@tiptap/html' 21 import {Fragment, Node, Slice} from '@tiptap/pm/model' 22 import {EditorContent, type JSONContent, useEditor} from '@tiptap/react' 23 + import {splitGraphemes} from 'unicode-segmenter/grapheme' 24 25 import {useColorSchemeStyle} from '#/lib/hooks/useColorSchemeStyle' 26 import {blobToDataUri, isUriImage} from '#/lib/media/util' ··· 218 // all the lines get mushed together -sfn 219 '\n', 220 ) 221 + const graphemes = [...splitGraphemes(textBefore)] 222 223 if (graphemes.length > 0) { 224 const lastGrapheme = graphemes[graphemes.length - 1] ··· 289 290 markdownFacets.push({ 291 index: {byteStart, byteEnd}, 292 + features: [{$type: 'app.bsky.richtext.facet#link', uri: validUrl}], 293 }) 294 } 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 import {type AppBskyFeedPostgate} from '@atproto/api' 5 import {msg, Trans} from '@lingui/macro' 6 import {useLingui} from '@lingui/react' 7 - import deepEqual from 'lodash.isequal' 8 9 import {isNetworkError} from '#/lib/strings/errors' 10 import {logger} from '#/logger'
··· 4 import {type AppBskyFeedPostgate} from '@atproto/api' 5 import {msg, Trans} from '@lingui/macro' 6 import {useLingui} from '@lingui/react' 7 + import deepEqual from 'fast-deep-equal' 8 9 import {isNetworkError} from '#/lib/strings/errors' 10 import {logger} from '#/logger'
+22 -5
src/view/com/composer/videos/SubtitleDialog.tsx
··· 4 import {useLingui} from '@lingui/react' 5 6 import {MAX_ALT_TEXT} from '#/lib/constants' 7 - import {useEnforceMaxGraphemeCount} from '#/lib/strings/helpers' 8 import {LANGUAGES} from '#/locale/languages' 9 import {isWeb} from '#/platform/detection' 10 import {useLanguagePrefs} from '#/state/preferences' ··· 73 const control = Dialog.useDialogContext() 74 const {_} = useLingui() 75 const t = useTheme() 76 - const enforceLen = useEnforceMaxGraphemeCount() 77 const {primaryLanguage} = useLanguagePrefs() 78 79 const [altText, setAltText] = useState(defaultAltText) ··· 94 ) 95 96 const subtitleMissingLanguage = captions.some(sub => sub.lang === '') 97 98 return ( 99 <Dialog.ScrollableInner label={_(msg`Video settings`)}> ··· 101 <Text style={[a.text_xl, a.font_semi_bold, a.leading_tight]}> 102 <Trans>Alt text</Trans> 103 </Text> 104 - <TextField.Root> 105 <Dialog.Input 106 label={_(msg`Alt text`)} 107 placeholder={_(msg`Add alt text (optional)`)} 108 value={altText} 109 - onChangeText={evt => setAltText(enforceLen(evt, MAX_ALT_TEXT))} 110 maxLength={MAX_ALT_TEXT * 10} 111 multiline 112 style={{maxHeight: 300}} ··· 119 /> 120 </TextField.Root> 121 122 {isWeb && ( 123 <> 124 <View ··· 174 saveAltText(altText) 175 control.close() 176 }} 177 - style={a.mt_lg}> 178 <ButtonText> 179 <Trans>Done</Trans> 180 </ButtonText>
··· 4 import {useLingui} from '@lingui/react' 5 6 import {MAX_ALT_TEXT} from '#/lib/constants' 7 + import {isOverMaxGraphemeCount} from '#/lib/strings/helpers' 8 import {LANGUAGES} from '#/locale/languages' 9 import {isWeb} from '#/platform/detection' 10 import {useLanguagePrefs} from '#/state/preferences' ··· 73 const control = Dialog.useDialogContext() 74 const {_} = useLingui() 75 const t = useTheme() 76 const {primaryLanguage} = useLanguagePrefs() 77 78 const [altText, setAltText] = useState(defaultAltText) ··· 93 ) 94 95 const subtitleMissingLanguage = captions.some(sub => sub.lang === '') 96 + 97 + const isOverMaxLength = isOverMaxGraphemeCount({ 98 + text: altText, 99 + maxCount: MAX_ALT_TEXT, 100 + }) 101 102 return ( 103 <Dialog.ScrollableInner label={_(msg`Video settings`)}> ··· 105 <Text style={[a.text_xl, a.font_semi_bold, a.leading_tight]}> 106 <Trans>Alt text</Trans> 107 </Text> 108 + <TextField.Root isInvalid={isOverMaxLength}> 109 <Dialog.Input 110 label={_(msg`Alt text`)} 111 placeholder={_(msg`Add alt text (optional)`)} 112 value={altText} 113 + onChangeText={setAltText} 114 maxLength={MAX_ALT_TEXT * 10} 115 multiline 116 style={{maxHeight: 300}} ··· 123 /> 124 </TextField.Root> 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 + 138 {isWeb && ( 139 <> 140 <View ··· 190 saveAltText(altText) 191 control.close() 192 }} 193 + style={a.mt_lg} 194 + disabled={isOverMaxLength}> 195 <ButtonText> 196 <Trans>Done</Trans> 197 </ButtonText>
+5 -7
src/view/com/feeds/ComposerPrompt.tsx
··· 1 import {useCallback, useState} from 'react' 2 import {Keyboard, Pressable, View} from 'react-native' 3 - import {msg} from '@lingui/macro' 4 import {useLingui} from '@lingui/react' 5 6 import {useOpenComposer} from '#/lib/hooks/useOpenComposer' ··· 168 <SubtleHover hover={hover} /> 169 <UserAvatar 170 avatar={profile.avatar} 171 - size={40} 172 type={profile.associated?.labeler ? 'labeler' : 'user'} 173 /> 174 <View ··· 184 ]}> 185 <Text 186 style={[ 187 - t.atoms.text_contrast_low, 188 a.text_md, 189 - { 190 - includeFontPadding: false, 191 - }, 192 ]}> 193 - {_(msg`What's up?`)} 194 </Text> 195 <View style={[a.flex_row, a.gap_md]}> 196 {isNative && (
··· 1 import {useCallback, useState} from 'react' 2 import {Keyboard, Pressable, View} from 'react-native' 3 + import {msg, Trans} from '@lingui/macro' 4 import {useLingui} from '@lingui/react' 5 6 import {useOpenComposer} from '#/lib/hooks/useOpenComposer' ··· 168 <SubtleHover hover={hover} /> 169 <UserAvatar 170 avatar={profile.avatar} 171 + size={42} 172 type={profile.associated?.labeler ? 'labeler' : 'user'} 173 /> 174 <View ··· 184 ]}> 185 <Text 186 style={[ 187 + t.atoms.text_contrast_medium, 188 a.text_md, 189 + {includeFontPadding: false}, 190 ]}> 191 + <Trans>What's up?</Trans> 192 </Text> 193 <View style={[a.flex_row, a.gap_md]}> 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 function NativeStackNavigator({ 51 id, 52 initialRouteName, 53 children, 54 layout, 55 screenListeners, 56 screenOptions, 57 screenLayout, 58 ...rest 59 }: NativeStackNavigatorProps) { 60 // --- this is copy and pasted from the original native stack navigator --- ··· 68 >(StackRouter, { 69 id, 70 initialRouteName, 71 children, 72 layout, 73 screenListeners, 74 screenOptions, 75 screenLayout, 76 }) 77 78 React.useEffect( ··· 169 170 export function createNativeStackNavigatorWithAuth< 171 const ParamList extends ParamListBase, 172 - const NavigatorID extends string | undefined = undefined, 173 const TypeBag extends NavigatorTypeBagBase = { 174 ParamList: ParamList 175 NavigatorID: NavigatorID
··· 50 function NativeStackNavigator({ 51 id, 52 initialRouteName, 53 + UNSTABLE_routeNamesChangeBehavior, 54 children, 55 layout, 56 screenListeners, 57 screenOptions, 58 screenLayout, 59 + UNSTABLE_router, 60 ...rest 61 }: NativeStackNavigatorProps) { 62 // --- this is copy and pasted from the original native stack navigator --- ··· 70 >(StackRouter, { 71 id, 72 initialRouteName, 73 + UNSTABLE_routeNamesChangeBehavior, 74 children, 75 layout, 76 screenListeners, 77 screenOptions, 78 screenLayout, 79 + UNSTABLE_router, 80 }) 81 82 React.useEffect( ··· 173 174 export function createNativeStackNavigatorWithAuth< 175 const ParamList extends ParamListBase, 176 + const NavigatorID extends string | undefined = string | undefined, 177 const TypeBag extends NavigatorTypeBagBase = { 178 ParamList: ParamList 179 NavigatorID: NavigatorID
+8 -3
src/view/shell/index.tsx
··· 91 } 92 }, [dedupe, navigation]) 93 94 return ( 95 <> 96 <View style={[a.h_full]}> 97 <ErrorBoundary 98 style={{paddingTop: insets.top, paddingBottom: insets.bottom}}> 99 - <DrawerLayout> 100 - <TabsNavigator /> 101 - </DrawerLayout> 102 </ErrorBoundary> 103 </View> 104
··· 91 } 92 }, [dedupe, navigation]) 93 94 + const drawerLayout = useCallback( 95 + ({children}: {children: React.ReactNode}) => ( 96 + <DrawerLayout>{children}</DrawerLayout> 97 + ), 98 + [], 99 + ) 100 + 101 return ( 102 <> 103 <View style={[a.h_full]}> 104 <ErrorBoundary 105 style={{paddingTop: insets.top, paddingBottom: insets.bottom}}> 106 + <TabsNavigator layout={drawerLayout} /> 107 </ErrorBoundary> 108 </View> 109
+39 -59
src/view/shell/index.web.tsx
··· 1 - import {useEffect, useLayoutEffect, useState} from 'react' 2 import {StyleSheet, TouchableWithoutFeedback, View} from 'react-native' 3 import {msg} from '@lingui/macro' 4 import {useLingui} from '@lingui/react' ··· 6 import {RemoveScrollBar} from 'react-remove-scroll-bar' 7 8 import {useIntentHandler} from '#/lib/hooks/useIntentHandler' 9 - import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' 10 import {type NavigationProp} from '#/lib/routes/types' 11 import {useSession} from '#/state/session' 12 import {useIsDrawerOpen, useSetDrawerOpen} from '#/state/shell' ··· 17 import {ErrorBoundary} from '#/view/com/util/ErrorBoundary' 18 import {Deactivated} from '#/screens/Deactivated' 19 import {Takendown} from '#/screens/Takendown' 20 - import {atoms as a, select, useTheme} from '#/alf' 21 import {AgeAssuranceRedirectDialog} from '#/components/ageAssurance/AgeAssuranceRedirectDialog' 22 import {EmailDialog} from '#/components/dialogs/EmailDialog' 23 import {LinkWarningDialog} from '#/components/dialogs/LinkWarning' ··· 39 import {DrawerContent} from './Drawer' 40 41 function ShellInner() { 42 - const t = useTheme() 43 - const isDrawerOpen = useIsDrawerOpen() 44 - const setDrawerOpen = useSetDrawerOpen() 45 - const {isDesktop} = useWebMediaQueries() 46 const navigator = useNavigation<NavigationProp>() 47 const closeAllActiveElements = useCloseAllActiveElements() 48 - const {_} = useLingui() 49 - const showDrawer = !isDesktop && isDrawerOpen 50 - const [showDrawerDelayedExit, setShowDrawerDelayedExit] = useState(showDrawer) 51 const {state: policyUpdateState} = usePolicyUpdateContext() 52 const welcomeModalControl = useWelcomeModal() 53 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 useComposerKeyboardShortcut() 101 useIntentHandler() 102 ··· 107 return unsubscribe 108 }, [navigator, closeAllActiveElements]) 109 110 return ( 111 <> 112 <ErrorBoundary> 113 - <FlatNavigator /> 114 </ErrorBoundary> 115 <Composer winHeight={0} /> 116 <ModalsContainer /> ··· 133 </> 134 )} 135 136 {showDrawerDelayedExit && ( 137 <> 138 <RemoveScrollBar /> ··· 170 </TouchableWithoutFeedback> 171 </> 172 )} 173 - 174 - <PolicyUpdateOverlayPortalOutlet /> 175 </> 176 ) 177 }
··· 1 + import {useCallback, useEffect, useLayoutEffect, useState} from 'react' 2 import {StyleSheet, TouchableWithoutFeedback, View} from 'react-native' 3 import {msg} from '@lingui/macro' 4 import {useLingui} from '@lingui/react' ··· 6 import {RemoveScrollBar} from 'react-remove-scroll-bar' 7 8 import {useIntentHandler} from '#/lib/hooks/useIntentHandler' 9 import {type NavigationProp} from '#/lib/routes/types' 10 import {useSession} from '#/state/session' 11 import {useIsDrawerOpen, useSetDrawerOpen} from '#/state/shell' ··· 16 import {ErrorBoundary} from '#/view/com/util/ErrorBoundary' 17 import {Deactivated} from '#/screens/Deactivated' 18 import {Takendown} from '#/screens/Takendown' 19 + import {atoms as a, select, useBreakpoints, useTheme} from '#/alf' 20 import {AgeAssuranceRedirectDialog} from '#/components/ageAssurance/AgeAssuranceRedirectDialog' 21 import {EmailDialog} from '#/components/dialogs/EmailDialog' 22 import {LinkWarningDialog} from '#/components/dialogs/LinkWarning' ··· 38 import {DrawerContent} from './Drawer' 39 40 function ShellInner() { 41 const navigator = useNavigation<NavigationProp>() 42 const closeAllActiveElements = useCloseAllActiveElements() 43 const {state: policyUpdateState} = usePolicyUpdateContext() 44 const welcomeModalControl = useWelcomeModal() 45 46 useComposerKeyboardShortcut() 47 useIntentHandler() 48 ··· 53 return unsubscribe 54 }, [navigator, closeAllActiveElements]) 55 56 + const drawerLayout = useCallback( 57 + ({children}: {children: React.ReactNode}) => ( 58 + <DrawerLayout>{children}</DrawerLayout> 59 + ), 60 + [], 61 + ) 62 return ( 63 <> 64 <ErrorBoundary> 65 + <FlatNavigator layout={drawerLayout} /> 66 </ErrorBoundary> 67 <Composer winHeight={0} /> 68 <ModalsContainer /> ··· 85 </> 86 )} 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} 118 {showDrawerDelayedExit && ( 119 <> 120 <RemoveScrollBar /> ··· 152 </TouchableWithoutFeedback> 153 </> 154 )} 155 </> 156 ) 157 }
+1
webpack.config.js
··· 27 'unicode-segmenter/grapheme': require 28 .resolve('unicode-segmenter/grapheme') 29 .replace(/\.cjs$/, '.js'), 30 }) 31 config.module.rules = [ 32 ...(config.module.rules || []),
··· 27 'unicode-segmenter/grapheme': require 28 .resolve('unicode-segmenter/grapheme') 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 31 }) 32 config.module.rules = [ 33 ...(config.module.rules || []),
+97 -450
yarn.lock
··· 1483 js-tokens "^4.0.0" 1484 picocolors "^1.0.0" 1485 1486 - "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": 1487 version "7.22.9" 1488 resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" 1489 integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== ··· 1719 "@babel/traverse" "^7.25.9" 1720 "@babel/types" "^7.25.9" 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": 1723 version "7.22.10" 1724 resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz#01d648bbc25dd88f513d862ee0df27b7d4e67024" 1725 integrity sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q== ··· 1830 "@babel/traverse" "^7.28.3" 1831 semver "^6.3.1" 1832 1833 - "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": 1834 version "7.22.9" 1835 resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz#9d8e61a8d9366fe66198f57c40565663de0825f6" 1836 integrity sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw== ··· 1848 regexpu-core "^6.1.1" 1849 semver "^6.3.1" 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 "@babel/helper-define-polyfill-provider@^0.6.2", "@babel/helper-define-polyfill-provider@^0.6.3": 1863 version "0.6.3" 1864 resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz#f4f2792fae2ef382074bc2d713522cf24e6ddb21" ··· 1870 lodash.debounce "^4.0.8" 1871 resolve "^1.14.2" 1872 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 "@babel/helper-environment-visitor@^7.22.20": 1879 version "7.22.20" 1880 resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" 1881 integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== 1882 1883 "@babel/helper-environment-visitor@^7.24.6": 1884 version "7.24.6" ··· 2060 dependencies: 2061 "@babel/types" "^7.27.1" 2062 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": 2064 version "7.22.5" 2065 resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" 2066 integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== ··· 2080 resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" 2081 integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== 2082 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 "@babel/helper-remap-async-to-generator@^7.25.9": 2093 version "7.25.9" 2094 resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz#e53956ab3d5b9fb88be04b3e2f31b523afd34b92" ··· 2098 "@babel/helper-wrap-function" "^7.25.9" 2099 "@babel/traverse" "^7.25.9" 2100 2101 - "@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": 2102 version "7.22.9" 2103 resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz#cbdc27d6d8d18cd22c81ae4293765a5d9afd0779" 2104 integrity sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg== ··· 2163 "@babel/traverse" "^7.25.9" 2164 "@babel/types" "^7.25.9" 2165 2166 - "@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": 2167 version "7.22.5" 2168 resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" 2169 integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== ··· 2287 resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" 2288 integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== 2289 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 "@babel/helper-wrap-function@^7.25.9": 2300 version "7.25.9" 2301 resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz#d99dfd595312e6c894bd7d237470025c85eea9d0" ··· 2450 dependencies: 2451 "@babel/helper-plugin-utils" "^7.25.9" 2452 "@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 2472 "@babel/plugin-proposal-decorators@^7.12.9": 2473 version "7.22.10" ··· 2480 "@babel/helper-split-export-declaration" "^7.22.6" 2481 "@babel/plugin-syntax-decorators" "^7.22.10" 2482 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 "@babel/plugin-proposal-export-default-from@^7.24.7": 2492 version "7.25.9" 2493 resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.25.9.tgz#52702be6ef8367fc8f18b8438278332beeb8f87c" ··· 2495 dependencies: 2496 "@babel/helper-plugin-utils" "^7.25.9" 2497 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 "@babel/plugin-proposal-private-methods@^7.18.6": 2543 version "7.18.6" 2544 resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" ··· 2580 dependencies: 2581 "@babel/helper-plugin-utils" "^7.22.5" 2582 2583 - "@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": 2584 version "7.8.3" 2585 resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" 2586 integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== 2587 dependencies: 2588 "@babel/helper-plugin-utils" "^7.8.0" 2589 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 "@babel/plugin-syntax-export-default-from@^7.24.7": 2598 version "7.25.9" 2599 resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.25.9.tgz#86614767a9ff140366f0c3766ef218beb32a730a" ··· 2601 dependencies: 2602 "@babel/helper-plugin-utils" "^7.25.9" 2603 2604 - "@babel/plugin-syntax-flow@^7.12.1", "@babel/plugin-syntax-flow@^7.18.0", "@babel/plugin-syntax-flow@^7.22.5": 2605 version "7.22.5" 2606 resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz#163b820b9e7696ce134df3ee716d9c0c98035859" 2607 integrity sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ== ··· 2678 dependencies: 2679 "@babel/helper-plugin-utils" "^7.10.4" 2680 2681 - "@babel/plugin-syntax-nullish-coalescing-operator@^7.0.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": 2682 version "7.8.3" 2683 resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" 2684 integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== 2685 dependencies: 2686 "@babel/helper-plugin-utils" "^7.8.0" 2687 2688 - "@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": 2689 version "7.10.4" 2690 resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" 2691 integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== ··· 2706 dependencies: 2707 "@babel/helper-plugin-utils" "^7.8.0" 2708 2709 - "@babel/plugin-syntax-optional-chaining@^7.0.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": 2710 version "7.8.3" 2711 resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" 2712 integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== ··· 2749 "@babel/helper-create-regexp-features-plugin" "^7.18.6" 2750 "@babel/helper-plugin-utils" "^7.18.6" 2751 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 "@babel/plugin-transform-arrow-functions@^7.0.0-0": 2760 version "7.24.1" 2761 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz#2bf263617060c9cc45bcdbf492b8cc805082bf27" ··· 2779 "@babel/helper-remap-async-to-generator" "^7.25.9" 2780 "@babel/traverse" "^7.25.9" 2781 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 "@babel/plugin-transform-async-to-generator@^7.24.7", "@babel/plugin-transform-async-to-generator@^7.25.9": 2792 version "7.25.9" 2793 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz#c80008dacae51482793e5a9c08b39a5be7e12d71" ··· 2804 dependencies: 2805 "@babel/helper-plugin-utils" "^7.25.9" 2806 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 "@babel/plugin-transform-block-scoping@^7.25.0", "@babel/plugin-transform-block-scoping@^7.25.9": 2815 version "7.25.9" 2816 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz#c33665e46b06759c93687ca0f84395b80c0473a1" ··· 2842 "@babel/helper-create-class-features-plugin" "^7.28.3" 2843 "@babel/helper-plugin-utils" "^7.27.1" 2844 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 "@babel/plugin-transform-classes@^7.0.0-0", "@babel/plugin-transform-classes@^7.25.4", "@babel/plugin-transform-classes@^7.25.9": 2861 version "7.25.9" 2862 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz#7152457f7880b593a63ade8a861e6e26a4469f52" ··· 2869 "@babel/traverse" "^7.25.9" 2870 globals "^11.1.0" 2871 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 "@babel/plugin-transform-computed-properties@^7.24.7", "@babel/plugin-transform-computed-properties@^7.25.9": 2881 version "7.25.9" 2882 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz#db36492c78460e534b8852b1d5befe3c923ef10b" ··· 2885 "@babel/helper-plugin-utils" "^7.25.9" 2886 "@babel/template" "^7.25.9" 2887 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 "@babel/plugin-transform-destructuring@^7.24.8", "@babel/plugin-transform-destructuring@^7.25.9": 2896 version "7.25.9" 2897 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz#966ea2595c498224340883602d3cfd7a0c79cea1" ··· 2944 dependencies: 2945 "@babel/helper-plugin-utils" "^7.25.9" 2946 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 "@babel/plugin-transform-flow-strip-types@^7.25.2": 2956 version "7.25.9" 2957 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.9.tgz#85879b42a8f5948fd6317069978e98f23ef8aec1" ··· 2968 "@babel/helper-plugin-utils" "^7.25.9" 2969 "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" 2970 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 "@babel/plugin-transform-function-name@^7.25.1", "@babel/plugin-transform-function-name@^7.25.9": 2981 version "7.25.9" 2982 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz#939d956e68a606661005bfd550c4fc2ef95f7b97" ··· 2992 integrity sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw== 2993 dependencies: 2994 "@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 3003 "@babel/plugin-transform-literals@^7.25.2", "@babel/plugin-transform-literals@^7.25.9": 3004 version "7.25.9" ··· 3029 "@babel/helper-module-transforms" "^7.25.9" 3030 "@babel/helper-plugin-utils" "^7.25.9" 3031 3032 - "@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.22.5": 3033 version "7.22.5" 3034 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz#7d9875908d19b8c0536085af7b053fd5bd651bfa" 3035 integrity sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA== ··· 3074 "@babel/helper-module-transforms" "^7.25.9" 3075 "@babel/helper-plugin-utils" "^7.25.9" 3076 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 "@babel/plugin-transform-named-capturing-groups-regex@^7.24.7", "@babel/plugin-transform-named-capturing-groups-regex@^7.25.9": 3086 version "7.25.9" 3087 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz#454990ae6cc22fd2a0fa60b3a2c6f63a38064e6a" ··· 3160 "@babel/helper-plugin-utils" "^7.25.9" 3161 "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" 3162 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 "@babel/plugin-transform-parameters@^7.24.7", "@babel/plugin-transform-parameters@^7.25.9": 3171 version "7.25.9" 3172 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz#b856842205b3e77e18b7a7a1b94958069c7ba257" ··· 3198 dependencies: 3199 "@babel/helper-plugin-utils" "^7.25.9" 3200 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 "@babel/plugin-transform-react-display-name@^7.23.3": 3209 version "7.23.3" 3210 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz#70529f034dd1e561045ad3c8152a267f0d7b6200" ··· 3226 dependencies: 3227 "@babel/plugin-transform-react-jsx" "^7.22.5" 3228 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 "@babel/plugin-transform-react-jsx-self@^7.24.7": 3237 version "7.25.9" 3238 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz#c0b6cae9c1b73967f7f9eb2fca9536ba2fad2858" ··· 3240 dependencies: 3241 "@babel/helper-plugin-utils" "^7.25.9" 3242 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 "@babel/plugin-transform-react-jsx-source@^7.24.7": 3251 version "7.25.9" 3252 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz#4c6b8daa520b5f155b5fb55547d7c9fa91417503" ··· 3254 dependencies: 3255 "@babel/helper-plugin-utils" "^7.25.9" 3256 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 "@babel/plugin-transform-react-jsx@^7.22.15": 3269 version "7.23.4" 3270 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz#393f99185110cea87184ea47bcb4a7b0c2e39312" ··· 3276 "@babel/plugin-syntax-jsx" "^7.23.3" 3277 "@babel/types" "^7.23.4" 3278 3279 "@babel/plugin-transform-react-jsx@^7.25.2": 3280 version "7.25.9" 3281 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz#06367940d8325b36edff5e2b9cbe782947ca4166" ··· 3318 dependencies: 3319 "@babel/helper-plugin-utils" "^7.25.9" 3320 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 "@babel/plugin-transform-runtime@^7.24.7": 3334 version "7.25.9" 3335 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz#62723ea3f5b31ffbe676da9d6dae17138ae580ea" ··· 3342 babel-plugin-polyfill-regenerator "^0.6.1" 3343 semver "^6.3.1" 3344 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 "@babel/plugin-transform-shorthand-properties@^7.0.0-0": 3353 version "7.24.1" 3354 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz#ba9a09144cf55d35ec6b93a32253becad8ee5b55" ··· 3363 dependencies: 3364 "@babel/helper-plugin-utils" "^7.25.9" 3365 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 "@babel/plugin-transform-spread@^7.24.7", "@babel/plugin-transform-spread@^7.25.9": 3375 version "7.25.9" 3376 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz#24a35153931b4ba3d13cec4a7748c21ab5514ef9" ··· 3379 "@babel/helper-plugin-utils" "^7.25.9" 3380 "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" 3381 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 "@babel/plugin-transform-sticky-regex@^7.24.7", "@babel/plugin-transform-sticky-regex@^7.25.9": 3390 version "7.25.9" 3391 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz#c7f02b944e986a417817b20ba2c504dfc1453d32" ··· 3414 dependencies: 3415 "@babel/helper-plugin-utils" "^7.25.9" 3416 3417 - "@babel/plugin-transform-typescript@^7.22.5", "@babel/plugin-transform-typescript@^7.5.0": 3418 version "7.22.10" 3419 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.10.tgz#aadd98fab871f0bb5717bcc24c31aaaa455af923" 3420 integrity sha512-7++c8I/ymsDo4QQBAgbraXLzIM6jmfao11KgIBEYZRReWzNWH9NtNgJcyrZiXsOPh523FQm6LfpLyy/U5fn46A== ··· 3459 dependencies: 3460 "@babel/helper-create-regexp-features-plugin" "^7.25.9" 3461 "@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 3471 "@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 version "7.25.9" ··· 3628 dependencies: 3629 regenerator-runtime "^0.14.0" 3630 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 "@babel/template@^7.22.15": 3641 version "7.22.15" 3642 resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" ··· 3645 "@babel/code-frame" "^7.22.13" 3646 "@babel/parser" "^7.22.15" 3647 "@babel/types" "^7.22.15" 3648 3649 "@babel/template@^7.24.0": 3650 version "7.24.0" ··· 6549 invariant "^2.2.4" 6550 nullthrows "^1.1.1" 6551 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== 6556 dependencies: 6557 - "@react-navigation/elements" "^2.4.3" 6558 color "^4.2.3" 6559 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== 6564 dependencies: 6565 - "@react-navigation/routers" "^7.4.0" 6566 escape-string-regexp "^4.0.0" 6567 nanoid "^3.3.11" 6568 query-string "^7.1.3" 6569 react-is "^19.1.0" 6570 - use-latest-callback "^0.2.3" 6571 use-sync-external-store "^1.5.0" 6572 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== 6577 dependencies: 6578 - "@react-navigation/elements" "^2.4.3" 6579 color "^4.2.3" 6580 - react-native-drawer-layout "^4.1.10" 6581 - use-latest-callback "^0.2.3" 6582 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== 6587 dependencies: 6588 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" 6596 warn-once "^0.1.1" 6597 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== 6602 dependencies: 6603 - "@react-navigation/core" "^7.10.0" 6604 escape-string-regexp "^4.0.0" 6605 fast-deep-equal "^3.1.3" 6606 nanoid "^3.3.11" 6607 - use-latest-callback "^0.2.3" 6608 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== 6613 dependencies: 6614 nanoid "^3.3.11" 6615 ··· 7813 dependencies: 7814 "@types/lodash" "*" 7815 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 "@types/lodash.shuffle@^4.2.7": 7824 version "4.2.7" 7825 resolved "https://registry.yarnpkg.com/@types/lodash.shuffle/-/lodash.shuffle-4.2.7.tgz#b714d829af948a266b0df1477d629c70de2f4c72" ··· 8885 "@babel/helper-define-polyfill-provider" "^0.6.3" 8886 semver "^6.3.1" 8887 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 babel-plugin-polyfill-corejs3@^0.10.6: 8898 version "0.10.6" 8899 resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz#2deda57caef50f59c525aeb4964d3b2f867710c7" ··· 8901 dependencies: 8902 "@babel/helper-define-polyfill-provider" "^0.6.2" 8903 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 8920 babel-plugin-polyfill-regenerator@^0.6.1: 8921 version "0.6.3" ··· 9235 resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" 9236 integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== 9237 9238 - browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.21.9: 9239 version "4.21.10" 9240 resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" 9241 integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== ··· 9844 normalize-path "^3.0.0" 9845 schema-utils "^4.0.0" 9846 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 9855 core-js-compat@^3.38.0, core-js-compat@^3.38.1: 9856 version "3.39.0" ··· 14587 resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" 14588 integrity sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg== 14589 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 lodash.memoize@^4.1.2: 14596 version "4.1.2" 14597 resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" ··· 14905 flow-enums-runtime "^0.0.6" 14906 terser "^5.15.0" 14907 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 metro-resolver@0.83.2: 14954 version "0.83.2" 14955 resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.83.2.tgz#d4a40a602615baacfb94d8a773e8b93eaac70d0f" ··· 17070 dependencies: 17071 dotenv "^16.4.5" 17072 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== 17077 dependencies: 17078 - use-latest-callback "^0.2.3" 17079 17080 react-native-edge-to-edge@^1.6.0: 17081 version "1.6.0" ··· 17164 resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-5.6.1.tgz#cb4d249ef1a6f7e8fd0cfdfa9764838dffda26b6" 17165 integrity sha512-/wJE58HLEAkATzhhX1xSr+fostLsK8Q97EfpfMDKo8jlOc1QKESSX/FQrhk7HhQH/2uSaox4Y86sNaI02kteiA== 17166 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== 17171 dependencies: 17172 react-freeze "^1.0.0" 17173 - react-native-is-edge-to-edge "^1.2.1" 17174 warn-once "^0.1.0" 17175 17176 react-native-svg@15.12.1: ··· 17284 version "0.14.2" 17285 resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" 17286 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 17293 react-remove-scroll-bar@^2.3.7, react-remove-scroll-bar@^2.3.8: 17294 version "2.3.8" ··· 18143 version "1.2.0" 18144 resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 18145 integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 18146 18147 shallow-equal@^3.1.0: 18148 version "3.1.0" ··· 19526 resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" 19527 integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== 19528 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== 19533 19534 unimodules-app-loader@~6.0.8: 19535 version "6.0.8" ··· 19645 resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" 19646 integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== 19647 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== 19652 19653 use-latest@^1.2.1: 19654 version "1.2.1"
··· 1483 js-tokens "^4.0.0" 1484 picocolors "^1.0.0" 1485 1486 + "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": 1487 version "7.22.9" 1488 resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" 1489 integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== ··· 1719 "@babel/traverse" "^7.25.9" 1720 "@babel/types" "^7.25.9" 1721 1722 + "@babel/helper-compilation-targets@^7.22.10", "@babel/helper-compilation-targets@^7.22.6": 1723 version "7.22.10" 1724 resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz#01d648bbc25dd88f513d862ee0df27b7d4e67024" 1725 integrity sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q== ··· 1830 "@babel/traverse" "^7.28.3" 1831 semver "^6.3.1" 1832 1833 + "@babel/helper-create-regexp-features-plugin@^7.18.6": 1834 version "7.22.9" 1835 resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz#9d8e61a8d9366fe66198f57c40565663de0825f6" 1836 integrity sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw== ··· 1848 regexpu-core "^6.1.1" 1849 semver "^6.3.1" 1850 1851 "@babel/helper-define-polyfill-provider@^0.6.2", "@babel/helper-define-polyfill-provider@^0.6.3": 1852 version "0.6.3" 1853 resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz#f4f2792fae2ef382074bc2d713522cf24e6ddb21" ··· 1859 lodash.debounce "^4.0.8" 1860 resolve "^1.14.2" 1861 1862 "@babel/helper-environment-visitor@^7.22.20": 1863 version "7.22.20" 1864 resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" 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== 1871 1872 "@babel/helper-environment-visitor@^7.24.6": 1873 version "7.24.6" ··· 2049 dependencies: 2050 "@babel/types" "^7.27.1" 2051 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": 2053 version "7.22.5" 2054 resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" 2055 integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== ··· 2069 resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" 2070 integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== 2071 2072 "@babel/helper-remap-async-to-generator@^7.25.9": 2073 version "7.25.9" 2074 resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz#e53956ab3d5b9fb88be04b3e2f31b523afd34b92" ··· 2078 "@babel/helper-wrap-function" "^7.25.9" 2079 "@babel/traverse" "^7.25.9" 2080 2081 + "@babel/helper-replace-supers@^7.22.9": 2082 version "7.22.9" 2083 resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz#cbdc27d6d8d18cd22c81ae4293765a5d9afd0779" 2084 integrity sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg== ··· 2143 "@babel/traverse" "^7.25.9" 2144 "@babel/types" "^7.25.9" 2145 2146 + "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": 2147 version "7.22.5" 2148 resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" 2149 integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== ··· 2267 resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" 2268 integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== 2269 2270 "@babel/helper-wrap-function@^7.25.9": 2271 version "7.25.9" 2272 resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz#d99dfd595312e6c894bd7d237470025c85eea9d0" ··· 2421 dependencies: 2422 "@babel/helper-plugin-utils" "^7.25.9" 2423 "@babel/traverse" "^7.25.9" 2424 2425 "@babel/plugin-proposal-decorators@^7.12.9": 2426 version "7.22.10" ··· 2433 "@babel/helper-split-export-declaration" "^7.22.6" 2434 "@babel/plugin-syntax-decorators" "^7.22.10" 2435 2436 "@babel/plugin-proposal-export-default-from@^7.24.7": 2437 version "7.25.9" 2438 resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.25.9.tgz#52702be6ef8367fc8f18b8438278332beeb8f87c" ··· 2440 dependencies: 2441 "@babel/helper-plugin-utils" "^7.25.9" 2442 2443 "@babel/plugin-proposal-private-methods@^7.18.6": 2444 version "7.18.6" 2445 resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" ··· 2481 dependencies: 2482 "@babel/helper-plugin-utils" "^7.22.5" 2483 2484 + "@babel/plugin-syntax-dynamic-import@^7.8.3": 2485 version "7.8.3" 2486 resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" 2487 integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== 2488 dependencies: 2489 "@babel/helper-plugin-utils" "^7.8.0" 2490 2491 "@babel/plugin-syntax-export-default-from@^7.24.7": 2492 version "7.25.9" 2493 resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.25.9.tgz#86614767a9ff140366f0c3766ef218beb32a730a" ··· 2495 dependencies: 2496 "@babel/helper-plugin-utils" "^7.25.9" 2497 2498 + "@babel/plugin-syntax-flow@^7.12.1": 2499 version "7.22.5" 2500 resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz#163b820b9e7696ce134df3ee716d9c0c98035859" 2501 integrity sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ== ··· 2572 dependencies: 2573 "@babel/helper-plugin-utils" "^7.10.4" 2574 2575 + "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": 2576 version "7.8.3" 2577 resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" 2578 integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== 2579 dependencies: 2580 "@babel/helper-plugin-utils" "^7.8.0" 2581 2582 + "@babel/plugin-syntax-numeric-separator@^7.8.3": 2583 version "7.10.4" 2584 resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" 2585 integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== ··· 2600 dependencies: 2601 "@babel/helper-plugin-utils" "^7.8.0" 2602 2603 + "@babel/plugin-syntax-optional-chaining@^7.8.3": 2604 version "7.8.3" 2605 resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" 2606 integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== ··· 2643 "@babel/helper-create-regexp-features-plugin" "^7.18.6" 2644 "@babel/helper-plugin-utils" "^7.18.6" 2645 2646 "@babel/plugin-transform-arrow-functions@^7.0.0-0": 2647 version "7.24.1" 2648 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz#2bf263617060c9cc45bcdbf492b8cc805082bf27" ··· 2666 "@babel/helper-remap-async-to-generator" "^7.25.9" 2667 "@babel/traverse" "^7.25.9" 2668 2669 "@babel/plugin-transform-async-to-generator@^7.24.7", "@babel/plugin-transform-async-to-generator@^7.25.9": 2670 version "7.25.9" 2671 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz#c80008dacae51482793e5a9c08b39a5be7e12d71" ··· 2682 dependencies: 2683 "@babel/helper-plugin-utils" "^7.25.9" 2684 2685 "@babel/plugin-transform-block-scoping@^7.25.0", "@babel/plugin-transform-block-scoping@^7.25.9": 2686 version "7.25.9" 2687 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz#c33665e46b06759c93687ca0f84395b80c0473a1" ··· 2713 "@babel/helper-create-class-features-plugin" "^7.28.3" 2714 "@babel/helper-plugin-utils" "^7.27.1" 2715 2716 "@babel/plugin-transform-classes@^7.0.0-0", "@babel/plugin-transform-classes@^7.25.4", "@babel/plugin-transform-classes@^7.25.9": 2717 version "7.25.9" 2718 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz#7152457f7880b593a63ade8a861e6e26a4469f52" ··· 2725 "@babel/traverse" "^7.25.9" 2726 globals "^11.1.0" 2727 2728 "@babel/plugin-transform-computed-properties@^7.24.7", "@babel/plugin-transform-computed-properties@^7.25.9": 2729 version "7.25.9" 2730 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz#db36492c78460e534b8852b1d5befe3c923ef10b" ··· 2733 "@babel/helper-plugin-utils" "^7.25.9" 2734 "@babel/template" "^7.25.9" 2735 2736 "@babel/plugin-transform-destructuring@^7.24.8", "@babel/plugin-transform-destructuring@^7.25.9": 2737 version "7.25.9" 2738 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz#966ea2595c498224340883602d3cfd7a0c79cea1" ··· 2785 dependencies: 2786 "@babel/helper-plugin-utils" "^7.25.9" 2787 2788 "@babel/plugin-transform-flow-strip-types@^7.25.2": 2789 version "7.25.9" 2790 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.9.tgz#85879b42a8f5948fd6317069978e98f23ef8aec1" ··· 2801 "@babel/helper-plugin-utils" "^7.25.9" 2802 "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" 2803 2804 "@babel/plugin-transform-function-name@^7.25.1", "@babel/plugin-transform-function-name@^7.25.9": 2805 version "7.25.9" 2806 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz#939d956e68a606661005bfd550c4fc2ef95f7b97" ··· 2816 integrity sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw== 2817 dependencies: 2818 "@babel/helper-plugin-utils" "^7.25.9" 2819 2820 "@babel/plugin-transform-literals@^7.25.2", "@babel/plugin-transform-literals@^7.25.9": 2821 version "7.25.9" ··· 2846 "@babel/helper-module-transforms" "^7.25.9" 2847 "@babel/helper-plugin-utils" "^7.25.9" 2848 2849 + "@babel/plugin-transform-modules-commonjs@^7.22.5": 2850 version "7.22.5" 2851 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz#7d9875908d19b8c0536085af7b053fd5bd651bfa" 2852 integrity sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA== ··· 2891 "@babel/helper-module-transforms" "^7.25.9" 2892 "@babel/helper-plugin-utils" "^7.25.9" 2893 2894 "@babel/plugin-transform-named-capturing-groups-regex@^7.24.7", "@babel/plugin-transform-named-capturing-groups-regex@^7.25.9": 2895 version "7.25.9" 2896 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz#454990ae6cc22fd2a0fa60b3a2c6f63a38064e6a" ··· 2969 "@babel/helper-plugin-utils" "^7.25.9" 2970 "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" 2971 2972 "@babel/plugin-transform-parameters@^7.24.7", "@babel/plugin-transform-parameters@^7.25.9": 2973 version "7.25.9" 2974 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz#b856842205b3e77e18b7a7a1b94958069c7ba257" ··· 3000 dependencies: 3001 "@babel/helper-plugin-utils" "^7.25.9" 3002 3003 "@babel/plugin-transform-react-display-name@^7.23.3": 3004 version "7.23.3" 3005 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz#70529f034dd1e561045ad3c8152a267f0d7b6200" ··· 3021 dependencies: 3022 "@babel/plugin-transform-react-jsx" "^7.22.5" 3023 3024 "@babel/plugin-transform-react-jsx-self@^7.24.7": 3025 version "7.25.9" 3026 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz#c0b6cae9c1b73967f7f9eb2fca9536ba2fad2858" ··· 3028 dependencies: 3029 "@babel/helper-plugin-utils" "^7.25.9" 3030 3031 "@babel/plugin-transform-react-jsx-source@^7.24.7": 3032 version "7.25.9" 3033 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz#4c6b8daa520b5f155b5fb55547d7c9fa91417503" ··· 3035 dependencies: 3036 "@babel/helper-plugin-utils" "^7.25.9" 3037 3038 "@babel/plugin-transform-react-jsx@^7.22.15": 3039 version "7.23.4" 3040 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz#393f99185110cea87184ea47bcb4a7b0c2e39312" ··· 3046 "@babel/plugin-syntax-jsx" "^7.23.3" 3047 "@babel/types" "^7.23.4" 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 + 3060 "@babel/plugin-transform-react-jsx@^7.25.2": 3061 version "7.25.9" 3062 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz#06367940d8325b36edff5e2b9cbe782947ca4166" ··· 3099 dependencies: 3100 "@babel/helper-plugin-utils" "^7.25.9" 3101 3102 "@babel/plugin-transform-runtime@^7.24.7": 3103 version "7.25.9" 3104 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz#62723ea3f5b31ffbe676da9d6dae17138ae580ea" ··· 3111 babel-plugin-polyfill-regenerator "^0.6.1" 3112 semver "^6.3.1" 3113 3114 "@babel/plugin-transform-shorthand-properties@^7.0.0-0": 3115 version "7.24.1" 3116 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz#ba9a09144cf55d35ec6b93a32253becad8ee5b55" ··· 3125 dependencies: 3126 "@babel/helper-plugin-utils" "^7.25.9" 3127 3128 "@babel/plugin-transform-spread@^7.24.7", "@babel/plugin-transform-spread@^7.25.9": 3129 version "7.25.9" 3130 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz#24a35153931b4ba3d13cec4a7748c21ab5514ef9" ··· 3133 "@babel/helper-plugin-utils" "^7.25.9" 3134 "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" 3135 3136 "@babel/plugin-transform-sticky-regex@^7.24.7", "@babel/plugin-transform-sticky-regex@^7.25.9": 3137 version "7.25.9" 3138 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz#c7f02b944e986a417817b20ba2c504dfc1453d32" ··· 3161 dependencies: 3162 "@babel/helper-plugin-utils" "^7.25.9" 3163 3164 + "@babel/plugin-transform-typescript@^7.22.5": 3165 version "7.22.10" 3166 resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.10.tgz#aadd98fab871f0bb5717bcc24c31aaaa455af923" 3167 integrity sha512-7++c8I/ymsDo4QQBAgbraXLzIM6jmfao11KgIBEYZRReWzNWH9NtNgJcyrZiXsOPh523FQm6LfpLyy/U5fn46A== ··· 3206 dependencies: 3207 "@babel/helper-create-regexp-features-plugin" "^7.25.9" 3208 "@babel/helper-plugin-utils" "^7.25.9" 3209 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": 3211 version "7.25.9" ··· 3367 dependencies: 3368 regenerator-runtime "^0.14.0" 3369 3370 "@babel/template@^7.22.15": 3371 version "7.22.15" 3372 resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" ··· 3375 "@babel/code-frame" "^7.22.13" 3376 "@babel/parser" "^7.22.15" 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" 3387 3388 "@babel/template@^7.24.0": 3389 version "7.24.0" ··· 6288 invariant "^2.2.4" 6289 nullthrows "^1.1.1" 6290 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== 6295 dependencies: 6296 + "@react-navigation/elements" "^2.9.3" 6297 color "^4.2.3" 6298 + sf-symbols-typescript "^2.1.0" 6299 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== 6304 dependencies: 6305 + "@react-navigation/routers" "^7.5.3" 6306 escape-string-regexp "^4.0.0" 6307 + fast-deep-equal "^3.1.3" 6308 nanoid "^3.3.11" 6309 query-string "^7.1.3" 6310 react-is "^19.1.0" 6311 + use-latest-callback "^0.2.4" 6312 use-sync-external-store "^1.5.0" 6313 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== 6318 dependencies: 6319 color "^4.2.3" 6320 + use-latest-callback "^0.2.4" 6321 + use-sync-external-store "^1.5.0" 6322 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== 6327 dependencies: 6328 + "@react-navigation/elements" "^2.9.3" 6329 color "^4.2.3" 6330 + sf-symbols-typescript "^2.1.0" 6331 warn-once "^0.1.1" 6332 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== 6337 dependencies: 6338 + "@react-navigation/core" "^7.13.7" 6339 escape-string-regexp "^4.0.0" 6340 fast-deep-equal "^3.1.3" 6341 nanoid "^3.3.11" 6342 + use-latest-callback "^0.2.4" 6343 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== 6348 dependencies: 6349 nanoid "^3.3.11" 6350 ··· 7548 dependencies: 7549 "@types/lodash" "*" 7550 7551 "@types/lodash.shuffle@^4.2.7": 7552 version "4.2.7" 7553 resolved "https://registry.yarnpkg.com/@types/lodash.shuffle/-/lodash.shuffle-4.2.7.tgz#b714d829af948a266b0df1477d629c70de2f4c72" ··· 8613 "@babel/helper-define-polyfill-provider" "^0.6.3" 8614 semver "^6.3.1" 8615 8616 babel-plugin-polyfill-corejs3@^0.10.6: 8617 version "0.10.6" 8618 resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz#2deda57caef50f59c525aeb4964d3b2f867710c7" ··· 8620 dependencies: 8621 "@babel/helper-define-polyfill-provider" "^0.6.2" 8622 core-js-compat "^3.38.0" 8623 8624 babel-plugin-polyfill-regenerator@^0.6.1: 8625 version "0.6.3" ··· 8939 resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" 8940 integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== 8941 8942 + browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.21.4, browserslist@^4.21.9: 8943 version "4.21.10" 8944 resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" 8945 integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== ··· 9548 normalize-path "^3.0.0" 9549 schema-utils "^4.0.0" 9550 serialize-javascript "^6.0.0" 9551 9552 core-js-compat@^3.38.0, core-js-compat@^3.38.1: 9553 version "3.39.0" ··· 14284 resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" 14285 integrity sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg== 14286 14287 lodash.memoize@^4.1.2: 14288 version "4.1.2" 14289 resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" ··· 14597 flow-enums-runtime "^0.0.6" 14598 terser "^5.15.0" 14599 14600 metro-resolver@0.83.2: 14601 version "0.83.2" 14602 resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.83.2.tgz#d4a40a602615baacfb94d8a773e8b93eaac70d0f" ··· 16717 dependencies: 16718 dotenv "^16.4.5" 16719 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== 16724 dependencies: 16725 + color "^4.2.3" 16726 + use-latest-callback "^0.2.4" 16727 16728 react-native-edge-to-edge@^1.6.0: 16729 version "1.6.0" ··· 16812 resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-5.6.1.tgz#cb4d249ef1a6f7e8fd0cfdfa9764838dffda26b6" 16813 integrity sha512-/wJE58HLEAkATzhhX1xSr+fostLsK8Q97EfpfMDKo8jlOc1QKESSX/FQrhk7HhQH/2uSaox4Y86sNaI02kteiA== 16814 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== 16819 dependencies: 16820 react-freeze "^1.0.0" 16821 warn-once "^0.1.0" 16822 16823 react-native-svg@15.12.1: ··· 16931 version "0.14.2" 16932 resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" 16933 integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== 16934 16935 react-remove-scroll-bar@^2.3.7, react-remove-scroll-bar@^2.3.8: 16936 version "2.3.8" ··· 17785 version "1.2.0" 17786 resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 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== 17793 17794 shallow-equal@^3.1.0: 17795 version "3.1.0" ··· 19173 resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" 19174 integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== 19175 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== 19180 19181 unimodules-app-loader@~6.0.8: 19182 version "6.0.8" ··· 19292 resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" 19293 integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== 19294 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== 19299 19300 use-latest@^1.2.1: 19301 version "1.2.1"