From 27bb2fc0aa2a9d388ad7d47555d462c2b18957d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Raul=20Mauricio=20U=C3=B1ate=20Castro?= Date: Wed, 26 Aug 2026 17:18:30 -0500 Subject: [PATCH 1/7] Version Editorial - 0.0.1-beta.1 --- app/globals.css | 210 +++++++++++++++++-------- app/layout.tsx | 10 +- app/page.tsx | 100 ++---------- components/layout/Footer.tsx | 120 +++++++++++++++ components/layout/Navbar.tsx | 110 +++++++++++++ components/map/ColombiaMap.tsx | 76 +++++++++ components/map/LeafletMap.tsx | 127 +++++++++++++++ components/map/marker-colors.ts | 15 ++ components/sections/Communities.tsx | 88 +++++++++++ components/sections/Events.tsx | 230 ++++++++++++++++++++++++++++ components/sections/Hero.tsx | 73 +++++++++ components/sections/Newsletter.tsx | 139 +++++++++++++++++ components/sections/Sponsors.tsx | 106 +++++++++++++ components/ui/MosaicBar.tsx | 30 ++++ components/ui/Reveal.tsx | 42 +++++ components/ui/SectionHeading.tsx | 40 +++++ data/mockCommunities.ts | 62 ++++++++ data/mockEvents.ts | 44 ++++++ data/mockMapMarkers.ts | 53 +++++++ data/mockSponsors.ts | 27 ++++ lib/mock/newsletter.ts | 39 +++++ lib/site.ts | 33 ++++ lib/types.ts | 59 +++++++ package-lock.json | 63 +++++++- package.json | 6 +- 25 files changed, 1745 insertions(+), 157 deletions(-) create mode 100644 components/layout/Footer.tsx create mode 100644 components/layout/Navbar.tsx create mode 100644 components/map/ColombiaMap.tsx create mode 100644 components/map/LeafletMap.tsx create mode 100644 components/map/marker-colors.ts create mode 100644 components/sections/Communities.tsx create mode 100644 components/sections/Events.tsx create mode 100644 components/sections/Hero.tsx create mode 100644 components/sections/Newsletter.tsx create mode 100644 components/sections/Sponsors.tsx create mode 100644 components/ui/MosaicBar.tsx create mode 100644 components/ui/Reveal.tsx create mode 100644 components/ui/SectionHeading.tsx create mode 100644 data/mockCommunities.ts create mode 100644 data/mockEvents.ts create mode 100644 data/mockMapMarkers.ts create mode 100644 data/mockSponsors.ts create mode 100644 lib/mock/newsletter.ts create mode 100644 lib/site.ts create mode 100644 lib/types.ts diff --git a/app/globals.css b/app/globals.css index 3ed8004..0b7a38d 100644 --- a/app/globals.css +++ b/app/globals.css @@ -1,4 +1,6 @@ @import "tailwindcss"; +/* Antes de los overrides dark de la sección Leaflet para ganar en el cascade */ +@import "leaflet/dist/leaflet.css"; :root { --background: #0d0d1a; @@ -8,104 +10,176 @@ @theme inline { --color-background: var(--background); --color-foreground: var(--foreground); - --font-sans: var(--font-geist-sans); + --font-sans: var(--font-titillium); --font-mono: var(--font-geist-mono); } +/* ── Paleta oficial (extraída de public/images/logo.png) ── + Tailwind v4 no usa tailwind.config.ts: los tokens se declaran aquí + y generan clases como bg-python-blue o text-accent-orange. */ +@theme { + /* Marca */ + --color-python-blue: #306998; + --color-python-blue-light: #4b8bbe; + --color-python-yellow: #ffd43b; + --color-python-yellow-light: #ffe873; + + /* Acentos del mosaico del logo */ + --color-accent-red: #e24329; + --color-accent-orange: #f58220; + --color-accent-green: #2fb350; + --color-accent-purple: #5c4ee5; + + /* Neutros (modo oscuro) */ + --color-night: #0d0d1a; + --color-night-soft: #12122a; + --color-night-card: #16162e; +} + +@media (prefers-reduced-motion: no-preference) { + html { + scroll-behavior: smooth; + } +} + body { background: var(--background); color: var(--foreground); - font-family: var(--font-geist-sans), Arial, Helvetica, sans-serif; + font-family: var(--font-titillium), "Segoe UI", Arial, sans-serif; } -/* ── Blob decorativo ──────────────────────────────────────── */ -.blob { - position: absolute; - border-radius: 50%; - filter: blur(100px); - opacity: 0.13; - pointer-events: none; - will-change: transform; +::selection { + background: var(--color-python-yellow); + color: var(--color-night); +} + +/* ── Utilidades editoriales de marca ──────────────────── */ + +/* Esquina inferior derecha cortada: contraste angular frente al mapa orgánico */ +@utility cut-corner { + clip-path: polygon( + 0 0, + 100% 0, + 100% calc(100% - 18px), + calc(100% - 18px) 100%, + 0 100% + ); +} + +/* Corte diagonal inferior para portadas de eventos */ +@utility clip-diagonal { + clip-path: polygon(0 0, 100% 0, 100% calc(100% - 20px), 0 100%); +} + +/* Texto contorneado para marcas de agua */ +@utility text-stroke { + -webkit-text-stroke: 1px rgb(255 255 255 / 0.1); + color: transparent; } -.blob-blue { - width: 520px; - height: 520px; - background: #4584b6; - top: -160px; - left: -160px; - animation: blob-float 11s ease-in-out infinite; +/* ── Animación de entrada al hacer scroll (componente Reveal) ── */ +.reveal { + opacity: 0; + transform: translateY(24px); + transition: + opacity 0.7s ease, + transform 0.7s ease; } -.blob-yellow { - width: 420px; - height: 420px; - background: #ffd43b; - top: -120px; - right: -120px; - animation: blob-float-reverse 13s ease-in-out infinite; +.reveal.is-visible { + opacity: 1; + transform: none; } -.blob-red { - width: 360px; - height: 360px; - background: #e63329; - bottom: -120px; - left: 8%; - animation: blob-float 15s ease-in-out infinite 2s; +@media (prefers-reduced-motion: reduce) { + .reveal { + opacity: 1; + transform: none; + transition: none; + } } -.blob-green { - width: 300px; - height: 300px; - background: #4caf50; - bottom: -80px; - right: 6%; - animation: blob-float-reverse 12s ease-in-out infinite 1s; +/* ── Leaflet (mapa del hero) ────────────────────────── */ +.leaflet-container { + background: var(--color-night); + font-family: inherit; } -/* ── Animaciones de blob ──────────────────────────────────── */ -@keyframes blob-float { - 0%, 100% { transform: translateY(0px) scale(1); } - 50% { transform: translateY(-28px) scale(1.06); } +/* Marcador cuadrado del mosaico con anillo pulsante */ +.map-marker { + background: transparent; + border: 0; +} + +.map-marker__dot { + position: absolute; + inset: 0; + border: 2px solid var(--color-night); +} + +.map-marker__ring { + position: absolute; + inset: 0; + opacity: 0.5; + animation: marker-pulse 2s ease-out infinite; +} + +@keyframes marker-pulse { + 0% { + transform: scale(1); + opacity: 0.5; + } + 100% { + transform: scale(2.4); + opacity: 0; + } +} + +@media (prefers-reduced-motion: reduce) { + .map-marker__ring { + animation: none; + opacity: 0; + } +} + +/* Popup acorde al estilo editorial (anguloso, sombra dura) */ +.leaflet-popup-content-wrapper { + background: var(--color-night); + color: var(--foreground); + border: 1px solid rgb(255 255 255 / 0.2); + border-radius: 0; + box-shadow: 8px 8px 0 0 rgb(0 0 0 / 0.45); } -@keyframes blob-float-reverse { - 0%, 100% { transform: translateY(0px) scale(1); } - 50% { transform: translateY(28px) scale(0.94); } +.leaflet-popup-content { + margin: 16px; } -/* ── Gradiente animado en el texto ───────────────────────── */ -.gradient-text { - background: linear-gradient(135deg, #ffd43b 0%, #4584b6 40%, #ffd43b 80%); - background-size: 200% 200%; - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; - animation: gradient-shift 5s ease infinite; +.leaflet-popup-content p { + margin: 0; } -@keyframes gradient-shift { - 0%, 100% { background-position: 0% 50%; } - 50% { background-position: 100% 50%; } +.leaflet-popup-tip { + background: var(--color-night); + border: 1px solid rgb(255 255 255 / 0.2); + box-shadow: none; } -/* ── Glow suave en el logo ───────────────────────────────── */ -.logo-glow { - filter: drop-shadow(0 0 32px rgba(69, 132, 182, 0.25)); - transition: filter 0.4s ease; +.leaflet-container a.leaflet-popup-close-button { + color: #a1a1aa; } -.logo-glow:hover { - filter: drop-shadow(0 0 48px rgba(255, 212, 59, 0.3)); +.leaflet-container a.leaflet-popup-close-button:hover { + color: #ffffff; } -/* ── Badge «Próximamente» ────────────────────────────────── */ -@keyframes badge-ring { - 0%, 100% { box-shadow: 0 0 0 0 rgba(255, 212, 59, 0.45); } - 60% { box-shadow: 0 0 0 10px rgba(255, 212, 59, 0); } +/* Atribución OSM/CARTO discreta sobre fondo oscuro */ +.leaflet-control-attribution { + background: rgb(13 13 26 / 0.85) !important; + color: #71717a; + font-size: 10px; } -.badge-glow { - animation: badge-ring 2.8s ease-out infinite; +.leaflet-control-attribution a { + color: #a1a1aa; } diff --git a/app/layout.tsx b/app/layout.tsx index 01cba3e..40996e8 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,11 +1,13 @@ -import { Geist, Geist_Mono } from "next/font/google"; +import { Geist_Mono, Titillium_Web } from "next/font/google"; import ConsoleInit from "./ConsoleInit"; import "./globals.css"; export { metadata, viewport } from "@/lib/seo"; -const geistSans = Geist({ - variable: "--font-geist-sans", +// 300 detalles/lead · 400 cuerpo · 600 labels · 700 botones · 900 titulares +const titillium = Titillium_Web({ + variable: "--font-titillium", subsets: ["latin"], + weight: ["300", "400", "600", "700", "900"], }); const geistMono = Geist_Mono({ @@ -21,7 +23,7 @@ export default function RootLayout({ return ( diff --git a/app/page.tsx b/app/page.tsx index c681a6e..f321abd 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,89 +1,23 @@ -import Image from "next/image"; -import { asset } from "@/lib/assets"; +import Navbar from "@/components/layout/Navbar"; +import Footer from "@/components/layout/Footer"; +import Hero from "@/components/sections/Hero"; +import Communities from "@/components/sections/Communities"; +import Events from "@/components/sections/Events"; +import Sponsors from "@/components/sections/Sponsors"; +import Newsletter from "@/components/sections/Newsletter"; export default function Home() { return ( -
- - {/* ── Blobs de color decorativos ────────────────────────── */} -