use-svg-icon-render.ts 966 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import { h } from 'vue';
  2. import type { Component } from 'vue';
  3. /**
  4. * Svg icon render hook
  5. *
  6. * @param SvgIcon Svg icon component
  7. */
  8. export default function useSvgIconRender(SvgIcon: Component) {
  9. interface IconConfig {
  10. /** Iconify icon name */
  11. icon?: string;
  12. /** Local icon name */
  13. localIcon?: string;
  14. /** Icon color */
  15. color?: string;
  16. /** Icon size */
  17. fontSize?: number;
  18. }
  19. type IconStyle = Partial<Pick<CSSStyleDeclaration, 'color' | 'fontSize'>>;
  20. /**
  21. * Svg icon VNode
  22. *
  23. * @param config
  24. */
  25. const SvgIconVNode = (config: IconConfig) => {
  26. const { color, fontSize, icon, localIcon } = config;
  27. const style: IconStyle = {};
  28. if (color) {
  29. style.color = color;
  30. }
  31. if (fontSize) {
  32. style.fontSize = `${fontSize}px`;
  33. }
  34. if (!icon && !localIcon) {
  35. return undefined;
  36. }
  37. return () => h(SvgIcon, { icon, localIcon, style });
  38. };
  39. return {
  40. SvgIconVNode
  41. };
  42. }