jenkins 09ba5f8ac0 hermes(voice): fix first-word clipping, always-stitch, panel glow, conversation mode
Round 2 from live testing:
- Clipping root cause: the endpointer committed on any 1.1s pause, so a
  thinking pause after a sentence opener sent one word; a speculative
  Whisper pass over that fragment then stalled the real commit ~3.5s on
  the Jetson. Young utterances now hold a 1.8s endpoint until 1.2s of
  speech accrues, speculative decode waits for 700ms of speech, resume
  is unconditional after any 650ms gap (server-frozen snapshots can
  never reach commit), and the noise floor is capped so playback echo
  cannot deafen onset. Deterministic capture-continuity probe added.
- Stitching now fires for any barge-cancelled send within 20s,
  regardless of partial assistant output.
- The workspace-drawer dark rectangle was our own HUX chrome resolving
  undefined theme tokens (--bg-primary) to a flat box; bootstrap.css
  bridges the real theme tokens and drops a compositor-hazard
  backdrop-filter.
- Conversation mode: full-viewport hands-free overlay with an energy-
  driven orb (mic RMS in, TTS activity out), state caption, live
  transcript/reply captions, mute and exit controls, focus trap,
  Escape, reduced-motion support. Voice lane 253 tests green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BvMSXH8VH2tMWXanb8SJdf
2026-08-24 11:21:35 -03:00

122 lines
3.3 KiB
CSS

.hux-workspace-toggle {
background: color-mix(in srgb, var(--bg-primary, #0a101b) 88%, #174653);
border: 1px solid rgb(94 231 215 / 45%);
border-radius: 999px;
bottom: max(5.8rem, calc(env(safe-area-inset-bottom) + 4.5rem));
box-shadow: 0 10px 32px rgb(0 0 0 / 32%);
color: var(--text-primary, #e7eef6);
cursor: pointer;
font: inherit;
padding: 0.55rem 0.9rem;
position: fixed;
right: max(1rem, env(safe-area-inset-right));
z-index: 115;
}
.hux-workspace-drawer {
background: color-mix(in srgb, var(--bg-primary, #0a101b) 97%, #102f3a);
border-left: 1px solid rgb(118 181 193 / 30%);
bottom: 0;
box-shadow: -18px 0 48px rgb(0 0 0 / 34%);
color: var(--text-primary, #e7eef6);
max-width: 100%;
overflow: auto;
position: fixed;
right: 0;
top: 0;
width: min(42rem, 94vw);
z-index: 160;
}
.hux-workspace-drawer[hidden] {
display: none !important;
}
.hux-workspace-drawer__header {
align-items: center;
backdrop-filter: blur(12px);
background: rgb(10 16 27 / 88%);
border-bottom: 1px solid rgb(118 181 193 / 24%);
display: flex;
justify-content: space-between;
padding: 0.8rem 1rem;
position: sticky;
top: 0;
z-index: 1;
}
.hux-workspace-drawer__header h2 {
font-size: 0.92rem;
margin: 0;
}
.hux-workspace-drawer__header button {
background: transparent;
border: 1px solid rgb(118 181 193 / 30%);
border-radius: 999px;
color: inherit;
cursor: pointer;
font: inherit;
padding: 0.4rem 0.7rem;
}
.hux-workspace-drawer__content {
display: grid;
gap: 0.8rem;
padding: 0.8rem;
}
.hux-workspace-wave {
min-width: 0;
}
.hux-workspace-toggle:focus-visible,
.hux-workspace-drawer button:focus-visible {
outline: 2px solid #5ee7d7;
outline-offset: 2px;
}
@media (max-width: 640px) {
.hux-workspace-drawer {
width: 100%;
}
}
@media (prefers-reduced-motion: no-preference) {
.hux-workspace-toggle {
transition: background-color 120ms ease, border-color 120ms ease;
}
}
@media (forced-colors: active) {
.hux-workspace-drawer,
.hux-workspace-toggle {
border-color: CanvasText;
}
}
/* ── Theme bridge for the Workspace chrome ─────────────────────────────── */
/* The pinned upstream WebUI theme (and hermes-brand.css on top of it) defines
--bg/--text but never --bg-primary/--text-primary, so every color-mix()
surface above resolved its fallback constant (#0a101b): with the drawer
open that painted a large flat dark rectangle that visibly broke the page's
themed background. Bridge the tokens to the app theme so the drawer, its
toggle and the shell inherit the real page background (light and dark) —
layout and component styling are deliberately untouched. */
.hux-workspace-toggle,
.hux-workspace-drawer,
.hux-shell {
--bg-primary: var(--bg, #0a101b);
--text-primary: var(--text, #e7eef6);
}
/* The header previously painted a hard-coded dark wash and sampled the page
through backdrop-filter; blurring the backdrop of a sticky header inside a
fixed overflow scroller is also a known Chromium compositor hazard on this
app's gradient background (see the stale-tile note in hermes-brand.css).
Track the theme instead and let the opaque drawer carry the surface. */
.hux-workspace-drawer__header {
backdrop-filter: none;
background: color-mix(in srgb, var(--bg, #0a101b) 92%, transparent);
}