You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

svg.js 3.0KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import octiconChevronDown from '../../public/img/svg/octicon-chevron-down.svg';
  2. import octiconChevronRight from '../../public/img/svg/octicon-chevron-right.svg';
  3. import octiconCopy from '../../public/img/svg/octicon-copy.svg';
  4. import octiconGitMerge from '../../public/img/svg/octicon-git-merge.svg';
  5. import octiconGitPullRequest from '../../public/img/svg/octicon-git-pull-request.svg';
  6. import octiconIssueClosed from '../../public/img/svg/octicon-issue-closed.svg';
  7. import octiconIssueOpened from '../../public/img/svg/octicon-issue-opened.svg';
  8. import octiconKebabHorizontal from '../../public/img/svg/octicon-kebab-horizontal.svg';
  9. import octiconLink from '../../public/img/svg/octicon-link.svg';
  10. import octiconLock from '../../public/img/svg/octicon-lock.svg';
  11. import octiconMilestone from '../../public/img/svg/octicon-milestone.svg';
  12. import octiconMirror from '../../public/img/svg/octicon-mirror.svg';
  13. import octiconProject from '../../public/img/svg/octicon-project.svg';
  14. import octiconRepo from '../../public/img/svg/octicon-repo.svg';
  15. import octiconRepoForked from '../../public/img/svg/octicon-repo-forked.svg';
  16. import octiconRepoTemplate from '../../public/img/svg/octicon-repo-template.svg';
  17. import octiconTriangleDown from '../../public/img/svg/octicon-triangle-down.svg';
  18. import Vue from 'vue';
  19. export const svgs = {
  20. 'octicon-chevron-down': octiconChevronDown,
  21. 'octicon-chevron-right': octiconChevronRight,
  22. 'octicon-copy': octiconCopy,
  23. 'octicon-git-merge': octiconGitMerge,
  24. 'octicon-git-pull-request': octiconGitPullRequest,
  25. 'octicon-issue-closed': octiconIssueClosed,
  26. 'octicon-issue-opened': octiconIssueOpened,
  27. 'octicon-kebab-horizontal': octiconKebabHorizontal,
  28. 'octicon-link': octiconLink,
  29. 'octicon-lock': octiconLock,
  30. 'octicon-milestone': octiconMilestone,
  31. 'octicon-mirror': octiconMirror,
  32. 'octicon-project': octiconProject,
  33. 'octicon-repo': octiconRepo,
  34. 'octicon-repo-forked': octiconRepoForked,
  35. 'octicon-repo-template': octiconRepoTemplate,
  36. 'octicon-triangle-down': octiconTriangleDown,
  37. };
  38. const parser = new DOMParser();
  39. const serializer = new XMLSerializer();
  40. // retrieve a HTML string for given SVG icon name, size and additional classes
  41. export function svg(name, size = 16, className = '') {
  42. if (!(name in svgs)) return '';
  43. if (size === 16 && !className) return svgs[name];
  44. const document = parser.parseFromString(svgs[name], 'image/svg+xml');
  45. const svgNode = document.firstChild;
  46. if (size !== 16) svgNode.setAttribute('width', String(size));
  47. if (size !== 16) svgNode.setAttribute('height', String(size));
  48. if (className) svgNode.classList.add(...className.split(/\s+/));
  49. return serializer.serializeToString(svgNode);
  50. }
  51. export const SvgIcon = Vue.component('SvgIcon', {
  52. props: {
  53. name: {type: String, required: true},
  54. size: {type: Number, default: 16},
  55. className: {type: String, default: ''},
  56. },
  57. computed: {
  58. svg() {
  59. return svg(this.name, this.size, this.className);
  60. },
  61. },
  62. template: `<span v-html="svg" />`
  63. });