2
0
mirror of https://github.com/iconify/iconify.git synced 2024-11-17 01:55:09 +00:00
iconify/components/svelte/src/Icon.svelte

119 lines
2.1 KiB
Svelte
Raw Permalink Normal View History

<script context="module">
// Export stuff.
// Important: duplicate of iconify.ts. When changing exports, they must be changed in both files.
import {
enableCache,
disableCache,
iconLoaded,
iconExists, // deprecated, kept to avoid breaking changes
getIcon,
listIcons,
addIcon,
addCollection,
calculateSize,
replaceIDs,
buildIcon,
loadIcons,
2022-01-13 20:19:49 +00:00
loadIcon,
addAPIProvider,
_api
} from './functions';
export {
enableCache,
disableCache,
iconLoaded,
iconExists, // deprecated, kept to avoid breaking changes
getIcon,
listIcons,
addIcon,
addCollection,
calculateSize,
replaceIDs,
buildIcon,
loadIcons,
2022-01-13 20:19:49 +00:00
loadIcon,
addAPIProvider,
_api
}
</script>
<script>
2021-11-10 11:18:35 +00:00
import { onMount, onDestroy, createEventDispatcher } from 'svelte';
2021-05-01 20:38:56 +00:00
import { checkIconState, generateIcon } from './functions';
// State
const state = {
// Last icon name
name: '',
// Loading status
loading: null,
// Destroyed status
destroyed: false,
2021-05-01 20:38:56 +00:00
};
// Mounted status
let mounted = false;
// Callback counter
let counter = 0;
// Generated data
let data;
2021-11-10 11:18:35 +00:00
const onLoad = (icon) => {
// Legacy onLoad property
if (typeof $$props.onLoad === 'function') {
$$props.onLoad(icon);
}
// on:load event
const dispatch = createEventDispatcher();
dispatch('load', {
icon
});
}
2021-05-01 20:38:56 +00:00
// Generate data
$: {
2021-05-01 20:38:56 +00:00
counter;
2021-11-10 11:18:35 +00:00
const iconData = checkIconState($$props.icon, state, mounted, loaded, onLoad);
data = iconData ? generateIcon(iconData.data, $$props) : null;
if (data && iconData.classes) {
// Add classes
data.attributes['class'] = (typeof $$props['class'] === 'string' ? $$props['class'] + ' ' : '') + iconData.classes.join(' ');
}
}
2021-05-01 20:38:56 +00:00
// Increase counter when loaded to force re-calculation of data
function loaded() {
counter ++;
}
// Force re-render
onMount(() => {
mounted = true;
});
// Abort loading when component is destroyed
onDestroy(() => {
state.destroyed = true;
2021-05-01 20:38:56 +00:00
if (state.loading) {
state.loading.abort();
state.loading = null;
}
})
</script>
2022-04-12 08:09:22 +00:00
{#if data}
{#if data.svg}
<svg {...data.attributes}>
{@html data.body}
</svg>
{:else}
<span {...data.attributes}></span>
2022-04-12 08:09:22 +00:00
{/if}
{/if}