diff --git a/app/layout.tsx b/app/layout.tsx index f7fa87e..cd7e4f4 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,34 +1,27 @@ -import type { Metadata } from "next"; -import { Geist, Geist_Mono } from "next/font/google"; -import "./globals.css"; +import type { Metadata } from 'next' +import { Geist } from 'next/font/google' +import './globals.css' -const geistSans = Geist({ - variable: "--font-geist-sans", - subsets: ["latin"], -}); - -const geistMono = Geist_Mono({ - variable: "--font-geist-mono", - subsets: ["latin"], -}); +const geist = Geist({ subsets: ['latin'], variable: '--font-geist-sans' }) export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", -}; + title: 'MulliganMates', + description: 'Social golf score tracking', + icons: { + icon: '/favicon.png', + apple: '/icons/apple-touch-icon.png', + }, + appleWebApp: { + capable: true, + statusBarStyle: 'default', + title: 'MulliganMates', + }, +} -export default function RootLayout({ - children, -}: Readonly<{ - children: React.ReactNode; -}>) { +export default function RootLayout({ children }: { children: React.ReactNode }) { return ( -
- {children} - + {children} - ); + ) } diff --git a/package-lock.json b/package-lock.json index d041991..f5954c1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,6 +36,7 @@ "eslint-config-next": "16.1.7", "prettier": "^3.8.1", "prettier-plugin-tailwindcss": "^0.7.2", + "sharp": "^0.34.5", "tailwindcss": "^4", "typescript": "^5" } @@ -733,6 +734,7 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.0.tgz", "integrity": "sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -1000,8 +1002,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "devOptional": true, "license": "MIT", - "optional": true, "engines": { "node": ">=18" } @@ -1013,6 +1015,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1035,6 +1038,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1057,6 +1061,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1073,6 +1078,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1089,6 +1095,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1105,6 +1112,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1121,6 +1129,7 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1137,6 +1146,7 @@ "cpu": [ "riscv64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1153,6 +1163,7 @@ "cpu": [ "s390x" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1169,6 +1180,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1185,6 +1197,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1201,6 +1214,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1217,6 +1231,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1239,6 +1254,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1261,6 +1277,7 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1283,6 +1300,7 @@ "cpu": [ "riscv64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1305,6 +1323,7 @@ "cpu": [ "s390x" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1327,6 +1346,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1349,6 +1369,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1371,6 +1392,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1393,6 +1415,7 @@ "cpu": [ "wasm32" ], + "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, "dependencies": { @@ -1412,6 +1435,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ @@ -1431,6 +1455,7 @@ "cpu": [ "ia32" ], + "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ @@ -1450,6 +1475,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ @@ -8713,9 +8739,9 @@ "version": "0.34.5", "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", - "optional": true, "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", @@ -8758,8 +8784,8 @@ "version": "7.7.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "devOptional": true, "license": "ISC", - "optional": true, "bin": { "semver": "bin/semver.js" }, diff --git a/package.json b/package.json index ba2e1bb..9e7266c 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "eslint-config-next": "16.1.7", "prettier": "^3.8.1", "prettier-plugin-tailwindcss": "^0.7.2", + "sharp": "^0.34.5", "tailwindcss": "^4", "typescript": "^5" } diff --git a/public/favicon.png b/public/favicon.png new file mode 100644 index 0000000..1f961a7 Binary files /dev/null and b/public/favicon.png differ diff --git a/public/icons/apple-touch-icon.png b/public/icons/apple-touch-icon.png new file mode 100644 index 0000000..f70c6e6 Binary files /dev/null and b/public/icons/apple-touch-icon.png differ diff --git a/public/icons/icon-192.png b/public/icons/icon-192.png new file mode 100644 index 0000000..a6387e6 Binary files /dev/null and b/public/icons/icon-192.png differ diff --git a/public/icons/icon-512-maskable.png b/public/icons/icon-512-maskable.png new file mode 100644 index 0000000..42a05a8 Binary files /dev/null and b/public/icons/icon-512-maskable.png differ diff --git a/public/icons/icon-512.png b/public/icons/icon-512.png new file mode 100644 index 0000000..678200b Binary files /dev/null and b/public/icons/icon-512.png differ diff --git a/public/icons/icon-maskable.svg b/public/icons/icon-maskable.svg new file mode 100644 index 0000000..b8e96c6 --- /dev/null +++ b/public/icons/icon-maskable.svg @@ -0,0 +1,20 @@ + + diff --git a/public/icons/icon.svg b/public/icons/icon.svg new file mode 100644 index 0000000..7497e32 --- /dev/null +++ b/public/icons/icon.svg @@ -0,0 +1,19 @@ + diff --git a/public/logo.svg b/public/logo.svg new file mode 100644 index 0000000..7d905a4 --- /dev/null +++ b/public/logo.svg @@ -0,0 +1,33 @@ + diff --git a/scripts/generate-icons.mjs b/scripts/generate-icons.mjs new file mode 100644 index 0000000..35bd236 --- /dev/null +++ b/scripts/generate-icons.mjs @@ -0,0 +1,26 @@ +import sharp from 'sharp' +import { readFileSync } from 'fs' +import { join, dirname } from 'path' +import { fileURLToPath } from 'url' + +const __dirname = dirname(fileURLToPath(import.meta.url)) +const root = join(__dirname, '..') + +const icon = readFileSync(join(root, 'public/icons/icon.svg')) +const maskable = readFileSync(join(root, 'public/icons/icon-maskable.svg')) + +await sharp(icon) .resize(192, 192).png().toFile(join(root, 'public/icons/icon-192.png')) +await sharp(icon) .resize(512, 512).png().toFile(join(root, 'public/icons/icon-512.png')) +await sharp(maskable) .resize(512, 512).png().toFile(join(root, 'public/icons/icon-512-maskable.png')) + +// Apple touch icon (180×180, no transparency — white bg for iOS) +await sharp(icon) + .resize(180, 180) + .flatten({ background: '#ffffff' }) + .png() + .toFile(join(root, 'public/icons/apple-touch-icon.png')) + +// Favicon (32×32) +await sharp(icon).resize(32, 32).png().toFile(join(root, 'public/favicon.png')) + +console.log('Icons generated.')