Files
bichon/web/src/routes/_authenticated/route.tsx
rustmailer 123260b69d update
2026-05-10 04:22:35 +08:00

54 lines
2.0 KiB
TypeScript

//
// Copyright (c) 2025-2026 rustmailer.com (https://rustmailer.com)
//
// This file is part of the Bichon Email Archiving Project
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
import { createFileRoute, Outlet } from '@tanstack/react-router'
import { cn } from '@/lib/utils'
import { SearchProvider } from '@/context/search-context'
import { SidebarProvider } from '@/components/ui/sidebar'
import { AppSidebar } from '@/components/layout/app-sidebar'
export const Route = createFileRoute('/_authenticated')({
component: RouteComponent,
})
function RouteComponent() {
const defaultOpen = localStorage.getItem('sidebar_state') === 'true';
return (
<SearchProvider>
<SidebarProvider defaultOpen={defaultOpen}>
{/* <SkipToMain /> */}
<AppSidebar />
<div
id='content'
className={cn(
'max-w-full w-full ml-auto',
'peer-data-[state=collapsed]:w-[calc(100%-var(--sidebar-width-icon)-1rem)]',
'peer-data-[state=expanded]:w-[calc(100%-var(--sidebar-width))]',
'transition-[width] ease-linear duration-200',
'h-svh flex flex-col',
'group-data-[scroll-locked=1]/body:h-full',
'group-data-[scroll-locked=1]/body:has-[main.fixed-main]:h-svh'
)}
>
<Outlet />
</div>
</SidebarProvider>
</SearchProvider>
)
}