diff --git a/web/components/button.css b/web/components/button.css --- a/web/components/button.css +++ b/web/components/button.css @@ -2,10 +2,11 @@ display: flex; align-items: center; justify-content: center; - background: var(--settings-btn-bg); border: 1px solid transparent; font-size: var(--m-font-16); padding: 12px 24px; + background: var(--background-color); + color: var(--fg); border-radius: 4px; cursor: pointer; } @@ -13,64 +14,17 @@ .btn:hover { transition-duration: 200ms; transition-property: background, color; + background-color: var(--hover-background-color); } .btn:disabled { cursor: not-allowed; color: var(--btn-disabled-color); + background: var(--disabled-background-color); } -.primary { - background: var(--btn-bg-primary); - color: var(--fg); -} - -.primary:hover { - background: var(--btn-bg-primary-hover); -} - -.primary:disabled { - background: var(--btn-bg-primary-disabled); -} - -.secondary { - background: var(--btn-bg-secondary); - color: var(--fg); - border-color: var(--btn-secondary-border); -} - -.secondary:hover { - background: var(--btn-bg-secondary-hover); -} - -.secondary:disabled { - background: var(--btn-bg-secondary-disabled); -} - -.success { - background: var(--btn-bg-success); - color: var(--fg); -} - -.success:hover { - background: var(--btn-bg-success-hover); -} - -.success:disabled { - background: var(--btn-bg-success-disabled); -} - -.danger { - background: var(--btn-bg-danger); - color: var(--fg); -} - -.danger:hover { - background: var(--btn-bg-danger-hover); -} - -.danger:disabled { - background: var(--btn-bg-danger-disabled); +.outline { + border: 1px solid var(--btn-outline-border); } .round { diff --git a/web/components/button.react.js b/web/components/button.react.js --- a/web/components/button.react.js +++ b/web/components/button.react.js @@ -2,20 +2,46 @@ import classnames from 'classnames'; import * as React from 'react'; +import tinycolor from 'tinycolor2'; import css from './button.css'; -export type ButtonVariant = - | 'primary' - | 'secondary' - | 'success' - | 'danger' - | 'round'; +export type ButtonVariant = 'filled' | 'outline' | 'round'; +export type ButtonColor = { + +backgroundColor: string, + +color?: string, + +hoverColor?: string, + +disabledColor?: string, +}; + +export const buttonThemes = { + standard: ({ + backgroundColor: 'var(--btn-bg-filled)', + hoverColor: 'var(--btn-bg-filled-hover)', + disabledColor: 'var(--btn-bg-filled-disabled)', + }: ButtonColor), + danger: ({ + backgroundColor: 'var(--btn-bg-danger)', + hoverColor: 'var(--btn-bg-danger-hover)', + disabledColor: 'var(--btn-bg-danger-disabled)', + }: ButtonColor), + success: ({ + backgroundColor: 'var(--btn-bg-success)', + hoverColor: 'var(--btn-bg-success-hover)', + disabledColor: 'var(--btn-bg-success-disabled)', + }: ButtonColor), + outline: ({ + backgroundColor: 'var(--btn-bg-outline)', + hoverColor: 'var(--btn-bg-outline-hover)', + disabledColor: 'var(--btn-bg-outline-disabled)', + }: ButtonColor), +}; export type ButtonProps = { +onClick: (event: SyntheticEvent) => mixed, +children: React.Node, +variant?: ButtonVariant, + +buttonColor?: ButtonColor, +type?: string, +disabled?: boolean, +className?: string, @@ -25,19 +51,53 @@ const { onClick, children, - variant = 'primary', + variant = 'filled', + buttonColor, type, disabled = false, className = '', } = props; + const btnCls = classnames(css.btn, css[variant]); + const style = React.useMemo(() => { + let color; + if (buttonColor) { + color = buttonColor; + } else if (variant === 'outline') { + color = buttonThemes.outline; + } else { + color = buttonThemes.standard; + } + + let hoverColor; + if (color.hoverColor) { + hoverColor = color.hoverColor; + } else { + const col = tinycolor(color.backgroundColor); + if (col.isValid()) { + hoverColor = col.darken(); + } else { + hoverColor = color.backgroundColor; + } + } + + return { + 'color': color.color, + '--background-color': color.backgroundColor, + '--hover-background-color': hoverColor, + '--disabled-background-color': + color.disabledColor ?? color.backgroundColor, + }; + }, [buttonColor, variant]); + return ( diff --git a/web/components/stepper.react.js b/web/components/stepper.react.js --- a/web/components/stepper.react.js +++ b/web/components/stepper.react.js @@ -37,7 +37,7 @@ return ( - diff --git a/web/modals/threads/cant-leave-thread-modal.react.js b/web/modals/threads/cant-leave-thread-modal.react.js --- a/web/modals/threads/cant-leave-thread-modal.react.js +++ b/web/modals/threads/cant-leave-thread-modal.react.js @@ -20,7 +20,7 @@ - diff --git a/web/modals/threads/members/add-members-modal.react.js b/web/modals/threads/members/add-members-modal.react.js --- a/web/modals/threads/members/add-members-modal.react.js +++ b/web/modals/threads/members/add-members-modal.react.js @@ -147,12 +147,12 @@ />
- diff --git a/web/settings/relationship/block-users-modal.react.js b/web/settings/relationship/block-users-modal.react.js --- a/web/settings/relationship/block-users-modal.react.js +++ b/web/settings/relationship/block-users-modal.react.js @@ -9,6 +9,7 @@ userRelationshipStatus, } from 'lib/types/relationship-types.js'; +import { buttonThemes } from '../../components/button.react'; import AddUsersListModal from './add-users-list-modal.react.js'; const excludedStatuses = new Set([ @@ -36,7 +37,7 @@ name="Block Users" excludedStatuses={excludedStatuses} confirmButtonContent={buttonContent} - confirmButtonVariant="danger" + confirmButtonColor={buttonThemes.danger} relationshipAction={relationshipActions.BLOCK} /> ); diff --git a/web/settings/relationship/user-list-row.css b/web/settings/relationship/user-list-row.css --- a/web/settings/relationship/user-list-row.css +++ b/web/settings/relationship/user-list-row.css @@ -23,7 +23,7 @@ .button { font-size: var(--s-font-14); line-height: var(--line-height-text); - color: var(--btn-bg-primary); + color: var(--btn-bg-filled); cursor: pointer; background: none; border: none; diff --git a/web/theme.css b/web/theme.css --- a/web/theme.css +++ b/web/theme.css @@ -60,12 +60,12 @@ --success: var(--success-dark-50); /* Color Theme */ - --btn-bg-primary: var(--violet-dark-100); - --btn-bg-primary-hover: var(--violet-dark-80); - --btn-bg-primary-disabled: var(--shades-black-80); - --btn-bg-secondary: var(--shades-black-90); - --btn-bg-secondary-hover: var(--shades-black-80); - --btn-bg-secondary-disabled: var(--shades-black-90); + --btn-bg-filled: var(--violet-dark-100); + --btn-bg-filled-hover: var(--violet-dark-80); + --btn-bg-filled-disabled: var(--shades-black-80); + --btn-bg-outline: var(--shades-black-90); + --btn-bg-outline-hover: var(--shades-black-80); + --btn-bg-outline-disabled: var(--shades-black-90); --btn-bg-success: var(--success-dark-50); --btn-bg-success-hover: var(--success-dark-90); --btn-bg-success-disabled: var(--shades-black-80); @@ -96,7 +96,7 @@ --help-color: var(--shades-black-60); --breadcrumb-color: var(--shades-white-60); --breadcrumb-color-unread: var(--shades-white-60); - --btn-secondary-border: var(--shades-black-60); + --btn-outline-border: var(--shades-black-60); --thread-color-read: var(--shades-black-60); --thread-from-color-read: var(--shades-black-80); --thread-last-message-color-read: var(--shades-black-60);