mirror of
https://github.com/Ichitux/lambada-fiesta-live.git
synced 2026-09-27 20:02:21 +00:00
541 lines
15 KiB
TypeScript
541 lines
15 KiB
TypeScript
/**
|
||
* ===========================================
|
||
* DATOS DEL EVENTO — ZoukLambadaBCN
|
||
* ===========================================
|
||
*
|
||
* Este archivo centraliza datos "no traducibles" del evento:
|
||
* fechas, URLs, embeds, imágenes y arrays estructurados.
|
||
*
|
||
* El texto visible (títulos, descripciones, labels) vive en:
|
||
* `src/locales/*.json` y se consume vía i18n.
|
||
*
|
||
* NOTA: Las imágenes deben colocarse en src/assets/ e importarse.
|
||
*/
|
||
import arielyasmin from "@/assets/staff/arielyasmin.jpg";
|
||
import hilaleo from "@/assets/staff/hilaleo.jpg";
|
||
import matheuslydia from "@/assets/staff/matheuslydia.jpg";
|
||
import omeradva from "@/assets/staff/omeradva.jpg";
|
||
import pablolena from "@/assets/staff/pablolena.jpg";
|
||
import djbiel from "@/assets/staff/djbiel.jpg";
|
||
import djwinx from "@/assets/staff/djwinx.jpg";
|
||
import djklebynho from "@/assets/staff/djklebynho.jpg";
|
||
import letialex from "@/assets/staff/letialex.jpg";
|
||
import djcathie from "@/assets/staff/djcathie.jpg";
|
||
import milu from "@/assets/staff/milu.jpg";
|
||
import safira from "@/assets/staff/safira.jpg";
|
||
import brazromi from "@/assets/staff/braz_romi.jpg";
|
||
import emanoel from "@/assets/staff/emanoel.jpg";
|
||
import didipatri from "@/assets/staff/didipatri.jpg";
|
||
import djhique from "@/assets/staff/djhique.jpg";
|
||
import djgg from "@/assets/staff/djgg.jpg";
|
||
import djgalzo from "@/assets/staff/djgalzo.jpg";
|
||
import aiysha from "@/assets/staff/aiysha.jpg";
|
||
import djgui from "@/assets/staff/djgui.jpg";
|
||
import rdelano from "@/assets/staff/rdelano.jpg";
|
||
import zuluvane from "@/assets/staff/zuluvanesa.jpg";
|
||
import patriciac from "@/assets/staff/patriciac.jpg";
|
||
import wellington from "@/assets/staff/wellington.jpg";
|
||
import xavilau from "@/assets/staff/xavilau.jpg";
|
||
import pamela from "@/assets/staff/pamela.jpg";
|
||
import papagaio from "@/assets/staff/papagaio.jpg";
|
||
import jade from "@/assets/staff/jade.jpg";
|
||
import juninho from "@/assets/staff/juninho.jpg";
|
||
import rafael from "@/assets/staff/rafael.jpg";
|
||
import rodrigo from "@/assets/staff/rodrigo.jpg";
|
||
import jessica from "@/assets/staff/jessica.jpg";
|
||
import cibele from "@/assets/staff/cibele.jpg";
|
||
import giovanni from "@/assets/staff/giovanni.jpg";
|
||
|
||
import gal1 from "@/assets/gallery/gal1.jpg";
|
||
import gal2 from "@/assets/gallery/gal2.jpg";
|
||
import gal3 from "@/assets/gallery/gal3.jpg";
|
||
import gal4 from "@/assets/gallery/gal4.jpg";
|
||
import gal5 from "@/assets/gallery/gal5.jpg";
|
||
import gal6 from "@/assets/gallery/gal6.jpg";
|
||
|
||
|
||
|
||
// ---- INFORMACIÓN GENERAL DEL EVENTO ----
|
||
export const EVENT_INFO = {
|
||
/** Fecha del evento — formato ISO para el countdown */
|
||
date: "2026-09-04T12:00:00",
|
||
venue: "Hotel Don Angel",
|
||
venueAddress: "Carrer del Pla de la Torre, 14, 08398 Santa Susanna, Barcelona, Spain",
|
||
/** Google Maps embed URL — reemplazar con la URL real */
|
||
mapEmbedUrl: "https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d2982.0132199519758!2d2.718142676474322!3d41.63384568067116!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x12bb3e942c5ac469%3A0x9153afdd8d15d0c1!2sHotel%20Don%20Angel!5e0!3m2!1ses!2sus!4v1777971058774!5m2!1ses!2sus",
|
||
};
|
||
|
||
|
||
|
||
|
||
// ---- WEBHOOK N8N ----
|
||
/**
|
||
* CONFIGURACIÓN DEL WEBHOOK:
|
||
*
|
||
* 1. En n8n, crea un nuevo workflow con un nodo "Webhook"
|
||
* 2. Configura el webhook como POST
|
||
* 3. Copia la URL generada y pégala aquí abajo
|
||
* 4. En n8n, conecta el webhook a tu destino (Google Sheets, Airtable, etc.)
|
||
*
|
||
* Ejemplo de payload que se envía:
|
||
* {
|
||
* "name": "Juan García",
|
||
* "email": "juan@example.com",
|
||
* "seats": "2",
|
||
* "country": "España",
|
||
* "comment": "Primera vez en el festival"
|
||
* }
|
||
*/
|
||
export const WEBHOOK_URL = "https://n8n.hacecalor.net/webhook/event-reservation";
|
||
/**
|
||
* CLAVE DE AUTENTICACIÓN:
|
||
*
|
||
* Si activas "Header Auth" en n8n, asegúrate de que el nombre del header
|
||
* sea "X-Webhook-Secret" y que este valor coincida con el que pongas allí.
|
||
*/
|
||
export const WEBHOOK_SECRET = "oWkS4cAgj0LVgIbnO3cGKTePPLnRAIAa5NTvXahx5z0=";
|
||
|
||
export const ABOUT_ORG = {
|
||
socials: {
|
||
instagram: "https://instagram.com/zouklambadabcn",
|
||
facebook: "https://facebook.com/zouklambadabcn",
|
||
youtube: "https://youtube.com/@zouklambadabcn",
|
||
},
|
||
};
|
||
|
||
// ---- STAFF DEL EVENTO ----
|
||
/**
|
||
* Para añadir un nuevo miembro del staff,
|
||
* simplemente agrega un nuevo objeto al array.
|
||
*/
|
||
export const STAFF = [
|
||
{
|
||
id: "1",
|
||
name: "Pablo & Lena",
|
||
role: "Teacher" as const,
|
||
/** Reemplazar con ruta a foto real */
|
||
image: pablolena,
|
||
},
|
||
{
|
||
id: "2",
|
||
name: "Ariel & Yasmin",
|
||
role: "Teacher" as const,
|
||
image: arielyasmin,
|
||
},
|
||
{
|
||
id: "3",
|
||
name: "Hila & Leo",
|
||
role: "Teacher" as const,
|
||
image: hilaleo,
|
||
},
|
||
{
|
||
id: "4",
|
||
name: "Matheus & Lydia",
|
||
role: "Teacher" as const,
|
||
image: matheuslydia,
|
||
},
|
||
{
|
||
id: "5",
|
||
name: "Omer & Adva",
|
||
role: "Teacher" as const,
|
||
image: omeradva,
|
||
},
|
||
{
|
||
id: "6",
|
||
name: "DJ Biel",
|
||
role: "DJ" as const,
|
||
image: djbiel,
|
||
},
|
||
{
|
||
id: "7",
|
||
name: "DJ WinX",
|
||
role: "DJ" as const,
|
||
image: djwinx,
|
||
},
|
||
{
|
||
id: "8",
|
||
name: "DJ Rafael",
|
||
role: "DJ" as const,
|
||
image: rafael,
|
||
},
|
||
{
|
||
id: "9",
|
||
name: "Leticia & Alex",
|
||
role: "Teacher" as const,
|
||
image: letialex,
|
||
},
|
||
{
|
||
id: "10",
|
||
name: "Jade Rodrigues",
|
||
role: "Teacher" as const,
|
||
image: jade,
|
||
},
|
||
{
|
||
id: "11",
|
||
name: "Milu",
|
||
role: "Teacher" as const,
|
||
image: milu,
|
||
},
|
||
{
|
||
id: "12",
|
||
name: "Safira",
|
||
role: "Teacher" as const,
|
||
image: safira,
|
||
},
|
||
{
|
||
id: "13",
|
||
name: "Braz & Romina",
|
||
role: "Teacher" as const,
|
||
image: brazromi,
|
||
},
|
||
{
|
||
id: "14",
|
||
name: "Emanoel",
|
||
role: "Teacher" as const,
|
||
image: emanoel,
|
||
},
|
||
{
|
||
id: "15",
|
||
name: "Didi & Patricia",
|
||
role: "Teacher" as const,
|
||
image: didipatri,
|
||
},
|
||
{ id: "16",
|
||
name: "DJ Hique",
|
||
role: "DJ" as const,
|
||
image: djhique,
|
||
},
|
||
{
|
||
id: "17",
|
||
name: "DJ GG",
|
||
role: "DJ" as const,
|
||
image: djgg,
|
||
},
|
||
{
|
||
id: "18",
|
||
name: "DJ Galzo",
|
||
role: "DJ" as const,
|
||
image: djgalzo,
|
||
},
|
||
{
|
||
id: "19",
|
||
name: "Aiysha",
|
||
role: "Specials" as const,
|
||
image: aiysha,
|
||
},
|
||
{
|
||
id: "20",
|
||
name: "DJ Gui",
|
||
role: "DJ" as const,
|
||
image: djgui,
|
||
},
|
||
{
|
||
id: "21",
|
||
name: "Rodrigo Delano",
|
||
role: "Teacher" as const,
|
||
image: rdelano,
|
||
},
|
||
{
|
||
id: "22",
|
||
name: "Zulu & Vanesa",
|
||
role: "Specials" as const,
|
||
image: zuluvane,
|
||
},
|
||
{
|
||
id: "23",
|
||
name: "Patricia Cruz",
|
||
role: "Specials" as const,
|
||
image: patriciac,
|
||
},
|
||
{
|
||
id: "24",
|
||
name: "Wellington",
|
||
role: "Specials" as const,
|
||
image: wellington,
|
||
},
|
||
{
|
||
id: "25",
|
||
name: "Xavi & Laura",
|
||
role: "Teacher" as const,
|
||
image: xavilau,
|
||
},
|
||
{
|
||
id: "26",
|
||
name: "Pamela",
|
||
role: "Specials" as const,
|
||
image: pamela,
|
||
},
|
||
{
|
||
id: "27",
|
||
name: "Papagaio",
|
||
role: "Specials" as const,
|
||
image: papagaio,
|
||
},
|
||
{
|
||
id: "28",
|
||
name: "Juninho",
|
||
role: "Specials" as const,
|
||
image: juninho,
|
||
},
|
||
{
|
||
id: "29",
|
||
name: "Rodrigo",
|
||
role: "Specials" as const,
|
||
image: rodrigo,
|
||
},
|
||
{
|
||
id: "30",
|
||
name: "Jéssica Serrano",
|
||
role: "Specials" as const,
|
||
image: jessica,
|
||
},
|
||
{
|
||
id: "31",
|
||
name: "Cibele",
|
||
role: "Specials" as const,
|
||
image: cibele,
|
||
},
|
||
{
|
||
id: "32",
|
||
name: "Giovanni",
|
||
role: "Specials" as const,
|
||
image: giovanni,
|
||
}
|
||
];
|
||
|
||
// ---- PROGRAMA DEL EVENTO ----
|
||
export const SCHEDULE = [
|
||
{
|
||
day: "Viernes 4 de Septiembre",
|
||
events: [
|
||
{ time: "16:00 – 17:00", title: "Check-in / Registro", type: "checkin" as const },
|
||
{ time: "17:00 – 18:00", title: "Followers & Style by Jade & Milu", type: "workshop" as const },
|
||
{ time: "18:00 – 19:00", title: "La Ciencia de los Giros / The Science of Spins by Rodrigo Delano", type: "workshop" as const },
|
||
{ time: "19:30 – 21:30", title: "Cena / Dinner", type: "break" as const },
|
||
{
|
||
time: "23:00 – 03:00",
|
||
title: "Social Dance + DJs",
|
||
type: "social" as const,
|
||
details: ["Teacher's Presentation", "Special guest: Aiysha Singer", "Competition: 2 Full Pass for MARAU FESTIVAL & social dance"],
|
||
},
|
||
],
|
||
},
|
||
{
|
||
day: "Sábado 5 de Septiembre",
|
||
events: [
|
||
{ time: "08:00 – 10:00", title: "Desayuno / Breakfast", type: "break" as const },
|
||
{ time: "11:00 – 12:00", title: "", type: "workshop" as const, parallel: [
|
||
{ time: "11:00 – 12:00", title: "Matheus & Lydia", type: "workshop" as const },
|
||
{ time: "11:00 – 12:00", title: "Leticia & Alex", type: "workshop" as const },
|
||
]},
|
||
{ time: "12:00 – 13:00", title: "[Workshop 4]", type: "workshop" as const, parallel: [
|
||
{ time: "12:00 – 13:00", title: "Emanoel & Safira", type: "workshop" as const },
|
||
{ time: "12:00 – 13:00", title: "Ariel & Yasmin", type: "workshop" as const },
|
||
]
|
||
},
|
||
{ time: "13:00 – 15:00", title: "Comida / Lunch", type: "break" as const },
|
||
{ time: "15:00 – 16:00", title: "[Workshop 5]", type: "workshop" as const, parallel: [
|
||
{ time: "15:00 – 16:00", title: "Xavi & Laura", type: "workshop" as const },
|
||
{ time: "15:00 – 16:00", title: "Omer & Adva", type: "workshop" as const },
|
||
]
|
||
},
|
||
{ time: "16:00 – 17:00", title: "[Workshop 6]", type: "workshop" as const, parallel: [
|
||
{ time: "16:00 – 17:00", title: "Leo & Hila", type: "workshop" as const },
|
||
{ time: "16:00 – 17:00", title: "Pablo & Lena", type: "workshop" as const },
|
||
]
|
||
},
|
||
{ time: "17:00 – 18:00", title: "[Workshop 7]", type: "workshop" as const, parallel: [
|
||
{ time: "17:00 – 18:00", title: "Braz & Romina", type: "workshop" as const },
|
||
{ time: "17:00 – 18:00", title: "Didi & Patricia", type: "workshop" as const },
|
||
]
|
||
},
|
||
{ time: "19:30 – 21:30", title: "Cena / Dinner", type: "break" as const },
|
||
{
|
||
time: "23:00 – 05:00",
|
||
title: "Social Dance + DJs",
|
||
type: "social" as const,
|
||
details: ["Showtime 1h & social dance"],
|
||
},
|
||
|
||
],
|
||
},
|
||
{
|
||
day: "Domingo 6 de Septiembre",
|
||
events: [
|
||
{ time: "08:00 – 10:00", title: "Desayuno / Breakfast", type: "break" as const },
|
||
{ time: "11:30 – 12:30", title: "International Barcelona Flash Mob 2026. Choreo by: Lautaro & Ari. Teacher: Romina Hidalgo", type: "workshop" as const },
|
||
{ time: "12:00 – 14:00", title: "Pool Party", type: "social" as const },
|
||
{ time: "13:00 – 15:00", title: "Comida / Lunch", type: "break" as const },
|
||
{ time: "16:00 – 20:00", title: "Pool Party", type: "social" as const },
|
||
{ time: "19:30 – 21:30", title: "Cena / Dinner", type: "break" as const },
|
||
{
|
||
time: "23:00 – 05:00",
|
||
title: "Social Dance + DJs",
|
||
type: "social" as const,
|
||
details: ["Competition, 2 Full Pass for CARNALAMBA FESTIVAL by Hila Singer & social dance"],
|
||
},
|
||
],
|
||
},
|
||
];
|
||
|
||
// ---- HABITACIONES DE HOTEL ----
|
||
/**
|
||
* Para añadir habitaciones, agrega objetos al array.
|
||
* El botón "Reservar" abre el link en nueva pestaña.
|
||
*/
|
||
export const HOTEL_ROOMS = [
|
||
{
|
||
id: "1",
|
||
name: "[Habitación Individual]",
|
||
price: "[XX€/noche]",
|
||
description: "[Descripción breve de la habitación]",
|
||
/** Reemplazar con URL de imagen real */
|
||
image: "",
|
||
link: "https://hotel-example.com/booking",
|
||
},
|
||
{
|
||
id: "2",
|
||
name: "[Habitación Doble]",
|
||
price: "[XX€/noche]",
|
||
description: "[Descripción breve de la habitación]",
|
||
image: "",
|
||
link: "https://hotel-example.com/booking",
|
||
},
|
||
{
|
||
id: "3",
|
||
name: "[Suite]",
|
||
price: "[XX€/noche]",
|
||
description: "[Descripción breve de la habitación]",
|
||
image: "",
|
||
link: "https://hotel-example.com/booking",
|
||
},
|
||
];
|
||
|
||
// ---- INFORMACIÓN PRÁCTICA ----
|
||
export const PRACTICAL_INFO = {
|
||
airports: [
|
||
{
|
||
nameKey: "info.airportBCNName",
|
||
distanceKey: "info.airportBCNDistance",
|
||
},
|
||
],
|
||
howToGet: [
|
||
{
|
||
method: "Bus",
|
||
detailsKey: "info.bus603Details",
|
||
link: "https://share.google/gZWgcLkbz4JbNLJ0O",
|
||
linkLabelKey: "info.viewInfo",
|
||
},
|
||
],
|
||
};
|
||
|
||
// ---- INFORMACIÓN EXTRA FESTIVAL ----
|
||
export const RECEPTION_INFO = {
|
||
openDay: "Viernes",
|
||
openTime: "15:00h",
|
||
location: "Zouklambada Beach",
|
||
};
|
||
|
||
export const EXTRA_NOTES = {
|
||
noFullPassEntryFee: 25,
|
||
noFullPassEntryFeeCurrency: "€",
|
||
looseClassReserveLocation: "Recepción",
|
||
looseClassPrice: 25,
|
||
looseClassCurrency: "€",
|
||
poolPartyIncludedWith: "Alojamiento en Hotel Don Ángel",
|
||
showsNightTime: "01:00h",
|
||
fullBoardPeriod: "De la cena del viernes a la comida del lunes",
|
||
};
|
||
|
||
// ---- GALERÍA ----
|
||
/**
|
||
* Añade URLs o importaciones de imágenes.
|
||
* Para importar: import img from "@/assets/gallery/photo1.jpg"
|
||
*/
|
||
export const GALLERY_IMAGES = [
|
||
{ src: gal1, alt: "[Descripción foto 1]" },
|
||
{ src: gal2, alt: "[Descripción foto 2]" },
|
||
{ src: gal3, alt: "[Descripción foto 3]" },
|
||
{ src: gal4, alt: "[Descripción foto 4]" },
|
||
{ src: gal5, alt: "[Descripción foto 5]" },
|
||
{ src: gal6, alt: "[Descripción foto 6]" },
|
||
];
|
||
|
||
// ---- PAQUETES MIXTOS (Room + Pass) ----
|
||
export type RoomType = "individual" | "double" | "suite";
|
||
export type PassType = "full" | "party" | "whiteparty";
|
||
|
||
export const ROOM_TYPES: { id: RoomType }[] = [
|
||
{ id: "individual" },
|
||
{ id: "double" },
|
||
{ id: "suite" },
|
||
];
|
||
|
||
// ---- PRECIOS DINÁMICOS FULL PASS ----
|
||
/**
|
||
* Calcula el precio del Full Pass según la fecha actual.
|
||
* - Hasta 1 de junio: 170€
|
||
* - 1 de junio - 1 de septiembre: 190€
|
||
* - Después del inicio del evento: 200€ (último precio)
|
||
*/
|
||
export function getFullPassPrice(): { price: number; isLastPrice: boolean; validUntilKey: string | null } {
|
||
const now = new Date();
|
||
const julyFirst = new Date("2026-07-15T00:00:00");
|
||
const septemberFirst = new Date("2026-09-01T00:00:00");
|
||
const eventStart = new Date(EVENT_INFO.date);
|
||
|
||
if (now < julyFirst) {
|
||
return { price: 170, isLastPrice: false, validUntilKey: "validUntilJuly" };
|
||
} else if (now < septemberFirst) {
|
||
return { price: 190, isLastPrice: false, validUntilKey: "validUntilSeptember" };
|
||
} else {
|
||
// After event starts
|
||
return { price: 200, isLastPrice: true, validUntilKey: null };
|
||
}
|
||
}
|
||
|
||
export const MIXED_BOOKING_PACKAGES = [
|
||
{ id: "full" as PassType, label: "full", roomPrices: { individual: 100, double: 150, suite: 213 } },
|
||
{ id: "party" as PassType, label: "party", roomPrices: { individual: 100, double: 150, suite: 213 } },
|
||
{ id: "whiteparty" as PassType, label: "whiteparty", roomPrices: { individual: 0, double: 0, suite: 0 } },
|
||
];
|
||
|
||
// ---- SECCIONES VISIBLES ----
|
||
export const SECTIONS = {
|
||
about: true,
|
||
org: true,
|
||
staff: true,
|
||
profesores: true,
|
||
schedule: false,
|
||
booking: false,
|
||
mixed_booking: false,
|
||
hotel: false,
|
||
practical: true,
|
||
gallery: true,
|
||
};
|
||
|
||
// ---- NAVEGACIÓN ----
|
||
const HREF_TO_SECTION: Record<string, keyof typeof SECTIONS> = {
|
||
"#about": "about",
|
||
"#staff": "staff",
|
||
"#schedule": "schedule",
|
||
"#booking": "booking",
|
||
"#mixed-booking": "mixed_booking",
|
||
"#hotel": "hotel",
|
||
"#info": "practical",
|
||
"#gallery": "gallery",
|
||
};
|
||
|
||
export const NAV_LINKS = (
|
||
[
|
||
{ href: "#about" },
|
||
{ href: "#staff" },
|
||
{ href: "#schedule" },
|
||
{ href: "#booking" },
|
||
{ href: "#mixed-booking" },
|
||
{ href: "#hotel" },
|
||
{ href: "#info" },
|
||
{ href: "#gallery" },
|
||
] as const
|
||
).filter((link) => SECTIONS[HREF_TO_SECTION[link.href]]);
|