| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357 |
- import _extends from "@babel/runtime/helpers/esm/extends";
- import { genComponentStyleHook, mergeToken } from '../../theme/internal';
- import genGroupStyle from './group';
- import { genFocusStyle } from '../../style';
- import { genCompactItemStyle } from '../../style/compact-item';
- import { genCompactItemVerticalStyle } from '../../style/compact-item-vertical';
- // ============================== Shared ==============================
- const genSharedButtonStyle = token => {
- const {
- componentCls,
- iconCls
- } = token;
- return {
- [componentCls]: {
- outline: 'none',
- position: 'relative',
- display: 'inline-block',
- fontWeight: 400,
- whiteSpace: 'nowrap',
- textAlign: 'center',
- backgroundImage: 'none',
- backgroundColor: 'transparent',
- border: `${token.lineWidth}px ${token.lineType} transparent`,
- cursor: 'pointer',
- transition: `all ${token.motionDurationMid} ${token.motionEaseInOut}`,
- userSelect: 'none',
- touchAction: 'manipulation',
- lineHeight: token.lineHeight,
- color: token.colorText,
- '> span': {
- display: 'inline-block'
- },
- // Leave a space between icon and text.
- [`> ${iconCls} + span, > span + ${iconCls}`]: {
- marginInlineStart: token.marginXS
- },
- '> a': {
- color: 'currentColor'
- },
- '&:not(:disabled)': _extends({}, genFocusStyle(token)),
- // make `btn-icon-only` not too narrow
- [`&-icon-only${componentCls}-compact-item`]: {
- flex: 'none'
- },
- // Special styles for Primary Button
- [`&-compact-item${componentCls}-primary`]: {
- [`&:not([disabled]) + ${componentCls}-compact-item${componentCls}-primary:not([disabled])`]: {
- position: 'relative',
- '&:before': {
- position: 'absolute',
- top: -token.lineWidth,
- insetInlineStart: -token.lineWidth,
- display: 'inline-block',
- width: token.lineWidth,
- height: `calc(100% + ${token.lineWidth * 2}px)`,
- backgroundColor: token.colorPrimaryHover,
- content: '""'
- }
- }
- },
- // Special styles for Primary Button
- '&-compact-vertical-item': {
- [`&${componentCls}-primary`]: {
- [`&:not([disabled]) + ${componentCls}-compact-vertical-item${componentCls}-primary:not([disabled])`]: {
- position: 'relative',
- '&:before': {
- position: 'absolute',
- top: -token.lineWidth,
- insetInlineStart: -token.lineWidth,
- display: 'inline-block',
- width: `calc(100% + ${token.lineWidth * 2}px)`,
- height: token.lineWidth,
- backgroundColor: token.colorPrimaryHover,
- content: '""'
- }
- }
- }
- }
- }
- };
- };
- const genHoverActiveButtonStyle = (hoverStyle, activeStyle) => ({
- '&:not(:disabled)': {
- '&:hover': hoverStyle,
- '&:active': activeStyle
- }
- });
- // ============================== Shape ===============================
- const genCircleButtonStyle = token => ({
- minWidth: token.controlHeight,
- paddingInlineStart: 0,
- paddingInlineEnd: 0,
- borderRadius: '50%'
- });
- const genRoundButtonStyle = token => ({
- borderRadius: token.controlHeight,
- paddingInlineStart: token.controlHeight / 2,
- paddingInlineEnd: token.controlHeight / 2
- });
- // =============================== Type ===============================
- const genDisabledStyle = token => ({
- cursor: 'not-allowed',
- borderColor: token.colorBorder,
- color: token.colorTextDisabled,
- backgroundColor: token.colorBgContainerDisabled,
- boxShadow: 'none'
- });
- const genGhostButtonStyle = (btnCls, textColor, borderColor, textColorDisabled, borderColorDisabled, hoverStyle, activeStyle) => ({
- [`&${btnCls}-background-ghost`]: _extends(_extends({
- color: textColor || undefined,
- backgroundColor: 'transparent',
- borderColor: borderColor || undefined,
- boxShadow: 'none'
- }, genHoverActiveButtonStyle(_extends({
- backgroundColor: 'transparent'
- }, hoverStyle), _extends({
- backgroundColor: 'transparent'
- }, activeStyle))), {
- '&:disabled': {
- cursor: 'not-allowed',
- color: textColorDisabled || undefined,
- borderColor: borderColorDisabled || undefined
- }
- })
- });
- const genSolidDisabledButtonStyle = token => ({
- '&:disabled': _extends({}, genDisabledStyle(token))
- });
- const genSolidButtonStyle = token => _extends({}, genSolidDisabledButtonStyle(token));
- const genPureDisabledButtonStyle = token => ({
- '&:disabled': {
- cursor: 'not-allowed',
- color: token.colorTextDisabled
- }
- });
- // Type: Default
- const genDefaultButtonStyle = token => _extends(_extends(_extends(_extends(_extends({}, genSolidButtonStyle(token)), {
- backgroundColor: token.colorBgContainer,
- borderColor: token.colorBorder,
- boxShadow: `0 ${token.controlOutlineWidth}px 0 ${token.controlTmpOutline}`
- }), genHoverActiveButtonStyle({
- color: token.colorPrimaryHover,
- borderColor: token.colorPrimaryHover
- }, {
- color: token.colorPrimaryActive,
- borderColor: token.colorPrimaryActive
- })), genGhostButtonStyle(token.componentCls, token.colorBgContainer, token.colorBgContainer, token.colorTextDisabled, token.colorBorder)), {
- [`&${token.componentCls}-dangerous`]: _extends(_extends(_extends({
- color: token.colorError,
- borderColor: token.colorError
- }, genHoverActiveButtonStyle({
- color: token.colorErrorHover,
- borderColor: token.colorErrorBorderHover
- }, {
- color: token.colorErrorActive,
- borderColor: token.colorErrorActive
- })), genGhostButtonStyle(token.componentCls, token.colorError, token.colorError, token.colorTextDisabled, token.colorBorder)), genSolidDisabledButtonStyle(token))
- });
- // Type: Primary
- const genPrimaryButtonStyle = token => _extends(_extends(_extends(_extends(_extends({}, genSolidButtonStyle(token)), {
- color: token.colorTextLightSolid,
- backgroundColor: token.colorPrimary,
- boxShadow: `0 ${token.controlOutlineWidth}px 0 ${token.controlOutline}`
- }), genHoverActiveButtonStyle({
- color: token.colorTextLightSolid,
- backgroundColor: token.colorPrimaryHover
- }, {
- color: token.colorTextLightSolid,
- backgroundColor: token.colorPrimaryActive
- })), genGhostButtonStyle(token.componentCls, token.colorPrimary, token.colorPrimary, token.colorTextDisabled, token.colorBorder, {
- color: token.colorPrimaryHover,
- borderColor: token.colorPrimaryHover
- }, {
- color: token.colorPrimaryActive,
- borderColor: token.colorPrimaryActive
- })), {
- [`&${token.componentCls}-dangerous`]: _extends(_extends(_extends({
- backgroundColor: token.colorError,
- boxShadow: `0 ${token.controlOutlineWidth}px 0 ${token.colorErrorOutline}`
- }, genHoverActiveButtonStyle({
- backgroundColor: token.colorErrorHover
- }, {
- backgroundColor: token.colorErrorActive
- })), genGhostButtonStyle(token.componentCls, token.colorError, token.colorError, token.colorTextDisabled, token.colorBorder, {
- color: token.colorErrorHover,
- borderColor: token.colorErrorHover
- }, {
- color: token.colorErrorActive,
- borderColor: token.colorErrorActive
- })), genSolidDisabledButtonStyle(token))
- });
- // Type: Dashed
- const genDashedButtonStyle = token => _extends(_extends({}, genDefaultButtonStyle(token)), {
- borderStyle: 'dashed'
- });
- // Type: Link
- const genLinkButtonStyle = token => _extends(_extends(_extends({
- color: token.colorLink
- }, genHoverActiveButtonStyle({
- color: token.colorLinkHover
- }, {
- color: token.colorLinkActive
- })), genPureDisabledButtonStyle(token)), {
- [`&${token.componentCls}-dangerous`]: _extends(_extends({
- color: token.colorError
- }, genHoverActiveButtonStyle({
- color: token.colorErrorHover
- }, {
- color: token.colorErrorActive
- })), genPureDisabledButtonStyle(token))
- });
- // Type: Text
- const genTextButtonStyle = token => _extends(_extends(_extends({}, genHoverActiveButtonStyle({
- color: token.colorText,
- backgroundColor: token.colorBgTextHover
- }, {
- color: token.colorText,
- backgroundColor: token.colorBgTextActive
- })), genPureDisabledButtonStyle(token)), {
- [`&${token.componentCls}-dangerous`]: _extends(_extends({
- color: token.colorError
- }, genPureDisabledButtonStyle(token)), genHoverActiveButtonStyle({
- color: token.colorErrorHover,
- backgroundColor: token.colorErrorBg
- }, {
- color: token.colorErrorHover,
- backgroundColor: token.colorErrorBg
- }))
- });
- // Href and Disabled
- const genDisabledButtonStyle = token => _extends(_extends({}, genDisabledStyle(token)), {
- [`&${token.componentCls}:hover`]: _extends({}, genDisabledStyle(token))
- });
- const genTypeButtonStyle = token => {
- const {
- componentCls
- } = token;
- return {
- [`${componentCls}-default`]: genDefaultButtonStyle(token),
- [`${componentCls}-primary`]: genPrimaryButtonStyle(token),
- [`${componentCls}-dashed`]: genDashedButtonStyle(token),
- [`${componentCls}-link`]: genLinkButtonStyle(token),
- [`${componentCls}-text`]: genTextButtonStyle(token),
- [`${componentCls}-disabled`]: genDisabledButtonStyle(token)
- };
- };
- // =============================== Size ===============================
- const genSizeButtonStyle = function (token) {
- let sizePrefixCls = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
- const {
- componentCls,
- iconCls,
- controlHeight,
- fontSize,
- lineHeight,
- lineWidth,
- borderRadius,
- buttonPaddingHorizontal
- } = token;
- const paddingVertical = Math.max(0, (controlHeight - fontSize * lineHeight) / 2 - lineWidth);
- const paddingHorizontal = buttonPaddingHorizontal - lineWidth;
- const iconOnlyCls = `${componentCls}-icon-only`;
- return [
- // Size
- {
- [`${componentCls}${sizePrefixCls}`]: {
- fontSize,
- height: controlHeight,
- padding: `${paddingVertical}px ${paddingHorizontal}px`,
- borderRadius,
- [`&${iconOnlyCls}`]: {
- width: controlHeight,
- paddingInlineStart: 0,
- paddingInlineEnd: 0,
- [`&${componentCls}-round`]: {
- width: 'auto'
- },
- '> span': {
- transform: 'scale(1.143)' // 14px -> 16px
- }
- },
- // Loading
- [`&${componentCls}-loading`]: {
- opacity: token.opacityLoading,
- cursor: 'default'
- },
- [`${componentCls}-loading-icon`]: {
- transition: `width ${token.motionDurationSlow} ${token.motionEaseInOut}, opacity ${token.motionDurationSlow} ${token.motionEaseInOut}`
- },
- [`&:not(${iconOnlyCls}) ${componentCls}-loading-icon > ${iconCls}`]: {
- marginInlineEnd: token.marginXS
- }
- }
- },
- // Shape - patch prefixCls again to override solid border radius style
- {
- [`${componentCls}${componentCls}-circle${sizePrefixCls}`]: genCircleButtonStyle(token)
- }, {
- [`${componentCls}${componentCls}-round${sizePrefixCls}`]: genRoundButtonStyle(token)
- }];
- };
- const genSizeBaseButtonStyle = token => genSizeButtonStyle(token);
- const genSizeSmallButtonStyle = token => {
- const smallToken = mergeToken(token, {
- controlHeight: token.controlHeightSM,
- padding: token.paddingXS,
- buttonPaddingHorizontal: 8,
- borderRadius: token.borderRadiusSM
- });
- return genSizeButtonStyle(smallToken, `${token.componentCls}-sm`);
- };
- const genSizeLargeButtonStyle = token => {
- const largeToken = mergeToken(token, {
- controlHeight: token.controlHeightLG,
- fontSize: token.fontSizeLG,
- borderRadius: token.borderRadiusLG
- });
- return genSizeButtonStyle(largeToken, `${token.componentCls}-lg`);
- };
- const genBlockButtonStyle = token => {
- const {
- componentCls
- } = token;
- return {
- [componentCls]: {
- [`&${componentCls}-block`]: {
- width: '100%'
- }
- }
- };
- };
- // ============================== Export ==============================
- export default genComponentStyleHook('Button', token => {
- const {
- controlTmpOutline,
- paddingContentHorizontal
- } = token;
- const buttonToken = mergeToken(token, {
- colorOutlineDefault: controlTmpOutline,
- buttonPaddingHorizontal: paddingContentHorizontal
- });
- return [
- // Shared
- genSharedButtonStyle(buttonToken),
- // Size
- genSizeSmallButtonStyle(buttonToken), genSizeBaseButtonStyle(buttonToken), genSizeLargeButtonStyle(buttonToken),
- // Block
- genBlockButtonStyle(buttonToken),
- // Group (type, ghost, danger, disabled, loading)
- genTypeButtonStyle(buttonToken),
- // Button Group
- genGroupStyle(buttonToken),
- // Space Compact
- genCompactItemStyle(token, {
- focus: false
- }), genCompactItemVerticalStyle(token)];
- });
|