mirror of
https://github.com/imputnet/cobalt.git
synced 2025-06-29 01:48:28 +00:00

now it's perfectly aligned with macos' window border radius. probably on windows 11 too cuz they copied macos big sur
210 lines
6.1 KiB
Svelte
210 lines
6.1 KiB
Svelte
<script lang="ts">
|
|
import "../app.css";
|
|
|
|
import "@fontsource/ibm-plex-mono/400.css";
|
|
import "@fontsource/ibm-plex-mono/400-italic.css";
|
|
import "@fontsource/ibm-plex-mono/500.css";
|
|
|
|
import { onMount } from "svelte";
|
|
import { page } from "$app/stores";
|
|
import { updated } from "$app/stores";
|
|
import { browser } from "$app/environment";
|
|
import { afterNavigate } from "$app/navigation";
|
|
|
|
import "$lib/polyfills";
|
|
import env from "$lib/env";
|
|
import locale from "$lib/i18n/locale";
|
|
import settings from "$lib/state/settings";
|
|
|
|
import { t } from "$lib/i18n/translations";
|
|
|
|
import { device, app } from "$lib/device";
|
|
import { getServerInfo } from "$lib/api/server-info";
|
|
import currentTheme, { statusBarColors } from "$lib/state/theme";
|
|
import { turnstileCreated, turnstileEnabled } from "$lib/state/turnstile";
|
|
|
|
import Sidebar from "$components/sidebar/Sidebar.svelte";
|
|
import Turnstile from "$components/misc/Turnstile.svelte";
|
|
import NotchSticker from "$components/misc/NotchSticker.svelte";
|
|
import DialogHolder from "$components/dialog/DialogHolder.svelte";
|
|
import ProcessingQueue from "$components/queue/ProcessingQueue.svelte";
|
|
import UpdateNotification from "$components/misc/UpdateNotification.svelte";
|
|
|
|
$: reduceMotion =
|
|
$settings.accessibility.reduceMotion || device.prefers.reducedMotion;
|
|
|
|
$: reduceTransparency =
|
|
$settings.accessibility.reduceTransparency ||
|
|
device.prefers.reducedTransparency;
|
|
|
|
$: preloadMeowbalt = false;
|
|
$: plausibleLoaded = false;
|
|
|
|
afterNavigate(async () => {
|
|
const to_focus: HTMLElement | null =
|
|
document.querySelector("[data-first-focus]");
|
|
to_focus?.focus();
|
|
|
|
if ($page.url.pathname === "/") {
|
|
await getServerInfo();
|
|
}
|
|
});
|
|
|
|
onMount(() => {
|
|
preloadMeowbalt = true;
|
|
});
|
|
</script>
|
|
|
|
<svelte:head>
|
|
<meta name="description" content={$t("general.embed.description")} />
|
|
<meta property="og:description" content={$t("general.embed.description")} />
|
|
|
|
{#if env.HOST}
|
|
<meta
|
|
property="og:url"
|
|
content="https://{env.HOST}{$page.url.pathname}"
|
|
/>
|
|
{/if}
|
|
|
|
{#if device.is.mobile}
|
|
<meta name="theme-color" content={statusBarColors[$currentTheme]} />
|
|
{/if}
|
|
|
|
{#if plausibleLoaded || (browser && env.PLAUSIBLE_ENABLED && !$settings.privacy.disableAnalytics)}
|
|
<script
|
|
defer
|
|
data-domain={env.HOST}
|
|
on:load={() => {
|
|
plausibleLoaded = true;
|
|
}}
|
|
src="https://{env.PLAUSIBLE_HOST}/js/script.js"
|
|
></script>
|
|
{/if}
|
|
</svelte:head>
|
|
|
|
<div
|
|
style="display: contents"
|
|
data-theme={browser ? $currentTheme : undefined}
|
|
lang={$locale}
|
|
>
|
|
{#if preloadMeowbalt}
|
|
<div id="preload-meowbalt" aria-hidden="true"></div>
|
|
{/if}
|
|
<div
|
|
id="cobalt"
|
|
class:loaded={browser}
|
|
data-chrome={device.browser.chrome}
|
|
data-iphone={device.is.iPhone}
|
|
data-reduce-motion={reduceMotion}
|
|
data-reduce-transparency={reduceTransparency}
|
|
>
|
|
{#if device.is.iPhone && app.is.installed}
|
|
<NotchSticker />
|
|
{/if}
|
|
<DialogHolder />
|
|
<Sidebar />
|
|
{#if $updated}
|
|
<UpdateNotification />
|
|
{/if}
|
|
<ProcessingQueue />
|
|
<div id="content">
|
|
{#if ($turnstileEnabled && $page.url.pathname === "/") || $turnstileCreated}
|
|
<Turnstile />
|
|
{/if}
|
|
<slot></slot>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<style>
|
|
#cobalt {
|
|
height: 100%;
|
|
width: 100%;
|
|
display: grid;
|
|
grid-template-columns:
|
|
calc(var(--sidebar-width) + var(--sidebar-inner-padding) * 2)
|
|
1fr;
|
|
overflow: hidden;
|
|
background-color: var(--sidebar-bg);
|
|
color: var(--secondary);
|
|
position: fixed;
|
|
}
|
|
|
|
/* add padding for notch / dynamic island in landscape */
|
|
@media screen and (orientation: landscape) and (min-width: 535px) {
|
|
#cobalt[data-iphone="true"] {
|
|
grid-template-columns:
|
|
calc(
|
|
var(--sidebar-width) + var(--sidebar-inner-padding) * 2 +
|
|
env(safe-area-inset-left)
|
|
)
|
|
1fr;
|
|
}
|
|
|
|
#cobalt[data-iphone="true"] #content {
|
|
padding-right: env(safe-area-inset-right);
|
|
/* disable the desktop frame */
|
|
margin: 0;
|
|
box-shadow: none;
|
|
border-radius: 0;
|
|
}
|
|
}
|
|
|
|
#content {
|
|
display: flex;
|
|
overflow: scroll;
|
|
background-color: var(--primary);
|
|
box-shadow: 0 0 0 var(--content-border-thickness) var(--content-border);
|
|
|
|
border-radius: 6px;
|
|
margin: var(--content-margin);
|
|
margin-left: var(--content-border-thickness);
|
|
}
|
|
|
|
#content:dir(rtl) {
|
|
margin-left: var(--content-margin);
|
|
margin-right: var(--content-border-thickness);
|
|
}
|
|
|
|
@media screen and (max-width: 535px) {
|
|
/* dark navbar cuz it looks better on mobile */
|
|
:global([data-theme="light"]) {
|
|
--sidebar-bg: #000000;
|
|
--sidebar-highlight: var(--primary);
|
|
}
|
|
|
|
#cobalt {
|
|
display: grid;
|
|
grid-template-columns: unset;
|
|
grid-template-rows:
|
|
1fr
|
|
calc(
|
|
var(--sidebar-height-mobile) + var(--sidebar-inner-padding) * 2
|
|
);
|
|
}
|
|
|
|
#content,
|
|
#content:dir(rtl) {
|
|
padding-top: env(safe-area-inset-top);
|
|
order: -1;
|
|
|
|
margin: 0;
|
|
box-shadow: none;
|
|
border-radius: 0;
|
|
|
|
border-bottom-left-radius: calc(var(--border-radius) * 2);
|
|
border-bottom-right-radius: calc(var(--border-radius) * 2);
|
|
}
|
|
}
|
|
|
|
/* preload meowbalt assets to prevent flickering in dialogs */
|
|
#preload-meowbalt {
|
|
width: 0;
|
|
height: 0;
|
|
position: absolute;
|
|
z-index: -10;
|
|
content: url(/meowbalt/smile.png) url(/meowbalt/error.png)
|
|
url(/meowbalt/question.png) url(/meowbalt/think.png);
|
|
}
|
|
</style>
|