jenkins 4d93ef5a0e hermes(voice): workspace nav home, character orb, conversation rename, voice-lang fix
Final conversation-mode polish from mobile testing:
- The Workspace toggle now sits with the chat/Telegram nav at every
  width: nav.rail on desktop, the top app titlebar on mobile. The
  floating pill that pushed the mobile composer's control row (and the
  conversation-mode button) off screen is gone - a fallback exists only
  for headless DOMs and is pinned to a top corner, never over the
  composer.
- The conversation orb watermark is now the Hermes character avatar
  (static/hermes-agent-192.png) instead of the caduceus staff.
- User-facing 'hands-free' copy renamed to 'Conversation mode'.
- Wrong-voice fix: strongReplyLanguage flagged Spanish on a single
  accented char, so an English reply naming European cities (Zürich,
  Málaga) overrode the correct English STT detection and was spoken by
  the Spanish voice. Detection now requires density (Cyrillic >=4 at
  >=50%, or inverted punctuation / >=2 accents corroborated by Spanish
  stopwords); plain English always speaks English, forced language wins,
  accent-free Spanish still routes via trusted STT. 294 voice tests.

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

172 lines
5.0 KiB
CSS

/* Floating fallback: only rendered when NO nav home exists (headless/degenerate
DOMs). Pinned to the TOP-right corner — never the bottom — so it can never
overlap, push, or reflow the message composer's bottom control row. In the
real app both nav homes exist, so this never appears. */
.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;
top: max(0.6rem, env(safe-area-inset-top));
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;
}
/* Mobile top-app-bar Workspace toggle: an icon-only button beside the app's own
new-chat/reload icons. Shown only below the rail breakpoint (where the rail —
and its own toggle — is hidden), so exactly one Workspace entry is ever
visible and nothing floats over the composer. */
.hux-workspace-titlebar-toggle {
align-items: center;
background: none;
border: none;
border-radius: 8px;
color: var(--muted, #9fb0c0);
cursor: pointer;
display: none;
flex-shrink: 0;
height: 44px;
justify-content: center;
padding: 0;
width: 44px;
-webkit-app-region: no-drag;
-webkit-tap-highlight-color: transparent;
}
.hux-workspace-titlebar-toggle:hover {
background: var(--hover-bg, rgb(94 231 215 / 12%));
color: var(--text, #e7eef6);
}
.hux-workspace-titlebar-toggle[aria-expanded="true"] {
background: var(--accent-bg, rgb(94 231 215 / 18%));
color: var(--accent-text, var(--text, #e7eef6));
}
@media (max-width: 640px) {
.hux-workspace-titlebar-toggle {
display: inline-flex;
}
}
.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-toggle-rail:focus-visible,
.hux-workspace-titlebar-toggle:focus-visible,
.hux-workspace-drawer button:focus-visible {
outline: 2px solid #5ee7d7;
outline-offset: 2px;
}
/* Rail-mounted Workspace toggle: the upstream .rail-btn/.has-tooltip rules
own its look and tooltip; only the open-drawer state is marked here. */
.hux-workspace-toggle-rail[aria-expanded="true"] {
background: var(--accent-bg, rgb(94 231 215 / 18%));
color: var(--accent-text, var(--text, #e7eef6));
}
@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);
}