···5566import {cleanError} from '#/lib/strings/errors'
77import {CenteredView} from '#/view/com/util/Views'
88-import {atoms as a, flatten, useBreakpoints, useTheme} from '#/alf'
88+import {atoms as a, useBreakpoints, useTheme} from '#/alf'
99import {Button, ButtonText} from '#/components/Button'
1010import {Error} from '#/components/Error'
1111import {Loader} from '#/components/Loader'
···4343 a.pb_lg,
4444 t.atoms.border_contrast_low,
4545 {height: height ?? 180, paddingTop: 30},
4646- flatten(style),
4646+ style,
4747 ]}>
4848 {isFetchingNextPage ? (
4949 <Loader size="xl" />
+2-7
src/components/Loader.tsx
···77 withTiming,
88} from 'react-native-reanimated'
991010-import {atoms as a, flatten, useTheme} from '#/alf'
1010+import {atoms as a, useTheme} from '#/alf'
1111import {type Props, useCommonSVGProps} from '#/components/icons/common'
1212import {Loader_Stroke2_Corner0_Rounded as Icon} from '#/components/icons/Loader'
1313···3737 ]}>
3838 <Icon
3939 {...props}
4040- style={[
4141- a.absolute,
4242- a.inset_0,
4343- t.atoms.text_contrast_high,
4444- flatten(props.style),
4545- ]}
4040+ style={[a.absolute, a.inset_0, t.atoms.text_contrast_high, props.style]}
4641 />
4742 </Animated.View>
4843 )
+2-2
src/components/Loader.web.tsx
···11import {View} from 'react-native'
2233-import {atoms as a, flatten, useTheme} from '#/alf'
33+import {atoms as a, useTheme} from '#/alf'
44import {type Props, useCommonSVGProps} from '#/components/icons/common'
55import {Loader_Stroke2_Corner0_Rounded as Icon} from '#/components/icons/Loader'
66···2424 a.absolute,
2525 a.inset_0,
2626 t.atoms.text_contrast_high,
2727- flatten(props.style),
2727+ props.style,
2828 ]}
2929 />
3030 </div>
+6-6
src/components/PolicyUpdateOverlay/Overlay.tsx
···55 useSafeAreaInsets,
66} from 'react-native-safe-area-context'
77import {LinearGradient} from 'expo-linear-gradient'
88+import {utils} from '@bsky.app/alf'
89910import {isAndroid, isNative} from '#/platform/detection'
1011import {useA11y} from '#/state/a11y'
1111-import {atoms as a, flatten, useBreakpoints, useTheme, web} from '#/alf'
1212-import {transparentifyColor} from '#/alf/util/colorGeneration'
1212+import {atoms as a, useBreakpoints, useTheme, web} from '#/alf'
1313import {FocusScope} from '#/components/FocusScope'
1414import {LockScroll} from '#/components/LockScroll'
1515···4747 ) : (
4848 <LinearGradient
4949 colors={[
5050- transparentifyColor(t.atoms.bg.backgroundColor, 0),
5050+ utils.alpha(t.atoms.bg.backgroundColor, 0),
5151 t.atoms.bg.backgroundColor,
5252 t.atoms.bg.backgroundColor,
5353 ]}
···9797 ]}>
9898 <LinearGradient
9999 colors={[
100100- transparentifyColor(t.atoms.bg.backgroundColor, 0),
100100+ utils.alpha(t.atoms.bg.backgroundColor, 0),
101101 t.atoms.bg.backgroundColor,
102102 ]}
103103 start={[0.5, 0]}
···113113 role="dialog"
114114 aria-role="dialog"
115115 aria-label={label}
116116- style={flatten([
116116+ style={[
117117 a.relative,
118118 a.w_full,
119119 a.p_2xl,
···128128 maxWidth: 420,
129129 }),
130130 ],
131131- ])}>
131131+ ]}>
132132 {children}
133133 </View>
134134 </FocusScope>
+8-7
src/components/PostControls/index.tsx
···11-import {memo, useState} from 'react'
11+import {memo, useMemo, useState} from 'react'
22import {type StyleProp, View, type ViewStyle} from 'react-native'
33import {
44 type AppBskyFeedDefs,
···2525 useProgressGuideControls,
2626} from '#/state/shell/progress-guide'
2727import * as Toast from '#/view/com/util/Toast'
2828-import {atoms as a, flatten, useBreakpoints} from '#/alf'
2828+import {atoms as a, useBreakpoints} from '#/alf'
2929import {Reply as Bubble} from '#/components/icons/Reply'
3030import {useFormatPostStatCount} from '#/components/PostControls/util'
3131import {BookmarkButton} from './BookmarkButton'
···188188 })
189189 }
190190191191- const secondaryControlSpacingStyles = flatten([
192192- {gap: 0}, // default, we want `gap` to be defined on the resulting object
193193- variant !== 'compact' && a.gap_xs,
194194- (big || gtPhone) && a.gap_sm,
195195- ])
191191+ const secondaryControlSpacingStyles = useMemo(() => {
192192+ let gap = 0 // default, we want `gap` to be defined on the resulting object
193193+ if (variant !== 'compact') gap = a.gap_xs.gap
194194+ if (big || gtPhone) gap = a.gap_sm.gap
195195+ return {gap}
196196+ }, [variant, big, gtPhone])
196197197198 return (
198199 <View
···11import React from 'react'
22-import {Pressable, StyleSheet, View} from 'react-native'
22+import {Pressable, View} from 'react-native'
33import {msg} from '@lingui/macro'
44import {useLingui} from '@lingui/react'
55import Graphemer from 'graphemer'
···1919 type EmojiPickerPosition,
2020} from '#/view/com/composer/text-input/web/EmojiPicker'
2121import * as Toast from '#/view/com/util/Toast'
2222-import {atoms as a, useTheme} from '#/alf'
2222+import {atoms as a, flatten, useTheme} from '#/alf'
2323import {Button} from '#/components/Button'
2424import {useSharedInputStyles} from '#/components/forms/TextField'
2525import {EmojiArc_Stroke2_Corner0_Rounded as EmojiSmile} from '#/components/icons/Emoji'
···199199 </Button>
200200 <TextareaAutosize
201201 ref={textAreaRef}
202202- style={StyleSheet.flatten([
202202+ style={flatten([
203203 a.flex_1,
204204 a.px_sm,
205205 a.border_0,