refactor: update sidebar layout, branding, and navigation structure with categorized menu groups and header user profile

This commit is contained in:
Yoga Pangestu 2026-04-12 22:27:56 +07:00
parent b9429778f7
commit 33ad844975
4 changed files with 22 additions and 29 deletions

View File

@ -1,14 +1,9 @@
import AppLogoIcon from '@/components/app-logo-icon';
export default function AppLogo() { export default function AppLogo() {
return ( return (
<> <>
<div className="flex aspect-square size-8 items-center justify-center rounded-md bg-sidebar-primary text-sidebar-primary-foreground">
<AppLogoIcon className="size-5 fill-current text-white dark:text-black" />
</div>
<div className="ml-1 grid flex-1 text-left text-sm"> <div className="ml-1 grid flex-1 text-left text-sm">
<span className="mb-0.5 truncate leading-tight font-semibold"> <span className="mb-0.5 truncate leading-tight font-semibold">
Laravel Starter Kit VN Grup
</span> </span>
</div> </div>
</> </>

View File

@ -1,3 +1,4 @@
import { NavUser } from '@/components/nav-user';
import { Breadcrumbs } from '@/components/breadcrumbs'; import { Breadcrumbs } from '@/components/breadcrumbs';
import { SidebarTrigger } from '@/components/ui/sidebar'; import { SidebarTrigger } from '@/components/ui/sidebar';
import type { BreadcrumbItem as BreadcrumbItemType } from '@/types'; import type { BreadcrumbItem as BreadcrumbItemType } from '@/types';
@ -8,11 +9,14 @@ export function AppSidebarHeader({
breadcrumbs?: BreadcrumbItemType[]; breadcrumbs?: BreadcrumbItemType[];
}) { }) {
return ( return (
<header className="flex h-16 shrink-0 items-center gap-2 border-b border-sidebar-border/50 px-6 transition-[width,height] ease-linear group-has-data-[collapsible=icon]/sidebar-wrapper:h-12 md:px-4"> <header className="flex h-16 shrink-0 items-center justify-between gap-2 border-b border-sidebar-border/50 px-6 transition-[width,height] ease-linear group-has-data-[collapsible=icon]/sidebar-wrapper:h-12 md:px-4">
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<SidebarTrigger className="-ml-1" /> <SidebarTrigger className="-ml-1" />
<Breadcrumbs breadcrumbs={breadcrumbs} /> <Breadcrumbs breadcrumbs={breadcrumbs} />
</div> </div>
<div className="flex items-center gap-2">
<NavUser />
</div>
</header> </header>
); );
} }

View File

@ -1,13 +1,10 @@
import { Link } from '@inertiajs/react'; import { Link } from '@inertiajs/react';
import { BookOpen, FolderGit2, LayoutGrid } from 'lucide-react'; import { LayoutGrid, List } from 'lucide-react';
import AppLogo from '@/components/app-logo'; import AppLogo from '@/components/app-logo';
import { NavFooter } from '@/components/nav-footer';
import { NavMain } from '@/components/nav-main'; import { NavMain } from '@/components/nav-main';
import { NavUser } from '@/components/nav-user';
import { import {
Sidebar, Sidebar,
SidebarContent, SidebarContent,
SidebarFooter,
SidebarHeader, SidebarHeader,
SidebarMenu, SidebarMenu,
SidebarMenuButton, SidebarMenuButton,
@ -24,16 +21,11 @@ const mainNavItems: NavItem[] = [
}, },
]; ];
const footerNavItems: NavItem[] = [ const masterNavItems: NavItem[] = [
{ {
title: 'Repository', title: 'Kategori',
href: 'https://github.com/laravel/react-starter-kit', href: dashboard(),
icon: FolderGit2, icon: List,
},
{
title: 'Documentation',
href: 'https://laravel.com/docs/starter-kits#react',
icon: BookOpen,
}, },
]; ];
@ -53,13 +45,9 @@ export function AppSidebar() {
</SidebarHeader> </SidebarHeader>
<SidebarContent> <SidebarContent>
<NavMain items={mainNavItems} /> <NavMain items={mainNavItems} label='Platform' />
<NavMain items={masterNavItems} label='Master Data' />
</SidebarContent> </SidebarContent>
<SidebarFooter>
<NavFooter items={footerNavItems} className="mt-auto" />
<NavUser />
</SidebarFooter>
</Sidebar> </Sidebar>
); );
} }

View File

@ -9,12 +9,18 @@ import {
import { useCurrentUrl } from '@/hooks/use-current-url'; import { useCurrentUrl } from '@/hooks/use-current-url';
import type { NavItem } from '@/types'; import type { NavItem } from '@/types';
export function NavMain({ items = [] }: { items: NavItem[] }) { export function NavMain({
items = [],
label,
}: {
items: NavItem[];
label?: string;
}) {
const { isCurrentUrl } = useCurrentUrl(); const { isCurrentUrl } = useCurrentUrl();
return ( return (
<SidebarGroup className="px-2 py-0"> <SidebarGroup className="px-2 py-1">
<SidebarGroupLabel>Platform</SidebarGroupLabel> <SidebarGroupLabel>{label}</SidebarGroupLabel>
<SidebarMenu> <SidebarMenu>
{items.map((item) => ( {items.map((item) => (
<SidebarMenuItem key={item.title}> <SidebarMenuItem key={item.title}>