feat: Next.js initialization with premium vanilla CSS layout

This commit is contained in:
Carlos (Almeira)
2026-03-13 00:15:32 -05:00
parent 2390035295
commit ffe9674e8d
10 changed files with 6328 additions and 1 deletions

41
.gitignore vendored Normal file
View File

@@ -0,0 +1,41 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/.pnp
.pnp.*
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/versions
# testing
/coverage
# next.js
/.next/
/out/
# production
/build
# misc
.DS_Store
*.pem
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*
# env files (can opt-in for committing if needed)
.env*
# vercel
.vercel
# typescript
*.tsbuildinfo
next-env.d.ts

View File

@@ -1 +1,34 @@
# Almeira Producciones Web This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
## Getting Started
First, run the development server:
```bash
npm run dev
# or
yarn dev
# or
pnpm dev
# or
bun dev
```
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
## Learn More
To learn more about Next.js, take a look at the following resources:
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
## Deploy on Vercel
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.

18
eslint.config.mjs Normal file
View File

@@ -0,0 +1,18 @@
import { defineConfig, globalIgnores } from "eslint/config";
import nextVitals from "eslint-config-next/core-web-vitals";
import nextTs from "eslint-config-next/typescript";
const eslintConfig = defineConfig([
...nextVitals,
...nextTs,
// Override default ignores of eslint-config-next.
globalIgnores([
// Default ignores of eslint-config-next:
".next/**",
"out/**",
"build/**",
"next-env.d.ts",
]),
]);
export default eslintConfig;

7
next.config.ts Normal file
View File

@@ -0,0 +1,7 @@
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
/* config options here */
};
export default nextConfig;

5955
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

24
package.json Normal file
View File

@@ -0,0 +1,24 @@
{
"name": "almeira-web",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "eslint"
},
"dependencies": {
"next": "16.1.6",
"react": "19.2.3",
"react-dom": "19.2.3"
},
"devDependencies": {
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
"eslint": "^9",
"eslint-config-next": "16.1.6",
"typescript": "^5"
}
}

150
src/app/globals.css Normal file
View File

@@ -0,0 +1,150 @@
:root {
--bg-dark: #0f172a;
--bg-card: rgba(30, 41, 59, 0.7);
--text-main: #f8fafc;
--text-muted: #94a3b8;
--accent-primary: #3b82f6;
--accent-glow: rgba(59, 130, 246, 0.5);
--accent-secondary: #ec4899;
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
background-color: var(--bg-dark);
color: var(--text-main);
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
min-height: 100vh;
display: flex;
flex-direction: column;
overflow-x: hidden;
}
/* Glassmorphism Classes */
.glass-panel {
background: var(--bg-card);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 16px;
box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1);
}
/* Animations */
@keyframes fadeIn {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes pulseGlow {
0% { box-shadow: 0 0 0 0 var(--accent-glow); }
70% { box-shadow: 0 0 20px 10px rgba(59, 130, 246, 0); }
100% { box-shadow: 0 0 0 0 rgba(59, 130, 246, 0); }
}
.animate-fade-in {
animation: fadeIn 0.8s ease-out forwards;
}
/* Utility Layouts */
.container {
width: 100%;
max-width: 1200px;
margin: 0 auto;
padding: 0 2rem;
}
.hero-section {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
min-height: 80vh;
text-align: center;
position: relative;
}
.hero-bg-gradient {
position: absolute;
top: -20%;
left: 50%;
transform: translateX(-50%);
width: 600px;
height: 600px;
background: radial-gradient(circle, var(--accent-glow) 0%, rgba(15, 23, 42, 0) 70%);
z-index: -1;
pointer-events: none;
}
h1.hero-title {
font-size: 4rem;
font-weight: 800;
margin-bottom: 1rem;
background: linear-gradient(to right, #fff, var(--text-muted));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
line-height: 1.2;
}
p.hero-subtitle {
font-size: 1.25rem;
color: var(--text-muted);
max-width: 600px;
margin-bottom: 2.5rem;
}
.action-btn {
background: linear-gradient(135deg, var(--accent-primary), #2563eb);
color: white;
border: none;
padding: 1rem 2rem;
font-size: 1.1rem;
font-weight: 600;
border-radius: 9999px;
cursor: pointer;
transition: transform 0.2s, box-shadow 0.2s;
animation: pulseGlow 3s infinite;
}
.action-btn:hover {
transform: translateY(-2px);
box-shadow: 0 10px 25px -5px var(--accent-glow);
}
.features-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 2rem;
margin-top: 4rem;
width: 100%;
}
.feature-card {
padding: 2rem;
transition: transform 0.3s ease;
}
.feature-card:hover {
transform: translateY(-5px);
}
.feature-icon {
font-size: 2.5rem;
margin-bottom: 1.5rem;
display: inline-block;
}
.feature-title {
font-size: 1.5rem;
font-weight: 600;
margin-bottom: 1rem;
}
.feature-desc {
color: var(--text-muted);
line-height: 1.6;
}

19
src/app/layout.tsx Normal file
View File

@@ -0,0 +1,19 @@
import type { Metadata } from "next";
import "./globals.css";
export const metadata: Metadata = {
title: "Almeira Producciones | Portal de Medios Inteligente",
description: "Portal transaccional de noticias, eventos y clasificados con automatización de IA.",
};
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<html lang="es">
<body>{children}</body>
</html>
);
}

46
src/app/page.tsx Normal file
View File

@@ -0,0 +1,46 @@
export default function Home() {
return (
<main className="container animate-fade-in">
<section className="hero-section">
<div className="hero-bg-gradient"></div>
<h1 className="hero-title">Almeira Producciones</h1>
<p className="hero-subtitle">
El portal interactivo de medios donde las noticias, eventos y clasificados
cobran vida mediante inteligencia artificial y streaming en tiempo real.
</p>
<button className="action-btn">
Explorar Contenido
</button>
<div className="features-grid">
<div className="feature-card glass-panel">
<span className="feature-icon">📰</span>
<h3 className="feature-title">Noticias Inteligentes</h3>
<p className="feature-desc">
Periodismo automatizado. Las últimas actualizaciones de la región procesadas
para una lectura rápida y veraz.
</p>
</div>
<div className="feature-card glass-panel">
<span className="feature-icon">🎙</span>
<h3 className="feature-title">Radio en Vivo</h3>
<p className="feature-desc">
Conéctate instantáneamente con nuestra emisora de formato continuo y
nuestros eventos en streaming.
</p>
</div>
<div className="feature-card glass-panel">
<span className="feature-icon">📱</span>
<h3 className="feature-title">Portal Transaccional</h3>
<p className="feature-desc">
Clasificados y alertas en tiempo real, directamente integrados con
nuestro bot de WhatsApp.
</p>
</div>
</div>
</section>
</main>
);
}

34
tsconfig.json Normal file
View File

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