: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; } }