ribbon.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import { unit } from '@ant-design/cssinjs';
  2. import { prepareComponentToken, prepareToken } from '.';
  3. import { resetComponent } from '../../style';
  4. import { genPresetColor, genStyleHooks } from '../../theme/internal';
  5. // ============================== Ribbon ==============================
  6. const genRibbonStyle = token => {
  7. const {
  8. antCls,
  9. badgeFontHeight,
  10. marginXS,
  11. badgeRibbonOffset,
  12. calc
  13. } = token;
  14. const ribbonPrefixCls = `${antCls}-ribbon`;
  15. const ribbonWrapperPrefixCls = `${antCls}-ribbon-wrapper`;
  16. const statusRibbonPreset = genPresetColor(token, (colorKey, {
  17. darkColor
  18. }) => ({
  19. [`&${ribbonPrefixCls}-color-${colorKey}`]: {
  20. background: darkColor,
  21. color: darkColor
  22. }
  23. }));
  24. return {
  25. [ribbonWrapperPrefixCls]: {
  26. position: 'relative'
  27. },
  28. [ribbonPrefixCls]: Object.assign(Object.assign(Object.assign(Object.assign({}, resetComponent(token)), {
  29. position: 'absolute',
  30. top: marginXS,
  31. padding: `0 ${unit(token.paddingXS)}`,
  32. color: token.colorPrimary,
  33. lineHeight: unit(badgeFontHeight),
  34. whiteSpace: 'nowrap',
  35. backgroundColor: token.colorPrimary,
  36. borderRadius: token.borderRadiusSM,
  37. [`${ribbonPrefixCls}-text`]: {
  38. color: token.badgeTextColor
  39. },
  40. [`${ribbonPrefixCls}-corner`]: {
  41. position: 'absolute',
  42. top: '100%',
  43. width: badgeRibbonOffset,
  44. height: badgeRibbonOffset,
  45. color: 'currentcolor',
  46. border: `${unit(calc(badgeRibbonOffset).div(2).equal())} solid`,
  47. transform: token.badgeRibbonCornerTransform,
  48. transformOrigin: 'top',
  49. filter: token.badgeRibbonCornerFilter
  50. }
  51. }), statusRibbonPreset), {
  52. [`&${ribbonPrefixCls}-placement-end`]: {
  53. insetInlineEnd: calc(badgeRibbonOffset).mul(-1).equal(),
  54. borderEndEndRadius: 0,
  55. [`${ribbonPrefixCls}-corner`]: {
  56. insetInlineEnd: 0,
  57. borderInlineEndColor: 'transparent',
  58. borderBlockEndColor: 'transparent'
  59. }
  60. },
  61. [`&${ribbonPrefixCls}-placement-start`]: {
  62. insetInlineStart: calc(badgeRibbonOffset).mul(-1).equal(),
  63. borderEndStartRadius: 0,
  64. [`${ribbonPrefixCls}-corner`]: {
  65. insetInlineStart: 0,
  66. borderBlockEndColor: 'transparent',
  67. borderInlineStartColor: 'transparent'
  68. }
  69. },
  70. // ====================== RTL =======================
  71. '&-rtl': {
  72. direction: 'rtl'
  73. }
  74. })
  75. };
  76. };
  77. // ============================== Export ==============================
  78. export default genStyleHooks(['Badge', 'Ribbon'], token => {
  79. const badgeToken = prepareToken(token);
  80. return genRibbonStyle(badgeToken);
  81. }, prepareComponentToken);