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