Tray options implementation + Voice system rewrite + build fixes
This commit is contained in:
parent
412acb7e2d
commit
47b7e7a65d
117 changed files with 1300 additions and 2334 deletions
|
|
@ -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>.
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue