this repo has no description
at main 51 lines 1.5 kB view raw
1<!-- 2@component 3Renders a supported "SF Symbol" from the icons available in `~/sf-symbols` 4--> 5<script lang="ts" context="module"> 6 import type { ComponentType } from 'svelte'; 7 8 const iconComponents = import.meta.glob('~/sf-symbols/*.svg', { 9 eager: true, 10 import: 'default', 11 }); 12 13 const iconNameToComponent: Record<string, ComponentType | undefined> = 14 Object.fromEntries( 15 Object.entries(iconComponents).map( 16 ([fullPathToIcon, iconComponent]) => { 17 const iconName = fullPathToIcon 18 .replace('/src/sf-symbols/', '') 19 .replace('.svg', ''); 20 21 return [iconName, iconComponent as ComponentType]; 22 }, 23 ), 24 ); 25 26 /** 27 * The list of all supported icons 28 * 29 * This is exposed only for testing/Storybook purposes 30 */ 31 export const __iconNames = Object.keys(iconNameToComponent); 32 33 export function getIconComponentByName(iconName: string) { 34 return iconNameToComponent[iconName]; 35 } 36</script> 37 38<script lang="ts"> 39 /** 40 * The name of the SF Symbol to render 41 * 42 * Must match the name of an `.svg` file in `~/sf-symbols`. If a file with a matching 43 * name does not exist, nothing will be rendered 44 */ 45 export let name: string; 46 export let ariaHidden: boolean = false; 47 48 $: icon = getIconComponentByName(name); 49</script> 50 51<svelte:component this={icon} aria-hidden={ariaHidden ? 'true' : 'false'} />