This commit implements the core admin dashboard functionality including NextAuth authentication, Cloudflare D1 database integration with complete schema, and Cloudflare R2 file upload system for portfolio images. Features include artist management, appointment scheduling, and data migration capabilities.
43 lines
1.1 KiB
TypeScript
43 lines
1.1 KiB
TypeScript
import type React from "react"
|
|
import type { Metadata } from "next"
|
|
import { Playfair_Display, Source_Sans_3 } from "next/font/google"
|
|
import "./globals.css"
|
|
import { Suspense } from "react"
|
|
import ClientLayout from "./ClientLayout"
|
|
|
|
const playfairDisplay = Playfair_Display({
|
|
subsets: ["latin"],
|
|
variable: "--font-playfair",
|
|
display: "swap",
|
|
})
|
|
|
|
const sourceSans = Source_Sans_3({
|
|
subsets: ["latin"],
|
|
variable: "--font-source-sans",
|
|
display: "swap",
|
|
})
|
|
|
|
export const metadata: Metadata = {
|
|
title: "United Tattoo - Professional Tattoo Studio",
|
|
description: "Book appointments with our talented artists and explore stunning tattoo portfolios at United Tattoo.",
|
|
generator: "v0.app",
|
|
}
|
|
|
|
export const dynamic = "force-dynamic";
|
|
|
|
export default function RootLayout({
|
|
children,
|
|
}: Readonly<{
|
|
children: React.ReactNode
|
|
}>) {
|
|
return (
|
|
<html lang="en" className={`${playfairDisplay.variable} ${sourceSans.variable}`}>
|
|
<body className="font-sans antialiased">
|
|
<Suspense fallback={null}>
|
|
<ClientLayout>{children}</ClientLayout>
|
|
</Suspense>
|
|
</body>
|
|
</html>
|
|
)
|
|
}
|