index.vue 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. <template>
  2. <div class="svg-icon">
  3. <svg aria-hidden="true" :style="`width: ${size}px;height: ${size}px;transform: rotate(${rotate}deg);`">
  4. <use :xlink:href="symbolId" :fill="colorCpt" />
  5. </svg>
  6. </div>
  7. </template>
  8. <script setup lang="ts">
  9. defineOptions({
  10. name: 'SvgIcon',
  11. });
  12. import {
  13. computed, reactive,
  14. } from "vue";
  15. const props = defineProps({
  16. prefix: {
  17. type: String,
  18. default: 'icon'
  19. },
  20. name: {
  21. type: String,
  22. required: true
  23. },
  24. color: {
  25. type: String,
  26. default: ''
  27. },
  28. size: {
  29. type: [Number, String],
  30. default: '18'
  31. },
  32. rotate: {
  33. type: [Number, String],
  34. default: 0
  35. },
  36. active: {
  37. type: Boolean,
  38. default: false
  39. },
  40. })
  41. const state: any = reactive({
  42. defaultColor: '#A7ADB9'
  43. })
  44. const symbolId = computed(() => `#${props.prefix}-${props.name}`)
  45. const colorCpt = computed(() => {
  46. if (props.color) {
  47. return props.color
  48. }
  49. if (props.active) {
  50. return 'var(--czr-main-color)'
  51. }
  52. return state.defaultColor
  53. })
  54. </script>
  55. <style scoped>
  56. .svg-icon {
  57. vertical-align: -0.15em;
  58. overflow: hidden;
  59. fill: currentColor;
  60. }
  61. </style>