|
1 | 1 | <script> |
2 | | -import { createEventDispatcher } from 'svelte' |
3 | | -
|
4 | 2 | export let src = [] |
5 | 3 | export let loading = 'lazy' |
6 | 4 | export let decoding = 'async' |
7 | 5 | export let ref = {} |
8 | 6 |
|
9 | 7 | const priority = ['heic', 'heif', 'avif', 'webp', 'jpeg', 'jpg', 'png', 'gif', 'tiff'] |
10 | 8 | const blacklist = ['src', 'srcset', 'loading', 'decoding', 'style', 'ref'] |
11 | | -const fire = createEventDispatcher() |
12 | 9 | let props = {} |
13 | 10 | let image = {} |
14 | 11 | let sources = [] |
15 | 12 |
|
16 | 13 | $: if (src.length) { |
17 | | - const list = [...src] |
18 | | - const lqip = list.pop().base64 |
| 14 | + const { list, lqip } = src.reduce( |
| 15 | + (a, c) => { |
| 16 | + if (c.base64) a.lqip = c.base64 |
| 17 | + else a.list.push(c) |
| 18 | + return a |
| 19 | + }, |
| 20 | + { list: [], lqip: 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEAAAAALAAAAAABAAEAAAIBAAA=' } |
| 21 | + ) |
19 | 22 | const groups = [] |
20 | 23 | for (const f of priority) { |
21 | 24 | const group = list.filter((i) => i.format === f) |
|
40 | 43 | } |
41 | 44 | </script> |
42 | 45 |
|
43 | | -<picture> |
44 | | - {#each sources as { format, srcset }} |
45 | | - <source type="image/{format}" {srcset} /> |
46 | | - {/each} |
47 | | - <!-- svelte-ignore a11y-missing-attribute --> |
48 | | - <img |
49 | | - src={image.src} |
50 | | - srcset={image.srcset} |
51 | | - {loading} |
52 | | - {decoding} |
53 | | - style="background:url('{image.lqip}') no-repeat center/cover" |
54 | | - bind:this={ref} |
55 | | - on:click={() => fire('click')} |
56 | | - on:load={() => fire('load')} |
57 | | - {...props} |
58 | | - /> |
59 | | -</picture> |
| 46 | +{#if image.src} |
| 47 | + <picture> |
| 48 | + {#each sources as { format, srcset }} |
| 49 | + <source type="image/{format}" {srcset} /> |
| 50 | + {/each} |
| 51 | + <!-- svelte-ignore a11y-missing-attribute --> |
| 52 | + <img |
| 53 | + src={image.src} |
| 54 | + srcset={image.srcset} |
| 55 | + {loading} |
| 56 | + {decoding} |
| 57 | + style="background:url('{image.lqip}') no-repeat center/cover" |
| 58 | + bind:this={ref} |
| 59 | + on:click |
| 60 | + on:load |
| 61 | + {...props} |
| 62 | + /> |
| 63 | + </picture> |
| 64 | +{/if} |
0 commit comments