boxmux 0.240.3373

YAML-driven terminal UI framework for rich, interactive CLI applications and dashboards with PTY support
Documentation
<script lang="ts">
	import { Button, buttonVariants } from '$lib/components/ui/button';
	import { Separator } from '$lib/components/ui/separator';
	import { ChevronDown, Compass, Menu } from 'lucide-svelte';
	import * as DropdownMenu from '$lib/components/ui/dropdown-menu';
	import DarkModeToggle from '../dark-mode-toggle.svelte';
	import { navItems, siteConfig } from '$lib/config';
	import SocialMedia from '../social-media.svelte';

	let isNavOpen = false;
</script>

<header
	class="sticky top-0 z-50 w-full border-b border-border/40 bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60"
>
	<nav
		class="relative mx-auto w-full max-w-[85rem] px-4 py-4 sm:px-6 md:flex md:items-center md:justify-between md:gap-3 lg:px-8"
	>
		<!-- Logo w/ Collapse Button -->
		<div class="flex items-center justify-between">
			<a href="/">
				<img src={siteConfig.logo} alt={siteConfig.title} class="h-6 dark:hidden" />
				<img src={siteConfig.logoDark} alt={siteConfig.title} class="hidden h-6 dark:block" />
			</a>

			<div class="flex items-center gap-2">
				<Button
					variant="outline"
					size="icon"
					class="md:hidden"
					onclick={() => (isNavOpen = !isNavOpen)}
				>
					<Menu /> <span class="sr-only">Toggle navigation</span>
				</Button>
				<!-- End Collapse Button -->
				<div class="md:hidden">
					<DarkModeToggle />
				</div>
			</div>
			<!-- Collapse Button -->
		</div>
		<!-- End Logo w/ Collapse Button -->

		<!-- Collapse -->
		<div
			class={`${
				isNavOpen ? 'block' : 'hidden'
			} grow basis-full overflow-hidden transition-all duration-300 md:block`}
			aria-labelledby="header-collapse"
		>
			<div
				class="max-h-[75vh] overflow-hidden overflow-y-auto [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:bg-gray-300 dark:[&::-webkit-scrollbar-thumb]:bg-neutral-500 [&::-webkit-scrollbar-track]:bg-gray-100 dark:[&::-webkit-scrollbar-track]:bg-neutral-700 [&::-webkit-scrollbar]:w-2"
			>
				<div
					class="flex flex-col gap-0.5 py-2 md:flex-row md:items-center md:justify-end md:gap-1 md:py-0"
				>
					{#each navItems as item}
						{#if item.items && item.items?.length > 0}
							<!-- Dropdown for items with sub-items -->
							<DropdownMenu.Root>
								<DropdownMenu.Trigger class="{buttonVariants({ variant: 'ghost' })} "
									>{item.title} <ChevronDown /></DropdownMenu.Trigger
								>
								<DropdownMenu.Content>
									<DropdownMenu.Group>
										{#each item.items as subItem}
											<DropdownMenu.Item>
												<a href={subItem.href}>{subItem.title}</a>
											</DropdownMenu.Item>
										{/each}
									</DropdownMenu.Group>
								</DropdownMenu.Content>
							</DropdownMenu.Root>
						{:else}
							<!-- Regular Button for single items -->
							<Button variant="ghost" href={item.href}>
								{#if item.icon}
									<item.icon />
								{/if}
								{item.title}
							</Button>
						{/if}
					{/each}
					<SocialMedia />

					<Separator orientation="vertical" class="mr-2 hidden h-5 md:block" />

					<div class="hidden md:block">
						<DarkModeToggle />
					</div>
				</div>
			</div>
		</div>
		<!-- End Collapse -->
	</nav>
</header>