forked from Talenttrust/Talenttrust-Frontend
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlayout.tsx
More file actions
104 lines (99 loc) · 3.88 KB
/
Copy pathlayout.tsx
File metadata and controls
104 lines (99 loc) · 3.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import type { Metadata } from 'next';
import './globals.css';
import { ToastProvider } from '@/components/toast/toast-provider';
const siteUrl =
process.env.NEXT_PUBLIC_SITE_URL || 'http://localhost:3000';
const metadataBase = new URL(siteUrl);
// Social preview image used by Open Graph and Twitter cards lives in public/.
const socialPreviewImage = '/og-preview.svg';
export const metadata: Metadata = {
title: 'TalentTrust - Safe Freelance Payments',
description: 'Safe, secure payments that protect both freelancers and clients throughout your project.',
metadataBase,
manifest: '/manifest.webmanifest',
icons: {
icon: [
{ url: '/icon.svg', type: 'image/svg+xml' },
{ url: '/icon-192x192.png', sizes: '192x192', type: 'image/png' },
{ url: '/icon-512x512.png', sizes: '512x512', type: 'image/png' },
],
apple: [
{ url: '/icon-192x192.png', sizes: '192x192', type: 'image/png' },
],
},
openGraph: {
title: 'TalentTrust - Safe Freelance Payments',
description: 'Safe, secure payments that protect both freelancers and clients throughout your project.',
type: 'website',
siteName: 'TalentTrust',
url: siteUrl,
images: [
{
url: socialPreviewImage,
width: 1200,
height: 630,
alt: 'TalentTrust social preview showing safe freelance payments',
},
],
},
twitter: {
card: 'summary_large_image',
title: 'TalentTrust - Safe Freelance Payments',
description: 'Safe, secure payments that protect both freelancers and clients throughout your project.',
images: [socialPreviewImage],
},
};
import { PreferencesProvider } from '@/lib/preferences';
import { SettingsTrigger } from '@/components/settings/SettingsTrigger';
import { WalletProvider } from '@/contexts/WalletContext';
import CommandPalette, { CommandPaletteProvider } from '@/components/CommandPalette';
import RouteAnnouncer from '@/components/RouteAnnouncer';
import Navbar from '@/components/Navbar';
import HeaderActions from '@/components/HeaderActions';
import { registerDefaultCommands } from '@/lib/commands/defaultCommands';
registerDefaultCommands();
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="en">
<body>
<PreferencesProvider>
<ToastProvider>
<WalletProvider>
<CommandPaletteProvider>
{/* Skip link must be the first focusable element so keyboard users
can bypass the sticky header on every page (WCAG 2.4.1). */}
<a
href="#main-content"
className="sr-only focus:not-sr-only focus:absolute focus:top-2 focus:left-2 focus:z-50 focus:rounded-lg focus:bg-blue-600 focus:px-4 focus:py-2 focus:text-white focus:outline-none focus:ring-2 focus:ring-blue-500"
>
Skip to main content
</a>
<RouteAnnouncer />
<div className="min-h-screen bg-slate-50 flex flex-col">
<header className="sticky top-0 z-40 flex w-full flex-wrap items-center justify-between gap-4 border-b border-slate-200 bg-white/80 px-6 py-4 backdrop-blur-md">
<div className="flex items-center gap-2">
<span className="text-xl font-bold tracking-tight text-slate-900">
TalentTrust
</span>
</div>
<Navbar />
<HeaderActions />
</header>
<main className="flex-1 p-6" tabIndex={-1} id="main-content">
{children}
</main>
</div>
<CommandPalette />
<SettingsTrigger />
</CommandPaletteProvider>
</WalletProvider>
</ToastProvider>
</PreferencesProvider>
</body>
</html>
);
}