morris-telepresence / src /styles.css
GenAIJake's picture
Add native Reachy Morris controller bridge
7e0ce00 verified
Raw History Blame Contribute Delete
8.08 kB
:root {
color: #f5f5f5;
background: #101013;
font-family: Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
font-synthesis: none;
}
* { box-sizing: border-box; }
html,
body,
#root {
min-height: 100%;
margin: 0;
}
body {
min-height: 100dvh;
background: #101013;
overscroll-behavior: none;
-webkit-tap-highlight-color: transparent;
}
button {
font: inherit;
}
button:focus-visible,
.joystick__ring:focus-visible {
outline: 3px solid #ffab3d;
outline-offset: 3px;
}
.visually-hidden {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0 0 0 0);
white-space: nowrap;
border: 0;
}
.app-shell {
width: min(100%, 600px);
min-height: 100dvh;
margin: 0 auto;
padding: max(18px, env(safe-area-inset-top)) 18px calc(24px + env(safe-area-inset-bottom));
display: flex;
flex-direction: column;
justify-content: center;
gap: 18px;
}
.app-shell--native {
width: 100%;
max-width: none;
padding: 0;
justify-content: center;
}
.native-telepresence {
width: 100%;
display: grid;
gap: 12px;
}
.native-telepresence .camera {
border-radius: 0;
aspect-ratio: auto;
height: 100dvh;
box-shadow: none;
}
.telepresence {
width: 100%;
}
.telepresence__header {
display: flex;
align-items: center;
justify-content: space-between;
margin: 0 3px 12px;
}
.telepresence__brand {
margin: 0 0 4px;
color: rgba(245, 245, 245, 0.58);
font-size: 10px;
font-weight: 760;
letter-spacing: 1.5px;
}
.telepresence h1 {
margin: 0;
font-size: 28px;
line-height: 1;
font-weight: 700;
letter-spacing: -0.6px;
}
.status {
padding: 7px 10px;
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 999px;
color: rgba(245, 245, 245, 0.72);
background: rgba(255, 255, 255, 0.035);
font-size: 11px;
font-weight: 650;
letter-spacing: 0.1px;
}
.status--active { color: #ffab3d; border-color: rgba(255, 149, 0, 0.38); background: rgba(255, 149, 0, 0.12); }
.status--error { color: #ffaaa1; border-color: rgba(255, 122, 109, 0.35); }
.status--releasing { color: #f7dc87; }
.camera-wrap {
position: relative;
padding-bottom: 102px;
}
.camera {
position: relative;
width: 100%;
aspect-ratio: 4 / 3;
overflow: hidden;
border-radius: 13px;
background: #080809;
box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.09);
}
.camera__video {
display: block;
width: 100%;
height: 100%;
object-fit: cover;
}
.camera__video--hidden { display: none; }
.camera__placeholder {
position: absolute;
inset: 0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 11px;
color: rgba(245, 245, 245, 0.56);
font-size: 11px;
font-weight: 600;
letter-spacing: 0.15px;
}
.camera__placeholder-mark {
display: block;
width: 76px;
height: 76px;
filter: drop-shadow(0 8px 18px rgba(0, 0, 0, 0.38));
}
.camera__placeholder-mark img {
display: block;
width: 100%;
height: 100%;
object-fit: contain;
}
.camera__badge {
position: absolute;
top: 11px;
display: flex;
align-items: center;
gap: 6px;
padding: 5px 8px;
border-radius: 999px;
color: rgba(255, 255, 255, 0.93);
background: rgba(0, 0, 0, 0.46);
backdrop-filter: blur(7px);
-webkit-backdrop-filter: blur(7px);
font-size: 10px;
font-weight: 700;
line-height: 1;
letter-spacing: 0.45px;
text-transform: uppercase;
}
.camera__badge--left { left: 12px; }
.camera__badge--right { right: 12px; text-transform: none; letter-spacing: 0; font-weight: 580; }
.camera__badge-separator { width: 1px; height: 10px; background: rgba(255,255,255,0.25); }
.camera__dot { width: 6px; height: 6px; border-radius: 50%; background: rgba(255,255,255,0.38); }
.camera__dot--live { background: #9be39b; animation: camera-live 1.6s ease-in-out infinite; }
@keyframes camera-live { 50% { opacity: 0.42; } }
.camera-wrap__joystick {
position: absolute;
z-index: 3;
bottom: 0;
left: 50%;
transform: translateX(-50%);
}
.joystick {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
min-width: 168px;
}
.joystick__ring {
position: relative;
width: 120px;
height: 120px;
border: 1px solid rgba(255, 255, 255, 0.14);
border-radius: 50%;
background: #1a1a1a;
box-shadow: 0 8px 21px -11px rgba(0, 0, 0, 0.78);
touch-action: none;
}
.joystick__ring--dragging { border-color: rgba(255, 149, 0, 0.65); }
.joystick--disabled { opacity: 0.48; }
.joystick__thumb {
position: absolute;
top: 50%;
left: 50%;
display: grid;
width: 40px;
height: 40px;
place-items: center;
border-radius: 50%;
transform: translate3d(-50%, -50%, 0);
color: #fff;
background: #ff9500;
box-shadow: 0 3px 8px -2px rgba(255, 149, 0, 0.45);
pointer-events: none;
}
.joystick__thumb svg { width: 22px; height: 22px; fill: none; stroke: currentColor; stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round; }
.joystick__label {
color: rgba(245, 245, 245, 0.57);
font-size: 10px;
font-weight: 700;
line-height: 1;
letter-spacing: 1.1px;
text-transform: uppercase;
}
.joystick__recenter {
position: absolute;
top: 44px;
right: -12px;
transform: translateX(100%);
padding: 6px 8px;
border: 1px solid rgba(255, 255, 255, 0.14);
border-radius: 8px;
color: rgba(245,245,245,0.8);
background: #1a1a1a;
font-size: 10px;
font-weight: 650;
}
.audio-card {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 13px;
padding: 15px;
border: 1px solid rgba(255, 255, 255, 0.09);
border-radius: 13px;
background: #1a1a1a;
}
.audio-channel { min-width: 0; display: flex; flex-direction: column; gap: 8px; }
.spectrum {
display: flex;
height: 34px;
align-items: end;
gap: 2px;
padding: 5px 7px;
border-radius: 8px;
background: rgba(255, 255, 255, 0.035);
opacity: 0.43;
}
.spectrum i {
flex: 1;
min-width: 1px;
height: var(--bar);
border-radius: 2px;
background: rgba(245, 245, 245, 0.42);
transform-origin: bottom;
}
.spectrum--active { opacity: 1; }
.spectrum--active i { background: #ff9500; animation: spectrum-bounce 800ms ease-in-out infinite alternate; animation-delay: calc(var(--bar) * -2ms); }
@keyframes spectrum-bounce { to { transform: scaleY(0.38); } }
.audio-channel__button {
width: 100%;
min-height: 44px;
border: 0;
border-radius: 8px;
color: rgba(245,245,245,0.73);
background: rgba(255,255,255,0.045);
font-size: 12px;
font-weight: 650;
}
.audio-channel__button span { margin-right: 6px; }
.audio-channel__button--on { color: #ffab3d; background: rgba(255, 149, 0, 0.13); }
.audio-channel__button:disabled { opacity: 0.46; }
.audio-channel__label { color: rgba(245,245,245,0.47); font-size: 10px; font-weight: 560; text-align: center; }
.audio-card__notice {
grid-column: 1 / -1;
margin: 0;
color: rgba(245,245,245,0.56);
font-size: 10px;
line-height: 1.4;
}
.session-card {
padding: 14px 16px 13px;
border: 1px solid rgba(255, 255, 255, 0.09);
border-radius: 13px;
background: rgba(26, 26, 26, 0.72);
}
.session-card__message { min-height: 19px; margin: 0 0 12px; color: rgba(245,245,245,0.7); font-size: 13px; line-height: 1.45; }
.session-card__message--error { color: #ffb6ae; }
.session-card__actions { display: flex; }
.primary-button {
flex: 1;
min-height: 44px;
border: 1px solid #ff9500;
border-radius: 9px;
color: #101013;
background: #ff9500;
font-size: 13px;
font-weight: 720;
}
.primary-button:disabled { opacity: 0.45; }
.primary-button--leave { color: #ffbdb7; border-color: rgba(255, 131, 119, 0.45); background: rgba(255, 117, 103, 0.1); }
.session-card__safety { margin: 10px 0 0; color: rgba(245,245,245,0.43); font-size: 10px; line-height: 1.35; }
@media (max-height: 760px) {
.app-shell { justify-content: flex-start; }
}
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; scroll-behavior: auto !important; }
}