Skeleton.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. import _extends from "@babel/runtime/helpers/esm/extends";
  2. import { createVNode as _createVNode } from "vue";
  3. import { defineComponent } from 'vue';
  4. import classNames from '../_util/classNames';
  5. import { initDefaultProps } from '../_util/props-util';
  6. import Title from './Title';
  7. import Paragraph from './Paragraph';
  8. import useConfigInject from '../config-provider/hooks/useConfigInject';
  9. import Element from './Element';
  10. import useStyle from './style';
  11. export const skeletonProps = () => ({
  12. active: {
  13. type: Boolean,
  14. default: undefined
  15. },
  16. loading: {
  17. type: Boolean,
  18. default: undefined
  19. },
  20. prefixCls: String,
  21. avatar: {
  22. type: [Boolean, Object],
  23. default: undefined
  24. },
  25. title: {
  26. type: [Boolean, Object],
  27. default: undefined
  28. },
  29. paragraph: {
  30. type: [Boolean, Object],
  31. default: undefined
  32. },
  33. round: {
  34. type: Boolean,
  35. default: undefined
  36. }
  37. });
  38. function getComponentProps(prop) {
  39. if (prop && typeof prop === 'object') {
  40. return prop;
  41. }
  42. return {};
  43. }
  44. function getAvatarBasicProps(hasTitle, hasParagraph) {
  45. if (hasTitle && !hasParagraph) {
  46. // Square avatar
  47. return {
  48. size: 'large',
  49. shape: 'square'
  50. };
  51. }
  52. return {
  53. size: 'large',
  54. shape: 'circle'
  55. };
  56. }
  57. function getTitleBasicProps(hasAvatar, hasParagraph) {
  58. if (!hasAvatar && hasParagraph) {
  59. return {
  60. width: '38%'
  61. };
  62. }
  63. if (hasAvatar && hasParagraph) {
  64. return {
  65. width: '50%'
  66. };
  67. }
  68. return {};
  69. }
  70. function getParagraphBasicProps(hasAvatar, hasTitle) {
  71. const basicProps = {};
  72. // Width
  73. if (!hasAvatar || !hasTitle) {
  74. basicProps.width = '61%';
  75. }
  76. // Rows
  77. if (!hasAvatar && hasTitle) {
  78. basicProps.rows = 3;
  79. } else {
  80. basicProps.rows = 2;
  81. }
  82. return basicProps;
  83. }
  84. const Skeleton = defineComponent({
  85. compatConfig: {
  86. MODE: 3
  87. },
  88. name: 'ASkeleton',
  89. props: initDefaultProps(skeletonProps(), {
  90. avatar: false,
  91. title: true,
  92. paragraph: true
  93. }),
  94. setup(props, _ref) {
  95. let {
  96. slots
  97. } = _ref;
  98. const {
  99. prefixCls,
  100. direction
  101. } = useConfigInject('skeleton', props);
  102. const [wrapSSR, hashId] = useStyle(prefixCls);
  103. return () => {
  104. var _a;
  105. const {
  106. loading,
  107. avatar,
  108. title,
  109. paragraph,
  110. active,
  111. round
  112. } = props;
  113. const pre = prefixCls.value;
  114. if (loading || props.loading === undefined) {
  115. const hasAvatar = !!avatar || avatar === '';
  116. const hasTitle = !!title || title === '';
  117. const hasParagraph = !!paragraph || paragraph === '';
  118. // Avatar
  119. let avatarNode;
  120. if (hasAvatar) {
  121. const avatarProps = _extends(_extends({
  122. prefixCls: `${pre}-avatar`
  123. }, getAvatarBasicProps(hasTitle, hasParagraph)), getComponentProps(avatar));
  124. avatarNode = _createVNode("div", {
  125. "class": `${pre}-header`
  126. }, [_createVNode(Element, avatarProps, null)]);
  127. }
  128. let contentNode;
  129. if (hasTitle || hasParagraph) {
  130. // Title
  131. let $title;
  132. if (hasTitle) {
  133. const titleProps = _extends(_extends({
  134. prefixCls: `${pre}-title`
  135. }, getTitleBasicProps(hasAvatar, hasParagraph)), getComponentProps(title));
  136. $title = _createVNode(Title, titleProps, null);
  137. }
  138. // Paragraph
  139. let paragraphNode;
  140. if (hasParagraph) {
  141. const paragraphProps = _extends(_extends({
  142. prefixCls: `${pre}-paragraph`
  143. }, getParagraphBasicProps(hasAvatar, hasTitle)), getComponentProps(paragraph));
  144. paragraphNode = _createVNode(Paragraph, paragraphProps, null);
  145. }
  146. contentNode = _createVNode("div", {
  147. "class": `${pre}-content`
  148. }, [$title, paragraphNode]);
  149. }
  150. const cls = classNames(pre, {
  151. [`${pre}-with-avatar`]: hasAvatar,
  152. [`${pre}-active`]: active,
  153. [`${pre}-rtl`]: direction.value === 'rtl',
  154. [`${pre}-round`]: round,
  155. [hashId.value]: true
  156. });
  157. return wrapSSR(_createVNode("div", {
  158. "class": cls
  159. }, [avatarNode, contentNode]));
  160. }
  161. return (_a = slots.default) === null || _a === void 0 ? void 0 : _a.call(slots);
  162. };
  163. }
  164. });
  165. export default Skeleton;