Result.vue 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. <template>
  2. <FlexCol center>
  3. <Icon v-if="icon" :size="themeVars.ResultIconSize" :icon="icon" />
  4. <Icon v-else :size="themeVars.ResultIconSize" :icon="defaultIconByStatus" :color="defaultIconColor" />
  5. <Height :size="themeVars.ResultTitleMarginTop" />
  6. <Text
  7. :fontSize="themeVars.ResultTitleFontSize"
  8. :color="themeVars.ResultTitleColor"
  9. :bold="themeVars.ResultTitleBold"
  10. align="center"
  11. :text="title"
  12. />
  13. <Height :size="themeVars.ResultDescriptionMarginTop" />
  14. <Text
  15. :fontSize="themeVars.ResultDescriptionFontSize"
  16. :color="themeVars.ResultDescriptionColor"
  17. :bold="themeVars.ResultDescriptionBold"
  18. align="center"
  19. :text="description"
  20. />
  21. <slot />
  22. </FlexCol>
  23. </template>
  24. <script setup lang="ts">
  25. import { computed } from 'vue';
  26. import Icon from '../basic/Icon.vue';
  27. import Text from '../basic/Text.vue';
  28. import FlexCol from '../layout/FlexCol.vue';
  29. import Height from '../layout/space/Height.vue';
  30. import { useTheme } from '../theme/ThemeDefine';
  31. export interface ResultProps {
  32. /**
  33. * 标题
  34. */
  35. title?: string,
  36. /**
  37. * 描述
  38. */
  39. description?: string,
  40. /**
  41. * 标题
  42. */
  43. icon?: string,
  44. /**
  45. * 状态类型
  46. */
  47. status?: 'success' | 'error' | 'info' | 'waiting' | 'warning';
  48. }
  49. const props = withDefaults(defineProps<ResultProps>(), {
  50. status: 'info',
  51. })
  52. const themeContext = useTheme();
  53. const defaultIconByStatus = computed(() => {
  54. switch (props.status) {
  55. default:
  56. case 'info': return themeContext.getVar('ResultIconInfo', 'prompt-filling');
  57. case 'success': return themeContext.getVar('ResultIconSuccess', 'success-filling');
  58. case 'error': return themeContext.getVar('ResultIconError', 'delete-filling');
  59. case 'waiting': return themeContext.getVar('ResultIconWaiting', 'clock-filling');
  60. case 'warning': return themeContext.getVar('ResultIconWarning', 'warning-filling');
  61. }
  62. });
  63. const defaultIconColor = computed(() => {
  64. switch (props.status) {
  65. default:
  66. case 'info': return themeContext.resolveThemeColor('ResultColorInfo', 'primary');
  67. case 'success': return themeContext.resolveThemeColor('ResultColorSuccess', 'success');
  68. case 'error': return themeContext.resolveThemeColor('ResultColorError', 'danger');
  69. case 'waiting': return themeContext.resolveThemeColor('ResultColorWaiting', 'primary');
  70. case 'warning': return themeContext.resolveThemeColor('ResultColorWarning', 'warning');
  71. }
  72. });
  73. const themeVars = themeContext.getVars({
  74. ResultIconSize: 100,
  75. ResultTitleFontSize: 36,
  76. ResultTitleColor: 'black',
  77. ResultTitleBold: true,
  78. ResultTitleMarginTop: 10,
  79. ResultDescriptionFontSize: 28,
  80. ResultDescriptionColor: 'text.second',
  81. ResultDescriptionBold: false,
  82. ResultDescriptionMarginTop: 10,
  83. });
  84. </script>