From 48589d492962a8bcca33f06d78bf3ba121195c47 Mon Sep 17 00:00:00 2001
From: erdfern <rexsomnia@pm.me>
Date: Sun, 19 Jan 2025 12:43:14 +0100
Subject: [PATCH] simplify layout (bars fixed instead of sticky with scrolling
 main content)

---
 src/lib/components/SideBar.svelte | 29 +++++----------
 src/routes/(app)/+layout.svelte   | 61 +++++++++++++++----------------
 2 files changed, 40 insertions(+), 50 deletions(-)

diff --git a/src/lib/components/SideBar.svelte b/src/lib/components/SideBar.svelte
index f7e35872..421c59ed 100644
--- a/src/lib/components/SideBar.svelte
+++ b/src/lib/components/SideBar.svelte
@@ -13,36 +13,27 @@
 	import { sidebarState } from '$lib/stores/layout.svelte';
 	import { Navigation } from '@skeletonlabs/skeleton-svelte';
 
-	let { classes = 'sticky top-0 col-span-1 h-screen' }: { classes?: string } = $props();
+	// let { classes = 'sticky top-0 col-span-1 h-screen' }: { classes?: string } = $props();
 
-	let expandedText = $derived(sidebarState.isOpen ? 'Collapse' : 'Expand');
+	// let expandedText = $derived(sidebarState.isOpen ? 'Collapse' : 'Expand');
 	// let expandedIcon = $derived(expanded ? PanelRightCloseIcon : PanelRightOpenIcon);
 </script>
 
 <!-- TODO ensure active tile stays active after page reload -->
-<Navigation.Rail
-	expanded={sidebarState.isOpen}
-	height="h-screen"
-	base=""
-	classes="sticky top-0 col-span-1 "
->
+<Navigation.Rail expanded={sidebarState.isOpen}>
 	{#snippet header()}
 		<!-- TODO improve collapse/expand button styling and positioning -->
-		<!--<div>
-			<button onclick={() => (sidebarState.isOpen = !sidebarState.isOpen)} class="btn btn-sm">
-				{#if sidebarState.isOpen}
-					<ChevronLeft />
-				{:else}
-					<ChevronRight />
-				{/if}
-			</button>
-		</div>
-		-->
+		<button onclick={() => (sidebarState.isOpen = !sidebarState.isOpen)} class="btn btn-sm w-full">
+			{#if sidebarState.isOpen}
+				<ChevronLeft />
+			{:else}
+				<ChevronRight />
+			{/if}
+		</button>
 
 		<Navigation.Tile id="header-tile" title="Home" labelExpanded="Home" href="/">
 			<HomeIcon />
 		</Navigation.Tile>
-		<!--</button> -->
 	{/snippet}
 	{#snippet tiles()}
 		<!-- TODO improve visual item grouping for items with children -->
diff --git a/src/routes/(app)/+layout.svelte b/src/routes/(app)/+layout.svelte
index d86af279..9a38a956 100644
--- a/src/routes/(app)/+layout.svelte
+++ b/src/routes/(app)/+layout.svelte
@@ -1,35 +1,32 @@
 <script lang="ts">
-	import { page } from '$app/state';
 	import SideBar from '$lib/components/SideBar.svelte';
 
 	import ThemeToggle from '$lib/components/ThemeToggle.svelte';
-	import { onMount } from 'svelte';
 
 	let { children } = $props();
 
-	let headerElement: HTMLElement | null = null;
-	let headerHeight: number | null = $state(null);
+	// let headerElement: HTMLElement | null = null;
+	// let headerHeight: number | null = $state(null);
 
-	onMount(() => {
-		const updateHeaderHeight = () => {
-			if (headerElement !== null) {
-				headerHeight = headerElement.offsetHeight;
-			}
-		};
+	// onMount(() => {
+	// 	const updateHeaderHeight = () => {
+	// 		if (headerElement !== null) {
+	// 			headerHeight = headerElement.offsetHeight;
+	// 		}
+	// 	};
 
-		updateHeaderHeight();
-		window.addEventListener('resize', updateHeaderHeight);
+	// 	updateHeaderHeight();
+	// 	window.addEventListener('resize', updateHeaderHeight);
 
-		return () => {
-			window.removeEventListener('resize', updateHeaderHeight);
-		};
-	});
+	// 	return () => {
+	// 		window.removeEventListener('resize', updateHeaderHeight);
+	// 	};
+	// });
 </script>
 
-<div class="grid grid-rows-[auto_1fr_auto]">
-	<!-- Header Bar -->
+<div class="grid h-screen grid-rows-[auto_1fr_auto]">
+	<!-- Header -->
 	<header
-		bind:this={headerElement}
 		class="text-slate-50-950 grid grid-cols-3 items-center gap-4 px-4 py-2 bg-primary-200-800"
 	>
 		<div class="justify-self-start">
@@ -41,20 +38,22 @@
 		<div class="justify-self-center text-xl">(Page Title/breadcrumbs?)</div>
 		<div class="justify-self-end"><ThemeToggle /></div>
 	</header>
-
-	<!-- Page -->
-	<div class="grid grid-cols-[auto_1fr]">
-		<!-- Side Bar (subtract header height since it's sticky, too) -->
-		<!--<SideBar classes="sticky top-0 col-span-1 h-[calc(100vh-{headerHeight}px)]" /> -->
-
-		<aside class="sticky top-0 col-span-1 h-screen bg-yellow-500 p-4">(sidebar)</aside>
-
-		<!-- Page Route Content -->
-		<main class="col-span-1 space-y-4 p-2 bg-surface-200-800">{@render children?.()}</main>
+	<!--<nav>(subheader/trail nav)</nav>-->
+
+	<!-- Grid Columns -->
+	<div class="grid grid-cols-1 overflow-hidden md:grid-cols-[auto_1fr]">
+		<!-- Sidebar -->
+		<!-- TODO change for small screen sizes -->
+		<!-- h-full? apply h-screen if sticky -->
+		<SideBar />
+
+		<!-- main + footer container (so that the footer scrolls into view after main) -->
+		<main class="space-y-4 overflow-y-auto p-4 bg-surface-200-800">
+			{@render children?.()}
+		</main>
 	</div>
-
 	<!-- Footer -->
-	<footer class="bg-blue-500 p-4">(footer)</footer>
+	<!--<footer class="bg-blue-500 p-4">(footer)</footer>-->
 </div>
 
 <style lang="postcss">
-- 
GitLab