The GCS Consultores Empresariales website is built on Next.js 16.2.6 with the App Router, React 19, and TypeScript 5.7.3, deployed on Vercel. The architecture follows a strict separation of concerns: a content layer that centralises all business data, a UI layer composed of autonomous section components, and a server layer that handles AI streaming and CRM lead submission — all wired together without a separate backend service.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/gcsconsultores/gcs-website/llms.txt
Use this file to discover all available pages before exploring further.
Tech Stack
| Layer | Technology | Version |
|---|---|---|
| Framework | Next.js | 16.2.6 |
| UI Runtime | React | 19 |
| Language | TypeScript | 5.7.3 |
| Styling | Tailwind CSS | ^4.2.0 |
| Component Library | shadcn/ui | 4.8.0 |
| AI | Vercel AI SDK + Google Gemini | ai ^6.0.206 |
| Validation | Zod | ^4.4.3 |
| Analytics | Vercel Analytics | 1.6.1 |
Architecture Layers
The site is organized into three distinct layers that communicate in one direction — from data outward to the UI — keeping each layer independently testable and replaceable.Content Layer
lib/site-data.ts is the single source of truth for all business content — navigation, solutions, sectors, strategic centers, insights, and company metadata. No JSX file owns raw content strings.UI Layer
components/sections/ contains autonomous section components. Each reads from lib/site-data.ts directly. Supporting layers: components/ui/ (shadcn/ui primitives), components/brand/ (logo), and components/layout/ (header, footer).Server Layer
app/api/sally/route.ts streams AI responses via the Vercel AI Gateway. app/actions/lead-actions.ts is a Next.js Server Action that validates and forwards leads to the configured CRM endpoint.Content Layer — lib/site-data.ts
Every piece of business content the website renders is exported from a single TypeScript file. Navigation items, solution cards, sector images, strategic center definitions, insight articles, and the company contact block all live here as typed constants. Section components import what they need; they never hardcode strings.
This means updating a headline, adding a new sector, or changing a phone number requires editing exactly one file — not hunting through JSX across multiple components.
UI Layer — components/
The UI layer is divided into four sub-directories with clear responsibilities:
components/sections/— Self-contained page sections (Hero, Solutions, Sectors, ContactForm, StrategicCenters, Insights, Portafolio, Alliances). Each is a React component that composes data fromlib/site-data.tswith shadcn/ui primitives.components/ui/— Unstyled, accessible shadcn/ui primitives (Button, Card, Dialog, Input, Select, Sheet, Sonner, etc.).components/brand/— The GCS logo component, isolated so it can be updated independently.components/layout/—header.tsxandfooter.tsx, which are shared across all pages.
Server Layer — app/api/ and app/actions/
The server layer exposes two integration points:
app/api/sally/route.ts— A Node.js route handler that receivesUIMessage[]from theSallyChatwidget, streams a response fromgoogle/gemini-3-flashvia the Vercel AI Gateway usingstreamText(), and returns aUIMessageStreamResponse. This route never runs on the client.app/actions/lead-actions.ts— A Next.js Server Action ('use server') that validates the contact form payload againstleadSchema(Zod), then callssendToCrm(), which posts toCRM_API_URLusingCRM_API_KEY. If the environment variables are not set, the lead is logged to stdout so no data is lost during development.
app/api/sally/route.ts sets export const maxDuration = 30. The route intentionally does not use export const runtime = 'edge' — the Vercel AI SDK requires the Node.js runtime for streaming with streamText().Data Flow
The three major user interactions each follow a distinct data path through the stack.App Router Page Structure
The site exposes three user-facing routes, each assembled from the same shared components:| Route | File | Purpose |
|---|---|---|
/ | app/page.tsx | Homepage — assembles all major sections in order |
/sobre-nosotros | app/sobre-nosotros/page.tsx | About Us page |
/sectores-especializacion | app/sectores-especializacion/page.tsx | Sector specialization detail page |
app/page.tsx is intentionally thin — its only job is to assemble section components in the correct order. Reordering sections is a matter of moving import lines.
Root Layout
app/layout.tsx is the single root layout shared by all routes. It loads three Google Fonts via next/font/google — Open Sans (body and headings via font-sans / font-heading), Nunito (available as --font-nunito for optional display use), and Geist Mono (code) — as CSS custom property variables injected on the <html> element. Vercel Analytics is conditionally rendered only in NODE_ENV === 'production', and the <Toaster> from Sonner is mounted here for global toast notifications.