darkmedia-x-api / src /presentation /components /ui /NotificationContainer.vue
cybermedia's picture
Upload folder using huggingface_hub
343eed9 verified
<template>
<div class="notifications-container">
<transition-group name="notification" tag="div">
<div
v-for="notification in uiStore.activeNotifications"
:key="notification.id"
:class="['notification', notification.type]"
>
<span class="notification-message">{{ notification.message }}</span>
<button
class="notification-close"
@click="uiStore.removeNotification(notification.id)"
>
×
</button>
</div>
</transition-group>
</div>
</template>
<script setup lang="ts">
import { useUIStore } from '@presentation/stores'
const uiStore = useUIStore()
</script>
<style scoped>
.notifications-container {
position: fixed;
top: 20px;
right: 20px;
z-index: 1000;
max-width: 400px;
}
.notification {
display: flex;
justify-content: space-between;
align-items: center;
padding: 12px 16px;
margin-bottom: 10px;
border-radius: 4px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
font-size: 14px;
animation: slideIn 0.3s ease-out;
}
.notification.success {
background: var(--success);
color: white;
}
.notification.error {
background: var(--error);
color: white;
}
.notification.info {
background: var(--info);
color: white;
}
.notification-message {
flex: 1;
}
.notification-close {
background: none;
border: none;
color: inherit;
font-size: 18px;
cursor: pointer;
padding: 0;
margin-left: 10px;
opacity: 0.7;
transition: opacity 0.2s;
}
.notification-close:hover {
opacity: 1;
}
.notification-enter-active,
.notification-leave-active {
transition: all 0.3s ease;
}
.notification-enter-from {
transform: translateX(100%);
opacity: 0;
}
.notification-leave-to {
transform: translateX(100%);
opacity: 0;
}
@keyframes slideIn {
from {
transform: translateX(100%);
opacity: 0;
}
to {
transform: translateX(0);
opacity: 1;
}
}
</style>