cobalt/web/src/routes/+layout.svelte
wukko 6d315e3e74
web/layout: fix border radius of content on desktop
now it's perfectly aligned with macos' window border radius. probably on windows 11 too cuz they copied macos big sur
2025-04-23 21:03:48 +06:00

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>