Initial commit v1

This commit is contained in:
Rolf
2026-03-18 12:39:48 +01:00
parent 4897d3003f
commit cb04bf2ab8
12 changed files with 147 additions and 29 deletions
+19 -26
View File
@@ -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>
);
)
}
+29 -3
View File
@@ -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"
},
+1
View File
@@ -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"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 784 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

+20
View File
@@ -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

+19
View File
@@ -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

+33
View File
@@ -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

+26
View File
@@ -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.')