54 lines
1.5 KiB
Vue
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>
|