diff --git a/.gitignore b/.gitignore index 90015d4..ebb9588 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ -# Dependencies +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies /node_modules /.pnp .pnp.* @@ -8,37 +10,37 @@ !.yarn/releases !.yarn/versions -# Testing +# testing /coverage -# Next.js build files +# next.js /.next/ -./out/ +/out/ -# Production build +# production /build -# Miscellaneous +# misc .DS_Store *.pem -# Debug logs +# debug npm-debug.log* yarn-debug.log* yarn-error.log* .pnpm-debug.log* -# Environment files (opt-in for committing if needed) -/.env* +# env files (can opt-in for committing if needed) +.env* -# Vercel deployment settings -/.vercel +# vercel +.vercel -# TypeScript cache +# typescript *.tsbuildinfo next-env.d.ts -# Firebase configuration -/.firebase -/.firebaserc -firebase-config.js +# firebase +.firebase/ +.firebaserc +firebase-config.js \ No newline at end of file diff --git a/README.md b/README.md index e2f388a..3137ff3 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,65 @@ pyday-frontend/ - `tailwindcss@4.1`: Utility-first CSS - `framer-motion@10.16.0`: Smooth animations + +## 🚦 Feature Management + +Controla la visibilidad de funcionalidades mediante variables de entorno: + +```env +# .env.local +NEXT_PUBLIC_FEATURE_REGISTRATION="false" # Formulario de registro general +NEXT_PUBLIC_FEATURE_SPONSORS="true" # Sección completa de patrocinios +NEXT_PUBLIC_FEATURE_SPONSOR_FORM="false" # Formulario de patrocinio específico +``` + +### Variables Disponibles +| Variable | Descripción | Valores Válidos | +|-----------------------------------|----------------------------------------------|-----------------| +| `NEXT_PUBLIC_FEATURE_REGISTRATION` | Habilita formulario de registro principal | `true`/`false` | +| `NEXT_PUBLIC_FEATURE_SPONSORS` | Muestra sección completa de patrocinios | `true`/`false` | +| `NEXT_PUBLIC_FEATURE_SPONSOR_FORM` | Activa formulario de contacto para patrocinios | `true`/`false` | + +### Flujo de Trabajo Recomendado +1. **Configurar variables** en `.env.local` (usar `true`/`false`) +2. **Reiniciar servidor** después de cambios +3. **Los CTAs alternativos** se mostrarán automáticamente cuando: + - Una funcionalidad está deshabilitada (`false`) + - Existe un link externo configurado en `cityData.js` + +### Para Links Externos +```javascript +// Ejemplo en src/data/cities.js +valparaiso: { + talkProposalLink: "https://..." // URL válida habilita CTA automático +} +``` + +**Nota:** Los botones alternativos (CTAs) se muestran solo cuando: +- La variable correspondiente está en `false` +- Existe un link configurado en los datos de la ciudad + +**Cambios realizados:** +1. Sección dedicada a gestión de features +2. Tabla clara de variables +3. Explicación del comportamiento automático +4. Ejemplo práctico de configuración +5. Guía visual para no técnicos + + +**Version final del archivo .env.local:** +```env +# CONFIGURACIÓN DE FUNCIONALIDADES +# Valores permitidos: "true" (activado) | "false" (desactivado) + +NEXT_PUBLIC_FEATURE_REGISTRATION="false" +NEXT_PUBLIC_FEATURE_SPONSORS="true" +NEXT_PUBLIC_FEATURE_SPONSOR_FORM="false" + +# URL BASE DEL SITIO (no modificar en desarrollo) +NEXT_PUBLIC_SITE_URL="http://localhost:3000" +``` + ## 🌍 Contributing We welcome community contributions! Please see our [Contribution Guidelines](docs/CONTRIBUTING.md) and review our [Photography Style Guide](docs/guia-fotografia.md) for asset submissions. @@ -96,4 +155,4 @@ We welcome community contributions! Please see our [Contribution Guidelines](doc **License**: Apache 2.0 (See [LICENSE](LICENSE)) **Maintainer**: PyDay Chile Tech Committee -📧 *pyday@pythonchile.cl* +📧 *pyday@pythonchile.cl* \ No newline at end of file diff --git a/env.local.txt b/env.local.txt new file mode 100644 index 0000000..c7ef4a7 --- /dev/null +++ b/env.local.txt @@ -0,0 +1,5 @@ +#Crear un .env.local con la data necesaria. +NEXT_PUBLIC_SITE_URL= +NEXT_PUBLIC_FEATURE_REGISTRATION= +NEXT_PUBLIC_FEATURE_SPONSOR_FORM= +NEXT_PUBLIC_FEATURE_SPONSORS= \ No newline at end of file diff --git a/next.config.mjs b/next.config.mjs index fc11db2..43d866c 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -1,6 +1,5 @@ /** @type {import('next').NextConfig} */ const nextConfig = { - output: 'export', transpilePackages: ["framer-motion"], trailingSlash: true, images: { @@ -18,7 +17,7 @@ const nextConfig = { formats: ["image/webp"], deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840], minimumCacheTTL: 86400, - unoptimized: true, + unoptimized: false, }, }; diff --git a/package.json b/package.json index 266498a..766bb97 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,35 @@ { - "name": "pyday2-2025", - "version": "0.1.0", + "name": "pydaydotcl", + "version": "1.0.0", + "description": "PyDay Chile 2025 - Evento anual gratuito que reúne a la comunidad Python en distintas ciudades de Chile.", "private": true, + "author": "María-Fernanda marifer.villalobos@pythonchile.cl", + "contributors": [ + "Liliana Garmendia liliana.garmendia@pythonchile.cl" + ], + "keywords": [ + "Python", + "Chile", + "PyDay", + "evento", + "comunidad", + "talleres", + "charlas", + "networking" + ], + "homepage": "https://pyday.cl", + "repository": { + "type": "git", + "url": "git+https://github.com/python-chile/PyDay" + }, + "bugs": { + "url": "https://github.com/python-chile/PyDay/issues" + }, + "license": "MIT", "scripts": { "dev": "next dev --turbopack", "build": "next build", - "export": "next output", + "export": "next export", "start": "next start", "lint": "next lint", "clean-build": "rd /s /q .next && npm run build && xcopy /E /I public\\images .next\\static\\images" diff --git a/public/images/404status_transp.svg b/public/images/404status_transp.svg new file mode 100644 index 0000000..f05d2fb --- /dev/null +++ b/public/images/404status_transp.svg @@ -0,0 +1 @@ +Yes \ No newline at end of file diff --git a/public/images/campus/Inacap_Copiapo.webp b/public/images/campus/Inacap_Copiapo.webp new file mode 100644 index 0000000..5b38f92 Binary files /dev/null and b/public/images/campus/Inacap_Copiapo.webp differ diff --git a/src/app/[city]/page.js b/src/app/[city]/page.js index d816b35..d2821d9 100644 --- a/src/app/[city]/page.js +++ b/src/app/[city]/page.js @@ -1,10 +1,14 @@ import Link from "next/link"; import Image from "next/image"; +import { notFound } from "next/navigation"; import TalkCard from "@/components/TalkCard"; import MapSection from "@/components/Maps"; import HeroSection from "@/components/HeroSection"; import FAQSection from "@/components/FAQSection"; import CTAFinal from "@/components/CTAFinal"; +import EmptyState from "@/components/EmptyState"; +import RegistrationForm from "@/components/RegistrationForm"; +import { FeatureGuard } from "@/components/FeatureManagement/FeatureGuard"; import cityData from "@/data/cities"; import { generalFAQs } from "@/data/faqs"; @@ -31,15 +35,7 @@ export default async function CityPage({ params }) { const data = await getCityData(params.city); if (!data) { - return ( -
-

Sede no encontrada

-

La sede que buscas no está disponible.

- - Volver al inicio - -
- ); + notFound(); } return ( @@ -67,40 +63,19 @@ export default async function CityPage({ params }) {

{data.introduction.description}

- +

¿Cómo participar?

{data.introduction.participationInfo}

- -

- Fecha: {data.date} -

- -

- Puedes participar, sin costo. -

- -
- {/* Oculto porque no está abierto el registro de asistentes - - Registrarme como asistente - - */} - - Postular charla/taller - -
+ +

Fecha: {data.date}

+ +

Puedes participar, sin costo.

- + {/* Columna de imagen */} {data.introduction.campusImage && (
@@ -117,6 +92,55 @@ export default async function CityPage({ params }) {
)} + + {/* Registro Section */} +
+ +

Regístrate

+
+ +
+
+
+ + {/* Agenda*/} +
+

Agenda

+ {data.length > 0 ? ( +
+ {data.schedule.map((talk, index) => ( + + ))} +
+ ) : ( + + )} + +
+ + Registrarme para este evento + + + + +
+
+ {/* Mapa y dirección */}
@@ -163,86 +187,6 @@ export default async function CityPage({ params }) {
- {/* Agenda*/} -
-

Agenda

- {data.length > 0 ? ( -
- {data.schedule.map((talk, index) => ( - - ))} -
- ) : ( -
-
- - - -
-

- No hay charlas disponibles aún -

-

- Estamos finalizando el programa. ¡Vuelve pronto para ver las - charlas confirmadas! -

- - Proponer una charla - - - - -
- )} - -
- - Registrarme para este evento - - - - -
-
+ {/* Encabezado */} +
+

+ Código de Conducta +

+

+ Adaptación del código de conducta de la Python Software Foundation + para la comunidad Python Chile +

+
+ + {/* Sección Comunidad */} +
+

+ Nuestra Comunidad +

+
+

+ Formada por miembros con diversas habilidades y experiencias, nos + regimos por: +

+
    + {[ + "Colaboración activa y voluntaria", + "Reconocimiento del esfuerzo comunitario", + "Respeto a diferentes perspectivas", + "Comunicación empática y constructiva", + "Lenguaje inclusivo y acogedor", + ].map((item, index) => ( +
  • + {item} +
  • + ))} +
+
+
+ + {/* Normas Principales */} +
+

+ Nuestras Normas +

+
+
+

+ Derechos Fundamentales +

+

+ Respeto a todas las identidades independientemente de: +

+
    + {[ + "Género", + "Orientación", + "Etnia", + "Religión", + "Nacionalidad", + "Ideología", + ].map((item, index) => ( +
  • {item}
  • + ))} +
+
+ +
+

Compromisos

+
    + {[ + "Ambiente seguro e inclusivo", + "Resolución pacífica de conflictos", + "Profesionalismo en interacciones", + "Integridad en todas las acciones", + ].map((item, index) => ( +
  • {item}
  • + ))} +
+
+
+
+ + {/* Conducta Prohibida */} +
+

+ Comportamiento Inapropiado +

+
+
+

+ Interacciones Sociales +

+
    + {[ + "Acoso en cualquier forma", + "Compartir información privada", + "Contacto físico no deseado", + "Lenguaje sexual inapropiado", + ].map((item, index) => ( +
  • {item}
  • + ))} +
+
+ +
+

+ Actividades Prohibidas +

+
    + {[ + "Actividades ilícitas", + "Propaganda política", + "Suplantación de identidad", + "Interrupciones deliberadas", + ].map((item, index) => ( +
  • {item}
  • + ))} +
+
+
+
+ + {/* Consecuencias */} +
+

+ Consecuencias +

+
+
    + {[ + "Evaluación inicial del reporte", + "Verificación de conflictos de interés", + "Reunión con las partes involucradas", + "Análisis y propuesta de acciones", + "Comunicación formal de resultados", + "Seguimiento post-resolución", + ].map((item, index) => ( +
  1. + {item} +
  2. + ))} +
+
+
+ + {/* Contacto */} +
+ + + + + Reportar Incumplimiento + +

+ Respuesta garantizada en menos de 48 horas +

+
+ + ); +} diff --git a/src/app/globals.css b/src/app/globals.css index f25861f..e518d63 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -1,8 +1,8 @@ @import "tailwindcss"; +@config "../../tailwind.config.js"; /* Esquema de color basado en el logo "PYDAY". - */ :root { @@ -11,8 +11,6 @@ --accent-yellow: #FFE141; /* Panza en tono intermedio */ --text-white: #FFFFFF; - /* Texto banner */ - --text-black: #000000; /* Texto principal */ --outline-red: #F23939; /* Contorno del texto en tono intermedio */ @@ -21,6 +19,7 @@ --primary-green-rgb: 61, 139, 55; --accent-yellow-rgb: 255, 225, 65; + --text-white-rgb: 255, 255, 255; --outline-red-rgb: 242, 57, 57; --bg-dark-rgb: 16, 16, 16; } @@ -44,7 +43,7 @@ body { .gradient-bg { background: - linear-gradient(rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.1)), + linear-gradient(rgba(0, 0, 0, 0.178), rgba(0, 0, 0, 0.1)), linear-gradient(135deg, var(--primary-green) 0%, var(--accent-yellow) 50%, var(--outline-red) 100%); background-size: 400% 400%; background-blend-mode: darken; @@ -77,6 +76,15 @@ body { /* Componentes reutilizables */ @layer components { + /* Menú */ + /* Para otros navegadores (no Firefox) */ + @supports not (-moz-appearance: none) { + .mobile-menu-container { + background: rgba(var(--text-white-rgb), 0%); + position: relative; + } + } + .btn-primary { @apply px-6 py-3 bg-transparent border-2 text-white font-bold rounded-full transition duration-300 ease-in-out shadow-lg hover:shadow-xl hover:-translate-y-1; border-color: var(--primary-green); @@ -111,7 +119,7 @@ body { .select-theme option { background-color: var(--primary-green); - color: var(--text-white) !important; + color: var(--primary-green) !important; border: var(--primary-green) !important; transition: background-color 0.2s ease, color 0.2s ease; } @@ -173,12 +181,24 @@ body { .sponsor-logo:hover { filter: brightness(120%) contrast(110%) drop-shadow(0 4px 8px rgba(0, 0, 0, 0.25)); } -} -.hide { - display: none; -} -.btn-primary, .btn-secondary { - color: white; - border-color: white; + @keyframes fade-in { + from { + opacity: 0; + transform: translateY(10px); + } + + to { + opacity: 1; + transform: translateY(0); + } + } + + .animate-fade-in { + animation: fade-in 0.6s ease-out forwards; + } + + .scroll-mt-24 { + scroll-margin-top: 6rem; + } } \ No newline at end of file diff --git a/src/app/layout.js b/src/app/layout.js index b603d75..12c1413 100644 --- a/src/app/layout.js +++ b/src/app/layout.js @@ -1,7 +1,9 @@ import { Inter, Open_Sans, Open_Sans_Condensed } from "next/font/google"; +import { Suspense } from "react"; import "./globals.css"; import Header from "@/components/Header"; import Footer from "@/components/Footer"; +import { MaintenanceBanner } from "@/components/FeatureManagement/MaintenanceBanner"; const inter = Inter({ subsets: ["latin"] }); @@ -16,7 +18,7 @@ export const viewport = { width: "device-width", initialScale: 1, maximumScale: 5, - themeColor: "#21b702", + themeColor: "#21b702", }; export const metadata = { @@ -35,7 +37,9 @@ export const metadata = { "Charlas", "Hackathon", ], - authors: [{ name: "Comunidad Python Chile", url: "https://pyday.vercel.app/" }], + authors: [ + { name: "Comunidad Python Chile", url: "https://pyday.vercel.app/" }, + ], creator: "Comunidad Python Chile", publisher: "Comunidad Python Chile", robots: { @@ -105,7 +109,7 @@ export const metadata = { alt: "PyDay Chile 2025 - Un día de Python en tu ciudad", }, // { - // url: "https://pyday.vercel.app/images/logo_bg.png", + // url: "https://pyday.vercel.app/images/logo_bg.png", // width: 500, // height: 500, // alt: "Logo PyDay Chile", @@ -141,11 +145,18 @@ export const metadata = { export default function RootLayout({ children }) { return ( - -
-
-
{children}
-
+ + Cargando...
}> +
+
+
+ + {children} +
+