-
Notifications
You must be signed in to change notification settings - Fork 336
Expand file tree
/
Copy pathlayout.tsx
More file actions
132 lines (122 loc) · 4.29 KB
/
layout.tsx
File metadata and controls
132 lines (122 loc) · 4.29 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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import type { Metadata } from "next";
import { Bebas_Neue, Syne, DM_Sans, Inter, Roboto, Poppins, Montserrat } from "next/font/google";
import ErrorBoundary from "@/components/ErrorBoundary";
import "./globals.css";
import { ThemeProvider } from "@/components/ThemeProvider";
import { ThemeToggle } from "@/components/ThemeToggle";
import { InstallButton } from "@/components/InstallButton";
import ScrollToTop from "@/components/ScrollToTop";
import BrandLogo from "@/components/BrandLogo";
export const viewport = {
themeColor: "#e63946",
};
export const metadata: Metadata = {
title: "Reframe — Resize, trim, and export videos in your browser",
description: "Free, open-source video editor that runs entirely in your browser. No login, no uploads, no ads. Resize for any platform, trim, rotate, adjust speed, and export.",
manifest: "/manifest.json",
keywords: [
"video editor",
"browser video editor",
"open source video editor",
"resize videos",
"trim videos",
"rotate videos",
"online video editor",
],
authors: [{ name: "Reframe" }],
openGraph: {
title: "Reframe",
description:
"Free, open-source browser-based video editor. Resize, trim, rotate, and export videos directly in your browser.",
type: "website",
},
twitter: {
card: "summary_large_image",
title: "Reframe",
description:
"Free, open-source browser-based video editor. Resize, trim, rotate, and export videos directly in your browser.",
},
icons: {
icon: [{ url: "/favicon.svg", type: "image/svg+xml" }],
shortcut: "/favicon.svg",
},
};
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="en" suppressHydrationWarning>
<head>
<link rel="manifest" href="/manifest.json" />
<script
dangerouslySetInnerHTML={{
__html: `
window.addEventListener('beforeinstallprompt', (e) => {
e.preventDefault();
window.deferredPrompt = e;
window.dispatchEvent(new CustomEvent('deferredpromptready'));
});
`,
}}
/>
<link rel="preconnect" href="https://cdn.jsdelivr.net" />
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net" />
<script
dangerouslySetInnerHTML={{
__html: `(function() {
try {
const theme = localStorage.getItem('theme');
if (theme === 'dark' || (!theme &&
window.matchMedia('(prefers-color-scheme: dark)').matches)) {
document.documentElement.classList.add('dark');
} else {
document.documentElement.classList.remove('dark');
}
} catch(e) {}
})();`,
}}
/>
<link rel="preconnect" href="https://cdn.jsdelivr.net" />
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net" />
</head>
<body className="min-h-screen bg-[var(--bg)] text-[var(--text)] antialiased">
<a href="#main-content"
className="sr-only focus:not-sr-only focus:fixed focus:top-4 focus:left-4 focus:z-50 focus:rounded-[var(--radius)] focus:border focus:border-[var(--border)] focus:bg-[var(--surface)] focus:px-4 focus:py-2 focus:text-[var(--text)]"
>
Skip to main content
</a>
<ThemeProvider>
<ErrorBoundary>
<header
role="banner"
className="sticky top-0 z-50 flex items-center justify-between border-b border-[var(--border)] bg-[var(--bg)]/95 px-6 py-3 backdrop-blur"
>
<div className="flex items-center gap-2">
<BrandLogo size={24} />
<h1 className="text-lg font-semibold">Reframe</h1>
</div>
<div className="flex items-center gap-3">
<InstallButton />
<a
href="https://github.com/magic-peach/reframe"
target="_blank"
rel="noopener noreferrer"
className="hidden min-[400px]:inline-flex items-center gap-1.5 px-3 py-1.5 rounded-full border border-[var(--border)] bg-[var(--surface)] text-[10px] font-heading font-semibold uppercase tracking-wider hover:bg-[var(--border)] transition-all"
>
⭐ Star
</a>
<ThemeToggle />
</div>
</header>
<main id="main-content" tabIndex={-1}>
{children}
</main>
<ScrollToTop />
</ErrorBoundary>
</ThemeProvider>
</body>
</html>
);
}