feat(web): add Next.js 14 app with Tailwind CSS

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Ivan
2026-02-01 06:10:02 +00:00
parent a5a68cc54d
commit 039c17352b
8 changed files with 221 additions and 0 deletions

52
apps/web/app/globals.css Normal file
View File

@@ -0,0 +1,52 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
:root {
/* Primary Colors - Blue */
--color-primary-50: #E6EBF2;
--color-primary-100: #C2D1E3;
--color-primary-200: #9BB4D1;
--color-primary-300: #7497BF;
--color-primary-400: #5781B2;
--color-primary-500: #3A6BA5;
--color-primary-600: #2E5A8E;
--color-primary-700: #244977;
--color-primary-800: #1E3A5F;
--color-primary-900: #152A47;
/* Accent Colors - Green */
--color-accent-50: #EEFBF3;
--color-accent-100: #D4F5E0;
--color-accent-200: #A9EBBC;
--color-accent-300: #7EE19A;
--color-accent-400: #53D778;
--color-accent-500: #22C55E;
--color-accent-600: #1CA04C;
--color-accent-700: #167A3A;
--color-accent-800: #105528;
--color-accent-900: #0A2F16;
/* Background and Foreground */
--background: #ffffff;
--foreground: #171717;
}
@media (prefers-color-scheme: dark) {
:root {
--background: #0a0a0a;
--foreground: #ededed;
}
}
body {
color: var(--foreground);
background: var(--background);
font-family: "Inter", sans-serif;
}
@layer base {
html {
@apply antialiased;
}
}

24
apps/web/app/layout.tsx Normal file
View File

@@ -0,0 +1,24 @@
import type { Metadata } from "next";
import { Inter } from "next/font/google";
import "./globals.css";
const inter = Inter({ subsets: ["latin"] });
export const metadata: Metadata = {
title: "Padel Pro",
description: "Sistema de Gestión para Clubes de Pádel",
keywords: ["padel", "club", "reservas", "gestión", "deportes"],
authors: [{ name: "Padel Pro Team" }],
};
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<html lang="es">
<body className={inter.className}>{children}</body>
</html>
);
}

30
apps/web/app/page.tsx Normal file
View File

@@ -0,0 +1,30 @@
import Link from "next/link";
export default function Home() {
return (
<main className="min-h-screen flex flex-col items-center justify-center bg-gradient-to-br from-primary-50 to-primary-100">
<div className="text-center space-y-8 px-4">
<h1 className="text-5xl md:text-6xl font-bold text-primary-800">
Padel Pro
</h1>
<p className="text-xl md:text-2xl text-primary-600 max-w-2xl mx-auto">
Sistema de Gestion para Clubes de Padel
</p>
<div className="flex flex-col sm:flex-row gap-4 justify-center mt-8">
<Link
href="/dashboard"
className="px-8 py-3 bg-primary-800 text-white font-semibold rounded-lg hover:bg-primary-700 transition-colors duration-200 shadow-lg hover:shadow-xl"
>
Dashboard
</Link>
<Link
href="/reservas"
className="px-8 py-3 bg-accent-500 text-white font-semibold rounded-lg hover:bg-accent-600 transition-colors duration-200 shadow-lg hover:shadow-xl"
>
Reservas
</Link>
</div>
</div>
</main>
);
}

10
apps/web/next.config.js Normal file
View File

@@ -0,0 +1,10 @@
/** @type {import('next').NextConfig} */
const nextConfig = {
transpilePackages: ["@padel-pro/shared"],
images: {
remotePatterns: [
{ protocol: "https", hostname: "res.cloudinary.com" },
],
},
};
module.exports = nextConfig;

26
apps/web/package.json Normal file
View File

@@ -0,0 +1,26 @@
{
"name": "@padel-pro/web",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "next dev --port 3000",
"build": "next build",
"start": "next start",
"lint": "next lint",
"type-check": "tsc --noEmit"
},
"dependencies": {
"next": "14.2.0",
"react": "^18.2.0",
"react-dom": "^18.2.0"
},
"devDependencies": {
"@types/node": "^20.11.0",
"@types/react": "^18.2.0",
"@types/react-dom": "^18.2.0",
"autoprefixer": "^10.4.17",
"postcss": "^8.4.35",
"tailwindcss": "^3.4.1",
"typescript": "^5.3.3"
}
}

View File

@@ -0,0 +1,6 @@
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
};

View File

@@ -0,0 +1,47 @@
import type { Config } from "tailwindcss";
const config: Config = {
content: [
"./pages/**/*.{js,ts,jsx,tsx,mdx}",
"./components/**/*.{js,ts,jsx,tsx,mdx}",
"./app/**/*.{js,ts,jsx,tsx,mdx}",
],
theme: {
extend: {
colors: {
primary: {
50: "#E6EBF2",
100: "#C2D1E3",
200: "#9BB4D1",
300: "#7497BF",
400: "#5781B2",
500: "#3A6BA5",
600: "#2E5A8E",
700: "#244977",
800: "#1E3A5F",
900: "#152A47",
DEFAULT: "#1E3A5F",
},
accent: {
50: "#EEFBF3",
100: "#D4F5E0",
200: "#A9EBBC",
300: "#7EE19A",
400: "#53D778",
500: "#22C55E",
600: "#1CA04C",
700: "#167A3A",
800: "#105528",
900: "#0A2F16",
DEFAULT: "#22C55E",
},
},
fontFamily: {
sans: ["Inter", "sans-serif"],
},
},
},
plugins: [],
};
export default config;

26
apps/web/tsconfig.json Normal file
View File

@@ -0,0 +1,26 @@
{
"compilerOptions": {
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
"noEmit": true,
"esModuleInterop": true,
"module": "esnext",
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"incremental": true,
"plugins": [
{
"name": "next"
}
],
"paths": {
"@/*": ["./*"]
}
},
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
"exclude": ["node_modules"]
}