Tray options implementation + Voice system rewrite + build fixes

This commit is contained in:
Priler 2026-01-07 23:29:46 +05:00
parent 412acb7e2d
commit 47b7e7a65d
117 changed files with 1300 additions and 2334 deletions

View file

@ -46,13 +46,13 @@
</p>
<p class="links last">
{#if $currentLanguage === "ru"}
{t('footer-support')} <a href={tgLink} target="_blank" class="telegram-link">
{t('footer-support')} <a href={boostyLink} target="_blank" class="telegram-link">
<img src="/media/icons/boosty.webp" alt="Boosty" width="18px" />
<span>Boosty</span>
</a>.
{/if}
{#if $currentLanguage === "ua" || $currentLanguage === "en"}
{t('footer-support')} <a href={tgLink} target="_blank" class="telegram-link">
{t('footer-support')} <a href={patreonLink} target="_blank" class="telegram-link">
<img src="/media/icons/patreon.png" alt="Patreon" width="18px" />
<span>Patreon</span>
</a>.

View file

@ -1,20 +1,12 @@
<script lang="ts">
import { jarvisState } from "@/stores"
$: stateClass = getStateClass($jarvisState)
function getStateClass(state: string): string {
switch (state) {
case "listening":
case "processing":
return "active"
case "idle":
return "idle"
case "disconnected":
default:
return "disconnected"
}
}
$: stateClass = {
'disconnected': 'disconnected',
'idle': 'idle',
'listening': 'active',
'processing': 'active'
}[$jarvisState] || 'disconnected'
</script>
<div id="arc-reactor" class="reactor-container {stateClass} arc-white">

View file

@ -1,22 +1,85 @@
<script lang="ts">
import { translations, translate } from "@/stores"
import { translations, translate, isJarvisRunning, ipcConnected, sendTextCommand } from "@/stores"
$: t = (key: string) => translate($translations, key)
let searchQuery = ""
let isProcessing = false
let statusMessage = ""
async function handleSubmit(e: Event) {
e.preventDefault()
const command = searchQuery.trim()
if (!command || isProcessing) return
if (!$isJarvisRunning || !$ipcConnected) {
statusMessage = t('search-error-not-running')
setTimeout(() => statusMessage = "", 3000)
return
}
isProcessing = true
statusMessage = ""
try {
await sendTextCommand(command)
searchQuery = ""
} catch (err) {
console.error("Failed to send command:", err)
statusMessage = t('search-error-failed')
setTimeout(() => statusMessage = "", 3000)
} finally {
isProcessing = false
}
}
function handleKeydown(e: KeyboardEvent) {
if (e.key === "Escape") {
searchQuery = ""
}
}
</script>
<div id="search-form" class="search" class:active={searchQuery !== ""}>
<form action="#" method="GET">
<div id="search-form" class="search" class:active={searchQuery !== ""} class:processing={isProcessing}>
<form on:submit={handleSubmit}>
<input
bind:value={searchQuery}
on:keydown={handleKeydown}
type="text"
name="q"
placeholder={t('search-placeholder')}
autocomplete="off"
minlength="3"
maxlength="30"
minlength="1"
maxlength="200"
disabled={isProcessing}
/>
<small>Enter</small>
<small>{isProcessing ? '...' : 'Enter'}</small>
</form>
</div>
{#if statusMessage}
<div class="search-status">{statusMessage}</div>
{/if}
</div>
<style lang="scss">
.search.processing input {
opacity: 0.6;
cursor: wait;
}
.search-status {
position: absolute;
bottom: -24px;
left: 50%;
transform: translateX(-50%);
font-size: 0.75rem;
color: rgba(82, 254, 254, 0.8);
white-space: nowrap;
animation: fadeIn 0.2s ease;
}
@keyframes fadeIn {
from { opacity: 0; transform: translateX(-50%) translateY(-5px); }
to { opacity: 1; transform: translateX(-50%) translateY(0); }
}
</style>

View file

@ -12,10 +12,10 @@
$: t = (key: string) => translate($translations, key)
let microphoneName = "Загрузка..."
let microphoneName = ""
let wakeWordEngine = "Rustpotter"
let sttEngine = "Vosk"
let vadInfo = "Snip + ChatGPT"
let vadInfo = ""
onMount(async () => {
microphoneName = t('stats-loading')
@ -68,7 +68,7 @@
<span class="stat-dot" class:active={$ipcConnected} style="--color: #3b82f6;"></span>
<div class="stat-content">
<span class="stat-label">{t('stats-resources')}</span>
<span class="stat-value">{#if jarvisRamUsage }RAM {$jarvisRamUsage}mb{:else}...{/if}</span>
<span class="stat-value">{#if $jarvisRamUsage }RAM {$jarvisRamUsage}mb{:else}...{/if}</span>
</div>
</div>
</div>