cl-avatar.uvue 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. <template>
  2. <cl-image
  3. :src="src"
  4. :height="size"
  5. :width="size"
  6. :pt="{
  7. className: parseClass([
  8. 'cl-avatar',
  9. {
  10. '!rounded-full': rounded
  11. },
  12. pt.className
  13. ])
  14. }"
  15. >
  16. <template #loading>
  17. <cl-icon
  18. :name="pt.icon?.name ?? 'user-smile-fill'"
  19. :size="pt.icon?.size ?? 20"
  20. :pt="{
  21. className: parseClass([
  22. [isDark, '!text-surface-50', '!text-surface-400'],
  23. pt.icon?.className
  24. ])
  25. }"
  26. ></cl-icon>
  27. </template>
  28. <slot></slot>
  29. </cl-image>
  30. </template>
  31. <script setup lang="ts">
  32. import { isDark, parseClass, parsePt } from "@/.cool";
  33. import { computed } from "vue";
  34. import type { ClIconProps } from "../cl-icon/props";
  35. defineOptions({
  36. name: "cl-avatar"
  37. });
  38. const props = defineProps({
  39. pt: {
  40. type: Object,
  41. default: () => ({})
  42. },
  43. src: {
  44. type: String,
  45. default: ""
  46. },
  47. size: {
  48. type: Number,
  49. default: 40
  50. },
  51. rounded: {
  52. type: Boolean,
  53. default: false
  54. }
  55. });
  56. type PassThrough = {
  57. className?: string;
  58. icon?: ClIconProps;
  59. };
  60. const pt = computed(() => parsePt<PassThrough>(props.pt));
  61. </script>