From 28803b266a0727a3d0a14802ff33105da1ab91c1 Mon Sep 17 00:00:00 2001 From: Alisa Cantillo-Olsson Date: Sat, 2 May 2026 16:43:37 +0200 Subject: [PATCH] adjustments based on the coaching feedback --- relume-test/public/_redirects | 1 + relume-test/src/assets/logo-adobe.svg | 1 + relume-test/src/assets/logo-figma.svg | 1 + relume-test/src/assets/logo-google.svg | 1 + relume-test/src/components/Banner15.tsx | 64 ++--- relume-test/src/components/Event33.tsx | 22 +- relume-test/src/components/Filters5.tsx | 233 +++++++++--------- relume-test/src/components/Header.tsx | 148 +++++++---- relume-test/src/components/Header23.tsx | 41 ++- relume-test/src/components/Navbar.tsx | 4 +- .../src/components/Pricing39Ticket.tsx | 40 ++- relume-test/src/components/Team4.tsx | 12 +- relume-test/src/pages/Programm.tsx | 60 +++-- relume-test/src/pages/Speaker.tsx | 21 +- relume-test/src/pages/SpeakerDetail.tsx | 37 +++ relume-test/src/pages/Tickets.tsx | 13 +- 16 files changed, 421 insertions(+), 278 deletions(-) create mode 100644 relume-test/public/_redirects create mode 100644 relume-test/src/assets/logo-adobe.svg create mode 100644 relume-test/src/assets/logo-figma.svg create mode 100644 relume-test/src/assets/logo-google.svg diff --git a/relume-test/public/_redirects b/relume-test/public/_redirects new file mode 100644 index 0000000..ad37e2c --- /dev/null +++ b/relume-test/public/_redirects @@ -0,0 +1 @@ +/* /index.html 200 diff --git a/relume-test/src/assets/logo-adobe.svg b/relume-test/src/assets/logo-adobe.svg new file mode 100644 index 0000000..f1f8fb4 --- /dev/null +++ b/relume-test/src/assets/logo-adobe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/relume-test/src/assets/logo-figma.svg b/relume-test/src/assets/logo-figma.svg new file mode 100644 index 0000000..22fd3f3 --- /dev/null +++ b/relume-test/src/assets/logo-figma.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/relume-test/src/assets/logo-google.svg b/relume-test/src/assets/logo-google.svg new file mode 100644 index 0000000..0e5e616 --- /dev/null +++ b/relume-test/src/assets/logo-google.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/relume-test/src/components/Banner15.tsx b/relume-test/src/components/Banner15.tsx index 4d8c90c..798fd00 100644 --- a/relume-test/src/components/Banner15.tsx +++ b/relume-test/src/components/Banner15.tsx @@ -1,13 +1,11 @@ import React from "react"; - -type ImageProps = { - src: string; - alt?: string; -}; +import logoFigma from "../assets/logo-figma.svg"; +import logoAdobe from "../assets/logo-adobe.svg"; +import logoGoogle from "../assets/logo-google.svg"; type Section = { title: string; - image: ImageProps; + image?: { src: string; alt: string }; }; type Props = { @@ -17,12 +15,9 @@ type Props = { export type Banner15Props = React.ComponentPropsWithoutRef<"section"> & Partial; export const Banner15 = (props: Banner15Props) => { - const { sections } = { - ...Banner15Defaults, - ...props, - }; + const { sections } = { ...Banner15Defaults, ...props }; return ( -
+
{Array(2) .fill(0) @@ -31,18 +26,20 @@ export const Banner15 = (props: Banner15Props) => { key={index} className="grid animate-marquee-right auto-cols-max grid-flow-col grid-cols-[max-content] items-center justify-around py-4" > - {sections.map((section, index) => ( - + {sections.map((section, i) => ( +

{section.title}

-
- {section.image.alt} -
+ {section.image && ( +
+ {section.image.alt} +
+ )}
))}
@@ -55,32 +52,21 @@ export const Banner15 = (props: Banner15Props) => { export const Banner15Defaults: Props = { sections: [ { - title: "UX Schweiz", - image: { - src: "https://relume-assets.s3.us-east-1.amazonaws.com/placeholder-image.svg", - alt: "UX Schweiz", - }, + title: "Figma", + image: { src: logoFigma, alt: "Figma" }, }, { title: "Adobe", - image: { - src: "https://relume-assets.s3.us-east-1.amazonaws.com/placeholder-image.svg", - alt: "Adobe", - }, + image: { src: logoAdobe, alt: "Adobe" }, }, { title: "Google", - image: { - src: "https://relume-assets.s3.us-east-1.amazonaws.com/placeholder-image.svg", - alt: "Google", - }, + image: { src: logoGoogle, alt: "Google" }, }, { - title: "Figma", - image: { - src: "https://relume-assets.s3.us-east-1.amazonaws.com/placeholder-image.svg", - alt: "Figma", - }, + title: "UX Schweiz", }, ], -}; \ No newline at end of file +}; + +export default Banner15; diff --git a/relume-test/src/components/Event33.tsx b/relume-test/src/components/Event33.tsx index afaf6ba..2216c3e 100644 --- a/relume-test/src/components/Event33.tsx +++ b/relume-test/src/components/Event33.tsx @@ -29,8 +29,11 @@ const levelStyles: Record = { }; const EventRow = ({ event }: { event: ProgramEvent }) => ( -
- {event.time} +
+
+ {event.day} + {event.time} +
{event.image.alt} @@ -52,13 +55,6 @@ const EventRow = ({ event }: { event: ProgramEvent }) => ( > Über {event.speaker.split(" ")[0]} {event.speaker.split(" ").slice(-1)[0]} - - - Tickets kaufen -
); @@ -75,6 +71,14 @@ export const Event33 = ({ events }: Props) => { ))}
)} +
); diff --git a/relume-test/src/components/Filters5.tsx b/relume-test/src/components/Filters5.tsx index c2e619f..c4b7630 100644 --- a/relume-test/src/components/Filters5.tsx +++ b/relume-test/src/components/Filters5.tsx @@ -1,31 +1,39 @@ -import { useState } from "react"; import { BiFilter, BiSearch } from "react-icons/bi"; import { IoCloseOutline } from "react-icons/io5"; import { RxChevronDown } from "react-icons/rx"; +import { useState } from "react"; export type FilterTab = { value: string; label: string }; type ActiveTag = { label: string; onRemove: () => void }; type Props = { + // Speaker page (single-select) tabs?: FilterTab[]; activeTab?: string; onTabChange?: (tab: string) => void; + // Programm page (multi-select) + activeTabs?: string[]; + onTabsChange?: (tabs: string[]) => void; + // Shared searchQuery?: string; onSearchChange?: (q: string) => void; searchLabel?: string; resetLabel?: string; activeTags?: ActiveTag[]; onReset?: () => void; - // Programm-only useFilterToggle?: boolean; showDayFilter?: boolean; showSortButton?: boolean; + sortOrder?: "asc" | "desc"; + onSortChange?: (order: "asc" | "desc") => void; + // Legacy day props (kept for backwards compat) activeDay?: string; onDayChange?: (day: string) => void; }; const PROGRAMM_TABS: FilterTab[] = [ - { value: "all", label: "Alle Anzeigen" }, + { value: "Donnerstag", label: "Donnerstag" }, + { value: "Freitag", label: "Freitag" }, { value: "Talk", label: "Talk" }, { value: "Workshop", label: "Workshop" }, { value: "Interaction", label: "Interaction" }, @@ -35,16 +43,12 @@ const PROGRAMM_TABS: FilterTab[] = [ { value: "Junior", label: "Junior-Level" }, ]; -const DAYS = [ - { value: "all", label: "Alle Tage" }, - { value: "Donnerstag", label: "Donnerstag" }, - { value: "Freitag", label: "Freitag" }, -]; - export const Filters5 = ({ - tabs = PROGRAMM_TABS, + tabs, activeTab = "all", onTabChange = () => {}, + activeTabs = [], + onTabsChange = () => {}, searchQuery = "", onSearchChange = () => {}, searchLabel = "Stichwortsuche", @@ -52,40 +56,51 @@ export const Filters5 = ({ activeTags = [], onReset = () => {}, useFilterToggle = true, - showDayFilter = true, showSortButton = true, - activeDay = "all", - onDayChange = () => {}, + sortOrder = "asc", + onSortChange = () => {}, }: Props) => { const [sortOpen, setSortOpen] = useState(false); - const [dayOpen, setDayOpen] = useState(false); - const selectedDayLabel = DAYS.find((d) => d.value === activeDay)?.label ?? "Alle Tage"; + const toggleTab = (value: string) => { + if (activeTabs.includes(value)) { + onTabsChange(activeTabs.filter((t) => t !== value)); + } else { + onTabsChange([...activeTabs, value]); + } + }; - const TabPills = () => ( -
- {tabs.map((tab) => ( - - ))} -
- ); - - // Speaker page: just tabs + search, no day filter or sort + // Speaker page: multi-select tabs + search if (!useFilterToggle) { + const speakerTabs = tabs ?? []; return (
- +
+ + {speakerTabs.map((tab) => ( + + ))} +
{searchLabel} @@ -93,17 +108,17 @@ export const Filters5 = ({ {resetLabel}
-
- +
+ onSearchChange(e.target.value)} /> {searchQuery && ( )}
@@ -128,20 +143,43 @@ export const Filters5 = ({ ); } - // Programm page: full filter bar, always visible + // Programm page: multi-select filter bar return (
- {/* Row 1: Filter label + category pills + sort */} + {/* Row 1: Filter label + multi-select pills + sort */}
-
+
Filter
-
- +
+ {/* "Alle" pill — active only when nothing selected */} + + {PROGRAMM_TABS.map((tab) => ( + + ))}
{showSortButton && ( @@ -157,85 +195,48 @@ export const Filters5 = ({ {sortOpen && (
- {["Zeit aufsteigend", "Zeit absteigend"].map((opt) => ( - - ))} + {(["asc", "desc"] as const).map((order) => { + const label = order === "asc" ? "Zeit aufsteigend" : "Zeit absteigend"; + return ( + + ); + })}
)}
)}
- {/* Row 2: Search + Day filter — always visible */} -
- - {/* Search */} -
-
- {searchLabel} - -
-
- - onSearchChange(e.target.value)} - /> - {searchQuery && ( - - )} -
+ {/* Row 2: Full-width search */} +
+
+ {searchLabel} + +
+
+ + onSearchChange(e.target.value)} + /> + {searchQuery && ( + + )}
- - {/* Day dropdown */} - {showDayFilter && ( -
- Filtern nach Eventtage -
- - {dayOpen && ( -
- {DAYS.map((d) => ( - - ))} -
- )} -
-
- )}
{/* Active tags */} diff --git a/relume-test/src/components/Header.tsx b/relume-test/src/components/Header.tsx index 9d3939c..2f50434 100644 --- a/relume-test/src/components/Header.tsx +++ b/relume-test/src/components/Header.tsx @@ -1,43 +1,114 @@ import headerImage from "../assets/Header.png"; -import { Button } from "@relume_io/relume-ui"; -import type { ButtonProps } from "@relume_io/relume-ui"; +import logoAdobe from "../assets/logo-adobe.svg"; +import logoFigma from "../assets/logo-figma.svg"; +import logoGoogle from "../assets/logo-google.svg"; -type ImageProps = { - src: string; - alt?: string; -}; - -type Props = { - heading: string; - description: string; - buttons: ButtonProps[]; - image: ImageProps; -}; - -export type Header1Props = React.ComponentPropsWithoutRef<"section"> & Partial; +export type Header1Props = React.ComponentPropsWithoutRef<"section">; export const Header1 = (props: Header1Props) => { - const { heading, description, buttons, image } = { - ...Header1Defaults, - ...props, - }; return ( -
-
-
-
-

{heading}

-

{description}

-
- {buttons.map((button, index) => ( - +
+ {/* Mobile-only faint background image */} +
+ +
+
+ + {/* Desktop right-side image panel */} +
+ + {/* Blend edge left */} +
+ {/* Top vignette */} +
+ {/* Bottom vignette */} +
+
+ + {/* Glow blobs */} +
+
+
+ + {/* Main content */} +
+
+
+ + {/* Date badge */} +
+
+ + 25. – 26. Juni 2026  ·  Zürich + +
+
+ + {/* Heading */} +

+ UXplore +

+

+ Konferenz 2026 +

+ + {/* Tagline */} +

+ Zwei Tage, zwölf Sessions, ein Ziel: UX, das wirklich wirkt. Die führende Schweizer Konferenz für Designer, Produktteams und alle, die nutzerzentriertes Denken in die Praxis bringen. +

+ + {/* CTAs */} + + + {/* Stats */} +
+ {[ + { value: "2", label: "Tage" }, + { value: "12+", label: "Sessions" }, + { value: "6", label: "Workshops" }, + { value: "500+", label: "Teilnehmer" }, + ].map((stat, i) => ( +
+
{stat.value}
+
{stat.label}
+
))}
+
-
- {image.alt} +
+
+ + {/* Speaker companies bar */} +
+
+
+ + Speaker von + + Adobe + Figma + Google
@@ -45,13 +116,6 @@ export const Header1 = (props: Header1Props) => { ); }; -export const Header1Defaults: Props = { - heading: "UXplore Konferenz 2026", - description: - "25-26 Juni Zürich", - buttons: [], - image: { - src: headerImage, - alt: "UXplore Konferenz 2026", - }, -}; +export const Header1Defaults = {}; + +export default Header1; diff --git a/relume-test/src/components/Header23.tsx b/relume-test/src/components/Header23.tsx index e63f75f..068d361 100644 --- a/relume-test/src/components/Header23.tsx +++ b/relume-test/src/components/Header23.tsx @@ -1,17 +1,22 @@ import headerBg from "../assets/program-header.png"; -import { Button } from "@relume_io/relume-ui"; -import type { ButtonProps } from "@relume_io/relume-ui"; +type LinkButton = { + title: string; + href?: string; + variant?: string; + className?: string; +}; type Props = { heading: string; description: string; - buttons: ButtonProps[]; + buttons: LinkButton[]; + showTicketButton?: boolean; }; export type Header23Props = React.ComponentPropsWithoutRef<"section"> & Partial; export const Header23 = (props: Header23Props) => { - const { heading, description, buttons, children } = { + const { heading, description, buttons, showTicketButton = true, children } = { ...Header23Defaults, ...props, }; @@ -29,18 +34,38 @@ export const Header23 = (props: Header23Props) => { {/* Content */}
+
+ + 2-Tage-Konferenz + + + Workshops inklusive + +

{heading}

{description}

+ {showTicketButton && ( + + Jetzt Ticket sichern + + )} {buttons.length > 0 && ( -
+
{buttons.map((button, index) => ( - + ))}
)} @@ -53,7 +78,7 @@ export const Header23 = (props: Header23Props) => { export const Header23Defaults: Props = { heading: "UXplore 2026 Programm", - 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: "Erlebe zwei Tage voller Insights von den klügsten Köpfen der Branche. Jedes Ticket beinhaltet den Zugang zu allen Sessions und Workshops – nach dem Kauf kannst du dich für deine Wunsch-Workshops anmelden.", buttons: [], }; diff --git a/relume-test/src/components/Navbar.tsx b/relume-test/src/components/Navbar.tsx index c095754..ccd5998 100644 --- a/relume-test/src/components/Navbar.tsx +++ b/relume-test/src/components/Navbar.tsx @@ -95,10 +95,10 @@ export const Navbar3 = (props: Navbar3Props) => { {buttons.map(({ url, ...button }, index) => url ? ( - + ) : ( - + ) )}
diff --git a/relume-test/src/components/Pricing39Ticket.tsx b/relume-test/src/components/Pricing39Ticket.tsx index acf8487..6acb51c 100644 --- a/relume-test/src/components/Pricing39Ticket.tsx +++ b/relume-test/src/components/Pricing39Ticket.tsx @@ -2,8 +2,10 @@ import React, { useState } from "react"; type TicketPlan = { day: string; - price: number; date: string; + earlyBirdPrice: number; + regularPrice: number; + earlyBirdDeadline: string; }; type Props = { @@ -13,15 +15,28 @@ type Props = { export type Pricing39TicketProps = React.ComponentPropsWithoutRef<"section"> & Partial; -const TicketCardLime = ({ plan }: { plan: TicketPlan }) => { +const TicketCard = ({ plan }: { plan: TicketPlan }) => { const [qty, setQty] = useState(0); - const total = qty * plan.price; + const total = qty * plan.earlyBirdPrice; return ( -
-

{plan.day}

-

CHF {plan.price}

-

{plan.date}

+
+

{plan.day}

+ + {/* Earlybird price block */} +
+
+

CHF {plan.earlyBirdPrice}

+ CHF {plan.regularPrice} +
+ + + Earlybird bis {plan.earlyBirdDeadline} + +
+ +

{plan.date}

+
-
CHF {plan.price},-
-
{total},-
+
CHF {plan.earlyBirdPrice},-
+
Total CHF {total},-
+ @@ -69,7 +85,7 @@ export const Pricing39Ticket = (props: Pricing39TicketProps) => { }`} > {plans.map((plan, index) => ( - + ))}
@@ -80,8 +96,8 @@ export const Pricing39Ticket = (props: Pricing39TicketProps) => { export const Pricing39TicketDefaults: Props = { heading: "1-Tagespässe", plans: [ - { day: "Donnerstag", price: 131, date: "25. Juni 2026" }, - { day: "Freitag", price: 131, date: "26. Juni 2026" }, + { day: "Donnerstag", date: "25. Juni 2026", earlyBirdPrice: 99, regularPrice: 131, earlyBirdDeadline: "31. Mai 2026" }, + { day: "Freitag", date: "26. Juni 2026", earlyBirdPrice: 99, regularPrice: 131, earlyBirdDeadline: "31. Mai 2026" }, ], }; diff --git a/relume-test/src/components/Team4.tsx b/relume-test/src/components/Team4.tsx index c559748..f138dda 100644 --- a/relume-test/src/components/Team4.tsx +++ b/relume-test/src/components/Team4.tsx @@ -81,17 +81,7 @@ const MemberCard = ({ member }: { member: TeamMember }) => (

{member.company}

)}
-

{member.description}

-
- {member.talks.map((talk, i) => ( - - {talk.title} - - ))} -
+

{member.description}

); diff --git a/relume-test/src/pages/Programm.tsx b/relume-test/src/pages/Programm.tsx index ec60265..7be20c9 100644 --- a/relume-test/src/pages/Programm.tsx +++ b/relume-test/src/pages/Programm.tsx @@ -6,45 +6,61 @@ import { Event33 } from "../components/Event33"; import { Banner15 } from "../components/Banner15"; import { Footer3 } from "../components/Footer"; import { ALL_EVENTS } from "../data/events"; +import type { EventDay } from "../components/Event33"; -const TYPE_TABS = ["Talk", "Workshop", "Interaction", "AI and Future"]; -const LEVEL_TABS: Record = { - "Senior": "Senior", - "Mid-Level": "Mid-Level", - "Junior": "Junior", +const DAY_VALUES = ["Donnerstag", "Freitag"]; +const TYPE_VALUES = ["Talk", "Workshop", "Interaction", "AI and Future"]; +const LEVEL_VALUES = ["Senior", "Mid-Level", "Junior"]; + +const DAY_ORDER: Record = { Donnerstag: 0, Freitag: 1 }; + +const parseStartMinutes = (time: string) => { + const match = time.match(/(\d{2}):(\d{2})/); + return match ? parseInt(match[1]) * 60 + parseInt(match[2]) : 0; }; const Programm = () => { - const [activeTab, setActiveTab] = useState("all"); + const [activeTabs, setActiveTabs] = useState([]); const [searchQuery, setSearchQuery] = useState(""); - const [activeDay, setActiveDay] = useState("all"); + const [sortOrder, setSortOrder] = useState<"asc" | "desc">("asc"); const filteredEvents = useMemo(() => { - return ALL_EVENTS.filter((e) => { - if (activeTab !== "all") { - const matchesType = TYPE_TABS.includes(activeTab) && e.type === activeTab; - const matchesLevel = LEVEL_TABS[activeTab] && e.level === LEVEL_TABS[activeTab]; - if (!matchesType && !matchesLevel) return false; + const filtered = ALL_EVENTS.filter((e) => { + if (activeTabs.length > 0) { + const activeDays = activeTabs.filter((t) => DAY_VALUES.includes(t)); + const activeTypes = activeTabs.filter((t) => TYPE_VALUES.includes(t)); + const activeLevels = activeTabs.filter((t) => LEVEL_VALUES.includes(t)); + if (activeDays.length > 0 && !activeDays.includes(e.day)) return false; + if (activeTypes.length > 0 && !activeTypes.includes(e.type)) return false; + if (activeLevels.length > 0 && !activeLevels.includes(e.level)) return false; } if (searchQuery) { const q = searchQuery.toLowerCase(); if (!e.title.toLowerCase().includes(q) && !e.speaker.toLowerCase().includes(q)) return false; } - if (activeDay !== "all" && e.day !== activeDay) return false; return true; }); - }, [activeTab, searchQuery, activeDay]); + + return [...filtered].sort((a, b) => { + const dayDiff = DAY_ORDER[a.day] - DAY_ORDER[b.day]; + if (dayDiff !== 0) return sortOrder === "asc" ? dayDiff : -dayDiff; + const timeDiff = parseStartMinutes(a.time) - parseStartMinutes(b.time); + return sortOrder === "asc" ? timeDiff : -timeDiff; + }); + }, [activeTabs, searchQuery, sortOrder]); const activeTags = [ searchQuery ? { label: searchQuery, onRemove: () => setSearchQuery("") } : null, - activeDay !== "all" ? { label: activeDay, onRemove: () => setActiveDay("all") } : null, - activeTab !== "all" ? { label: activeTab, onRemove: () => setActiveTab("all") } : null, + ...activeTabs.map((tab) => ({ + label: tab, + onRemove: () => setActiveTabs((prev) => prev.filter((t) => t !== tab)), + })), ].filter(Boolean) as { label: string; onRemove: () => void }[]; const handleReset = () => { - setActiveTab("all"); + setActiveTabs([]); setSearchQuery(""); - setActiveDay("all"); + setSortOrder("asc"); }; return ( @@ -52,14 +68,14 @@ const Programm = () => { diff --git a/relume-test/src/pages/Speaker.tsx b/relume-test/src/pages/Speaker.tsx index e526401..4233b9a 100644 --- a/relume-test/src/pages/Speaker.tsx +++ b/relume-test/src/pages/Speaker.tsx @@ -7,7 +7,6 @@ import { Team4Defaults } from "../components/Team4"; import { Footer3 } from "../components/Footer"; const SPEAKER_TABS = [ - { value: "all", label: "Alle ansehen" }, { value: "Strategie", label: "Strategie" }, { value: "Research", label: "Research" }, { value: "Design / UX", label: "Design / UX" }, @@ -18,12 +17,12 @@ const SPEAKER_TABS = [ const ALL_SPEAKERS = Team4Defaults.teamMembers; const Speaker = () => { - const [activeTab, setActiveTab] = useState("all"); + const [activeTabs, setActiveTabs] = useState([]); const [searchQuery, setSearchQuery] = useState(""); const filteredSpeakers = useMemo(() => { return ALL_SPEAKERS.filter((s) => { - if (activeTab !== "all" && s.category !== activeTab) return false; + if (activeTabs.length > 0 && !activeTabs.includes(s.category)) return false; if (searchQuery) { const q = searchQuery.toLowerCase(); if ( @@ -35,11 +34,14 @@ const Speaker = () => { } return true; }); - }, [activeTab, searchQuery]); + }, [activeTabs, searchQuery]); const activeTags = [ searchQuery ? { label: searchQuery, onRemove: () => setSearchQuery("") } : null, - activeTab !== "all" ? { label: activeTab, onRemove: () => setActiveTab("all") } : null, + ...activeTabs.map((tab) => ({ + label: tab, + onRemove: () => setActiveTabs((prev) => prev.filter((t) => t !== tab)), + })), ].filter(Boolean) as { label: string; onRemove: () => void }[]; return ( @@ -49,20 +51,19 @@ const 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." buttons={[ - { 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", className: "bg-transparent border-acid-lime text-acid-lime hover:bg-acid-lime/10 hover:border-acid-lime hover:text-acid-lime rounded-2xl" }, + { title: "Zum Programm", href: "/programm", className: "bg-transparent border-acid-lime text-acid-lime hover:bg-acid-lime/10" }, ]} /> { setSearchQuery(""); setActiveTab("all"); }} + onReset={() => { setSearchQuery(""); setActiveTabs([]); }} useFilterToggle={false} showDayFilter={false} showSortButton={false} diff --git a/relume-test/src/pages/SpeakerDetail.tsx b/relume-test/src/pages/SpeakerDetail.tsx index 927b4d9..79b1500 100644 --- a/relume-test/src/pages/SpeakerDetail.tsx +++ b/relume-test/src/pages/SpeakerDetail.tsx @@ -2,6 +2,7 @@ import { useParams, Navigate } from "react-router-dom"; import { Navbar3 } from "../components/Navbar"; import { Team4, Team4Defaults } from "../components/Team4"; import { Footer3 } from "../components/Footer"; +import { ALL_EVENTS } from "../data/events"; import webflowLogo from "../assets/webflow.png"; import relumeLogo from "../assets/relume.png"; @@ -38,6 +39,7 @@ const SpeakerDetail = () => { if (!speaker) return ; + const speakerEvents = ALL_EVENTS.filter((e) => e.speaker === speaker.name); const otherSpeakers = ALL_SPEAKERS.filter((s) => s.slug !== slug); return ( @@ -95,6 +97,41 @@ const SpeakerDetail = () => {
+ {/* Sessions */} + {speakerEvents.length > 0 && ( +
+ +
+ )} + {/* Other speakers */}
diff --git a/relume-test/src/pages/Tickets.tsx b/relume-test/src/pages/Tickets.tsx index 517a86a..a281872 100644 --- a/relume-test/src/pages/Tickets.tsx +++ b/relume-test/src/pages/Tickets.tsx @@ -3,7 +3,6 @@ import React, { useState, useEffect } from "react"; import { Navbar3 } from "../components/Navbar"; import { Header23 } from "../components/Header23"; -import { Pricing1Ticket } from "../components/Pricing1Ticket"; import { Pricing39Ticket } from "../components/Pricing39Ticket"; import { Footer3 } from "../components/Footer"; import { Input } from "@relume_io/relume-ui"; @@ -82,6 +81,7 @@ const Tickets = () => { heading="Ticketshop" 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={[]} + showTicketButton={false} >
DO – FR, 25. – 26. Juni 2026 @@ -120,17 +120,16 @@ const Tickets = () => {

- -