228 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
			
		
		
	
	
			228 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
| import { TinyColor } from '@ctrl/tinycolor';
 | |
| import type { UploadToken } from '.';
 | |
| import type { GenerateStyle } from '../../theme/internal';
 | |
| import { clearFix, textEllipsis } from '../../style';
 | |
| 
 | |
| const genPictureStyle: GenerateStyle<UploadToken> = token => {
 | |
|   const { componentCls, iconCls, uploadThumbnailSize, uploadProgressOffset } = token;
 | |
|   const listCls = `${componentCls}-list`;
 | |
|   const itemCls = `${listCls}-item`;
 | |
| 
 | |
|   return {
 | |
|     [`${componentCls}-wrapper`]: {
 | |
|       // ${listCls} åĸå äŧå
įē§
 | |
|       [`${listCls}${listCls}-picture, ${listCls}${listCls}-picture-card`]: {
 | |
|         [itemCls]: {
 | |
|           position: 'relative',
 | |
|           height: uploadThumbnailSize + token.lineWidth * 2 + token.paddingXS * 2,
 | |
|           padding: token.paddingXS,
 | |
|           border: `${token.lineWidth}px ${token.lineType} ${token.colorBorder}`,
 | |
|           borderRadius: token.borderRadiusLG,
 | |
| 
 | |
|           '&:hover': {
 | |
|             background: 'transparent',
 | |
|           },
 | |
| 
 | |
|           [`${itemCls}-thumbnail`]: {
 | |
|             ...textEllipsis,
 | |
|             width: uploadThumbnailSize,
 | |
|             height: uploadThumbnailSize,
 | |
|             lineHeight: `${uploadThumbnailSize + token.paddingSM}px`,
 | |
|             textAlign: 'center',
 | |
|             flex: 'none',
 | |
| 
 | |
|             [iconCls]: {
 | |
|               fontSize: token.fontSizeHeading2,
 | |
|               color: token.colorPrimary,
 | |
|             },
 | |
| 
 | |
|             img: {
 | |
|               display: 'block',
 | |
|               width: '100%',
 | |
|               height: '100%',
 | |
|               overflow: 'hidden',
 | |
|             },
 | |
|           },
 | |
| 
 | |
|           [`${itemCls}-progress`]: {
 | |
|             bottom: uploadProgressOffset,
 | |
|             width: `calc(100% - ${token.paddingSM * 2}px)`,
 | |
|             marginTop: 0,
 | |
|             paddingInlineStart: uploadThumbnailSize + token.paddingXS,
 | |
|           },
 | |
|         },
 | |
| 
 | |
|         [`${itemCls}-error`]: {
 | |
|           borderColor: token.colorError,
 | |
| 
 | |
|           // Adjust the color of the error icon : https://github.com/ant-design/ant-design/pull/24160
 | |
|           [`${itemCls}-thumbnail ${iconCls}`]: {
 | |
|             [`svg path[fill='#e6f7ff']`]: {
 | |
|               fill: token.colorErrorBg,
 | |
|             },
 | |
|             [`svg path[fill='#1890ff']`]: {
 | |
|               fill: token.colorError,
 | |
|             },
 | |
|           },
 | |
|         },
 | |
| 
 | |
|         [`${itemCls}-uploading`]: {
 | |
|           borderStyle: 'dashed',
 | |
| 
 | |
|           [`${itemCls}-name`]: {
 | |
|             marginBottom: uploadProgressOffset,
 | |
|           },
 | |
|         },
 | |
|       },
 | |
|     },
 | |
|   };
 | |
| };
 | |
| 
 | |
| const genPictureCardStyle: GenerateStyle<UploadToken> = token => {
 | |
|   const { componentCls, iconCls, fontSizeLG, colorTextLightSolid } = token;
 | |
| 
 | |
|   const listCls = `${componentCls}-list`;
 | |
|   const itemCls = `${listCls}-item`;
 | |
| 
 | |
|   const uploadPictureCardSize = token.uploadPicCardSize;
 | |
| 
 | |
|   return {
 | |
|     [`${componentCls}-wrapper${componentCls}-picture-card-wrapper`]: {
 | |
|       ...clearFix(),
 | |
|       display: 'inline-block',
 | |
|       width: '100%',
 | |
| 
 | |
|       [`${componentCls}${componentCls}-select`]: {
 | |
|         width: uploadPictureCardSize,
 | |
|         height: uploadPictureCardSize,
 | |
|         marginInlineEnd: token.marginXS,
 | |
|         marginBottom: token.marginXS,
 | |
|         textAlign: 'center',
 | |
|         verticalAlign: 'top',
 | |
|         backgroundColor: token.colorFillAlter,
 | |
|         border: `${token.lineWidth}px dashed ${token.colorBorder}`,
 | |
|         borderRadius: token.borderRadiusLG,
 | |
|         cursor: 'pointer',
 | |
|         transition: `border-color ${token.motionDurationSlow}`,
 | |
| 
 | |
|         [`> ${componentCls}`]: {
 | |
|           display: 'flex',
 | |
|           alignItems: 'center',
 | |
|           justifyContent: 'center',
 | |
|           height: '100%',
 | |
|           textAlign: 'center',
 | |
|         },
 | |
| 
 | |
|         [`&:not(${componentCls}-disabled):hover`]: {
 | |
|           borderColor: token.colorPrimary,
 | |
|         },
 | |
|       },
 | |
| 
 | |
|       // list
 | |
|       [`${listCls}${listCls}-picture-card`]: {
 | |
|         [`${listCls}-item-container`]: {
 | |
|           display: 'inline-block',
 | |
|           width: uploadPictureCardSize,
 | |
|           height: uploadPictureCardSize,
 | |
|           marginBlock: `0 ${token.marginXS}px`,
 | |
|           marginInline: `0 ${token.marginXS}px`,
 | |
|           verticalAlign: 'top',
 | |
|         },
 | |
| 
 | |
|         '&::after': {
 | |
|           display: 'none',
 | |
|         },
 | |
| 
 | |
|         [itemCls]: {
 | |
|           height: '100%',
 | |
|           margin: 0,
 | |
| 
 | |
|           '&::before': {
 | |
|             position: 'absolute',
 | |
|             zIndex: 1,
 | |
|             width: `calc(100% - ${token.paddingXS * 2}px)`,
 | |
|             height: `calc(100% - ${token.paddingXS * 2}px)`,
 | |
|             backgroundColor: token.colorBgMask,
 | |
|             opacity: 0,
 | |
|             transition: `all ${token.motionDurationSlow}`,
 | |
|             content: '" "',
 | |
|           },
 | |
|         },
 | |
| 
 | |
|         [`${itemCls}:hover`]: {
 | |
|           [`&::before, ${itemCls}-actions`]: {
 | |
|             opacity: 1,
 | |
|           },
 | |
|         },
 | |
| 
 | |
|         [`${itemCls}-actions`]: {
 | |
|           position: 'absolute',
 | |
|           insetInlineStart: 0,
 | |
|           zIndex: 10,
 | |
|           width: '100%',
 | |
|           whiteSpace: 'nowrap',
 | |
|           textAlign: 'center',
 | |
|           opacity: 0,
 | |
|           transition: `all ${token.motionDurationSlow}`,
 | |
| 
 | |
|           [`${iconCls}-eye, ${iconCls}-download, ${iconCls}-delete`]: {
 | |
|             zIndex: 10,
 | |
|             width: fontSizeLG,
 | |
|             margin: `0 ${token.marginXXS}px`,
 | |
|             fontSize: fontSizeLG,
 | |
|             cursor: 'pointer',
 | |
|             transition: `all ${token.motionDurationSlow}`,
 | |
|           },
 | |
|         },
 | |
| 
 | |
|         [`${itemCls}-actions, ${itemCls}-actions:hover`]: {
 | |
|           [`${iconCls}-eye, ${iconCls}-download, ${iconCls}-delete`]: {
 | |
|             color: new TinyColor(colorTextLightSolid).setAlpha(0.65).toRgbString(),
 | |
|             '&:hover': {
 | |
|               color: colorTextLightSolid,
 | |
|             },
 | |
|           },
 | |
|         },
 | |
| 
 | |
|         [`${itemCls}-thumbnail, ${itemCls}-thumbnail img`]: {
 | |
|           position: 'static',
 | |
|           display: 'block',
 | |
|           width: '100%',
 | |
|           height: '100%',
 | |
|           objectFit: 'contain',
 | |
|         },
 | |
| 
 | |
|         [`${itemCls}-name`]: {
 | |
|           display: 'none',
 | |
|           textAlign: 'center',
 | |
|         },
 | |
| 
 | |
|         [`${itemCls}-file + ${itemCls}-name`]: {
 | |
|           position: 'absolute',
 | |
|           bottom: token.margin,
 | |
|           display: 'block',
 | |
|           width: `calc(100% - ${token.paddingXS * 2}px)`,
 | |
|         },
 | |
| 
 | |
|         [`${itemCls}-uploading`]: {
 | |
|           [`&${itemCls}`]: {
 | |
|             backgroundColor: token.colorFillAlter,
 | |
|           },
 | |
| 
 | |
|           [`&::before, ${iconCls}-eye, ${iconCls}-download, ${iconCls}-delete`]: {
 | |
|             display: 'none',
 | |
|           },
 | |
|         },
 | |
| 
 | |
|         [`${itemCls}-progress`]: {
 | |
|           bottom: token.marginXL,
 | |
|           width: `calc(100% - ${token.paddingXS * 2}px)`,
 | |
|           paddingInlineStart: 0,
 | |
|         },
 | |
|       },
 | |
|     },
 | |
|   };
 | |
| };
 | |
| 
 | |
| export { genPictureStyle, genPictureCardStyle };
 |