grok-voice-agent / static /styles.css
Vrda's picture
Deploy Grok voice agent UI
a3ffe5c verified
Raw
History Blame Contribute Delete
6.76 kB
:root {
--bg-0: #07070c;
--bg-1: #0d0d18;
--text: #ecebff;
--muted: #8b8ba7;
--card: rgba(255, 255, 255, 0.04);
--card-brd: rgba(255, 255, 255, 0.08);
--accent: #7c5cff;
--accent-2: #16d3d3;
--user: #2a2a44;
--assistant: rgba(124, 92, 255, 0.16);
--danger: #ff5c7c;
--ok: #37e0a6;
}
* {
box-sizing: border-box;
}
html,
body {
height: 100%;
margin: 0;
}
body {
font-family: "Inter", system-ui, -apple-system, sans-serif;
color: var(--text);
background: var(--bg-0);
overflow: hidden;
}
/* Animated ambient background */
.bg {
position: fixed;
inset: 0;
z-index: 0;
background:
radial-gradient(60vmax 60vmax at 20% 15%, rgba(124, 92, 255, 0.22), transparent 60%),
radial-gradient(55vmax 55vmax at 85% 25%, rgba(22, 211, 211, 0.16), transparent 60%),
radial-gradient(70vmax 70vmax at 60% 100%, rgba(255, 92, 124, 0.12), transparent 60%),
linear-gradient(180deg, var(--bg-1), var(--bg-0));
filter: saturate(1.1);
animation: drift 22s ease-in-out infinite alternate;
}
@keyframes drift {
0% {
transform: translate3d(0, 0, 0) scale(1);
}
100% {
transform: translate3d(-2%, -1%, 0) scale(1.06);
}
}
.app {
position: relative;
z-index: 1;
height: 100%;
max-width: 860px;
margin: 0 auto;
padding: 22px 20px 26px;
display: grid;
grid-template-rows: auto 1fr auto;
gap: 14px;
}
/* Top bar */
.topbar {
display: flex;
align-items: center;
justify-content: space-between;
}
.brand {
display: flex;
align-items: center;
gap: 10px;
font-weight: 600;
letter-spacing: 0.2px;
}
.logo {
display: grid;
place-items: center;
width: 30px;
height: 30px;
border-radius: 9px;
background: linear-gradient(135deg, var(--accent), var(--accent-2));
color: #0b0b12;
font-size: 15px;
}
.brand-name {
font-size: 15px;
}
.status-pill {
display: flex;
align-items: center;
gap: 8px;
padding: 7px 13px;
border-radius: 999px;
background: var(--card);
border: 1px solid var(--card-brd);
font-size: 12.5px;
color: var(--muted);
backdrop-filter: blur(8px);
}
.dot {
width: 8px;
height: 8px;
border-radius: 50%;
background: var(--muted);
box-shadow: 0 0 0 0 rgba(255, 255, 255, 0.4);
}
.dot[data-state="connecting"] {
background: #ffd166;
animation: blink 1s infinite;
}
.dot[data-state="listening"] {
background: var(--ok);
}
.dot[data-state="speaking"] {
background: var(--accent);
}
.dot[data-state="error"] {
background: var(--danger);
}
@keyframes blink {
50% {
opacity: 0.3;
}
}
/* Stage with the orb */
.stage {
display: grid;
place-items: center;
align-content: center;
gap: 26px;
min-height: 0;
}
.orb {
position: relative;
width: 210px;
height: 210px;
display: grid;
place-items: center;
--level: 0;
}
.orb-core {
position: absolute;
inset: 34%;
border-radius: 50%;
background: radial-gradient(circle at 35% 30%, #d9d2ff, var(--accent) 55%, #3a1e8a 100%);
box-shadow: inset 0 0 24px rgba(255, 255, 255, 0.35);
transform: scale(calc(1 + var(--level) * 0.35));
transition: transform 0.06s linear;
}
.orb-glow {
position: absolute;
inset: 12%;
border-radius: 50%;
background: radial-gradient(circle, rgba(124, 92, 255, 0.55), transparent 62%);
filter: blur(16px);
opacity: calc(0.4 + var(--level) * 0.6);
transform: scale(calc(1 + var(--level) * 0.55));
transition: opacity 0.08s linear, transform 0.08s linear;
}
.orb-ring {
position: absolute;
border-radius: 50%;
border: 1.5px solid rgba(255, 255, 255, 0.12);
}
.ring1 {
inset: 8%;
transform: scale(calc(1 + var(--level) * 0.25));
border-color: rgba(124, 92, 255, 0.4);
transition: transform 0.08s linear;
}
.ring2 {
inset: 0;
transform: scale(calc(1 + var(--level) * 0.12));
border-color: rgba(22, 211, 211, 0.22);
transition: transform 0.1s linear;
}
body[data-state="idle"] .orb-core {
filter: grayscale(0.35) brightness(0.8);
}
/* Breathing when idle-but-connected */
body[data-state="listening"] .orb-glow {
animation: breathe 3.2s ease-in-out infinite;
}
@keyframes breathe {
50% {
opacity: 0.7;
}
}
/* Call button */
.call-btn {
display: inline-flex;
align-items: center;
gap: 10px;
padding: 14px 26px;
border-radius: 999px;
border: 1px solid var(--card-brd);
background: linear-gradient(135deg, var(--accent), #5a3ff0);
color: white;
font-family: inherit;
font-size: 15px;
font-weight: 600;
cursor: pointer;
box-shadow: 0 10px 30px rgba(124, 92, 255, 0.35);
transition: transform 0.12s ease, box-shadow 0.2s ease, background 0.2s ease;
}
.call-btn:hover {
transform: translateY(-1px);
box-shadow: 0 14px 38px rgba(124, 92, 255, 0.45);
}
.call-btn:active {
transform: translateY(0);
}
.call-btn:disabled {
opacity: 0.6;
cursor: default;
}
.call-btn.active {
background: linear-gradient(135deg, #ff5c7c, #d63a5c);
box-shadow: 0 10px 30px rgba(255, 92, 124, 0.35);
}
.hint {
margin: 0;
color: var(--muted);
font-size: 13px;
}
/* Transcript */
.transcript-wrap {
background: var(--card);
border: 1px solid var(--card-brd);
border-radius: 16px;
backdrop-filter: blur(10px);
overflow: hidden;
display: flex;
flex-direction: column;
min-height: 0;
max-height: 34vh;
}
.transcript-head {
padding: 11px 16px;
font-size: 12px;
letter-spacing: 0.5px;
text-transform: uppercase;
color: var(--muted);
border-bottom: 1px solid var(--card-brd);
}
.transcript {
padding: 14px 16px;
overflow-y: auto;
display: flex;
flex-direction: column;
gap: 10px;
}
.empty {
color: var(--muted);
font-size: 14px;
text-align: center;
padding: 18px 0;
}
.bubble {
max-width: 78%;
padding: 9px 13px;
border-radius: 14px;
font-size: 14.5px;
line-height: 1.45;
animation: rise 0.18s ease;
}
@keyframes rise {
from {
opacity: 0;
transform: translateY(6px);
}
}
.bubble .who {
display: block;
font-size: 11px;
font-weight: 600;
letter-spacing: 0.4px;
text-transform: uppercase;
opacity: 0.6;
margin-bottom: 3px;
}
.bubble.user {
align-self: flex-end;
background: var(--user);
border-bottom-right-radius: 4px;
}
.bubble.assistant {
align-self: flex-start;
background: var(--assistant);
border: 1px solid rgba(124, 92, 255, 0.25);
border-bottom-left-radius: 4px;
}
.bubble.system {
align-self: center;
background: rgba(255, 92, 124, 0.12);
border: 1px solid rgba(255, 92, 124, 0.3);
color: #ffc2ce;
font-size: 13px;
}
/* Scrollbar */
.transcript::-webkit-scrollbar {
width: 8px;
}
.transcript::-webkit-scrollbar-thumb {
background: rgba(255, 255, 255, 0.12);
border-radius: 8px;
}
@media (max-width: 560px) {
.orb {
width: 170px;
height: 170px;
}
.transcript-wrap {
max-height: 40vh;
}
}