41 lines
1.4 KiB
TypeScript
41 lines
1.4 KiB
TypeScript
import { SiteHeader } from "@/components/layout/site-header";
|
|
import { SiteSidebar } from "@/components/layout/site-sidebar";
|
|
import { SiteBottomNav } from "@/components/layout/site-bottom-nav";
|
|
import { SiteFooter } from "@/components/layout/site-footer";
|
|
import { VerifyEmailBanner } from "@/components/auth/verify-email-banner";
|
|
import { PushPrompt } from "@/components/push/push-prompt";
|
|
|
|
/**
|
|
* Default app layout — the reading-app chrome that wraps the home page, all
|
|
* the book / letter / transcription / etc. routes, the user profile, and
|
|
* the auth pages.
|
|
*
|
|
* Sibling groups (e.g. `(legal)/`) opt out of this chrome by living in their
|
|
* own route group with their own layout. Everything in the root layout
|
|
* (providers, fonts, toaster, floating audio player) still wraps this layer.
|
|
*
|
|
* The text-selection toolbar and its highlight/bookmark companions live in
|
|
* the nested `(reader)/` group instead of here, so they only mount over the
|
|
* scripture library and never fire on chrome text (home, search, profile,
|
|
* settings, …).
|
|
*/
|
|
export default function AppLayout({
|
|
children,
|
|
}: {
|
|
children: React.ReactNode;
|
|
}) {
|
|
return (
|
|
<>
|
|
<VerifyEmailBanner />
|
|
<SiteSidebar />
|
|
<div className="flex-1 flex flex-col md:pl-16 pb-16 md:pb-0">
|
|
<SiteHeader />
|
|
{children}
|
|
<SiteFooter />
|
|
</div>
|
|
<SiteBottomNav />
|
|
<PushPrompt />
|
|
</>
|
|
);
|
|
}
|