DUNGEONS-34: implement Webka local streaming app

Co-authored-by: multica-agent <github@multica.ai>
This commit is contained in:
2026-09-06 16:23:09 +05:00
parent 5540b9a1f4
commit 7c737c1011
36 changed files with 21596 additions and 0 deletions

View File

@@ -0,0 +1,46 @@
<script setup lang="ts">
import { Globe2, ChevronDown } from "lucide-vue-next";
const { locale, setLocale } = useI18n();
const open = ref(false);
const root = ref<HTMLElement>();
const languages = [
{ code: "en", name: "English" },
{ code: "ru", name: "Русский" },
{ code: "es", name: "Español" },
] as const;
function outside(e: PointerEvent) {
if (!root.value?.contains(e.target as Node)) open.value = false;
}
onMounted(() => document.addEventListener("pointerdown", outside));
onBeforeUnmount(() => document.removeEventListener("pointerdown", outside));
</script>
<template>
<div ref="root" class="language" @keydown.esc="open = false">
<GlassButton
:aria-label="$t('general.language')"
:aria-expanded="open"
aria-controls="language-options"
@click="open = !open"
><Globe2 :size="17" /><span>{{ locale.toUpperCase() }}</span
><ChevronDown :size="14"
/></GlassButton>
<GlassCard
v-if="open"
id="language-options"
class="language-menu"
role="group"
:aria-label="$t('general.language')"
><button
v-for="lang in languages"
:key="lang.code"
:aria-pressed="locale === lang.code"
@click="
setLocale(lang.code);
open = false;
"
>
{{ lang.name }}<span v-if="locale === lang.code">✓</span>
</button></GlassCard
>
</div>
</template>