Types + API: - Add User, TemplatePreview, QueueCustomField types - Add getUsers, getTemplates, createTemplate, updateTemplate, previewTemplate, updateQueue, updateLifecycle, updateCustomField API functions UI: - Command palette: keyboard-first navigation with fuzzy ticket search - Admin: comprehensive redesign with tab-based layout (Queues, Lifecycles, Scrips, Custom Fields, Templates, Users) - Ticket list: improved inbox-style rows with quick actions - Ticket detail: enhanced conversation thread and properties sidebar - App shell: sidebar visual refinement with active indicator bar - Theme toggle: smoother transitions Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
42 lines
1.2 KiB
TypeScript
42 lines
1.2 KiB
TypeScript
import type { Metadata } from "next";
|
|
import { IBM_Plex_Sans, JetBrains_Mono } from "next/font/google";
|
|
import { Suspense } from "react";
|
|
import { ThemeProvider } from "next-themes";
|
|
import "./globals.css";
|
|
import { AppShell } from "@/components/app-shell";
|
|
|
|
const ibmPlexSans = IBM_Plex_Sans({
|
|
subsets: ["latin"],
|
|
weight: ["400", "500", "600", "700"],
|
|
variable: "--font-sans",
|
|
});
|
|
|
|
const jetbrainsMono = JetBrains_Mono({
|
|
subsets: ["latin"],
|
|
variable: "--font-mono",
|
|
});
|
|
|
|
export const metadata: Metadata = {
|
|
title: "Tessera",
|
|
description: "Ticket management system",
|
|
};
|
|
|
|
export default function RootLayout({
|
|
children,
|
|
}: Readonly<{ children: React.ReactNode }>) {
|
|
return (
|
|
<html lang="en" suppressHydrationWarning>
|
|
<body
|
|
className={`${ibmPlexSans.variable} ${jetbrainsMono.variable} font-sans antialiased`}
|
|
style={{ fontSize: "15px", lineHeight: 1.5 }}
|
|
>
|
|
<ThemeProvider attribute="class" defaultTheme="light" enableSystem={false}>
|
|
<Suspense fallback={<div className="flex items-center justify-center h-screen text-muted-foreground">Loading...</div>}>
|
|
<AppShell>{children}</AppShell>
|
|
</Suspense>
|
|
</ThemeProvider>
|
|
</body>
|
|
</html>
|
|
);
|
|
}
|