adjust content structure speaker page
This commit is contained in:
parent
92a72166da
commit
de239b4468
@ -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>
|
||||||
|
|||||||
@ -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" },
|
||||||
],
|
],
|
||||||
|
|||||||
@ -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: [
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user