diff --git a/app/contacto/page.tsx b/app/contacto/page.tsx new file mode 100644 index 0000000..5c768f6 --- /dev/null +++ b/app/contacto/page.tsx @@ -0,0 +1,99 @@ +"use client"; +import { motion } from "framer-motion"; +import { Badge } from "@/components/ui/Badge"; +import { ContactoForm } from "@/components/forms/ContactoForm"; +import { FiMapPin, FiMail, FiPhone } from "react-icons/fi"; +import { useLanguage } from "@/context/LanguageContext"; + +export default function ContactoPage() { + const { t } = useLanguage(); + + const infoContacto = [ + { + icon: , + label: t.contacto.info.address, + value: "Av. de Madrid, 138, Sants-Montjuïc, 08028 Barcelona", + href: "https://www.google.com/maps/search/?api=1&query=Av.+de+Madrid,+138,+08028+Barcelona", + }, + { + icon: , + label: t.contacto.info.email, + value: "jordi@itemopina.com", + href: "mailto:jordi@itemopina.com", + isEmail: true, + }, + { + icon: , + label: t.contacto.info.phone, + value: "650 066 923", + href: "tel:+34650066923", + }, + ]; + + // Lógica para resaltar la última palabra del título en color ocean + const titleWords = t.contacto.heroTitle.split(" "); + const lastWord = titleWords.pop(); + const mainTitle = titleWords.join(" "); + + return ( +
+
+
+ + {/* Columna de Información */} + + {t.contacto.badge || "Contacto Directo"} + +

+ {mainTitle}
+ {lastWord} +

+ +

+ {t.contacto.heroDesc} +

+ +
+ {infoContacto.map((item, idx) => ( +
+

+ {item.icon} + {item.label} +

+ + {item.value} + +
+ ))} +
+
+ + {/* Columna del Formulario */} + +

+ {t.contacto.form.title} +

+ +
+ +
+
+
+ ); +} \ No newline at end of file diff --git a/app/globals.css b/app/globals.css index a2dc41e..cc7f677 100644 --- a/app/globals.css +++ b/app/globals.css @@ -1,26 +1,28 @@ @import "tailwindcss"; -:root { - --background: #ffffff; - --foreground: #171717; +@theme { + --color-navy: #03045E; + --color-ocean: #0077B6; + --color-sky: #00B4D8; + --color-powder: #90E0EF; + --color-ice: #CAF0F8; + --font-sans: 'Manrope', sans-serif; } -@theme inline { - --color-background: var(--background); - --color-foreground: var(--foreground); - --font-sans: var(--font-geist-sans); - --font-mono: var(--font-geist-mono); -} - -@media (prefers-color-scheme: dark) { - :root { - --background: #0a0a0a; - --foreground: #ededed; +@layer base { + /* Esto elimina la línea azul en todos los navegadores */ + *, *:focus, *:active, *:focus-visible { + outline: none !important; + box-shadow: none !important; + ring: 0 !important; + } + + input, textarea, select, button { + outline: none !important; + box-shadow: none !important; } } -body { - background: var(--background); - color: var(--foreground); - font-family: Arial, Helvetica, sans-serif; -} +@utility border-crisp { + border: 1px solid rgba(202, 240, 248, 0.6); +} \ No newline at end of file diff --git a/app/insights/page.tsx b/app/insights/page.tsx new file mode 100644 index 0000000..a2a1e28 --- /dev/null +++ b/app/insights/page.tsx @@ -0,0 +1,102 @@ +"use client"; +import { Badge } from "@/components/ui/Badge"; +import { Card } from "@/components/ui/Card"; +import { motion } from "framer-motion"; +import Image from "next/image"; +import { useLanguage } from "@/context/LanguageContext"; + +export default function InsightsPage() { + const { t, locale } = useLanguage(); + + // Mapeo de meses para las fechas de los artículos + const months = { + es: { mayo: "Mayo", abril: "Abril", marzo: "Marzo" }, + ca: { mayo: "Maig", abril: "Abril", marzo: "Març" }, + en: { mayo: "May", abril: "April", marzo: "March" } + }; + + const articulos = [ + { + titulo: locale === 'en' ? "The new post-pandemic consumer in Spain" : + locale === 'ca' ? "El nou consumidor post-pandèmia a Espanya" : + "El nuevo consumidor post-pandemia en España", + categoria: t.insights.categories.tendencias, + imagen: "https://images.unsplash.com/photo-1551434678-e076c223a692?q=80&w=2070&auto=format&fit=crop", + fecha: `${months[locale].mayo} 2026`, + size: "large" + }, + { + titulo: locale === 'en' ? "Agile methodologies in fieldwork" : + locale === 'ca' ? "Metodologies àgils en el treball de camp" : + "Metodologías ágiles en el trabajo de campo", + categoria: t.insights.categories.innovacion, + imagen: "https://images.unsplash.com/photo-1460925895917-afdab827c52f?q=80&w=2015&auto=format&fit=crop", + fecha: `${months[locale].abril} 2026`, + size: "small" + }, + { + titulo: locale === 'en' ? "Mystery Shopping: Beyond compliance" : + locale === 'ca' ? "Mistery Shopping: Més enllà del compliment" : + "Mistery Shopping: Más allá del cumplimiento", + categoria: t.insights.categories.estrategia, + imagen: "https://images.unsplash.com/photo-1534452203293-494d7ddbf7e0?q=80&w=2072&auto=format&fit=crop", + fecha: `${months[locale].marzo} 2026`, + size: "small" + } + ]; + + // Dividimos el título para aplicar el color al final + const titleParts = t.insights.title.split('&'); + + return ( +
+
+ {t.insights.badge} +

+ {titleParts[0]} &
{titleParts[1]} +

+

+ {t.insights.description} +

+
+ +
+ {articulos.map((item, idx) => ( + + +
+ {item.titulo} +
+ + {item.categoria} + +
+
+
+ {item.fecha} +

+ {item.titulo} +

+
+ {t.insights.readMore} + +
+
+
+
+ ))} +
+
+ ); +} \ No newline at end of file diff --git a/app/layout.tsx b/app/layout.tsx index 976eb90..a5e90a2 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,20 +1,15 @@ import type { Metadata } from "next"; -import { Geist, Geist_Mono } from "next/font/google"; +import { Manrope } from "next/font/google"; import "./globals.css"; +import { Navbar } from "@/components/layout/Navbar"; +import { Footer } from "@/components/layout/Footer"; +import { LanguageProvider } from "@/context/LanguageContext"; -const geistSans = Geist({ - variable: "--font-geist-sans", - subsets: ["latin"], -}); - -const geistMono = Geist_Mono({ - variable: "--font-geist-mono", - subsets: ["latin"], -}); +const manrope = Manrope({ subsets: ["latin"] }); export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", + title: "ITEM OPINA | Inteligencia de Mercado", + description: "Estudios de mercado y consultoría con rigor metodológico.", }; export default function RootLayout({ @@ -23,11 +18,16 @@ export default function RootLayout({ children: React.ReactNode; }>) { return ( - - {children} + + + + +
+ {children} +
+