Files
gods-eye-view/style.css
T
manjunath22466andDarren Dignam af461febae feat(voice): add typed AI chat beside voice
Chat sits next to the mic in the command dock. Replies are silent and never
request the microphone; the first message connects with the selected provider
and runs the same map actions as voice through each provider's text API
(OpenAI OPENAI_CHAT_MODEL, Gemini GEMINI_CHAT_MODEL via generateContent, which
never starts Live). Only one mode runs at a time.

- Chat panel rendered by the voice control presenter: conversation, recent and
  quick-command suggestions, Up/Down history, attachments (map-layer
  references or small UTF-8 text files, sent only with the message)
- Chat and voice panels sit above the dock or dock into the right rail's
  column; minimized bars sit centred above the dock, and height animates on
  swaps
- A centred panel steps down to its bar for the Location and Visual Presets
  trays without moving focus, rests above an open tray, and docks right while
  expanded over one; it returns to the centre once the trays close
- Minimized voice previews the last sentence from each side; the empty Voice
  Preview suggests things to say
- Settings opened from chat keep chat's frame and show the shared AI provider
  and quick commands; voice Settings show Back to voice
- Closing chat ends a typed session; the voice panel's close turns voice off
- The dock widens its voice control for the chat button and restyles its
  wings, which show icons only at 900px and below; assistant panels share the
  left panels' glass, and Cyber keeps its own surfaces
- Server text-chat handlers with body, time and per-IP limits
  (GEV_RATELIMIT_*_CHAT_PER_MIN), documented in SECURITY.md; tests and all
  eleven locales

Co-authored-by: Darren Dignam <[email protected]>
2026-11-02 20:56:39 +05:30

41 lines
1.7 KiB
CSS

/* Preserve component and responsive rule order in one stylesheet entry. */
@import './src/ui/styles/foundation.css';
@import './src/ui/styles/action-button.css';
@import './src/ui/styles/form-field.css';
@import './src/ui/styles/status-badge.css';
@import './src/ui/styles/slider.css';
@import './src/ui/styles/controls.css';
@import './src/ui/styles/location.css';
@import './src/ui/styles/status.css';
@import './src/ui/styles/cockpit.css';
@import './src/ui/styles/overlays.css';
@import './src/ui/styles/layers.css';
@import './src/ui/styles/radio.css';
@import './src/ui/styles/cctv.css';
@import './src/ui/styles/street-level.css';
@import './src/ui/styles/scenes.css';
@import './src/ui/styles/bhote-koshi.css';
@import './src/ui/styles/recent-imagery.css';
@import './src/ui/styles/recording.css';
@import './src/ui/styles/embed.css';
@import './src/ui/styles/responsive.css';
@import './src/ui/styles/command-dock.css';
@import './src/ui/styles/command-dock-compact.css';
@import './src/ui/styles/command-dock-trays.css';
@import './src/ui/styles/command-dock-sliding.css';
@import './src/ui/styles/voice-cost.css';
@import './src/ui/styles/voice-card.css';
@import './src/ui/styles/first-run.css';
@import './src/ui/styles/provider-settings.css';
@import './src/ui/styles/locale-picker.css';
@import './src/ui/styles/weather.css';
@import './src/ui/styles/panel-surfaces.css';
@import './src/ui/styles/segmented-control.css';
@import './src/ui/styles/kit.css';
@import './src/ui/styles/cjk.css';
@import './src/ui/styles/rtl.css';
@import './src/ui/styles/mobile-shell.css';
@import './src/ui/styles/annotations.css';
@import './src/ui/styles/ai-chat.css';
@import './src/ui/styles/cyber.css';