index.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = void 0;
  7. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  8. var _cssinjs = require("../../_util/cssinjs");
  9. var _internal = require("../../theme/internal");
  10. const skeletonClsLoading = new _cssinjs.Keyframes(`ant-skeleton-loading`, {
  11. '0%': {
  12. transform: 'translateX(-37.5%)'
  13. },
  14. '100%': {
  15. transform: 'translateX(37.5%)'
  16. }
  17. });
  18. const genSkeletonElementCommonSize = size => ({
  19. height: size,
  20. lineHeight: `${size}px`
  21. });
  22. const genSkeletonElementAvatarSize = size => (0, _extends2.default)({
  23. width: size
  24. }, genSkeletonElementCommonSize(size));
  25. const genSkeletonColor = token => ({
  26. position: 'relative',
  27. // fix https://github.com/ant-design/ant-design/issues/36444
  28. // https://monshin.github.io/202109/css/safari-border-radius-overflow-hidden/
  29. /* stylelint-disable-next-line property-no-vendor-prefix,value-no-vendor-prefix */
  30. zIndex: 0,
  31. overflow: 'hidden',
  32. background: 'transparent',
  33. '&::after': {
  34. position: 'absolute',
  35. top: 0,
  36. insetInlineEnd: '-150%',
  37. bottom: 0,
  38. insetInlineStart: '-150%',
  39. background: token.skeletonLoadingBackground,
  40. animationName: skeletonClsLoading,
  41. animationDuration: token.skeletonLoadingMotionDuration,
  42. animationTimingFunction: 'ease',
  43. animationIterationCount: 'infinite',
  44. content: '""'
  45. }
  46. });
  47. const genSkeletonElementInputSize = size => (0, _extends2.default)({
  48. width: size * 5,
  49. minWidth: size * 5
  50. }, genSkeletonElementCommonSize(size));
  51. const genSkeletonElementAvatar = token => {
  52. const {
  53. skeletonAvatarCls,
  54. color,
  55. controlHeight,
  56. controlHeightLG,
  57. controlHeightSM
  58. } = token;
  59. return {
  60. [`${skeletonAvatarCls}`]: (0, _extends2.default)({
  61. display: 'inline-block',
  62. verticalAlign: 'top',
  63. background: color
  64. }, genSkeletonElementAvatarSize(controlHeight)),
  65. [`${skeletonAvatarCls}${skeletonAvatarCls}-circle`]: {
  66. borderRadius: '50%'
  67. },
  68. [`${skeletonAvatarCls}${skeletonAvatarCls}-lg`]: (0, _extends2.default)({}, genSkeletonElementAvatarSize(controlHeightLG)),
  69. [`${skeletonAvatarCls}${skeletonAvatarCls}-sm`]: (0, _extends2.default)({}, genSkeletonElementAvatarSize(controlHeightSM))
  70. };
  71. };
  72. const genSkeletonElementInput = token => {
  73. const {
  74. controlHeight,
  75. borderRadiusSM,
  76. skeletonInputCls,
  77. controlHeightLG,
  78. controlHeightSM,
  79. color
  80. } = token;
  81. return {
  82. [`${skeletonInputCls}`]: (0, _extends2.default)({
  83. display: 'inline-block',
  84. verticalAlign: 'top',
  85. background: color,
  86. borderRadius: borderRadiusSM
  87. }, genSkeletonElementInputSize(controlHeight)),
  88. [`${skeletonInputCls}-lg`]: (0, _extends2.default)({}, genSkeletonElementInputSize(controlHeightLG)),
  89. [`${skeletonInputCls}-sm`]: (0, _extends2.default)({}, genSkeletonElementInputSize(controlHeightSM))
  90. };
  91. };
  92. const genSkeletonElementImageSize = size => (0, _extends2.default)({
  93. width: size
  94. }, genSkeletonElementCommonSize(size));
  95. const genSkeletonElementImage = token => {
  96. const {
  97. skeletonImageCls,
  98. imageSizeBase,
  99. color,
  100. borderRadiusSM
  101. } = token;
  102. return {
  103. [`${skeletonImageCls}`]: (0, _extends2.default)((0, _extends2.default)({
  104. display: 'flex',
  105. alignItems: 'center',
  106. justifyContent: 'center',
  107. verticalAlign: 'top',
  108. background: color,
  109. borderRadius: borderRadiusSM
  110. }, genSkeletonElementImageSize(imageSizeBase * 2)), {
  111. [`${skeletonImageCls}-path`]: {
  112. fill: '#bfbfbf'
  113. },
  114. [`${skeletonImageCls}-svg`]: (0, _extends2.default)((0, _extends2.default)({}, genSkeletonElementImageSize(imageSizeBase)), {
  115. maxWidth: imageSizeBase * 4,
  116. maxHeight: imageSizeBase * 4
  117. }),
  118. [`${skeletonImageCls}-svg${skeletonImageCls}-svg-circle`]: {
  119. borderRadius: '50%'
  120. }
  121. }),
  122. [`${skeletonImageCls}${skeletonImageCls}-circle`]: {
  123. borderRadius: '50%'
  124. }
  125. };
  126. };
  127. const genSkeletonElementButtonShape = (token, size, buttonCls) => {
  128. const {
  129. skeletonButtonCls
  130. } = token;
  131. return {
  132. [`${buttonCls}${skeletonButtonCls}-circle`]: {
  133. width: size,
  134. minWidth: size,
  135. borderRadius: '50%'
  136. },
  137. [`${buttonCls}${skeletonButtonCls}-round`]: {
  138. borderRadius: size
  139. }
  140. };
  141. };
  142. const genSkeletonElementButtonSize = size => (0, _extends2.default)({
  143. width: size * 2,
  144. minWidth: size * 2
  145. }, genSkeletonElementCommonSize(size));
  146. const genSkeletonElementButton = token => {
  147. const {
  148. borderRadiusSM,
  149. skeletonButtonCls,
  150. controlHeight,
  151. controlHeightLG,
  152. controlHeightSM,
  153. color
  154. } = token;
  155. return (0, _extends2.default)((0, _extends2.default)((0, _extends2.default)((0, _extends2.default)((0, _extends2.default)({
  156. [`${skeletonButtonCls}`]: (0, _extends2.default)({
  157. display: 'inline-block',
  158. verticalAlign: 'top',
  159. background: color,
  160. borderRadius: borderRadiusSM,
  161. width: controlHeight * 2,
  162. minWidth: controlHeight * 2
  163. }, genSkeletonElementButtonSize(controlHeight))
  164. }, genSkeletonElementButtonShape(token, controlHeight, skeletonButtonCls)), {
  165. [`${skeletonButtonCls}-lg`]: (0, _extends2.default)({}, genSkeletonElementButtonSize(controlHeightLG))
  166. }), genSkeletonElementButtonShape(token, controlHeightLG, `${skeletonButtonCls}-lg`)), {
  167. [`${skeletonButtonCls}-sm`]: (0, _extends2.default)({}, genSkeletonElementButtonSize(controlHeightSM))
  168. }), genSkeletonElementButtonShape(token, controlHeightSM, `${skeletonButtonCls}-sm`));
  169. };
  170. // =============================== Base ===============================
  171. const genBaseStyle = token => {
  172. const {
  173. componentCls,
  174. skeletonAvatarCls,
  175. skeletonTitleCls,
  176. skeletonParagraphCls,
  177. skeletonButtonCls,
  178. skeletonInputCls,
  179. skeletonImageCls,
  180. controlHeight,
  181. controlHeightLG,
  182. controlHeightSM,
  183. color,
  184. padding,
  185. marginSM,
  186. borderRadius,
  187. skeletonTitleHeight,
  188. skeletonBlockRadius,
  189. skeletonParagraphLineHeight,
  190. controlHeightXS,
  191. skeletonParagraphMarginTop
  192. } = token;
  193. return {
  194. [`${componentCls}`]: {
  195. display: 'table',
  196. width: '100%',
  197. [`${componentCls}-header`]: {
  198. display: 'table-cell',
  199. paddingInlineEnd: padding,
  200. verticalAlign: 'top',
  201. // Avatar
  202. [`${skeletonAvatarCls}`]: (0, _extends2.default)({
  203. display: 'inline-block',
  204. verticalAlign: 'top',
  205. background: color
  206. }, genSkeletonElementAvatarSize(controlHeight)),
  207. [`${skeletonAvatarCls}-circle`]: {
  208. borderRadius: '50%'
  209. },
  210. [`${skeletonAvatarCls}-lg`]: (0, _extends2.default)({}, genSkeletonElementAvatarSize(controlHeightLG)),
  211. [`${skeletonAvatarCls}-sm`]: (0, _extends2.default)({}, genSkeletonElementAvatarSize(controlHeightSM))
  212. },
  213. [`${componentCls}-content`]: {
  214. display: 'table-cell',
  215. width: '100%',
  216. verticalAlign: 'top',
  217. // Title
  218. [`${skeletonTitleCls}`]: {
  219. width: '100%',
  220. height: skeletonTitleHeight,
  221. background: color,
  222. borderRadius: skeletonBlockRadius,
  223. [`+ ${skeletonParagraphCls}`]: {
  224. marginBlockStart: controlHeightSM
  225. }
  226. },
  227. // paragraph
  228. [`${skeletonParagraphCls}`]: {
  229. padding: 0,
  230. '> li': {
  231. width: '100%',
  232. height: skeletonParagraphLineHeight,
  233. listStyle: 'none',
  234. background: color,
  235. borderRadius: skeletonBlockRadius,
  236. '+ li': {
  237. marginBlockStart: controlHeightXS
  238. }
  239. }
  240. },
  241. [`${skeletonParagraphCls}> li:last-child:not(:first-child):not(:nth-child(2))`]: {
  242. width: '61%'
  243. }
  244. },
  245. [`&-round ${componentCls}-content`]: {
  246. [`${skeletonTitleCls}, ${skeletonParagraphCls} > li`]: {
  247. borderRadius
  248. }
  249. }
  250. },
  251. [`${componentCls}-with-avatar ${componentCls}-content`]: {
  252. // Title
  253. [`${skeletonTitleCls}`]: {
  254. marginBlockStart: marginSM,
  255. [`+ ${skeletonParagraphCls}`]: {
  256. marginBlockStart: skeletonParagraphMarginTop
  257. }
  258. }
  259. },
  260. // Skeleton element
  261. [`${componentCls}${componentCls}-element`]: (0, _extends2.default)((0, _extends2.default)((0, _extends2.default)((0, _extends2.default)({
  262. display: 'inline-block',
  263. width: 'auto'
  264. }, genSkeletonElementButton(token)), genSkeletonElementAvatar(token)), genSkeletonElementInput(token)), genSkeletonElementImage(token)),
  265. // Skeleton Block Button, Input
  266. [`${componentCls}${componentCls}-block`]: {
  267. width: '100%',
  268. [`${skeletonButtonCls}`]: {
  269. width: '100%'
  270. },
  271. [`${skeletonInputCls}`]: {
  272. width: '100%'
  273. }
  274. },
  275. // With active animation
  276. [`${componentCls}${componentCls}-active`]: {
  277. [`
  278. ${skeletonTitleCls},
  279. ${skeletonParagraphCls} > li,
  280. ${skeletonAvatarCls},
  281. ${skeletonButtonCls},
  282. ${skeletonInputCls},
  283. ${skeletonImageCls}
  284. `]: (0, _extends2.default)({}, genSkeletonColor(token))
  285. }
  286. };
  287. };
  288. // ============================== Export ==============================
  289. var _default = exports.default = (0, _internal.genComponentStyleHook)('Skeleton', token => {
  290. const {
  291. componentCls
  292. } = token;
  293. const skeletonToken = (0, _internal.mergeToken)(token, {
  294. skeletonAvatarCls: `${componentCls}-avatar`,
  295. skeletonTitleCls: `${componentCls}-title`,
  296. skeletonParagraphCls: `${componentCls}-paragraph`,
  297. skeletonButtonCls: `${componentCls}-button`,
  298. skeletonInputCls: `${componentCls}-input`,
  299. skeletonImageCls: `${componentCls}-image`,
  300. imageSizeBase: token.controlHeight * 1.5,
  301. skeletonTitleHeight: token.controlHeight / 2,
  302. skeletonBlockRadius: token.borderRadiusSM,
  303. skeletonParagraphLineHeight: token.controlHeight / 2,
  304. skeletonParagraphMarginTop: token.marginLG + token.marginXXS,
  305. borderRadius: 100,
  306. skeletonLoadingBackground: `linear-gradient(90deg, ${token.color} 25%, ${token.colorGradientEnd} 37%, ${token.color} 63%)`,
  307. skeletonLoadingMotionDuration: '1.4s'
  308. });
  309. return [genBaseStyle(skeletonToken)];
  310. }, token => {
  311. const {
  312. colorFillContent,
  313. colorFill
  314. } = token;
  315. return {
  316. color: colorFillContent,
  317. colorGradientEnd: colorFill
  318. };
  319. });