Bluesky app fork with some witchin' additions 💫

Merge remote-tracking branch 'upstream/main'

xan.lol a79d24db 32c3ba1e

verified
Changed files
+266 -262
modules
expo-receive-android-intents
android
src
main
java
xyz
blueskyweb
app
exporeceiveandroidintents
patches
src
locale
locales
view
+27 -8
modules/expo-receive-android-intents/android/src/main/java/xyz/blueskyweb/app/exporeceiveandroidintents/ExpoReceiveAndroidIntentsModule.kt
··· 78 intent.getParcelableExtra(Intent.EXTRA_STREAM) 79 } 80 81 uri?.let { 82 when (type) { 83 - AttachmentType.IMAGE -> handleImageIntents(listOf(it)) 84 - AttachmentType.VIDEO -> handleVideoIntents(listOf(it)) 85 } 86 } 87 } ··· 103 ?.take(4) 104 } 105 106 uris?.let { 107 when (type) { 108 - AttachmentType.IMAGE -> handleImageIntents(it) 109 else -> return 110 } 111 } 112 } 113 114 - private fun handleImageIntents(uris: List<Uri>) { 115 var allParams = "" 116 117 uris.forEachIndexed { index, uri -> ··· 124 } 125 } 126 127 - val encoded = URLEncoder.encode(allParams, "UTF-8") 128 129 - "bluesky://intent/compose?imageUris=$encoded".toUri().let { 130 val newIntent = Intent(Intent.ACTION_VIEW, it) 131 appContext.currentActivity?.startActivity(newIntent) 132 } 133 } 134 135 - private fun handleVideoIntents(uris: List<Uri>) { 136 val uri = uris[0] 137 // If there is no extension for the file, substringAfterLast returns the original string - not 138 // null, so we check for that below ··· 151 152 val info = getVideoInfo(uri) ?: return 153 154 - "bluesky://intent/compose?videoUri=${URLEncoder.encode(file.path, "UTF-8")}|${info["width"]}|${info["height"]}".toUri().let { 155 val newIntent = Intent(Intent.ACTION_VIEW, it) 156 appContext.currentActivity?.startActivity(newIntent) 157 }
··· 78 intent.getParcelableExtra(Intent.EXTRA_STREAM) 79 } 80 81 + val text = intent.getStringExtra(Intent.EXTRA_TEXT) 82 + 83 uri?.let { 84 when (type) { 85 + AttachmentType.IMAGE -> handleImageIntents(listOf(it), text) 86 + AttachmentType.VIDEO -> handleVideoIntents(listOf(it), text) 87 } 88 } 89 } ··· 105 ?.take(4) 106 } 107 108 + val text = intent.getStringExtra(Intent.EXTRA_TEXT) 109 + 110 uris?.let { 111 when (type) { 112 + AttachmentType.IMAGE -> handleImageIntents(it, text) 113 else -> return 114 } 115 } 116 } 117 118 + private fun handleImageIntents( 119 + uris: List<Uri>, 120 + text: String? 121 + ) { 122 var allParams = "" 123 124 uris.forEachIndexed { index, uri -> ··· 131 } 132 } 133 134 + val encodedUris = URLEncoder.encode(allParams, "UTF-8") 135 + val encodedText = text?.let { URLEncoder.encode(it, "UTF-8") } 136 + 137 + var composeIntent = "bluesky://intent/compose?imageUris=$encodedUris" 138 + encodedText?.let { composeIntent += "&text=$it" } 139 140 + composeIntent.toUri().let { 141 val newIntent = Intent(Intent.ACTION_VIEW, it) 142 appContext.currentActivity?.startActivity(newIntent) 143 } 144 } 145 146 + private fun handleVideoIntents( 147 + uris: List<Uri>, 148 + text: String? 149 + ) { 150 val uri = uris[0] 151 // If there is no extension for the file, substringAfterLast returns the original string - not 152 // null, so we check for that below ··· 165 166 val info = getVideoInfo(uri) ?: return 167 168 + val encodedText = text?.let { URLEncoder.encode(it, "UTF-8") } 169 + 170 + var composeIntent = "bluesky://intent/compose?videoUri=${URLEncoder.encode(file.path, "UTF-8")}|${info["width"]}|${info["height"]}" 171 + encodedText?.let { composeIntent += "&text=$it" } 172 + 173 + composeIntent.toUri().let { 174 val newIntent = Intent(Intent.ACTION_VIEW, it) 175 appContext.currentActivity?.startActivity(newIntent) 176 }
+2 -2
package.json
··· 1 { 2 "name": "witchsky-app", 3 - "version": "1.110.1", 4 "private": true, 5 "engines": { 6 "node": ">=18" ··· 176 "multiformats": "9.9.0", 177 "nanoid": "^5.0.5", 178 "normalize-url": "^8.0.0", 179 - "patch-package": "^6.5.1", 180 "postinstall-postinstall": "^2.1.0", 181 "psl": "^1.9.0", 182 "radix-ui": "^1.4.3",
··· 1 { 2 "name": "witchsky-app", 3 + "version": "1.111.0", 4 "private": true, 5 "engines": { 6 "node": ">=18" ··· 176 "multiformats": "9.9.0", 177 "nanoid": "^5.0.5", 178 "normalize-url": "^8.0.0", 179 + "patch-package": "^8.0.1", 180 "postinstall-postinstall": "^2.1.0", 181 "psl": "^1.9.0", 182 "radix-ui": "^1.4.3",
+71
patches/react-native+0.81.5+001+initial.patch
···
··· 1 + diff --git a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.h b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.h 2 + index e9b330f..5fbb2e0 100644 3 + --- a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.h 4 + +++ b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.h 5 + @@ -15,5 +15,6 @@ 6 + @property (nonatomic, copy) NSString *title; 7 + @property (nonatomic, copy) RCTDirectEventBlock onRefresh; 8 + @property (nonatomic, weak) UIScrollView *scrollView; 9 + +@property (nonatomic, copy) UIColor *customTintColor; 10 + 11 + @end 12 + diff --git a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.m b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.m 13 + index 53bfd04..e2e0c9f 100644 14 + --- a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.m 15 + +++ b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.m 16 + @@ -23,6 +23,7 @@ @implementation RCTRefreshControl { 17 + UIColor *_titleColor; 18 + CGFloat _progressViewOffset; 19 + BOOL _hasMovedToWindow; 20 + + UIColor *_customTintColor; 21 + } 22 + 23 + - (instancetype)init 24 + @@ -58,6 +59,12 @@ - (void)layoutSubviews 25 + _isInitialRender = false; 26 + } 27 + 28 + +- (void)didMoveToSuperview 29 + +{ 30 + + [super didMoveToSuperview]; 31 + + [self setTintColor:_customTintColor]; 32 + +} 33 + + 34 + - (void)didMoveToWindow 35 + { 36 + [super didMoveToWindow]; 37 + @@ -221,4 +228,16 @@ - (void)refreshControlValueChanged 38 + } 39 + } 40 + 41 + +// Fix for https://github.com/facebook/react-native/issues/43388 42 + +// A bug in iOS 17.4 causes the haptic to not play when refreshing if the tintColor 43 + +// is set before the refresh control gets added to the scrollview. We'll call this 44 + +// function whenever the superview changes. We'll also call it if the value of customTintColor 45 + +// changes. 46 + +- (void)setTintColor:(UIColor *)tintColor 47 + +{ 48 + + if ([self.superview isKindOfClass:[UIScrollView class]] && self.tintColor != tintColor) { 49 + + [super setTintColor:tintColor]; 50 + + } 51 + +} 52 + + 53 + @end 54 + diff --git a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControlManager.m b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControlManager.m 55 + index 40aaf9c..1c60164 100644 56 + --- a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControlManager.m 57 + +++ b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControlManager.m 58 + @@ -22,11 +22,12 @@ - (UIView *)view 59 + 60 + RCT_EXPORT_VIEW_PROPERTY(onRefresh, RCTDirectEventBlock) 61 + RCT_EXPORT_VIEW_PROPERTY(refreshing, BOOL) 62 + -RCT_EXPORT_VIEW_PROPERTY(tintColor, UIColor) 63 + RCT_EXPORT_VIEW_PROPERTY(title, NSString) 64 + RCT_EXPORT_VIEW_PROPERTY(titleColor, UIColor) 65 + RCT_EXPORT_VIEW_PROPERTY(progressViewOffset, CGFloat) 66 + 67 + +RCT_REMAP_VIEW_PROPERTY(tintColor, customTintColor, UIColor) 68 + + 69 + RCT_EXPORT_METHOD(setNativeRefreshing : (nonnull NSNumber *)viewTag toRefreshing : (BOOL)refreshing) 70 + { 71 + [self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
+67
patches/react-native+0.81.5+002+ScrollForwarder.patch
···
··· 1 + diff --git a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTPullToRefreshViewComponentView.h b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTPullToRefreshViewComponentView.h 2 + index 914a249..0deac55 100644 3 + --- a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTPullToRefreshViewComponentView.h 4 + +++ b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTPullToRefreshViewComponentView.h 5 + @@ -19,6 +19,8 @@ NS_ASSUME_NONNULL_BEGIN 6 + */ 7 + @interface RCTPullToRefreshViewComponentView : RCTViewComponentView <RCTCustomPullToRefreshViewProtocol> 8 + 9 + +- (void)beginRefreshingProgrammatically; 10 + + 11 + @end 12 + 13 + NS_ASSUME_NONNULL_END 14 + diff --git a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.h b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.h 15 + index 5fbb2e0..ec5f58c 100644 16 + --- a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.h 17 + +++ b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.h 18 + @@ -17,4 +17,6 @@ 19 + @property (nonatomic, weak) UIScrollView *scrollView; 20 + @property (nonatomic, copy) UIColor *customTintColor; 21 + 22 + +- (void)forwarderBeginRefreshing; 23 + + 24 + @end 25 + diff --git a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.m b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.m 26 + index e2e0c9f..ff1b1ed 100644 27 + --- a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.m 28 + +++ b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.m 29 + @@ -240,4 +240,38 @@ - (void)setTintColor:(UIColor *)tintColor 30 + } 31 + } 32 + 33 + +// This method is used by Bluesky's ExpoScrollForwarder. This allows other React Native 34 + +// libraries to perform a refresh of a scrollview and access the refresh control's onRefresh 35 + +// function. 36 + +- (void)forwarderBeginRefreshing 37 + +{ 38 + + _refreshingProgrammatically = NO; 39 + + 40 + + [self sizeToFit]; 41 + + 42 + + if (!self.scrollView) { 43 + + return; 44 + + } 45 + + 46 + + UIScrollView *scrollView = (UIScrollView *)self.scrollView; 47 + + 48 + + [UIView animateWithDuration:0.3 49 + + delay:0 50 + + options:UIViewAnimationOptionBeginFromCurrentState 51 + + animations:^(void) { 52 + + // Whenever we call this method, the scrollview will always be at a position of 53 + + // -130 or less. Scrolling back to -65 simulates the default behavior of RCTRefreshControl 54 + + [scrollView setContentOffset:CGPointMake(0, -65)]; 55 + + } 56 + + completion:^(__unused BOOL finished) { 57 + + [super beginRefreshing]; 58 + + [self setCurrentRefreshingState:super.refreshing]; 59 + + 60 + + if (self->_onRefresh) { 61 + + self->_onRefresh(nil); 62 + + } 63 + + } 64 + + ]; 65 + +} 66 + + 67 + @end
+16
patches/react-native+0.81.5+003+ScrollView-disable-recycling.patch
···
··· 1 + diff --git a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm 2 + index d029337..0f63ea3 100644 3 + --- a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm 4 + +++ b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm 5 + @@ -1038,6 +1038,11 @@ - (void)_adjustForMaintainVisibleContentPosition 6 + } 7 + } 8 + 9 + ++ (BOOL)shouldBeRecycled 10 + +{ 11 + + return NO; 12 + +} 13 + + 14 + @end 15 + 16 + Class<RCTComponentViewProtocol> RCTScrollViewCls(void)
-136
patches/react-native+0.81.5.patch
··· 1 - diff --git a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTPullToRefreshViewComponentView.h b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTPullToRefreshViewComponentView.h 2 - index 914a249..0deac55 100644 3 - --- a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTPullToRefreshViewComponentView.h 4 - +++ b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTPullToRefreshViewComponentView.h 5 - @@ -19,6 +19,8 @@ NS_ASSUME_NONNULL_BEGIN 6 - */ 7 - @interface RCTPullToRefreshViewComponentView : RCTViewComponentView <RCTCustomPullToRefreshViewProtocol> 8 - 9 - +- (void)beginRefreshingProgrammatically; 10 - + 11 - @end 12 - 13 - NS_ASSUME_NONNULL_END 14 - diff --git a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm 15 - index d029337..0f63ea3 100644 16 - --- a/node_modules/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm 17 - +++ b/node_modules/react-native/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm 18 - @@ -1038,6 +1038,11 @@ - (void)_adjustForMaintainVisibleContentPosition 19 - } 20 - } 21 - 22 - ++ (BOOL)shouldBeRecycled 23 - +{ 24 - + return NO; 25 - +} 26 - + 27 - @end 28 - 29 - Class<RCTComponentViewProtocol> RCTScrollViewCls(void) 30 - diff --git a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.h b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.h 31 - index e9b330f..ec5f58c 100644 32 - --- a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.h 33 - +++ b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.h 34 - @@ -15,5 +15,8 @@ 35 - @property (nonatomic, copy) NSString *title; 36 - @property (nonatomic, copy) RCTDirectEventBlock onRefresh; 37 - @property (nonatomic, weak) UIScrollView *scrollView; 38 - +@property (nonatomic, copy) UIColor *customTintColor; 39 - + 40 - +- (void)forwarderBeginRefreshing; 41 - 42 - @end 43 - diff --git a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.m b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.m 44 - index 53bfd04..ff1b1ed 100644 45 - --- a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.m 46 - +++ b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControl.m 47 - @@ -23,6 +23,7 @@ @implementation RCTRefreshControl { 48 - UIColor *_titleColor; 49 - CGFloat _progressViewOffset; 50 - BOOL _hasMovedToWindow; 51 - + UIColor *_customTintColor; 52 - } 53 - 54 - - (instancetype)init 55 - @@ -58,6 +59,12 @@ - (void)layoutSubviews 56 - _isInitialRender = false; 57 - } 58 - 59 - +- (void)didMoveToSuperview 60 - +{ 61 - + [super didMoveToSuperview]; 62 - + [self setTintColor:_customTintColor]; 63 - +} 64 - + 65 - - (void)didMoveToWindow 66 - { 67 - [super didMoveToWindow]; 68 - @@ -221,4 +228,50 @@ - (void)refreshControlValueChanged 69 - } 70 - } 71 - 72 - +// Fix for https://github.com/facebook/react-native/issues/43388 73 - +// A bug in iOS 17.4 causes the haptic to not play when refreshing if the tintColor 74 - +// is set before the refresh control gets added to the scrollview. We'll call this 75 - +// function whenever the superview changes. We'll also call it if the value of customTintColor 76 - +// changes. 77 - +- (void)setTintColor:(UIColor *)tintColor 78 - +{ 79 - + if ([self.superview isKindOfClass:[UIScrollView class]] && self.tintColor != tintColor) { 80 - + [super setTintColor:tintColor]; 81 - + } 82 - +} 83 - + 84 - +// This method is used by Bluesky's ExpoScrollForwarder. This allows other React Native 85 - +// libraries to perform a refresh of a scrollview and access the refresh control's onRefresh 86 - +// function. 87 - +- (void)forwarderBeginRefreshing 88 - +{ 89 - + _refreshingProgrammatically = NO; 90 - + 91 - + [self sizeToFit]; 92 - + 93 - + if (!self.scrollView) { 94 - + return; 95 - + } 96 - + 97 - + UIScrollView *scrollView = (UIScrollView *)self.scrollView; 98 - + 99 - + [UIView animateWithDuration:0.3 100 - + delay:0 101 - + options:UIViewAnimationOptionBeginFromCurrentState 102 - + animations:^(void) { 103 - + // Whenever we call this method, the scrollview will always be at a position of 104 - + // -130 or less. Scrolling back to -65 simulates the default behavior of RCTRefreshControl 105 - + [scrollView setContentOffset:CGPointMake(0, -65)]; 106 - + } 107 - + completion:^(__unused BOOL finished) { 108 - + [super beginRefreshing]; 109 - + [self setCurrentRefreshingState:super.refreshing]; 110 - + 111 - + if (self->_onRefresh) { 112 - + self->_onRefresh(nil); 113 - + } 114 - + } 115 - + ]; 116 - +} 117 - + 118 - @end 119 - diff --git a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControlManager.m b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControlManager.m 120 - index 40aaf9c..1c60164 100644 121 - --- a/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControlManager.m 122 - +++ b/node_modules/react-native/React/Views/RefreshControl/RCTRefreshControlManager.m 123 - @@ -22,11 +22,12 @@ - (UIView *)view 124 - 125 - RCT_EXPORT_VIEW_PROPERTY(onRefresh, RCTDirectEventBlock) 126 - RCT_EXPORT_VIEW_PROPERTY(refreshing, BOOL) 127 - -RCT_EXPORT_VIEW_PROPERTY(tintColor, UIColor) 128 - RCT_EXPORT_VIEW_PROPERTY(title, NSString) 129 - RCT_EXPORT_VIEW_PROPERTY(titleColor, UIColor) 130 - RCT_EXPORT_VIEW_PROPERTY(progressViewOffset, CGFloat) 131 - 132 - +RCT_REMAP_VIEW_PROPERTY(tintColor, customTintColor, UIColor) 133 - + 134 - RCT_EXPORT_METHOD(setNativeRefreshing : (nonnull NSNumber *)viewTag toRefreshing : (BOOL)refreshing) 135 - { 136 - [self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
···
+1 -1
src/locale/locales/en/messages.po
··· 422 msgid "{minutes, plural, one {# minute} other {# minutes}}" 423 msgstr "" 424 425 - #: src/view/shell/bottom-bar/BottomBarWeb.tsx:277 426 msgid "{notificationCount, plural, one {# unread item} other {# unread items}}" 427 msgstr "" 428
··· 422 msgid "{minutes, plural, one {# minute} other {# minutes}}" 423 msgstr "" 424 425 + #: src/view/shell/bottom-bar/BottomBarWeb.tsx:282 426 msgid "{notificationCount, plural, one {# unread item} other {# unread items}}" 427 msgstr "" 428
+18 -22
src/view/com/util/fab/FABInner.tsx
··· 7 } from 'react-native' 8 import Animated from 'react-native-reanimated' 9 import {useSafeAreaInsets} from 'react-native-safe-area-context' 10 - import {LinearGradient} from 'expo-linear-gradient' 11 12 import {PressableScale} from '#/lib/custom-animations/PressableScale' 13 import {useHaptics} from '#/lib/haptics' 14 import {useMinimalShellFabTransform} from '#/lib/hooks/useMinimalShellTransform' 15 - import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' 16 import {clamp} from '#/lib/numbers' 17 - import {gradients} from '#/lib/styles' 18 import {isWeb} from '#/platform/detection' 19 import {useEnableSquareButtons} from '#/state/preferences/enable-square-buttons' 20 - import {ios} from '#/alf' 21 import {atoms as a} from '#/alf' 22 23 export interface FABProps extends ComponentProps<typeof Pressable> { ··· 28 29 export function FABInner({testID, icon, onPress, style, ...props}: FABProps) { 30 const insets = useSafeAreaInsets() 31 - const {isMobile, isTablet} = useWebMediaQueries() 32 const playHaptic = useHaptics() 33 const fabMinimalShellTransform = useMinimalShellFabTransform() 34 35 const enableSquareButtons = useEnableSquareButtons() 36 37 - const size = isTablet ? styles.sizeLarge : styles.sizeRegular 38 39 - const tabletSpacing = isTablet 40 ? {right: 50, bottom: 50} 41 : {right: 24, bottom: clamp(insets.bottom, 15, 60) + 15} 42 ··· 46 styles.outer, 47 size, 48 tabletSpacing, 49 - isMobile && fabMinimalShellTransform, 50 ]}> 51 <PressableScale 52 testID={testID} ··· 60 playHaptic('Heavy') 61 })} 62 targetScale={0.9} 63 - style={[enableSquareButtons ? a.rounded_sm : a.rounded_full, style]} 64 {...props}> 65 - <LinearGradient 66 - colors={[gradients.blueLight.start, gradients.blueLight.end]} 67 - start={{x: 0, y: 0}} 68 - end={{x: 1, y: 1}} 69 - style={[styles.inner, size]}> 70 - {icon} 71 - </LinearGradient> 72 </PressableScale> 73 </Animated.View> 74 ) ··· 76 77 const styles = StyleSheet.create({ 78 sizeRegular: { 79 - width: 60, 80 - height: 60, 81 borderRadius: 30, 82 }, 83 sizeLarge: { ··· 90 position: isWeb ? 'fixed' : 'absolute', 91 zIndex: 1, 92 cursor: 'pointer', 93 - }, 94 - inner: { 95 - justifyContent: 'center', 96 - alignItems: 'center', 97 }, 98 })
··· 7 } from 'react-native' 8 import Animated from 'react-native-reanimated' 9 import {useSafeAreaInsets} from 'react-native-safe-area-context' 10 11 import {PressableScale} from '#/lib/custom-animations/PressableScale' 12 import {useHaptics} from '#/lib/haptics' 13 import {useMinimalShellFabTransform} from '#/lib/hooks/useMinimalShellTransform' 14 import {clamp} from '#/lib/numbers' 15 import {isWeb} from '#/platform/detection' 16 import {useEnableSquareButtons} from '#/state/preferences/enable-square-buttons' 17 + import {ios, useBreakpoints, useTheme} from '#/alf' 18 import {atoms as a} from '#/alf' 19 20 export interface FABProps extends ComponentProps<typeof Pressable> { ··· 25 26 export function FABInner({testID, icon, onPress, style, ...props}: FABProps) { 27 const insets = useSafeAreaInsets() 28 + const {gtMobile} = useBreakpoints() 29 + const t = useTheme() 30 const playHaptic = useHaptics() 31 const fabMinimalShellTransform = useMinimalShellFabTransform() 32 33 const enableSquareButtons = useEnableSquareButtons() 34 35 + const size = gtMobile ? styles.sizeLarge : styles.sizeRegular 36 37 + const tabletSpacing = gtMobile 38 ? {right: 50, bottom: 50} 39 : {right: 24, bottom: clamp(insets.bottom, 15, 60) + 15} 40 ··· 44 styles.outer, 45 size, 46 tabletSpacing, 47 + !gtMobile && fabMinimalShellTransform, 48 ]}> 49 <PressableScale 50 testID={testID} ··· 58 playHaptic('Heavy') 59 })} 60 targetScale={0.9} 61 + style={[ 62 + enableSquareButtons ? a.rounded_sm : a.rounded_full, 63 + size, 64 + {backgroundColor: t.palette.primary_500}, 65 + a.align_center, 66 + a.justify_center, 67 + a.shadow_sm, 68 + style, 69 + ]} 70 {...props}> 71 + {icon} 72 </PressableScale> 73 </Animated.View> 74 ) ··· 76 77 const styles = StyleSheet.create({ 78 sizeRegular: { 79 + width: 56, 80 + height: 56, 81 borderRadius: 30, 82 }, 83 sizeLarge: { ··· 90 position: isWeb ? 'fixed' : 'absolute', 91 zIndex: 1, 92 cursor: 'pointer', 93 }, 94 })
+6 -4
src/view/icons/Logo.tsx
··· 9 type SvgProps, 10 } from 'react-native-svg' 11 12 - import {colors} from '#/lib/styles' 13 //import {useKawaiiMode} from '#/state/preferences/kawaii' 14 - import {flatten} from '#/alf' 15 16 const ratio = 512 / 512 17 ··· 21 } & Omit<SvgProps, 'style'> 22 23 export const Logo = React.forwardRef(function LogoImpl(props: Props, ref) { 24 const {fill, ...rest} = props 25 const gradient = fill === 'sky' 26 const styles = flatten(props.style) 27 - const _fill = gradient ? 'url(#sky)' : fill || styles?.color || colors.blue3 28 // @ts-ignore it's fiiiiine 29 - const size = parseInt(rest.width || 32) 30 31 // const isKawaii = useKawaiiMode() 32
··· 9 type SvgProps, 10 } from 'react-native-svg' 11 12 //import {useKawaiiMode} from '#/state/preferences/kawaii' 13 + import {flatten, useTheme} from '#/alf' 14 15 const ratio = 512 / 512 16 ··· 20 } & Omit<SvgProps, 'style'> 21 22 export const Logo = React.forwardRef(function LogoImpl(props: Props, ref) { 23 + const t = useTheme() 24 const {fill, ...rest} = props 25 const gradient = fill === 'sky' 26 const styles = flatten(props.style) 27 + const _fill = gradient 28 + ? 'url(#sky)' 29 + : fill || styles?.color || t.palette.primary_500 30 // @ts-ignore it's fiiiiine 31 + const size = parseInt(rest.width || 32, 10) 32 33 // const isKawaii = useKawaiiMode() 34
+6 -3
src/view/shell/bottom-bar/BottomBar.tsx
··· 29 import {useLoggedOutViewControls} from '#/state/shell/logged-out' 30 import {useShellLayout} from '#/state/shell/shell-layout' 31 import {useCloseAllActiveElements} from '#/state/util' 32 - import {Text} from '#/view/com/util/text/Text' 33 import {UserAvatar} from '#/view/com/util/UserAvatar' 34 import {Logo} from '#/view/icons/Logo' 35 import {Logotype} from '#/view/icons/Logotype' 36 - import {atoms as a} from '#/alf' 37 import {Button, ButtonText} from '#/components/Button' 38 import {useDialogControl} from '#/components/Dialog' 39 import {SwitchAccountDialog} from '#/components/dialogs/SwitchAccount' ··· 51 Message_Stroke2_Corner0_Rounded as Message, 52 Message_Stroke2_Corner0_Rounded_Filled as MessageFilled, 53 } from '#/components/icons/Message' 54 import {useDemoMode} from '#/storage/hooks/demo-mode' 55 import {styles} from './BottomBarStyles' 56 ··· 398 accessibilityLabel, 399 }: BtnProps) { 400 const enableSquareButtons = useEnableSquareButtons() 401 return ( 402 <PressableScale 403 testID={testID} ··· 416 style={[ 417 styles.notificationCount, 418 enableSquareButtons ? a.rounded_sm : a.rounded_full, 419 ]}> 420 - <Text style={styles.notificationCountLabel}>{notificationCount}</Text> 421 </View> 422 ) : hasNew ? ( 423 <View
··· 29 import {useLoggedOutViewControls} from '#/state/shell/logged-out' 30 import {useShellLayout} from '#/state/shell/shell-layout' 31 import {useCloseAllActiveElements} from '#/state/util' 32 import {UserAvatar} from '#/view/com/util/UserAvatar' 33 import {Logo} from '#/view/icons/Logo' 34 import {Logotype} from '#/view/icons/Logotype' 35 + import {atoms as a, useTheme} from '#/alf' 36 import {Button, ButtonText} from '#/components/Button' 37 import {useDialogControl} from '#/components/Dialog' 38 import {SwitchAccountDialog} from '#/components/dialogs/SwitchAccount' ··· 50 Message_Stroke2_Corner0_Rounded as Message, 51 Message_Stroke2_Corner0_Rounded_Filled as MessageFilled, 52 } from '#/components/icons/Message' 53 + import {Text} from '#/components/Typography' 54 import {useDemoMode} from '#/storage/hooks/demo-mode' 55 import {styles} from './BottomBarStyles' 56 ··· 398 accessibilityLabel, 399 }: BtnProps) { 400 const enableSquareButtons = useEnableSquareButtons() 401 + const t = useTheme() 402 + 403 return ( 404 <PressableScale 405 testID={testID} ··· 418 style={[ 419 styles.notificationCount, 420 enableSquareButtons ? a.rounded_sm : a.rounded_full, 421 + {backgroundColor: t.palette.primary_500}, 422 ]}> 423 + <Text style={styles.notificationCountLabel}>1</Text> 424 </View> 425 ) : hasNew ? ( 426 <View
-7
src/view/shell/bottom-bar/BottomBarStyles.tsx
··· 24 position: 'absolute', 25 left: '52%', 26 top: 8, 27 - backgroundColor: colors.blue3, 28 paddingHorizontal: 4, 29 paddingBottom: 1, 30 borderRadius: 6, ··· 34 paddingTop: 3, 35 paddingBottom: 3, 36 borderRadius: 12, 37 - }, 38 - notificationCountLight: { 39 - borderColor: colors.white, 40 - }, 41 - notificationCountDark: { 42 - borderColor: colors.gray8, 43 }, 44 notificationCountLabel: { 45 fontSize: 12,
··· 24 position: 'absolute', 25 left: '52%', 26 top: 8, 27 paddingHorizontal: 4, 28 paddingBottom: 1, 29 borderRadius: 6, ··· 33 paddingTop: 3, 34 paddingBottom: 3, 35 borderRadius: 12, 36 }, 37 notificationCountLabel: { 38 fontSize: 12,
+6 -1
src/view/shell/bottom-bar/BottomBarWeb.tsx
··· 236 hasNew?: boolean 237 notificationCount?: string 238 }> = ({children, href, routeName, hasNew, notificationCount}) => { 239 const {_} = useLingui() 240 const {currentAccount} = useSession() 241 const currentRoute = useNavigationState(state => { ··· 272 {children({isActive})} 273 {notificationCount ? ( 274 <View 275 - style={[styles.notificationCount, styles.notificationCountWeb]} 276 aria-label={_( 277 msg`${plural(notificationCount, { 278 one: '# unread item',
··· 236 hasNew?: boolean 237 notificationCount?: string 238 }> = ({children, href, routeName, hasNew, notificationCount}) => { 239 + const t = useTheme() 240 const {_} = useLingui() 241 const {currentAccount} = useSession() 242 const currentRoute = useNavigationState(state => { ··· 273 {children({isActive})} 274 {notificationCount ? ( 275 <View 276 + style={[ 277 + styles.notificationCount, 278 + styles.notificationCountWeb, 279 + {backgroundColor: t.palette.primary_500}, 280 + ]} 281 aria-label={_( 282 msg`${plural(notificationCount, { 283 one: '# unread item',
+46 -78
yarn.lock
··· 8579 resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 8580 integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== 8581 8582 - at-least-node@^1.0.0: 8583 - version "1.0.0" 8584 - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" 8585 - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== 8586 - 8587 atomic-sleep@^1.0.0: 8588 version "1.0.0" 8589 resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" ··· 9368 resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" 9369 integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== 9370 9371 cjs-module-lexer@^1.0.0: 9372 version "1.2.3" 9373 resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" ··· 9769 integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== 9770 dependencies: 9771 node-fetch "^2.6.12" 9772 - 9773 - cross-spawn@^6.0.5: 9774 - version "6.0.5" 9775 - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 9776 - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== 9777 - dependencies: 9778 - nice-try "^1.0.4" 9779 - path-key "^2.0.1" 9780 - semver "^5.5.0" 9781 - shebang-command "^1.2.0" 9782 - which "^1.2.9" 9783 9784 cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: 9785 version "7.0.3" ··· 11974 resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" 11975 integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== 11976 11977 - fs-extra@^11.2.0: 11978 - version "11.3.0" 11979 - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.0.tgz#0daced136bbaf65a555a326719af931adc7a314d" 11980 - integrity sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew== 11981 dependencies: 11982 graceful-fs "^4.2.0" 11983 jsonfile "^6.0.1" 11984 universalify "^2.0.0" 11985 11986 - fs-extra@^9.0.0: 11987 - version "9.1.0" 11988 - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" 11989 - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== 11990 dependencies: 11991 - at-least-node "^1.0.0" 11992 graceful-fs "^4.2.0" 11993 jsonfile "^6.0.1" 11994 universalify "^2.0.0" ··· 12961 version "1.2.7" 12962 resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" 12963 integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== 12964 - 12965 - is-ci@^2.0.0: 12966 - version "2.0.0" 12967 - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" 12968 - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== 12969 - dependencies: 12970 - ci-info "^2.0.0" 12971 12972 is-ci@^3.0.1: 12973 version "3.0.1" ··· 14077 resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 14078 integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== 14079 14080 json5@^1.0.2: 14081 version "1.0.2" 14082 resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" ··· 14097 universalify "^2.0.0" 14098 optionalDependencies: 14099 graceful-fs "^4.1.6" 14100 14101 "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.2.1: 14102 version "3.3.5" ··· 15117 resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz#d2cc9fc5235ddb371fc44d506234339c8e4b0a4b" 15118 integrity sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A== 15119 15120 - nice-try@^1.0.4: 15121 - version "1.0.5" 15122 - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" 15123 - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== 15124 - 15125 no-case@^3.0.4: 15126 version "3.0.4" 15127 resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" ··· 15680 ansi-escapes "^4.3.2" 15681 cross-spawn "^7.0.3" 15682 15683 - patch-package@^6.5.1: 15684 - version "6.5.1" 15685 - resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.5.1.tgz#3e5d00c16997e6160291fee06a521c42ac99b621" 15686 - integrity sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA== 15687 dependencies: 15688 "@yarnpkg/lockfile" "^1.1.0" 15689 chalk "^4.1.2" 15690 - cross-spawn "^6.0.5" 15691 find-yarn-workspace-root "^2.0.0" 15692 - fs-extra "^9.0.0" 15693 - is-ci "^2.0.0" 15694 klaw-sync "^6.0.0" 15695 minimist "^1.2.6" 15696 open "^7.4.2" 15697 - rimraf "^2.6.3" 15698 - semver "^5.6.0" 15699 slash "^2.0.0" 15700 - tmp "^0.0.33" 15701 - yaml "^1.10.2" 15702 15703 path-exists@^3.0.0: 15704 version "3.0.0" ··· 15719 version "1.0.2" 15720 resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 15721 integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== 15722 - 15723 - path-key@^2.0.1: 15724 - version "2.0.1" 15725 - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 15726 - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== 15727 15728 path-key@^3.0.0, path-key@^3.1.0: 15729 version "3.1.1" ··· 17785 resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" 17786 integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== 17787 17788 - semver@^5.5.0, semver@^5.6.0: 17789 - version "5.7.2" 17790 - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" 17791 - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== 17792 - 17793 semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: 17794 version "6.3.1" 17795 resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" ··· 18008 "@img/sharp-win32-ia32" "0.33.5" 18009 "@img/sharp-win32-x64" "0.33.5" 18010 18011 - shebang-command@^1.2.0: 18012 - version "1.2.0" 18013 - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 18014 - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== 18015 - dependencies: 18016 - shebang-regex "^1.0.0" 18017 - 18018 shebang-command@^2.0.0: 18019 version "2.0.0" 18020 resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" ··· 18022 dependencies: 18023 shebang-regex "^3.0.0" 18024 18025 - shebang-regex@^1.0.0: 18026 - version "1.0.0" 18027 - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 18028 - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== 18029 - 18030 shebang-regex@^3.0.0: 18031 version "3.0.0" 18032 resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" ··· 18952 integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== 18953 dependencies: 18954 os-tmpdir "~1.0.2" 18955 18956 tmpl@1.0.5: 18957 version "1.0.5" ··· 19947 has-tostringtag "^1.0.0" 19948 is-typed-array "^1.1.10" 19949 19950 - which@^1.2.9: 19951 - version "1.3.1" 19952 - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 19953 - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 19954 - dependencies: 19955 - isexe "^2.0.0" 19956 - 19957 which@^2.0.1, which@^2.0.2: 19958 version "2.0.2" 19959 resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" ··· 20142 resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" 20143 integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== 20144 20145 - yaml@^2.6.1: 20146 version "2.8.1" 20147 resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.1.tgz#1870aa02b631f7e8328b93f8bc574fac5d6c4d79" 20148 integrity sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==
··· 8579 resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 8580 integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== 8581 8582 atomic-sleep@^1.0.0: 8583 version "1.0.0" 8584 resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" ··· 9363 resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" 9364 integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== 9365 9366 + ci-info@^3.7.0: 9367 + version "3.9.0" 9368 + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" 9369 + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== 9370 + 9371 cjs-module-lexer@^1.0.0: 9372 version "1.2.3" 9373 resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" ··· 9769 integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== 9770 dependencies: 9771 node-fetch "^2.6.12" 9772 9773 cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: 9774 version "7.0.3" ··· 11963 resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" 11964 integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== 11965 11966 + fs-extra@^10.0.0: 11967 + version "10.1.0" 11968 + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" 11969 + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== 11970 dependencies: 11971 graceful-fs "^4.2.0" 11972 jsonfile "^6.0.1" 11973 universalify "^2.0.0" 11974 11975 + fs-extra@^11.2.0: 11976 + version "11.3.0" 11977 + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.0.tgz#0daced136bbaf65a555a326719af931adc7a314d" 11978 + integrity sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew== 11979 dependencies: 11980 graceful-fs "^4.2.0" 11981 jsonfile "^6.0.1" 11982 universalify "^2.0.0" ··· 12949 version "1.2.7" 12950 resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" 12951 integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== 12952 12953 is-ci@^3.0.1: 12954 version "3.0.1" ··· 14058 resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 14059 integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== 14060 14061 + json-stable-stringify@^1.0.2: 14062 + version "1.3.0" 14063 + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz#8903cfac42ea1a0f97f35d63a4ce0518f0cc6a70" 14064 + integrity sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg== 14065 + dependencies: 14066 + call-bind "^1.0.8" 14067 + call-bound "^1.0.4" 14068 + isarray "^2.0.5" 14069 + jsonify "^0.0.1" 14070 + object-keys "^1.1.1" 14071 + 14072 json5@^1.0.2: 14073 version "1.0.2" 14074 resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" ··· 14089 universalify "^2.0.0" 14090 optionalDependencies: 14091 graceful-fs "^4.1.6" 14092 + 14093 + jsonify@^0.0.1: 14094 + version "0.0.1" 14095 + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" 14096 + integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== 14097 14098 "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.2.1: 14099 version "3.3.5" ··· 15114 resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz#d2cc9fc5235ddb371fc44d506234339c8e4b0a4b" 15115 integrity sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A== 15116 15117 no-case@^3.0.4: 15118 version "3.0.4" 15119 resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" ··· 15672 ansi-escapes "^4.3.2" 15673 cross-spawn "^7.0.3" 15674 15675 + patch-package@^8.0.1: 15676 + version "8.0.1" 15677 + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-8.0.1.tgz#79d02f953f711e06d1f8949c8a13e5d3d7ba1a60" 15678 + integrity sha512-VsKRIA8f5uqHQ7NGhwIna6Bx6D9s/1iXlA1hthBVBEbkq+t4kXD0HHt+rJhf/Z+Ci0F/HCB2hvn0qLdLG+Qxlw== 15679 dependencies: 15680 "@yarnpkg/lockfile" "^1.1.0" 15681 chalk "^4.1.2" 15682 + ci-info "^3.7.0" 15683 + cross-spawn "^7.0.3" 15684 find-yarn-workspace-root "^2.0.0" 15685 + fs-extra "^10.0.0" 15686 + json-stable-stringify "^1.0.2" 15687 klaw-sync "^6.0.0" 15688 minimist "^1.2.6" 15689 open "^7.4.2" 15690 + semver "^7.5.3" 15691 slash "^2.0.0" 15692 + tmp "^0.2.4" 15693 + yaml "^2.2.2" 15694 15695 path-exists@^3.0.0: 15696 version "3.0.0" ··· 15711 version "1.0.2" 15712 resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 15713 integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== 15714 15715 path-key@^3.0.0, path-key@^3.1.0: 15716 version "3.1.1" ··· 17772 resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" 17773 integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== 17774 17775 semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: 17776 version "6.3.1" 17777 resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" ··· 17990 "@img/sharp-win32-ia32" "0.33.5" 17991 "@img/sharp-win32-x64" "0.33.5" 17992 17993 shebang-command@^2.0.0: 17994 version "2.0.0" 17995 resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" ··· 17997 dependencies: 17998 shebang-regex "^3.0.0" 17999 18000 shebang-regex@^3.0.0: 18001 version "3.0.0" 18002 resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" ··· 18922 integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== 18923 dependencies: 18924 os-tmpdir "~1.0.2" 18925 + 18926 + tmp@^0.2.4: 18927 + version "0.2.5" 18928 + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.5.tgz#b06bcd23f0f3c8357b426891726d16015abfd8f8" 18929 + integrity sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow== 18930 18931 tmpl@1.0.5: 18932 version "1.0.5" ··· 19922 has-tostringtag "^1.0.0" 19923 is-typed-array "^1.1.10" 19924 19925 which@^2.0.1, which@^2.0.2: 19926 version "2.0.2" 19927 resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" ··· 20110 resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" 20111 integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== 20112 20113 + yaml@^2.2.2, yaml@^2.6.1: 20114 version "2.8.1" 20115 resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.1.tgz#1870aa02b631f7e8328b93f8bc574fac5d6c4d79" 20116 integrity sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==