WORKFLOW-APP/app/layout.tsx
Dave 2fb979b98a Director appointment acceptance — full feature
- DirectorAppointmentTab: table + 'Acceptance Letter' modal with company/director dropdowns
- GET/POST /api/appointments: create record, generate HTML letter, convert to PDF via LibreOffice, email to director via himalaya SMTP
- PATCH /api/appointments/[id]: save signature PNG, embed in signed letter PDF, mail to all company directors
- GET /api/appointments/sign/[token]: public token lookup
- /sign/[token]/page.tsx: public signature canvas (mouse + touch)
- ysterbaard_director_appointments PB collection (requires manual schema setup)
- Section 3 'Director Appointment' now active in ResolutionExplorer
- NEXT_PUBLIC_APP_URL added to .env.local
2026-08-17 18:39:14 +02:00

46 lines
1.3 KiB
TypeScript

// app/layout.tsx
// Root layout for the Workflow frontend. Two responsibilities:
// (1) bind the Inter webfont so the typography tokens render with a
// real face (otherwise the entire app falls back to system-ui).
// (2) wrap children in QueryProvider + NavBar + ToastProvider.
import type { Metadata } from "next";
import { Inter } from "next/font/google";
import "./globals.css";
import Providers from "./providers";
import QueryProvider from "@/components/QueryProvider";
import RouteChrome from "@/components/RouteChrome";
import { ToastProvider } from "@/components/Toast";
const inter = Inter({
subsets: ["latin"],
display: "swap",
variable: "--font-inter"
});
export const metadata: Metadata = {
title: "Workflow · Registry Browser",
description:
"Read-only CIPC registry browser for directors and companies on a self-hosted PocketBase instance.",
robots: { index: false, follow: false }
};
export default function RootLayout({
children
}: {
children: React.ReactNode;
}) {
return (
<html lang="en" className={inter.variable} suppressHydrationWarning>
<body className="bg-bg text-fg">
<Providers>
<QueryProvider>
<RouteChrome>
<ToastProvider>{children}</ToastProvider>
</RouteChrome>
</QueryProvider>
</Providers>
</body>
</html>
);
}