| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407 |
- import _extends from "@babel/runtime/helpers/esm/extends";
- import { TinyColor } from '@ctrl/tinycolor';
- import { genCollapseMotion, initSlideMotion, initZoomMotion } from '../../style/motion';
- import { genComponentStyleHook, mergeToken } from '../../theme/internal';
- import getHorizontalStyle from './horizontal';
- import getRTLStyle from './rtl';
- import getThemeStyle from './theme';
- import getVerticalStyle from './vertical';
- import { clearFix, resetComponent, resetIcon } from '../../style';
- import 'vue';
- const genMenuItemStyle = token => {
- const {
- componentCls,
- fontSize,
- motionDurationSlow,
- motionDurationMid,
- motionEaseInOut,
- motionEaseOut,
- iconCls,
- controlHeightSM
- } = token;
- return {
- // >>>>> Item
- [`${componentCls}-item, ${componentCls}-submenu-title`]: {
- position: 'relative',
- display: 'block',
- margin: 0,
- whiteSpace: 'nowrap',
- cursor: 'pointer',
- transition: [`border-color ${motionDurationSlow}`, `background ${motionDurationSlow}`, `padding ${motionDurationSlow} ${motionEaseInOut}`].join(','),
- [`${componentCls}-item-icon, ${iconCls}`]: {
- minWidth: fontSize,
- fontSize,
- transition: [`font-size ${motionDurationMid} ${motionEaseOut}`, `margin ${motionDurationSlow} ${motionEaseInOut}`, `color ${motionDurationSlow}`].join(','),
- '+ span': {
- marginInlineStart: controlHeightSM - fontSize,
- opacity: 1,
- transition: [`opacity ${motionDurationSlow} ${motionEaseInOut}`, `margin ${motionDurationSlow}`, `color ${motionDurationSlow}`].join(',')
- }
- },
- [`${componentCls}-item-icon`]: _extends({}, resetIcon()),
- [`&${componentCls}-item-only-child`]: {
- [`> ${iconCls}, > ${componentCls}-item-icon`]: {
- marginInlineEnd: 0
- }
- }
- },
- // Disabled state sets text to gray and nukes hover/tab effects
- [`${componentCls}-item-disabled, ${componentCls}-submenu-disabled`]: {
- background: 'none !important',
- cursor: 'not-allowed',
- '&::after': {
- borderColor: 'transparent !important'
- },
- a: {
- color: 'inherit !important'
- },
- [`> ${componentCls}-submenu-title`]: {
- color: 'inherit !important',
- cursor: 'not-allowed'
- }
- }
- };
- };
- const genSubMenuArrowStyle = token => {
- const {
- componentCls,
- motionDurationSlow,
- motionEaseInOut,
- borderRadius,
- menuArrowSize,
- menuArrowOffset
- } = token;
- return {
- [`${componentCls}-submenu`]: {
- [`&-expand-icon, &-arrow`]: {
- position: 'absolute',
- top: '50%',
- insetInlineEnd: token.margin,
- width: menuArrowSize,
- color: 'currentcolor',
- transform: 'translateY(-50%)',
- transition: `transform ${motionDurationSlow} ${motionEaseInOut}, opacity ${motionDurationSlow}`
- },
- '&-arrow': {
- // →
- '&::before, &::after': {
- position: 'absolute',
- width: menuArrowSize * 0.6,
- height: menuArrowSize * 0.15,
- backgroundColor: 'currentcolor',
- borderRadius,
- transition: [`background ${motionDurationSlow} ${motionEaseInOut}`, `transform ${motionDurationSlow} ${motionEaseInOut}`, `top ${motionDurationSlow} ${motionEaseInOut}`, `color ${motionDurationSlow} ${motionEaseInOut}`].join(','),
- content: '""'
- },
- '&::before': {
- transform: `rotate(45deg) translateY(-${menuArrowOffset})`
- },
- '&::after': {
- transform: `rotate(-45deg) translateY(${menuArrowOffset})`
- }
- }
- }
- };
- };
- // =============================== Base ===============================
- const getBaseStyle = token => {
- const {
- antCls,
- componentCls,
- fontSize,
- motionDurationSlow,
- motionDurationMid,
- motionEaseInOut,
- lineHeight,
- paddingXS,
- padding,
- colorSplit,
- lineWidth,
- zIndexPopup,
- borderRadiusLG,
- radiusSubMenuItem,
- menuArrowSize,
- menuArrowOffset,
- lineType,
- menuPanelMaskInset
- } = token;
- return [
- // Misc
- {
- '': {
- [`${componentCls}`]: _extends(_extends({}, clearFix()), {
- // Hidden
- [`&-hidden`]: {
- display: 'none'
- }
- })
- },
- [`${componentCls}-submenu-hidden`]: {
- display: 'none'
- }
- }, {
- [componentCls]: _extends(_extends(_extends(_extends(_extends(_extends(_extends({}, resetComponent(token)), clearFix()), {
- marginBottom: 0,
- paddingInlineStart: 0,
- // Override default ul/ol
- fontSize,
- lineHeight: 0,
- listStyle: 'none',
- outline: 'none',
- transition: `width ${motionDurationSlow} cubic-bezier(0.2, 0, 0, 1) 0s`,
- [`ul, ol`]: {
- margin: 0,
- padding: 0,
- listStyle: 'none'
- },
- // Overflow ellipsis
- [`&-overflow`]: {
- display: 'flex',
- [`${componentCls}-item`]: {
- flex: 'none'
- }
- },
- [`${componentCls}-item, ${componentCls}-submenu, ${componentCls}-submenu-title`]: {
- borderRadius: token.radiusItem
- },
- [`${componentCls}-item-group-title`]: {
- padding: `${paddingXS}px ${padding}px`,
- fontSize,
- lineHeight,
- transition: `all ${motionDurationSlow}`
- },
- [`&-horizontal ${componentCls}-submenu`]: {
- transition: [`border-color ${motionDurationSlow} ${motionEaseInOut}`, `background ${motionDurationSlow} ${motionEaseInOut}`].join(',')
- },
- [`${componentCls}-submenu, ${componentCls}-submenu-inline`]: {
- transition: [`border-color ${motionDurationSlow} ${motionEaseInOut}`, `background ${motionDurationSlow} ${motionEaseInOut}`, `padding ${motionDurationMid} ${motionEaseInOut}`].join(',')
- },
- [`${componentCls}-submenu ${componentCls}-sub`]: {
- cursor: 'initial',
- transition: [`background ${motionDurationSlow} ${motionEaseInOut}`, `padding ${motionDurationSlow} ${motionEaseInOut}`].join(',')
- },
- [`${componentCls}-title-content`]: {
- transition: `color ${motionDurationSlow}`
- },
- [`${componentCls}-item a`]: {
- '&::before': {
- position: 'absolute',
- inset: 0,
- backgroundColor: 'transparent',
- content: '""'
- }
- },
- // Removed a Badge related style seems it's safe
- // https://github.com/ant-design/ant-design/issues/19809
- // >>>>> Divider
- [`${componentCls}-item-divider`]: {
- overflow: 'hidden',
- lineHeight: 0,
- borderColor: colorSplit,
- borderStyle: lineType,
- borderWidth: 0,
- borderTopWidth: lineWidth,
- marginBlock: lineWidth,
- padding: 0,
- '&-dashed': {
- borderStyle: 'dashed'
- }
- }
- }), genMenuItemStyle(token)), {
- [`${componentCls}-item-group`]: {
- [`${componentCls}-item-group-list`]: {
- margin: 0,
- padding: 0,
- [`${componentCls}-item, ${componentCls}-submenu-title`]: {
- paddingInline: `${fontSize * 2}px ${padding}px`
- }
- }
- },
- // ======================= Sub Menu =======================
- '&-submenu': {
- '&-popup': {
- position: 'absolute',
- zIndex: zIndexPopup,
- background: 'transparent',
- borderRadius: borderRadiusLG,
- boxShadow: 'none',
- transformOrigin: '0 0',
- // https://github.com/ant-design/ant-design/issues/13955
- '&::before': {
- position: 'absolute',
- inset: `${menuPanelMaskInset}px 0 0`,
- zIndex: -1,
- width: '100%',
- height: '100%',
- opacity: 0,
- content: '""'
- }
- },
- // https://github.com/ant-design/ant-design/issues/13955
- '&-placement-rightTop::before': {
- top: 0,
- insetInlineStart: menuPanelMaskInset
- },
- [`> ${componentCls}`]: _extends(_extends(_extends({
- borderRadius: borderRadiusLG
- }, genMenuItemStyle(token)), genSubMenuArrowStyle(token)), {
- [`${componentCls}-item, ${componentCls}-submenu > ${componentCls}-submenu-title`]: {
- borderRadius: radiusSubMenuItem
- },
- [`${componentCls}-submenu-title::after`]: {
- transition: `transform ${motionDurationSlow} ${motionEaseInOut}`
- }
- })
- }
- }), genSubMenuArrowStyle(token)), {
- [`&-inline-collapsed ${componentCls}-submenu-arrow,
- &-inline ${componentCls}-submenu-arrow`]: {
- // ↓
- '&::before': {
- transform: `rotate(-45deg) translateX(${menuArrowOffset})`
- },
- '&::after': {
- transform: `rotate(45deg) translateX(-${menuArrowOffset})`
- }
- },
- [`${componentCls}-submenu-open${componentCls}-submenu-inline > ${componentCls}-submenu-title > ${componentCls}-submenu-arrow`]: {
- // ↑
- transform: `translateY(-${menuArrowSize * 0.2}px)`,
- '&::after': {
- transform: `rotate(-45deg) translateX(-${menuArrowOffset})`
- },
- '&::before': {
- transform: `rotate(45deg) translateX(${menuArrowOffset})`
- }
- }
- })
- },
- // Integration with header element so menu items have the same height
- {
- [`${antCls}-layout-header`]: {
- [componentCls]: {
- lineHeight: 'inherit'
- }
- }
- }];
- };
- // ============================== Export ==============================
- export default ((prefixCls, injectStyle) => {
- const useOriginHook = genComponentStyleHook('Menu', (token, _ref) => {
- let {
- overrideComponentToken
- } = _ref;
- // Dropdown will handle menu style self. We do not need to handle this.
- if ((injectStyle === null || injectStyle === void 0 ? void 0 : injectStyle.value) === false) {
- return [];
- }
- const {
- colorBgElevated,
- colorPrimary,
- colorError,
- colorErrorHover,
- colorTextLightSolid
- } = token;
- const {
- controlHeightLG,
- fontSize
- } = token;
- const menuArrowSize = fontSize / 7 * 5;
- // Menu Token
- const menuToken = mergeToken(token, {
- menuItemHeight: controlHeightLG,
- menuItemPaddingInline: token.margin,
- menuArrowSize,
- menuHorizontalHeight: controlHeightLG * 1.15,
- menuArrowOffset: `${menuArrowSize * 0.25}px`,
- menuPanelMaskInset: -7,
- menuSubMenuBg: colorBgElevated
- });
- const colorTextDark = new TinyColor(colorTextLightSolid).setAlpha(0.65).toRgbString();
- const menuDarkToken = mergeToken(menuToken, {
- colorItemText: colorTextDark,
- colorItemTextHover: colorTextLightSolid,
- colorGroupTitle: colorTextDark,
- colorItemTextSelected: colorTextLightSolid,
- colorItemBg: '#001529',
- colorSubItemBg: '#000c17',
- colorItemBgActive: 'transparent',
- colorItemBgSelected: colorPrimary,
- colorActiveBarWidth: 0,
- colorActiveBarHeight: 0,
- colorActiveBarBorderSize: 0,
- // Disabled
- colorItemTextDisabled: new TinyColor(colorTextLightSolid).setAlpha(0.25).toRgbString(),
- // Danger
- colorDangerItemText: colorError,
- colorDangerItemTextHover: colorErrorHover,
- colorDangerItemTextSelected: colorTextLightSolid,
- colorDangerItemBgActive: colorError,
- colorDangerItemBgSelected: colorError,
- menuSubMenuBg: '#001529',
- // Horizontal
- colorItemTextSelectedHorizontal: colorTextLightSolid,
- colorItemBgSelectedHorizontal: colorPrimary
- }, _extends({}, overrideComponentToken));
- return [
- // Basic
- getBaseStyle(menuToken),
- // Horizontal
- getHorizontalStyle(menuToken),
- // Vertical
- getVerticalStyle(menuToken),
- // Theme
- getThemeStyle(menuToken, 'light'), getThemeStyle(menuDarkToken, 'dark'),
- // RTL
- getRTLStyle(menuToken),
- // Motion
- genCollapseMotion(menuToken), initSlideMotion(menuToken, 'slide-up'), initSlideMotion(menuToken, 'slide-down'), initZoomMotion(menuToken, 'zoom-big')];
- }, token => {
- const {
- colorPrimary,
- colorError,
- colorTextDisabled,
- colorErrorBg,
- colorText,
- colorTextDescription,
- colorBgContainer,
- colorFillAlter,
- colorFillContent,
- lineWidth,
- lineWidthBold,
- controlItemBgActive,
- colorBgTextHover
- } = token;
- return {
- dropdownWidth: 160,
- zIndexPopup: token.zIndexPopupBase + 50,
- radiusItem: token.borderRadiusLG,
- radiusSubMenuItem: token.borderRadiusSM,
- colorItemText: colorText,
- colorItemTextHover: colorText,
- colorItemTextHoverHorizontal: colorPrimary,
- colorGroupTitle: colorTextDescription,
- colorItemTextSelected: colorPrimary,
- colorItemTextSelectedHorizontal: colorPrimary,
- colorItemBg: colorBgContainer,
- colorItemBgHover: colorBgTextHover,
- colorItemBgActive: colorFillContent,
- colorSubItemBg: colorFillAlter,
- colorItemBgSelected: controlItemBgActive,
- colorItemBgSelectedHorizontal: 'transparent',
- colorActiveBarWidth: 0,
- colorActiveBarHeight: lineWidthBold,
- colorActiveBarBorderSize: lineWidth,
- // Disabled
- colorItemTextDisabled: colorTextDisabled,
- // Danger
- colorDangerItemText: colorError,
- colorDangerItemTextHover: colorError,
- colorDangerItemTextSelected: colorError,
- colorDangerItemBgActive: colorErrorBg,
- colorDangerItemBgSelected: colorErrorBg,
- itemMarginInline: token.marginXXS
- };
- });
- return useOriginHook(prefixCls);
- });
|