- Replace page/offset pagination with opaque base64 cursor (last_activity_date, id) - Export MobileTicket and MobileTicketListResponse interfaces for Plan 02 import - Add requireAuth() gate (T-04-03: legacy route lacked auth) - Server-side limit cap at 25 rows (D-11, T-04-04) - Default status filter [1,8,7] when no status param supplied (matches legacy t.status != 5) - Preserve getMobileCompanyFilter() helper verbatim - Support status/priority arrays, queue, mine, and search filters - Cursor seek predicate: (last_activity_date, id) < (cursor) for stable keyset order
68 lines
2.3 KiB
TypeScript
68 lines
2.3 KiB
TypeScript
import type { Metadata } from "next";
|
|
import { IBM_Plex_Sans, IBM_Plex_Mono } from "next/font/google";
|
|
import "./globals.css";
|
|
import { ThemeProvider } from "@/components/theme-provider";
|
|
import { AppNavigation } from "@/components/navigation/app-navigation";
|
|
import { CommandPalette } from "@/components/navigation/command-palette";
|
|
import { TaglineFooter } from "@/components/branding/tagline-footer";
|
|
import { Toaster } from "sonner";
|
|
import { AuthProvider } from "@/components/auth/auth-provider";
|
|
|
|
// IBM Plex Sans replaces the brand-mandated Helvetica/Arial. The 2013
|
|
// standards guide called for Helvetica Bold for headers and Helvetica
|
|
// Light for the tagline; Plex Sans honors the spirit (clean engineered
|
|
// sans) while loading reliably from Google Fonts. Weight 300 covers the
|
|
// "Light" usage in the tagline footer.
|
|
const plexSans = IBM_Plex_Sans({
|
|
subsets: ["latin"],
|
|
weight: ["300", "400", "500", "600", "700"],
|
|
variable: "--font-plex-sans",
|
|
});
|
|
|
|
const plexMono = IBM_Plex_Mono({
|
|
subsets: ["latin"],
|
|
weight: ["400", "500", "600"],
|
|
variable: "--font-plex-mono",
|
|
});
|
|
|
|
export const metadata: Metadata = {
|
|
title: "Pulse · Operations console",
|
|
description: "Wulf Consulting operations console — tickets, RMM, IT Glue, backups, and analytics in one place.",
|
|
icons: {
|
|
icon: [
|
|
{ url: "/favicon.png", sizes: "any" },
|
|
{ url: "/wulff-logo.png", sizes: "32x32", type: "image/png" },
|
|
],
|
|
shortcut: "/favicon.png",
|
|
apple: "/wulff-logo.png",
|
|
},
|
|
};
|
|
|
|
export default function RootLayout({
|
|
children,
|
|
}: Readonly<{
|
|
children: React.ReactNode;
|
|
}>) {
|
|
return (
|
|
<html lang="en" suppressHydrationWarning className={`${plexSans.variable} ${plexMono.variable}`}>
|
|
<body className="font-sans antialiased">
|
|
<ThemeProvider
|
|
attribute="class"
|
|
defaultTheme="system"
|
|
enableSystem
|
|
disableTransitionOnChange
|
|
>
|
|
<AuthProvider>
|
|
<div className="min-h-screen bg-background flex flex-col">
|
|
<AppNavigation />
|
|
<main className="flex-1">{children}</main>
|
|
<TaglineFooter />
|
|
</div>
|
|
<CommandPalette />
|
|
</AuthProvider>
|
|
<Toaster position="top-right" richColors />
|
|
</ThemeProvider>
|
|
</body>
|
|
</html>
|
|
);
|
|
}
|