232 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
			
		
		
	
	
			232 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
| import type { CSSObject } from '../../_util/cssinjs';
 | |
| import { textEllipsis } from '../../style';
 | |
| import type { MenuToken } from '.';
 | |
| import type { GenerateStyle } from '../../theme/internal';
 | |
| 
 | |
| const getVerticalInlineStyle: GenerateStyle<MenuToken, CSSObject> = token => {
 | |
|   const {
 | |
|     componentCls,
 | |
|     menuItemHeight,
 | |
|     itemMarginInline,
 | |
|     padding,
 | |
|     menuArrowSize,
 | |
|     marginXS,
 | |
|     marginXXS,
 | |
|   } = token;
 | |
| 
 | |
|   const paddingWithArrow = padding + menuArrowSize + marginXS;
 | |
| 
 | |
|   return {
 | |
|     [`${componentCls}-item`]: {
 | |
|       position: 'relative',
 | |
|     },
 | |
| 
 | |
|     [`${componentCls}-item, ${componentCls}-submenu-title`]: {
 | |
|       height: menuItemHeight,
 | |
|       lineHeight: `${menuItemHeight}px`,
 | |
|       paddingInline: padding,
 | |
|       overflow: 'hidden',
 | |
|       textOverflow: 'ellipsis',
 | |
| 
 | |
|       marginInline: itemMarginInline,
 | |
|       marginBlock: marginXXS,
 | |
|       width: `calc(100% - ${itemMarginInline * 2}px)`,
 | |
|     },
 | |
| 
 | |
|     // disable margin collapsed
 | |
|     [`${componentCls}-submenu`]: {
 | |
|       paddingBottom: 0.02,
 | |
|     },
 | |
| 
 | |
|     [`> ${componentCls}-item,
 | |
|             > ${componentCls}-submenu > ${componentCls}-submenu-title`]: {
 | |
|       height: menuItemHeight,
 | |
|       lineHeight: `${menuItemHeight}px`,
 | |
|     },
 | |
| 
 | |
|     [`${componentCls}-item-group-list ${componentCls}-submenu-title,
 | |
|             ${componentCls}-submenu-title`]: {
 | |
|       paddingInlineEnd: paddingWithArrow,
 | |
|     },
 | |
|   };
 | |
| };
 | |
| 
 | |
| const getVerticalStyle: GenerateStyle<MenuToken> = token => {
 | |
|   const {
 | |
|     componentCls,
 | |
|     iconCls,
 | |
|     menuItemHeight,
 | |
|     colorTextLightSolid,
 | |
|     dropdownWidth,
 | |
|     controlHeightLG,
 | |
|     motionDurationMid,
 | |
|     motionEaseOut,
 | |
|     paddingXL,
 | |
|     fontSizeSM,
 | |
|     fontSizeLG,
 | |
|     motionDurationSlow,
 | |
|     paddingXS,
 | |
|     boxShadowSecondary,
 | |
|   } = token;
 | |
| 
 | |
|   const inlineItemStyle: CSSObject = {
 | |
|     height: menuItemHeight,
 | |
|     lineHeight: `${menuItemHeight}px`,
 | |
|     listStylePosition: 'inside',
 | |
|     listStyleType: 'disc',
 | |
|   };
 | |
| 
 | |
|   return [
 | |
|     {
 | |
|       [componentCls]: {
 | |
|         [`&-inline, &-vertical`]: {
 | |
|           [`&${componentCls}-root`]: {
 | |
|             boxShadow: 'none',
 | |
|           },
 | |
| 
 | |
|           ...getVerticalInlineStyle(token),
 | |
|         },
 | |
|       },
 | |
| 
 | |
|       [`${componentCls}-submenu-popup`]: {
 | |
|         [`${componentCls}-vertical`]: {
 | |
|           ...getVerticalInlineStyle(token),
 | |
|           boxShadow: boxShadowSecondary,
 | |
|         },
 | |
|       },
 | |
|     },
 | |
| 
 | |
|     // Vertical only
 | |
|     {
 | |
|       [`${componentCls}-submenu-popup ${componentCls}-vertical${componentCls}-sub`]: {
 | |
|         minWidth: dropdownWidth,
 | |
|         maxHeight: `calc(100vh - ${controlHeightLG * 2.5}px)`,
 | |
|         padding: '0',
 | |
|         overflow: 'hidden',
 | |
|         borderInlineEnd: 0,
 | |
| 
 | |
|         // https://github.com/ant-design/ant-design/issues/22244
 | |
|         // https://github.com/ant-design/ant-design/issues/26812
 | |
|         "&:not([class*='-active'])": {
 | |
|           overflowX: 'hidden',
 | |
|           overflowY: 'auto',
 | |
|         },
 | |
|       },
 | |
|     },
 | |
| 
 | |
|     // Inline Only
 | |
|     {
 | |
|       [`${componentCls}-inline`]: {
 | |
|         width: '100%',
 | |
| 
 | |
|         // Motion enhance for first level
 | |
|         [`&${componentCls}-root`]: {
 | |
|           [`${componentCls}-item, ${componentCls}-submenu-title`]: {
 | |
|             display: 'flex',
 | |
|             alignItems: 'center',
 | |
|             transition: [
 | |
|               `border-color ${motionDurationSlow}`,
 | |
|               `background ${motionDurationSlow}`,
 | |
|               `padding ${motionDurationMid} ${motionEaseOut}`,
 | |
|             ].join(','),
 | |
| 
 | |
|             [`> ${componentCls}-title-content`]: {
 | |
|               flex: 'auto',
 | |
|               minWidth: 0,
 | |
|               overflow: 'hidden',
 | |
|               textOverflow: 'ellipsis',
 | |
|             },
 | |
| 
 | |
|             '> *': {
 | |
|               flex: 'none',
 | |
|             },
 | |
|           },
 | |
|         },
 | |
| 
 | |
|         // >>>>> Sub
 | |
|         [`${componentCls}-sub${componentCls}-inline`]: {
 | |
|           padding: 0,
 | |
|           border: 0,
 | |
|           borderRadius: 0,
 | |
|           boxShadow: 'none',
 | |
| 
 | |
|           [`& > ${componentCls}-submenu > ${componentCls}-submenu-title`]: inlineItemStyle,
 | |
| 
 | |
|           [`& ${componentCls}-item-group-title`]: {
 | |
|             paddingInlineStart: paddingXL,
 | |
|           },
 | |
|         },
 | |
| 
 | |
|         // >>>>> Item
 | |
|         [`${componentCls}-item`]: inlineItemStyle,
 | |
|       },
 | |
|     },
 | |
| 
 | |
|     // Inline Collapse Only
 | |
|     {
 | |
|       [`${componentCls}-inline-collapsed`]: {
 | |
|         width: menuItemHeight * 2,
 | |
| 
 | |
|         [`&${componentCls}-root`]: {
 | |
|           [`${componentCls}-item, ${componentCls}-submenu ${componentCls}-submenu-title`]: {
 | |
|             [`> ${componentCls}-inline-collapsed-noicon`]: {
 | |
|               fontSize: fontSizeLG,
 | |
|               textAlign: 'center',
 | |
|             },
 | |
|           },
 | |
|         },
 | |
| 
 | |
|         [`> ${componentCls}-item,
 | |
|           > ${componentCls}-item-group > ${componentCls}-item-group-list > ${componentCls}-item,
 | |
|           > ${componentCls}-item-group > ${componentCls}-item-group-list > ${componentCls}-submenu > ${componentCls}-submenu-title,
 | |
|           > ${componentCls}-submenu > ${componentCls}-submenu-title`]: {
 | |
|           insetInlineStart: 0,
 | |
|           paddingInline: `calc(50% - ${fontSizeSM}px)`,
 | |
|           textOverflow: 'clip',
 | |
| 
 | |
|           [`
 | |
|             ${componentCls}-submenu-arrow,
 | |
|             ${componentCls}-submenu-expand-icon
 | |
|           `]: {
 | |
|             opacity: 0,
 | |
|           },
 | |
| 
 | |
|           [`${componentCls}-item-icon, ${iconCls}`]: {
 | |
|             margin: 0,
 | |
|             fontSize: fontSizeLG,
 | |
|             lineHeight: `${menuItemHeight}px`,
 | |
| 
 | |
|             '+ span': {
 | |
|               display: 'inline-block',
 | |
|               opacity: 0,
 | |
|             },
 | |
|           },
 | |
|         },
 | |
| 
 | |
|         [`${componentCls}-item-icon, ${iconCls}`]: {
 | |
|           display: 'inline-block',
 | |
|         },
 | |
| 
 | |
|         '&-tooltip': {
 | |
|           pointerEvents: 'none',
 | |
| 
 | |
|           [`${componentCls}-item-icon, ${iconCls}`]: {
 | |
|             display: 'none',
 | |
|           },
 | |
| 
 | |
|           'a, a:hover': {
 | |
|             color: colorTextLightSolid,
 | |
|           },
 | |
|         },
 | |
| 
 | |
|         [`${componentCls}-item-group-title`]: {
 | |
|           ...textEllipsis,
 | |
|           paddingInline: paddingXS,
 | |
|         },
 | |
|       },
 | |
|     },
 | |
|   ];
 | |
| };
 | |
| 
 | |
| export default getVerticalStyle;
 |