diff --git a/ui/src/components/realtime/RealtimeEventCard.vue b/ui/src/components/realtime/RealtimeEventCard.vue index be49024..9f2223c 100644 --- a/ui/src/components/realtime/RealtimeEventCard.vue +++ b/ui/src/components/realtime/RealtimeEventCard.vue @@ -114,6 +114,7 @@ const operationClass = computed(() => { .realtime-event { margin-bottom: 1rem; padding: 0.5rem; + view-transition-name: auto; } .old-card, diff --git a/ui/src/stores/useRealtime.js b/ui/src/stores/useRealtime.js index bf3f8b3..4ea171d 100644 --- a/ui/src/stores/useRealtime.js +++ b/ui/src/stores/useRealtime.js @@ -34,8 +34,15 @@ export const useRealtimeStore = defineStore('realtime', { console.log('📦 Payload parseado:', payload); console.log('🧪 Tabla recibida:', payload.table); - // store event for feed - this.events.unshift({ ...payload, receivedAt: new Date().toISOString() }); + // store event for feed with View Transition if available + const addEvent = () => { + this.events.unshift({ ...payload, receivedAt: new Date().toISOString() }); + }; + if (document.startViewTransition) { + document.startViewTransition(addEvent); + } else { + addEvent(); + } // mark badge for module and operation if (this.badges[payload.table]) { @@ -64,7 +71,7 @@ export const useRealtimeStore = defineStore('realtime', { this._sse.onerror = () => { console.warn('SSE connection lost, reloading...'); }; - } + }, clearBadgesForTable(table) { if (this.badges[table]) { this.badges[table].INSERT = false; diff --git a/ui/src/views/RealtimeFeedView.vue b/ui/src/views/RealtimeFeedView.vue index 2392f31..072f5ef 100644 --- a/ui/src/views/RealtimeFeedView.vue +++ b/ui/src/views/RealtimeFeedView.vue @@ -79,4 +79,19 @@ onMounted(() => { .feed-list::-webkit-scrollbar { display: none; /* Chrome, Safari */ } + +:global(::view-transition-old(.realtime-event)), +:global(::view-transition-new(.realtime-event)) { + animation: slide 0.25s ease both; +} +@keyframes slide { + from { + transform: translateY(var(--view-transition-slide-y, 0)); + opacity: 0; + } + to { + transform: none; + opacity: 1; + } +}