<template> <div class="force-above fixed top-2 right-2 w-[300px]"> <TransitionGroup name="notify" tag="div"> <div v-for="(notify, index) in notifications.slice(0, 4)" :key="notify.id" class="my-2 w-[300px] rounded-md p-3 text-sm text-white" :class="{ 'bg-primary': notify.type === 'info', 'bg-red-600': notify.type === 'error', 'bg-green-600': notify.type === 'success', }" @click="dropNotification(index)" > <div class="flex gap-1"> <template v-if="notify.type == 'success'"> <MdiCheckboxMarkedCircle class="h-5 w-5" /> </template> <template v-if="notify.type == 'info'"> <MdiInformationSlabCircle class="h-5 w-5" /> </template> <template v-if="notify.type == 'error'"> <MdiAlert class="h-5 w-5" /> </template> {{ notify.message }} </div> </div> </TransitionGroup> </div> </template> <script setup lang="ts"> import MdiCheckboxMarkedCircle from "~icons/mdi/checkbox-marked-circle"; import MdiInformationSlabCircle from "~icons/mdi/information-slab-circle"; import MdiAlert from "~icons/mdi/alert"; import { useNotifications } from "@/composables/use-notifier"; const { notifications, dropNotification } = useNotifications(); </script> <style scoped> .force-above { z-index: 9999; } .notify-move, .notify-enter-active, .notify-leave-active { transition: all 0.5s ease; } .notify-enter-from, .notify-leave-to { opacity: 0; transform: translateY(-30px); } .notify-leave-active { position: absolute; transform: translateY(30px); } </style>