adjust content structure speaker page

This commit is contained in:
Alisa Cantillo-Olsson 2026-04-28 16:37:12 +02:00
parent 92a72166da
commit de239b4468
7 changed files with 63 additions and 64 deletions

View File

@ -93,17 +93,17 @@ export const Filters5 = ({
{resetLabel} {resetLabel}
</button> </button>
</div> </div>
<div className="flex h-12 items-center gap-3 rounded-2xl border border-electric-violet px-3"> <div className="flex h-12 items-center gap-3 rounded-2xl border border-tech-navy px-3">
<BiSearch className="size-6 shrink-0 text-electric-violet" /> <BiSearch className="size-6 shrink-0 text-tech-navy" />
<input <input
className="flex-1 bg-transparent text-base text-electric-violet outline-none placeholder:text-electric-violet/50" className="flex-1 bg-transparent text-base text-tech-navy outline-none placeholder:text-tech-navy/40"
placeholder="Suchen..." placeholder="Suchen..."
value={searchQuery} value={searchQuery}
onChange={(e) => onSearchChange(e.target.value)} onChange={(e) => onSearchChange(e.target.value)}
/> />
{searchQuery && ( {searchQuery && (
<button onClick={() => onSearchChange("")}> <button onClick={() => onSearchChange("")}>
<IoCloseOutline className="size-5 text-electric-violet" /> <IoCloseOutline className="size-5 text-tech-navy" />
</button> </button>
)} )}
</div> </div>

View File

@ -15,7 +15,7 @@ type ImageProps = {
type Links = { type Links = {
title: string; title: string;
url: string; url?: string;
}; };
type SocialMediaLinks = { type SocialMediaLinks = {
@ -134,7 +134,7 @@ export const Footer3Defaults: Props = {
links: [ links: [
{ title: "Programm", url: "/programm" }, { title: "Programm", url: "/programm" },
{ title: "Speaker", url: "/speaker" }, { title: "Speaker", url: "/speaker" },
{ title: "Location", url: "/location" }, { title: "Location", url: "#" },
{ title: "Tickets", url: "#tickets" }, { title: "Tickets", url: "#tickets" },
{ title: "FAQ", url: "#faq" }, { title: "FAQ", url: "#faq" },
], ],

View File

@ -15,7 +15,7 @@ type ImageProps = {
}; };
type NavLink = { type NavLink = {
url: string; url?: string;
title: string; title: string;
subMenuLinks?: NavLink[]; subMenuLinks?: NavLink[];
}; };
@ -209,7 +209,7 @@ export const Navbar3Defaults: Props = {
navLinks: [ navLinks: [
{ title: "Programm", url: "/programm" }, { title: "Programm", url: "/programm" },
{ title: "Speaker", url: "/speaker" }, { title: "Speaker", url: "/speaker" },
{ title: "Location", url: "/location" }, { title: "Location", url: "#" },
], ],
buttons: [ buttons: [
{ {

View File

@ -46,48 +46,52 @@ type Props = {
export type Team4Props = React.ComponentPropsWithoutRef<"section"> & Partial<Props>; export type Team4Props = React.ComponentPropsWithoutRef<"section"> & Partial<Props>;
const talkBadgeClass = (type: Talk["type"]) => { const talkBadgeClass = (type: Talk["type"]) => {
if (type === "Workshop") return "bg-acid-lime text-tech-navy"; if (type === "Talk") return "bg-neutral-dark text-cloud-white";
if (type === "Networking") return "bg-acid-lime text-tech-navy";
return "bg-electric-violet text-cloud-white"; return "bg-electric-violet text-cloud-white";
}; };
const MemberCard = ({ member }: { member: TeamMember }) => ( const MemberCard = ({ member }: { member: TeamMember }) => (
<div className="flex flex-col font-barlow"> <div className="flex flex-col font-barlow">
<Link to={`/speaker/${member.slug}`} className="relative mb-5 aspect-square w-full overflow-hidden block"> <Link to={`/speaker/${member.slug}`} className="relative mb-6 aspect-square w-full overflow-hidden block">
<img <img
src={member.image.src} src={member.image.src}
alt={member.image.alt} alt={member.image.alt}
className="absolute inset-0 size-full object-cover hover:scale-105 transition-transform duration-300" className="absolute inset-0 size-full object-cover hover:scale-105 transition-transform duration-300"
/> />
</Link> </Link>
<div className="flex flex-col gap-1 mb-4">
<div className="flex items-center justify-between gap-2">
<Link to={`/speaker/${member.slug}`} className="hover:underline"> <Link to={`/speaker/${member.slug}`} className="hover:underline">
<h5 className="text-md font-bold md:text-lg">{member.name}</h5> <h5 className="text-xl font-semibold text-tech-navy leading-snug">{member.name}</h5>
</Link> </Link>
<p className="text-sm text-gray-600">{member.role}</p> {member.socialLinks.length > 0 && (
<a <div className="flex gap-2 shrink-0">
href={member.companyUrl ?? "#"} {member.socialLinks.map((link, i) => (
className="mb-3 text-sm underline underline-offset-2 text-tech-navy" <a key={i} href={link.href}>{link.icon}</a>
> ))}
</div>
)}
</div>
<p className="text-lg text-tech-navy">{member.role}</p>
{member.companyUrl ? (
<a href={member.companyUrl} className="text-lg underline underline-offset-2 text-tech-navy">
{member.company} {member.company}
</a> </a>
<p className="mb-4 text-sm leading-relaxed text-gray-700">{member.description}</p> ) : (
<p className="text-lg text-tech-navy">{member.company}</p>
)}
</div>
<p className="mb-4 text-base leading-relaxed text-tech-navy">{member.description}</p>
<div className="mb-4 flex flex-wrap gap-2"> <div className="mb-4 flex flex-wrap gap-2">
{member.talks.map((talk, i) => ( {member.talks.map((talk, i) => (
<span <span
key={i} key={i}
className={`rounded-full px-3 py-1 text-xs font-semibold ${talkBadgeClass(talk.type)}`} className={`rounded-lg px-2 py-1 text-sm font-semibold whitespace-nowrap ${talkBadgeClass(talk.type)}`}
> >
{talk.title} {talk.title}
</span> </span>
))} ))}
</div> </div>
<div className="mt-auto flex gap-3">
{member.socialLinks.map((link, i) => (
<a key={i} href={link.href}>
{link.icon}
</a>
))}
</div>
</div> </div>
); );

View File

@ -4,7 +4,7 @@ import { Cta30 } from "../components/Cta30";
import { Footer3 } from "../components/Footer"; import { Footer3 } from "../components/Footer";
import { Team4Defaults } from "../components/Team4"; import { Team4Defaults } from "../components/Team4";
import { ALL_EVENTS } from "../data/events"; import { ALL_EVENTS } from "../data/events";
import { BiCalendarAlt, BiMap, BiUser } from "react-icons/bi"; import { BiCalendarAlt, BiUser } from "react-icons/bi";
import { RxCube } from "react-icons/rx"; import { RxCube } from "react-icons/rx";
import webflowLogo from "../assets/webflow.png"; import webflowLogo from "../assets/webflow.png";
import relumeLogo from "../assets/relume.png"; import relumeLogo from "../assets/relume.png";
@ -70,11 +70,7 @@ const ProgrammDetail = () => {
<BiCalendarAlt className="size-5 shrink-0 text-acid-lime" /> <BiCalendarAlt className="size-5 shrink-0 text-acid-lime" />
<span className="text-sm">{dateLabel}, {event.time}</span> <span className="text-sm">{dateLabel}, {event.time}</span>
</div> </div>
<div className="flex items-center gap-3 text-cloud-white/80"> <div className="flex items-center gap-3 text-cloud-white/80">
<BiMap className="size-5 shrink-0 text-acid-lime" />
<span className="text-sm">Location</span>
</div>
<div className="flex items-center gap-3 text-cloud-white/80">
<BiUser className="size-5 shrink-0 text-acid-lime" /> <BiUser className="size-5 shrink-0 text-acid-lime" />
<span className="text-sm">{event.speaker}</span> <span className="text-sm">{event.speaker}</span>
</div> </div>

View File

@ -49,8 +49,8 @@ const Speaker = () => {
heading="Unsere Speaker" heading="Unsere Speaker"
description="Erfahre von den klügsten Köpfen der Branche, wie sie komplexe Design-Herausforderungen meistern. Von Schweizer Präzision im Interface bis hin zu globalen Strategien führender Tech-Giganten unsere Speaker bringen handfeste Insights statt nur Buzzwords." description="Erfahre von den klügsten Köpfen der Branche, wie sie komplexe Design-Herausforderungen meistern. Von Schweizer Präzision im Interface bis hin zu globalen Strategien führender Tech-Giganten unsere Speaker bringen handfeste Insights statt nur Buzzwords."
buttons={[ buttons={[
{ title: "Zu den Speakern", variant: "primary" }, { title: "Zu den Speakern", variant: "primary", className: "bg-acid-lime text-neutral-dark border-acid-lime hover:bg-acid-lime/90 hover:border-acid-lime/90 rounded-2xl" },
{ title: "Zum Programm", variant: "secondary" }, { title: "Zum Programm", variant: "secondary", className: "bg-transparent border-acid-lime text-acid-lime hover:bg-acid-lime/10 hover:border-acid-lime hover:text-acid-lime rounded-2xl" },
]} ]}
/> />
<Filters5 <Filters5

View File

@ -2,26 +2,29 @@ import { useParams, Navigate } from "react-router-dom";
import { Navbar3 } from "../components/Navbar"; import { Navbar3 } from "../components/Navbar";
import { Team4, Team4Defaults } from "../components/Team4"; import { Team4, Team4Defaults } from "../components/Team4";
import { Footer3 } from "../components/Footer"; import { Footer3 } from "../components/Footer";
import { BiLogoLinkedinSquare, BiGlobe } from "react-icons/bi"; import webflowLogo from "../assets/webflow.png";
import { FaXTwitter } from "react-icons/fa6"; import relumeLogo from "../assets/relume.png";
const ALL_SPEAKERS = Team4Defaults.teamMembers; const ALL_SPEAKERS = Team4Defaults.teamMembers;
const SPONSORS = [
{ src: webflowLogo, alt: "Webflow" },
{ src: relumeLogo, alt: "Relume" },
];
const SponsorsSection = () => ( const SponsorsSection = () => (
<section className="bg-tech-navy px-[5%] py-16 md:py-24 font-barlow"> <section className="bg-tech-navy px-[5%] py-16 md:py-24 font-barlow">
<div className="container"> <div className="container">
<h2 className="mb-12 text-center text-4xl font-bold text-cloud-white md:text-5xl"> <h2 className="mb-12 text-center text-4xl font-bold text-cloud-white md:text-5xl">
Unsere Sponsoren & Partner Unsere Sponsoren & Partner
</h2> </h2>
<div className="grid grid-cols-3 gap-6 md:grid-cols-5"> <div className="flex flex-wrap items-center justify-center gap-8">
{Array(15).fill(null).map((_, i) => ( {SPONSORS.map((sponsor) => (
<div <div
key={i} key={sponsor.alt}
className="flex items-center justify-center rounded-lg border border-white/10 bg-white/5 px-4 py-6" className="flex items-center justify-center rounded-lg border border-white/10 bg-white/5 px-8 py-6"
> >
<span className="text-sm font-semibold text-white/50"> <img src={sponsor.src} alt={sponsor.alt} className="h-10 w-auto object-contain" />
{i % 2 === 0 ? "Webflow" : "Relume"}
</span>
</div> </div>
))} ))}
</div> </div>
@ -72,8 +75,9 @@ const SpeakerDetail = () => {
<p className="text-base leading-relaxed text-cloud-white/80 md:text-lg"> <p className="text-base leading-relaxed text-cloud-white/80 md:text-lg">
{speaker.fullBio ?? speaker.description} {speaker.fullBio ?? speaker.description}
</p> </p>
{speaker.socialLinks.filter((l) => l.href !== "#").length > 0 && (
<div className="flex gap-4"> <div className="flex gap-4">
{speaker.socialLinks.map((link, i) => ( {speaker.socialLinks.filter((l) => l.href !== "#").map((link, i) => (
<a <a
key={i} key={i}
href={link.href} href={link.href}
@ -82,13 +86,8 @@ const SpeakerDetail = () => {
{link.icon} {link.icon}
</a> </a>
))} ))}
<a href="#" className="text-cloud-white/60 hover:text-acid-lime transition-colors">
<FaXTwitter className="size-6 p-0.5" />
</a>
<a href="#" className="text-cloud-white/60 hover:text-acid-lime transition-colors">
<BiGlobe className="size-6" />
</a>
</div> </div>
)}
</div> </div>
</div> </div>
</div> </div>