Newer staff members, white party fixings and staff tags

This commit is contained in:
Antoni Nuñez Romeu
2026-07-31 12:21:07 +02:00
parent e54efb59ee
commit 7d71f21f25
9 changed files with 58 additions and 40 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 296 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 328 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 311 KiB

+1 -1
View File
@@ -254,7 +254,7 @@ const MixedBookingSection = () => {
<div className="px-6 pt-8 pb-4 text-center relative min-h-[160px] flex flex-col justify-center"> <div className="px-6 pt-8 pb-4 text-center relative min-h-[160px] flex flex-col justify-center">
<div className="absolute inset-0 bg-white/70 backdrop-blur-sm" /> <div className="absolute inset-0 bg-white/70 backdrop-blur-sm" />
<div className="relative z-10"> <div className="relative z-10">
<h3 className="font-display text-3xl md:text-4xl font-black text-slate-800 mb-2"> <h3 className="font-display text-3xl md:text-4xl font-normal text-slate-800 mb-2">
WHITE PARTY WHITE PARTY
</h3> </h3>
<p className="text-slate-700 text-sm font-medium"> <p className="text-slate-700 text-sm font-medium">
+23 -30
View File
@@ -4,21 +4,31 @@ import { STAFF } from "@/data/event-data";
import { Instagram, User, ChevronLeft, ChevronRight } from "lucide-react"; import { Instagram, User, ChevronLeft, ChevronRight } from "lucide-react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
/** Colores de badge por rol */ /** Colores de badge por rol (variantes naranjas) */
const roleBadgeClass: Record<string, string> = { const roleBadgeClass: Record<string, string> = {
Teacher: "bg-primary text-primary-foreground", Teacher: "bg-[hsla(20,90%,55%,1)] text-white",
DJ: "bg-secondary text-secondary-foreground", DJ: "bg-[hsla(45,90%,50%,1)] text-white",
Specials: "bg-[hsla(15,85%,55%,1)] text-white",
Organizador: "bg-accent text-accent-foreground", Organizador: "bg-accent text-accent-foreground",
}; };
/** Variantes naranjas para el filtro activo por tag */
const filterActiveClass: Record<string, string> = {
all: "bg-[hsla(37,93%,53%,1)] text-primary-foreground border-[hsla(37,93%,53%,1)] shadow-md",
teachers: "bg-[hsla(20,90%,55%,1)] text-primary-foreground border-[hsla(20,90%,55%,1)] shadow-md",
djs: "bg-[hsla(45,90%,50%,1)] text-primary-foreground border-[hsla(45,90%,50%,1)] shadow-md",
specials: "bg-[hsla(15,85%,55%,1)] text-primary-foreground border-[hsla(15,85%,55%,1)] shadow-md",
};
const StaffSection = () => { const StaffSection = () => {
const { t } = useTranslation(); const { t } = useTranslation();
const [filter, setFilter] = useState<"all" | "teachers" | "djs">("all"); const [filter, setFilter] = useState<"all" | "teachers" | "djs" | "specials">("all");
const filteredStaff = STAFF.filter((member) => { const filteredStaff = STAFF.filter((member) => {
if (filter === "all") return true; if (filter === "all") return true;
if (filter === "teachers") return member.role === "Teacher"; if (filter === "teachers") return member.role === "Teacher";
if (filter === "djs") return member.role === "DJ"; if (filter === "djs") return member.role === "DJ";
if (filter === "specials") return member.role === "Specials";
return true; return true;
}); });
// simple ref + helpers for horizontal scroll // simple ref + helpers for horizontal scroll
@@ -90,6 +100,7 @@ const StaffSection = () => {
{ id: "all", labelKey: "staff.filters.all" }, { id: "all", labelKey: "staff.filters.all" },
{ id: "teachers", labelKey: "staff.filters.teachers" }, { id: "teachers", labelKey: "staff.filters.teachers" },
{ id: "djs", labelKey: "staff.filters.djs" }, { id: "djs", labelKey: "staff.filters.djs" },
{ id: "specials", labelKey: "staff.filters.specials" },
] as const ] as const
).map(({ id, labelKey }) => ( ).map(({ id, labelKey }) => (
<button <button
@@ -97,7 +108,7 @@ const StaffSection = () => {
onClick={() => setFilter(id)} onClick={() => setFilter(id)}
className={`px-6 py-2 rounded-full text-sm font-semibold transition-all duration-300 border ${ className={`px-6 py-2 rounded-full text-sm font-semibold transition-all duration-300 border ${
filter === id filter === id
? "bg-primary text-primary-foreground border-primary shadow-md" ? filterActiveClass[id]
: "bg-card text-foreground border-border hover:border-primary/50" : "bg-card text-foreground border-border hover:border-primary/50"
}`} }`}
> >
@@ -142,9 +153,13 @@ const StaffSection = () => {
</div> </div>
<div className="p-5"> <div className="p-5">
<h3 className="font-display text-xl md:text-2xl lg:text-3xl pt-3 pb-5 leading-[1.6] font-bold text-foreground mb-1">
{member.name}
</h3>
{/* Badge de rol */} {/* Badge de rol */}
<span <span
className={`inline-block text-xs font-semibold px-3 py-1 rounded-full mb-3 ${ className={`inline-block text-xs font-semibold px-3 py-1 rounded-full ${
roleBadgeClass[member.role] || "bg-muted text-muted-foreground" roleBadgeClass[member.role] || "bg-muted text-muted-foreground"
}`} }`}
> >
@@ -154,34 +169,12 @@ const StaffSection = () => {
? "teacher" ? "teacher"
: member.role === "DJ" : member.role === "DJ"
? "dj" ? "dj"
: member.role === "Organizador" : member.role === "Specials"
? "organizer" ? "specials"
: undefined; : undefined;
return roleLabelKey ? t(`staff.${roleLabelKey}`) : member.role; return roleLabelKey ? t(`staff.${roleLabelKey}`) : member.role;
})()} })()}
</span> </span>
<h3 className="font-display text-xl md:text-2xl lg:text-3xl pt-3 pb-5 leading-[1.6] font-bold text-foreground mb-1">
{member.name}
</h3>
<p className="text-sm text-muted-foreground mb-4">
{member.description?.trim().startsWith("[") && member.description?.trim().endsWith("]")
? t("staff.placeholder")
: member.description}
</p>
{/* Redes sociales */}
{member.socials?.instagram && (
<a
href={member.socials.instagram}
target="_blank"
rel="noopener noreferrer"
className="inline-flex items-center gap-1.5 text-sm text-primary hover:text-primary/80 transition-colors"
>
<Instagram className="w-4 h-4" />
{t("staff.socials.instagram")}
</a>
)}
</div> </div>
</motion.div> </motion.div>
))} ))}
+21
View File
@@ -27,6 +27,9 @@ import brazromi from "@/assets/staff/braz_romi.jpg";
import emanoel from "@/assets/staff/emanoel.jpg"; import emanoel from "@/assets/staff/emanoel.jpg";
import didipatri from "@/assets/staff/didipatri.jpg"; import didipatri from "@/assets/staff/didipatri.jpg";
import djhique from "@/assets/staff/djhique.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 gal1 from "@/assets/gallery/gal1.jpg"; import gal1 from "@/assets/gallery/gal1.jpg";
import gal2 from "@/assets/gallery/gal2.jpg"; import gal2 from "@/assets/gallery/gal2.jpg";
@@ -186,6 +189,24 @@ export const STAFF = [
role: "DJ" as const, role: "DJ" as const,
image: djhique, 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,
}
]; ];
// ---- PROGRAMA DEL EVENTO ---- // ---- PROGRAMA DEL EVENTO ----
+6 -4
View File
@@ -44,11 +44,13 @@
"teacher": "Teacher", "teacher": "Teacher",
"dj": "DJ", "dj": "DJ",
"organizer": "Organizer", "organizer": "Organizer",
"specials": "Special Guests",
"placeholder": "[Teacher biography]", "placeholder": "[Teacher biography]",
"filters": { "filters": {
"all": "All", "all": "All",
"teachers": "Teachers", "teachers": "Teachers",
"djs": "DJs" "djs": "DJs",
"specials": "Special Guests"
}, },
"socials": { "socials": {
"instagram": "Instagram" "instagram": "Instagram"
@@ -154,9 +156,9 @@
"fullFeatures": "All workshops|All social dances|Live shows|DJ sets", "fullFeatures": "All workshops|All social dances|Live shows|DJ sets",
"partyDescription": "Price for each party individually, even pool parties.", "partyDescription": "Price for each party individually, even pool parties.",
"partyFeatures": "Friday party|Saturday party|Sunday farewell party|DJ sets", "partyFeatures": "Friday party|Saturday party|Sunday farewell party|DJ sets",
"whitepartyDescription": "Closing party in Sala Vivaldi, with an elegant and exclusive atmosphere.", "whitepartyDescription": "Closing party in Sala Vivaldi, come to end the beach festival with style.",
"whitepartyFeatures": "Dress code: White|Amazing DJ", "whitepartyFeatures": "Dress code: White|Best music",
"whitepartyNotIncluded": "Not included in Full Pass - Separate payment required", "whitepartyNotIncluded": "Not included in Full Pass - Paid separately",
"whitepartyTime": "21h to 1h", "whitepartyTime": "21h to 1h",
"whitepartyDate": "Monday 7 September", "whitepartyDate": "Monday 7 September",
"goToReservations": "Go to reservations", "goToReservations": "Go to reservations",
+6 -4
View File
@@ -44,11 +44,13 @@
"teacher": "Profesor", "teacher": "Profesor",
"dj": "DJ", "dj": "DJ",
"organizer": "Organizador", "organizer": "Organizador",
"specials": "Artistas Invitados",
"placeholder": "[Breve biografía del profesor]", "placeholder": "[Breve biografía del profesor]",
"filters": { "filters": {
"all": "Todos", "all": "Todos",
"teachers": "Profesores", "teachers": "Profesores",
"djs": "DJs" "djs": "DJs",
"specials": "Artistas Invitados"
}, },
"socials": { "socials": {
"instagram": "Instagram" "instagram": "Instagram"
@@ -154,9 +156,9 @@
"fullFeatures": "Todos los workshops|Todas las social dances|Shows en vivo|DJ sets", "fullFeatures": "Todos los workshops|Todas las social dances|Shows en vivo|DJ sets",
"partyDescription": "Precio individual por cada fiesta, incluso las pool parties.", "partyDescription": "Precio individual por cada fiesta, incluso las pool parties.",
"partyFeatures": "Fiesta del viernes|Fiesta del sábado|Fiesta despedida del domingo|DJ sets", "partyFeatures": "Fiesta del viernes|Fiesta del sábado|Fiesta despedida del domingo|DJ sets",
"whitepartyDescription": "Fiesta de clausura en la Sala Vivaldi, con un ambiente elegante y exclusivo.", "whitepartyDescription": "Fiesta de clausura en la Sala Vivaldi, ven a terminar el beach festival con estilo.",
"whitepartyFeatures": "Código de vestimenta: Blanco|DJ Inigualable", "whitepartyFeatures": "Código de vestimenta: Blanco|La mejor música",
"whitepartyNotIncluded": "No incluido en Full Pass - Pago separado requerido", "whitepartyNotIncluded": "No incluido en Full Pass - Se paga a parte",
"whitepartyTime": "21h a 1h", "whitepartyTime": "21h a 1h",
"whitepartyDate": "Lunes 7 de Septiembre", "whitepartyDate": "Lunes 7 de Septiembre",
"goToReservations": "Ir a reservas", "goToReservations": "Ir a reservas",
+1 -1
View File
@@ -6,7 +6,7 @@ import { componentTagger } from "lovable-tagger";
// https://vitejs.dev/config/ // https://vitejs.dev/config/
export default defineConfig(({ mode }) => ({ export default defineConfig(({ mode }) => ({
server: { server: {
origin: "http://0.0.0.0:8080", host: "::",
port: 8080, port: 8080,
hmr: { hmr: {
overlay: false, overlay: false,