'use strict';

Object.defineProperty(exports, '__esModule', { value: true });

var index = require('../../style/index.js');
var compactItem = require('../../style/compact-item.js');
var compactItemVertical = require('../../style/compact-item-vertical.js');
require('../../theme/index.js');
var group = require('./group.js');
var statistic = require('../../theme/util/statistic.js');
var genComponentStyleHook = require('../../theme/util/genComponentStyleHook.js');

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)": {
        ...index.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
  }
});
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
});
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`]: {
    "color": textColor || void 0,
    "backgroundColor": "transparent",
    "borderColor": borderColor || void 0,
    "boxShadow": "none",
    ...genHoverActiveButtonStyle(
      {
        backgroundColor: "transparent",
        ...hoverStyle
      },
      {
        backgroundColor: "transparent",
        ...activeStyle
      }
    ),
    "&:disabled": {
      cursor: "not-allowed",
      color: textColorDisabled || void 0,
      borderColor: borderColorDisabled || void 0
    }
  }
});
const genSolidDisabledButtonStyle = (token) => ({
  "&:disabled": {
    ...genDisabledStyle(token)
  }
});
const genSolidButtonStyle = (token) => ({
  ...genSolidDisabledButtonStyle(token)
});
const genPureDisabledButtonStyle = (token) => ({
  "&:disabled": {
    cursor: "not-allowed",
    color: token.colorTextDisabled
  }
});
const genDefaultButtonStyle = (token) => ({
  ...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`]: {
    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)
  }
});
const genPrimaryButtonStyle = (token) => ({
  ...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`]: {
    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)
  }
});
const genDashedButtonStyle = (token) => ({
  ...genDefaultButtonStyle(token),
  borderStyle: "dashed"
});
const genLinkButtonStyle = (token) => ({
  color: token.colorLink,
  ...genHoverActiveButtonStyle(
    {
      color: token.colorLinkHover
    },
    {
      color: token.colorLinkActive
    }
  ),
  ...genPureDisabledButtonStyle(token),
  [`&${token.componentCls}-dangerous`]: {
    color: token.colorError,
    ...genHoverActiveButtonStyle(
      {
        color: token.colorErrorHover
      },
      {
        color: token.colorErrorActive
      }
    ),
    ...genPureDisabledButtonStyle(token)
  }
});
const genTextButtonStyle = (token) => ({
  ...genHoverActiveButtonStyle(
    {
      color: token.colorText,
      backgroundColor: token.colorBgTextHover
    },
    {
      color: token.colorText,
      backgroundColor: token.colorBgTextActive
    }
  ),
  ...genPureDisabledButtonStyle(token),
  [`&${token.componentCls}-dangerous`]: {
    color: token.colorError,
    ...genPureDisabledButtonStyle(token),
    ...genHoverActiveButtonStyle(
      {
        color: token.colorErrorHover,
        backgroundColor: token.colorErrorBg
      },
      {
        color: token.colorErrorHover,
        backgroundColor: token.colorErrorBg
      }
    )
  }
});
const genDisabledButtonStyle = (token) => ({
  ...genDisabledStyle(token),
  [`&${token.componentCls}:hover`]: {
    ...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)
  };
};
const genSizeButtonStyle = (token, sizePrefixCls = "") => {
  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 = statistic.merge(token, {
    controlHeight: token.controlHeightSM,
    padding: token.paddingXS,
    buttonPaddingHorizontal: 8,
    // Fixed padding
    borderRadius: token.borderRadiusSM
  });
  return genSizeButtonStyle(smallToken, `${token.componentCls}-sm`);
};
const genSizeLargeButtonStyle = (token) => {
  const largeToken = statistic.merge(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%"
      }
    }
  };
};
var useStyle = genComponentStyleHook.default("Button", (token) => {
  const { controlTmpOutline, paddingContentHorizontal } = token;
  const buttonToken = statistic.merge(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
    group.default(buttonToken),
    // Space Compact
    compactItem.genCompactItemStyle(token, { focus: false }),
    compactItemVertical.genCompactItemVerticalStyle(token)
  ];
});

exports.default = useStyle;
//# sourceMappingURL=index.js.map
