diff options
author | Eric Bailey <git@esb.lol> | 2024-09-20 11:38:51 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-20 11:38:51 -0500 |
commit | 0eed1cfec1b0caac35930529dfd9ac92bf38606f (patch) | |
tree | c356b389bb5db2c5e531ec860b5a288bada4cbe6 /src/components | |
parent | 27cceb96f33c86a06507a9ad3e631171474100b4 (diff) | |
download | voidsky-0eed1cfec1b0caac35930529dfd9ac92bf38606f.tar.zst |
[Neue] Buttons (#5406)
* Re-align button sizing (cherry picked from commit bcec243bb59dfe468313d98ba61f464d9750feec) * Use large, small, tiny (cherry picked from commit 1dc333c2993ab7f2e0ac750c0670dcec9a7069d0) * Tweaks
Diffstat (limited to 'src/components')
-rw-r--r-- | src/components/Button.tsx | 148 | ||||
-rw-r--r-- | src/components/Prompt.tsx | 4 | ||||
-rw-r--r-- | src/components/StarterPack/Wizard/WizardEditListDialog.tsx | 2 | ||||
-rw-r--r-- | src/components/StarterPack/Wizard/WizardListCard.tsx | 2 | ||||
-rw-r--r-- | src/components/dialogs/BirthDateSettings.tsx | 2 | ||||
-rw-r--r-- | src/components/dialogs/Embed.tsx | 2 | ||||
-rw-r--r-- | src/components/dialogs/EmbedConsent.tsx | 6 | ||||
-rw-r--r-- | src/components/dialogs/GifSelect.ios.tsx | 2 | ||||
-rw-r--r-- | src/components/dialogs/GifSelect.tsx | 2 | ||||
-rw-r--r-- | src/components/dialogs/MutedWords.tsx | 2 | ||||
-rw-r--r-- | src/components/dialogs/PostInteractionSettingsDialog.tsx | 2 | ||||
-rw-r--r-- | src/components/dms/MessagesNUX.tsx | 2 | ||||
-rw-r--r-- | src/components/forms/DateField/index.tsx | 2 | ||||
-rw-r--r-- | src/components/intents/VerifyEmailIntentDialog.tsx | 4 | ||||
-rw-r--r-- | src/components/moderation/LabelsOnMeDialog.tsx | 4 |
15 files changed, 130 insertions, 56 deletions
diff --git a/src/components/Button.tsx b/src/components/Button.tsx index 704aa9d98..8728b88c2 100644 --- a/src/components/Button.tsx +++ b/src/components/Button.tsx @@ -14,7 +14,7 @@ import { } from 'react-native' import {LinearGradient} from 'expo-linear-gradient' -import {android, atoms as a, flatten, select, tokens, useTheme} from '#/alf' +import {atoms as a, flatten, select, tokens, useTheme, web} from '#/alf' import {Props as SVGIconProps} from '#/components/icons/common' import {Text} from '#/components/Typography' @@ -30,7 +30,7 @@ export type ButtonColor = | 'gradient_sunset' | 'gradient_nordic' | 'gradient_bonfire' -export type ButtonSize = 'tiny' | 'xsmall' | 'small' | 'medium' | 'large' +export type ButtonSize = 'tiny' | 'small' | 'large' export type ButtonShape = 'round' | 'square' | 'default' export type VariantProps = { /** @@ -343,39 +343,46 @@ export const Button = React.forwardRef<View, ButtonProps>( if (shape === 'default') { if (size === 'large') { - baseStyles.push( - {paddingVertical: 15}, - a.px_2xl, - a.rounded_sm, - a.gap_md, - ) - } else if (size === 'medium') { - baseStyles.push( - {paddingVertical: 12}, - a.px_2xl, - a.rounded_sm, - a.gap_md, - ) + baseStyles.push({ + paddingVertical: 13, + paddingHorizontal: 20, + borderRadius: 8, + gap: 8, + }) } else if (size === 'small') { - baseStyles.push({paddingVertical: 9}, a.px_lg, a.rounded_sm, a.gap_sm) - } else if (size === 'xsmall') { - baseStyles.push({paddingVertical: 6}, a.px_sm, a.rounded_sm, a.gap_sm) + baseStyles.push({ + paddingVertical: 8, + paddingHorizontal: 12, + borderRadius: 6, + gap: 6, + }) } else if (size === 'tiny') { - baseStyles.push({paddingVertical: 4}, a.px_sm, a.rounded_xs, a.gap_xs) + baseStyles.push({ + paddingVertical: 4, + paddingHorizontal: 8, + borderRadius: 4, + gap: 4, + }) } } else if (shape === 'round' || shape === 'square') { if (size === 'large') { if (shape === 'round') { - baseStyles.push({height: 54, width: 54}) + baseStyles.push({height: 46, width: 46}) } else { - baseStyles.push({height: 50, width: 50}) + baseStyles.push({height: 44, width: 44}) } } else if (size === 'small') { - baseStyles.push({height: 34, width: 34}) - } else if (size === 'xsmall') { - baseStyles.push({height: 28, width: 28}) + if (shape === 'round') { + baseStyles.push({height: 36, width: 36}) + } else { + baseStyles.push({height: 34, width: 34}) + } } else if (size === 'tiny') { - baseStyles.push({height: 20, width: 20}) + if (shape === 'round') { + baseStyles.push({height: 22, width: 22}) + } else { + baseStyles.push({height: 21, width: 21}) + } } if (shape === 'round') { @@ -619,11 +626,11 @@ export function useSharedButtonTextStyles() { } if (size === 'large') { - baseStyles.push(a.text_md, android({paddingBottom: 1})) + baseStyles.push(a.text_md, a.leading_tight, web({paddingTop: 1})) + } else if (size === 'small') { + baseStyles.push(a.text_sm, a.leading_tight, web({paddingTop: 1})) } else if (size === 'tiny') { - baseStyles.push(a.text_xs, android({paddingBottom: 1})) - } else { - baseStyles.push(a.text_sm, android({paddingBottom: 1})) + baseStyles.push(a.text_xs, a.leading_tight) } return StyleSheet.flatten(baseStyles) @@ -643,31 +650,98 @@ export function ButtonText({children, style, ...rest}: ButtonTextProps) { export function ButtonIcon({ icon: Comp, position, - size: iconSize, + size, }: { icon: React.ComponentType<SVGIconProps> position?: 'left' | 'right' size?: SVGIconProps['size'] }) { - const {size, disabled} = useButtonContext() + const {size: buttonSize, disabled} = useButtonContext() const textStyles = useSharedButtonTextStyles() + const {iconSize, iconContainerSize} = React.useMemo(() => { + /** + * Pre-set icon sizes for different button sizes + */ + const iconSizeShorthand = + size ?? + (({ + large: 'sm', + small: 'xs', + tiny: 'xs', + }[buttonSize || 'small'] || 'sm') as Exclude< + SVGIconProps['size'], + undefined + >) + + /* + * Copied here from icons/common.tsx so we can tweak if we need to, but + * also so that we can calculate transforms. + */ + const iconSize = { + xs: 12, + sm: 16, + md: 20, + lg: 24, + xl: 28, + '2xl': 32, + }[iconSizeShorthand] + + /* + * Goal here is to match rendered text size so that different size icons + * don't increase button size + */ + const iconContainerSize = { + large: 18, + small: 16, + tiny: 13, + }[buttonSize || 'small'] + + return { + iconSize, + iconContainerSize, + } + }, [buttonSize, size]) return ( <View style={[ a.z_20, { + width: iconContainerSize, + height: iconContainerSize, opacity: disabled ? 0.7 : 1, marginLeft: position === 'left' ? -2 : 0, marginRight: position === 'right' ? -2 : 0, }, ]}> - <Comp - size={ - iconSize ?? (size === 'large' ? 'md' : size === 'tiny' ? 'xs' : 'sm') - } - style={[{color: textStyles.color, pointerEvents: 'none'}]} - /> + <View + style={[ + a.absolute, + { + width: iconSize, + height: iconSize, + top: '50%', + left: '50%', + transform: [ + { + translateX: (iconSize / 2) * -1, + }, + { + translateY: (iconSize / 2) * -1, + }, + ], + }, + ]}> + <Comp + width={iconSize} + style={[ + { + color: textStyles.color, + pointerEvents: 'none', + }, + ]} + /> + </View> </View> ) } diff --git a/src/components/Prompt.tsx b/src/components/Prompt.tsx index 7836bbef9..8765cdee3 100644 --- a/src/components/Prompt.tsx +++ b/src/components/Prompt.tsx @@ -120,7 +120,7 @@ export function Cancel({ <Button variant="solid" color="secondary" - size={gtMobile ? 'small' : 'medium'} + size={gtMobile ? 'small' : 'large'} label={cta || _(msg`Cancel`)} onPress={onPress}> <ButtonText>{cta || _(msg`Cancel`)}</ButtonText> @@ -163,7 +163,7 @@ export function Action({ <Button variant="solid" color={color} - size={gtMobile ? 'small' : 'medium'} + size={gtMobile ? 'small' : 'large'} label={cta || _(msg`Confirm`)} onPress={handleOnPress} testID={testID}> diff --git a/src/components/StarterPack/Wizard/WizardEditListDialog.tsx b/src/components/StarterPack/Wizard/WizardEditListDialog.tsx index 870cbbb9f..f7b0aba34 100644 --- a/src/components/StarterPack/Wizard/WizardEditListDialog.tsx +++ b/src/components/StarterPack/Wizard/WizardEditListDialog.tsx @@ -125,7 +125,7 @@ export function WizardEditListDialog({ label={_(msg`Close`)} variant="ghost" color="primary" - size="xsmall" + size="small" onPress={() => control.close()}> <ButtonText> <Trans>Close</Trans> diff --git a/src/components/StarterPack/Wizard/WizardListCard.tsx b/src/components/StarterPack/Wizard/WizardListCard.tsx index bd308fc73..ad02cdc30 100644 --- a/src/components/StarterPack/Wizard/WizardListCard.tsx +++ b/src/components/StarterPack/Wizard/WizardListCard.tsx @@ -101,7 +101,7 @@ function WizardListCard({ label={_(msg`Remove`)} variant="solid" color="secondary" - size="xsmall" + size="small" style={[a.self_center, {marginLeft: 'auto'}]} onPress={onPress}> <ButtonText> diff --git a/src/components/dialogs/BirthDateSettings.tsx b/src/components/dialogs/BirthDateSettings.tsx index d831c6002..08608f9d8 100644 --- a/src/components/dialogs/BirthDateSettings.tsx +++ b/src/components/dialogs/BirthDateSettings.tsx @@ -117,7 +117,7 @@ function BirthdayInner({ <View style={isWeb && [a.flex_row, a.justify_end]}> <Button label={hasChanged ? _(msg`Save birthday`) : _(msg`Done`)} - size="medium" + size="large" onPress={onSave} variant="solid" color="primary"> diff --git a/src/components/dialogs/Embed.tsx b/src/components/dialogs/Embed.tsx index f43c3c6fe..73ecf6616 100644 --- a/src/components/dialogs/Embed.tsx +++ b/src/components/dialogs/Embed.tsx @@ -120,7 +120,7 @@ function EmbedDialogInner({ label={_(msg`Copy code`)} color="primary" variant="solid" - size="medium" + size="large" onPress={() => { ref.current?.focus() ref.current?.setSelection(0, snippet.length) diff --git a/src/components/dialogs/EmbedConsent.tsx b/src/components/dialogs/EmbedConsent.tsx index f7e614597..765b8adc7 100644 --- a/src/components/dialogs/EmbedConsent.tsx +++ b/src/components/dialogs/EmbedConsent.tsx @@ -83,7 +83,7 @@ export function EmbedConsentDialog({ onPress={onShowAllPress} onAccessibilityEscape={control.close} color="primary" - size="medium" + size="large" variant="solid"> <ButtonText> <Trans>Enable external media</Trans> @@ -95,7 +95,7 @@ export function EmbedConsentDialog({ onPress={onShowPress} onAccessibilityEscape={control.close} color="secondary" - size="medium" + size="large" variant="solid"> <ButtonText> <Trans>Enable {externalEmbedLabels[source]} only</Trans> @@ -106,7 +106,7 @@ export function EmbedConsentDialog({ onAccessibilityEscape={control.close} onPress={onHidePress} color="secondary" - size="medium" + size="large" variant="ghost"> <ButtonText> <Trans>No thanks</Trans> diff --git a/src/components/dialogs/GifSelect.ios.tsx b/src/components/dialogs/GifSelect.ios.tsx index 091a23e51..2f867e865 100644 --- a/src/components/dialogs/GifSelect.ios.tsx +++ b/src/components/dialogs/GifSelect.ios.tsx @@ -244,7 +244,7 @@ function ModalError({details, close}: {details?: string; close: () => void}) { label={_(msg`Close dialog`)} onPress={close} color="primary" - size="medium" + size="large" variant="solid"> <ButtonText> <Trans>Close</Trans> diff --git a/src/components/dialogs/GifSelect.tsx b/src/components/dialogs/GifSelect.tsx index 4c60c6ebe..1afc588da 100644 --- a/src/components/dialogs/GifSelect.tsx +++ b/src/components/dialogs/GifSelect.tsx @@ -264,7 +264,7 @@ function DialogError({details}: {details?: string}) { label={_(msg`Close dialog`)} onPress={() => control.close()} color="primary" - size="medium" + size="large" variant="solid"> <ButtonText> <Trans>Close</Trans> diff --git a/src/components/dialogs/MutedWords.tsx b/src/components/dialogs/MutedWords.tsx index 38273aad5..81a614103 100644 --- a/src/components/dialogs/MutedWords.tsx +++ b/src/components/dialogs/MutedWords.tsx @@ -319,7 +319,7 @@ function MutedWordsInner() { <Button disabled={isPending || !field} label={_(msg`Add mute word for configured settings`)} - size="medium" + size="large" color="primary" variant="solid" style={[]} diff --git a/src/components/dialogs/PostInteractionSettingsDialog.tsx b/src/components/dialogs/PostInteractionSettingsDialog.tsx index a326602b7..d1828e4c8 100644 --- a/src/components/dialogs/PostInteractionSettingsDialog.tsx +++ b/src/components/dialogs/PostInteractionSettingsDialog.tsx @@ -439,7 +439,7 @@ export function PostInteractionSettingsForm({ onPress={onSave} onAccessibilityEscape={control.close} color="primary" - size="medium" + size="large" variant="solid" style={a.mt_xl}> <ButtonText>{_(msg`Save`)}</ButtonText> diff --git a/src/components/dms/MessagesNUX.tsx b/src/components/dms/MessagesNUX.tsx index 9a3425243..5c21ee05b 100644 --- a/src/components/dms/MessagesNUX.tsx +++ b/src/components/dms/MessagesNUX.tsx @@ -160,7 +160,7 @@ function DialogInner({ <Button label={_(msg`Start chatting`)} accessibilityHint={_(msg`Close modal`)} - size="medium" + size="large" color="primary" variant="solid" onPress={() => control.close()}> diff --git a/src/components/forms/DateField/index.tsx b/src/components/forms/DateField/index.tsx index c916f4efc..1c78d2abb 100644 --- a/src/components/forms/DateField/index.tsx +++ b/src/components/forms/DateField/index.tsx @@ -76,7 +76,7 @@ export function DateField({ <Button label={_(msg`Done`)} onPress={() => control.close()} - size="medium" + size="large" color="primary" variant="solid"> <ButtonText> diff --git a/src/components/intents/VerifyEmailIntentDialog.tsx b/src/components/intents/VerifyEmailIntentDialog.tsx index 4dca8bd90..e8c63af82 100644 --- a/src/components/intents/VerifyEmailIntentDialog.tsx +++ b/src/components/intents/VerifyEmailIntentDialog.tsx @@ -112,7 +112,7 @@ function Inner({control}: {control: DialogControlProps}) { onPress={() => control.close()} variant="solid" color={status === 'failure' ? 'secondary' : 'primary'} - size="medium" + size="large" style={{marginLeft: 'auto'}}> <ButtonText> <Trans>Close</Trans> @@ -124,7 +124,7 @@ function Inner({control}: {control: DialogControlProps}) { onPress={onPressResendEmail} variant="solid" color="primary" - size="medium" + size="large" disabled={sending}> <ButtonText> <Trans>Resend Email</Trans> diff --git a/src/components/moderation/LabelsOnMeDialog.tsx b/src/components/moderation/LabelsOnMeDialog.tsx index fe6932290..c54a04a78 100644 --- a/src/components/moderation/LabelsOnMeDialog.tsx +++ b/src/components/moderation/LabelsOnMeDialog.tsx @@ -279,7 +279,7 @@ function AppealForm({ testID="backBtn" variant="solid" color="secondary" - size="medium" + size="large" onPress={onPressBack} label={_(msg`Back`)}> <ButtonText>{_(msg`Back`)}</ButtonText> @@ -288,7 +288,7 @@ function AppealForm({ testID="submitBtn" variant="solid" color="primary" - size="medium" + size="large" onPress={onSubmit} label={_(msg`Submit`)}> <ButtonText>{_(msg`Submit`)}</ButtonText> |