feat: scaffold Next.js agency site (AI-native hero)

This commit is contained in:
Feedback Studios 2026-06-16 04:37:19 +00:00
commit 4d0f97d9a5
7 changed files with 272 additions and 0 deletions

7
.gitignore vendored Normal file
View file

@ -0,0 +1,7 @@
node_modules
/.next
/out
.env*
*.log
.DS_Store
next-env.d.ts

156
app/globals.css Normal file
View file

@ -0,0 +1,156 @@
:root {
--bg: #0a0a0b;
--fg: #fafafa;
--muted: #a1a1aa;
--accent: #6366f1;
--accent-2: #22d3ee;
--maxw: 1100px;
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html,
body {
background: var(--bg);
color: var(--fg);
font-family: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto,
Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
}
a {
color: inherit;
text-decoration: none;
}
.hero {
min-height: 100dvh;
display: flex;
flex-direction: column;
padding: clamp(20px, 4vw, 40px);
position: relative;
overflow: hidden;
}
.hero::before {
content: "";
position: absolute;
inset: 0;
background: radial-gradient(
60% 50% at 72% 0%,
rgba(99, 102, 241, 0.28),
transparent 70%
),
radial-gradient(40% 40% at 0% 100%, rgba(34, 211, 238, 0.12), transparent 70%);
pointer-events: none;
}
.nav {
display: flex;
justify-content: space-between;
align-items: center;
position: relative;
z-index: 1;
}
.logo {
font-weight: 700;
letter-spacing: -0.02em;
}
.nav-cta {
font-size: 0.9rem;
color: var(--muted);
}
.content {
flex: 1;
display: flex;
flex-direction: column;
justify-content: center;
max-width: var(--maxw);
width: 100%;
margin: 0 auto;
position: relative;
z-index: 1;
}
.eyebrow {
text-transform: uppercase;
letter-spacing: 0.18em;
font-size: 0.78rem;
color: var(--accent-2);
margin-bottom: 1.2rem;
}
h1 {
font-size: clamp(2.4rem, 6.5vw, 5rem);
line-height: 1.02;
letter-spacing: -0.03em;
font-weight: 800;
}
h1 span {
background: linear-gradient(90deg, var(--accent), var(--accent-2));
-webkit-background-clip: text;
background-clip: text;
color: transparent;
}
.sub {
margin-top: 1.6rem;
max-width: 620px;
font-size: clamp(1rem, 1.6vw, 1.25rem);
color: var(--muted);
line-height: 1.6;
}
.actions {
margin-top: 2.4rem;
display: flex;
gap: 1rem;
flex-wrap: wrap;
}
.btn {
padding: 0.85rem 1.5rem;
border-radius: 999px;
font-weight: 600;
font-size: 0.95rem;
transition: transform 0.15s ease, opacity 0.15s ease;
}
.btn:hover {
transform: translateY(-2px);
}
.btn.primary {
background: linear-gradient(90deg, var(--accent), var(--accent-2));
color: #04060a;
}
.btn.ghost {
border: 1px solid rgba(255, 255, 255, 0.18);
color: var(--fg);
}
.foot {
position: relative;
z-index: 1;
color: var(--muted);
font-size: 0.8rem;
padding-top: 2rem;
}
@media (max-width: 640px) {
.actions {
flex-direction: column;
}
.btn {
text-align: center;
}
}

20
app/layout.tsx Normal file
View file

@ -0,0 +1,20 @@
import type { Metadata } from "next";
import "./globals.css";
export const metadata: Metadata = {
title: "Feedback Studios — La agencia de marketing AI-native",
description:
"Estrategia humana, ejecución sobre nuestra propia plataforma de IA. Web, SEO, ads y contenido: más rápido, más medible y a mejor coste.",
};
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="es">
<body>{children}</body>
</html>
);
}

38
app/page.tsx Normal file
View file

@ -0,0 +1,38 @@
export default function Home() {
return (
<main className="hero">
<nav className="nav">
<span className="logo">Feedback Studios</span>
<a className="nav-cta" href="#contacto">
Habla con nosotros
</a>
</nav>
<section className="content">
<p className="eyebrow">Agencia de marketing AI-native</p>
<h1>
La mayoría de agencias alquilan sus herramientas.
<br />
<span>Nosotros construimos la nuestra.</span>
</h1>
<p className="sub">
Estrategia humana + nuestra propia plataforma de IA. Web, SEO, ads y
contenido más rápido, más medible y a mejor coste que una agencia
tradicional.
</p>
<div className="actions">
<a className="btn primary" href="#contacto">
Habla con nosotros
</a>
<a className="btn ghost" href="#trabajo">
Ver resultados
</a>
</div>
</section>
<footer className="foot">
© 2026 Feedback Studios · construido sobre infraestructura propia
</footer>
</main>
);
}

6
next.config.mjs Normal file
View file

@ -0,0 +1,6 @@
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
};
export default nextConfig;

24
package.json Normal file
View file

@ -0,0 +1,24 @@
{
"name": "agency-web",
"version": "0.1.0",
"private": true,
"engines": {
"node": ">=20"
},
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start -H 0.0.0.0 -p 3000"
},
"dependencies": {
"next": "15.1.6",
"react": "19.0.0",
"react-dom": "19.0.0"
},
"devDependencies": {
"typescript": "^5.7.3",
"@types/node": "^22.10.7",
"@types/react": "^19.0.7",
"@types/react-dom": "^19.0.3"
}
}

21
tsconfig.json Normal file
View file

@ -0,0 +1,21 @@
{
"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": "preserve",
"incremental": true,
"plugins": [{ "name": "next" }],
"paths": { "@/*": ["./*"] }
},
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
"exclude": ["node_modules"]
}