Aria / frontend /src /components /VoiceCall.css
teganmosi
Deploy Aria application with fixes for database, TTS, and WebSocket (LFS tracking applied)
f6d0a88
Raw
History Blame Contribute Delete
8.06 kB
/* ========================================
ARIA - VOICE CALL UI (Premium Aesthetics)
======================================== */
.voice-call-overlay {
position: fixed;
inset: 0;
z-index: 1000;
background: #020617; /* Deepest blue/black */
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 2rem;
text-align: center;
overflow: hidden;
font-family: 'Inter', sans-serif;
}
/* Atmospheric Background Elements */
.voice-call-bg {
position: absolute;
inset: 0;
z-index: -1;
overflow: hidden;
}
.voice-call-orb {
position: absolute;
border-radius: 50%;
filter: blur(140px);
opacity: 0.15;
animation: orb-flow 25s infinite alternate ease-in-out;
}
.orb-gold {
width: 60vw;
height: 60vw;
background: #F5CE4D;
top: -20%;
left: -10%;
animation-duration: 30s;
}
.orb-blue {
width: 50vw;
height: 50vw;
background: #6366f1;
bottom: -10%;
right: -5%;
animation-duration: 35s;
animation-delay: -5s;
}
.orb-purple {
width: 40vw;
height: 40vw;
background: #a855f7;
top: 40%;
left: 30%;
animation-duration: 40s;
animation-delay: -10s;
}
/* Star/Particle Effect */
.voice-call-stars {
position: absolute;
inset: 0;
background-image:
radial-gradient(1px 1px at 20px 30px, #eee, rgba(0,0,0,0)),
radial-gradient(1px 1px at 40px 70px, #fff, rgba(0,0,0,0)),
radial-gradient(2px 2px at 50px 160px, #ddd, rgba(0,0,0,0)),
radial-gradient(2px 2px at 90px 40px, #fff, rgba(0,0,0,0)),
radial-gradient(1px 1px at 130px 80px, #fff, rgba(0,0,0,0)),
radial-gradient(2px 2px at 160px 120px, #ddd, rgba(0,0,0,0));
background-repeat: repeat;
background-size: 200px 200px;
opacity: 0.1;
animation: stars-twinkle 4s infinite alternate;
}
@keyframes stars-twinkle {
from { opacity: 0.05; transform: scale(1); }
to { opacity: 0.2; transform: scale(1.1); }
}
@keyframes orb-flow {
0% { transform: translate(0, 0) scale(1) rotate(0deg); }
50% { transform: translate(100px, 50px) scale(1.1) rotate(60deg); }
100% { transform: translate(-50px, 100px) scale(0.9) rotate(-30deg); }
}
/* Central Avatar & Pulse System */
.avatar-container {
position: relative;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 3rem;
transition: transform 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);
}
.avatar-container.speaking {
transform: scale(1.05);
}
.avatar-glow {
position: absolute;
width: 300px;
height: 300px;
border-radius: 50%;
background: radial-gradient(circle, rgba(245, 206, 77, 0.3) 0%, transparent 70%);
opacity: 0.5;
transition: all 0.5s ease;
}
.avatar-container.active .avatar-glow {
animation: breathing-glow 4s infinite ease-in-out;
}
.avatar-container.speaking .avatar-glow {
background: radial-gradient(circle, rgba(245, 206, 77, 0.6) 0%, transparent 70%);
animation: resonance-glow 0.8s infinite alternate ease-in-out;
}
@keyframes breathing-glow {
0%, 100% { opacity: 0.3; transform: scale(1); }
50% { opacity: 0.5; transform: scale(1.2); }
}
@keyframes resonance-glow {
0% { opacity: 0.5; transform: scale(1.1); }
100% { opacity: 0.8; transform: scale(1.3); }
}
.avatar-image-wrapper {
width: 240px;
height: 240px;
border-radius: 50%;
padding: 8px;
background: rgba(255, 255, 255, 0.05);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.1);
box-shadow: 0 0 50px rgba(0, 0, 0, 0.5);
position: relative;
z-index: 5;
overflow: hidden;
}
.avatar-image {
width: 100%;
height: 100%;
border-radius: 50%;
object-fit: cover;
transition: filter 1s ease;
}
.avatar-image.inactive {
filter: grayscale(0.8) contrast(0.8);
}
/* Visualization Rings */
.ring {
position: absolute;
border: 1px solid rgba(245, 206, 77, 0.2);
border-radius: 50%;
pointer-events: none;
}
.ring-1 { width: 280px; height: 280px; animation: rotate-slow 20s infinite linear; }
.ring-2 { width: 320px; height: 320px; border-style: dashed; animation: rotate-slow 30s infinite linear reverse; }
.ring-3 { width: 400px; height: 400px; opacity: 0.1; animation: pulse-out 3s infinite ease-out; }
@keyframes rotate-slow {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
@keyframes pulse-out {
0% { transform: scale(1); opacity: 0.3; }
100% { transform: scale(1.5); opacity: 0; }
}
/* Typography & Info */
.voice-call-info {
max-width: 600px;
width: 100%;
z-index: 10;
}
.status-label {
font-size: 0.8rem;
letter-spacing: 0.4em;
color: #F5CE4D;
text-transform: uppercase;
font-weight: 800;
margin-bottom: 0.5rem;
opacity: 0.8;
}
.call-title {
font-family: 'Playfair Display', serif;
color: white;
font-size: 3.5rem;
margin-bottom: 2rem;
letter-spacing: -0.02em;
font-weight: 500;
text-shadow: 0 10px 30px rgba(0,0,0,0.5);
}
.transcript-panel {
min-height: 120px;
padding: 2rem;
border-radius: 32px;
background: rgba(255, 255, 255, 0.03);
backdrop-filter: blur(20px);
border: 1px solid rgba(255, 255, 255, 0.08);
color: rgba(255, 255, 255, 0.8);
font-size: 1.25rem;
line-height: 1.6;
display: flex;
align-items: center;
justify-content: center;
font-style: italic;
font-weight: 300;
box-shadow: 0 20px 80px rgba(0,0,0,0.4);
transition: all 0.5s ease;
animation: fade-in 1s ease-out;
}
@keyframes fade-in {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
/* Controls */
.controls-bar {
margin-top: auto;
margin-bottom: 3rem;
display: flex;
gap: 2.5rem;
align-items: center;
padding: 1.25rem 2.5rem;
border-radius: 100px;
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.12);
backdrop-filter: blur(25px);
box-shadow: 0 25px 70px rgba(0,0,0,0.6);
z-index: 100;
animation: slide-up 0.8s cubic-bezier(0.16, 1, 0.3, 1);
}
@keyframes slide-up {
from { transform: translateY(100px); opacity: 0; }
to { transform: translateY(0); opacity: 1; }
}
.control-btn {
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
border: none;
outline: none;
}
.control-btn:hover {
transform: scale(1.1);
}
.btn-mute {
width: 64px;
height: 64px;
border-radius: 50%;
background: rgba(255, 255, 255, 0.1);
color: white;
}
.btn-mute.muted {
background: #F5CE4D;
color: #020617;
box-shadow: 0 0 30px rgba(245, 206, 77, 0.4);
}
.btn-end {
width: 84px;
height: 84px;
border-radius: 50%;
background: #ef4444;
color: white;
box-shadow: 0 0 50px rgba(239, 68, 68, 0.4);
}
.btn-end:hover {
background: #f87171;
box-shadow: 0 0 60px rgba(239, 68, 68, 0.6);
transform: scale(1.1) rotate(90deg);
}
.encryption-text {
position: absolute;
bottom: 2rem;
color: rgba(255, 255, 255, 0.4);
font-size: 0.7rem;
letter-spacing: 0.25em;
display: flex;
align-items: center;
gap: 0.75rem;
text-transform: uppercase;
font-weight: 500;
}
.sparkle-icon {
color: #F5CE4D;
animation: pulse 2s infinite;
}
@keyframes pulse {
0%, 100% { opacity: 0.5; transform: scale(1); }
50% { opacity: 1; transform: scale(1.2); }
}
/* Audio Waveform Simulation */
.waveform-container {
height: 40px;
display: flex;
align-items: center;
gap: 4px;
margin-bottom: 2rem;
}
.wave-bar {
width: 4px;
height: 8px;
background: #F5CE4D;
border-radius: 2px;
transition: height 0.1s ease;
}
.wave-bar.speaking {
animation: wave-bounce 0.5s infinite alternate ease-in-out;
}
@keyframes wave-bounce {
from { height: 8px; }
to { height: 40px; }
}