2023-06-14 19:50:59 +08:00
|
|
|
<script lang="ts">
|
|
|
|
import { flip } from "svelte/animate";
|
|
|
|
import type { ToastMessage } from "./types";
|
2023-07-04 05:28:39 +08:00
|
|
|
import ToastContent from "./ToastContent.svelte";
|
2023-06-14 19:50:59 +08:00
|
|
|
|
|
|
|
export let messages: ToastMessage[] = [];
|
2023-06-29 05:52:12 +08:00
|
|
|
|
|
|
|
$: scroll_to_top(messages);
|
|
|
|
|
|
|
|
function scroll_to_top(_messages: ToastMessage[]): void {
|
|
|
|
if (_messages.length > 0) {
|
|
|
|
if ("parentIFrame" in window) {
|
2023-07-06 16:12:46 +08:00
|
|
|
window.parentIFrame?.scrollTo(0, 0);
|
2023-06-29 05:52:12 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2023-06-14 19:50:59 +08:00
|
|
|
</script>
|
|
|
|
|
|
|
|
<div class="toast-wrap">
|
|
|
|
{#each messages as { type, message, id } (id)}
|
|
|
|
<div animate:flip={{ duration: 300 }} style:width="100%">
|
2023-07-04 05:28:39 +08:00
|
|
|
<ToastContent {type} {message} on:close {id} />
|
2023-06-14 19:50:59 +08:00
|
|
|
</div>
|
|
|
|
{/each}
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<style>
|
|
|
|
.toast-wrap {
|
|
|
|
display: flex;
|
|
|
|
position: fixed;
|
2023-07-06 16:12:46 +08:00
|
|
|
top: var(--size-4);
|
2023-06-14 19:50:59 +08:00
|
|
|
right: var(--size-4);
|
2023-07-06 16:12:46 +08:00
|
|
|
|
|
|
|
flex-direction: column;
|
2023-06-14 19:50:59 +08:00
|
|
|
align-items: end;
|
|
|
|
gap: var(--size-2);
|
|
|
|
z-index: var(--layer-top);
|
|
|
|
width: calc(100% - var(--size-8));
|
|
|
|
}
|
|
|
|
|
|
|
|
@media (--screen-sm) {
|
|
|
|
.toast-wrap {
|
|
|
|
width: calc(var(--size-96) + var(--size-10));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
</style>
|