diff --git a/src/components/copySvg.svelte b/src/components/copySvg.svelte index f93e34f..79eabec 100644 --- a/src/components/copySvg.svelte +++ b/src/components/copySvg.svelte @@ -12,7 +12,12 @@ import { copyToClipboard as figmaCopyToClipboard } from '@/figma/copy-to-clipboard'; import { buttonStyles } from '@/ui/styles'; import { cn } from '@/utils/cn'; + import { componentTemplate } from '@/utils/componentTemplate'; + + //Icons: import ReactIcon from './icons/reactIcon.svelte'; + import VueIcon from './icons/vueIcon.svelte'; + import SvelteIcon from './icons/svelteIcon.svelte'; // Props: export let iconSize = 24; @@ -67,6 +72,7 @@ optionsOpen = false; const content = await getSvgContent(svgUrlToCopy); + if (isInFigma) { figmaCopyToClipboard(content); } @@ -125,6 +131,34 @@ isLoading = false; }; + + // Copy as either Vue or Svelte component: + const copySvgComponent = async (ts: boolean, framework: 'Vue' | 'Svelte') => { + try { + const svgUrlToCopy = getSvgUrl(); + + optionsOpen = false; + + const content = await getSvgContent(svgUrlToCopy); + + const copyCode = componentTemplate(ts ? 'ts' : '', content, framework); + + if (copyCode) { + await clipboard(copyCode); + } + + const category = Array.isArray(svgInfo?.category) + ? svgInfo.category.sort().join(' - ') + : svgInfo.category; + + toast.success(`Copied as ${framework} ${ts ? 'TS' : 'JS'} component`, { + description: `${svgInfo?.title} - ${category}` + }); + } catch (err) { + console.error(`Error copying ${framework} component:`, err); + toast.error(`Failed to copy ${framework} component`); + } + }; (optionsOpen = isOpen)}> @@ -142,7 +176,7 @@ + + + + + + diff --git a/src/components/icons/svelteIcon.svelte b/src/components/icons/svelteIcon.svelte new file mode 100644 index 0000000..35ed793 --- /dev/null +++ b/src/components/icons/svelteIcon.svelte @@ -0,0 +1,17 @@ + + + diff --git a/src/components/icons/vueIcon.svelte b/src/components/icons/vueIcon.svelte new file mode 100644 index 0000000..8a0ce10 --- /dev/null +++ b/src/components/icons/vueIcon.svelte @@ -0,0 +1,14 @@ + + + diff --git a/src/utils/componentTemplate.ts b/src/utils/componentTemplate.ts new file mode 100644 index 0000000..8dbb5bb --- /dev/null +++ b/src/utils/componentTemplate.ts @@ -0,0 +1,21 @@ +import { parseSvgContent } from './parseSvgContent'; + +export const componentTemplate = (lang: string, content: string, framework: 'Vue' | 'Svelte') => { + const { templateContent, componentStyle } = parseSvgContent(content, framework); + + if (framework === 'Vue') { + return ` + + + ${componentStyle} + `; + } else { + return ` + ${templateContent} + +${componentStyle} + `; + } +}; \ No newline at end of file diff --git a/src/utils/parseSvgContent.ts b/src/utils/parseSvgContent.ts new file mode 100644 index 0000000..6bfaba4 --- /dev/null +++ b/src/utils/parseSvgContent.ts @@ -0,0 +1,26 @@ +export const parseSvgContent = (content: string, framework: 'Vue' | 'Svelte') => { + if (content.includes(']*\?>/i, ''); + } + // Regular expression to match ` + : ''; + + return { + componentStyle, + templateContent + }; +};