cobalt/web/src/routes/+layout.svelte
wukko a1bf0a454f
web/layout: remove content margin (frame)
it feels unnatural in safari and other browsers with colored headers

most browsers have their own frame nowadays (for some reason) so in those it looks even weirder than in regular ones (such as helium). just a waste of space.
2025-05-22 18:19:49 +06:00

212 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.mobile[$currentTheme]}
/>
{:else}
<meta
name="theme-color"
content={statusBarColors.desktop[$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);
margin-left: var(--content-border-thickness);
}
#content:dir(rtl) {
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;
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>