| 1 | <script lang="ts"> |
| 2 | import { twemojiUrl } from './twemoji'; |
| 3 | |
| 4 | export let emoji: string; |
| 5 | export let size: number | string = 20; |
| 6 | export let label: string | null = null; |
| 7 | |
| 8 | let failed = false; |
| 9 | $: emoji, (failed = false); |
| 10 | $: dim = typeof size === 'number' ? `${size}px` : size; |
| 11 | $: align = typeof size === 'number' ? 'middle' : '-0.25em'; |
| 12 | </script> |
| 13 | |
| 14 | {#if failed} |
| 15 | <span class="native" style={`font-size:${dim}`} aria-label={label ?? undefined}>{emoji}</span> |
| 16 | {:else} |
| 17 | <img |
| 18 | class="emoji" |
| 19 | src={twemojiUrl(emoji)} |
| 20 | alt={emoji} |
| 21 | aria-label={label ?? undefined} |
| 22 | style={`width:${dim};height:${dim};vertical-align:${align}`} |
| 23 | draggable="false" |
| 24 | loading="lazy" |
| 25 | on:error={() => (failed = true)} |
| 26 | /> |
| 27 | {/if} |
| 28 | |
| 29 | <style> |
| 30 | .emoji { display: inline-block; object-fit: contain; } |
| 31 | .native { display: inline-block; line-height: 1; vertical-align: middle; } |
| 32 | </style> |