Files
pipecat/moq_prebuilt/client/style.css
2026-05-15 16:59:07 -05:00

243 lines
5.1 KiB
CSS

/* Palette borrowed from @pipecat-ai/voice-ui-kit (dark theme) so this
custom MOQ client visually matches the smallwebrtc playground. */
:root {
--background: oklch(0.141 0.005 285.823);
--foreground: oklch(0.985 0 0);
--card: oklch(0.21 0.006 285.885);
--muted: oklch(0.274 0.006 286.033);
--muted-foreground: oklch(0.705 0.015 286.067);
--border: oklch(1 0 0 / 10%);
--border-strong: oklch(1 0 0 / 16%);
--primary: oklch(0.85 0.13 162); /* green Connect */
--primary-hover: oklch(0.78 0.14 162);
--destructive: oklch(0.577 0.245 27.325); /* red Disconnect */
--destructive-hover: oklch(0.52 0.225 27.325);
--warning: oklch(0.795 0.184 86.047);
--user-bubble: oklch(0.305 0.045 265);
--assistant-bubble: oklch(0.255 0.012 286);
--radius-md: 6px;
--radius-lg: 8px;
--radius-xl: 12px;
--font-sans: -apple-system, BlinkMacSystemFont, "Inter", "Segoe UI", Roboto, sans-serif;
--font-mono: "SF Mono", "JetBrains Mono", "Fira Code", "Cascadia Code", Consolas, monospace;
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html, body {
height: 100%;
}
body {
font-family: var(--font-sans);
background: var(--background);
color: var(--foreground);
font-size: 14px;
line-height: 1.5;
min-height: 100vh;
display: flex;
justify-content: center;
padding: 48px 24px 80px;
-webkit-font-smoothing: antialiased;
}
.container {
max-width: 720px;
width: 100%;
display: flex;
flex-direction: column;
gap: 16px;
}
h1 {
font-size: 1.05rem;
font-weight: 600;
letter-spacing: -0.005em;
color: var(--foreground);
margin: 0 0 8px 4px;
}
/* ---------- Card ---------- */
.card {
background: var(--card);
border: 1px solid var(--border);
border-radius: var(--radius-xl);
padding: 20px;
}
.card h3 {
font-family: var(--font-mono);
font-size: 0.68rem;
font-weight: 600;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--muted-foreground);
margin-bottom: 14px;
}
/* ---------- Connection card (status + buttons) ---------- */
.status {
font-size: 1rem;
font-weight: 500;
padding: 4px 0 14px;
color: var(--muted-foreground);
display: flex;
align-items: center;
gap: 10px;
}
.status::before {
content: "";
width: 8px;
height: 8px;
border-radius: 50%;
background: var(--muted-foreground);
flex-shrink: 0;
}
.status.disconnected { color: var(--muted-foreground); }
.status.disconnected::before { background: var(--muted-foreground); }
.status.connecting { color: var(--warning); }
.status.connecting::before { background: var(--warning); }
.status.connected { color: var(--primary); }
.status.connected::before { background: var(--primary); box-shadow: 0 0 0 4px oklch(0.85 0.13 162 / 0.15); }
.status.error { color: var(--destructive); }
.status.error::before { background: var(--destructive); }
.controls {
display: flex;
gap: 8px;
}
button {
font-family: inherit;
font-size: 0.85rem;
font-weight: 500;
letter-spacing: 0.01em;
padding: 8px 18px;
border: 1px solid transparent;
border-radius: var(--radius-md);
cursor: pointer;
transition: background 0.15s, border-color 0.15s, opacity 0.15s;
}
button:disabled {
opacity: 0.35;
cursor: not-allowed;
}
#connectBtn {
background: var(--primary);
color: oklch(0.16 0.02 162);
}
#connectBtn:hover:not(:disabled) {
background: var(--primary-hover);
}
#disconnectBtn {
background: transparent;
border-color: var(--destructive);
color: var(--destructive);
}
#disconnectBtn:hover:not(:disabled) {
background: oklch(0.577 0.245 27.325 / 0.15);
}
/* ---------- Transcript ---------- */
.transcript {
font-size: 0.95rem;
line-height: 1.55;
max-height: 360px;
min-height: 48px;
overflow-y: auto;
display: flex;
flex-direction: column;
gap: 8px;
padding-right: 4px;
}
.transcript:empty::before {
content: "Waiting for conversation…";
color: var(--muted-foreground);
font-style: italic;
opacity: 0.6;
}
.transcript-row {
display: flex;
flex-direction: column;
gap: 3px;
padding: 10px 14px;
border-radius: var(--radius-lg);
border: 1px solid var(--border);
max-width: 88%;
align-self: flex-start;
background: var(--assistant-bubble);
}
.transcript-user {
background: var(--user-bubble);
}
.transcript-role {
font-family: var(--font-mono);
font-size: 0.62rem;
font-weight: 600;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--muted-foreground);
}
.transcript-text {
color: var(--foreground);
white-space: pre-wrap;
word-wrap: break-word;
}
/* ---------- Log ---------- */
.log {
font-family: var(--font-mono);
font-size: 0.72rem;
line-height: 1.7;
max-height: 360px;
overflow-y: auto;
color: var(--muted-foreground);
}
.log div {
padding: 2px 0;
border-bottom: 1px solid oklch(1 0 0 / 0.04);
}
.log div:last-child {
border-bottom: none;
}
/* ---------- Scrollbar polish ---------- */
.transcript::-webkit-scrollbar,
.log::-webkit-scrollbar {
width: 6px;
}
.transcript::-webkit-scrollbar-thumb,
.log::-webkit-scrollbar-thumb {
background: var(--border-strong);
border-radius: 3px;
}
.transcript::-webkit-scrollbar-track,
.log::-webkit-scrollbar-track {
background: transparent;
}