diff --git a/app/soapbox/components/icon-button.js b/app/soapbox/components/icon-button.js deleted file mode 100644 index bdfe157a60..0000000000 Binary files a/app/soapbox/components/icon-button.js and /dev/null differ diff --git a/app/soapbox/components/icon-button.tsx b/app/soapbox/components/icon-button.tsx new file mode 100644 index 0000000000..6a7dea4f7b --- /dev/null +++ b/app/soapbox/components/icon-button.tsx @@ -0,0 +1,100 @@ +import classNames from 'clsx'; +import React from 'react'; + +import Icon from 'soapbox/components/icon'; + +interface IIconButton extends Pick, 'className' | 'disabled' | 'onClick' | 'onKeyDown' | 'onKeyPress' | 'onKeyUp' | 'onMouseDown' | 'onMouseEnter' | 'onMouseLeave' | 'tabIndex' | 'title'> { + active?: boolean + expanded?: boolean + iconClassName?: string + pressed?: boolean + size?: number + src: string + text: React.ReactNode +} + +const IconButton: React.FC = ({ + active, + className, + disabled, + expanded, + iconClassName, + onClick, + onKeyDown, + onKeyUp, + onKeyPress, + onMouseDown, + onMouseEnter, + onMouseLeave, + pressed, + size = 18, + src, + tabIndex = 0, + text, + title, +}) => { + + const handleClick: React.MouseEventHandler = (e) => { + e.preventDefault(); + + if (!disabled && onClick) { + onClick(e); + } + }; + + const handleMouseDown: React.MouseEventHandler = (e) => { + if (!disabled && onMouseDown) { + onMouseDown(e); + } + }; + + const handleKeyDown: React.KeyboardEventHandler = (e) => { + if (!disabled && onKeyDown) { + onKeyDown(e); + } + }; + + const handleKeyUp: React.KeyboardEventHandler = (e) => { + if (!disabled && onKeyUp) { + onKeyUp(e); + } + }; + + const handleKeyPress: React.KeyboardEventHandler = (e) => { + if (onKeyPress && !disabled) { + onKeyPress(e); + } + }; + + const classes = classNames(className, 'icon-button', { + active, + disabled, + }); + + return ( + + ); +}; + +export default IconButton; diff --git a/app/soapbox/features/compose/components/text-icon-button.tsx b/app/soapbox/features/compose/components/text-icon-button.tsx deleted file mode 100644 index fd49d4ed07..0000000000 --- a/app/soapbox/features/compose/components/text-icon-button.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import React from 'react'; - -interface ITextIconButton { - label: string, - title: string, - active: boolean, - onClick: () => void, - ariaControls: string, - unavailable: boolean, -} - -const TextIconButton: React.FC = ({ - label, - title, - active, - ariaControls, - unavailable, - onClick, -}) => { - const handleClick: React.MouseEventHandler = (e) => { - e.preventDefault(); - onClick(); - }; - - if (unavailable) { - return null; - } - - return ( - - ); -}; - -export default TextIconButton; diff --git a/app/styles/ui.scss b/app/styles/ui.scss index 92ffc77e21..b001552539 100644 --- a/app/styles/ui.scss +++ b/app/styles/ui.scss @@ -44,87 +44,6 @@ &:active { outline: 0 !important; } - - &.inverted { - color: var(--primary-text-color--faint); - opacity: 1; - - &:hover, - &:active, - &:focus { - color: var(--primary-text-color); - } - - &.disabled { - color: var(--primary-text-color--faint); - } - - &.active { - color: var(--highlight-text-color); - - &.disabled { - color: var(--highlight-text-color); - } - } - } - - &.overlayed { - box-sizing: content-box; - background: var(--foreground-color); - color: var(--primary-text-color--faint); - border-radius: 6px; - padding: 2px; - opacity: 1; - - > div { - display: flex; - align-items: center; - justify-content: center; - } - - &:hover { - background: var(--background-color); - } - } -} - -.text-icon-button { - color: var(--primary-text-color--faint); - border: 0; - background: transparent; - cursor: pointer; - font-weight: 600; - font-size: 11px; - padding: 0 3px; - line-height: 27px; - outline: 0; - transition: color 100ms ease-in; - - &:hover, - &:active, - &:focus { - color: var(--primary-text-color); - transition: color 200ms ease-out; - } - - &.disabled { - color: var(--primary-text-color--faint); - cursor: default; - } - - &.active { - color: var(--highlight-text-color); - } - - &::-moz-focus-inner { - border: 0; - } - - &::-moz-focus-inner, - &:focus, - &:active { - outline: 0 !important; - } } .invisible {