Files
frontend-svelte/src/app/ui/Layout.svelte

102 lines
3.1 KiB
Svelte
Raw Normal View History

<script lang="ts">
/**
* Layout Component
*
* Root layout wrapper that provides the application shell structure. Handles favicon,
* toolbar provider initialization, and renders child routes with consistent structure.
*
* Layout structure:
* - Header area (currently empty, reserved for future use)
*
* - Footer area (currently empty, reserved for future use)
*/
import { BreadcrumbHeader } from '$entities/Breadcrumb';
2026-02-09 09:39:58 +03:00
import GD from '$shared/assets/GD.svg';
import { ResponsiveProvider } from '$shared/lib';
import { ScrollArea } from '$shared/shadcn/ui/scroll-area';
2026-01-24 15:32:01 +03:00
import { Provider as TooltipProvider } from '$shared/shadcn/ui/tooltip';
import {
type Snippet,
onMount,
} from 'svelte';
2026-01-24 15:32:01 +03:00
interface Props {
children: Snippet;
}
2026-01-24 15:32:01 +03:00
let { children }: Props = $props();
let fontsReady = $state(false);
/**
* Sets fontsReady flag to true when font for the page logo is loaded.
*/
onMount(async () => {
if (!('fonts' in document)) {
fontsReady = true;
return;
}
const required = ['100'];
const missing = required.filter(
w => !document.fonts.check(`${w} 1em Barlow`),
);
if (missing.length > 0) {
await Promise.all(
missing.map(w => document.fonts.load(`${w} 1em Barlow`)),
);
}
fontsReady = true;
});
</script>
<svelte:head>
2026-02-09 09:39:58 +03:00
<link rel="icon" href={GD} />
<link rel="preconnect" href="https://api.fontshare.com" />
<link rel="preconnect" href="https://cdn.fontshare.com" crossorigin="anonymous" />
2026-01-22 15:31:59 +03:00
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous">
<link
rel="preload"
as="style"
href="https://fonts.googleapis.com/css2?family=Barlow:ital,wght@0,100;0,200;1,100;1,200&family=Karla:wght@200..800&display=swap"
2026-01-22 15:31:59 +03:00
>
<link
rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Barlow:ital,wght@0,100;0,200;1,100;1,200&family=Karla:wght@200..800&display=swap"
media="print"
onload={(e => ((e.currentTarget as HTMLLinkElement).media = 'all'))}
>
<noscript>
<link
rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Barlow:ital,wght@0,100;0,200;1,100;1,200&family=Karla:wght@200..800&display=swap"
>
</noscript>
<title>
Compare Typography & Typefaces | GlyphDiff
</title>
</svelte:head>
<ResponsiveProvider>
<div id="app-root" class="min-h-screen flex flex-col bg-background">
<header>
<BreadcrumbHeader />
</header>
<!-- <ScrollArea class="h-screen w-screen"> -->
2026-02-06 14:48:44 +03:00
<main class="flex-1 h-full w-full max-w-6xl mx-auto px-0 pt-0 pb-10 sm:px-6 sm:pt-8 sm:pb-12 md:px-8 md:pt-10 md:pb-16 lg:px-10 lg:pt-12 lg:pb-20 xl:px-16 relative overflow-x-hidden">
<TooltipProvider>
{#if fontsReady}
{@render children?.()}
{/if}
</TooltipProvider>
</main>
<!-- </ScrollArea> -->
<footer></footer>
</div>
</ResponsiveProvider>