diff options
| author | Oliver <oliver@mohlin.dev> | 2025-03-04 14:07:03 +0100 |
|---|---|---|
| committer | Markus Pettersson <markus.pettersson@mullvad.net> | 2025-03-05 13:16:36 +0100 |
| commit | be02c62e44defdc5b32596b0ef2fa86f0737fdb0 (patch) | |
| tree | a5309739ddfa8efb8462411d0b12d896652cc2f6 /desktop | |
| parent | 73df70cec00f40f8ae5cf8a7672bd5306bf3738d (diff) | |
| download | mullvadvpn-be02c62e44defdc5b32596b0ef2fa86f0737fdb0.tar.xz mullvadvpn-be02c62e44defdc5b32596b0ef2fa86f0737fdb0.zip | |
Consolidate Button styles into styled component
Diffstat (limited to 'desktop')
| -rw-r--r-- | desktop/packages/mullvad-vpn/src/renderer/lib/components/button/Button.tsx | 113 |
1 files changed, 58 insertions, 55 deletions
diff --git a/desktop/packages/mullvad-vpn/src/renderer/lib/components/button/Button.tsx b/desktop/packages/mullvad-vpn/src/renderer/lib/components/button/Button.tsx index 81577ad975..f8fe5f7879 100644 --- a/desktop/packages/mullvad-vpn/src/renderer/lib/components/button/Button.tsx +++ b/desktop/packages/mullvad-vpn/src/renderer/lib/components/button/Button.tsx @@ -1,9 +1,9 @@ import React, { forwardRef } from 'react'; -import styled from 'styled-components'; +import styled, { css } from 'styled-components'; import { Colors, Radius, Spacings } from '../../foundations'; -import { buttonReset } from '../../styles'; import { Flex } from '../flex'; +import { ButtonBase } from './ButtonBase'; import { ButtonProvider } from './ButtonContext'; import { ButtonIcon, ButtonText, StyledIcon, StyledText } from './components'; @@ -12,49 +12,65 @@ export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElemen size?: 'auto' | 'full' | '1/2'; } -const variants = { - primary: { - background: Colors.blue, - hover: Colors.blue60, - disabled: Colors.blue50, +const styles = { + radius: Radius.radius4, + variants: { + primary: { + background: Colors.blue, + hover: Colors.blue60, + disabled: Colors.blue50, + }, + success: { + background: Colors.green, + hover: Colors.green90, + disabled: Colors.green40, + }, + destructive: { + background: Colors.red, + hover: Colors.red80, + disabled: Colors.red60, + }, }, - success: { - background: Colors.green, - hover: Colors.green90, - disabled: Colors.green40, + sizes: { + auto: 'auto', + full: '100%', + '1/2': '50%', }, - destructive: { - background: Colors.red, - hover: Colors.red80, - disabled: Colors.red60, - }, -} as const; - -const sizes = { - auto: 'auto', - full: '100%', - '1/2': '50%', }; -const StyledButton = styled.button({ - ...buttonReset, +const StyledButton = styled(ButtonBase)<ButtonProps>` + ${({ size: sizeProp = 'full', variant: variantProp = 'primary' }) => { + const variant = styles.variants[variantProp]; + const size = styles.sizes[sizeProp]; - minHeight: '32px', - borderRadius: Radius.radius4, - minWidth: '60px', - width: 'var(--size)', - background: 'var(--background)', - '&:not(:disabled):hover': { - background: 'var(--hover)', - }, - '&:disabled': { - background: 'var(--disabled)', - }, - '&:focus-visible': { - outline: `2px solid ${Colors.white}`, - outlineOffset: '2px', - }, -}); + return css` + --background: ${variant.background}; + --hover: ${variant.hover}; + --disabled: ${variant.disabled}; + --radius: ${styles.radius}; + --size: ${size}; + + min-height: 32px; + min-width: 60px; + border-radius: var(--radius); + width: var(--size); + background: var(--background); + + &:not(:disabled):hover { + background: var(--hover); + } + + &:disabled { + background: var(--disabled); + } + + &:focus-visible { + outline: 2px solid ${Colors.white}; + outline-offset: 2px; + } + `; + }} +`; const StyledFlex = styled(Flex)` justify-content: space-between; @@ -86,23 +102,10 @@ const StyledFlex = styled(Flex)` `; const Button = forwardRef<HTMLButtonElement, ButtonProps>( - ({ variant = 'primary', size = 'full', children, disabled = false, style, ...props }, ref) => { - const styles = variants[variant]; + ({ children, disabled = false, style, ...props }, ref) => { return ( <ButtonProvider disabled={disabled}> - <StyledButton - ref={ref} - style={ - { - '--background': styles.background, - '--hover': styles.hover, - '--disabled': styles.disabled, - '--size': sizes[size], - ...style, - } as React.CSSProperties - } - disabled={disabled} - {...props}> + <StyledButton ref={ref} disabled={disabled} {...props}> <StyledFlex $flex={1} $gap={Spacings.spacing3} |
