From 21dbcde7c851cfcd73939bc4143157af507f3e72 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E2=98=99=E2=97=A6=20The=20Tablet=20=E2=9D=80=20GamerGirla?=
 =?UTF-8?q?ndCo=20=E2=97=A6=E2=9D=A7?= <i.am.the.tablet@proton.me>
Date: Sat, 30 Dec 2023 19:09:06 -0500
Subject: [PATCH] refactor(components): change layout

add collapsible version of navbar to side if screen width < medium, otherwise display the full horizontal navbar at the top
---
 components/layouts/navbar.vue |   9 ++-
 layouts/default.vue           | 114 ++++++++++++++++++----------------
 2 files changed, 68 insertions(+), 55 deletions(-)

diff --git a/components/layouts/navbar.vue b/components/layouts/navbar.vue
index f020266..80badb8 100644
--- a/components/layouts/navbar.vue
+++ b/components/layouts/navbar.vue
@@ -1,4 +1,6 @@
 <script lang="ts" setup>
+	import { Grid } from "ant-design-vue";
+	const bp = Grid.useBreakpoint();
 	const { data, status } = useAuth();
 	const itemMap = ref({
 		home: "/",
@@ -15,6 +17,7 @@
 		admin: "/admin",
 		logout: "/auth/logout",
 	});
+	const propo = defineProps<{ inline: boolean }>();
 	let cur = ref<string>(Object.keys(itemMap.value).find((a) => itemMap.value[a] === useRoute().path) || useRoute().path);
 	let selected: string[] = [cur.value];
 
@@ -28,12 +31,12 @@
 </script>
 
 <template>
-	<div class="some-wrapper">
+	<div class="some-wrapper" :style="{ flexDirection: inline ? 'column' : 'row' }">
 		<a-menu
-			mode="horizontal"
+			:mode="inline ? 'inline' : 'horizontal'"
 			class="navibar"
 			:style="{
-				height: '40px',
+				height: !inline ? '40px' : '100%',
 				alignSelf: 'center',
 				justifyContent: 'stretch',
 				width: '100%',
diff --git a/layouts/default.vue b/layouts/default.vue
index 79b3632..63bd7bb 100644
--- a/layouts/default.vue
+++ b/layouts/default.vue
@@ -1,10 +1,12 @@
 <script setup lang="ts">
-	import { theme } from "ant-design-vue";
+	import { theme, Grid } from "ant-design-vue";
 	import navbar from "~/components/layouts/navbar.vue";
 	import cfooter from "~/components/layouts/footer.vue";
 	import sidebarThing from "~/components/layouts/sidebar.vue";
 	import icon from "~/components/icon.vue";
 
+	const bp = Grid.useBreakpoint();
+
 	const { useToken } = theme;
 	const { token } = useToken();
 
@@ -15,6 +17,7 @@
 	} = await useApiFetch<{ stories: number; authors: number }>("/totals");
 
 	const collapsed = ref<boolean>(true);
+	const nav = ref<boolean>(false);
 
 	collapsed.value = true;
 
@@ -46,61 +49,68 @@
 			<a-typography-title> ¯\_(ツ)_/¯ </a-typography-title>
 			<i> Nothing here but crickets. </i>
 		</template>
-		<a-layout class="ylayout" has-sider>
-			<a-layout class="mlayout">
-				<a-layout-header class="alayhead">
-					<div style="display: flex; align-items: center; flex-wrap: wrap">
-						<div class="siteTitle">Rockfic</div>
-						<div class="stat-block">
-							<div>
-								<a-typography-text> Band fiction that rocks </a-typography-text>
-								<a-typography-text type="secondary"> With {{ totals?.stories || 0 }} stories by {{ totals?.authors || 0 }} authors </a-typography-text>
-							</div>
+		<a-layout class="ylayout">
+			<a-layout-header class="alayhead">
+				<div style="display: flex; align-items: center; flex-wrap: wrap">
+					<div class="siteTitle">Rockfic</div>
+					<div class="stat-block">
+						<div>
+							<a-typography-text> Band fiction that rocks </a-typography-text>
+							<a-typography-text type="secondary"> With {{ totals?.stories || 0 }} stories by {{ totals?.authors || 0 }} authors </a-typography-text>
 						</div>
-						<navbar />
 					</div>
-				</a-layout-header>
+					<navbar v-if="!!bp['md']" :inline="false" />
+				</div>
+				<a-button type="primary" @click="() => (nav = !nav)" v-if="!bp['md']">
+					<menu-unfold-outlined v-if="nav" />
+					<menu-fold-outlined v-else />
+				</a-button>
+			</a-layout-header>
+			<a-layout class="mlayout" has-sider>
+				<a-layout-sider :trigger="null" :collapsed-width="0" :collapsible="true" v-model:collapsed="nav" v-if="!bp['md']">
+					<navbar inline />
+				</a-layout-sider>
 				<a-layout-content style="flex-grow: 1">
 					<slot />
 				</a-layout-content>
-				<a-layout-footer style="bottom: 100%">
-					<cfooter />
-				</a-layout-footer>
-			</a-layout>
-			<a-layout-sider
-				:zero-width-trigger-style="{
-					background: '#e92662',
-					padding: '1.2em',
-					position: 'fixed',
-					right: 0,
-					borderRadius: '15%',
-					color: 'white',
-					border: '2.4px solid #fffFFF80',
-					top: '75vh',
-					'z-index': 99999999,
-				}"
-				:theme="darko ? 'dark' : 'light'"
-				:breakpoint="'lg'"
-				v-model:collapsed="collapsed"
-				:collapsible="true"
-				:collapsed-width="0"
-				:style="{
-					color: col,
-					height: '100%',
-					position: 'fixed',
-					right: '0px',
-					borderLeft: `2px solid ${darko ? '#fff' : '#ccc'}`,
-				}"
-			>
-				<sidebar-thing />
-				<template #trigger>
-					<div class="outerst" @click="() => (collapsed = !collapsed)">
-						<div :class="sideTriggerVal">
-							<icon istyle="solid" name="chevron-right" :size="30" />
+				<a-layout-sider
+					:zero-width-trigger-style="{
+						background: '#e92662',
+						padding: '1.2em',
+						position: 'fixed',
+						right: 0,
+						borderRadius: '15%',
+						color: 'white',
+						border: '2.4px solid #fffFFF80',
+						top: '75vh',
+						'z-index': 99999999,
+					}"
+					:theme="darko ? 'dark' : 'light'"
+					:breakpoint="'lg'"
+					v-model:collapsed="collapsed"
+					:collapsible="true"
+					:collapsed-width="0"
+					:style="{
+						color: col,
+						height: '100%',
+						position: 'fixed',
+						right: '0px',
+						borderLeft: `2px solid ${darko ? '#fff' : '#ccc'}`,
+					}"
+				>
+					<sidebar-thing />
+					<template #trigger>
+						<div class="outerst" @click="() => (collapsed = !collapsed)">
+							<div :class="sideTriggerVal">
+								<icon istyle="solid" name="chevron-right" :size="30" />
+							</div>
 						</div>
-					</div>
-				</template>
-			</a-layout-sider>
+					</template>
+				</a-layout-sider>
+			</a-layout>
+			<a-layout-footer style="bottom: 100%">
+				<cfooter />
+			</a-layout-footer>
 		</a-layout>
 		<!-- <div class="mlayout">
 		<a-skeleton/>
@@ -243,8 +253,8 @@
 		/* background: inherit !important;  */
 		height: unset !important;
 		margin-bottom: 1.5em;
-		padding-left: 0.5em;
-		padding-right: 0.5em;
+		padding: 0 2em;
+		padding-top: 1.4em;
 		width: auto;
 	}