2025-04-16 16:34:38 +02:00
import { PostHogProvider } from "@/components/PostHogProvider" ;
import { Header } from "@/components/header" ;
import { LicenseNotice } from "@/components/license-notice" ;
import type { Metadata , Viewport } from "next" ;
import { Inter } from "next/font/google" ;
import { Toaster } from "sonner" ;
import "./globals.css" ;
import { ThemeProvider } from "./theme-provider" ;
2025-04-16 22:51:23 +02:00
import { getTotalIcons } from "@/lib/api"
2025-04-16 16:18:20 +02:00
const inter = Inter ( {
variable : "--font-inter" ,
subsets : [ "latin" ] ,
2025-04-16 16:34:38 +02:00
} ) ;
2025-04-16 16:18:20 +02:00
export const viewport : Viewport = {
width : "device-width" ,
initialScale : 1 ,
themeColor : "#ffffff" ,
2025-04-16 16:34:38 +02:00
} ;
2025-04-16 16:18:20 +02:00
2025-04-16 22:51:23 +02:00
export async function generateMetadata ( ) : Promise < Metadata > {
const { totalIcons } = await getTotalIcons ( )
return {
metadataBase : new URL ( "https://dashboardicons.com" ) ,
title : "Dashboard Icons - Your definitive source for dashboard icons" ,
description : ` A collection of ${ totalIcons } curated icons for services, applications and tools, designed specifically for dashboards and app directories. ` ,
keywords : [
"dashboard icons" ,
"service icons" ,
"application icons" ,
"tool icons" ,
"web dashboard" ,
"app directory" ,
2025-04-16 16:18:20 +02:00
] ,
2025-04-16 22:51:23 +02:00
robots : {
index : true ,
follow : true ,
"max-image-preview" : "large" ,
"max-snippet" : - 1 ,
"max-video-preview" : - 1 ,
googleBot : "index, follow" ,
2025-04-16 16:18:20 +02:00
} ,
2025-04-16 22:51:23 +02:00
openGraph : {
siteName : "Dashboard Icons" ,
type : "website" ,
locale : "en_US" ,
title : "Dashboard Icons - Your definitive source for dashboard icons" ,
description : ` A collection of ${ totalIcons } curated icons for services, applications and tools, designed specifically for dashboards and app directories. ` ,
url : "https://dashboardicons.com" ,
images : [
{
url : "/og-image.png" ,
width : 1200 ,
height : 630 ,
alt : "Dashboard Icons" ,
type : "image/png" ,
} ,
] ,
} ,
twitter : {
card : "summary_large_image" ,
site : "@homarr_app" ,
creator : "@homarr_app" ,
title : "Dashboard Icons - Your definitive source for dashboard icons" ,
description : ` A collection of ${ totalIcons } curated icons for services, applications and tools, designed specifically for dashboards and app directories. ` ,
images : [ "/og-image.png" ] ,
} ,
applicationName : "Dashboard Icons" ,
appleWebApp : {
title : "Dashboard Icons" ,
statusBarStyle : "default" ,
capable : true ,
} ,
alternates : {
types : {
"application/rss+xml" : "https://dashboardicons.com/rss.xml" ,
2025-04-16 16:18:20 +02:00
} ,
2025-04-16 22:51:23 +02:00
} ,
icons : {
icon : [
{ url : "/favicon.ico" , sizes : "any" } ,
{ url : "/favicon-16x16.png" , sizes : "16x16" , type : "image/png" } ,
{ url : "/favicon-32x32.png" , sizes : "32x32" , type : "image/png" } ,
] ,
apple : [
{ url : "/apple-touch-icon.png" , sizes : "180x180" , type : "image/png" } ,
] ,
other : [
{
rel : "mask-icon" ,
url : "/safari-pinned-tab.svg" ,
color : "#000000" ,
} ,
] ,
} ,
manifest : "/site.webmanifest" ,
}
}
2025-04-16 16:18:20 +02:00
2025-04-16 16:34:38 +02:00
export default function RootLayout ( {
children ,
} : Readonly < { children : React.ReactNode } > ) {
2025-04-16 16:18:20 +02:00
return (
< html lang = "en" suppressHydrationWarning >
< body className = { ` ${ inter . variable } antialiased bg-background ` } >
< PostHogProvider >
2025-04-16 16:34:38 +02:00
< ThemeProvider
attribute = "class"
defaultTheme = "system"
enableSystem
disableTransitionOnChange
>
2025-04-16 16:18:20 +02:00
< Header / >
< main > { children } < / main >
< Toaster / >
< LicenseNotice / >
< / ThemeProvider >
< / PostHogProvider >
< / body >
< / html >
2025-04-16 16:34:38 +02:00
) ;
2025-04-16 16:18:20 +02:00
}