hss-pos / frontend /src /lib /components /Toast.svelte
sashank1989
Initial commit: HSS POS restaurant management system
c2b0409
Raw
History Blame Contribute Delete
1.44 kB
<script>
import { toasts } from '$stores/notifications.js';
import { fly, fade } from 'svelte/transition';
let items = [];
toasts.subscribe((v) => (items = v));
const icons = {
success: 'M5 13l4 4L19 7',
error: 'M6 18L18 6M6 6l12 12',
warning: 'M12 9v2m0 4h.01M12 2a10 10 0 100 20 10 10 0 000-20z',
info: 'M13 16h-1v-4h-1m1-4h.01M12 2a10 10 0 100 20 10 10 0 000-20z'
};
const colors = {
success: 'bg-pos-success',
error: 'bg-pos-danger',
warning: 'bg-pos-warning text-gray-900',
info: 'bg-pos-info'
};
</script>
<div class="fixed top-4 right-4 z-[100] flex flex-col gap-2 max-w-sm">
{#each items as toast (toast.id)}
<div
class="flex items-center gap-3 px-4 py-3 rounded-lg shadow-xl {colors[toast.type]} text-sm font-medium"
in:fly={{ x: 300, duration: 300 }}
out:fade={{ duration: 200 }}
>
<svg class="w-5 h-5 flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
<path stroke-linecap="round" stroke-linejoin="round" d={icons[toast.type]} />
</svg>
<span class="flex-1">{toast.message}</span>
<button
class="opacity-70 hover:opacity-100 transition-opacity"
onclick={() => toasts.remove(toast.id)}
>
<svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12" />
</svg>
</button>
</div>
{/each}
</div>