Files
Webka/frontend/app.vue
2026-09-06 16:23:09 +05:00

54 lines
1.5 KiB
Vue

<script setup lang="ts">
const { locale } = useI18n();
const session = useSessionStore();
const theme = useCookie("webka_theme", { default: () => "dark" });
const accent = useCookie("webka_accent", { default: () => "#c3f66b" });
useHead({
htmlAttrs: { lang: locale, "data-theme": theme },
bodyAttrs: {
style: computed(
() =>
`--accent: ${/^#[a-f\d]{6}$/i.test(accent.value) ? accent.value : "#c3f66b"}`,
),
},
});
let heartbeat: ReturnType<typeof setInterval>;
onMounted(() => {
heartbeat = setInterval(async () => {
if (
session.user &&
document.visibilityState === "visible" &&
!(await session.refresh())
)
await navigateTo("/login");
}, 60000);
});
onBeforeUnmount(() => clearInterval(heartbeat));
</script>
<template>
<div class="app-shell">
<svg class="glass-filter" aria-hidden="true" width="0" height="0">
<defs>
<filter id="glass-lens" x="-5%" y="-5%" width="110%" height="110%">
<feTurbulence
type="fractalNoise"
baseFrequency="0.012 0.018"
numOctaves="2"
seed="8"
result="noise"
/>
<feDisplacementMap
in="SourceGraphic"
in2="noise"
scale="3"
xChannelSelector="R"
yChannelSelector="G"
/>
</filter>
</defs></svg
><a class="skip-link" href="#main">{{ $t("common.skip") }}</a
><GlassNavBar />
<main id="main"><NuxtPage /></main>
</div>
</template>