Initial commit v1
@@ -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 (
|
||||
<html lang="en">
|
||||
<body
|
||||
className={`${geistSans.variable} ${geistMono.variable} antialiased`}
|
||||
>
|
||||
{children}
|
||||
</body>
|
||||
<body className={`${geist.variable} font-sans antialiased`}>{children}</body>
|
||||
</html>
|
||||
);
|
||||
)
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
},
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
|
After Width: | Height: | Size: 784 B |
|
After Width: | Height: | Size: 4.6 KiB |
|
After Width: | Height: | Size: 4.8 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 17 KiB |
@@ -0,0 +1,20 @@
|
||||
<!-- Maskable icon: content kept within inner 80% safe zone -->
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
|
||||
<!-- Full bleed background -->
|
||||
<rect width="512" height="512" fill="#16a34a"/>
|
||||
|
||||
<!-- Flag stick (shifted slightly right, vertically centred in safe zone) -->
|
||||
<rect x="228" y="120" width="14" height="252" rx="7" fill="white"/>
|
||||
|
||||
<!-- Triangular flag -->
|
||||
<path d="M242 130 L328 165 L242 200 Z" fill="white"/>
|
||||
|
||||
<!-- Golf ball -->
|
||||
<circle cx="235" cy="400" r="32" fill="white"/>
|
||||
|
||||
<!-- Ball dimples -->
|
||||
<path d="M214 389 Q235 378 256 389" fill="none" stroke="#16a34a" stroke-width="2.5" stroke-linecap="round" opacity="0.35"/>
|
||||
<path d="M214 403 Q235 414 256 403" fill="none" stroke="#16a34a" stroke-width="2.5" stroke-linecap="round" opacity="0.35"/>
|
||||
<path d="M224 377 Q213 400 224 423" fill="none" stroke="#16a34a" stroke-width="2.5" stroke-linecap="round" opacity="0.35"/>
|
||||
<path d="M246 377 Q257 400 246 423" fill="none" stroke="#16a34a" stroke-width="2.5" stroke-linecap="round" opacity="0.35"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.0 KiB |
@@ -0,0 +1,19 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
|
||||
<!-- Background circle -->
|
||||
<circle cx="256" cy="256" r="256" fill="#16a34a"/>
|
||||
|
||||
<!-- Flag stick -->
|
||||
<rect x="214" y="108" width="16" height="272" rx="8" fill="white"/>
|
||||
|
||||
<!-- Triangular flag -->
|
||||
<path d="M230 118 L330 158 L230 198 Z" fill="white"/>
|
||||
|
||||
<!-- Golf ball -->
|
||||
<circle cx="222" cy="404" r="36" fill="white"/>
|
||||
|
||||
<!-- Ball dimples (subtle arcs) -->
|
||||
<path d="M200 392 Q222 380 244 392" fill="none" stroke="#16a34a" stroke-width="3" stroke-linecap="round" opacity="0.35"/>
|
||||
<path d="M200 408 Q222 420 244 408" fill="none" stroke="#16a34a" stroke-width="3" stroke-linecap="round" opacity="0.35"/>
|
||||
<path d="M210 382 Q198 404 210 426" fill="none" stroke="#16a34a" stroke-width="3" stroke-linecap="round" opacity="0.35"/>
|
||||
<path d="M234 382 Q246 404 234 426" fill="none" stroke="#16a34a" stroke-width="3" stroke-linecap="round" opacity="0.35"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 936 B |
@@ -0,0 +1,33 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 480 80">
|
||||
<!-- Icon mark (scaled down, left-aligned) -->
|
||||
<g transform="translate(0, 0) scale(0.15625)">
|
||||
<circle cx="256" cy="256" r="256" fill="#16a34a"/>
|
||||
<rect x="214" y="108" width="16" height="272" rx="8" fill="white"/>
|
||||
<path d="M230 118 L330 158 L230 198 Z" fill="white"/>
|
||||
<circle cx="222" cy="404" r="36" fill="white"/>
|
||||
<path d="M200 392 Q222 380 244 392" fill="none" stroke="#16a34a" stroke-width="3" stroke-linecap="round" opacity="0.35"/>
|
||||
<path d="M200 408 Q222 420 244 408" fill="none" stroke="#16a34a" stroke-width="3" stroke-linecap="round" opacity="0.35"/>
|
||||
<path d="M210 382 Q198 404 210 426" fill="none" stroke="#16a34a" stroke-width="3" stroke-linecap="round" opacity="0.35"/>
|
||||
<path d="M234 382 Q246 404 234 426" fill="none" stroke="#16a34a" stroke-width="3" stroke-linecap="round" opacity="0.35"/>
|
||||
</g>
|
||||
|
||||
<!-- Wordmark -->
|
||||
<text
|
||||
x="92"
|
||||
y="50"
|
||||
font-family="system-ui, -apple-system, sans-serif"
|
||||
font-size="38"
|
||||
font-weight="700"
|
||||
fill="#16a34a"
|
||||
letter-spacing="-0.5"
|
||||
>Mulligan</text>
|
||||
<text
|
||||
x="92"
|
||||
y="72"
|
||||
font-family="system-ui, -apple-system, sans-serif"
|
||||
font-size="22"
|
||||
font-weight="400"
|
||||
fill="#4b5563"
|
||||
letter-spacing="2"
|
||||
>MATES</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
@@ -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.')
|
||||