mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-07-17 01:56:27 +08:00
5870a6097a
* Chore/unit test (#538) * chore: add unit test * chore: add github action for unit test * feat: init firebase * chore: add development secrets * fix: rename auth -> data-services * feat: update blocksuite 0.3.0-alpha.4 (#543) * feat: add requests * feat: optimize swr cache * feat: add Authorization * feat: add confirm-invitation page * feat: add account sdk api and proxy * docs: update contributing (#550) * docs: update contributing * Update CONTRIBUTING.md * Update CONTRIBUTING.md Co-authored-by: ShortCipher5 <me@shortcipher.me> * feat: update api * feat: remove babelrc setting * feat: add create workspace ui * feat: choose workspaces * feat: login modal * feat: authorization api * feat: login status * fix: remove unused variables * feat: login button * fix: lint * fix: workspace id * fix: i18n type error Co-authored-by: MingLiang Wang <mingliangwang0o0@gmail.com> Co-authored-by: ShortCipher5 <me@shortcipher.me>
86 lines
1.9 KiB
TypeScript
86 lines
1.9 KiB
TypeScript
import {
|
|
HTMLAttributes,
|
|
cloneElement,
|
|
ReactElement,
|
|
Children,
|
|
CSSProperties,
|
|
forwardRef,
|
|
} from 'react';
|
|
import { StyledIconButton } from './styles';
|
|
|
|
const SIZE_SMALL = 'small' as const;
|
|
const SIZE_MIDDLE = 'middle' as const;
|
|
const SIZE_NORMAL = 'normal' as const;
|
|
// TODO: IconButton should merge into Button, but it has not been designed yet
|
|
const SIZE_CONFIG = {
|
|
[SIZE_SMALL]: {
|
|
iconSize: 16,
|
|
areaSize: 24,
|
|
},
|
|
[SIZE_MIDDLE]: {
|
|
iconSize: 20,
|
|
areaSize: 28,
|
|
},
|
|
[SIZE_NORMAL]: {
|
|
iconSize: 24,
|
|
areaSize: 32,
|
|
},
|
|
} as const;
|
|
|
|
export type IconButtonProps = {
|
|
size?:
|
|
| typeof SIZE_SMALL
|
|
| typeof SIZE_MIDDLE
|
|
| typeof SIZE_NORMAL
|
|
| [number, number];
|
|
iconSize?:
|
|
| typeof SIZE_SMALL
|
|
| typeof SIZE_MIDDLE
|
|
| typeof SIZE_NORMAL
|
|
| [number, number];
|
|
disabled?: boolean;
|
|
hoverBackground?: CSSProperties['background'];
|
|
hoverColor?: string;
|
|
hoverStyle?: CSSProperties;
|
|
children: ReactElement<HTMLAttributes<SVGElement>, 'svg'>;
|
|
} & HTMLAttributes<HTMLButtonElement>;
|
|
|
|
export const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(
|
|
(
|
|
{
|
|
size = 'normal',
|
|
iconSize = 'normal',
|
|
disabled = false,
|
|
children,
|
|
...props
|
|
},
|
|
ref
|
|
) => {
|
|
const [width, height] = Array.isArray(size)
|
|
? size
|
|
: [SIZE_CONFIG[size]['areaSize'], SIZE_CONFIG[size]['areaSize']];
|
|
const [iconWidth, iconHeight] = Array.isArray(iconSize)
|
|
? iconSize
|
|
: [SIZE_CONFIG[iconSize]['iconSize'], SIZE_CONFIG[iconSize]['iconSize']];
|
|
|
|
return (
|
|
<StyledIconButton
|
|
ref={ref}
|
|
disabled={disabled}
|
|
width={width}
|
|
height={height}
|
|
borderRadius={iconWidth / 4}
|
|
{...props}
|
|
>
|
|
{cloneElement(Children.only(children), {
|
|
width: iconWidth,
|
|
height: iconHeight,
|
|
})}
|
|
</StyledIconButton>
|
|
);
|
|
}
|
|
);
|
|
IconButton.displayName = 'IconButton';
|
|
|
|
export default IconButton;
|