<script setup lang="ts">
import { BarChart3, Bell, Folder, Home, Inbox, Plus, Search, Settings, Users } from '@lucide/vue'
const menu = ref(false)
const current = ref('website')
// One set of items, rendered in the desktop sidebar and in the mobile sheet.
const main = [
{ id: 'overview', label: 'Overview', icon: Home },
{ id: 'inbox', label: 'Inbox', icon: Inbox, count: 3 },
{ id: 'analytics', label: 'Analytics', icon: BarChart3 },
]
const projects = [
{ id: 'website', label: 'Website', icon: Folder },
{ id: 'mobile', label: 'Mobile app', icon: Folder },
]
const bottom = [
{ id: 'members', label: 'Members', icon: Users },
{ id: 'settings', label: 'Settings', icon: Settings },
]
function go(id: string) {
current.value = id
menu.value = false
}
</script>
<template>
<div class="flex h-[34rem] overflow-hidden bg-bg">
<!-- Desktop: a fixed column -->
<aside class="hidden w-56 shrink-0 border-r border-border-subtle md:block dark:border-border">
<JSidebar label="Workspace">
<template #header>
<span class="px-1 text-sm font-semibold text-fg">Acme</span>
</template>
<div class="flex flex-col gap-0.5">
<JSidebarItem v-for="item in main" :key="item.id" href="#" :active="current === item.id" @click.prevent="go(item.id)">
<template #leading><component :is="item.icon" /></template>
{{ item.label }}
<template v-if="item.count" #trailing>{{ item.count }}</template>
</JSidebarItem>
</div>
<JSidebarGroup title="Projects">
<JSidebarItem v-for="item in projects" :key="item.id" href="#" :active="current === item.id" @click.prevent="go(item.id)">
<template #leading><component :is="item.icon" /></template>
{{ item.label }}
</JSidebarItem>
</JSidebarGroup>
<template #footer>
<JSidebarItem v-for="item in bottom" :key="item.id" href="#" :active="current === item.id" @click.prevent="go(item.id)">
<template #leading><component :is="item.icon" /></template>
{{ item.label }}
</JSidebarItem>
</template>
</JSidebar>
</aside>
<div class="flex min-w-0 flex-1 flex-col">
<header class="flex h-14 shrink-0 items-center gap-3 border-b border-border-subtle px-4 dark:border-border">
<JBurger v-model="menu" size="sm" class="md:hidden" />
<JBreadcrumb :items="[{ label: 'Acme', href: '#' }, { label: 'Projects', href: '#' }, { label: 'Website' }]" />
<div class="ml-auto flex items-center gap-1">
<JButton variant="ghost" size="sm" icon aria-label="Search"><Search /></JButton>
<JButton variant="ghost" size="sm" icon aria-label="Notifications"><Bell /></JButton>
<JButton size="sm" class="ml-1">
<template #leading><Plus /></template>
New
</JButton>
</div>
</header>
<main class="flex-1 overflow-y-auto p-6">
<h1 class="text-lg font-semibold tracking-tight text-fg">Website</h1>
<p class="text-sm text-fg-muted">Production · updated 4 minutes ago</p>
<div class="mt-6 grid gap-3 sm:grid-cols-3">
<JCard padding="sm"><JStat label="Visitors" value="12,408" delta="+8%" trend="up" /></JCard>
<JCard padding="sm"><JStat label="Error rate" value="0.12%" delta="-0.04%" trend="up" /></JCard>
<JCard padding="sm"><JStat label="P95 latency" value="182ms" delta="+12ms" trend="down" /></JCard>
</div>
<JCard class="mt-3" title="Recent deployments">
<JTimeline>
<JTimelineItem title="Fix checkout redirect" time="4 min ago" status="current">main · a41f2c9</JTimelineItem>
<JTimelineItem title="Add pricing FAQ" time="2 h ago" status="complete">main · 9be01d3</JTimelineItem>
<JTimelineItem title="Upgrade to Nuxt 4.5" time="Yesterday" status="complete">main · 71ce5aa</JTimelineItem>
</JTimeline>
</JCard>
</main>
</div>
<!-- Mobile: the same navigation in a sheet, opened by the burger -->
<JSheet v-model:open="menu" side="left" size="sm" aria-label="Navigation">
<JSidebar label="Workspace">
<template #header>
<span class="px-1 text-sm font-semibold text-fg">Acme</span>
</template>
<div class="flex flex-col gap-0.5">
<JSidebarItem v-for="item in main" :key="item.id" href="#" :active="current === item.id" @click.prevent="go(item.id)">
<template #leading><component :is="item.icon" /></template>
{{ item.label }}
<template v-if="item.count" #trailing>{{ item.count }}</template>
</JSidebarItem>
</div>
<JSidebarGroup title="Projects">
<JSidebarItem v-for="item in projects" :key="item.id" href="#" :active="current === item.id" @click.prevent="go(item.id)">
<template #leading><component :is="item.icon" /></template>
{{ item.label }}
</JSidebarItem>
</JSidebarGroup>
<template #footer>
<JSidebarItem v-for="item in bottom" :key="item.id" href="#" :active="current === item.id" @click.prevent="go(item.id)">
<template #leading><component :is="item.icon" /></template>
{{ item.label }}
</JSidebarItem>
</template>
</JSidebar>
</JSheet>
</div>
</template>